diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..3c64fd09 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,35 @@ +name: lint + +on: + - push + - pull_request + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + # The setup steps are duplicated between jobs. We should create a + # composite action for the setup, once composite actions support + # "uses". + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - run: | + python -m pip install --upgrade pip + pip install tox tox-gh-actions + - run: tox -e lint + + docs: + name: Docs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - run: | + python -m pip install --upgrade pip + pip install tox tox-gh-actions + - run: tox -e docs diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..3cab7dfb --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,26 @@ +name: Publish + +on: + release: + types: [published] + + +jobs: + pypi-publish: + runs-on: ubuntu-latest + + environment: pypi + + permissions: + id-token: write + + steps: + - uses: actions/checkout@v4 + + - name: build wheel and sdist + run: | + pip install "flit>=3.2.0,<4.0.0" + flit build + + - name: publish + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..9bf389be --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,34 @@ +name: Draft release + +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + +jobs: + set-body: + runs-on: ubuntu-latest + + steps: + - run: sudo apt install pcregrep + + - uses: actions/checkout@v4 + + - name: Parse changelog + id: parse-changelog + run: | + tag='${{ github.ref_name }}' + re_current_tag="## \[$tag\].*\n\n" # Match, but do not capture, current version tag, then... + re_changes_body='((.|\n)+?)' # capture everything including newlines... + re_previous_tag='## \[[0-9]+.[0-9]+.[0-9]+\]' # until previous version tag. + re_full="${re_current_tag}${re_changes_body}${re_previous_tag}" + echo 'match<> $GITHUB_OUTPUT + # Match multiple lines, output capture group 1. + pcregrep -M -o1 "$re_full" ./CHANGELOG.md >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + + - name: Set release body + uses: softprops/action-gh-release@v2 + with: + draft: true + body: ${{ steps.parse-changelog.outputs.match }} diff --git a/.gitignore b/.gitignore index 4d22ef99..73358ad8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,139 @@ -*~ -*.pyc -__pycache__ -__PYCACHE__ -build -_* -PSL.egg-info -.idea/ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9fb176b3..00000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: python - -python: - - "3.6" - - "3.7" - - "3.8" - -before_install: - - sudo apt-get -qq update - - sudo mkdir -p /builds - - sudo chmod a+rw /builds - -install: - - pip3 install coverage flake8 -r requirements.txt - - flake8 . --select=E9,F63,F7,F82 --show-source --statistics - - sudo python setup.py install - -script: coverage run -m pytest tests diff --git a/99-pslab.rules b/99-pslab.rules deleted file mode 100644 index 84ef45fb..00000000 --- a/99-pslab.rules +++ /dev/null @@ -1,4 +0,0 @@ -#Rules for TestBench - -SUBSYSTEM=="tty",ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00df", MODE="666",SYMLINK+="TestBench" -ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00df", ENV{ID_MM_DEVICE_IGNORE}="1" diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..5b7b3120 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,53 @@ +# Changelog + +## [4.0.1] - 2025-06-16 + +### Fixed + +- Fix UART passthrough ([`1346356`](https://github.com/fossasia/pslab-python/commit/1346356d3cf95691ea0e3e87be335659d5513ec8)) (Anashuman Singh) + +## [4.0.0] - 2025-02-19 + +### Changed + +- __Breaking__: Do not autoconnect on `SerialHandler` zero-arg instantiation ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) +- __Breaking__: Deprecate `serial_handler` in favor of `connection` ([`bc53dd3`](https://github.com/fossasia/pslab-python/commit/bc53dd38830f3d70e908e2c4f1ae797a809231a6)) (Alexander Bessman) +- __Breaking__: Move `SerialHandler` to `connection` ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) +- __Breaking__: Move `detect` to `connection` ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) +- __Breaking__: Make `check_serial_access_permission` private ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) +- __Breaking__: Move `ADCBufferMixin` to `instrument.buffer` ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) + +### Added + +- Add common `connection` module for different control interfaces ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) +- Add `WLANHandler` class for controlling the PSLab over WLAN ([`1316df4`](https://github.com/fossasia/pslab-python/commit/1316df452bff97106dc9313fe9458c93d7f954ab)) (Alexander Bessman) +- Add `ConnectionHandler` base class for `SerialHandler` and `WLANHandler` ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) +- Add `connection.autoconnect` function ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) +- Add `instrument.buffer` module ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) + +### Removed + +- __Breaking__: Remove `SerialHandler.wait_for_data` ([`e70d01d`](https://github.com/fossasia/pslab-python/commit/e70d01d8761b7c0d8446994447849561450d5200)) (Alexander Bessman) + +### Fixed + +- Fix SPI configuration sending one byte too few ([`a3d88bb`](https://github.com/fossasia/pslab-python/commit/a3d88bbfeee8cdb012d033c6c80f40b971802851)) (Alexander Bessman) + +## [3.1.1] - 2025-01-05 + +### Changed + +- Raise `RuntimeError` if `_I2CPrimitive._start` is called on an already active peripheral ([`d86fbfa`](https://github.com/fossasia/pslab-python/commit/d86fbfa324b6671926a8548340221b40228c782c)) (Alexander Bessman) + +### Fixed + +- Fix I2C bus becomes unusable after device scan ([`05c135d`](https://github.com/fossasia/pslab-python/commit/05c135d8c59b5075a1d36e3af256022f5759a3a5)) (Alexander Bessman) + +## [3.1.0] - 2024-12-28 + +_Changelog added in following release._ + +[4.0.1]: https://github.com/fossasia/pslab-python/releases/tag/4.0.1 +[4.0.0]: https://github.com/fossasia/pslab-python/releases/tag/4.0.0 +[3.1.1]: https://github.com/fossasia/pslab-python/releases/tag/3.1.1 +[3.1.0]: https://github.com/fossasia/pslab-python/releases/tag/3.1.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..3c3bc1a8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,86 @@ +# Contributing to pslab-python + +Before opening a pull request, make sure that: + +1. The code builds. +2. The docs build. +3. The linters pass. +4. The tests pass. +5. Test coverage has not decreased. + +## Building & Installing + +The following assumes that the commands are executed from the root of the repository: + +The project can be built with: + + pip install wheel + python setup.py sdist bdist_wheel + +The project can be installed in editable mode with: + + pip install -e . + +The documentation can be built with: + + tox -e docs + +The linters can be run with: + + tox -e lint + +## Testing + +pslab-python tests are written to run against real hardware. The tests are integration tests, since they depend on the correct function of not just the Python code under test, but also the firmware and hardware of the connected PSLab device. The tests can be run with: + + tox -e integration + +When running the tests, the serial traffic to and from the PSLab can optionally be recorded by running: + + tox -e record + +The recorded traffic is played back when running the tests on Travis, since no real device is connected in that situation. The tests can be run with recorded traffic instead of against real hardware by running: + + tox -e playback + +### Writing new tests + +Tests are written in pytest. + +If the test requires multiple PSLab instruments to be connected together, this should be documented in the module docstring. + +Test coverage should be \>90%, but aim for 100%. + +## Code style + +### General + +- Black. +- When in doubt, refer to PEP8. +- Use type hints (PEP484). +- Maximum line length is 88 characters, but aim for less than 80. +- Maximum [cyclomatic complexity](https://en.wikipedia.org/wiki/Cyclomatic_complexity) is ten, but aim for five or lower. +- Blank lines before and after statements (for, if, return, \...), unless + - the statement comes at the beginning or end of another statement. + - the indentation level is five lines or fewer long. + +### Imports + +- All imports at the top of the module. +- Built-in imports come first, then third-party, and finally pslab, with a blank line between each group of imports. +- No relative imports. +- Within import groups, `import`-style imports come before `from`-style imports. +- One `import`-style import per line. +- All `from`-style imports from a specific package or module on the same line, unless that would violate the line length limit. + - In that case, strongly consider using `import`-style instead. + - If that is not possible, use one import per line. +- Imports are sorted alphabetically within groups. + +### Comments and docstrings + +- All public interfaces (modules, classes, methods) have Numpydoc-style docstrings. +- Blank line after module- and class-level docstrings, but not after method-level docstrings. +- Comments start with a capital letter and end with a period if they contain at least two words. +- Comments go on the same line as the code they explain, unless that would violate the line length limit. + - In that case, the comment goes immediately before the code it explains. +- Avoid multiline comments. diff --git a/PSL/Peripherals.py b/PSL/Peripherals.py deleted file mode 100644 index f224da6e..00000000 --- a/PSL/Peripherals.py +++ /dev/null @@ -1,1444 +0,0 @@ -from __future__ import print_function -import PSL.commands_proto as CP -import numpy as np -import time - - -class I2C(): - """ - Methods to interact with the I2C port. An instance of Labtools.Packet_Handler must be passed to the init function - - - Example:: Read Values from an HMC5883L 3-axis Magnetometer(compass) [GY-273 sensor] connected to the I2C port - >>> ADDRESS = 0x1E - >>> from PSL import sciencelab - >>> I = sciencelab.connect() - #Alternately, you may skip using I2C as a child instance of Interface, - #and instead use I2C=PSL.Peripherals.I2C(PSL.packet_handler.Handler()) - - # writing to 0x1E, set gain(0x01) to smallest(0 : 1x) - >>> I.I2C.bulkWrite(ADDRESS,[0x01,0]) - - # writing to 0x1E, set mode conf(0x02), continuous measurement(0) - >>> I.I2C.bulkWrite(ADDRESS,[0x02,0]) - - # read 6 bytes from addr register on I2C device located at ADDRESS - >>> vals = I.I2C.bulkRead(ADDRESS,addr,6) - - >>> from numpy import int16 - #conversion to signed datatype - >>> x=int16((vals[0]<<8)|vals[1]) - >>> y=int16((vals[2]<<8)|vals[3]) - >>> z=int16((vals[4]<<8)|vals[5]) - >>> print (x,y,z) - - """ - samples = 0 - total_bytes = 0 - channels = 0 - tg = 100 - MAX_SAMPLES = 10000 - - def __init__(self, H): - self.H = H - from PSL import sensorlist - self.SENSORS = sensorlist.sensors - self.buff = np.zeros(10000) - - def init(self): - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_INIT) - self.H.__get_ack__() - - def enable_smbus(self): - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_ENABLE_SMBUS) - self.H.__get_ack__() - - def pullSCLLow(self, uS): - """ - Hold SCL pin at 0V for a specified time period. Used by certain sensors such - as MLX90316 PIR for initializing. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - uS Time(in uS) to hold SCL output at 0 Volts - ================ ============================================================================================ - - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_PULLDOWN_SCL) - self.H.__sendInt__(uS) - self.H.__get_ack__() - - def config(self, freq, verbose=True): - """ - Sets frequency for I2C transactions - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - freq I2C frequency - ================ ============================================================================================ - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_CONFIG) - # freq=1/((BRGVAL+1.0)/64e6+1.0/1e7) - BRGVAL = int((1. / freq - 1. / 1e7) * 64e6 - 1) - if BRGVAL > 511: - BRGVAL = 511 - if verbose: print('Frequency too low. Setting to :', 1 / ((BRGVAL + 1.0) / 64e6 + 1.0 / 1e7)) - self.H.__sendInt__(BRGVAL) - self.H.__get_ack__() - - def start(self, address, rw): - """ - Initiates I2C transfer to address via the I2C port - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - address I2C slave address\n - rw Read/write. - - 0 for writing - - 1 for reading. - ================ ============================================================================================ - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_START) - self.H.__sendByte__(((address << 1) | rw) & 0xFF) # address - return self.H.__get_ack__() >> 4 - - def stop(self): - """ - stops I2C transfer - - :return: Nothing - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_STOP) - self.H.__get_ack__() - - def wait(self): - """ - wait for I2C - - :return: Nothing - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_WAIT) - self.H.__get_ack__() - - def send(self, data): - """ - SENDS data over I2C. - The I2C bus needs to be initialized and set to the correct slave address first. - Use I2C.start(address) for this. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - data Sends data byte over I2C bus - ================ ============================================================================================ - - :return: Nothing - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_SEND) - self.H.__sendByte__(data) # data byte - return self.H.__get_ack__() >> 4 - - def send_burst(self, data): - """ - SENDS data over I2C. The function does not wait for the I2C to finish before returning. - It is used for sending large packets quickly. - The I2C bus needs to be initialized and set to the correct slave address first. - Use start(address) for this. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - data Sends data byte over I2C bus - ================ ============================================================================================ - - :return: Nothing - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_SEND_BURST) - self.H.__sendByte__(data) # data byte - # No handshake. for the sake of speed. e.g. loading a frame buffer onto an I2C display such as ssd1306 - - def restart(self, address, rw): - """ - Initiates I2C transfer to address - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - address I2C slave address - rw Read/write. - * 0 for writing - * 1 for reading. - ================ ============================================================================================ - - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_RESTART) - self.H.__sendByte__(((address << 1) | rw) & 0xFF) # address - return self.H.__get_ack__() >> 4 - - def simpleRead(self, addr, numbytes): - """ - Read bytes from I2C slave without first transmitting the read location. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - addr Address of I2C slave - numbytes Total Bytes to read - ================ ============================================================================================ - """ - self.start(addr, 1) - vals = self.read(numbytes) - return vals - - def read(self, length): - """ - Reads a fixed number of data bytes from I2C device. Fetches length-1 bytes with acknowledge bits for each, +1 byte - with Nack. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - length number of bytes to read from I2C bus - ================ ============================================================================================ - """ - data = [] - - for a in range(length - 1): - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_READ_MORE) - data.append(self.H.__getByte__()) - self.H.__get_ack__() - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_READ_END) - data.append(self.H.__getByte__()) - self.H.__get_ack__() - - return data - - def read_repeat(self): - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_READ_MORE) - val = self.H.__getByte__() - self.H.__get_ack__() - return val - - def read_end(self): - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_READ_END) - val = self.H.__getByte__() - self.H.__get_ack__() - return val - - def read_status(self): - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_STATUS) - val = self.H.__getInt__() - self.H.__get_ack__() - return val - - def readBulk(self, device_address, register_address, bytes_to_read): - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_READ_BULK) - self.H.__sendByte__(device_address) - self.H.__sendByte__(register_address) - self.H.__sendByte__(bytes_to_read) - data = self.H.fd.read(bytes_to_read) - self.H.__get_ack__() - try: - return list(data) - except: - print('Transaction failed') - return False - - def writeBulk(self, device_address, bytestream): - """ - write bytes to I2C slave - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - device_address Address of I2C slave - bytestream List of bytes to write - ================ ============================================================================================ - """ - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_WRITE_BULK) - self.H.__sendByte__(device_address) - self.H.__sendByte__(len(bytestream)) - for a in bytestream: - self.H.__sendByte__(a) - self.H.__get_ack__() - - def scan(self, frequency=100000, verbose=False): - """ - Scan I2C port for connected devices - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - Frequency I2C clock frequency - ================ ============================================================================================ - - :return: Array of addresses of connected I2C slave devices - - """ - - self.config(frequency, verbose) - addrs = [] - n = 0 - if verbose: - print('Scanning addresses 0-127...') - print('Address', '\t', 'Possible Devices') - for a in range(0, 128): - x = self.start(a, 0) - if x & 1 == 0: # ACK received - addrs.append(a) - if verbose: print(hex(a), '\t\t', self.SENSORS.get(a, 'None')) - n += 1 - self.stop() - return addrs - - def __captureStart__(self, address, location, sample_length, total_samples, tg): - """ - Blocking call that starts fetching data from I2C sensors like an oscilloscope fetches voltage readings - You will then have to call `__retrievebuffer__` to fetch this data, and `__dataProcessor` to process and return separate channels - refer to `capture` if you want a one-stop solution. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - ================== ============================================================================================ - **Arguments** - ================== ============================================================================================ - address Address of the I2C sensor - location Address of the register to read from - sample_length Each sample can be made up of multiple bytes startng from . such as 3-axis data - total_samples Total samples to acquire. Total bytes fetched = total_samples*sample_length - tg timegap between samples (in uS) - ================== ============================================================================================ - - :return: Arrays X(timestamps),Y1,Y2 ... - - """ - if (tg < 20): tg = 20 - total_bytes = total_samples * sample_length - print('total bytes calculated : ', total_bytes) - if (total_bytes > self.MAX_SAMPLES * 2): - print('Sample limit exceeded. 10,000 int / 20000 bytes total') - total_bytes = self.MAX_SAMPLES * 2 - total_samples = total_bytes / sample_length # 2* because sample array is in Integers, and we're using it to store bytes - - print('length of each channel : ', sample_length) - self.total_bytes = total_bytes - self.channels = sample_length - self.samples = total_samples - self.tg = tg - - self.H.__sendByte__(CP.I2C_HEADER) - self.H.__sendByte__(CP.I2C_START_SCOPE) - self.H.__sendByte__(address) - self.H.__sendByte__(location) - self.H.__sendByte__(sample_length) - self.H.__sendInt__(total_samples) # total number of samples to record - self.H.__sendInt__(tg) # Timegap between samples. 1MHz timer clock - self.H.__get_ack__() - return 1e-6 * self.samples * self.tg + .01 - - def __retrievebuffer__(self): - ''' - Fetch data acquired by the I2C scope. refer to :func:`__captureStart__` - ''' - total_int_samples = self.total_bytes / 2 - DATA_SPLITTING = 500 - print('fetchin samples : ', total_int_samples, ' split', DATA_SPLITTING) - data = b'' - for i in range(int(total_int_samples / DATA_SPLITTING)): - self.H.__sendByte__(CP.ADC) - self.H.__sendByte__(CP.GET_CAPTURE_CHANNEL) - self.H.__sendByte__(0) # starts with A0 on PIC - self.H.__sendInt__(DATA_SPLITTING) - self.H.__sendInt__(i * DATA_SPLITTING) - rem = DATA_SPLITTING * 2 + 1 - for _ in range(200): - partial = self.H.fd.read( - rem) # reading int by int sometimes causes a communication error. this works better. - rem -= len(partial) - data += partial - # print ('partial: ',len(partial), end=",") - if rem <= 0: - break - data = data[:-1] - # print ('Pass : len=',len(data), ' i = ',i) - - if total_int_samples % DATA_SPLITTING: - self.H.__sendByte__(CP.ADC) - self.H.__sendByte__(CP.GET_CAPTURE_CHANNEL) - self.H.__sendByte__(0) # starts with A0 on PIC - self.H.__sendInt__(total_int_samples % DATA_SPLITTING) - self.H.__sendInt__(total_int_samples - total_int_samples % DATA_SPLITTING) - rem = 2 * (total_int_samples % DATA_SPLITTING) + 1 - for _ in range(20): - partial = self.H.fd.read( - rem) # reading int by int sometimes causes a communication error. this works better. - rem -= len(partial) - data += partial - # print ('partial: ',len(partial), end="") - if rem <= 0: - break - data = data[:-1] - print('Final Pass : len=', len(data)) - return data - - def __dataProcessor__(self, data, *args): - ''' - Interpret data acquired by the I2C scope. refer to :func:`__retrievebuffer__` to fetch data - - ================== ============================================================================================ - **Arguments** - ================== ============================================================================================ - data byte array returned by :func:`__retrievebuffer__` - *args supply optional argument 'int' if consecutive bytes must be combined to form short integers - ================== ============================================================================================ - - ''' - data = [ord(a) for a in data] - if ('int' in args): - for a in range(self.channels * self.samples / 2): self.buff[a] = np.int16( - (data[a * 2] << 8) | data[a * 2 + 1]) - else: - for a in range(self.channels * self.samples): self.buff[a] = data[a] - - yield np.linspace(0, self.tg * (self.samples - 1), self.samples) - for a in range(int(self.channels / 2)): - yield self.buff[a:self.samples * self.channels / 2][::self.channels / 2] - - def capture(self, address, location, sample_length, total_samples, tg, *args): - """ - Blocking call that fetches data from I2C sensors like an oscilloscope fetches voltage readings - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================== ============================================================================================ - **Arguments** - ================== ============================================================================================ - address Address of the I2C sensor - location Address of the register to read from - sample_length Each sample can be made up of multiple bytes startng from . such as 3-axis data - total_samples Total samples to acquire. Total bytes fetched = total_samples*sample_length - tg timegap between samples (in uS) - ================== ============================================================================================ - - Example - - >>> from pylab import * - >>> I=sciencelab.ScienceLab() - >>> x,y1,y2,y3,y4 = I.capture_multiple(800,1.75,'CH1','CH2','MIC','SEN') - >>> plot(x,y1) - >>> plot(x,y2) - >>> plot(x,y3) - >>> plot(x,y4) - >>> show() - - :return: Arrays X(timestamps),Y1,Y2 ... - - """ - t = self.__captureStart__(address, location, sample_length, total_samples, tg) - time.sleep(t) - data = self.__retrievebuffer__() - return self.__dataProcessor__(data, *args) - - -class SPI(): - """ - Methods to interact with the SPI port. An instance of Packet_Handler must be passed to the init function - - """ - - def __init__(self, H): - self.H = H - - def set_parameters(self, primary_prescaler=0, secondary_prescaler=2, CKE=1, CKP=0, SMP=1): - """ - sets SPI parameters. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - primary_pres Primary Prescaler(0,1,2,3) for 64MHz clock->(64:1,16:1,4:1,1:1) - secondary_pres Secondary prescaler(0,1,..7)->(8:1,7:1,..1:1) - CKE CKE 0 or 1. - CKP CKP 0 or 1. - ================ ============================================================================================ - - """ - self.H.__sendByte__(CP.SPI_HEADER) - self.H.__sendByte__(CP.SET_SPI_PARAMETERS) - # 0Bhgfedcba - > : modebit CKP,: modebit CKE, :primary pre,:secondary pre - self.H.__sendByte__(secondary_prescaler | (primary_prescaler << 3) | (CKE << 5) | (CKP << 6) | (SMP << 7)) - self.H.__get_ack__() - - def start(self, channel): - """ - selects SPI channel to enable. - Basically lowers the relevant chip select pin . - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - channel 1-7 ->[PGA1 connected to CH1,PGA2,PGA3,PGA4,PGA5,external chip select 1,external chip select 2] - 8 -> sine1 - 9 -> sine2 - ================ ============================================================================================ - - """ - self.H.__sendByte__(CP.SPI_HEADER) - self.H.__sendByte__(CP.START_SPI) - self.H.__sendByte__(channel) # value byte - # self.H.__get_ack__() - - def set_cs(self, channel, state): - """ - Enable or disable a chip select - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - channel 'CS1','CS2' - state 1 for HIGH, 0 for LOW - ================ ============================================================================================ - - """ - channel = channel.upper() - if channel in ['CS1', 'CS2']: - csnum = ['CS1', 'CS2'].index(channel) + 9 # chip select number 9=CSOUT1,10=CSOUT2 - self.H.__sendByte__(CP.SPI_HEADER) - if state: - self.H.__sendByte__(CP.STOP_SPI) - else: - self.H.__sendByte__(CP.START_SPI) - self.H.__sendByte__(csnum) - else: - print('Channel does not exist') - - def stop(self, channel): - """ - selects SPI channel to disable. - Sets the relevant chip select pin to HIGH. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - channel 1-7 ->[PGA1 connected to CH1,PGA2,PGA3,PGA4,PGA5,external chip select 1,external chip select 2] - ================ ============================================================================================ - - - """ - self.H.__sendByte__(CP.SPI_HEADER) - self.H.__sendByte__(CP.STOP_SPI) - self.H.__sendByte__(channel) # value byte - # self.H.__get_ack__() - - def send8(self, value): - """ - SENDS 8-bit data over SPI - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - value value to transmit - ================ ============================================================================================ - - :return: value returned by slave device - """ - self.H.__sendByte__(CP.SPI_HEADER) - self.H.__sendByte__(CP.SEND_SPI8) - self.H.__sendByte__(value) # value byte - v = self.H.__getByte__() - self.H.__get_ack__() - return v - - def send16(self, value): - """ - SENDS 16-bit data over SPI - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - value value to transmit - ================ ============================================================================================ - - :return: value returned by slave device - :rtype: int - """ - self.H.__sendByte__(CP.SPI_HEADER) - self.H.__sendByte__(CP.SEND_SPI16) - self.H.__sendInt__(value) # value byte - v = self.H.__getInt__() - self.H.__get_ack__() - return v - - def send8_burst(self, value): - """ - SENDS 8-bit data over SPI - No acknowledge/return value - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - value value to transmit - ================ ============================================================================================ - - :return: Nothing - """ - self.H.__sendByte__(CP.SPI_HEADER) - self.H.__sendByte__(CP.SEND_SPI8_BURST) - self.H.__sendByte__(value) # value byte - - def send16_burst(self, value): - """ - SENDS 16-bit data over SPI - no acknowledge/return value - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - value value to transmit - ============== ============================================================================================ - - :return: nothing - """ - self.H.__sendByte__(CP.SPI_HEADER) - self.H.__sendByte__(CP.SEND_SPI16_BURST) - self.H.__sendInt__(value) # value byte - - def xfer(self, chan, data): - self.start(chan) - reply = [] - for a in data: - reply.append(self.send8(a)) - self.stop(chan) - return reply - - -class DACCHAN: - def __init__(self, name, span, channum, **kwargs): - self.name = name - self.channum = channum - self.VREF = kwargs.get('VREF', 0) - self.SwitchedOff = kwargs.get('STATE', 0) - self.range = span - slope = (span[1] - span[0]) - intercept = span[0] - self.VToCode = np.poly1d([4095. / slope, -4095. * intercept / slope]) - self.CodeToV = np.poly1d([slope / 4095., intercept]) - self.calibration_enabled = False - self.calibration_table = [] - self.slope = 1 - self.offset = 0 - - def load_calibration_table(self, table): - self.calibration_enabled = 'table' - self.calibration_table = table - - def load_calibration_twopoint(self, slope, offset): - self.calibration_enabled = 'twopoint' - self.slope = slope - self.offset = offset - - # print('########################',slope,offset) - - def apply_calibration(self, v): - if self.calibration_enabled == 'table': # Each point is individually calibrated - return int(np.clip(v + self.calibration_table[v], 0, 4095)) - elif self.calibration_enabled == 'twopoint': # Overall slope and offset correction is applied - # print (self.slope,self.offset,v) - return int(np.clip(v * self.slope + self.offset, 0, 4095)) - else: - return v - - -class MCP4728: - defaultVDD = 3300 - RESET = 6 - WAKEUP = 9 - UPDATE = 8 - WRITEALL = 64 - WRITEONE = 88 - SEQWRITE = 80 - VREFWRITE = 128 - GAINWRITE = 192 - POWERDOWNWRITE = 160 - GENERALCALL = 0 - - # def __init__(self,I2C,vref=3.3,devid=0): - def __init__(self, H, vref=3.3, devid=0): - self.devid = devid - self.addr = 0x60 | self.devid # 0x60 is the base address - self.H = H - self.I2C = I2C(self.H) - self.SWITCHEDOFF = [0, 0, 0, 0] - self.VREFS = [0, 0, 0, 0] # 0=Vdd,1=Internal reference - self.CHANS = {'PCS': DACCHAN('PCS', [0, 3.3e-3], 0), 'PV3': DACCHAN('PV3', [0, 3.3], 1), - 'PV2': DACCHAN('PV2', [-3.3, 3.3], 2), 'PV1': DACCHAN('PV1', [-5., 5.], 3)} - self.CHANNEL_MAP = {0: 'PCS', 1: 'PV3', 2: 'PV2', 3: 'PV1'} - self.values = {'PV1': 0, 'PV2': 0, 'PV3': 0, 'PCS': 0} - - def __ignoreCalibration__(self, name): - self.CHANS[name].calibration_enabled = False - - def setVoltage(self, name, v): - chan = self.CHANS[name] - v = int(round(chan.VToCode(v))) - return self.__setRawVoltage__(name, v) - - def getVoltage(self, name): - return self.values[name] - - def setCurrent(self, v): - chan = self.CHANS['PCS'] - v = int(round(chan.VToCode(v))) - return self.__setRawVoltage__('PCS', v) - - def __setRawVoltage__(self, name, v): - v = int(np.clip(v, 0, 4095)) - CHAN = self.CHANS[name] - ''' - self.H.__sendByte__(CP.DAC) #DAC write coming through.(MCP4728) - self.H.__sendByte__(CP.SET_DAC) - self.H.__sendByte__(self.addr<<1) #I2C address - self.H.__sendByte__(CHAN.channum) #DAC channel - if self.calibration_enabled[name]: - val = v+self.calibration_tables[name][v] - #print (val,v,self.calibration_tables[name][v]) - self.H.__sendInt__((CHAN.VREF << 15) | (CHAN.SwitchedOff << 13) | (0 << 12) | (val) ) - else: - self.H.__sendInt__((CHAN.VREF << 15) | (CHAN.SwitchedOff << 13) | (0 << 12) | v ) - - self.H.__get_ack__() - ''' - val = self.CHANS[name].apply_calibration(v) - self.I2C.writeBulk(self.addr, [64 | (CHAN.channum << 1), (val >> 8) & 0x0F, val & 0xFF]) - self.values[name] = CHAN.CodeToV(v) - return self.values[name] - - def __writeall__(self, v1, v2, v3, v4): - self.I2C.start(self.addr, 0) - self.I2C.send((v1 >> 8) & 0xF) - self.I2C.send(v1 & 0xFF) - self.I2C.send((v2 >> 8) & 0xF) - self.I2C.send(v2 & 0xFF) - self.I2C.send((v3 >> 8) & 0xF) - self.I2C.send(v3 & 0xFF) - self.I2C.send((v4 >> 8) & 0xF) - self.I2C.send(v4 & 0xFF) - self.I2C.stop() - - def stat(self): - self.I2C.start(self.addr, 0) - self.I2C.send(0x0) # read raw values starting from address - self.I2C.restart(self.addr, 1) - vals = self.I2C.read(24) - self.I2C.stop() - print(vals) - - -class NRF24L01(): - # Commands - R_REG = 0x00 - W_REG = 0x20 - RX_PAYLOAD = 0x61 - TX_PAYLOAD = 0xA0 - ACK_PAYLOAD = 0xA8 - FLUSH_TX = 0xE1 - FLUSH_RX = 0xE2 - ACTIVATE = 0x50 - R_STATUS = 0xFF - - # Registers - NRF_CONFIG = 0x00 - EN_AA = 0x01 - EN_RXADDR = 0x02 - SETUP_AW = 0x03 - SETUP_RETR = 0x04 - RF_CH = 0x05 - RF_SETUP = 0x06 - NRF_STATUS = 0x07 - OBSERVE_TX = 0x08 - CD = 0x09 - RX_ADDR_P0 = 0x0A - RX_ADDR_P1 = 0x0B - RX_ADDR_P2 = 0x0C - RX_ADDR_P3 = 0x0D - RX_ADDR_P4 = 0x0E - RX_ADDR_P5 = 0x0F - TX_ADDR = 0x10 - RX_PW_P0 = 0x11 - RX_PW_P1 = 0x12 - RX_PW_P2 = 0x13 - RX_PW_P3 = 0x14 - RX_PW_P4 = 0x15 - RX_PW_P5 = 0x16 - R_RX_PL_WID = 0x60 - FIFO_STATUS = 0x17 - DYNPD = 0x1C - FEATURE = 0x1D - PAYLOAD_SIZE = 0 - ACK_PAYLOAD_SIZE = 0 - READ_PAYLOAD_SIZE = 0 - - ADC_COMMANDS = 1 - READ_ADC = 0 << 4 - - I2C_COMMANDS = 2 - I2C_TRANSACTION = 0 << 4 - I2C_WRITE = 1 << 4 - I2C_SCAN = 2 << 4 - PULL_SCL_LOW = 3 << 4 - I2C_CONFIG = 4 << 4 - I2C_READ = 5 << 4 - - NRF_COMMANDS = 3 - NRF_READ_REGISTER = 0 - NRF_WRITE_REGISTER = 1 << 4 - - CURRENT_ADDRESS = 0xAAAA01 - nodelist = {} - nodepos = 0 - NODELIST_MAXLENGTH = 15 - connected = False - - def __init__(self, H): - self.H = H - self.ready = False - self.sigs = {self.CURRENT_ADDRESS: 1} - if self.H.connected: - self.connected = self.init() - - """ - routines for the NRFL01 radio - """ - - def init(self): - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_SETUP) - self.H.__get_ack__() - time.sleep(0.015) # 15 mS settling time - stat = self.get_status() - if stat & 0x80: - print("Radio transceiver not installed/not found") - return False - else: - self.ready = True - self.selectAddress(self.CURRENT_ADDRESS) - # self.write_register(self.RF_SETUP,0x06) - self.rxmode() - time.sleep(0.1) - self.flush() - return True - - def rxmode(self): - ''' - Puts the radio into listening mode. - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_RXMODE) - self.H.__get_ack__() - - def txmode(self): - ''' - Puts the radio into transmit mode. - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_TXMODE) - self.H.__get_ack__() - - def triggerAll(self, val): - self.txmode() - self.selectAddress(0x111111) - self.write_register(self.EN_AA, 0x00) - self.write_payload([val], True) - self.write_register(self.EN_AA, 0x01) - - def power_down(self): - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_POWER_DOWN) - self.H.__get_ack__() - - def rxchar(self): - ''' - Receives a 1 Byte payload - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_RXCHAR) - value = self.H.__getByte__() - self.H.__get_ack__() - return value - - def txchar(self, char): - ''' - Transmits a single character - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_TXCHAR) - self.H.__sendByte__(char) - return self.H.__get_ack__() >> 4 - - def hasData(self): - ''' - Check if the RX FIFO contains data - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_HASDATA) - value = self.H.__getByte__() - self.H.__get_ack__() - return value - - def flush(self): - ''' - Flushes the TX and RX FIFOs - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_FLUSH) - self.H.__get_ack__() - - def write_register(self, address, value): - ''' - write a byte to any of the configuration registers on the Radio. - address byte can either be located in the NRF24L01+ manual, or chosen - from some of the constants defined in this module. - ''' - # print ('writing',address,value) - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_WRITEREG) - self.H.__sendByte__(address) - self.H.__sendByte__(value) - self.H.__get_ack__() - - def read_register(self, address): - ''' - Read the value of any of the configuration registers on the radio module. - - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_READREG) - self.H.__sendByte__(address) - val = self.H.__getByte__() - self.H.__get_ack__() - return val - - def get_status(self): - ''' - Returns a byte representing the STATUS register on the radio. - Refer to NRF24L01+ documentation for further details - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_GETSTATUS) - val = self.H.__getByte__() - self.H.__get_ack__() - return val - - def write_command(self, cmd): - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_WRITECOMMAND) - self.H.__sendByte__(cmd) - self.H.__get_ack__() - - def write_address(self, register, address): - ''' - register can be TX_ADDR, RX_ADDR_P0 -> RX_ADDR_P5 - 3 byte address. eg 0xFFABXX . XX cannot be FF - if RX_ADDR_P1 needs to be used along with any of the pipes - from P2 to P5, then RX_ADDR_P1 must be updated last. - Addresses from P1-P5 must share the first two bytes. - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_WRITEADDRESS) - self.H.__sendByte__(register) - self.H.__sendByte__(address & 0xFF) - self.H.__sendByte__((address >> 8) & 0xFF) - self.H.__sendByte__((address >> 16) & 0xFF) - self.H.__get_ack__() - - def selectAddress(self, address): - ''' - Sets RX_ADDR_P0 and TX_ADDR to the specified address. - - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_WRITEADDRESSES) - self.H.__sendByte__(address & 0xFF) - self.H.__sendByte__((address >> 8) & 0xFF) - self.H.__sendByte__((address >> 16) & 0xFF) - self.H.__get_ack__() - self.CURRENT_ADDRESS = address - if address not in self.sigs: - self.sigs[address] = 1 - - def read_payload(self, numbytes): - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_READPAYLOAD) - self.H.__sendByte__(numbytes) - data = self.H.fd.read(numbytes) - self.H.__get_ack__() - return [ord(a) for a in data] - - def write_payload(self, data, verbose=False, **args): - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_WRITEPAYLOAD) - numbytes = len( - data) | 0x80 # 0x80 implies transmit immediately. Otherwise it will simply load the TX FIFO ( used by ACK_payload) - if (args.get('rxmode', False)): numbytes |= 0x40 - self.H.__sendByte__(numbytes) - self.H.__sendByte__(self.TX_PAYLOAD) - for a in data: - self.H.__sendByte__(a) - val = self.H.__get_ack__() >> 4 - if (verbose): - if val & 0x2: - print(' NRF radio not found. Connect one to the add-on port') - elif val & 0x1: - print(' Node probably dead/out of range. It failed to acknowledge') - return - return val - - def I2C_scan(self): - ''' - Scans the I2C bus and returns a list of live addresses - ''' - x = self.transaction([self.I2C_COMMANDS | self.I2C_SCAN | 0x80], timeout=500) - if not x: return [] - if not sum(x): return [] - addrs = [] - for a in range(16): - if (x[a] ^ 255): - for b in range(8): - if x[a] & (0x80 >> b) == 0: - addr = 8 * a + b - addrs.append(addr) - return addrs - - def GuessingScan(self): - ''' - Scans the I2C bus and also prints the possible devices associated with each found address - ''' - from PSL import sensorlist - print('Scanning addresses 0-127...') - x = self.transaction([self.I2C_COMMANDS | self.I2C_SCAN | 0x80], timeout=500) - if not x: return [] - if not sum(x): return [] - addrs = [] - print('Address', '\t', 'Possible Devices') - - for a in range(16): - if (x[a] ^ 255): - for b in range(8): - if x[a] & (0x80 >> b) == 0: - addr = 8 * a + b - addrs.append(addr) - print(hex(addr), '\t\t', sensorlist.sensors.get(addr, 'None')) - - return addrs - - def transaction(self, data, **args): - st = time.time() - - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_TRANSACTION) - self.H.__sendByte__(len(data)) # total Data bytes coming through - if 'listen' not in args: args['listen'] = True - if args.get('listen', False): data[0] |= 0x80 # You need this if hardware must wait for a reply - timeout = args.get('timeout', 200) - verbose = args.get('verbose', False) - self.H.__sendInt__(timeout) # timeout. - for a in data: - self.H.__sendByte__(a) - - # print ('dt send',time.time()-st,timeout,data[0]&0x80,data) - numbytes = self.H.__getByte__() - # print ('byte 1 in',time.time()-st) - if numbytes: - data = self.H.fd.read(numbytes) - else: - data = [] - val = self.H.__get_ack__() >> 4 - if (verbose): - if val & 0x1: print(time.time(), '%s Err. Node not found' % (hex(self.CURRENT_ADDRESS))) - if val & 0x2: print(time.time(), - '%s Err. NRF on-board transmitter not found' % (hex(self.CURRENT_ADDRESS))) - if val & 0x4 and args['listen']: print(time.time(), - '%s Err. Node received command but did not reply' % ( - hex(self.CURRENT_ADDRESS))) - if val & 0x7: # Something didn't go right. - self.flush() - self.sigs[self.CURRENT_ADDRESS] = self.sigs[self.CURRENT_ADDRESS] * 50 / 51. - return False - - self.sigs[self.CURRENT_ADDRESS] = (self.sigs[self.CURRENT_ADDRESS] * 50 + 1) / 51. - return [ord(a) for a in data] - - def transactionWithRetries(self, data, **args): - retries = args.get('retries', 5) - reply = False - while retries > 0: - reply = self.transaction(data, verbose=(retries == 1), **args) - if reply: - break - retries -= 1 - return reply - - def write_ack_payload(self, data, pipe): - if (len(data) != self.ACK_PAYLOAD_SIZE): - self.ACK_PAYLOAD_SIZE = len(data) - if self.ACK_PAYLOAD_SIZE > 15: - print('too large. truncating.') - self.ACK_PAYLOAD_SIZE = 15 - data = data[:15] - else: - print('ack payload size:', self.ACK_PAYLOAD_SIZE) - - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_WRITEPAYLOAD) - self.H.__sendByte__(len(data)) - self.H.__sendByte__(self.ACK_PAYLOAD | pipe) - for a in data: - self.H.__sendByte__(a) - return self.H.__get_ack__() >> 4 - - def start_token_manager(self): - ''' - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_START_TOKEN_MANAGER) - self.H.__get_ack__() - - def stop_token_manager(self): - ''' - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_STOP_TOKEN_MANAGER) - self.H.__get_ack__() - - def total_tokens(self): - ''' - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_TOTAL_TOKENS) - x = self.H.__getByte__() - self.H.__get_ack__() - return x - - def fetch_report(self, num): - ''' - ''' - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_REPORTS) - self.H.__sendByte__(num) - data = [self.H.__getByte__() for a in range(20)] - self.H.__get_ack__() - return data - - def __decode_I2C_list__(self, data): - lst = [] - if sum(data) == 0: - return lst - for a in range(len(data)): - if (data[a] ^ 255): - for b in range(8): - if data[a] & (0x80 >> b) == 0: - addr = 8 * a + b - lst.append(addr) - return lst - - def get_nodelist(self): - ''' - Refer to the variable 'nodelist' if you simply want a list of nodes that either registered while your code was - running , or were loaded from the firmware buffer(max 15 entries) - - If you plan to use more than 15 nodes, and wish to register their addresses without having to feed them manually, - then this function must be called each time before the buffer resets. - - The dictionary object returned by this function [addresses paired with arrays containing their registered sensors] - is filtered by checking with each node if they are alive. - - ''' - - total = self.total_tokens() - if self.nodepos != total: - for nm in range(self.NODELIST_MAXLENGTH): - dat = self.fetch_report(nm) - txrx = (dat[0]) | (dat[1] << 8) | (dat[2] << 16) - if not txrx: continue - self.nodelist[txrx] = self.__decode_I2C_list__(dat[3:19]) - self.nodepos = total - # else: - # self.__delete_registered_node__(nm) - - filtered_lst = {} - for a in self.nodelist: - if self.isAlive(a): filtered_lst[a] = self.nodelist[a] - - return filtered_lst - - def __delete_registered_node__(self, num): - self.H.__sendByte__(CP.NRFL01) - self.H.__sendByte__(CP.NRF_DELETE_REPORT_ROW) - self.H.__sendByte__(num) - self.H.__get_ack__() - - def __delete_all_registered_nodes__(self): - while self.total_tokens(): - print('-') - self.__delete_registered_node__(0) - - def isAlive(self, addr): - self.selectAddress(addr) - return self.transaction([self.NRF_COMMANDS | self.NRF_READ_REGISTER] + [self.R_STATUS], timeout=100, - verbose=False) - - def init_shockburst_transmitter(self, **args): - ''' - Puts the radio into transmit mode. - Dynamic Payload with auto acknowledge is enabled. - upto 5 retransmits with 1ms delay between each in case a node doesn't respond in time - Receivers must acknowledge payloads - ''' - self.PAYLOAD_SIZE = args.get('PAYLOAD_SIZE', self.PAYLOAD_SIZE) - myaddr = args.get('myaddr', 0xAAAA01) - sendaddr = args.get('sendaddr', 0xAAAA01) - - self.init() - # shockburst - self.write_address(self.RX_ADDR_P0, myaddr) # transmitter's address - self.write_address(self.TX_ADDR, sendaddr) # send to node with this address - self.write_register(self.RX_PW_P0, self.PAYLOAD_SIZE) - self.rxmode() - time.sleep(0.1) - self.flush() - - def init_shockburst_receiver(self, **args): - ''' - Puts the radio into receive mode. - Dynamic Payload with auto acknowledge is enabled. - ''' - self.PAYLOAD_SIZE = args.get('PAYLOAD_SIZE', self.PAYLOAD_SIZE) - if 'myaddr0' not in args: - args['myaddr0'] = 0xA523B5 - # if 'sendaddr' non in args: - # args['sendaddr']=0xA523B5 - print(args) - self.init() - self.write_register(self.RF_SETUP, 0x26) # 2MBPS speed - - # self.write_address(self.TX_ADDR,sendaddr) #send to node with this address - # self.write_address(self.RX_ADDR_P0,myaddr) #will receive the ACK Payload from that node - enabled_pipes = 0 # pipes to be enabled - for a in range(0, 6): - x = args.get('myaddr' + str(a), None) - if x: - print(hex(x), hex(self.RX_ADDR_P0 + a)) - enabled_pipes |= (1 << a) - self.write_address(self.RX_ADDR_P0 + a, x) - P15_base_address = args.get('myaddr1', None) - if P15_base_address: self.write_address(self.RX_ADDR_P1, P15_base_address) - - self.write_register(self.EN_RXADDR, enabled_pipes) # enable pipes - self.write_register(self.EN_AA, enabled_pipes) # enable auto Acknowledge on all pipes - self.write_register(self.DYNPD, enabled_pipes) # enable dynamic payload on Data pipes - self.write_register(self.FEATURE, 0x06) # enable dynamic payload length - # self.write_register(self.RX_PW_P0,self.PAYLOAD_SIZE) - - self.rxmode() - time.sleep(0.1) - self.flush() - - -class RadioLink(): - ADC_COMMANDS = 1 - READ_ADC = 0 << 4 - - I2C_COMMANDS = 2 - I2C_TRANSACTION = 0 << 4 - I2C_WRITE = 1 << 4 - SCAN_I2C = 2 << 4 - PULL_SCL_LOW = 3 << 4 - I2C_CONFIG = 4 << 4 - I2C_READ = 5 << 4 - - NRF_COMMANDS = 3 - NRF_READ_REGISTER = 0 << 4 - NRF_WRITE_REGISTER = 1 << 4 - - MISC_COMMANDS = 4 - WS2812B_CMD = 0 << 4 - - def __init__(self, NRF, **args): - self.NRF = NRF - if 'address' in args: - self.ADDRESS = args.get('address', False) - else: - print('Address not specified. Add "address=0x....." argument while instantiating') - self.ADDRESS = 0x010101 - - def __selectMe__(self): - if self.NRF.CURRENT_ADDRESS != self.ADDRESS: - self.NRF.selectAddress(self.ADDRESS) - - def I2C_scan(self): - self.__selectMe__() - from PSL import sensorlist - print('Scanning addresses 0-127...') - x = self.NRF.transaction([self.I2C_COMMANDS | self.SCAN_I2C | 0x80], timeout=500) - if not x: return [] - if not sum(x): return [] - addrs = [] - print('Address', '\t', 'Possible Devices') - - for a in range(16): - if (x[a] ^ 255): - for b in range(8): - if x[a] & (0x80 >> b) == 0: - addr = 8 * a + b - addrs.append(addr) - print(hex(addr), '\t\t', sensorlist.sensors.get(addr, 'None')) - - return addrs - - def __decode_I2C_list__(self, data): - lst = [] - if sum(data) == 0: - return lst - for a in range(len(data)): - if (data[a] ^ 255): - for b in range(8): - if data[a] & (0x80 >> b) == 0: - addr = 8 * a + b - lst.append(addr) - return lst - - def writeI2C(self, I2C_addr, regaddress, bytes): - self.__selectMe__() - return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_WRITE] + [I2C_addr] + [regaddress] + bytes) - - def readI2C(self, I2C_addr, regaddress, numbytes): - self.__selectMe__() - return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_TRANSACTION] + [I2C_addr] + [regaddress] + [numbytes]) - - def writeBulk(self, I2C_addr, bytes): - self.__selectMe__() - return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_WRITE] + [I2C_addr] + bytes) - - def readBulk(self, I2C_addr, regaddress, numbytes): - self.__selectMe__() - return self.NRF.transactionWithRetries( - [self.I2C_COMMANDS | self.I2C_TRANSACTION] + [I2C_addr] + [regaddress] + [numbytes]) - - def simpleRead(self, I2C_addr, numbytes): - self.__selectMe__() - return self.NRF.transactionWithRetries([self.I2C_COMMANDS | self.I2C_READ] + [I2C_addr] + [numbytes]) - - def readADC(self, channel): - self.__selectMe__() - return self.NRF.transaction([self.ADC_COMMANDS | self.READ_ADC] + [channel]) - - def pullSCLLow(self, t_ms): - self.__selectMe__() - dat = self.NRF.transaction([self.I2C_COMMANDS | self.PULL_SCL_LOW] + [t_ms]) - if dat: - return self.__decode_I2C_list__(dat) - else: - return [] - - def configI2C(self, freq): - self.__selectMe__() - brgval = int(32e6 / freq / 4 - 1) - print(brgval) - return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_CONFIG] + [brgval], listen=False) - - def write_register(self, reg, val): - self.__selectMe__() - # print ('writing to ',reg,val) - return self.NRF.transaction([self.NRF_COMMANDS | self.NRF_WRITE_REGISTER] + [reg, val], listen=False) - - def WS2812B(self, cols): - """ - set shade of WS2182 LED on CS1/RC0 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - cols 2Darray [[R,G,B],[R2,G2,B2],[R3,G3,B3]...] - brightness of R,G,B ( 0-255 ) - ============== ============================================================================================ - - example:: - - >>> WS2812B([[10,0,0],[0,10,10],[10,0,10]]) - #sets red, cyan, magenta to three daisy chained LEDs - - """ - self.__selectMe__() - colarray = [] - for a in cols: - colarray.append(int('{:08b}'.format(int(a[1]))[::-1], 2)) - colarray.append(int('{:08b}'.format(int(a[0]))[::-1], 2)) - colarray.append(int('{:08b}'.format(int(a[2]))[::-1], 2)) - - res = self.NRF.transaction([self.MISC_COMMANDS | self.WS2812B_CMD] + colarray, listen=False) - return res - - def read_register(self, reg): - self.__selectMe__() - x = self.NRF.transaction([self.NRF_COMMANDS | self.NRF_READ_REGISTER] + [reg]) - if x: - return x[0] - else: - return False diff --git a/PSL/README.md b/PSL/README.md deleted file mode 100644 index 138d2c80..00000000 --- a/PSL/README.md +++ /dev/null @@ -1,1302 +0,0 @@ -### Documentation of back-end functions used in PSLab, taken from [sciencelab.py](https://github.com/fossasia/pslab-python/blob/development/PSL/sciencelab.py) - -Sciencelab class contains methods that can be used to interact with the FOSSASIA PSLab. Run the following code to connect: - - >>> from PSL import sciencelab - >>> I = sciencelab.connect() - >>> self.__print__(I) - - -Once you have initiated this class, its various methods will allow access to all the features built into the device. - -
-get_resistance(self)
-
- -
-get_version(self) - -+ Returns the version string of the device, format: LTS-...... - -
- -
-getRadioLinks(self)
-
- -
-newRadioLink(self, **args) - -+ Arguments - + \*\*Kwargs: Keyword Arguments - + address: Address of the node. a 24 bit number. Printed on the nodes. Can also be retrieved using :py:meth:`~NRF24L01_class.NRF24L01.get_nodelist` -+ Return: :py:meth:`~NRF_NODE.RadioLink` - -
- -## ANALOG SECTION - -This section has commands related to analog measurement and control. These include the oscilloscope routines, voltmeters, ammeters, and Programmable voltage sources. - -
-reconnect(self, **kwargs) - -+ Attempts to reconnect to the device in case of a commmunication error or accidental disconnect. - -
- -
-capture1(self, ch, ns, tg, *args, **kwargs) - -+ Blocking call that fetches an oscilloscope trace from the specified input channel -+ Arguments - + ch: Channel to select as input. ['CH1'..'CH3','SEN'] - + ns: Number of samples to fetch. Maximum 10000 - + tg: Timegap between samples in microseconds -+ Return: Arrays X(timestamps),Y(Corresponding Voltage values) - -``` ->>> from pylab import * ->>> from PSL import sciencelab ->>> I = sciencelab.connect() ->>> x,y = I.capture1('CH1',3200,1) ->>> plot(x,y) ->>> show() -``` - -
- -
-capture2(self, ns, tg, TraceOneRemap = 'CH1') - -+ Blocking call that fetches oscilloscope traces from CH1,CH2 -+ Arguments - + ns: Number of samples to fetch. Maximum 5000 - + tg: Timegap between samples in microseconds - + TraceOneRemap: Choose the analog input for channel 1. It is connected to CH1 by default. Channel 2 always reads CH2. -+ Return: Arrays X(timestamps),Y1(Voltage at CH1),Y2(Voltage at CH2) - -``` ->>> from pylab import * ->>> from PSL import sciencelab ->>> I = sciencelab.connect() ->>> x,y1,y2 = I.capture2(1600,2,'MIC') #Chan1 remapped to MIC. Chan2 reads CH2 ->>> plot(x,y1) #Plot of analog input MIC ->>> plot(x,y2) #plot of analog input CH2 ->>> show() -``` - -
- -
-capture4(self, ns, tg, TraceOneRemap = 'CH1') - -+ Blocking call that fetches oscilloscope traces from CH1,CH2 -+ Arguments - + ns: Number of samples to fetch. Maximum 2500 - + tg: Timegap between samples in microseconds. Minimum 1.75uS - + TraceOneRemap: Choose the analog input for channel 1. It is connected to CH1 by default. Channel 2 always reads CH2. -+ Return: Arrays X(timestamps),Y1(Voltage at CH1),Y2(Voltage at CH2),Y3(Voltage at CH3),Y4(Voltage at CH4) - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> x,y1,y2,y3,y4 = I.capture4(800,1.75) ->>> plot(x,y1) ->>> plot(x,y2) ->>> plot(x,y3) ->>> plot(x,y4) ->>> show() -``` - -
- -
-capture_multiple(self, samples, tg, *args) - -+ Blocking call that fetches oscilloscope traces from a set of specified channels -+ Arguments - + samples: Number of samples to fetch. Maximum 10000/(total specified channels) - + tg: Timegap between samples in microseconds. - + \*args: Channel names -+ Return: Arrays X(timestamps),Y1,Y2 ... - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> x,y1,y2,y3,y4 = I.capture_multiple(800,1.75,'CH1','CH2','MIC','SEN') ->>> plot(x,y1) ->>> plot(x,y2) ->>> plot(x,y3) ->>> plot(x,y4) ->>> show() -``` - -
- -
-capture_fullspeed(self, chan, samples, tg, *args, **kwargs) - -+ Blocking call that fetches oscilloscope traces from a single oscilloscope channel at a maximum speed of 2MSPS - -+ Arguments - + chan: Channel name 'CH1' / 'CH2' ... 'SEN' - + samples: Number of samples to fetch. Maximum 10000/(total specified channels) - + \*args: Specify if SQR1 must be toggled right before capturing. - + 'SET_LOW': Set SQR1 to 0V - + 'SET_HIGH': Set SQR1 to 1V - + 'FIRE_PULSES': output a preset frequency on SQR1 for a given interval (keyword arg 'interval' must be specified or it will default to 1000uS) before acquiring data. This is used for measuring speed of sound using piezos if no arguments are specified, a regular capture will be executed. - + \*\*kwargs - + interval: Units: uS. Necessary if 'FIRE_PULSES' argument was supplied. Default 1000uS -+ Return: timestamp array ,voltage_value array - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> x,y = I.capture_fullspeed('CH1',2000,1) ->>> plot(x,y) ->>> show() -``` - -``` ->>> x,y = I.capture_fullspeed('CH1',2000,1,'SET_LOW') ->>> plot(x,y) ->>> show() -``` - -``` ->>> I.sqr1(40e3 , 50, True) # Prepare a 40KHz, 50% square wave. Do not output it yet ->>> x,y = I.capture_fullspeed('CH1',2000,1,'FIRE_PULSES',interval = 250) #Output the prepared 40KHz(25uS) wave for 250uS(10 cycles) before acquisition ->>> plot(x,y) ->>> show() -``` - -
- -
-capture_fullspeed_hr(self, chan, samples, tg, *args) -
- -
-capture_traces(self, num, samples, tg, channel_one_input = 'CH1', CH123SA = 0, *kwargs) - -+ Instruct the ADC to start sampling. use fetch_trace to retrieve the data - -+ Arguments - + num: Channels to acquire. 1/2/4 - + samples: Total points to store per channel. Maximum 3200 total. - + tg: Timegap between two successive samples (in uSec) - + channel_one_input: Map channel 1 to 'CH1' ... 'CH9' - + \*\*kwargs - + \*trigger: Whether or not to trigger the oscilloscope based on the voltage level set by :func:`configure_trigger` -+ Return: nothing - -The following example demonstrates how to use this function to record active events. - -+ Connect a capacitor and an Inductor in series. -+ Connect CH1 to the spare leg of the inductor. Also Connect OD1 to this point -+ Connect CH2 to the junction between the capacitor and the inductor -+ Connect the spare leg of the capacitor to GND( ground ) -+ Set OD1 initially high using set_state(SQR1 = 1) - -``` ->>> I.set_state(OD1 = 1) #Turn on OD1 -#Arbitrary delay to wait for stabilization ->>> time.sleep(0.5) -#Start acquiring data (2 channels,800 samples, 2microsecond intervals) ->>> I.capture_traces(2,800,2,trigger = False) -#Turn off OD1. This must occur immediately after the previous line was executed. ->>> I.set_state(OD1 = 0) -#Minimum interval to wait for completion of data acquisition. -#samples*timegap*(convert to Seconds) ->>> time.sleep(800*2*1e-6) ->>> x,CH1 = I.fetch_trace(1) ->>> x,CH2 = I.fetch_trace(2) ->>> plot(x,CH1-CH2) #Voltage across the inductor ->>> plot(x,CH2) ##Voltage across the capacitor ->>> show() -``` - -The following events take place when the above snippet runs - -+ The oscilloscope starts storing voltages present at CH1 and CH2 every 2 microseconds -+ The output OD1 was enabled, and this causes the voltage between the L and C to approach OD1 voltage. (It may or may not oscillate) -+ The data from CH1 and CH2 was read into x,CH1,CH2 -+ Both traces were plotted in order to visualize the Transient response of series LC - -
- -
-capture_highres_traces(self, channel, samples, tg, **kwargs) - -+ Instruct the ADC to start sampling. Use fetch_trace to retrieve the data - -+ Arguments - + channel: Channel to acquire data from 'CH1' ... 'CH9' - + samples: Total points to store per channel. Maximum 3200 total. - + tg : Timegap between two successive samples (in uSec) - + \*\*kwargs - + \*trigger : Whether or not to trigger the oscilloscope based on the voltage level set by :func:`configure_trigger` -+ Return: nothing - -
- -
-fetch_trace(self, channel_number) - -+ Fetches a channel(1-4) captured by :func:`capture_traces` called prior to this, and returns xaxis,yaxis - -+ Arguments - + channel_number: Any of the maximum of four channels that the oscilloscope captured. 1/2/3/4 -+ Return: time array,voltage array - -
- -
-oscilloscope_progress(self) - -+ Returns the number of samples acquired by the capture routines, and the conversion_done status -+ Return: conversion done(bool) ,samples acquired (number) - -``` ->>> I.start_capture(1,3200,2) ->>> self.__print__(I.oscilloscope_progress()) -(0,46) ->>> time.sleep(3200*2e-6) ->>> self.__print__(I.oscilloscope_progress()) -(1,3200) -``` - -
- -
-configure_trigger(self, chan, name, voltage, resolution = 10, **kwargs) - -+ Configure trigger parameters for 10-bit capture commands -+ The capture routines will wait till a rising edge of the input signal crosses the specified level. -+ The trigger will timeout within 8mS, and capture routines will start regardless. -+ These settings will not be used if the trigger option in the capture routines are set to False -+ Arguments - + chan: Channel 0,1,2,3. Corresponding to the channels being recorded by the capture routine(not the analog inputs) - + name: Name of the channel. 'CH1'... 'V+' - + voltage: The voltage level that should trigger the capture sequence(in Volts) -+ Return: Nothing - -``` ->>> I.configure_trigger(0,'CH1',1.1) ->>> I.capture_traces(4,800,2) -#Unless a timeout occured, the first point of this channel will be close to 1.1Volts ->>> I.fetch_trace(1) -#This channel was acquired simultaneously with channel 1, -#So it's triggered along with the first ->>> I.fetch_trace(2) -``` - -
- -
-set_gain(self, channel, gain, Force = False) - -+ Set the gain of the selected PGA -+ Arguments - + channel: 'CH1','CH2' - + gain: (0-8) -> (1x,2x,4x,5x,8x,10x,16x,32x,1/11x) - + Force: If True, the amplifier gain will be set even if it was previously set to the same value. - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> I.set_gain('CH1',7) #gain set to 32x on CH1 -``` - -**Note**: The gain value applied to a channel will result in better resolution for small amplitude signals. However, values read using functions like :func:`get_average_voltage` or func:`capture_traces` will not be 2x, or 4x times the input signal. These are calibrated to return accurate values of the original input signal. In case the gain specified is 8 (1/11x) , an external 10MOhm resistor must be connected in series with the device. The input range will be +/-160 Volts - -
- -
-select_range(self, channel, voltage_range) - -+ set the gain of the selected PGA -+ Arguments - + channel: 'CH1','CH2' - + voltage_range: Choose from [16,8,4,3,2,1.5,1,.5,160] - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> I.select_range('CH1',8) #gain set to 2x on CH1. Voltage range +/-8V -``` - -**Note**: Setting the right voltage range will result in better resolution. In case the range specified is 160 , an external 10MOhm resistor must be connected in series with the device. This function internally calls `set_gain` with the appropriate gain value - -
- -
-get_voltage(self, channel_name, **kwargs)
-
- -
-voltmeter_autorange(self, channel_name)
-
- -
-get_average_voltage(self, channel_name, **kwargs) - -+ Return the voltage on the selected channel -+ Arguments - + channel_name : 'CH1','CH2','CH3', 'MIC','IN1','SEN','V+' - + sleep: Read voltage in CPU sleep mode. not particularly useful. Also, Buggy. - + \*\*kwargs: Samples to average can be specified. Eg, samples=100 will average a hundred readings - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> self.__print__(I.get_average_voltage('CH4')) -1.002 -``` - -
- -
-fetch_buffer(self, starting_position = 0, total_points = 100) - -+ Fetches a section of the ADC hardware buffer - -
- -
-clear_buffer(self, starting_position, total_points) - -+ Clears a section of the ADC hardware buffer - -
- -
-fill_buffer(slef, starting_position, poin_array) - -+ Fill a section of the ADC hardware buffer with data - -
- -
-start_streaming(self, tg, channel = 'CH1') - -+ Instruct the ADC to start streaming 8-bit data. use stop_streaming to stop. -+ Arguments - + tg: timegap. 250KHz clock - + channel: channel 'CH1'... 'CH9','IN1','SEN' - -
- -
-stop_streaming(self) - -+ Instruct the ADC to stop streaming data - -
- -## DIGITAL SECTION - -This section has commands related to digital measurement and control. These include the Logic Analyzer, frequency measurement calls, timing routines, digital outputs etc. - -
-get_high_freq(self, pin) - -+ Retrieves the frequency of the signal connected to ID1. For frequencies > 1MHz -+ Also good for lower frequencies, but avoid using it since the oscilloscope cannot be used simultaneously due to hardware limitations. -+ The input frequency is fed to a 32 bit counter for a period of 100mS. -+ The value of the counter at the end of 100mS is used to calculate the frequency. -+ Arguments - + pin: The input pin to measure frequency from : ['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] -+ Return: frequency - -
- -
-get_freq(self, channel = 'CNTR', timeout = 2) - -+ Frequency measurement on IDx. -+ Measures time taken for 16 rising edges of input signal. -+ Returns the frequency in Hertz -+ Arguments - + channel: The input to measure frequency from. ['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + timeout: This is a blocking call which will wait for one full wavelength before returning the calculated frequency. Use the timeout option if you're unsure of the input signal. Returns 0 if timed out -+ Return: float: frequency - -Connect SQR1 to ID1 - -``` ->>> I.sqr1(4000,25) ->>> self.__print__(I.get_freq('ID1')) -4000.0 ->>> self.__print__(I.r2r_time('ID1')) -#time between successive rising edges -0.00025 ->>> self.__print__(I.f2f_time('ID1')) -#time between successive falling edges -0.00025 ->>> self.__print__(I.pulse_time('ID1')) -#may detect a low pulse, or a high pulse. Whichever comes first -6.25e-05 ->>> I.duty_cycle('ID1') -#returns wavelength, high time -(0.00025,6.25e-05) -``` - -
- -
-r2r_time(self, channel, skip_cycle = 0, timeout = 5) - -+ Return a list of rising edges that occured within the timeout period. -+ Arguments - + channel: The input to measure time between two rising edges.['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + skip_cycle: Number of points to skip. eg. Pendulums pass through light barriers twice every cycle. SO 1 must be skipped - + timeout: Number of seconds to wait for datapoints. (Maximum 60 seconds) -+ Return: list: Array of points - -
- -
-f2f_time(self,channel, skip_cycle = 0, timeout = 5) - -+ Return a list of falling edges that occured within the timeout period. -+ Arguments - + channel: The input to measure time between two falling edges.['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + skip_cycle: Number of points to skip. eg. Pendulums pass through light barriers twice every cycle. SO 1 must be skipped - + timeout: Number of seconds to wait for datapoints. (Maximum 60 seconds) -+ Return: list: Array of points - -
- -
-MeasureInterval(self, channel1, channel2, edge1, edge2, timeout = 0.1) - -+ Measures time intervals between two logic level changes on any two digital inputs(both can be the same) and returns the calculated time. -+ For example, one can measure the time interval between the occurence of a rising edge on ID1, and a falling edge on ID3. -+ If the returned time is negative, it simply means that the event corresponding to channel2 occurred first. -+ Arguments - + channel1: The input pin to measure first logic level change - + channel2: The input pin to measure second logic level change -['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + edge1: The type of level change to detect in order to start the timer - + 'rising' - + 'falling' - + 'four rising edges' - + edge1: The type of level change to detect in order to stop the timer - + 'rising' - + 'falling' - + 'four rising edges' - + timeout: Use the timeout option if you're unsure of the input signal time period. - Returns -1 if timed out -+ Return: time - -
- -
-DutyCycle(self, channel = 'ID1', timeout = 1.) - -+ Duty cycle measurement on channel. Returns wavelength(seconds), and length of first half of pulse(high time) -+ Low time = (wavelength - high time) -+ Arguments - + channel: The input pin to measure wavelength and high time.['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + timeout: Use the timeout option if you're unsure of the input signal time period. Returns 0 if timed out -+ Return: wavelength, duty cycle - -
- -
-PulseTime(self, channel = 'ID1', PulseType = 'LOW', timeout = 0.1) - -+ Duty cycle measurement on channel. Returns wavelength(seconds), and length of first half of pulse(high time) -+ Low time = (wavelength - high time) -+ Arguments - + channel: The input pin to measure wavelength and high time.['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + PulseType: Type of pulse to detect. May be 'HIGH' or 'LOW' - + timeout: Use the timeout option if you're unsure of the input signal time period. - Returns 0 if timed out -+ Return: pulse width - -
- -
-MeasureMultipleDigitalEdges(self, channel1, channel2, edgeType1, edgeType2, points1, points2, timeout=0.1, **kwargs) - -+ Measures a set of timestamped logic level changes(Type can be selected) from two different digital inputs. -+ Arguments - + channel1: The input pin to measure first logic level change - + channel2: The input pin to measure second logic level change - -['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + edgeType1: The type of level change that should be recorded - + 'rising' - + 'falling' - + 'four rising edges' [default] - + edgeType2: The type of level change that should be recorded - + 'rising' - + 'falling' - + 'four rising edges' - + points1: Number of data points to obtain for input 1 (Max 4) - + points2: Number of data points to obtain for input 2 (Max 4) - + timeout: Use the timeout option if you're unsure of the input signal time period. - returns -1 if timed out - + **kwargs - + SQ1: Set the state of SQR1 output(LOW or HIGH) and then start the timer. eg. SQR1 = 'LOW' - + zero: subtract the timestamp of the first point from all the others before returning. Default: True -+ Return: time -+ Example, Aim : Calculate value of gravity using time of flight. The setup involves a small metal nut attached to an electromagnet powered via SQ1. When SQ1 is turned off, the set up is designed to make the nut fall through two different light barriers(LED,detector pairs that show a logic change when an object gets in the middle) placed at known distances from the initial position. One can measure the timestamps for rising edges on ID1 ,and ID2 to determine the speed, and then obtain value of g. - -
- -
-capture_edges1(self, waiting_time = 1., **args) - -+ Log timestamps of rising/falling edges on one digital input -+ Arguments - + waiting_time: Total time to allow the logic analyzer to collect data. This is implemented using a simple sleep routine, so if large delays will be involved, refer to :func:`start_one_channel_LA` to start the acquisition, and :func:`fetch_LA_channels` to retrieve data from the hardware after adequate time. The retrieved data is stored in the array self.dchans[0].timestamps. - + keyword arguments - + channel: 'ID1',...,'ID4' - + trigger_channel: 'ID1',...,'ID4' - + channel_mode: acquisition mode, default value: 3 - + EVERY_SIXTEENTH_RISING_EDGE = 5 - + EVERY_FOURTH_RISING_EDGE = 4 - + EVERY_RISING_EDGE = 3 - + EVERY_FALLING_EDGE = 2 - + EVERY_EDGE = 1 - + DISABLED = 0 - + trigger_mode: same as channel_mode. default_value : 3 -+ Return: timestamp array in Seconds - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> I.capture_edges(0.2,channel = 'ID1',trigger_channel = 'ID1',channel_mode = 3,trigger_mode = 3) -#captures rising edges only. with rising edge trigger on ID1 -``` - -
- -
-start_one_channel_LA_backup__(self, trigger = 1, channel = 'ID1', maximum_time = 67, **args) - -+ Start logging timestamps of rising/falling edges on ID1 -+ Arguments - + trigger: Bool . Enable edge trigger on ID1. use keyword argument edge = 'rising' or 'falling' - + channel: ['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + maximum_time: Total time to sample. If total time exceeds 67 seconds, a prescaler will be used in the reference clock. - + kwargs - + triggger_channels: array of digital input names that can trigger the acquisition. Eg, trigger = ['ID1','ID2','ID3'] will triggger when a logic change specified by the keyword argument 'edge' occurs on either or the three specified trigger inputs. - + edge: 'rising' or 'falling' . trigger edge type for trigger_channels. -+ Return: Nothing - -
- -
-start_one_channel_LA(self, **args) - -+ Start logging timestamps of rising/falling edges on ID1 -+ Arguments - + channel: ['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + channel_mode: Acquisition mode, default value: 1 - + EVERY_SIXTEENTH_RISING_EDGE = 5 - + EVERY_FOURTH_RISING_EDGE = 4 - + EVERY_RISING_EDGE = 3 - + EVERY_FALLING_EDGE = 2 - + EVERY_EDGE = 1 - + DISABLED = 0 -+ Return: Nothing - -
- -
-start_two_channel_LA(self, **args) - -+ Start logging timestamps of rising/falling edges on ID1, AD2 -+ Arguments - + trigger: Bool. Enable rising edge trigger on ID1 - + \*\*args - + chans: Channels to acquire data from . default ['ID1','ID2'] - + mode: modes for each channel. Array, default value: [1,1] - + EVERY_SIXTEENTH_RISING_EDGE = 5 - + EVERY_FOURTH_RISING_EDGE = 4 - + EVERY_RISING_EDGE = 3 - + EVERY_FALLING_EDGE = 2 - + EVERY_EDGE = 1 - + DISABLED = 0 - + maximum_time: Total time to sample. If total time exceeds 67 seconds, a prescaler will be used in the reference clock -+ Return: Nothing - -
- -
-start_three_channel_LA(self, **args) - -+ Start logging timestamps of rising/falling edges on ID1, ID2, ID3 -+ Arguments - + \*\*args - + trigger_channel: ['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - + mode: modes for each channel. Array, default value: [1,1,1] - + EVERY_SIXTEENTH_RISING_EDGE = 5 - + EVERY_FOURTH_RISING_EDGE = 4 - + EVERY_RISING_EDGE = 3 - + EVERY_FALLING_EDGE = 2 - + EVERY_EDGE = 1 - + DISABLED = 0 - + trigger_mode: Same as modes(previously documented keyword argument) - default_value : 3 -+ Return: Nothing - -
- -
-start_four_channel_LA(self, trigger = 1, maximum_time = 0.001, mode = [1, 1, 1, 1], **args) - -+ Four channel Logic Analyzer. Start logging timestamps from a 64MHz counter to record level changes on ID1,ID2,ID3,ID4. -+ Arguments - + trigger: Bool . Enable rising edge trigger on ID1 - + maximum_time: Maximum delay expected between two logic level changes.
- If total time exceeds 1 mS, a prescaler will be used in the reference clock. However, this only refers to the maximum time between two successive level changes. If a delay larger than .26 S occurs, it will be truncated by modulo .26 S.
-If you need to record large intervals, try single channel/two channel modes which use 32 bit counters capable of time interval up to 67 seconds. - + mode: modes for each channel. Array, default value: [1,1,1] - + EVERY_SIXTEENTH_RISING_EDGE = 5 - + EVERY_FOURTH_RISING_EDGE = 4 - + EVERY_RISING_EDGE = 3 - + EVERY_FALLING_EDGE = 2 - + EVERY_EDGE = 1 - + DISABLED = 0 - + trigger_mode: Same as modes(previously documented keyword argument) - default_value : 3 -+ Return: Nothing -+ See also: Use :func:`fetch_long_data_from_LA` (points to read,x) to get data acquired from channel x.The read data can be accessed from :class:`~ScienceLab.dchans` [x-1] - -
- -
-get_LA_initial_states(self) - -+ Fetches the initial states of digital inputs that were recorded right before the Logic analyzer was started, and the total points each channel recorded -+ Returns: chan1 progress,chan2 progress,chan3 progress,chan4 progress,[ID1,ID2,ID3,ID4]. eg. [1,0,1,1] - -
- -
-stop_LA(self) - -+ Stop any running logic analyzer function - -
- -
-fetch_int_data_from_LA(self, bytes, chan = 1) - -+ Fetches the data stored by DMA. integer address increments -+ Arguments - + bytes: Number of readings(integers) to fetch - + chan: Channel number (1-4) - -
- -
-fetch_LA_channels(self) - -+ Fetches the data stored by DMA. Integer address increments -+ Arguments - + bytes: Number of readings(integers) to fetch - + chan: Channel number (1-4) - -
- -
-fetch_long_data_from_LA(self, bytes, chan = 1) - -+ Fetches the data stored by DMA. long address increments -+ Arguments - + bytes: Number of readings(long integers) to fetch - + chan: Channel number (1-2) - -
- -
-fetch_LA_channels(self) - -+ Reads and stores the channels in self.dchans. - -
- -
-get_states(self) - -+ Gets the state of the digital inputs. -+ Returns: dictionary with keys 'ID1','ID2','ID3','ID4' - -
- -
-get_state(self, input_id) - -+ Returns the logic level on the specified input (ID1,ID2,ID3, or ID4) -+ Arguments - + input_id: the input channel - + 'ID1' -> state of ID1 - + 'ID4' -> state of ID4 -+ Return: boolean - -``` ->>> from pylab import * ->>> I = sciencelab.ScienceLab() ->>> self.__print__(I.get_state(I.ID1)) - False -``` - -
- -
-set_state(self, **kwargs) - -+ Set the logic level on digital outputs SQR1,SQR2,SQR3,SQR4 -+ Arguments - + \*\*kwargs: SQR1,SQR2,SQR3,SQR4
- states(0 or 1) -``` ->>> I.set_state(SQR1 = 1,SQR2 = 0) -#Sets SQR1 HIGH, SQR2 LOw, but leave SQR3,SQR4 untouched. -``` - -
- -
-countPulses(self, channel = 'SEN') - -+ Count pulses on a digital input. Retrieve total pulses using readPulseCount -+ Arguments - + channel: The input pin to measure rising edges on : ['ID1','ID2','ID3','ID4','SEN','EXT','CNTR'] - -
- -
-readPulseCount(self) - -+ Read pulses counted using a digital input. Call countPulses before using this. - -
- -
-capacitance_via_RC_discharge(self)
-
- -
-get_capacitor_range(self) - -+ Charges a capacitor connected to IN1 via a 20K resistor from a 3.3V source for a fixed interval -+ This function allows an estimation of the parameters to be used with the :func:`get_capacitance` function. -+ Returns: Capacitance calculated using the formula Vc = Vs(1-exp(-t/RC)) - -
- -
-get_capacitance(self) - -+ Measures capacitance of component connected between CAP and ground -+ Returns: Capacitance (F) - -
- -
-get_temperature(self) - -+ Return the processor's temperature -+ Returns: Chip Temperature in degree Celcius - -
- -
-get_ctmu_voltage(self, channel, Crange, tgen = 1) - -+ get_ctmu_voltage(5,2) will activate a constant current source of 5.5uA on IN1 and then measure the voltage at the output. -+ If a diode is used to connect IN1 to ground, the forward voltage drop of the diode will be returned. e.g. .6V for a 4148diode. -+ Returns: Voltage -+ Channel = 5 for IN1 - -| CRange | Implies | -|----------|:-------------:| -| 0 | 550uA | -| 1 | 0.55uA | -| 2 | 5.5uA | -| 3 | 55uA | - -
- -
-resetHardware(self) - -+ Resets the device, and standalone mode will be enabled if an OLED is connected to the I2C port - -
- -
-read_flash(self, page, location) - -+ Reads 16 BYTES from the specified location -+ Arguments - + page: page number. 20 pages with 2KBytes each - + location: The flash location(0 to 63) to read from. -+ Return: String of 16 characters read from the location - -
- -
-read_bulk_flash(self, page, numbytes) - -+ Reads BYTES from the specified location -+ Arguments - + page: Block number. 0-20. each block is 2kB. - + numbytes: Total bytes to read -+ Return: String of 16 characters read from the locationamps),Y1(Voltage at CH1),Y2(Voltage at CH2),Y3(Voltage at CH3),Y4(Voltage at CH4) - -
- -
-write_flash(self, page, location, string_to_write) - -+ Write a 16 BYTE string to the selected location (0-63) -+ Arguments - + page: page number. 20 pages with 2KBytes each - + location: The flash location(0 to 63) to write to. - + string_to_write: String of 16 characters can be written to each location -+ Note: DO NOT USE THIS UNLESS YOU'RE ABSOLUTELY SURE KNOW THIS! - YOU MAY END UP OVERWRITING THE CALIBRATION DATA, AND WILL HAVE - TO GO THROUGH THE TROUBLE OF GETTING IT FROM THE MANUFACTURER AND - REFLASHING IT. - -
- -
-write_bulk_flash(self, location, data) - -+ Write a byte array to the entire flash page. Erases any other data -+ Arguments - + location: Block number. 0-20. each block is 2kB. - + bytearray: Array to dump onto flash. Max size 2048 bytes -+ Note: DO NOT USE THIS UNLESS YOU'RE ABSOLUTELY SURE KNOW THIS! - YOU MAY END UP OVERWRITING THE CALIBRATION DATA, AND WILL HAVE - TO GO THROUGH THE TROUBLE OF GETTING IT FROM THE MANUFACTURER AND - REFLASHING IT. - -
- -## WAVEGEN SECTION - -This section has commands related to waveform generators W1, W2, PWM outputs, servo motor control etc. - -
-set_wave(self, chan, freq) - -+ Set the frequency of wavegen -+ Arguments - + chan: Channel to set frequency for. W1 or W2 - + frequency: Frequency to set on wave generator -+ Returns: frequency - -
- -
-set_sine1(self, freq) - -+ Set the frequency of wavegen 1 after setting its waveform type to sinusoidal -+ Arguments - + frequency: Frequency to set on wave generator 1. -+ Returns: frequency - -
- -
-set_sine2(self, freq) - -+ Set the frequency of wavegen 2 after setting its waveform type to sinusoidal -+ Arguments - + frequency: Frequency to set on wave generator 1. -+ Returns: frequency - -
- -
-set_w1(self, freq, waveType = None) - -+ Set the frequency of wavegen 1 -+ Arguments - + frequency: Frequency to set on wave generator 1. - + waveType: 'sine','tria' . Default : Do not reload table, and use last set table -+ Returns: frequency - -
- -
-set_w2(self, freq, waveType = None) - -+ Set the frequency of wavegen 2 -+ Arguments - + frequency: Frequency to set on wave generator 2. -+ Returns: frequency - -
- -
-readbackWavefrom(self, chan) - -+ Set the frequency of wavegen 1 -+ Arguments - + chan: Any of W1,W2,SQR1,SQR2,SQR3,SQR4 -+ Returns: frequency - -
- -
-set_waves(self, freq, phase, f2 = None) - -+ Set the frequency of wavegen -+ Arguments - + frequency: Frequency to set on both wave generators - + phase: Phase difference between the two. 0-360 degrees - + f2: Only specify if you require two separate frequencies to be set -+ Returns: frequency - -
- -
-load_equation(self, chan, function, span = None, **kwargs) - -+ Load an arbitrary waveform to the waveform generators -+ Arguments - + chan: The waveform generator to alter. W1 or W2 - + function: A function that will be used to generate the datapoints - + span: The range of values in which to evaluate the given function - -``` -fn = lambda x:abs(x-50) #Triangular waveform -self.I.load_waveform('W1',fn,[0,100]) -#Load triangular wave to wavegen 1 -#Load sinusoidal wave to wavegen 2 -self.I.load_waveform('W2',np.sin,[0,2*np.pi]) -``` - -
- -
-load_table(self, chan, points, mode = 'arbit', **kwargs) - -+ Load an arbitrary waveform table to the waveform generators -+ Arguments - + chan: The waveform generator to alter. 'W1' or 'W2' - + points: A list of 512 datapoints exactly - + mode: Optional argument. Type of waveform. default value 'arbit'. accepts 'sine', 'tria' - -``` ->>> self.I.load_waveform_table(1,range(512)) -#Load sawtooth wave to wavegen 1 -``` - -
- -
-sqr1(self, freq, duty_cycle = 50, onlyPrepare = False) - -+ Set the frequency of sqr1 -+ Arguments - + frequency: Frequency - + duty_cycle: Percentage of high time - -
- -
-sqr1_pattern(self, timing_array) - -+ output a preset sqr1 frequency in fixed intervals. Can be used for sending IR signals that are packets of 38KHz pulses. -+ Arguments - + timing_array: A list of on & off times in uS units - -``` ->>> I.sqr1(38e3 , 50, True ) # Prepare a 38KHz, 50% square wave. Do not output it yet ->>> I.sqr1_pattern([1000,1000,1000,1000,1000]) #On:1mS (38KHz packet), Off:1mS, On:1mS (38KHz packet), Off:1mS, On:1mS (38KHz packet), Off: indefinitely.. -``` - -
- -
-sqr2(self, freq, duty_cycle) - -+ Set the frequency of sqr2 -+ Arguments - + frequency: Frequency - + duty_cycle: Percentage of high time - -
- -
-set_sqrs(self, wavelength, phase, high_time1, high_time2, prescaler = 1) - -+ Set the frequency of sqr1,sqr2, with phase shift -+ Arguments - + wavelength: Number of 64Mhz/prescaler clock cycles per wave - + phase: Clock cycles between rising edges of SQR1 and SQR2 - + high time1: Clock cycles for which SQR1 must be HIGH - + high time2: Clock cycles for which SQR2 must be HIGH - + prescaler: 0,1,2. Divides the 64Mhz clock by 8,64, or 256 - -
- -
-sqrPWM(self, freq, h0, p1, h1, p2, h2, p3, h3, **kwargs) - -+ Initialize phase correlated square waves on SQR1,SQR2,SQR3,SQR4 -+ Arguments - + freq: Frequency in Hertz - + h0: Duty Cycle for SQR1 (0-1) - + p1: Phase shift for SQR2 (0-1) - + h1: Duty Cycle for SQR2 (0-1) - + p2: Phase shift for OD1 (0-1) - + h2: Duty Cycle for OD1 (0-1) - + p3: Phase shift for OD2 (0-1) - + h3: Duty Cycle for OD2 (0-1) - -
- -
-map_reference_clock(self, scaler, *args) - -+ Map the internal oscillator output to SQR1,SQR2,SQR3,SQR4 or WAVEGEN -+ The output frequency is 128/(1< 128MHz -* 1 -> 64MHz -* 2 -> 32MHz -* 3 -> 16MHz -* . -* . -* 15 ->128./32768 MHz - -``` ->>> I.map_reference_clock(2,'SQR1','SQR2') -``` -Outputs 32 MHz on SQR1, SQR2 pins - -+Note: If you change the reference clock for 'wavegen' , the external waveform generator(AD9833) resolution and range will also change. Default frequency for 'wavegen' is 16MHz. Setting to 1MHz will give you 16 times better resolution, but a usable range of 0Hz to about 100KHz instead of the original 2MHz. - -
- -## ANALOG OUTPUTS -This section has commands related to current and voltage sources PV1,PV2,PV3,PCS - -
-set_pv1(self, val) - -+ Set the voltage on PV1 -+ 12-bit DAC... -5V to 5V -+ Arguments - + val: Output voltage on PV1. -5V to 5V - -
- -
-set_pv2(self, val) - -+ Set the voltage on PV2 -+ 12-bit DAC... 0-3.3V -+ Arguments - + val: Output voltage on PV2. 0-3.3V -+ Return: Actual value set on pv2 - -
- -
-set_pv3(self, val) - -+ Set the voltage on PV3 -+ Arguments - + val: Output voltage on PV3. 0V to 3.3V -+ Return: Actual value set on pv3 - -
- -
-set_pcs(self, val) - -+ Set programmable current source -+ Arguments - + val: Output current on PCS. 0 to 3.3mA. Subject to load resistance. Read voltage on PCS to check. -+ Return: value attempted to set on pcs - -
- -
-get_pv1(self) - -+ Get the last set voltage on PV1 -+ 12-bit DAC... -5V to 5V - -
- -
-get_pv2(self) - -+ Get the last set voltage on PV2 - -
- -
-get_pv3(self) - -+ Get the last set voltage on PV3 - -
- -
-get_pcs(self) - -+ Get the last set voltage on PCS - -
- -
-WS2812B(self, cols, output = 'CS1') - -+ Set shade of WS2182 LED on SQR1 -+ Arguments - + cols: 2Darray [[R,G,B],[R2,G2,B2],[R3,G3,B3]...]
- brightness of R,G,B ( 0-255 ) - -``` ->>> I.WS2812B([[10,0,0],[0,10,10],[10,0,10]]) -#sets red, cyan, magenta to three daisy chained LEDs -``` - -
- -## READ PROGRAM AND DATA ADDRESSES -Direct access to RAM and FLASH - -
-read_program_address(self, address) - -+ Reads and returns the value stored at the specified address in program memory -+ Arguments - + address: Address to read from. Refer to PIC24EP64GP204 programming manual - -
- -
-device_id(self)
-
- -
-read_data_address(self, address) - -+ Reads and returns the value stored at the specified address in RAM -+ Arguments - + address: Address to read from. Refer to PIC24EP64GP204 programming manual - -
- -## MOTOR SIGNALLING -Set servo motor angles via SQ1-4. Control one stepper motor using SQ1-4 - -
-stepForward(self, steps, delay) - -+ Control stepper motors using SQR1-4 -+ Take a fixed number of steps in the forward direction with a certain delay( in milliseconds ) between each step. - -
- -
-stepBackward(self, steps, delay) - -+ Control stepper motors using SQR1-4 -+ Take a fixed number of steps in the backward direction with a certain delay( in milliseconds ) between each step. - -
- -
-servo(self, angle, chan = 'SQR1') - -+ Output A PWM waveform on SQR1/SQR2 corresponding to the angle specified in the arguments. -+ This is used to operate servo motors. Tested with 9G SG-90 Servo motor. -+ Arguments - + angle: 0-180. Angle corresponding to which the PWM waveform is generated. - + chan: 'SQR1' or 'SQR2'. Whether to use SQ1 or SQ2 to output the PWM waveform used by the servo - -
- -
-servo4(self, a1, a2, a3, a4) - -+ Operate Four servo motors independently using SQR1, SQR2, SQR3, SQR4. -+ tested with SG-90 9G servos. -+ For high current servos, please use a different power source, and a level convertor for the PWm output signals(if needed) -+ Arguments - + a1: Angle to set on Servo which uses SQR1 as PWM input. [0-180] - + a2: Angle to set on Servo which uses SQR2 as PWM input. [0-180] - + a3: Angle to set on Servo which uses SQR3 as PWM input. [0-180] - + a4: Angle to set on Servo which uses SQR4 as PWM input. [0-180] - -
- -
-enableUartPassthrough(self, baudrate, persist = False) - -+ All data received by the device is relayed to an external port(SCL[TX],SDA[RX]) after this function is called. -+ If a period > .5 seconds elapses between two transmit/receive events, the device resets and resumes normal mode. This timeout feature has been implemented in lieu of a hard reset option. -+ Can be used to load programs into secondary microcontrollers with bootloaders such ATMEGA, and ESP8266 -+ Arguments - + baudrate: BAUDRATE to use - + persist: If set to True, the device will stay in passthrough mode until the next power cycle.
- Otherwise(default scenario), the device will return to normal operation if no data is sent/received for a period greater than one second at a time. - -
- -
-estimateDistance(self) - -+ Read data from ultrasonic distance sensor HC-SR04/HC-SR05. Sensors must have separate trigger and output pins. -+ First a 10uS pulse is output on SQR1. SQR1 must be connected to the TRIG pin on the sensor prior to use. -+ Upon receiving this pulse, the sensor emits a sequence of sound pulses, and the logic level of its output pin(which we will monitor via ID1) is also set high. The logic level goes LOW when the sound packet returns to the sensor, or when a timeout occurs. -+ The ultrasound sensor outputs a series of 8 sound pulses at 40KHz which corresponds to a time period of 25uS per pulse. These pulses reflect off of the nearest object in front of the sensor, and return to it. The time between sending and receiving of the pulse packet is used to estimate the distance. If the reflecting object is either too far away or absorbs sound, less than 8 pulses may be received, and this can cause a measurement error of 25uS which corresponds to 8mm. -+ Ensure 5V supply. You may set SQR2 to HIGH [ I.set_state(SQR2 = True) ] , and use that as the power supply. -+ Return: 0 upon timeout - -
- -
-opticalArray(self, SS, delay, channel = 'CH3', **kwargs) - -+ Read from 3648 element optical sensor array TCD3648P from Toshiba. Experimental feature. Neither Sine waves will be available. -+ Connect SQR1 to MS , SQR2 to MS , A0 to CHannel , and CS1(on the expansion slot) to ICG -+ delay : ICG low duration -+ tp : clock wavelength = tp*15nS, SS = clock/4 - -
- -
-setUARTBAUD(self, BAUD)
-
- -
-writeUART(self, character)
-
- -
-readUART(self)
-
- -
-readUARTStatus(self) - -+ Return: available bytes in UART buffer - -
- -
-readLog(self) - -+ Read hardware debug log. - -
diff --git a/PSL/SENSORS/BMP180.py b/PSL/SENSORS/BMP180.py deleted file mode 100644 index 45a8bb53..00000000 --- a/PSL/SENSORS/BMP180.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import print_function - -import time - -from numpy import int16 - - -def connect(route, **args): - return BMP180(route, **args) - - -class BMP180: - ADDRESS = 0x77 - REG_CONTROL = 0xF4 - REG_RESULT = 0xF6 - CMD_TEMP = 0x2E - CMD_P0 = 0x34 - CMD_P1 = 0x74 - CMD_P2 = 0xB4 - CMD_P3 = 0xF4 - oversampling = 0 - NUMPLOTS = 3 - PLOTNAMES = ['Temperature', 'Pressure', 'Altitude'] - name = 'Altimeter BMP180' - - def __init__(self, I2C, **args): - self.ADDRESS = args.get('address', self.ADDRESS) - - self.I2C = I2C - - self.MB = self.__readInt__(0xBA) - - self.c3 = 160.0 * pow(2, -15) * self.__readInt__(0xAE) - self.c4 = pow(10, -3) * pow(2, -15) * self.__readUInt__(0xB0) - self.b1 = pow(160, 2) * pow(2, -30) * self.__readInt__(0xB6) - self.c5 = (pow(2, -15) / 160) * self.__readUInt__(0xB2) - self.c6 = self.__readUInt__(0xB4) - self.mc = (pow(2, 11) / pow(160, 2)) * self.__readInt__(0xBC) - self.md = self.__readInt__(0xBE) / 160.0 - self.x0 = self.__readInt__(0xAA) - self.x1 = 160.0 * pow(2, -13) * self.__readInt__(0xAC) - self.x2 = pow(160, 2) * pow(2, -25) * self.__readInt__(0xB8) - self.y0 = self.c4 * pow(2, 15) - self.y1 = self.c4 * self.c3 - self.y2 = self.c4 * self.b1 - self.p0 = (3791.0 - 8.0) / 1600.0 - self.p1 = 1.0 - 7357.0 * pow(2, -20) - self.p2 = 3038.0 * 100.0 * pow(2, -36) - self.T = 25 - print('calib:', self.c3, self.c4, self.b1, self.c5, self.c6, self.mc, self.md, self.x0, self.x1, self.x2, - self.y0, self.y1, self.p0, self.p1, self.p2) - self.params = {'setOversampling': [0, 1, 2, 3]} - self.name = 'BMP180 Altimeter' - self.initTemperature() - self.readTemperature() - self.initPressure() - self.baseline = self.readPressure() - - def __readInt__(self, addr): - return int16(self.__readUInt__(addr)) - - def __readUInt__(self, addr): - vals = self.I2C.readBulk(self.ADDRESS, addr, 2) - v = 1. * ((vals[0] << 8) | vals[1]) - return v - - def initTemperature(self): - self.I2C.writeBulk(self.ADDRESS, [self.REG_CONTROL, self.CMD_TEMP]) - time.sleep(0.005) - - def readTemperature(self): - vals = self.I2C.readBulk(self.ADDRESS, self.REG_RESULT, 2) - if len(vals) == 2: - T = (vals[0] << 8) + vals[1] - a = self.c5 * (T - self.c6) - self.T = a + (self.mc / (a + self.md)) - return self.T - else: - return False - - def setOversampling(self, num): - self.oversampling = num - - def initPressure(self): - os = [0x34, 0x74, 0xb4, 0xf4] - delays = [0.005, 0.008, 0.014, 0.026] - self.I2C.writeBulk(self.ADDRESS, [self.REG_CONTROL, os[self.oversampling]]) - time.sleep(delays[self.oversampling]) - - def readPressure(self): - vals = self.I2C.readBulk(self.ADDRESS, self.REG_RESULT, 3) - if len(vals) == 3: - P = 1. * (vals[0] << 8) + vals[1] + (vals[2] / 256.0) - s = self.T - 25.0 - x = (self.x2 * pow(s, 2)) + (self.x1 * s) + self.x0 - y = (self.y2 * pow(s, 2)) + (self.y1 * s) + self.y0 - z = (P - x) / y - self.P = (self.p2 * pow(z, 2)) + (self.p1 * z) + self.p0 - return self.P - else: - return False - - def altitude(self): - # baseline pressure needs to be provided - return (44330.0 * (1 - pow(self.P / self.baseline, 1 / 5.255))) - - def sealevel(self, P, A): - ''' - given a calculated pressure and altitude, return the sealevel - ''' - return (P / pow(1 - (A / 44330.0), 5.255)) - - def getRaw(self): - self.initTemperature() - self.readTemperature() - self.initPressure() - self.readPressure() - return [self.T, self.P, self.altitude()] diff --git a/PSL/SENSORS/SSD1306.py b/PSL/SENSORS/SSD1306.py deleted file mode 100644 index 9c40ff5e..00000000 --- a/PSL/SENSORS/SSD1306.py +++ /dev/null @@ -1,500 +0,0 @@ -''' -Adapted into Python from Adafruit's oled.cpp -Original license text: - -Software License Agreement (BSD License) - -Copyright (c) 2012, Adafruit Industries -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holders nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -''' -from __future__ import print_function -from numpy import int16 -import time - - -def connect(route, **args): - return SSD1306(route, **args) - - -class SSD1306(): - ADDRESS = 0x3C - - # --------------Parameters-------------------- - # This must be defined in order to let GUIs automatically create menus - # for changing various options of this sensor - # It's a dictionary of the string representations of functions matched with an array - # of options that each one can accept - params = {'load': ['logo'], - 'scroll': ['left', 'right', 'topright', 'topleft', 'bottomleft', 'bottomright', 'stop'] - } - - NUMPLOTS = 0 - PLOTNAMES = [''] - name = 'OLED Display' - _width = 128 - WIDTH = 128 - _height = 64 - HEIGHT = 64 - - rotation = 0 - cursor_y = 0 - cursor_x = 0 - textsize = 1 - textcolor = 1 - textbgcolor = 0 - wrap = True - - SSD1306_128_64 = 1 - SSD1306_128_32 = 2 - SSD1306_96_16 = 3 - - # -----------------------------------------------------------------------*/ - DISPLAY_TYPE = SSD1306_96_16 - ## self.SSD1306_128_32 - # /*=========================================================================*/ - - SSD1306_LCDWIDTH = 128 - SSD1306_LCDHEIGHT = 64 - - SSD1306_SETCONTRAST = 0x81 - SSD1306_DISPLAYALLON_RESUME = 0xA4 - SSD1306_DISPLAYALLON = 0xA5 - SSD1306_NORMALDISPLAY = 0xA6 - SSD1306_INVERTDISPLAY = 0xA7 - SSD1306_DISPLAYOFF = 0xAE - SSD1306_DISPLAYON = 0xAF - - SSD1306_SETDISPLAYOFFSET = 0xD3 - SSD1306_SETCOMPINS = 0xDA - - SSD1306_SETVCOMDETECT = 0xDB - - SSD1306_SETDISPLAYCLOCKDIV = 0xD5 - SSD1306_SETPRECHARGE = 0xD9 - - SSD1306_SETMULTIPLEX = 0xA8 - - SSD1306_SETLOWCOLUMN = 0x00 - SSD1306_SETHIGHCOLUMN = 0x10 - - SSD1306_SETSTARTLINE = 0x40 - - SSD1306_MEMORYMODE = 0x20 - - SSD1306_COMSCANINC = 0xC0 - SSD1306_COMSCANDEC = 0xC8 - - SSD1306_SEGREMAP = 0xA0 - - SSD1306_CHARGEPUMP = 0x8D - - SSD1306_EXTERNALVCC = 0x1 - SSD1306_SWITCHCAPVCC = 0x2 - - logobuff = [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 127, 63, 63, 159, 159, - 223, 223, 207, 207, 207, 239, 239, 47, 47, 39, 39, 7, 7, 67, 67, 83, 131, 135, 7, 7, 15, 15, 31, 191, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 63, 31, 15, 199, 99, 17, 25, 12, 4, 2, 3, 7, 63, 255, 255, 255, 255, 255, - 255, 255, 255, 254, 252, 240, 224, 224, 224, 192, 192, 128, 128, 128, 128, 129, 128, 0, 0, 0, 0, 0, 3, - 3, 7, 31, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 15, - 3, 192, 120, 134, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 252, 252, - 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 143, 0, 0, 124, 199, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 240, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 240, 128, 0, 7, 56, 96, 128, 0, 0, 0, - 0, 0, 0, 0, 12, 63, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 7, 227, 243, 249, 249, 249, - 249, 249, 249, 243, 255, 255, 199, 131, 49, 57, 57, 57, 121, 115, 255, 255, 255, 255, 15, 15, 159, 207, - 207, 207, 143, 31, 63, 255, 255, 159, 207, 207, 207, 143, 31, 63, 255, 255, 255, 15, 15, 159, 207, 207, - 207, 255, 255, 0, 0, 255, 127, 63, 159, 207, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 248, 240, 224, 129, 2, 4, 8, 16, 32, 96, 64, 128, - 128, 135, 30, 115, 207, 159, 255, 255, 255, 255, 127, 63, 31, 31, 31, 31, 31, 31, 31, 7, 7, 7, 127, 127, - 127, 127, 127, 127, 255, 255, 255, 255, 252, 240, 227, 231, 207, 207, 207, 207, 207, 207, 231, 255, 255, - 231, 207, 207, 207, 207, 207, 198, 224, 240, 255, 255, 255, 0, 0, 231, 207, 207, 207, 199, 224, 240, - 255, 225, 193, 204, 204, 204, 228, 192, 192, 255, 255, 255, 192, 192, 255, 255, 255, 255, 255, 255, 192, - 192, 252, 248, 243, 231, 207, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 252, 248, 248, 240, 240, 224, - 225, 225, 193, 193, 195, 195, 195, 195, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 62, 62, 62, 62, 62, - 255, 243, 3, 3, 51, 51, 51, 19, 135, 239, 255, 255, 63, 63, 159, 159, 159, 159, 63, 127, 255, 255, 255, - 63, 31, 159, 159, 159, 31, 252, 252, 255, 63, 63, 159, 159, 159, 159, 63, 127, 255, 255, 255, 223, 159, - 159, 159, 31, 127, 255, 255, 255, 255, 223, 31, 31, 191, 159, 159, 159, 255, 255, 127, 63, 159, 159, - 159, 159, 31, 31, 255, 255, 247, 3, 7, 159, 159, 159, 31, 127, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 254, 252, 252, 252, 252, 252, 252, 252, 252, 224, 224, 224, 255, 255, 255, 255, 255, 255, 255, 243, - 240, 240, 247, 255, 254, 252, 248, 243, 255, 255, 248, 248, 242, 242, 242, 242, 242, 250, 255, 255, 255, - 241, 242, 242, 242, 242, 248, 253, 255, 255, 248, 248, 242, 242, 242, 242, 242, 250, 255, 255, 249, 240, - 242, 242, 242, 240, 240, 255, 255, 255, 255, 243, 240, 240, 243, 243, 255, 255, 255, 255, 252, 248, 243, - 243, 243, 243, 243, 255, 255, 255, 247, 240, 240, 247, 255, 247, 240, 240, 247, 255] - font = [0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, - 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, - 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, - 0x00, 0x18, 0x24, 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, - 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 0x05, 0x25, 0x3F, - 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, - 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, - 0x00, 0x66, 0x89, 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, - 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 0x2A, 0x1C, 0x08, - 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, - 0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, - 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 0x56, 0x20, 0x50, - 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, - 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, - 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 0x49, 0x49, 0x46, - 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, - 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, - 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, - 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, - 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, - 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, - 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, - 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, - 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, - 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, - 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, - 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 0x40, 0x20, 0x1F, - 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, - 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, - 0x00, 0x41, 0x41, 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 0x44, 0x44, 0x38, - 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, - 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, - 0x00, 0x44, 0x7D, 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, - 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 0x04, 0x04, 0x78, - 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, - 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, - 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C, - 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 0x54, 0x4C, 0x44, - 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, - 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, - 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, - 0x21, 0x54, 0x54, 0x78, 0x41, 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, - 0x0C, 0x1E, 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 0x59, - 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 0x02, 0x45, 0x7D, 0x42, - 0x00, 0x01, 0x45, 0x7C, 0x40, 0xF0, 0x29, 0x24, 0x29, 0xF0, 0xF0, 0x28, 0x25, 0x28, 0xF0, - 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, - 0x32, 0x49, 0x49, 0x49, 0x32, 0x32, 0x48, 0x48, 0x48, 0x32, 0x32, 0x4A, 0x48, 0x48, 0x30, - 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, - 0x39, 0x44, 0x44, 0x44, 0x39, 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, - 0x48, 0x7E, 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 0x20, - 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 0x00, 0x44, 0x7D, 0x41, - 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, - 0x7D, 0x0D, 0x19, 0x31, 0x7D, 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, - 0x30, 0x48, 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, - 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 0x00, 0x7B, 0x00, 0x00, - 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08, 0xAA, 0x00, 0x55, 0x00, 0xAA, - 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, - 0x14, 0x14, 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 0xF0, - 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, - 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, - 0x14, 0x14, 0x14, 0x1F, 0x00, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, - 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x14, - 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, - 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 0x14, - 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 0x10, 0xF0, 0x10, 0xF0, - 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, - 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, - 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 0x38, 0x44, 0x7C, 0x2A, 0x2A, 0x3E, 0x14, - 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 0x49, 0x41, 0x63, - 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, - 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, - 0x30, 0x4A, 0x4D, 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, - 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, - 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, - 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, - 0x36, 0x12, 0x36, 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x01, 0x1E, - 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00] # ascii fonts - - def __init__(self, I2C, **args): - self.buff = [0 for a in range(1024)] - self.ADDRESS = args.get('address', self.ADDRESS) - self.I2C = I2C - self.SSD1306_command(self.SSD1306_DISPLAYOFF) # 0xAE - self.SSD1306_command(self.SSD1306_SETDISPLAYCLOCKDIV) # 0xD5 - self.SSD1306_command(0x80) # the suggested ratio 0x80 - self.SSD1306_command(self.SSD1306_SETMULTIPLEX) # 0xA8 - self.SSD1306_command(0x3F) - self.SSD1306_command(self.SSD1306_SETDISPLAYOFFSET) # 0xD3 - self.SSD1306_command(0x0) # no offset - self.SSD1306_command(self.SSD1306_SETSTARTLINE | 0x0) # line #0 - self.SSD1306_command(self.SSD1306_CHARGEPUMP) # 0x8D - self.SSD1306_command(0x14) # vccstate = self.SSD1306_SWITCHCAPVCC - self.SSD1306_command(self.SSD1306_MEMORYMODE) # 0x20 - self.SSD1306_command(0x00) # 0x0 act like ks0108 - self.SSD1306_command(self.SSD1306_SEGREMAP | 0x1) - self.SSD1306_command(self.SSD1306_COMSCANDEC) - self.SSD1306_command(self.SSD1306_SETCOMPINS) # 0xDA - self.SSD1306_command(0x12) - self.SSD1306_command(self.SSD1306_SETCONTRAST) # 0x81 - self.SSD1306_command(0xFF) # vccstate = self.SSD1306_SWITCHCAPVCC - self.SSD1306_command(self.SSD1306_SETPRECHARGE) # 0xd9 - self.SSD1306_command(0xF1) # vccstate = self.SSD1306_SWITCHCAPVCC - self.SSD1306_command(self.SSD1306_SETVCOMDETECT) # 0xDB - self.SSD1306_command(0x40) - self.SSD1306_command(self.SSD1306_DISPLAYALLON_RESUME) # 0xA4 - self.SSD1306_command(self.SSD1306_NORMALDISPLAY) # 0xA6 - self.SSD1306_command(self.SSD1306_DISPLAYON) # --turn on oled panel - - def load(self, arg): - self.scroll('stop') - if arg == 'logo': - self.clearDisplay() - for a in range(1024): - self.buff[a] = self.logobuff[a] - self.displayOLED() - - def SSD1306_command(self, cmd): - self.I2C.writeBulk(self.ADDRESS, [0x00, cmd]) - - def SSD1306_data(self, data): - self.I2C.writeBulk(self.ADDRESS, [0x40, data]) - - def clearDisplay(self): - self.setCursor(0, 0) - for a in range(self.SSD1306_LCDWIDTH * self.SSD1306_LCDHEIGHT / 8): - self.buff[a] = 0 - - def displayOLED(self): - self.SSD1306_command(self.SSD1306_SETLOWCOLUMN | 0x0) # low col = 0 - self.SSD1306_command(self.SSD1306_SETHIGHCOLUMN | 0x0) # hi col = 0 - self.SSD1306_command(self.SSD1306_SETSTARTLINE | 0x0) # line #0 - a = 0 - while (a < self.SSD1306_LCDWIDTH * self.SSD1306_LCDHEIGHT / 8): - self.I2C.writeBulk(self.ADDRESS, [0x40] + self.buff[a:a + 16]) - a += 16 - - def setContrast(self, i): - self.SSD1306_command(self.SSD1306_SETCONTRAST) - self.SSD1306_command(i) - - def drawPixel(self, x, y, color): - if (color == 1): - self.buff[x + (y / 8) * self.SSD1306_LCDWIDTH] |= (1 << (y % 8)) - else: - self.buff[x + (y / 8) * self.SSD1306_LCDWIDTH] &= ~(1 << (y % 8)) - - def drawCircle(self, x0, y0, r, color): - f = 1 - r - ddF_x = 1 - ddF_y = -2 * r - x = 0 - y = r - self.drawPixel(x0, y0 + r, color) - self.drawPixel(x0, y0 - r, color) - self.drawPixel(x0 + r, y0, color) - self.drawPixel(x0 - r, y0, color) - while (x < y): - if (f >= 0): - y -= 1 - ddF_y += 2 - f += ddF_y - x += 1 - ddF_x += 2 - f += ddF_x - self.drawPixel(x0 + x, y0 + y, color) - self.drawPixel(x0 - x, y0 + y, color) - self.drawPixel(x0 + x, y0 - y, color) - self.drawPixel(x0 - x, y0 - y, color) - self.drawPixel(x0 + y, y0 + x, color) - self.drawPixel(x0 - y, y0 + x, color) - self.drawPixel(x0 + y, y0 - x, color) - self.drawPixel(x0 - y, y0 - x, color) - - def drawLine(self, x0, y0, x1, y1, color): - steep = abs(y1 - y0) > abs(x1 - x0) - if (steep): - tmp = y0 - y0 = x0 - x0 = tmp - tmp = y1 - y1 = x1 - x1 = tmp - if (x0 > x1): - tmp = x1 - x1 = x0 - x0 = tmp - tmp = y1 - y1 = y0 - y0 = tmp - - dx = x1 - x0 - dy = abs(y1 - y0) - err = dx / 2 - - if (y0 < y1): - ystep = 1 - else: - ystep = -1 - - while (x0 <= x1): - if (steep): - self.drawPixel(y0, x0, color) - else: - self.drawPixel(x0, y0, color) - err -= dy - if (err < 0): - y0 += ystep - err += dx - x0 += 1 - - def drawRect(self, x, y, w, h, color): - self.drawFastHLine(x, y, w, color) - self.drawFastHLine(x, y + h - 1, w, color) - self.drawFastVLine(x, y, h, color) - self.drawFastVLine(x + w - 1, y, h, color) - - def drawFastVLine(self, x, y, h, color): - self.drawLine(x, y, x, y + h - 1, color) - - def drawFastHLine(self, x, y, w, color): - self.drawLine(x, y, x + w - 1, y, color) - - def fillRect(self, x, y, w, h, color): - for i in range(x, x + w): - self.drawFastVLine(i, y, h, color) - - def writeString(self, s): - for a in s: self.writeChar(ord(a)) - - def writeChar(self, c): - if (c == '\n'): - self.cursor_y += self.textsize * 8 - self.cursor_x = 0 - elif (c == '\r'): - pass - else: - self.drawChar(self.cursor_x, self.cursor_y, c, self.textcolor, self.textbgcolor, self.textsize) - self.cursor_x += self.textsize * 6 - if (self.wrap and (self.cursor_x > (self._width - self.textsize * 6))): - self.cursor_y += self.textsize * 8 - self.cursor_x = 0 - - def drawChar(self, x, y, c, color, bg, size): - if ((x >= self._width) or (y >= self._height) or ((x + 5 * size - 1) < 0) or ((y + 8 * size - 1) < 0)): - return - for i in range(6): - if (i == 5): - line = 0x0 - else: - line = self.font[c * 5 + i] - for j in range(8): - if (line & 0x1): - if (size == 1): - self.drawPixel(x + i, y + j, color) - else: - self.fillRect(x + (i * size), y + (j * size), size, size, color) - elif (bg != color): - if (size == 1): - self.drawPixel(x + i, y + j, bg) - else: - self.fillRect(x + i * size, y + j * size, size, size, bg) - line >>= 1 - - def setCursor(self, x, y): - self.cursor_x = x - self.cursor_y = y - - def setTextSize(self, s): - self.textsize = s if (s > 0) else 1 - - def setTextColor(self, c, b): - self.textcolor = c - self.textbgcolor = b - - def setTextWrap(self, w): - self.wrap = w - - def scroll(self, arg): - if arg == 'left': - self.SSD1306_command(0x27) # up-0x29 ,2A left-0x27 right0x26 - if arg == 'right': - self.SSD1306_command(0x26) # up-0x29 ,2A left-0x27 right0x26 - if arg in ['topright', 'bottomright']: - self.SSD1306_command(0x29) # up-0x29 ,2A left-0x27 right0x26 - if arg in ['topleft', 'bottomleft']: - self.SSD1306_command(0x2A) # up-0x29 ,2A left-0x27 right0x26 - - if arg in ['left', 'right', 'topright', 'topleft', 'bottomleft', 'bottomright']: - self.SSD1306_command(0x00) # dummy - self.SSD1306_command(0x0) # start page - self.SSD1306_command(0x7) # time interval 0b100 - 3 frames - self.SSD1306_command(0xf) # end page - if arg in ['topleft', 'topright']: - self.SSD1306_command(0x02) # dummy 00 . xx for horizontal scroll (speed) - elif arg in ['bottomleft', 'bottomright']: - self.SSD1306_command(0xfe) # dummy 00 . xx for horizontal scroll (speed) - - if arg in ['left', 'right']: - self.SSD1306_command(0x02) # dummy 00 . xx for horizontal scroll (speed) - self.SSD1306_command(0xff) - - self.SSD1306_command(0x2F) - - if arg == 'stop': - self.SSD1306_command(0x2E) - - def pulseIt(self): - for a in range(2): - self.SSD1306_command(0xD6) - self.SSD1306_command(0x01) - time.sleep(0.1) - self.SSD1306_command(0xD6) - self.SSD1306_command(0x00) - time.sleep(0.1) - - -if __name__ == "__main__": - from PSL import sciencelab - - I = sciencelab.connect() - O = connect(I.I2C) - textbgcolor = 0 - textcolor = 1 - O.load('logo') - O.scroll('topright') - import time - - time.sleep(2.8) - O.scroll('stop') diff --git a/PSL/SENSORS/__init__.py b/PSL/SENSORS/__init__.py deleted file mode 100644 index 8b137891..00000000 --- a/PSL/SENSORS/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/PSL/__init__.py b/PSL/__init__.py deleted file mode 100644 index 8b137891..00000000 --- a/PSL/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/PSL/analyticsClass.py b/PSL/analyticsClass.py deleted file mode 100644 index a870306a..00000000 --- a/PSL/analyticsClass.py +++ /dev/null @@ -1,362 +0,0 @@ -import math -from typing import Tuple - -import numpy as np - - -class analyticsClass(): - """ - This class contains methods that allow mathematical analysis such as curve fitting - """ - - def __init__(self): - try: - import scipy.optimize as optimize - except ImportError: - self.optimize = None - else: - self.optimize = optimize - - try: - import scipy.fftpack as fftpack - except ImportError: - self.fftpack = None - else: - self.fftpack = fftpack - - try: - from scipy.optimize import leastsq - except ImportError: - self.leastsq = None - else: - self.leastsq = leastsq - - try: - import scipy.signal as signal - except ImportError: - self.signal = None - else: - self.signal = signal - - def sineFunc(self, x, a1, a2, a3, a4): - return a4 + a1 * np.sin(abs(a2 * (2 * np.pi)) * x + a3) - - def squareFunc(self, x, amp, freq, phase, dc, offset): - return offset + amp * self.signal.square(2 * np.pi * freq * (x - phase), duty=dc) - - # -------------------------- Exponential Fit ---------------------------------------- - - def func(self, x, a, b, c): - return a * np.exp(-x / b) + c - - def fit_exp(self, t, v): # accepts numpy arrays - size = len(t) - v80 = v[0] * 0.8 - for k in range(size - 1): - if v[k] < v80: - rc = t[k] / .223 - break - pg = [v[0], rc, 0] - po, err = self.optimize.curve_fit(self.func, t, v, pg) - if abs(err[0][0]) > 0.1: - return None, None - vf = po[0] * np.exp(-t / po[1]) + po[2] - return po, vf - - def squareFit(self, xReal, yReal): - N = len(xReal) - mx = yReal.max() - mn = yReal.min() - OFFSET = (mx + mn) / 2. - amplitude = (np.average(yReal[yReal > OFFSET]) - np.average(yReal[yReal < OFFSET])) / 2.0 - yTmp = np.select([yReal < OFFSET, yReal > OFFSET], [0, 2]) - bools = abs(np.diff(yTmp)) > 1 - edges = xReal[bools] - levels = yTmp[bools] - frequency = 1. / (edges[2] - edges[0]) - - phase = edges[0] # .5*np.pi*((yReal[0]-offset)/amplitude) - dc = 0.5 - if len(edges) >= 4: - if levels[0] == 0: - dc = (edges[1] - edges[0]) / (edges[2] - edges[0]) - else: - dc = (edges[2] - edges[1]) / (edges[3] - edges[1]) - phase = edges[1] - - guess = [amplitude, frequency, phase, dc, 0] - - try: - (amplitude, frequency, phase, dc, offset), pcov = self.optimize.curve_fit(self.squareFunc, xReal, - yReal - OFFSET, guess) - offset += OFFSET - - if (frequency < 0): - # print ('negative frq') - return False - - freq = 1e6 * abs(frequency) - amp = abs(amplitude) - pcov[0] *= 1e6 - # print (pcov) - if (abs(pcov[-1][0]) > 1e-6): - False - return [amp, freq, phase, dc, offset] - except: - return False - - def sineFit(self, xReal, yReal, **kwargs): - N = len(xReal) - OFFSET = (yReal.max() + yReal.min()) / 2. - yhat = self.fftpack.rfft(yReal - OFFSET) - idx = (yhat ** 2).argmax() - freqs = self.fftpack.rfftfreq(N, d=(xReal[1] - xReal[0]) / (2 * np.pi)) - frequency = kwargs.get('freq', freqs[idx]) - frequency /= (2 * np.pi) # Convert angular velocity to freq - amplitude = kwargs.get('amp', (yReal.max() - yReal.min()) / 2.0) - phase = kwargs.get('phase', 0) # .5*np.pi*((yReal[0]-offset)/amplitude) - guess = [amplitude, frequency, phase, 0] - try: - (amplitude, frequency, phase, offset), pcov = self.optimize.curve_fit(self.sineFunc, xReal, yReal - OFFSET, - guess) - offset += OFFSET - ph = ((phase) * 180 / (np.pi)) - if (frequency < 0): - # print ('negative frq') - return False - - if (amplitude < 0): - ph -= 180 - - if (ph < 0): - ph = (ph + 720) % 360 - - freq = 1e6 * abs(frequency) - amp = abs(amplitude) - pcov[0] *= 1e6 - # print (pcov) - if (abs(pcov[-1][0]) > 1e-6): - return False - return [amp, freq, offset, ph] - except: - return False - - def find_frequency(self, v, si): # voltages, samplimg interval is seconds - from numpy import fft - NP = len(v) - v = v - v.mean() # remove DC component - frq = fft.fftfreq(NP, si)[:NP / 2] # take only the +ive half of the frequncy array - amp = abs(fft.fft(v)[:NP / 2]) / NP # and the fft result - index = amp.argmax() # search for the tallest peak, the fundamental - return frq[index] - - def sineFit2(self, x, y, t, v): - freq = self.find_frequency(y, x[1] - x[0]) - amp = (y.max() - y.min()) / 2.0 - guess = [amp, freq, 0, 0] # amplitude, freq, phase,offset - # print (guess) - OS = y.mean() - try: - par, pcov = self.optimize.curve_fit(self.sineFunc, x, y - OS, guess) - except: - return None - vf = self.sineFunc(t, par[0], par[1], par[2], par[3]) - diff = sum((v - vf) ** 2) / max(v) - if diff > self.error_limit: - guess[2] += np.pi / 2 # try an out of phase - try: - # print 'L1: diff = %5.0f frset= %6.3f fr = %6.2f phi = %6.2f'%(diff, res,par[1]*1e6,par[2]) - par, pcov = self.optimize.curve_fit(self.sineFunc, x, y, guess) - except: - return None - vf = self.sineFunc(t, par[0], par[1], par[2], par[3]) - diff = sum((v - vf) ** 2) / max(v) - if diff > self.error_limit: - # print 'L2: diff = %5.0f frset= %6.3f fr = %6.2f phi = %6.2f'%(diff, res,par[1]*1e6,par[2]) - return None - else: - pass - # print 'fixed ',par[1]*1e6 - return par, vf - - def amp_spectrum(self, v, si, nhar=8): - # voltages, samplimg interval is seconds, number of harmonics to retain - from numpy import fft - NP = len(v) - frq = fft.fftfreq(NP, si)[:NP / 2] # take only the +ive half of the frequncy array - amp = abs(fft.fft(v)[:NP / 2]) / NP # and the fft result - index = amp.argmax() # search for the tallest peak, the fundamental - if index == 0: # DC component is dominating - index = amp[4:].argmax() # skip frequencies close to zero - return frq[:index * nhar], amp[:index * nhar] # restrict to 'nhar' harmonics - - def dampedSine(self, x, amp, freq, phase, offset, damp): - """ - A damped sine wave function - - """ - return offset + amp * np.exp(-damp * x) * np.sin(abs(freq) * x + phase) - - def getGuessValues(self, xReal, yReal, func='sine'): - if (func == 'sine' or func == 'damped sine'): - N = len(xReal) - offset = np.average(yReal) - yhat = self.fftpack.rfft(yReal - offset) - idx = (yhat ** 2).argmax() - freqs = self.fftpack.rfftfreq(N, d=(xReal[1] - xReal[0]) / (2 * np.pi)) - frequency = freqs[idx] - - amplitude = (yReal.max() - yReal.min()) / 2.0 - phase = 0. - if func == 'sine': - return amplitude, frequency, phase, offset - if func == 'damped sine': - return amplitude, frequency, phase, offset, 0 - - def arbitFit(self, xReal, yReal, func, **args): - N = len(xReal) - guess = args.get('guess', []) - try: - results, pcov = self.optimize.curve_fit(func, xReal, yReal, guess) - pcov[0] *= 1e6 - return True, results, pcov - except: - return False, [], [] - - def fft(self, ya, si): - ''' - Returns positive half of the Fourier transform of the signal ya. - Sampling interval 'si', in milliseconds - ''' - ns = len(ya) - if ns % 2 == 1: # odd values of np give exceptions - ns -= 1 # make it even - ya = ya[:-1] - v = np.array(ya) - tr = abs(np.fft.fft(v)) / ns - frq = np.fft.fftfreq(ns, si) - x = frq.reshape(2, ns // 2) - y = tr.reshape(2, ns // 2) - return x[0], y[0] - - def sineFitAndDisplay(self, chan, displayObject): - ''' - chan : an object containing a get_xaxis, and a get_yaxis method. - displayObject : an object containing a setValue method - - Fits against a sine function, and writes to the object - ''' - fitres = None - fit = '' - try: - fitres = self.sineFit(chan.get_xaxis(), chan.get_yaxis()) - if fitres: - amp, freq, offset, phase = fitres - if amp > 0.05: fit = 'Voltage=%s\nFrequency=%s' % ( - apply_si_prefix(amp, 'V'), apply_si_prefix(freq, 'Hz')) - except Exception as e: - fitres = None - - if not fitres or len(fit) == 0: fit = 'Voltage=%s\n' % (apply_si_prefix(np.average(chan.get_yaxis()), 'V')) - displayObject.setValue(fit) - if fitres: - return fitres - else: - return 0, 0, 0, 0 - - def rmsAndDisplay(self, data, displayObject): - ''' - data : an array of numbers - displayObject : an object containing a setValue method - - Fits against a sine function, and writes to the object - ''' - rms = self.RMS(data) - displayObject.setValue('Voltage=%s' % (apply_si_prefix(rms, 'V'))) - return rms - - def RMS(self, data): - data = np.array(data) - return np.sqrt(np.average(data * data)) - - def butter_notch(self, lowcut, highcut, fs, order=5): - from scipy.signal import butter - nyq = 0.5 * fs - low = lowcut / nyq - high = highcut / nyq - b, a = butter(order, [low, high], btype='bandstop') - return b, a - - def butter_notch_filter(self, data, lowcut, highcut, fs, order=5): - from scipy.signal import lfilter - b, a = self.butter_notch(lowcut, highcut, fs, order=order) - y = lfilter(b, a, data) - return y - - -SI_PREFIXES = {k: v for k, v in zip(range(-24, 25, 3), "yzafpnµm kMGTPEZY")} -SI_PREFIXES[0] = "" - - -def frexp10(x: float) -> Tuple[float, int]: - """Return the base 10 fractional coefficient and exponent of x, as pair (m, e). - - This function is analogous to math.frexp, only for base 10 instead of base 2. - If x is 0, m and e are both 0. Else 1 <= abs(m) < 10. Note that m * 10**e is not - guaranteed to be exactly equal to x. - - Parameters - ---------- - x : float - Number to be split into base 10 fractional coefficient and exponent. - - Returns - ------- - (float, int) - Base 10 fractional coefficient and exponent of x. - - Examples - -------- - >>> frexp10(37) - (3.7, 1) - """ - if x == 0: - coefficient, exponent = 0.0, 0 - else: - log10x = math.log10(abs(x)) - exponent = int(math.copysign(math.floor(log10x), log10x)) - coefficient = x / 10 ** exponent - - return coefficient, exponent - - -def apply_si_prefix(value: float, unit: str, precision: int = 2) -> str: - """Scale :value: and apply appropriate SI prefix to :unit:. - - Parameters - ---------- - value : float - Number to be scaled. - unit : str - Base unit of :value: (without prefix). - precision : int, optional - :value: will be rounded to :precision: decimal places. The default value is 2. - - Returns - ------- - str - " ", such that 1 <= < 1000. - - Examples - ------- - apply_si_prefix(0.03409, "V") - '34.09 mV' - """ - coefficient, exponent = frexp10(value) - si_exponent = exponent - (exponent % 3) - si_coefficient = coefficient * 10 ** (exponent % 3) - - if abs(si_exponent) > max(SI_PREFIXES): - raise ValueError("Exponent out of range of available prefixes.") - - return f"{si_coefficient:.{precision}f} {SI_PREFIXES[si_exponent]}{unit}" diff --git a/PSL/digital_channel.py b/PSL/digital_channel.py deleted file mode 100644 index d160a19b..00000000 --- a/PSL/digital_channel.py +++ /dev/null @@ -1,91 +0,0 @@ -"""Objects related to the PSLab's digital input channels. -""" - -import numpy as np - -DIGITAL_INPUTS = ("ID1", "ID2", "ID3", "ID4", "SEN", "EXT", "CNTR") - -MODES = { - "sixteen rising": 5, - "four rising": 4, - "rising": 3, - "falling": 2, - "any": 1, - "disabled": 0, -} - - -class DigitalInput: - """Model of the PSLab's digital inputs. - - Parameters - ---------- - name : {"ID1", "ID2", "ID3", "ID4", "SEN", "EXT", "CNTR"} - Name of the digital channel to model. - - Attributes - ---------- - name : str - One of {"ID1", "ID2", "ID3", "ID4", "SEN", "EXT", "CNTR"}. - number : int - Number used to refer to this channel in the firmware. - datatype : str - Either "int" or "long", depending on if a 16 or 32-bit counter is used to - capture timestamps for this channel. - events_in_buffer : int - Number of logic events detected on this channel, the timestamps of which are - currently being held in the device's ADC buffer. - buffer_idx : Union[int, None] - Location in the device's ADC buffer where the events are stored. None if no - events captured by this channel are currently held in the buffer. - logic_mode - """ - - def __init__(self, name: str): - self.name = name - self.number = DIGITAL_INPUTS.index(self.name) - self.datatype = "long" - self.events_in_buffer = 0 - self._events_in_buffer = 0 - self.buffer_idx = None - self._logic_mode = MODES["any"] - - @property - def logic_mode(self) -> str: - """Get or set the type of logic event which should be captured on this channel. - - The options are: - any: Capture every edge. - rising: Capture every rising edge. - falling: Capture every falling edge. - four rising: Capture every fourth rising edge. - sixteen rising: Capture every fourth rising edge. - """ - return {v: k for k, v in MODES.items()}[self._logic_mode] - - def _get_xy(self, initial_state: bool, timestamps: np.ndarray): - x = np.repeat(timestamps, 3) - x = np.insert(x, 0, 0) - x[0] = 0 - y = np.array(len(x) * [False]) - - if self.logic_mode == "any": - y[0] = initial_state - for i in range(1, len(x), 3): - y[i] = y[i - 1] # Value before this timestamp. - y[i + 1] = not y[i] # Value at this timestamp. - y[i + 2] = y[i + 1] # Value leaving this timetamp. - elif self.logic_mode == "falling": - y[0] = True - for i in range(1, len(x), 3): - y[i] = True # Value before this timestamp. - y[i + 1] = False # Value at this timestamp. - y[i + 2] = True # Value leaving this timetamp. - else: - y[0] = False - for i in range(1, len(x), 3): - y[i] = False # Value before this timestamp. - y[i + 1] = True # Value at this timestamp. - y[i + 2] = False # Value leaving this timetamp. - - return x, y diff --git a/PSL/oscilloscope.py b/PSL/oscilloscope.py deleted file mode 100644 index ec56dff1..00000000 --- a/PSL/oscilloscope.py +++ /dev/null @@ -1,378 +0,0 @@ -"""Classes and functions related to the PSLab's oscilloscope instrument. - -Example -------- ->>> from PSL.oscilloscope import Oscilloscope ->>> scope = Oscilloscope() ->>> x, y1, y2, y3, y4 = scope.capture(channels=4, samples=1600, timegap=2) -""" - -import time -from typing import Tuple, Union - -import numpy as np - -import PSL.commands_proto as CP -from PSL import achan, packet_handler - - -class Oscilloscope: - """Capture varying voltage signals on up to four channels simultaneously. - - Parameters - ---------- - device : :class:`Handler`, optional - Serial interface for communicating with the PSLab device. If not provided, a - new one will be created. - - Attributes - ---------- - channel_one_map : str - Remap the first sampled channel. The default value is "CH1". - trigger_enabled - """ - - MAX_SAMPLES = 10000 - CH234 = ["CH2", "CH3", "MIC"] - - def __init__(self, device: packet_handler.Handler = None): - self._device = packet_handler.Handler() if device is None else device - self._channels = { - a: achan.AnalogInput(a, self._device) for a in achan.ANALOG_CHANNELS - } - self.channel_one_map = "CH1" - self._trigger_voltage = 0 - self._trigger_enabled = False - self._trigger_channel = "CH1" - - def capture(self, channels: int, samples: int, timegap: float,) -> np.ndarray: - """Capture an oscilloscope trace from the specified input channels. - - This is a blocking call. - - Parameters - ---------- - channels : {1, 2, 4} - Number of channels to sample from simultaneously. By default, samples are - captured from CH1, CH2, CH3 and MIC. CH1 can be remapped to any other - channel (CH2, CH3, MIC, CAP, SEN, AN8) by setting the channel_one_map - attribute of the Oscilloscope instance to the desired channel. - samples : int - Number of samples to fetch. Maximum 10000 divided by number of channels. - timegap : float - Time gap between samples in microseconds. Will be rounded to the closest - 1 / 8 µs. The minimum time gap depends on the type of measurement: - +--------------+------------+----------+------------+ - | Simultaneous | No trigger | Trigger | No trigger | - | channels | (10-bit) | (10-bit) | (12-bit) | - +==============+============+==========+============+ - | 1 | 0.5 µs | 0.75 µs | 1 µs | - +--------------+------------+----------+------------+ - | 2 | 0.875 µs | 0.875 µs | N/A | - +--------------+------------+----------+------------+ - | 4 | 1.75 µs | 1.75 µs | N/A | - +--------------+------------+----------+------------+ - Sample resolution is set automatically based on the above limitations; i.e. - to get 12-bit samples only one channel may be sampled, there must be no - active trigger, and the time gap must be 1 µs or greater. - - Example - ------- - >>> from PSL.oscilloscope import Oscilloscope - >>> scope = Oscilloscope() - >>> x, y = scope.capture(1, 3200, 1) - - Returns - ------- - numpy.ndarray - (:channels:+1)-dimensional array with timestamps in the first dimension - and corresponding voltages in the following dimensions. - - Raises - ------ - ValueError - If :channels: is not 1, 2 or 4, or - :samples: > 10000 / :channels:, or - :channel_one_map: is not one of CH1, CH2, CH3, MIC, CAP, SEN, AN8, or - :timegap: is too low. - """ - xy = np.zeros([channels + 1, samples]) - xy[0] = self.capture_nonblocking(channels, samples, timegap) - time.sleep(1e-6 * samples * timegap + 0.01) - - while not self.progress()[0]: - pass - - active_channels = ([self.channel_one_map] + self.CH234)[:channels] - for e, c in enumerate(active_channels): - xy[e + 1] = self.fetch_data(c) - - return xy - - def capture_nonblocking( - self, channels: int, samples: int, timegap: float - ) -> np.ndarray: - """Tell the pslab to start sampling the specified input channels. - - This method is identical to - :meth:`capture `, - except it does not block while the samples are being captured. Collected - samples must be manually fetched by calling - :meth:`fetch_data`. - - Parameters - ---------- - See :meth:`capture `. - - Example - ------- - >>> import time - >>> from PSL.oscilloscope import Oscilloscope - >>> scope = Oscilloscope() - >>> x = scope.capture_nonblocking(1, 3200, 1) - >>> time.sleep(3200 * 1e-6) - >>> y = scope.fetch_data("CH1") - - Returns - ------- - numpy.ndarray - One-dimensional array of timestamps. - - Raises - ------ - See :meth:`capture `. - """ - self._check_args(channels, samples, timegap) - timegap = int(timegap * 8) / 8 - self._capture(channels, samples, timegap) - return timegap * np.arange(samples) - - def _check_args(self, channels: int, samples: int, timegap: float): - if channels not in (1, 2, 4): - raise ValueError("Number of channels to sample must be 1, 2, or 4.") - - max_samples = self.MAX_SAMPLES // channels - if not 0 < samples <= max_samples: - e1 = f"Cannot collect more than {max_samples} when sampling from " - e2 = f"{channels} channels." - raise ValueError(e1 + e2) - - min_timegap = self._lookup_mininum_timegap(channels) - if timegap < min_timegap: - raise ValueError(f"timegap must be at least {min_timegap}.") - - if self.channel_one_map not in self._channels: - e1 = f"{self.channel_one_map} is not a valid channel. " - e2 = f"Valid channels are {list(self._channels.keys())}." - raise ValueError(e1 + e2) - - def _lookup_mininum_timegap(self, channels: int) -> float: - channels_idx = { - 1: 0, - 2: 1, - 4: 2, - } - min_timegaps = [[0.5, 0.75], [0.875, 0.875], [1.75, 1.75]] - - return min_timegaps[channels_idx[channels]][self.trigger_enabled] - - def _capture(self, channels: int, samples: int, timegap: float): - self._invalidate_buffer() - chosa = self._channels[self.channel_one_map].chosa - self._channels[self.channel_one_map].resolution = 10 - self._device.send_byte(CP.ADC) - - CH123SA = 0 # TODO what is this? - chosa = self._channels[self.channel_one_map].chosa - self._channels[self.channel_one_map].samples_in_buffer = samples - self._channels[self.channel_one_map].buffer_idx = 0 - if channels == 1: - if self.trigger_enabled: - self._device.send_byte(CP.CAPTURE_ONE) - self._device.send_byte(chosa | 0x80) # Trigger - elif timegap >= 1: - self._channels[self.channel_one_map].resolution = 12 - self._device.send_byte(CP.CAPTURE_DMASPEED) - self._device.send_byte(chosa | 0x80) # 12-bit mode - else: - self._device.send_byte(CP.CAPTURE_DMASPEED) - self._device.send_byte(chosa) # 10-bit mode - elif channels == 2: - self._channels["CH2"].resolution = 10 - self._channels["CH2"].samples_in_buffer = samples - self._channels["CH2"].buffer_idx = 1 * samples - self._device.send_byte(CP.CAPTURE_TWO) - self._device.send_byte(chosa | (0x80 * self.trigger_enabled)) - else: - for e, c in enumerate(self.CH234): - self._channels[c].resolution = 10 - self._channels[c].samples_in_buffer = samples - self._channels[c].buffer_idx = (e + 1) * samples - self._device.send_byte(CP.CAPTURE_FOUR) - self._device.send_byte( - chosa | (CH123SA << 4) | (0x80 * self.trigger_enabled) - ) - - self._device.send_int(samples) - self._device.send_int(int(timegap * 8)) # 8 MHz clock - self._device.get_ack() - - def _invalidate_buffer(self): - for c in self._channels.values(): - c.samples_in_buffer = 0 - c.buffer_idx = None - - def fetch_data(self, channel: str) -> np.ndarray: - """Fetch samples captured from specified channel. - - Parameters - ---------- - channel : {'CH1', 'CH2', 'CH3', 'MIC', 'CAP', 'SEN', 'AN8'} - Name of the channel from which to fetch captured data. - - Example - ------- - >>> from PSL.oscilloscope import Oscilloscope - >>> scope = Oscilloscope() - >>> scope.capture_nonblocking(channels=2, samples=1600, timegap=1) - >>> y1 = scope.fetch_data("CH1") - >>> y2 = scope.fetch_data("CH2") - - Returns - ------- - numpy.ndarray - One-dimensional array holding the requested voltages. - """ - data = bytearray() - channel = self._channels[channel] - samples = channel.samples_in_buffer - - for i in range(int(np.ceil(samples / CP.DATA_SPLITTING))): - self._device.send_byte(CP.COMMON) - self._device.send_byte(CP.RETRIEVE_BUFFER) - offset = channel.buffer_idx + i * CP.DATA_SPLITTING - self._device.send_int(offset) - self._device.send_int(CP.DATA_SPLITTING) # Ints to read - # Reading int by int sometimes causes a communication error. - data += self._device.interface.read(CP.DATA_SPLITTING * 2) - self._device.get_ack() - - data = [CP.ShortInt.unpack(data[s * 2 : s * 2 + 2])[0] for s in range(samples)] - - return channel.scale(np.array(data)) - - def progress(self) -> Tuple[bool, int]: - """Return the status of a capture call. - - Returns - ------- - bool, int - A boolean indicating whether the capture is complete, followed by the - number of samples currently held in the buffer. - """ - self._device.send_byte(CP.ADC) - self._device.send_byte(CP.GET_CAPTURE_STATUS) - conversion_done = self._device.get_byte() - samples = self._device.get_int() - self._device.get_ack() - - return bool(conversion_done), samples - - def configure_trigger(self, channel: str, voltage: float, prescaler: int = 0): - """Configure trigger parameters for 10-bit capture routines. - - The capture routines will wait until a rising edge of the input signal crosses - the specified level. The trigger will timeout within 8 ms, and capture will - start regardless. - - To disable the trigger after configuration, set the trigger_enabled attribute - of the Oscilloscope instance to False. - - Parameters - ---------- - channel : {'CH1', 'CH2', 'CH3', 'MIC', 'CAP', 'SEN', 'AN8'} - The name of the trigger channel. - voltage : float - The trigger voltage in volts. - prescaler : int, optional - The default value is 0. - - Examples - -------- - >>> from PSL.oscilloscope import Oscilloscope - >>> scope = Oscilloscope() - >>> scope.configure_trigger(channel='CH1', voltage=1.1) - >>> xy = scope.capture(channels=1, samples=800, timegap=2) - >>> diff = abs(xy[1, 0] - 1.1) # Should be small unless a timeout occurred. - - Raises - ------ - TypeError - If the trigger channel is set to a channel which cannot be sampled. - """ - self._trigger_channel = channel - - if channel == self.channel_one_map: - channel = 0 - elif channel in self.CH234: - channel = self.CH234.index(channel) + 1 - elif self.channel_one_map == "CH1": - e = f"Cannot trigger on {channel} unless it is remapped to CH1." - raise TypeError(e) - else: - e = f"Cannot trigger on CH1 when {self.channel_one_map} is mapped to CH1." - raise TypeError(e) - - self._device.send_byte(CP.ADC) - self._device.send_byte(CP.CONFIGURE_TRIGGER) - # Trigger channel (4lsb) , trigger timeout prescaler (4msb) - self._device.send_byte((prescaler << 4) | (1 << channel)) # TODO prescaler? - level = self._channels[self._trigger_channel].unscale(voltage) - self._device.send_int(level) - self._device.get_ack() - self._trigger_enabled = True - - @property - def trigger_enabled(self) -> bool: - """Activate or deactivate a trigger set by :meth:`configure_trigger`. - - Becomes True automatically when calling :meth:`configure_trigger`. - - If trigger_enabled is set to True without first calling - :meth:`configure_trigger`, the trigger will be configured with a trigger - voltage of 0 V on CH1. - """ - return self._trigger_enabled - - @trigger_enabled.setter - def trigger_enabled(self, value: bool): - self._trigger_enabled = value - if self._trigger_enabled: - self.configure_trigger(self._trigger_channel, self._trigger_voltage) - - def select_range(self, channel: str, voltage_range: Union[int, float]): - """Set appropriate gain automatically. - - Setting the right voltage range will result in better resolution. - - Parameters - ---------- - channel : {'CH1', 'CH2'} - Channel on which to apply gain. - voltage_range : {16,8,4,3,2,1.5,1,.5} - - Examples - -------- - >>> from PSL.oscilloscope import Oscilloscope - >>> scope = Oscilloscope() - >>> scope.select_range('CH1', 8) - # Gain set to 2x on CH1. Voltage range ±8 V. - """ - ranges = [16, 8, 4, 3, 2, 1.5, 1, 0.5] - if voltage_range in ranges: - idx = ranges.index(voltage_range) - gain = achan.GAIN_VALUES[idx] - self._channels[channel].gain = gain - else: - e = f"Invalid range: {voltage_range}. Valid ranges are {ranges}." - raise ValueError(e) diff --git a/PSL/packet_handler.py b/PSL/packet_handler.py deleted file mode 100755 index c11aa2c3..00000000 --- a/PSL/packet_handler.py +++ /dev/null @@ -1,399 +0,0 @@ -"""Low-level communication for PSLab. - -Example -------- ->>> from PSL.packet_handler import Handler ->>> device = Handler() ->>> version = device.get_version() ->>> device.disconnect() -""" -import logging -import struct -import time -from functools import partial -from typing import List, Union - -import serial -from serial.tools import list_ports - -import PSL.commands_proto as CP - -logger = logging.getLogger(__name__) - -USB_VID = 0x04D8 -USB_PID = 0x00DF - - -class Handler: - """Provides methods for communicating with the PSLab hardware. - - When instantiated, Handler tries to connect to the PSLab. A port can optionally - be specified; otherwise Handler will try to find the correct port automatically. - - Parameters - ---------- - See :meth:`connect. `. - """ - - def __init__( - self, - port: str = None, - baudrate: int = 1000000, - timeout: float = 1.0, - **kwargs, # Backward compatibility - ): - self.burst_buffer = b"" - self.load_burst = False - self.input_queue_size = 0 - self.version = "" - self._log = b"" - self._logging = False - self.interface = serial.Serial() - self.send_byte = partial(self._send, size=1) - self.send_int = partial(self._send, size=2) - self.get_byte = partial(self._receive, size=1) - self.get_int = partial(self._receive, size=2) - self.get_long = partial(self._receive, size=4) - self.connect(port=port, baudrate=baudrate, timeout=timeout) - - # Backwards compatibility - self.fd = self.interface - self.occupiedPorts = set() - self.connected = self.interface.is_open - self.__sendByte__ = partial(self._send, size=1) - self.__sendInt__ = partial(self._send, size=2) - self.__get_ack__ = self.get_ack - self.__getByte__ = partial(self._receive, size=1) - self.__getInt__ = partial(self._receive, size=2) - self.__getLong__ = partial(self._receive, size=4) - self.waitForData = self.wait_for_data - self.sendBurst = self.send_burst - self.portname = self.interface.name - self.listPorts = self._list_ports - - @staticmethod - def _list_ports() -> List[str]: # Promote to public? - """Return a list of serial port names.""" - return [p.device for p in list_ports.comports()] - - def connect( - self, port: str = None, baudrate: int = 1000000, timeout: float = 1.0, - ): - """Connect to PSLab. - - Parameters - ---------- - port : str, optional - The name of the port to which the PSLab is connected as a string. On - Posix this is a path, e.g. "/dev/ttyACM0". On Windows, it's a numbered - COM port, e.g. "COM5". Will be autodetected if not specified. - baudrate : int, optional - Symbol rate in bit/s. The default value is 1000000. - timeout : float, optional - Time in seconds to wait before cancelling a read or write command. The - default value is 1.0. - - Raises - ------ - SerialException - If connection could not be established. - """ - # serial.Serial opens automatically if port is not None. - self.interface = serial.Serial( - port=port, baudrate=baudrate, timeout=timeout, write_timeout=timeout, - ) - - if self.interface.is_open: - # User specified a port. - version = self.get_version() - else: - port_info_generator = list_ports.grep(f"{USB_VID:04x}:{USB_PID:04x}") - - for port_info in port_info_generator: - self.interface.port = port_info.device - self.interface.open() - version = self.get_version() - if any(expected in version for expected in ["PSLab", "CSpark"]): - break - else: - version = "" - - if any(expected in version for expected in ["PSLab", "CSpark"]): - self.version = version - self.fd = self.interface # Backward compatibility - logger.info(f"Connected to {self.version} on {self.interface.port}.") - else: - self.interface.close() - self.version = "" - raise serial.SerialException("Device not found.") - - def disconnect(self): - """Disconnect from PSLab.""" - self.interface.close() - - def reconnect( - self, port: str = None, baudrate: int = None, timeout: float = None, - ): - """Reconnect to PSLab. - - Will reuse previous settings (port, baudrate, timeout) unless new ones are - provided. - - Parameters - ---------- - See :meth:`connect. `. - """ - self.disconnect() - - # Reuse previous settings unless user provided new ones. - baudrate = self.interface.baudrate if baudrate is None else baudrate - port = self.interface.port if port is None else port - timeout = self.interface.timeout if timeout is None else timeout - - self.interface = serial.Serial( - port=port, baudrate=baudrate, timeout=timeout, write_timeout=timeout, - ) - self.connect() - - def __del__(self): # Is this necessary? - """Disconnect before garbage collection.""" - self.interface.close() - - def get_version(self, *args) -> str: # *args for backwards compatibility - """Query PSLab for its version and return it as a decoded string. - - Returns - ------- - str - Version string. - """ - self.send_byte(CP.COMMON) - self.send_byte(CP.GET_VERSION) - version = self.interface.readline() - self._write_log(version, "RX") - return version.decode("utf-8") - - def get_ack(self) -> int: # Make _internal? - """Get response code from PSLab. - - Also functions as handshake. - - Returns - ------- - int - Response code. Meanings: - 1 SUCCESS - 2 ARGUMENT_ERROR - 3 FAILED - """ - if not self.load_burst: - response = self.read(1) - else: - self.input_queue_size += 1 - return 1 - - try: - return CP.Byte.unpack(response)[0] - except Exception as e: - logger.error(e) - return 3 # raise exception instead? - - @staticmethod - def _get_integer_type(size: int) -> struct.Struct: - if size == 1: - return CP.Byte - elif size == 2: - return CP.ShortInt - elif size == 4: - return CP.Integer - else: - raise ValueError("size must be 1, 2, or 4.") - - def _send(self, value: Union[bytes, int], size: int = None): - """Send a value to the PSLab. - - Optionally handles conversion from int to bytes. - - Parameters - ---------- - value : bytes, int - Value to send to PSLab. Must fit in four bytes. - size : int, optional - Number of bytes to send. If not specified, the number of bytes sent - depends on the size of :value:. - """ - if isinstance(value, bytes): - packet = value - else: - # True + True == 2, see PEP 285. - size = 2 ** ((value > 0xFF) + (value > 0xFFFF)) if size is None else size - packer = self._get_integer_type(size) - packet = packer.pack(value) - - if self.load_burst: - self.burst_buffer += packet - else: - self.write(packet) - - def _receive(self, size: int) -> int: - """Read and unpack the specified number of bytes from the serial port. - - Parameters - ---------- - size : int - Number of bytes to read from the serial port. - - Returns - ------- - int - Unpacked bytes, or -1 if too few bytes were read. - """ - received = self.read(size) - - if len(received) == size: - if size in (1, 2, 4): - unpacker = self._get_integer_type(size) - retval = unpacker.unpack(received)[0] - else: - retval = int.from_bytes( - bytes=received, byteorder="little", signed=False - ) - else: - logger.error(f"Requested {size} bytes, got {len(received)}.") - retval = -1 # raise an exception instead? - - return retval - - def read(self, number_of_bytes: int) -> bytes: - data = self.interface.read(number_of_bytes) - self._write_log(data, "RX") - return data - - def write(self, data: bytes): - self.interface.write(data) - self._write_log(data, "TX") - - def _write_log(self, data: bytes, direction: str): - if self._logging: - self._log += direction.encode() + data + "STOP".encode() - - def wait_for_data(self, timeout: float = 0.2) -> bool: - """Wait for :timeout: seconds or until there is data in the input buffer. - - Parameters - ---------- - timeout : float, optional - Time in seconds to wait. The default is 0.2. - - Returns - ------- - bool - True iff the input buffer is not empty. - """ - start_time = time.time() - - while time.time() - start_time < timeout: - if self.interface.in_waiting: - return True - time.sleep(0.02) - - return False - - def send_burst(self) -> List[int]: - """Transmit the commands stored in the burst_buffer. - - The burst_buffer and input buffer are both emptied. - - The following example initiates the capture routine and sets OD1 HIGH - immediately. It is used by the Transient response experiment where the input - needs to be toggled soon after the oscilloscope has been started. - - Example - ------- - >>> I.load_burst = True - >>> I.capture_traces(4, 800, 2) - >>> I.set_state(I.OD1, I.HIGH) - >>> I.send_burst() - - Returns - ------- - list - List of response codes - (see :meth:`get_ack `). - """ - self.write(self.burst_buffer) - self.burst_buffer = b"" - self.load_burst = False - acks = self.read(self.input_queue_size) - self.input_queue_size = 0 - - return list(acks) - - -RECORDED_TRAFFIC = iter([]) -"""An iterator returning (request, response) pairs. - -The request is checked against data written to the dummy serial port, and if it matches -the response can be read back. Both request and response should be bytes-like. - -Intended to be monkey-patched by the calling test module. -""" - - -class MockHandler(Handler): - """Mock implementation of :class:`Handler` for testing. - - Parameters - ---------- - Same as :class:`Handler`. - """ - - VERSION = "PSLab vMOCK" - - def __init__( - self, port: str = None, baudrate: int = 1000000, timeout: float = 1.0, - ): - self._in_buffer = b"" - super().__init__(port, baudrate, timeout) - - def connect( - self, port: str = None, baudrate: int = 1000000, timeout: float = 1.0, - ): - self.version = self.get_version() - - def disconnect(self): - pass - - def reconnect( - self, port: str = None, baudrate: int = None, timeout: float = None, - ): - pass - - def get_version(self, *args) -> str: - return self.VERSION - - def read(self, number_of_bytes: int) -> bytes: - """Mimic the behavior of the serial bus by returning recorded RX traffic. - - The returned data depends on how :meth:`write` was called prior to calling - :meth:`read`. - """ - read_bytes = self._in_buffer[:number_of_bytes] - self._in_buffer = self._in_buffer[number_of_bytes:] - return read_bytes - - def write(self, data: bytes): - """Add recorded RX data to buffer if written data equals recorded TX data. - """ - tx, rx = next(RECORDED_TRAFFIC) - if tx == data: - self._in_buffer += rx - - def wait_for_data(self, timeout: float = 0.2) -> bool: - """Return True if there is data in buffer, or return False after timeout. - """ - if self._in_buffer: - return True - else: - time.sleep(timeout) - return False diff --git a/PSL/sciencelab.py b/PSL/sciencelab.py deleted file mode 100644 index 681228db..00000000 --- a/PSL/sciencelab.py +++ /dev/null @@ -1,1732 +0,0 @@ -# -*- coding: utf-8 -*- -# Communication Library for Pocket Science Lab from FOSSASIA -# -# License : GNU GPL - -from __future__ import print_function - -import time - -import numpy as np - -import PSL.commands_proto as CP -import PSL.packet_handler as packet_handler -from PSL.logic_analyzer import LogicAnalyzer -from PSL.oscilloscope import Oscilloscope - - -def connect(**kwargs): - ''' - If hardware is found, returns an instance of 'ScienceLab', else returns None. - ''' - obj = ScienceLab(**kwargs) - if obj.H.fd is not None: - return obj - else: - print('Err') - raise RuntimeError('Could Not Connect') - - -class ScienceLab(): - """ - **Communications library.** - - This class contains methods that can be used to interact with the FOSSASIA PSLab - - Initialization does the following - - * connects to tty device - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - +----------+-----------------------------------------------------------------+ - |Arguments |Description | - +==========+=================================================================+ - |timeout | serial port read timeout. default = 1s | - +----------+-----------------------------------------------------------------+ - - >>> from PSL import sciencelab - >>> I = sciencelab.connect() - >>> self.__print__(I) - - - - Once you have initiated this class, its various methods will allow access to all the features built - into the device. - - - - """ - - BAUD = 1000000 - WType = {'W1': 'sine', 'W2': 'sine'} - - def __init__(self, timeout=1.0, **kwargs): - self.verbose = kwargs.get('verbose', False) - self.initialArgs = kwargs - self.generic_name = 'PSLab' - self.DDS_CLOCK = 0 - self.timebase = 40 - self.MAX_SAMPLES = CP.MAX_SAMPLES - self.samples = self.MAX_SAMPLES - self.triggerLevel = 550 - self.triggerChannel = 0 - self.error_count = 0 - self.channels_in_buffer = 0 - self.digital_channels_in_buffer = 0 - self.currents = [0.55e-3, 0.55e-6, 0.55e-5, 0.55e-4] - self.currentScalers = [1.0, 1.0, 1.0, 1.0] - - self.sine1freq = None - self.sine2freq = None - self.sqrfreq = {'SQR1': None, 'SQR2': None, 'SQR3': None, 'SQR4': None} - self.aboutArray = [] - self.errmsg = '' - # --------------------------Initialize communication handler, and subclasses----------------- - self.H = packet_handler.Handler(**kwargs) - self.logic_analyzer = LogicAnalyzer(device=self.H) - self.oscilloscope = Oscilloscope(device=self.H) - self.__runInitSequence__(**kwargs) - - def __runInitSequence__(self, **kwargs): - self.aboutArray = [] - from PSL.Peripherals import I2C, SPI, NRF24L01, MCP4728 - self.connected = self.H.connected - if not self.H.connected: - self.__print__('Check hardware connections. Not connected') - - self.streaming = False - self.buff = np.zeros(10000) - self.SOCKET_CAPACITANCE = 42e-12 # 42e-12 is typical for the FOSSASIA PSLab. Actual values require calibration (currently not supported). - self.resistanceScaling = 1. - - self.gains = {'CH1': 0, 'CH2': 0} - - self.I2C = I2C(self.H) - # self.I2C.pullSCLLow(5000) - self.SPI = SPI(self.H) - self.hexid = '' - if self.H.connected: - for a in ['CH1', 'CH2']: - self.oscilloscope._channels[a].gain = 1 - for a in ['W1', 'W2']: self.load_equation(a, 'sine') - self.SPI.set_parameters(1, 7, 1, 0) - self.hexid = hex(self.device_id()) - - self.NRF = NRF24L01(self.H) - - self.aboutArray.append(['Radio Transceiver is :', 'Installed' if self.NRF.ready else 'Not Installed']) - - self.DAC = MCP4728(self.H, 3.3, 0) - - def get_resistance(self): - V = self.get_average_voltage('SEN') - if V > 3.295: return np.Inf - I = (3.3 - V) / 5.1e3 - res = V / I - return res * self.resistanceScaling - - def __print__(self, *args): - if self.verbose: - for a in args: - print(a, end="") - print() - - def get_version(self): - """ - Returns the version string of the device - format: LTS-...... - """ - return self.H.get_version() - - def getRadioLinks(self): - return self.NRF.get_nodelist() - - def newRadioLink(self, **args): - ''' - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================== - **Arguments** Description - ============== ============================================================================== - \*\*Kwargs Keyword Arguments - address Address of the node. a 24 bit number. Printed on the nodes.\n - can also be retrieved using :py:meth:`~NRF24L01_class.NRF24L01.get_nodelist` - ============== ============================================================================== - - - :return: :py:meth:`~NRF_NODE.RadioLink` - - - ''' - from PSL.Peripherals import RadioLink - return RadioLink(self.NRF, **args) - - # -------------------------------------------------------------------------------------------------------------------# - - # |================================================ANALOG SECTION====================================================| - # |This section has commands related to analog measurement and control. These include the oscilloscope routines, | - # |voltmeters, ammeters, and Programmable voltage sources. | - # -------------------------------------------------------------------------------------------------------------------# - - def reconnect(self, **kwargs): - ''' - Attempts to reconnect to the device in case of a commmunication error or accidental disconnect. - ''' - self.H.reconnect(**kwargs) - self.__runInitSequence__(**kwargs) - - def get_voltage(self, channel_name, **kwargs): - self.voltmeter_autorange(channel_name) - return self.get_average_voltage(channel_name, **kwargs) - - def voltmeter_autorange(self, channel_name): - try: - self.oscilloscope._channels[channel_name].gain = 1 - except TypeError: # channel_name is not CH1 or CH2. - return 1 - V = self.get_average_voltage(channel_name) - return self.__autoSelectRange__(channel_name, V) - - def __autoSelectRange__(self, channel_name, V): - keys = [8, 4, 3, 2, 1.5, 1, .5, 0] - cutoffs = {8: 1, 4: 2, 3: 4, 2: 5, 1.5: 8, 1.: 10, .5: 16, 0: 32} - for a in keys: - if abs(V) > a: - g = cutoffs[a] - break - self.oscilloscope._channels[channel_name].gain = g - return g - - def __autoRangeScope__(self, tg): - x, y1, y2 = self.oscilloscope.capture(2, 1000, tg) - self.__autoSelectRange__('CH1', max(abs(y1))) - self.__autoSelectRange__('CH2', max(abs(y2))) - - def get_average_voltage(self, channel_name, **kwargs): - """ - Return the voltage on the selected channel - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - +------------+-----------------------------------------------------------------------------------------+ - |Arguments |Description | - +============+=========================================================================================+ - |channel_name| 'CH1','CH2','CH3', 'MIC','IN1','SEN','V+' | - +------------+-----------------------------------------------------------------------------------------+ - |sleep | read voltage in CPU sleep mode. not particularly useful. Also, Buggy. | - +------------+-----------------------------------------------------------------------------------------+ - |\*\*kwargs | Samples to average can be specified. eg. samples=100 will average a hundred readings | - +------------+-----------------------------------------------------------------------------------------+ - - - see :ref:`stream_video` - - Example: - - >>> self.__print__(I.get_average_voltage('CH4')) - 1.002 - - """ - self.oscilloscope._channels[channel_name].resolution = 12 - scale = self.oscilloscope._channels[channel_name].scale - vals = [self.__get_raw_average_voltage__(channel_name, **kwargs) for a in range(int(kwargs.get('samples', 1)))] - # if vals[0]>2052:print (vals) - val = np.average([scale(a) for a in vals]) - return val - - def __get_raw_average_voltage__(self, channel_name, **kwargs): - """ - Return the average of 16 raw 12-bit ADC values of the voltage on the selected channel - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================================ - **Arguments** - ============== ============================================================================================================ - channel_name 'CH1', 'CH2', 'CH3', 'MIC', '5V', 'IN1','SEN' - sleep read voltage in CPU sleep mode - ============== ============================================================================================================ - - """ - chosa = self.oscilloscope._channels[channel_name].chosa - self.H.__sendByte__(CP.ADC) - self.H.__sendByte__(CP.GET_VOLTAGE_SUMMED) - self.H.__sendByte__(chosa) - V_sum = self.H.__getInt__() - self.H.__get_ack__() - return V_sum / 16. # sum(V)/16.0 # - - def fetch_buffer(self, starting_position=0, total_points=100): - """ - fetches a section of the ADC hardware buffer - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.RETRIEVE_BUFFER) - self.H.__sendInt__(starting_position) - self.H.__sendInt__(total_points) - for a in range(int(total_points)): self.buff[a] = self.H.__getInt__() - self.H.__get_ack__() - - def clear_buffer(self, starting_position, total_points): - """ - clears a section of the ADC hardware buffer - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.CLEAR_BUFFER) - self.H.__sendInt__(starting_position) - self.H.__sendInt__(total_points) - self.H.__get_ack__() - - def fill_buffer(self, starting_position, point_array): - """ - fill a section of the ADC hardware buffer with data - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.FILL_BUFFER) - self.H.__sendInt__(starting_position) - self.H.__sendInt__(len(point_array)) - for a in point_array: - self.H.__sendInt__(int(a)) - self.H.__get_ack__() - - def start_streaming(self, tg, channel='CH1'): - """ - Instruct the ADC to start streaming 8-bit data. use stop_streaming to stop. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - tg timegap. 250KHz clock - channel channel 'CH1'... 'CH9','IN1','SEN' - ============== ============================================================================================ - - """ - chosa = self.oscilloscope.channels[channel].chosa - if (self.streaming): self.stop_streaming() - self.H.__sendByte__(CP.ADC) - self.H.__sendByte__(CP.START_ADC_STREAMING) - self.H.__sendByte__(chosa) - self.H.__sendInt__(tg) # Timegap between samples. 8MHz timer clock - self.streaming = True - - def stop_streaming(self): - """ - Instruct the ADC to stop streaming data - """ - if (self.streaming): - self.H.__sendByte__(CP.STOP_STREAMING) - self.H.fd.read(20000) - self.H.fd.flush() - else: - self.__print__('not streaming') - self.streaming = False - - # -------------------------------------------------------------------------------------------------------------------# - - # |===============================================DIGITAL SECTION====================================================| - # |This section has commands related to digital measurement and control. These include the Logic Analyzer, frequency | - # |measurement calls, timing routines, digital outputs etc | - # -------------------------------------------------------------------------------------------------------------------# - - def set_state(self, **kwargs): - """ - - set the logic level on digital outputs SQR1,SQR2,SQR3,SQR4 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - \*\*kwargs SQR1,SQR2,SQR3,SQR4 - states(0 or 1) - ============== ============================================================================================ - - >>> I.set_state(SQR1=1,SQR2=0) - sets SQR1 HIGH, SQR2 LOw, but leave SQR3,SQR4 untouched. - - """ - data = 0 - if 'SQR1' in kwargs: - data |= 0x10 | (kwargs.get('SQR1')) - if 'SQR2' in kwargs: - data |= 0x20 | (kwargs.get('SQR2') << 1) - if 'SQR3' in kwargs: - data |= 0x40 | (kwargs.get('SQR3') << 2) - if 'SQR4' in kwargs: - data |= 0x80 | (kwargs.get('SQR4') << 3) - self.H.__sendByte__(CP.DOUT) - self.H.__sendByte__(CP.SET_STATE) - self.H.__sendByte__(data) - self.H.__get_ack__() - - def __charge_cap__(self, state, t): - self.H.__sendByte__(CP.ADC) - self.H.__sendByte__(CP.SET_CAP) - self.H.__sendByte__(state) - self.H.__sendInt__(t) - self.H.__get_ack__() - - def __capture_capacitance__(self, samples, tg): - raise NotImplementedError -# from PSL.analyticsClass import analyticsClass -# self.AC = analyticsClass() -# self.__charge_cap__(1, 50000) -# x, y = self.capture_fullspeed_hr('CAP', samples, tg, 'READ_CAP') -# fitres = self.AC.fit_exp(x * 1e-6, y) -# if fitres: -# cVal, newy = fitres -# # from PSL import * -# # plot(x,newy) -# # show() -# return x, y, newy, cVal -# else: -# return None - - def capacitance_via_RC_discharge(self): - cap = self.get_capacitor_range()[1] - T = 2 * cap * 20e3 * 1e6 # uS - samples = 500 - if T > 5000 and T < 10e6: - if T > 50e3: samples = 250 - RC = self.__capture_capacitance__(samples, int(T / samples))[3][1] - return RC / 10e3 - else: - self.__print__('cap out of range %f %f' % (T, cap)) - return 0 - - def __get_capacitor_range__(self, ctime): - self.__charge_cap__(0, 30000) - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.GET_CAP_RANGE) - self.H.__sendInt__(ctime) - V_sum = self.H.__getInt__() - self.H.__get_ack__() - V = V_sum * 3.3 / 16 / 4095 - C = -ctime * 1e-6 / 1e4 / np.log(1 - V / 3.3) - return V, C - - def get_capacitor_range(self): - """ - Charges a capacitor connected to IN1 via a 20K resistor from a 3.3V source for a fixed interval - Returns the capacitance calculated using the formula Vc = Vs(1-exp(-t/RC)) - This function allows an estimation of the parameters to be used with the :func:`get_capacitance` function. - - """ - t = 10 - P = [1.5, 50e-12] - for a in range(4): - P = list(self.__get_capacitor_range__(50 * (10 ** a))) - if (P[0] > 1.5): - if a == 0 and P[0] > 3.28: # pico farads range. Values will be incorrect using this method - P[1] = 50e-12 - break - return P - - def get_capacitance(self): # time in uS - """ - measures capacitance of component connected between CAP and ground - - - :return: Capacitance (F) - - Constant Current Charging - - .. math:: - - Q_{stored} = C*V - - I_{constant}*time = C*V - - C = I_{constant}*time/V_{measured} - - Also uses Constant Voltage Charging via 20K resistor if required. - - """ - GOOD_VOLTS = [2.5, 2.8] - CT = 10 - CR = 1 - iterations = 0 - start_time = time.time() - - while (time.time() - start_time) < 1: - # self.__print__('vals',CR,',',CT) - if CT > 65000: - self.__print__('CT too high') - return self.capacitance_via_RC_discharge() - V, C = self.__get_capacitance__(CR, 0, CT) - # print(CR,CT,V,C) - if CT > 30000 and V < 0.1: - self.__print__('Capacitance too high for this method') - return 0 - - elif V > GOOD_VOLTS[0] and V < GOOD_VOLTS[1]: - return C - elif V < GOOD_VOLTS[0] and V > 0.01 and CT < 40000: - if GOOD_VOLTS[0] / V > 1.1 and iterations < 10: - CT = int(CT * GOOD_VOLTS[0] / V) - iterations += 1 - self.__print__('increased CT ', CT) - elif iterations == 10: - return 0 - else: - return C - elif V <= 0.1 and CR < 3: - CR += 1 - elif CR == 3: - self.__print__('Capture mode ') - return self.capacitance_via_RC_discharge() - - def __get_capacitance__(self, current_range, trim, Charge_Time): # time in uS - self.__charge_cap__(0, 30000) - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.GET_CAPACITANCE) - self.H.__sendByte__(current_range) - if (trim < 0): - self.H.__sendByte__(int(31 - abs(trim) / 2) | 32) - else: - self.H.__sendByte__(int(trim / 2)) - self.H.__sendInt__(Charge_Time) - time.sleep(Charge_Time * 1e-6 + .02) - VCode = self.H.__getInt__() - V = 3.3 * VCode / 4095 - self.H.__get_ack__() - Charge_Current = self.currents[current_range] * (100 + trim) / 100.0 - if V: - C = (Charge_Current * Charge_Time * 1e-6 / V - self.SOCKET_CAPACITANCE) / self.currentScalers[ - current_range] - else: - C = 0 - return V, C - - def get_temperature(self): - """ - return the processor's temperature - - :return: Chip Temperature in degree Celcius - """ - cs = 3 - V = self.get_ctmu_voltage(0b11110, cs, 0) - - if cs == 1: - return (646 - V * 1000) / 1.92 # current source = 1 - elif cs == 2: - return (701.5 - V * 1000) / 1.74 # current source = 2 - elif cs == 3: - return (760 - V * 1000) / 1.56 # current source = 3 - - def get_ctmu_voltage(self, channel, Crange, tgen=1): - """ - get_ctmu_voltage(5,2) will activate a constant current source of 5.5uA on IN1 and then measure the voltage at the output. - If a diode is used to connect IN1 to ground, the forward voltage drop of the diode will be returned. e.g. .6V for a 4148diode. - - If a resistor is connected, ohm's law will be followed within reasonable limits - - channel=5 for IN1 - - CRange=0 implies 550uA - CRange=1 implies 0.55uA - CRange=2 implies 5.5uA - CRange=3 implies 55uA - - :return: Voltage - """ - if channel == 'CAP': channel = 5 - - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.GET_CTMU_VOLTAGE) - self.H.__sendByte__((channel) | (Crange << 5) | (tgen << 7)) - - v = self.H.__getInt__() # 16*voltage across the current source - - self.H.__get_ack__() - V = 3.3 * v / 16 / 4095. - return V - - def __start_ctmu__(self, Crange, trim, tgen=1): - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.START_CTMU) - self.H.__sendByte__((Crange) | (tgen << 7)) - self.H.__sendByte__(trim) - self.H.__get_ack__() - - def __stop_ctmu__(self): - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.STOP_CTMU) - self.H.__get_ack__() - - def resetHardware(self): - """ - Resets the device, and standalone mode will be enabled if an OLED is connected to the I2C port - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.RESTORE_STANDALONE) - - def read_flash(self, page, location): - """ - Reads 16 BYTES from the specified location - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - page page number. 20 pages with 2KBytes each - location The flash location(0 to 63) to read from . - ================ ============================================================================================ - - :return: a string of 16 characters read from the location - """ - self.H.__sendByte__(CP.FLASH) - self.H.__sendByte__(CP.READ_FLASH) - self.H.__sendByte__(page) # send the page number. 20 pages with 2K bytes each - self.H.__sendByte__(location) # send the location - ss = self.H.fd.read(16) - self.H.__get_ack__() - return ss - - def read_bulk_flash(self, page, numbytes): - """ - Reads BYTES from the specified location - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - page Block number. 0-20. each block is 2kB. - numbytes Total bytes to read - ================ ============================================================================================ - - :return: a string of 16 characters read from the location - """ - self.H.__sendByte__(CP.FLASH) - self.H.__sendByte__(CP.READ_BULK_FLASH) - bytes_to_read = numbytes - if numbytes % 2: bytes_to_read += 1 # bytes+1 . stuff is stored as integers (byte+byte) in the hardware - self.H.__sendInt__(bytes_to_read) - self.H.__sendByte__(page) - ss = self.H.fd.read(int(bytes_to_read)) - self.H.__get_ack__() - if numbytes % 2: return ss[:-1] # Kill the extra character we read. Don't surprise the user with extra data - return ss - - def write_flash(self, page, location, string_to_write): - """ - write a 16 BYTE string to the selected location (0-63) - - DO NOT USE THIS UNLESS YOU'RE ABSOLUTELY SURE KNOW THIS! - YOU MAY END UP OVERWRITING THE CALIBRATION DATA, AND WILL HAVE - TO GO THROUGH THE TROUBLE OF GETTING IT FROM THE MANUFACTURER AND - REFLASHING IT. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - page page number. 20 pages with 2KBytes each - location The flash location(0 to 63) to write to. - string_to_write a string of 16 characters can be written to each location - ================ ============================================================================================ - - """ - while (len(string_to_write) < 16): string_to_write += '.' - self.H.__sendByte__(CP.FLASH) - self.H.__sendByte__(CP.WRITE_FLASH) # indicate a flash write coming through - self.H.__sendByte__(page) # send the page number. 20 pages with 2K bytes each - self.H.__sendByte__(location) # send the location - self.H.fd.write(string_to_write) - time.sleep(0.1) - self.H.__get_ack__() - - def write_bulk_flash(self, location, data): - """ - write a byte array to the entire flash page. Erases any other data - - DO NOT USE THIS UNLESS YOU'RE ABSOLUTELY SURE YOU KNOW THIS! - YOU MAY END UP OVERWRITING THE CALIBRATION DATA, AND WILL HAVE - TO GO THROUGH THE TROUBLE OF GETTING IT FROM THE MANUFACTURER AND - REFLASHING IT. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ================ ============================================================================================ - **Arguments** - ================ ============================================================================================ - location Block number. 0-20. each block is 2kB. - bytearray Array to dump onto flash. Max size 2048 bytes - ================ ============================================================================================ - - """ - if (type(data) == str): data = [ord(a) for a in data] - if len(data) % 2 == 1: data.append(0) - - self.H.__sendByte__(CP.FLASH) - self.H.__sendByte__(CP.WRITE_BULK_FLASH) # indicate a flash write coming through - self.H.__sendInt__(len(data)) # send the length - self.H.__sendByte__(location) - for n in range(len(data)): - self.H.__sendByte__(data[n]) - self.H.__get_ack__() - - # verification by readback - tmp = [ord(a) for a in self.read_bulk_flash(location, len(data))] - print('Verification done', tmp == data) - if tmp != data: raise Exception('Verification by readback failed') - - # -------------------------------------------------------------------------------------------------------------------# - - # |===============================================WAVEGEN SECTION====================================================| - # |This section has commands related to waveform generators W1, W2, PWM outputs, servo motor control etc. | - # -------------------------------------------------------------------------------------------------------------------# - - def set_wave(self, chan, freq): - """ - Set the frequency of wavegen - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - chan Channel to set frequency for. W1 or W2 - frequency Frequency to set on wave generator - ============== ============================================================================================ - - - :return: frequency - """ - if chan == 'W1': - self.set_w1(freq) - elif chan == 'W2': - self.set_w2(freq) - - def set_sine1(self, freq): - """ - Set the frequency of wavegen 1 after setting its waveform type to sinusoidal - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - frequency Frequency to set on wave generator 1. - ============== ============================================================================================ - - - :return: frequency - """ - return self.set_w1(freq, 'sine') - - def set_sine2(self, freq): - """ - Set the frequency of wavegen 2 after setting its waveform type to sinusoidal - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - frequency Frequency to set on wave generator 1. - ============== ============================================================================================ - - - :return: frequency - """ - return self.set_w2(freq, 'sine') - - def set_w1(self, freq, waveType=None): - """ - Set the frequency of wavegen 1 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - frequency Frequency to set on wave generator 1. - waveType 'sine','tria' . Default : Do not reload table. and use last set table - ============== ============================================================================================ - - - :return: frequency - """ - if freq < 0.1: - self.__print__('freq too low') - return 0 - elif freq < 1100: - HIGHRES = 1 - table_size = 512 - else: - HIGHRES = 0 - table_size = 32 - - if waveType: # User wants to set a particular waveform type. sine or tria - if waveType in ['sine', 'tria']: - if (self.WType['W1'] != waveType): - self.load_equation('W1', waveType) - else: - print('Not a valid waveform. try sine or tria') - - p = [1, 8, 64, 256] - prescaler = 0 - while prescaler <= 3: - wavelength = int(round(64e6 / freq / p[prescaler] / table_size)) - freq = (64e6 / wavelength / p[prescaler] / table_size) - if wavelength < 65525: break - prescaler += 1 - if prescaler == 4: - self.__print__('out of range') - return 0 - - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SET_SINE1) - self.H.__sendByte__(HIGHRES | (prescaler << 1)) # use larger table for low frequencies - self.H.__sendInt__(wavelength - 1) - self.H.__get_ack__() - self.sine1freq = freq - return freq - - def set_w2(self, freq, waveType=None): - """ - Set the frequency of wavegen 2 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - frequency Frequency to set on wave generator 1. - ============== ============================================================================================ - - :return: frequency - """ - if freq < 0.1: - self.__print__('freq too low') - return 0 - elif freq < 1100: - HIGHRES = 1 - table_size = 512 - else: - HIGHRES = 0 - table_size = 32 - - if waveType: # User wants to set a particular waveform type. sine or tria - if waveType in ['sine', 'tria']: - if (self.WType['W2'] != waveType): - self.load_equation('W2', waveType) - else: - print('Not a valid waveform. try sine or tria') - - p = [1, 8, 64, 256] - prescaler = 0 - while prescaler <= 3: - wavelength = int(round(64e6 / freq / p[prescaler] / table_size)) - freq = (64e6 / wavelength / p[prescaler] / table_size) - if wavelength < 65525: break - prescaler += 1 - if prescaler == 4: - self.__print__('out of range') - return 0 - - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SET_SINE2) - self.H.__sendByte__(HIGHRES | (prescaler << 1)) # use larger table for low frequencies - self.H.__sendInt__(wavelength - 1) - self.H.__get_ack__() - self.sine2freq = freq - - return freq - - def readbackWaveform(self, chan): - """ - Set the frequency of wavegen 1 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - chan Any of W1,W2,SQR1,SQR2,SQR3,SQR4 - ============== ============================================================================================ - - - :return: frequency - """ - if chan == 'W1': - return self.sine1freq - elif chan == 'W2': - return self.sine2freq - elif chan[:3] == 'SQR': - return self.sqrfreq.get(chan, None) - - def set_waves(self, freq, phase, f2=None): - """ - Set the frequency of wavegen - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - frequency Frequency to set on both wave generators - phase Phase difference between the two. 0-360 degrees - f2 Only specify if you require two separate frequencies to be set - ============== ============================================================================================ - - :return: frequency - """ - if f2: - freq2 = f2 - else: - freq2 = freq - - if freq < 0.1: - self.__print__('freq1 too low') - return 0 - elif freq < 1100: - HIGHRES = 1 - table_size = 512 - else: - HIGHRES = 0 - table_size = 32 - - if freq2 < 0.1: - self.__print__('freq2 too low') - return 0 - elif freq2 < 1100: - HIGHRES2 = 1 - table_size2 = 512 - else: - HIGHRES2 = 0 - table_size2 = 32 - if freq < 1. or freq2 < 1.: - self.__print__('extremely low frequencies will have reduced amplitudes due to AC coupling restrictions') - - p = [1, 8, 64, 256] - prescaler1 = 0 - while prescaler1 <= 3: - wavelength = int(round(64e6 / freq / p[prescaler1] / table_size)) - retfreq = (64e6 / wavelength / p[prescaler1] / table_size) - if wavelength < 65525: break - prescaler1 += 1 - if prescaler1 == 4: - self.__print__('#1 out of range') - return 0 - - p = [1, 8, 64, 256] - prescaler2 = 0 - while prescaler2 <= 3: - wavelength2 = int(round(64e6 / freq2 / p[prescaler2] / table_size2)) - retfreq2 = (64e6 / wavelength2 / p[prescaler2] / table_size2) - if wavelength2 < 65525: break - prescaler2 += 1 - if prescaler2 == 4: - self.__print__('#2 out of range') - return 0 - - phase_coarse = int(table_size2 * (phase) / 360.) - phase_fine = int(wavelength2 * (phase - (phase_coarse) * 360. / table_size2) / (360. / table_size2)) - - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SET_BOTH_WG) - - self.H.__sendInt__(wavelength - 1) # not really wavelength. time between each datapoint - self.H.__sendInt__(wavelength2 - 1) # not really wavelength. time between each datapoint - self.H.__sendInt__(phase_coarse) # table position for phase adjust - self.H.__sendInt__(phase_fine) # timer delay / fine phase adjust - - self.H.__sendByte__((prescaler2 << 4) | (prescaler1 << 2) | (HIGHRES2 << 1) | ( - HIGHRES)) # use larger table for low frequencies - self.H.__get_ack__() - self.sine1freq = retfreq - self.sine2freq = retfreq2 - - return retfreq - - def load_equation(self, chan, function, span=None, **kwargs): - ''' - Load an arbitrary waveform to the waveform generators - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - chan The waveform generator to alter. W1 or W2 - function A function that will be used to generate the datapoints - span the range of values in which to evaluate the given function - ============== ============================================================================================ - - .. code-block:: python - - fn = lambda x:abs(x-50) #Triangular waveform - self.I.load_waveform('W1',fn,[0,100]) - #Load triangular wave to wavegen 1 - - #Load sinusoidal wave to wavegen 2 - self.I.load_waveform('W2',np.sin,[0,2*np.pi]) - - ''' - if function == 'sine' or function == np.sin: - function = np.sin - span = [0, 2 * np.pi] - self.WType[chan] = 'sine' - elif function == 'tria': - function = lambda x: abs(x % 4 - 2) - 1 - span = [-1, 3] - self.WType[chan] = 'tria' - else: - self.WType[chan] = 'arbit' - - self.__print__('reloaded wave equation for %s : %s' % (chan, self.WType[chan])) - x1 = np.linspace(span[0], span[1], 512 + 1)[:-1] - y1 = function(x1) - self.load_table(chan, y1, self.WType[chan], **kwargs) - - def load_table(self, chan, points, mode='arbit', **kwargs): - ''' - Load an arbitrary waveform table to the waveform generators - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - chan The waveform generator to alter. 'W1' or 'W2' - points A list of 512 datapoints exactly - mode Optional argument. Type of waveform. default value 'arbit'. accepts 'sine', 'tria' - ============== ============================================================================================ - - example:: - - >>> self.I.load_waveform_table(1,range(512)) - #Load sawtooth wave to wavegen 1 - ''' - self.__print__('reloaded wave table for %s : %s' % (chan, mode)) - self.WType[chan] = mode - chans = ['W1', 'W2'] - if chan in chans: - num = chans.index(chan) + 1 - else: - print('Channel does not exist. Try W2 or W2') - return - - # Normalize and scale . - # y1 = array with 512 points between 0 and 512 - # y2 = array with 32 points between 0 and 64 - - amp = kwargs.get('amp', 0.95) - LARGE_MAX = 511 * amp # A form of amplitude control. This decides the max PWM duty cycle out of 512 clocks - SMALL_MAX = 63 * amp # Max duty cycle out of 64 clocks - y1 = np.array(points) - y1 -= min(y1) - y1 = y1 / float(max(y1)) - y1 = 1. - y1 - y1 = list(np.int16(np.round(LARGE_MAX - LARGE_MAX * y1))) - - y2 = np.array(points[::16]) - y2 -= min(y2) - y2 = y2 / float(max(y2)) - y2 = 1. - y2 - y2 = list(np.int16(np.round(SMALL_MAX - SMALL_MAX * y2))) - - self.H.__sendByte__(CP.WAVEGEN) - if (num == 1): - self.H.__sendByte__(CP.LOAD_WAVEFORM1) - elif (num == 2): - self.H.__sendByte__(CP.LOAD_WAVEFORM2) - - for a in y1: - self.H.__sendInt__(a) - for a in y2: - self.H.__sendByte__(CP.Byte.pack(a)) - time.sleep(0.01) - self.H.__get_ack__() - - def sqr1(self, freq, duty_cycle=50, onlyPrepare=False): - """ - Set the frequency of sqr1 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - frequency Frequency - duty_cycle Percentage of high time - ============== ============================================================================================ - """ - if freq == 0 or duty_cycle == 0: return None - if freq > 10e6: - print('Frequency is greater than 10MHz. Please use map_reference_clock for 16 & 32MHz outputs') - return 0 - - p = [1, 8, 64, 256] - prescaler = 0 - while prescaler <= 3: - wavelength = int(64e6 / freq / p[prescaler]) - if wavelength < 65525: break - prescaler += 1 - if prescaler == 4 or wavelength == 0: - self.__print__('out of range') - return 0 - high_time = wavelength * duty_cycle / 100. - self.__print__(wavelength, ':', high_time, ':', prescaler) - if onlyPrepare: self.set_state(SQR1=False) - - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SET_SQR1) - self.H.__sendInt__(int(round(wavelength))) - self.H.__sendInt__(int(round(high_time))) - if onlyPrepare: prescaler |= 0x4 # Instruct hardware to prepare the square wave, but do not connect it to the output. - self.H.__sendByte__(prescaler) - self.H.__get_ack__() - - self.sqrfreq['SQR1'] = 64e6 / wavelength / p[prescaler & 0x3] - return self.sqrfreq['SQR1'] - - def sqr1_pattern(self, timing_array): - """ - output a preset sqr1 frequency in fixed intervals. Can be used for sending IR signals that are packets - of 38KHz pulses. - refer to the example - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - timing_array A list of on & off times in uS units - ============== ============================================================================================ - - .. code-block:: python - I.sqr1(38e3 , 50, True ) # Prepare a 38KHz, 50% square wave. Do not output it yet - I.sqr1_pattern([1000,1000,1000,1000,1000]) #On:1mS (38KHz packet), Off:1mS, On:1mS (38KHz packet), Off:1mS, On:1mS (38KHz packet), Off: indefinitely.. - """ - self.fill_buffer(self.MAX_SAMPLES / 2, timing_array) # Load the array to the ADCBuffer(second half) - - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SQR1_PATTERN) - self.H.__sendInt__(len(timing_array)) - time.sleep(sum(timing_array) * 1e-6) # Sleep for the whole duration - self.H.__get_ack__() - - return True - - def sqr2(self, freq, duty_cycle): - """ - Set the frequency of sqr2 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - frequency Frequency - duty_cycle Percentage of high time - ============== ============================================================================================ - """ - p = [1, 8, 64, 256] - prescaler = 0 - while prescaler <= 3: - wavelength = 64e6 / freq / p[prescaler] - if wavelength < 65525: break - prescaler += 1 - - if prescaler == 4 or wavelength == 0: - self.__print__('out of range') - return 0 - - high_time = wavelength * duty_cycle / 100. - self.__print__(wavelength, high_time, prescaler) - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SET_SQR2) - self.H.__sendInt__(int(round(wavelength))) - self.H.__sendInt__(int(round(high_time))) - self.H.__sendByte__(prescaler) - self.H.__get_ack__() - - self.sqrfreq['SQR2'] = 64e6 / wavelength / p[prescaler & 0x3] - return self.sqrfreq['SQR2'] - - def set_sqrs(self, wavelength, phase, high_time1, high_time2, prescaler=1): - """ - Set the frequency of sqr1,sqr2, with phase shift - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - wavelength Number of 64Mhz/prescaler clock cycles per wave - phase Clock cycles between rising edges of SQR1 and SQR2 - high time1 Clock cycles for which SQR1 must be HIGH - high time2 Clock cycles for which SQR2 must be HIGH - prescaler 0,1,2. Divides the 64Mhz clock by 8,64, or 256 - ============== ============================================================================================ - - """ - - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SET_SQRS) - self.H.__sendInt__(wavelength) - self.H.__sendInt__(phase) - self.H.__sendInt__(high_time1) - self.H.__sendInt__(high_time2) - self.H.__sendByte__(prescaler) - self.H.__get_ack__() - - def sqrPWM(self, freq, h0, p1, h1, p2, h2, p3, h3, **kwargs): - """ - Initialize phase correlated square waves on SQR1,SQR2,SQR3,SQR4 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - freq Frequency in Hertz - h0 Duty Cycle for SQR1 (0-1) - p1 Phase shift for SQR2 (0-1) - h1 Duty Cycle for SQR2 (0-1) - p2 Phase shift for OD1 (0-1) - h2 Duty Cycle for OD1 (0-1) - p3 Phase shift for OD2 (0-1) - h3 Duty Cycle for OD2 (0-1) - ============== ============================================================================================ - - """ - if freq == 0 or h0 == 0 or h1 == 0 or h2 == 0 or h3 == 0: return 0 - if freq > 10e6: - print('Frequency is greater than 10MHz. Please use map_reference_clock for 16 & 32MHz outputs') - return 0 - - p = [1, 8, 64, 256] - prescaler = 0 - while prescaler <= 3: - wavelength = int(64e6 / freq / p[prescaler]) - if wavelength < 65525: break - prescaler += 1 - if prescaler == 4 or wavelength == 0: - self.__print__('out of range') - return 0 - - if not kwargs.get('pulse', False): prescaler |= (1 << 5) - - A1 = int(p1 % 1 * wavelength) - B1 = int((h1 + p1) % 1 * wavelength) - A2 = int(p2 % 1 * wavelength) - B2 = int((h2 + p2) % 1 * wavelength) - A3 = int(p3 % 1 * wavelength) - B3 = int((h3 + p3) % 1 * wavelength) - - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SQR4) - self.H.__sendInt__(wavelength - 1) - self.H.__sendInt__(int(wavelength * h0) - 1) - - self.H.__sendInt__(max(0, A1 - 1)) - self.H.__sendInt__(max(1, B1 - 1)) - self.H.__sendInt__(max(0, A2 - 1)) - self.H.__sendInt__(max(1, B2 - 1)) - self.H.__sendInt__(max(0, A3 - 1)) - self.H.__sendInt__(max(1, B3 - 1)) - self.H.__sendByte__(prescaler) - self.H.__get_ack__() - - for a in ['SQR1', 'SQR2', 'SQR3', 'SQR4']: self.sqrfreq[a] = 64e6 / wavelength / p[prescaler & 0x3] - return 64e6 / wavelength / p[prescaler & 0x3] - - def map_reference_clock(self, scaler, *args): - """ - Map the internal oscillator output to SQR1,SQR2,SQR3,SQR4 or WAVEGEN - The output frequency is 128/(1< 128MHz - * 1 -> 64MHz - * 2 -> 32MHz - * 3 -> 16MHz - * . - * . - * 15 ->128./32768 MHz - - example:: - - >>> I.map_reference_clock(2,'SQR1','SQR2') - - outputs 32 MHz on SQR1, SQR2 pins - - .. note:: - if you change the reference clock for 'wavegen' , the external waveform generator(AD9833) resolution and range will also change. - default frequency for 'wavegen' is 16MHz. Setting to 1MHz will give you 16 times better resolution, but a usable range of - 0Hz to about 100KHz instead of the original 2MHz. - - """ - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.MAP_REFERENCE) - chan = 0 - if 'SQR1' in args: chan |= 1 - if 'SQR2' in args: chan |= 2 - if 'SQR3' in args: chan |= 4 - if 'SQR4' in args: chan |= 8 - if 'WAVEGEN' in args: chan |= 16 - self.H.__sendByte__(chan) - self.H.__sendByte__(scaler) - if 'WAVEGEN' in args: self.DDS_CLOCK = 128e6 / (1 << scaler) - self.H.__get_ack__() - - # -------------------------------------------------------------------------------------------------------------------# - - # |===============================================ANALOG OUTPUTS ====================================================| - # |This section has commands related to current and voltage sources PV1,PV2,PV3,PCS | - # -------------------------------------------------------------------------------------------------------------------# - - def set_pv1(self, val): - """ - Set the voltage on PV1 - 12-bit DAC... -5V to 5V - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - val Output voltage on PV1. -5V to 5V - ============== ============================================================================================ - - """ - return self.DAC.setVoltage('PV1', val) - - def set_pv2(self, val): - """ - Set the voltage on PV2. - 12-bit DAC... 0-3.3V - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - val Output voltage on PV2. 0-3.3V - ============== ============================================================================================ - - :return: Actual value set on pv2 - """ - return self.DAC.setVoltage('PV2', val) - - def set_pv3(self, val): - """ - Set the voltage on PV3 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - val Output voltage on PV3. 0V to 3.3V - ============== ============================================================================================ - - :return: Actual value set on pv3 - """ - return self.DAC.setVoltage('PV3', val) - - def set_pcs(self, val): - """ - Set programmable current source - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - val Output current on PCS. 0 to 3.3mA. Subject to load resistance. Read voltage on PCS to check. - ============== ============================================================================================ - - :return: value attempted to set on pcs - """ - return self.DAC.setCurrent(val) - - def get_pv1(self): - """ - get the last set voltage on PV1 - 12-bit DAC... -5V to 5V - """ - return self.DAC.getVoltage('PV1') - - def get_pv2(self): - return self.DAC.getVoltage('PV2') - - def get_pv3(self): - return self.DAC.getVoltage('PV3') - - def get_pcs(self): - return self.DAC.getVoltage('PCS') - - def WS2812B(self, cols, output='CS1'): - """ - set shade of WS2182 LED on SQR1 - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - cols 2Darray [[R,G,B],[R2,G2,B2],[R3,G3,B3]...] - brightness of R,G,B ( 0-255 ) - ============== ============================================================================================ - - example:: - - >>> I.WS2812B([[10,0,0],[0,10,10],[10,0,10]]) - #sets red, cyan, magenta to three daisy chained LEDs - - see :ref:`rgb_video` - - - """ - if output == 'CS1': - pin = CP.SET_RGB1 - elif output == 'CS2': - pin = CP.SET_RGB2 - elif output == 'SQR1': - pin = CP.SET_RGB3 - else: - print('invalid output') - return - - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(pin) - self.H.__sendByte__(len(cols) * 3) - for col in cols: - R = col[0] - G = col[1] - B = col[2] - self.H.__sendByte__(G) - self.H.__sendByte__(R) - self.H.__sendByte__(B) - self.H.__get_ack__() - - # -------------------------------------------------------------------------------------------------------------------# - - # |======================================READ PROGRAM AND DATA ADDRESSES=============================================| - # |Direct access to RAM and FLASH | - # -------------------------------------------------------------------------------------------------------------------# - - def read_program_address(self, address): - """ - Reads and returns the value stored at the specified address in program memory - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - address Address to read from. Refer to PIC24EP64GP204 programming manual - ============== ============================================================================================ - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.READ_PROGRAM_ADDRESS) - self.H.__sendInt__(address & 0xFFFF) - self.H.__sendInt__((address >> 16) & 0xFFFF) - v = self.H.__getInt__() - self.H.__get_ack__() - return v - - def device_id(self): - a = self.read_program_address(0x800FF8) - b = self.read_program_address(0x800FFa) - c = self.read_program_address(0x800FFc) - d = self.read_program_address(0x800FFe) - val = d | (c << 16) | (b << 32) | (a << 48) - self.__print__(a, b, c, d, hex(val)) - return val - - def __write_program_address__(self, address, value): - """ - Writes a value to the specified address in program memory. Disabled in firmware. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - address Address to write to. Refer to PIC24EP64GP204 programming manual - Do Not Screw around with this. It won't work anyway. - ============== ============================================================================================ - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.WRITE_PROGRAM_ADDRESS) - self.H.__sendInt__(address & 0xFFFF) - self.H.__sendInt__((address >> 16) & 0xFFFF) - self.H.__sendInt__(value) - self.H.__get_ack__() - - def read_data_address(self, address): - """ - Reads and returns the value stored at the specified address in RAM - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - address Address to read from. Refer to PIC24EP64GP204 programming manual| - ============== ============================================================================================ - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.READ_DATA_ADDRESS) - self.H.__sendInt__(address & 0xFFFF) - v = self.H.__getInt__() - self.H.__get_ack__() - return v - - def __write_data_address__(self, address, value): - """ - Writes a value to the specified address in RAM - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - address Address to write to. Refer to PIC24EP64GP204 programming manual| - ============== ============================================================================================ - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.WRITE_DATA_ADDRESS) - self.H.__sendInt__(address & 0xFFFF) - self.H.__sendInt__(value) - self.H.__get_ack__() - - # -------------------------------------------------------------------------------------------------------------------# - - # |==============================================MOTOR SIGNALLING====================================================| - # |Set servo motor angles via SQ1-4. Control one stepper motor using SQ1-4 | - # -------------------------------------------------------------------------------------------------------------------# - - def __stepperMotor__(self, steps, delay, direction): - self.H.__sendByte__(CP.NONSTANDARD_IO) - self.H.__sendByte__(CP.STEPPER_MOTOR) - self.H.__sendInt__((steps << 1) | direction) - self.H.__sendInt__(delay) - - time.sleep(steps * delay * 1e-3) # convert mS to S - - def stepForward(self, steps, delay): - """ - Control stepper motors using SQR1-4 - - take a fixed number of steps in the forward direction with a certain delay( in milliseconds ) between each step. - - """ - self.__stepperMotor__(steps, delay, 1) - - def stepBackward(self, steps, delay): - """ - Control stepper motors using SQR1-4 - - take a fixed number of steps in the backward direction with a certain delay( in milliseconds ) between each step. - - """ - self.__stepperMotor__(steps, delay, 0) - - def servo(self, angle, chan='SQR1'): - ''' - Output A PWM waveform on SQR1/SQR2 corresponding to the angle specified in the arguments. - This is used to operate servo motors. Tested with 9G SG-90 Servo motor. - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - angle 0-180. Angle corresponding to which the PWM waveform is generated. - chan 'SQR1' or 'SQR2'. Whether to use SQ1 or SQ2 to output the PWM waveform used by the servo - ============== ============================================================================================ - ''' - if chan == 'SQR1': - self.sqr1(100, 7.5 + 19. * angle / 180) # 100Hz - elif chan == 'SQR2': - self.sqr2(100, 7.5 + 19. * angle / 180) # 100Hz - - def servo4(self, a1, a2, a3, a4): - """ - Operate Four servo motors independently using SQR1, SQR2, SQR3, SQR4. - tested with SG-90 9G servos. - For high current servos, please use a different power source, and a level convertor for the PWm output signals(if needed) - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - a1 Angle to set on Servo which uses SQR1 as PWM input. [0-180] - a2 Angle to set on Servo which uses SQR2 as PWM input. [0-180] - a3 Angle to set on Servo which uses SQR3 as PWM input. [0-180] - a4 Angle to set on Servo which uses SQR4 as PWM input. [0-180] - ============== ============================================================================================ - - """ - params = (1 << 5) | 2 # continuous waveform. prescaler 2( 1:64) - self.H.__sendByte__(CP.WAVEGEN) - self.H.__sendByte__(CP.SQR4) - self.H.__sendInt__(10000) # 10mS wavelength - self.H.__sendInt__(750 + int(a1 * 1900 / 180)) - self.H.__sendInt__(0) - self.H.__sendInt__(750 + int(a2 * 1900 / 180)) - self.H.__sendInt__(0) - self.H.__sendInt__(750 + int(a3 * 1900 / 180)) - self.H.__sendInt__(0) - self.H.__sendInt__(750 + int(a4 * 1900 / 180)) - self.H.__sendByte__(params) - self.H.__get_ack__() - - def enableUartPassthrough(self, baudrate, persist=False): - ''' - All data received by the device is relayed to an external port(SCL[TX],SDA[RX]) after this function is called - - If a period > .5 seconds elapses between two transmit/receive events, the device resets - and resumes normal mode. This timeout feature has been implemented in lieu of a hard reset option. - can be used to load programs into secondary microcontrollers with bootloaders such ATMEGA, and ESP8266 - - - .. tabularcolumns:: |p{3cm}|p{11cm}| - - ============== ============================================================================================ - **Arguments** - ============== ============================================================================================ - baudrate BAUDRATE to use - persist If set to True, the device will stay in passthrough mode until the next power cycle. - Otherwise(default scenario), the device will return to normal operation if no data is sent/ - received for a period greater than one second at a time. - ============== ============================================================================================ - ''' - self.H.__sendByte__(CP.PASSTHROUGHS) - self.H.__sendByte__(CP.PASS_UART) - self.H.__sendByte__(1 if persist else 0) - self.H.__sendInt__(int(round(((64e6 / baudrate) / 4) - 1))) - self.__print__('BRGVAL:', int(round(((64e6 / baudrate) / 4) - 1))) - time.sleep(0.1) - self.__print__('junk bytes read:', len(self.H.fd.read(100))) - - def estimateDistance(self): - ''' - - Read data from ultrasonic distance sensor HC-SR04/HC-SR05. Sensors must have separate trigger and output pins. - First a 10uS pulse is output on SQR1. SQR1 must be connected to the TRIG pin on the sensor prior to use. - - Upon receiving this pulse, the sensor emits a sequence of sound pulses, and the logic level of its output - pin(which we will monitor via ID1) is also set high. The logic level goes LOW when the sound packet - returns to the sensor, or when a timeout occurs. - - The ultrasound sensor outputs a series of 8 sound pulses at 40KHz which corresponds to a time period - of 25uS per pulse. These pulses reflect off of the nearest object in front of the sensor, and return to it. - The time between sending and receiving of the pulse packet is used to estimate the distance. - If the reflecting object is either too far away or absorbs sound, less than 8 pulses may be received, and this - can cause a measurement error of 25uS which corresponds to 8mm. - - Ensure 5V supply. You may set SQR2 to HIGH [ I.set_state(SQR2=True) ] , and use that as the power supply. - - returns 0 upon timeout - ''' - self.H.__sendByte__(CP.NONSTANDARD_IO) - self.H.__sendByte__(CP.HCSR04_HEADER) - - timeout_msb = int((0.3 * 64e6)) >> 16 - self.H.__sendInt__(timeout_msb) - - A = self.H.__getLong__() - B = self.H.__getLong__() - tmt = self.H.__getInt__() - self.H.__get_ack__() - if (tmt >= timeout_msb or B == 0): return 0 - rtime = lambda t: t / 64e6 - return 330. * rtime(B - A + 20) / 2. - - """ - def TemperatureAndHumidity(self): - ''' - init AM2302. - This effort was a waste. There are better humidity and temperature sensors available which use well documented I2C - ''' - self.H.__sendByte__(CP.NONSTANDARD_IO) - self.H.__sendByte__(CP.AM2302_HEADER) - - self.H.__get_ack__() - self.digital_channels_in_buffer=1 - """ - - def opticalArray(self, SS, delay, channel='CH3', **kwargs): - ''' - read from 3648 element optical sensor array TCD3648P from Toshiba. Experimental feature. - Neither Sine waves will be available. - Connect SQR1 to MS , SQR2 to MS , A0 to CHannel , and CS1(on the expansion slot) to ICG - - delay : ICG low duration - tp : clock wavelength=tp*15nS, SS=clock/4 - - ''' - samples = 3694 - res = kwargs.get('resolution', 10) - tweak = kwargs.get('tweak', 1) - chosa = self.oscilloscope.channels[channel].chosa - - self.H.__sendByte__(CP.NONSTANDARD_IO) - self.H.__sendByte__(CP.TCD1304_HEADER) - if res == 10: - self.oscilloscope.channels[channel].resolution = 10 - self.H.__sendByte__(chosa) # 10-bit - else: - self.oscilloscope.channels[channel].resolution = 12 - self.H.__sendByte__(chosa | 0x80) # 12-bit - self.H.__sendByte__(tweak) # Tweak the SH low to ICG high space. =tweak*delay - self.H.__sendInt__(delay) - self.H.__sendInt__(int(SS * 64)) - self.timebase = SS - self.samples = samples - self.channels_in_buffer = 1 - time.sleep(2 * delay * 1e-6) - self.H.__get_ack__() - - def setUARTBAUD(self, BAUD): - self.H.__sendByte__(CP.UART_2) - self.H.__sendByte__(CP.SET_BAUD) - self.H.__sendInt__(int(round(((64e6 / BAUD) / 4) - 1))) - self.__print__('BRG2VAL:', int(round(((64e6 / BAUD) / 4) - 1))) - self.H.__get_ack__() - - def writeUART(self, character): - self.H.__sendByte__(CP.UART_2) - self.H.__sendByte__(CP.SEND_BYTE) - self.H.__sendByte__(character) - self.H.__get_ack__() - - def readUART(self): - self.H.__sendByte__(CP.UART_2) - self.H.__sendByte__(CP.READ_BYTE) - return self.H.__getByte__() - - def readUARTStatus(self): - ''' - return available bytes in UART buffer - ''' - self.H.__sendByte__(CP.UART_2) - self.H.__sendByte__(CP.READ_UART2_STATUS) - return self.H.__getByte__() - - def readLog(self): - """ - read hardware debug log. - """ - self.H.__sendByte__(CP.COMMON) - self.H.__sendByte__(CP.READ_LOG) - log = self.H.fd.readline().strip() - self.H.__get_ack__() - return log diff --git a/README.md b/README.md index c113a2b7..f94a1c0f 100644 --- a/README.md +++ b/README.md @@ -2,92 +2,65 @@ The Python library for the [Pocket Science Lab](https://pslab.io) from FOSSASIA. -[![Build Status](https://travis-ci.org/fossasia/pslab-python.svg?branch=development)](https://travis-ci.org/fossasia/pslab-python) +[![Build Status](https://github.com/fossasia/pslab-python/actions/workflows/workflow.yml/badge.svg)](https://github.com/fossasia/pslab-python/actions/workflows/workflow.yml) [![Gitter](https://badges.gitter.im/fossasia/pslab.svg)](https://gitter.im/fossasia/pslab?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ce4af216571846308f66da4b7f26efc7)](https://www.codacy.com/app/mb/pslab-python?utm_source=github.com&utm_medium=referral&utm_content=fossasia/pslab&utm_campaign=Badge_Grade) [![Mailing List](https://img.shields.io/badge/Mailing%20List-FOSSASIA-blue.svg)](https://groups.google.com/forum/#!forum/pslab-fossasia) [![Twitter Follow](https://img.shields.io/twitter/follow/pslabio.svg?style=social&label=Follow&maxAge=2592000?style=flat-square)](https://twitter.com/pslabio) -This repository hosts the python library for communicating with the Pocket Science Lab open hardware platform (PSLab). This can be installed on a Linux or Windows system. Using this library you can communicate with the PSLab using simple Python code. The Python library is also used in the PSLab desktop application as a backend component. The goal of PSLab is to create an Open Source hardware device (open on all layers) and software applications that can be used for experiments by teachers, students and scientists. Our tiny pocket lab provides an array of instruments for doing science and engineering experiments. It provides functions of numerous measurement tools including an oscilloscope, a waveform generator, a frequency counter, a programmable voltage, current source and even a component to control robots with up to four servos. The website is at: https://pslab.io +This repository hosts the Python library for communicating with the Pocket Science Lab open hardware platform (PSLab). Using this library you can communicate with the PSLab using simple Python code. The Python library is also used by the PSLab GUI as a backend component. + +The goal of PSLab is to create an Open Source hardware device (open on all layers) and software applications that can be used for experiments by teachers, students and scientists. Our tiny pocket lab provides an array of instruments for doing science and engineering experiments. It provides functions of numerous measurement tools including an oscilloscope, a waveform generator, a logic analyzer, a programmable voltage and current source, and even a component to control robots with up to four servos. + +For more information see [https://pslab.io](https://pslab.io). ## Buy * You can get a Pocket Science Lab device from the [FOSSASIA Shop](https://fossasia.com). * More resellers are listed on the [PSLab website](https://pslab.io/shop/). -## Communication - -* The PSLab [chat channel is on Gitter](https://gitter.im/fossasia/pslab). -* Please also join us on the [PSLab Mailing List](https://groups.google.com/forum/#!forum/pslab-fossasia). - ## Installation -To install PSLab on Debian based GNU/Linux system, the following dependencies must be installed. - -### Dependencies - -* Python 3.6 or higher [Link to Official download page](https://www.python.org/downloads/windows/) -* Pip   **Support package installer** -* NumPy   **For numerical calculations** -* PySerial   **For device connection** -* iPython-qtconsole   **_Optional_** - -**Note**: If you are only interested in using PSLab as an acquisition device without a display/GUI, only one repository [pslab-python](https://github.com/fossasia/pslab-python) needs to be installed. If you like a GUI, install the [pslab-desktop app](https://github.com/fossasia/pslab-desktop) and follow the instructions of the Readme in that repo. +pslab-python can be installed from PyPI: -### How To Install on Linux + $ pip install pslab -As root (or with sudo): +**Note**: Linux users must either install a udev rule by running 'pslab install' as root, or be part of the 'dialout' group in order for pslab-python to be able to communicate with the PSLab device. - # pip install git+https://github.com/fossasia/pslab-python@master +**Note**: Windows users who use the PSLab v6 device must download and install the CP210x Windows Drivers from the [Silicon Labs website](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads) in order for pslab-python to be able to communicate with the PSLab device. -Done! +**Note**: If you are only interested in using PSLab as an acquisition device without a display/GUI, only pslab-python needs to be installed. If you would like a GUI, install the [pslab-desktop app](https://github.com/fossasia/pslab-desktop) and follow the instructions of the Readme in that repo. -### How to Install on Windows -**Step 1**: Install the latest Python version on your computer and configure `PATH` variable to have both Python installation directory and the Scripts directory to access `pip` tools. In Windows, Python is installed in `C:` drive by default. We can set `$PATH` by opening the **Environment variables** dialog box by following the steps below: +## Validate installation -1. [Right click on My Computer] -2. Select "Properties" -3. Open "System Properties" -4. Click "Advanced" tab -5. Click "Environment Variables" button -6. Look for "**_PATH_**" in "System Variables" section and click on it and press "Edit" button -7. To the end of "Variable value" text box, append "`C:\Python34\;C:\Python34\Scripts\;`" (without quotes and `34` may differ depending on the python version installed. It could be 35, 37 ...) -8. Click "OK" twice to save and move out from path windows - -**Step 2**: Open up command prompt and execute the following commands to install the required dependencies. - - $ pip install pyserial - $ pip install numpy - -#### Validate - -1. Download the PSLab-Python library from this repository and extract it to a directory. -2. Browse in to that directory and create a new file named `test-pslab-libs.py` -3. Paste the following code into that file and save it. +1. Plug in the PSLab device and check that both the LEDs light up. +2. The following piece of code should run without errors: ``` -from PSL import sciencelab -I = sciencelab.connect() -capacitance = I.get_capacitance() +from pslab import ScienceLab +psl = ScienceLab() +capacitance = psl.multimeter.measure_capacitance() print(capacitance) ``` -4. Plug in the PSLab device and check if both the LEDs are turned on. -5. Now run this file by typing `python test-pslab-libs.py` on a command prompt and observe a numerical value printed on the screen along with PSLab device version and the port it is connected to. -### How to Setup the Development Environment +## Communication + +* If you encounter any bugs, please file them in our [issue tracker](https://github.com/fossasia/pslab-python/issues). +* You can chat with the PSLab developers on [Gitter](https://gitter.im/fossasia/pslab). +* There is also a [mailing list](https://groups.google.com/forum/#!forum/pslab-fossasia). -To set up the development environment, install the packages mentioned in dependencies. For building GUI's you can use Qt Designer or create a frontend using any other compatible technology. The PSLab desktop app is using Electron for example. +Wherever we interact, we strive to follow the [FOSSASIA Code of Conduct](https://fossasia.org/coc/). -## How to Build the Documentation Website +## Contributing -First install sphinx by running following command +See [CONTRIBUTING.md](https://github.com/fossasia/pslab-python/blob/development/CONTRIBUTING.md) to get started. - pip install -U Sphinx +## License -Then go to pslab/docs and run the following command +Copyright (C) 2014-2021 FOSSASIA - $ make html +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -## License +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -The library is free and open source software licensed under the [GPL v3](LICENSE). The copyright is owned by FOSSASIA. +You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/doc-requirements.txt b/doc-requirements.txt new file mode 100644 index 00000000..2ff3af24 --- /dev/null +++ b/doc-requirements.txt @@ -0,0 +1 @@ +recommonmark \ No newline at end of file diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 120000 index 00000000..44fcc634 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1 @@ +../CONTRIBUTING.md \ No newline at end of file diff --git a/docs/PSL.SENSORS.rst b/docs/PSL.SENSORS.rst deleted file mode 100644 index 44c2ed52..00000000 --- a/docs/PSL.SENSORS.rst +++ /dev/null @@ -1,126 +0,0 @@ -PSL.SENSORS package -=================== - -Submodules ----------- - -PSL.SENSORS.AD7718_class module -------------------------------- - -.. automodule:: PSL.SENSORS.AD7718_class - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.AD9833 module -------------------------- - -.. automodule:: PSL.SENSORS.AD9833 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.BH1750 module -------------------------- - -.. automodule:: PSL.SENSORS.BH1750 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.BMP180 module -------------------------- - -.. automodule:: PSL.SENSORS.BMP180 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.ComplementaryFilter module --------------------------------------- - -.. automodule:: PSL.SENSORS.ComplementaryFilter - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.HMC5883L module ---------------------------- - -.. automodule:: PSL.SENSORS.HMC5883L - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.Kalman module -------------------------- - -.. automodule:: PSL.SENSORS.Kalman - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.MF522 module ------------------------- - -.. automodule:: PSL.SENSORS.MF522 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.MLX90614 module ---------------------------- - -.. automodule:: PSL.SENSORS.MLX90614 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.MPU6050 module --------------------------- - -.. automodule:: PSL.SENSORS.MPU6050 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.SHT21 module ------------------------- - -.. automodule:: PSL.SENSORS.SHT21 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.SSD1306 module --------------------------- - -.. automodule:: PSL.SENSORS.SSD1306 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.TSL2561 module --------------------------- - -.. automodule:: PSL.SENSORS.TSL2561 - :members: - :undoc-members: - :show-inheritance: - -PSL.SENSORS.supported module ----------------------------- - -.. automodule:: PSL.SENSORS.supported - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: PSL.SENSORS - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/PSL.rst b/docs/PSL.rst deleted file mode 100644 index 3b708840..00000000 --- a/docs/PSL.rst +++ /dev/null @@ -1,85 +0,0 @@ -PSLab@FOSSASIA package ------------- - -Subpackages ------------ - -.. toctree:: - - PSL.SENSORS - -Submodules ----------- - -PSL.Peripherals module ------------------------ - -.. automodule:: PSL.Peripherals - :members: - :undoc-members: - :show-inheritance: - -PSL.achan module ------------------ - -.. automodule:: PSL.achan - :members: - :undoc-members: - :show-inheritance: - -PSL.analyticsClass module --------------------------- - -.. automodule:: PSL.analyticsClass - :members: - :undoc-members: - :show-inheritance: - -PSL.commands_proto module --------------------------- - -.. automodule:: PSL.commands_proto - :members: - :undoc-members: - :show-inheritance: - -PSL.digital_channel module ---------------------------- - -.. automodule:: PSL.digital_channel - :members: - :undoc-members: - :show-inheritance: - -PSL.sciencelab module ---------------------- - -.. automodule:: PSL.sciencelab - :members: - :undoc-members: - :show-inheritance: - -PSL.packet_handler module --------------------------- - -.. automodule:: PSL.packet_handler - :members: - :undoc-members: - :show-inheritance: - -PSL.sensorlist module ----------------------- - -.. automodule:: PSL.sensorlist - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: PSL - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 00000000..faa1347c --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,18 @@ +Library API +=========== + +.. toctree:: + :maxdepth: 1 + + bus + external + instrument + internal + +ScienceLab +---------- + +.. automodule:: pslab.sciencelab + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/bus.rst b/docs/bus.rst new file mode 100644 index 00000000..ec6d046d --- /dev/null +++ b/docs/bus.rst @@ -0,0 +1,16 @@ +Bus +=== + +.. automodule:: pslab.bus + :members: + :undoc-members: + :show-inheritance: + + +I2C +--- + +.. automodule:: pslab.bus.i2c + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/cli.rst b/docs/cli.rst new file mode 100644 index 00000000..0635cc48 --- /dev/null +++ b/docs/cli.rst @@ -0,0 +1,7 @@ +Command Line Interface +====================== + +.. automodule:: pslab.cli + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 063669e1..3b3420db 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # # PSLab documentation build configuration file, created by -# sphinx-quickstart +# sphinx-quickstart # # This file is execfile()d with the current directory set to its # containing dir. @@ -35,6 +35,8 @@ 'sphinx.ext.todo', 'sphinx.ext.viewcode', 'sphinx.ext.mathjax', + 'sphinx.ext.napoleon', + 'recommonmark', ] mathjax_path = 'file:///usr/share/javascript/mathjax/MathJax.js' @@ -45,7 +47,7 @@ # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ['.rst', '-md'] # The encoding of source files. # source_encoding = 'utf-8-sig' @@ -54,18 +56,18 @@ master_doc = 'index' # General information about the project. -project = u'FOSSASIA PSLab' -copyright = u'2016, Praveen Patil, Jithin BP' -author = u' Praveen Patil, Jithin BP' +project = u'pslab-python' +copyright = u'2021, FOSSASIA' +author = u'FOSSASIA Developers' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = u'1.0' +version = u'2.0' # The full version, including alpha/beta/rc tags. -release = u'1.0.5' +release = u'2.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -146,7 +148,7 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +# html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -209,7 +211,7 @@ # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'SEELdoc' +htmlhelp_basename = 'pslab-python-doc' # -- Options for LaTeX output --------------------------------------------- @@ -231,8 +233,8 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'PSL.tex', u'PSL Documentation', - u'Praveen Patil, Jithin BP', 'manual'), + (master_doc, 'pslab-python.tex', u'pslab-python documentation', + u'FOSSASIA Developers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -261,7 +263,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'psl', u'PSL Documentation', + (master_doc, 'pslab-python', u'pslab-python documentation', [author], 1) ] @@ -275,8 +277,8 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'PSL', u'PSL Documentation', - author, 'PSL', 'One line description of project.', + (master_doc, 'pslab-python', u'pslab-python documentation', + author, 'pslab-python', 'One line description of project.', 'Miscellaneous'), ] diff --git a/docs/external.rst b/docs/external.rst new file mode 100644 index 00000000..f5b9ed9c --- /dev/null +++ b/docs/external.rst @@ -0,0 +1,15 @@ +External devices +================ + +.. automodule:: pslab.external + :members: + :undoc-members: + :show-inheritance: + +motor +----- + +.. automodule:: pslab.external.motor + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/images/IMG_20160618_011156_HDR.jpg b/docs/images/IMG_20160618_011156_HDR.jpg deleted file mode 100644 index 8ba281d1..00000000 Binary files a/docs/images/IMG_20160618_011156_HDR.jpg and /dev/null differ diff --git a/docs/images/SplashNotConnected.png b/docs/images/SplashNotConnected.png deleted file mode 100644 index 9a67e223..00000000 Binary files a/docs/images/SplashNotConnected.png and /dev/null differ diff --git a/docs/images/advanced controls.png b/docs/images/advanced controls.png deleted file mode 100644 index 41ca9b9b..00000000 Binary files a/docs/images/advanced controls.png and /dev/null differ diff --git a/docs/images/controlPanelNotConnected.png b/docs/images/controlPanelNotConnected.png deleted file mode 100644 index 38fc5b84..00000000 Binary files a/docs/images/controlPanelNotConnected.png and /dev/null differ diff --git a/docs/images/controlpanel.png b/docs/images/controlpanel.png deleted file mode 100644 index d1d73a04..00000000 Binary files a/docs/images/controlpanel.png and /dev/null differ diff --git a/docs/images/datastreaming.png b/docs/images/datastreaming.png deleted file mode 100644 index fa20f656..00000000 Binary files a/docs/images/datastreaming.png and /dev/null differ diff --git a/docs/images/lissajous1.png b/docs/images/lissajous1.png deleted file mode 100644 index 0b77ccbf..00000000 Binary files a/docs/images/lissajous1.png and /dev/null differ diff --git a/docs/images/lissajous2.png b/docs/images/lissajous2.png deleted file mode 100644 index 1483c087..00000000 Binary files a/docs/images/lissajous2.png and /dev/null differ diff --git a/docs/images/logicanalyzer.png b/docs/images/logicanalyzer.png deleted file mode 100644 index 4e63151d..00000000 Binary files a/docs/images/logicanalyzer.png and /dev/null differ diff --git a/docs/images/psl2.jpg b/docs/images/psl2.jpg deleted file mode 100644 index 306a0076..00000000 Binary files a/docs/images/psl2.jpg and /dev/null differ diff --git a/docs/images/pslab.png b/docs/images/pslab.png deleted file mode 100644 index 008cea20..00000000 Binary files a/docs/images/pslab.png and /dev/null differ diff --git a/docs/images/pslab.svg b/docs/images/pslab.svg deleted file mode 100644 index 9b1fc80e..00000000 --- a/docs/images/pslab.svg +++ /dev/null @@ -1,854 +0,0 @@ - - - -image/svg+xmlhttp://fossasia.orghttp://fossasia.orgPSLab -Pocket Science Lab From FOSSASIA -http://pslab.fossasia.org - \ No newline at end of file diff --git a/docs/images/pslaboscilloscope.png b/docs/images/pslaboscilloscope.png deleted file mode 100644 index dd45cfdc..00000000 Binary files a/docs/images/pslaboscilloscope.png and /dev/null differ diff --git a/docs/images/pslpcb.jpg b/docs/images/pslpcb.jpg deleted file mode 100644 index cd89a7e0..00000000 Binary files a/docs/images/pslpcb.jpg and /dev/null differ diff --git a/docs/images/sensordataloger.png b/docs/images/sensordataloger.png deleted file mode 100644 index 643b49cf..00000000 Binary files a/docs/images/sensordataloger.png and /dev/null differ diff --git a/docs/images/sinewaveonoscilloscope.png b/docs/images/sinewaveonoscilloscope.png deleted file mode 100644 index 1cc8d8d7..00000000 Binary files a/docs/images/sinewaveonoscilloscope.png and /dev/null differ diff --git a/docs/images/splash.png b/docs/images/splash.png deleted file mode 100644 index 05fb401f..00000000 Binary files a/docs/images/splash.png and /dev/null differ diff --git a/docs/images/squarewave.png b/docs/images/squarewave.png deleted file mode 100644 index d4c0a63a..00000000 Binary files a/docs/images/squarewave.png and /dev/null differ diff --git a/docs/images/wiki_images/lubuntu_logo.png b/docs/images/wiki_images/lubuntu_logo.png deleted file mode 100644 index 1db7dd4f..00000000 Binary files a/docs/images/wiki_images/lubuntu_logo.png and /dev/null differ diff --git a/docs/images/wiki_images/ubuntu_logo.png b/docs/images/wiki_images/ubuntu_logo.png deleted file mode 100644 index 203291a8..00000000 Binary files a/docs/images/wiki_images/ubuntu_logo.png and /dev/null differ diff --git a/docs/images/wiki_images/window_logo.png b/docs/images/wiki_images/window_logo.png deleted file mode 100644 index e8b2fcc8..00000000 Binary files a/docs/images/wiki_images/window_logo.png and /dev/null differ diff --git a/docs/images/wiki_images/xubuntu_logo.png b/docs/images/wiki_images/xubuntu_logo.png deleted file mode 100644 index 84de4517..00000000 Binary files a/docs/images/wiki_images/xubuntu_logo.png and /dev/null differ diff --git a/docs/images/wirelesssensordataloger.png b/docs/images/wirelesssensordataloger.png deleted file mode 100644 index 9ffe242a..00000000 Binary files a/docs/images/wirelesssensordataloger.png and /dev/null differ diff --git a/docs/images/with fossasia logo sticker .jpg b/docs/images/with fossasia logo sticker .jpg deleted file mode 100644 index 405b3562..00000000 Binary files a/docs/images/with fossasia logo sticker .jpg and /dev/null differ diff --git a/docs/index.rst b/docs/index.rst index ba4949b8..ad382937 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2,20 +2,22 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to PSLab's documentation! -================================ +pslab-python +============ + +The pslab-python library provides a high-level interface for controlling a +PSLab device over a serial connection using Python. Contents: .. toctree:: :maxdepth: 4 - PSL.interface - PSL.Peripherals.I2C_class - PSL.Peripherals.SPI_class - PSL.Peripherals.MCP4728_class - PSL.Peripherals.NRF24L01_class - PSL.Peripherals.NRF_NODE + installation + api + cli + protocol + Contributing Indices and tables diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 00000000..c239cba2 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,21 @@ +Installation +============ + +``pslab-python`` can be installed from PyPI: +:: + + $ pip install pslab + +**Note:** Linux users must additionally install a udev rules file for +pslab-python to be able to communicate with the PSLab device. The file +[99-pslab.rules](https://github.com/fossasia/pslab-python/blob/development/99-pslab.rules) +should be copied to /etc/udev/rules.d/. + +**Note**: pslab-python does not provide a graphical user interface. If you want +a GUI, install the [pslab-desktop app](https://github.com/fossasia/pslab-desktop). + +Dependencies +------------ + +``pslab-python`` requires `Python `__ version +3.6 or later. \ No newline at end of file diff --git a/docs/instrument.rst b/docs/instrument.rst new file mode 100644 index 00000000..b2e3335f --- /dev/null +++ b/docs/instrument.rst @@ -0,0 +1,55 @@ +Instrument +========== + +.. automodule:: pslab.instrument + :members: + :undoc-members: + :show-inheritance: + +LogicAnalyzer +------------- + +.. autoclass:: pslab.instrument.logic_analyzer.LogicAnalyzer + :members: + :undoc-members: + :show-inheritance: + +Multimeter +---------- + +.. autoclass:: pslab.instrument.multimeter.Multimeter + :members: + :undoc-members: + :show-inheritance: + +Oscilloscope +------------ + +.. autoclass:: pslab.instrument.oscilloscope.Oscilloscope + :members: + :undoc-members: + :show-inheritance: + +PowerSupply +----------- + +.. autoclass:: pslab.instrument.power_supply.PowerSupply + :members: + :undoc-members: + :show-inheritance: + +PWMGenerator +------------ + +.. autoclass:: pslab.instrument.waveform_generator.PWMGenerator + :members: + :undoc-members: + :show-inheritance: + +WaveformGenerator +----------------- + +.. autoclass:: pslab.instrument.waveform_generator.WaveformGenerator + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/internal.rst b/docs/internal.rst new file mode 100644 index 00000000..13d59590 --- /dev/null +++ b/docs/internal.rst @@ -0,0 +1,47 @@ +Internal API +============ + +Classes which regular users should not need to use directly are documented +here. + +Serial handler +--------------- + +.. automodule:: pslab.serial_handler + :members: + :undoc-members: + :show-inheritance: + +Analog channels +--------------- + +.. automodule:: pslab.instrument.analog + :members: + :undoc-members: + :show-inheritance: + +Digital channels +---------------- + +.. automodule:: pslab.instrument.digital + :members: + :undoc-members: + :show-inheritance: + +Sources +------- + +.. autoclass:: pslab.instrument.power_supply.Source + :members: + :undoc-members: + :show-inheritance: + +.. autoclass:: pslab.instrument.power_supply.VoltageSource + :members: + :undoc-members: + :show-inheritance: + +.. autoclass:: pslab.instrument.power_supply.CurrentSource + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/protocol.rst b/docs/protocol.rst new file mode 100644 index 00000000..0ce51adb --- /dev/null +++ b/docs/protocol.rst @@ -0,0 +1,7 @@ +Serial protocol +=============== + +.. automodule:: pslab.protocol + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/lint-requirements.txt b/lint-requirements.txt new file mode 100644 index 00000000..2bb38d5c --- /dev/null +++ b/lint-requirements.txt @@ -0,0 +1,4 @@ +black>=18.9b0 +flake8>=3.6.0 +pydocstyle>=2.1.1 +bandit>=1.5.1 diff --git a/pslab/99-pslab.rules b/pslab/99-pslab.rules new file mode 100644 index 00000000..e09d90d6 --- /dev/null +++ b/pslab/99-pslab.rules @@ -0,0 +1,4 @@ +# PSLab v5 +ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00df", MODE="666" +# PSLab v6 +ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="666" diff --git a/pslab/__init__.py b/pslab/__init__.py new file mode 100644 index 00000000..fde015c0 --- /dev/null +++ b/pslab/__init__.py @@ -0,0 +1,20 @@ +"""Pocket Science Lab by FOSSASIA.""" + +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.multimeter import Multimeter +from pslab.instrument.oscilloscope import Oscilloscope +from pslab.instrument.power_supply import PowerSupply +from pslab.instrument.waveform_generator import PWMGenerator, WaveformGenerator +from pslab.sciencelab import ScienceLab + +__all__ = ( + "LogicAnalyzer", + "Multimeter", + "Oscilloscope", + "PowerSupply", + "PWMGenerator", + "WaveformGenerator", + "ScienceLab", +) + +__version__ = "4.0.1" diff --git a/pslab/bus/__init__.py b/pslab/bus/__init__.py new file mode 100644 index 00000000..a2354728 --- /dev/null +++ b/pslab/bus/__init__.py @@ -0,0 +1,31 @@ +"""Contains modules for interfacing with the PSLab's I2C, SPI, and UART buses.""" + +import sys + + +class classmethod_(classmethod): + """Support chaining classmethod and property.""" + + def __init__(self, f): + self.f = f + super().__init__(f) + + def __get__(self, obj, cls=None): + # classmethod() to support chained decorators; new in python 3.9. + if sys.version_info < (3, 9) and isinstance(self.f, property): + return self.f.__get__(cls) + else: + return super().__get__(obj, cls) + + +from pslab.bus.i2c import I2CMaster, I2CSlave # noqa: E402 +from pslab.bus.spi import SPIMaster, SPISlave # noqa: E402 +from pslab.bus.uart import UART # noqa: E402 + +__all__ = ( + "I2CMaster", + "I2CSlave", + "SPIMaster", + "SPISlave", + "UART", +) diff --git a/pslab/bus/busio.py b/pslab/bus/busio.py new file mode 100644 index 00000000..97771dca --- /dev/null +++ b/pslab/bus/busio.py @@ -0,0 +1,592 @@ +"""Circuitpython's busio compatibility layer for pslab-python. + +This module emulates the CircuitPython's busio API for devices or hosts running +CPython or MicroPython using pslab-python. +This helps to access many sensors using Adafruit's drivers via PSLab board. + +Notes +----- +Documentation: + https://circuitpython.readthedocs.io/en/6.3.x/shared-bindings/busio/index.html + +Examples +-------- +Get humidity from Si7021 temperature and humidity sensor using adafruit_si7021 module. + +>>> import adafruit_si7021 +>>> from pslab.bus import busio # import board, busio +>>> i2c = busio.I2C() # i2c = busio.I2C(board.SCL, board.SDA) +>>> sensor = adafruit_si7021.SI7021(i2c) +>>> print(sensor.relative_humidity) + +Get gyro reading from BNO055 using adafruit_bno055, board(just a wrapper for busio). + +>>> import adafruit_bno055 +>>> from pslab.bus import busio # import board +>>> i2c = busio.I2C() # i2c = board.I2C() +>>> sensor = adafruit_bno055.BNO055_I2C(i2c) +>>> print(sensor.gyro) +""" + +import time +from enum import Enum +from itertools import zip_longest +from typing import List, Union, Optional + +from pslab.bus.i2c import _I2CPrimitive +from pslab.bus.spi import _SPIPrimitive +from pslab.bus.uart import _UARTPrimitive +from pslab.connection import ConnectionHandler + +__all__ = ( + "I2C", + "SPI", + "UART", +) +ReadableBuffer = Union[bytes, bytearray, memoryview] +WriteableBuffer = Union[bytearray, memoryview] + + +class I2C(_I2CPrimitive): + """Busio I2C Class for CircuitPython Compatibility. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + frequency : float, optional + Frequency of SCL in Hz. + """ + + def __init__( + self, + device: ConnectionHandler | None = None, + *, + frequency: int = 125e3, + ): + # 125 kHz is as low as the PSLab can go. + super().__init__(device) + self._init() + self._configure(frequency) + + def deinit(self) -> None: + """Just a dummy method.""" + pass + + def __enter__(self): + """Just a dummy context manager.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: + """Call :meth:`deinit` on context exit.""" + self.deinit() + + def scan(self) -> List[int]: + """Scan all I2C addresses between 0x08 and 0x77 inclusive. + + Returns + ------- + addrs : list of int + List of 7-bit addresses on which slave devices replied. + """ + return self._scan(0x08, 0x77) + + def try_lock(self) -> bool: # pylint: disable=no-self-use + """Just a dummy method.""" + return True + + def unlock(self) -> None: + """Just a dummy method.""" + pass + + def readfrom_into( + self, address: int, buffer: WriteableBuffer, *, start: int = 0, end: int = None + ) -> None: + """Read from a device at specified address into a buffer. + + Parameters + ---------- + address : int + 7-bit I2C device address. + buffer : bytearray or memoryview + buffer to write into. + start : int + Index to start writing at. + end : int + Index to write up to but not include. Defaults to length of `buffer`. + """ + end = len(buffer) if end is None else end + bytes_to_read = end - start + self._start(address, 1) + buffer[start:end] = self._read(bytes_to_read) + self._stop() + + def writeto( + self, + address: int, + buffer: ReadableBuffer, + *, + start: int = 0, + end: int = None, + stop: bool = True, + ) -> None: + """Write to a device at specified address from a buffer. + + Parameters + ---------- + address : int + 7-bit I2C device address. + buffer : bytes or bytearray or memoryview + buffer containing the bytes to write. + start : int + Index to start writing from. + end : int + Index to read up to but not include. Defaults to length of `buffer`. + stop : bool + Enable to transmit a stop bit. Defaults to True. + """ + end = len(buffer) if end is None else end + + if stop: + self._write_bulk(address, buffer[start:end]) + else: + self._start(address, 0) + self._send(buffer[start:end]) + + def writeto_then_readfrom( + self, + address: int, + buffer_out: ReadableBuffer, + buffer_in: WriteableBuffer, + *, + out_start: int = 0, + out_end: int = None, + in_start: int = 0, + in_end: int = None, + ): + """Write to then read from a device at specified address. + + Parameters + ---------- + address : int + 7-bit I2C device address. + out_buffer : bytes or bytearray or memoryview + buffer containing the bytes to write. + in_buffer : bytearray or memoryview + buffer to write into. + out_start : int + Index to start writing from. + out_end : int + Index to read up to but not include. Defaults to length of `out_buffer`. + in_start : int + Index to start writing at. + in_end : int + Index to write up to but not include. Defaults to length of `in_buffer`. + """ + out_end = len(buffer_out) if out_end is None else out_end + in_end = len(buffer_in) if in_end is None else in_end + bytes_to_read = in_end - in_start + self._start(address, 0) + self._send(buffer_out[out_start:out_end]) + self._restart(address, 1) + buffer_in[in_start:in_end] = self._read(bytes_to_read) + self._stop() + + +class SPI(_SPIPrimitive): + """Busio SPI Class for CircuitPython Compatibility. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + """ + + def __init__(self, device: ConnectionHandler | None = None): + super().__init__(device) + ppre, spre = self._get_prescaler(25e4) + self._set_parameters(ppre, spre, 1, 0, 1) + self._bits = 8 + + @property + def frequency(self) -> int: + """Get the actual SPI bus frequency (rounded). + + This may not match the frequency requested due to internal limitations. + """ + return round(self._frequency) + + def deinit(self) -> None: + """Just a dummy method.""" + pass + + def __enter__(self): + """Just a dummy context manager.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: + """Call :meth:`deinit` on context exit.""" + self.deinit() + + def configure( + self, + *, + baudrate: int = 100000, + polarity: int = 0, + phase: int = 0, + bits: int = 8, + ) -> None: + """Configure the SPI bus. + + Parameters + ---------- + baudrate : int + The desired clock rate in Hertz. The actual clock rate may be + higher or lower due to the granularity of available clock settings. + Check the frequency attribute for the actual clock rate. + polarity : int + The base state of the clock line (0 or 1) + phase : int + The edge of the clock that data is captured. First (0) or second (1). + Rising or falling depends on clock polarity. + bits : int + The number of bits per word. + """ + if polarity not in (0, 1): + raise ValueError("Invalid polarity") + if phase not in (0, 1): + raise ValueError("Invalid phase") + if bits not in self._INTEGER_TYPE_MAP: + raise ValueError("Invalid number of bits") + + ppre, spre = self._get_prescaler(baudrate) + cke = (phase ^ 1) & 1 + self._set_parameters(ppre, spre, cke, polarity, 1) + self._bits = bits + + def try_lock(self) -> bool: # pylint: disable=no-self-use + """Just a dummy method.""" + return True + + def unlock(self) -> None: + """Just a dummy method.""" + pass + + def write( + self, + buffer: Union[ReadableBuffer, List[int]], + *, + start: int = 0, + end: int = None, + ) -> None: + """Write the data contained in buffer. If the buffer is empty, nothing happens. + + Parameters + ---------- + buffer : bytes or bytearray or memoryview or list_of_int (for bits >8) + Write out the data in this buffer. + start : int + Start of the slice of `buffer` to write out: `buffer[start:end]`. + end : int + End of the slice; this index is not included. Defaults to `len(buffer)`. + """ + end = len(buffer) if end is None else end + buffer = buffer[start:end] + + if not buffer: + return + + self._start() + self._write_bulk(buffer, self._bits) + self._stop() + + def readinto( + self, + buffer: Union[WriteableBuffer, List[int]], + *, + start: int = 0, + end: int = None, + write_value: int = 0, + ) -> None: + """Read into `buffer` while writing `write_value` for each byte read. + + If the number of bytes to read is 0, nothing happens. + + Parameters + ---------- + buffer : bytearray or memoryview or list_of_int (for bits >8) + Read data into this buffer. + start : int + Start of the slice of `buffer` to read into: `buffer[start:end]`. + end : int + End of the slice; this index is not included. Defaults to `len(buffer)`. + write_value : int + Value to write while reading. (Usually ignored.) + """ + end = len(buffer) if end is None else end + bytes_to_read = end - start + + if bytes_to_read == 0: + return + + self._start() + data = self._transfer_bulk([write_value] * bytes_to_read, self._bits) + self._stop() + + for i, v in zip(range(start, end), data): + buffer[i] = v + + def write_readinto( + self, + buffer_out: Union[ReadableBuffer, List[int]], + buffer_in: Union[WriteableBuffer, List[int]], + *, + out_start: int = 0, + out_end: int = None, + in_start: int = 0, + in_end: int = None, + ): + """Write out the data in buffer_out while simultaneously read into buffer_in. + + The lengths of the slices defined by buffer_out[out_start:out_end] and + buffer_in[in_start:in_end] must be equal. If buffer slice lengths are both 0, + nothing happens. + + Parameters + ---------- + buffer_out : bytes or bytearray or memoryview or list_of_int (for bits >8) + Write out the data in this buffer. + buffer_in : bytearray or memoryview or list_of_int (for bits >8) + Read data into this buffer. + out_start : int + Start of the slice of `buffer_out` to write out: + `buffer_out[out_start:out_end]`. + out_end : int + End of the slice; this index is not included. Defaults to `len(buffer_out)` + in_start : int + Start of the slice of `buffer_in` to read into:`buffer_in[in_start:in_end]` + in_end : int + End of the slice; this index is not included. Defaults to `len(buffer_in)` + """ + out_end = len(buffer_out) if out_end is None else out_end + in_end = len(buffer_in) if in_end is None else in_end + buffer_out = buffer_out[out_start:out_end] + bytes_to_read = in_end - in_start + + if len(buffer_out) != bytes_to_read: + raise ValueError("buffer slices must be of equal length") + if bytes_to_read == 0: + return + + self._start() + data = self._transfer_bulk(buffer_out, self._bits) + self._stop() + + for i, v in zip(range(in_start, in_end), data): + buffer_in[i] = v + + +class Parity(Enum): + EVEN = 1 + ODD = 2 + + +class UART(_UARTPrimitive): + """Busio UART Class for CircuitPython Compatibility. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + baudrate : int, optional + The transmit and receive speed. Defaults to 9600. + bits : int, optional + The number of bits per byte, 8 or 9. Defaults to 8 bits. + parity : :class:`Parity`, optional + The parity used for error checking. Defaults to None. + Only 8 bits per byte supports parity. + stop : int, optional + The number of stop bits, 1 or 2. Defaults to 1. + timeout : float, optional + The timeout in seconds to wait for the first character and between + subsequent characters when reading. Defaults to 1. + """ + + def __init__( + self, + device: ConnectionHandler | None = None, + *, + baudrate: int = 9600, + bits: int = 8, + parity: Parity = None, + stop: int = 1, + timeout: float = 1, + ): + super().__init__(device) + self._set_uart_baud(baudrate) + + if bits == 8: + pd = 0 + elif bits == 9: + pd = 3 + else: + raise ValueError("Invalid number of bits") + + if bits == 9 and parity is not None: + raise ValueError("Invalid parity") + if stop not in (1, 2): + raise ValueError("Invalid number of stop bits") + + pd += parity.value + + try: + self._set_uart_mode(pd, stop - 1) + except RuntimeError: + pass + + self._timeout = timeout + + @property + def baudrate(self): + """Get the current baudrate.""" + return self._baudrate + + @property + def in_waiting(self): + """Get the number of bytes in the input buffer, available to be read. + + PSLab is limited to check, whether at least one byte in the buffer(1) or not(0). + """ + return self._read_uart_status() + + @property + def timeout(self): + """Get the current timeout, in seconds (float).""" + return self._timeout + + def deinit(self) -> None: + """Just a dummy method.""" + pass + + def __enter__(self): + """Just a dummy context manager.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: + """Call :meth:`deinit` on context exit.""" + self.deinit() + + def _read_with_timeout(self, nbytes: int = None, *, line=False): + if nbytes == 0: + return None + + start_time = time.time() + data = bytearray() + total_read = 0 + + while (time.time() - start_time) <= self._timeout: + has_char = self._read_uart_status() + if has_char: + char = self._read_byte() + start_time = time.time() + + if line and char == 0xA: + break + + data.append(char) + total_read += 1 + + if nbytes and total_read == nbytes: + break + + time.sleep(0.01) + + return bytes(data) if data else None + + def read(self, nbytes: int = None) -> Optional[bytes]: + """Read characters. + + If `nbytes` is specified then read at most that many bytes. Otherwise, + read everything that arrives until the connection times out. + + Providing the number of bytes expected is highly recommended because + it will be faster. + + Parameters + ---------- + nbytes : int, optional + Number of bytes to read. Defaults to None. + + Returns + ------- + bytes or None + Data read. + """ + return self._read_with_timeout(nbytes) + + def readinto(self, buf: WriteableBuffer) -> int: + """Read bytes into the `buf`. Read at most `len(buf)` bytes. + + Parameters + ---------- + buf : bytearray or memoryview + Read data into this buffer. + + Returns + ------- + int + Number of bytes read and stored into `buf`. + """ + nbytes = len(buf) + data = self._read_with_timeout(nbytes) + + if data is None: + return 0 + else: + nbuf = len(data) + + for i, c in zip(range(nbuf), data): + buf[i] = c + + return nbuf + + def readline(self) -> Optional[bytes]: + """Read a line, ending in a newline character. + + return None if a timeout occurs sooner, or return everything readable + if no newline is found within timeout. + + Returns + ------- + bytes or None + Data read. + """ + return self._read_with_timeout(None, line=True) + + def write(self, buf: ReadableBuffer) -> int: + """Write the buffer of bytes to the bus. + + Parameters + ---------- + buf : bytes or bytearray or memoryview + Write out the char in this buffer. + + Returns + ------- + int + Number of bytes written. + """ + written = 0 + + for msb, lsb in zip_longest(buf[1::2], buf[::2]): + if msb is not None: + self._write_int((msb << 8) | lsb) + written += 2 + else: + self._write_byte(lsb) + written += 1 + + return written diff --git a/pslab/bus/i2c.py b/pslab/bus/i2c.py new file mode 100644 index 00000000..dd9b792b --- /dev/null +++ b/pslab/bus/i2c.py @@ -0,0 +1,665 @@ +"""Control the PSLab's I2C bus and devices connected on the bus. + +Examples +-------- +Set I2C bus speed to 400 kbit/s: + +>>> from pslab.bus.i2c import I2CMaster, I2CSlave +>>> bus = I2CMaster() +>>> bus.configure(frequency=4e5) + +Scan for connected devices: + +>>> bus.scan() +[96, 104] + +Connect to the PSLab's built-in DS1307 RTC: + +>>> rtc = I2CSlave(address=104) +""" + +import logging +from typing import List + +import pslab.protocol as CP +from pslab.connection import ConnectionHandler, autoconnect +from pslab.external.sensorlist import sensors + +__all__ = ( + "I2CMaster", + "I2CSlave", +) +logger = logging.getLogger(__name__) + + +class _I2CPrimitive: + """I2C primitive commands. + + Handles all the I2C subcommands coded in pslab-firmware. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + """ + + _MIN_BRGVAL = 2 + _MAX_BRGVAL = 511 + + # Specs say typical delay is 110 ns to 130 ns; 150 ns from testing. + _SCL_DELAY = 150e-9 + + _ACK = 0 + _READ = 1 + _WRITE = 0 + + def __init__(self, device: ConnectionHandler | None = None): + self._device = device if device is not None else autoconnect() + self._running = False + self._mode = None + + def _init(self): + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_INIT) + self._device.get_ack() + + def _configure(self, frequency: float): + """Configure bus frequency. + + Parameters + ---------- + frequency : float + Frequency of SCL in Hz. + + Raises + ------ + ValueError + If given frequency is not supported by PSLab board. + """ + brgval = self._get_i2c_brgval(frequency) + + if self._MIN_BRGVAL <= brgval <= self._MAX_BRGVAL: + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_CONFIG) + self._device.send_int(brgval) + self._device.get_ack() + else: + min_frequency = self._get_i2c_frequency(self._MAX_BRGVAL) + max_frequency = self._get_i2c_frequency(self._MIN_BRGVAL) + e = f"Frequency must be between {min_frequency} and {max_frequency} Hz." + raise ValueError(e) + + @classmethod + def _get_i2c_brgval(cls, frequency: float) -> int: + return int((1 / frequency - cls._SCL_DELAY) * CP.CLOCK_RATE - 2) + + @classmethod + def _get_i2c_frequency(cls, brgval: int) -> float: + return 1 / ((brgval + 2) / CP.CLOCK_RATE + cls._SCL_DELAY) + + def _scan(self, start: int = 1, end: int = 128) -> List[int]: + """Scan I2C port for connected devices. + + Parameters + ---------- + start : int + Address to start scaning at. Defaults to 1(0 is the general call address). + end : int + Address to scan up to. Defaults to 128. + + Returns + ------- + addrs : list of int + List of 7-bit addresses on which slave devices replied. + """ + addrs = [] + + for address in range(start, end): + slave = I2CSlave(address, self._device) + + if slave.ping(): + addrs.append(address) + + return addrs + + def _start(self, address: int, mode: int) -> int: + """Initiate I2C transfer. + + Parameters + ---------- + address : int + 7-bit I2C device address. + mode : {0, 1} + 0: write + 1: read + + Returns + ------- + ackstat : int + ACK (0) or NACK (1) from addressed peripheral. + """ + if self._mode is not None: + msg = ( + f"An I2C transaction is already active on peripheral 0x{address:X}. " + "Use _restart instead." + ) + raise RuntimeError(msg) + + self._device.send_byte(CP.I2C_HEADER) + secondary = CP.I2C_START if not self._running else CP.I2C_RESTART + self._device.send_byte(secondary) + self._device.send_byte((address << 1) | mode) + response = self._device.get_ack() + ackstat = response >> 4 + self._running = True + self._mode = mode + + return ackstat + + def _restart(self, address: int, mode: int) -> int: + """Send repeated start. + + Reinitiate I2C transfer without stoping. + + Parameters + ---------- + address : int + 7-bit I2C device address. + mode : {0, 1} + 0: write + 1: read + + Returns + ------- + ackstat : int + ACK (0) or NACK (1) from addressed peripheral. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_RESTART) + self._device.send_byte((address << 1) | mode) + response = self._device.get_ack() + ackstat = response >> 4 + self._running = True + self._mode = mode + + return ackstat + + def _stop(self): + """Stop I2C transfer.""" + if self._running or self._mode: + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_STOP) + self._device.get_ack() + self._running = False + self._mode = None + + def _wait(self): + """Wait for I2C.""" + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_WAIT) + self._device.get_ack() + + @property + def _status(self): + """int: Contents of the I2C2STAT register. + + bit 15 ACKSTAT: Acknowledge Status + 1 = NACK received from slave. + 0 = ACK received from slave. + bit 14 TRSTAT: Transmit Status + 1 = Master transmit is in progress (8 bits + ACK). + 0 = Master transmit is not in progress. + bit 10 BCL: Bus Collision Detect + 1 = A bus collision has been detected. + 0 = No collision. + bit 7 IWCOL: I2C Write Collision Detect + 1 = An attempt to write to the I2C2TRN register failed because + the I2C module is busy. + 0 = No collision. + bit 6 I2COV: I2C Receive Overflow Flag + 1 = A byte is received while the I2C2RCV register is still + holding the previous byte. + 0 = No overflow. + bit 4 P: Stop + 1 = Indicates that a Stop bit has been detected last. + 0 = Stop bit was not detected last. + bit 3 S: Start + 1 = Indicates that a Start (or Repeated Start) bit has been + detected last. + 0 = Start bit was not detected last. + bit 1 RBF: Receive Buffer Full Status + 1 = Receive completes; the I2C2RCV register is full. + 0 = Receive is not complete; the I2C2RCV register is empty. + bit 0 TBF: Transmit Buffer Full Status + 1 = Transmit is in progress; the I2C2TRN register is full. + 0 = Transmit completes; the I2C2TRN register is empty. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_STATUS) + status = self._device.get_int() + self._device.get_ack() + + return status + + def _send_byte(self, data: int) -> int: + """Send data over I2C. + + The I2C bus needs to be initialized and set to the correct slave address first. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Parameters + ---------- + data : int + An integer that fits in a uint8. + + Returns + ------- + response : int + Response from I2C slave device. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_SEND) + self._device.send_byte(data) # data byte + response = self._device.get_ack() >> 4 # ACKSTAT + + return response + + def _send_byte_burst(self, data: int): + """Send data over I2C. + + The function does not wait for the I2C to finish before returning. + It is used for sending large packets quickly. + + The I2C bus needs to be initialized and set to the correct slave address first. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Parameters + ---------- + data : int + An integer that fits in a uint8. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_SEND_BURST) + self._device.send_byte(data) # data byte + # No handshake. for the sake of speed. + # e.g. loading a frame buffer onto an I2C display such as ssd1306 + + def _send(self, bytes_to_write: bytearray): + """Send data over I2C. + + This method uses :meth:`_send_byte_burst` to send all the bytes quickly. + + The I2C bus needs to be initialized and set to the correct slave address first. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Parameters + ---------- + bytes_to_write : bytearray + Send data as a bytearray. + """ + for byte in bytes_to_write: + self._send_byte_burst(byte) + + def _write_bulk(self, address: int, bytes_to_write: bytearray): + """Write data to I2C slave. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Parameters + ---------- + address : int + 7-bit I2C device address. + bytes_to_write : bytearray + Write data as a bytearray. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_WRITE_BULK) + self._device.send_byte(address) + self._device.send_byte(len(bytes_to_write)) + + for byte in bytes_to_write: + self._device.send_byte(byte) + + self._device.get_ack() + + def _read_more(self) -> int: + """Read data from I2C then send ACK. + + The I2C bus needs to be initialized and set to the correct slave address first. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Returns + ------- + data : int + A byte interpreted as a uint8. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_READ_MORE) + data = self._device.get_byte() + self._device.get_ack() + + return data + + def _read_end(self) -> int: + """Read data from I2C then send NACK. + + The I2C bus needs to be initialized and set to the correct slave address first. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Returns + ------- + data : int + A byte interpreted as a uint8. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_READ_END) + data = self._device.get_byte() + self._device.get_ack() + + return data + + def _read(self, bytes_to_read: int) -> bytearray: + """Read data from I2C. + + The I2C bus needs to be initialized and set to the correct slave address first. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Parameters + ---------- + bytes_to_read : int + Number of bytes to read from I2C. + + Returns + ------- + data : bytearray + Read data as a bytearray. + """ + data = bytearray() + + for _ in range(bytes_to_read - 1): + data.append(self._read_more()) + + data.append(self._read_end()) + + return data + + def _read_bulk( + self, address: int, bytes_to_read: int, register_address: int = 0x0 + ) -> bytearray: + """Read data from I2C device. + + This method relies on the slave device auto incrementing its internal + pointer after each read. Most devices do, but it is not part of the + I2C standard. Refer to the device's documentation. + + It is a primitive I2C method, prefered to use :meth:`I2CSlave.read` and + :meth:`I2CSlave.write`. + + Parameters + ---------- + address : int + 7-bit I2C device address. + bytes_to_read : int + Number of bytes to read from slave device. + register_address : int, optional + Slave device internal memory address to read from. The default + value is 0x0. + + Returns + ------- + data : bytearray + Read data as a bytearray. + """ + self._device.send_byte(CP.I2C_HEADER) + self._device.send_byte(CP.I2C_READ_BULK) + self._device.send_byte(address) + self._device.send_byte(register_address) + self._device.send_byte(bytes_to_read) + data = self._device.read(bytes_to_read) + self._device.get_ack() + + return bytearray(data) + + +class I2CMaster(_I2CPrimitive): + """I2C bus controller. + + Handles slave independent functionality with the I2C port. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + """ + + def __init__(self, device: ConnectionHandler | None = None): + super().__init__(device) + self._init() + self.configure(125e3) # 125 kHz is as low as the PSLab can go. + + def configure(self, frequency: float): + """Configure bus frequency. + + Parameters + ---------- + frequency : float + Frequency of SCL in Hz. + + Raises + ------ + ValueError + If given frequency is not supported by PSLab board. + """ + self._configure(frequency) + + def scan(self) -> List[int]: + """Scan I2C port for connected devices. + + Returns + ------- + addrs : list of int + List of 7-bit addresses on which slave devices replied. + """ + addrs = self._scan(1, 128) + + for address in addrs: + logger.info( + f"Response from slave on {hex(address)} " + + f"({sensors.get(address, 'None')})." + ) + + return addrs + + +class I2CSlave(_I2CPrimitive): + """I2C slave device. + + Parameters + ---------- + address : int + 7-bit I2C device address. + device : :class:`SerialHandler`, optional + Serial interface for communicating with the PSLab device. If not + provided, a new one will be created. + + Attributes + ---------- + address : int + 7-bit I2C device address. + """ + + def __init__( + self, + address: int, + device: ConnectionHandler | None = None, + ): + super().__init__(device) + self.address = address + + def ping(self) -> bool: + """Ping the I2C slave. + + Returns + ------- + response : bool + True is slave responded, False otherwise. + """ + response = self._start(self.address, self._WRITE) + self._stop() + + return response == self._ACK + + def read(self, bytes_to_read: int, register_address: int = 0x0) -> bytearray: + """Read data from I2C device. + + This method relies on the slave device auto incrementing its internal + pointer after each read. Most devices do, but it is not part of the + I2C standard. Refer to the device's documentation. + + If the slave device does not auto increment, use one of + :meth:`read_byte`, :meth:`read_int`, or :meth:`read_long` instead, + depending on how wide the device registers are. + + Parameters + ---------- + bytes_to_read : int + Number of bytes to read from slave device. + register_address : int, optional + Slave device internal memory address to read from. The default + value is 0x0. + + Returns + ------- + data : bytearray + Read data as a bytearray. + """ + return self._read_bulk(self.address, bytes_to_read, register_address) + + def read_byte(self, register_address: int = 0x0) -> int: + """Read a single byte from the I2C slave. + + Parameters + ---------- + register_address : int, optional + Slave device internal memory address to read from. The default + value is 0x0. + + Returns + ------- + data : int + A byte interpreted as a uint8. + """ + return self.read(1, register_address)[0] + + def read_int(self, register_address: int = 0x0) -> int: + """Read a two byte value from the I2C slave. + + Parameters + ---------- + register_address : int, optional + Slave device internal memory address to read from. The default + value is 0x0. + + Returns + ------- + data : int + Two bytes interpreted as a uint16. + """ + data = self.read(2, register_address) + + return CP.ShortInt.unpack(data)[0] + + def read_long(self, register_address: int = 0x0) -> int: + """Read a four byte value from the I2C slave. + + Parameters + ---------- + register_address : int, optional + Slave device internal memory address to read from. The default + value is 0x0. + + Returns + ------- + data : int + Four bytes interpreted as a uint32. + """ + data = self.read(4, register_address) + + return CP.Integer.unpack(data)[0] + + def write(self, bytes_to_write: bytearray, register_address: int = 0x0): + """Write data to I2C slave. + + This method relies on the slave device auto incrementing its internal + pointer after each write. Most devices do, but it is not part of the + I2C standard. Refer to the device's documentation. + + If the slave device does not auto increment, use one of + :meth:`write_byte`, :meth:`write_int`, or :meth:`write_long` instead, + depending on how wide the device registers are. + + Parameters + ---------- + bytes_to_write : bytearray + Data to write to the slave. + register_address : int, optional + Slave device internal memory address to write to. The default + value is 0x0. + """ + register_address = bytearray(CP.Byte.pack(register_address)) + bytes_to_write = bytearray(bytes_to_write) + self._write_bulk(self.address, register_address + bytes_to_write) + + def write_byte(self, data: int, register_address: int = 0x0): + """Write a single byte to the I2C slave. + + Parameters + ---------- + data : int + An integer that fits in a uint8. + register_address : int, optional + Slave device internal memory address to write to. The default + value is 0x0. + """ + self.write(CP.Byte.pack(data), register_address) + + def write_int(self, data: int, register_address: int = 0x0): + """Write a two byte value to the I2C slave. + + Parameters + ---------- + data : int + An integer that fits in a uint16. + register_address : int, optional + Slave device internal memory address to write to. The default + value is 0x0. + """ + self.write(CP.ShortInt.pack(data), register_address) + + def write_long(self, data: int, register_address: int = 0x0): + """Write a four byte value to the I2C slave. + + Parameters + ---------- + data : int + An integer that fits in a uint32. + register_address : int, optional + Slave device internal memory address to write to. The default + value is 0x0. + """ + self.write(CP.Integer.pack(data), register_address) diff --git a/pslab/bus/spi.py b/pslab/bus/spi.py new file mode 100644 index 00000000..ad885ceb --- /dev/null +++ b/pslab/bus/spi.py @@ -0,0 +1,678 @@ +"""Control the PSLab's SPI bus and devices connected on the bus. + +Examples +-------- +Set SPI bus speed to 200 kbit/s: + +>>> from pslab.bus.spi import SPIMaster, SPISlave +>>> bus = SPIMaster() +>>> bus.set_parameters(primary_prescaler=0, secondary_prescaler=3) # 64e6/(64*5) + +Set SPI bus to mode 3 (1,1): + +>>> bus.set_parameters(0, 3, CKE=0, CKP=1) + +Transfer a random byte over SPI: + +>>> slave = SPISlave() +>>> slave.transfer8(0x55) +0 +""" + +from typing import List, Tuple + +import pslab.protocol as CP +from pslab.bus import classmethod_ +from pslab.connection import ConnectionHandler, autoconnect + +__all__ = ( + "SPIMaster", + "SPISlave", +) +# Default values, refer pslab-firmware. +_PPRE = 0 +_SPRE = 2 +# SPI mode 0 (0,0) +_CKP = 0 # Clock Polarity 0 +_CKE = 1 # Clock Phase 0 | Clock Edge 1 +_SMP = 1 + + +class _SPIPrimitive: + """SPI primitive commands. + + Handles all the SPI subcommands coded in pslab-firmware. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + """ + + _TRANSFER_COMMANDS_MAP = { + 8: CP.SEND_SPI8, + 16: CP.SEND_SPI16, + } # PSLab only supports 8 and 16 bits. + _INTEGER_TYPE_MAP = { + 8: CP.Byte, + 16: CP.ShortInt, + } # Keys in `_INTEGER_TYPE_MAP` should match `_TRANSFER_COMMANDS_MAP`. + _PPRE_MAP = [64, 16, 4, 1] + _SPRE_MAP = [8, 7, 6, 5, 4, 3, 2, 1] + + _primary_prescaler = _PPRE + _secondary_prescaler = _SPRE + _clock_polarity = _CKP # Clock Polarity bit. + _clock_edge = _CKE # Clock Edge Select bit (inverse of Clock Phase bit). + _smp = _SMP # Data Input Sample Phase bit. + + def __init__(self, device: ConnectionHandler | None = None): + self._device = device if device is not None else autoconnect() + + @classmethod_ + @property + def _frequency(cls) -> float: + ppre = cls._PPRE_MAP[cls._primary_prescaler] + spre = cls._SPRE_MAP[cls._secondary_prescaler] + + return CP.CLOCK_RATE / (ppre * spre) + + @classmethod_ + @property + def _clock_phase(cls) -> int: + return (cls._clock_edge ^ 1) & 1 + + @classmethod + def _get_prescaler(cls, frequency: float) -> Tuple[int]: + min_diff = CP.CLOCK_RATE # highest + # minimum frequency + ppre = 0 + spre = 0 + + for p in range(len(cls._PPRE_MAP)): + for s in range(len(cls._SPRE_MAP)): + freq = CP.CLOCK_RATE / (cls._PPRE_MAP[p] * cls._SPRE_MAP[s]) + if frequency >= freq: + diff = frequency - freq + if min_diff > diff: + # better match + min_diff = diff + ppre = p + spre = s + + return ppre, spre + + @staticmethod + def _save_config( + primary_prescaler: int, + secondary_prescaler: int, + CKE: int, + CKP: int, + SMP: int, + ): + """Save the SPI parameters. + + See Also + -------- + _set_parameters : To set SPI parameters. + """ + _SPIPrimitive._primary_prescaler = primary_prescaler + _SPIPrimitive._secondary_prescaler = secondary_prescaler + _SPIPrimitive._clock_edge = CKE + _SPIPrimitive._clock_polarity = CKP + _SPIPrimitive._smp = SMP + + def _set_parameters( + self, + primary_prescaler: int, + secondary_prescaler: int, + CKE: int, + CKP: int, + SMP: int, + ): + """Set SPI parameters. + + It is a primitive SPI method, prefered to use :meth:`SPIMaster.set_parameters`. + + Parameters + ---------- + primary_prescaler : {0, 1, 2, 3} + Primary Prescaler for system clock :const:`CP.CLOCK_RATE`Hz. + (0,1,2,3) -> (64:1,16:1,4:1,1:1). + secondary_prescaler : {0, 1, 2, 3, 4, 5, 6, 7} + Secondary prescaler (0,1,..7) -> (8:1,7:1,..1:1). + CKE : {0, 1} + SPIx Clock Edge Select bit. Serial output data changes on transition + {0: from Idle clock state to active clock state, + 1: from active clock state to Idle clock state}. + CKP : {0, 1} + Clock Polarity Select bit. + Idle state for clock is a {0: low, 1: high} level. + SMP : {0, 1} + Input data is sampled at the {0: end, 1: middle} of data output time. + + Raises + ------ + ValueError + If any one of arguments is not in its shown range. + """ + error_message = [] + if primary_prescaler not in range(0, 4): + error_message.append("Primary Prescaler must be in 2-bits.") + if secondary_prescaler not in range(0, 8): + error_message.append("Secondary Prescale must be in 3-bits.") + if CKE not in (0, 1): + error_message.append("Clock Edge Select must be a bit.") + if CKP not in (0, 1): + error_message.append("Clock Polarity must be a bit.") + if SMP not in (0, 1): + error_message.append("SMP must be a bit.") + if error_message: + raise ValueError("\n".join(error_message)) + + self._device.send_byte(CP.SPI_HEADER) + self._device.send_byte(CP.SET_SPI_PARAMETERS) + # 0Bhgfedcba - > : modebit CKP,: modebit CKE, :primary prescaler, + # :secondary prescaler + self._device.send_int( + secondary_prescaler + | (primary_prescaler << 3) + | (CKE << 5) + | (CKP << 6) + | (SMP << 7) + ) + self._device.get_ack() + self._save_config(primary_prescaler, secondary_prescaler, CKE, CKP, SMP) + + @classmethod + def _get_parameters(cls) -> Tuple[int]: + """Get SPI parameters. + + Returns + ------- + primary_prescaler : {0, 1, 2, 3} + Primary Prescaler for system clock :const:`CP.CLOCK_RATE`Hz. + (0,1,2,3) -> (64:1,16:1,4:1,1:1). + secondary_prescaler : {0, 1, 2, 3, 4, 5, 6, 7} + Secondary prescaler (0,1,..7) -> (8:1,7:1,..1:1). + CKE : {0, 1} + SPIx Clock Edge Select bit. Serial output data changes on transition + {0: from Idle clock state to active clock state, + 1: from active clock state to Idle clock state}. + CKP : {0, 1} + Clock Polarity Select bit. + Idle state for clock is a {0: low, 1: high} level. + SMP : {0, 1} + Input data is sampled at the {0: end, 1: middle} of data output time. + """ + return ( + cls._primary_prescaler, + cls._secondary_prescaler, + cls._clock_edge, + cls._clock_polarity, + cls._smp, + ) + + def _start(self): + """Select SPI channel to enable. + + Basically sets the relevant chip select pin to LOW. + + External ChipSelect pins: + version < 5 : {6, 7} # RC5, RC4 (dropped support) + version == 5 : {} (don't have any external CS pins) + version == 6 : {7} # RC4 + """ + self._device.send_byte(CP.SPI_HEADER) + self._device.send_byte(CP.START_SPI) + self._device.send_byte(7) # SPI.CS v6 + # No ACK because `RESPONSE == DO_NOT_BOTHER` in firmware. + + def _stop(self): + """Select SPI channel to disable. + + Sets the relevant chip select pin to HIGH. + """ + self._device.send_byte(CP.SPI_HEADER) + self._device.send_byte(CP.STOP_SPI) + self._device.send_byte(7) # SPI.CS v6 + + def _transfer(self, data: int, bits: int) -> int: + """Send data over SPI and receive data from SPI simultaneously. + + Relevent SPI channel need to be enabled first. + + It is a primitive SPI method, prefered to use :meth:`SPISlave.transfer8` + and :meth:`SPISlave.transfer16`. + + Parameters + ---------- + data : int + Data to transmit. + bits : int + The number of bits per word. + + Returns + ------- + data_in : int + Data returned by slave device. + + Raises + ------ + ValueError + If given bits per word not supported by PSLab board. + """ + command = self._TRANSFER_COMMANDS_MAP.get(bits) + interger_type = self._INTEGER_TYPE_MAP.get(bits) + + if not command: + raise ValueError( + f"PSLab only supports {set(self._TRANSFER_COMMANDS_MAP.keys())}" + + " bits per word." + ) + + self._device.send_byte(CP.SPI_HEADER) + self._device.send_byte(command) + self._device.write(interger_type.pack(data)) + data_in = interger_type.unpack(self._device.read(bits))[0] + self._device.get_ack() + + return data_in + + def _transfer_bulk(self, data: List[int], bits: int) -> List[int]: + """Transfer data array over SPI. + + Relevent SPI channel need to be enabled first. + + It is a primitive SPI method, prefered to use :meth:`SPISlave.transfer8_bulk` + and :meth:`SPISlave.transfer16_bulk`. + + Parameters + ---------- + data : list of int + List of data to transmit. + bits : int + The number of bits per word. + + Returns + ------- + data_in : list of int + List of data returned by slave device. + + Raises + ------ + ValueError + If given bits per word not supported by PSLab board. + """ + data_in = [] + + for a in data: + data_in.append(self._transfer(a, bits)) + + return data_in + + def _read(self, bits: int) -> int: + """Read data while transmit zero. + + Relevent SPI channel need to be enabled first. + + It is a primitive SPI method, prefered to use :meth:`SPISlave.read8` + and :meth:`SPISlave.read16`. + + Parameters + ---------- + bits : int + The number of bits per word. + + Returns + ------- + int + Data returned by slave device. + + Raises + ------ + ValueError + If given bits per word not supported by PSLab board. + """ + return self._transfer(0, bits) + + def _read_bulk(self, data_to_read: int, bits: int) -> List[int]: + """Read data array while transmitting zeros. + + Relevent SPI channel need to be enabled first. + + It is a primitive SPI method, prefered to use :meth:`SPISlave.read8_bulk` + and :meth:`SPISlave.read16_bulk`. + + Parameters + ---------- + data_to_read : int + Number of data to read from slave device. + bits : int + The number of bits per word. + + Returns + ------- + list of int + List of data returned by slave device. + + Raises + ------ + ValueError + If given bits per word not supported by PSLab board. + """ + return self._transfer_bulk([0] * data_to_read, bits) + + def _write(self, data: int, bits: int): + """Send data over SPI. + + Relevent SPI channel need to be enabled first. + + It is a primitive SPI method, prefered to use :meth:`SPISlave.write8` + and :meth:`SPISlave.write16`. + + Parameters + ---------- + data : int + Data to transmit. + bits : int + The number of bits per word. + + Raises + ------ + ValueError + If given bits per word not supported by PSLab board. + """ + self._transfer(data, bits) + + def _write_bulk(self, data: List[int], bits: int): + """Send data array over SPI. + + Relevent SPI channel need to be enabled first. + + It is a primitive SPI method, prefered to use :meth:`SPISlave.write8_bulk` + and :meth:`SPISlave.write16_bulk`. + + Parameters + ---------- + data : list of int + List of data to transmit. + bits : int + The number of bits per word. + + Raises + ------ + ValueError + If given bits per word not supported by PSLab board. + """ + self._transfer_bulk(data, bits) + + +class SPIMaster(_SPIPrimitive): + """SPI bus controller. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + """ + + def __init__(self, device: ConnectionHandler | None = None): + super().__init__(device) + # Reset config + self.set_parameters() + + def set_parameters( + self, + primary_prescaler: int = _PPRE, + secondary_prescaler: int = _SPRE, + CKE: int = _CKE, + CKP: int = _CKP, + SMP: int = _SMP, + ): + """Set SPI parameters. + + Parameters + ---------- + primary_prescaler : {0, 1, 2, 3} + Primary Prescaler for system clock :const:`CP.CLOCK_RATE`Hz. + (0,1,2,3) -> (64:1,16:1,4:1,1:1). + secondary_prescaler : {0, 1, 2, 3, 4, 5, 6, 7} + Secondary prescaler (0,1,..7) -> (8:1,7:1,..1:1). + CKE : {0, 1} + SPIx Clock Edge Select bit. Serial output data changes on transition + {0: from Idle clock state to active clock state, + 1: from active clock state to Idle clock state}. + CKP : {0, 1} + Clock Polarity Select bit. + Idle state for clock is a {0: low, 1: high} level. + SMP : {0, 1} + Input data is sampled at the {0: end, 1: middle} of data output time. + + Raises + ------ + ValueError + If any one of arguments is not in its shown range. + """ + self._set_parameters(primary_prescaler, secondary_prescaler, CKE, CKP, SMP) + + @classmethod + def get_parameters(cls) -> Tuple[int]: + """Get SPI parameters. + + Returns + ------- + primary_prescaler : {0, 1, 2, 3} + Primary Prescaler for system clock :const:`CP.CLOCK_RATE`Hz. + (0,1,2,3) -> (64:1,16:1,4:1,1:1). + secondary_prescaler : {0, 1, 2, 3, 4, 5, 6, 7} + Secondary prescaler (0,1,..7) -> (8:1,7:1,..1:1). + CKE : {0, 1} + SPIx Clock Edge Select bit. Serial output data changes on transition + {0: from Idle clock state to active clock state, + 1: from active clock state to Idle clock state}. + CKP : {0, 1} + Clock Polarity Select bit. + Idle state for clock is a {0: low, 1: high} level. + SMP : {0, 1} + Input data is sampled at the {0: end, 1: middle} of data output time. + """ + return cls._get_parameters() + + +class SPISlave(_SPIPrimitive): + """SPI slave device. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + """ + + def __init__(self, device: ConnectionHandler | None = None): + super().__init__(device) + + def transfer8(self, data: int) -> int: + """Send 8-bit data over SPI and receive 8-bit data from SPI simultaneously. + + Parameters + ---------- + data : int + Data to transmit. + + Returns + ------- + data_in : int + Data returned by slave device. + """ + self._start() + data_in = self._transfer(data, 8) + self._stop() + + return data_in + + def transfer16(self, data: int) -> int: + """Send 16-bit data over SPI and receive 16-bit data from SPI simultaneously. + + Parameters + ---------- + data : int + Data to transmit. + + Returns + ------- + data_in : int + Data returned by slave device. + """ + self._start() + data_in = self._transfer(data, 16) + self._stop() + + return data_in + + def transfer8_bulk(self, data: List[int]) -> List[int]: + """Transfer 8-bit data array over SPI. + + Parameters + ---------- + data : list of int + List of 8-bit data to transmit. + + Returns + ------- + data_in : list of int + List of 8-bit data returned by slave device. + """ + self._start() + data_in = self._transfer_bulk(data, 8) + self._stop() + + return data_in + + def transfer16_bulk(self, data: List[int]) -> List[int]: + """Transfer 16-bit data array over SPI. + + Parameters + ---------- + data : list of int + List of 16-bit data to transmit. + + Returns + ------- + data_in : list of int + List of 16-bit data returned by slave device. + """ + self._start() + data_in = self._transfer_bulk(data, 16) + self._stop() + + return data_in + + def read8(self) -> int: + """Read 8-bit data while transmit zero. + + Returns + ------- + int + Data returned by slave device. + """ + self._start() + data_in = self._read(8) + self._stop() + + return data_in + + def read16(self) -> int: + """Read 16-bit data while transmit zero. + + Returns + ------- + int + Data returned by slave device. + """ + self._start() + data_in = self._read(16) + self._stop() + + return data_in + + def read8_bulk(self, data_to_read: int) -> List[int]: + """Read 8-bit data array while transmitting zeros. + + Parameters + ---------- + data_to_read : int + Number of 8-bit data to read from slave device. + + Returns + ------- + list of int + List of 8-bit data returned by slave device. + """ + self._start() + data_in = self._read_bulk(data_to_read, 8) + self._stop() + + return data_in + + def read16_bulk(self, data_to_read: int) -> List[int]: + """Read 16-bit data array while transmitting zeros. + + Parameters + ---------- + data_to_read : int + Number of 16-bit data to read from slave device. + + Returns + ------- + list of int + List of 16-bit date returned by slave device. + """ + self._start() + data_in = self._read_bulk(data_to_read, 16) + self._stop() + + return data_in + + def write8(self, data: int): + """Send 8-bit data over SPI. + + Parameters + ---------- + data : int + Data to transmit. + """ + self.transfer8(data) + + def write16(self, data: int): + """Send 16-bit data over SPI. + + Parameters + ---------- + data : int + Data to transmit. + """ + self.transfer16(data) + + def write8_bulk(self, data: List[int]): + """Send 8-bit data array over SPI. + + Parameters + ---------- + data : list of int + List of 8-bit data to transmit. + """ + self.transfer8_bulk(data) + + def write16_bulk(self, data: List[int]): + """Send 16-bit data array over SPI. + + Parameters + ---------- + data : list of int + List of 16-bit data to transmit. + """ + self.transfer16_bulk(data) diff --git a/pslab/bus/uart.py b/pslab/bus/uart.py new file mode 100644 index 00000000..a3bbf527 --- /dev/null +++ b/pslab/bus/uart.py @@ -0,0 +1,294 @@ +"""Control the PSLab's UART bus and devices connected on the bus. + +Examples +-------- +Set UART2 bus baudrate to 1000000: + +>>> from pslab.bus.uart improt UART +>>> bus = UART() +>>> bus.configure(1e6) + +Send a byte over UART: + +>>> bus.write_byte(0x55) +""" + +from typing import Tuple + +import pslab.protocol as CP +from pslab.bus import classmethod_ +from pslab.connection import ConnectionHandler, autoconnect + +__all__ = "UART" +_BRGVAL = 0x22 # BaudRate = 460800. +_MODE = (0, 0) # 8-bit data and no parity, 1 stop bit. + + +class _UARTPrimitive: + """UART primitive commands. + + Handles all the UART subcommands coded in pslab-firmware. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be created. + """ + + _MIN_BRGVAL = 0 + _MAX_BRGVAL = 2**16 - 1 + + _brgval = _BRGVAL + _mode = _MODE + + def __init__(self, device: ConnectionHandler | None = None): + self._device = device if device is not None else autoconnect() + + @classmethod_ + @property + def _baudrate(cls) -> float: + return cls._get_uart_baudrate(cls._brgval) + + @staticmethod + def _get_uart_brgval(baudrate: float, BRGH: int = 1) -> int: + return round(((CP.CLOCK_RATE / baudrate) / (4 if BRGH else 16)) - 1) + + @staticmethod + def _get_uart_baudrate(brgval: int, BRGH: int = 1) -> float: + return (CP.CLOCK_RATE / (brgval + 1)) / (4 if BRGH else 16) + + @staticmethod + def _save_config(brgval: int = None, mode: Tuple[int] = None): + """Save the UART barval and mode bits. + + Parameters + ---------- + brgval : int, optional + Set value to `_UARTPrimitive._brgval`. Will be skipped if None. + Defaults to None. + mode : tuple of int, optional + Set value to `_UARTPrimitive._mode`. Will be skipped if None. + Defaults to None. + """ + if brgval is not None: + _UARTPrimitive._brgval = brgval + if mode is not None: + _UARTPrimitive._mode = mode + + def _set_uart_baud(self, baudrate: int): + """Set the baudrate of the UART bus. + + It is a primitive UART method, prefered to use :meth:`UART.configure`. + + Parameters + ---------- + baudrate : int + Baudrate to set on the UART bus. + + Raises + ------ + ValueError + If given baudrate in not supported by PSLab board. + """ + brgval = self._get_uart_brgval(baudrate) + + if self._MIN_BRGVAL <= brgval <= self._MAX_BRGVAL: + self._device.send_byte(CP.UART_2) + self._device.send_byte(CP.SET_BAUD) + self._device.send_int(brgval) + self._device.get_ack() + self._save_config(brgval=brgval) + else: + min_baudrate = self._get_uart_baudrate(self._MIN_BRGVAL) + max_baudrate = self._get_uart_baudrate(self._MAX_BRGVAL) + e = f"Baudrate must be between {min_baudrate} and {max_baudrate}." + raise ValueError(e) + + def _set_uart_mode(self, pd: int, st: int): + """Set UART mode. + + Parameters + ---------- + pd : {0, 1, 2, 3} + Parity and data selection bits. + {0: 8-bit data and no parity, + 1: 8-bit data and even parity, + 2: 8-bit data and odd parity, + 3: 9-bit data and no parity} + st : {0, 1} + Selects number of stop bits for each one-byte UART transmission. + {0: one stop bit, + 1: two stop bits} + + Raises + ------ + ValueError + If any one of arguments is not in its shown range. + RuntimeError + If this functionality is not supported by the firmware. + Since it is newly implemented, earlier firmware version don't support. + """ + error_message = [] + if pd not in range(0, 4): + error_message.append("Parity and data selection bits must be 2-bits.") + if st not in (0, 1): + error_message.append("Stop bits select must be a bit.") + # Verifying whether the firmware support current subcommand. + if self._device.version not in ["PSLab V6"]: + raise RuntimeError( + "This firmware version doesn't support this functionality." + ) + + self._device.send_byte(CP.UART_2) + self._device.send_byte(CP.SET_MODE) + self._device.send_byte((pd << 1) | st) + self._device.get_ack() + self._save_config(mode=(pd, st)) + + def _read_uart_status(self) -> int: + """Return whether receive buffer has data. + + Returns + ------- + status : int + 1 if at least one more character can be read else 0. + """ + self._device.send_byte(CP.UART_2) + self._device.send_byte(CP.READ_UART2_STATUS) + return self._device.get_byte() + + def _write_byte(self, data: int): + """Write a single byte to the UART bus. + + It is a primitive UART method, prefered to use :meth:`UART.write_byte`. + + Parameters + ---------- + data : int + Byte value to write to the UART bus. + """ + self._device.send_byte(CP.UART_2) + self._device.send_byte(CP.SEND_BYTE) + self._device.send_byte(data) + + if self._device.firmware.major < 3: + self._device.get_ack() + + def _write_int(self, data: int): + """Write a single int to the UART bus. + + It is a primitive UART method, prefered to use :meth:`UART.write_int`. + + Parameters + ---------- + data : int + Int value to write to the UART bus. + """ + self._device.send_byte(CP.UART_2) + self._device.send_byte(CP.SEND_INT) + self._device.send_int(data) + self._device.get_ack() + + def _read_byte(self) -> int: + """Read a single byte from the UART bus. + + It is a primitive UART method, prefered to use :meth:`UART.read_byte`. + + Returns + ------- + data : int + A Byte interpreted as a uint8 read from the UART bus. + """ + self._device.send_byte(CP.UART_2) + self._device.send_byte(CP.READ_BYTE) + return self._device.get_byte() + + def _read_int(self) -> int: + """Read a two byte value from the UART bus. + + It is a primitive UART method, prefered to use :meth:`UART.read_int`. + + Returns + ------- + data : int + Two bytes interpreted as a uint16 read from the UART bus. + """ + self._device.send_byte(CP.UART_2) + self._device.send_byte(CP.READ_INT) + return self._device.get_int() + + +class UART(_UARTPrimitive): + """UART2 bus. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be created. + """ + + def __init__(self, device: ConnectionHandler | None = None): + super().__init__(device) + # Reset baudrate and mode + self.configure(self._get_uart_baudrate(_BRGVAL)) + + try: + self._set_uart_mode(*_MODE) + except RuntimeError: + pass + + def configure(self, baudrate: float): + """Configure UART bus baudrate. + + Parameters + ---------- + baudrate : float + + Raises + ------ + ValueError + If given baudrate is not supported by PSLab board. + """ + self._set_uart_baud(baudrate) + + def write_byte(self, data: int): + """Write a single byte to the UART bus. + + Parameters + ---------- + data : int + Byte value to write to the UART bus. + """ + self._write_byte(data) + + def write_int(self, data: int): + """Write a single int to the UART bus. + + Parameters + ---------- + data : int + Int value to write to the UART bus. + """ + self._write_int(data) + + def read_byte(self) -> int: + """Read a single byte from the UART bus. + + Returns + ------- + data : int + A Byte interpreted as a uint8 read from the UART bus. + """ + return self._read_byte() + + def read_int(self) -> int: + """Read a two byte value from the UART bus. + + It is a primitive UART method, prefered to use :meth:`UART.read_int`. + + Returns + ------- + data : int + Two bytes interpreted as a uint16 read from the UART bus. + """ + return self._read_int() diff --git a/pslab/cli.py b/pslab/cli.py new file mode 100644 index 00000000..5ba833bd --- /dev/null +++ b/pslab/cli.py @@ -0,0 +1,571 @@ +"""Functions related to CLI for PSLab. + +Example +------- +>>> from pslab import cli +>>> parser, subparser = cli.get_parser() +>>> cli.add_collect_args(subparser) +>>> cli.add_wave_args(subparser) +>>> cli.add_pwm_args(subparser) +>>> parser.parse_args(["collect","-i","logic_analyzer"]) +Namespace(channels=1, duration=1, file_path=None, function='collect', +instrument='logic_analyzer', json=False, port=None) +""" + +import argparse +import csv +import json +import platform +import os.path +import shutil +import struct +import sys +import time +from itertools import zip_longest +from typing import List, Tuple + +import numpy as np +import mcbootflash + +import pslab +import pslab.protocol as CP +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.oscilloscope import Oscilloscope +from pslab.instrument.waveform_generator import WaveformGenerator, PWMGenerator +from pslab.serial_handler import SerialHandler + + +def logic_analyzer( + device: SerialHandler, channels: int, duration: float +) -> Tuple[List[str], List[np.ndarray]]: + """Capture logic events on up to four channels simultaneously. + + Parameters + ---------- + device : :class:`Handler` + Serial interface for communicating with the PSLab device. + channels : {1, 2, 3, 4} + Number of channels to capture events on. Events will be captured on LA1, + LA2, LA3, and LA4, in that order. + duration : float + Duration in seconds up to which events will be captured. + + Returns + ------- + list of str + Name of active channels. + list of numpy.ndarray + List of numpy.ndarrays holding timestamps in microseconds when logic events + were detected. The length of the list is equal to the number of channels + that were used to capture events, and each list element corresponds to a + channel. + + Warnings + -------- + This cannot be used at the same time as the oscilloscope. + """ + la = LogicAnalyzer(device) + la.capture(channels, block=False) + time.sleep(duration) + la.stop() + timestamps = la.fetch_data() + channels_name = [la._channel_one_map, la._channel_two_map, "LA3", "LA4"] + + return channels_name[:channels], timestamps + + +def oscilloscope( + device: SerialHandler, channels: int, duration: float +) -> Tuple[List[str], List[np.ndarray]]: + """Capture varying voltage signals on up to four channels simultaneously. + + Parameters + ---------- + device : :class:`Handler` + Serial interface for communicating with the PSLab device. + channels : {1, 2, 4} + Number of channels to sample from simultaneously. By default, samples are + captured from CH1, CH2, CH3 and MIC. + duration : float + Duration in seconds up to which samples will be captured. + + Returns + ------- + list of str + "Timestamp", Name of active channels. + list of numpy.ndarray + List of numpy.ndarrays with timestamps in the first index and corresponding + voltages in the following index. The length of the list is equal to one + additional to the number of channels that were used to capture samples. + """ + scope = Oscilloscope(device) + max_samples = CP.MAX_SAMPLES // channels + min_timegap = scope._lookup_mininum_timegap(channels) + max_duration = max_samples * min_timegap * 1e-6 + active_channels = ([scope._channel_one_map] + scope._CH234)[:channels] + xy = [np.array([]) for _ in range(1 + channels)] + + while duration > 0: + if duration >= max_duration: + samples = max_samples + else: + samples = round((duration * 1e6) / min_timegap) + + st = time.time() + xy = np.append(xy, scope.capture(channels, samples, min_timegap), axis=1) + duration -= time.time() - st + + return ["Timestamp"] + active_channels, xy + + +INSTRUMENTS = { + "logic_analyzer": logic_analyzer, + "oscilloscope": oscilloscope, +} + + +def collect(handler: SerialHandler, args: argparse.Namespace): + """Collect data from instruments, and write it in file or stdout. + + Parameters + ---------- + handler : :class:`Handler` + Serial interface for communicating with the PSLab device. + args : :class:`argparse.Namespace` + Parsed arguments. + + Raises + ------ + LookupError + If the given instrument not available. + """ + instrument = INSTRUMENTS.get(args.instrument) + + if instrument is None: + raise LookupError(args.instrument + " not available") + + output = instrument(handler, args.channels, args.duration) + + if args.file_path is not None: + file = open(args.file_path, "w") + else: + file = sys.stdout + + if not args.json: + csv_file = csv.writer(file) + csv_file.writerow(output[0]) + for row in zip_longest(*output[1]): + csv_file.writerow(row) + else: + output_dict = dict() + for key, val in zip_longest(*output): + output_dict[key] = val.tolist() + json.dump(output_dict, file) + + if args.file_path is not None: + file.close() + + +def wave(handler: SerialHandler, args: argparse.Namespace): + """Generate or load wave. + + Parameters + ---------- + handler : :class:`Handler` + Serial interface for communicating with the PSLab device. + args : :class:`argparse.Namespace` + Parsed arguments. + """ + waveform_generator = WaveformGenerator(handler) + + if args.wave_function == "gen": + waveform_generator.generate( + channels=args.channel, + frequency=args.frequency, + phase=args.phase, + ) + elif args.wave_function == "load": + if args.table is not None: + table = args.table + elif args.table_file is not None: + with open(args.table_file) as table_file: + table = json.load(table_file) + + x = np.arange(0, len(table), len(table) / 512) + y = [table[int(i)] for i in x] + waveform_generator.load_table(channel=args.channel, points=y) + + +def pwm(handler: SerialHandler, args: argparse.Namespace): + """Generate PWM. + + Parameters + ---------- + handler : :class:`Handler` + Serial interface for communicating with the PSLab device. + args : :class:`argparse.Namespace` + Parsed arguments. + """ + pwm_generator = PWMGenerator(handler) + + if args.pwm_function == "gen": + pwm_generator.generate( + channels=args.channel, + frequency=args.frequency, + duty_cycles=args.duty_cycles, + phases=args.phases, + ) + elif args.pwm_function == "map": + pwm_generator.map_reference_clock( + channels=args.channel, + prescaler=args.prescaler, + ) + + +def main(args: argparse.Namespace): + """Perform the given function on PSLab. + + Parameters + ---------- + args : :class:`argparse.Namespace` + Parsed arguments. + """ + if args.function == "install": + install(args) + return + + handler = SerialHandler(port=args.port) + + if args.function == "flash": + flash(pslab.ScienceLab(args.port), args.hexfile) + return + + if args.function == "collect": + collect(handler, args) + elif args.function == "wave": + wave(handler, args) + elif args.function == "pwm": + pwm(handler, args) + + +def get_parser() -> Tuple[argparse.ArgumentParser, argparse._SubParsersAction]: + """Parser for CLI. + + Returns + ------- + parser : :class:`argparse.ArgumentParser` + Arqument parser for CLI. + functions : :class:`argparse._SubParsersAction` + SubParser to add other arguments related to different function. + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "-p", + "--port", + type=str, + default=None, + required=False, + help="The name of the port to which the PSLab is connected", + ) + functions = parser.add_subparsers( + title="Functions", dest="function", description="Functions to perform on PSLab." + ) + + return parser, functions + + +def add_collect_args(subparser: argparse._SubParsersAction): + """Add arguments for collect function to ArgumentParser. + + Parameters + ---------- + subparser : :class:`argparse._SubParsersAction` + SubParser to add other arguments related to collect function. + """ + description = "Available Instruments: " + ", ".join(INSTRUMENTS) + "." + collect = subparser.add_parser("collect", description=description) + collect.add_argument( + "instrument", + type=str, + help="The name of the instrument to use", + ) + collect.add_argument( + "-c", + "--channels", + type=int, + default=1, + required=False, + help="Number of channels to capture", + ) + collect.add_argument( + "-d", + "--duration", + type=float, + default=1, + required=False, + help="Duration for capturing (in seconds)", + ) + collect.add_argument( + "-o", + "--output", + type=str, + default=None, + required=False, + dest="file_path", + help="File name to write data, otherwise in stdout", + ) + collect.add_argument( + "-j", + "--json", + action="store_true", + default=False, + help="Enable it to write data in json format", + ) + + +def add_wave_args(subparser: argparse._SubParsersAction): + """Add arguments for wave {gen,load} function to ArgumentParser. + + Parameters + ---------- + subparser : :class:`argparse._SubParsersAction` + SubParser to add other arguments related to wave_gen function. + """ + wave = subparser.add_parser("wave") + wave_functions = wave.add_subparsers( + title="Wave Functions", + dest="wave_function", + ) + wave_gen = wave_functions.add_parser("gen") + wave_gen.add_argument( + "channel", + nargs="+", + choices=["SI1", "SI2"], + help="Pin(s) on which to generate a waveform", + ) + wave_gen.add_argument( + "-f", + "--frequency", + nargs="+", + type=float, + required=True, + help="Frequency in Hz", + ) + wave_gen.add_argument( + "-p", + "--phase", + type=float, + default=0, + required=False, + help="Phase between waveforms in degrees", + ) + description = """ + TABLE: + JSON array of voltage values which make up the waveform. Array length + must be 512. If the array length less than 512, then the array will be + expanded in length of 512. Values outside the range -3.3 V to 3.3 V + will be clipped. + + examples: + [1,0] or [1,...,0,...], + [0,1,0,-1,0,1,0,-1,...], + [0,.025,.05,.075,.1,.125,.15,...] + """ + load = wave_functions.add_parser("load", description=description) + load.add_argument( + "channel", + choices=["SI1", "SI2"], + help="Pin(s) on which to load a table", + ) + load_table = load.add_mutually_exclusive_group(required=True) + load_table.add_argument( + "--table", + type=json.loads, + default=None, + help="Table to load in pin SI1 as json", + ) + load_table.add_argument( + "--table-file", + nargs="?", + type=str, + const=0, + default=None, + help="Table to load in pin SI1 as json file. Default is stdin", + ) + + +def add_pwm_args(subparser: argparse._SubParsersAction): + """Add arguments for pwm {gen,map,set} function to ArgumentParser. + + Parameters + ---------- + subparser : :class:`argparse._SubParsersAction` + SubParser to add other arguments related to pwm_gen function. + """ + pwm = subparser.add_parser("pwm") + pwm_functions = pwm.add_subparsers( + title="PWM Functions", + dest="pwm_function", + ) + pwm_gen = pwm_functions.add_parser("gen") + pwm_gen.add_argument( + "channel", + nargs="+", + choices=["SQ1", "SQ2", "SQ3", "SQ4"], + help="Pin(s) on which to generate a PWM signals", + ) + pwm_gen.add_argument( + "-f", + "--frequency", + type=float, + required=True, + help="Frequency in Hz. Shared by all outputs", + ) + pwm_gen.add_argument( + "-d", + "--duty-cycles", + nargs="+", + type=float, + required=True, + help="Duty cycle between 0 and 1", + ) + pwm_gen.add_argument( + "-p", + "--phases", + nargs="+", + type=float, + default=0, + required=False, + help="Phase between 0 and 1", + ) + map_ = pwm_functions.add_parser("map") + map_.add_argument( + "channel", + nargs="+", + choices=["SQ1", "SQ2", "SQ3", "SQ4"], + help="Digital output pin(s) to which to map the internal oscillator", + ) + map_.add_argument( + "-p", + "--prescaler", + type=int, + required=True, + help="Prescaler value in interval [0, 15]." + + "The output frequency is 128 / (1 << prescaler) MHz", + ) + + +def cmdline(args: List[str] = None): + """Command line for pslab. + + Parameters + ---------- + args : list of strings. + Arguments to parse. + """ + if args is None: + args = sys.argv[1:] + + parser, subparser = get_parser() + add_collect_args(subparser) + add_wave_args(subparser) + add_pwm_args(subparser) + add_install_args(subparser) + add_flash_args(subparser) + main(parser.parse_args(args)) + + +def install(args: argparse.Namespace): + """Install udev rule on Linux. + + Parameters + ---------- + args : :class:`argparse.Namespace` + Parsed arguments. + """ + if not platform.system() == "Linux": + print(f"Installation not required on {platform.system()}.") + return + else: + try: + SerialHandler.check_serial_access_permission() + except OSError: + _install() + return + + if args.force: + _install() + return + + print("User is in dialout/uucp group or udev rule is already installed.") + + +def _install(): + udev_rules = os.path.join(pslab.__path__[0], "99-pslab.rules") + target = "/etc/udev/rules.d/99-pslab.rules" + shutil.copyfile(udev_rules, target) + return + + +def add_install_args(subparser: argparse._SubParsersAction): + """Add arguments for install function to ArgumentParser. + + Parameters + ---------- + subparser : :class:`argparse._SubParsersAction` + SubParser to add other arguments related to install function. + """ + install = subparser.add_parser("install") + install.add_argument( + "-f", + "--force", + action="store_true", + default=False, + help="Overwrite existing udev rule.", + ) + + +def flash(psl: pslab.ScienceLab, hexfile: str): + """Flash firmware over USB. + + PSLab must be in bootloader mode. + """ + if psl.interface.baudrate == 1000000: + psl.interface.timeout = 5 + psl.enter_bootloader() + + try: + bootattrs = mcbootflash.get_boot_attrs(psl) + except struct.error: + print("Flashing failed: PSLab is not in bootloader mode.") + return + + mcbootflash.erase_flash(psl, bootattrs.memory_range, bootattrs.erase_size) + total_bytes, chunks = mcbootflash.chunked(hexfile, bootattrs) + written = 0 + + for chunk in chunks: + mcbootflash.write_flash(psl, chunk) + mcbootflash.checksum(psl, chunk) + written += len(chunk.data) + print(f"{written}/{total_bytes} bytes flashed.", end="\r") + + print("", end="\n") + mcbootflash.self_verify(psl) + mcbootflash.reset(psl) + + +def add_flash_args(subparser: argparse._SubParsersAction): + """Add arguments for flash function to ArgumentParser. + + Parameters + ---------- + subparser : :class:`argparse._SubParsersAction` + SubParser to add other arguments related to flash function. + """ + flash = subparser.add_parser("flash") + flash.add_argument( + "hexfile", + type=str, + help="an Intel HEX file containing application firmware", + ) diff --git a/pslab/connection/__init__.py b/pslab/connection/__init__.py new file mode 100644 index 00000000..fe7b50a0 --- /dev/null +++ b/pslab/connection/__init__.py @@ -0,0 +1,74 @@ +"""Interfaces for communicating with PSLab devices.""" + +from serial.tools import list_ports + +from .connection import ConnectionHandler +from ._serial import SerialHandler +from .wlan import WLANHandler + + +def detect() -> list[ConnectionHandler]: + """Detect PSLab devices. + + Returns + ------- + devices : list[ConnectionHandler] + Handlers for all detected PSLabs. The returned handlers are disconnected; call + .connect() before use. + """ + regex = [] + + for vid, pid in zip(SerialHandler._USB_VID, SerialHandler._USB_PID): + regex.append(f"{vid:04x}:{pid:04x}") + + regex = "(" + "|".join(regex) + ")" + port_info_generator = list_ports.grep(regex) + pslab_devices = [] + + for port_info in port_info_generator: + device = SerialHandler(port=port_info.device, baudrate=1000000, timeout=1) + + try: + device.connect() + except Exception: + pass # nosec + else: + pslab_devices.append(device) + finally: + device.disconnect() + + try: + device = WLANHandler() + device.connect() + except Exception: + pass # nosec + else: + pslab_devices.append(device) + finally: + device.disconnect() + + return pslab_devices + + +def autoconnect() -> ConnectionHandler: + """Automatically connect when exactly one device is present. + + Returns + ------- + device : ConnectionHandler + A handler connected to the detected PSLab device. The handler is connected; it + is not necessary to call .connect before use(). + """ + devices = detect() + + if not devices: + msg = "device not found" + raise ConnectionError(msg) + + if len(devices) > 1: + msg = f"autoconnect failed, multiple devices detected: {devices}" + raise ConnectionError(msg) + + device = devices[0] + device.connect() + return device diff --git a/pslab/connection/_serial.py b/pslab/connection/_serial.py new file mode 100644 index 00000000..d7bf0061 --- /dev/null +++ b/pslab/connection/_serial.py @@ -0,0 +1,158 @@ +"""Serial interface for communicating with PSLab devices.""" + +import os +import platform + +import serial + +import pslab +from pslab.connection.connection import ConnectionHandler + + +def _check_serial_access_permission(): + """Check that we have permission to use the tty on Linux.""" + if platform.system() == "Linux": + import grp + + if os.geteuid() == 0: # Running as root? + return + + for group in os.getgroups(): + if grp.getgrgid(group).gr_name in ( + "dialout", + "uucp", + ): + return + + udev_paths = [ + "/run/udev/rules.d/", + "/etc/udev/rules.d/", + "/lib/udev/rules.d/", + ] + for p in udev_paths: + udev_rules = os.path.join(p, "99-pslab.rules") + if os.path.isfile(udev_rules): + return + else: + raise PermissionError( + "The current user does not have permission to access " + "the PSLab device. To solve this, either:" + "\n\n" + "1. Add the user to the 'dialout' (on Debian-based " + "systems) or 'uucp' (on Arch-based systems) group." + "\n" + "2. Install a udev rule to allow any user access to the " + "device by running 'pslab install' as root, or by " + "manually copying " + f"{pslab.__path__[0]}/99-pslab.rules into {udev_paths[1]}." + "\n\n" + "You may also need to reboot the system for the " + "permission changes to take effect." + ) + + +class SerialHandler(ConnectionHandler): + """Interface for controlling a PSLab over a serial port. + + Parameters + ---------- + port : str + baudrate : int, default 1 MBd + timeout : float, default 1 s + """ + + # V5 V6 + _USB_VID = [0x04D8, 0x10C4] + _USB_PID = [0x00DF, 0xEA60] + + def __init__( + self, + port: str, + baudrate: int = 1000000, + timeout: float = 1.0, + ): + self._port = port + self._ser = serial.Serial( + baudrate=baudrate, + timeout=timeout, + write_timeout=timeout, + ) + _check_serial_access_permission() + + @property + def port(self) -> str: + """Serial port.""" + return self._port + + @property + def baudrate(self) -> int: + """Symbol rate.""" + return self._ser.baudrate + + @baudrate.setter + def baudrate(self, value: int) -> None: + self._ser.baudrate = value + + @property + def timeout(self) -> float: + """Timeout in seconds.""" + return self._ser.timeout + + @timeout.setter + def timeout(self, value: float) -> None: + self._ser.timeout = value + self._ser.write_timeout = value + + def connect(self) -> None: + """Connect to PSLab.""" + self._ser.port = self.port + self._ser.open() + + try: + self.get_version() + except Exception: + self._ser.close() + raise + + def disconnect(self): + """Disconnect from PSLab.""" + self._ser.close() + + def read(self, number_of_bytes: int) -> bytes: + """Read bytes from serial port. + + Parameters + ---------- + number_of_bytes : int + Number of bytes to read from the serial port. + + Returns + ------- + bytes + Bytes read from the serial port. + """ + return self._ser.read(number_of_bytes) + + def write(self, data: bytes) -> int: + """Write bytes to serial port. + + Parameters + ---------- + data : int + Bytes to write to the serial port. + + Returns + ------- + int + Number of bytes written. + """ + return self._ser.write(data) + + def __repr__(self) -> str: # noqa + return ( + f"{self.__class__.__name__}" + "[" + f"{self.port}, " + f"{self.baudrate} baud" + "]" + ) diff --git a/pslab/connection/connection.py b/pslab/connection/connection.py new file mode 100644 index 00000000..d87fd187 --- /dev/null +++ b/pslab/connection/connection.py @@ -0,0 +1,199 @@ +"""Interface objects common to all types of connections.""" + +from abc import ABC, abstractmethod +from dataclasses import dataclass + +import pslab.protocol as CP + + +@dataclass(frozen=True) +class FirmwareVersion: + """Version of pslab-firmware running on connected device. + + Uses semantic versioning conventions. + + Attributes + ---------- + major : int + Major version. Incremented when backward imcompatible changes are made. + minor : int + Minor version. Incremented when new functionality is added, or existing + functionality is changed in a backward compatible manner. + patch : int + Patch version. Incremented when bug fixes are made with do not change the + PSLab's documented behavior. + """ + + major: int + minor: int + patch: int + + +class ConnectionHandler(ABC): + """Abstract base class for PSLab control interfaces.""" + + @abstractmethod + def connect(self) -> None: + """Connect to PSLab.""" + ... + + @abstractmethod + def disconnect(self) -> None: + """Disconnect PSLab.""" + ... + + @abstractmethod + def read(self, numbytes: int) -> bytes: + """Read data from PSLab. + + Parameters + ---------- + numbytes : int + + Returns + ------- + data : bytes + """ + ... + + @abstractmethod + def write(self, data: bytes) -> int: + """Write data to PSLab. + + Parameters + ---------- + data : bytes + + Returns + ------- + numbytes : int + """ + ... + + def get_byte(self) -> int: + """Read a single one-byte of integer value. + + Returns + ------- + int + """ + return int.from_bytes(self.read(1), byteorder="little") + + def get_int(self) -> int: + """Read a single two-byte integer value. + + Returns + ------- + int + """ + return int.from_bytes(self.read(2), byteorder="little") + + def get_long(self) -> int: + """Read a single four-byte integer value. + + Returns + ------- + int + """ + return int.from_bytes(self.read(4), byteorder="little") + + def send_byte(self, data: int | bytes) -> None: + """Write a single one-byte integer value. + + Parameters + ---------- + data : int + """ + if isinstance(data, int): + data = data.to_bytes(length=1, byteorder="little") + self.write(data) + + def send_int(self, data: int | bytes) -> None: + """Write a single two-byte integer value. + + Parameters + ---------- + data : int | bytes + """ + if isinstance(data, int): + data = data.to_bytes(length=2, byteorder="little") + self.write(data) + + def send_long(self, data: int | bytes) -> None: + """Write a single four-byte integer value. + + Parameters + ---------- + data : int | bytes + """ + if isinstance(data, int): + data = data.to_bytes(length=4, byteorder="little") + self.write(data) + + def get_ack(self) -> int: + """Get response code from PSLab. + + Returns + ------- + int + Response code. Meanings: + 0x01 ACK + 0x10 I2C ACK + 0x20 I2C bus collision + 0x10 Radio max retransmits + 0x20 Radio not present + 0x40 Radio reply timout + """ + response = self.read(1) + + if not response: + raise TimeoutError + + ack = CP.Byte.unpack(response)[0] + + if not (ack & 0x01): + raise RuntimeError("Received non ACK byte while waiting for ACK.") + + return ack + + def get_version(self) -> str: + """Query PSLab for its version and return it as a decoded string. + + Returns + ------- + str + Version string. + """ + self.send_byte(CP.COMMON) + self.send_byte(CP.GET_VERSION) + version_length = 9 + version = self.read(version_length) + + try: + if b"PSLab" not in version: + msg = f"got unexpected hardware version: {version}" + raise ConnectionError(msg) + except Exception as exc: + msg = "device not found" + raise ConnectionError(msg) from exc + + return version.decode("utf-8") + + def get_firmware_version(self) -> FirmwareVersion: + """Get firmware version. + + Returns + ------- + tuple[int, int, int] + major, minor, patch. + + """ + self.send_byte(CP.COMMON) + self.send_byte(CP.GET_FW_VERSION) + + # Firmware version query was added in firmware version 3.0.0. + major = self.get_byte() + minor = self.get_byte() + patch = self.get_byte() + + return FirmwareVersion(major, minor, patch) diff --git a/pslab/connection/wlan.py b/pslab/connection/wlan.py new file mode 100644 index 00000000..79cde7ac --- /dev/null +++ b/pslab/connection/wlan.py @@ -0,0 +1,116 @@ +"""Wireless interface for communicating with PSLab devices equiped with ESP8266.""" + +import socket + +from pslab.connection.connection import ConnectionHandler + + +class WLANHandler(ConnectionHandler): + """Interface for controlling a PSLab over WLAN. + + Paramaters + ---------- + host : str, default 192.168.4.1 + Network address of the PSLab. + port : int, default 80 + timeout : float, default 1 s + """ + + def __init__( + self, + host: str = "192.168.4.1", + port: int = 80, + timeout: float = 1.0, + ) -> None: + self._host = host + self._port = port + self._timeout = timeout + self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._sock.settimeout(timeout) + + @property + def host(self) -> int: + """Network address of the PSLab.""" + return self._host + + @property + def port(self) -> int: + """TCP port number.""" + return self._port + + @property + def timeout(self) -> float: + """Timeout in seconds.""" + return self._timeout + + @timeout.setter + def timeout(self, value: float) -> None: + self._sock.settimeout(value) + + def connect(self) -> None: + """Connect to PSLab.""" + if self._sock.fileno() == -1: + # Socket has been closed. + self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._sock.settimeout(self.timeout) + + self._sock.connect((self.host, self.port)) + + try: + self.get_version() + except Exception: + self._sock.close() + raise + + def disconnect(self) -> None: + """Disconnect from PSLab.""" + self._sock.close() + + def read(self, numbytes: int) -> bytes: + """Read data over WLAN. + + Parameters + ---------- + numbytes : int + Number of bytes to read. + + Returns + ------- + data : bytes + """ + received = b"" + buf_size = 4096 + remaining = numbytes + + while remaining > 0: + chunk = self._sock.recv(min(remaining, buf_size)) + received += chunk + remaining -= len(chunk) + + return received + + def write(self, data: bytes) -> int: + """Write data over WLAN. + + Parameters + ---------- + data : bytes + + Returns + ------- + numbytes : int + Number of bytes written. + """ + buf_size = 4096 + remaining = len(data) + sent = 0 + + while remaining > 0: + chunk = data[sent : sent + min(remaining, buf_size)] + sent += self._sock.send(chunk) + remaining -= len(chunk) + + return sent + + def __repr__(self) -> str: # noqa + return f"{self.__class__.__name__}[{self.host}:{self.port}]" diff --git a/PSL/SENSORS/AD7718_class.py b/pslab/external/AD7718_class.py similarity index 100% rename from PSL/SENSORS/AD7718_class.py rename to pslab/external/AD7718_class.py diff --git a/PSL/SENSORS/AD9833.py b/pslab/external/AD9833.py similarity index 100% rename from PSL/SENSORS/AD9833.py rename to pslab/external/AD9833.py diff --git a/PSL/SENSORS/ADS1115.py b/pslab/external/ADS1115.py similarity index 100% rename from PSL/SENSORS/ADS1115.py rename to pslab/external/ADS1115.py diff --git a/PSL/SENSORS/BH1750.py b/pslab/external/BH1750.py similarity index 100% rename from PSL/SENSORS/BH1750.py rename to pslab/external/BH1750.py diff --git a/PSL/SENSORS/ComplementaryFilter.py b/pslab/external/ComplementaryFilter.py similarity index 100% rename from PSL/SENSORS/ComplementaryFilter.py rename to pslab/external/ComplementaryFilter.py diff --git a/PSL/SENSORS/HMC5883L.py b/pslab/external/HMC5883L.py similarity index 100% rename from PSL/SENSORS/HMC5883L.py rename to pslab/external/HMC5883L.py diff --git a/PSL/SENSORS/Kalman.py b/pslab/external/Kalman.py similarity index 100% rename from PSL/SENSORS/Kalman.py rename to pslab/external/Kalman.py diff --git a/PSL/SENSORS/MF522.py b/pslab/external/MF522.py similarity index 100% rename from PSL/SENSORS/MF522.py rename to pslab/external/MF522.py diff --git a/PSL/SENSORS/MLX90614.py b/pslab/external/MLX90614.py similarity index 61% rename from PSL/SENSORS/MLX90614.py rename to pslab/external/MLX90614.py index b19b6f43..6b963676 100644 --- a/PSL/SENSORS/MLX90614.py +++ b/pslab/external/MLX90614.py @@ -1,46 +1,40 @@ -from __future__ import print_function +from pslab.bus import I2CSlave - -def connect(route, **args): - return MLX90614(route, **args) - - -class MLX90614(): +class MLX90614(I2CSlave): + _ADDRESS = 0x5A + _OBJADDR = 0x07 + _AMBADDR = 0x06 NUMPLOTS = 1 PLOTNAMES = ['Temp'] - ADDRESS = 0x5A name = 'PIR temperature' - def __init__(self, I2C, **args): - self.I2C = I2C - self.ADDRESS = args.get('address', self.ADDRESS) - self.OBJADDR = 0x07 - self.AMBADDR = 0x06 + def __init__(self): + super().__init__(self._ADDRESS) - self.source = self.OBJADDR + self.source = self._OBJADDR self.name = 'Passive IR temperature sensor' self.params = {'readReg': {'dataType': 'integer', 'min': 0, 'max': 0x20, 'prefix': 'Addr: '}, 'select_source': ['object temperature', 'ambient temperature']} - try: - print('switching baud to 100k') - self.I2C.configI2C(100e3) - except Exception as e: - print('FAILED TO CHANGE BAUD RATE', e.message) + # try: + # print('switching baud to 100k') + # self.I2C.configI2C(100e3) + # except Exception as e: + # print('FAILED TO CHANGE BAUD RATE', e.message) def select_source(self, source): if source == 'object temperature': - self.source = self.OBJADDR + self.source = self._OBJADDR elif source == 'ambient temperature': - self.source = self.AMBADDR + self.source = self._AMBADDR def readReg(self, addr): x = self.getVals(addr, 2) print(hex(addr), hex(x[0] | (x[1] << 8))) def getVals(self, addr, numbytes): - vals = self.I2C.readBulk(self.ADDRESS, addr, numbytes) + vals = self.read(numbytes, addr) return vals def getRaw(self): @@ -54,7 +48,7 @@ def getRaw(self): return False def getObjectTemperature(self): - self.source = self.OBJADDR + self.source = self._OBJADDR val = self.getRaw() if val: return val[0] @@ -62,7 +56,7 @@ def getObjectTemperature(self): return False def getAmbientTemperature(self): - self.source = self.AMBADDR + self.source = self._AMBADDR val = self.getRaw() if val: return val[0] diff --git a/PSL/SENSORS/MPU6050.py b/pslab/external/MPU6050.py similarity index 100% rename from PSL/SENSORS/MPU6050.py rename to pslab/external/MPU6050.py diff --git a/PSL/SENSORS/MPU925x.py b/pslab/external/MPU925x.py similarity index 100% rename from PSL/SENSORS/MPU925x.py rename to pslab/external/MPU925x.py diff --git a/PSL/SENSORS/SHT21.py b/pslab/external/SHT21.py similarity index 100% rename from PSL/SENSORS/SHT21.py rename to pslab/external/SHT21.py diff --git a/PSL/SENSORS/Sx1276.py b/pslab/external/Sx1276.py similarity index 100% rename from PSL/SENSORS/Sx1276.py rename to pslab/external/Sx1276.py diff --git a/PSL/SENSORS/TSL2561.py b/pslab/external/TSL2561.py similarity index 100% rename from PSL/SENSORS/TSL2561.py rename to pslab/external/TSL2561.py diff --git a/pslab/external/__init__.py b/pslab/external/__init__.py new file mode 100644 index 00000000..2452070f --- /dev/null +++ b/pslab/external/__init__.py @@ -0,0 +1 @@ +"""Contains modules which require extra hardware other than the PSLab itself.""" \ No newline at end of file diff --git a/pslab/external/bmp180.py b/pslab/external/bmp180.py new file mode 100644 index 00000000..54598c27 --- /dev/null +++ b/pslab/external/bmp180.py @@ -0,0 +1,186 @@ +"""BMP180 Altimeter.""" + +import time +import logging +import struct +from pslab.bus import I2CSlave + +# BMP180 default address +_ADDRESS = 0x77 + +# Operating Modes +_ULTRALOWPOWER = 0 +_STANDARD = 1 +_HIGHRES = 2 +_ULTRAHIGHRES = 3 + +# BMP180 Registers +_CAL_AC1 = 0xAA # R Calibration data (16 bits) +_CAL_AC2 = 0xAC # R Calibration data (16 bits) +_CAL_AC3 = 0xAE # R Calibration data (16 bits) +_CAL_AC4 = 0xB0 # R Calibration data (16 bits) +_CAL_AC5 = 0xB2 # R Calibration data (16 bits) +_CAL_AC6 = 0xB4 # R Calibration data (16 bits) +_CAL_B1 = 0xB6 # R Calibration data (16 bits) +_CAL_B2 = 0xB8 # R Calibration data (16 bits) +_CAL_MB = 0xBA # R Calibration data (16 bits) +_CAL_MC = 0xBC # R Calibration data (16 bits) +_CAL_MD = 0xBE # R Calibration data (16 bits) +_CONTROL = 0xF4 +_TEMPDATA = 0xF6 +_PRESSUREDATA = 0xF6 + +# Commands +_READTEMPCMD = 0x2E +_READPRESSURECMD = 0x34 + +_logger = logging.getLogger(__name__) + + +class BMP180(I2CSlave): + """Class to interface with the BMP180 Altimeter. + + Parameters + ---------- + mode : int, optional + The mode of operation for the sensor, determining the oversampling setting. + The default mode is `_HIGHRES`. This parameter affects the precision and speed + of the temperature and pressure measurements. + + **kwargs : dict, optional + Additional keyword arguments, such as: + - address (int): The I2C address of the BMP180 sensor. Default is `_ADDRESS`. + + Attributes + ---------- + temperature : float + The measured temperature in degrees Celsius. + + pressure : float + The measured pressure in Pa (Pascals). + + altitude : float + The calculated altitude in meters based on the current pressure reading + and a reference sea level pressure. + """ + + NUMPLOTS = 3 + PLOTNAMES = ["Temperature", "Pressure", "Altitude"] + name = "BMP180 Altimeter" + + def __init__(self, mode=_HIGHRES, **kwargs): + self._ADDRESS = kwargs.get("address", _ADDRESS) + super().__init__(self._ADDRESS) + self._mode = mode + + # Load calibration values + self._ac1 = self._read_int16(_CAL_AC1) + self._ac2 = self._read_int16(_CAL_AC2) + self._ac3 = self._read_int16(_CAL_AC3) + self._ac4 = self._read_uint16(_CAL_AC4) + self._ac5 = self._read_uint16(_CAL_AC5) + self._ac6 = self._read_uint16(_CAL_AC6) + self._b1 = self._read_int16(_CAL_B1) + self._b2 = self._read_int16(_CAL_B2) + self._mb = self._read_int16(_CAL_MB) + self._mc = self._read_int16(_CAL_MC) + self._md = self._read_int16(_CAL_MD) + + _logger.debug(f"ac1: {self._ac1}") + _logger.debug(f"ac2: {self._ac2}") + _logger.debug(f"ac3: {self._ac3}") + _logger.debug(f"ac4: {self._ac4}") + _logger.debug(f"ac5: {self._ac5}") + _logger.debug(f"ac6: {self._ac6}") + _logger.debug(f"b1: {self._b1}") + _logger.debug(f"b2: {self._b2}") + _logger.debug(f"mb: {self._mb}") + _logger.debug(f"mc: {self._mc}") + _logger.debug(f"md: {self._md}") + + def _read_int16(self, addr): + BE_INT16 = struct.Struct(">h") # signed short, big endian + return BE_INT16.unpack(self.read(2, addr))[0] + + def _read_uint16(self, addr): + BE_UINT16 = struct.Struct(">H") # unsigned short, big endian + return BE_UINT16.unpack(self.read(2, addr))[0] + + def _read_raw_temperature(self): + """Read the raw temperature from the sensor.""" + self.write([_READTEMPCMD], _CONTROL) + time.sleep(0.005) + raw = self._read_uint16(_TEMPDATA) + return raw + + @property + def temperature(self): + """Get the actual temperature in degrees celsius.""" + ut = self._read_raw_temperature() + # Calculations from section 3.5 of the datasheet + x1 = ((ut - self._ac6) * self._ac5) >> 15 + x2 = (self._mc << 11) // (x1 + self._md) + b5 = x1 + x2 + temp = ((b5 + 8) >> 4) / 10.0 + return temp + + @property + def oversampling(self): + """oversampling : int + The oversampling setting used by the sensor. This attribute is settable and + determines the trade-off between measurement accuracy and speed. Possible values + include `_ULTRALOWPOWER`, `_STANDARD`, `_HIGHRES`, and `_ULTRAHIGHRES`. + """ + return self._mode + + @oversampling.setter + def oversampling(self, value): + self._mode = value + + def _read_raw_pressure(self): + """Read the raw pressure level from the sensor.""" + delays = [0.005, 0.008, 0.014, 0.026] + self.write([_READPRESSURECMD + (self._mode << 6)], _CONTROL) + time.sleep(delays[self._mode]) + msb = self.read_byte(_PRESSUREDATA) & 0xFF + lsb = self.read_byte(_PRESSUREDATA + 1) & 0xFF + xlsb = self.read_byte(_PRESSUREDATA + 2) & 0xFF + raw = ((msb << 16) + (lsb << 8) + xlsb) >> (8 - self._mode) + return raw + + @property + def pressure(self): + """Get the actual pressure in Pascals.""" + ut = self._read_raw_temperature() + up = self._read_raw_pressure() + # Calculations from section 3.5 of the datasheet + x1 = ((ut - self._ac6) * self._ac5) >> 15 + x2 = (self._mc << 11) // (x1 + self._md) + b5 = x1 + x2 + # Pressure Calculations + b6 = b5 - 4000 + x1 = (self._b2 * (b6 * b6) >> 12) >> 11 + x2 = (self._ac2 * b6) >> 11 + x3 = x1 + x2 + b3 = (((self._ac1 * 4 + x3) << self._mode) + 2) // 4 + x1 = (self._ac3 * b6) >> 13 + x2 = (self._b1 * ((b6 * b6) >> 12)) >> 16 + x3 = ((x1 + x2) + 2) >> 2 + b4 = (self._ac4 * (x3 + 32768)) >> 15 + b7 = (up - b3) * (50000 >> self._mode) + if b7 < 0x80000000: + p = (b7 * 2) // b4 + else: + p = (b7 // b4) * 2 + x1 = (p >> 8) * (p >> 8) + x1 = (x1 * 3038) >> 16 + x2 = (-7357 * p) >> 16 + pres = p + ((x1 + x2 + 3791) >> 4) + return pres + + @property + def altitude(self): + # Calculation from section 3.6 of datasheet + pressure = float(self.pressure) + alt = 44330.0 * (1.0 - pow(pressure / 101325.0, (1.0 / 5.255))) + return alt diff --git a/pslab/external/ccs811.py b/pslab/external/ccs811.py new file mode 100644 index 00000000..b7cedfe5 --- /dev/null +++ b/pslab/external/ccs811.py @@ -0,0 +1,164 @@ +import time +from pslab.bus import I2CSlave + + +class CCS811(I2CSlave): + MODE_IDLE = 0 # Idle (Measurements are disabled in this mode) + MODE_CONTINUOUS = 1 # Constant power mode, IAQ measurement every 1s + MODE_PULSE = 2 # Pulse heating mode IAQ measurement every 10 seconds + MODE_LOW_POWER = 3 # Low power pulse heating mode IAQ measurement every 60 seconds + MODE_CONTINUOUS_FAST = 4 # Constant power mode, sensor measurement every 250ms + + _ADDRESS = 0x5A + + # Figure 14: CCS811 Application Register Map + _STATUS = 0x00 # STATUS # R 1 byte Status register + # MEAS_MODE # R/W 1 byte Measurement mode and conditions register Algorithm result. + # The most significant 2 bytes contain a up to ppm estimate of the equivalent + # CO2 (eCO2) level, and + _MEAS_MODE = 0x01 + # ALG_RESULT_DATA # R 8 bytes the next two bytes contain appb estimate of the total + # VOC level. Raw ADC data values for resistance and current source. + _ALG_RESULT_DATA = 0x02 + # RAW_DATA # R 2 bytes used. Temperature and humidity data can be written to + _RAW_DATA = 0x03 + # ENV_DATA # W 4 bytes enable compensation Thresholds for operation when interrupts + # are only + _ENV_DATA = 0x05 + # THRESHOLDS # W 4 bytes generated when eCO2 ppm crosses a threshold The encoded + # current baseline value can be read. A + _THRESHOLDS = 0x10 + # BASELINE # R/W 2 bytes previously saved encoded baseline can be written. + _BASELINE = 0x11 + _HW_ID = 0x20 # HW_ID # R 1 byte Hardware ID. The value is 0x81 + # HW Version # R 1 byte Hardware Version. The value is 0x1X FirmwareBoot Version. + # The first 2 bytes contain the + _HW = 0x21 + # FW_Boot_Version # R 2 bytes firmware version number for the boot code. Firmware + # Application Version. The first 2 bytes contain + _FW_BOOT_VERSION = 0x23 + # FW_App_Version # R 2 bytes the firmware version number for the application code + _FW_APP_VERSION = 0x24 + # Internal_State # R 1 byte Internal Status register Error ID. When the status + # register reports an error its + _INTERNAL_STATE = 0xA0 + # ERROR_ID # R 1 byte source is located in this register If the correct 4 bytes + # ( 0x11 0xE5 0x72 0x8A) are written + _ERROR_ID = 0xE0 + # SW_RESET # W 4 bytes to this register in a single sequence the device will reset + # and return to BOOT mode. + _SW_RESET = 0xFF + + # Figure 25: CCS811 Bootloader Register Map + # Address Register R/W Size Description + _STATUS = 0x00 + _HW_ID = 0x20 + _HW_Version = 0x21 + _APP_ERASE = 0xF1 + _APP_DATA = 0xF2 + _APP_VERIFY = 0xF3 + _APP_START = 0xF4 + _SW_RESET = 0xFF + + def __init__(self, address=None, device=None): + super().__init__(address or self._ADDRESS, device) + self.fetchID() + self.softwareReset() + + def softwareReset(self): + self.write([0x11, 0xE5, 0x72, 0x8A], self._SW_RESET) + + def fetchID(self): + hardware_id = (self.read(1, self._HW_ID))[0] + time.sleep(0.02) # 20ms + hardware_version = (self.read(1, self._HW_Version))[0] + time.sleep(0.02) # 20ms + boot_version = (self.read(2, self._FW_BOOT_VERSION))[0] + time.sleep(0.02) # 20ms + app_version = (self.read(2, self._FW_APP_VERSION))[0] + + return { + "hardware_id": hardware_id, + "hardware_version": hardware_version, + "boot_version": boot_version, + "app_version": app_version, + } + + def app_erase(self): + self.write([0xE7, 0xA7, 0xE6, 0x09], self._APP_ERASE) + time.sleep(0.3) + + def app_start(self): + self.write([], self._APP_START) + + def set_measure_mode(self, mode): + self.write([mode << 4], self._MEAS_MODE) + + def get_measure_mode(self): + print(self.read(10, self._MEAS_MODE)) + + def get_status(self): + status = (self.read(1, self._STATUS))[0] + return status + + def decode_status(self, status): + s = "" + if (status & (1 << 7)) > 0: + s += "Sensor is in application mode" + else: + s += "Sensor is in boot mode" + if (status & (1 << 6)) > 0: + s += ", APP_ERASE" + if (status & (1 << 5)) > 0: + s += ", APP_VERIFY" + if (status & (1 << 4)) > 0: + s += ", APP_VALID" + if (status & (1 << 3)) > 0: + s += ", DATA_READY" + if (status & 1) > 0: + s += ", ERROR" + return s + + def decode_error(self, error_id): + s = "" + if (error_id & (1 << 0)) > 0: + s += ( + ", The CCS811 received an I²C write request addressed to this station " + "but with invalid register address ID" + ) + if (error_id & (1 << 1)) > 0: + s += ( + ", The CCS811 received an I²C read request to a mailbox ID that is " + "invalid" + ) + if (error_id & (1 << 2)) > 0: + s += ( + ", The CCS811 received an I²C request to write an unsupported mode to " + "MEAS_MODE" + ) + if (error_id & (1 << 3)) > 0: + s += ( + ", The sensor resistance measurement has reached or exceeded the " + "maximum range" + ) + if (error_id & (1 << 4)) > 0: + s += ", The Heater current in the CCS811 is not in range" + if (error_id & (1 << 5)) > 0: + s += ", The Heater voltage is not being applied correctly" + return "Error: " + s[2:] + + def measure(self): + data = self.read(8, self._ALG_RESULT_DATA) + eCO2 = data[0] * 256 + data[1] + eTVOC = data[2] * 256 + data[3] + status = data[4] + error_id = data[5] + # raw_data = 256 * data[6] + data[7] + # raw_current = raw_data >> 10 + # raw_voltage = (raw_data & ((1 << 10) - 1)) * (1.65 / 1023) + + result = {"eCO2": eCO2, "eTVOC": eTVOC, "status": status, "error_id": error_id} + + if error_id > 0: + raise RuntimeError(self.decodeError(error_id)) + return result diff --git a/pslab/external/display.py b/pslab/external/display.py new file mode 100644 index 00000000..05483e2a --- /dev/null +++ b/pslab/external/display.py @@ -0,0 +1,468 @@ +"""Control display devices such as OLED screens. + +Example +------- +>>> from pslab.bus import I2CMaster +>>> from pslab.external.display import SSD1306 +>>> i2c = I2CMaster() # Initialize bus +>>> i2c.configure(1e6) # Set bus speed to 1 MHz. +>>> oled = SSD1306("fast") +>>> oled.clear() +>>> oled.write_string("Hello world!") +>>> oled.scroll("topright") +>>> time.sleep(2.8) +>>> oled.scroll("stop") +""" +import json +import os.path + +try: + from PIL import Image + + HASPIL = True +except ImportError: + HASPIL = False + +from pslab.bus import I2CSlave + +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) + + +class SSD1306(I2CSlave): + """Interface to a monochrome OLED display driven by an SSD1306 chip. + + Parameters + ---------- + speed : {'slow' ,'medium', 'fast'}, optional + Controls how many bytes of data are written to the display at once. + More bytes written at once means faster draw rate, but requires that + the baudrate of the underlying I2C bus is high enough to avoid timeout. + The default value is 'slow'. + sh1106 : bool, optional + Set this to True if the OLED is driven by a SH1106 chip rather than a + SSD1306. + """ + + _COPYRIGHT = """ + Copyright (c) 2021, FOSSASIA + Copyright (c) 2012, Adafruit Industries + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ + _ADDRESS = 0x3C + _WIDTH = 128 + _HEIGHT = 64 + _LOWCOLUMNOFFSET = 0 + + _SETCONTRAST = 0x81 + _DISPLAYALLON_RESUME = 0xA4 + _DISPLAYALLON = 0xA5 + _NORMALDISPLAY = 0xA6 + _INVERTDISPLAY = 0xA7 + _DISPLAYOFF = 0xAE + _DISPLAYON = 0xAF + _SETDISPLAYOFFSET = 0xD3 + _SETCOMPINS = 0xDA + _SETVCOMDETECT = 0xDB + _SETDISPLAYCLOCKDIV = 0xD5 + _SETPRECHARGE = 0xD9 + _SETMULTIPLEX = 0xA8 + _SETLOWCOLUMN = 0x00 + _SETHIGHCOLUMN = 0x10 + _SETSTARTLINE = 0x40 + _MEMORYMODE = 0x20 + _SETPAGESTART = 0xB0 + _COMSCANINC = 0xC0 + _COMSCANDEC = 0xC8 + _SEGREMAP = 0xA0 + _CHARGEPUMP = 0x8D + _EXTERNALVCC = 0x1 + _SWITCHCAPVCC = 0x2 + + # fmt: off + _INIT_DATA = [ + _DISPLAYOFF, + _SETDISPLAYCLOCKDIV, 0x80, # Default aspect ratio. + _SETMULTIPLEX, 0x3F, + _SETDISPLAYOFFSET, 0x0, # No offset. + _SETSTARTLINE | 0x0, # Line #0. + _CHARGEPUMP, 0x14, + _MEMORYMODE, 0x02, # Page addressing + _SEGREMAP | 0x1, + _COMSCANDEC, + _SETCOMPINS, 0x12, + _SETCONTRAST, 0xFF, + _SETPRECHARGE, 0xF1, + _SETVCOMDETECT, 0x40, + _DISPLAYALLON_RESUME, + _NORMALDISPLAY, + _DISPLAYON, + ] + # fmt: on + + def __init__(self, device=None, speed="slow"): + super().__init__(device=device, address=self._ADDRESS) + self._buffer = [0 for a in range(1024)] + self.cursor = [0, 0] + self.textsize = 1 + self.textcolor = 1 + self.textbgcolor = 0 + self.wrap = True + self._contrast = 0xFF + self.speed = speed + + with open(os.path.join(__location__, "ssd1306_gfx.json"), "r") as f: + gfx = json.load(f) + + self._logo = gfx["logo"] + self._font = gfx["font"] + + for command in self._INIT_DATA: + self._write_command(command) + + self.display_logo() + + def display_logo(self): + """Display pslab.io logo.""" + self.scroll("stop") + self._buffer = self._logo[:] + self.update() + + def _write_command(self, command: int): + self.write_byte(command) + + def _write_data(self, data: list): + self.write(data, register_address=0x40) + + def clear(self): + """Clear the display.""" + self.cursor = [0, 0] + self._buffer = [0] * (self._WIDTH * self._HEIGHT // 8) + self.update() + + def update(self): + """Redraw display.""" + for i in range(8): + self._write_command(self._SETLOWCOLUMN | self._LOWCOLUMNOFFSET) + self._write_command(self._SETHIGHCOLUMN | 0) + self._write_command(self._SETPAGESTART | i) + + if self.speed == "slow": + for j in range(self._WIDTH): + self._write_data([self._buffer[i * self._WIDTH + j]]) + elif self.speed == "medium": + for j in range(self._WIDTH // 8): + self._write_data( + self._buffer[ + i * self._WIDTH + j * 8 : i * self._WIDTH + 8 * (j + 1) + ] + ) + else: + self._write_data(self._buffer[self._WIDTH * i : self._WIDTH * (i + 1)]) + + @property + def contrast(self) -> int: + """int: Screen contrast.""" + return self._contrast + + @contrast.setter + def contrast(self, value: int): + self._write_command(self._SETCONTRAST) + self._write_command(value) + self._contrast = value + + def _draw(self, update: bool = True): + if update: + self.update() + + def draw_pixel(self, x: int, y: int, color: int, update: bool = True): + """Draw a single pixel.""" + if color == 1: + self._buffer[x + (y // 8) * self._WIDTH] |= 1 << (y % 8) + else: + self._buffer[x + (y // 8) * self._WIDTH] &= ~(1 << (y % 8)) + self._draw(update) + + def draw_circle(self, x0, y0, r, color, update: bool = True): + """Draw a circle.""" + f = 1 - r + ddF_x = 1 + ddF_y = -2 * r + x = 0 + y = r + self.draw_pixel(x0, y0 + r, color, False) + self.draw_pixel(x0, y0 - r, color, False) + self.draw_pixel(x0 + r, y0, color, False) + self.draw_pixel(x0 - r, y0, color, False) + + while x < y: + if f >= 0: + y -= 1 + ddF_y += 2 + f += ddF_y + + x += 1 + ddF_x += 2 + f += ddF_x + self.draw_pixel(x0 + x, y0 + y, color, False) + self.draw_pixel(x0 - x, y0 + y, color, False) + self.draw_pixel(x0 + x, y0 - y, color, False) + self.draw_pixel(x0 - x, y0 - y, color, False) + self.draw_pixel(x0 + y, y0 + x, color, False) + self.draw_pixel(x0 - y, y0 + x, color, False) + self.draw_pixel(x0 + y, y0 - x, color, False) + self.draw_pixel(x0 - y, y0 - x, color, False) + + self._draw(update) + + def draw_line(self, x0, y0, x1, y1, color, update: bool = True): + """Draw a line.""" + is_steep = abs(y1 - y0) > abs(x1 - x0) + + if is_steep: + tmp = y0 + y0 = x0 + x0 = tmp + tmp = y1 + y1 = x1 + x1 = tmp + + if x0 > x1: + tmp = x1 + x1 = x0 + x0 = tmp + tmp = y1 + y1 = y0 + y0 = tmp + + dx = x1 - x0 + dy = abs(y1 - y0) + err = dx / 2 + + if y0 < y1: + ystep = 1 + else: + ystep = -1 + + while x0 <= x1: + if is_steep: + self.draw_pixel(y0, x0, color, False) + else: + self.draw_pixel(x0, y0, color, False) + err -= dy + + if err < 0: + y0 += ystep + err += dx + x0 += 1 + + self._draw(update) + + def draw_rectangle(self, x0, y0, width, height, color, update: bool = True): + """Draw a rectangle.""" + self.draw_horizontal_line(x0, y0, width, color, False) + self.draw_horizontal_line(x0, y0 + height - 1, width, color, False) + self.draw_vertical_line(x0, y0, height, color, False) + self.draw_vertical_line(x0 + width - 1, y0, height, color, False) + self._draw(update) + + def draw_vertical_line(self, x0, y0, length, color, update: bool = True): + """Draw a vertical line.""" + self.draw_line(x0, y0, x0, y0 + length - 1, color, update) + + def draw_horizontal_line(self, x0, y0, length, color, update: bool = True): + """Draw a horizontal line.""" + self.draw_line(x0, y0, x0 + length - 1, y0, color, update) + + def fill_rectangle(self, x0, y0, width, height, color, update: bool = True): + """Draw a filled rectangle.""" + for i in range(x0, x0 + width): + self.draw_vertical_line(i, y0, height, color, False) + self._draw(update) + + def write_string(self, s: str, update: bool = True): + """Write a string on screen.""" + for a in s: + self._write_char(ord(a), False) + self._draw(update) + + def _write_char(self, c: int, update: bool = True): + """Write a single character on screen.""" + if c == "\n": + self.cursor[1] += self.textsize * 8 + self.cursor[0] = 0 + elif c == "\r": + pass + else: + self._draw_char( + self.cursor[0], + self.cursor[1], + c, + self.textcolor, + self.textbgcolor, + self.textsize, + ) + self.cursor[0] += self.textsize * 6 + + if self.wrap and (self.cursor[0] > (self._WIDTH - self.textsize * 6)): + self.cursor[1] += self.textsize * 8 + self.cursor[0] = 0 + + self._draw(update) + + def _draw_char(self, x0, y0, c, color, bg, size): + if ( + (x0 >= self._WIDTH) + or (y0 >= self._HEIGHT) + or ((x0 + 5 * size - 1) < 0) + or ((y0 + 8 * size - 1) < 0) + ): + return + for i in range(6): + if i == 5: + line = 0x0 + else: + line = self._font[c * 5 + i] + for j in range(8): + if line & 0x1: + if size == 1: + self.draw_pixel(x0 + i, y0 + j, color, False) + else: + self.fill_rectangle( + x0 + (i * size), y0 + (j * size), size, size, color, False + ) + elif bg != color: + if size == 1: + self.draw_pixel(x0 + i, y0 + j, bg, False) + else: + self.fill_rectangle( + x0 + i * size, y0 + j * size, size, size, bg, False + ) + line >>= 1 + + def scroll(self, direction: str): + """Scroll the screen contents. + + Parameters + ---------- + direction : {'left', 'right', 'stop'} + Scrolling direction. + """ + if direction == "left": + self._write_command(0x27) # up-0x29 ,2A left-0x27 right0x26 + if direction == "right": + self._write_command(0x26) # up-0x29 ,2A left-0x27 right0x26 + if direction in ["topright", "bottomright"]: + self._write_command(0x29) # up-0x29 ,2A left-0x27 right0x26 + if direction in ["topleft", "bottomleft"]: + self._write_command(0x2A) # up-0x29 ,2A left-0x27 right0x26 + + if direction in [ + "left", + "right", + "topright", + "topleft", + "bottomleft", + "bottomright", + ]: + self._write_command(0x0) # dummy + self._write_command(0x0) # start page + self._write_command(0x7) # time interval 0b100 - 3 frames + self._write_command(0xF) # end page + if direction in ["topleft", "topright"]: + self._write_command(0x02) + elif direction in ["bottomleft", "bottomright"]: + self._write_command(0xFE) + + if direction in ["left", "right"]: + self._write_command(0x02) + self._write_command(0xFF) + + self._write_command(0x2F) + + if direction == "stop": + self._write_command(0x2E) + + def poweron(self): + """Turn the display on.""" + self._write_command(self._DISPLAYON) + + def poweroff(self): + """Turn the display off.""" + self._write_command(self._DISPLAYOFF) + + def display(self, image: Image): + """Display an image. + + Parameters + ---------- + image : Image + A PIL.Image instance. + """ + if not HASPIL: + raise ImportError( + "Displaying images requires PIL, but it is not installed." + ) + + if not image.size == (128, 64): + image = image.resize((128, 64)) + + if not image.mode == "1": + image = image.convert("1") + + image_data = image.getdata() + pixels_per_page = self._WIDTH * 8 + buf = bytearray(self._WIDTH) + buffer = [] + + for y in range(0, int(8 * pixels_per_page), pixels_per_page): + offsets = [y + self._WIDTH * i for i in range(8)] + + for x in range(self._WIDTH): + buf[x] = ( + (image_data[x + offsets[0]] and 0x01) + | (image_data[x + offsets[1]] and 0x02) + | (image_data[x + offsets[2]] and 0x04) + | (image_data[x + offsets[3]] and 0x08) + | (image_data[x + offsets[4]] and 0x10) + | (image_data[x + offsets[5]] and 0x20) + | (image_data[x + offsets[6]] and 0x40) + | (image_data[x + offsets[7]] and 0x80) + ) + + buffer += list(buf) + + self._buffer = buffer + self.update() + + +class SH1106(SSD1306): + """Interface to a monochrome OLED display driven by an SH1106 chip. + + SH1106 is a common OLED driver which is almost identical to the SSD1306. + OLED displays are sometimes advertised as using SSD1306 when they in fact + use SH1106. + """ + + _LOWCOLUMNOFFSET = 2 diff --git a/pslab/external/gas_sensor.py b/pslab/external/gas_sensor.py new file mode 100644 index 00000000..9e3f6867 --- /dev/null +++ b/pslab/external/gas_sensor.py @@ -0,0 +1,158 @@ +"""Gas sensors can be used to measure the concentration of certain gases.""" + +from typing import Callable, Union + +from pslab import Multimeter +from pslab.serial_handler import SerialHandler + + +class MQ135: + """MQ135 is a cheap gas sensor that can detect several harmful gases. + + The MQ135 is most suitable for detecting flammable gases, but can also be + used to measure CO2. + + Parameters + ---------- + gas : {CO2, CO, EtOH, NH3, Tol, Ace} + The gas to be detected: + CO2: Carbon dioxide + CO: Carbon monoxide + EtOH: Ethanol + NH3: Ammonia + Tol: Toluene + Ace: Acetone + r_load : float + Load resistance in ohm. + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. + channel : str, optional + Analog input on which to monitor the sensor output voltage. The default + value is CH1. Be aware that the sensor output voltage can be as high + as 5 V, depending on load resistance and gas concentration. + r0 : float, optional + The sensor resistance when exposed to 100 ppm NH3 at 20 degC and 65% + RH. Varies between individual sensors. Optional, but gas concentration + cannot be measured unless R0 is known. If R0 is not known, + :meth:`measure_r0` to find it. + temperature : float or Callable, optional + Ambient temperature in degC. The default value is 20. A callback can + be provided in place of a fixed value. + humidity : float or Callable, optional + Relative humidity between 0 and 1. The default value is 0.65. A + callback can be provided in place of a fixed value. + """ + + # Parameters manually extracted from data sheet. + # ppm = A * (Rs/R0) ^ B + _PARAMS = { + "CO2": [109, -2.88], + "CO": [583, -3.93], + "EtOH": [76.4, -3.18], + "NH3": [102, -2.49], + "Tol": [44.6, -3.45], + "Ace": [33.9, -3.42], + } + + # Assuming second degree temperature dependence and linear humidity dependence. + _TEMPERATURE_CORRECTION = [3.28e-4, -2.55e-2, 1.38] + _HUMIDITY_CORRECTION = -2.24e-1 + + def __init__( + self, + gas: str, + r_load: float, + device: SerialHandler = None, + channel: str = "CH1", + r0: float = None, + temperature: Union[float, Callable] = 20, + humidity: Union[float, Callable] = 0.65, + ): + self._multimeter = Multimeter(device) + self._params = self._PARAMS[gas] + self.channel = channel + self.r_load = r_load + self.r0 = r0 + self.vcc = 5 + + if isinstance(temperature, Callable): + self._temperature = temperature + else: + + def _temperature(): + return temperature + + self._temperature = _temperature + + if isinstance(humidity, Callable): + self._humidity = humidity + else: + + def _humidity(): + return humidity + + self._humidity = _humidity + + @property + def _voltage(self): + return self._multimeter.measure_voltage(self.channel) + + @property + def _correction(self): + """Correct sensor resistance for temperature and humidity. + + Coefficients are averages of curves fitted to temperature data for 33% + and 85% relative humidity extracted manually from the data sheet. + Humidity dependence is assumed to be linear, and is centered on 65% RH. + """ + t = self._temperature() + h = self._humidity() + a, b, c, d = *self._TEMPERATURE_CORRECTION, self._HUMIDITY_CORRECTION + return a * t**2 + b * t + c + d * (h - 0.65) + + @property + def _sensor_resistance(self): + return (self.vcc / self._voltage - 1) * self.r_load / self._correction + + def measure_concentration(self): + """Measure the concentration of the configured gas. + + Returns + ------- + concentration : float + Gas concentration in ppm. + """ + try: + return ( + self._params[0] * (self._sensor_resistance / self.r0) ** self._params[1] + ) + except TypeError: + raise TypeError("r0 is not set.") + + def measure_r0(self, gas_concentration: float): + """Determine sensor resistance at 100 ppm NH3 in otherwise clean air. + + For best results, monitor R0 over several hours and use the average + value. + + The sensor resistance at 100 ppm NH3 (R0) is used as a reference + against which the present sensor resistance must be compared in order + to calculate gas concentration. + + R0 can be determined by calibrating the sensor at any known gas + concentration. + + Parameters + ---------- + gas_concentration : float + A known concentration of the configured gas in ppm. + + Returns + ------- + r0 : float + The sensor resistance at 100 ppm NH3 in ohm. + """ + return self._sensor_resistance * (gas_concentration / self._params[0]) ** ( + 1 / -self._params[1] + ) diff --git a/pslab/external/hcsr04.py b/pslab/external/hcsr04.py new file mode 100644 index 00000000..602173df --- /dev/null +++ b/pslab/external/hcsr04.py @@ -0,0 +1,119 @@ +"""Ultrasonic distance sensors.""" + +import time + +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.waveform_generator import PWMGenerator +from pslab.serial_handler import SerialHandler + + +class HCSR04: + """Read data from ultrasonic distance sensor HC-SR04/HC-SR05. + + These sensors can measure distances between 2 cm to 4 m (SR04) / 4.5 m + (SR05). + + Sensors must have separate trigger and echo pins. First a 10 µs pulse is + output on the trigger pin. The trigger pin must be connected to the TRIG + pin on the sensor prior to use. + + Upon receiving this pulse, the sensor emits a sequence of sound pulses, and + the logic level of its echo pin is also set high. The logic level goes LOW + when the sound packet returns to the sensor, or when a timeout occurs. + Timeout occurs if no echo is received within the time slot determinded by + the sensor's maximum range. + + The ultrasound sensor outputs a series of eight sound pulses at 40 kHz, + which corresponds to a time period of 25 µs per pulse. These pulses reflect + off of the nearest object in front of the sensor, and return to it. The + time between sending and receiving of the pulse packet is used to estimate + the distance. If the reflecting object is either too far away or absorbs + sound, less than eight pulses may be received, and this can cause a + measurement error of 25 µs which corresponds to 8 mm. + + Parameters + ---------- + device : :class:`SerialHandler` + Serial connection to PSLab device. + trig : str, optional + Name of the trigger pin. Defaults to SQ1. + echo : str, optional + Name of the echo pin. Defaults to LA1. + + Example + ------- + In this example the sensor's Vcc pin is connected to the PSLab's PV1 pin, + the Trig pin is connected to SQ1, Echo to LA1, and Gnd to GND. + + >>> import pslab + >>> from pslab.external.hcsr04 import HCSR04 + >>> psl = pslab.ScienceLab() + >>> distance_sensor = HCSR04(psl) + >>> psl.power_supply.pv1 = 5 # Power the sensor. + >>> distance_sensor.estimate_distance() + 2.36666667 + """ + + def __init__( + self, + device: SerialHandler, + trig: str = "SQ1", + echo: str = "LA1", + ): + self._device = device + self._la = LogicAnalyzer(self._device) + self._pwm = PWMGenerator(self._device) + self._trig = trig + self._echo = echo + self._measure_period = 60e-3 # Minimum recommended by datasheet. + self._trigger_pulse_length = 10e-6 + + def estimate_distance( + self, + average: int = 10, + speed_of_sound: float = 340, + ) -> float: + """Estimate distance to an object. + + Parameters + ---------- + average : int, optional + Number of times to repeat the measurement and average the results. + Defaults to 10. + speed_of_sound : float, optional + Speed of sound in air. Defaults to 340 m/s. + + Returns + ------- + distance : float + Distance to object in meters. + + Raises + ------ + RuntimeError if the ECHO pin is not LOW at start of measurement. + TimeoutError if the end of the ECHO pulse is not detected (i.e. the + object is too far away). + """ + self._la.capture( + channels=self._echo, + events=2 * average, + block=False, + ) + self._pwm.generate( + channels=self._trig, + frequency=self._measure_period**-1, + duty_cycles=self._trigger_pulse_length / self._measure_period, + ) + # Wait one extra period to make sure we don't miss the final edge. + time.sleep(self._measure_period * (average + 1)) + self._pwm.set_state(**{self._trig.lower(): 0}) + (t,) = self._la.fetch_data() + self._sanity_check(len(t), 2 * average) + high_times = t[1::2] - t[::2] + return speed_of_sound * high_times.mean() / 2 * 1e-6 + + def _sanity_check(self, events: int, expected_events: int): + if self._la.get_initial_states()[self._echo]: + raise RuntimeError("ECHO pin was HIGH when measurement started.") + if events < expected_events: + raise TimeoutError diff --git a/pslab/external/motor.py b/pslab/external/motor.py new file mode 100644 index 00000000..1fba065b --- /dev/null +++ b/pslab/external/motor.py @@ -0,0 +1,169 @@ +"""Motor control related classes. + +Examples +-------- +>>> from pslab.external.motor import Servo +>>> servo = Servo("SQ1") +>>> servo.angle = 30 # Turn motor to 30 degrees position. +""" + +import time +from typing import List +from typing import Union +import csv +import os + +from pslab.instrument.waveform_generator import PWMGenerator +from datetime import datetime + +MICROSECONDS = 1e6 + + +class Servo: + """Control servo motors on SQ1-4. + + Parameters + ---------- + pin : {"SQ1", "SQ2", "SQ3", "SQ4"} + Name of the digital output on which to generate the control signal. + pwm_generator : :class:`PWMGenerator`, optional + PWMGenerator instance with which to generate the control signal. + Created automatically if not specified. When contolling multiple + servos, they should all use the same PWMGenerator instance. + min_angle_pulse : int, optional + Pulse length in microseconds corresponding to the minimum (0 degree) + angle of the servo. The default value is 500. + max_angle_pulse : int, optional + Pulse length in microseconds corresponding to the maximum (180 degree) + angle of the servo. The default value is 2500. + angle_range : int + Range of the servo in degrees. The default value is 180. + frequency : float, optional + Frequency of the control signal in Hz. The default value is 50. + """ + + def __init__( + self, + pin: str, + pwm_generator: PWMGenerator = None, + min_angle_pulse: int = 500, + max_angle_pulse: int = 2500, + angle_range: int = 180, + frequency: float = 50, + ): + self._pwm = PWMGenerator() if pwm_generator is None else pwm_generator + self._pin = pin + self._angle = None + self._min_angle_pulse = min_angle_pulse + self._max_angle_pulse = max_angle_pulse + self._angle_range = angle_range + self._frequency = frequency + + @property + def angle(self) -> Union[int, None]: + """:obj:`int` or :obj:`None`: Angle of the servo in degrees.""" + return self._angle + + @angle.setter + def angle(self, value: int): + duty_cycle = self._get_duty_cycle(value) + self._pwm.generate(self._pin, self._frequency, duty_cycle) + self._angle = value + + def _get_duty_cycle(self, angle): + angle /= self._angle_range # Normalize + angle *= self._max_angle_pulse - self._min_angle_pulse # Scale + angle += self._min_angle_pulse # Offset + return angle / (self._frequency**-1 * MICROSECONDS) + + +class RoboticArm: + """Robotic arm controller for up to 4 servos.""" + + MAX_SERVOS = 4 + + def __init__(self, servos: List[Servo]) -> None: + if len(servos) > RoboticArm.MAX_SERVOS: + raise ValueError( + f"At most {RoboticArm.MAX_SERVOS} servos can be used, got {len(servos)}" + ) + self.servos = servos + + def run_schedule(self, timeline: List[List[int]], time_step: float = 1.0) -> None: + """Run a time-based schedule to move servos. + + Parameters + ---------- + timeline : List[List[int]] + A list of timesteps,where each sublist represents one timestep, + with angles corresponding to each servo. + + time_step : float, optional + Delay in seconds between each timestep. Default is 1.0. + """ + if len(timeline[0]) != len(self.servos): + raise ValueError("Each timestep must specify an angle for every servo") + + tl_len = len(timeline[0]) + if not all(len(tl) == tl_len for tl in timeline): + raise ValueError("All timeline entries must have the same length") + + for tl in timeline: + for i, s in enumerate(self.servos): + if tl[i] is not None: + s.angle = tl[i] + time.sleep(time_step) + + def import_timeline_from_csv(self, filepath: str) -> List[List[int]]: + """Import timeline from a CSV file. + + Parameters + ---------- + filepath : str + Absolute or relative path to the CSV file to be read. + + Returns + ------- + List[List[int]] + A timeline consisting of servo angle values per timestep. + """ + timeline = [] + + with open(filepath, mode="r", newline="") as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + angles = [] + for key in ["Servo1", "Servo2", "Servo3", "Servo4"]: + value = row[key] + if value == "null": + angles.append(None) + else: + angles.append(int(value)) + timeline.append(angles) + + return timeline + + def export_timeline_to_csv( + self, timeline: List[List[Union[int, None]]], folderpath: str + ) -> None: + """Export timeline to a CSV file. + + Parameters + ---------- + timeline : List[List[Union[int, None]]] + A list of timesteps where each sublist contains servo angles. + + folderpath : str + Directory path where the CSV file will be saved. The filename + will include a timestamp to ensure uniqueness. + """ + timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + filename = f"Robotic_Arm{timestamp}.csv" + filepath = os.path.join(folderpath, filename) + + with open(filepath, mode="w", newline="") as csvfile: + writer = csv.writer(csvfile) + writer.writerow(["Timestep", "Servo1", "Servo2", "Servo3", "Servo4"]) + for i, row in enumerate(timeline): + pos = ["null" if val is None else val for val in row] + writer.writerow([i] + pos) diff --git a/PSL/sensorlist.py b/pslab/external/sensorlist.py similarity index 100% rename from PSL/sensorlist.py rename to pslab/external/sensorlist.py diff --git a/pslab/external/ssd1306_gfx.json b/pslab/external/ssd1306_gfx.json new file mode 100644 index 00000000..efd75748 --- /dev/null +++ b/pslab/external/ssd1306_gfx.json @@ -0,0 +1 @@ +{"logo": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 224, 240, 240, 224, 112, 224, 240, 224, 224, 224, 192, 0, 0, 0, 128, 192, 224, 240, 240, 112, 112, 112, 240, 224, 224, 32, 0, 0, 0, 0, 240, 224, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 240, 248, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 255, 239, 143, 143, 143, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 224, 240, 224, 112, 253, 127, 127, 63, 7, 0, 0, 7, 31, 63, 63, 60, 120, 120, 120, 240, 240, 240, 225, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 206, 198, 239, 198, 231, 206, 239, 254, 254, 248, 160, 0, 0, 0, 255, 255, 255, 253, 14, 6, 14, 15, 190, 254, 252, 248, 64, 0, 0, 0, 192, 192, 224, 224, 224, 224, 192, 128, 0, 0, 0, 170, 255, 85, 1, 1, 0, 119, 255, 255, 15, 7, 3, 1, 225, 241, 241, 241, 225, 1, 3, 7, 31, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 28, 60, 56, 56, 56, 56, 60, 61, 31, 31, 15, 1, 0, 0, 0, 63, 63, 63, 63, 60, 56, 60, 60, 56, 60, 60, 0, 0, 31, 31, 63, 61, 56, 56, 24, 14, 63, 63, 63, 18, 0, 0, 0, 63, 63, 63, 31, 28, 24, 56, 56, 62, 63, 31, 15, 0, 0, 0, 7, 31, 31, 63, 63, 63, 63, 31, 15, 0, 0, 0, 170, 255, 213, 192, 192, 192, 247, 255, 255, 252, 240, 224, 192, 195, 199, 199, 199, 195, 192, 224, 240, 252, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "font": [0, 0, 0, 0, 0, 62, 91, 79, 91, 62, 62, 107, 79, 107, 62, 28, 62, 124, 62, 28, 24, 60, 126, 60, 24, 28, 87, 125, 87, 28, 28, 94, 127, 94, 28, 0, 24, 60, 24, 0, 255, 231, 195, 231, 255, 0, 24, 36, 24, 0, 255, 231, 219, 231, 255, 48, 72, 58, 6, 14, 38, 41, 121, 41, 38, 64, 127, 5, 5, 7, 64, 127, 5, 37, 63, 90, 60, 231, 60, 90, 127, 62, 28, 28, 8, 8, 28, 28, 62, 127, 20, 34, 127, 34, 20, 95, 95, 0, 95, 95, 6, 9, 127, 1, 127, 0, 102, 137, 149, 106, 96, 96, 96, 96, 96, 148, 162, 255, 162, 148, 8, 4, 126, 4, 8, 16, 32, 126, 32, 16, 8, 8, 42, 28, 8, 8, 28, 42, 8, 8, 30, 16, 16, 16, 16, 12, 30, 12, 30, 12, 48, 56, 62, 56, 48, 6, 14, 62, 14, 6, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 7, 0, 7, 0, 20, 127, 20, 127, 20, 36, 42, 127, 42, 18, 35, 19, 8, 100, 98, 54, 73, 86, 32, 80, 0, 8, 7, 3, 0, 0, 28, 34, 65, 0, 0, 65, 34, 28, 0, 42, 28, 127, 28, 42, 8, 8, 62, 8, 8, 0, 128, 112, 48, 0, 8, 8, 8, 8, 8, 0, 0, 96, 96, 0, 32, 16, 8, 4, 2, 62, 81, 73, 69, 62, 0, 66, 127, 64, 0, 114, 73, 73, 73, 70, 33, 65, 73, 77, 51, 24, 20, 18, 127, 16, 39, 69, 69, 69, 57, 60, 74, 73, 73, 49, 65, 33, 17, 9, 7, 54, 73, 73, 73, 54, 70, 73, 73, 41, 30, 0, 0, 20, 0, 0, 0, 64, 52, 0, 0, 0, 8, 20, 34, 65, 20, 20, 20, 20, 20, 0, 65, 34, 20, 8, 2, 1, 89, 9, 6, 62, 65, 93, 89, 78, 124, 18, 17, 18, 124, 127, 73, 73, 73, 54, 62, 65, 65, 65, 34, 127, 65, 65, 65, 62, 127, 73, 73, 73, 65, 127, 9, 9, 9, 1, 62, 65, 65, 81, 115, 127, 8, 8, 8, 127, 0, 65, 127, 65, 0, 32, 64, 65, 63, 1, 127, 8, 20, 34, 65, 127, 64, 64, 64, 64, 127, 2, 28, 2, 127, 127, 4, 8, 16, 127, 62, 65, 65, 65, 62, 127, 9, 9, 9, 6, 62, 65, 81, 33, 94, 127, 9, 25, 41, 70, 38, 73, 73, 73, 50, 3, 1, 127, 1, 3, 63, 64, 64, 64, 63, 31, 32, 64, 32, 31, 63, 64, 56, 64, 63, 99, 20, 8, 20, 99, 3, 4, 120, 4, 3, 97, 89, 73, 77, 67, 0, 127, 65, 65, 65, 2, 4, 8, 16, 32, 0, 65, 65, 65, 127, 4, 2, 1, 2, 4, 64, 64, 64, 64, 64, 0, 3, 7, 8, 0, 32, 84, 84, 120, 64, 127, 40, 68, 68, 56, 56, 68, 68, 68, 40, 56, 68, 68, 40, 127, 56, 84, 84, 84, 24, 0, 8, 126, 9, 2, 24, 164, 164, 156, 120, 127, 8, 4, 4, 120, 0, 68, 125, 64, 0, 32, 64, 64, 61, 0, 127, 16, 40, 68, 0, 0, 65, 127, 64, 0, 124, 4, 120, 4, 120, 124, 8, 4, 4, 120, 56, 68, 68, 68, 56, 252, 24, 36, 36, 24, 24, 36, 36, 24, 252, 124, 8, 4, 4, 8, 72, 84, 84, 84, 36, 4, 4, 63, 68, 36, 60, 64, 64, 32, 124, 28, 32, 64, 32, 28, 60, 64, 48, 64, 60, 68, 40, 16, 40, 68, 76, 144, 144, 144, 124, 68, 100, 84, 76, 68, 0, 8, 54, 65, 0, 0, 0, 119, 0, 0, 0, 65, 54, 8, 0, 2, 1, 2, 4, 2, 60, 38, 35, 38, 60, 30, 161, 161, 97, 18, 58, 64, 64, 32, 122, 56, 84, 84, 85, 89, 33, 85, 85, 121, 65, 33, 84, 84, 120, 65, 33, 85, 84, 120, 64, 32, 84, 85, 121, 64, 12, 30, 82, 114, 18, 57, 85, 85, 85, 89, 57, 84, 84, 84, 89, 57, 85, 84, 84, 88, 0, 0, 69, 124, 65, 0, 2, 69, 125, 66, 0, 1, 69, 124, 64, 240, 41, 36, 41, 240, 240, 40, 37, 40, 240, 124, 84, 85, 69, 0, 32, 84, 84, 124, 84, 124, 10, 9, 127, 73, 50, 73, 73, 73, 50, 50, 72, 72, 72, 50, 50, 74, 72, 72, 48, 58, 65, 65, 33, 122, 58, 66, 64, 32, 120, 0, 157, 160, 160, 125, 57, 68, 68, 68, 57, 61, 64, 64, 64, 61, 60, 36, 255, 36, 36, 72, 126, 73, 67, 102, 43, 47, 252, 47, 43, 255, 9, 41, 246, 32, 192, 136, 126, 9, 3, 32, 84, 84, 121, 65, 0, 0, 68, 125, 65, 48, 72, 72, 74, 50, 56, 64, 64, 34, 122, 0, 122, 10, 10, 114, 125, 13, 25, 49, 125, 38, 41, 41, 47, 40, 38, 41, 41, 41, 38, 48, 72, 77, 64, 32, 56, 8, 8, 8, 8, 8, 8, 8, 8, 56, 47, 16, 200, 172, 186, 47, 16, 40, 52, 250, 0, 0, 123, 0, 0, 8, 20, 42, 20, 34, 34, 20, 42, 20, 8, 170, 0, 85, 0, 170, 170, 85, 170, 85, 170, 0, 0, 0, 255, 0, 16, 16, 16, 255, 0, 20, 20, 20, 255, 0, 16, 16, 255, 0, 255, 16, 16, 240, 16, 240, 20, 20, 20, 252, 0, 20, 20, 247, 0, 255, 0, 0, 255, 0, 255, 20, 20, 244, 4, 252, 20, 20, 23, 16, 31, 16, 16, 31, 16, 31, 20, 20, 20, 31, 0, 16, 16, 16, 240, 0, 0, 0, 0, 31, 16, 16, 16, 16, 31, 16, 16, 16, 16, 240, 16, 0, 0, 0, 255, 16, 16, 16, 16, 16, 16, 16, 16, 16, 255, 16, 0, 0, 0, 255, 20, 0, 0, 255, 0, 255, 0, 0, 31, 16, 23, 0, 0, 252, 4, 244, 20, 20, 23, 16, 23, 20, 20, 244, 4, 244, 0, 0, 255, 0, 247, 20, 20, 20, 20, 20, 20, 20, 247, 0, 247, 20, 20, 20, 23, 20, 16, 16, 31, 16, 31, 20, 20, 20, 244, 20, 16, 16, 240, 16, 240, 0, 0, 31, 16, 31, 0, 0, 0, 31, 20, 0, 0, 0, 252, 20, 0, 0, 240, 16, 240, 16, 16, 255, 16, 255, 20, 20, 20, 255, 20, 16, 16, 16, 31, 0, 0, 0, 0, 240, 16, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 0, 0, 0, 0, 0, 255, 255, 15, 15, 15, 15, 15, 56, 68, 68, 56, 68, 124, 42, 42, 62, 20, 126, 2, 2, 6, 6, 2, 126, 2, 126, 2, 99, 85, 73, 65, 99, 56, 68, 68, 60, 4, 64, 126, 32, 30, 32, 6, 2, 126, 2, 2, 153, 165, 231, 165, 153, 28, 42, 73, 42, 28, 76, 114, 1, 114, 76, 48, 74, 77, 77, 48, 48, 72, 120, 72, 48, 188, 98, 90, 70, 61, 62, 73, 73, 73, 0, 126, 1, 1, 1, 126, 42, 42, 42, 42, 42, 68, 68, 95, 68, 68, 64, 81, 74, 68, 64, 64, 68, 74, 81, 64, 0, 0, 255, 1, 3, 224, 128, 255, 0, 0, 8, 8, 107, 107, 8, 54, 18, 54, 36, 54, 6, 15, 9, 15, 6, 0, 0, 24, 24, 0, 0, 0, 16, 16, 0, 48, 64, 255, 1, 1, 0, 31, 1, 1, 30, 0, 25, 29, 23, 18, 0, 60, 60, 60, 60, 0, 0, 0, 0, 0]} \ No newline at end of file diff --git a/PSL/SENSORS/supported.py b/pslab/external/supported.py similarity index 100% rename from PSL/SENSORS/supported.py rename to pslab/external/supported.py diff --git a/pslab/external/tcd1304.py b/pslab/external/tcd1304.py new file mode 100644 index 00000000..aaec8346 --- /dev/null +++ b/pslab/external/tcd1304.py @@ -0,0 +1,129 @@ +"""Proof of concept TCD1304 driver. + +This driver can only drive the TCD1304 in normal mode, not electronic shutter +mode. This is because the PSLab can (currently) only output two different PWM +frequencies simultaneously, and electronic shutter mode requires three. + +Furthermode, the clock frequencies are locked to 2 MHz (master) and 125 Hz (SH +and ICG). The reason is the following: + +The ICG period must be greater than the readout period, which is: + master clock period * 4 * number of pixels = 7.4 ms +7.4 ms -> 135 Hz, which is therefore the fastest the ICG clock can run. + +The lowest possible frequency the PSLab can generate with sufficient +clock precision is 123 Hz. Below that the 16-bit timer that drives the +PWM must be prescaled so much that we can no longer satisfy the TCD1304's +timing requirements. + +Thus, the range of possible ICG frequencies is [123, 135], which is so small +that it makes more sense to just lock it to 125 Hz, which has the added +advantage of being an even divisor of the PSLab's MCU frequency (64 MHz). + +It should be possible to increase the master clock to 4 MHz, which would also +make ICG frequencies up to 250 Hz possible. However, the readout period would +be 3.7 ms, which the PSLab's oscilloscope might struggle to capture with good +quality. +""" + +from typing import List + +from numpy import ndarray + +from pslab import Oscilloscope +from pslab import PowerSupply +from pslab import PWMGenerator +from pslab.instrument.waveform_generator import _get_wavelength +from pslab.protocol import MAX_SAMPLES +from pslab.serial_handler import SerialHandler + + +class TCD1304: + def __init__(self, device: SerialHandler): + self._pwm = PWMGenerator(device) + self._oscilloscope = Oscilloscope(device) + self._sh_frequency = 125 + + def start_clocks(self, inverted: bool = True): + """Start the Master, SH, and ICG clocks. + + Parameters + ---------- + inverted : bool, optional + The TCD1304 datasheet recommends placing a hex inverter between the + sensor and the MCU. By default, the clocks are therefore inverted + relative to what they should be to drive the sensor. If you do not + use a hex inverter, set this to False. + + Returns + ------- + None. + + """ + self._pwm.map_reference_clock("SQ1", 6) # 2 MHz + + resolution = _get_wavelength(self._sh_frequency)[0] ** -1 + # Timing requirements: + # (1) The SH clock must go high between 100 ns to 1000 ns after the ICG + # clock goes low. + # (2) The SH clock must stay high for at least 1 µs. + # (3) The ICG clock must stay low at least 1 µs after the SH clock goes + # low. + # I got the following numbers through trial and error. They meet the + # above requirements. + # TODO: Calculate appropriate duty cycles and phases. + magic_numbers = [ + 12 * resolution, + 48 * resolution, + 16 * resolution, + 1 - 42 * resolution, + ] + + if inverted: + self._pwm.generate( + ["SQ2", "SQ3"], + frequency=self._sh_frequency, + duty_cycles=[1 - magic_numbers[0], magic_numbers[1]], + phases=[magic_numbers[2], 0], + ) + else: + self._pwm.generate( + ["SQ2", "SQ3"], + frequency=self._sh_frequency, + duty_cycles=[magic_numbers[0], 1 - magic_numbers[1]], + phases=[magic_numbers[3], 0], + ) + + def stop_clocks(self): + """Stop the Master, SH, and ICG clocks. + + Returns + ------- + None. + + """ + self._pwm.set_state(sq1=0, sq2=0, sq3=0) + + def read(self, analogin: str = "CH1", trigger: str = "CH2") -> List[ndarray]: + """Read the sensor's analog output. + + Connect one of the PSLab's analog inputs to the sensor's analog output. + + Parameters + ---------- + channel : str, optional + The analog input connected to the sensor's OS pin. + Defaults to "CH1". + trigger : str, optional + The analog input connected to the sensor's ICG pin. + Defaults to "CH2". + + Returns + ------- + List[ndarray] + Timestamps and corresponding voltages. + + """ + return self._oscilloscope.capture( + analogin, 8000, 1, trigger=3, trigger_channel=trigger + ) diff --git a/pslab/instrument/__init__.py b/pslab/instrument/__init__.py new file mode 100644 index 00000000..bdf88e7a --- /dev/null +++ b/pslab/instrument/__init__.py @@ -0,0 +1,5 @@ +"""Contains modules for controlling the PSLab's built-in instruments. + +The built-in instruments are ``LogicAnalyzer``, ``Multimeter``, +``Oscilloscope``, ``PowerSupply``, ``PWMGenerator``, and ``WaveformGenerator``. +""" diff --git a/PSL/achan.py b/pslab/instrument/analog.py similarity index 58% rename from PSL/achan.py rename to pslab/instrument/analog.py index f8003d40..bc3ccca0 100644 --- a/PSL/achan.py +++ b/pslab/instrument/analog.py @@ -1,19 +1,19 @@ """Objects related to the PSLab's analog input channels. -This module contains several module level variables with details on the analog inputs' -capabilities, including possible gain values, voltage ranges, and firmware-interal -enumeration. +This module contains several module level variables with details on the analog +inputs' capabilities, including possible gain values, voltage ranges, and +firmware-interal enumeration. -This module also contains the AnalogInput class, an instance of which functions as a -model of a particular analog input. +This module also contains the AnalogInput class, an instance of which functions +as a model of a particular analog input. """ +import logging from typing import List, Union import numpy as np -import PSL.commands_proto as CP -from PSL import packet_handler +logger = logging.getLogger(__name__) GAIN_VALUES = (1, 2, 4, 5, 8, 10, 16, 32) @@ -23,8 +23,9 @@ "CH3", "MIC", "CAP", - "SEN", - "AN8", + "RES", + "VOL", + "AN4", ) INPUT_RANGES = { @@ -33,8 +34,9 @@ "CH3": (-3.3, 3.3), # external gain control analog input "MIC": (-3.3, 3.3), # connected to MIC amplifier "CAP": (0, 3.3), - "SEN": (0, 3.3), - "AN8": (0, 3.3), + "RES": (0, 3.3), + "VOL": (0, 3.3), + "AN4": (0, 3.3), } PIC_ADC_MULTIPLEX = { @@ -43,9 +45,9 @@ "CH3": 1, "MIC": 2, "AN4": 4, - "SEN": 7, + "RES": 7, "CAP": 5, - "AN8": 8, + "VOL": 8, } @@ -54,38 +56,36 @@ class AnalogInput: Parameters ---------- - name : {'CH1', 'CH2', 'CH3', 'MIC', 'CAP', 'SEN', 'AN8'} + name : {'CH1', 'CH2', 'CH3', 'MIC', 'CAP', 'RES', 'VOL'} Name of the analog channel to model. - device : :class:`Handler` - Serial interface for communicating with the PSLab device. Attributes ---------- - gain - resolution samples_in_buffer : int Number of samples collected on this channel currently being held in the device's ADC buffer. - buffer_idx : Union[int, None] - Location in the device's ADC buffer where the samples are stored. None if no - samples captured by this channel are currently held in the buffer. + buffer_idx : int or None + Location in the device's ADC buffer where the samples are stored. None + if no samples captured by this channel are currently held in the + buffer. chosa : int Number used to refer to this channel in the firmware. """ - def __init__(self, name: str, device: packet_handler.Handler): + def __init__(self, name: str): self._name = name - self._device = device + self._resolution = 2**10 - 1 if self._name == "CH1": - self._programmable_gain_amplifier = 1 + self.programmable_gain_amplifier = 1 + self._gain = 1 elif self._name == "CH2": - self._programmable_gain_amplifier = 2 + self.programmable_gain_amplifier = 2 + self._gain = 1 else: - self._programmable_gain_amplifier = None + self.programmable_gain_amplifier = None + self._gain = 1 - self._gain = 1 - self._resolution = 2 ** 10 - 1 self.samples_in_buffer = 0 self.buffer_idx = None self._scale = np.poly1d(0) @@ -94,8 +94,8 @@ def __init__(self, name: str, device: packet_handler.Handler): self._calibrate() @property - def gain(self) -> Union[int, float, None]: - """Get or set the analog gain. + def gain(self) -> Union[int, None]: + """int: Analog gain. Setting a new gain level will automatically recalibrate the channel. On channels other than CH1 and CH2 gain is None. @@ -120,18 +120,12 @@ def gain(self, value: Union[int, float]): if value not in GAIN_VALUES: raise ValueError(f"Invalid gain. Valid values are {GAIN_VALUES}.") - gain_idx = GAIN_VALUES.index(value) - self._device.send_byte(CP.ADC) - self._device.send_byte(CP.SET_PGA_GAIN) - self._device.send_byte(self._programmable_gain_amplifier) - self._device.send_byte(gain_idx) - self._device.get_ack() self._gain = value self._calibrate() @property def resolution(self) -> int: - """Get or set the resolution in bits. + """int: Resolution in bits. Setting a new resolution will automatically recalibrate the channel. @@ -146,7 +140,7 @@ def resolution(self) -> int: def resolution(self, value: int): if value not in (10, 12): raise ValueError("Resolution must be 10 or 12 bits.") - self._resolution = 2 ** value - 1 + self._resolution = 2**value - 1 self._calibrate() def _calibrate(self): @@ -162,7 +156,7 @@ def _calibrate(self): def scale(self, raw: Union[int, List[int]]) -> float: """Translate raw integer value from device to corresponding voltage. - Inverse of :meth:`unscale. `. + Inverse of :meth:`unscale`. Parameters ---------- @@ -179,7 +173,7 @@ def scale(self, raw: Union[int, List[int]]) -> float: def unscale(self, voltage: float) -> int: """Translate a voltage to a raw integer value interpretable by the device. - Inverse of :meth:`scale. `. + Inverse of :meth:`scale`. Parameters ---------- @@ -196,3 +190,57 @@ def unscale(self, voltage: float) -> int: level = np.clip(level, 0, self._resolution) level = np.round(level) return int(level) + + +class AnalogOutput: + """Model of the PSLab's analog outputs. + + Parameters + ---------- + name : str + Name of the analog output pin represented by this instance. + + Attributes + ---------- + frequency : float + Frequency of the waveform on this pin in Hz. + wavetype : {'sine', 'tria', 'custom'} + Type of waveform on this pin. 'sine' is a sine wave with amplitude + 3.3 V, 'tria' is a triangle wave with amplitude 3.3 V, 'custom' is any + other waveform set with :meth:`load_function` or :meth:`load_table`. + """ + + RANGE = (-3.3, 3.3) + + def __init__(self, name): + self.name = name + self.frequency = 0 + self.wavetype = "sine" + self._waveform_table = self.RANGE[1] * np.sin( + np.arange( + self.RANGE[0], self.RANGE[1], (self.RANGE[1] - self.RANGE[0]) / 512 + ) + ) + + @property + def waveform_table(self) -> np.ndarray: + """numpy.ndarray: 512-value waveform table loaded on this output.""" + # A form of amplitude control. Max PWM duty cycle out of 512 clock cycles. + return self._range_normalize(self._waveform_table, 511) + + @waveform_table.setter + def waveform_table(self, points: np.ndarray): + if max(points) - min(points) > self.RANGE[1] - self.RANGE[0]: + logger.warning(f"Analog output {self.name} saturated.") + self._waveform_table = np.clip(points, self.RANGE[0], self.RANGE[1]) + + @property + def lowres_waveform_table(self) -> np.ndarray: + """numpy.ndarray: 32-value waveform table loaded on this output.""" + # Max PWM duty cycle out of 64 clock cycles. + return self._range_normalize(self._waveform_table[::16], 63) + + def _range_normalize(self, x: np.ndarray, norm: int = 1) -> np.ndarray: + """Normalize waveform table to the digital output range.""" + x = (x - self.RANGE[0]) / (self.RANGE[1] - self.RANGE[0]) * norm + return np.int16(np.round(x)).tolist() diff --git a/pslab/instrument/buffer.py b/pslab/instrument/buffer.py new file mode 100644 index 00000000..a2a5cdbb --- /dev/null +++ b/pslab/instrument/buffer.py @@ -0,0 +1,87 @@ +"""The PSLab has a sample buffer where collected data is stored temporarily.""" + +import pslab.protocol as CP + + +class ADCBufferMixin: + """Mixin for classes that need to read or write to the ADC buffer.""" + + def fetch_buffer(self, samples: int, starting_position: int = 0): + """Fetch a section of the ADC buffer. + + Parameters + ---------- + samples : int + Number of samples to fetch. + starting_position : int, optional + Location in the ADC buffer to start from. By default samples will + be fetched from the beginning of the buffer. + + Returns + ------- + received : list of int + List of received samples. + """ + received = [] + buf_size = 128 + remaining = samples + idx = starting_position + + while remaining > 0: + self._device.send_byte(CP.COMMON) + self._device.send_byte(CP.RETRIEVE_BUFFER) + self._device.send_int(idx) + samps = min(remaining, buf_size) + self._device.send_int(samps) + received += [self._device.get_int() for _ in range(samps)] + self._device.get_ack() + remaining -= samps + idx += samps + + return received + + def clear_buffer(self, samples: int, starting_position: int = 0): + """Clear a section of the ADC buffer. + + Parameters + ---------- + samples : int + Number of samples to clear from the buffer. + starting_position : int, optional + Location in the ADC buffer to start from. By default samples will + be cleared from the beginning of the buffer. + """ + self._device.send_byte(CP.COMMON) + self._device.send_byte(CP.CLEAR_BUFFER) + self._device.send_int(starting_position) + self._device.send_int(samples) + self._device.get_ack() + + def fill_buffer(self, data: list[int], starting_position: int = 0): + """Fill a section of the ADC buffer with data. + + Parameters + ---------- + data : list of int + Values to write to the ADC buffer. + starting_position : int, optional + Location in the ADC buffer to start from. By default writing will + start at the beginning of the buffer. + """ + buf_size = 128 + idx = starting_position + remaining = len(data) + + while remaining > 0: + self._device.send_byte(CP.COMMON) + self._device.send_byte(CP.FILL_BUFFER) + self._device.send_int(idx) + samps = min(remaining, buf_size) + self._device.send_int(samps) + + for value in data[idx : idx + samps]: + self._device.send_int(value) + + self._device.get_ack() + idx += samps + remaining -= samps diff --git a/pslab/instrument/digital.py b/pslab/instrument/digital.py new file mode 100644 index 00000000..6040202d --- /dev/null +++ b/pslab/instrument/digital.py @@ -0,0 +1,183 @@ +"""Objects related to the PSLab's digital input channels.""" + +import numpy as np + +DIGITAL_INPUTS = ("LA1", "LA2", "LA3", "LA4", "RES", "EXT", "FRQ") + +DIGITAL_OUTPUTS = ("SQ1", "SQ2", "SQ3", "SQ4") + +MODES = { + "sixteen rising": 5, + "four rising": 4, + "rising": 3, + "falling": 2, + "any": 1, + "disabled": 0, +} + + +class DigitalInput: + """Model of the PSLab's digital inputs. + + Parameters + ---------- + name : {"LA1", "LA2", "LA3", "LA4", "RES", "FRQ"} + Name of the digital channel to model. + + Attributes + ---------- + name : str + One of {"LA1", "LA2", "LA3", "LA4", "RES", "FRQ"}. + number : int + Number used to refer to this channel in the firmware. + datatype : str + Either "int" or "long", depending on if a 16 or 32-bit counter is used + to capture timestamps for this channel. + events_in_buffer : int + Number of logic events detected on this channel, the timestamps of + which are currently being held in the device's ADC buffer. + buffer_idx : Union[int, None] + Location in the device's ADC buffer where the events are stored. None + if no events captured by this channel are currently held in the buffer. + """ + + def __init__(self, name: str): + self.name = name + self.number = DIGITAL_INPUTS.index(self.name) + self.datatype = "long" + self.events_in_buffer = 0 + self.buffer_idx = None + self._logic_mode = MODES["any"] + + @property + def logic_mode(self) -> str: + """str: Type of logic event which should be captured on this channel. + + The options are: + any: Capture every edge. + rising: Capture every rising edge. + falling: Capture every falling edge. + four rising: Capture every fourth rising edge. + sixteen rising: Capture every fourth rising edge. + """ + return {v: k for k, v in MODES.items()}[self._logic_mode] + + def _get_xy(self, initial_state: bool, timestamps: np.ndarray): + x = np.repeat(timestamps, 3) + x = np.insert(x, 0, 0) + x[0] = 0 + y = np.array(len(x) * [False]) + + if self.logic_mode == "any": + y[0] = initial_state + for i in range(1, len(x), 3): + y[i] = y[i - 1] # Value before this timestamp. + y[i + 1] = not y[i] # Value at this timestamp. + y[i + 2] = y[i + 1] # Value leaving this timetamp. + elif self.logic_mode == "falling": + y[0] = True + for i in range(1, len(x), 3): + y[i] = True # Value before this timestamp. + y[i + 1] = False # Value at this timestamp. + y[i + 2] = True # Value leaving this timetamp. + else: + y[0] = False + for i in range(1, len(x), 3): + y[i] = False # Value before this timestamp. + y[i + 1] = True # Value at this timestamp. + y[i + 2] = False # Value leaving this timetamp. + + return x, y + + +class DigitalOutput: + """Model of the PSLab's digital outputs. + + Parameters + ---------- + name : {'SQ1', 'SQ2', 'SQ3', 'SQ4'} + Name of the digital output pin represented by the instance. + """ + + def __init__(self, name: str): + self._name = name + self._state = "LOW" + self._duty_cycle = 0 + self.phase = 0 + self.remapped = False + + @property + def name(self) -> str: + """str: Name of this pin.""" + return self._name + + @name.setter + def name(self, value): + if value in DIGITAL_OUTPUTS: + self._name = value + else: + e = f"Invalid digital output {value}. Choose one of {DIGITAL_OUTPUTS}." + raise ValueError(e) + + @property + def state(self) -> str: + """str: State of the digital output. Can be 'HIGH', 'LOW', or 'PWM'.""" + return self._state + + @property + def duty_cycle(self) -> float: + """float: Duty cycle of the PWM signal on this pin.""" + return self._duty_cycle + + @duty_cycle.setter + def duty_cycle(self, value: float): + if value == 0: + self._state = "LOW" + elif value < 1: + self._state = "PWM" + elif value == 1: + self._state = "HIGH" + else: + raise ValueError("Duty cycle must be in range [0, 1].") + + self._duty_cycle = value + + @property + def state_mask(self) -> int: + """int: State mask for this pin. + + The state mask is used in the DOUT->SET_STATE command to set the + digital output pins HIGH or LOW. For example: + + 0x10 | 1 << 0 | 0x40 | 0 << 2 | 0x80 | 1 << 3 + + would set SQ1 and SQ4 HIGH, SQ3 LOW, and leave SQ2 unchanged. + """ + if self.name == "SQ1": + return 0x10 + elif self.name == "SQ2": + return 0x20 + elif self.name == "SQ3": + return 0x40 + elif self.name == "SQ4": + return 0x80 + + @property + def reference_clock_map(self) -> int: + """int: Reference clock map value for this pin. + + The reference clock map is used in the WAVEGEN->MAP_REFERENCE command + to map a digital output pin directly to the interal oscillator. This + can be used to achieve very high frequencies, with the caveat that + the only frequencies available are quotients of 128 MHz and powers of + 2 up to 15. For example, sending (2 | 4) followed by 3 outputs + 128 / (1 << 3) = 16 MHz on SQ2 and SQ3. + """ + if self.name == "SQ1": + return 1 + elif self.name == "SQ2": + return 2 + elif self.name == "SQ3": + return 4 + elif self.name == "SQ4": + return 8 diff --git a/PSL/logic_analyzer.py b/pslab/instrument/logic_analyzer.py similarity index 65% rename from PSL/logic_analyzer.py rename to pslab/instrument/logic_analyzer.py index 6030c398..8888034f 100644 --- a/PSL/logic_analyzer.py +++ b/pslab/instrument/logic_analyzer.py @@ -2,7 +2,7 @@ Example ------- ->>> from PSL.logic_analyzer import LogicAnalyzer +>>> from pslab import LogicAnalyzer >>> la = LogicAnalyzer() >>> t = la.capture(channels=2, events=1600, modes=["falling", "any"]) """ @@ -13,27 +13,20 @@ import numpy as np -import PSL.commands_proto as CP -from PSL import digital_channel, packet_handler +import pslab.protocol as CP +from pslab.connection import ConnectionHandler, autoconnect +from pslab.instrument.buffer import ADCBufferMixin +from pslab.instrument.digital import DigitalInput, DIGITAL_INPUTS, MODES -CLOCK_RATE = 64e6 -PRESCALERS = { - 0: 1, - 1: 8, - 2: 64, - 3: 256, -} - - -class LogicAnalyzer: +class LogicAnalyzer(ADCBufferMixin): """Investigate digital signals on up to four channels simultaneously. Parameters ---------- - device : :class:`Handler`, optional - Serial interface for communicating with the PSLab device. If not provided, a - new one will be created. + device : :class:`SerialHandler`, optional + Serial connection to PSLab device. If not provided, a new one will be + created. Attributes ---------- @@ -43,22 +36,27 @@ class LogicAnalyzer: See :meth:`configure_trigger`. """ + _PRESCALERS = { + 0: 1, + 1: 8, + 2: 64, + 3: 256, + } + # When capturing multiple channels, there is a two clock cycle # delay between channels. - CAPTURE_DELAY = 2 + _CAPTURE_DELAY = 2 - def __init__(self, device: packet_handler.Handler = None): - self._device = packet_handler.Handler() if device is None else device - self._channels = { - d: digital_channel.DigitalInput(d) for d in digital_channel.DIGITAL_INPUTS - } - self.trigger_channel = "ID1" - self._trigger_channel = self._channels["ID1"] + def __init__(self, device: ConnectionHandler | None = None): + self._device = device if device is not None else autoconnect() + self._channels = {d: DigitalInput(d) for d in DIGITAL_INPUTS} + self.trigger_channel = "LA1" + self._trigger_channel = self._channels["LA1"] self.trigger_mode = "disabled" self._trigger_mode = 0 self._prescaler = 0 - self._channel_one_map = "ID1" - self._channel_two_map = "ID2" + self._channel_one_map = "LA1" + self._channel_two_map = "LA2" self._trimmed = 0 def measure_frequency( @@ -68,20 +66,21 @@ def measure_frequency( Parameters ---------- - channel : {"ID1", "ID2", "ID3", "ID4"} - Name of the digital input channel in which to measure the frequency. + channel : {"LA1", "LA2", "LA3", "LA4"} + Name of the digital input channel in which to measure the + frequency. simultaneous_oscilloscope: bool, optional - Set this to True if you need to use the oscilloscope at the same time. - Uses firmware instead of software to measure the frequency, which may fail - and return 0. Will not give accurate results above 10 MHz. The default - value is False. + Set this to True if you need to use the oscilloscope at the same + time. Uses firmware instead of software to measure the frequency, + which may fail and return 0. Will not give accurate results above + 10 MHz. The default value is False. timeout : float, optional - Timeout in seconds before cancelling measurement. The default value is - 1 second. + Timeout in seconds before cancelling measurement. The default value + is 1 second. Returns ------- - float + frequency : float The signal's frequency in Hz. """ if simultaneous_oscilloscope: @@ -91,8 +90,12 @@ def measure_frequency( self._channel_one_map = channel t = self.capture(1, 2, modes=["sixteen rising"], timeout=timeout)[0] self._channel_one_map = tmp - period = (t[1] - t[0]) * 1e-6 / 16 - frequency = period ** -1 + + try: + period = (t[1] - t[0]) * 1e-6 / 16 + frequency = period**-1 + except IndexError: + frequency = 0 if frequency >= 1e7: frequency = self._get_high_frequency(channel) @@ -106,13 +109,13 @@ def _measure_frequency_firmware( self._device.send_byte(CP.GET_FREQUENCY) self._device.send_int(int(timeout * 64e6) >> 16) self._device.send_byte(self._channels[channel].number) - self._device.wait_for_data(timeout) + time.sleep(timeout) error = self._device.get_byte() t = [self._device.get_long() for a in range(2)] self._device.get_ack() edges = 16 - period = (t[1] - t[0]) / edges / CLOCK_RATE + period = (t[1] - t[0]) / edges / CP.CLOCK_RATE if error or period == 0: # Retry once. @@ -121,11 +124,15 @@ def _measure_frequency_firmware( else: return 0 else: - return period ** -1 + return period**-1 def _get_high_frequency(self, channel: str) -> float: - # The input frequency is fed to a 32 bit counter for a period of 100 ms. The - # value of the counter at the end of 100 ms is used to calculate the frequency. + """Measure high frequency signals using firmware. + + The input frequency is fed to a 32 bit counter for a period of 100 ms. + The value of the counter at the end of 100 ms is used to calculate the + frequency. + """ self._device.send_byte(CP.COMMON) self._device.send_byte(CP.GET_ALTERNATE_HIGH_FREQUENCY) self._device.send_byte(self._channels[channel].number) @@ -145,19 +152,20 @@ def measure_interval( Parameters ---------- channels : List[str] - A pair of digital inputs, ID1, ID2, ID3, or ID4. Both can be the same. + A pair of digital inputs, LA1, LA2, LA3, or LA4. Both can be the + same. modes : List[str] Type of logic event to listen for on each channel. See :class:`DigitalInput` for available modes. timeout : float, optional - Timeout in seconds before cancelling measurement. The default value is - 1 second. + Timeout in seconds before cancelling measurement. The default value + is 1 second. Returns ------- - float - Time between events in microseconds. A negative value means that the event - on the second channel happend first. + interval : float + Time between events in microseconds. A negative value means that + the event on the second channel happend first. """ tmp_trigger = self._trigger_channel.name self.configure_trigger(channels[0], self.trigger_mode) @@ -209,16 +217,18 @@ def measure_duty_cycle(self, channel: str, timeout: float = 1) -> Tuple[float]: Parameters ---------- - channel : {"ID1", "ID2", "ID3", "ID4"} + channel : {"LA1", "LA2", "LA3", "LA4"} Digital input on which to measure. timeout : float, optional - Timeout in seconds before cancelling measurement. The default value is - 1 second. + Timeout in seconds before cancelling measurement. The default value + is 1 second. Returns ------- - float, float - Wavelength in microseconds and duty cycle as a value between 0 - 1. + wavelength : float + Wavelength in microseconds. + duty_cycle : float + Duty cycle as a value between 0 - 1. """ tmp_trigger_mode = self.trigger_mode tmp_trigger_channel = self._trigger_channel.name @@ -231,13 +241,13 @@ def measure_duty_cycle(self, channel: str, timeout: float = 1) -> Tuple[float]: period = t[2] - t[0] # First change is HIGH -> LOW since we trigger on rising. - duty_cycle = (t[1] - t[0]) / period + duty_cycle = 1 - (t[1] - t[0]) / period return period, duty_cycle def capture( self, - channels: int, + channels: Union[int, str, List[str]], events: int = CP.MAX_SAMPLES // 4, timeout: float = 1, modes: List[str] = 4 * ("any",), @@ -250,63 +260,68 @@ def capture( Parameters ---------- - channels : {1, 2, 3, 4} - Number of channels to capture events on. Events will be captured on ID1, - ID2, ID3, and ID4, in that order. + channels : {1, 2, 3, 4} or str or list of str + Number of channels to capture events on. Events will be captured on + LA1, LA2, LA3, and LA4, in that order. Alternatively, the name of + of a single digital input, or a list of two names of digital inputs + can be provided. In that case, events will be captured only on that + or those specific channels. events : int, optional - Number of logic events to capture on each channel. The default and maximum - value is 2500. + Number of logic events to capture on each channel. The default and + maximum value is 2500. timeout : float, optional - Timeout in seconds before cancelling measurement in blocking mode. If the - timeout is reached, the events captured up to that point will be returned. - The default value is 1 second. + Timeout in seconds before cancelling measurement in blocking mode. + If the timeout is reached, the events captured up to that point + will be returned. The default value is 1 second. modes : List[str], optional - List of strings specifying the type of logic level change to capture on - each channel. See :class:`DigitalInput` for available modes. The default - value is ("any", "any", "any", "any"). + List of strings specifying the type of logic level change to + capture on each channel. See :class:`DigitalInput` for available + modes. The default value is ("any", "any", "any", "any"). e2e_time : float, optional - The maximum time between events in seconds. This is only required in three - and four channel mode, which uses 16-bit counters as opposed to 32-bit - counters which are used in one and two channel mode. The 16-bit counter - normally rolls over after 1.024 milliseconds, so if the time between events - is greater than that the timestamp calculations will be incorrect. By - setting this to a value greater than 1.024 ms, the counter will be slowed - down by a prescaler, which can extend the maximum allowed event-to-event - time gap to up to 0.26 seconds. If the time gap is greater than that, three - and four channel mode cannot be used. One and two channel mode supports + The maximum time between events in seconds. This is only required + in three and four channel mode, which uses 16-bit counters as + opposed to 32-bit counters which are used in one and two channel + mode. The 16-bit counter normally rolls over after 1024 µs, so if + the time between events is greater than that the timestamp + calculations will be incorrect. By setting this to a value greater + than 1024 µs, the counter will be slowed down by a prescaler, which + can extend the maximum allowed event-to-event time gap to up to + 262 ms. If the time gap is greater than that, three and four + channel mode cannot be used. One and two channel mode supports timegaps up to 67 seconds. block : bool, optional - Whether to block while waiting for events to be captured. If this is False, - this method will return None and the captured events must be manually - fetched by calling :meth:`fetch_data`. The default value is True. + Whether to block while waiting for events to be captured. If this + is False, this method will return None immediately and the captured + events must be manually fetched by calling :meth:`fetch_data`. The + default value is True. Returns ------- - Union[List[numpy.ndarray], None] - List of numpy.ndarrays containing timestamps in microseconds when logic - events were detected, or None if block is False. The length of the list is - equal to the number of channels that were used to capture events, and each - list element corresponds to a channel. + events : list of numpy.ndarray or None + List of numpy.ndarrays containing timestamps in microseconds when + logic events were detected, or None if block is False. The length + of the list is equal to the number of channels that were used to + capture events, and each list element corresponds to a channel. Raises ------ ValueError if too many events are requested, or ValueError if too many channels are selected. """ - self._check_arguments(channels, events) + channels = self._check_arguments(channels, events) self.stop() self._prescaler = 0 - self.clear_buffer(0, CP.MAX_SAMPLES) + self.clear_buffer(CP.MAX_SAMPLES) + self._invalidate_buffer() self._configure_trigger(channels) - modes = [digital_channel.MODES[m] for m in modes] + modes = [MODES[m] for m in modes] start_time = time.time() for e, c in enumerate( - [self._channel_one_map, self._channel_two_map, "ID3", "ID4"][:channels] + [self._channel_one_map, self._channel_two_map, "LA3", "LA4"][:channels] ): c = self._channels[c] c.events_in_buffer = events - c._events_in_buffer = events c.datatype = "long" if channels < 3 else "int" c.buffer_idx = 2500 * e * (1 if c.datatype == "int" else 2) c._logic_mode = modes[e] @@ -337,14 +352,25 @@ def capture( return timestamps - @staticmethod - def _check_arguments(channels: int, events: int): + def _check_arguments(self, channels: Union[int, str, List[str]], events: int): + if isinstance(channels, str): + self._channel_one_map = channels + channels = 1 + + if isinstance(channels, list): + self._channel_one_map = channels[0] + self._channel_two_map = channels[1] + channels = 2 + max_events = CP.MAX_SAMPLES // 4 + if events > max_events: raise ValueError(f"Events must be fewer than {max_events}.") elif channels < 0 or channels > 4: raise ValueError("Channels must be between 1-4.") + return channels + def _capture_one(self): self._channels[self._channel_one_map]._prescaler = 0 self._device.send_byte(CP.TIMING) @@ -378,14 +404,14 @@ def _capture_two(self): self._device.get_ack() def _capture_four(self, e2e_time: float): - rollover_time = (2 ** 16 - 1) / CLOCK_RATE + rollover_time = (2**16 - 1) / CP.CLOCK_RATE e2e_time = 0 if e2e_time is None else e2e_time - if e2e_time > rollover_time * PRESCALERS[3]: + if e2e_time > rollover_time * self._PRESCALERS[3]: raise ValueError("Timegap too big for four channel mode.") - elif e2e_time > rollover_time * PRESCALERS[2]: + elif e2e_time > rollover_time * self._PRESCALERS[2]: self._prescaler = 3 - elif e2e_time > rollover_time * PRESCALERS[1]: + elif e2e_time > rollover_time * self._PRESCALERS[1]: self._prescaler = 2 elif e2e_time > rollover_time: self._prescaler = 1 @@ -396,19 +422,21 @@ def _capture_four(self, e2e_time: float): self._device.send_byte(CP.START_FOUR_CHAN_LA) self._device.send_int(CP.MAX_SAMPLES // 4) self._device.send_int( - self._channels["ID1"]._logic_mode - | (self._channels["ID2"]._logic_mode << 4) - | (self._channels["ID3"]._logic_mode << 8) - | (self._channels["ID4"]._logic_mode << 12) + self._channels["LA1"]._logic_mode + | (self._channels["LA2"]._logic_mode << 4) + | (self._channels["LA3"]._logic_mode << 8) + | (self._channels["LA4"]._logic_mode << 12) ) self._device.send_byte(self._prescaler) try: - trigger = {0: 4, 1: 8, 2: 16,}[ - self._trigger_channel.number - ] | self._trigger_mode + trigger = { + 0: 4, + 1: 8, + 2: 16, + }[self._trigger_channel.number] | self._trigger_mode except KeyError: - e = "Triggering is only possible on ID1, ID2, or ID3." + e = "Triggering is only possible on LA1, LA2, or LA3." raise NotImplementedError(e) self._device.send_byte(trigger) @@ -424,7 +452,7 @@ def fetch_data(self) -> List[np.ndarray]: Returns ------- - List[numpy.ndarray] + data : list of numpy.ndarray List of numpy.ndarrays holding timestamps in microseconds when logic events were detected. The length of the list is equal to the number of channels that were used to capture events, and each list element corresponds to a @@ -433,7 +461,7 @@ def fetch_data(self) -> List[np.ndarray]: counter_values = [] channels = list( OrderedDict.fromkeys( - [self._channel_one_map, self._channel_two_map, "ID3", "ID4"] + [self._channel_one_map, self._channel_two_map, "LA3", "LA4"] ) ) for c in channels: @@ -449,14 +477,14 @@ def fetch_data(self) -> List[np.ndarray]: prescaler = [1 / 64, 1 / 8, 1.0, 4.0][self._prescaler] timestamps = [] - capture_delay = LogicAnalyzer.CAPTURE_DELAY if self._prescaler == 0 else 0 + capture_delay = self._CAPTURE_DELAY if self._prescaler == 0 else 0 for e, cv in enumerate(counter_values): adjusted_counter = cv + e * capture_delay timestamps.append(adjusted_counter * prescaler) return timestamps - def _fetch_long(self, channel: digital_channel.DigitalInput) -> np.ndarray: + def _fetch_long(self, channel: DigitalInput) -> np.ndarray: self._device.send_byte(CP.TIMING) self._device.send_byte(CP.FETCH_LONG_DMA_DATA) self._device.send_int(CP.MAX_SAMPLES // 4) @@ -476,18 +504,8 @@ def _fetch_long(self, channel: digital_channel.DigitalInput) -> np.ndarray: return raw_timestamps - def _fetch_int(self, channel: digital_channel.DigitalInput) -> np.ndarray: - self._device.send_byte(CP.COMMON) - self._device.send_byte(CP.RETRIEVE_BUFFER) - self._device.send_int(channel.buffer_idx) - self._device.send_int(CP.MAX_SAMPLES // 4) - raw = self._device.read(CP.MAX_SAMPLES // 2) - self._device.get_ack() - - raw_timestamps = [ - CP.ShortInt.unpack(raw[a * 2 : a * 2 + 2])[0] - for a in range(CP.MAX_SAMPLES // 4) - ] + def _fetch_int(self, channel: DigitalInput) -> np.ndarray: + raw_timestamps = self.fetch_buffer(CP.MAX_SAMPLES // 4, channel.buffer_idx) raw_timestamps = np.array(raw_timestamps) raw_timestamps = np.trim_zeros(raw_timestamps, "b") pretrim = len(raw_timestamps) @@ -496,18 +514,18 @@ def _fetch_int(self, channel: digital_channel.DigitalInput) -> np.ndarray: for i, diff in enumerate(np.diff(raw_timestamps)): if diff <= 0: # Counter has rolled over. - raw_timestamps[i + 1 :] += 2 ** 16 - 1 + raw_timestamps[i + 1 :] += 2**16 - 1 return raw_timestamps def get_progress(self) -> int: - """Return the number of captured events per channel currently held in buffer. + """Return the number of captured events per channel held in the buffer. Returns ------- - int - Number of events held in buffer. If multiple channels have events in - buffer, the lowest value will be returned. + progress : int + Number of events held in buffer. If multiple channels have events + in buffer, the lowest value will be returned. """ active_channels = [] a = 0 @@ -517,7 +535,7 @@ def get_progress(self) -> int: a += 1 p = CP.MAX_SAMPLES // 4 - progress = self._get_initial_states_and_progress()[1] + progress = self._get_initial_states_and_progress()[0] for a in active_channels: p = min(progress[a], p) @@ -530,41 +548,84 @@ def get_initial_states(self) -> Dict[str, bool]: ------- dict of four str: bool pairs Dictionary containing pairs of channel names and the corresponding initial - state, e.g. {'ID1': True, 'ID2': True, 'ID3': True, 'ID4': False}. + state, e.g. {'LA1': True, 'LA2': True, 'LA3': True, 'LA4': False}. True means HIGH, False means LOW. """ - return self._get_initial_states_and_progress()[0] + before, after = self._get_initial_states_and_progress()[1:] + initial_states = { + "LA1": (before & 1 != 0), + "LA2": (before & 2 != 0), + "LA3": (before & 4 != 0), + "LA4": (before & 8 != 0), + } - def get_xy(self, timestamps: List[np.ndarray]) -> List[np.ndarray]: + if before != after: + disagreements = before ^ after + uncertain_states = [ + disagreements & 1 != 0, + disagreements & 2 != 0, + disagreements & 4 != 0, + disagreements & 8 != 0, + ] + timestamps = self.fetch_data() + + if len(timestamps) == 1: + # One channel mode does not record states after start. + return initial_states + + channels = ["LA1", "LA2", "LA3", "LA4"] + for i, state in enumerate(uncertain_states[: len(timestamps)]): + if state: + if timestamps[i][0] > 0.1: # µs + # States captured immediately after start are usually + # better than immediately before, except when an event + # was captures within ~100 ns of start. + initial_states[channels[i]] = not initial_states[channels[i]] + + return initial_states + + def get_xy( + self, timestamps: List[np.ndarray], initial_states: Dict[str, bool] = None + ) -> List[np.ndarray]: """Turn timestamps into plottable data. Parameters ---------- - timestamps : List[numpy.ndarray] - List of timestamps as returned by :meth:`capture` or :meth:`fetch_data`. + timestamps : list of numpy.ndarray + List of timestamps as returned by :meth:`capture` or + :meth:`fetch_data`. + initial_states : dict of str, bool + Initial states of digital inputs at beginning of capture, as + returned by :meth:`get_initial_states`. If no additional capture + calls have been issued before calling :meth:`get_xy`, this can be + omitted. Returns ------- - List[numpy.ndarray] + list of numpy.ndarray List of x, y pairs suitable for plotting using, for example, - matplotlib.pyplot.plot. + matplotlib.pyplot.plot. One pair of x and y values is returned for + each list of timestamps given as input. """ xy = [] + initial_states = ( + initial_states if initial_states is not None else self.get_initial_states() + ) for e, c in enumerate( - [self._channel_one_map, self._channel_two_map, "ID3", "ID4"][ + [self._channel_one_map, self._channel_two_map, "LA3", "LA4"][ : len(timestamps) ] ): c = self._channels[c] if c.events_in_buffer: - x, y = c._get_xy(self.get_initial_states()[c.name], timestamps[e]) + x, y = c._get_xy(initial_states[c.name], timestamps[e]) xy.append(x) xy.append(y) return xy - def _get_initial_states_and_progress(self) -> Tuple[Dict[str, bool], List[int]]: + def _get_initial_states_and_progress(self) -> Tuple[int, int, int]: self._device.send_byte(CP.TIMING) self._device.send_byte(CP.GET_INITIAL_DIGITAL_STATES) initial = self._device.get_int() @@ -573,14 +634,8 @@ def _get_initial_states_and_progress(self) -> Tuple[Dict[str, bool], List[int]]: progress[1] = (self._device.get_int() - initial) // 2 - CP.MAX_SAMPLES // 4 progress[2] = (self._device.get_int() - initial) // 2 - 2 * CP.MAX_SAMPLES // 4 progress[3] = (self._device.get_int() - initial) // 2 - 3 * CP.MAX_SAMPLES // 4 - s = self._device.get_byte() - initial_states = { - "ID1": (s & 1 != 0), - "ID2": (s & 2 != 0), - "ID3": (s & 4 != 0), - "ID4": (s & 8 != 0), - } - self._device.get_byte() # INITIAL_DIGITAL_STATES_ERR + states_immediately_before_start = self._device.get_byte() + states_immediately_after_start = self._device.get_byte() self._device.get_ack() for e, i in enumerate(progress): @@ -589,16 +644,16 @@ def _get_initial_states_and_progress(self) -> Tuple[Dict[str, bool], List[int]]: elif i < 0: progress[e] = 0 - return initial_states, progress + return progress, states_immediately_before_start, states_immediately_after_start def configure_trigger(self, trigger_channel: str, trigger_mode: str): - """Setup trigger channel and trigger condition. + """Set up trigger channel and trigger condition. Parameters ---------- - trigger_channel : {"ID1", "ID2", "ID3", "ID4"} + trigger_channel : {"LA1", "LA2", "LA3", "LA4"} The digital input on which to trigger. - trigger_condition : {"disabled", "falling", "rising"} + trigger_mode : {"disabled", "falling", "rising"} The type of logic level change on which to trigger. """ self.trigger_channel = trigger_channel @@ -618,17 +673,20 @@ def _configure_trigger(self, channels: int): "sixteen rising": 5, }[self.trigger_mode] elif channels == 2: - self._trigger_mode = {"disabled": 0, "falling": 3, "rising": 1,}[ - self.trigger_mode - ] + self._trigger_mode = { + "disabled": 0, + "falling": 3, + "rising": 1, + }[self.trigger_mode] elif channels == 4: - self._trigger_mode = {"disabled": 0, "falling": 1, "rising": 3,}[ - self.trigger_mode - ] + self._trigger_mode = { + "disabled": 0, + "falling": 1, + "rising": 3, + }[self.trigger_mode] def stop(self): - """Stop a running :meth:`capture` function. - """ + """Stop a running :meth:`capture` function.""" self._device.send_byte(CP.TIMING) self._device.send_byte(CP.STOP_LA) self._device.get_ack() @@ -639,47 +697,49 @@ def get_states(self) -> Dict[str, bool]: Returns ------- dict of four str: bool pairs - Dictionary containing pairs of channel names and the corresponding current - state, e.g. {'ID1': True, 'ID2': True, 'ID3': True, 'ID4': False}. - True means HIGH, False means LOW. + Dictionary containing pairs of channel names and the corresponding + current state, e.g. {'LA1': True, 'LA2': True, 'LA3': True, + 'LA4': False}. True means HIGH, False means LOW. """ self._device.send_byte(CP.DIN) self._device.send_byte(CP.GET_STATES) s = self._device.get_byte() self._device.get_ack() return { - "ID1": (s & 1 != 0), - "ID2": (s & 2 != 0), - "ID3": (s & 4 != 0), - "ID4": (s & 8 != 0), + "LA1": (s & 1 != 0), + "LA2": (s & 2 != 0), + "LA3": (s & 4 != 0), + "LA4": (s & 8 != 0), } def count_pulses( - self, channel: str, interval: float = 1, block: bool = True + self, channel: str = "FRQ", interval: float = 1, block: bool = True ) -> Union[int, None]: - """ Count pulses on a digital input. + """Count pulses on a digital input. - The counter is 16 bits, so it will roll over after 65535 pulses. This method - can be used at the same time as the oscilloscope. + The counter is 16 bits, so it will roll over after 65535 pulses. This + method can be used at the same time as the oscilloscope. Parameters ---------- - channel : {"ID1", "ID2", "ID3", "ID4"} - Digital input on which to count pulses. + channel : {"LA1", "LA2", "LA3", "LA4", "FRQ"}, optional + Digital input on which to count pulses. The default value is "FRQ". interval : float, optional Time in seconds during which to count pulses. The default value is 1 second. block : bool, optional - Whether to block while counting pulses or not. If False, this method will - return None, and the pulses must be manually fetched using - :meth:`fetch_pulse_count`. Additionally, the interval argument has no - meaning if block is False, the counter will keep counting even after the - interval time has expired. The default value is True. + Whether to block while counting pulses or not. If False, this + method will return None, and the pulses must be manually fetched + using :meth:`fetch_pulse_count`. Additionally, the interval + argument has no meaning if block is False; the counter will keep + counting even after the interval time has expired. The default + value is True. Returns ------- Union[int, None] - Number of pulses counted during the interval, or None if block is False. + Number of pulses counted during the interval, or None if block is + False. """ self._reset_prescaler() self._device.send_byte(CP.COMMON) @@ -719,27 +779,7 @@ def _reset_prescaler(self): self.stop() self._prescaler = 0 - def clear_buffer(self, starting_position: int, total_points: int): - """Clear a section of the ADC hardware buffer. - - Parameters - ---------- - starting_position : int - Starting position from which to clear the buffer. Should be a value between - 0 and 9999. - total_points : int - Total points to clear from the buffer. Should be a value between 0 and - 10000. - """ - self._device.send_byte(CP.COMMON) - self._device.send_byte(CP.CLEAR_BUFFER) - self._device.send_int(starting_position) - self._device.send_int(total_points) - self._device.get_ack() - self._invalidate_buffer() - def _invalidate_buffer(self): for c in self._channels.values(): c.events_in_buffer = 0 - c._events_in_buffer = 0 c.buffer_idx = None diff --git a/pslab/instrument/multimeter.py b/pslab/instrument/multimeter.py new file mode 100644 index 00000000..db7f6d53 --- /dev/null +++ b/pslab/instrument/multimeter.py @@ -0,0 +1,250 @@ +"""The PSLab's multimeter can measure voltage, resistance, and capacitance.""" + +import time +from typing import Tuple + +import numpy as np +from scipy.optimize import curve_fit + +import pslab.protocol as CP +from pslab.connection import ConnectionHandler +from pslab.instrument.analog import GAIN_VALUES, INPUT_RANGES +from pslab.instrument.oscilloscope import Oscilloscope + +_MICROSECONDS = 1e-6 + + +class Multimeter(Oscilloscope): + """Measure voltage, resistance and capacitance. + + Parameters + ---------- + device : Handler + Serial interface for communicating with the PSLab device. If not + provided, a new one will be created. + """ + + _CURRENTS = [5.5e-4, 5.5e-7, 5.5e-6, 5.5e-5] + _CURRENTS_RANGES = [1, 2, 3, 0] # Smallest first, + _RC_RESISTANCE = 1e4 + _CAPACITOR_CHARGED_VOLTAGE = 0.9 * max(INPUT_RANGES["CAP"]) + _CAPACITOR_DISCHARGED_VOLTAGE = 0.01 * max(INPUT_RANGES["CAP"]) + + def __init__(self, device: ConnectionHandler | None = None): + self._stray_capacitance = 46e-12 + super().__init__(device) + + def measure_resistance(self) -> float: + """Measure the resistance of a resistor connected between RES and GND. + + Returns + ------- + resistance : float + Resistance in ohm. + """ + voltage = self.measure_voltage("RES") + resolution = max(INPUT_RANGES["RES"]) / ( + 2 ** self._channels["RES"].resolution - 1 + ) + + if voltage >= max(INPUT_RANGES["RES"]) - resolution: + return np.inf + + pull_up_resistance = 5.1e3 + current = (INPUT_RANGES["RES"][1] - voltage) / pull_up_resistance + return voltage / current + + def measure_voltage(self, channel: str = "VOL") -> float: + """Measure the voltage on the selected channel. + + Parameters + ---------- + channel : {"CH1", "CH2", "CH3", "MIC", "CAP", "RES", "VOL"}, optional + The name of the analog input on which to measure the voltage. The + default channel is VOL. + + Returns + ------- + voltage : float + Voltage in volts. + """ + self._voltmeter_autorange(channel) + return self._measure_voltage(channel) + + def _measure_voltage(self, channel: str) -> float: + self._channels[channel].resolution = 12 + scale = self._channels[channel].scale + chosa = self._channels[channel].chosa + self._device.send_byte(CP.ADC) + self._device.send_byte(CP.GET_VOLTAGE_SUMMED) + self._device.send_byte(chosa) + raw_voltage_sum = self._device.get_int() # Sum of 16 samples. + self._device.get_ack() + raw_voltage_mean = round(raw_voltage_sum / 16) + voltage = scale(raw_voltage_mean) + return voltage + + def _voltmeter_autorange(self, channel: str) -> float: + if channel in ("CH1", "CH2"): + self._set_gain(channel, 1) # Reset gain. + voltage = self._measure_voltage(channel) + + for gain in GAIN_VALUES[::-1]: + rng = max(INPUT_RANGES[channel]) / gain + if abs(voltage) < rng: + break + + self._set_gain(channel, gain) + + return rng + else: + return max(INPUT_RANGES[channel]) + + def calibrate_capacitance(self): + """Calibrate stray capacitance. + + Correctly calibrated stray capacitance is important when measuring + small capacitors (picofarad range). + + Stray capacitace should be recalibrated if external wiring is connected + to the CAP pin. + """ + for charge_time in np.unique(np.int16(np.logspace(2, 3))): + self._discharge_capacitor() + voltage, capacitance = self._measure_capacitance(1, 0, charge_time) + if voltage >= self._CAPACITOR_CHARGED_VOLTAGE: + break + self._stray_capacitance += capacitance + + def measure_capacitance(self) -> float: + """Measure the capacitance of a capacitor connected between CAP and GND. + + Returns + ------- + capacitance : float + Capacitance in Farad. + """ + for current_range in self._CURRENTS_RANGES: + charge_time = 10 + for _ in range(10): + if charge_time > 50000: + break # Increase current. + voltage, capacitance = self._measure_capacitance( + current_range, 0, charge_time + ) + if 0.98 < voltage / self._CAPACITOR_CHARGED_VOLTAGE < 1.02: + return capacitance + charge_time = int( + charge_time * self._CAPACITOR_CHARGED_VOLTAGE / voltage + ) + + # Capacitor too big, use alternative method. + return self._measure_rc_capacitance() + + def _set_cap(self, state, charge_time): + """Set CAP HIGH or LOW.""" + self._device.send_byte(CP.ADC) + self._device.send_byte(CP.SET_CAP) + self._device.send_byte(state) + self._device.send_int(charge_time) + self._device.get_ack() + + def _discharge_capacitor( + self, discharge_time: int = 50000, timeout: float = 1 + ) -> float: + start_time = time.time() + voltage = previous_voltage = self.measure_voltage("CAP") + + while voltage > self._CAPACITOR_DISCHARGED_VOLTAGE: + self._set_cap(0, discharge_time) + voltage = self.measure_voltage("CAP") + + if abs(previous_voltage - voltage) < self._CAPACITOR_DISCHARGED_VOLTAGE: + break + + previous_voltage = voltage + + if time.time() - start_time > timeout: + break + + return voltage + + def _measure_capacitance( + self, current_range: int, trim: int, charge_time: int + ) -> Tuple[float, float]: + self._discharge_capacitor() + self._channels["CAP"].resolution = 12 + self._device.send_byte(CP.COMMON) + self._device.send_byte(CP.GET_CAPACITANCE) + self._device.send_byte(current_range) + + if trim < 0: + self._device.send_byte(int(31 - abs(trim) / 2) | 32) + else: + self._device.send_byte(int(trim / 2)) + + self._device.send_int(charge_time) + time.sleep(charge_time * _MICROSECONDS) + raw_voltage = self._device.get_int() + voltage = self._channels["CAP"].scale(raw_voltage) + self._device.get_ack() + charge_current = self._CURRENTS[current_range] * (100 + trim) / 100 + + if voltage: + capacitance = ( + charge_current * charge_time * _MICROSECONDS / voltage + - self._stray_capacitance + ) + else: + capacitance = 0 + + return voltage, capacitance + + def _measure_rc_capacitance(self) -> float: + """Measure the capacitance by discharge through a 10K resistor.""" + (x,) = self.capture("CAP", CP.MAX_SAMPLES, 10, block=False) + x *= _MICROSECONDS + self._set_cap(1, 50000) # charge + self._set_cap(0, 50000) # discharge + (y,) = self.fetch_data() + + if y.max() >= self._CAPACITOR_CHARGED_VOLTAGE: + discharge_start = np.where(y >= self._CAPACITOR_CHARGED_VOLTAGE)[0][-1] + else: + discharge_start = np.where(y == y.max())[0][-1] + + x = x[discharge_start:] + y = y[discharge_start:] + + # CAP floats for a brief period of time (~500 µs) between being set + # HIGH until it is set LOW. This data is not useful and should be + # discarded. When CAP is set LOW the voltage declines sharply, which + # manifests as a negative peak in the time derivative. + dydx = np.diff(y) / np.diff(x) + cap_low = np.where(dydx == dydx.min())[0][0] + x = x[cap_low:] + y = y[cap_low:] + + # Discard data after the voltage reaches zero (improves fit). + try: + v_zero = np.where(y == 0)[0][0] + x = x[:v_zero] + y = y[:v_zero] + except IndexError: + pass + + # Remove time offset. + x -= x[0] + + def discharging_capacitor_voltage( + x: np.ndarray, v_init: float, rc_time_constant: float + ) -> np.ndarray: + return v_init * np.exp(-x / rc_time_constant) + + # Solve discharging_capacitor_voltage for rc_time_constant. + rc_time_constant_guess = (-x[1:] / np.log(y[1:] / y[0])).mean() + guess = [y[0], rc_time_constant_guess] + popt, _ = curve_fit(discharging_capacitor_voltage, x, y, guess) + rc_time_constant = popt[1] + rc_capacitance = rc_time_constant / self._RC_RESISTANCE + return rc_capacitance diff --git a/pslab/instrument/oscilloscope.py b/pslab/instrument/oscilloscope.py new file mode 100644 index 00000000..b8d3e30c --- /dev/null +++ b/pslab/instrument/oscilloscope.py @@ -0,0 +1,411 @@ +"""Classes and functions related to the PSLab's oscilloscope instrument. + +Example +------- +>>> from pslab import Oscilloscope +>>> scope = Oscilloscope() +>>> x, y1, y2, y3 = scope.capture(channels=3, samples=1600, timegap=2) +""" + +import time +from typing import List, Tuple, Union + +import numpy as np + +import pslab.protocol as CP +from pslab.bus.spi import SPIMaster +from pslab.connection import ConnectionHandler, autoconnect +from pslab.instrument.analog import ANALOG_CHANNELS, AnalogInput, GAIN_VALUES +from pslab.instrument.buffer import ADCBufferMixin + + +class Oscilloscope(ADCBufferMixin): + """Capture varying voltage signals on up to four channels simultaneously. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial interface for communicating with the PSLab device. If not + provided, a new one will be created. + """ + + _CH234 = ["CH2", "CH3", "MIC"] + + def __init__(self, device: ConnectionHandler | None = None): + self._device = device if device is not None else autoconnect() + self._channels = {a: AnalogInput(a) for a in ANALOG_CHANNELS} + self._channel_one_map = "CH1" + self._trigger_voltage = None + self._trigger_enabled = False + self._trigger_channel = "CH1" + self._set_gain("CH1", 1) + self._set_gain("CH2", 1) + + def capture( + self, + channels: int, + samples: int, + timegap: float, + trigger: Union[float, bool] = None, + trigger_channel: str = None, + block: bool = True, + ) -> List[np.ndarray]: + """Capture an oscilloscope trace from the specified input channels. + + Parameters + ---------- + channels : str or {1, 2, 3, 4} + Number of channels to sample from simultaneously, or the name + (CH1, CH2, CH3, MIC, CAP, RES, VOL) of a single channel to sample + from. If channel is an integer, the oscilloscope will sample the + first one, two, three, or four channels in the aforementioned list. + samples : int + Number of samples to fetch. Maximum 10000 divided by number of + channels. + timegap : float + Time gap between samples in microseconds. Will be rounded to the + closest 1 / 8 µs. The minimum time gap depends on the type of + measurement: + + +--------------+------------+----------+------------+ + | Simultaneous | No trigger | Trigger | No trigger | + | channels | (10-bit) | (10-bit) | (12-bit) | + +==============+============+==========+============+ + | 1 | 0.5 µs | 0.75 µs | 1 µs | + +--------------+------------+----------+------------+ + | 2 | 0.875 µs | 0.875 µs | N/A | + +--------------+------------+----------+------------+ + | 4 | 1.75 µs | 1.75 µs | N/A | + +--------------+------------+----------+------------+ + + Sample resolution is set automatically based on the above + limitations; i.e. to get 12-bit samples only one channel may be + sampled, there must be no active trigger, and the time gap must be + 1 µs or greater. + trigger : float or bool, optional + Voltage at which to trigger sampling. Triggering is disabled by + default. Trigger settings persist between calls; disable by setting + trigger=False. + trigger_channel : str, optional + Wait for the voltage level on this channel to cross the trigger + value before sampling. Same as the first sampled channel by + default. + block : bool, optional + Whether or not to block while sampling. If False, return timestamps + immediately without waiting for corresponding voltages. User is + responsible for waiting an appropriate amount of time before + collecting samples with :meth:`fetch_data`. True by default. + + Example + ------- + >>> from pslab import Oscilloscope + >>> scope = Oscilloscope() + >>> x, y = scope.capture(1, 3200, 1) + + Returns + ------- + list of numpy.ndarray + List of numpy arrays holding timestamps and corresponding voltages. + In non-blocking mode, only timestamps are returned; voltages must + be fetched using :meth:`fetch_data`. + + Raises + ------ + ValueError + If :channels: is not 1, 2, 3, 4, or one of CH1, CH2, CH3, MIC, CAP, + RES, VOL, or + :samples: > 10000 / :channels:, or + :timegap: is too low. + """ + if isinstance(channels, str): + self._channel_one_map = channels + channels = 1 + + if trigger_channel is None: + self._trigger_channel = self._channel_one_map + else: + self._trigger_channel = trigger_channel + + if trigger is False: + self._trigger_enabled = False + elif trigger is not None: + if trigger != self._trigger_voltage: + self.configure_trigger(voltage=trigger) + + self._check_args(channels, samples, timegap) + timegap = int(timegap * 8) / 8 + + for channel in ("CH1", "CH2"): + # Reset gain (another instance could have changed it). + self._set_gain(channel, self._channels[channel].gain) + + self._capture(channels, samples, timegap) + x = [timegap * np.arange(samples)] + + if block: + time.sleep(1e-6 * samples * timegap) + + while not self.progress()[0]: + pass + + # Discard MIC if user requested three channels. + y = self.fetch_data()[:channels] + + return x + y + else: + return x + + def _check_args(self, channels: int, samples: int, timegap: float): + if channels not in (1, 2, 3, 4): + raise ValueError("Number of channels to sample must be 1, 2, 3, or 4.") + + max_samples = CP.MAX_SAMPLES // channels + if not 0 < samples <= max_samples: + e1 = f"Cannot collect more than {max_samples} when sampling from " + e2 = f"{channels} channels." + raise ValueError(e1 + e2) + + min_timegap = self._lookup_mininum_timegap(channels) + if timegap < min_timegap: + raise ValueError(f"timegap must be at least {min_timegap}.") + + if self._channel_one_map not in self._channels: + e1 = f"{self._channel_one_map} is not a valid channel. " + e2 = f"Valid channels are {list(self._channels.keys())}." + raise ValueError(e1 + e2) + + def _lookup_mininum_timegap(self, channels: int) -> float: + channels_idx = { + 1: 0, + 2: 1, + 3: 2, + 4: 2, + } + min_timegaps = [[0.5, 0.75], [0.875, 0.875], [1.75, 1.75]] + + return min_timegaps[channels_idx[channels]][self.trigger_enabled] + + def _capture(self, channels: int, samples: int, timegap: float): + self._invalidate_buffer() + chosa = self._channels[self._channel_one_map].chosa + self._channels[self._channel_one_map].resolution = 10 + self._device.send_byte(CP.ADC) + + CH123SA = 0 # TODO what is this? + chosa = self._channels[self._channel_one_map].chosa + self._channels[self._channel_one_map].samples_in_buffer = samples + self._channels[self._channel_one_map].buffer_idx = 0 + if channels == 1: + if self.trigger_enabled: + self._device.send_byte(CP.CAPTURE_ONE) + self._device.send_byte(chosa | 0x80) # Trigger + elif timegap >= 1: + self._channels[self._channel_one_map].resolution = 12 + self._device.send_byte(CP.CAPTURE_DMASPEED) + self._device.send_byte(chosa | 0x80) # 12-bit mode + else: + self._device.send_byte(CP.CAPTURE_DMASPEED) + self._device.send_byte(chosa) # 10-bit mode + elif channels == 2: + self._channels["CH2"].resolution = 10 + self._channels["CH2"].samples_in_buffer = samples + self._channels["CH2"].buffer_idx = 1 * samples + self._device.send_byte(CP.CAPTURE_TWO) + self._device.send_byte(chosa | (0x80 * self.trigger_enabled)) + else: + for e, c in enumerate(self._CH234): + self._channels[c].resolution = 10 + self._channels[c].samples_in_buffer = samples + self._channels[c].buffer_idx = (e + 1) * samples + self._device.send_byte(CP.CAPTURE_FOUR) + self._device.send_byte( + chosa | (CH123SA << 4) | (0x80 * self.trigger_enabled) + ) + + self._device.send_int(samples) + self._device.send_int(int(timegap * 8)) # 8 MHz clock + self._device.get_ack() + + def _invalidate_buffer(self): + for c in self._channels.values(): + c.samples_in_buffer = 0 + c.buffer_idx = None + + def fetch_data(self) -> List[np.ndarray]: + """Fetch captured samples. + + Example + ------- + >>> from pslab import Oscilloscope + >>> scope = Oscilloscope() + >>> scope.capture_nonblocking(channels=2, samples=1600, timegap=1) + >>> y1, y2 = scope.fetch_data() + + Returns + ------- + list of numpy.ndarray + List of numpy arrays holding sampled voltages. + """ + channels = [c for c in self._channels.values() if c.samples_in_buffer] + data = [None] * len(channels) + + for i, channel in enumerate(channels): + samples = channel.samples_in_buffer + data[i] = self.fetch_buffer(samples, channel.buffer_idx) + data[i] = channel.scale(np.array(data[i])) + + return data + + def progress(self) -> Tuple[bool, int]: + """Return the status of a capture call. + + Returns + ------- + bool, int + A boolean indicating whether the capture is complete, followed by + the number of samples currently held in the buffer. + """ + self._device.send_byte(CP.ADC) + self._device.send_byte(CP.GET_CAPTURE_STATUS) + conversion_done = self._device.get_byte() + samples = self._device.get_int() + self._device.get_ack() + + return bool(conversion_done), samples + + def configure_trigger( + self, + channel: str = None, + voltage: float = 0, + prescaler: int = 0, + enable: bool = True, + ): + """Configure trigger parameters for 10-bit capture routines. + + The capture routines will wait until a rising edge of the input signal + crosses the specified level. The trigger will timeout within 8 ms, and + capture will start regardless. + + To disable the trigger after configuration, set the trigger_enabled + attribute of the Oscilloscope instance to False. + + Parameters + ---------- + channel : {'CH1', 'CH2', 'CH3', 'MIC', 'CAP', 'RES', 'VOL'}, optional + The name of the trigger channel. First sampled channel by default. + voltage : float, optional + The trigger voltage in volts. The default value is 0. + prescaler : int, optional + The default value is 0. + enable_trigger : bool, optional + Set this to False to disable the trigger. True by default. + + Examples + -------- + >>> from pslab import Oscilloscope + >>> scope = Oscilloscope() + >>> scope.configure_trigger(channel='CH1', voltage=1.1) + >>> x, y = scope.capture(channels=1, samples=800, timegap=2) + >>> diff = abs(y[0] - 1.1) # Should be small unless a timeout occurred. + + Raises + ------ + TypeError + If the trigger channel is set to a channel which cannot be sampled. + """ + if enable is False: + self._trigger_enabled = False + return + + if channel is not None: + self._trigger_channel = channel + + if self.trigger_channel == self._channel_one_map: + channel = 0 + elif self.trigger_channel in self._CH234: + channel = self._CH234.index(self.trigger_channel) + 1 + else: + raise TypeError(f"Cannot trigger on {self.trigger_channel}.") + + self._device.send_byte(CP.ADC) + self._device.send_byte(CP.CONFIGURE_TRIGGER) + # Trigger channel (4lsb) , trigger timeout prescaler (4msb) + self._device.send_byte((prescaler << 4) | (1 << channel)) # TODO prescaler? + level = self._channels[self.trigger_channel].unscale(voltage) + self._device.send_int(level) + self._device.get_ack() + self._trigger_enabled = True + + @property + def trigger_enabled(self) -> bool: + """bool: Wait for trigger condition before capture start.""" + return self._trigger_enabled + + @property + def trigger_channel(self) -> str: + """str: Name of channel to trigger on.""" + return self._trigger_channel + + @property + def trigger_voltage(self) -> float: + """float: Trigger when voltage crosses this value.""" + return self._trigger_voltage + + def select_range(self, channel: str, voltage_range: Union[int, float]): + """Set appropriate gain automatically. + + Setting the right voltage range will result in better resolution. + + Parameters + ---------- + channel : {'CH1', 'CH2'} + Channel on which to apply gain. + voltage_range : {16, 8, 4, 3, 2, 1.5, 1, .5} + + Examples + -------- + Set 2x gain on CH1. Voltage range ±8 V: + + >>> from pslab import Oscilloscope + >>> scope = Oscilloscope() + >>> scope.select_range('CH1', 8) + """ + ranges = [16, 8, 4, 3, 2, 1.5, 1, 0.5] + gain = GAIN_VALUES[ranges.index(voltage_range)] + self._set_gain(channel, gain) + + def _set_gain(self, channel: str, gain: int): + spi_config_supported = self._check_spi_config() + + if not spi_config_supported: + spi_parameters = SPIMaster.get_parameters() + spi = SPIMaster(self._device) # Initializing SPIMaster will reset config. + + self._channels[channel].gain = gain + pga = self._channels[channel].programmable_gain_amplifier + gain_idx = GAIN_VALUES.index(gain) + self._device.send_byte(CP.ADC) + self._device.send_byte(CP.SET_PGA_GAIN) + self._device.send_byte(pga) + self._device.send_byte(gain_idx) + self._device.get_ack() + + if not spi_config_supported: + spi.set_parameters(*spi_parameters) + + @staticmethod + def _check_spi_config() -> bool: + """Check whether current SPI config is supported by PGA. + + Returns + ------- + bool + Returns True if SPI config is supported by PGA, otherwise False. + """ + # Check the SPI mode. PGA only supports mode 0 and mode 3. + if (SPIMaster._clock_polarity, SPIMaster._clock_phase) not in [(0, 0), (1, 1)]: + return False + if SPIMaster._frequency > 10e6: # PGA only supports max of 10MHz. + return False + + return True diff --git a/pslab/instrument/power_supply.py b/pslab/instrument/power_supply.py new file mode 100644 index 00000000..7d31885e --- /dev/null +++ b/pslab/instrument/power_supply.py @@ -0,0 +1,128 @@ +"""Control voltage and current with the PSLab's PV1, PV2, PV3, and PCS pins. + +Examples +-------- +>>> from pslab import PowerSupply +>>> ps = PowerSupply() +>>> ps.pv1 = 4.5 +>>> ps.pv1 +4.5 + +>>> ps.pcs = 2e-3 +>>> ps.pcs +0.002 +""" + +import pslab.protocol as CP +from pslab.connection import ConnectionHandler, autoconnect + + +class PowerSupply: + """Control the PSLab's programmable voltage and current sources. + + An instance of PowerSupply controls three programmable voltage sources on + pins PV1, PV2, and PV3, as well as a programmable current source on pin + PCS. + + Parameters + ---------- + device : :class:`SerialHandler` + Serial connection with which to communicate with the device. A new + instance will be created automatically if not specified. + """ + + _REFERENCE = 3300 + _PV1_CH = 3 + _PV1_RANGE = (-5, 5) + _PV2_CH = 2 + _PV2_RANGE = (-3.3, 3.3) + _PV3_CH = 1 + _PV3_RANGE = (0, 3.3) + _PCS_CH = 0 + _PCS_RANGE = (3.3e-3, 0) + + def __init__(self, device: ConnectionHandler | None = None): + self._device = device if device is not None else autoconnect() + self._pv1 = None + self._pv2 = None + self._pv3 = None + self._pcs = None + + def _set_power(self, channel, output): + self._device.send_byte(CP.DAC) + self._device.send_byte(CP.SET_POWER) + self._device.send_byte(channel) + self._device.send_int(output) + return self._device.get_ack() + + @staticmethod + def _bound(value, output_range): + return max(min(value, max(output_range)), min(output_range)) + + def _scale(self, value, output_range): + scaled = (value - output_range[0]) / (output_range[1] - output_range[0]) + return int(scaled * self._REFERENCE) + + @property + def pv1(self): + """float: Voltage on PV1; range [-5, 5] V.""" + return self._pv1 + + @pv1.setter + def pv1(self, value: float): + value = self._bound(value, self._PV1_RANGE) + ret = self._set_power(self._PV1_CH, self._scale(value, self._PV1_RANGE)) + self._pv1 = value + return ret + + @property + def pv2(self): + """float: Voltage on PV2; range [-3.3, 3.3] V.""" + return self._pv2 + + @pv2.setter + def pv2(self, value: float): + value = self._bound(value, self._PV2_RANGE) + self._set_power(self._PV2_CH, self._scale(value, self._PV2_RANGE)) + self._pv2 = value + + @property + def pv3(self): + """float: Voltage on PV3; range [0, 3.3] V.""" + return self._pv3 + + @pv3.setter + def pv3(self, value: float): + value = self._bound(value, self._PV3_RANGE) + self._set_power(self._PV3_CH, self._scale(value, self._PV3_RANGE)) + self._pv3 = value + + @property + def pcs(self): + """float: Current on PCS; range [0, 3.3e-3] A. + + Notes + ----- + The maximum available current that can be output by the current source + is dependent on load resistance: + + I_max = 3.3 V / (1 kΩ + R_load) + + For example, the maximum current that can be driven across a 100 Ω load + is 3.3 V / 1.1 kΩ = 3 mA. If the load is 10 kΩ, the maximum current is + only 3.3 V / 11 kΩ = 300 µA. + + Be careful to not set a current higher than available for a given load. + If a current greater than the maximum for a certain load is requested, + the actual current will instead be much smaller. For example, if a + current of 3 mA is requested when connected to a 1 kΩ load, the actual + current will be only a few hundred µA instead of the maximum available + 1.65 mA. + """ + return self._pcs + + @pcs.setter + def pcs(self, value: float): + value = self._bound(value, self._PCS_RANGE) + self._set_power(self._PCS_CH, self._scale(value, self._PCS_RANGE)) + self._pcs = value diff --git a/pslab/instrument/waveform_generator.py b/pslab/instrument/waveform_generator.py new file mode 100644 index 00000000..07c35238 --- /dev/null +++ b/pslab/instrument/waveform_generator.py @@ -0,0 +1,540 @@ +"""Control the PSLab's waveform generators. + +Two types of waveform generator are available: WaveformGenerator and +PWMGenerator. WaveformGenerator can output arbitrary waveforms on pins SI1 and +SI2. PWMGenerator can output square waveforms on pins SQ1, SQ2, SQ3, and SQ4. +""" + +import logging +from typing import Callable, List, Tuple, Union + +import numpy as np + +import pslab.protocol as CP +from pslab.connection import ConnectionHandler, autoconnect +from pslab.instrument.analog import AnalogOutput +from pslab.instrument.digital import DigitalOutput, DIGITAL_OUTPUTS + +logger = logging.getLogger(__name__) + +_PRESCALERS = [1, 8, 64, 256] + + +def _listify(channel, maxlen, *args): + if not isinstance(channel, list): + channel = [channel] + elif len(channel) > maxlen: + raise ValueError("Too many channels.") + + ret = [channel] + + for arg in args: + if isinstance(arg, list): + if len(arg) == len(channel): + ret.append(arg) + else: + raise ValueError("Dimension mismatch.") + else: + ret.append(len(channel) * [arg]) + + return ret + + +def _get_wavelength(frequency: float, table_size: int = 1) -> Tuple[int, int]: + """Get the wavelength of a PWM signal in clock cycles, and the clock prescaler. + + For an analog signal, the wavelength of the underlying PWM signal is equal + to the time gap between two points in the analog waveform. + + Parameters + ---------- + frequency : float + Frequency of the signal in Hz. + table_size : int, optional + Number of points in the analog signal. The default value is 1, which + implies a digital signal. + + Returns + ------- + wavelength : int + Signal wavelength in clock cycles. + prescaler : int + Factor by which the clock rate is reduced, e.g. a prescaler of 64 means + that the clock rate is 1 Mhz instead of the original 64 MHz. + """ + for prescaler in _PRESCALERS: + timegap = int(round(CP.CLOCK_RATE / frequency / prescaler / table_size)) + if 0 < timegap < 2**16: + return timegap, prescaler + + e = ( + "Prescaler out of range. This should not happen." + + " " + + "Please report this bug, including steps to trigger it, to" + + " " + + "https://github.com/fossasia/pslab-python/issues." + ) + raise ValueError(e) + + +class WaveformGenerator: + """Generate analog waveforms on SI1 or SI2. + + Parameters + ---------- + device : :class:`SerialHandler`, optional + Serial connection with which to communicate with the device. A new + instance is created automatically if not specified. + + Examples + -------- + Output the default function (3.3*sin(t)) on SI2 with frequency 2.5 kHz: + + >>> from pslab import WaveformGenerator + >>> wavegen = WaveformGenerator() + >>> wavegen.generate("SI2", 2500) + [2500] + + Output phase shifted sine waves on SI1 and SI2: + + >>> wavegen.generate(["SI1", "SI2"], 1000, 90) + [1000, 1000] + + Reduce the amplitude on SI1: + + >>> import numpy as np + >>> wavegen.load_function("SI1", lambda x: 1.5*np.sin(x), [0, 2*np.pi]) + + Output two superimposed sine waves on SI2: + + >>> wavegen.load_function("SI2", lambda x: 2*np.sin(x) + np.sin(5*x), [0, 2*np.pi]) + """ + + _HIGHRES_TABLE_SIZE = 512 + _LOWRES_TABLE_SIZE = 32 + _LOW_FREQUENCY_WARNING = 20 + _LOW_FREQUENCY_LIMIT = 0.1 + _HIGH_FREQUENCY_WARNING = 5e3 + _HIGHRES_FREQUENCY_LIMIT = 1100 + + def __init__(self, device: ConnectionHandler | None = None): + self._channels = {n: AnalogOutput(n) for n in ("SI1", "SI2")} + self._device = device if device is not None else autoconnect() + + def generate( + self, + channels: Union[str, List[str]], + frequency: Union[float, List[float]], + phase: float = 0, + ) -> List[float]: + """Generate analog waveforms on SI1 or SI2. + + The default waveform is a sine wave with amplitude 3.3 V. Other + waveforms can be set using :meth:`load_function` or :meth:`load_table`. + + Parameters + ---------- + channels : {1, 2} or {'SI1', 'SI2', ['SI1', 'SI2']} + Pin(s) on which to generate a waveform. + frequency : float or list of floats + Frequency in Hz. Can be a list containing two different values when + 'channel' is ['SI1', 'SI2']. Must be greater than 0.1 Hz. For + frequencies below 1 Hz the signal is noticably attenuated by AC + coupling. + phase : float, optional + Phase between waveforms when generating waveforms on both SI1 and + SI2 in degrees. The default is 0. + + Returns + ------- + frequency : List[float] + The actual frequency may differ from the requested value due to + the device-interal integer representation. The actual frequency is + therefore returned as a list. The length of the list is equal to + the number of channels used to generate waveforms. + """ + if isinstance(channels, int): + channels = ["SI1", "SI2"][:channels] + + channels, frequency = _listify(channels, 2, frequency) + table_size = len(channels) * [None] + timegap = len(channels) * [None] + prescaler = len(channels) * [None] + + for i, (chan, freq) in enumerate(zip(channels, frequency)): + if freq < self._LOW_FREQUENCY_WARNING: + w = ( + f"Frequencies under {self._LOW_FREQUENCY_WARNING} Hz have" + + " " + + "reduced amplitude due to AC coupling restrictions." + ) + logger.warning(w) + elif freq > self._HIGH_FREQUENCY_WARNING: + w = ( + f"Frequencies above {self._HIGH_FREQUENCY_WARNING} Hz have" + + " " + + "reduced amplitude." + ) + logger.warning(w) + + table_size[i] = self._get_table_size(freq) + timegap[i], prescaler[i] = _get_wavelength(freq, table_size[i]) + frequency[i] = CP.CLOCK_RATE / timegap[i] / prescaler[i] / table_size[i] + self._channels[chan].frequency = frequency[i] + + if len(channels) == 1: + self._output_one(channels, table_size, prescaler, timegap) + else: + self._output_two(table_size, phase, prescaler, timegap) + + return frequency + + def _output_one(self, channel: str, table_size: int, prescaler: int, timegap: int): + self._device.send_byte(CP.WAVEGEN) + secondary_cmd = CP.SET_SINE1 if channel[0] == "SI1" else CP.SET_SINE2 + self._device.send_byte(secondary_cmd) + # Use larger table for low frequencies. + highres = table_size[0] == self._HIGHRES_TABLE_SIZE + self._device.send_byte(highres | (_PRESCALERS.index(prescaler[0]) << 1)) + self._device.send_int(timegap[0] - 1) + self._device.get_ack() + + def _output_two(self, table_size: int, phase: float, prescaler: int, timegap: int): + self._device.send_byte(CP.WAVEGEN) + phase_coarse = int(table_size[1] * phase / 360) + phase_fine = int( + timegap[1] + * (phase - phase_coarse * 360 / table_size[1]) + / (360 / table_size[1]) + ) + self._device.send_byte(CP.SET_BOTH_WG) + self._device.send_int(timegap[0] - 1) + self._device.send_int(timegap[1] - 1) + self._device.send_int(phase_coarse) # Table position for phase adjust. + self._device.send_int(phase_fine) # Timer delay / fine phase adjust. + highres = [t == self._HIGHRES_TABLE_SIZE for t in table_size] + self._device.send_byte( + (_PRESCALERS.index(prescaler[1]) << 4) + | (_PRESCALERS.index(prescaler[0]) << 2) + | (highres[1] << 1) + | (highres[0]) + ) + self._device.get_ack() + + def _get_table_size(self, frequency: float) -> int: + if frequency < self._LOW_FREQUENCY_LIMIT: + e = f"Frequency must be greater than {self._LOW_FREQUENCY_LIMIT} Hz." + raise ValueError(e) + elif frequency < self._HIGHRES_FREQUENCY_LIMIT: + table_size = self._HIGHRES_TABLE_SIZE + else: + table_size = self._LOWRES_TABLE_SIZE + + return table_size + + def load_function( + self, channel: str, function: Union[str, Callable], span: List[float] = None + ): + """Load a custom waveform function. + + Parameters + ---------- + channel : {'SI1', 'SI2'} + The output pin on which to generate the waveform. + function : Union[str, Callable] + A callable function which takes a numpy.ndarray of x values as + input and returns a corresponding numpy.ndarray of y values. The + y-values should be voltages in V, and should lie between -3.3 V + and 3.3 V. Values outside this range will be clipped. + + Alternatively, 'function' can be a string literal 'sine' or 'tria', + for a sine wave or triangle wave with amplitude 3.3 V. + span : List[float], optional + The minimum and maximum x values between which to evaluate + 'function'. Should typically correspond to one period. Omit if + 'function' is 'sine' or 'tria'. + """ + if function == "sine": + + def sine(x): + return AnalogOutput.RANGE[1] * np.sin(x) + + function = sine + span = [0, 2 * np.pi] + self._channels[channel].wavetype = "sine" + elif function == "tria": + + def tria(x): + return AnalogOutput.RANGE[1] * (abs(x % 4 - 2) - 1) + + function = tria + span = [0, 4] + self._channels[channel].wavetype = "tria" + else: + self._channels[channel].wavetype = "custom" + + x = np.arange(span[0], span[1], (span[1] - span[0]) / 512) + y = function(x) + self._load_table( + channel=channel, points=y, mode=self._channels[channel].wavetype + ) + + def load_table(self, channel: str, points: np.ndarray): + """Load a custom waveform as a table. + + Parameters + ---------- + channel : {'SI1', 'SI2'} + The output pin on which to generate the waveform. + points : np.ndarray + Array of voltage values which make up the waveform. Array length + must be 512. Values outside the range -3.3 V to 3.3 V will be + clipped. + """ + self._load_table(channel, points, "custom") + + def _load_table(self, channel, points, mode="custom"): + self._channels[channel].wavetype = mode + self._channels[channel].waveform_table = points + logger.info(f"Reloaded waveform table for {channel}: {mode}.") + self._device.send_byte(CP.WAVEGEN) + + if self._channels[channel].name == "SI1": + self._device.send_byte(CP.LOAD_WAVEFORM1) + else: + self._device.send_byte(CP.LOAD_WAVEFORM2) + + for val in self._channels[channel].waveform_table: + self._device.send_int(val) + for val in self._channels[channel].lowres_waveform_table: + self._device.send_byte(val) + + self._device.get_ack() + + +class PWMGenerator: + """Generate PWM signals on SQ1, SQ2, SQ3, and SQ4. + + Parameters + ---------- + device : :class:`SerialHandler` + Serial connection with which to communicate with the device. A new + instance will be created automatically if not specified. + + Examples + -------- + Output 40 kHz PWM signals on SQ1 and SQ3 phase shifted by 50%. Set the duty + cycles to 75% and 33%, respectivelly: + + >>> from pslab import PWMGenerator + >>> pwmgen = PWMGenerator() + >>> pwmgen.generate(["SQ1", "SQ2"], 4e4, [0.75, 0.33], 0.5) + + Output a 32 MHz PWM signal on SQ4 with a duty cycle of 50%: + + >>> pwmgen.map_reference_clock(["SQ4"], 2) + + Set SQ2 high: + + >>> pwmgen.set_states(sq2=True) + """ + + _LOW_FREQUENCY_LIMIT = 4 + _HIGH_FREQUENCY_LIMIT = 1e7 + + def __init__(self, device: ConnectionHandler | None = None): + self._device = device if device is not None else autoconnect() + self._channels = {n: DigitalOutput(n) for n in DIGITAL_OUTPUTS} + self._frequency = 0 + self._reference_prescaler = 0 + + @property + def frequency(self) -> float: + """Get the common frequency for all digital outputs in Hz.""" + return self._frequency + + def generate( + self, + channels: Union[str, List[str]], + frequency: float, + duty_cycles: Union[float, List[float]], + phases: Union[float, List[float]] = 0, + ): + """Generate PWM signals on SQ1, SQ2, SQ3, and SQ4. + + Parameters + ---------- + channels : {1, 2, 3, 4} or {'SQ1', 'SQ2', 'SQ3', 'SQ4'} or list of the same + Pin name or list of pin names on which to generate PWM signals. + Pins which are not included in the argument will not be affected. + frequency : float + Frequency in Hz. Shared by all outputs. + duty_cycles : float or list of floats + Duty cycle between 0 and 1 as either a single value or a list of + values. + + If 'duty_cycles' is a single value, it is applied to all channels + given in 'channels'. + + If 'duty_cycles' is a list, the values in the list will be applied + to the corresponding channel in the 'channels' list. The lists must + have the same length. + phases : float or list of floats + Phase between 0 and 1 as either a single value or a list of values. + + If 'phases' is a single value, it will be the phase between each + subsequent channel in 'channels'. For example, + + >>> generate(['SQ1', 'SQ2', 'SQ3', 'SQ4'], 1000, 0.5, 0.1) + + SQ2 will be shifted relative to SQ1 by 10%, SQ3 will be shifted + relative to SQ2 by 10% (i.e. 20% relative to SQ1), and SQ4 will be + shifted relative to SQ3 by 10% (i.e. 30% relative to SQ1). + + If 'phases' is a list, the values in the list will be applied to + the corresponding channel in the 'channels' list. The lists must + have the same length. + """ + if isinstance(channels, int): + channels = ["SQ1", "SQ2", "SQ3", "SQ4"][:channels] + + if frequency > self._HIGH_FREQUENCY_LIMIT: + e = ( + "Frequency is greater than 10 MHz." + + " " + + "Please use map_reference_clock for 16 & 32 MHz outputs." + ) + raise ValueError(e) + elif frequency < self._LOW_FREQUENCY_LIMIT: + raise ValueError( + f"Frequency must be at least {self._LOW_FREQUENCY_LIMIT} Hz." + ) + else: + self._frequency = frequency + channels, duty_cycles = _listify(channels, 4, duty_cycles) + + if not isinstance(phases, list): + phases = [i * phases for i in range(len(channels))] + + for channel, duty_cycle, phase in zip(channels, duty_cycles, phases): + self._channels[channel].duty_cycle = duty_cycle + self._channels[channel].phase = phase + self._channels[channel].remapped = False + + # Turn on all channels, minimum duty cycle of 1 wavelength. + self._generate( + [self._channels[c].duty_cycle for c in DIGITAL_OUTPUTS], + [self._channels[c].phase for c in DIGITAL_OUTPUTS], + ) + # Reset channels which should be LOW or HIGH to correct duty cycle. + self.set_state(**{k.lower(): v.state for k, v in self._channels.items()}) + + # Remap channels which should be mapped to the referene clock. + remapped = [c.name for c in self._channels.values() if c.remapped] + self.map_reference_clock(remapped, self._reference_prescaler) + + def _generate( + self, + duty_cycles: List[float], + phases: List[float], + ): + """Generate PWM signals on all four digital output pins. + + Paramaters + ---------- + duty_cycles : list of floats + List of length four containing duty cycles for each output as a + float in the open interval (0, 1). Note that it is not possible + to set the duty cycle to exactly 0 or 1; use :meth:`set_state` + instead. + phases : list of floats + List of length four containing phases for each output as a float in + the half open interval [0, 1). A phase of 1 is identical to a phase + of 0. + """ + wavelength, prescaler = _get_wavelength(self._frequency) + self._frequency = CP.CLOCK_RATE / wavelength / prescaler + continuous = 1 << 5 + + for i, (duty_cycle, phase) in enumerate(zip(duty_cycles, phases)): + duty_cycles[i] = int((duty_cycle + phase) % 1 * wavelength) + duty_cycles[i] = max(1, duty_cycles[i] - 1) # Zero index. + phases[i] = int(phase % 1 * wavelength) + phases[i] = max(0, phases[i] - 1) # Zero index. + + self._device.send_byte(CP.WAVEGEN) + self._device.send_byte(CP.SQR4) + self._device.send_int(wavelength - 1) # Zero index. + self._device.send_int(duty_cycles[0]) + self._device.send_int(phases[1]) + self._device.send_int(duty_cycles[1]) + self._device.send_int(phases[2]) + self._device.send_int(duty_cycles[2]) + self._device.send_int(phases[3]) + self._device.send_int(duty_cycles[3]) + self._device.send_byte(_PRESCALERS.index(prescaler) | continuous) + self._device.get_ack() + + def set_state( + self, + sq1: Union[bool, str, None] = None, + sq2: Union[bool, str, None] = None, + sq3: Union[bool, str, None] = None, + sq4: Union[bool, str, None] = None, + ): + """Set the digital outputs HIGH or LOW. + + Parameters + ---------- + sq1 : {True, False, None, 'HIGH', 'LOW', 'PWM'}, optional + Set the state of SQ1. True or "HIGH" sets it HIGH, False or "LOW" + sets it low, and None or "PWM" leaves it in its current state. The + default value is None. + sq2 : {True, False, None, 'HIGH', 'LOW', 'PWM'}, optional + See 'sq1'. + sq3 : {True, False, None, 'HIGH', 'LOW', 'PWM'}, optional + See 'sq1'. + sq4 : {True, False, None, 'HIGH', 'LOW', 'PWM'}, optional + See 'sq1'. + """ + states = 0 + + for i, sq in enumerate([sq1, sq2, sq3, sq4]): + if sq in (True, False, "HIGH", "LOW"): + sq = 1 if sq in (True, "HIGH") else 0 + self._channels[DIGITAL_OUTPUTS[i]].duty_cycle = sq + states |= self._channels[DIGITAL_OUTPUTS[i]].state_mask | (sq << i) + + self._device.send_byte(CP.DOUT) + self._device.send_byte(CP.SET_STATE) + self._device.send_byte(states) + self._device.get_ack() + + def map_reference_clock(self, channels: List[str], prescaler: int): + """Map the internal oscillator output to a digital output. + + The duty cycle of the output is locked to 50%. + + Parameters + ---------- + channels : {'SQ1', 'SQ2', 'SQ3', 'SQ4'} or list of the same + Digital output pin(s) to which to map the internal oscillator. + prescaler : int + Prescaler value in interval [0, 15]. The output frequency is + 128 / (1 << prescaler) MHz. + """ + (channels,) = _listify(channels, 4) + self._device.send_byte(CP.WAVEGEN) + self._device.send_byte(CP.MAP_REFERENCE) + self._reference_prescaler = prescaler + maps = 0 + + for channel in channels: + self._channels[channel].duty_cycle = 0.5 + self._channels[channel].phase = 0 + self._channels[channel].remapped = True + maps |= self._channels[channel].reference_clock_map + + self._device.send_byte(maps) + self._device.send_byte(prescaler) + self._device.get_ack() diff --git a/pslab/peripherals.py b/pslab/peripherals.py new file mode 100644 index 00000000..f8e9ad7e --- /dev/null +++ b/pslab/peripherals.py @@ -0,0 +1,657 @@ +import logging +import time + +import pslab.protocol as CP + +logger = logging.getLogger(__name__) + + +class NRF24L01(): + # Commands + R_REG = 0x00 + W_REG = 0x20 + RX_PAYLOAD = 0x61 + TX_PAYLOAD = 0xA0 + ACK_PAYLOAD = 0xA8 + FLUSH_TX = 0xE1 + FLUSH_RX = 0xE2 + ACTIVATE = 0x50 + R_STATUS = 0xFF + + # Registers + NRF_CONFIG = 0x00 + EN_AA = 0x01 + EN_RXADDR = 0x02 + SETUP_AW = 0x03 + SETUP_RETR = 0x04 + RF_CH = 0x05 + RF_SETUP = 0x06 + NRF_STATUS = 0x07 + OBSERVE_TX = 0x08 + CD = 0x09 + RX_ADDR_P0 = 0x0A + RX_ADDR_P1 = 0x0B + RX_ADDR_P2 = 0x0C + RX_ADDR_P3 = 0x0D + RX_ADDR_P4 = 0x0E + RX_ADDR_P5 = 0x0F + TX_ADDR = 0x10 + RX_PW_P0 = 0x11 + RX_PW_P1 = 0x12 + RX_PW_P2 = 0x13 + RX_PW_P3 = 0x14 + RX_PW_P4 = 0x15 + RX_PW_P5 = 0x16 + R_RX_PL_WID = 0x60 + FIFO_STATUS = 0x17 + DYNPD = 0x1C + FEATURE = 0x1D + PAYLOAD_SIZE = 0 + ACK_PAYLOAD_SIZE = 0 + READ_PAYLOAD_SIZE = 0 + + ADC_COMMANDS = 1 + READ_ADC = 0 << 4 + + I2C_COMMANDS = 2 + I2C_TRANSACTION = 0 << 4 + I2C_WRITE = 1 << 4 + I2C_SCAN = 2 << 4 + PULL_SCL_LOW = 3 << 4 + I2C_CONFIG = 4 << 4 + I2C_READ = 5 << 4 + + NRF_COMMANDS = 3 + NRF_READ_REGISTER = 0 + NRF_WRITE_REGISTER = 1 << 4 + + CURRENT_ADDRESS = 0xAAAA01 + nodelist = {} + nodepos = 0 + NODELIST_MAXLENGTH = 15 + connected = False + + def __init__(self, device): + self.H = device + self.ready = False + self.sigs = {self.CURRENT_ADDRESS: 1} + if self.H.connected: + self.connected = self.init() + + def init(self): + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_SETUP) + self.H.get_ack() + time.sleep(0.015) # 15 mS settling time + stat = self.get_status() + if stat & 0x80: + logger.info("Radio transceiver not installed/not found") + return False + else: + self.ready = True + self.selectAddress(self.CURRENT_ADDRESS) + # self.write_register(self.RF_SETUP,0x06) + self.rxmode() + time.sleep(0.1) + self.flush() + return True + + def rxmode(self): + ''' + Puts the radio into listening mode. + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_RXMODE) + self.H.get_ack() + + def txmode(self): + ''' + Puts the radio into transmit mode. + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_TXMODE) + self.H.get_ack() + + def triggerAll(self, val): + self.txmode() + self.selectAddress(0x111111) + self.write_register(self.EN_AA, 0x00) + self.write_payload([val], True) + self.write_register(self.EN_AA, 0x01) + + def power_down(self): + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_POWER_DOWN) + self.H.get_ack() + + def rxchar(self): + ''' + Receives a 1 Byte payload + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_RXCHAR) + value = self.H.get_byte() + self.H.get_ack() + return value + + def txchar(self, char): + ''' + Transmits a single character + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_TXCHAR) + self.H.send_byte(char) + return self.H.get_ack() >> 4 + + def hasData(self): + ''' + Check if the RX FIFO contains data + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_HASDATA) + value = self.H.get_byte() + self.H.get_ack() + return value + + def flush(self): + ''' + Flushes the TX and RX FIFOs + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_FLUSH) + self.H.get_ack() + + def write_register(self, address, value): + ''' + write a byte to any of the configuration registers on the Radio. + address byte can either be located in the NRF24L01+ manual, or chosen + from some of the constants defined in this module. + ''' + # print ('writing',address,value) + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_WRITEREG) + self.H.send_byte(address) + self.H.send_byte(value) + self.H.get_ack() + + def read_register(self, address): + ''' + Read the value of any of the configuration registers on the radio module. + + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_READREG) + self.H.send_byte(address) + val = self.H.get_byte() + self.H.get_ack() + return val + + def get_status(self): + ''' + Returns a byte representing the STATUS register on the radio. + Refer to NRF24L01+ documentation for further details + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_GETSTATUS) + val = self.H.get_byte() + self.H.get_ack() + return val + + def write_command(self, cmd): + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_WRITECOMMAND) + self.H.send_byte(cmd) + self.H.get_ack() + + def write_address(self, register, address): + ''' + register can be TX_ADDR, RX_ADDR_P0 -> RX_ADDR_P5 + 3 byte address. eg 0xFFABXX . XX cannot be FF + if RX_ADDR_P1 needs to be used along with any of the pipes + from P2 to P5, then RX_ADDR_P1 must be updated last. + Addresses from P1-P5 must share the first two bytes. + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_WRITEADDRESS) + self.H.send_byte(register) + self.H.send_byte(address & 0xFF) + self.H.send_byte((address >> 8) & 0xFF) + self.H.send_byte((address >> 16) & 0xFF) + self.H.get_ack() + + def selectAddress(self, address): + ''' + Sets RX_ADDR_P0 and TX_ADDR to the specified address. + + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_WRITEADDRESSES) + self.H.send_byte(address & 0xFF) + self.H.send_byte((address >> 8) & 0xFF) + self.H.send_byte((address >> 16) & 0xFF) + self.H.get_ack() + self.CURRENT_ADDRESS = address + if address not in self.sigs: + self.sigs[address] = 1 + + def read_payload(self, numbytes): + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_READPAYLOAD) + self.H.send_byte(numbytes) + data = self.H.fd.read(numbytes) + self.H.get_ack() + return [ord(a) for a in data] + + def write_payload(self, data, verbose=False, **args): + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_WRITEPAYLOAD) + numbytes = len( + data) | 0x80 # 0x80 implies transmit immediately. Otherwise it will simply load the TX FIFO ( used by ACK_payload) + if (args.get('rxmode', False)): numbytes |= 0x40 + self.H.send_byte(numbytes) + self.H.send_byte(self.TX_PAYLOAD) + for a in data: + self.H.send_byte(a) + val = self.H.get_ack() >> 4 + if (verbose): + if val & 0x2: + print(' NRF radio not found. Connect one to the add-on port') + elif val & 0x1: + print(' Node probably dead/out of range. It failed to acknowledge') + return + return val + + def I2C_scan(self): + ''' + Scans the I2C bus and returns a list of live addresses + ''' + x = self.transaction([self.I2C_COMMANDS | self.I2C_SCAN | 0x80], timeout=500) + if not x: return [] + if not sum(x): return [] + addrs = [] + for a in range(16): + if (x[a] ^ 255): + for b in range(8): + if x[a] & (0x80 >> b) == 0: + addr = 8 * a + b + addrs.append(addr) + return addrs + + def GuessingScan(self): + ''' + Scans the I2C bus and also prints the possible devices associated with each found address + ''' + from PSL import sensorlist + print('Scanning addresses 0-127...') + x = self.transaction([self.I2C_COMMANDS | self.I2C_SCAN | 0x80], timeout=500) + if not x: return [] + if not sum(x): return [] + addrs = [] + print('Address', '\t', 'Possible Devices') + + for a in range(16): + if (x[a] ^ 255): + for b in range(8): + if x[a] & (0x80 >> b) == 0: + addr = 8 * a + b + addrs.append(addr) + print(hex(addr), '\t\t', sensorlist.sensors.get(addr, 'None')) + + return addrs + + def transaction(self, data, **args): + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_TRANSACTION) + self.H.send_byte(len(data)) # total Data bytes coming through + if 'listen' not in args: args['listen'] = True + if args.get('listen', False): data[0] |= 0x80 # You need this if hardware must wait for a reply + timeout = args.get('timeout', 200) + verbose = args.get('verbose', False) + self.H.send_int(timeout) # timeout. + for a in data: + self.H.send_byte(a) + + # print ('dt send',time.time()-st,timeout,data[0]&0x80,data) + numbytes = self.H.get_byte() + # print ('byte 1 in',time.time()-st) + if numbytes: + data = self.H.fd.read(numbytes) + else: + data = [] + val = self.H.get_ack() >> 4 + if (verbose): + if val & 0x1: print(time.time(), '%s Err. Node not found' % (hex(self.CURRENT_ADDRESS))) + if val & 0x2: print(time.time(), + '%s Err. NRF on-board transmitter not found' % (hex(self.CURRENT_ADDRESS))) + if val & 0x4 and args['listen']: print(time.time(), + '%s Err. Node received command but did not reply' % ( + hex(self.CURRENT_ADDRESS))) + if val & 0x7: # Something didn't go right. + self.flush() + self.sigs[self.CURRENT_ADDRESS] = self.sigs[self.CURRENT_ADDRESS] * 50 / 51. + return False + + self.sigs[self.CURRENT_ADDRESS] = (self.sigs[self.CURRENT_ADDRESS] * 50 + 1) / 51. + return [ord(a) for a in data] + + def transactionWithRetries(self, data, **args): + retries = args.get('retries', 5) + reply = False + while retries > 0: + reply = self.transaction(data, verbose=(retries == 1), **args) + if reply: + break + retries -= 1 + return reply + + def write_ack_payload(self, data, pipe): + if (len(data) != self.ACK_PAYLOAD_SIZE): + self.ACK_PAYLOAD_SIZE = len(data) + if self.ACK_PAYLOAD_SIZE > 15: + print('too large. truncating.') + self.ACK_PAYLOAD_SIZE = 15 + data = data[:15] + else: + print('ack payload size:', self.ACK_PAYLOAD_SIZE) + + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_WRITEPAYLOAD) + self.H.send_byte(len(data)) + self.H.send_byte(self.ACK_PAYLOAD | pipe) + for a in data: + self.H.send_byte(a) + return self.H.get_ack() >> 4 + + def start_token_manager(self): + ''' + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_START_TOKEN_MANAGER) + self.H.get_ack() + + def stop_token_manager(self): + ''' + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_STOP_TOKEN_MANAGER) + self.H.get_ack() + + def total_tokens(self): + ''' + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_TOTAL_TOKENS) + x = self.H.get_byte() + self.H.get_ack() + return x + + def fetch_report(self, num): + ''' + ''' + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_REPORTS) + self.H.send_byte(num) + data = [self.H.get_byte() for a in range(20)] + self.H.get_ack() + return data + + @staticmethod + def __decode_I2C_list__(data): + lst = [] + if sum(data) == 0: + return lst + for i, d in enumerate(data): + if (d ^ 255): + for b in range(8): + if d & (0x80 >> b) == 0: + addr = 8 * i + b + lst.append(addr) + return lst + + def get_nodelist(self): + ''' + Refer to the variable 'nodelist' if you simply want a list of nodes that either registered while your code was + running , or were loaded from the firmware buffer(max 15 entries) + + If you plan to use more than 15 nodes, and wish to register their addresses without having to feed them manually, + then this function must be called each time before the buffer resets. + + The dictionary object returned by this function [addresses paired with arrays containing their registered sensors] + is filtered by checking with each node if they are alive. + + ''' + + total = self.total_tokens() + if self.nodepos != total: + for nm in range(self.NODELIST_MAXLENGTH): + dat = self.fetch_report(nm) + txrx = (dat[0]) | (dat[1] << 8) | (dat[2] << 16) + if not txrx: continue + self.nodelist[txrx] = self.__decode_I2C_list__(dat[3:19]) + self.nodepos = total + # else: + # self.__delete_registered_node__(nm) + + filtered_lst = {} + for a in self.nodelist: + if self.isAlive(a): filtered_lst[a] = self.nodelist[a] + + return filtered_lst + + def __delete_registered_node__(self, num): + self.H.send_byte(CP.NRFL01) + self.H.send_byte(CP.NRF_DELETE_REPORT_ROW) + self.H.send_byte(num) + self.H.get_ack() + + def __delete_all_registered_nodes__(self): + while self.total_tokens(): + print('-') + self.__delete_registered_node__(0) + + def isAlive(self, addr): + self.selectAddress(addr) + return self.transaction([self.NRF_COMMANDS | self.NRF_READ_REGISTER] + [self.R_STATUS], timeout=100, + verbose=False) + + def init_shockburst_transmitter(self, **args): + ''' + Puts the radio into transmit mode. + Dynamic Payload with auto acknowledge is enabled. + upto 5 retransmits with 1ms delay between each in case a node doesn't respond in time + Receivers must acknowledge payloads + ''' + self.PAYLOAD_SIZE = args.get('PAYLOAD_SIZE', self.PAYLOAD_SIZE) + myaddr = args.get('myaddr', 0xAAAA01) + sendaddr = args.get('sendaddr', 0xAAAA01) + + self.init() + # shockburst + self.write_address(self.RX_ADDR_P0, myaddr) # transmitter's address + self.write_address(self.TX_ADDR, sendaddr) # send to node with this address + self.write_register(self.RX_PW_P0, self.PAYLOAD_SIZE) + self.rxmode() + time.sleep(0.1) + self.flush() + + def init_shockburst_receiver(self, **args): + ''' + Puts the radio into receive mode. + Dynamic Payload with auto acknowledge is enabled. + ''' + self.PAYLOAD_SIZE = args.get('PAYLOAD_SIZE', self.PAYLOAD_SIZE) + if 'myaddr0' not in args: + args['myaddr0'] = 0xA523B5 + # if 'sendaddr' non in args: + # args['sendaddr']=0xA523B5 + print(args) + self.init() + self.write_register(self.RF_SETUP, 0x26) # 2MBPS speed + + # self.write_address(self.TX_ADDR,sendaddr) #send to node with this address + # self.write_address(self.RX_ADDR_P0,myaddr) #will receive the ACK Payload from that node + enabled_pipes = 0 # pipes to be enabled + for a in range(0, 6): + x = args.get('myaddr' + str(a), None) + if x: + print(hex(x), hex(self.RX_ADDR_P0 + a)) + enabled_pipes |= (1 << a) + self.write_address(self.RX_ADDR_P0 + a, x) + P15_base_address = args.get('myaddr1', None) + if P15_base_address: self.write_address(self.RX_ADDR_P1, P15_base_address) + + self.write_register(self.EN_RXADDR, enabled_pipes) # enable pipes + self.write_register(self.EN_AA, enabled_pipes) # enable auto Acknowledge on all pipes + self.write_register(self.DYNPD, enabled_pipes) # enable dynamic payload on Data pipes + self.write_register(self.FEATURE, 0x06) # enable dynamic payload length + # self.write_register(self.RX_PW_P0,self.PAYLOAD_SIZE) + + self.rxmode() + time.sleep(0.1) + self.flush() + + +class RadioLink(): + ADC_COMMANDS = 1 + READ_ADC = 0 << 4 + + I2C_COMMANDS = 2 + I2C_TRANSACTION = 0 << 4 + I2C_WRITE = 1 << 4 + SCAN_I2C = 2 << 4 + PULL_SCL_LOW = 3 << 4 + I2C_CONFIG = 4 << 4 + I2C_READ = 5 << 4 + + NRF_COMMANDS = 3 + NRF_READ_REGISTER = 0 << 4 + NRF_WRITE_REGISTER = 1 << 4 + + MISC_COMMANDS = 4 + WS2812B_CMD = 0 << 4 + + def __init__(self, NRF, **args): + self.NRF = NRF + if 'address' in args: + self.ADDRESS = args.get('address', False) + else: + print('Address not specified. Add "address=0x....." argument while instantiating') + self.ADDRESS = 0x010101 + + def __selectMe__(self): + if self.NRF.CURRENT_ADDRESS != self.ADDRESS: + self.NRF.selectAddress(self.ADDRESS) + + def I2C_scan(self): + self.__selectMe__() + from PSL import sensorlist + print('Scanning addresses 0-127...') + x = self.NRF.transaction([self.I2C_COMMANDS | self.SCAN_I2C | 0x80], timeout=500) + if not x: return [] + if not sum(x): return [] + addrs = [] + print('Address', '\t', 'Possible Devices') + + for a in range(16): + if (x[a] ^ 255): + for b in range(8): + if x[a] & (0x80 >> b) == 0: + addr = 8 * a + b + addrs.append(addr) + print(hex(addr), '\t\t', sensorlist.sensors.get(addr, 'None')) + + return addrs + + @staticmethod + def __decode_I2C_list__(data): + lst = [] + if sum(data) == 0: + return lst + for i, d in enumerate(data): + if (d ^ 255): + for b in range(8): + if d & (0x80 >> b) == 0: + addr = 8 * i + b + lst.append(addr) + return lst + + def writeI2C(self, I2C_addr, regaddress, data_bytes): + self.__selectMe__() + return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_WRITE] + [I2C_addr] + [regaddress] + data_bytes) + + def readI2C(self, I2C_addr, regaddress, numbytes): + self.__selectMe__() + return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_TRANSACTION] + [I2C_addr] + [regaddress] + [numbytes]) + + def writeBulk(self, I2C_addr, data_bytes): + self.__selectMe__() + return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_WRITE] + [I2C_addr] + data_bytes) + + def readBulk(self, I2C_addr, regaddress, numbytes): + self.__selectMe__() + return self.NRF.transactionWithRetries( + [self.I2C_COMMANDS | self.I2C_TRANSACTION] + [I2C_addr] + [regaddress] + [numbytes]) + + def simpleRead(self, I2C_addr, numbytes): + self.__selectMe__() + return self.NRF.transactionWithRetries([self.I2C_COMMANDS | self.I2C_READ] + [I2C_addr] + [numbytes]) + + def readADC(self, channel): + self.__selectMe__() + return self.NRF.transaction([self.ADC_COMMANDS | self.READ_ADC] + [channel]) + + def pullSCLLow(self, t_ms): + self.__selectMe__() + dat = self.NRF.transaction([self.I2C_COMMANDS | self.PULL_SCL_LOW] + [t_ms]) + if dat: + return self.__decode_I2C_list__(dat) + else: + return [] + + def configI2C(self, freq): + self.__selectMe__() + brgval = int(32e6 / freq / 4 - 1) + print(brgval) + return self.NRF.transaction([self.I2C_COMMANDS | self.I2C_CONFIG] + [brgval], listen=False) + + def write_register(self, reg, val): + self.__selectMe__() + # print ('writing to ',reg,val) + return self.NRF.transaction([self.NRF_COMMANDS | self.NRF_WRITE_REGISTER] + [reg, val], listen=False) + + def WS2812B(self, cols): + """ + set shade of WS2182 LED on CS1/RC0 + + .. tabularcolumns:: |p{3cm}|p{11cm}| + + ============== ============================================================================================ + **Arguments** + ============== ============================================================================================ + cols 2Darray [[R,G,B],[R2,G2,B2],[R3,G3,B3]...] + brightness of R,G,B ( 0-255 ) + ============== ============================================================================================ + + example:: + + >>> WS2812B([[10,0,0],[0,10,10],[10,0,10]]) + #sets red, cyan, magenta to three daisy chained LEDs + + """ + self.__selectMe__() + colarray = [] + for a in cols: + colarray.append(int('{:08b}'.format(int(a[1]))[::-1], 2)) + colarray.append(int('{:08b}'.format(int(a[0]))[::-1], 2)) + colarray.append(int('{:08b}'.format(int(a[2]))[::-1], 2)) + + res = self.NRF.transaction([self.MISC_COMMANDS | self.WS2812B_CMD] + colarray, listen=False) + return res + + def read_register(self, reg): + self.__selectMe__() + x = self.NRF.transaction([self.NRF_COMMANDS | self.NRF_READ_REGISTER] + [reg]) + if x: + return x[0] + else: + return False diff --git a/PSL/commands_proto.py b/pslab/protocol.py similarity index 81% rename from PSL/commands_proto.py rename to pslab/protocol.py index 04687c76..de7f258f 100644 --- a/PSL/commands_proto.py +++ b/pslab/protocol.py @@ -1,3 +1,6 @@ +"""TODO""" + +import enum import struct @@ -9,13 +12,14 @@ ACKNOWLEDGE = Byte.pack(254) MAX_SAMPLES = 10000 DATA_SPLITTING = 200 +CLOCK_RATE = 64e6 # /*----flash memory----*/ -FLASH = Byte.pack(1) -READ_FLASH = Byte.pack(1) -WRITE_FLASH = Byte.pack(2) -WRITE_BULK_FLASH = Byte.pack(3) -READ_BULK_FLASH = Byte.pack(4) +# FLASH = Byte.pack(1) +# READ_FLASH = Byte.pack(1) +# WRITE_FLASH = Byte.pack(2) +# WRITE_BULK_FLASH = Byte.pack(3) +# READ_BULK_FLASH = Byte.pack(4) # /*-----ADC------*/ ADC = Byte.pack(2) @@ -29,10 +33,10 @@ SET_PGA_GAIN = Byte.pack(8) GET_VOLTAGE = Byte.pack(9) GET_VOLTAGE_SUMMED = Byte.pack(10) -START_ADC_STREAMING = Byte.pack(11) +# START_ADC_STREAMING = Byte.pack(11) SELECT_PGA_CHANNEL = Byte.pack(12) CAPTURE_12BIT = Byte.pack(13) -CAPTURE_MULTIPLE = Byte.pack(14) +# CAPTURE_MULTIPLE = Byte.pack(14) SET_HI_CAPTURE = Byte.pack(15) SET_LO_CAPTURE = Byte.pack(16) @@ -67,7 +71,6 @@ I2C_INIT = Byte.pack(14) I2C_PULLDOWN_SCL = Byte.pack(15) I2C_DISABLE_SMBUS = Byte.pack(16) -I2C_START_SCOPE = Byte.pack(17) # /*------UART2--------*/ UART_2 = Byte.pack(5) @@ -84,6 +87,7 @@ DAC = Byte.pack(6) SET_DAC = Byte.pack(1) SET_CALIBRATED_DAC = Byte.pack(2) +SET_POWER = Byte.pack(3) # /*--------WAVEGEN-----*/ WAVEGEN = Byte.pack(7) @@ -113,10 +117,10 @@ GET_STATE = Byte.pack(1) GET_STATES = Byte.pack(2) -ID1 = Byte.pack(0) -ID2 = Byte.pack(1) -ID3 = Byte.pack(2) -ID4 = Byte.pack(3) +LA1 = Byte.pack(0) +LA2 = Byte.pack(1) +LA3 = Byte.pack(2) +LA4 = Byte.pack(3) LMETER = Byte.pack(4) # /*------TIMING FUNCTIONS-----*/ @@ -149,6 +153,7 @@ GET_INDUCTANCE = Byte.pack(4) GET_VERSION = Byte.pack(5) +GET_FW_VERSION = Byte.pack(6) RETRIEVE_BUFFER = Byte.pack(8) GET_HIGH_FREQUENCY = Byte.pack(9) @@ -164,6 +169,7 @@ READ_LOG = Byte.pack(18) RESTORE_STANDALONE = Byte.pack(19) GET_ALTERNATE_HIGH_FREQUENCY = Byte.pack(20) +SET_RGB_COMMON = Byte.pack(21) SET_RGB3 = Byte.pack(22) START_CTMU = Byte.pack(23) @@ -174,16 +180,16 @@ FILL_BUFFER = Byte.pack(27) # /*---------- BAUDRATE for main comm channel----*/ -SETBAUD = Byte.pack(12) -BAUD9600 = Byte.pack(1) -BAUD14400 = Byte.pack(2) -BAUD19200 = Byte.pack(3) -BAUD28800 = Byte.pack(4) -BAUD38400 = Byte.pack(5) -BAUD57600 = Byte.pack(6) -BAUD115200 = Byte.pack(7) -BAUD230400 = Byte.pack(8) -BAUD1000000 = Byte.pack(9) +SETBAUD_LEGACY = Byte.pack(12) +BAUD9600_LEGACY = Byte.pack(1) +BAUD14400_LEGACY = Byte.pack(2) +BAUD19200_LEGACY = Byte.pack(3) +BAUD28800_LEGACY = Byte.pack(4) +BAUD38400_LEGACY = Byte.pack(5) +BAUD57600_LEGACY = Byte.pack(6) +BAUD115200_LEGACY = Byte.pack(7) +BAUD230400_LEGACY = Byte.pack(8) +BAUD1000000_LEGACY = Byte.pack(9) # /*-----------NRFL01 radio module----------*/ NRFL01 = Byte.pack(13) @@ -215,20 +221,21 @@ # ---------Non standard IO protocols-------- NONSTANDARD_IO = Byte.pack(14) -HX711_HEADER = Byte.pack(1) +# HX711_HEADER = Byte.pack(1) HCSR04_HEADER = Byte.pack(2) -AM2302_HEADER = Byte.pack(3) -TCD1304_HEADER = Byte.pack(4) -STEPPER_MOTOR = Byte.pack(5) +# AM2302_HEADER = Byte.pack(3) +# TCD1304_HEADER = Byte.pack(4) +# STEPPER_MOTOR = Byte.pack(5) # --------COMMUNICATION PASSTHROUGHS-------- # Data sent to the device is directly routed to output ports such as (SCL, SDA for UART) -PASSTHROUGHS = Byte.pack(15) +PASSTHROUGHS = Byte.pack(12) +PASSTHROUGHS_LEGACY = Byte.pack(15) PASS_UART = Byte.pack(1) # /*--------STOP STREAMING------*/ -STOP_STREAMING = Byte.pack(253) +# STOP_STREAMING = Byte.pack(253) # /*------INPUT CAPTURE---------*/ # capture modes @@ -251,38 +258,3 @@ # resolutions TEN_BIT = Byte.pack(10) TWELVE_BIT = Byte.pack(12) - - -''' -def reverse_bits(x): - return int('{:08b}'.format(x)[::-1], 2) - -def InttoString(val): - return ShortInt.pack(int(val)) - -def StringtoInt(string): - return ShortInt.unpack(string)[0] - -def StringtoLong(string): - return Integer.unpack(string)[0] - -def getval12(val): - return val*3.3/4095 - -def getval10(val): - return val*3.3/1023 - - -def getL(F,C): - return 1.0/(C*4*math.pi*math.pi*F*F) - -def getF(L,C): - return 1.0/(2*math.pi*math.sqrt(L*C)) - -def getLx(f1,f2,f3,Ccal): - a=(f1/f3)**2 - b=(f1/f2)**2 - c=(2*math.pi*f1)**2 - return (a-1)*(b-1)/(Ccal*c) - -''' diff --git a/pslab/sciencelab.py b/pslab/sciencelab.py new file mode 100644 index 00000000..1cbc81e8 --- /dev/null +++ b/pslab/sciencelab.py @@ -0,0 +1,322 @@ +"""Convenience module that creates instances of every instrument for you. + +Every PSLab instrument can be imported and instantiated individually. However, +if you need to use several at once the ScienceLab class provides a convenient +collection. +""" + +from __future__ import annotations + +import time +from typing import Iterable, List + +import pslab.protocol as CP +from pslab.connection import ConnectionHandler, SerialHandler, autoconnect +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.multimeter import Multimeter +from pslab.instrument.oscilloscope import Oscilloscope +from pslab.instrument.power_supply import PowerSupply +from pslab.instrument.waveform_generator import PWMGenerator, WaveformGenerator + + +class ScienceLab: + """Aggregate interface for the PSLab's instruments. + + Attributes + ---------- + logic_analyzer : pslab.LogicAnalyzer + oscilloscope : pslab.Oscilloscope + waveform_generator : pslab.WaveformGenerator + pwm_generator : pslab.PWMGenerator + multimeter : pslab.Multimeter + power_supply : pslab.PowerSupply + i2c : pslab.I2CMaster + nrf : pslab.peripherals.NRF24L01 + """ + + def __init__(self, device: ConnectionHandler | None = None): + self.device = device if device is not None else autoconnect() + self.firmware = self.device.get_firmware_version() + self.logic_analyzer = LogicAnalyzer(device=self.device) + self.oscilloscope = Oscilloscope(device=self.device) + self.waveform_generator = WaveformGenerator(device=self.device) + self.pwm_generator = PWMGenerator(device=self.device) + self.multimeter = Multimeter(device=self.device) + self.power_supply = PowerSupply(device=self.device) + + @property + def temperature(self): + """float: Temperature of the MCU in degrees Celsius.""" + # TODO: Get rid of magic numbers. + cs = 3 + V = self._get_ctmu_voltage(0b11110, cs, 0) + + if cs == 1: + return (646 - V * 1000) / 1.92 # current source = 1 + elif cs == 2: + return (701.5 - V * 1000) / 1.74 # current source = 2 + elif cs == 3: + return (760 - V * 1000) / 1.56 # current source = 3 + + def _get_ctmu_voltage(self, channel: int, current_range: int, tgen: bool = True): + """Control the Charge Time Measurement Unit (CTMU). + + ctmu_voltage(5, 2) will activate a constant current source of 5.5 µA on + CAP and then measure the voltage at the output. + + If a diode is used to connect CAP to ground, the forward voltage drop + of the diode will be returned, e.g. 0.6 V for a 4148 diode. + + If a resistor is connected, Ohm's law will be followed within + reasonable limits. + + Parameters + ---------- + channel : int + Pin number on which to generate a current and measure output + voltage. Refer to the PIC24EP64GP204 datasheet for channel + numbering. + current_range : {0, 1, 2, 3} + 0 -> 550 µA + 1 -> 550 nA + 2 -> 5.5 µA + 3 -> 55 µA + tgen : bool, optional + Use Time Delay mode instead of Measurement mode. The default value + is True. + + Returns + ------- + voltage : float + """ + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.GET_CTMU_VOLTAGE) + self.device.send_byte((channel) | (current_range << 5) | (tgen << 7)) + raw_voltage = self.get_int() / 16 # 16*voltage across the current source + self.device.get_ack() + vmax = 3.3 + resolution = 12 + voltage = vmax * raw_voltage / (2**resolution - 1) + return voltage + + def _start_ctmu(self, current_range: int, trim: int, tgen: int = 1): + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.START_CTMU) + self.device.send_byte((current_range) | (tgen << 7)) + self.device.send_byte(trim) + self.device.get_ack() + + def _stop_ctmu(self): + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.STOP_CTMU) + self.device.get_ack() + + def reset(self): + """Reset the device.""" + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.RESTORE_STANDALONE) + + def enter_bootloader(self): + """Reboot and stay in bootloader mode.""" + if not isinstance(self.device, SerialHandler): + msg = "cannot enter bootloader over wireless" + raise RuntimeError(msg) + + self.reset() + self.device.interface.baudrate = 460800 + # The PSLab's RGB LED flashes some colors on boot. + boot_lightshow_time = 0.6 + # Wait before sending magic number to make sure UART is initialized. + time.sleep(boot_lightshow_time / 2) + # PIC24 UART RX buffer is four bytes deep; no need to time it perfectly. + self.device.write(CP.Integer.pack(0xDECAFBAD)) + # Wait until lightshow is done to prevent accidentally overwriting magic number. + time.sleep(boot_lightshow_time) + + def rgb_led(self, colors: List, output: str = "RGB", order: str = "GRB"): + """Set shade of a WS2812B RGB LED. + + Parameters + ---------- + colors : list + List of three values between 0-255, where each value is the + intensity of red, green, and blue, respectively. When daisy + chaining several LEDs, colors should be a list of three-value + lists. + output : {"RGB", "PGC", "SQ1"}, optional + Pin on which to output the pulse train setting the LED color. The + default value, "RGB", sets the color of the built-in WS2812B + (PSLab v6 only). + order : str, optional + Color order of the connected LED as a three-letter string. The + built-in LED has order "GRB", which is the default. + + Examples + -------- + Set the built-in WS2812B to yellow. + + >>> import pslab + >>> psl = pslab.ScienceLab() + >>> psl.rgb_led([10, 10, 0]) + + Set a chain of three RGB WS2812B connected to SQ1 to red, cyan, and + magenta. + + >>> psl.rgb_led([[10,0,0],[0,10,10],[10,0,10]], output="SQ1", order="RGB") + """ + if "6" in self.device.version: + pins = {"ONBOARD": 0, "SQ1": 1, "SQ2": 2, "SQ3": 3, "SQ4": 4} + else: + pins = {"RGB": CP.SET_RGB1, "PGC": CP.SET_RGB2, "SQ1": CP.SET_RGB3} + + try: + pin = pins[output] + except KeyError: + pinnames = ", ".join(pins.keys()) + raise ValueError( + f"Invalid output: {output}. output must be one of {pinnames}." + ) + + if not isinstance(colors[0], Iterable): + colors = [colors] + + if not all([len(color) == 3 for color in colors]): + raise ValueError("Invalid color; each color list must have three values.") + + order = order.upper() + + if not sorted(order) == ["B", "G", "R"]: + raise ValueError( + f"Invalid order: {order}. order must contain 'R', 'G', and 'B'." + ) + + self.device.send_byte(CP.COMMON) + + if "6" in self.device.version: + self.device.send_byte(CP.SET_RGB_COMMON) + else: + self.device.send_byte(pin) + + self.device.send_byte(len(colors) * 3) + + for color in colors: + self.device.send_byte(color[order.index("R")]) + self.device.send_byte(color[order.index("G")]) + self.device.send_byte(color[order.index("B")]) + + if "6" in self.device.version: + self.device.send_byte(pin) + + self.device.get_ack() + + def _read_program_address(self, address: int): + """Return the value stored at the specified address in program memory. + + Parameters + ---------- + address : int + Address to read from. Refer to PIC24EP64GP204 programming manual. + + Returns + ------- + data : int + 16-bit wide value read from program memory. + """ + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.READ_PROGRAM_ADDRESS) + self.device.send_int(address & 0xFFFF) + self.device.send_int((address >> 16) & 0xFFFF) + data = self.device.get_int() + self.device.get_ack() + return data + + def _device_id(self): + a = self._read_program_address(0x800FF8) + b = self._read_program_address(0x800FFA) + c = self._read_program_address(0x800FFC) + d = self._read_program_address(0x800FFE) + val = d | (c << 16) | (b << 32) | (a << 48) + return val + + def _read_data_address(self, address: int): + """Return the value stored at the specified address in RAM. + + Parameters + ---------- + address : int + Address to read from. Refer to PIC24EP64GP204 programming manual. + + Returns + ------- + data : int + 16-bit wide value read from RAM. + """ + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.READ_DATA_ADDRESS) + self.device.send_int(address & 0xFFFF) + data = self.device.get_int() + self.device.get_ack() + return data + + def _write_data_address(self, address: int, value: int): + """Write a value to the specified address in RAM. + + Parameters + ---------- + address : int + Address to write to. Refer to PIC24EP64GP204 programming manual. + value : int + Value to write to RAM. + """ + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.WRITE_DATA_ADDRESS) + self.device.send_int(address & 0xFFFF) + self.device.send_int(value) + self.device.get_ack() + + def enable_uart_passthrough(self, baudrate: int): + """Relay all data received by the device to TXD/RXD. + + Can be used to load programs into secondary microcontrollers with + bootloaders such ATMEGA or ESP8266 + + Parameters + ---------- + baudrate : int + Baudrate of the UART2 bus. + """ + if self.firmware.major < 3: + self._uart_passthrough_legacy(baudrate) + else: + self._uart_passthrough(baudrate) + + def _uart_passthrough(self, baudrate: int) -> None: + self.device.send_byte(CP.PASSTHROUGHS) + self.device.send_byte(CP.PASS_UART) + self.device.send_int(self._get_brgval(baudrate)) + self.device.baudrate = baudrate + + def _uart_passthrough_legacy(self, baudrate: int) -> None: + self.device.send_byte(CP.PASSTHROUGHS_LEGACY) + self.device.send_byte(CP.PASS_UART) + disable_watchdog = 1 + self.device.send_byte(disable_watchdog) + self.device.send_int(self._get_brgval(baudrate)) + + @staticmethod + def _get_brgval(baudrate: int) -> int: + return int((CP.CLOCK_RATE / (4 * baudrate)) - 1) + + def read_log(self): + """Read hardware debug log. + + Returns + ------- + log : bytes + Bytes read from the hardware debug log. + """ + self.device.send_byte(CP.COMMON) + self.device.send_byte(CP.READ_LOG) + log = self.device.interface.readline().strip() + self.get_ack() + return log diff --git a/pslab/serial_handler.py b/pslab/serial_handler.py new file mode 100644 index 00000000..4b05c1d1 --- /dev/null +++ b/pslab/serial_handler.py @@ -0,0 +1,29 @@ +"""Deprecated provider of SerialHandler.""" + +import warnings + +from pslab.connection import SerialHandler, autoconnect + +warnings.warn( + "pslab.serial_handler is deprecated and will be removed in a future release. " + "Use pslab.connection instead." +) + + +class _SerialHandler(SerialHandler): + def __init__( + self, + port: str | None = None, + baudrate: int = 1000000, + timeout: float = 1.0, + ) -> None: + if port is None: + tmp_handler = autoconnect() + port = tmp_handler.port + tmp_handler.disconnect() + + super().__init__(port=port, baudrate=baudrate, timeout=timeout) + self.connect() + + +SerialHandler = _SerialHandler diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..c78ef11f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[build-system] +requires = ["flit_core >=3.4,<4"] +build-backend = "flit_core.buildapi" + +[project] +name = "pslab" +authors = [{name = "FOSSASIA PSLab Developers", email = "pslab-fossasia@googlegroups.com"}] +dynamic = ["version", "description"] +readme = "README.md" +requires-python = ">=3.8" +license = {file = "LICENSE"} +dependencies = [ + "pyserial", + "numpy", + "scipy", + "mcbootflash >= 8.0.0", +] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Operating System :: OS Independent", + "Development Status :: 5 - Production/Stable", +] + +[project.urls] +Home = "https://pslab.io/" + +[project.scripts] +pslab = "pslab.cli:cmdline" diff --git a/requirements.txt b/requirements.txt index 792eea4e..d7fb242b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ setuptools >= 35.0.2 numpy >= 1.16.3 -pyserial >= 3.4 \ No newline at end of file +pyserial >= 3.4 +scipy >= 1.3.0 +mcbootflash >= 4.1.0 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index e69de29b..00000000 diff --git a/setup.py b/setup.py deleted file mode 100644 index b3dd3d63..00000000 --- a/setup.py +++ /dev/null @@ -1,103 +0,0 @@ -from distutils.cmd import Command -from distutils.util import execute -import os -import platform -import shutil -from subprocess import call -import warnings - -from setuptools import setup, find_packages -from setuptools.command.develop import develop -from setuptools.command.install import install - - -def udev_reload_rules(): - call(["udevadm", "control", "--reload-rules"]) - - -def udev_trigger(): - call( # nosec - [ - "udevadm", - "trigger", - "--subsystem-match=usb", - "--attr-match=idVendor=04d8", - "--action=add", - ] - ) - - -def install_udev_rules(): - shutil.copy("99-pslab.rules", "/lib/udev/rules.d") - execute(udev_reload_rules, [], "Reloading udev rules") - execute(udev_trigger, [], "Triggering udev rules") - - -def check_root(): - return os.geteuid() == 0 - - -class CustomInstall(install): - def run(self): - install.run(self) - self.run_command("udev") - - -class CustomDevelop(develop): - def run(self): - develop.run(self) - try: - self.run_command("udev") - except OSError as e: - warnings.warn(e) - - -class InstallUdevRules(Command): - description = "install udev rules (requires root privileges)." - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - if platform.system() == "Linux": - if check_root(): - install_udev_rules() - else: - msg = "You must have root privileges to install udev rules." - raise OSError(msg) - - -setup( - name="PSL", - version="1.1.0", - description="Pocket Science Lab by FOSSASIA", - author="FOSSASIA PSLab Developers", - author_email="pslab-fossasia@googlegroups.com", - url="https://pslab.io/", - install_requires=["numpy>=1.16.3."], - packages=find_packages(exclude=("tests",)), - package_data={ - "": [ - "*.css", - "*.png", - "*.gif", - "*.html", - "*.css", - "*.js", - "*.png", - "*.jpg", - "*.jpeg", - "*.htm", - "99-pslab.rules", - ] - }, - cmdclass={ - "develop": CustomDevelop, - "install": CustomInstall, - "udev": InstallUdevRules, - }, -) diff --git a/tests/conftest.py b/tests/conftest.py index d359d812..db604d15 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,16 +1,13 @@ -import pytest - - -def pytest_addoption(parser): - parser.addoption("--integration", action="store_true", default=False) - parser.addoption("--record", action="store_true", default=False) +"""Common fixtures for pslab tests.""" +import pytest -@pytest.fixture -def integration(request): - return request.config.getoption("--integration") +from pslab.connection import SerialHandler @pytest.fixture -def record(request): - return request.config.getoption("--record") +def handler(): + """Return a SerialHandler instance.""" + sh = SerialHandler() + sh.connect() + return sh diff --git a/tests/recordings/logic_analyzer/test_capture_four_channels.json b/tests/recordings/logic_analyzer/test_capture_four_channels.json deleted file mode 100644 index 2be95dd2..00000000 --- a/tests/recordings/logic_analyzer/test_capture_four_channels.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [6], [196, 9], [17, 17], [0], [4], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [168, 0, 231, 1, 40, 3, 103, 4, 168, 5, 231, 6, 40, 8, 103, 9, 168, 10, 231, 11, 40, 13, 103, 14, 168, 15, 231, 16, 40, 18, 103, 19, 168, 20, 231, 21, 40, 23, 103, 24, 168, 25, 231, 26, 40, 28, 103, 29, 168, 30, 231, 31, 40, 33, 103, 34, 168, 35, 231, 36, 40, 38, 103, 39, 168, 40, 231, 41, 40, 43, 103, 44, 168, 45, 231, 46, 40, 48, 103, 49, 168, 50, 231, 51, 40, 53, 103, 54, 168, 55, 231, 56, 40, 58, 103, 59, 168, 60, 231, 61, 40, 63, 103, 64, 168, 65, 231, 66, 40, 68, 103, 69, 168, 70, 231, 71, 40, 73, 103, 74, 168, 75, 231, 76, 40, 78, 103, 79, 168, 80, 231, 81, 40, 83, 103, 84, 168, 85, 231, 86, 40, 88, 103, 89, 168, 90, 231, 91, 40, 93, 103, 94, 168, 95, 231, 96, 40, 98, 103, 99, 168, 100, 231, 101, 40, 103, 103, 104, 168, 105, 231, 106, 40, 108, 103, 109, 168, 110, 231, 111, 40, 113, 103, 114, 168, 115, 231, 116, 40, 118, 103, 119, 168, 120, 231, 121, 40, 123, 103, 124, 168, 125, 231, 126, 40, 128, 103, 129, 168, 130, 231, 131, 40, 133, 103, 134, 168, 135, 231, 136, 40, 138, 103, 139, 168, 140, 231, 141, 40, 143, 103, 144, 168, 145, 231, 146, 40, 148, 103, 149, 168, 150, 231, 151, 40, 153, 103, 154, 168, 155, 231, 156, 40, 158, 103, 159, 168, 160, 231, 161, 40, 163, 103, 164, 168, 165, 231, 166, 40, 168, 103, 169, 168, 170, 231, 171, 40, 173, 103, 174, 168, 175, 231, 176, 40, 178, 103, 179, 168, 180, 231, 181, 40, 183, 103, 184, 168, 185, 231, 186, 40, 188, 103, 189, 168, 190, 231, 191, 40, 193, 103, 194, 168, 195, 231, 196, 40, 198, 103, 199, 168, 200, 231, 201, 40, 203, 103, 204, 168, 205, 231, 206, 40, 208, 103, 209, 168, 210, 231, 211, 40, 213, 103, 214, 168, 215, 231, 216, 40, 218, 103, 219, 168, 220, 231, 221, 40, 223, 103, 224, 168, 225, 231, 226, 40, 228, 103, 229, 168, 230, 231, 231, 40, 233, 103, 234, 168, 235, 231, 236, 40, 238, 103, 239, 168, 240, 231, 241, 40, 243, 103, 244, 168, 245, 231, 246, 40, 248, 103, 249, 168, 250, 231, 251, 40, 253, 103, 254, 168, 255, 231, 0, 40, 2, 103, 3, 168, 4, 231, 5, 40, 7, 103, 8, 168, 9, 231, 10, 40, 12, 103, 13, 168, 14, 231, 15, 40, 17, 103, 18, 168, 19, 231, 20, 40, 22, 103, 23, 168, 24, 231, 25, 40, 27, 103, 28, 168, 29, 231, 30, 40, 32, 103, 33, 168, 34, 231, 35, 40, 37, 103, 38, 168, 39, 231, 40, 40, 42, 103, 43, 168, 44, 231, 45, 40, 47, 103, 48, 168, 49, 231, 50, 40, 52, 103, 53, 168, 54, 231, 55, 40, 57, 103, 58, 168, 59, 231, 60, 40, 62, 103, 63, 168, 64, 231, 65, 40, 67, 103, 68, 168, 69, 231, 70, 40, 72, 103, 73, 168, 74, 231, 75, 40, 77, 103, 78, 168, 79, 231, 80, 40, 82, 103, 83, 168, 84, 231, 85, 40, 87, 103, 88, 168, 89, 231, 90, 40, 92, 103, 93, 168, 94, 231, 95, 40, 97, 103, 98, 168, 99, 231, 100, 40, 102, 103, 103, 168, 104, 231, 105, 40, 107, 103, 108, 168, 109, 231, 110, 40, 112, 103, 113, 168, 114, 231, 115, 40, 117, 103, 118, 168, 119, 231, 120, 40, 122, 103, 123, 168, 124, 231, 125, 40, 127, 103, 128, 168, 129, 231, 130, 40, 132, 103, 133, 168, 134, 231, 135, 40, 137, 103, 138, 168, 139, 231, 140, 40, 142, 103, 143, 168, 144, 231, 145, 40, 147, 103, 148, 168, 149, 231, 150, 40, 152, 103, 153, 168, 154, 231, 155, 40, 157, 103, 158, 168, 159, 231, 160, 40, 162, 103, 163, 168, 164, 231, 165, 40, 167, 103, 168, 168, 169, 231, 170, 40, 172, 103, 173, 168, 174, 231, 175, 40, 177, 103, 178, 168, 179, 231, 180, 40, 182, 103, 183, 168, 184, 231, 185, 40, 187, 103, 188, 168, 189, 231, 190, 40, 192, 103, 193, 168, 194, 231, 195, 40, 197, 103, 198, 168, 199, 231, 200, 40, 202, 103, 203, 168, 204, 231, 205, 40, 207, 103, 208, 168, 209, 231, 210, 40, 212, 103, 213, 168, 214, 231, 215, 40, 217, 103, 218, 168, 219, 231, 220, 40, 222, 103, 223, 168, 224, 231, 225, 40, 227, 103, 228, 168, 229, 231, 230, 40, 232, 103, 233, 168, 234, 231, 235, 40, 237, 103, 238, 168, 239, 231, 240, 40, 242, 103, 243, 168, 244, 231, 245, 40, 247, 103, 248, 168, 249, 231, 250, 40, 252, 103, 253, 168, 254, 231, 255, 40, 1, 103, 2, 168, 3, 231, 4, 40, 6, 103, 7, 168, 8, 231, 9, 40, 11, 103, 12, 168, 13, 231, 14, 40, 16, 103, 17, 168, 18, 231, 19, 40, 21, 103, 22, 168, 23, 231, 24, 40, 26, 103, 27, 168, 28, 231, 29, 40, 31, 103, 32, 168, 33, 231, 34, 40, 36, 103, 37, 168, 38, 231, 39, 40, 41, 103, 42, 168, 43, 231, 44, 40, 46, 103, 47, 168, 48, 231, 49, 40, 51, 103, 52, 168, 53, 231, 54, 40, 56, 103, 57, 168, 58, 231, 59, 40, 61, 103, 62, 168, 63, 231, 64, 40, 66, 103, 67, 168, 68, 231, 69, 40, 71, 103, 72, 168, 73, 231, 74, 40, 76, 103, 77, 168, 78, 231, 79, 40, 81, 103, 82, 168, 83, 231, 84, 40, 86, 103, 87, 168, 88, 231, 89, 40, 91, 103, 92, 168, 93, 231, 94, 40, 96, 103, 97, 168, 98, 231, 99, 40, 101, 103, 102, 168, 103, 231, 104, 40, 106, 103, 107, 168, 108, 231, 109, 40, 111, 103, 112, 168, 113, 231, 114, 40, 116, 103, 117, 168, 118, 231, 119, 40, 121, 103, 122, 168, 123, 231, 124, 40, 126, 103, 127, 168, 128, 231, 129, 40, 131, 103, 132, 168, 133, 231, 134, 40, 136, 103, 137, 168, 138, 231, 139, 40, 141, 103, 142, 168, 143, 231, 144, 40, 146, 103, 147, 168, 148, 231, 149, 40, 151, 103, 152, 168, 153, 231, 154, 40, 156, 103, 157, 168, 158, 231, 159, 40, 161, 103, 162, 168, 163, 231, 164, 40, 166, 103, 167, 168, 168, 231, 169, 40, 171, 103, 172, 168, 173, 231, 174, 40, 176, 103, 177, 168, 178, 231, 179, 40, 181, 103, 182, 168, 183, 231, 184, 40, 186, 103, 187, 168, 188, 231, 189, 40, 191, 103, 192, 168, 193, 231, 194, 40, 196, 103, 197, 168, 198, 231, 199, 40, 201, 103, 202, 168, 203, 231, 204, 40, 206, 103, 207, 168, 208, 231, 209, 40, 211, 103, 212, 168, 213, 231, 214, 40, 216, 103, 217, 168, 218, 231, 219, 40, 221, 103, 222, 168, 223, 231, 224, 40, 226, 103, 227, 168, 228, 231, 229, 40, 231, 103, 232, 168, 233, 231, 234, 40, 236, 103, 237, 168, 238, 231, 239, 40, 241, 103, 242, 168, 243, 231, 244, 40, 246, 103, 247, 168, 248, 231, 249, 40, 251, 103, 252, 168, 253, 231, 254, 40, 0, 103, 1, 168, 2, 231, 3, 40, 5, 103, 6, 168, 7, 231, 8, 40, 10, 103, 11, 168, 12, 231, 13, 40, 15, 103, 16, 168, 17, 231, 18, 40, 20, 103, 21, 168, 22, 231, 23, 40, 25, 103, 26, 168, 27, 231, 28, 40, 30, 103, 31, 168, 32, 231, 33, 40, 35, 103, 36, 168, 37, 231, 38, 40, 40, 103, 41, 168, 42, 231, 43, 40, 45, 103, 46, 168, 47, 231, 48, 40, 50, 103, 51, 168, 52, 231, 53, 40, 55, 103, 56, 168, 57, 231, 58, 40, 60, 103, 61, 168, 62, 231, 63, 40, 65, 103, 66, 168, 67, 231, 68, 40, 70, 103, 71, 168, 72, 231, 73, 40, 75, 103, 76, 168, 77, 231, 78, 40, 80, 103, 81, 168, 82, 231, 83, 40, 85, 103, 86, 168, 87, 231, 88, 40, 90, 103, 91, 168, 92, 231, 93, 40, 95, 103, 96, 168, 97, 231, 98, 40, 100, 103, 101, 168, 102, 231, 103, 40, 105, 103, 106, 168, 107, 231, 108, 40, 110, 103, 111, 168, 112, 231, 113, 40, 115, 103, 116, 168, 117, 231, 118, 40, 120, 103, 121, 168, 122, 231, 123, 40, 125, 103, 126, 168, 127, 231, 128, 40, 130, 103, 131, 168, 132, 231, 133, 40, 135, 103, 136, 168, 137, 231, 138, 40, 140, 103, 141, 168, 142, 231, 143, 40, 145, 103, 146, 168, 147, 231, 148, 40, 150, 103, 151, 168, 152, 231, 153, 40, 155, 103, 156, 168, 157, 231, 158, 40, 160, 103, 161, 168, 162, 231, 163, 40, 165, 103, 166, 168, 167, 231, 168, 40, 170, 103, 171, 168, 172, 231, 173, 40, 175, 103, 176, 168, 177, 231, 178, 40, 180, 103, 181, 168, 182, 231, 183, 40, 185, 103, 186, 168, 187, 231, 188, 40, 190, 103, 191, 168, 192, 231, 193, 40, 195, 103, 196, 168, 197, 231, 198, 40, 200, 103, 201, 168, 202, 231, 203, 40, 205, 103, 206, 168, 207, 231, 208, 40, 210, 103, 211, 168, 212, 231, 213, 40, 215, 103, 216, 168, 217, 231, 218, 40, 220, 103, 221, 168, 222, 231, 223, 40, 225, 103, 226, 168, 227, 231, 228, 40, 230, 103, 231, 168, 232, 231, 233, 40, 235, 103, 236, 168, 237, 231, 238, 40, 240, 103, 241, 168, 242, 231, 243, 40, 245, 103, 246, 168, 247, 231, 248, 40, 250, 103, 251, 168, 252, 231, 253, 40, 255, 103, 0, 168, 1, 231, 2, 40, 4, 103, 5, 168, 6, 231, 7, 40, 9, 103, 10, 168, 11, 231, 12, 40, 14, 103, 15, 168, 16, 231, 17, 40, 19, 103, 20, 168, 21, 231, 22, 40, 24, 103, 25, 168, 26, 231, 27, 40, 29, 103, 30, 168, 31, 231, 32, 40, 34, 103, 35, 168, 36, 231, 37, 40, 39, 103, 40, 168, 41, 231, 42, 40, 44, 103, 45, 168, 46, 231, 47, 40, 49, 103, 50, 168, 51, 231, 52, 40, 54, 103, 55, 168, 56, 231, 57, 40, 59, 103, 60, 168, 61, 231, 62, 40, 64, 103, 65, 168, 66, 231, 67, 40, 69, 103, 70, 168, 71, 231, 72, 40, 74, 103, 75, 168, 76, 231, 77, 40, 79, 103, 80, 168, 81, 231, 82, 40, 84, 103, 85, 168, 86, 231, 87, 40, 89, 103, 90, 168, 91, 231, 92, 40, 94, 103, 95, 168, 96, 231, 97, 40, 99, 103, 100, 168, 101, 231, 102, 40, 104, 103, 105, 168, 106, 231, 107, 40, 109, 103, 110, 168, 111, 231, 112, 40, 114, 103, 115, 168, 116, 231, 117, 40, 119, 103, 120, 168, 121, 231, 122, 40, 124, 103, 125, 168, 126, 231, 127, 40, 129, 103, 130, 168, 131, 231, 132, 40, 134, 103, 135, 168, 136, 231, 137, 40, 139, 103, 140, 168, 141, 231, 142, 40, 144, 103, 145, 168, 146, 231, 147, 40, 149, 103, 150, 168, 151, 231, 152, 40, 154, 103, 155, 168, 156, 231, 157, 40, 159, 103, 160, 168, 161, 231, 162, 40, 164, 103, 165, 168, 166, 231, 167, 40, 169, 103, 170, 168, 171, 231, 172, 40, 174, 103, 175, 168, 176, 231, 177, 40, 179, 103, 180, 168, 181, 231, 182, 40, 184, 103, 185, 168, 186, 231, 187, 40, 189, 103, 190, 168, 191, 231, 192, 40, 194, 103, 195, 168, 196, 231, 197, 40, 199, 103, 200, 168, 201, 231, 202, 40, 204, 103, 205, 168, 206, 231, 207, 40, 209, 103, 210, 168, 211, 231, 212, 40, 214, 103, 215, 168, 216, 231, 217, 40, 219, 103, 220, 168, 221, 231, 222, 40, 224, 103, 225, 168, 226, 231, 227, 40, 229, 103, 230, 168, 231, 231, 232, 40, 234, 103, 235, 168, 236, 231, 237, 40, 239, 103, 240, 168, 241, 231, 242, 40, 244, 103, 245, 168, 246, 231, 247, 40, 249, 103, 250, 168, 251, 231, 252, 40, 254, 103, 255, 168, 0, 231, 1, 40, 3, 103, 4, 168, 5, 231, 6, 40, 8, 103, 9, 168, 10, 231, 11, 40, 13, 103, 14, 168, 15, 231, 16, 40, 18, 103, 19, 168, 20, 231, 21, 40, 23, 103, 24, 168, 25, 231, 26, 40, 28, 103, 29, 168, 30, 231, 31, 40, 33, 103, 34, 168, 35, 231, 36, 40, 38, 103, 39, 168, 40, 231, 41, 40, 43, 103, 44, 168, 45, 231, 46, 40, 48, 103, 49, 168, 50, 231, 51, 40, 53, 103, 54, 168, 55, 231, 56, 40, 58, 103, 59, 168, 60, 231, 61, 40, 63, 103, 64, 168, 65, 231, 66, 40, 68, 103, 69, 168, 70, 231, 71, 40, 73, 103, 74, 168, 75, 231, 76, 40, 78, 103, 79, 168, 80, 231, 81, 40, 83, 103, 84, 168, 85, 231, 86, 40, 88, 103, 89, 168, 90, 231, 91, 40, 93, 103, 94, 168, 95, 231, 96, 40, 98, 103, 99, 168, 100, 231, 101, 40, 103, 103, 104, 168, 105, 231, 106, 40, 108, 103, 109, 168, 110, 231, 111, 40, 113, 103, 114, 168, 115, 231, 116, 40, 118, 103, 119, 168, 120, 231, 121, 40, 123, 103, 124, 168, 125, 231, 126, 40, 128, 103, 129, 168, 130, 231, 131, 40, 133, 103, 134, 168, 135, 231, 136, 40, 138, 103, 139, 168, 140, 231, 141, 40, 143, 103, 144, 168, 145, 231, 146, 40, 148, 103, 149, 168, 150, 231, 151, 40, 153, 103, 154, 168, 155, 231, 156, 40, 158, 103, 159, 168, 160, 231, 161, 40, 163, 103, 164, 168, 165, 231, 166, 40, 168, 103, 169, 168, 170, 231, 171, 40, 173, 103, 174, 168, 175, 231, 176, 40, 178, 103, 179, 168, 180, 231, 181, 40, 183, 103, 184, 168, 185, 231, 186, 40, 188, 103, 189, 168, 190, 231, 191, 40, 193, 103, 194, 168, 195, 231, 196, 40, 198, 103, 199, 168, 200, 231, 201, 40, 203, 103, 204, 168, 205, 231, 206, 40, 208, 103, 209, 168, 210, 231, 211, 40, 213, 103, 214, 168, 215, 231, 216, 40, 218, 103, 219, 168, 220, 231, 221, 40, 223, 103, 224, 168, 225, 231, 226, 40, 228, 103, 229, 168, 230, 231, 231, 40, 233, 103, 234, 168, 235, 231, 236, 40, 238, 103, 239, 168, 240, 231, 241, 40, 243, 103, 244, 168, 245, 231, 246, 40, 248, 103, 249, 168, 250, 231, 251, 40, 253, 103, 254, 168, 255, 231, 0, 40, 2, 103, 3, 168, 4, 231, 5, 40, 7, 103, 8, 168, 9, 231, 10, 40, 12, 103, 13, 168, 14, 231, 15, 40, 17, 103, 18, 168, 19, 231, 20, 40, 22, 103, 23, 168, 24, 231, 25, 40, 27, 103, 28, 168, 29, 231, 30, 40, 32, 103, 33, 168, 34, 231, 35, 40, 37, 103, 38, 168, 39, 231, 40, 40, 42, 103, 43, 168, 44, 231, 45, 40, 47, 103, 48, 168, 49, 231, 50, 40, 52, 103, 53, 168, 54, 231, 55, 40, 57, 103, 58, 168, 59, 231, 60, 40, 62, 103, 63, 168, 64, 231, 65, 40, 67, 103, 68, 168, 69, 231, 70, 40, 72, 103, 73, 168, 74, 231, 75, 40, 77, 103, 78, 168, 79, 231, 80, 40, 82, 103, 83, 168, 84, 231, 85, 40, 87, 103, 88, 168, 89, 231, 90, 40, 92, 103, 93, 168, 94, 231, 95, 40, 97, 103, 98, 168, 99, 231, 100, 40, 102, 103, 103, 168, 104, 231, 105, 40, 107, 103, 108, 168, 109, 231, 110, 40, 112, 103, 113, 168, 114, 231, 115, 40, 117, 103, 118, 168, 119, 231, 120, 40, 122, 103, 123, 168, 124, 231, 125, 40, 127, 103, 128, 168, 129, 231, 130, 40, 132, 103, 133, 168, 134, 231, 135, 40, 137, 103, 138, 168, 139, 231, 140, 40, 142, 103, 143, 168, 144, 231, 145, 40, 147, 103, 148, 168, 149, 231, 150, 40, 152, 103, 153, 168, 154, 231, 155, 40, 157, 103, 158, 168, 159, 231, 160, 40, 162, 103, 163, 168, 164, 231, 165, 40, 167, 103, 168, 168, 169, 231, 170, 40, 172, 103, 173, 168, 174, 231, 175, 40, 177, 103, 178, 168, 179, 231, 180, 40, 182, 103, 183, 168, 184, 231, 185, 40, 187, 103, 188, 168, 189, 231, 190, 40, 192, 103, 193, 168, 194, 231, 195, 40, 197, 103, 198, 168, 199, 231, 200, 40, 202, 103, 203, 168, 204, 231, 205, 40, 207, 103, 208, 168, 209, 231, 210, 40, 212, 103, 213, 168, 214, 231, 215, 40, 217, 103, 218, 168, 219, 231, 220, 40, 222, 103, 223, 168, 224, 231, 225, 40, 227, 103, 228, 168, 229, 231, 230, 40, 232, 103, 233, 168, 234, 231, 235, 40, 237, 103, 238, 168, 239, 231, 240, 40, 242, 103, 243, 168, 244, 231, 245, 40, 247, 103, 248, 168, 249, 231, 250, 40, 252, 103, 253, 168, 254, 231, 255, 40, 1, 103, 2, 168, 3, 231, 4, 40, 6, 103, 7, 168, 8, 231, 9, 40, 11, 103, 12, 168, 13, 231, 14, 40, 16, 103, 17, 168, 18, 231, 19, 40, 21, 103, 22, 168, 23, 231, 24, 40, 26, 103, 27, 168, 28, 231, 29, 40, 31, 103, 32, 168, 33, 231, 34, 40, 36, 103, 37, 168, 38, 231, 39, 40, 41, 103, 42, 168, 43, 231, 44, 40, 46, 103, 47, 168, 48, 231, 49, 40, 51, 103, 52, 168, 53, 231, 54, 40, 56, 103, 57, 168, 58, 231, 59, 40, 61, 103, 62, 168, 63, 231, 64, 40, 66, 103, 67, 168, 68, 231, 69, 40, 71, 103, 72, 168, 73, 231, 74, 40, 76, 103, 77, 168, 78, 231, 79, 40, 81, 103, 82, 168, 83, 231, 84, 40, 86, 103, 87, 168, 88, 231, 89, 40, 91, 103, 92, 168, 93, 231, 94, 40, 96, 103, 97, 168, 98, 231, 99, 40, 101, 103, 102, 168, 103, 231, 104, 40, 106, 103, 107, 168, 108, 231, 109, 40, 111, 103, 112, 168, 113, 231, 114, 40, 116, 103, 117, 168, 118, 231, 119, 40, 121, 103, 122, 168, 123, 231, 124, 40, 126, 103, 127, 168, 128, 231, 129, 40, 131, 103, 132, 168, 133, 231, 134, 40, 136, 103, 137, 168, 138, 231, 139, 40, 141, 103, 142, 168, 143, 231, 144, 40, 146, 103, 147, 168, 148, 231, 149, 40, 151, 103, 152, 168, 153, 231, 154, 40, 156, 103, 157, 168, 158, 231, 159, 40, 161, 103, 162, 168, 163, 231, 164, 40, 166, 103, 167, 168, 168, 231, 169, 40, 171, 103, 172, 168, 173, 231, 174, 40, 176, 103, 177, 168, 178, 231, 179, 40, 181, 103, 182, 168, 183, 231, 184, 40, 186, 103, 187, 168, 188, 231, 189, 40, 191, 103, 192, 168, 193, 231, 194, 40, 196, 103, 197, 168, 198, 231, 199, 40, 201, 103, 202, 168, 203, 231, 204, 40, 206, 103, 207, 168, 208, 231, 209, 40, 211, 103, 212, 168, 213, 231, 214, 40, 216, 103, 217, 168, 218, 231, 219, 40, 221, 103, 222, 168, 223, 231, 224, 40, 226, 103, 227, 168, 228, 231, 229, 40, 231, 103, 232, 168, 233, 231, 234, 40, 236, 103, 237, 168, 238, 231, 239, 40, 241, 103, 242, 168, 243, 231, 244, 40, 246, 103, 247, 168, 248, 231, 249, 40, 251, 103, 252, 168, 253, 231, 254, 40, 0, 103, 1, 168, 2, 231, 3, 40, 5, 103, 6, 168, 7, 231, 8, 40, 10, 103, 11, 168, 12, 231, 13, 40, 15, 103, 16, 168, 17, 231, 18, 40, 20, 103, 21, 168, 22, 231, 23, 40, 25, 103, 26, 168, 27, 231, 28, 40, 30, 103, 31, 168, 32, 231, 33, 40, 35, 103, 36, 168, 37, 231, 38, 40, 40, 103, 41, 168, 42, 231, 43, 40, 45, 103, 46, 168, 47, 231, 48, 40, 50, 103, 51, 168, 52, 231, 53, 40, 55, 103, 56, 168, 57, 231, 58, 40, 60, 103, 61, 168, 62, 231, 63, 40, 65, 103, 66, 168, 67, 231, 68, 40, 70, 103, 71, 168, 72, 231, 73, 40, 75, 103, 76, 168, 77, 231, 78, 40, 80, 103, 81, 168, 82, 231, 83, 40, 85, 103, 86, 168, 87, 231, 88, 40, 90, 103, 91, 168, 92, 231, 93, 40, 95, 103, 96, 168, 97, 231, 98, 40, 100, 103, 101, 168, 102, 231, 103, 40, 105, 103, 106, 168, 107, 231, 108, 40, 110, 103, 111, 168, 112, 231, 113, 40, 115, 103, 116, 168, 117, 231, 118, 40, 120, 103, 121, 168, 122, 231, 123, 40, 125, 103, 126, 168, 127, 231, 128, 40, 130, 103, 131, 168, 132, 231, 133, 40, 135, 103, 136, 168, 137, 231, 138, 40, 140, 103, 141, 168, 142, 231, 143, 40, 145, 103, 146, 168, 147, 231, 148, 40, 150, 103, 151, 168, 152, 231, 153, 40, 155, 103, 156, 168, 157, 231, 158, 40, 160, 103, 161, 168, 162, 231, 163, 40, 165, 103, 166, 168, 167, 231, 168, 40, 170, 103, 171, 168, 172, 231, 173, 40, 175, 103, 176, 168, 177, 231, 178, 40, 180, 103, 181, 168, 182, 231, 183, 40, 185, 103, 186, 168, 187, 231, 188, 40, 190, 103, 191, 168, 192, 231, 193, 40, 195, 103, 196, 168, 197, 231, 198, 40, 200, 103, 201, 168, 202, 231, 203, 40, 205, 103, 206, 168, 207, 231, 208, 40, 210, 103, 211, 168, 212, 231, 213, 40, 215, 103, 216, 168, 217, 231, 218, 40, 220, 103, 221, 168, 222, 231, 223, 40, 225, 103, 226, 168, 227, 231, 228, 40, 230, 103, 231, 168, 232, 231, 233, 40, 235, 103, 236, 168, 237, 231, 238, 40, 240, 103, 241, 168, 242, 231, 243, 40, 245, 103, 246, 168, 247, 231, 248, 40, 250, 103, 251, 168, 252, 231, 253, 40, 255, 103, 0, 168, 1, 231, 2, 40, 4, 103, 5, 168, 6, 231, 7, 40, 9, 103, 10, 168, 11, 231, 12, 40, 14, 103, 15, 168, 16, 231, 17, 40, 19, 103, 20, 168, 21, 231, 22, 40, 24, 103, 25, 168, 26, 231, 27, 40, 29, 103, 30, 168, 31, 231, 32, 40, 34, 103, 35, 168, 36, 231, 37, 40, 39, 103, 40, 168, 41, 231, 42, 40, 44, 103, 45, 168, 46, 231, 47, 40, 49, 103, 50, 168, 51, 231, 52, 40, 54, 103, 55, 168, 56, 231, 57, 40, 59, 103, 60, 168, 61, 231, 62, 40, 64, 103, 65, 168, 66, 231, 67, 40, 69, 103, 70, 168, 71, 231, 72, 40, 74, 103, 75, 168, 76, 231, 77, 40, 79, 103, 80, 168, 81, 231, 82, 40, 84, 103, 85, 168, 86, 231, 87, 40, 89, 103, 90, 168, 91, 231, 92, 40, 94, 103, 95, 168, 96, 231, 97, 40, 99, 103, 100, 168, 101, 231, 102, 40, 104, 103, 105, 168, 106, 231, 107, 40, 109, 103, 110, 168, 111, 231, 112, 40, 114, 103, 115, 168, 116, 231, 117, 40, 119, 103, 120, 168, 121, 231, 122, 40, 124, 103, 125, 168, 126, 231, 127, 40, 129, 103, 130, 168, 131, 231, 132, 40, 134, 103, 135, 168, 136, 231, 137, 40, 139, 103, 140, 168, 141, 231, 142, 40, 144, 103, 145, 168, 146, 231, 147, 40, 149, 103, 150, 168, 151, 231, 152, 40, 154, 103, 155, 168, 156, 231, 157, 40, 159, 103, 160, 168, 161, 231, 162, 40, 164, 103, 165, 168, 166, 231, 167, 40, 169, 103, 170, 168, 171, 231, 172, 40, 174, 103, 175, 168, 176, 231, 177, 40, 179, 103, 180, 168, 181, 231, 182, 40, 184, 103, 185, 168, 186, 231, 187, 40, 189, 103, 190, 168, 191, 231, 192, 40, 194, 103, 195, 168, 196, 231, 197, 40, 199, 103, 200, 168, 201, 231, 202, 40, 204, 103, 205, 168, 206, 231, 207, 40, 209, 103, 210, 168, 211, 231, 212, 40, 214, 103, 215, 168, 216, 231, 217, 40, 219, 103, 220, 168, 221, 231, 222, 40, 224, 103, 225, 168, 226, 231, 227, 40, 229, 103, 230, 168, 231, 231, 232, 40, 234, 103, 235, 168, 236, 231, 237, 40, 239, 103, 240, 168, 241, 231, 242, 40, 244, 103, 245, 168, 246, 231, 247, 40, 249, 103, 250, 168, 251, 231, 252, 40, 254, 103, 255, 168, 0, 231, 1, 40, 3, 103, 4, 168, 5, 231, 6, 40, 8, 103, 9, 168, 10, 231, 11, 40, 13, 103, 14, 168, 15, 231, 16, 40, 18, 103, 19, 168, 20, 231, 21, 40, 23, 103, 24, 168, 25, 231, 26, 40, 28, 103, 29, 168, 30, 231, 31, 40, 33, 103, 34, 168, 35, 231, 36, 40, 38, 103, 39, 168, 40, 231, 41, 40, 43, 103, 44, 168, 45, 231, 46, 40, 48, 103, 49, 168, 50, 231, 51, 40, 53, 103, 54, 168, 55, 231, 56, 40, 58, 103, 59, 168, 60, 231, 61, 40, 63, 103, 64, 168, 65, 231, 66, 40, 68, 103, 69, 168, 70, 231, 71, 40, 73, 103, 74, 168, 75, 231, 76, 40, 78, 103, 79, 168, 80, 231, 81, 40, 83, 103, 84, 168, 85, 231, 86, 40, 88, 103, 89, 168, 90, 231, 91, 40, 93, 103, 94, 168, 95, 231, 96, 40, 98, 103, 99, 168, 100, 231, 101, 40, 103, 103, 104, 168, 105, 231, 106, 40, 108, 103, 109, 168, 110, 231, 111, 40, 113, 103, 114, 168, 115, 231, 116, 40, 118, 103, 119, 168, 120, 231, 121, 40, 123, 103, 124, 168, 125, 231, 126, 40, 128, 103, 129, 168, 130, 231, 131, 40, 133, 103, 134, 168, 135, 231, 136, 40, 138, 103, 139, 168, 140, 231, 141, 40, 143, 103, 144, 168, 145, 231, 146, 40, 148, 103, 149, 168, 150, 231, 151, 40, 153, 103, 154, 168, 155, 231, 156, 40, 158, 103, 159, 168, 160, 231, 161, 40, 163, 103, 164, 168, 165, 231, 166, 40, 168, 103, 169, 168, 170, 231, 171, 40, 173, 103, 174, 168, 175, 231, 176, 40, 178, 103, 179, 168, 180, 231, 181, 40, 183, 103, 184, 168, 185, 231, 186, 40, 188, 103, 189, 168, 190, 231, 191, 40, 193, 103, 194, 168, 195, 231, 196, 40, 198, 103, 199, 168, 200, 231, 201, 40, 203, 103, 204, 168, 205, 231, 206, 40, 208, 103, 209, 168, 210, 231, 211, 40, 213, 103, 214, 168, 215, 231, 216, 40, 218, 103, 219, 168, 220, 231, 221, 40, 223, 103, 224, 168, 225, 231, 226, 40, 228, 103, 229, 168, 230, 231, 231, 40, 233, 103, 234, 168, 235, 231, 236, 40, 238, 103, 239, 168, 240, 231, 241, 40, 243, 103, 244, 168, 245, 231, 246, 40, 248, 103, 249, 168, 250, 231, 251, 40, 253, 103, 254, 168, 255, 231, 0, 40, 2, 103, 3, 168, 4, 231, 5, 40, 7, 103, 8, 168, 9, 231, 10, 40, 12, 103, 13, 168, 14, 231, 15, 40, 17, 103, 18, 168, 19, 231, 20, 40, 22, 103, 23, 168, 24, 231, 25, 40, 27, 103, 28, 168, 29, 231, 30, 40, 32, 103, 33, 168, 34, 231, 35, 40, 37, 103, 38, 168, 39, 231, 40, 40, 42, 103, 43, 168, 44, 231, 45, 40, 47, 103, 48, 168, 49, 231, 50, 40, 52, 103, 53, 168, 54, 231, 55, 40, 57, 103, 58, 168, 59, 231, 60, 40, 62, 103, 63, 168, 64, 231, 65, 40, 67, 103, 68, 168, 69, 231, 70, 40, 72, 103, 73, 168, 74, 231, 75, 40, 77, 103, 78, 168, 79, 231, 80, 40, 82, 103, 83, 168, 84, 231, 85, 40, 87, 103, 88, 168, 89, 231, 90, 40, 92, 103, 93, 168, 94, 231, 95, 40, 97, 103, 98, 168, 99, 231, 100, 40, 102, 103, 103, 168, 104, 231, 105, 40, 107, 103, 108, 168, 109, 231, 110, 40, 112, 103, 113, 168, 114, 231, 115, 40, 117, 103, 118, 168, 119, 231, 120, 40, 122, 103, 123, 168, 124, 231, 125, 40, 127, 103, 128, 168, 129, 231, 130, 40, 132, 103, 133, 168, 134, 231, 135, 40, 137, 103, 138, 168, 139, 231, 140, 40, 142, 103, 143, 168, 144, 231, 145, 40, 147, 103, 148, 168, 149, 231, 150, 40, 152, 103, 153, 168, 154, 231, 155, 40, 157, 103, 158, 168, 159, 231, 160, 40, 162, 103, 163, 168, 164, 231, 165, 40, 167, 103, 168, 168, 169, 231, 170, 40, 172, 103, 173, 168, 174, 231, 175, 40, 177, 103, 178, 168, 179, 231, 180, 40, 182, 103, 183, 168, 184, 231, 185, 40, 187, 103, 188, 168, 189, 231, 190, 40, 192, 103, 193, 168, 194, 231, 195, 40, 197, 103, 198, 168, 199, 231, 200, 40, 202, 103, 203, 168, 204, 231, 205, 40, 207, 103, 208, 168, 209, 231, 210, 40, 212, 103, 213, 168, 214, 231, 215, 40, 217, 103, 218, 168, 219, 231, 220, 40, 222, 103, 223, 168, 224, 231, 225, 40, 227, 103, 228, 168, 229, 231, 230, 40, 232, 103, 233, 168, 234, 231, 235, 40, 237, 103, 238, 168, 239, 231, 240, 40, 242, 103, 243, 168, 244, 231, 245, 40, 247, 103, 248, 168, 249, 231, 250, 40, 252, 103, 253, 168, 254, 231, 255, 40, 1, 103, 2, 168, 3, 231, 4, 40, 6, 103, 7, 168, 8, 231, 9, 40, 11, 103, 12, 168, 13, 231, 14, 40, 16, 103, 17, 168, 18, 231, 19, 40, 21, 103, 22, 168, 23, 231, 24, 40, 26, 103, 27, 168, 28, 231, 29, 40, 31, 103, 32, 168, 33, 231, 34, 40, 36, 103, 37, 168, 38, 231, 39, 40, 41, 103, 42, 168, 43, 231, 44, 40, 46, 103, 47, 168, 48, 231, 49, 40, 51, 103, 52, 1], [], [], [], [166, 0, 229, 1, 38, 3, 101, 4, 166, 5, 229, 6, 38, 8, 101, 9, 166, 10, 229, 11, 38, 13, 101, 14, 166, 15, 229, 16, 38, 18, 101, 19, 166, 20, 229, 21, 38, 23, 101, 24, 166, 25, 229, 26, 38, 28, 101, 29, 166, 30, 229, 31, 38, 33, 101, 34, 166, 35, 229, 36, 38, 38, 101, 39, 166, 40, 229, 41, 38, 43, 101, 44, 166, 45, 229, 46, 38, 48, 101, 49, 166, 50, 229, 51, 38, 53, 101, 54, 166, 55, 229, 56, 38, 58, 101, 59, 166, 60, 229, 61, 38, 63, 101, 64, 166, 65, 229, 66, 38, 68, 101, 69, 166, 70, 229, 71, 38, 73, 101, 74, 166, 75, 229, 76, 38, 78, 101, 79, 166, 80, 229, 81, 38, 83, 101, 84, 166, 85, 229, 86, 38, 88, 101, 89, 166, 90, 229, 91, 38, 93, 101, 94, 166, 95, 229, 96, 38, 98, 101, 99, 166, 100, 229, 101, 38, 103, 101, 104, 166, 105, 229, 106, 38, 108, 101, 109, 166, 110, 229, 111, 38, 113, 101, 114, 166, 115, 229, 116, 38, 118, 101, 119, 166, 120, 229, 121, 38, 123, 101, 124, 166, 125, 229, 126, 38, 128, 101, 129, 166, 130, 229, 131, 38, 133, 101, 134, 166, 135, 229, 136, 38, 138, 101, 139, 166, 140, 229, 141, 38, 143, 101, 144, 166, 145, 229, 146, 38, 148, 101, 149, 166, 150, 229, 151, 38, 153, 101, 154, 166, 155, 229, 156, 38, 158, 101, 159, 166, 160, 229, 161, 38, 163, 101, 164, 166, 165, 229, 166, 38, 168, 101, 169, 166, 170, 229, 171, 38, 173, 101, 174, 166, 175, 229, 176, 38, 178, 101, 179, 166, 180, 229, 181, 38, 183, 101, 184, 166, 185, 229, 186, 38, 188, 101, 189, 166, 190, 229, 191, 38, 193, 101, 194, 166, 195, 229, 196, 38, 198, 101, 199, 166, 200, 229, 201, 38, 203, 101, 204, 166, 205, 229, 206, 38, 208, 101, 209, 166, 210, 229, 211, 38, 213, 101, 214, 166, 215, 229, 216, 38, 218, 101, 219, 166, 220, 229, 221, 38, 223, 101, 224, 166, 225, 229, 226, 38, 228, 101, 229, 166, 230, 229, 231, 38, 233, 101, 234, 166, 235, 229, 236, 38, 238, 101, 239, 166, 240, 229, 241, 38, 243, 101, 244, 166, 245, 229, 246, 38, 248, 101, 249, 166, 250, 229, 251, 38, 253, 101, 254, 166, 255, 229, 0, 38, 2, 101, 3, 166, 4, 229, 5, 38, 7, 101, 8, 166, 9, 229, 10, 38, 12, 101, 13, 166, 14, 229, 15, 38, 17, 101, 18, 166, 19, 229, 20, 38, 22, 101, 23, 166, 24, 229, 25, 38, 27, 101, 28, 166, 29, 229, 30, 38, 32, 101, 33, 166, 34, 229, 35, 38, 37, 101, 38, 166, 39, 229, 40, 38, 42, 101, 43, 166, 44, 229, 45, 38, 47, 101, 48, 166, 49, 229, 50, 38, 52, 101, 53, 166, 54, 229, 55, 38, 57, 101, 58, 166, 59, 229, 60, 38, 62, 101, 63, 166, 64, 229, 65, 38, 67, 101, 68, 166, 69, 229, 70, 38, 72, 101, 73, 166, 74, 229, 75, 38, 77, 101, 78, 166, 79, 229, 80, 38, 82, 101, 83, 166, 84, 229, 85, 38, 87, 101, 88, 166, 89, 229, 90, 38, 92, 101, 93, 166, 94, 229, 95, 38, 97, 101, 98, 166, 99, 229, 100, 38, 102, 101, 103, 166, 104, 229, 105, 38, 107, 101, 108, 166, 109, 229, 110, 38, 112, 101, 113, 166, 114, 229, 115, 38, 117, 101, 118, 166, 119, 229, 120, 38, 122, 101, 123, 166, 124, 229, 125, 38, 127, 101, 128, 166, 129, 229, 130, 38, 132, 101, 133, 166, 134, 229, 135, 38, 137, 101, 138, 166, 139, 229, 140, 38, 142, 101, 143, 166, 144, 229, 145, 38, 147, 101, 148, 166, 149, 229, 150, 38, 152, 101, 153, 166, 154, 229, 155, 38, 157, 101, 158, 166, 159, 229, 160, 38, 162, 101, 163, 166, 164, 229, 165, 38, 167, 101, 168, 166, 169, 229, 170, 38, 172, 101, 173, 166, 174, 229, 175, 38, 177, 101, 178, 166, 179, 229, 180, 38, 182, 101, 183, 166, 184, 229, 185, 38, 187, 101, 188, 166, 189, 229, 190, 38, 192, 101, 193, 166, 194, 229, 195, 38, 197, 101, 198, 166, 199, 229, 200, 38, 202, 101, 203, 166, 204, 229, 205, 38, 207, 101, 208, 166, 209, 229, 210, 38, 212, 101, 213, 166, 214, 229, 215, 38, 217, 101, 218, 166, 219, 229, 220, 38, 222, 101, 223, 166, 224, 229, 225, 38, 227, 101, 228, 166, 229, 229, 230, 38, 232, 101, 233, 166, 234, 229, 235, 38, 237, 101, 238, 166, 239, 229, 240, 38, 242, 101, 243, 166, 244, 229, 245, 38, 247, 101, 248, 166, 249, 229, 250, 38, 252, 101, 253, 166, 254, 229, 255, 38, 1, 101, 2, 166, 3, 229, 4, 38, 6, 101, 7, 166, 8, 229, 9, 38, 11, 101, 12, 166, 13, 229, 14, 38, 16, 101, 17, 166, 18, 229, 19, 38, 21, 101, 22, 166, 23, 229, 24, 38, 26, 101, 27, 166, 28, 229, 29, 38, 31, 101, 32, 166, 33, 229, 34, 38, 36, 101, 37, 166, 38, 229, 39, 38, 41, 101, 42, 166, 43, 229, 44, 38, 46, 101, 47, 166, 48, 229, 49, 38, 51, 101, 52, 166, 53, 229, 54, 38, 56, 101, 57, 166, 58, 229, 59, 38, 61, 101, 62, 166, 63, 229, 64, 38, 66, 101, 67, 166, 68, 229, 69, 38, 71, 101, 72, 166, 73, 229, 74, 38, 76, 101, 77, 166, 78, 229, 79, 38, 81, 101, 82, 166, 83, 229, 84, 38, 86, 101, 87, 166, 88, 229, 89, 38, 91, 101, 92, 166, 93, 229, 94, 38, 96, 101, 97, 166, 98, 229, 99, 38, 101, 101, 102, 166, 103, 229, 104, 38, 106, 101, 107, 166, 108, 229, 109, 38, 111, 101, 112, 166, 113, 229, 114, 38, 116, 101, 117, 166, 118, 229, 119, 38, 121, 101, 122, 166, 123, 229, 124, 38, 126, 101, 127, 166, 128, 229, 129, 38, 131, 101, 132, 166, 133, 229, 134, 38, 136, 101, 137, 166, 138, 229, 139, 38, 141, 101, 142, 166, 143, 229, 144, 38, 146, 101, 147, 166, 148, 229, 149, 38, 151, 101, 152, 166, 153, 229, 154, 38, 156, 101, 157, 166, 158, 229, 159, 38, 161, 101, 162, 166, 163, 229, 164, 38, 166, 101, 167, 166, 168, 229, 169, 38, 171, 101, 172, 166, 173, 229, 174, 38, 176, 101, 177, 166, 178, 229, 179, 38, 181, 101, 182, 166, 183, 229, 184, 38, 186, 101, 187, 166, 188, 229, 189, 38, 191, 101, 192, 166, 193, 229, 194, 38, 196, 101, 197, 166, 198, 229, 199, 38, 201, 101, 202, 166, 203, 229, 204, 38, 206, 101, 207, 166, 208, 229, 209, 38, 211, 101, 212, 166, 213, 229, 214, 38, 216, 101, 217, 166, 218, 229, 219, 38, 221, 101, 222, 166, 223, 229, 224, 38, 226, 101, 227, 166, 228, 229, 229, 38, 231, 101, 232, 166, 233, 229, 234, 38, 236, 101, 237, 166, 238, 229, 239, 38, 241, 101, 242, 166, 243, 229, 244, 38, 246, 101, 247, 166, 248, 229, 249, 38, 251, 101, 252, 166, 253, 229, 254, 38, 0, 101, 1, 166, 2, 229, 3, 38, 5, 101, 6, 166, 7, 229, 8, 38, 10, 101, 11, 166, 12, 229, 13, 38, 15, 101, 16, 166, 17, 229, 18, 38, 20, 101, 21, 166, 22, 229, 23, 38, 25, 101, 26, 166, 27, 229, 28, 38, 30, 101, 31, 166, 32, 229, 33, 38, 35, 101, 36, 166, 37, 229, 38, 38, 40, 101, 41, 166, 42, 229, 43, 38, 45, 101, 46, 166, 47, 229, 48, 38, 50, 101, 51, 166, 52, 229, 53, 38, 55, 101, 56, 166, 57, 229, 58, 38, 60, 101, 61, 166, 62, 229, 63, 38, 65, 101, 66, 166, 67, 229, 68, 38, 70, 101, 71, 166, 72, 229, 73, 38, 75, 101, 76, 166, 77, 229, 78, 38, 80, 101, 81, 166, 82, 229, 83, 38, 85, 101, 86, 166, 87, 229, 88, 38, 90, 101, 91, 166, 92, 229, 93, 38, 95, 101, 96, 166, 97, 229, 98, 38, 100, 101, 101, 166, 102, 229, 103, 38, 105, 101, 106, 166, 107, 229, 108, 38, 110, 101, 111, 166, 112, 229, 113, 38, 115, 101, 116, 166, 117, 229, 118, 38, 120, 101, 121, 166, 122, 229, 123, 38, 125, 101, 126, 166, 127, 229, 128, 38, 130, 101, 131, 166, 132, 229, 133, 38, 135, 101, 136, 166, 137, 229, 138, 38, 140, 101, 141, 166, 142, 229, 143, 38, 145, 101, 146, 166, 147, 229, 148, 38, 150, 101, 151, 166, 152, 229, 153, 38, 155, 101, 156, 166, 157, 229, 158, 38, 160, 101, 161, 166, 162, 229, 163, 38, 165, 101, 166, 166, 167, 229, 168, 38, 170, 101, 171, 166, 172, 229, 173, 38, 175, 101, 176, 166, 177, 229, 178, 38, 180, 101, 181, 166, 182, 229, 183, 38, 185, 101, 186, 166, 187, 229, 188, 38, 190, 101, 191, 166, 192, 229, 193, 38, 195, 101, 196, 166, 197, 229, 198, 38, 200, 101, 201, 166, 202, 229, 203, 38, 205, 101, 206, 166, 207, 229, 208, 38, 210, 101, 211, 166, 212, 229, 213, 38, 215, 101, 216, 166, 217, 229, 218, 38, 220, 101, 221, 166, 222, 229, 223, 38, 225, 101, 226, 166, 227, 229, 228, 38, 230, 101, 231, 166, 232, 229, 233, 38, 235, 101, 236, 166, 237, 229, 238, 38, 240, 101, 241, 166, 242, 229, 243, 38, 245, 101, 246, 166, 247, 229, 248, 38, 250, 101, 251, 166, 252, 229, 253, 38, 255, 101, 0, 166, 1, 229, 2, 38, 4, 101, 5, 166, 6, 229, 7, 38, 9, 101, 10, 166, 11, 229, 12, 38, 14, 101, 15, 166, 16, 229, 17, 38, 19, 101, 20, 166, 21, 229, 22, 38, 24, 101, 25, 166, 26, 229, 27, 38, 29, 101, 30, 166, 31, 229, 32, 38, 34, 101, 35, 166, 36, 229, 37, 38, 39, 101, 40, 166, 41, 229, 42, 38, 44, 101, 45, 166, 46, 229, 47, 38, 49, 101, 50, 166, 51, 229, 52, 38, 54, 101, 55, 166, 56, 229, 57, 38, 59, 101, 60, 166, 61, 229, 62, 38, 64, 101, 65, 166, 66, 229, 67, 38, 69, 101, 70, 166, 71, 229, 72, 38, 74, 101, 75, 166, 76, 229, 77, 38, 79, 101, 80, 166, 81, 229, 82, 38, 84, 101, 85, 166, 86, 229, 87, 38, 89, 101, 90, 166, 91, 229, 92, 38, 94, 101, 95, 166, 96, 229, 97, 38, 99, 101, 100, 166, 101, 229, 102, 38, 104, 101, 105, 166, 106, 229, 107, 38, 109, 101, 110, 166, 111, 229, 112, 38, 114, 101, 115, 166, 116, 229, 117, 38, 119, 101, 120, 166, 121, 229, 122, 38, 124, 101, 125, 166, 126, 229, 127, 38, 129, 101, 130, 166, 131, 229, 132, 38, 134, 101, 135, 166, 136, 229, 137, 38, 139, 101, 140, 166, 141, 229, 142, 38, 144, 101, 145, 166, 146, 229, 147, 38, 149, 101, 150, 166, 151, 229, 152, 38, 154, 101, 155, 166, 156, 229, 157, 38, 159, 101, 160, 166, 161, 229, 162, 38, 164, 101, 165, 166, 166, 229, 167, 38, 169, 101, 170, 166, 171, 229, 172, 38, 174, 101, 175, 166, 176, 229, 177, 38, 179, 101, 180, 166, 181, 229, 182, 38, 184, 101, 185, 166, 186, 229, 187, 38, 189, 101, 190, 166, 191, 229, 192, 38, 194, 101, 195, 166, 196, 229, 197, 38, 199, 101, 200, 166, 201, 229, 202, 38, 204, 101, 205, 166, 206, 229, 207, 38, 209, 101, 210, 166, 211, 229, 212, 38, 214, 101, 215, 166, 216, 229, 217, 38, 219, 101, 220, 166, 221, 229, 222, 38, 224, 101, 225, 166, 226, 229, 227, 38, 229, 101, 230, 166, 231, 229, 232, 38, 234, 101, 235, 166, 236, 229, 237, 38, 239, 101, 240, 166, 241, 229, 242, 38, 244, 101, 245, 166, 246, 229, 247, 38, 249, 101, 250, 166, 251, 229, 252, 38, 254, 101, 255, 166, 0, 229, 1, 38, 3, 101, 4, 166, 5, 229, 6, 38, 8, 101, 9, 166, 10, 229, 11, 38, 13, 101, 14, 166, 15, 229, 16, 38, 18, 101, 19, 166, 20, 229, 21, 38, 23, 101, 24, 166, 25, 229, 26, 38, 28, 101, 29, 166, 30, 229, 31, 38, 33, 101, 34, 166, 35, 229, 36, 38, 38, 101, 39, 166, 40, 229, 41, 38, 43, 101, 44, 166, 45, 229, 46, 38, 48, 101, 49, 166, 50, 229, 51, 38, 53, 101, 54, 166, 55, 229, 56, 38, 58, 101, 59, 166, 60, 229, 61, 38, 63, 101, 64, 166, 65, 229, 66, 38, 68, 101, 69, 166, 70, 229, 71, 38, 73, 101, 74, 166, 75, 229, 76, 38, 78, 101, 79, 166, 80, 229, 81, 38, 83, 101, 84, 166, 85, 229, 86, 38, 88, 101, 89, 166, 90, 229, 91, 38, 93, 101, 94, 166, 95, 229, 96, 38, 98, 101, 99, 166, 100, 229, 101, 38, 103, 101, 104, 166, 105, 229, 106, 38, 108, 101, 109, 166, 110, 229, 111, 38, 113, 101, 114, 166, 115, 229, 116, 38, 118, 101, 119, 166, 120, 229, 121, 38, 123, 101, 124, 166, 125, 229, 126, 38, 128, 101, 129, 166, 130, 229, 131, 38, 133, 101, 134, 166, 135, 229, 136, 38, 138, 101, 139, 166, 140, 229, 141, 38, 143, 101, 144, 166, 145, 229, 146, 38, 148, 101, 149, 166, 150, 229, 151, 38, 153, 101, 154, 166, 155, 229, 156, 38, 158, 101, 159, 166, 160, 229, 161, 38, 163, 101, 164, 166, 165, 229, 166, 38, 168, 101, 169, 166, 170, 229, 171, 38, 173, 101, 174, 166, 175, 229, 176, 38, 178, 101, 179, 166, 180, 229, 181, 38, 183, 101, 184, 166, 185, 229, 186, 38, 188, 101, 189, 166, 190, 229, 191, 38, 193, 101, 194, 166, 195, 229, 196, 38, 198, 101, 199, 166, 200, 229, 201, 38, 203, 101, 204, 166, 205, 229, 206, 38, 208, 101, 209, 166, 210, 229, 211, 38, 213, 101, 214, 166, 215, 229, 216, 38, 218, 101, 219, 166, 220, 229, 221, 38, 223, 101, 224, 166, 225, 229, 226, 38, 228, 101, 229, 166, 230, 229, 231, 38, 233, 101, 234, 166, 235, 229, 236, 38, 238, 101, 239, 166, 240, 229, 241, 38, 243, 101, 244, 166, 245, 229, 246, 38, 248, 101, 249, 166, 250, 229, 251, 38, 253, 101, 254, 166, 255, 229, 0, 38, 2, 101, 3, 166, 4, 229, 5, 38, 7, 101, 8, 166, 9, 229, 10, 38, 12, 101, 13, 166, 14, 229, 15, 38, 17, 101, 18, 166, 19, 229, 20, 38, 22, 101, 23, 166, 24, 229, 25, 38, 27, 101, 28, 166, 29, 229, 30, 38, 32, 101, 33, 166, 34, 229, 35, 38, 37, 101, 38, 166, 39, 229, 40, 38, 42, 101, 43, 166, 44, 229, 45, 38, 47, 101, 48, 166, 49, 229, 50, 38, 52, 101, 53, 166, 54, 229, 55, 38, 57, 101, 58, 166, 59, 229, 60, 38, 62, 101, 63, 166, 64, 229, 65, 38, 67, 101, 68, 166, 69, 229, 70, 38, 72, 101, 73, 166, 74, 229, 75, 38, 77, 101, 78, 166, 79, 229, 80, 38, 82, 101, 83, 166, 84, 229, 85, 38, 87, 101, 88, 166, 89, 229, 90, 38, 92, 101, 93, 166, 94, 229, 95, 38, 97, 101, 98, 166, 99, 229, 100, 38, 102, 101, 103, 166, 104, 229, 105, 38, 107, 101, 108, 166, 109, 229, 110, 38, 112, 101, 113, 166, 114, 229, 115, 38, 117, 101, 118, 166, 119, 229, 120, 38, 122, 101, 123, 166, 124, 229, 125, 38, 127, 101, 128, 166, 129, 229, 130, 38, 132, 101, 133, 166, 134, 229, 135, 38, 137, 101, 138, 166, 139, 229, 140, 38, 142, 101, 143, 166, 144, 229, 145, 38, 147, 101, 148, 166, 149, 229, 150, 38, 152, 101, 153, 166, 154, 229, 155, 38, 157, 101, 158, 166, 159, 229, 160, 38, 162, 101, 163, 166, 164, 229, 165, 38, 167, 101, 168, 166, 169, 229, 170, 38, 172, 101, 173, 166, 174, 229, 175, 38, 177, 101, 178, 166, 179, 229, 180, 38, 182, 101, 183, 166, 184, 229, 185, 38, 187, 101, 188, 166, 189, 229, 190, 38, 192, 101, 193, 166, 194, 229, 195, 38, 197, 101, 198, 166, 199, 229, 200, 38, 202, 101, 203, 166, 204, 229, 205, 38, 207, 101, 208, 166, 209, 229, 210, 38, 212, 101, 213, 166, 214, 229, 215, 38, 217, 101, 218, 166, 219, 229, 220, 38, 222, 101, 223, 166, 224, 229, 225, 38, 227, 101, 228, 166, 229, 229, 230, 38, 232, 101, 233, 166, 234, 229, 235, 38, 237, 101, 238, 166, 239, 229, 240, 38, 242, 101, 243, 166, 244, 229, 245, 38, 247, 101, 248, 166, 249, 229, 250, 38, 252, 101, 253, 166, 254, 229, 255, 38, 1, 101, 2, 166, 3, 229, 4, 38, 6, 101, 7, 166, 8, 229, 9, 38, 11, 101, 12, 166, 13, 229, 14, 38, 16, 101, 17, 166, 18, 229, 19, 38, 21, 101, 22, 166, 23, 229, 24, 38, 26, 101, 27, 166, 28, 229, 29, 38, 31, 101, 32, 166, 33, 229, 34, 38, 36, 101, 37, 166, 38, 229, 39, 38, 41, 101, 42, 166, 43, 229, 44, 38, 46, 101, 47, 166, 48, 229, 49, 38, 51, 101, 52, 166, 53, 229, 54, 38, 56, 101, 57, 166, 58, 229, 59, 38, 61, 101, 62, 166, 63, 229, 64, 38, 66, 101, 67, 166, 68, 229, 69, 38, 71, 101, 72, 166, 73, 229, 74, 38, 76, 101, 77, 166, 78, 229, 79, 38, 81, 101, 82, 166, 83, 229, 84, 38, 86, 101, 87, 166, 88, 229, 89, 38, 91, 101, 92, 166, 93, 229, 94, 38, 96, 101, 97, 166, 98, 229, 99, 38, 101, 101, 102, 166, 103, 229, 104, 38, 106, 101, 107, 166, 108, 229, 109, 38, 111, 101, 112, 166, 113, 229, 114, 38, 116, 101, 117, 166, 118, 229, 119, 38, 121, 101, 122, 166, 123, 229, 124, 38, 126, 101, 127, 166, 128, 229, 129, 38, 131, 101, 132, 166, 133, 229, 134, 38, 136, 101, 137, 166, 138, 229, 139, 38, 141, 101, 142, 166, 143, 229, 144, 38, 146, 101, 147, 166, 148, 229, 149, 38, 151, 101, 152, 166, 153, 229, 154, 38, 156, 101, 157, 166, 158, 229, 159, 38, 161, 101, 162, 166, 163, 229, 164, 38, 166, 101, 167, 166, 168, 229, 169, 38, 171, 101, 172, 166, 173, 229, 174, 38, 176, 101, 177, 166, 178, 229, 179, 38, 181, 101, 182, 166, 183, 229, 184, 38, 186, 101, 187, 166, 188, 229, 189, 38, 191, 101, 192, 166, 193, 229, 194, 38, 196, 101, 197, 166, 198, 229, 199, 38, 201, 101, 202, 166, 203, 229, 204, 38, 206, 101, 207, 166, 208, 229, 209, 38, 211, 101, 212, 166, 213, 229, 214, 38, 216, 101, 217, 166, 218, 229, 219, 38, 221, 101, 222, 166, 223, 229, 224, 38, 226, 101, 227, 166, 228, 229, 229, 38, 231, 101, 232, 166, 233, 229, 234, 38, 236, 101, 237, 166, 238, 229, 239, 38, 241, 101, 242, 166, 243, 229, 244, 38, 246, 101, 247, 166, 248, 229, 249, 38, 251, 101, 252, 166, 253, 229, 254, 38, 0, 101, 1, 166, 2, 229, 3, 38, 5, 101, 6, 166, 7, 229, 8, 38, 10, 101, 11, 166, 12, 229, 13, 38, 15, 101, 16, 166, 17, 229, 18, 38, 20, 101, 21, 166, 22, 229, 23, 38, 25, 101, 26, 166, 27, 229, 28, 38, 30, 101, 31, 166, 32, 229, 33, 38, 35, 101, 36, 166, 37, 229, 38, 38, 40, 101, 41, 166, 42, 229, 43, 38, 45, 101, 46, 166, 47, 229, 48, 38, 50, 101, 51, 166, 52, 229, 53, 38, 55, 101, 56, 166, 57, 229, 58, 38, 60, 101, 61, 166, 62, 229, 63, 38, 65, 101, 66, 166, 67, 229, 68, 38, 70, 101, 71, 166, 72, 229, 73, 38, 75, 101, 76, 166, 77, 229, 78, 38, 80, 101, 81, 166, 82, 229, 83, 38, 85, 101, 86, 166, 87, 229, 88, 38, 90, 101, 91, 166, 92, 229, 93, 38, 95, 101, 96, 166, 97, 229, 98, 38, 100, 101, 101, 166, 102, 229, 103, 38, 105, 101, 106, 166, 107, 229, 108, 38, 110, 101, 111, 166, 112, 229, 113, 38, 115, 101, 116, 166, 117, 229, 118, 38, 120, 101, 121, 166, 122, 229, 123, 38, 125, 101, 126, 166, 127, 229, 128, 38, 130, 101, 131, 166, 132, 229, 133, 38, 135, 101, 136, 166, 137, 229, 138, 38, 140, 101, 141, 166, 142, 229, 143, 38, 145, 101, 146, 166, 147, 229, 148, 38, 150, 101, 151, 166, 152, 229, 153, 38, 155, 101, 156, 166, 157, 229, 158, 38, 160, 101, 161, 166, 162, 229, 163, 38, 165, 101, 166, 166, 167, 229, 168, 38, 170, 101, 171, 166, 172, 229, 173, 38, 175, 101, 176, 166, 177, 229, 178, 38, 180, 101, 181, 166, 182, 229, 183, 38, 185, 101, 186, 166, 187, 229, 188, 38, 190, 101, 191, 166, 192, 229, 193, 38, 195, 101, 196, 166, 197, 229, 198, 38, 200, 101, 201, 166, 202, 229, 203, 38, 205, 101, 206, 166, 207, 229, 208, 38, 210, 101, 211, 166, 212, 229, 213, 38, 215, 101, 216, 166, 217, 229, 218, 38, 220, 101, 221, 166, 222, 229, 223, 38, 225, 101, 226, 166, 227, 229, 228, 38, 230, 101, 231, 166, 232, 229, 233, 38, 235, 101, 236, 166, 237, 229, 238, 38, 240, 101, 241, 166, 242, 229, 243, 38, 245, 101, 246, 166, 247, 229, 248, 38, 250, 101, 251, 166, 252, 229, 253, 38, 255, 101, 0, 166, 1, 229, 2, 38, 4, 101, 5, 166, 6, 229, 7, 38, 9, 101, 10, 166, 11, 229, 12, 38, 14, 101, 15, 166, 16, 229, 17, 38, 19, 101, 20, 166, 21, 229, 22, 38, 24, 101, 25, 166, 26, 229, 27, 38, 29, 101, 30, 166, 31, 229, 32, 38, 34, 101, 35, 166, 36, 229, 37, 38, 39, 101, 40, 166, 41, 229, 42, 38, 44, 101, 45, 166, 46, 229, 47, 38, 49, 101, 50, 166, 51, 229, 52, 38, 54, 101, 55, 166, 56, 229, 57, 38, 59, 101, 60, 166, 61, 229, 62, 38, 64, 101, 65, 166, 66, 229, 67, 38, 69, 101, 70, 166, 71, 229, 72, 38, 74, 101, 75, 166, 76, 229, 77, 38, 79, 101, 80, 166, 81, 229, 82, 38, 84, 101, 85, 166, 86, 229, 87, 38, 89, 101, 90, 166, 91, 229, 92, 38, 94, 101, 95, 166, 96, 229, 97, 38, 99, 101, 100, 166, 101, 229, 102, 38, 104, 101, 105, 166, 106, 229, 107, 38, 109, 101, 110, 166, 111, 229, 112, 38, 114, 101, 115, 166, 116, 229, 117, 38, 119, 101, 120, 166, 121, 229, 122, 38, 124, 101, 125, 166, 126, 229, 127, 38, 129, 101, 130, 166, 131, 229, 132, 38, 134, 101, 135, 166, 136, 229, 137, 38, 139, 101, 140, 166, 141, 229, 142, 38, 144, 101, 145, 166, 146, 229, 147, 38, 149, 101, 150, 166, 151, 229, 152, 38, 154, 101, 155, 166, 156, 229, 157, 38, 159, 101, 160, 166, 161, 229, 162, 38, 164, 101, 165, 166, 166, 229, 167, 38, 169, 101, 170, 166, 171, 229, 172, 38, 174, 101, 175, 166, 176, 229, 177, 38, 179, 101, 180, 166, 181, 229, 182, 38, 184, 101, 185, 166, 186, 229, 187, 38, 189, 101, 190, 166, 191, 229, 192, 38, 194, 101, 195, 166, 196, 229, 197, 38, 199, 101, 200, 166, 201, 229, 202, 38, 204, 101, 205, 166, 206, 229, 207, 38, 209, 101, 210, 166, 211, 229, 212, 38, 214, 101, 215, 166, 216, 229, 217, 38, 219, 101, 220, 166, 221, 229, 222, 38, 224, 101, 225, 166, 226, 229, 227, 38, 229, 101, 230, 166, 231, 229, 232, 38, 234, 101, 235, 166, 236, 229, 237, 38, 239, 101, 240, 166, 241, 229, 242, 38, 244, 101, 245, 166, 246, 229, 247, 38, 249, 101, 250, 166, 251, 229, 252, 38, 254, 101, 255, 166, 0, 229, 1, 38, 3, 101, 4, 166, 5, 229, 6, 38, 8, 101, 9, 166, 10, 229, 11, 38, 13, 101, 14, 166, 15, 229, 16, 38, 18, 101, 19, 166, 20, 229, 21, 38, 23, 101, 24, 166, 25, 229, 26, 38, 28, 101, 29, 166, 30, 229, 31, 38, 33, 101, 34, 166, 35, 229, 36, 38, 38, 101, 39, 166, 40, 229, 41, 38, 43, 101, 44, 166, 45, 229, 46, 38, 48, 101, 49, 166, 50, 229, 51, 38, 53, 101, 54, 166, 55, 229, 56, 38, 58, 101, 59, 166, 60, 229, 61, 38, 63, 101, 64, 166, 65, 229, 66, 38, 68, 101, 69, 166, 70, 229, 71, 38, 73, 101, 74, 166, 75, 229, 76, 38, 78, 101, 79, 166, 80, 229, 81, 38, 83, 101, 84, 166, 85, 229, 86, 38, 88, 101, 89, 166, 90, 229, 91, 38, 93, 101, 94, 166, 95, 229, 96, 38, 98, 101, 99, 166, 100, 229, 101, 38, 103, 101, 104, 166, 105, 229, 106, 38, 108, 101, 109, 166, 110, 229, 111, 38, 113, 101, 114, 166, 115, 229, 116, 38, 118, 101, 119, 166, 120, 229, 121, 38, 123, 101, 124, 166, 125, 229, 126, 38, 128, 101, 129, 166, 130, 229, 131, 38, 133, 101, 134, 166, 135, 229, 136, 38, 138, 101, 139, 166, 140, 229, 141, 38, 143, 101, 144, 166, 145, 229, 146, 38, 148, 101, 149, 166, 150, 229, 151, 38, 153, 101, 154, 166, 155, 229, 156, 38, 158, 101, 159, 166, 160, 229, 161, 38, 163, 101, 164, 166, 165, 229, 166, 38, 168, 101, 169, 166, 170, 229, 171, 38, 173, 101, 174, 166, 175, 229, 176, 38, 178, 101, 179, 166, 180, 229, 181, 38, 183, 101, 184, 166, 185, 229, 186, 38, 188, 101, 189, 166, 190, 229, 191, 38, 193, 101, 194, 166, 195, 229, 196, 38, 198, 101, 199, 166, 200, 229, 201, 38, 203, 101, 204, 166, 205, 229, 206, 38, 208, 101, 209, 166, 210, 229, 211, 38, 213, 101, 214, 166, 215, 229, 216, 38, 218, 101, 219, 166, 220, 229, 221, 38, 223, 101, 224, 166, 225, 229, 226, 38, 228, 101, 229, 166, 230, 229, 231, 38, 233, 101, 234, 166, 235, 229, 236, 38, 238, 101, 239, 166, 240, 229, 241, 38, 243, 101, 244, 166, 245, 229, 246, 38, 248, 101, 249, 166, 250, 229, 251, 38, 253, 101, 254, 166, 255, 229, 0, 38, 2, 101, 3, 166, 4, 229, 5, 38, 7, 101, 8, 166, 9, 229, 10, 38, 12, 101, 13, 166, 14, 229, 15, 38, 17, 101, 18, 166, 19, 229, 20, 38, 22, 101, 23, 166, 24, 229, 25, 38, 27, 101, 28, 166, 29, 229, 30, 38, 32, 101, 33, 166, 34, 229, 35, 38, 37, 101, 38, 166, 39, 229, 40, 38, 42, 101, 43, 166, 44, 229, 45, 38, 47, 101, 48, 166, 49, 229, 50, 38, 52, 101, 53, 166, 54, 229, 55, 38, 57, 101, 58, 166, 59, 229, 60, 38, 62, 101, 63, 166, 64, 229, 65, 38, 67, 101, 68, 166, 69, 229, 70, 38, 72, 101, 73, 166, 74, 229, 75, 38, 77, 101, 78, 166, 79, 229, 80, 38, 82, 101, 83, 166, 84, 229, 85, 38, 87, 101, 88, 166, 89, 229, 90, 38, 92, 101, 93, 166, 94, 229, 95, 38, 97, 101, 98, 166, 99, 229, 100, 38, 102, 101, 103, 166, 104, 229, 105, 38, 107, 101, 108, 166, 109, 229, 110, 38, 112, 101, 113, 166, 114, 229, 115, 38, 117, 101, 118, 166, 119, 229, 120, 38, 122, 101, 123, 166, 124, 229, 125, 38, 127, 101, 128, 166, 129, 229, 130, 38, 132, 101, 133, 166, 134, 229, 135, 38, 137, 101, 138, 166, 139, 229, 140, 38, 142, 101, 143, 166, 144, 229, 145, 38, 147, 101, 148, 166, 149, 229, 150, 38, 152, 101, 153, 166, 154, 229, 155, 38, 157, 101, 158, 166, 159, 229, 160, 38, 162, 101, 163, 166, 164, 229, 165, 38, 167, 101, 168, 166, 169, 229, 170, 38, 172, 101, 173, 166, 174, 229, 175, 38, 177, 101, 178, 166, 179, 229, 180, 38, 182, 101, 183, 166, 184, 229, 185, 38, 187, 101, 188, 166, 189, 229, 190, 38, 192, 101, 193, 166, 194, 229, 195, 38, 197, 101, 198, 166, 199, 229, 200, 38, 202, 101, 203, 166, 204, 229, 205, 38, 207, 101, 208, 166, 209, 229, 210, 38, 212, 101, 213, 166, 214, 229, 215, 38, 217, 101, 218, 166, 219, 229, 220, 38, 222, 101, 223, 166, 224, 229, 225, 38, 227, 101, 228, 166, 229, 229, 230, 38, 232, 101, 233, 166, 234, 229, 235, 38, 237, 101, 238, 166, 239, 229, 240, 38, 242, 101, 243, 166, 244, 229, 245, 38, 247, 101, 248, 166, 249, 229, 250, 38, 252, 101, 253, 166, 254, 229, 255, 38, 1, 101, 2, 166, 3, 229, 4, 38, 6, 101, 7, 166, 8, 229, 9, 38, 11, 101, 12, 166, 13, 229, 14, 38, 16, 101, 17, 166, 18, 229, 19, 38, 21, 101, 22, 166, 23, 229, 24, 38, 26, 101, 27, 166, 28, 229, 29, 38, 31, 101, 32, 166, 33, 229, 34, 38, 36, 101, 37, 166, 38, 229, 39, 38, 41, 101, 42, 166, 43, 229, 44, 38, 46, 101, 47, 166, 48, 229, 49, 38, 51, 101, 52, 1], [], [], [], [164, 0, 227, 1, 36, 3, 99, 4, 164, 5, 227, 6, 36, 8, 99, 9, 164, 10, 227, 11, 36, 13, 99, 14, 164, 15, 227, 16, 36, 18, 99, 19, 164, 20, 227, 21, 36, 23, 99, 24, 164, 25, 227, 26, 36, 28, 99, 29, 164, 30, 227, 31, 36, 33, 99, 34, 164, 35, 227, 36, 36, 38, 99, 39, 164, 40, 227, 41, 36, 43, 99, 44, 164, 45, 227, 46, 36, 48, 99, 49, 164, 50, 227, 51, 36, 53, 99, 54, 164, 55, 227, 56, 36, 58, 99, 59, 164, 60, 227, 61, 36, 63, 99, 64, 164, 65, 227, 66, 36, 68, 99, 69, 164, 70, 227, 71, 36, 73, 99, 74, 164, 75, 227, 76, 36, 78, 99, 79, 164, 80, 227, 81, 36, 83, 99, 84, 164, 85, 227, 86, 36, 88, 99, 89, 164, 90, 227, 91, 36, 93, 99, 94, 164, 95, 227, 96, 36, 98, 99, 99, 164, 100, 227, 101, 36, 103, 99, 104, 164, 105, 227, 106, 36, 108, 99, 109, 164, 110, 227, 111, 36, 113, 99, 114, 164, 115, 227, 116, 36, 118, 99, 119, 164, 120, 227, 121, 36, 123, 99, 124, 164, 125, 227, 126, 36, 128, 99, 129, 164, 130, 227, 131, 36, 133, 99, 134, 164, 135, 227, 136, 36, 138, 99, 139, 164, 140, 227, 141, 36, 143, 99, 144, 164, 145, 227, 146, 36, 148, 99, 149, 164, 150, 227, 151, 36, 153, 99, 154, 164, 155, 227, 156, 36, 158, 99, 159, 164, 160, 227, 161, 36, 163, 99, 164, 164, 165, 227, 166, 36, 168, 99, 169, 164, 170, 227, 171, 36, 173, 99, 174, 164, 175, 227, 176, 36, 178, 99, 179, 164, 180, 227, 181, 36, 183, 99, 184, 164, 185, 227, 186, 36, 188, 99, 189, 164, 190, 227, 191, 36, 193, 99, 194, 164, 195, 227, 196, 36, 198, 99, 199, 164, 200, 227, 201, 36, 203, 99, 204, 164, 205, 227, 206, 36, 208, 99, 209, 164, 210, 227, 211, 36, 213, 99, 214, 164, 215, 227, 216, 36, 218, 99, 219, 164, 220, 227, 221, 36, 223, 99, 224, 164, 225, 227, 226, 36, 228, 99, 229, 164, 230, 227, 231, 36, 233, 99, 234, 164, 235, 227, 236, 36, 238, 99, 239, 164, 240, 227, 241, 36, 243, 99, 244, 164, 245, 227, 246, 36, 248, 99, 249, 164, 250, 227, 251, 36, 253, 99, 254, 164, 255, 227, 0, 36, 2, 99, 3, 164, 4, 227, 5, 36, 7, 99, 8, 164, 9, 227, 10, 36, 12, 99, 13, 164, 14, 227, 15, 36, 17, 99, 18, 164, 19, 227, 20, 36, 22, 99, 23, 164, 24, 227, 25, 36, 27, 99, 28, 164, 29, 227, 30, 36, 32, 99, 33, 164, 34, 227, 35, 36, 37, 99, 38, 164, 39, 227, 40, 36, 42, 99, 43, 164, 44, 227, 45, 36, 47, 99, 48, 164, 49, 227, 50, 36, 52, 99, 53, 164, 54, 227, 55, 36, 57, 99, 58, 164, 59, 227, 60, 36, 62, 99, 63, 164, 64, 227, 65, 36, 67, 99, 68, 164, 69, 227, 70, 36, 72, 99, 73, 164, 74, 227, 75, 36, 77, 99, 78, 164, 79, 227, 80, 36, 82, 99, 83, 164, 84, 227, 85, 36, 87, 99, 88, 164, 89, 227, 90, 36, 92, 99, 93, 164, 94, 227, 95, 36, 97, 99, 98, 164, 99, 227, 100, 36, 102, 99, 103, 164, 104, 227, 105, 36, 107, 99, 108, 164, 109, 227, 110, 36, 112, 99, 113, 164, 114, 227, 115, 36, 117, 99, 118, 164, 119, 227, 120, 36, 122, 99, 123, 164, 124, 227, 125, 36, 127, 99, 128, 164, 129, 227, 130, 36, 132, 99, 133, 164, 134, 227, 135, 36, 137, 99, 138, 164, 139, 227, 140, 36, 142, 99, 143, 164, 144, 227, 145, 36, 147, 99, 148, 164, 149, 227, 150, 36, 152, 99, 153, 164, 154, 227, 155, 36, 157, 99, 158, 164, 159, 227, 160, 36, 162, 99, 163, 164, 164, 227, 165, 36, 167, 99, 168, 164, 169, 227, 170, 36, 172, 99, 173, 164, 174, 227, 175, 36, 177, 99, 178, 164, 179, 227, 180, 36, 182, 99, 183, 164, 184, 227, 185, 36, 187, 99, 188, 164, 189, 227, 190, 36, 192, 99, 193, 164, 194, 227, 195, 36, 197, 99, 198, 164, 199, 227, 200, 36, 202, 99, 203, 164, 204, 227, 205, 36, 207, 99, 208, 164, 209, 227, 210, 36, 212, 99, 213, 164, 214, 227, 215, 36, 217, 99, 218, 164, 219, 227, 220, 36, 222, 99, 223, 164, 224, 227, 225, 36, 227, 99, 228, 164, 229, 227, 230, 36, 232, 99, 233, 164, 234, 227, 235, 36, 237, 99, 238, 164, 239, 227, 240, 36, 242, 99, 243, 164, 244, 227, 245, 36, 247, 99, 248, 164, 249, 227, 250, 36, 252, 99, 253, 164, 254, 227, 255, 36, 1, 99, 2, 164, 3, 227, 4, 36, 6, 99, 7, 164, 8, 227, 9, 36, 11, 99, 12, 164, 13, 227, 14, 36, 16, 99, 17, 164, 18, 227, 19, 36, 21, 99, 22, 164, 23, 227, 24, 36, 26, 99, 27, 164, 28, 227, 29, 36, 31, 99, 32, 164, 33, 227, 34, 36, 36, 99, 37, 164, 38, 227, 39, 36, 41, 99, 42, 164, 43, 227, 44, 36, 46, 99, 47, 164, 48, 227, 49, 36, 51, 99, 52, 164, 53, 227, 54, 36, 56, 99, 57, 164, 58, 227, 59, 36, 61, 99, 62, 164, 63, 227, 64, 36, 66, 99, 67, 164, 68, 227, 69, 36, 71, 99, 72, 164, 73, 227, 74, 36, 76, 99, 77, 164, 78, 227, 79, 36, 81, 99, 82, 164, 83, 227, 84, 36, 86, 99, 87, 164, 88, 227, 89, 36, 91, 99, 92, 164, 93, 227, 94, 36, 96, 99, 97, 164, 98, 227, 99, 36, 101, 99, 102, 164, 103, 227, 104, 36, 106, 99, 107, 164, 108, 227, 109, 36, 111, 99, 112, 164, 113, 227, 114, 36, 116, 99, 117, 164, 118, 227, 119, 36, 121, 99, 122, 164, 123, 227, 124, 36, 126, 99, 127, 164, 128, 227, 129, 36, 131, 99, 132, 164, 133, 227, 134, 36, 136, 99, 137, 164, 138, 227, 139, 36, 141, 99, 142, 164, 143, 227, 144, 36, 146, 99, 147, 164, 148, 227, 149, 36, 151, 99, 152, 164, 153, 227, 154, 36, 156, 99, 157, 164, 158, 227, 159, 36, 161, 99, 162, 164, 163, 227, 164, 36, 166, 99, 167, 164, 168, 227, 169, 36, 171, 99, 172, 164, 173, 227, 174, 36, 176, 99, 177, 164, 178, 227, 179, 36, 181, 99, 182, 164, 183, 227, 184, 36, 186, 99, 187, 164, 188, 227, 189, 36, 191, 99, 192, 164, 193, 227, 194, 36, 196, 99, 197, 164, 198, 227, 199, 36, 201, 99, 202, 164, 203, 227, 204, 36, 206, 99, 207, 164, 208, 227, 209, 36, 211, 99, 212, 164, 213, 227, 214, 36, 216, 99, 217, 164, 218, 227, 219, 36, 221, 99, 222, 164, 223, 227, 224, 36, 226, 99, 227, 164, 228, 227, 229, 36, 231, 99, 232, 164, 233, 227, 234, 36, 236, 99, 237, 164, 238, 227, 239, 36, 241, 99, 242, 164, 243, 227, 244, 36, 246, 99, 247, 164, 248, 227, 249, 36, 251, 99, 252, 164, 253, 227, 254, 36, 0, 99, 1, 164, 2, 227, 3, 36, 5, 99, 6, 164, 7, 227, 8, 36, 10, 99, 11, 164, 12, 227, 13, 36, 15, 99, 16, 164, 17, 227, 18, 36, 20, 99, 21, 164, 22, 227, 23, 36, 25, 99, 26, 164, 27, 227, 28, 36, 30, 99, 31, 164, 32, 227, 33, 36, 35, 99, 36, 164, 37, 227, 38, 36, 40, 99, 41, 164, 42, 227, 43, 36, 45, 99, 46, 164, 47, 227, 48, 36, 50, 99, 51, 164, 52, 227, 53, 36, 55, 99, 56, 164, 57, 227, 58, 36, 60, 99, 61, 164, 62, 227, 63, 36, 65, 99, 66, 164, 67, 227, 68, 36, 70, 99, 71, 164, 72, 227, 73, 36, 75, 99, 76, 164, 77, 227, 78, 36, 80, 99, 81, 164, 82, 227, 83, 36, 85, 99, 86, 164, 87, 227, 88, 36, 90, 99, 91, 164, 92, 227, 93, 36, 95, 99, 96, 164, 97, 227, 98, 36, 100, 99, 101, 164, 102, 227, 103, 36, 105, 99, 106, 164, 107, 227, 108, 36, 110, 99, 111, 164, 112, 227, 113, 36, 115, 99, 116, 164, 117, 227, 118, 36, 120, 99, 121, 164, 122, 227, 123, 36, 125, 99, 126, 164, 127, 227, 128, 36, 130, 99, 131, 164, 132, 227, 133, 36, 135, 99, 136, 164, 137, 227, 138, 36, 140, 99, 141, 164, 142, 227, 143, 36, 145, 99, 146, 164, 147, 227, 148, 36, 150, 99, 151, 164, 152, 227, 153, 36, 155, 99, 156, 164, 157, 227, 158, 36, 160, 99, 161, 164, 162, 227, 163, 36, 165, 99, 166, 164, 167, 227, 168, 36, 170, 99, 171, 164, 172, 227, 173, 36, 175, 99, 176, 164, 177, 227, 178, 36, 180, 99, 181, 164, 182, 227, 183, 36, 185, 99, 186, 164, 187, 227, 188, 36, 190, 99, 191, 164, 192, 227, 193, 36, 195, 99, 196, 164, 197, 227, 198, 36, 200, 99, 201, 164, 202, 227, 203, 36, 205, 99, 206, 164, 207, 227, 208, 36, 210, 99, 211, 164, 212, 227, 213, 36, 215, 99, 216, 164, 217, 227, 218, 36, 220, 99, 221, 164, 222, 227, 223, 36, 225, 99, 226, 164, 227, 227, 228, 36, 230, 99, 231, 164, 232, 227, 233, 36, 235, 99, 236, 164, 237, 227, 238, 36, 240, 99, 241, 164, 242, 227, 243, 36, 245, 99, 246, 164, 247, 227, 248, 36, 250, 99, 251, 164, 252, 227, 253, 36, 255, 99, 0, 164, 1, 227, 2, 36, 4, 99, 5, 164, 6, 227, 7, 36, 9, 99, 10, 164, 11, 227, 12, 36, 14, 99, 15, 164, 16, 227, 17, 36, 19, 99, 20, 164, 21, 227, 22, 36, 24, 99, 25, 164, 26, 227, 27, 36, 29, 99, 30, 164, 31, 227, 32, 36, 34, 99, 35, 164, 36, 227, 37, 36, 39, 99, 40, 164, 41, 227, 42, 36, 44, 99, 45, 164, 46, 227, 47, 36, 49, 99, 50, 164, 51, 227, 52, 36, 54, 99, 55, 164, 56, 227, 57, 36, 59, 99, 60, 164, 61, 227, 62, 36, 64, 99, 65, 164, 66, 227, 67, 36, 69, 99, 70, 164, 71, 227, 72, 36, 74, 99, 75, 164, 76, 227, 77, 36, 79, 99, 80, 164, 81, 227, 82, 36, 84, 99, 85, 164, 86, 227, 87, 36, 89, 99, 90, 164, 91, 227, 92, 36, 94, 99, 95, 164, 96, 227, 97, 36, 99, 99, 100, 164, 101, 227, 102, 36, 104, 99, 105, 164, 106, 227, 107, 36, 109, 99, 110, 164, 111, 227, 112, 36, 114, 99, 115, 164, 116, 227, 117, 36, 119, 99, 120, 164, 121, 227, 122, 36, 124, 99, 125, 164, 126, 227, 127, 36, 129, 99, 130, 164, 131, 227, 132, 36, 134, 99, 135, 164, 136, 227, 137, 36, 139, 99, 140, 164, 141, 227, 142, 36, 144, 99, 145, 164, 146, 227, 147, 36, 149, 99, 150, 164, 151, 227, 152, 36, 154, 99, 155, 164, 156, 227, 157, 36, 159, 99, 160, 164, 161, 227, 162, 36, 164, 99, 165, 164, 166, 227, 167, 36, 169, 99, 170, 164, 171, 227, 172, 36, 174, 99, 175, 164, 176, 227, 177, 36, 179, 99, 180, 164, 181, 227, 182, 36, 184, 99, 185, 164, 186, 227, 187, 36, 189, 99, 190, 164, 191, 227, 192, 36, 194, 99, 195, 164, 196, 227, 197, 36, 199, 99, 200, 164, 201, 227, 202, 36, 204, 99, 205, 164, 206, 227, 207, 36, 209, 99, 210, 164, 211, 227, 212, 36, 214, 99, 215, 164, 216, 227, 217, 36, 219, 99, 220, 164, 221, 227, 222, 36, 224, 99, 225, 164, 226, 227, 227, 36, 229, 99, 230, 164, 231, 227, 232, 36, 234, 99, 235, 164, 236, 227, 237, 36, 239, 99, 240, 164, 241, 227, 242, 36, 244, 99, 245, 164, 246, 227, 247, 36, 249, 99, 250, 164, 251, 227, 252, 36, 254, 99, 255, 164, 0, 227, 1, 36, 3, 99, 4, 164, 5, 227, 6, 36, 8, 99, 9, 164, 10, 227, 11, 36, 13, 99, 14, 164, 15, 227, 16, 36, 18, 99, 19, 164, 20, 227, 21, 36, 23, 99, 24, 164, 25, 227, 26, 36, 28, 99, 29, 164, 30, 227, 31, 36, 33, 99, 34, 164, 35, 227, 36, 36, 38, 99, 39, 164, 40, 227, 41, 36, 43, 99, 44, 164, 45, 227, 46, 36, 48, 99, 49, 164, 50, 227, 51, 36, 53, 99, 54, 164, 55, 227, 56, 36, 58, 99, 59, 164, 60, 227, 61, 36, 63, 99, 64, 164, 65, 227, 66, 36, 68, 99, 69, 164, 70, 227, 71, 36, 73, 99, 74, 164, 75, 227, 76, 36, 78, 99, 79, 164, 80, 227, 81, 36, 83, 99, 84, 164, 85, 227, 86, 36, 88, 99, 89, 164, 90, 227, 91, 36, 93, 99, 94, 164, 95, 227, 96, 36, 98, 99, 99, 164, 100, 227, 101, 36, 103, 99, 104, 164, 105, 227, 106, 36, 108, 99, 109, 164, 110, 227, 111, 36, 113, 99, 114, 164, 115, 227, 116, 36, 118, 99, 119, 164, 120, 227, 121, 36, 123, 99, 124, 164, 125, 227, 126, 36, 128, 99, 129, 164, 130, 227, 131, 36, 133, 99, 134, 164, 135, 227, 136, 36, 138, 99, 139, 164, 140, 227, 141, 36, 143, 99, 144, 164, 145, 227, 146, 36, 148, 99, 149, 164, 150, 227, 151, 36, 153, 99, 154, 164, 155, 227, 156, 36, 158, 99, 159, 164, 160, 227, 161, 36, 163, 99, 164, 164, 165, 227, 166, 36, 168, 99, 169, 164, 170, 227, 171, 36, 173, 99, 174, 164, 175, 227, 176, 36, 178, 99, 179, 164, 180, 227, 181, 36, 183, 99, 184, 164, 185, 227, 186, 36, 188, 99, 189, 164, 190, 227, 191, 36, 193, 99, 194, 164, 195, 227, 196, 36, 198, 99, 199, 164, 200, 227, 201, 36, 203, 99, 204, 164, 205, 227, 206, 36, 208, 99, 209, 164, 210, 227, 211, 36, 213, 99, 214, 164, 215, 227, 216, 36, 218, 99, 219, 164, 220, 227, 221, 36, 223, 99, 224, 164, 225, 227, 226, 36, 228, 99, 229, 164, 230, 227, 231, 36, 233, 99, 234, 164, 235, 227, 236, 36, 238, 99, 239, 164, 240, 227, 241, 36, 243, 99, 244, 164, 245, 227, 246, 36, 248, 99, 249, 164, 250, 227, 251, 36, 253, 99, 254, 164, 255, 227, 0, 36, 2, 99, 3, 164, 4, 227, 5, 36, 7, 99, 8, 164, 9, 227, 10, 36, 12, 99, 13, 164, 14, 227, 15, 36, 17, 99, 18, 164, 19, 227, 20, 36, 22, 99, 23, 164, 24, 227, 25, 36, 27, 99, 28, 164, 29, 227, 30, 36, 32, 99, 33, 164, 34, 227, 35, 36, 37, 99, 38, 164, 39, 227, 40, 36, 42, 99, 43, 164, 44, 227, 45, 36, 47, 99, 48, 164, 49, 227, 50, 36, 52, 99, 53, 164, 54, 227, 55, 36, 57, 99, 58, 164, 59, 227, 60, 36, 62, 99, 63, 164, 64, 227, 65, 36, 67, 99, 68, 164, 69, 227, 70, 36, 72, 99, 73, 164, 74, 227, 75, 36, 77, 99, 78, 164, 79, 227, 80, 36, 82, 99, 83, 164, 84, 227, 85, 36, 87, 99, 88, 164, 89, 227, 90, 36, 92, 99, 93, 164, 94, 227, 95, 36, 97, 99, 98, 164, 99, 227, 100, 36, 102, 99, 103, 164, 104, 227, 105, 36, 107, 99, 108, 164, 109, 227, 110, 36, 112, 99, 113, 164, 114, 227, 115, 36, 117, 99, 118, 164, 119, 227, 120, 36, 122, 99, 123, 164, 124, 227, 125, 36, 127, 99, 128, 164, 129, 227, 130, 36, 132, 99, 133, 164, 134, 227, 135, 36, 137, 99, 138, 164, 139, 227, 140, 36, 142, 99, 143, 164, 144, 227, 145, 36, 147, 99, 148, 164, 149, 227, 150, 36, 152, 99, 153, 164, 154, 227, 155, 36, 157, 99, 158, 164, 159, 227, 160, 36, 162, 99, 163, 164, 164, 227, 165, 36, 167, 99, 168, 164, 169, 227, 170, 36, 172, 99, 173, 164, 174, 227, 175, 36, 177, 99, 178, 164, 179, 227, 180, 36, 182, 99, 183, 164, 184, 227, 185, 36, 187, 99, 188, 164, 189, 227, 190, 36, 192, 99, 193, 164, 194, 227, 195, 36, 197, 99, 198, 164, 199, 227, 200, 36, 202, 99, 203, 164, 204, 227, 205, 36, 207, 99, 208, 164, 209, 227, 210, 36, 212, 99, 213, 164, 214, 227, 215, 36, 217, 99, 218, 164, 219, 227, 220, 36, 222, 99, 223, 164, 224, 227, 225, 36, 227, 99, 228, 164, 229, 227, 230, 36, 232, 99, 233, 164, 234, 227, 235, 36, 237, 99, 238, 164, 239, 227, 240, 36, 242, 99, 243, 164, 244, 227, 245, 36, 247, 99, 248, 164, 249, 227, 250, 36, 252, 99, 253, 164, 254, 227, 255, 36, 1, 99, 2, 164, 3, 227, 4, 36, 6, 99, 7, 164, 8, 227, 9, 36, 11, 99, 12, 164, 13, 227, 14, 36, 16, 99, 17, 164, 18, 227, 19, 36, 21, 99, 22, 164, 23, 227, 24, 36, 26, 99, 27, 164, 28, 227, 29, 36, 31, 99, 32, 164, 33, 227, 34, 36, 36, 99, 37, 164, 38, 227, 39, 36, 41, 99, 42, 164, 43, 227, 44, 36, 46, 99, 47, 164, 48, 227, 49, 36, 51, 99, 52, 164, 53, 227, 54, 36, 56, 99, 57, 164, 58, 227, 59, 36, 61, 99, 62, 164, 63, 227, 64, 36, 66, 99, 67, 164, 68, 227, 69, 36, 71, 99, 72, 164, 73, 227, 74, 36, 76, 99, 77, 164, 78, 227, 79, 36, 81, 99, 82, 164, 83, 227, 84, 36, 86, 99, 87, 164, 88, 227, 89, 36, 91, 99, 92, 164, 93, 227, 94, 36, 96, 99, 97, 164, 98, 227, 99, 36, 101, 99, 102, 164, 103, 227, 104, 36, 106, 99, 107, 164, 108, 227, 109, 36, 111, 99, 112, 164, 113, 227, 114, 36, 116, 99, 117, 164, 118, 227, 119, 36, 121, 99, 122, 164, 123, 227, 124, 36, 126, 99, 127, 164, 128, 227, 129, 36, 131, 99, 132, 164, 133, 227, 134, 36, 136, 99, 137, 164, 138, 227, 139, 36, 141, 99, 142, 164, 143, 227, 144, 36, 146, 99, 147, 164, 148, 227, 149, 36, 151, 99, 152, 164, 153, 227, 154, 36, 156, 99, 157, 164, 158, 227, 159, 36, 161, 99, 162, 164, 163, 227, 164, 36, 166, 99, 167, 164, 168, 227, 169, 36, 171, 99, 172, 164, 173, 227, 174, 36, 176, 99, 177, 164, 178, 227, 179, 36, 181, 99, 182, 164, 183, 227, 184, 36, 186, 99, 187, 164, 188, 227, 189, 36, 191, 99, 192, 164, 193, 227, 194, 36, 196, 99, 197, 164, 198, 227, 199, 36, 201, 99, 202, 164, 203, 227, 204, 36, 206, 99, 207, 164, 208, 227, 209, 36, 211, 99, 212, 164, 213, 227, 214, 36, 216, 99, 217, 164, 218, 227, 219, 36, 221, 99, 222, 164, 223, 227, 224, 36, 226, 99, 227, 164, 228, 227, 229, 36, 231, 99, 232, 164, 233, 227, 234, 36, 236, 99, 237, 164, 238, 227, 239, 36, 241, 99, 242, 164, 243, 227, 244, 36, 246, 99, 247, 164, 248, 227, 249, 36, 251, 99, 252, 164, 253, 227, 254, 36, 0, 99, 1, 164, 2, 227, 3, 36, 5, 99, 6, 164, 7, 227, 8, 36, 10, 99, 11, 164, 12, 227, 13, 36, 15, 99, 16, 164, 17, 227, 18, 36, 20, 99, 21, 164, 22, 227, 23, 36, 25, 99, 26, 164, 27, 227, 28, 36, 30, 99, 31, 164, 32, 227, 33, 36, 35, 99, 36, 164, 37, 227, 38, 36, 40, 99, 41, 164, 42, 227, 43, 36, 45, 99, 46, 164, 47, 227, 48, 36, 50, 99, 51, 164, 52, 227, 53, 36, 55, 99, 56, 164, 57, 227, 58, 36, 60, 99, 61, 164, 62, 227, 63, 36, 65, 99, 66, 164, 67, 227, 68, 36, 70, 99, 71, 164, 72, 227, 73, 36, 75, 99, 76, 164, 77, 227, 78, 36, 80, 99, 81, 164, 82, 227, 83, 36, 85, 99, 86, 164, 87, 227, 88, 36, 90, 99, 91, 164, 92, 227, 93, 36, 95, 99, 96, 164, 97, 227, 98, 36, 100, 99, 101, 164, 102, 227, 103, 36, 105, 99, 106, 164, 107, 227, 108, 36, 110, 99, 111, 164, 112, 227, 113, 36, 115, 99, 116, 164, 117, 227, 118, 36, 120, 99, 121, 164, 122, 227, 123, 36, 125, 99, 126, 164, 127, 227, 128, 36, 130, 99, 131, 164, 132, 227, 133, 36, 135, 99, 136, 164, 137, 227, 138, 36, 140, 99, 141, 164, 142, 227, 143, 36, 145, 99, 146, 164, 147, 227, 148, 36, 150, 99, 151, 164, 152, 227, 153, 36, 155, 99, 156, 164, 157, 227, 158, 36, 160, 99, 161, 164, 162, 227, 163, 36, 165, 99, 166, 164, 167, 227, 168, 36, 170, 99, 171, 164, 172, 227, 173, 36, 175, 99, 176, 164, 177, 227, 178, 36, 180, 99, 181, 164, 182, 227, 183, 36, 185, 99, 186, 164, 187, 227, 188, 36, 190, 99, 191, 164, 192, 227, 193, 36, 195, 99, 196, 164, 197, 227, 198, 36, 200, 99, 201, 164, 202, 227, 203, 36, 205, 99, 206, 164, 207, 227, 208, 36, 210, 99, 211, 164, 212, 227, 213, 36, 215, 99, 216, 164, 217, 227, 218, 36, 220, 99, 221, 164, 222, 227, 223, 36, 225, 99, 226, 164, 227, 227, 228, 36, 230, 99, 231, 164, 232, 227, 233, 36, 235, 99, 236, 164, 237, 227, 238, 36, 240, 99, 241, 164, 242, 227, 243, 36, 245, 99, 246, 164, 247, 227, 248, 36, 250, 99, 251, 164, 252, 227, 253, 36, 255, 99, 0, 164, 1, 227, 2, 36, 4, 99, 5, 164, 6, 227, 7, 36, 9, 99, 10, 164, 11, 227, 12, 36, 14, 99, 15, 164, 16, 227, 17, 36, 19, 99, 20, 164, 21, 227, 22, 36, 24, 99, 25, 164, 26, 227, 27, 36, 29, 99, 30, 164, 31, 227, 32, 36, 34, 99, 35, 164, 36, 227, 37, 36, 39, 99, 40, 164, 41, 227, 42, 36, 44, 99, 45, 164, 46, 227, 47, 36, 49, 99, 50, 164, 51, 227, 52, 36, 54, 99, 55, 164, 56, 227, 57, 36, 59, 99, 60, 164, 61, 227, 62, 36, 64, 99, 65, 164, 66, 227, 67, 36, 69, 99, 70, 164, 71, 227, 72, 36, 74, 99, 75, 164, 76, 227, 77, 36, 79, 99, 80, 164, 81, 227, 82, 36, 84, 99, 85, 164, 86, 227, 87, 36, 89, 99, 90, 164, 91, 227, 92, 36, 94, 99, 95, 164, 96, 227, 97, 36, 99, 99, 100, 164, 101, 227, 102, 36, 104, 99, 105, 164, 106, 227, 107, 36, 109, 99, 110, 164, 111, 227, 112, 36, 114, 99, 115, 164, 116, 227, 117, 36, 119, 99, 120, 164, 121, 227, 122, 36, 124, 99, 125, 164, 126, 227, 127, 36, 129, 99, 130, 164, 131, 227, 132, 36, 134, 99, 135, 164, 136, 227, 137, 36, 139, 99, 140, 164, 141, 227, 142, 36, 144, 99, 145, 164, 146, 227, 147, 36, 149, 99, 150, 164, 151, 227, 152, 36, 154, 99, 155, 164, 156, 227, 157, 36, 159, 99, 160, 164, 161, 227, 162, 36, 164, 99, 165, 164, 166, 227, 167, 36, 169, 99, 170, 164, 171, 227, 172, 36, 174, 99, 175, 164, 176, 227, 177, 36, 179, 99, 180, 164, 181, 227, 182, 36, 184, 99, 185, 164, 186, 227, 187, 36, 189, 99, 190, 164, 191, 227, 192, 36, 194, 99, 195, 164, 196, 227, 197, 36, 199, 99, 200, 164, 201, 227, 202, 36, 204, 99, 205, 164, 206, 227, 207, 36, 209, 99, 210, 164, 211, 227, 212, 36, 214, 99, 215, 164, 216, 227, 217, 36, 219, 99, 220, 164, 221, 227, 222, 36, 224, 99, 225, 164, 226, 227, 227, 36, 229, 99, 230, 164, 231, 227, 232, 36, 234, 99, 235, 164, 236, 227, 237, 36, 239, 99, 240, 164, 241, 227, 242, 36, 244, 99, 245, 164, 246, 227, 247, 36, 249, 99, 250, 164, 251, 227, 252, 36, 254, 99, 255, 164, 0, 227, 1, 36, 3, 99, 4, 164, 5, 227, 6, 36, 8, 99, 9, 164, 10, 227, 11, 36, 13, 99, 14, 164, 15, 227, 16, 36, 18, 99, 19, 164, 20, 227, 21, 36, 23, 99, 24, 164, 25, 227, 26, 36, 28, 99, 29, 164, 30, 227, 31, 36, 33, 99, 34, 164, 35, 227, 36, 36, 38, 99, 39, 164, 40, 227, 41, 36, 43, 99, 44, 164, 45, 227, 46, 36, 48, 99, 49, 164, 50, 227, 51, 36, 53, 99, 54, 164, 55, 227, 56, 36, 58, 99, 59, 164, 60, 227, 61, 36, 63, 99, 64, 164, 65, 227, 66, 36, 68, 99, 69, 164, 70, 227, 71, 36, 73, 99, 74, 164, 75, 227, 76, 36, 78, 99, 79, 164, 80, 227, 81, 36, 83, 99, 84, 164, 85, 227, 86, 36, 88, 99, 89, 164, 90, 227, 91, 36, 93, 99, 94, 164, 95, 227, 96, 36, 98, 99, 99, 164, 100, 227, 101, 36, 103, 99, 104, 164, 105, 227, 106, 36, 108, 99, 109, 164, 110, 227, 111, 36, 113, 99, 114, 164, 115, 227, 116, 36, 118, 99, 119, 164, 120, 227, 121, 36, 123, 99, 124, 164, 125, 227, 126, 36, 128, 99, 129, 164, 130, 227, 131, 36, 133, 99, 134, 164, 135, 227, 136, 36, 138, 99, 139, 164, 140, 227, 141, 36, 143, 99, 144, 164, 145, 227, 146, 36, 148, 99, 149, 164, 150, 227, 151, 36, 153, 99, 154, 164, 155, 227, 156, 36, 158, 99, 159, 164, 160, 227, 161, 36, 163, 99, 164, 164, 165, 227, 166, 36, 168, 99, 169, 164, 170, 227, 171, 36, 173, 99, 174, 164, 175, 227, 176, 36, 178, 99, 179, 164, 180, 227, 181, 36, 183, 99, 184, 164, 185, 227, 186, 36, 188, 99, 189, 164, 190, 227, 191, 36, 193, 99, 194, 164, 195, 227, 196, 36, 198, 99, 199, 164, 200, 227, 201, 36, 203, 99, 204, 164, 205, 227, 206, 36, 208, 99, 209, 164, 210, 227, 211, 36, 213, 99, 214, 164, 215, 227, 216, 36, 218, 99, 219, 164, 220, 227, 221, 36, 223, 99, 224, 164, 225, 227, 226, 36, 228, 99, 229, 164, 230, 227, 231, 36, 233, 99, 234, 164, 235, 227, 236, 36, 238, 99, 239, 164, 240, 227, 241, 36, 243, 99, 244, 164, 245, 227, 246, 36, 248, 99, 249, 164, 250, 227, 251, 36, 253, 99, 254, 164, 255, 227, 0, 36, 2, 99, 3, 164, 4, 227, 5, 36, 7, 99, 8, 164, 9, 227, 10, 36, 12, 99, 13, 164, 14, 227, 15, 36, 17, 99, 18, 164, 19, 227, 20, 36, 22, 99, 23, 164, 24, 227, 25, 36, 27, 99, 28, 164, 29, 227, 30, 36, 32, 99, 33, 164, 34, 227, 35, 36, 37, 99, 38, 164, 39, 227, 40, 36, 42, 99, 43, 164, 44, 227, 45, 36, 47, 99, 48, 164, 49, 227, 50, 36, 52, 99, 53, 164, 54, 227, 55, 36, 57, 99, 58, 164, 59, 227, 60, 36, 62, 99, 63, 164, 64, 227, 65, 36, 67, 99, 68, 164, 69, 227, 70, 36, 72, 99, 73, 164, 74, 227, 75, 36, 77, 99, 78, 164, 79, 227, 80, 36, 82, 99, 83, 164, 84, 227, 85, 36, 87, 99, 88, 164, 89, 227, 90, 36, 92, 99, 93, 164, 94, 227, 95, 36, 97, 99, 98, 164, 99, 227, 100, 36, 102, 99, 103, 164, 104, 227, 105, 36, 107, 99, 108, 164, 109, 227, 110, 36, 112, 99, 113, 164, 114, 227, 115, 36, 117, 99, 118, 164, 119, 227, 120, 36, 122, 99, 123, 164, 124, 227, 125, 36, 127, 99, 128, 164, 129, 227, 130, 36, 132, 99, 133, 164, 134, 227, 135, 36, 137, 99, 138, 164, 139, 227, 140, 36, 142, 99, 143, 164, 144, 227, 145, 36, 147, 99, 148, 164, 149, 227, 150, 36, 152, 99, 153, 164, 154, 227, 155, 36, 157, 99, 158, 164, 159, 227, 160, 36, 162, 99, 163, 164, 164, 227, 165, 36, 167, 99, 168, 164, 169, 227, 170, 36, 172, 99, 173, 164, 174, 227, 175, 36, 177, 99, 178, 164, 179, 227, 180, 36, 182, 99, 183, 164, 184, 227, 185, 36, 187, 99, 188, 164, 189, 227, 190, 36, 192, 99, 193, 164, 194, 227, 195, 36, 197, 99, 198, 164, 199, 227, 200, 36, 202, 99, 203, 164, 204, 227, 205, 36, 207, 99, 208, 164, 209, 227, 210, 36, 212, 99, 213, 164, 214, 227, 215, 36, 217, 99, 218, 164, 219, 227, 220, 36, 222, 99, 223, 164, 224, 227, 225, 36, 227, 99, 228, 164, 229, 227, 230, 36, 232, 99, 233, 164, 234, 227, 235, 36, 237, 99, 238, 164, 239, 227, 240, 36, 242, 99, 243, 164, 244, 227, 245, 36, 247, 99, 248, 164, 249, 227, 250, 36, 252, 99, 253, 164, 254, 227, 255, 36, 1, 99, 2, 164, 3, 227, 4, 36, 6, 99, 7, 164, 8, 227, 9, 36, 11, 99, 12, 164, 13, 227, 14, 36, 16, 99, 17, 164, 18, 227, 19, 36, 21, 99, 22, 164, 23, 227, 24, 36, 26, 99, 27, 164, 28, 227, 29, 36, 31, 99, 32, 164, 33, 227, 34, 36, 36, 99, 37, 164, 38, 227, 39, 36, 41, 99, 42, 164, 43, 227, 44, 36, 46, 99, 47, 164, 48, 227, 49, 36, 51, 99, 52, 1], [], [], [], [162, 0, 225, 1, 34, 3, 97, 4, 162, 5, 225, 6, 34, 8, 97, 9, 162, 10, 225, 11, 34, 13, 97, 14, 162, 15, 225, 16, 34, 18, 97, 19, 162, 20, 225, 21, 34, 23, 97, 24, 162, 25, 225, 26, 34, 28, 97, 29, 162, 30, 225, 31, 34, 33, 97, 34, 162, 35, 225, 36, 34, 38, 97, 39, 162, 40, 225, 41, 34, 43, 97, 44, 162, 45, 225, 46, 34, 48, 97, 49, 162, 50, 225, 51, 34, 53, 97, 54, 162, 55, 225, 56, 34, 58, 97, 59, 162, 60, 225, 61, 34, 63, 97, 64, 162, 65, 225, 66, 34, 68, 97, 69, 162, 70, 225, 71, 34, 73, 97, 74, 162, 75, 225, 76, 34, 78, 97, 79, 162, 80, 225, 81, 34, 83, 97, 84, 162, 85, 225, 86, 34, 88, 97, 89, 162, 90, 225, 91, 34, 93, 97, 94, 162, 95, 225, 96, 34, 98, 97, 99, 162, 100, 225, 101, 34, 103, 97, 104, 162, 105, 225, 106, 34, 108, 97, 109, 162, 110, 225, 111, 34, 113, 97, 114, 162, 115, 225, 116, 34, 118, 97, 119, 162, 120, 225, 121, 34, 123, 97, 124, 162, 125, 225, 126, 34, 128, 97, 129, 162, 130, 225, 131, 34, 133, 97, 134, 162, 135, 225, 136, 34, 138, 97, 139, 162, 140, 225, 141, 34, 143, 97, 144, 162, 145, 225, 146, 34, 148, 97, 149, 162, 150, 225, 151, 34, 153, 97, 154, 162, 155, 225, 156, 34, 158, 97, 159, 162, 160, 225, 161, 34, 163, 97, 164, 162, 165, 225, 166, 34, 168, 97, 169, 162, 170, 225, 171, 34, 173, 97, 174, 162, 175, 225, 176, 34, 178, 97, 179, 162, 180, 225, 181, 34, 183, 97, 184, 162, 185, 225, 186, 34, 188, 97, 189, 162, 190, 225, 191, 34, 193, 97, 194, 162, 195, 225, 196, 34, 198, 97, 199, 162, 200, 225, 201, 34, 203, 97, 204, 162, 205, 225, 206, 34, 208, 97, 209, 162, 210, 225, 211, 34, 213, 97, 214, 162, 215, 225, 216, 34, 218, 97, 219, 162, 220, 225, 221, 34, 223, 97, 224, 162, 225, 225, 226, 34, 228, 97, 229, 162, 230, 225, 231, 34, 233, 97, 234, 162, 235, 225, 236, 34, 238, 97, 239, 162, 240, 225, 241, 34, 243, 97, 244, 162, 245, 225, 246, 34, 248, 97, 249, 162, 250, 225, 251, 34, 253, 97, 254, 162, 255, 225, 0, 34, 2, 97, 3, 162, 4, 225, 5, 34, 7, 97, 8, 162, 9, 225, 10, 34, 12, 97, 13, 162, 14, 225, 15, 34, 17, 97, 18, 162, 19, 225, 20, 34, 22, 97, 23, 162, 24, 225, 25, 34, 27, 97, 28, 162, 29, 225, 30, 34, 32, 97, 33, 162, 34, 225, 35, 34, 37, 97, 38, 162, 39, 225, 40, 34, 42, 97, 43, 162, 44, 225, 45, 34, 47, 97, 48, 162, 49, 225, 50, 34, 52, 97, 53, 162, 54, 225, 55, 34, 57, 97, 58, 162, 59, 225, 60, 34, 62, 97, 63, 162, 64, 225, 65, 34, 67, 97, 68, 162, 69, 225, 70, 34, 72, 97, 73, 162, 74, 225, 75, 34, 77, 97, 78, 162, 79, 225, 80, 34, 82, 97, 83, 162, 84, 225, 85, 34, 87, 97, 88, 162, 89, 225, 90, 34, 92, 97, 93, 162, 94, 225, 95, 34, 97, 97, 98, 162, 99, 225, 100, 34, 102, 97, 103, 162, 104, 225, 105, 34, 107, 97, 108, 162, 109, 225, 110, 34, 112, 97, 113, 162, 114, 225, 115, 34, 117, 97, 118, 162, 119, 225, 120, 34, 122, 97, 123, 162, 124, 225, 125, 34, 127, 97, 128, 162, 129, 225, 130, 34, 132, 97, 133, 162, 134, 225, 135, 34, 137, 97, 138, 162, 139, 225, 140, 34, 142, 97, 143, 162, 144, 225, 145, 34, 147, 97, 148, 162, 149, 225, 150, 34, 152, 97, 153, 162, 154, 225, 155, 34, 157, 97, 158, 162, 159, 225, 160, 34, 162, 97, 163, 162, 164, 225, 165, 34, 167, 97, 168, 162, 169, 225, 170, 34, 172, 97, 173, 162, 174, 225, 175, 34, 177, 97, 178, 162, 179, 225, 180, 34, 182, 97, 183, 162, 184, 225, 185, 34, 187, 97, 188, 162, 189, 225, 190, 34, 192, 97, 193, 162, 194, 225, 195, 34, 197, 97, 198, 162, 199, 225, 200, 34, 202, 97, 203, 162, 204, 225, 205, 34, 207, 97, 208, 162, 209, 225, 210, 34, 212, 97, 213, 162, 214, 225, 215, 34, 217, 97, 218, 162, 219, 225, 220, 34, 222, 97, 223, 162, 224, 225, 225, 34, 227, 97, 228, 162, 229, 225, 230, 34, 232, 97, 233, 162, 234, 225, 235, 34, 237, 97, 238, 162, 239, 225, 240, 34, 242, 97, 243, 162, 244, 225, 245, 34, 247, 97, 248, 162, 249, 225, 250, 34, 252, 97, 253, 162, 254, 225, 255, 34, 1, 97, 2, 162, 3, 225, 4, 34, 6, 97, 7, 162, 8, 225, 9, 34, 11, 97, 12, 162, 13, 225, 14, 34, 16, 97, 17, 162, 18, 225, 19, 34, 21, 97, 22, 162, 23, 225, 24, 34, 26, 97, 27, 162, 28, 225, 29, 34, 31, 97, 32, 162, 33, 225, 34, 34, 36, 97, 37, 162, 38, 225, 39, 34, 41, 97, 42, 162, 43, 225, 44, 34, 46, 97, 47, 162, 48, 225, 49, 34, 51, 97, 52, 162, 53, 225, 54, 34, 56, 97, 57, 162, 58, 225, 59, 34, 61, 97, 62, 162, 63, 225, 64, 34, 66, 97, 67, 162, 68, 225, 69, 34, 71, 97, 72, 162, 73, 225, 74, 34, 76, 97, 77, 162, 78, 225, 79, 34, 81, 97, 82, 162, 83, 225, 84, 34, 86, 97, 87, 162, 88, 225, 89, 34, 91, 97, 92, 162, 93, 225, 94, 34, 96, 97, 97, 162, 98, 225, 99, 34, 101, 97, 102, 162, 103, 225, 104, 34, 106, 97, 107, 162, 108, 225, 109, 34, 111, 97, 112, 162, 113, 225, 114, 34, 116, 97, 117, 162, 118, 225, 119, 34, 121, 97, 122, 162, 123, 225, 124, 34, 126, 97, 127, 162, 128, 225, 129, 34, 131, 97, 132, 162, 133, 225, 134, 34, 136, 97, 137, 162, 138, 225, 139, 34, 141, 97, 142, 162, 143, 225, 144, 34, 146, 97, 147, 162, 148, 225, 149, 34, 151, 97, 152, 162, 153, 225, 154, 34, 156, 97, 157, 162, 158, 225, 159, 34, 161, 97, 162, 162, 163, 225, 164, 34, 166, 97, 167, 162, 168, 225, 169, 34, 171, 97, 172, 162, 173, 225, 174, 34, 176, 97, 177, 162, 178, 225, 179, 34, 181, 97, 182, 162, 183, 225, 184, 34, 186, 97, 187, 162, 188, 225, 189, 34, 191, 97, 192, 162, 193, 225, 194, 34, 196, 97, 197, 162, 198, 225, 199, 34, 201, 97, 202, 162, 203, 225, 204, 34, 206, 97, 207, 162, 208, 225, 209, 34, 211, 97, 212, 162, 213, 225, 214, 34, 216, 97, 217, 162, 218, 225, 219, 34, 221, 97, 222, 162, 223, 225, 224, 34, 226, 97, 227, 162, 228, 225, 229, 34, 231, 97, 232, 162, 233, 225, 234, 34, 236, 97, 237, 162, 238, 225, 239, 34, 241, 97, 242, 162, 243, 225, 244, 34, 246, 97, 247, 162, 248, 225, 249, 34, 251, 97, 252, 162, 253, 225, 254, 34, 0, 97, 1, 162, 2, 225, 3, 34, 5, 97, 6, 162, 7, 225, 8, 34, 10, 97, 11, 162, 12, 225, 13, 34, 15, 97, 16, 162, 17, 225, 18, 34, 20, 97, 21, 162, 22, 225, 23, 34, 25, 97, 26, 162, 27, 225, 28, 34, 30, 97, 31, 162, 32, 225, 33, 34, 35, 97, 36, 162, 37, 225, 38, 34, 40, 97, 41, 162, 42, 225, 43, 34, 45, 97, 46, 162, 47, 225, 48, 34, 50, 97, 51, 162, 52, 225, 53, 34, 55, 97, 56, 162, 57, 225, 58, 34, 60, 97, 61, 162, 62, 225, 63, 34, 65, 97, 66, 162, 67, 225, 68, 34, 70, 97, 71, 162, 72, 225, 73, 34, 75, 97, 76, 162, 77, 225, 78, 34, 80, 97, 81, 162, 82, 225, 83, 34, 85, 97, 86, 162, 87, 225, 88, 34, 90, 97, 91, 162, 92, 225, 93, 34, 95, 97, 96, 162, 97, 225, 98, 34, 100, 97, 101, 162, 102, 225, 103, 34, 105, 97, 106, 162, 107, 225, 108, 34, 110, 97, 111, 162, 112, 225, 113, 34, 115, 97, 116, 162, 117, 225, 118, 34, 120, 97, 121, 162, 122, 225, 123, 34, 125, 97, 126, 162, 127, 225, 128, 34, 130, 97, 131, 162, 132, 225, 133, 34, 135, 97, 136, 162, 137, 225, 138, 34, 140, 97, 141, 162, 142, 225, 143, 34, 145, 97, 146, 162, 147, 225, 148, 34, 150, 97, 151, 162, 152, 225, 153, 34, 155, 97, 156, 162, 157, 225, 158, 34, 160, 97, 161, 162, 162, 225, 163, 34, 165, 97, 166, 162, 167, 225, 168, 34, 170, 97, 171, 162, 172, 225, 173, 34, 175, 97, 176, 162, 177, 225, 178, 34, 180, 97, 181, 162, 182, 225, 183, 34, 185, 97, 186, 162, 187, 225, 188, 34, 190, 97, 191, 162, 192, 225, 193, 34, 195, 97, 196, 162, 197, 225, 198, 34, 200, 97, 201, 162, 202, 225, 203, 34, 205, 97, 206, 162, 207, 225, 208, 34, 210, 97, 211, 162, 212, 225, 213, 34, 215, 97, 216, 162, 217, 225, 218, 34, 220, 97, 221, 162, 222, 225, 223, 34, 225, 97, 226, 162, 227, 225, 228, 34, 230, 97, 231, 162, 232, 225, 233, 34, 235, 97, 236, 162, 237, 225, 238, 34, 240, 97, 241, 162, 242, 225, 243, 34, 245, 97, 246, 162, 247, 225, 248, 34, 250, 97, 251, 162, 252, 225, 253, 34, 255, 97, 0, 162, 1, 225, 2, 34, 4, 97, 5, 162, 6, 225, 7, 34, 9, 97, 10, 162, 11, 225, 12, 34, 14, 97, 15, 162, 16, 225, 17, 34, 19, 97, 20, 162, 21, 225, 22, 34, 24, 97, 25, 162, 26, 225, 27, 34, 29, 97, 30, 162, 31, 225, 32, 34, 34, 97, 35, 162, 36, 225, 37, 34, 39, 97, 40, 162, 41, 225, 42, 34, 44, 97, 45, 162, 46, 225, 47, 34, 49, 97, 50, 162, 51, 225, 52, 34, 54, 97, 55, 162, 56, 225, 57, 34, 59, 97, 60, 162, 61, 225, 62, 34, 64, 97, 65, 162, 66, 225, 67, 34, 69, 97, 70, 162, 71, 225, 72, 34, 74, 97, 75, 162, 76, 225, 77, 34, 79, 97, 80, 162, 81, 225, 82, 34, 84, 97, 85, 162, 86, 225, 87, 34, 89, 97, 90, 162, 91, 225, 92, 34, 94, 97, 95, 162, 96, 225, 97, 34, 99, 97, 100, 162, 101, 225, 102, 34, 104, 97, 105, 162, 106, 225, 107, 34, 109, 97, 110, 162, 111, 225, 112, 34, 114, 97, 115, 162, 116, 225, 117, 34, 119, 97, 120, 162, 121, 225, 122, 34, 124, 97, 125, 162, 126, 225, 127, 34, 129, 97, 130, 162, 131, 225, 132, 34, 134, 97, 135, 162, 136, 225, 137, 34, 139, 97, 140, 162, 141, 225, 142, 34, 144, 97, 145, 162, 146, 225, 147, 34, 149, 97, 150, 162, 151, 225, 152, 34, 154, 97, 155, 162, 156, 225, 157, 34, 159, 97, 160, 162, 161, 225, 162, 34, 164, 97, 165, 162, 166, 225, 167, 34, 169, 97, 170, 162, 171, 225, 172, 34, 174, 97, 175, 162, 176, 225, 177, 34, 179, 97, 180, 162, 181, 225, 182, 34, 184, 97, 185, 162, 186, 225, 187, 34, 189, 97, 190, 162, 191, 225, 192, 34, 194, 97, 195, 162, 196, 225, 197, 34, 199, 97, 200, 162, 201, 225, 202, 34, 204, 97, 205, 162, 206, 225, 207, 34, 209, 97, 210, 162, 211, 225, 212, 34, 214, 97, 215, 162, 216, 225, 217, 34, 219, 97, 220, 162, 221, 225, 222, 34, 224, 97, 225, 162, 226, 225, 227, 34, 229, 97, 230, 162, 231, 225, 232, 34, 234, 97, 235, 162, 236, 225, 237, 34, 239, 97, 240, 162, 241, 225, 242, 34, 244, 97, 245, 162, 246, 225, 247, 34, 249, 97, 250, 162, 251, 225, 252, 34, 254, 97, 255, 162, 0, 225, 1, 34, 3, 97, 4, 162, 5, 225, 6, 34, 8, 97, 9, 162, 10, 225, 11, 34, 13, 97, 14, 162, 15, 225, 16, 34, 18, 97, 19, 162, 20, 225, 21, 34, 23, 97, 24, 162, 25, 225, 26, 34, 28, 97, 29, 162, 30, 225, 31, 34, 33, 97, 34, 162, 35, 225, 36, 34, 38, 97, 39, 162, 40, 225, 41, 34, 43, 97, 44, 162, 45, 225, 46, 34, 48, 97, 49, 162, 50, 225, 51, 34, 53, 97, 54, 162, 55, 225, 56, 34, 58, 97, 59, 162, 60, 225, 61, 34, 63, 97, 64, 162, 65, 225, 66, 34, 68, 97, 69, 162, 70, 225, 71, 34, 73, 97, 74, 162, 75, 225, 76, 34, 78, 97, 79, 162, 80, 225, 81, 34, 83, 97, 84, 162, 85, 225, 86, 34, 88, 97, 89, 162, 90, 225, 91, 34, 93, 97, 94, 162, 95, 225, 96, 34, 98, 97, 99, 162, 100, 225, 101, 34, 103, 97, 104, 162, 105, 225, 106, 34, 108, 97, 109, 162, 110, 225, 111, 34, 113, 97, 114, 162, 115, 225, 116, 34, 118, 97, 119, 162, 120, 225, 121, 34, 123, 97, 124, 162, 125, 225, 126, 34, 128, 97, 129, 162, 130, 225, 131, 34, 133, 97, 134, 162, 135, 225, 136, 34, 138, 97, 139, 162, 140, 225, 141, 34, 143, 97, 144, 162, 145, 225, 146, 34, 148, 97, 149, 162, 150, 225, 151, 34, 153, 97, 154, 162, 155, 225, 156, 34, 158, 97, 159, 162, 160, 225, 161, 34, 163, 97, 164, 162, 165, 225, 166, 34, 168, 97, 169, 162, 170, 225, 171, 34, 173, 97, 174, 162, 175, 225, 176, 34, 178, 97, 179, 162, 180, 225, 181, 34, 183, 97, 184, 162, 185, 225, 186, 34, 188, 97, 189, 162, 190, 225, 191, 34, 193, 97, 194, 162, 195, 225, 196, 34, 198, 97, 199, 162, 200, 225, 201, 34, 203, 97, 204, 162, 205, 225, 206, 34, 208, 97, 209, 162, 210, 225, 211, 34, 213, 97, 214, 162, 215, 225, 216, 34, 218, 97, 219, 162, 220, 225, 221, 34, 223, 97, 224, 162, 225, 225, 226, 34, 228, 97, 229, 162, 230, 225, 231, 34, 233, 97, 234, 162, 235, 225, 236, 34, 238, 97, 239, 162, 240, 225, 241, 34, 243, 97, 244, 162, 245, 225, 246, 34, 248, 97, 249, 162, 250, 225, 251, 34, 253, 97, 254, 162, 255, 225, 0, 34, 2, 97, 3, 162, 4, 225, 5, 34, 7, 97, 8, 162, 9, 225, 10, 34, 12, 97, 13, 162, 14, 225, 15, 34, 17, 97, 18, 162, 19, 225, 20, 34, 22, 97, 23, 162, 24, 225, 25, 34, 27, 97, 28, 162, 29, 225, 30, 34, 32, 97, 33, 162, 34, 225, 35, 34, 37, 97, 38, 162, 39, 225, 40, 34, 42, 97, 43, 162, 44, 225, 45, 34, 47, 97, 48, 162, 49, 225, 50, 34, 52, 97, 53, 162, 54, 225, 55, 34, 57, 97, 58, 162, 59, 225, 60, 34, 62, 97, 63, 162, 64, 225, 65, 34, 67, 97, 68, 162, 69, 225, 70, 34, 72, 97, 73, 162, 74, 225, 75, 34, 77, 97, 78, 162, 79, 225, 80, 34, 82, 97, 83, 162, 84, 225, 85, 34, 87, 97, 88, 162, 89, 225, 90, 34, 92, 97, 93, 162, 94, 225, 95, 34, 97, 97, 98, 162, 99, 225, 100, 34, 102, 97, 103, 162, 104, 225, 105, 34, 107, 97, 108, 162, 109, 225, 110, 34, 112, 97, 113, 162, 114, 225, 115, 34, 117, 97, 118, 162, 119, 225, 120, 34, 122, 97, 123, 162, 124, 225, 125, 34, 127, 97, 128, 162, 129, 225, 130, 34, 132, 97, 133, 162, 134, 225, 135, 34, 137, 97, 138, 162, 139, 225, 140, 34, 142, 97, 143, 162, 144, 225, 145, 34, 147, 97, 148, 162, 149, 225, 150, 34, 152, 97, 153, 162, 154, 225, 155, 34, 157, 97, 158, 162, 159, 225, 160, 34, 162, 97, 163, 162, 164, 225, 165, 34, 167, 97, 168, 162, 169, 225, 170, 34, 172, 97, 173, 162, 174, 225, 175, 34, 177, 97, 178, 162, 179, 225, 180, 34, 182, 97, 183, 162, 184, 225, 185, 34, 187, 97, 188, 162, 189, 225, 190, 34, 192, 97, 193, 162, 194, 225, 195, 34, 197, 97, 198, 162, 199, 225, 200, 34, 202, 97, 203, 162, 204, 225, 205, 34, 207, 97, 208, 162, 209, 225, 210, 34, 212, 97, 213, 162, 214, 225, 215, 34, 217, 97, 218, 162, 219, 225, 220, 34, 222, 97, 223, 162, 224, 225, 225, 34, 227, 97, 228, 162, 229, 225, 230, 34, 232, 97, 233, 162, 234, 225, 235, 34, 237, 97, 238, 162, 239, 225, 240, 34, 242, 97, 243, 162, 244, 225, 245, 34, 247, 97, 248, 162, 249, 225, 250, 34, 252, 97, 253, 162, 254, 225, 255, 34, 1, 97, 2, 162, 3, 225, 4, 34, 6, 97, 7, 162, 8, 225, 9, 34, 11, 97, 12, 162, 13, 225, 14, 34, 16, 97, 17, 162, 18, 225, 19, 34, 21, 97, 22, 162, 23, 225, 24, 34, 26, 97, 27, 162, 28, 225, 29, 34, 31, 97, 32, 162, 33, 225, 34, 34, 36, 97, 37, 162, 38, 225, 39, 34, 41, 97, 42, 162, 43, 225, 44, 34, 46, 97, 47, 162, 48, 225, 49, 34, 51, 97, 52, 162, 53, 225, 54, 34, 56, 97, 57, 162, 58, 225, 59, 34, 61, 97, 62, 162, 63, 225, 64, 34, 66, 97, 67, 162, 68, 225, 69, 34, 71, 97, 72, 162, 73, 225, 74, 34, 76, 97, 77, 162, 78, 225, 79, 34, 81, 97, 82, 162, 83, 225, 84, 34, 86, 97, 87, 162, 88, 225, 89, 34, 91, 97, 92, 162, 93, 225, 94, 34, 96, 97, 97, 162, 98, 225, 99, 34, 101, 97, 102, 162, 103, 225, 104, 34, 106, 97, 107, 162, 108, 225, 109, 34, 111, 97, 112, 162, 113, 225, 114, 34, 116, 97, 117, 162, 118, 225, 119, 34, 121, 97, 122, 162, 123, 225, 124, 34, 126, 97, 127, 162, 128, 225, 129, 34, 131, 97, 132, 162, 133, 225, 134, 34, 136, 97, 137, 162, 138, 225, 139, 34, 141, 97, 142, 162, 143, 225, 144, 34, 146, 97, 147, 162, 148, 225, 149, 34, 151, 97, 152, 162, 153, 225, 154, 34, 156, 97, 157, 162, 158, 225, 159, 34, 161, 97, 162, 162, 163, 225, 164, 34, 166, 97, 167, 162, 168, 225, 169, 34, 171, 97, 172, 162, 173, 225, 174, 34, 176, 97, 177, 162, 178, 225, 179, 34, 181, 97, 182, 162, 183, 225, 184, 34, 186, 97, 187, 162, 188, 225, 189, 34, 191, 97, 192, 162, 193, 225, 194, 34, 196, 97, 197, 162, 198, 225, 199, 34, 201, 97, 202, 162, 203, 225, 204, 34, 206, 97, 207, 162, 208, 225, 209, 34, 211, 97, 212, 162, 213, 225, 214, 34, 216, 97, 217, 162, 218, 225, 219, 34, 221, 97, 222, 162, 223, 225, 224, 34, 226, 97, 227, 162, 228, 225, 229, 34, 231, 97, 232, 162, 233, 225, 234, 34, 236, 97, 237, 162, 238, 225, 239, 34, 241, 97, 242, 162, 243, 225, 244, 34, 246, 97, 247, 162, 248, 225, 249, 34, 251, 97, 252, 162, 253, 225, 254, 34, 0, 97, 1, 162, 2, 225, 3, 34, 5, 97, 6, 162, 7, 225, 8, 34, 10, 97, 11, 162, 12, 225, 13, 34, 15, 97, 16, 162, 17, 225, 18, 34, 20, 97, 21, 162, 22, 225, 23, 34, 25, 97, 26, 162, 27, 225, 28, 34, 30, 97, 31, 162, 32, 225, 33, 34, 35, 97, 36, 162, 37, 225, 38, 34, 40, 97, 41, 162, 42, 225, 43, 34, 45, 97, 46, 162, 47, 225, 48, 34, 50, 97, 51, 162, 52, 225, 53, 34, 55, 97, 56, 162, 57, 225, 58, 34, 60, 97, 61, 162, 62, 225, 63, 34, 65, 97, 66, 162, 67, 225, 68, 34, 70, 97, 71, 162, 72, 225, 73, 34, 75, 97, 76, 162, 77, 225, 78, 34, 80, 97, 81, 162, 82, 225, 83, 34, 85, 97, 86, 162, 87, 225, 88, 34, 90, 97, 91, 162, 92, 225, 93, 34, 95, 97, 96, 162, 97, 225, 98, 34, 100, 97, 101, 162, 102, 225, 103, 34, 105, 97, 106, 162, 107, 225, 108, 34, 110, 97, 111, 162, 112, 225, 113, 34, 115, 97, 116, 162, 117, 225, 118, 34, 120, 97, 121, 162, 122, 225, 123, 34, 125, 97, 126, 162, 127, 225, 128, 34, 130, 97, 131, 162, 132, 225, 133, 34, 135, 97, 136, 162, 137, 225, 138, 34, 140, 97, 141, 162, 142, 225, 143, 34, 145, 97, 146, 162, 147, 225, 148, 34, 150, 97, 151, 162, 152, 225, 153, 34, 155, 97, 156, 162, 157, 225, 158, 34, 160, 97, 161, 162, 162, 225, 163, 34, 165, 97, 166, 162, 167, 225, 168, 34, 170, 97, 171, 162, 172, 225, 173, 34, 175, 97, 176, 162, 177, 225, 178, 34, 180, 97, 181, 162, 182, 225, 183, 34, 185, 97, 186, 162, 187, 225, 188, 34, 190, 97, 191, 162, 192, 225, 193, 34, 195, 97, 196, 162, 197, 225, 198, 34, 200, 97, 201, 162, 202, 225, 203, 34, 205, 97, 206, 162, 207, 225, 208, 34, 210, 97, 211, 162, 212, 225, 213, 34, 215, 97, 216, 162, 217, 225, 218, 34, 220, 97, 221, 162, 222, 225, 223, 34, 225, 97, 226, 162, 227, 225, 228, 34, 230, 97, 231, 162, 232, 225, 233, 34, 235, 97, 236, 162, 237, 225, 238, 34, 240, 97, 241, 162, 242, 225, 243, 34, 245, 97, 246, 162, 247, 225, 248, 34, 250, 97, 251, 162, 252, 225, 253, 34, 255, 97, 0, 162, 1, 225, 2, 34, 4, 97, 5, 162, 6, 225, 7, 34, 9, 97, 10, 162, 11, 225, 12, 34, 14, 97, 15, 162, 16, 225, 17, 34, 19, 97, 20, 162, 21, 225, 22, 34, 24, 97, 25, 162, 26, 225, 27, 34, 29, 97, 30, 162, 31, 225, 32, 34, 34, 97, 35, 162, 36, 225, 37, 34, 39, 97, 40, 162, 41, 225, 42, 34, 44, 97, 45, 162, 46, 225, 47, 34, 49, 97, 50, 162, 51, 225, 52, 34, 54, 97, 55, 162, 56, 225, 57, 34, 59, 97, 60, 162, 61, 225, 62, 34, 64, 97, 65, 162, 66, 225, 67, 34, 69, 97, 70, 162, 71, 225, 72, 34, 74, 97, 75, 162, 76, 225, 77, 34, 79, 97, 80, 162, 81, 225, 82, 34, 84, 97, 85, 162, 86, 225, 87, 34, 89, 97, 90, 162, 91, 225, 92, 34, 94, 97, 95, 162, 96, 225, 97, 34, 99, 97, 100, 162, 101, 225, 102, 34, 104, 97, 105, 162, 106, 225, 107, 34, 109, 97, 110, 162, 111, 225, 112, 34, 114, 97, 115, 162, 116, 225, 117, 34, 119, 97, 120, 162, 121, 225, 122, 34, 124, 97, 125, 162, 126, 225, 127, 34, 129, 97, 130, 162, 131, 225, 132, 34, 134, 97, 135, 162, 136, 225, 137, 34, 139, 97, 140, 162, 141, 225, 142, 34, 144, 97, 145, 162, 146, 225, 147, 34, 149, 97, 150, 162, 151, 225, 152, 34, 154, 97, 155, 162, 156, 225, 157, 34, 159, 97, 160, 162, 161, 225, 162, 34, 164, 97, 165, 162, 166, 225, 167, 34, 169, 97, 170, 162, 171, 225, 172, 34, 174, 97, 175, 162, 176, 225, 177, 34, 179, 97, 180, 162, 181, 225, 182, 34, 184, 97, 185, 162, 186, 225, 187, 34, 189, 97, 190, 162, 191, 225, 192, 34, 194, 97, 195, 162, 196, 225, 197, 34, 199, 97, 200, 162, 201, 225, 202, 34, 204, 97, 205, 162, 206, 225, 207, 34, 209, 97, 210, 162, 211, 225, 212, 34, 214, 97, 215, 162, 216, 225, 217, 34, 219, 97, 220, 162, 221, 225, 222, 34, 224, 97, 225, 162, 226, 225, 227, 34, 229, 97, 230, 162, 231, 225, 232, 34, 234, 97, 235, 162, 236, 225, 237, 34, 239, 97, 240, 162, 241, 225, 242, 34, 244, 97, 245, 162, 246, 225, 247, 34, 249, 97, 250, 162, 251, 225, 252, 34, 254, 97, 255, 162, 0, 225, 1, 34, 3, 97, 4, 162, 5, 225, 6, 34, 8, 97, 9, 162, 10, 225, 11, 34, 13, 97, 14, 162, 15, 225, 16, 34, 18, 97, 19, 162, 20, 225, 21, 34, 23, 97, 24, 162, 25, 225, 26, 34, 28, 97, 29, 162, 30, 225, 31, 34, 33, 97, 34, 162, 35, 225, 36, 34, 38, 97, 39, 162, 40, 225, 41, 34, 43, 97, 44, 162, 45, 225, 46, 34, 48, 97, 49, 162, 50, 225, 51, 34, 53, 97, 54, 162, 55, 225, 56, 34, 58, 97, 59, 162, 60, 225, 61, 34, 63, 97, 64, 162, 65, 225, 66, 34, 68, 97, 69, 162, 70, 225, 71, 34, 73, 97, 74, 162, 75, 225, 76, 34, 78, 97, 79, 162, 80, 225, 81, 34, 83, 97, 84, 162, 85, 225, 86, 34, 88, 97, 89, 162, 90, 225, 91, 34, 93, 97, 94, 162, 95, 225, 96, 34, 98, 97, 99, 162, 100, 225, 101, 34, 103, 97, 104, 162, 105, 225, 106, 34, 108, 97, 109, 162, 110, 225, 111, 34, 113, 97, 114, 162, 115, 225, 116, 34, 118, 97, 119, 162, 120, 225, 121, 34, 123, 97, 124, 162, 125, 225, 126, 34, 128, 97, 129, 162, 130, 225, 131, 34, 133, 97, 134, 162, 135, 225, 136, 34, 138, 97, 139, 162, 140, 225, 141, 34, 143, 97, 144, 162, 145, 225, 146, 34, 148, 97, 149, 162, 150, 225, 151, 34, 153, 97, 154, 162, 155, 225, 156, 34, 158, 97, 159, 162, 160, 225, 161, 34, 163, 97, 164, 162, 165, 225, 166, 34, 168, 97, 169, 162, 170, 225, 171, 34, 173, 97, 174, 162, 175, 225, 176, 34, 178, 97, 179, 162, 180, 225, 181, 34, 183, 97, 184, 162, 185, 225, 186, 34, 188, 97, 189, 162, 190, 225, 191, 34, 193, 97, 194, 162, 195, 225, 196, 34, 198, 97, 199, 162, 200, 225, 201, 34, 203, 97, 204, 162, 205, 225, 206, 34, 208, 97, 209, 162, 210, 225, 211, 34, 213, 97, 214, 162, 215, 225, 216, 34, 218, 97, 219, 162, 220, 225, 221, 34, 223, 97, 224, 162, 225, 225, 226, 34, 228, 97, 229, 162, 230, 225, 231, 34, 233, 97, 234, 162, 235, 225, 236, 34, 238, 97, 239, 162, 240, 225, 241, 34, 243, 97, 244, 162, 245, 225, 246, 34, 248, 97, 249, 162, 250, 225, 251, 34, 253, 97, 254, 162, 255, 225, 0, 34, 2, 97, 3, 162, 4, 225, 5, 34, 7, 97, 8, 162, 9, 225, 10, 34, 12, 97, 13, 162, 14, 225, 15, 34, 17, 97, 18, 162, 19, 225, 20, 34, 22, 97, 23, 162, 24, 225, 25, 34, 27, 97, 28, 162, 29, 225, 30, 34, 32, 97, 33, 162, 34, 225, 35, 34, 37, 97, 38, 162, 39, 225, 40, 34, 42, 97, 43, 162, 44, 225, 45, 34, 47, 97, 48, 162, 49, 225, 50, 34, 52, 97, 53, 162, 54, 225, 55, 34, 57, 97, 58, 162, 59, 225, 60, 34, 62, 97, 63, 162, 64, 225, 65, 34, 67, 97, 68, 162, 69, 225, 70, 34, 72, 97, 73, 162, 74, 225, 75, 34, 77, 97, 78, 162, 79, 225, 80, 34, 82, 97, 83, 162, 84, 225, 85, 34, 87, 97, 88, 162, 89, 225, 90, 34, 92, 97, 93, 162, 94, 225, 95, 34, 97, 97, 98, 162, 99, 225, 100, 34, 102, 97, 103, 162, 104, 225, 105, 34, 107, 97, 108, 162, 109, 225, 110, 34, 112, 97, 113, 162, 114, 225, 115, 34, 117, 97, 118, 162, 119, 225, 120, 34, 122, 97, 123, 162, 124, 225, 125, 34, 127, 97, 128, 162, 129, 225, 130, 34, 132, 97, 133, 162, 134, 225, 135, 34, 137, 97, 138, 162, 139, 225, 140, 34, 142, 97, 143, 162, 144, 225, 145, 34, 147, 97, 148, 162, 149, 225, 150, 34, 152, 97, 153, 162, 154, 225, 155, 34, 157, 97, 158, 162, 159, 225, 160, 34, 162, 97, 163, 162, 164, 225, 165, 34, 167, 97, 168, 162, 169, 225, 170, 34, 172, 97, 173, 162, 174, 225, 175, 34, 177, 97, 178, 162, 179, 225, 180, 34, 182, 97, 183, 162, 184, 225, 185, 34, 187, 97, 188, 162, 189, 225, 190, 34, 192, 97, 193, 162, 194, 225, 195, 34, 197, 97, 198, 162, 199, 225, 200, 34, 202, 97, 203, 162, 204, 225, 205, 34, 207, 97, 208, 162, 209, 225, 210, 34, 212, 97, 213, 162, 214, 225, 215, 34, 217, 97, 218, 162, 219, 225, 220, 34, 222, 97, 223, 162, 224, 225, 225, 34, 227, 97, 228, 162, 229, 225, 230, 34, 232, 97, 233, 162, 234, 225, 235, 34, 237, 97, 238, 162, 239, 225, 240, 34, 242, 97, 243, 162, 244, 225, 245, 34, 247, 97, 248, 162, 249, 225, 250, 34, 252, 97, 253, 162, 254, 225, 255, 34, 1, 97, 2, 162, 3, 225, 4, 34, 6, 97, 7, 162, 8, 225, 9, 34, 11, 97, 12, 162, 13, 225, 14, 34, 16, 97, 17, 162, 18, 225, 19, 34, 21, 97, 22, 162, 23, 225, 24, 34, 26, 97, 27, 162, 28, 225, 29, 34, 31, 97, 32, 162, 33, 225, 34, 34, 36, 97, 37, 162, 38, 225, 39, 34, 41, 97, 42, 162, 43, 225, 44, 34, 46, 97, 47, 162, 48, 225, 49, 34, 51, 97, 52, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_four_low_frequency.json b/tests/recordings/logic_analyzer/test_capture_four_low_frequency.json deleted file mode 100644 index c6a49764..00000000 --- a/tests/recordings/logic_analyzer/test_capture_four_low_frequency.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [6], [196, 9], [17, 17], [1], [4], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [162, 27, 234, 183, 34, 84, 106, 240, 162, 140, 234, 40, 34, 197, 106, 97, 162, 253, 234, 153, 34, 54, 106, 210, 162, 110, 234, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [162, 27, 234, 183, 34, 84, 106, 240, 162, 140, 234, 40, 34, 197, 106, 97, 162, 253, 234, 153, 34, 54, 106, 210, 162, 110, 234, 10, 34, 167, 106, 67, 162, 223, 234, 123, 34, 24, 106, 180, 162, 80, 234, 236, 34, 137, 106, 37, 162, 193, 234, 93, 34, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [162, 27, 234, 183, 34, 84, 106, 240, 162, 140, 234, 40, 34, 197, 106, 97, 162, 253, 234, 153, 34, 54, 106, 210, 162, 110, 234, 10, 34, 167, 106, 67, 162, 223, 234, 123, 34, 24, 106, 180, 162, 80, 234, 236, 34, 137, 106, 37, 162, 193, 234, 93, 34, 250, 106, 150, 162, 50, 234, 206, 34, 107, 106, 7, 162, 163, 234, 63, 34, 220, 106, 120, 162, 20, 234, 176, 34, 77, 106, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [162, 27, 234, 183, 34, 84, 106, 240, 162, 140, 234, 40, 34, 197, 106, 97, 162, 253, 234, 153, 34, 54, 106, 210, 162, 110, 234, 10, 34, 167, 106, 67, 162, 223, 234, 123, 34, 24, 106, 180, 162, 80, 234, 236, 34, 137, 106, 37, 162, 193, 234, 93, 34, 250, 106, 150, 162, 50, 234, 206, 34, 107, 106, 7, 162, 163, 234, 63, 34, 220, 106, 120, 162, 20, 234, 176, 34, 77, 106, 233, 162, 133, 234, 33, 34, 190, 106, 90, 162, 246, 234, 146, 34, 47, 106, 203, 162, 103, 234, 3, 34, 160, 106, 60, 162, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [162, 27, 234, 183, 34, 84, 106, 240, 162, 140, 234, 40, 34, 197, 106, 97, 162, 253, 234, 153, 34, 54, 106, 210, 162, 110, 234, 10, 34, 167, 106, 67, 162, 223, 234, 123, 34, 24, 106, 180, 162, 80, 234, 236, 34, 137, 106, 37, 162, 193, 234, 93, 34, 250, 106, 150, 162, 50, 234, 206, 34, 107, 106, 7, 162, 163, 234, 63, 34, 220, 106, 120, 162, 20, 234, 176, 34, 77, 106, 233, 162, 133, 234, 33, 34, 190, 106, 90, 162, 246, 234, 146, 34, 47, 106, 203, 162, 103, 234, 3, 34, 160, 106, 60, 162, 216, 234, 116, 34, 17, 106, 173, 162, 73, 234, 229, 34, 130, 106, 30, 162, 186, 234, 86, 34, 243, 106, 143, 162, 43, 234, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [162, 27, 234, 183, 34, 84, 106, 240, 162, 140, 234, 40, 34, 197, 106, 97, 162, 253, 234, 153, 34, 54, 106, 210, 162, 110, 234, 10, 34, 167, 106, 67, 162, 223, 234, 123, 34, 24, 106, 180, 162, 80, 234, 236, 34, 137, 106, 37, 162, 193, 234, 93, 34, 250, 106, 150, 162, 50, 234, 206, 34, 107, 106, 7, 162, 163, 234, 63, 34, 220, 106, 120, 162, 20, 234, 176, 34, 77, 106, 233, 162, 133, 234, 33, 34, 190, 106, 90, 162, 246, 234, 146, 34, 47, 106, 203, 162, 103, 234, 3, 34, 160, 106, 60, 162, 216, 234, 116, 34, 17, 106, 173, 162, 73, 234, 229, 34, 130, 106, 30, 162, 186, 234, 86, 34, 243, 106, 143, 162, 43, 234, 199, 34, 100, 106, 0, 162, 156, 234, 56, 34, 213, 106, 113, 162, 13, 234, 169, 34, 70, 106, 226, 162, 126, 234, 26, 34, 183, 106, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [162, 27, 234, 183, 34, 84, 106, 240, 162, 140, 234, 40, 34, 197, 106, 97, 162, 253, 234, 153, 34, 54, 106, 210, 162, 110, 234, 10, 34, 167, 106, 67, 162, 223, 234, 123, 34, 24, 106, 180, 162, 80, 234, 236, 34, 137, 106, 37, 162, 193, 234, 93, 34, 250, 106, 150, 162, 50, 234, 206, 34, 107, 106, 7, 162, 163, 234, 63, 34, 220, 106, 120, 162, 20, 234, 176, 34, 77, 106, 233, 162, 133, 234, 33, 34, 190, 106, 90, 162, 246, 234, 146, 34, 47, 106, 203, 162, 103, 234, 3, 34, 160, 106, 60, 162, 216, 234, 116, 34, 17, 106, 173, 162, 73, 234, 229, 34, 130, 106, 30, 162, 186, 234, 86, 34, 243, 106, 143, 162, 43, 234, 199, 34, 100, 106, 0, 162, 156, 234, 56, 34, 213, 106, 113, 162, 13, 234, 169, 34, 70, 106, 226, 162, 126, 234, 26, 34, 183, 106, 83, 162, 239, 234, 139, 34, 40, 106, 196, 162, 96, 234, 252, 34, 153, 106, 53, 162, 209, 234, 109, 34, 10, 106, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_four_lower_frequency.json b/tests/recordings/logic_analyzer/test_capture_four_lower_frequency.json deleted file mode 100644 index b6d24547..00000000 --- a/tests/recordings/logic_analyzer/test_capture_four_lower_frequency.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [6], [196, 9], [51, 51], [2], [4], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [5, 24, 21, 63, 37, 102, 53, 141, 69, 180, 85, 219, 101, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [5, 24, 21, 63, 37, 102, 53, 141, 69, 180, 85, 219, 101, 2, 117, 41, 133, 80, 149, 119, 165, 158, 181, 197, 197, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [5, 24, 21, 63, 37, 102, 53, 141, 69, 180, 85, 219, 101, 2, 117, 41, 133, 80, 149, 119, 165, 158, 181, 197, 197, 236, 213, 19, 229, 58, 245, 97, 5, 137, 21, 176, 37, 215, 53, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [5, 24, 21, 63, 37, 102, 53, 141, 69, 180, 85, 219, 101, 2, 117, 41, 133, 80, 149, 119, 165, 158, 181, 197, 197, 236, 213, 19, 229, 58, 245, 97, 5, 137, 21, 176, 37, 215, 53, 254, 69, 37, 85, 76, 101, 115, 117, 154, 133, 193, 149, 232, 165, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [5, 24, 21, 63, 37, 102, 53, 141, 69, 180, 85, 219, 101, 2, 117, 41, 133, 80, 149, 119, 165, 158, 181, 197, 197, 236, 213, 19, 229, 58, 245, 97, 5, 137, 21, 176, 37, 215, 53, 254, 69, 37, 85, 76, 101, 115, 117, 154, 133, 193, 149, 232, 165, 15, 181, 54, 197, 93, 213, 132, 229, 171, 245, 210, 5, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [5, 24, 21, 63, 37, 102, 53, 141, 69, 180, 85, 219, 101, 2, 117, 41, 133, 80, 149, 119, 165, 158, 181, 197, 197, 236, 213, 19, 229, 58, 245, 97, 5, 137, 21, 176, 37, 215, 53, 254, 69, 37, 85, 76, 101, 115, 117, 154, 133, 193, 149, 232, 165, 15, 181, 54, 197, 93, 213, 132, 229, 171, 245, 210, 5, 250, 21, 33, 37, 72, 53, 111, 69, 150, 85, 189, 101, 228, 117, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [5, 24, 21, 63, 37, 102, 53, 141, 69, 180, 85, 219, 101, 2, 117, 41, 133, 80, 149, 119, 165, 158, 181, 197, 197, 236, 213, 19, 229, 58, 245, 97, 5, 137, 21, 176, 37, 215, 53, 254, 69, 37, 85, 76, 101, 115, 117, 154, 133, 193, 149, 232, 165, 15, 181, 54, 197, 93, 213, 132, 229, 171, 245, 210, 5, 250, 21, 33, 37, 72, 53, 111, 69, 150, 85, 189, 101, 228, 117, 11, 133, 50, 149, 89, 165, 128, 181, 167, 197, 206, 213, 245, 229, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_four_lowest_frequency.json b/tests/recordings/logic_analyzer/test_capture_four_lowest_frequency.json deleted file mode 100644 index 5df7825c..00000000 --- a/tests/recordings/logic_analyzer/test_capture_four_lowest_frequency.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [6], [196, 9], [85, 85], [3], [4], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9], [11], [8], [0, 0], [196, 9], [11], [8], [196, 9], [196, 9], [11], [8], [136, 19], [196, 9], [11], [8], [76, 29], [196, 9]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 188, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 188, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 188, 22, 252, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 188, 22, 252, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 188, 22, 252, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 188, 22, 252, 178, 60, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [], [], [], [124, 152, 188, 52, 252, 208, 60, 109, 124, 9, 188, 165, 252, 65, 60, 222, 124, 122, 188, 22, 252, 178, 60, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_four_rising_edges.json b/tests/recordings/logic_analyzer/test_capture_four_rising_edges.json deleted file mode 100644 index e09c9f88..00000000 --- a/tests/recordings/logic_analyzer/test_capture_four_rising_edges.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [5], [196, 9], [0], [67], [16], [10], [9], [196, 9], [0], [10], [9], [196, 9], [1]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [69, 0, 0, 0, 197, 2, 0, 0, 69, 5, 0, 0, 197, 7, 0, 0, 69, 10, 0, 0, 197, 12, 0, 0, 69, 15, 0, 0, 197, 17, 0, 0, 69, 20, 0, 0, 197, 22, 0, 0, 69, 25, 0, 0, 197, 27, 0, 0, 69, 30, 0, 0, 197, 32, 0, 0, 69, 35, 0, 0, 197, 37, 0, 0, 69, 40, 0, 0, 197, 42, 0, 0, 69, 45, 0, 0, 197, 47, 0, 0, 69, 50, 0, 0, 197, 52, 0, 0, 69, 55, 0, 0, 197, 57, 0, 0, 69, 60, 0, 0, 197, 62, 0, 0, 69, 65, 0, 0, 197, 67, 0, 0, 69, 70, 0, 0, 197, 72, 0, 0, 69, 75, 0, 0, 197, 77, 0, 0, 69, 80, 0, 0, 197, 82, 0, 0, 69, 85, 0, 0, 197, 87, 0, 0, 69, 90, 0, 0, 197, 92, 0, 0, 69, 95, 0, 0, 197, 97, 0, 0, 69, 100, 0, 0, 197, 102, 0, 0, 69, 105, 0, 0, 197, 107, 0, 0, 69, 110, 0, 0, 197, 112, 0, 0, 69, 115, 0, 0, 197, 117, 0, 0, 69, 120, 0, 0, 197, 122, 0, 0, 69, 125, 0, 0, 197, 127, 0, 0, 69, 130, 0, 0, 197, 132, 0, 0, 69, 135, 0, 0, 197, 137, 0, 0, 69, 140, 0, 0, 197, 142, 0, 0, 69, 145, 0, 0, 197, 147, 0, 0, 69, 150, 0, 0, 197, 152, 0, 0, 69, 155, 0, 0, 197, 157, 0, 0, 69, 160, 0, 0, 197, 162, 0, 0, 69, 165, 0, 0, 197, 167, 0, 0, 69, 170, 0, 0, 197, 172, 0, 0, 69, 175, 0, 0, 197, 177, 0, 0, 69, 180, 0, 0, 197, 182, 0, 0, 69, 185, 0, 0, 197, 187, 0, 0, 69, 190, 0, 0, 197, 192, 0, 0, 69, 195, 0, 0, 197, 197, 0, 0, 69, 200, 0, 0, 197, 202, 0, 0, 69, 205, 0, 0, 197, 207, 0, 0, 69, 210, 0, 0, 197, 212, 0, 0, 69, 215, 0, 0, 197, 217, 0, 0, 69, 220, 0, 0, 197, 222, 0, 0, 69, 225, 0, 0, 197, 227, 0, 0, 69, 230, 0, 0, 197, 232, 0, 0, 69, 235, 0, 0, 197, 237, 0, 0, 69, 240, 0, 0, 197, 242, 0, 0, 69, 245, 0, 0, 197, 247, 0, 0, 69, 250, 0, 0, 197, 252, 0, 0, 69, 255, 0, 0, 197, 1, 1, 0, 69, 4, 1, 0, 197, 6, 1, 0, 69, 9, 1, 0, 197, 11, 1, 0, 69, 14, 1, 0, 197, 16, 1, 0, 69, 19, 1, 0, 197, 21, 1, 0, 69, 24, 1, 0, 197, 26, 1, 0, 69, 29, 1, 0, 197, 31, 1, 0, 69, 34, 1, 0, 197, 36, 1, 0, 69, 39, 1, 0, 197, 41, 1, 0, 69, 44, 1, 0, 197, 46, 1, 0, 69, 49, 1, 0, 197, 51, 1, 0, 69, 54, 1, 0, 197, 56, 1, 0, 69, 59, 1, 0, 197, 61, 1, 0, 69, 64, 1, 0, 197, 66, 1, 0, 69, 69, 1, 0, 197, 71, 1, 0, 69, 74, 1, 0, 197, 76, 1, 0, 69, 79, 1, 0, 197, 81, 1, 0, 69, 84, 1, 0, 197, 86, 1, 0, 69, 89, 1, 0, 197, 91, 1, 0, 69, 94, 1, 0, 197, 96, 1, 0, 69, 99, 1, 0, 197, 101, 1, 0, 69, 104, 1, 0, 197, 106, 1, 0, 69, 109, 1, 0, 197, 111, 1, 0, 69, 114, 1, 0, 197, 116, 1, 0, 69, 119, 1, 0, 197, 121, 1, 0, 69, 124, 1, 0, 197, 126, 1, 0, 69, 129, 1, 0, 197, 131, 1, 0, 69, 134, 1, 0, 197, 136, 1, 0, 69, 139, 1, 0, 197, 141, 1, 0, 69, 144, 1, 0, 197, 146, 1, 0, 69, 149, 1, 0, 197, 151, 1, 0, 69, 154, 1, 0, 197, 156, 1, 0, 69, 159, 1, 0, 197, 161, 1, 0, 69, 164, 1, 0, 197, 166, 1, 0, 69, 169, 1, 0, 197, 171, 1, 0, 69, 174, 1, 0, 197, 176, 1, 0, 69, 179, 1, 0, 197, 181, 1, 0, 69, 184, 1, 0, 197, 186, 1, 0, 69, 189, 1, 0, 197, 191, 1, 0, 69, 194, 1, 0, 197, 196, 1, 0, 69, 199, 1, 0, 197, 201, 1, 0, 69, 204, 1, 0, 197, 206, 1, 0, 69, 209, 1, 0, 197, 211, 1, 0, 69, 214, 1, 0, 197, 216, 1, 0, 69, 219, 1, 0, 197, 221, 1, 0, 69, 224, 1, 0, 197, 226, 1, 0, 69, 229, 1, 0, 197, 231, 1, 0, 69, 234, 1, 0, 197, 236, 1, 0, 69, 239, 1, 0, 197, 241, 1, 0, 69, 244, 1, 0, 197, 246, 1, 0, 69, 249, 1, 0, 197, 251, 1, 0, 69, 254, 1, 0, 197, 0, 2, 0, 69, 3, 2, 0, 197, 5, 2, 0, 69, 8, 2, 0, 197, 10, 2, 0, 69, 13, 2, 0, 197, 15, 2, 0, 69, 18, 2, 0, 197, 20, 2, 0, 69, 23, 2, 0, 197, 25, 2, 0, 69, 28, 2, 0, 197, 30, 2, 0, 69, 33, 2, 0, 197, 35, 2, 0, 69, 38, 2, 0, 197, 40, 2, 0, 69, 43, 2, 0, 197, 45, 2, 0, 69, 48, 2, 0, 197, 50, 2, 0, 69, 53, 2, 0, 197, 55, 2, 0, 69, 58, 2, 0, 197, 60, 2, 0, 69, 63, 2, 0, 197, 65, 2, 0, 69, 68, 2, 0, 197, 70, 2, 0, 69, 73, 2, 0, 197, 75, 2, 0, 69, 78, 2, 0, 197, 80, 2, 0, 69, 83, 2, 0, 197, 85, 2, 0, 69, 88, 2, 0, 197, 90, 2, 0, 69, 93, 2, 0, 197, 95, 2, 0, 69, 98, 2, 0, 197, 100, 2, 0, 69, 103, 2, 0, 197, 105, 2, 0, 69, 108, 2, 0, 197, 110, 2, 0, 69, 113, 2, 0, 197, 115, 2, 0, 69, 118, 2, 0, 197, 120, 2, 0, 69, 123, 2, 0, 197, 125, 2, 0, 69, 128, 2, 0, 197, 130, 2, 0, 69, 133, 2, 0, 197, 135, 2, 0, 69, 138, 2, 0, 197, 140, 2, 0, 69, 143, 2, 0, 197, 145, 2, 0, 69, 148, 2, 0, 197, 150, 2, 0, 69, 153, 2, 0, 197, 155, 2, 0, 69, 158, 2, 0, 197, 160, 2, 0, 69, 163, 2, 0, 197, 165, 2, 0, 69, 168, 2, 0, 197, 170, 2, 0, 69, 173, 2, 0, 197, 175, 2, 0, 69, 178, 2, 0, 197, 180, 2, 0, 69, 183, 2, 0, 197, 185, 2, 0, 69, 188, 2, 0, 197, 190, 2, 0, 69, 193, 2, 0, 197, 195, 2, 0, 69, 198, 2, 0, 197, 200, 2, 0, 69, 203, 2, 0, 197, 205, 2, 0, 69, 208, 2, 0, 197, 210, 2, 0, 69, 213, 2, 0, 197, 215, 2, 0, 69, 218, 2, 0, 197, 220, 2, 0, 69, 223, 2, 0, 197, 225, 2, 0, 69, 228, 2, 0, 197, 230, 2, 0, 69, 233, 2, 0, 197, 235, 2, 0, 69, 238, 2, 0, 197, 240, 2, 0, 69, 243, 2, 0, 197, 245, 2, 0, 69, 248, 2, 0, 197, 250, 2, 0, 69, 253, 2, 0, 197, 255, 2, 0, 69, 2, 3, 0, 197, 4, 3, 0, 69, 7, 3, 0, 197, 9, 3, 0, 69, 12, 3, 0, 197, 14, 3, 0, 69, 17, 3, 0, 197, 19, 3, 0, 69, 22, 3, 0, 197, 24, 3, 0, 69, 27, 3, 0, 197, 29, 3, 0, 69, 32, 3, 0, 197, 34, 3, 0, 69, 37, 3, 0, 197, 39, 3, 0, 69, 42, 3, 0, 197, 44, 3, 0, 69, 47, 3, 0, 197, 49, 3, 0, 69, 52, 3, 0, 197, 54, 3, 0, 69, 57, 3, 0, 197, 59, 3, 0, 69, 62, 3, 0, 197, 64, 3, 0, 69, 67, 3, 0, 197, 69, 3, 0, 69, 72, 3, 0, 197, 74, 3, 0, 69, 77, 3, 0, 197, 79, 3, 0, 69, 82, 3, 0, 197, 84, 3, 0, 69, 87, 3, 0, 197, 89, 3, 0, 69, 92, 3, 0, 197, 94, 3, 0, 69, 97, 3, 0, 197, 99, 3, 0, 69, 102, 3, 0, 197, 104, 3, 0, 69, 107, 3, 0, 197, 109, 3, 0, 69, 112, 3, 0, 197, 114, 3, 0, 69, 117, 3, 0, 197, 119, 3, 0, 69, 122, 3, 0, 197, 124, 3, 0, 69, 127, 3, 0, 197, 129, 3, 0, 69, 132, 3, 0, 197, 134, 3, 0, 69, 137, 3, 0, 197, 139, 3, 0, 69, 142, 3, 0, 197, 144, 3, 0, 69, 147, 3, 0, 197, 149, 3, 0, 69, 152, 3, 0, 197, 154, 3, 0, 69, 157, 3, 0, 197, 159, 3, 0, 69, 162, 3, 0, 197, 164, 3, 0, 69, 167, 3, 0, 197, 169, 3, 0, 69, 172, 3, 0, 197, 174, 3, 0, 69, 177, 3, 0, 197, 179, 3, 0, 69, 182, 3, 0, 197, 184, 3, 0, 69, 187, 3, 0, 197, 189, 3, 0, 69, 192, 3, 0, 197, 194, 3, 0, 69, 197, 3, 0, 197, 199, 3, 0, 69, 202, 3, 0, 197, 204, 3, 0, 69, 207, 3, 0, 197, 209, 3, 0, 69, 212, 3, 0, 197, 214, 3, 0, 69, 217, 3, 0, 197, 219, 3, 0, 69, 222, 3, 0, 197, 224, 3, 0, 69, 227, 3, 0, 197, 229, 3, 0, 69, 232, 3, 0, 197, 234, 3, 0, 69, 237, 3, 0, 197, 239, 3, 0, 69, 242, 3, 0, 197, 244, 3, 0, 69, 247, 3, 0, 197, 249, 3, 0, 69, 252, 3, 0, 197, 254, 3, 0, 69, 1, 4, 0, 197, 3, 4, 0, 69, 6, 4, 0, 197, 8, 4, 0, 69, 11, 4, 0, 197, 13, 4, 0, 69, 16, 4, 0, 197, 18, 4, 0, 69, 21, 4, 0, 197, 23, 4, 0, 69, 26, 4, 0, 197, 28, 4, 0, 69, 31, 4, 0, 197, 33, 4, 0, 69, 36, 4, 0, 197, 38, 4, 0, 69, 41, 4, 0, 197, 43, 4, 0, 69, 46, 4, 0, 197, 48, 4, 0, 69, 51, 4, 0, 197, 53, 4, 0, 69, 56, 4, 0, 197, 58, 4, 0, 69, 61, 4, 0, 197, 63, 4, 0, 69, 66, 4, 0, 197, 68, 4, 0, 69, 71, 4, 0, 197, 73, 4, 0, 69, 76, 4, 0, 197, 78, 4, 0, 69, 81, 4, 0, 197, 83, 4, 0, 69, 86, 4, 0, 197, 88, 4, 0, 69, 91, 4, 0, 197, 93, 4, 0, 69, 96, 4, 0, 197, 98, 4, 0, 69, 101, 4, 0, 197, 103, 4, 0, 69, 106, 4, 0, 197, 108, 4, 0, 69, 111, 4, 0, 197, 113, 4, 0, 69, 116, 4, 0, 197, 118, 4, 0, 69, 121, 4, 0, 197, 123, 4, 0, 69, 126, 4, 0, 197, 128, 4, 0, 69, 131, 4, 0, 197, 133, 4, 0, 69, 136, 4, 0, 197, 138, 4, 0, 69, 141, 4, 0, 197, 143, 4, 0, 69, 146, 4, 0, 197, 148, 4, 0, 69, 151, 4, 0, 197, 153, 4, 0, 69, 156, 4, 0, 197, 158, 4, 0, 69, 161, 4, 0, 197, 163, 4, 0, 69, 166, 4, 0, 197, 168, 4, 0, 69, 171, 4, 0, 197, 173, 4, 0, 69, 176, 4, 0, 197, 178, 4, 0, 69, 181, 4, 0, 197, 183, 4, 0, 69, 186, 4, 0, 197, 188, 4, 0, 69, 191, 4, 0, 197, 193, 4, 0, 69, 196, 4, 0, 197, 198, 4, 0, 69, 201, 4, 0, 197, 203, 4, 0, 69, 206, 4, 0, 197, 208, 4, 0, 69, 211, 4, 0, 197, 213, 4, 0, 69, 216, 4, 0, 197, 218, 4, 0, 69, 221, 4, 0, 197, 223, 4, 0, 69, 226, 4, 0, 197, 228, 4, 0, 69, 231, 4, 0, 197, 233, 4, 0, 69, 236, 4, 0, 197, 238, 4, 0, 69, 241, 4, 0, 197, 243, 4, 0, 69, 246, 4, 0, 197, 248, 4, 0, 69, 251, 4, 0, 197, 253, 4, 0, 69, 0, 5, 0, 197, 2, 5, 0, 69, 5, 5, 0, 197, 7, 5, 0, 69, 10, 5, 0, 197, 12, 5, 0, 69, 15, 5, 0, 197, 17, 5, 0, 69, 20, 5, 0, 197, 22, 5, 0, 69, 25, 5, 0, 197, 27, 5, 0, 69, 30, 5, 0, 197, 32, 5, 0, 69, 35, 5, 0, 197, 37, 5, 0, 69, 40, 5, 0, 197, 42, 5, 0, 69, 45, 5, 0, 197, 47, 5, 0, 69, 50, 5, 0, 197, 52, 5, 0, 69, 55, 5, 0, 197, 57, 5, 0, 69, 60, 5, 0, 197, 62, 5, 0, 69, 65, 5, 0, 197, 67, 5, 0, 69, 70, 5, 0, 197, 72, 5, 0, 69, 75, 5, 0, 197, 77, 5, 0, 69, 80, 5, 0, 197, 82, 5, 0, 69, 85, 5, 0, 197, 87, 5, 0, 69, 90, 5, 0, 197, 92, 5, 0, 69, 95, 5, 0, 197, 97, 5, 0, 69, 100, 5, 0, 197, 102, 5, 0, 69, 105, 5, 0, 197, 107, 5, 0, 69, 110, 5, 0, 197, 112, 5, 0, 69, 115, 5, 0, 197, 117, 5, 0, 69, 120, 5, 0, 197, 122, 5, 0, 69, 125, 5, 0, 197, 127, 5, 0, 69, 130, 5, 0, 197, 132, 5, 0, 69, 135, 5, 0, 197, 137, 5, 0, 69, 140, 5, 0, 197, 142, 5, 0, 69, 145, 5, 0, 197, 147, 5, 0, 69, 150, 5, 0, 197, 152, 5, 0, 69, 155, 5, 0, 197, 157, 5, 0, 69, 160, 5, 0, 197, 162, 5, 0, 69, 165, 5, 0, 197, 167, 5, 0, 69, 170, 5, 0, 197, 172, 5, 0, 69, 175, 5, 0, 197, 177, 5, 0, 69, 180, 5, 0, 197, 182, 5, 0, 69, 185, 5, 0, 197, 187, 5, 0, 69, 190, 5, 0, 197, 192, 5, 0, 69, 195, 5, 0, 197, 197, 5, 0, 69, 200, 5, 0, 197, 202, 5, 0, 69, 205, 5, 0, 197, 207, 5, 0, 69, 210, 5, 0, 197, 212, 5, 0, 69, 215, 5, 0, 197, 217, 5, 0, 69, 220, 5, 0, 197, 222, 5, 0, 69, 225, 5, 0, 197, 227, 5, 0, 69, 230, 5, 0, 197, 232, 5, 0, 69, 235, 5, 0, 197, 237, 5, 0, 69, 240, 5, 0, 197, 242, 5, 0, 69, 245, 5, 0, 197, 247, 5, 0, 69, 250, 5, 0, 197, 252, 5, 0, 69, 255, 5, 0, 197, 1, 6, 0, 69, 4, 6, 0, 197, 6, 6, 0, 69, 9, 6, 0, 197, 11, 6, 0, 69, 14, 6, 0, 197, 16, 6, 0, 69, 19, 6, 0, 197, 21, 6, 0, 69, 24, 6, 0, 197, 26, 6, 0, 69, 29, 6, 0, 197, 31, 6, 0, 69, 34, 6, 0, 197, 36, 6, 0, 69, 39, 6, 0, 197, 41, 6, 0, 69, 44, 6, 0, 197, 46, 6, 0, 69, 49, 6, 0, 197, 51, 6, 0, 69, 54, 6, 0, 197, 56, 6, 0, 69, 59, 6, 0, 197, 61, 6, 0, 69, 64, 6, 0, 197, 66, 6, 0, 69, 69, 6, 0, 197, 71, 6, 0, 69, 74, 6, 0, 197, 76, 6, 0, 69, 79, 6, 0, 197, 81, 6, 0, 69, 84, 6, 0, 197, 86, 6, 0, 69, 89, 6, 0, 197, 91, 6, 0, 69, 94, 6, 0, 197, 96, 6, 0, 69, 99, 6, 0, 197, 101, 6, 0, 69, 104, 6, 0, 197, 106, 6, 0, 69, 109, 6, 0, 197, 111, 6, 0, 69, 114, 6, 0, 197, 116, 6, 0, 69, 119, 6, 0, 197, 121, 6, 0, 69, 124, 6, 0, 197, 126, 6, 0, 69, 129, 6, 0, 197, 131, 6, 0, 69, 134, 6, 0, 197, 136, 6, 0, 69, 139, 6, 0, 197, 141, 6, 0, 69, 144, 6, 0, 197, 146, 6, 0, 69, 149, 6, 0, 197, 151, 6, 0, 69, 154, 6, 0, 197, 156, 6, 0, 69, 159, 6, 0, 197, 161, 6, 0, 69, 164, 6, 0, 197, 166, 6, 0, 69, 169, 6, 0, 197, 171, 6, 0, 69, 174, 6, 0, 197, 176, 6, 0, 69, 179, 6, 0, 197, 181, 6, 0, 69, 184, 6, 0, 197, 186, 6, 0, 69, 189, 6, 0, 197, 191, 6, 0, 69, 194, 6, 0, 197, 196, 6, 0, 69, 199, 6, 0, 197, 201, 6, 0, 69, 204, 6, 0, 197, 206, 6, 0, 69, 209, 6, 0, 197, 211, 6, 0, 69, 214, 6, 0, 197, 216, 6, 0, 69, 219, 6, 0, 197, 221, 6, 0, 69, 224, 6, 0, 197, 226, 6, 0, 69, 229, 6, 0, 197, 231, 6, 0, 69, 234, 6, 0, 197, 236, 6, 0, 69, 239, 6, 0, 197, 241, 6, 0, 69, 244, 6, 0, 197, 246, 6, 0, 69, 249, 6, 0, 197, 251, 6, 0, 69, 254, 6, 0, 197, 0, 7, 0, 69, 3, 7, 0, 197, 5, 7, 0, 69, 8, 7, 0, 197, 10, 7, 0, 69, 13, 7, 0, 197, 15, 7, 0, 69, 18, 7, 0, 197, 20, 7, 0, 69, 23, 7, 0, 197, 25, 7, 0, 69, 28, 7, 0, 197, 30, 7, 0, 69, 33, 7, 0, 197, 35, 7, 0, 69, 38, 7, 0, 197, 40, 7, 0, 69, 43, 7, 0, 197, 45, 7, 0, 69, 48, 7, 0, 197, 50, 7, 0, 69, 53, 7, 0, 197, 55, 7, 0, 69, 58, 7, 0, 197, 60, 7, 0, 69, 63, 7, 0, 197, 65, 7, 0, 69, 68, 7, 0, 197, 70, 7, 0, 69, 73, 7, 0, 197, 75, 7, 0, 69, 78, 7, 0, 197, 80, 7, 0, 69, 83, 7, 0, 197, 85, 7, 0, 69, 88, 7, 0, 197, 90, 7, 0, 69, 93, 7, 0, 197, 95, 7, 0, 69, 98, 7, 0, 197, 100, 7, 0, 69, 103, 7, 0, 197, 105, 7, 0, 69, 108, 7, 0, 197, 110, 7, 0, 69, 113, 7, 0, 197, 115, 7, 0, 69, 118, 7, 0, 197, 120, 7, 0, 69, 123, 7, 0, 197, 125, 7, 0, 69, 128, 7, 0, 197, 130, 7, 0, 69, 133, 7, 0, 197, 135, 7, 0, 69, 138, 7, 0, 197, 140, 7, 0, 69, 143, 7, 0, 197, 145, 7, 0, 69, 148, 7, 0, 197, 150, 7, 0, 69, 153, 7, 0, 197, 155, 7, 0, 69, 158, 7, 0, 197, 160, 7, 0, 69, 163, 7, 0, 197, 165, 7, 0, 69, 168, 7, 0, 197, 170, 7, 0, 69, 173, 7, 0, 197, 175, 7, 0, 69, 178, 7, 0, 197, 180, 7, 0, 69, 183, 7, 0, 197, 185, 7, 0, 69, 188, 7, 0, 197, 190, 7, 0, 69, 193, 7, 0, 197, 195, 7, 0, 69, 198, 7, 0, 197, 200, 7, 0, 69, 203, 7, 0, 197, 205, 7, 0, 69, 208, 7, 0, 197, 210, 7, 0, 69, 213, 7, 0, 197, 215, 7, 0, 69, 218, 7, 0, 197, 220, 7, 0, 69, 223, 7, 0, 197, 225, 7, 0, 69, 228, 7, 0, 197, 230, 7, 0, 69, 233, 7, 0, 197, 235, 7, 0, 69, 238, 7, 0, 197, 240, 7, 0, 69, 243, 7, 0, 197, 245, 7, 0, 69, 248, 7, 0, 197, 250, 7, 0, 69, 253, 7, 0, 197, 255, 7, 0, 69, 2, 8, 0, 197, 4, 8, 0, 69, 7, 8, 0, 197, 9, 8, 0, 69, 12, 8, 0, 197, 14, 8, 0, 69, 17, 8, 0, 197, 19, 8, 0, 69, 22, 8, 0, 197, 24, 8, 0, 69, 27, 8, 0, 197, 29, 8, 0, 69, 32, 8, 0, 197, 34, 8, 0, 69, 37, 8, 0, 197, 39, 8, 0, 69, 42, 8, 0, 197, 44, 8, 0, 69, 47, 8, 0, 197, 49, 8, 0, 69, 52, 8, 0, 197, 54, 8, 0, 69, 57, 8, 0, 197, 59, 8, 0, 69, 62, 8, 0, 197, 64, 8, 0, 69, 67, 8, 0, 197, 69, 8, 0, 69, 72, 8, 0, 197, 74, 8, 0, 69, 77, 8, 0, 197, 79, 8, 0, 69, 82, 8, 0, 197, 84, 8, 0, 69, 87, 8, 0, 197, 89, 8, 0, 69, 92, 8, 0, 197, 94, 8, 0, 69, 97, 8, 0, 197, 99, 8, 0, 69, 102, 8, 0, 197, 104, 8, 0, 69, 107, 8, 0, 197, 109, 8, 0, 69, 112, 8, 0, 197, 114, 8, 0, 69, 117, 8, 0, 197, 119, 8, 0, 69, 122, 8, 0, 197, 124, 8, 0, 69, 127, 8, 0, 197, 129, 8, 0, 69, 132, 8, 0, 197, 134, 8, 0, 69, 137, 8, 0, 197, 139, 8, 0, 69, 142, 8, 0, 197, 144, 8, 0, 69, 147, 8, 0, 197, 149, 8, 0, 69, 152, 8, 0, 197, 154, 8, 0, 69, 157, 8, 0, 197, 159, 8, 0, 69, 162, 8, 0, 197, 164, 8, 0, 69, 167, 8, 0, 197, 169, 8, 0, 69, 172, 8, 0, 197, 174, 8, 0, 69, 177, 8, 0, 197, 179, 8, 0, 69, 182, 8, 0, 197, 184, 8, 0, 69, 187, 8, 0, 197, 189, 8, 0, 69, 192, 8, 0, 197, 194, 8, 0, 69, 197, 8, 0, 197, 199, 8, 0, 69, 202, 8, 0, 197, 204, 8, 0, 69, 207, 8, 0, 197, 209, 8, 0, 69, 212, 8, 0, 197, 214, 8, 0, 69, 217, 8, 0, 197, 219, 8, 0, 69, 222, 8, 0, 197, 224, 8, 0, 69, 227, 8, 0, 197, 229, 8, 0, 69, 232, 8, 0, 197, 234, 8, 0, 69, 237, 8, 0, 197, 239, 8, 0, 69, 242, 8, 0, 197, 244, 8, 0, 69, 247, 8, 0, 197, 249, 8, 0, 69, 252, 8, 0, 197, 254, 8, 0, 69, 1, 9, 0, 197, 3, 9, 0, 69, 6, 9, 0, 197, 8, 9, 0, 69, 11, 9, 0, 197, 13, 9, 0, 69, 16, 9, 0, 197, 18, 9, 0, 69, 21, 9, 0, 197, 23, 9, 0, 69, 26, 9, 0, 197, 28, 9, 0, 69, 31, 9, 0, 197, 33, 9, 0, 69, 36, 9, 0, 197, 38, 9, 0, 69, 41, 9, 0, 197, 43, 9, 0, 69, 46, 9, 0, 197, 48, 9, 0, 69, 51, 9, 0, 197, 53, 9, 0, 69, 56, 9, 0, 197, 58, 9, 0, 69, 61, 9, 0, 197, 63, 9, 0, 69, 66, 9, 0, 197, 68, 9, 0, 69, 71, 9, 0, 197, 73, 9, 0, 69, 76, 9, 0, 197, 78, 9, 0, 69, 81, 9, 0, 197, 83, 9, 0, 69, 86, 9, 0, 197, 88, 9, 0, 69, 91, 9, 0, 197, 93, 9, 0, 69, 96, 9, 0, 197, 98, 9, 0, 69, 101, 9, 0, 197, 103, 9, 0, 69, 106, 9, 0, 197, 108, 9, 0, 69, 111, 9, 0, 197, 113, 9, 0, 69, 116, 9, 0, 197, 118, 9, 0, 69, 121, 9, 0, 197, 123, 9, 0, 69, 126, 9, 0, 197, 128, 9, 0, 69, 131, 9, 0, 197, 133, 9, 0, 69, 136, 9, 0, 197, 138, 9, 0, 69, 141, 9, 0, 197, 143, 9, 0, 69, 146, 9, 0, 197, 148, 9, 0, 69, 151, 9, 0, 197, 153, 9, 0, 69, 156, 9, 0, 197, 158, 9, 0, 69, 161, 9, 0, 197, 163, 9, 0, 69, 166, 9, 0, 197, 168, 9, 0, 69, 171, 9, 0, 197, 173, 9, 0, 69, 176, 9, 0, 197, 178, 9, 0, 69, 181, 9, 0, 197, 183, 9, 0, 69, 186, 9, 0, 197, 188, 9, 0, 69, 191, 9, 0, 197, 193, 9, 0, 69, 196, 9, 0, 197, 198, 9, 0, 69, 201, 9, 0, 197, 203, 9, 0, 69, 206, 9, 0, 197, 208, 9, 0, 69, 211, 9, 0, 197, 213, 9, 0, 69, 216, 9, 0, 197, 218, 9, 0, 69, 221, 9, 0, 197, 223, 9, 0, 69, 226, 9, 0, 197, 228, 9, 0, 69, 231, 9, 0, 197, 233, 9, 0, 69, 236, 9, 0, 197, 238, 9, 0, 69, 241, 9, 0, 197, 243, 9, 0, 69, 246, 9, 0, 197, 248, 9, 0, 69, 251, 9, 0, 197, 253, 9, 0, 69, 0, 10, 0, 197, 2, 10, 0, 69, 5, 10, 0, 197, 7, 10, 0, 69, 10, 10, 0, 197, 12, 10, 0, 69, 15, 10, 0, 197, 17, 10, 0, 69, 20, 10, 0, 197, 22, 10, 0, 69, 25, 10, 0, 197, 27, 10, 0, 69, 30, 10, 0, 197, 32, 10, 0, 69, 35, 10, 0, 197, 37, 10, 0, 69, 40, 10, 0, 197, 42, 10, 0, 69, 45, 10, 0, 197, 47, 10, 0, 69, 50, 10, 0, 197, 52, 10, 0, 69, 55, 10, 0, 197, 57, 10, 0, 69, 60, 10, 0, 197, 62, 10, 0, 69, 65, 10, 0, 197, 67, 10, 0, 69, 70, 10, 0, 197, 72, 10, 0, 69, 75, 10, 0, 197, 77, 10, 0, 69, 80, 10, 0, 197, 82, 10, 0, 69, 85, 10, 0, 197, 87, 10, 0, 69, 90, 10, 0, 197, 92, 10, 0, 69, 95, 10, 0, 197, 97, 10, 0, 69, 100, 10, 0, 197, 102, 10, 0, 69, 105, 10, 0, 197, 107, 10, 0, 69, 110, 10, 0, 197, 112, 10, 0, 69, 115, 10, 0, 197, 117, 10, 0, 69, 120, 10, 0, 197, 122, 10, 0, 69, 125, 10, 0, 197, 127, 10, 0, 69, 130, 10, 0, 197, 132, 10, 0, 69, 135, 10, 0, 197, 137, 10, 0, 69, 140, 10, 0, 197, 142, 10, 0, 69, 145, 10, 0, 197, 147, 10, 0, 69, 150, 10, 0, 197, 152, 10, 0, 69, 155, 10, 0, 197, 157, 10, 0, 69, 160, 10, 0, 197, 162, 10, 0, 69, 165, 10, 0, 197, 167, 10, 0, 69, 170, 10, 0, 197, 172, 10, 0, 69, 175, 10, 0, 197, 177, 10, 0, 69, 180, 10, 0, 197, 182, 10, 0, 69, 185, 10, 0, 197, 187, 10, 0, 69, 190, 10, 0, 197, 192, 10, 0, 69, 195, 10, 0, 197, 197, 10, 0, 69, 200, 10, 0, 197, 202, 10, 0, 69, 205, 10, 0, 197, 207, 10, 0, 69, 210, 10, 0, 197, 212, 10, 0, 69, 215, 10, 0, 197, 217, 10, 0, 69, 220, 10, 0, 197, 222, 10, 0, 69, 225, 10, 0, 197, 227, 10, 0, 69, 230, 10, 0, 197, 232, 10, 0, 69, 235, 10, 0, 197, 237, 10, 0, 69, 240, 10, 0, 197, 242, 10, 0, 69, 245, 10, 0, 197, 247, 10, 0, 69, 250, 10, 0, 197, 252, 10, 0, 69, 255, 10, 0, 197, 1, 11, 0, 69, 4, 11, 0, 197, 6, 11, 0, 69, 9, 11, 0, 197, 11, 11, 0, 69, 14, 11, 0, 197, 16, 11, 0, 69, 19, 11, 0, 197, 21, 11, 0, 69, 24, 11, 0, 197, 26, 11, 0, 69, 29, 11, 0, 197, 31, 11, 0, 69, 34, 11, 0, 197, 36, 11, 0, 69, 39, 11, 0, 197, 41, 11, 0, 69, 44, 11, 0, 197, 46, 11, 0, 69, 49, 11, 0, 197, 51, 11, 0, 69, 54, 11, 0, 197, 56, 11, 0, 69, 59, 11, 0, 197, 61, 11, 0, 69, 64, 11, 0, 197, 66, 11, 0, 69, 69, 11, 0, 197, 71, 11, 0, 69, 74, 11, 0, 197, 76, 11, 0, 69, 79, 11, 0, 197, 81, 11, 0, 69, 84, 11, 0, 197, 86, 11, 0, 69, 89, 11, 0, 197, 91, 11, 0, 69, 94, 11, 0, 197, 96, 11, 0, 69, 99, 11, 0, 197, 101, 11, 0, 69, 104, 11, 0, 197, 106, 11, 0, 69, 109, 11, 0, 197, 111, 11, 0, 69, 114, 11, 0, 197, 116, 11, 0, 69, 119, 11, 0, 197, 121, 11, 0, 69, 124, 11, 0, 197, 126, 11, 0, 69, 129, 11, 0, 197, 131, 11, 0, 69, 134, 11, 0, 197, 136, 11, 0, 69, 139, 11, 0, 197, 141, 11, 0, 69, 144, 11, 0, 197, 146, 11, 0, 69, 149, 11, 0, 197, 151, 11, 0, 69, 154, 11, 0, 197, 156, 11, 0, 69, 159, 11, 0, 197, 161, 11, 0, 69, 164, 11, 0, 197, 166, 11, 0, 69, 169, 11, 0, 197, 171, 11, 0, 69, 174, 11, 0, 197, 176, 11, 0, 69, 179, 11, 0, 197, 181, 11, 0, 69, 184, 11, 0, 197, 186, 11, 0, 69, 189, 11, 0, 197, 191, 11, 0, 69, 194, 11, 0, 197, 196, 11, 0, 69, 199, 11, 0, 197, 201, 11, 0, 69, 204, 11, 0, 197, 206, 11, 0, 69, 209, 11, 0, 197, 211, 11, 0, 69, 214, 11, 0, 197, 216, 11, 0, 69, 219, 11, 0, 197, 221, 11, 0, 69, 224, 11, 0, 197, 226, 11, 0, 69, 229, 11, 0, 197, 231, 11, 0, 69, 234, 11, 0, 197, 236, 11, 0, 69, 239, 11, 0, 197, 241, 11, 0, 69, 244, 11, 0, 197, 246, 11, 0, 69, 249, 11, 0, 197, 251, 11, 0, 69, 254, 11, 0, 197, 0, 12, 0, 69, 3, 12, 0, 197, 5, 12, 0, 69, 8, 12, 0, 197, 10, 12, 0, 69, 13, 12, 0, 197, 15, 12, 0, 69, 18, 12, 0, 197, 20, 12, 0, 69, 23, 12, 0, 197, 25, 12, 0, 69, 28, 12, 0, 197, 30, 12, 0, 69, 33, 12, 0, 197, 35, 12, 0, 69, 38, 12, 0, 197, 40, 12, 0, 69, 43, 12, 0, 197, 45, 12, 0, 69, 48, 12, 0, 197, 50, 12, 0, 69, 53, 12, 0, 197, 55, 12, 0, 69, 58, 12, 0, 197, 60, 12, 0, 69, 63, 12, 0, 197, 65, 12, 0, 69, 68, 12, 0, 197, 70, 12, 0, 69, 73, 12, 0, 197, 75, 12, 0, 69, 78, 12, 0, 197, 80, 12, 0, 69, 83, 12, 0, 197, 85, 12, 0, 69, 88, 12, 0, 197, 90, 12, 0, 69, 93, 12, 0, 197, 95, 12, 0, 69, 98, 12, 0, 197, 100, 12, 0, 69, 103, 12, 0, 197, 105, 12, 0, 69, 108, 12, 0, 197, 110, 12, 0, 69, 113, 12, 0, 197, 115, 12, 0, 69, 118, 12, 0, 197, 120, 12, 0, 69, 123, 12, 0, 197, 125, 12, 0, 69, 128, 12, 0, 197, 130, 12, 0, 69, 133, 12, 0, 197, 135, 12, 0, 69, 138, 12, 0, 197, 140, 12, 0, 69, 143, 12, 0, 197, 145, 12, 0, 69, 148, 12, 0, 197, 150, 12, 0, 69, 153, 12, 0, 197, 155, 12, 0, 69, 158, 12, 0, 197, 160, 12, 0, 69, 163, 12, 0, 197, 165, 12, 0, 69, 168, 12, 0, 197, 170, 12, 0, 69, 173, 12, 0, 197, 175, 12, 0, 69, 178, 12, 0, 197, 180, 12, 0, 69, 183, 12, 0, 197, 185, 12, 0, 69, 188, 12, 0, 197, 190, 12, 0, 69, 193, 12, 0, 197, 195, 12, 0, 69, 198, 12, 0, 197, 200, 12, 0, 69, 203, 12, 0, 197, 205, 12, 0, 69, 208, 12, 0, 197, 210, 12, 0, 69, 213, 12, 0, 197, 215, 12, 0, 69, 218, 12, 0, 197, 220, 12, 0, 69, 223, 12, 0, 197, 225, 12, 0, 69, 228, 12, 0, 197, 230, 12, 0, 69, 233, 12, 0, 197, 235, 12, 0, 69, 238, 12, 0, 197, 240, 12, 0, 69, 243, 12, 0, 197, 245, 12, 0, 69, 248, 12, 0, 197, 250, 12, 0, 69, 253, 12, 0, 197, 255, 12, 0, 69, 2, 13, 0, 197, 4, 13, 0, 69, 7, 13, 0, 197, 9, 13, 0, 69, 12, 13, 0, 197, 14, 13, 0, 69, 17, 13, 0, 197, 19, 13, 0, 69, 22, 13, 0, 197, 24, 13, 0, 69, 27, 13, 0, 197, 29, 13, 0, 69, 32, 13, 0, 197, 34, 13, 0, 69, 37, 13, 0, 197, 39, 13, 0, 69, 42, 13, 0, 197, 44, 13, 0, 69, 47, 13, 0, 197, 49, 13, 0, 69, 52, 13, 0, 197, 54, 13, 0, 69, 57, 13, 0, 197, 59, 13, 0, 69, 62, 13, 0, 197, 64, 13, 0, 69, 67, 13, 0, 197, 69, 13, 0, 69, 72, 13, 0, 197, 74, 13, 0, 69, 77, 13, 0, 197, 79, 13, 0, 69, 82, 13, 0, 197, 84, 13, 0, 69, 87, 13, 0, 197, 89, 13, 0, 69, 92, 13, 0, 197, 94, 13, 0, 69, 97, 13, 0, 197, 99, 13, 0, 69, 102, 13, 0, 197, 104, 13, 0, 69, 107, 13, 0, 197, 109, 13, 0, 69, 112, 13, 0, 197, 114, 13, 0, 69, 117, 13, 0, 197, 119, 13, 0, 69, 122, 13, 0, 197, 124, 13, 0, 69, 127, 13, 0, 197, 129, 13, 0, 69, 132, 13, 0, 197, 134, 13, 0, 69, 137, 13, 0, 197, 139, 13, 0, 69, 142, 13, 0, 197, 144, 13, 0, 69, 147, 13, 0, 197, 149, 13, 0, 69, 152, 13, 0, 197, 154, 13, 0, 69, 157, 13, 0, 197, 159, 13, 0, 69, 162, 13, 0, 197, 164, 13, 0, 69, 167, 13, 0, 197, 169, 13, 0, 69, 172, 13, 0, 197, 174, 13, 0, 69, 177, 13, 0, 197, 179, 13, 0, 69, 182, 13, 0, 197, 184, 13, 0, 69, 187, 13, 0, 197, 189, 13, 0, 69, 192, 13, 0, 197, 194, 13, 0, 69, 197, 13, 0, 197, 199, 13, 0, 69, 202, 13, 0, 197, 204, 13, 0, 69, 207, 13, 0, 197, 209, 13, 0, 69, 212, 13, 0, 197, 214, 13, 0, 69, 217, 13, 0, 197, 219, 13, 0, 69, 222, 13, 0, 197, 224, 13, 0, 69, 227, 13, 0, 197, 229, 13, 0, 69, 232, 13, 0, 197, 234, 13, 0, 69, 237, 13, 0, 197, 239, 13, 0, 69, 242, 13, 0, 197, 244, 13, 0, 69, 247, 13, 0, 197, 249, 13, 0, 69, 252, 13, 0, 197, 254, 13, 0, 69, 1, 14, 0, 197, 3, 14, 0, 69, 6, 14, 0, 197, 8, 14, 0, 69, 11, 14, 0, 197, 13, 14, 0, 69, 16, 14, 0, 197, 18, 14, 0, 69, 21, 14, 0, 197, 23, 14, 0, 69, 26, 14, 0, 197, 28, 14, 0, 69, 31, 14, 0, 197, 33, 14, 0, 69, 36, 14, 0, 197, 38, 14, 0, 69, 41, 14, 0, 197, 43, 14, 0, 69, 46, 14, 0, 197, 48, 14, 0, 69, 51, 14, 0, 197, 53, 14, 0, 69, 56, 14, 0, 197, 58, 14, 0, 69, 61, 14, 0, 197, 63, 14, 0, 69, 66, 14, 0, 197, 68, 14, 0, 69, 71, 14, 0, 197, 73, 14, 0, 69, 76, 14, 0, 197, 78, 14, 0, 69, 81, 14, 0, 197, 83, 14, 0, 69, 86, 14, 0, 197, 88, 14, 0, 69, 91, 14, 0, 197, 93, 14, 0, 69, 96, 14, 0, 197, 98, 14, 0, 69, 101, 14, 0, 197, 103, 14, 0, 69, 106, 14, 0, 197, 108, 14, 0, 69, 111, 14, 0, 197, 113, 14, 0, 69, 116, 14, 0, 197, 118, 14, 0, 69, 121, 14, 0, 197, 123, 14, 0, 69, 126, 14, 0, 197, 128, 14, 0, 69, 131, 14, 0, 197, 133, 14, 0, 69, 136, 14, 0, 197, 138, 14, 0, 69, 141, 14, 0, 197, 143, 14, 0, 69, 146, 14, 0, 197, 148, 14, 0, 69, 151, 14, 0, 197, 153, 14, 0, 69, 156, 14, 0, 197, 158, 14, 0, 69, 161, 14, 0, 197, 163, 14, 0, 69, 166, 14, 0, 197, 168, 14, 0, 69, 171, 14, 0, 197, 173, 14, 0, 69, 176, 14, 0, 197, 178, 14, 0, 69, 181, 14, 0, 197, 183, 14, 0, 69, 186, 14, 0, 197, 188, 14, 0, 69, 191, 14, 0, 197, 193, 14, 0, 69, 196, 14, 0, 197, 198, 14, 0, 69, 201, 14, 0, 197, 203, 14, 0, 69, 206, 14, 0, 197, 208, 14, 0, 69, 211, 14, 0, 197, 213, 14, 0, 69, 216, 14, 0, 197, 218, 14, 0, 69, 221, 14, 0, 197, 223, 14, 0, 69, 226, 14, 0, 197, 228, 14, 0, 69, 231, 14, 0, 197, 233, 14, 0, 69, 236, 14, 0, 197, 238, 14, 0, 69, 241, 14, 0, 197, 243, 14, 0, 69, 246, 14, 0, 197, 248, 14, 0, 69, 251, 14, 0, 197, 253, 14, 0, 69, 0, 15, 0, 197, 2, 15, 0, 69, 5, 15, 0, 197, 7, 15, 0, 69, 10, 15, 0, 197, 12, 15, 0, 69, 15, 15, 0, 197, 17, 15, 0, 69, 20, 15, 0, 197, 22, 15, 0, 69, 25, 15, 0, 197, 27, 15, 0, 69, 30, 15, 0, 197, 32, 15, 0, 69, 35, 15, 0, 197, 37, 15, 0, 69, 40, 15, 0, 197, 42, 15, 0, 69, 45, 15, 0, 197, 47, 15, 0, 69, 50, 15, 0, 197, 52, 15, 0, 69, 55, 15, 0, 197, 57, 15, 0, 69, 60, 15, 0, 197, 62, 15, 0, 69, 65, 15, 0, 197, 67, 15, 0, 69, 70, 15, 0, 197, 72, 15, 0, 69, 75, 15, 0, 197, 77, 15, 0, 69, 80, 15, 0, 197, 82, 15, 0, 69, 85, 15, 0, 197, 87, 15, 0, 69, 90, 15, 0, 197, 92, 15, 0, 69, 95, 15, 0, 197, 97, 15, 0, 69, 100, 15, 0, 197, 102, 15, 0, 69, 105, 15, 0, 197, 107, 15, 0, 69, 110, 15, 0, 197, 112, 15, 0, 69, 115, 15, 0, 197, 117, 15, 0, 69, 120, 15, 0, 197, 122, 15, 0, 69, 125, 15, 0, 197, 127, 15, 0, 69, 130, 15, 0, 197, 132, 15, 0, 69, 135, 15, 0, 197, 137, 15, 0, 69, 140, 15, 0, 197, 142, 15, 0, 69, 145, 15, 0, 197, 147, 15, 0, 69, 150, 15, 0, 197, 152, 15, 0, 69, 155, 15, 0, 197, 157, 15, 0, 69, 160, 15, 0, 197, 162, 15, 0, 69, 165, 15, 0, 197, 167, 15, 0, 69, 170, 15, 0, 197, 172, 15, 0, 69, 175, 15, 0, 197, 177, 15, 0, 69, 180, 15, 0, 197, 182, 15, 0, 69, 185, 15, 0, 197, 187, 15, 0, 69, 190, 15, 0, 197, 192, 15, 0, 69, 195, 15, 0, 197, 197, 15, 0, 69, 200, 15, 0, 197, 202, 15, 0, 69, 205, 15, 0, 197, 207, 15, 0, 69, 210, 15, 0, 197, 212, 15, 0, 69, 215, 15, 0, 197, 217, 15, 0, 69, 220, 15, 0, 197, 222, 15, 0, 69, 225, 15, 0, 197, 227, 15, 0, 69, 230, 15, 0, 197, 232, 15, 0, 69, 235, 15, 0, 197, 237, 15, 0, 69, 240, 15, 0, 197, 242, 15, 0, 69, 245, 15, 0, 197, 247, 15, 0, 69, 250, 15, 0, 197, 252, 15, 0, 69, 255, 15, 0, 197, 1, 16, 0, 69, 4, 16, 0, 197, 6, 16, 0, 69, 9, 16, 0, 197, 11, 16, 0, 69, 14, 16, 0, 197, 16, 16, 0, 69, 19, 16, 0, 197, 21, 16, 0, 69, 24, 16, 0, 197, 26, 16, 0, 69, 29, 16, 0, 197, 31, 16, 0, 69, 34, 16, 0, 197, 36, 16, 0, 69, 39, 16, 0, 197, 41, 16, 0, 69, 44, 16, 0, 197, 46, 16, 0, 69, 49, 16, 0, 197, 51, 16, 0, 69, 54, 16, 0, 197, 56, 16, 0, 69, 59, 16, 0, 197, 61, 16, 0, 69, 64, 16, 0, 197, 66, 16, 0, 69, 69, 16, 0, 197, 71, 16, 0, 69, 74, 16, 0, 197, 76, 16, 0, 69, 79, 16, 0, 197, 81, 16, 0, 69, 84, 16, 0, 197, 86, 16, 0, 69, 89, 16, 0, 197, 91, 16, 0, 69, 94, 16, 0, 197, 96, 16, 0, 69, 99, 16, 0, 197, 101, 16, 0, 69, 104, 16, 0, 197, 106, 16, 0, 69, 109, 16, 0, 197, 111, 16, 0, 69, 114, 16, 0, 197, 116, 16, 0, 69, 119, 16, 0, 197, 121, 16, 0, 69, 124, 16, 0, 197, 126, 16, 0, 69, 129, 16, 0, 197, 131, 16, 0, 69, 134, 16, 0, 197, 136, 16, 0, 69, 139, 16, 0, 197, 141, 16, 0, 69, 144, 16, 0, 197, 146, 16, 0, 69, 149, 16, 0, 197, 151, 16, 0, 69, 154, 16, 0, 197, 156, 16, 0, 69, 159, 16, 0, 197, 161, 16, 0, 69, 164, 16, 0, 197, 166, 16, 0, 69, 169, 16, 0, 197, 171, 16, 0, 69, 174, 16, 0, 197, 176, 16, 0, 69, 179, 16, 0, 197, 181, 16, 0, 69, 184, 16, 0, 197, 186, 16, 0, 69, 189, 16, 0, 197, 191, 16, 0, 69, 194, 16, 0, 197, 196, 16, 0, 69, 199, 16, 0, 197, 201, 16, 0, 69, 204, 16, 0, 197, 206, 16, 0, 69, 209, 16, 0, 197, 211, 16, 0, 69, 214, 16, 0, 197, 216, 16, 0, 69, 219, 16, 0, 197, 221, 16, 0, 69, 224, 16, 0, 197, 226, 16, 0, 69, 229, 16, 0, 197, 231, 16, 0, 69, 234, 16, 0, 197, 236, 16, 0, 69, 239, 16, 0, 197, 241, 16, 0, 69, 244, 16, 0, 197, 246, 16, 0, 69, 249, 16, 0, 197, 251, 16, 0, 69, 254, 16, 0, 197, 0, 17, 0, 69, 3, 17, 0, 197, 5, 17, 0, 69, 8, 17, 0, 197, 10, 17, 0, 69, 13, 17, 0, 197, 15, 17, 0, 69, 18, 17, 0, 197, 20, 17, 0, 69, 23, 17, 0, 197, 25, 17, 0, 69, 28, 17, 0, 197, 30, 17, 0, 69, 33, 17, 0, 197, 35, 17, 0, 69, 38, 17, 0, 197, 40, 17, 0, 69, 43, 17, 0, 197, 45, 17, 0, 69, 48, 17, 0, 197, 50, 17, 0, 69, 53, 17, 0, 197, 55, 17, 0, 69, 58, 17, 0, 197, 60, 17, 0, 69, 63, 17, 0, 197, 65, 17, 0, 69, 68, 17, 0, 197, 70, 17, 0, 69, 73, 17, 0, 197, 75, 17, 0, 69, 78, 17, 0, 197, 80, 17, 0, 69, 83, 17, 0, 197, 85, 17, 0, 69, 88, 17, 0, 197, 90, 17, 0, 69, 93, 17, 0, 197, 95, 17, 0, 69, 98, 17, 0, 197, 100, 17, 0, 69, 103, 17, 0, 197, 105, 17, 0, 69, 108, 17, 0, 197, 110, 17, 0, 69, 113, 17, 0, 197, 115, 17, 0, 69, 118, 17, 0, 197, 120, 17, 0, 69, 123, 17, 0, 197, 125, 17, 0, 69, 128, 17, 0, 197, 130, 17, 0, 69, 133, 17, 0, 197, 135, 17, 0, 69, 138, 17, 0, 197, 140, 17, 0, 69, 143, 17, 0, 197, 145, 17, 0, 69, 148, 17, 0, 197, 150, 17, 0, 69, 153, 17, 0, 197, 155, 17, 0, 69, 158, 17, 0, 197, 160, 17, 0, 69, 163, 17, 0, 197, 165, 17, 0, 69, 168, 17, 0, 197, 170, 17, 0, 69, 173, 17, 0, 197, 175, 17, 0, 69, 178, 17, 0, 197, 180, 17, 0, 69, 183, 17, 0, 197, 185, 17, 0, 69, 188, 17, 0, 197, 190, 17, 0, 69, 193, 17, 0, 197, 195, 17, 0, 69, 198, 17, 0, 197, 200, 17, 0, 69, 203, 17, 0, 197, 205, 17, 0, 69, 208, 17, 0, 197, 210, 17, 0, 69, 213, 17, 0, 197, 215, 17, 0, 69, 218, 17, 0, 197, 220, 17, 0, 69, 223, 17, 0, 197, 225, 17, 0, 69, 228, 17, 0, 197, 230, 17, 0, 69, 233, 17, 0, 197, 235, 17, 0, 69, 238, 17, 0, 197, 240, 17, 0, 69, 243, 17, 0, 197, 245, 17, 0, 69, 248, 17, 0, 197, 250, 17, 0, 69, 253, 17, 0, 197, 255, 17, 0, 69, 2, 18, 0, 197, 4, 18, 0, 69, 7, 18, 0, 197, 9, 18, 0, 69, 12, 18, 0, 197, 14, 18, 0, 69, 17, 18, 0, 197, 19, 18, 0, 69, 22, 18, 0, 197, 24, 18, 0, 69, 27, 18, 0, 197, 29, 18, 0, 69, 32, 18, 0, 197, 34, 18, 0, 69, 37, 18, 0, 197, 39, 18, 0, 69, 42, 18, 0, 197, 44, 18, 0, 69, 47, 18, 0, 197, 49, 18, 0, 69, 52, 18, 0, 197, 54, 18, 0, 69, 57, 18, 0, 197, 59, 18, 0, 69, 62, 18, 0, 197, 64, 18, 0, 69, 67, 18, 0, 197, 69, 18, 0, 69, 72, 18, 0, 197, 74, 18, 0, 69, 77, 18, 0, 197, 79, 18, 0, 69, 82, 18, 0, 197, 84, 18, 0, 69, 87, 18, 0, 197, 89, 18, 0, 69, 92, 18, 0, 197, 94, 18, 0, 69, 97, 18, 0, 197, 99, 18, 0, 69, 102, 18, 0, 197, 104, 18, 0, 69, 107, 18, 0, 197, 109, 18, 0, 69, 112, 18, 0, 197, 114, 18, 0, 69, 117, 18, 0, 197, 119, 18, 0, 69, 122, 18, 0, 197, 124, 18, 0, 69, 127, 18, 0, 197, 129, 18, 0, 69, 132, 18, 0, 197, 134, 18, 0, 69, 137, 18, 0, 197, 139, 18, 0, 69, 142, 18, 0, 197, 144, 18, 0, 69, 147, 18, 0, 197, 149, 18, 0, 69, 152, 18, 0, 197, 154, 18, 0, 69, 157, 18, 0, 197, 159, 18, 0, 69, 162, 18, 0, 197, 164, 18, 0, 69, 167, 18, 0, 197, 169, 18, 0, 69, 172, 18, 0, 197, 174, 18, 0, 69, 177, 18, 0, 197, 179, 18, 0, 69, 182, 18, 0, 197, 184, 18, 0, 69, 187, 18, 0, 197, 189, 18, 0, 69, 192, 18, 0, 197, 194, 18, 0, 69, 197, 18, 0, 197, 199, 18, 0, 69, 202, 18, 0, 197, 204, 18, 0, 69, 207, 18, 0, 197, 209, 18, 0, 69, 212, 18, 0, 197, 214, 18, 0, 69, 217, 18, 0, 197, 219, 18, 0, 69, 222, 18, 0, 197, 224, 18, 0, 69, 227, 18, 0, 197, 229, 18, 0, 69, 232, 18, 0, 197, 234, 18, 0, 69, 237, 18, 0, 197, 239, 18, 0, 69, 242, 18, 0, 197, 244, 18, 0, 69, 247, 18, 0, 197, 249, 18, 0, 69, 252, 18, 0, 197, 254, 18, 0, 69, 1, 19, 0, 197, 3, 19, 0, 69, 6, 19, 0, 197, 8, 19, 0, 69, 11, 19, 0, 197, 13, 19, 0, 69, 16, 19, 0, 197, 18, 19, 0, 69, 21, 19, 0, 197, 23, 19, 0, 69, 26, 19, 0, 197, 28, 19, 0, 69, 31, 19, 0, 197, 33, 19, 0, 69, 36, 19, 0, 197, 38, 19, 0, 69, 41, 19, 0, 197, 43, 19, 0, 69, 46, 19, 0, 197, 48, 19, 0, 69, 51, 19, 0, 197, 53, 19, 0, 69, 56, 19, 0, 197, 58, 19, 0, 69, 61, 19, 0, 197, 63, 19, 0, 69, 66, 19, 0, 197, 68, 19, 0, 69, 71, 19, 0, 197, 73, 19, 0, 69, 76, 19, 0, 197, 78, 19, 0, 69, 81, 19, 0, 197, 83, 19, 0, 69, 86, 19, 0, 197, 88, 19, 0, 69, 91, 19, 0, 197, 93, 19, 0, 69, 96, 19, 0, 197, 98, 19, 0, 69, 101, 19, 0, 197, 103, 19, 0, 69, 106, 19, 0, 197, 108, 19, 0, 69, 111, 19, 0, 197, 113, 19, 0, 69, 116, 19, 0, 197, 118, 19, 0, 69, 121, 19, 0, 197, 123, 19, 0, 69, 126, 19, 0, 197, 128, 19, 0, 69, 131, 19, 0, 197, 133, 19, 0, 69, 136, 19, 0, 197, 138, 19, 0, 69, 141, 19, 0, 197, 143, 19, 0, 69, 146, 19, 0, 197, 148, 19, 0, 69, 151, 19, 0, 197, 153, 19, 0, 69, 156, 19, 0, 197, 158, 19, 0, 69, 161, 19, 0, 197, 163, 19, 0, 69, 166, 19, 0, 197, 168, 19, 0, 69, 171, 19, 0, 197, 173, 19, 0, 69, 176, 19, 0, 197, 178, 19, 0, 69, 181, 19, 0, 197, 183, 19, 0, 69, 186, 19, 0, 197, 188, 19, 0, 69, 191, 19, 0, 197, 193, 19, 0, 69, 196, 19, 0, 197, 198, 19, 0, 69, 201, 19, 0, 197, 203, 19, 0, 69, 206, 19, 0, 197, 208, 19, 0, 69, 211, 19, 0, 197, 213, 19, 0, 69, 216, 19, 0, 197, 218, 19, 0, 69, 221, 19, 0, 197, 223, 19, 0, 69, 226, 19, 0, 197, 228, 19, 0, 69, 231, 19, 0, 197, 233, 19, 0, 69, 236, 19, 0, 197, 238, 19, 0, 69, 241, 19, 0, 197, 243, 19, 0, 69, 246, 19, 0, 197, 248, 19, 0, 69, 251, 19, 0, 197, 253, 19, 0, 69, 0, 20, 0, 197, 2, 20, 0, 69, 5, 20, 0, 197, 7, 20, 0, 69, 10, 20, 0, 197, 12, 20, 0, 69, 15, 20, 0, 197, 17, 20, 0, 69, 20, 20, 0, 197, 22, 20, 0, 69, 25, 20, 0, 197, 27, 20, 0, 69, 30, 20, 0, 197, 32, 20, 0, 69, 35, 20, 0, 197, 37, 20, 0, 69, 40, 20, 0, 197, 42, 20, 0, 69, 45, 20, 0, 197, 47, 20, 0, 69, 50, 20, 0, 197, 52, 20, 0, 69, 55, 20, 0, 197, 57, 20, 0, 69, 60, 20, 0, 197, 62, 20, 0, 69, 65, 20, 0, 197, 67, 20, 0, 69, 70, 20, 0, 197, 72, 20, 0, 69, 75, 20, 0, 197, 77, 20, 0, 69, 80, 20, 0, 197, 82, 20, 0, 69, 85, 20, 0, 197, 87, 20, 0, 69, 90, 20, 0, 197, 92, 20, 0, 69, 95, 20, 0, 197, 97, 20, 0, 69, 100, 20, 0, 197, 102, 20, 0, 69, 105, 20, 0, 197, 107, 20, 0, 69, 110, 20, 0, 197, 112, 20, 0, 69, 115, 20, 0, 197, 117, 20, 0, 69, 120, 20, 0, 197, 122, 20, 0, 69, 125, 20, 0, 197, 127, 20, 0, 69, 130, 20, 0, 197, 132, 20, 0, 69, 135, 20, 0, 197, 137, 20, 0, 69, 140, 20, 0, 197, 142, 20, 0, 69, 145, 20, 0, 197, 147, 20, 0, 69, 150, 20, 0, 197, 152, 20, 0, 69, 155, 20, 0, 197, 157, 20, 0, 69, 160, 20, 0, 197, 162, 20, 0, 69, 165, 20, 0, 197, 167, 20, 0, 69, 170, 20, 0, 197, 172, 20, 0, 69, 175, 20, 0, 197, 177, 20, 0, 69, 180, 20, 0, 197, 182, 20, 0, 69, 185, 20, 0, 197, 187, 20, 0, 69, 190, 20, 0, 197, 192, 20, 0, 69, 195, 20, 0, 197, 197, 20, 0, 69, 200, 20, 0, 197, 202, 20, 0, 69, 205, 20, 0, 197, 207, 20, 0, 69, 210, 20, 0, 197, 212, 20, 0, 69, 215, 20, 0, 197, 217, 20, 0, 69, 220, 20, 0, 197, 222, 20, 0, 69, 225, 20, 0, 197, 227, 20, 0, 69, 230, 20, 0, 197, 232, 20, 0, 69, 235, 20, 0, 197, 237, 20, 0, 69, 240, 20, 0, 197, 242, 20, 0, 69, 245, 20, 0, 197, 247, 20, 0, 69, 250, 20, 0, 197, 252, 20, 0, 69, 255, 20, 0, 197, 1, 21, 0, 69, 4, 21, 0, 197, 6, 21, 0, 69, 9, 21, 0, 197, 11, 21, 0, 69, 14, 21, 0, 197, 16, 21, 0, 69, 19, 21, 0, 197, 21, 21, 0, 69, 24, 21, 0, 197, 26, 21, 0, 69, 29, 21, 0, 197, 31, 21, 0, 69, 34, 21, 0, 197, 36, 21, 0, 69, 39, 21, 0, 197, 41, 21, 0, 69, 44, 21, 0, 197, 46, 21, 0, 69, 49, 21, 0, 197, 51, 21, 0, 69, 54, 21, 0, 197, 56, 21, 0, 69, 59, 21, 0, 197, 61, 21, 0, 69, 64, 21, 0, 197, 66, 21, 0, 69, 69, 21, 0, 197, 71, 21, 0, 69, 74, 21, 0, 197, 76, 21, 0, 69, 79, 21, 0, 197, 81, 21, 0, 69, 84, 21, 0, 197, 86, 21, 0, 69, 89, 21, 0, 197, 91, 21, 0, 69, 94, 21, 0, 197, 96, 21, 0, 69, 99, 21, 0, 197, 101, 21, 0, 69, 104, 21, 0, 197, 106, 21, 0, 69, 109, 21, 0, 197, 111, 21, 0, 69, 114, 21, 0, 197, 116, 21, 0, 69, 119, 21, 0, 197, 121, 21, 0, 69, 124, 21, 0, 197, 126, 21, 0, 69, 129, 21, 0, 197, 131, 21, 0, 69, 134, 21, 0, 197, 136, 21, 0, 69, 139, 21, 0, 197, 141, 21, 0, 69, 144, 21, 0, 197, 146, 21, 0, 69, 149, 21, 0, 197, 151, 21, 0, 69, 154, 21, 0, 197, 156, 21, 0, 69, 159, 21, 0, 197, 161, 21, 0, 69, 164, 21, 0, 197, 166, 21, 0, 69, 169, 21, 0, 197, 171, 21, 0, 69, 174, 21, 0, 197, 176, 21, 0, 69, 179, 21, 0, 197, 181, 21, 0, 69, 184, 21, 0, 197, 186, 21, 0, 69, 189, 21, 0, 197, 191, 21, 0, 69, 194, 21, 0, 197, 196, 21, 0, 69, 199, 21, 0, 197, 201, 21, 0, 69, 204, 21, 0, 197, 206, 21, 0, 69, 209, 21, 0, 197, 211, 21, 0, 69, 214, 21, 0, 197, 216, 21, 0, 69, 219, 21, 0, 197, 221, 21, 0, 69, 224, 21, 0, 197, 226, 21, 0, 69, 229, 21, 0, 197, 231, 21, 0, 69, 234, 21, 0, 197, 236, 21, 0, 69, 239, 21, 0, 197, 241, 21, 0, 69, 244, 21, 0, 197, 246, 21, 0, 69, 249, 21, 0, 197, 251, 21, 0, 69, 254, 21, 0, 197, 0, 22, 0, 69, 3, 22, 0, 197, 5, 22, 0, 69, 8, 22, 0, 197, 10, 22, 0, 69, 13, 22, 0, 197, 15, 22, 0, 69, 18, 22, 0, 197, 20, 22, 0, 69, 23, 22, 0, 197, 25, 22, 0, 69, 28, 22, 0, 197, 30, 22, 0, 69, 33, 22, 0, 197, 35, 22, 0, 69, 38, 22, 0, 197, 40, 22, 0, 69, 43, 22, 0, 197, 45, 22, 0, 69, 48, 22, 0, 197, 50, 22, 0, 69, 53, 22, 0, 197, 55, 22, 0, 69, 58, 22, 0, 197, 60, 22, 0, 69, 63, 22, 0, 197, 65, 22, 0, 69, 68, 22, 0, 197, 70, 22, 0, 69, 73, 22, 0, 197, 75, 22, 0, 69, 78, 22, 0, 197, 80, 22, 0, 69, 83, 22, 0, 197, 85, 22, 0, 69, 88, 22, 0, 197, 90, 22, 0, 69, 93, 22, 0, 197, 95, 22, 0, 69, 98, 22, 0, 197, 100, 22, 0, 69, 103, 22, 0, 197, 105, 22, 0, 69, 108, 22, 0, 197, 110, 22, 0, 69, 113, 22, 0, 197, 115, 22, 0, 69, 118, 22, 0, 197, 120, 22, 0, 69, 123, 22, 0, 197, 125, 22, 0, 69, 128, 22, 0, 197, 130, 22, 0, 69, 133, 22, 0, 197, 135, 22, 0, 69, 138, 22, 0, 197, 140, 22, 0, 69, 143, 22, 0, 197, 145, 22, 0, 69, 148, 22, 0, 197, 150, 22, 0, 69, 153, 22, 0, 197, 155, 22, 0, 69, 158, 22, 0, 197, 160, 22, 0, 69, 163, 22, 0, 197, 165, 22, 0, 69, 168, 22, 0, 197, 170, 22, 0, 69, 173, 22, 0, 197, 175, 22, 0, 69, 178, 22, 0, 197, 180, 22, 0, 69, 183, 22, 0, 197, 185, 22, 0, 69, 188, 22, 0, 197, 190, 22, 0, 69, 193, 22, 0, 197, 195, 22, 0, 69, 198, 22, 0, 197, 200, 22, 0, 69, 203, 22, 0, 197, 205, 22, 0, 69, 208, 22, 0, 197, 210, 22, 0, 69, 213, 22, 0, 197, 215, 22, 0, 69, 218, 22, 0, 197, 220, 22, 0, 69, 223, 22, 0, 197, 225, 22, 0, 69, 228, 22, 0, 197, 230, 22, 0, 69, 233, 22, 0, 197, 235, 22, 0, 69, 238, 22, 0, 197, 240, 22, 0, 69, 243, 22, 0, 197, 245, 22, 0, 69, 248, 22, 0, 197, 250, 22, 0, 69, 253, 22, 0, 197, 255, 22, 0, 69, 2, 23, 0, 197, 4, 23, 0, 69, 7, 23, 0, 197, 9, 23, 0, 69, 12, 23, 0, 197, 14, 23, 0, 69, 17, 23, 0, 197, 19, 23, 0, 69, 22, 23, 0, 197, 24, 23, 0, 69, 27, 23, 0, 197, 29, 23, 0, 69, 32, 23, 0, 197, 34, 23, 0, 69, 37, 23, 0, 197, 39, 23, 0, 69, 42, 23, 0, 197, 44, 23, 0, 69, 47, 23, 0, 197, 49, 23, 0, 69, 52, 23, 0, 197, 54, 23, 0, 69, 57, 23, 0, 197, 59, 23, 0, 69, 62, 23, 0, 197, 64, 23, 0, 69, 67, 23, 0, 197, 69, 23, 0, 69, 72, 23, 0, 197, 74, 23, 0, 69, 77, 23, 0, 197, 79, 23, 0, 69, 82, 23, 0, 197, 84, 23, 0, 69, 87, 23, 0, 197, 89, 23, 0, 69, 92, 23, 0, 197, 94, 23, 0, 69, 97, 23, 0, 197, 99, 23, 0, 69, 102, 23, 0, 197, 104, 23, 0, 69, 107, 23, 0, 197, 109, 23, 0, 69, 112, 23, 0, 197, 114, 23, 0, 69, 117, 23, 0, 197, 119, 23, 0, 69, 122, 23, 0, 197, 124, 23, 0, 69, 127, 23, 0, 197, 129, 23, 0, 69, 132, 23, 0, 197, 134, 23, 0, 69, 137, 23, 0, 197, 139, 23, 0, 69, 142, 23, 0, 197, 144, 23, 0, 69, 147, 23, 0, 197, 149, 23, 0, 69, 152, 23, 0, 197, 154, 23, 0, 69, 157, 23, 0, 197, 159, 23, 0, 69, 162, 23, 0, 197, 164, 23, 0, 69, 167, 23, 0, 197, 169, 23, 0, 69, 172, 23, 0, 197, 174, 23, 0, 69, 177, 23, 0, 197, 179, 23, 0, 69, 182, 23, 0, 197, 184, 23, 0, 69, 187, 23, 0, 197, 189, 23, 0, 69, 192, 23, 0, 197, 194, 23, 0, 69, 197, 23, 0, 197, 199, 23, 0, 69, 202, 23, 0, 197, 204, 23, 0, 69, 207, 23, 0, 197, 209, 23, 0, 69, 212, 23, 0, 197, 214, 23, 0, 69, 217, 23, 0, 197, 219, 23, 0, 69, 222, 23, 0, 197, 224, 23, 0, 69, 227, 23, 0, 197, 229, 23, 0, 69, 232, 23, 0, 197, 234, 23, 0, 69, 237, 23, 0, 197, 239, 23, 0, 69, 242, 23, 0, 197, 244, 23, 0, 69, 247, 23, 0, 197, 249, 23, 0, 69, 252, 23, 0, 197, 254, 23, 0, 69, 1, 24, 0, 197, 3, 24, 0, 69, 6, 24, 0, 197, 8, 24, 0, 69, 11, 24, 0, 197, 13, 24, 0, 69, 16, 24, 0, 197, 18, 24, 0, 69, 21, 24, 0, 197, 23, 24, 0, 69, 26, 24, 0, 197, 28, 24, 0, 69, 31, 24, 0, 197, 33, 24, 0, 69, 36, 24, 0, 197, 38, 24, 0, 69, 41, 24, 0, 197, 43, 24, 0, 69, 46, 24, 0, 197, 48, 24, 0, 69, 51, 24, 0, 197, 53, 24, 0, 69, 56, 24, 0, 197, 58, 24, 0, 69, 61, 24, 0, 197, 63, 24, 0, 69, 66, 24, 0, 197, 68, 24, 0, 69, 71, 24, 0, 197, 73, 24, 0, 69, 76, 24, 0, 197, 78, 24, 0, 69, 81, 24, 0, 197, 83, 24, 0, 69, 86, 24, 0, 197, 88, 24, 0, 69, 91, 24, 0, 197, 93, 24, 0, 69, 96, 24, 0, 197, 98, 24, 0, 69, 101, 24, 0, 197, 103, 24, 0, 1], [], [], [], [195, 7, 0, 0, 195, 17, 0, 0, 195, 27, 0, 0, 195, 37, 0, 0, 195, 47, 0, 0, 195, 57, 0, 0, 195, 67, 0, 0, 195, 77, 0, 0, 195, 87, 0, 0, 195, 97, 0, 0, 195, 107, 0, 0, 195, 117, 0, 0, 195, 127, 0, 0, 195, 137, 0, 0, 195, 147, 0, 0, 195, 157, 0, 0, 195, 167, 0, 0, 195, 177, 0, 0, 195, 187, 0, 0, 195, 197, 0, 0, 195, 207, 0, 0, 195, 217, 0, 0, 195, 227, 0, 0, 195, 237, 0, 0, 195, 247, 0, 0, 195, 1, 1, 0, 195, 11, 1, 0, 195, 21, 1, 0, 195, 31, 1, 0, 195, 41, 1, 0, 195, 51, 1, 0, 195, 61, 1, 0, 195, 71, 1, 0, 195, 81, 1, 0, 195, 91, 1, 0, 195, 101, 1, 0, 195, 111, 1, 0, 195, 121, 1, 0, 195, 131, 1, 0, 195, 141, 1, 0, 195, 151, 1, 0, 195, 161, 1, 0, 195, 171, 1, 0, 195, 181, 1, 0, 195, 191, 1, 0, 195, 201, 1, 0, 195, 211, 1, 0, 195, 221, 1, 0, 195, 231, 1, 0, 195, 241, 1, 0, 195, 251, 1, 0, 195, 5, 2, 0, 195, 15, 2, 0, 195, 25, 2, 0, 195, 35, 2, 0, 195, 45, 2, 0, 195, 55, 2, 0, 195, 65, 2, 0, 195, 75, 2, 0, 195, 85, 2, 0, 195, 95, 2, 0, 195, 105, 2, 0, 195, 115, 2, 0, 195, 125, 2, 0, 195, 135, 2, 0, 195, 145, 2, 0, 195, 155, 2, 0, 195, 165, 2, 0, 195, 175, 2, 0, 195, 185, 2, 0, 195, 195, 2, 0, 195, 205, 2, 0, 195, 215, 2, 0, 195, 225, 2, 0, 195, 235, 2, 0, 195, 245, 2, 0, 195, 255, 2, 0, 195, 9, 3, 0, 195, 19, 3, 0, 195, 29, 3, 0, 195, 39, 3, 0, 195, 49, 3, 0, 195, 59, 3, 0, 195, 69, 3, 0, 195, 79, 3, 0, 195, 89, 3, 0, 195, 99, 3, 0, 195, 109, 3, 0, 195, 119, 3, 0, 195, 129, 3, 0, 195, 139, 3, 0, 195, 149, 3, 0, 195, 159, 3, 0, 195, 169, 3, 0, 195, 179, 3, 0, 195, 189, 3, 0, 195, 199, 3, 0, 195, 209, 3, 0, 195, 219, 3, 0, 195, 229, 3, 0, 195, 239, 3, 0, 195, 249, 3, 0, 195, 3, 4, 0, 195, 13, 4, 0, 195, 23, 4, 0, 195, 33, 4, 0, 195, 43, 4, 0, 195, 53, 4, 0, 195, 63, 4, 0, 195, 73, 4, 0, 195, 83, 4, 0, 195, 93, 4, 0, 195, 103, 4, 0, 195, 113, 4, 0, 195, 123, 4, 0, 195, 133, 4, 0, 195, 143, 4, 0, 195, 153, 4, 0, 195, 163, 4, 0, 195, 173, 4, 0, 195, 183, 4, 0, 195, 193, 4, 0, 195, 203, 4, 0, 195, 213, 4, 0, 195, 223, 4, 0, 195, 233, 4, 0, 195, 243, 4, 0, 195, 253, 4, 0, 195, 7, 5, 0, 195, 17, 5, 0, 195, 27, 5, 0, 195, 37, 5, 0, 195, 47, 5, 0, 195, 57, 5, 0, 195, 67, 5, 0, 195, 77, 5, 0, 195, 87, 5, 0, 195, 97, 5, 0, 195, 107, 5, 0, 195, 117, 5, 0, 195, 127, 5, 0, 195, 137, 5, 0, 195, 147, 5, 0, 195, 157, 5, 0, 195, 167, 5, 0, 195, 177, 5, 0, 195, 187, 5, 0, 195, 197, 5, 0, 195, 207, 5, 0, 195, 217, 5, 0, 195, 227, 5, 0, 195, 237, 5, 0, 195, 247, 5, 0, 195, 1, 6, 0, 195, 11, 6, 0, 195, 21, 6, 0, 195, 31, 6, 0, 195, 41, 6, 0, 195, 51, 6, 0, 195, 61, 6, 0, 195, 71, 6, 0, 195, 81, 6, 0, 195, 91, 6, 0, 195, 101, 6, 0, 195, 111, 6, 0, 195, 121, 6, 0, 195, 131, 6, 0, 195, 141, 6, 0, 195, 151, 6, 0, 195, 161, 6, 0, 195, 171, 6, 0, 195, 181, 6, 0, 195, 191, 6, 0, 195, 201, 6, 0, 195, 211, 6, 0, 195, 221, 6, 0, 195, 231, 6, 0, 195, 241, 6, 0, 195, 251, 6, 0, 195, 5, 7, 0, 195, 15, 7, 0, 195, 25, 7, 0, 195, 35, 7, 0, 195, 45, 7, 0, 195, 55, 7, 0, 195, 65, 7, 0, 195, 75, 7, 0, 195, 85, 7, 0, 195, 95, 7, 0, 195, 105, 7, 0, 195, 115, 7, 0, 195, 125, 7, 0, 195, 135, 7, 0, 195, 145, 7, 0, 195, 155, 7, 0, 195, 165, 7, 0, 195, 175, 7, 0, 195, 185, 7, 0, 195, 195, 7, 0, 195, 205, 7, 0, 195, 215, 7, 0, 195, 225, 7, 0, 195, 235, 7, 0, 195, 245, 7, 0, 195, 255, 7, 0, 195, 9, 8, 0, 195, 19, 8, 0, 195, 29, 8, 0, 195, 39, 8, 0, 195, 49, 8, 0, 195, 59, 8, 0, 195, 69, 8, 0, 195, 79, 8, 0, 195, 89, 8, 0, 195, 99, 8, 0, 195, 109, 8, 0, 195, 119, 8, 0, 195, 129, 8, 0, 195, 139, 8, 0, 195, 149, 8, 0, 195, 159, 8, 0, 195, 169, 8, 0, 195, 179, 8, 0, 195, 189, 8, 0, 195, 199, 8, 0, 195, 209, 8, 0, 195, 219, 8, 0, 195, 229, 8, 0, 195, 239, 8, 0, 195, 249, 8, 0, 195, 3, 9, 0, 195, 13, 9, 0, 195, 23, 9, 0, 195, 33, 9, 0, 195, 43, 9, 0, 195, 53, 9, 0, 195, 63, 9, 0, 195, 73, 9, 0, 195, 83, 9, 0, 195, 93, 9, 0, 195, 103, 9, 0, 195, 113, 9, 0, 195, 123, 9, 0, 195, 133, 9, 0, 195, 143, 9, 0, 195, 153, 9, 0, 195, 163, 9, 0, 195, 173, 9, 0, 195, 183, 9, 0, 195, 193, 9, 0, 195, 203, 9, 0, 195, 213, 9, 0, 195, 223, 9, 0, 195, 233, 9, 0, 195, 243, 9, 0, 195, 253, 9, 0, 195, 7, 10, 0, 195, 17, 10, 0, 195, 27, 10, 0, 195, 37, 10, 0, 195, 47, 10, 0, 195, 57, 10, 0, 195, 67, 10, 0, 195, 77, 10, 0, 195, 87, 10, 0, 195, 97, 10, 0, 195, 107, 10, 0, 195, 117, 10, 0, 195, 127, 10, 0, 195, 137, 10, 0, 195, 147, 10, 0, 195, 157, 10, 0, 195, 167, 10, 0, 195, 177, 10, 0, 195, 187, 10, 0, 195, 197, 10, 0, 195, 207, 10, 0, 195, 217, 10, 0, 195, 227, 10, 0, 195, 237, 10, 0, 195, 247, 10, 0, 195, 1, 11, 0, 195, 11, 11, 0, 195, 21, 11, 0, 195, 31, 11, 0, 195, 41, 11, 0, 195, 51, 11, 0, 195, 61, 11, 0, 195, 71, 11, 0, 195, 81, 11, 0, 195, 91, 11, 0, 195, 101, 11, 0, 195, 111, 11, 0, 195, 121, 11, 0, 195, 131, 11, 0, 195, 141, 11, 0, 195, 151, 11, 0, 195, 161, 11, 0, 195, 171, 11, 0, 195, 181, 11, 0, 195, 191, 11, 0, 195, 201, 11, 0, 195, 211, 11, 0, 195, 221, 11, 0, 195, 231, 11, 0, 195, 241, 11, 0, 195, 251, 11, 0, 195, 5, 12, 0, 195, 15, 12, 0, 195, 25, 12, 0, 195, 35, 12, 0, 195, 45, 12, 0, 195, 55, 12, 0, 195, 65, 12, 0, 195, 75, 12, 0, 195, 85, 12, 0, 195, 95, 12, 0, 195, 105, 12, 0, 195, 115, 12, 0, 195, 125, 12, 0, 195, 135, 12, 0, 195, 145, 12, 0, 195, 155, 12, 0, 195, 165, 12, 0, 195, 175, 12, 0, 195, 185, 12, 0, 195, 195, 12, 0, 195, 205, 12, 0, 195, 215, 12, 0, 195, 225, 12, 0, 195, 235, 12, 0, 195, 245, 12, 0, 195, 255, 12, 0, 195, 9, 13, 0, 195, 19, 13, 0, 195, 29, 13, 0, 195, 39, 13, 0, 195, 49, 13, 0, 195, 59, 13, 0, 195, 69, 13, 0, 195, 79, 13, 0, 195, 89, 13, 0, 195, 99, 13, 0, 195, 109, 13, 0, 195, 119, 13, 0, 195, 129, 13, 0, 195, 139, 13, 0, 195, 149, 13, 0, 195, 159, 13, 0, 195, 169, 13, 0, 195, 179, 13, 0, 195, 189, 13, 0, 195, 199, 13, 0, 195, 209, 13, 0, 195, 219, 13, 0, 195, 229, 13, 0, 195, 239, 13, 0, 195, 249, 13, 0, 195, 3, 14, 0, 195, 13, 14, 0, 195, 23, 14, 0, 195, 33, 14, 0, 195, 43, 14, 0, 195, 53, 14, 0, 195, 63, 14, 0, 195, 73, 14, 0, 195, 83, 14, 0, 195, 93, 14, 0, 195, 103, 14, 0, 195, 113, 14, 0, 195, 123, 14, 0, 195, 133, 14, 0, 195, 143, 14, 0, 195, 153, 14, 0, 195, 163, 14, 0, 195, 173, 14, 0, 195, 183, 14, 0, 195, 193, 14, 0, 195, 203, 14, 0, 195, 213, 14, 0, 195, 223, 14, 0, 195, 233, 14, 0, 195, 243, 14, 0, 195, 253, 14, 0, 195, 7, 15, 0, 195, 17, 15, 0, 195, 27, 15, 0, 195, 37, 15, 0, 195, 47, 15, 0, 195, 57, 15, 0, 195, 67, 15, 0, 195, 77, 15, 0, 195, 87, 15, 0, 195, 97, 15, 0, 195, 107, 15, 0, 195, 117, 15, 0, 195, 127, 15, 0, 195, 137, 15, 0, 195, 147, 15, 0, 195, 157, 15, 0, 195, 167, 15, 0, 195, 177, 15, 0, 195, 187, 15, 0, 195, 197, 15, 0, 195, 207, 15, 0, 195, 217, 15, 0, 195, 227, 15, 0, 195, 237, 15, 0, 195, 247, 15, 0, 195, 1, 16, 0, 195, 11, 16, 0, 195, 21, 16, 0, 195, 31, 16, 0, 195, 41, 16, 0, 195, 51, 16, 0, 195, 61, 16, 0, 195, 71, 16, 0, 195, 81, 16, 0, 195, 91, 16, 0, 195, 101, 16, 0, 195, 111, 16, 0, 195, 121, 16, 0, 195, 131, 16, 0, 195, 141, 16, 0, 195, 151, 16, 0, 195, 161, 16, 0, 195, 171, 16, 0, 195, 181, 16, 0, 195, 191, 16, 0, 195, 201, 16, 0, 195, 211, 16, 0, 195, 221, 16, 0, 195, 231, 16, 0, 195, 241, 16, 0, 195, 251, 16, 0, 195, 5, 17, 0, 195, 15, 17, 0, 195, 25, 17, 0, 195, 35, 17, 0, 195, 45, 17, 0, 195, 55, 17, 0, 195, 65, 17, 0, 195, 75, 17, 0, 195, 85, 17, 0, 195, 95, 17, 0, 195, 105, 17, 0, 195, 115, 17, 0, 195, 125, 17, 0, 195, 135, 17, 0, 195, 145, 17, 0, 195, 155, 17, 0, 195, 165, 17, 0, 195, 175, 17, 0, 195, 185, 17, 0, 195, 195, 17, 0, 195, 205, 17, 0, 195, 215, 17, 0, 195, 225, 17, 0, 195, 235, 17, 0, 195, 245, 17, 0, 195, 255, 17, 0, 195, 9, 18, 0, 195, 19, 18, 0, 195, 29, 18, 0, 195, 39, 18, 0, 195, 49, 18, 0, 195, 59, 18, 0, 195, 69, 18, 0, 195, 79, 18, 0, 195, 89, 18, 0, 195, 99, 18, 0, 195, 109, 18, 0, 195, 119, 18, 0, 195, 129, 18, 0, 195, 139, 18, 0, 195, 149, 18, 0, 195, 159, 18, 0, 195, 169, 18, 0, 195, 179, 18, 0, 195, 189, 18, 0, 195, 199, 18, 0, 195, 209, 18, 0, 195, 219, 18, 0, 195, 229, 18, 0, 195, 239, 18, 0, 195, 249, 18, 0, 195, 3, 19, 0, 195, 13, 19, 0, 195, 23, 19, 0, 195, 33, 19, 0, 195, 43, 19, 0, 195, 53, 19, 0, 195, 63, 19, 0, 195, 73, 19, 0, 195, 83, 19, 0, 195, 93, 19, 0, 195, 103, 19, 0, 195, 113, 19, 0, 195, 123, 19, 0, 195, 133, 19, 0, 195, 143, 19, 0, 195, 153, 19, 0, 195, 163, 19, 0, 195, 173, 19, 0, 195, 183, 19, 0, 195, 193, 19, 0, 195, 203, 19, 0, 195, 213, 19, 0, 195, 223, 19, 0, 195, 233, 19, 0, 195, 243, 19, 0, 195, 253, 19, 0, 195, 7, 20, 0, 195, 17, 20, 0, 195, 27, 20, 0, 195, 37, 20, 0, 195, 47, 20, 0, 195, 57, 20, 0, 195, 67, 20, 0, 195, 77, 20, 0, 195, 87, 20, 0, 195, 97, 20, 0, 195, 107, 20, 0, 195, 117, 20, 0, 195, 127, 20, 0, 195, 137, 20, 0, 195, 147, 20, 0, 195, 157, 20, 0, 195, 167, 20, 0, 195, 177, 20, 0, 195, 187, 20, 0, 195, 197, 20, 0, 195, 207, 20, 0, 195, 217, 20, 0, 195, 227, 20, 0, 195, 237, 20, 0, 195, 247, 20, 0, 195, 1, 21, 0, 195, 11, 21, 0, 195, 21, 21, 0, 195, 31, 21, 0, 195, 41, 21, 0, 195, 51, 21, 0, 195, 61, 21, 0, 195, 71, 21, 0, 195, 81, 21, 0, 195, 91, 21, 0, 195, 101, 21, 0, 195, 111, 21, 0, 195, 121, 21, 0, 195, 131, 21, 0, 195, 141, 21, 0, 195, 151, 21, 0, 195, 161, 21, 0, 195, 171, 21, 0, 195, 181, 21, 0, 195, 191, 21, 0, 195, 201, 21, 0, 195, 211, 21, 0, 195, 221, 21, 0, 195, 231, 21, 0, 195, 241, 21, 0, 195, 251, 21, 0, 195, 5, 22, 0, 195, 15, 22, 0, 195, 25, 22, 0, 195, 35, 22, 0, 195, 45, 22, 0, 195, 55, 22, 0, 195, 65, 22, 0, 195, 75, 22, 0, 195, 85, 22, 0, 195, 95, 22, 0, 195, 105, 22, 0, 195, 115, 22, 0, 195, 125, 22, 0, 195, 135, 22, 0, 195, 145, 22, 0, 195, 155, 22, 0, 195, 165, 22, 0, 195, 175, 22, 0, 195, 185, 22, 0, 195, 195, 22, 0, 195, 205, 22, 0, 195, 215, 22, 0, 195, 225, 22, 0, 195, 235, 22, 0, 195, 245, 22, 0, 195, 255, 22, 0, 195, 9, 23, 0, 195, 19, 23, 0, 195, 29, 23, 0, 195, 39, 23, 0, 195, 49, 23, 0, 195, 59, 23, 0, 195, 69, 23, 0, 195, 79, 23, 0, 195, 89, 23, 0, 195, 99, 23, 0, 195, 109, 23, 0, 195, 119, 23, 0, 195, 129, 23, 0, 195, 139, 23, 0, 195, 149, 23, 0, 195, 159, 23, 0, 195, 169, 23, 0, 195, 179, 23, 0, 195, 189, 23, 0, 195, 199, 23, 0, 195, 209, 23, 0, 195, 219, 23, 0, 195, 229, 23, 0, 195, 239, 23, 0, 195, 249, 23, 0, 195, 3, 24, 0, 195, 13, 24, 0, 195, 23, 24, 0, 195, 33, 24, 0, 195, 43, 24, 0, 195, 53, 24, 0, 195, 63, 24, 0, 195, 73, 24, 0, 195, 83, 24, 0, 195, 93, 24, 0, 195, 103, 24, 0, 195, 113, 24, 0, 195, 123, 24, 0, 195, 133, 24, 0, 195, 143, 24, 0, 195, 153, 24, 0, 195, 163, 24, 0, 195, 173, 24, 0, 195, 183, 24, 0, 195, 193, 24, 0, 195, 203, 24, 0, 195, 213, 24, 0, 195, 223, 24, 0, 195, 233, 24, 0, 195, 243, 24, 0, 195, 253, 24, 0, 195, 7, 25, 0, 195, 17, 25, 0, 195, 27, 25, 0, 195, 37, 25, 0, 195, 47, 25, 0, 195, 57, 25, 0, 195, 67, 25, 0, 195, 77, 25, 0, 195, 87, 25, 0, 195, 97, 25, 0, 195, 107, 25, 0, 195, 117, 25, 0, 195, 127, 25, 0, 195, 137, 25, 0, 195, 147, 25, 0, 195, 157, 25, 0, 195, 167, 25, 0, 195, 177, 25, 0, 195, 187, 25, 0, 195, 197, 25, 0, 195, 207, 25, 0, 195, 217, 25, 0, 195, 227, 25, 0, 195, 237, 25, 0, 195, 247, 25, 0, 195, 1, 26, 0, 195, 11, 26, 0, 195, 21, 26, 0, 195, 31, 26, 0, 195, 41, 26, 0, 195, 51, 26, 0, 195, 61, 26, 0, 195, 71, 26, 0, 195, 81, 26, 0, 195, 91, 26, 0, 195, 101, 26, 0, 195, 111, 26, 0, 195, 121, 26, 0, 195, 131, 26, 0, 195, 141, 26, 0, 195, 151, 26, 0, 195, 161, 26, 0, 195, 171, 26, 0, 195, 181, 26, 0, 195, 191, 26, 0, 195, 201, 26, 0, 195, 211, 26, 0, 195, 221, 26, 0, 195, 231, 26, 0, 195, 241, 26, 0, 195, 251, 26, 0, 195, 5, 27, 0, 195, 15, 27, 0, 195, 25, 27, 0, 195, 35, 27, 0, 195, 45, 27, 0, 195, 55, 27, 0, 195, 65, 27, 0, 195, 75, 27, 0, 195, 85, 27, 0, 195, 95, 27, 0, 195, 105, 27, 0, 195, 115, 27, 0, 195, 125, 27, 0, 195, 135, 27, 0, 195, 145, 27, 0, 195, 155, 27, 0, 195, 165, 27, 0, 195, 175, 27, 0, 195, 185, 27, 0, 195, 195, 27, 0, 195, 205, 27, 0, 195, 215, 27, 0, 195, 225, 27, 0, 195, 235, 27, 0, 195, 245, 27, 0, 195, 255, 27, 0, 195, 9, 28, 0, 195, 19, 28, 0, 195, 29, 28, 0, 195, 39, 28, 0, 195, 49, 28, 0, 195, 59, 28, 0, 195, 69, 28, 0, 195, 79, 28, 0, 195, 89, 28, 0, 195, 99, 28, 0, 195, 109, 28, 0, 195, 119, 28, 0, 195, 129, 28, 0, 195, 139, 28, 0, 195, 149, 28, 0, 195, 159, 28, 0, 195, 169, 28, 0, 195, 179, 28, 0, 195, 189, 28, 0, 195, 199, 28, 0, 195, 209, 28, 0, 195, 219, 28, 0, 195, 229, 28, 0, 195, 239, 28, 0, 195, 249, 28, 0, 195, 3, 29, 0, 195, 13, 29, 0, 195, 23, 29, 0, 195, 33, 29, 0, 195, 43, 29, 0, 195, 53, 29, 0, 195, 63, 29, 0, 195, 73, 29, 0, 195, 83, 29, 0, 195, 93, 29, 0, 195, 103, 29, 0, 195, 113, 29, 0, 195, 123, 29, 0, 195, 133, 29, 0, 195, 143, 29, 0, 195, 153, 29, 0, 195, 163, 29, 0, 195, 173, 29, 0, 195, 183, 29, 0, 195, 193, 29, 0, 195, 203, 29, 0, 195, 213, 29, 0, 195, 223, 29, 0, 195, 233, 29, 0, 195, 243, 29, 0, 195, 253, 29, 0, 195, 7, 30, 0, 195, 17, 30, 0, 195, 27, 30, 0, 195, 37, 30, 0, 195, 47, 30, 0, 195, 57, 30, 0, 195, 67, 30, 0, 195, 77, 30, 0, 195, 87, 30, 0, 195, 97, 30, 0, 195, 107, 30, 0, 195, 117, 30, 0, 195, 127, 30, 0, 195, 137, 30, 0, 195, 147, 30, 0, 195, 157, 30, 0, 195, 167, 30, 0, 195, 177, 30, 0, 195, 187, 30, 0, 195, 197, 30, 0, 195, 207, 30, 0, 195, 217, 30, 0, 195, 227, 30, 0, 195, 237, 30, 0, 195, 247, 30, 0, 195, 1, 31, 0, 195, 11, 31, 0, 195, 21, 31, 0, 195, 31, 31, 0, 195, 41, 31, 0, 195, 51, 31, 0, 195, 61, 31, 0, 195, 71, 31, 0, 195, 81, 31, 0, 195, 91, 31, 0, 195, 101, 31, 0, 195, 111, 31, 0, 195, 121, 31, 0, 195, 131, 31, 0, 195, 141, 31, 0, 195, 151, 31, 0, 195, 161, 31, 0, 195, 171, 31, 0, 195, 181, 31, 0, 195, 191, 31, 0, 195, 201, 31, 0, 195, 211, 31, 0, 195, 221, 31, 0, 195, 231, 31, 0, 195, 241, 31, 0, 195, 251, 31, 0, 195, 5, 32, 0, 195, 15, 32, 0, 195, 25, 32, 0, 195, 35, 32, 0, 195, 45, 32, 0, 195, 55, 32, 0, 195, 65, 32, 0, 195, 75, 32, 0, 195, 85, 32, 0, 195, 95, 32, 0, 195, 105, 32, 0, 195, 115, 32, 0, 195, 125, 32, 0, 195, 135, 32, 0, 195, 145, 32, 0, 195, 155, 32, 0, 195, 165, 32, 0, 195, 175, 32, 0, 195, 185, 32, 0, 195, 195, 32, 0, 195, 205, 32, 0, 195, 215, 32, 0, 195, 225, 32, 0, 195, 235, 32, 0, 195, 245, 32, 0, 195, 255, 32, 0, 195, 9, 33, 0, 195, 19, 33, 0, 195, 29, 33, 0, 195, 39, 33, 0, 195, 49, 33, 0, 195, 59, 33, 0, 195, 69, 33, 0, 195, 79, 33, 0, 195, 89, 33, 0, 195, 99, 33, 0, 195, 109, 33, 0, 195, 119, 33, 0, 195, 129, 33, 0, 195, 139, 33, 0, 195, 149, 33, 0, 195, 159, 33, 0, 195, 169, 33, 0, 195, 179, 33, 0, 195, 189, 33, 0, 195, 199, 33, 0, 195, 209, 33, 0, 195, 219, 33, 0, 195, 229, 33, 0, 195, 239, 33, 0, 195, 249, 33, 0, 195, 3, 34, 0, 195, 13, 34, 0, 195, 23, 34, 0, 195, 33, 34, 0, 195, 43, 34, 0, 195, 53, 34, 0, 195, 63, 34, 0, 195, 73, 34, 0, 195, 83, 34, 0, 195, 93, 34, 0, 195, 103, 34, 0, 195, 113, 34, 0, 195, 123, 34, 0, 195, 133, 34, 0, 195, 143, 34, 0, 195, 153, 34, 0, 195, 163, 34, 0, 195, 173, 34, 0, 195, 183, 34, 0, 195, 193, 34, 0, 195, 203, 34, 0, 195, 213, 34, 0, 195, 223, 34, 0, 195, 233, 34, 0, 195, 243, 34, 0, 195, 253, 34, 0, 195, 7, 35, 0, 195, 17, 35, 0, 195, 27, 35, 0, 195, 37, 35, 0, 195, 47, 35, 0, 195, 57, 35, 0, 195, 67, 35, 0, 195, 77, 35, 0, 195, 87, 35, 0, 195, 97, 35, 0, 195, 107, 35, 0, 195, 117, 35, 0, 195, 127, 35, 0, 195, 137, 35, 0, 195, 147, 35, 0, 195, 157, 35, 0, 195, 167, 35, 0, 195, 177, 35, 0, 195, 187, 35, 0, 195, 197, 35, 0, 195, 207, 35, 0, 195, 217, 35, 0, 195, 227, 35, 0, 195, 237, 35, 0, 195, 247, 35, 0, 195, 1, 36, 0, 195, 11, 36, 0, 195, 21, 36, 0, 195, 31, 36, 0, 195, 41, 36, 0, 195, 51, 36, 0, 195, 61, 36, 0, 195, 71, 36, 0, 195, 81, 36, 0, 195, 91, 36, 0, 195, 101, 36, 0, 195, 111, 36, 0, 195, 121, 36, 0, 195, 131, 36, 0, 195, 141, 36, 0, 195, 151, 36, 0, 195, 161, 36, 0, 195, 171, 36, 0, 195, 181, 36, 0, 195, 191, 36, 0, 195, 201, 36, 0, 195, 211, 36, 0, 195, 221, 36, 0, 195, 231, 36, 0, 195, 241, 36, 0, 195, 251, 36, 0, 195, 5, 37, 0, 195, 15, 37, 0, 195, 25, 37, 0, 195, 35, 37, 0, 195, 45, 37, 0, 195, 55, 37, 0, 195, 65, 37, 0, 195, 75, 37, 0, 195, 85, 37, 0, 195, 95, 37, 0, 195, 105, 37, 0, 195, 115, 37, 0, 195, 125, 37, 0, 195, 135, 37, 0, 195, 145, 37, 0, 195, 155, 37, 0, 195, 165, 37, 0, 195, 175, 37, 0, 195, 185, 37, 0, 195, 195, 37, 0, 195, 205, 37, 0, 195, 215, 37, 0, 195, 225, 37, 0, 195, 235, 37, 0, 195, 245, 37, 0, 195, 255, 37, 0, 195, 9, 38, 0, 195, 19, 38, 0, 195, 29, 38, 0, 195, 39, 38, 0, 195, 49, 38, 0, 195, 59, 38, 0, 195, 69, 38, 0, 195, 79, 38, 0, 195, 89, 38, 0, 195, 99, 38, 0, 195, 109, 38, 0, 195, 119, 38, 0, 195, 129, 38, 0, 195, 139, 38, 0, 195, 149, 38, 0, 195, 159, 38, 0, 195, 169, 38, 0, 195, 179, 38, 0, 195, 189, 38, 0, 195, 199, 38, 0, 195, 209, 38, 0, 195, 219, 38, 0, 195, 229, 38, 0, 195, 239, 38, 0, 195, 249, 38, 0, 195, 3, 39, 0, 195, 13, 39, 0, 195, 23, 39, 0, 195, 33, 39, 0, 195, 43, 39, 0, 195, 53, 39, 0, 195, 63, 39, 0, 195, 73, 39, 0, 195, 83, 39, 0, 195, 93, 39, 0, 195, 103, 39, 0, 195, 113, 39, 0, 195, 123, 39, 0, 195, 133, 39, 0, 195, 143, 39, 0, 195, 153, 39, 0, 195, 163, 39, 0, 195, 173, 39, 0, 195, 183, 39, 0, 195, 193, 39, 0, 195, 203, 39, 0, 195, 213, 39, 0, 195, 223, 39, 0, 195, 233, 39, 0, 195, 243, 39, 0, 195, 253, 39, 0, 195, 7, 40, 0, 195, 17, 40, 0, 195, 27, 40, 0, 195, 37, 40, 0, 195, 47, 40, 0, 195, 57, 40, 0, 195, 67, 40, 0, 195, 77, 40, 0, 195, 87, 40, 0, 195, 97, 40, 0, 195, 107, 40, 0, 195, 117, 40, 0, 195, 127, 40, 0, 195, 137, 40, 0, 195, 147, 40, 0, 195, 157, 40, 0, 195, 167, 40, 0, 195, 177, 40, 0, 195, 187, 40, 0, 195, 197, 40, 0, 195, 207, 40, 0, 195, 217, 40, 0, 195, 227, 40, 0, 195, 237, 40, 0, 195, 247, 40, 0, 195, 1, 41, 0, 195, 11, 41, 0, 195, 21, 41, 0, 195, 31, 41, 0, 195, 41, 41, 0, 195, 51, 41, 0, 195, 61, 41, 0, 195, 71, 41, 0, 195, 81, 41, 0, 195, 91, 41, 0, 195, 101, 41, 0, 195, 111, 41, 0, 195, 121, 41, 0, 195, 131, 41, 0, 195, 141, 41, 0, 195, 151, 41, 0, 195, 161, 41, 0, 195, 171, 41, 0, 195, 181, 41, 0, 195, 191, 41, 0, 195, 201, 41, 0, 195, 211, 41, 0, 195, 221, 41, 0, 195, 231, 41, 0, 195, 241, 41, 0, 195, 251, 41, 0, 195, 5, 42, 0, 195, 15, 42, 0, 195, 25, 42, 0, 195, 35, 42, 0, 195, 45, 42, 0, 195, 55, 42, 0, 195, 65, 42, 0, 195, 75, 42, 0, 195, 85, 42, 0, 195, 95, 42, 0, 195, 105, 42, 0, 195, 115, 42, 0, 195, 125, 42, 0, 195, 135, 42, 0, 195, 145, 42, 0, 195, 155, 42, 0, 195, 165, 42, 0, 195, 175, 42, 0, 195, 185, 42, 0, 195, 195, 42, 0, 195, 205, 42, 0, 195, 215, 42, 0, 195, 225, 42, 0, 195, 235, 42, 0, 195, 245, 42, 0, 195, 255, 42, 0, 195, 9, 43, 0, 195, 19, 43, 0, 195, 29, 43, 0, 195, 39, 43, 0, 195, 49, 43, 0, 195, 59, 43, 0, 195, 69, 43, 0, 195, 79, 43, 0, 195, 89, 43, 0, 195, 99, 43, 0, 195, 109, 43, 0, 195, 119, 43, 0, 195, 129, 43, 0, 195, 139, 43, 0, 195, 149, 43, 0, 195, 159, 43, 0, 195, 169, 43, 0, 195, 179, 43, 0, 195, 189, 43, 0, 195, 199, 43, 0, 195, 209, 43, 0, 195, 219, 43, 0, 195, 229, 43, 0, 195, 239, 43, 0, 195, 249, 43, 0, 195, 3, 44, 0, 195, 13, 44, 0, 195, 23, 44, 0, 195, 33, 44, 0, 195, 43, 44, 0, 195, 53, 44, 0, 195, 63, 44, 0, 195, 73, 44, 0, 195, 83, 44, 0, 195, 93, 44, 0, 195, 103, 44, 0, 195, 113, 44, 0, 195, 123, 44, 0, 195, 133, 44, 0, 195, 143, 44, 0, 195, 153, 44, 0, 195, 163, 44, 0, 195, 173, 44, 0, 195, 183, 44, 0, 195, 193, 44, 0, 195, 203, 44, 0, 195, 213, 44, 0, 195, 223, 44, 0, 195, 233, 44, 0, 195, 243, 44, 0, 195, 253, 44, 0, 195, 7, 45, 0, 195, 17, 45, 0, 195, 27, 45, 0, 195, 37, 45, 0, 195, 47, 45, 0, 195, 57, 45, 0, 195, 67, 45, 0, 195, 77, 45, 0, 195, 87, 45, 0, 195, 97, 45, 0, 195, 107, 45, 0, 195, 117, 45, 0, 195, 127, 45, 0, 195, 137, 45, 0, 195, 147, 45, 0, 195, 157, 45, 0, 195, 167, 45, 0, 195, 177, 45, 0, 195, 187, 45, 0, 195, 197, 45, 0, 195, 207, 45, 0, 195, 217, 45, 0, 195, 227, 45, 0, 195, 237, 45, 0, 195, 247, 45, 0, 195, 1, 46, 0, 195, 11, 46, 0, 195, 21, 46, 0, 195, 31, 46, 0, 195, 41, 46, 0, 195, 51, 46, 0, 195, 61, 46, 0, 195, 71, 46, 0, 195, 81, 46, 0, 195, 91, 46, 0, 195, 101, 46, 0, 195, 111, 46, 0, 195, 121, 46, 0, 195, 131, 46, 0, 195, 141, 46, 0, 195, 151, 46, 0, 195, 161, 46, 0, 195, 171, 46, 0, 195, 181, 46, 0, 195, 191, 46, 0, 195, 201, 46, 0, 195, 211, 46, 0, 195, 221, 46, 0, 195, 231, 46, 0, 195, 241, 46, 0, 195, 251, 46, 0, 195, 5, 47, 0, 195, 15, 47, 0, 195, 25, 47, 0, 195, 35, 47, 0, 195, 45, 47, 0, 195, 55, 47, 0, 195, 65, 47, 0, 195, 75, 47, 0, 195, 85, 47, 0, 195, 95, 47, 0, 195, 105, 47, 0, 195, 115, 47, 0, 195, 125, 47, 0, 195, 135, 47, 0, 195, 145, 47, 0, 195, 155, 47, 0, 195, 165, 47, 0, 195, 175, 47, 0, 195, 185, 47, 0, 195, 195, 47, 0, 195, 205, 47, 0, 195, 215, 47, 0, 195, 225, 47, 0, 195, 235, 47, 0, 195, 245, 47, 0, 195, 255, 47, 0, 195, 9, 48, 0, 195, 19, 48, 0, 195, 29, 48, 0, 195, 39, 48, 0, 195, 49, 48, 0, 195, 59, 48, 0, 195, 69, 48, 0, 195, 79, 48, 0, 195, 89, 48, 0, 195, 99, 48, 0, 195, 109, 48, 0, 195, 119, 48, 0, 195, 129, 48, 0, 195, 139, 48, 0, 195, 149, 48, 0, 195, 159, 48, 0, 195, 169, 48, 0, 195, 179, 48, 0, 195, 189, 48, 0, 195, 199, 48, 0, 195, 209, 48, 0, 195, 219, 48, 0, 195, 229, 48, 0, 195, 239, 48, 0, 195, 249, 48, 0, 195, 3, 49, 0, 195, 13, 49, 0, 195, 23, 49, 0, 195, 33, 49, 0, 195, 43, 49, 0, 195, 53, 49, 0, 195, 63, 49, 0, 195, 73, 49, 0, 195, 83, 49, 0, 195, 93, 49, 0, 195, 103, 49, 0, 195, 113, 49, 0, 195, 123, 49, 0, 195, 133, 49, 0, 195, 143, 49, 0, 195, 153, 49, 0, 195, 163, 49, 0, 195, 173, 49, 0, 195, 183, 49, 0, 195, 193, 49, 0, 195, 203, 49, 0, 195, 213, 49, 0, 195, 223, 49, 0, 195, 233, 49, 0, 195, 243, 49, 0, 195, 253, 49, 0, 195, 7, 50, 0, 195, 17, 50, 0, 195, 27, 50, 0, 195, 37, 50, 0, 195, 47, 50, 0, 195, 57, 50, 0, 195, 67, 50, 0, 195, 77, 50, 0, 195, 87, 50, 0, 195, 97, 50, 0, 195, 107, 50, 0, 195, 117, 50, 0, 195, 127, 50, 0, 195, 137, 50, 0, 195, 147, 50, 0, 195, 157, 50, 0, 195, 167, 50, 0, 195, 177, 50, 0, 195, 187, 50, 0, 195, 197, 50, 0, 195, 207, 50, 0, 195, 217, 50, 0, 195, 227, 50, 0, 195, 237, 50, 0, 195, 247, 50, 0, 195, 1, 51, 0, 195, 11, 51, 0, 195, 21, 51, 0, 195, 31, 51, 0, 195, 41, 51, 0, 195, 51, 51, 0, 195, 61, 51, 0, 195, 71, 51, 0, 195, 81, 51, 0, 195, 91, 51, 0, 195, 101, 51, 0, 195, 111, 51, 0, 195, 121, 51, 0, 195, 131, 51, 0, 195, 141, 51, 0, 195, 151, 51, 0, 195, 161, 51, 0, 195, 171, 51, 0, 195, 181, 51, 0, 195, 191, 51, 0, 195, 201, 51, 0, 195, 211, 51, 0, 195, 221, 51, 0, 195, 231, 51, 0, 195, 241, 51, 0, 195, 251, 51, 0, 195, 5, 52, 0, 195, 15, 52, 0, 195, 25, 52, 0, 195, 35, 52, 0, 195, 45, 52, 0, 195, 55, 52, 0, 195, 65, 52, 0, 195, 75, 52, 0, 195, 85, 52, 0, 195, 95, 52, 0, 195, 105, 52, 0, 195, 115, 52, 0, 195, 125, 52, 0, 195, 135, 52, 0, 195, 145, 52, 0, 195, 155, 52, 0, 195, 165, 52, 0, 195, 175, 52, 0, 195, 185, 52, 0, 195, 195, 52, 0, 195, 205, 52, 0, 195, 215, 52, 0, 195, 225, 52, 0, 195, 235, 52, 0, 195, 245, 52, 0, 195, 255, 52, 0, 195, 9, 53, 0, 195, 19, 53, 0, 195, 29, 53, 0, 195, 39, 53, 0, 195, 49, 53, 0, 195, 59, 53, 0, 195, 69, 53, 0, 195, 79, 53, 0, 195, 89, 53, 0, 195, 99, 53, 0, 195, 109, 53, 0, 195, 119, 53, 0, 195, 129, 53, 0, 195, 139, 53, 0, 195, 149, 53, 0, 195, 159, 53, 0, 195, 169, 53, 0, 195, 179, 53, 0, 195, 189, 53, 0, 195, 199, 53, 0, 195, 209, 53, 0, 195, 219, 53, 0, 195, 229, 53, 0, 195, 239, 53, 0, 195, 249, 53, 0, 195, 3, 54, 0, 195, 13, 54, 0, 195, 23, 54, 0, 195, 33, 54, 0, 195, 43, 54, 0, 195, 53, 54, 0, 195, 63, 54, 0, 195, 73, 54, 0, 195, 83, 54, 0, 195, 93, 54, 0, 195, 103, 54, 0, 195, 113, 54, 0, 195, 123, 54, 0, 195, 133, 54, 0, 195, 143, 54, 0, 195, 153, 54, 0, 195, 163, 54, 0, 195, 173, 54, 0, 195, 183, 54, 0, 195, 193, 54, 0, 195, 203, 54, 0, 195, 213, 54, 0, 195, 223, 54, 0, 195, 233, 54, 0, 195, 243, 54, 0, 195, 253, 54, 0, 195, 7, 55, 0, 195, 17, 55, 0, 195, 27, 55, 0, 195, 37, 55, 0, 195, 47, 55, 0, 195, 57, 55, 0, 195, 67, 55, 0, 195, 77, 55, 0, 195, 87, 55, 0, 195, 97, 55, 0, 195, 107, 55, 0, 195, 117, 55, 0, 195, 127, 55, 0, 195, 137, 55, 0, 195, 147, 55, 0, 195, 157, 55, 0, 195, 167, 55, 0, 195, 177, 55, 0, 195, 187, 55, 0, 195, 197, 55, 0, 195, 207, 55, 0, 195, 217, 55, 0, 195, 227, 55, 0, 195, 237, 55, 0, 195, 247, 55, 0, 195, 1, 56, 0, 195, 11, 56, 0, 195, 21, 56, 0, 195, 31, 56, 0, 195, 41, 56, 0, 195, 51, 56, 0, 195, 61, 56, 0, 195, 71, 56, 0, 195, 81, 56, 0, 195, 91, 56, 0, 195, 101, 56, 0, 195, 111, 56, 0, 195, 121, 56, 0, 195, 131, 56, 0, 195, 141, 56, 0, 195, 151, 56, 0, 195, 161, 56, 0, 195, 171, 56, 0, 195, 181, 56, 0, 195, 191, 56, 0, 195, 201, 56, 0, 195, 211, 56, 0, 195, 221, 56, 0, 195, 231, 56, 0, 195, 241, 56, 0, 195, 251, 56, 0, 195, 5, 57, 0, 195, 15, 57, 0, 195, 25, 57, 0, 195, 35, 57, 0, 195, 45, 57, 0, 195, 55, 57, 0, 195, 65, 57, 0, 195, 75, 57, 0, 195, 85, 57, 0, 195, 95, 57, 0, 195, 105, 57, 0, 195, 115, 57, 0, 195, 125, 57, 0, 195, 135, 57, 0, 195, 145, 57, 0, 195, 155, 57, 0, 195, 165, 57, 0, 195, 175, 57, 0, 195, 185, 57, 0, 195, 195, 57, 0, 195, 205, 57, 0, 195, 215, 57, 0, 195, 225, 57, 0, 195, 235, 57, 0, 195, 245, 57, 0, 195, 255, 57, 0, 195, 9, 58, 0, 195, 19, 58, 0, 195, 29, 58, 0, 195, 39, 58, 0, 195, 49, 58, 0, 195, 59, 58, 0, 195, 69, 58, 0, 195, 79, 58, 0, 195, 89, 58, 0, 195, 99, 58, 0, 195, 109, 58, 0, 195, 119, 58, 0, 195, 129, 58, 0, 195, 139, 58, 0, 195, 149, 58, 0, 195, 159, 58, 0, 195, 169, 58, 0, 195, 179, 58, 0, 195, 189, 58, 0, 195, 199, 58, 0, 195, 209, 58, 0, 195, 219, 58, 0, 195, 229, 58, 0, 195, 239, 58, 0, 195, 249, 58, 0, 195, 3, 59, 0, 195, 13, 59, 0, 195, 23, 59, 0, 195, 33, 59, 0, 195, 43, 59, 0, 195, 53, 59, 0, 195, 63, 59, 0, 195, 73, 59, 0, 195, 83, 59, 0, 195, 93, 59, 0, 195, 103, 59, 0, 195, 113, 59, 0, 195, 123, 59, 0, 195, 133, 59, 0, 195, 143, 59, 0, 195, 153, 59, 0, 195, 163, 59, 0, 195, 173, 59, 0, 195, 183, 59, 0, 195, 193, 59, 0, 195, 203, 59, 0, 195, 213, 59, 0, 195, 223, 59, 0, 195, 233, 59, 0, 195, 243, 59, 0, 195, 253, 59, 0, 195, 7, 60, 0, 195, 17, 60, 0, 195, 27, 60, 0, 195, 37, 60, 0, 195, 47, 60, 0, 195, 57, 60, 0, 195, 67, 60, 0, 195, 77, 60, 0, 195, 87, 60, 0, 195, 97, 60, 0, 195, 107, 60, 0, 195, 117, 60, 0, 195, 127, 60, 0, 195, 137, 60, 0, 195, 147, 60, 0, 195, 157, 60, 0, 195, 167, 60, 0, 195, 177, 60, 0, 195, 187, 60, 0, 195, 197, 60, 0, 195, 207, 60, 0, 195, 217, 60, 0, 195, 227, 60, 0, 195, 237, 60, 0, 195, 247, 60, 0, 195, 1, 61, 0, 195, 11, 61, 0, 195, 21, 61, 0, 195, 31, 61, 0, 195, 41, 61, 0, 195, 51, 61, 0, 195, 61, 61, 0, 195, 71, 61, 0, 195, 81, 61, 0, 195, 91, 61, 0, 195, 101, 61, 0, 195, 111, 61, 0, 195, 121, 61, 0, 195, 131, 61, 0, 195, 141, 61, 0, 195, 151, 61, 0, 195, 161, 61, 0, 195, 171, 61, 0, 195, 181, 61, 0, 195, 191, 61, 0, 195, 201, 61, 0, 195, 211, 61, 0, 195, 221, 61, 0, 195, 231, 61, 0, 195, 241, 61, 0, 195, 251, 61, 0, 195, 5, 62, 0, 195, 15, 62, 0, 195, 25, 62, 0, 195, 35, 62, 0, 195, 45, 62, 0, 195, 55, 62, 0, 195, 65, 62, 0, 195, 75, 62, 0, 195, 85, 62, 0, 195, 95, 62, 0, 195, 105, 62, 0, 195, 115, 62, 0, 195, 125, 62, 0, 195, 135, 62, 0, 195, 145, 62, 0, 195, 155, 62, 0, 195, 165, 62, 0, 195, 175, 62, 0, 195, 185, 62, 0, 195, 195, 62, 0, 195, 205, 62, 0, 195, 215, 62, 0, 195, 225, 62, 0, 195, 235, 62, 0, 195, 245, 62, 0, 195, 255, 62, 0, 195, 9, 63, 0, 195, 19, 63, 0, 195, 29, 63, 0, 195, 39, 63, 0, 195, 49, 63, 0, 195, 59, 63, 0, 195, 69, 63, 0, 195, 79, 63, 0, 195, 89, 63, 0, 195, 99, 63, 0, 195, 109, 63, 0, 195, 119, 63, 0, 195, 129, 63, 0, 195, 139, 63, 0, 195, 149, 63, 0, 195, 159, 63, 0, 195, 169, 63, 0, 195, 179, 63, 0, 195, 189, 63, 0, 195, 199, 63, 0, 195, 209, 63, 0, 195, 219, 63, 0, 195, 229, 63, 0, 195, 239, 63, 0, 195, 249, 63, 0, 195, 3, 64, 0, 195, 13, 64, 0, 195, 23, 64, 0, 195, 33, 64, 0, 195, 43, 64, 0, 195, 53, 64, 0, 195, 63, 64, 0, 195, 73, 64, 0, 195, 83, 64, 0, 195, 93, 64, 0, 195, 103, 64, 0, 195, 113, 64, 0, 195, 123, 64, 0, 195, 133, 64, 0, 195, 143, 64, 0, 195, 153, 64, 0, 195, 163, 64, 0, 195, 173, 64, 0, 195, 183, 64, 0, 195, 193, 64, 0, 195, 203, 64, 0, 195, 213, 64, 0, 195, 223, 64, 0, 195, 233, 64, 0, 195, 243, 64, 0, 195, 253, 64, 0, 195, 7, 65, 0, 195, 17, 65, 0, 195, 27, 65, 0, 195, 37, 65, 0, 195, 47, 65, 0, 195, 57, 65, 0, 195, 67, 65, 0, 195, 77, 65, 0, 195, 87, 65, 0, 195, 97, 65, 0, 195, 107, 65, 0, 195, 117, 65, 0, 195, 127, 65, 0, 195, 137, 65, 0, 195, 147, 65, 0, 195, 157, 65, 0, 195, 167, 65, 0, 195, 177, 65, 0, 195, 187, 65, 0, 195, 197, 65, 0, 195, 207, 65, 0, 195, 217, 65, 0, 195, 227, 65, 0, 195, 237, 65, 0, 195, 247, 65, 0, 195, 1, 66, 0, 195, 11, 66, 0, 195, 21, 66, 0, 195, 31, 66, 0, 195, 41, 66, 0, 195, 51, 66, 0, 195, 61, 66, 0, 195, 71, 66, 0, 195, 81, 66, 0, 195, 91, 66, 0, 195, 101, 66, 0, 195, 111, 66, 0, 195, 121, 66, 0, 195, 131, 66, 0, 195, 141, 66, 0, 195, 151, 66, 0, 195, 161, 66, 0, 195, 171, 66, 0, 195, 181, 66, 0, 195, 191, 66, 0, 195, 201, 66, 0, 195, 211, 66, 0, 195, 221, 66, 0, 195, 231, 66, 0, 195, 241, 66, 0, 195, 251, 66, 0, 195, 5, 67, 0, 195, 15, 67, 0, 195, 25, 67, 0, 195, 35, 67, 0, 195, 45, 67, 0, 195, 55, 67, 0, 195, 65, 67, 0, 195, 75, 67, 0, 195, 85, 67, 0, 195, 95, 67, 0, 195, 105, 67, 0, 195, 115, 67, 0, 195, 125, 67, 0, 195, 135, 67, 0, 195, 145, 67, 0, 195, 155, 67, 0, 195, 165, 67, 0, 195, 175, 67, 0, 195, 185, 67, 0, 195, 195, 67, 0, 195, 205, 67, 0, 195, 215, 67, 0, 195, 225, 67, 0, 195, 235, 67, 0, 195, 245, 67, 0, 195, 255, 67, 0, 195, 9, 68, 0, 195, 19, 68, 0, 195, 29, 68, 0, 195, 39, 68, 0, 195, 49, 68, 0, 195, 59, 68, 0, 195, 69, 68, 0, 195, 79, 68, 0, 195, 89, 68, 0, 195, 99, 68, 0, 195, 109, 68, 0, 195, 119, 68, 0, 195, 129, 68, 0, 195, 139, 68, 0, 195, 149, 68, 0, 195, 159, 68, 0, 195, 169, 68, 0, 195, 179, 68, 0, 195, 189, 68, 0, 195, 199, 68, 0, 195, 209, 68, 0, 195, 219, 68, 0, 195, 229, 68, 0, 195, 239, 68, 0, 195, 249, 68, 0, 195, 3, 69, 0, 195, 13, 69, 0, 195, 23, 69, 0, 195, 33, 69, 0, 195, 43, 69, 0, 195, 53, 69, 0, 195, 63, 69, 0, 195, 73, 69, 0, 195, 83, 69, 0, 195, 93, 69, 0, 195, 103, 69, 0, 195, 113, 69, 0, 195, 123, 69, 0, 195, 133, 69, 0, 195, 143, 69, 0, 195, 153, 69, 0, 195, 163, 69, 0, 195, 173, 69, 0, 195, 183, 69, 0, 195, 193, 69, 0, 195, 203, 69, 0, 195, 213, 69, 0, 195, 223, 69, 0, 195, 233, 69, 0, 195, 243, 69, 0, 195, 253, 69, 0, 195, 7, 70, 0, 195, 17, 70, 0, 195, 27, 70, 0, 195, 37, 70, 0, 195, 47, 70, 0, 195, 57, 70, 0, 195, 67, 70, 0, 195, 77, 70, 0, 195, 87, 70, 0, 195, 97, 70, 0, 195, 107, 70, 0, 195, 117, 70, 0, 195, 127, 70, 0, 195, 137, 70, 0, 195, 147, 70, 0, 195, 157, 70, 0, 195, 167, 70, 0, 195, 177, 70, 0, 195, 187, 70, 0, 195, 197, 70, 0, 195, 207, 70, 0, 195, 217, 70, 0, 195, 227, 70, 0, 195, 237, 70, 0, 195, 247, 70, 0, 195, 1, 71, 0, 195, 11, 71, 0, 195, 21, 71, 0, 195, 31, 71, 0, 195, 41, 71, 0, 195, 51, 71, 0, 195, 61, 71, 0, 195, 71, 71, 0, 195, 81, 71, 0, 195, 91, 71, 0, 195, 101, 71, 0, 195, 111, 71, 0, 195, 121, 71, 0, 195, 131, 71, 0, 195, 141, 71, 0, 195, 151, 71, 0, 195, 161, 71, 0, 195, 171, 71, 0, 195, 181, 71, 0, 195, 191, 71, 0, 195, 201, 71, 0, 195, 211, 71, 0, 195, 221, 71, 0, 195, 231, 71, 0, 195, 241, 71, 0, 195, 251, 71, 0, 195, 5, 72, 0, 195, 15, 72, 0, 195, 25, 72, 0, 195, 35, 72, 0, 195, 45, 72, 0, 195, 55, 72, 0, 195, 65, 72, 0, 195, 75, 72, 0, 195, 85, 72, 0, 195, 95, 72, 0, 195, 105, 72, 0, 195, 115, 72, 0, 195, 125, 72, 0, 195, 135, 72, 0, 195, 145, 72, 0, 195, 155, 72, 0, 195, 165, 72, 0, 195, 175, 72, 0, 195, 185, 72, 0, 195, 195, 72, 0, 195, 205, 72, 0, 195, 215, 72, 0, 195, 225, 72, 0, 195, 235, 72, 0, 195, 245, 72, 0, 195, 255, 72, 0, 195, 9, 73, 0, 195, 19, 73, 0, 195, 29, 73, 0, 195, 39, 73, 0, 195, 49, 73, 0, 195, 59, 73, 0, 195, 69, 73, 0, 195, 79, 73, 0, 195, 89, 73, 0, 195, 99, 73, 0, 195, 109, 73, 0, 195, 119, 73, 0, 195, 129, 73, 0, 195, 139, 73, 0, 195, 149, 73, 0, 195, 159, 73, 0, 195, 169, 73, 0, 195, 179, 73, 0, 195, 189, 73, 0, 195, 199, 73, 0, 195, 209, 73, 0, 195, 219, 73, 0, 195, 229, 73, 0, 195, 239, 73, 0, 195, 249, 73, 0, 195, 3, 74, 0, 195, 13, 74, 0, 195, 23, 74, 0, 195, 33, 74, 0, 195, 43, 74, 0, 195, 53, 74, 0, 195, 63, 74, 0, 195, 73, 74, 0, 195, 83, 74, 0, 195, 93, 74, 0, 195, 103, 74, 0, 195, 113, 74, 0, 195, 123, 74, 0, 195, 133, 74, 0, 195, 143, 74, 0, 195, 153, 74, 0, 195, 163, 74, 0, 195, 173, 74, 0, 195, 183, 74, 0, 195, 193, 74, 0, 195, 203, 74, 0, 195, 213, 74, 0, 195, 223, 74, 0, 195, 233, 74, 0, 195, 243, 74, 0, 195, 253, 74, 0, 195, 7, 75, 0, 195, 17, 75, 0, 195, 27, 75, 0, 195, 37, 75, 0, 195, 47, 75, 0, 195, 57, 75, 0, 195, 67, 75, 0, 195, 77, 75, 0, 195, 87, 75, 0, 195, 97, 75, 0, 195, 107, 75, 0, 195, 117, 75, 0, 195, 127, 75, 0, 195, 137, 75, 0, 195, 147, 75, 0, 195, 157, 75, 0, 195, 167, 75, 0, 195, 177, 75, 0, 195, 187, 75, 0, 195, 197, 75, 0, 195, 207, 75, 0, 195, 217, 75, 0, 195, 227, 75, 0, 195, 237, 75, 0, 195, 247, 75, 0, 195, 1, 76, 0, 195, 11, 76, 0, 195, 21, 76, 0, 195, 31, 76, 0, 195, 41, 76, 0, 195, 51, 76, 0, 195, 61, 76, 0, 195, 71, 76, 0, 195, 81, 76, 0, 195, 91, 76, 0, 195, 101, 76, 0, 195, 111, 76, 0, 195, 121, 76, 0, 195, 131, 76, 0, 195, 141, 76, 0, 195, 151, 76, 0, 195, 161, 76, 0, 195, 171, 76, 0, 195, 181, 76, 0, 195, 191, 76, 0, 195, 201, 76, 0, 195, 211, 76, 0, 195, 221, 76, 0, 195, 231, 76, 0, 195, 241, 76, 0, 195, 251, 76, 0, 195, 5, 77, 0, 195, 15, 77, 0, 195, 25, 77, 0, 195, 35, 77, 0, 195, 45, 77, 0, 195, 55, 77, 0, 195, 65, 77, 0, 195, 75, 77, 0, 195, 85, 77, 0, 195, 95, 77, 0, 195, 105, 77, 0, 195, 115, 77, 0, 195, 125, 77, 0, 195, 135, 77, 0, 195, 145, 77, 0, 195, 155, 77, 0, 195, 165, 77, 0, 195, 175, 77, 0, 195, 185, 77, 0, 195, 195, 77, 0, 195, 205, 77, 0, 195, 215, 77, 0, 195, 225, 77, 0, 195, 235, 77, 0, 195, 245, 77, 0, 195, 255, 77, 0, 195, 9, 78, 0, 195, 19, 78, 0, 195, 29, 78, 0, 195, 39, 78, 0, 195, 49, 78, 0, 195, 59, 78, 0, 195, 69, 78, 0, 195, 79, 78, 0, 195, 89, 78, 0, 195, 99, 78, 0, 195, 109, 78, 0, 195, 119, 78, 0, 195, 129, 78, 0, 195, 139, 78, 0, 195, 149, 78, 0, 195, 159, 78, 0, 195, 169, 78, 0, 195, 179, 78, 0, 195, 189, 78, 0, 195, 199, 78, 0, 195, 209, 78, 0, 195, 219, 78, 0, 195, 229, 78, 0, 195, 239, 78, 0, 195, 249, 78, 0, 195, 3, 79, 0, 195, 13, 79, 0, 195, 23, 79, 0, 195, 33, 79, 0, 195, 43, 79, 0, 195, 53, 79, 0, 195, 63, 79, 0, 195, 73, 79, 0, 195, 83, 79, 0, 195, 93, 79, 0, 195, 103, 79, 0, 195, 113, 79, 0, 195, 123, 79, 0, 195, 133, 79, 0, 195, 143, 79, 0, 195, 153, 79, 0, 195, 163, 79, 0, 195, 173, 79, 0, 195, 183, 79, 0, 195, 193, 79, 0, 195, 203, 79, 0, 195, 213, 79, 0, 195, 223, 79, 0, 195, 233, 79, 0, 195, 243, 79, 0, 195, 253, 79, 0, 195, 7, 80, 0, 195, 17, 80, 0, 195, 27, 80, 0, 195, 37, 80, 0, 195, 47, 80, 0, 195, 57, 80, 0, 195, 67, 80, 0, 195, 77, 80, 0, 195, 87, 80, 0, 195, 97, 80, 0, 195, 107, 80, 0, 195, 117, 80, 0, 195, 127, 80, 0, 195, 137, 80, 0, 195, 147, 80, 0, 195, 157, 80, 0, 195, 167, 80, 0, 195, 177, 80, 0, 195, 187, 80, 0, 195, 197, 80, 0, 195, 207, 80, 0, 195, 217, 80, 0, 195, 227, 80, 0, 195, 237, 80, 0, 195, 247, 80, 0, 195, 1, 81, 0, 195, 11, 81, 0, 195, 21, 81, 0, 195, 31, 81, 0, 195, 41, 81, 0, 195, 51, 81, 0, 195, 61, 81, 0, 195, 71, 81, 0, 195, 81, 81, 0, 195, 91, 81, 0, 195, 101, 81, 0, 195, 111, 81, 0, 195, 121, 81, 0, 195, 131, 81, 0, 195, 141, 81, 0, 195, 151, 81, 0, 195, 161, 81, 0, 195, 171, 81, 0, 195, 181, 81, 0, 195, 191, 81, 0, 195, 201, 81, 0, 195, 211, 81, 0, 195, 221, 81, 0, 195, 231, 81, 0, 195, 241, 81, 0, 195, 251, 81, 0, 195, 5, 82, 0, 195, 15, 82, 0, 195, 25, 82, 0, 195, 35, 82, 0, 195, 45, 82, 0, 195, 55, 82, 0, 195, 65, 82, 0, 195, 75, 82, 0, 195, 85, 82, 0, 195, 95, 82, 0, 195, 105, 82, 0, 195, 115, 82, 0, 195, 125, 82, 0, 195, 135, 82, 0, 195, 145, 82, 0, 195, 155, 82, 0, 195, 165, 82, 0, 195, 175, 82, 0, 195, 185, 82, 0, 195, 195, 82, 0, 195, 205, 82, 0, 195, 215, 82, 0, 195, 225, 82, 0, 195, 235, 82, 0, 195, 245, 82, 0, 195, 255, 82, 0, 195, 9, 83, 0, 195, 19, 83, 0, 195, 29, 83, 0, 195, 39, 83, 0, 195, 49, 83, 0, 195, 59, 83, 0, 195, 69, 83, 0, 195, 79, 83, 0, 195, 89, 83, 0, 195, 99, 83, 0, 195, 109, 83, 0, 195, 119, 83, 0, 195, 129, 83, 0, 195, 139, 83, 0, 195, 149, 83, 0, 195, 159, 83, 0, 195, 169, 83, 0, 195, 179, 83, 0, 195, 189, 83, 0, 195, 199, 83, 0, 195, 209, 83, 0, 195, 219, 83, 0, 195, 229, 83, 0, 195, 239, 83, 0, 195, 249, 83, 0, 195, 3, 84, 0, 195, 13, 84, 0, 195, 23, 84, 0, 195, 33, 84, 0, 195, 43, 84, 0, 195, 53, 84, 0, 195, 63, 84, 0, 195, 73, 84, 0, 195, 83, 84, 0, 195, 93, 84, 0, 195, 103, 84, 0, 195, 113, 84, 0, 195, 123, 84, 0, 195, 133, 84, 0, 195, 143, 84, 0, 195, 153, 84, 0, 195, 163, 84, 0, 195, 173, 84, 0, 195, 183, 84, 0, 195, 193, 84, 0, 195, 203, 84, 0, 195, 213, 84, 0, 195, 223, 84, 0, 195, 233, 84, 0, 195, 243, 84, 0, 195, 253, 84, 0, 195, 7, 85, 0, 195, 17, 85, 0, 195, 27, 85, 0, 195, 37, 85, 0, 195, 47, 85, 0, 195, 57, 85, 0, 195, 67, 85, 0, 195, 77, 85, 0, 195, 87, 85, 0, 195, 97, 85, 0, 195, 107, 85, 0, 195, 117, 85, 0, 195, 127, 85, 0, 195, 137, 85, 0, 195, 147, 85, 0, 195, 157, 85, 0, 195, 167, 85, 0, 195, 177, 85, 0, 195, 187, 85, 0, 195, 197, 85, 0, 195, 207, 85, 0, 195, 217, 85, 0, 195, 227, 85, 0, 195, 237, 85, 0, 195, 247, 85, 0, 195, 1, 86, 0, 195, 11, 86, 0, 195, 21, 86, 0, 195, 31, 86, 0, 195, 41, 86, 0, 195, 51, 86, 0, 195, 61, 86, 0, 195, 71, 86, 0, 195, 81, 86, 0, 195, 91, 86, 0, 195, 101, 86, 0, 195, 111, 86, 0, 195, 121, 86, 0, 195, 131, 86, 0, 195, 141, 86, 0, 195, 151, 86, 0, 195, 161, 86, 0, 195, 171, 86, 0, 195, 181, 86, 0, 195, 191, 86, 0, 195, 201, 86, 0, 195, 211, 86, 0, 195, 221, 86, 0, 195, 231, 86, 0, 195, 241, 86, 0, 195, 251, 86, 0, 195, 5, 87, 0, 195, 15, 87, 0, 195, 25, 87, 0, 195, 35, 87, 0, 195, 45, 87, 0, 195, 55, 87, 0, 195, 65, 87, 0, 195, 75, 87, 0, 195, 85, 87, 0, 195, 95, 87, 0, 195, 105, 87, 0, 195, 115, 87, 0, 195, 125, 87, 0, 195, 135, 87, 0, 195, 145, 87, 0, 195, 155, 87, 0, 195, 165, 87, 0, 195, 175, 87, 0, 195, 185, 87, 0, 195, 195, 87, 0, 195, 205, 87, 0, 195, 215, 87, 0, 195, 225, 87, 0, 195, 235, 87, 0, 195, 245, 87, 0, 195, 255, 87, 0, 195, 9, 88, 0, 195, 19, 88, 0, 195, 29, 88, 0, 195, 39, 88, 0, 195, 49, 88, 0, 195, 59, 88, 0, 195, 69, 88, 0, 195, 79, 88, 0, 195, 89, 88, 0, 195, 99, 88, 0, 195, 109, 88, 0, 195, 119, 88, 0, 195, 129, 88, 0, 195, 139, 88, 0, 195, 149, 88, 0, 195, 159, 88, 0, 195, 169, 88, 0, 195, 179, 88, 0, 195, 189, 88, 0, 195, 199, 88, 0, 195, 209, 88, 0, 195, 219, 88, 0, 195, 229, 88, 0, 195, 239, 88, 0, 195, 249, 88, 0, 195, 3, 89, 0, 195, 13, 89, 0, 195, 23, 89, 0, 195, 33, 89, 0, 195, 43, 89, 0, 195, 53, 89, 0, 195, 63, 89, 0, 195, 73, 89, 0, 195, 83, 89, 0, 195, 93, 89, 0, 195, 103, 89, 0, 195, 113, 89, 0, 195, 123, 89, 0, 195, 133, 89, 0, 195, 143, 89, 0, 195, 153, 89, 0, 195, 163, 89, 0, 195, 173, 89, 0, 195, 183, 89, 0, 195, 193, 89, 0, 195, 203, 89, 0, 195, 213, 89, 0, 195, 223, 89, 0, 195, 233, 89, 0, 195, 243, 89, 0, 195, 253, 89, 0, 195, 7, 90, 0, 195, 17, 90, 0, 195, 27, 90, 0, 195, 37, 90, 0, 195, 47, 90, 0, 195, 57, 90, 0, 195, 67, 90, 0, 195, 77, 90, 0, 195, 87, 90, 0, 195, 97, 90, 0, 195, 107, 90, 0, 195, 117, 90, 0, 195, 127, 90, 0, 195, 137, 90, 0, 195, 147, 90, 0, 195, 157, 90, 0, 195, 167, 90, 0, 195, 177, 90, 0, 195, 187, 90, 0, 195, 197, 90, 0, 195, 207, 90, 0, 195, 217, 90, 0, 195, 227, 90, 0, 195, 237, 90, 0, 195, 247, 90, 0, 195, 1, 91, 0, 195, 11, 91, 0, 195, 21, 91, 0, 195, 31, 91, 0, 195, 41, 91, 0, 195, 51, 91, 0, 195, 61, 91, 0, 195, 71, 91, 0, 195, 81, 91, 0, 195, 91, 91, 0, 195, 101, 91, 0, 195, 111, 91, 0, 195, 121, 91, 0, 195, 131, 91, 0, 195, 141, 91, 0, 195, 151, 91, 0, 195, 161, 91, 0, 195, 171, 91, 0, 195, 181, 91, 0, 195, 191, 91, 0, 195, 201, 91, 0, 195, 211, 91, 0, 195, 221, 91, 0, 195, 231, 91, 0, 195, 241, 91, 0, 195, 251, 91, 0, 195, 5, 92, 0, 195, 15, 92, 0, 195, 25, 92, 0, 195, 35, 92, 0, 195, 45, 92, 0, 195, 55, 92, 0, 195, 65, 92, 0, 195, 75, 92, 0, 195, 85, 92, 0, 195, 95, 92, 0, 195, 105, 92, 0, 195, 115, 92, 0, 195, 125, 92, 0, 195, 135, 92, 0, 195, 145, 92, 0, 195, 155, 92, 0, 195, 165, 92, 0, 195, 175, 92, 0, 195, 185, 92, 0, 195, 195, 92, 0, 195, 205, 92, 0, 195, 215, 92, 0, 195, 225, 92, 0, 195, 235, 92, 0, 195, 245, 92, 0, 195, 255, 92, 0, 195, 9, 93, 0, 195, 19, 93, 0, 195, 29, 93, 0, 195, 39, 93, 0, 195, 49, 93, 0, 195, 59, 93, 0, 195, 69, 93, 0, 195, 79, 93, 0, 195, 89, 93, 0, 195, 99, 93, 0, 195, 109, 93, 0, 195, 119, 93, 0, 195, 129, 93, 0, 195, 139, 93, 0, 195, 149, 93, 0, 195, 159, 93, 0, 195, 169, 93, 0, 195, 179, 93, 0, 195, 189, 93, 0, 195, 199, 93, 0, 195, 209, 93, 0, 195, 219, 93, 0, 195, 229, 93, 0, 195, 239, 93, 0, 195, 249, 93, 0, 195, 3, 94, 0, 195, 13, 94, 0, 195, 23, 94, 0, 195, 33, 94, 0, 195, 43, 94, 0, 195, 53, 94, 0, 195, 63, 94, 0, 195, 73, 94, 0, 195, 83, 94, 0, 195, 93, 94, 0, 195, 103, 94, 0, 195, 113, 94, 0, 195, 123, 94, 0, 195, 133, 94, 0, 195, 143, 94, 0, 195, 153, 94, 0, 195, 163, 94, 0, 195, 173, 94, 0, 195, 183, 94, 0, 195, 193, 94, 0, 195, 203, 94, 0, 195, 213, 94, 0, 195, 223, 94, 0, 195, 233, 94, 0, 195, 243, 94, 0, 195, 253, 94, 0, 195, 7, 95, 0, 195, 17, 95, 0, 195, 27, 95, 0, 195, 37, 95, 0, 195, 47, 95, 0, 195, 57, 95, 0, 195, 67, 95, 0, 195, 77, 95, 0, 195, 87, 95, 0, 195, 97, 95, 0, 195, 107, 95, 0, 195, 117, 95, 0, 195, 127, 95, 0, 195, 137, 95, 0, 195, 147, 95, 0, 195, 157, 95, 0, 195, 167, 95, 0, 195, 177, 95, 0, 195, 187, 95, 0, 195, 197, 95, 0, 195, 207, 95, 0, 195, 217, 95, 0, 195, 227, 95, 0, 195, 237, 95, 0, 195, 247, 95, 0, 195, 1, 96, 0, 195, 11, 96, 0, 195, 21, 96, 0, 195, 31, 96, 0, 195, 41, 96, 0, 195, 51, 96, 0, 195, 61, 96, 0, 195, 71, 96, 0, 195, 81, 96, 0, 195, 91, 96, 0, 195, 101, 96, 0, 195, 111, 96, 0, 195, 121, 96, 0, 195, 131, 96, 0, 195, 141, 96, 0, 195, 151, 96, 0, 195, 161, 96, 0, 195, 171, 96, 0, 195, 181, 96, 0, 195, 191, 96, 0, 195, 201, 96, 0, 195, 211, 96, 0, 195, 221, 96, 0, 195, 231, 96, 0, 195, 241, 96, 0, 195, 251, 96, 0, 195, 5, 97, 0, 195, 15, 97, 0, 195, 25, 97, 0, 195, 35, 97, 0, 195, 45, 97, 0, 195, 55, 97, 0, 195, 65, 97, 0, 195, 75, 97, 0, 195, 85, 97, 0, 195, 95, 97, 0, 195, 105, 97, 0, 195, 115, 97, 0, 195, 125, 97, 0, 195, 135, 97, 0, 195, 145, 97, 0, 195, 155, 97, 0, 195, 165, 97, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_four_too_low_frequency.json b/tests/recordings/logic_analyzer/test_capture_four_too_low_frequency.json deleted file mode 100644 index 35913bbe..00000000 --- a/tests/recordings/logic_analyzer/test_capture_four_too_low_frequency.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39]], [[], [1], [], [], [], [1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_nonblocking.json b/tests/recordings/logic_analyzer/test_capture_nonblocking.json deleted file mode 100644 index 06bb7be7..00000000 --- a/tests/recordings/logic_analyzer/test_capture_nonblocking.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [0], [10], [9], [196, 9], [0]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 60, 1, 0, 0, 125, 2, 0, 0, 188, 3, 0, 0, 253, 4, 0, 0, 60, 6, 0, 0, 125, 7, 0, 0, 188, 8, 0, 0, 253, 9, 0, 0, 60, 11, 0, 0, 125, 12, 0, 0, 188, 13, 0, 0, 253, 14, 0, 0, 60, 16, 0, 0, 125, 17, 0, 0, 188, 18, 0, 0, 253, 19, 0, 0, 60, 21, 0, 0, 125, 22, 0, 0, 188, 23, 0, 0, 253, 24, 0, 0, 60, 26, 0, 0, 125, 27, 0, 0, 188, 28, 0, 0, 253, 29, 0, 0, 60, 31, 0, 0, 125, 32, 0, 0, 188, 33, 0, 0, 253, 34, 0, 0, 60, 36, 0, 0, 125, 37, 0, 0, 188, 38, 0, 0, 253, 39, 0, 0, 60, 41, 0, 0, 125, 42, 0, 0, 188, 43, 0, 0, 253, 44, 0, 0, 60, 46, 0, 0, 125, 47, 0, 0, 188, 48, 0, 0, 253, 49, 0, 0, 60, 51, 0, 0, 125, 52, 0, 0, 188, 53, 0, 0, 253, 54, 0, 0, 60, 56, 0, 0, 125, 57, 0, 0, 188, 58, 0, 0, 253, 59, 0, 0, 60, 61, 0, 0, 125, 62, 0, 0, 188, 63, 0, 0, 253, 64, 0, 0, 60, 66, 0, 0, 125, 67, 0, 0, 188, 68, 0, 0, 253, 69, 0, 0, 60, 71, 0, 0, 125, 72, 0, 0, 188, 73, 0, 0, 253, 74, 0, 0, 60, 76, 0, 0, 125, 77, 0, 0, 188, 78, 0, 0, 253, 79, 0, 0, 60, 81, 0, 0, 125, 82, 0, 0, 188, 83, 0, 0, 253, 84, 0, 0, 60, 86, 0, 0, 125, 87, 0, 0, 188, 88, 0, 0, 253, 89, 0, 0, 60, 91, 0, 0, 125, 92, 0, 0, 188, 93, 0, 0, 253, 94, 0, 0, 60, 96, 0, 0, 125, 97, 0, 0, 188, 98, 0, 0, 253, 99, 0, 0, 60, 101, 0, 0, 125, 102, 0, 0, 188, 103, 0, 0, 253, 104, 0, 0, 60, 106, 0, 0, 125, 107, 0, 0, 188, 108, 0, 0, 253, 109, 0, 0, 60, 111, 0, 0, 125, 112, 0, 0, 188, 113, 0, 0, 253, 114, 0, 0, 60, 116, 0, 0, 125, 117, 0, 0, 188, 118, 0, 0, 253, 119, 0, 0, 60, 121, 0, 0, 125, 122, 0, 0, 188, 123, 0, 0, 253, 124, 0, 0, 60, 126, 0, 0, 125, 127, 0, 0, 188, 128, 0, 0, 253, 129, 0, 0, 60, 131, 0, 0, 125, 132, 0, 0, 188, 133, 0, 0, 253, 134, 0, 0, 60, 136, 0, 0, 125, 137, 0, 0, 188, 138, 0, 0, 253, 139, 0, 0, 60, 141, 0, 0, 125, 142, 0, 0, 188, 143, 0, 0, 253, 144, 0, 0, 60, 146, 0, 0, 125, 147, 0, 0, 188, 148, 0, 0, 253, 149, 0, 0, 60, 151, 0, 0, 125, 152, 0, 0, 188, 153, 0, 0, 253, 154, 0, 0, 60, 156, 0, 0, 125, 157, 0, 0, 188, 158, 0, 0, 253, 159, 0, 0, 60, 161, 0, 0, 125, 162, 0, 0, 188, 163, 0, 0, 253, 164, 0, 0, 60, 166, 0, 0, 125, 167, 0, 0, 188, 168, 0, 0, 253, 169, 0, 0, 60, 171, 0, 0, 125, 172, 0, 0, 188, 173, 0, 0, 253, 174, 0, 0, 60, 176, 0, 0, 125, 177, 0, 0, 188, 178, 0, 0, 253, 179, 0, 0, 60, 181, 0, 0, 125, 182, 0, 0, 188, 183, 0, 0, 253, 184, 0, 0, 60, 186, 0, 0, 125, 187, 0, 0, 188, 188, 0, 0, 253, 189, 0, 0, 60, 191, 0, 0, 125, 192, 0, 0, 188, 193, 0, 0, 253, 194, 0, 0, 60, 196, 0, 0, 125, 197, 0, 0, 188, 198, 0, 0, 253, 199, 0, 0, 60, 201, 0, 0, 125, 202, 0, 0, 188, 203, 0, 0, 253, 204, 0, 0, 60, 206, 0, 0, 125, 207, 0, 0, 188, 208, 0, 0, 253, 209, 0, 0, 60, 211, 0, 0, 125, 212, 0, 0, 188, 213, 0, 0, 253, 214, 0, 0, 60, 216, 0, 0, 125, 217, 0, 0, 188, 218, 0, 0, 253, 219, 0, 0, 60, 221, 0, 0, 125, 222, 0, 0, 188, 223, 0, 0, 253, 224, 0, 0, 60, 226, 0, 0, 125, 227, 0, 0, 188, 228, 0, 0, 253, 229, 0, 0, 60, 231, 0, 0, 125, 232, 0, 0, 188, 233, 0, 0, 253, 234, 0, 0, 60, 236, 0, 0, 125, 237, 0, 0, 188, 238, 0, 0, 253, 239, 0, 0, 60, 241, 0, 0, 125, 242, 0, 0, 188, 243, 0, 0, 253, 244, 0, 0, 60, 246, 0, 0, 125, 247, 0, 0, 188, 248, 0, 0, 253, 249, 0, 0, 60, 251, 0, 0, 125, 252, 0, 0, 188, 253, 0, 0, 253, 254, 0, 0, 60, 0, 1, 0, 125, 1, 1, 0, 188, 2, 1, 0, 253, 3, 1, 0, 60, 5, 1, 0, 125, 6, 1, 0, 188, 7, 1, 0, 253, 8, 1, 0, 60, 10, 1, 0, 125, 11, 1, 0, 188, 12, 1, 0, 253, 13, 1, 0, 60, 15, 1, 0, 125, 16, 1, 0, 188, 17, 1, 0, 253, 18, 1, 0, 60, 20, 1, 0, 125, 21, 1, 0, 188, 22, 1, 0, 253, 23, 1, 0, 60, 25, 1, 0, 125, 26, 1, 0, 188, 27, 1, 0, 253, 28, 1, 0, 60, 30, 1, 0, 125, 31, 1, 0, 188, 32, 1, 0, 253, 33, 1, 0, 60, 35, 1, 0, 125, 36, 1, 0, 188, 37, 1, 0, 253, 38, 1, 0, 60, 40, 1, 0, 125, 41, 1, 0, 188, 42, 1, 0, 253, 43, 1, 0, 60, 45, 1, 0, 125, 46, 1, 0, 188, 47, 1, 0, 253, 48, 1, 0, 60, 50, 1, 0, 125, 51, 1, 0, 188, 52, 1, 0, 253, 53, 1, 0, 60, 55, 1, 0, 125, 56, 1, 0, 188, 57, 1, 0, 253, 58, 1, 0, 60, 60, 1, 0, 125, 61, 1, 0, 188, 62, 1, 0, 253, 63, 1, 0, 60, 65, 1, 0, 125, 66, 1, 0, 188, 67, 1, 0, 253, 68, 1, 0, 60, 70, 1, 0, 125, 71, 1, 0, 188, 72, 1, 0, 253, 73, 1, 0, 60, 75, 1, 0, 125, 76, 1, 0, 188, 77, 1, 0, 253, 78, 1, 0, 60, 80, 1, 0, 125, 81, 1, 0, 188, 82, 1, 0, 253, 83, 1, 0, 60, 85, 1, 0, 125, 86, 1, 0, 188, 87, 1, 0, 253, 88, 1, 0, 60, 90, 1, 0, 125, 91, 1, 0, 188, 92, 1, 0, 253, 93, 1, 0, 60, 95, 1, 0, 125, 96, 1, 0, 188, 97, 1, 0, 253, 98, 1, 0, 60, 100, 1, 0, 125, 101, 1, 0, 188, 102, 1, 0, 253, 103, 1, 0, 60, 105, 1, 0, 125, 106, 1, 0, 188, 107, 1, 0, 253, 108, 1, 0, 60, 110, 1, 0, 125, 111, 1, 0, 188, 112, 1, 0, 253, 113, 1, 0, 60, 115, 1, 0, 125, 116, 1, 0, 188, 117, 1, 0, 253, 118, 1, 0, 60, 120, 1, 0, 125, 121, 1, 0, 188, 122, 1, 0, 253, 123, 1, 0, 60, 125, 1, 0, 125, 126, 1, 0, 188, 127, 1, 0, 253, 128, 1, 0, 60, 130, 1, 0, 125, 131, 1, 0, 188, 132, 1, 0, 253, 133, 1, 0, 60, 135, 1, 0, 125, 136, 1, 0, 188, 137, 1, 0, 253, 138, 1, 0, 60, 140, 1, 0, 125, 141, 1, 0, 188, 142, 1, 0, 253, 143, 1, 0, 60, 145, 1, 0, 125, 146, 1, 0, 188, 147, 1, 0, 253, 148, 1, 0, 60, 150, 1, 0, 125, 151, 1, 0, 188, 152, 1, 0, 253, 153, 1, 0, 60, 155, 1, 0, 125, 156, 1, 0, 188, 157, 1, 0, 253, 158, 1, 0, 60, 160, 1, 0, 125, 161, 1, 0, 188, 162, 1, 0, 253, 163, 1, 0, 60, 165, 1, 0, 125, 166, 1, 0, 188, 167, 1, 0, 253, 168, 1, 0, 60, 170, 1, 0, 125, 171, 1, 0, 188, 172, 1, 0, 253, 173, 1, 0, 60, 175, 1, 0, 125, 176, 1, 0, 188, 177, 1, 0, 253, 178, 1, 0, 60, 180, 1, 0, 125, 181, 1, 0, 188, 182, 1, 0, 253, 183, 1, 0, 60, 185, 1, 0, 125, 186, 1, 0, 188, 187, 1, 0, 253, 188, 1, 0, 60, 190, 1, 0, 125, 191, 1, 0, 188, 192, 1, 0, 253, 193, 1, 0, 60, 195, 1, 0, 125, 196, 1, 0, 188, 197, 1, 0, 253, 198, 1, 0, 60, 200, 1, 0, 125, 201, 1, 0, 188, 202, 1, 0, 253, 203, 1, 0, 60, 205, 1, 0, 125, 206, 1, 0, 188, 207, 1, 0, 253, 208, 1, 0, 60, 210, 1, 0, 125, 211, 1, 0, 188, 212, 1, 0, 253, 213, 1, 0, 60, 215, 1, 0, 125, 216, 1, 0, 188, 217, 1, 0, 253, 218, 1, 0, 60, 220, 1, 0, 125, 221, 1, 0, 188, 222, 1, 0, 253, 223, 1, 0, 60, 225, 1, 0, 125, 226, 1, 0, 188, 227, 1, 0, 253, 228, 1, 0, 60, 230, 1, 0, 125, 231, 1, 0, 188, 232, 1, 0, 253, 233, 1, 0, 60, 235, 1, 0, 125, 236, 1, 0, 188, 237, 1, 0, 253, 238, 1, 0, 60, 240, 1, 0, 125, 241, 1, 0, 188, 242, 1, 0, 253, 243, 1, 0, 60, 245, 1, 0, 125, 246, 1, 0, 188, 247, 1, 0, 253, 248, 1, 0, 60, 250, 1, 0, 125, 251, 1, 0, 188, 252, 1, 0, 253, 253, 1, 0, 60, 255, 1, 0, 125, 0, 2, 0, 188, 1, 2, 0, 253, 2, 2, 0, 60, 4, 2, 0, 125, 5, 2, 0, 188, 6, 2, 0, 253, 7, 2, 0, 60, 9, 2, 0, 125, 10, 2, 0, 188, 11, 2, 0, 253, 12, 2, 0, 60, 14, 2, 0, 125, 15, 2, 0, 188, 16, 2, 0, 253, 17, 2, 0, 60, 19, 2, 0, 125, 20, 2, 0, 188, 21, 2, 0, 253, 22, 2, 0, 60, 24, 2, 0, 125, 25, 2, 0, 188, 26, 2, 0, 253, 27, 2, 0, 60, 29, 2, 0, 125, 30, 2, 0, 188, 31, 2, 0, 253, 32, 2, 0, 60, 34, 2, 0, 125, 35, 2, 0, 188, 36, 2, 0, 253, 37, 2, 0, 60, 39, 2, 0, 125, 40, 2, 0, 188, 41, 2, 0, 253, 42, 2, 0, 60, 44, 2, 0, 125, 45, 2, 0, 188, 46, 2, 0, 253, 47, 2, 0, 60, 49, 2, 0, 125, 50, 2, 0, 188, 51, 2, 0, 253, 52, 2, 0, 60, 54, 2, 0, 125, 55, 2, 0, 188, 56, 2, 0, 253, 57, 2, 0, 60, 59, 2, 0, 125, 60, 2, 0, 188, 61, 2, 0, 253, 62, 2, 0, 60, 64, 2, 0, 125, 65, 2, 0, 188, 66, 2, 0, 253, 67, 2, 0, 60, 69, 2, 0, 125, 70, 2, 0, 188, 71, 2, 0, 253, 72, 2, 0, 60, 74, 2, 0, 125, 75, 2, 0, 188, 76, 2, 0, 253, 77, 2, 0, 60, 79, 2, 0, 125, 80, 2, 0, 188, 81, 2, 0, 253, 82, 2, 0, 60, 84, 2, 0, 125, 85, 2, 0, 188, 86, 2, 0, 253, 87, 2, 0, 60, 89, 2, 0, 125, 90, 2, 0, 188, 91, 2, 0, 253, 92, 2, 0, 60, 94, 2, 0, 125, 95, 2, 0, 188, 96, 2, 0, 253, 97, 2, 0, 60, 99, 2, 0, 125, 100, 2, 0, 188, 101, 2, 0, 253, 102, 2, 0, 60, 104, 2, 0, 125, 105, 2, 0, 188, 106, 2, 0, 253, 107, 2, 0, 60, 109, 2, 0, 125, 110, 2, 0, 188, 111, 2, 0, 253, 112, 2, 0, 60, 114, 2, 0, 125, 115, 2, 0, 188, 116, 2, 0, 253, 117, 2, 0, 60, 119, 2, 0, 125, 120, 2, 0, 188, 121, 2, 0, 253, 122, 2, 0, 60, 124, 2, 0, 125, 125, 2, 0, 188, 126, 2, 0, 253, 127, 2, 0, 60, 129, 2, 0, 125, 130, 2, 0, 188, 131, 2, 0, 253, 132, 2, 0, 60, 134, 2, 0, 125, 135, 2, 0, 188, 136, 2, 0, 253, 137, 2, 0, 60, 139, 2, 0, 125, 140, 2, 0, 188, 141, 2, 0, 253, 142, 2, 0, 60, 144, 2, 0, 125, 145, 2, 0, 188, 146, 2, 0, 253, 147, 2, 0, 60, 149, 2, 0, 125, 150, 2, 0, 188, 151, 2, 0, 253, 152, 2, 0, 60, 154, 2, 0, 125, 155, 2, 0, 188, 156, 2, 0, 253, 157, 2, 0, 60, 159, 2, 0, 125, 160, 2, 0, 188, 161, 2, 0, 253, 162, 2, 0, 60, 164, 2, 0, 125, 165, 2, 0, 188, 166, 2, 0, 253, 167, 2, 0, 60, 169, 2, 0, 125, 170, 2, 0, 188, 171, 2, 0, 253, 172, 2, 0, 60, 174, 2, 0, 125, 175, 2, 0, 188, 176, 2, 0, 253, 177, 2, 0, 60, 179, 2, 0, 125, 180, 2, 0, 188, 181, 2, 0, 253, 182, 2, 0, 60, 184, 2, 0, 125, 185, 2, 0, 188, 186, 2, 0, 253, 187, 2, 0, 60, 189, 2, 0, 125, 190, 2, 0, 188, 191, 2, 0, 253, 192, 2, 0, 60, 194, 2, 0, 125, 195, 2, 0, 188, 196, 2, 0, 253, 197, 2, 0, 60, 199, 2, 0, 125, 200, 2, 0, 188, 201, 2, 0, 253, 202, 2, 0, 60, 204, 2, 0, 125, 205, 2, 0, 188, 206, 2, 0, 253, 207, 2, 0, 60, 209, 2, 0, 125, 210, 2, 0, 188, 211, 2, 0, 253, 212, 2, 0, 60, 214, 2, 0, 125, 215, 2, 0, 188, 216, 2, 0, 253, 217, 2, 0, 60, 219, 2, 0, 125, 220, 2, 0, 188, 221, 2, 0, 253, 222, 2, 0, 60, 224, 2, 0, 125, 225, 2, 0, 188, 226, 2, 0, 253, 227, 2, 0, 60, 229, 2, 0, 125, 230, 2, 0, 188, 231, 2, 0, 253, 232, 2, 0, 60, 234, 2, 0, 125, 235, 2, 0, 188, 236, 2, 0, 253, 237, 2, 0, 60, 239, 2, 0, 125, 240, 2, 0, 188, 241, 2, 0, 253, 242, 2, 0, 60, 244, 2, 0, 125, 245, 2, 0, 188, 246, 2, 0, 253, 247, 2, 0, 60, 249, 2, 0, 125, 250, 2, 0, 188, 251, 2, 0, 253, 252, 2, 0, 60, 254, 2, 0, 125, 255, 2, 0, 188, 0, 3, 0, 253, 1, 3, 0, 60, 3, 3, 0, 125, 4, 3, 0, 188, 5, 3, 0, 253, 6, 3, 0, 60, 8, 3, 0, 125, 9, 3, 0, 188, 10, 3, 0, 253, 11, 3, 0, 60, 13, 3, 0, 125, 14, 3, 0, 188, 15, 3, 0, 253, 16, 3, 0, 60, 18, 3, 0, 125, 19, 3, 0, 188, 20, 3, 0, 253, 21, 3, 0, 60, 23, 3, 0, 125, 24, 3, 0, 188, 25, 3, 0, 253, 26, 3, 0, 60, 28, 3, 0, 125, 29, 3, 0, 188, 30, 3, 0, 253, 31, 3, 0, 60, 33, 3, 0, 125, 34, 3, 0, 188, 35, 3, 0, 253, 36, 3, 0, 60, 38, 3, 0, 125, 39, 3, 0, 188, 40, 3, 0, 253, 41, 3, 0, 60, 43, 3, 0, 125, 44, 3, 0, 188, 45, 3, 0, 253, 46, 3, 0, 60, 48, 3, 0, 125, 49, 3, 0, 188, 50, 3, 0, 253, 51, 3, 0, 60, 53, 3, 0, 125, 54, 3, 0, 188, 55, 3, 0, 253, 56, 3, 0, 60, 58, 3, 0, 125, 59, 3, 0, 188, 60, 3, 0, 253, 61, 3, 0, 60, 63, 3, 0, 125, 64, 3, 0, 188, 65, 3, 0, 253, 66, 3, 0, 60, 68, 3, 0, 125, 69, 3, 0, 188, 70, 3, 0, 253, 71, 3, 0, 60, 73, 3, 0, 125, 74, 3, 0, 188, 75, 3, 0, 253, 76, 3, 0, 60, 78, 3, 0, 125, 79, 3, 0, 188, 80, 3, 0, 253, 81, 3, 0, 60, 83, 3, 0, 125, 84, 3, 0, 188, 85, 3, 0, 253, 86, 3, 0, 60, 88, 3, 0, 125, 89, 3, 0, 188, 90, 3, 0, 253, 91, 3, 0, 60, 93, 3, 0, 125, 94, 3, 0, 188, 95, 3, 0, 253, 96, 3, 0, 60, 98, 3, 0, 125, 99, 3, 0, 188, 100, 3, 0, 253, 101, 3, 0, 60, 103, 3, 0, 125, 104, 3, 0, 188, 105, 3, 0, 253, 106, 3, 0, 60, 108, 3, 0, 125, 109, 3, 0, 188, 110, 3, 0, 253, 111, 3, 0, 60, 113, 3, 0, 125, 114, 3, 0, 188, 115, 3, 0, 253, 116, 3, 0, 60, 118, 3, 0, 125, 119, 3, 0, 188, 120, 3, 0, 253, 121, 3, 0, 60, 123, 3, 0, 125, 124, 3, 0, 188, 125, 3, 0, 253, 126, 3, 0, 60, 128, 3, 0, 125, 129, 3, 0, 188, 130, 3, 0, 253, 131, 3, 0, 60, 133, 3, 0, 125, 134, 3, 0, 188, 135, 3, 0, 253, 136, 3, 0, 60, 138, 3, 0, 125, 139, 3, 0, 188, 140, 3, 0, 253, 141, 3, 0, 60, 143, 3, 0, 125, 144, 3, 0, 188, 145, 3, 0, 253, 146, 3, 0, 60, 148, 3, 0, 125, 149, 3, 0, 188, 150, 3, 0, 253, 151, 3, 0, 60, 153, 3, 0, 125, 154, 3, 0, 188, 155, 3, 0, 253, 156, 3, 0, 60, 158, 3, 0, 125, 159, 3, 0, 188, 160, 3, 0, 253, 161, 3, 0, 60, 163, 3, 0, 125, 164, 3, 0, 188, 165, 3, 0, 253, 166, 3, 0, 60, 168, 3, 0, 125, 169, 3, 0, 188, 170, 3, 0, 253, 171, 3, 0, 60, 173, 3, 0, 125, 174, 3, 0, 188, 175, 3, 0, 253, 176, 3, 0, 60, 178, 3, 0, 125, 179, 3, 0, 188, 180, 3, 0, 253, 181, 3, 0, 60, 183, 3, 0, 125, 184, 3, 0, 188, 185, 3, 0, 253, 186, 3, 0, 60, 188, 3, 0, 125, 189, 3, 0, 188, 190, 3, 0, 253, 191, 3, 0, 60, 193, 3, 0, 125, 194, 3, 0, 188, 195, 3, 0, 253, 196, 3, 0, 60, 198, 3, 0, 125, 199, 3, 0, 188, 200, 3, 0, 253, 201, 3, 0, 60, 203, 3, 0, 125, 204, 3, 0, 188, 205, 3, 0, 253, 206, 3, 0, 60, 208, 3, 0, 125, 209, 3, 0, 188, 210, 3, 0, 253, 211, 3, 0, 60, 213, 3, 0, 125, 214, 3, 0, 188, 215, 3, 0, 253, 216, 3, 0, 60, 218, 3, 0, 125, 219, 3, 0, 188, 220, 3, 0, 253, 221, 3, 0, 60, 223, 3, 0, 125, 224, 3, 0, 188, 225, 3, 0, 253, 226, 3, 0, 60, 228, 3, 0, 125, 229, 3, 0, 188, 230, 3, 0, 253, 231, 3, 0, 60, 233, 3, 0, 125, 234, 3, 0, 188, 235, 3, 0, 253, 236, 3, 0, 60, 238, 3, 0, 125, 239, 3, 0, 188, 240, 3, 0, 253, 241, 3, 0, 60, 243, 3, 0, 125, 244, 3, 0, 188, 245, 3, 0, 253, 246, 3, 0, 60, 248, 3, 0, 125, 249, 3, 0, 188, 250, 3, 0, 253, 251, 3, 0, 60, 253, 3, 0, 125, 254, 3, 0, 188, 255, 3, 0, 253, 0, 4, 0, 60, 2, 4, 0, 125, 3, 4, 0, 188, 4, 4, 0, 253, 5, 4, 0, 60, 7, 4, 0, 125, 8, 4, 0, 188, 9, 4, 0, 253, 10, 4, 0, 60, 12, 4, 0, 125, 13, 4, 0, 188, 14, 4, 0, 253, 15, 4, 0, 60, 17, 4, 0, 125, 18, 4, 0, 188, 19, 4, 0, 253, 20, 4, 0, 60, 22, 4, 0, 125, 23, 4, 0, 188, 24, 4, 0, 253, 25, 4, 0, 60, 27, 4, 0, 125, 28, 4, 0, 188, 29, 4, 0, 253, 30, 4, 0, 60, 32, 4, 0, 125, 33, 4, 0, 188, 34, 4, 0, 253, 35, 4, 0, 60, 37, 4, 0, 125, 38, 4, 0, 188, 39, 4, 0, 253, 40, 4, 0, 60, 42, 4, 0, 125, 43, 4, 0, 188, 44, 4, 0, 253, 45, 4, 0, 60, 47, 4, 0, 125, 48, 4, 0, 188, 49, 4, 0, 253, 50, 4, 0, 60, 52, 4, 0, 125, 53, 4, 0, 188, 54, 4, 0, 253, 55, 4, 0, 60, 57, 4, 0, 125, 58, 4, 0, 188, 59, 4, 0, 253, 60, 4, 0, 60, 62, 4, 0, 125, 63, 4, 0, 188, 64, 4, 0, 253, 65, 4, 0, 60, 67, 4, 0, 125, 68, 4, 0, 188, 69, 4, 0, 253, 70, 4, 0, 60, 72, 4, 0, 125, 73, 4, 0, 188, 74, 4, 0, 253, 75, 4, 0, 60, 77, 4, 0, 125, 78, 4, 0, 188, 79, 4, 0, 253, 80, 4, 0, 60, 82, 4, 0, 125, 83, 4, 0, 188, 84, 4, 0, 253, 85, 4, 0, 60, 87, 4, 0, 125, 88, 4, 0, 188, 89, 4, 0, 253, 90, 4, 0, 60, 92, 4, 0, 125, 93, 4, 0, 188, 94, 4, 0, 253, 95, 4, 0, 60, 97, 4, 0, 125, 98, 4, 0, 188, 99, 4, 0, 253, 100, 4, 0, 60, 102, 4, 0, 125, 103, 4, 0, 188, 104, 4, 0, 253, 105, 4, 0, 60, 107, 4, 0, 125, 108, 4, 0, 188, 109, 4, 0, 253, 110, 4, 0, 60, 112, 4, 0, 125, 113, 4, 0, 188, 114, 4, 0, 253, 115, 4, 0, 60, 117, 4, 0, 125, 118, 4, 0, 188, 119, 4, 0, 253, 120, 4, 0, 60, 122, 4, 0, 125, 123, 4, 0, 188, 124, 4, 0, 253, 125, 4, 0, 60, 127, 4, 0, 125, 128, 4, 0, 188, 129, 4, 0, 253, 130, 4, 0, 60, 132, 4, 0, 125, 133, 4, 0, 188, 134, 4, 0, 253, 135, 4, 0, 60, 137, 4, 0, 125, 138, 4, 0, 188, 139, 4, 0, 253, 140, 4, 0, 60, 142, 4, 0, 125, 143, 4, 0, 188, 144, 4, 0, 253, 145, 4, 0, 60, 147, 4, 0, 125, 148, 4, 0, 188, 149, 4, 0, 253, 150, 4, 0, 60, 152, 4, 0, 125, 153, 4, 0, 188, 154, 4, 0, 253, 155, 4, 0, 60, 157, 4, 0, 125, 158, 4, 0, 188, 159, 4, 0, 253, 160, 4, 0, 60, 162, 4, 0, 125, 163, 4, 0, 188, 164, 4, 0, 253, 165, 4, 0, 60, 167, 4, 0, 125, 168, 4, 0, 188, 169, 4, 0, 253, 170, 4, 0, 60, 172, 4, 0, 125, 173, 4, 0, 188, 174, 4, 0, 253, 175, 4, 0, 60, 177, 4, 0, 125, 178, 4, 0, 188, 179, 4, 0, 253, 180, 4, 0, 60, 182, 4, 0, 125, 183, 4, 0, 188, 184, 4, 0, 253, 185, 4, 0, 60, 187, 4, 0, 125, 188, 4, 0, 188, 189, 4, 0, 253, 190, 4, 0, 60, 192, 4, 0, 125, 193, 4, 0, 188, 194, 4, 0, 253, 195, 4, 0, 60, 197, 4, 0, 125, 198, 4, 0, 188, 199, 4, 0, 253, 200, 4, 0, 60, 202, 4, 0, 125, 203, 4, 0, 188, 204, 4, 0, 253, 205, 4, 0, 60, 207, 4, 0, 125, 208, 4, 0, 188, 209, 4, 0, 253, 210, 4, 0, 60, 212, 4, 0, 125, 213, 4, 0, 188, 214, 4, 0, 253, 215, 4, 0, 60, 217, 4, 0, 125, 218, 4, 0, 188, 219, 4, 0, 253, 220, 4, 0, 60, 222, 4, 0, 125, 223, 4, 0, 188, 224, 4, 0, 253, 225, 4, 0, 60, 227, 4, 0, 125, 228, 4, 0, 188, 229, 4, 0, 253, 230, 4, 0, 60, 232, 4, 0, 125, 233, 4, 0, 188, 234, 4, 0, 253, 235, 4, 0, 60, 237, 4, 0, 125, 238, 4, 0, 188, 239, 4, 0, 253, 240, 4, 0, 60, 242, 4, 0, 125, 243, 4, 0, 188, 244, 4, 0, 253, 245, 4, 0, 60, 247, 4, 0, 125, 248, 4, 0, 188, 249, 4, 0, 253, 250, 4, 0, 60, 252, 4, 0, 125, 253, 4, 0, 188, 254, 4, 0, 253, 255, 4, 0, 60, 1, 5, 0, 125, 2, 5, 0, 188, 3, 5, 0, 253, 4, 5, 0, 60, 6, 5, 0, 125, 7, 5, 0, 188, 8, 5, 0, 253, 9, 5, 0, 60, 11, 5, 0, 125, 12, 5, 0, 188, 13, 5, 0, 253, 14, 5, 0, 60, 16, 5, 0, 125, 17, 5, 0, 188, 18, 5, 0, 253, 19, 5, 0, 60, 21, 5, 0, 125, 22, 5, 0, 188, 23, 5, 0, 253, 24, 5, 0, 60, 26, 5, 0, 125, 27, 5, 0, 188, 28, 5, 0, 253, 29, 5, 0, 60, 31, 5, 0, 125, 32, 5, 0, 188, 33, 5, 0, 253, 34, 5, 0, 60, 36, 5, 0, 125, 37, 5, 0, 188, 38, 5, 0, 253, 39, 5, 0, 60, 41, 5, 0, 125, 42, 5, 0, 188, 43, 5, 0, 253, 44, 5, 0, 60, 46, 5, 0, 125, 47, 5, 0, 188, 48, 5, 0, 253, 49, 5, 0, 60, 51, 5, 0, 125, 52, 5, 0, 188, 53, 5, 0, 253, 54, 5, 0, 60, 56, 5, 0, 125, 57, 5, 0, 188, 58, 5, 0, 253, 59, 5, 0, 60, 61, 5, 0, 125, 62, 5, 0, 188, 63, 5, 0, 253, 64, 5, 0, 60, 66, 5, 0, 125, 67, 5, 0, 188, 68, 5, 0, 253, 69, 5, 0, 60, 71, 5, 0, 125, 72, 5, 0, 188, 73, 5, 0, 253, 74, 5, 0, 60, 76, 5, 0, 125, 77, 5, 0, 188, 78, 5, 0, 253, 79, 5, 0, 60, 81, 5, 0, 125, 82, 5, 0, 188, 83, 5, 0, 253, 84, 5, 0, 60, 86, 5, 0, 125, 87, 5, 0, 188, 88, 5, 0, 253, 89, 5, 0, 60, 91, 5, 0, 125, 92, 5, 0, 188, 93, 5, 0, 253, 94, 5, 0, 60, 96, 5, 0, 125, 97, 5, 0, 188, 98, 5, 0, 253, 99, 5, 0, 60, 101, 5, 0, 125, 102, 5, 0, 188, 103, 5, 0, 253, 104, 5, 0, 60, 106, 5, 0, 125, 107, 5, 0, 188, 108, 5, 0, 253, 109, 5, 0, 60, 111, 5, 0, 125, 112, 5, 0, 188, 113, 5, 0, 253, 114, 5, 0, 60, 116, 5, 0, 125, 117, 5, 0, 188, 118, 5, 0, 253, 119, 5, 0, 60, 121, 5, 0, 125, 122, 5, 0, 188, 123, 5, 0, 253, 124, 5, 0, 60, 126, 5, 0, 125, 127, 5, 0, 188, 128, 5, 0, 253, 129, 5, 0, 60, 131, 5, 0, 125, 132, 5, 0, 188, 133, 5, 0, 253, 134, 5, 0, 60, 136, 5, 0, 125, 137, 5, 0, 188, 138, 5, 0, 253, 139, 5, 0, 60, 141, 5, 0, 125, 142, 5, 0, 188, 143, 5, 0, 253, 144, 5, 0, 60, 146, 5, 0, 125, 147, 5, 0, 188, 148, 5, 0, 253, 149, 5, 0, 60, 151, 5, 0, 125, 152, 5, 0, 188, 153, 5, 0, 253, 154, 5, 0, 60, 156, 5, 0, 125, 157, 5, 0, 188, 158, 5, 0, 253, 159, 5, 0, 60, 161, 5, 0, 125, 162, 5, 0, 188, 163, 5, 0, 253, 164, 5, 0, 60, 166, 5, 0, 125, 167, 5, 0, 188, 168, 5, 0, 253, 169, 5, 0, 60, 171, 5, 0, 125, 172, 5, 0, 188, 173, 5, 0, 253, 174, 5, 0, 60, 176, 5, 0, 125, 177, 5, 0, 188, 178, 5, 0, 253, 179, 5, 0, 60, 181, 5, 0, 125, 182, 5, 0, 188, 183, 5, 0, 253, 184, 5, 0, 60, 186, 5, 0, 125, 187, 5, 0, 188, 188, 5, 0, 253, 189, 5, 0, 60, 191, 5, 0, 125, 192, 5, 0, 188, 193, 5, 0, 253, 194, 5, 0, 60, 196, 5, 0, 125, 197, 5, 0, 188, 198, 5, 0, 253, 199, 5, 0, 60, 201, 5, 0, 125, 202, 5, 0, 188, 203, 5, 0, 253, 204, 5, 0, 60, 206, 5, 0, 125, 207, 5, 0, 188, 208, 5, 0, 253, 209, 5, 0, 60, 211, 5, 0, 125, 212, 5, 0, 188, 213, 5, 0, 253, 214, 5, 0, 60, 216, 5, 0, 125, 217, 5, 0, 188, 218, 5, 0, 253, 219, 5, 0, 60, 221, 5, 0, 125, 222, 5, 0, 188, 223, 5, 0, 253, 224, 5, 0, 60, 226, 5, 0, 125, 227, 5, 0, 188, 228, 5, 0, 253, 229, 5, 0, 60, 231, 5, 0, 125, 232, 5, 0, 188, 233, 5, 0, 253, 234, 5, 0, 60, 236, 5, 0, 125, 237, 5, 0, 188, 238, 5, 0, 253, 239, 5, 0, 60, 241, 5, 0, 125, 242, 5, 0, 188, 243, 5, 0, 253, 244, 5, 0, 60, 246, 5, 0, 125, 247, 5, 0, 188, 248, 5, 0, 253, 249, 5, 0, 60, 251, 5, 0, 125, 252, 5, 0, 188, 253, 5, 0, 253, 254, 5, 0, 60, 0, 6, 0, 125, 1, 6, 0, 188, 2, 6, 0, 253, 3, 6, 0, 60, 5, 6, 0, 125, 6, 6, 0, 188, 7, 6, 0, 253, 8, 6, 0, 60, 10, 6, 0, 125, 11, 6, 0, 188, 12, 6, 0, 253, 13, 6, 0, 60, 15, 6, 0, 125, 16, 6, 0, 188, 17, 6, 0, 253, 18, 6, 0, 60, 20, 6, 0, 125, 21, 6, 0, 188, 22, 6, 0, 253, 23, 6, 0, 60, 25, 6, 0, 125, 26, 6, 0, 188, 27, 6, 0, 253, 28, 6, 0, 60, 30, 6, 0, 125, 31, 6, 0, 188, 32, 6, 0, 253, 33, 6, 0, 60, 35, 6, 0, 125, 36, 6, 0, 188, 37, 6, 0, 253, 38, 6, 0, 60, 40, 6, 0, 125, 41, 6, 0, 188, 42, 6, 0, 253, 43, 6, 0, 60, 45, 6, 0, 125, 46, 6, 0, 188, 47, 6, 0, 253, 48, 6, 0, 60, 50, 6, 0, 125, 51, 6, 0, 188, 52, 6, 0, 253, 53, 6, 0, 60, 55, 6, 0, 125, 56, 6, 0, 188, 57, 6, 0, 253, 58, 6, 0, 60, 60, 6, 0, 125, 61, 6, 0, 188, 62, 6, 0, 253, 63, 6, 0, 60, 65, 6, 0, 125, 66, 6, 0, 188, 67, 6, 0, 253, 68, 6, 0, 60, 70, 6, 0, 125, 71, 6, 0, 188, 72, 6, 0, 253, 73, 6, 0, 60, 75, 6, 0, 125, 76, 6, 0, 188, 77, 6, 0, 253, 78, 6, 0, 60, 80, 6, 0, 125, 81, 6, 0, 188, 82, 6, 0, 253, 83, 6, 0, 60, 85, 6, 0, 125, 86, 6, 0, 188, 87, 6, 0, 253, 88, 6, 0, 60, 90, 6, 0, 125, 91, 6, 0, 188, 92, 6, 0, 253, 93, 6, 0, 60, 95, 6, 0, 125, 96, 6, 0, 188, 97, 6, 0, 253, 98, 6, 0, 60, 100, 6, 0, 125, 101, 6, 0, 188, 102, 6, 0, 253, 103, 6, 0, 60, 105, 6, 0, 125, 106, 6, 0, 188, 107, 6, 0, 253, 108, 6, 0, 60, 110, 6, 0, 125, 111, 6, 0, 188, 112, 6, 0, 253, 113, 6, 0, 60, 115, 6, 0, 125, 116, 6, 0, 188, 117, 6, 0, 253, 118, 6, 0, 60, 120, 6, 0, 125, 121, 6, 0, 188, 122, 6, 0, 253, 123, 6, 0, 60, 125, 6, 0, 125, 126, 6, 0, 188, 127, 6, 0, 253, 128, 6, 0, 60, 130, 6, 0, 125, 131, 6, 0, 188, 132, 6, 0, 253, 133, 6, 0, 60, 135, 6, 0, 125, 136, 6, 0, 188, 137, 6, 0, 253, 138, 6, 0, 60, 140, 6, 0, 125, 141, 6, 0, 188, 142, 6, 0, 253, 143, 6, 0, 60, 145, 6, 0, 125, 146, 6, 0, 188, 147, 6, 0, 253, 148, 6, 0, 60, 150, 6, 0, 125, 151, 6, 0, 188, 152, 6, 0, 253, 153, 6, 0, 60, 155, 6, 0, 125, 156, 6, 0, 188, 157, 6, 0, 253, 158, 6, 0, 60, 160, 6, 0, 125, 161, 6, 0, 188, 162, 6, 0, 253, 163, 6, 0, 60, 165, 6, 0, 125, 166, 6, 0, 188, 167, 6, 0, 253, 168, 6, 0, 60, 170, 6, 0, 125, 171, 6, 0, 188, 172, 6, 0, 253, 173, 6, 0, 60, 175, 6, 0, 125, 176, 6, 0, 188, 177, 6, 0, 253, 178, 6, 0, 60, 180, 6, 0, 125, 181, 6, 0, 188, 182, 6, 0, 253, 183, 6, 0, 60, 185, 6, 0, 125, 186, 6, 0, 188, 187, 6, 0, 253, 188, 6, 0, 60, 190, 6, 0, 125, 191, 6, 0, 188, 192, 6, 0, 253, 193, 6, 0, 60, 195, 6, 0, 125, 196, 6, 0, 188, 197, 6, 0, 253, 198, 6, 0, 60, 200, 6, 0, 125, 201, 6, 0, 188, 202, 6, 0, 253, 203, 6, 0, 60, 205, 6, 0, 125, 206, 6, 0, 188, 207, 6, 0, 253, 208, 6, 0, 60, 210, 6, 0, 125, 211, 6, 0, 188, 212, 6, 0, 253, 213, 6, 0, 60, 215, 6, 0, 125, 216, 6, 0, 188, 217, 6, 0, 253, 218, 6, 0, 60, 220, 6, 0, 125, 221, 6, 0, 188, 222, 6, 0, 253, 223, 6, 0, 60, 225, 6, 0, 125, 226, 6, 0, 188, 227, 6, 0, 253, 228, 6, 0, 60, 230, 6, 0, 125, 231, 6, 0, 188, 232, 6, 0, 253, 233, 6, 0, 60, 235, 6, 0, 125, 236, 6, 0, 188, 237, 6, 0, 253, 238, 6, 0, 60, 240, 6, 0, 125, 241, 6, 0, 188, 242, 6, 0, 253, 243, 6, 0, 60, 245, 6, 0, 125, 246, 6, 0, 188, 247, 6, 0, 253, 248, 6, 0, 60, 250, 6, 0, 125, 251, 6, 0, 188, 252, 6, 0, 253, 253, 6, 0, 60, 255, 6, 0, 125, 0, 7, 0, 188, 1, 7, 0, 253, 2, 7, 0, 60, 4, 7, 0, 125, 5, 7, 0, 188, 6, 7, 0, 253, 7, 7, 0, 60, 9, 7, 0, 125, 10, 7, 0, 188, 11, 7, 0, 253, 12, 7, 0, 60, 14, 7, 0, 125, 15, 7, 0, 188, 16, 7, 0, 253, 17, 7, 0, 60, 19, 7, 0, 125, 20, 7, 0, 188, 21, 7, 0, 253, 22, 7, 0, 60, 24, 7, 0, 125, 25, 7, 0, 188, 26, 7, 0, 253, 27, 7, 0, 60, 29, 7, 0, 125, 30, 7, 0, 188, 31, 7, 0, 253, 32, 7, 0, 60, 34, 7, 0, 125, 35, 7, 0, 188, 36, 7, 0, 253, 37, 7, 0, 60, 39, 7, 0, 125, 40, 7, 0, 188, 41, 7, 0, 253, 42, 7, 0, 60, 44, 7, 0, 125, 45, 7, 0, 188, 46, 7, 0, 253, 47, 7, 0, 60, 49, 7, 0, 125, 50, 7, 0, 188, 51, 7, 0, 253, 52, 7, 0, 60, 54, 7, 0, 125, 55, 7, 0, 188, 56, 7, 0, 253, 57, 7, 0, 60, 59, 7, 0, 125, 60, 7, 0, 188, 61, 7, 0, 253, 62, 7, 0, 60, 64, 7, 0, 125, 65, 7, 0, 188, 66, 7, 0, 253, 67, 7, 0, 60, 69, 7, 0, 125, 70, 7, 0, 188, 71, 7, 0, 253, 72, 7, 0, 60, 74, 7, 0, 125, 75, 7, 0, 188, 76, 7, 0, 253, 77, 7, 0, 60, 79, 7, 0, 125, 80, 7, 0, 188, 81, 7, 0, 253, 82, 7, 0, 60, 84, 7, 0, 125, 85, 7, 0, 188, 86, 7, 0, 253, 87, 7, 0, 60, 89, 7, 0, 125, 90, 7, 0, 188, 91, 7, 0, 253, 92, 7, 0, 60, 94, 7, 0, 125, 95, 7, 0, 188, 96, 7, 0, 253, 97, 7, 0, 60, 99, 7, 0, 125, 100, 7, 0, 188, 101, 7, 0, 253, 102, 7, 0, 60, 104, 7, 0, 125, 105, 7, 0, 188, 106, 7, 0, 253, 107, 7, 0, 60, 109, 7, 0, 125, 110, 7, 0, 188, 111, 7, 0, 253, 112, 7, 0, 60, 114, 7, 0, 125, 115, 7, 0, 188, 116, 7, 0, 253, 117, 7, 0, 60, 119, 7, 0, 125, 120, 7, 0, 188, 121, 7, 0, 253, 122, 7, 0, 60, 124, 7, 0, 125, 125, 7, 0, 188, 126, 7, 0, 253, 127, 7, 0, 60, 129, 7, 0, 125, 130, 7, 0, 188, 131, 7, 0, 253, 132, 7, 0, 60, 134, 7, 0, 125, 135, 7, 0, 188, 136, 7, 0, 253, 137, 7, 0, 60, 139, 7, 0, 125, 140, 7, 0, 188, 141, 7, 0, 253, 142, 7, 0, 60, 144, 7, 0, 125, 145, 7, 0, 188, 146, 7, 0, 253, 147, 7, 0, 60, 149, 7, 0, 125, 150, 7, 0, 188, 151, 7, 0, 253, 152, 7, 0, 60, 154, 7, 0, 125, 155, 7, 0, 188, 156, 7, 0, 253, 157, 7, 0, 60, 159, 7, 0, 125, 160, 7, 0, 188, 161, 7, 0, 253, 162, 7, 0, 60, 164, 7, 0, 125, 165, 7, 0, 188, 166, 7, 0, 253, 167, 7, 0, 60, 169, 7, 0, 125, 170, 7, 0, 188, 171, 7, 0, 253, 172, 7, 0, 60, 174, 7, 0, 125, 175, 7, 0, 188, 176, 7, 0, 253, 177, 7, 0, 60, 179, 7, 0, 125, 180, 7, 0, 188, 181, 7, 0, 253, 182, 7, 0, 60, 184, 7, 0, 125, 185, 7, 0, 188, 186, 7, 0, 253, 187, 7, 0, 60, 189, 7, 0, 125, 190, 7, 0, 188, 191, 7, 0, 253, 192, 7, 0, 60, 194, 7, 0, 125, 195, 7, 0, 188, 196, 7, 0, 253, 197, 7, 0, 60, 199, 7, 0, 125, 200, 7, 0, 188, 201, 7, 0, 253, 202, 7, 0, 60, 204, 7, 0, 125, 205, 7, 0, 188, 206, 7, 0, 253, 207, 7, 0, 60, 209, 7, 0, 125, 210, 7, 0, 188, 211, 7, 0, 253, 212, 7, 0, 60, 214, 7, 0, 125, 215, 7, 0, 188, 216, 7, 0, 253, 217, 7, 0, 60, 219, 7, 0, 125, 220, 7, 0, 188, 221, 7, 0, 253, 222, 7, 0, 60, 224, 7, 0, 125, 225, 7, 0, 188, 226, 7, 0, 253, 227, 7, 0, 60, 229, 7, 0, 125, 230, 7, 0, 188, 231, 7, 0, 253, 232, 7, 0, 60, 234, 7, 0, 125, 235, 7, 0, 188, 236, 7, 0, 253, 237, 7, 0, 60, 239, 7, 0, 125, 240, 7, 0, 188, 241, 7, 0, 253, 242, 7, 0, 60, 244, 7, 0, 125, 245, 7, 0, 188, 246, 7, 0, 253, 247, 7, 0, 60, 249, 7, 0, 125, 250, 7, 0, 188, 251, 7, 0, 253, 252, 7, 0, 60, 254, 7, 0, 125, 255, 7, 0, 188, 0, 8, 0, 253, 1, 8, 0, 60, 3, 8, 0, 125, 4, 8, 0, 188, 5, 8, 0, 253, 6, 8, 0, 60, 8, 8, 0, 125, 9, 8, 0, 188, 10, 8, 0, 253, 11, 8, 0, 60, 13, 8, 0, 125, 14, 8, 0, 188, 15, 8, 0, 253, 16, 8, 0, 60, 18, 8, 0, 125, 19, 8, 0, 188, 20, 8, 0, 253, 21, 8, 0, 60, 23, 8, 0, 125, 24, 8, 0, 188, 25, 8, 0, 253, 26, 8, 0, 60, 28, 8, 0, 125, 29, 8, 0, 188, 30, 8, 0, 253, 31, 8, 0, 60, 33, 8, 0, 125, 34, 8, 0, 188, 35, 8, 0, 253, 36, 8, 0, 60, 38, 8, 0, 125, 39, 8, 0, 188, 40, 8, 0, 253, 41, 8, 0, 60, 43, 8, 0, 125, 44, 8, 0, 188, 45, 8, 0, 253, 46, 8, 0, 60, 48, 8, 0, 125, 49, 8, 0, 188, 50, 8, 0, 253, 51, 8, 0, 60, 53, 8, 0, 125, 54, 8, 0, 188, 55, 8, 0, 253, 56, 8, 0, 60, 58, 8, 0, 125, 59, 8, 0, 188, 60, 8, 0, 253, 61, 8, 0, 60, 63, 8, 0, 125, 64, 8, 0, 188, 65, 8, 0, 253, 66, 8, 0, 60, 68, 8, 0, 125, 69, 8, 0, 188, 70, 8, 0, 253, 71, 8, 0, 60, 73, 8, 0, 125, 74, 8, 0, 188, 75, 8, 0, 253, 76, 8, 0, 60, 78, 8, 0, 125, 79, 8, 0, 188, 80, 8, 0, 253, 81, 8, 0, 60, 83, 8, 0, 125, 84, 8, 0, 188, 85, 8, 0, 253, 86, 8, 0, 60, 88, 8, 0, 125, 89, 8, 0, 188, 90, 8, 0, 253, 91, 8, 0, 60, 93, 8, 0, 125, 94, 8, 0, 188, 95, 8, 0, 253, 96, 8, 0, 60, 98, 8, 0, 125, 99, 8, 0, 188, 100, 8, 0, 253, 101, 8, 0, 60, 103, 8, 0, 125, 104, 8, 0, 188, 105, 8, 0, 253, 106, 8, 0, 60, 108, 8, 0, 125, 109, 8, 0, 188, 110, 8, 0, 253, 111, 8, 0, 60, 113, 8, 0, 125, 114, 8, 0, 188, 115, 8, 0, 253, 116, 8, 0, 60, 118, 8, 0, 125, 119, 8, 0, 188, 120, 8, 0, 253, 121, 8, 0, 60, 123, 8, 0, 125, 124, 8, 0, 188, 125, 8, 0, 253, 126, 8, 0, 60, 128, 8, 0, 125, 129, 8, 0, 188, 130, 8, 0, 253, 131, 8, 0, 60, 133, 8, 0, 125, 134, 8, 0, 188, 135, 8, 0, 253, 136, 8, 0, 60, 138, 8, 0, 125, 139, 8, 0, 188, 140, 8, 0, 253, 141, 8, 0, 60, 143, 8, 0, 125, 144, 8, 0, 188, 145, 8, 0, 253, 146, 8, 0, 60, 148, 8, 0, 125, 149, 8, 0, 188, 150, 8, 0, 253, 151, 8, 0, 60, 153, 8, 0, 125, 154, 8, 0, 188, 155, 8, 0, 253, 156, 8, 0, 60, 158, 8, 0, 125, 159, 8, 0, 188, 160, 8, 0, 253, 161, 8, 0, 60, 163, 8, 0, 125, 164, 8, 0, 188, 165, 8, 0, 253, 166, 8, 0, 60, 168, 8, 0, 125, 169, 8, 0, 188, 170, 8, 0, 253, 171, 8, 0, 60, 173, 8, 0, 125, 174, 8, 0, 188, 175, 8, 0, 253, 176, 8, 0, 60, 178, 8, 0, 125, 179, 8, 0, 188, 180, 8, 0, 253, 181, 8, 0, 60, 183, 8, 0, 125, 184, 8, 0, 188, 185, 8, 0, 253, 186, 8, 0, 60, 188, 8, 0, 125, 189, 8, 0, 188, 190, 8, 0, 253, 191, 8, 0, 60, 193, 8, 0, 125, 194, 8, 0, 188, 195, 8, 0, 253, 196, 8, 0, 60, 198, 8, 0, 125, 199, 8, 0, 188, 200, 8, 0, 253, 201, 8, 0, 60, 203, 8, 0, 125, 204, 8, 0, 188, 205, 8, 0, 253, 206, 8, 0, 60, 208, 8, 0, 125, 209, 8, 0, 188, 210, 8, 0, 253, 211, 8, 0, 60, 213, 8, 0, 125, 214, 8, 0, 188, 215, 8, 0, 253, 216, 8, 0, 60, 218, 8, 0, 125, 219, 8, 0, 188, 220, 8, 0, 253, 221, 8, 0, 60, 223, 8, 0, 125, 224, 8, 0, 188, 225, 8, 0, 253, 226, 8, 0, 60, 228, 8, 0, 125, 229, 8, 0, 188, 230, 8, 0, 253, 231, 8, 0, 60, 233, 8, 0, 125, 234, 8, 0, 188, 235, 8, 0, 253, 236, 8, 0, 60, 238, 8, 0, 125, 239, 8, 0, 188, 240, 8, 0, 253, 241, 8, 0, 60, 243, 8, 0, 125, 244, 8, 0, 188, 245, 8, 0, 253, 246, 8, 0, 60, 248, 8, 0, 125, 249, 8, 0, 188, 250, 8, 0, 253, 251, 8, 0, 60, 253, 8, 0, 125, 254, 8, 0, 188, 255, 8, 0, 253, 0, 9, 0, 60, 2, 9, 0, 125, 3, 9, 0, 188, 4, 9, 0, 253, 5, 9, 0, 60, 7, 9, 0, 125, 8, 9, 0, 188, 9, 9, 0, 253, 10, 9, 0, 60, 12, 9, 0, 125, 13, 9, 0, 188, 14, 9, 0, 253, 15, 9, 0, 60, 17, 9, 0, 125, 18, 9, 0, 188, 19, 9, 0, 253, 20, 9, 0, 60, 22, 9, 0, 125, 23, 9, 0, 188, 24, 9, 0, 253, 25, 9, 0, 60, 27, 9, 0, 125, 28, 9, 0, 188, 29, 9, 0, 253, 30, 9, 0, 60, 32, 9, 0, 125, 33, 9, 0, 188, 34, 9, 0, 253, 35, 9, 0, 60, 37, 9, 0, 125, 38, 9, 0, 188, 39, 9, 0, 253, 40, 9, 0, 60, 42, 9, 0, 125, 43, 9, 0, 188, 44, 9, 0, 253, 45, 9, 0, 60, 47, 9, 0, 125, 48, 9, 0, 188, 49, 9, 0, 253, 50, 9, 0, 60, 52, 9, 0, 125, 53, 9, 0, 188, 54, 9, 0, 253, 55, 9, 0, 60, 57, 9, 0, 125, 58, 9, 0, 188, 59, 9, 0, 253, 60, 9, 0, 60, 62, 9, 0, 125, 63, 9, 0, 188, 64, 9, 0, 253, 65, 9, 0, 60, 67, 9, 0, 125, 68, 9, 0, 188, 69, 9, 0, 253, 70, 9, 0, 60, 72, 9, 0, 125, 73, 9, 0, 188, 74, 9, 0, 253, 75, 9, 0, 60, 77, 9, 0, 125, 78, 9, 0, 188, 79, 9, 0, 253, 80, 9, 0, 60, 82, 9, 0, 125, 83, 9, 0, 188, 84, 9, 0, 253, 85, 9, 0, 60, 87, 9, 0, 125, 88, 9, 0, 188, 89, 9, 0, 253, 90, 9, 0, 60, 92, 9, 0, 125, 93, 9, 0, 188, 94, 9, 0, 253, 95, 9, 0, 60, 97, 9, 0, 125, 98, 9, 0, 188, 99, 9, 0, 253, 100, 9, 0, 60, 102, 9, 0, 125, 103, 9, 0, 188, 104, 9, 0, 253, 105, 9, 0, 60, 107, 9, 0, 125, 108, 9, 0, 188, 109, 9, 0, 253, 110, 9, 0, 60, 112, 9, 0, 125, 113, 9, 0, 188, 114, 9, 0, 253, 115, 9, 0, 60, 117, 9, 0, 125, 118, 9, 0, 188, 119, 9, 0, 253, 120, 9, 0, 60, 122, 9, 0, 125, 123, 9, 0, 188, 124, 9, 0, 253, 125, 9, 0, 60, 127, 9, 0, 125, 128, 9, 0, 188, 129, 9, 0, 253, 130, 9, 0, 60, 132, 9, 0, 125, 133, 9, 0, 188, 134, 9, 0, 253, 135, 9, 0, 60, 137, 9, 0, 125, 138, 9, 0, 188, 139, 9, 0, 253, 140, 9, 0, 60, 142, 9, 0, 125, 143, 9, 0, 188, 144, 9, 0, 253, 145, 9, 0, 60, 147, 9, 0, 125, 148, 9, 0, 188, 149, 9, 0, 253, 150, 9, 0, 60, 152, 9, 0, 125, 153, 9, 0, 188, 154, 9, 0, 253, 155, 9, 0, 60, 157, 9, 0, 125, 158, 9, 0, 188, 159, 9, 0, 253, 160, 9, 0, 60, 162, 9, 0, 125, 163, 9, 0, 188, 164, 9, 0, 253, 165, 9, 0, 60, 167, 9, 0, 125, 168, 9, 0, 188, 169, 9, 0, 253, 170, 9, 0, 60, 172, 9, 0, 125, 173, 9, 0, 188, 174, 9, 0, 253, 175, 9, 0, 60, 177, 9, 0, 125, 178, 9, 0, 188, 179, 9, 0, 253, 180, 9, 0, 60, 182, 9, 0, 125, 183, 9, 0, 188, 184, 9, 0, 253, 185, 9, 0, 60, 187, 9, 0, 125, 188, 9, 0, 188, 189, 9, 0, 253, 190, 9, 0, 60, 192, 9, 0, 125, 193, 9, 0, 188, 194, 9, 0, 253, 195, 9, 0, 60, 197, 9, 0, 125, 198, 9, 0, 188, 199, 9, 0, 253, 200, 9, 0, 60, 202, 9, 0, 125, 203, 9, 0, 188, 204, 9, 0, 253, 205, 9, 0, 60, 207, 9, 0, 125, 208, 9, 0, 188, 209, 9, 0, 253, 210, 9, 0, 60, 212, 9, 0, 125, 213, 9, 0, 188, 214, 9, 0, 253, 215, 9, 0, 60, 217, 9, 0, 125, 218, 9, 0, 188, 219, 9, 0, 253, 220, 9, 0, 60, 222, 9, 0, 125, 223, 9, 0, 188, 224, 9, 0, 253, 225, 9, 0, 60, 227, 9, 0, 125, 228, 9, 0, 188, 229, 9, 0, 253, 230, 9, 0, 60, 232, 9, 0, 125, 233, 9, 0, 188, 234, 9, 0, 253, 235, 9, 0, 60, 237, 9, 0, 125, 238, 9, 0, 188, 239, 9, 0, 253, 240, 9, 0, 60, 242, 9, 0, 125, 243, 9, 0, 188, 244, 9, 0, 253, 245, 9, 0, 60, 247, 9, 0, 125, 248, 9, 0, 188, 249, 9, 0, 253, 250, 9, 0, 60, 252, 9, 0, 125, 253, 9, 0, 188, 254, 9, 0, 253, 255, 9, 0, 60, 1, 10, 0, 125, 2, 10, 0, 188, 3, 10, 0, 253, 4, 10, 0, 60, 6, 10, 0, 125, 7, 10, 0, 188, 8, 10, 0, 253, 9, 10, 0, 60, 11, 10, 0, 125, 12, 10, 0, 188, 13, 10, 0, 253, 14, 10, 0, 60, 16, 10, 0, 125, 17, 10, 0, 188, 18, 10, 0, 253, 19, 10, 0, 60, 21, 10, 0, 125, 22, 10, 0, 188, 23, 10, 0, 253, 24, 10, 0, 60, 26, 10, 0, 125, 27, 10, 0, 188, 28, 10, 0, 253, 29, 10, 0, 60, 31, 10, 0, 125, 32, 10, 0, 188, 33, 10, 0, 253, 34, 10, 0, 60, 36, 10, 0, 125, 37, 10, 0, 188, 38, 10, 0, 253, 39, 10, 0, 60, 41, 10, 0, 125, 42, 10, 0, 188, 43, 10, 0, 253, 44, 10, 0, 60, 46, 10, 0, 125, 47, 10, 0, 188, 48, 10, 0, 253, 49, 10, 0, 60, 51, 10, 0, 125, 52, 10, 0, 188, 53, 10, 0, 253, 54, 10, 0, 60, 56, 10, 0, 125, 57, 10, 0, 188, 58, 10, 0, 253, 59, 10, 0, 60, 61, 10, 0, 125, 62, 10, 0, 188, 63, 10, 0, 253, 64, 10, 0, 60, 66, 10, 0, 125, 67, 10, 0, 188, 68, 10, 0, 253, 69, 10, 0, 60, 71, 10, 0, 125, 72, 10, 0, 188, 73, 10, 0, 253, 74, 10, 0, 60, 76, 10, 0, 125, 77, 10, 0, 188, 78, 10, 0, 253, 79, 10, 0, 60, 81, 10, 0, 125, 82, 10, 0, 188, 83, 10, 0, 253, 84, 10, 0, 60, 86, 10, 0, 125, 87, 10, 0, 188, 88, 10, 0, 253, 89, 10, 0, 60, 91, 10, 0, 125, 92, 10, 0, 188, 93, 10, 0, 253, 94, 10, 0, 60, 96, 10, 0, 125, 97, 10, 0, 188, 98, 10, 0, 253, 99, 10, 0, 60, 101, 10, 0, 125, 102, 10, 0, 188, 103, 10, 0, 253, 104, 10, 0, 60, 106, 10, 0, 125, 107, 10, 0, 188, 108, 10, 0, 253, 109, 10, 0, 60, 111, 10, 0, 125, 112, 10, 0, 188, 113, 10, 0, 253, 114, 10, 0, 60, 116, 10, 0, 125, 117, 10, 0, 188, 118, 10, 0, 253, 119, 10, 0, 60, 121, 10, 0, 125, 122, 10, 0, 188, 123, 10, 0, 253, 124, 10, 0, 60, 126, 10, 0, 125, 127, 10, 0, 188, 128, 10, 0, 253, 129, 10, 0, 60, 131, 10, 0, 125, 132, 10, 0, 188, 133, 10, 0, 253, 134, 10, 0, 60, 136, 10, 0, 125, 137, 10, 0, 188, 138, 10, 0, 253, 139, 10, 0, 60, 141, 10, 0, 125, 142, 10, 0, 188, 143, 10, 0, 253, 144, 10, 0, 60, 146, 10, 0, 125, 147, 10, 0, 188, 148, 10, 0, 253, 149, 10, 0, 60, 151, 10, 0, 125, 152, 10, 0, 188, 153, 10, 0, 253, 154, 10, 0, 60, 156, 10, 0, 125, 157, 10, 0, 188, 158, 10, 0, 253, 159, 10, 0, 60, 161, 10, 0, 125, 162, 10, 0, 188, 163, 10, 0, 253, 164, 10, 0, 60, 166, 10, 0, 125, 167, 10, 0, 188, 168, 10, 0, 253, 169, 10, 0, 60, 171, 10, 0, 125, 172, 10, 0, 188, 173, 10, 0, 253, 174, 10, 0, 60, 176, 10, 0, 125, 177, 10, 0, 188, 178, 10, 0, 253, 179, 10, 0, 60, 181, 10, 0, 125, 182, 10, 0, 188, 183, 10, 0, 253, 184, 10, 0, 60, 186, 10, 0, 125, 187, 10, 0, 188, 188, 10, 0, 253, 189, 10, 0, 60, 191, 10, 0, 125, 192, 10, 0, 188, 193, 10, 0, 253, 194, 10, 0, 60, 196, 10, 0, 125, 197, 10, 0, 188, 198, 10, 0, 253, 199, 10, 0, 60, 201, 10, 0, 125, 202, 10, 0, 188, 203, 10, 0, 253, 204, 10, 0, 60, 206, 10, 0, 125, 207, 10, 0, 188, 208, 10, 0, 253, 209, 10, 0, 60, 211, 10, 0, 125, 212, 10, 0, 188, 213, 10, 0, 253, 214, 10, 0, 60, 216, 10, 0, 125, 217, 10, 0, 188, 218, 10, 0, 253, 219, 10, 0, 60, 221, 10, 0, 125, 222, 10, 0, 188, 223, 10, 0, 253, 224, 10, 0, 60, 226, 10, 0, 125, 227, 10, 0, 188, 228, 10, 0, 253, 229, 10, 0, 60, 231, 10, 0, 125, 232, 10, 0, 188, 233, 10, 0, 253, 234, 10, 0, 60, 236, 10, 0, 125, 237, 10, 0, 188, 238, 10, 0, 253, 239, 10, 0, 60, 241, 10, 0, 125, 242, 10, 0, 188, 243, 10, 0, 253, 244, 10, 0, 60, 246, 10, 0, 125, 247, 10, 0, 188, 248, 10, 0, 253, 249, 10, 0, 60, 251, 10, 0, 125, 252, 10, 0, 188, 253, 10, 0, 253, 254, 10, 0, 60, 0, 11, 0, 125, 1, 11, 0, 188, 2, 11, 0, 253, 3, 11, 0, 60, 5, 11, 0, 125, 6, 11, 0, 188, 7, 11, 0, 253, 8, 11, 0, 60, 10, 11, 0, 125, 11, 11, 0, 188, 12, 11, 0, 253, 13, 11, 0, 60, 15, 11, 0, 125, 16, 11, 0, 188, 17, 11, 0, 253, 18, 11, 0, 60, 20, 11, 0, 125, 21, 11, 0, 188, 22, 11, 0, 253, 23, 11, 0, 60, 25, 11, 0, 125, 26, 11, 0, 188, 27, 11, 0, 253, 28, 11, 0, 60, 30, 11, 0, 125, 31, 11, 0, 188, 32, 11, 0, 253, 33, 11, 0, 60, 35, 11, 0, 125, 36, 11, 0, 188, 37, 11, 0, 253, 38, 11, 0, 60, 40, 11, 0, 125, 41, 11, 0, 188, 42, 11, 0, 253, 43, 11, 0, 60, 45, 11, 0, 125, 46, 11, 0, 188, 47, 11, 0, 253, 48, 11, 0, 60, 50, 11, 0, 125, 51, 11, 0, 188, 52, 11, 0, 253, 53, 11, 0, 60, 55, 11, 0, 125, 56, 11, 0, 188, 57, 11, 0, 253, 58, 11, 0, 60, 60, 11, 0, 125, 61, 11, 0, 188, 62, 11, 0, 253, 63, 11, 0, 60, 65, 11, 0, 125, 66, 11, 0, 188, 67, 11, 0, 253, 68, 11, 0, 60, 70, 11, 0, 125, 71, 11, 0, 188, 72, 11, 0, 253, 73, 11, 0, 60, 75, 11, 0, 125, 76, 11, 0, 188, 77, 11, 0, 253, 78, 11, 0, 60, 80, 11, 0, 125, 81, 11, 0, 188, 82, 11, 0, 253, 83, 11, 0, 60, 85, 11, 0, 125, 86, 11, 0, 188, 87, 11, 0, 253, 88, 11, 0, 60, 90, 11, 0, 125, 91, 11, 0, 188, 92, 11, 0, 253, 93, 11, 0, 60, 95, 11, 0, 125, 96, 11, 0, 188, 97, 11, 0, 253, 98, 11, 0, 60, 100, 11, 0, 125, 101, 11, 0, 188, 102, 11, 0, 253, 103, 11, 0, 60, 105, 11, 0, 125, 106, 11, 0, 188, 107, 11, 0, 253, 108, 11, 0, 60, 110, 11, 0, 125, 111, 11, 0, 188, 112, 11, 0, 253, 113, 11, 0, 60, 115, 11, 0, 125, 116, 11, 0, 188, 117, 11, 0, 253, 118, 11, 0, 60, 120, 11, 0, 125, 121, 11, 0, 188, 122, 11, 0, 253, 123, 11, 0, 60, 125, 11, 0, 125, 126, 11, 0, 188, 127, 11, 0, 253, 128, 11, 0, 60, 130, 11, 0, 125, 131, 11, 0, 188, 132, 11, 0, 253, 133, 11, 0, 60, 135, 11, 0, 125, 136, 11, 0, 188, 137, 11, 0, 253, 138, 11, 0, 60, 140, 11, 0, 125, 141, 11, 0, 188, 142, 11, 0, 253, 143, 11, 0, 60, 145, 11, 0, 125, 146, 11, 0, 188, 147, 11, 0, 253, 148, 11, 0, 60, 150, 11, 0, 125, 151, 11, 0, 188, 152, 11, 0, 253, 153, 11, 0, 60, 155, 11, 0, 125, 156, 11, 0, 188, 157, 11, 0, 253, 158, 11, 0, 60, 160, 11, 0, 125, 161, 11, 0, 188, 162, 11, 0, 253, 163, 11, 0, 60, 165, 11, 0, 125, 166, 11, 0, 188, 167, 11, 0, 253, 168, 11, 0, 60, 170, 11, 0, 125, 171, 11, 0, 188, 172, 11, 0, 253, 173, 11, 0, 60, 175, 11, 0, 125, 176, 11, 0, 188, 177, 11, 0, 253, 178, 11, 0, 60, 180, 11, 0, 125, 181, 11, 0, 188, 182, 11, 0, 253, 183, 11, 0, 60, 185, 11, 0, 125, 186, 11, 0, 188, 187, 11, 0, 253, 188, 11, 0, 60, 190, 11, 0, 125, 191, 11, 0, 188, 192, 11, 0, 253, 193, 11, 0, 60, 195, 11, 0, 125, 196, 11, 0, 188, 197, 11, 0, 253, 198, 11, 0, 60, 200, 11, 0, 125, 201, 11, 0, 188, 202, 11, 0, 253, 203, 11, 0, 60, 205, 11, 0, 125, 206, 11, 0, 188, 207, 11, 0, 253, 208, 11, 0, 60, 210, 11, 0, 125, 211, 11, 0, 188, 212, 11, 0, 253, 213, 11, 0, 60, 215, 11, 0, 125, 216, 11, 0, 188, 217, 11, 0, 253, 218, 11, 0, 60, 220, 11, 0, 125, 221, 11, 0, 188, 222, 11, 0, 253, 223, 11, 0, 60, 225, 11, 0, 125, 226, 11, 0, 188, 227, 11, 0, 253, 228, 11, 0, 60, 230, 11, 0, 125, 231, 11, 0, 188, 232, 11, 0, 253, 233, 11, 0, 60, 235, 11, 0, 125, 236, 11, 0, 188, 237, 11, 0, 253, 238, 11, 0, 60, 240, 11, 0, 125, 241, 11, 0, 188, 242, 11, 0, 253, 243, 11, 0, 60, 245, 11, 0, 125, 246, 11, 0, 188, 247, 11, 0, 253, 248, 11, 0, 60, 250, 11, 0, 125, 251, 11, 0, 188, 252, 11, 0, 253, 253, 11, 0, 60, 255, 11, 0, 125, 0, 12, 0, 188, 1, 12, 0, 253, 2, 12, 0, 60, 4, 12, 0, 125, 5, 12, 0, 188, 6, 12, 0, 253, 7, 12, 0, 60, 9, 12, 0, 125, 10, 12, 0, 188, 11, 12, 0, 253, 12, 12, 0, 60, 14, 12, 0, 125, 15, 12, 0, 188, 16, 12, 0, 253, 17, 12, 0, 60, 19, 12, 0, 125, 20, 12, 0, 188, 21, 12, 0, 253, 22, 12, 0, 60, 24, 12, 0, 125, 25, 12, 0, 188, 26, 12, 0, 253, 27, 12, 0, 60, 29, 12, 0, 125, 30, 12, 0, 188, 31, 12, 0, 253, 32, 12, 0, 60, 34, 12, 0, 125, 35, 12, 0, 188, 36, 12, 0, 253, 37, 12, 0, 60, 39, 12, 0, 125, 40, 12, 0, 188, 41, 12, 0, 253, 42, 12, 0, 60, 44, 12, 0, 125, 45, 12, 0, 188, 46, 12, 0, 253, 47, 12, 0, 60, 49, 12, 0, 125, 50, 12, 0, 188, 51, 12, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_one_channel.json b/tests/recordings/logic_analyzer/test_capture_one_channel.json deleted file mode 100644 index 200a0e14..00000000 --- a/tests/recordings/logic_analyzer/test_capture_one_channel.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [0], [10], [9], [196, 9], [0]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [188, 0, 0, 0, 253, 1, 0, 0, 60, 3, 0, 0, 125, 4, 0, 0, 188, 5, 0, 0, 253, 6, 0, 0, 60, 8, 0, 0, 125, 9, 0, 0, 188, 10, 0, 0, 253, 11, 0, 0, 60, 13, 0, 0, 125, 14, 0, 0, 188, 15, 0, 0, 253, 16, 0, 0, 60, 18, 0, 0, 125, 19, 0, 0, 188, 20, 0, 0, 253, 21, 0, 0, 60, 23, 0, 0, 125, 24, 0, 0, 188, 25, 0, 0, 253, 26, 0, 0, 60, 28, 0, 0, 125, 29, 0, 0, 188, 30, 0, 0, 253, 31, 0, 0, 60, 33, 0, 0, 125, 34, 0, 0, 188, 35, 0, 0, 253, 36, 0, 0, 60, 38, 0, 0, 125, 39, 0, 0, 188, 40, 0, 0, 253, 41, 0, 0, 60, 43, 0, 0, 125, 44, 0, 0, 188, 45, 0, 0, 253, 46, 0, 0, 60, 48, 0, 0, 125, 49, 0, 0, 188, 50, 0, 0, 253, 51, 0, 0, 60, 53, 0, 0, 125, 54, 0, 0, 188, 55, 0, 0, 253, 56, 0, 0, 60, 58, 0, 0, 125, 59, 0, 0, 188, 60, 0, 0, 253, 61, 0, 0, 60, 63, 0, 0, 125, 64, 0, 0, 188, 65, 0, 0, 253, 66, 0, 0, 60, 68, 0, 0, 125, 69, 0, 0, 188, 70, 0, 0, 253, 71, 0, 0, 60, 73, 0, 0, 125, 74, 0, 0, 188, 75, 0, 0, 253, 76, 0, 0, 60, 78, 0, 0, 125, 79, 0, 0, 188, 80, 0, 0, 253, 81, 0, 0, 60, 83, 0, 0, 125, 84, 0, 0, 188, 85, 0, 0, 253, 86, 0, 0, 60, 88, 0, 0, 125, 89, 0, 0, 188, 90, 0, 0, 253, 91, 0, 0, 60, 93, 0, 0, 125, 94, 0, 0, 188, 95, 0, 0, 253, 96, 0, 0, 60, 98, 0, 0, 125, 99, 0, 0, 188, 100, 0, 0, 253, 101, 0, 0, 60, 103, 0, 0, 125, 104, 0, 0, 188, 105, 0, 0, 253, 106, 0, 0, 60, 108, 0, 0, 125, 109, 0, 0, 188, 110, 0, 0, 253, 111, 0, 0, 60, 113, 0, 0, 125, 114, 0, 0, 188, 115, 0, 0, 253, 116, 0, 0, 60, 118, 0, 0, 125, 119, 0, 0, 188, 120, 0, 0, 253, 121, 0, 0, 60, 123, 0, 0, 125, 124, 0, 0, 188, 125, 0, 0, 253, 126, 0, 0, 60, 128, 0, 0, 125, 129, 0, 0, 188, 130, 0, 0, 253, 131, 0, 0, 60, 133, 0, 0, 125, 134, 0, 0, 188, 135, 0, 0, 253, 136, 0, 0, 60, 138, 0, 0, 125, 139, 0, 0, 188, 140, 0, 0, 253, 141, 0, 0, 60, 143, 0, 0, 125, 144, 0, 0, 188, 145, 0, 0, 253, 146, 0, 0, 60, 148, 0, 0, 125, 149, 0, 0, 188, 150, 0, 0, 253, 151, 0, 0, 60, 153, 0, 0, 125, 154, 0, 0, 188, 155, 0, 0, 253, 156, 0, 0, 60, 158, 0, 0, 125, 159, 0, 0, 188, 160, 0, 0, 253, 161, 0, 0, 60, 163, 0, 0, 125, 164, 0, 0, 188, 165, 0, 0, 253, 166, 0, 0, 60, 168, 0, 0, 125, 169, 0, 0, 188, 170, 0, 0, 253, 171, 0, 0, 60, 173, 0, 0, 125, 174, 0, 0, 188, 175, 0, 0, 253, 176, 0, 0, 60, 178, 0, 0, 125, 179, 0, 0, 188, 180, 0, 0, 253, 181, 0, 0, 60, 183, 0, 0, 125, 184, 0, 0, 188, 185, 0, 0, 253, 186, 0, 0, 60, 188, 0, 0, 125, 189, 0, 0, 188, 190, 0, 0, 253, 191, 0, 0, 60, 193, 0, 0, 125, 194, 0, 0, 188, 195, 0, 0, 253, 196, 0, 0, 60, 198, 0, 0, 125, 199, 0, 0, 188, 200, 0, 0, 253, 201, 0, 0, 60, 203, 0, 0, 125, 204, 0, 0, 188, 205, 0, 0, 253, 206, 0, 0, 60, 208, 0, 0, 125, 209, 0, 0, 188, 210, 0, 0, 253, 211, 0, 0, 60, 213, 0, 0, 125, 214, 0, 0, 188, 215, 0, 0, 253, 216, 0, 0, 60, 218, 0, 0, 125, 219, 0, 0, 188, 220, 0, 0, 253, 221, 0, 0, 60, 223, 0, 0, 125, 224, 0, 0, 188, 225, 0, 0, 253, 226, 0, 0, 60, 228, 0, 0, 125, 229, 0, 0, 188, 230, 0, 0, 253, 231, 0, 0, 60, 233, 0, 0, 125, 234, 0, 0, 188, 235, 0, 0, 253, 236, 0, 0, 60, 238, 0, 0, 125, 239, 0, 0, 188, 240, 0, 0, 253, 241, 0, 0, 60, 243, 0, 0, 125, 244, 0, 0, 188, 245, 0, 0, 253, 246, 0, 0, 60, 248, 0, 0, 125, 249, 0, 0, 188, 250, 0, 0, 253, 251, 0, 0, 60, 253, 0, 0, 125, 254, 0, 0, 188, 255, 0, 0, 253, 0, 1, 0, 60, 2, 1, 0, 125, 3, 1, 0, 188, 4, 1, 0, 253, 5, 1, 0, 60, 7, 1, 0, 125, 8, 1, 0, 188, 9, 1, 0, 253, 10, 1, 0, 60, 12, 1, 0, 125, 13, 1, 0, 188, 14, 1, 0, 253, 15, 1, 0, 60, 17, 1, 0, 125, 18, 1, 0, 188, 19, 1, 0, 253, 20, 1, 0, 60, 22, 1, 0, 125, 23, 1, 0, 188, 24, 1, 0, 253, 25, 1, 0, 60, 27, 1, 0, 125, 28, 1, 0, 188, 29, 1, 0, 253, 30, 1, 0, 60, 32, 1, 0, 125, 33, 1, 0, 188, 34, 1, 0, 253, 35, 1, 0, 60, 37, 1, 0, 125, 38, 1, 0, 188, 39, 1, 0, 253, 40, 1, 0, 60, 42, 1, 0, 125, 43, 1, 0, 188, 44, 1, 0, 253, 45, 1, 0, 60, 47, 1, 0, 125, 48, 1, 0, 188, 49, 1, 0, 253, 50, 1, 0, 60, 52, 1, 0, 125, 53, 1, 0, 188, 54, 1, 0, 253, 55, 1, 0, 60, 57, 1, 0, 125, 58, 1, 0, 188, 59, 1, 0, 253, 60, 1, 0, 60, 62, 1, 0, 125, 63, 1, 0, 188, 64, 1, 0, 253, 65, 1, 0, 60, 67, 1, 0, 125, 68, 1, 0, 188, 69, 1, 0, 253, 70, 1, 0, 60, 72, 1, 0, 125, 73, 1, 0, 188, 74, 1, 0, 253, 75, 1, 0, 60, 77, 1, 0, 125, 78, 1, 0, 188, 79, 1, 0, 253, 80, 1, 0, 60, 82, 1, 0, 125, 83, 1, 0, 188, 84, 1, 0, 253, 85, 1, 0, 60, 87, 1, 0, 125, 88, 1, 0, 188, 89, 1, 0, 253, 90, 1, 0, 60, 92, 1, 0, 125, 93, 1, 0, 188, 94, 1, 0, 253, 95, 1, 0, 60, 97, 1, 0, 125, 98, 1, 0, 188, 99, 1, 0, 253, 100, 1, 0, 60, 102, 1, 0, 125, 103, 1, 0, 188, 104, 1, 0, 253, 105, 1, 0, 60, 107, 1, 0, 125, 108, 1, 0, 188, 109, 1, 0, 253, 110, 1, 0, 60, 112, 1, 0, 125, 113, 1, 0, 188, 114, 1, 0, 253, 115, 1, 0, 60, 117, 1, 0, 125, 118, 1, 0, 188, 119, 1, 0, 253, 120, 1, 0, 60, 122, 1, 0, 125, 123, 1, 0, 188, 124, 1, 0, 253, 125, 1, 0, 60, 127, 1, 0, 125, 128, 1, 0, 188, 129, 1, 0, 253, 130, 1, 0, 60, 132, 1, 0, 125, 133, 1, 0, 188, 134, 1, 0, 253, 135, 1, 0, 60, 137, 1, 0, 125, 138, 1, 0, 188, 139, 1, 0, 253, 140, 1, 0, 60, 142, 1, 0, 125, 143, 1, 0, 188, 144, 1, 0, 253, 145, 1, 0, 60, 147, 1, 0, 125, 148, 1, 0, 188, 149, 1, 0, 253, 150, 1, 0, 60, 152, 1, 0, 125, 153, 1, 0, 188, 154, 1, 0, 253, 155, 1, 0, 60, 157, 1, 0, 125, 158, 1, 0, 188, 159, 1, 0, 253, 160, 1, 0, 60, 162, 1, 0, 125, 163, 1, 0, 188, 164, 1, 0, 253, 165, 1, 0, 60, 167, 1, 0, 125, 168, 1, 0, 188, 169, 1, 0, 253, 170, 1, 0, 60, 172, 1, 0, 125, 173, 1, 0, 188, 174, 1, 0, 253, 175, 1, 0, 60, 177, 1, 0, 125, 178, 1, 0, 188, 179, 1, 0, 253, 180, 1, 0, 60, 182, 1, 0, 125, 183, 1, 0, 188, 184, 1, 0, 253, 185, 1, 0, 60, 187, 1, 0, 125, 188, 1, 0, 188, 189, 1, 0, 253, 190, 1, 0, 60, 192, 1, 0, 125, 193, 1, 0, 188, 194, 1, 0, 253, 195, 1, 0, 60, 197, 1, 0, 125, 198, 1, 0, 188, 199, 1, 0, 253, 200, 1, 0, 60, 202, 1, 0, 125, 203, 1, 0, 188, 204, 1, 0, 253, 205, 1, 0, 60, 207, 1, 0, 125, 208, 1, 0, 188, 209, 1, 0, 253, 210, 1, 0, 60, 212, 1, 0, 125, 213, 1, 0, 188, 214, 1, 0, 253, 215, 1, 0, 60, 217, 1, 0, 125, 218, 1, 0, 188, 219, 1, 0, 253, 220, 1, 0, 60, 222, 1, 0, 125, 223, 1, 0, 188, 224, 1, 0, 253, 225, 1, 0, 60, 227, 1, 0, 125, 228, 1, 0, 188, 229, 1, 0, 253, 230, 1, 0, 60, 232, 1, 0, 125, 233, 1, 0, 188, 234, 1, 0, 253, 235, 1, 0, 60, 237, 1, 0, 125, 238, 1, 0, 188, 239, 1, 0, 253, 240, 1, 0, 60, 242, 1, 0, 125, 243, 1, 0, 188, 244, 1, 0, 253, 245, 1, 0, 60, 247, 1, 0, 125, 248, 1, 0, 188, 249, 1, 0, 253, 250, 1, 0, 60, 252, 1, 0, 125, 253, 1, 0, 188, 254, 1, 0, 253, 255, 1, 0, 60, 1, 2, 0, 125, 2, 2, 0, 188, 3, 2, 0, 253, 4, 2, 0, 60, 6, 2, 0, 125, 7, 2, 0, 188, 8, 2, 0, 253, 9, 2, 0, 60, 11, 2, 0, 125, 12, 2, 0, 188, 13, 2, 0, 253, 14, 2, 0, 60, 16, 2, 0, 125, 17, 2, 0, 188, 18, 2, 0, 253, 19, 2, 0, 60, 21, 2, 0, 125, 22, 2, 0, 188, 23, 2, 0, 253, 24, 2, 0, 60, 26, 2, 0, 125, 27, 2, 0, 188, 28, 2, 0, 253, 29, 2, 0, 60, 31, 2, 0, 125, 32, 2, 0, 188, 33, 2, 0, 253, 34, 2, 0, 60, 36, 2, 0, 125, 37, 2, 0, 188, 38, 2, 0, 253, 39, 2, 0, 60, 41, 2, 0, 125, 42, 2, 0, 188, 43, 2, 0, 253, 44, 2, 0, 60, 46, 2, 0, 125, 47, 2, 0, 188, 48, 2, 0, 253, 49, 2, 0, 60, 51, 2, 0, 125, 52, 2, 0, 188, 53, 2, 0, 253, 54, 2, 0, 60, 56, 2, 0, 125, 57, 2, 0, 188, 58, 2, 0, 253, 59, 2, 0, 60, 61, 2, 0, 125, 62, 2, 0, 188, 63, 2, 0, 253, 64, 2, 0, 60, 66, 2, 0, 125, 67, 2, 0, 188, 68, 2, 0, 253, 69, 2, 0, 60, 71, 2, 0, 125, 72, 2, 0, 188, 73, 2, 0, 253, 74, 2, 0, 60, 76, 2, 0, 125, 77, 2, 0, 188, 78, 2, 0, 253, 79, 2, 0, 60, 81, 2, 0, 125, 82, 2, 0, 188, 83, 2, 0, 253, 84, 2, 0, 60, 86, 2, 0, 125, 87, 2, 0, 188, 88, 2, 0, 253, 89, 2, 0, 60, 91, 2, 0, 125, 92, 2, 0, 188, 93, 2, 0, 253, 94, 2, 0, 60, 96, 2, 0, 125, 97, 2, 0, 188, 98, 2, 0, 253, 99, 2, 0, 60, 101, 2, 0, 125, 102, 2, 0, 188, 103, 2, 0, 253, 104, 2, 0, 60, 106, 2, 0, 125, 107, 2, 0, 188, 108, 2, 0, 253, 109, 2, 0, 60, 111, 2, 0, 125, 112, 2, 0, 188, 113, 2, 0, 253, 114, 2, 0, 60, 116, 2, 0, 125, 117, 2, 0, 188, 118, 2, 0, 253, 119, 2, 0, 60, 121, 2, 0, 125, 122, 2, 0, 188, 123, 2, 0, 253, 124, 2, 0, 60, 126, 2, 0, 125, 127, 2, 0, 188, 128, 2, 0, 253, 129, 2, 0, 60, 131, 2, 0, 125, 132, 2, 0, 188, 133, 2, 0, 253, 134, 2, 0, 60, 136, 2, 0, 125, 137, 2, 0, 188, 138, 2, 0, 253, 139, 2, 0, 60, 141, 2, 0, 125, 142, 2, 0, 188, 143, 2, 0, 253, 144, 2, 0, 60, 146, 2, 0, 125, 147, 2, 0, 188, 148, 2, 0, 253, 149, 2, 0, 60, 151, 2, 0, 125, 152, 2, 0, 188, 153, 2, 0, 253, 154, 2, 0, 60, 156, 2, 0, 125, 157, 2, 0, 188, 158, 2, 0, 253, 159, 2, 0, 60, 161, 2, 0, 125, 162, 2, 0, 188, 163, 2, 0, 253, 164, 2, 0, 60, 166, 2, 0, 125, 167, 2, 0, 188, 168, 2, 0, 253, 169, 2, 0, 60, 171, 2, 0, 125, 172, 2, 0, 188, 173, 2, 0, 253, 174, 2, 0, 60, 176, 2, 0, 125, 177, 2, 0, 188, 178, 2, 0, 253, 179, 2, 0, 60, 181, 2, 0, 125, 182, 2, 0, 188, 183, 2, 0, 253, 184, 2, 0, 60, 186, 2, 0, 125, 187, 2, 0, 188, 188, 2, 0, 253, 189, 2, 0, 60, 191, 2, 0, 125, 192, 2, 0, 188, 193, 2, 0, 253, 194, 2, 0, 60, 196, 2, 0, 125, 197, 2, 0, 188, 198, 2, 0, 253, 199, 2, 0, 60, 201, 2, 0, 125, 202, 2, 0, 188, 203, 2, 0, 253, 204, 2, 0, 60, 206, 2, 0, 125, 207, 2, 0, 188, 208, 2, 0, 253, 209, 2, 0, 60, 211, 2, 0, 125, 212, 2, 0, 188, 213, 2, 0, 253, 214, 2, 0, 60, 216, 2, 0, 125, 217, 2, 0, 188, 218, 2, 0, 253, 219, 2, 0, 60, 221, 2, 0, 125, 222, 2, 0, 188, 223, 2, 0, 253, 224, 2, 0, 60, 226, 2, 0, 125, 227, 2, 0, 188, 228, 2, 0, 253, 229, 2, 0, 60, 231, 2, 0, 125, 232, 2, 0, 188, 233, 2, 0, 253, 234, 2, 0, 60, 236, 2, 0, 125, 237, 2, 0, 188, 238, 2, 0, 253, 239, 2, 0, 60, 241, 2, 0, 125, 242, 2, 0, 188, 243, 2, 0, 253, 244, 2, 0, 60, 246, 2, 0, 125, 247, 2, 0, 188, 248, 2, 0, 253, 249, 2, 0, 60, 251, 2, 0, 125, 252, 2, 0, 188, 253, 2, 0, 253, 254, 2, 0, 60, 0, 3, 0, 125, 1, 3, 0, 188, 2, 3, 0, 253, 3, 3, 0, 60, 5, 3, 0, 125, 6, 3, 0, 188, 7, 3, 0, 253, 8, 3, 0, 60, 10, 3, 0, 125, 11, 3, 0, 188, 12, 3, 0, 253, 13, 3, 0, 60, 15, 3, 0, 125, 16, 3, 0, 188, 17, 3, 0, 253, 18, 3, 0, 60, 20, 3, 0, 125, 21, 3, 0, 188, 22, 3, 0, 253, 23, 3, 0, 60, 25, 3, 0, 125, 26, 3, 0, 188, 27, 3, 0, 253, 28, 3, 0, 60, 30, 3, 0, 125, 31, 3, 0, 188, 32, 3, 0, 253, 33, 3, 0, 60, 35, 3, 0, 125, 36, 3, 0, 188, 37, 3, 0, 253, 38, 3, 0, 60, 40, 3, 0, 125, 41, 3, 0, 188, 42, 3, 0, 253, 43, 3, 0, 60, 45, 3, 0, 125, 46, 3, 0, 188, 47, 3, 0, 253, 48, 3, 0, 60, 50, 3, 0, 125, 51, 3, 0, 188, 52, 3, 0, 253, 53, 3, 0, 60, 55, 3, 0, 125, 56, 3, 0, 188, 57, 3, 0, 253, 58, 3, 0, 60, 60, 3, 0, 125, 61, 3, 0, 188, 62, 3, 0, 253, 63, 3, 0, 60, 65, 3, 0, 125, 66, 3, 0, 188, 67, 3, 0, 253, 68, 3, 0, 60, 70, 3, 0, 125, 71, 3, 0, 188, 72, 3, 0, 253, 73, 3, 0, 60, 75, 3, 0, 125, 76, 3, 0, 188, 77, 3, 0, 253, 78, 3, 0, 60, 80, 3, 0, 125, 81, 3, 0, 188, 82, 3, 0, 253, 83, 3, 0, 60, 85, 3, 0, 125, 86, 3, 0, 188, 87, 3, 0, 253, 88, 3, 0, 60, 90, 3, 0, 125, 91, 3, 0, 188, 92, 3, 0, 253, 93, 3, 0, 60, 95, 3, 0, 125, 96, 3, 0, 188, 97, 3, 0, 253, 98, 3, 0, 60, 100, 3, 0, 125, 101, 3, 0, 188, 102, 3, 0, 253, 103, 3, 0, 60, 105, 3, 0, 125, 106, 3, 0, 188, 107, 3, 0, 253, 108, 3, 0, 60, 110, 3, 0, 125, 111, 3, 0, 188, 112, 3, 0, 253, 113, 3, 0, 60, 115, 3, 0, 125, 116, 3, 0, 188, 117, 3, 0, 253, 118, 3, 0, 60, 120, 3, 0, 125, 121, 3, 0, 188, 122, 3, 0, 253, 123, 3, 0, 60, 125, 3, 0, 125, 126, 3, 0, 188, 127, 3, 0, 253, 128, 3, 0, 60, 130, 3, 0, 125, 131, 3, 0, 188, 132, 3, 0, 253, 133, 3, 0, 60, 135, 3, 0, 125, 136, 3, 0, 188, 137, 3, 0, 253, 138, 3, 0, 60, 140, 3, 0, 125, 141, 3, 0, 188, 142, 3, 0, 253, 143, 3, 0, 60, 145, 3, 0, 125, 146, 3, 0, 188, 147, 3, 0, 253, 148, 3, 0, 60, 150, 3, 0, 125, 151, 3, 0, 188, 152, 3, 0, 253, 153, 3, 0, 60, 155, 3, 0, 125, 156, 3, 0, 188, 157, 3, 0, 253, 158, 3, 0, 60, 160, 3, 0, 125, 161, 3, 0, 188, 162, 3, 0, 253, 163, 3, 0, 60, 165, 3, 0, 125, 166, 3, 0, 188, 167, 3, 0, 253, 168, 3, 0, 60, 170, 3, 0, 125, 171, 3, 0, 188, 172, 3, 0, 253, 173, 3, 0, 60, 175, 3, 0, 125, 176, 3, 0, 188, 177, 3, 0, 253, 178, 3, 0, 60, 180, 3, 0, 125, 181, 3, 0, 188, 182, 3, 0, 253, 183, 3, 0, 60, 185, 3, 0, 125, 186, 3, 0, 188, 187, 3, 0, 253, 188, 3, 0, 60, 190, 3, 0, 125, 191, 3, 0, 188, 192, 3, 0, 253, 193, 3, 0, 60, 195, 3, 0, 125, 196, 3, 0, 188, 197, 3, 0, 253, 198, 3, 0, 60, 200, 3, 0, 125, 201, 3, 0, 188, 202, 3, 0, 253, 203, 3, 0, 60, 205, 3, 0, 125, 206, 3, 0, 188, 207, 3, 0, 253, 208, 3, 0, 60, 210, 3, 0, 125, 211, 3, 0, 188, 212, 3, 0, 253, 213, 3, 0, 60, 215, 3, 0, 125, 216, 3, 0, 188, 217, 3, 0, 253, 218, 3, 0, 60, 220, 3, 0, 125, 221, 3, 0, 188, 222, 3, 0, 253, 223, 3, 0, 60, 225, 3, 0, 125, 226, 3, 0, 188, 227, 3, 0, 253, 228, 3, 0, 60, 230, 3, 0, 125, 231, 3, 0, 188, 232, 3, 0, 253, 233, 3, 0, 60, 235, 3, 0, 125, 236, 3, 0, 188, 237, 3, 0, 253, 238, 3, 0, 60, 240, 3, 0, 125, 241, 3, 0, 188, 242, 3, 0, 253, 243, 3, 0, 60, 245, 3, 0, 125, 246, 3, 0, 188, 247, 3, 0, 253, 248, 3, 0, 60, 250, 3, 0, 125, 251, 3, 0, 188, 252, 3, 0, 253, 253, 3, 0, 60, 255, 3, 0, 125, 0, 4, 0, 188, 1, 4, 0, 253, 2, 4, 0, 60, 4, 4, 0, 125, 5, 4, 0, 188, 6, 4, 0, 253, 7, 4, 0, 60, 9, 4, 0, 125, 10, 4, 0, 188, 11, 4, 0, 253, 12, 4, 0, 60, 14, 4, 0, 125, 15, 4, 0, 188, 16, 4, 0, 253, 17, 4, 0, 60, 19, 4, 0, 125, 20, 4, 0, 188, 21, 4, 0, 253, 22, 4, 0, 60, 24, 4, 0, 125, 25, 4, 0, 188, 26, 4, 0, 253, 27, 4, 0, 60, 29, 4, 0, 125, 30, 4, 0, 188, 31, 4, 0, 253, 32, 4, 0, 60, 34, 4, 0, 125, 35, 4, 0, 188, 36, 4, 0, 253, 37, 4, 0, 60, 39, 4, 0, 125, 40, 4, 0, 188, 41, 4, 0, 253, 42, 4, 0, 60, 44, 4, 0, 125, 45, 4, 0, 188, 46, 4, 0, 253, 47, 4, 0, 60, 49, 4, 0, 125, 50, 4, 0, 188, 51, 4, 0, 253, 52, 4, 0, 60, 54, 4, 0, 125, 55, 4, 0, 188, 56, 4, 0, 253, 57, 4, 0, 60, 59, 4, 0, 125, 60, 4, 0, 188, 61, 4, 0, 253, 62, 4, 0, 60, 64, 4, 0, 125, 65, 4, 0, 188, 66, 4, 0, 253, 67, 4, 0, 60, 69, 4, 0, 125, 70, 4, 0, 188, 71, 4, 0, 253, 72, 4, 0, 60, 74, 4, 0, 125, 75, 4, 0, 188, 76, 4, 0, 253, 77, 4, 0, 60, 79, 4, 0, 125, 80, 4, 0, 188, 81, 4, 0, 253, 82, 4, 0, 60, 84, 4, 0, 125, 85, 4, 0, 188, 86, 4, 0, 253, 87, 4, 0, 60, 89, 4, 0, 125, 90, 4, 0, 188, 91, 4, 0, 253, 92, 4, 0, 60, 94, 4, 0, 125, 95, 4, 0, 188, 96, 4, 0, 253, 97, 4, 0, 60, 99, 4, 0, 125, 100, 4, 0, 188, 101, 4, 0, 253, 102, 4, 0, 60, 104, 4, 0, 125, 105, 4, 0, 188, 106, 4, 0, 253, 107, 4, 0, 60, 109, 4, 0, 125, 110, 4, 0, 188, 111, 4, 0, 253, 112, 4, 0, 60, 114, 4, 0, 125, 115, 4, 0, 188, 116, 4, 0, 253, 117, 4, 0, 60, 119, 4, 0, 125, 120, 4, 0, 188, 121, 4, 0, 253, 122, 4, 0, 60, 124, 4, 0, 125, 125, 4, 0, 188, 126, 4, 0, 253, 127, 4, 0, 60, 129, 4, 0, 125, 130, 4, 0, 188, 131, 4, 0, 253, 132, 4, 0, 60, 134, 4, 0, 125, 135, 4, 0, 188, 136, 4, 0, 253, 137, 4, 0, 60, 139, 4, 0, 125, 140, 4, 0, 188, 141, 4, 0, 253, 142, 4, 0, 60, 144, 4, 0, 125, 145, 4, 0, 188, 146, 4, 0, 253, 147, 4, 0, 60, 149, 4, 0, 125, 150, 4, 0, 188, 151, 4, 0, 253, 152, 4, 0, 60, 154, 4, 0, 125, 155, 4, 0, 188, 156, 4, 0, 253, 157, 4, 0, 60, 159, 4, 0, 125, 160, 4, 0, 188, 161, 4, 0, 253, 162, 4, 0, 60, 164, 4, 0, 125, 165, 4, 0, 188, 166, 4, 0, 253, 167, 4, 0, 60, 169, 4, 0, 125, 170, 4, 0, 188, 171, 4, 0, 253, 172, 4, 0, 60, 174, 4, 0, 125, 175, 4, 0, 188, 176, 4, 0, 253, 177, 4, 0, 60, 179, 4, 0, 125, 180, 4, 0, 188, 181, 4, 0, 253, 182, 4, 0, 60, 184, 4, 0, 125, 185, 4, 0, 188, 186, 4, 0, 253, 187, 4, 0, 60, 189, 4, 0, 125, 190, 4, 0, 188, 191, 4, 0, 253, 192, 4, 0, 60, 194, 4, 0, 125, 195, 4, 0, 188, 196, 4, 0, 253, 197, 4, 0, 60, 199, 4, 0, 125, 200, 4, 0, 188, 201, 4, 0, 253, 202, 4, 0, 60, 204, 4, 0, 125, 205, 4, 0, 188, 206, 4, 0, 253, 207, 4, 0, 60, 209, 4, 0, 125, 210, 4, 0, 188, 211, 4, 0, 253, 212, 4, 0, 60, 214, 4, 0, 125, 215, 4, 0, 188, 216, 4, 0, 253, 217, 4, 0, 60, 219, 4, 0, 125, 220, 4, 0, 188, 221, 4, 0, 253, 222, 4, 0, 60, 224, 4, 0, 125, 225, 4, 0, 188, 226, 4, 0, 253, 227, 4, 0, 60, 229, 4, 0, 125, 230, 4, 0, 188, 231, 4, 0, 253, 232, 4, 0, 60, 234, 4, 0, 125, 235, 4, 0, 188, 236, 4, 0, 253, 237, 4, 0, 60, 239, 4, 0, 125, 240, 4, 0, 188, 241, 4, 0, 253, 242, 4, 0, 60, 244, 4, 0, 125, 245, 4, 0, 188, 246, 4, 0, 253, 247, 4, 0, 60, 249, 4, 0, 125, 250, 4, 0, 188, 251, 4, 0, 253, 252, 4, 0, 60, 254, 4, 0, 125, 255, 4, 0, 188, 0, 5, 0, 253, 1, 5, 0, 60, 3, 5, 0, 125, 4, 5, 0, 188, 5, 5, 0, 253, 6, 5, 0, 60, 8, 5, 0, 125, 9, 5, 0, 188, 10, 5, 0, 253, 11, 5, 0, 60, 13, 5, 0, 125, 14, 5, 0, 188, 15, 5, 0, 253, 16, 5, 0, 60, 18, 5, 0, 125, 19, 5, 0, 188, 20, 5, 0, 253, 21, 5, 0, 60, 23, 5, 0, 125, 24, 5, 0, 188, 25, 5, 0, 253, 26, 5, 0, 60, 28, 5, 0, 125, 29, 5, 0, 188, 30, 5, 0, 253, 31, 5, 0, 60, 33, 5, 0, 125, 34, 5, 0, 188, 35, 5, 0, 253, 36, 5, 0, 60, 38, 5, 0, 125, 39, 5, 0, 188, 40, 5, 0, 253, 41, 5, 0, 60, 43, 5, 0, 125, 44, 5, 0, 188, 45, 5, 0, 253, 46, 5, 0, 60, 48, 5, 0, 125, 49, 5, 0, 188, 50, 5, 0, 253, 51, 5, 0, 60, 53, 5, 0, 125, 54, 5, 0, 188, 55, 5, 0, 253, 56, 5, 0, 60, 58, 5, 0, 125, 59, 5, 0, 188, 60, 5, 0, 253, 61, 5, 0, 60, 63, 5, 0, 125, 64, 5, 0, 188, 65, 5, 0, 253, 66, 5, 0, 60, 68, 5, 0, 125, 69, 5, 0, 188, 70, 5, 0, 253, 71, 5, 0, 60, 73, 5, 0, 125, 74, 5, 0, 188, 75, 5, 0, 253, 76, 5, 0, 60, 78, 5, 0, 125, 79, 5, 0, 188, 80, 5, 0, 253, 81, 5, 0, 60, 83, 5, 0, 125, 84, 5, 0, 188, 85, 5, 0, 253, 86, 5, 0, 60, 88, 5, 0, 125, 89, 5, 0, 188, 90, 5, 0, 253, 91, 5, 0, 60, 93, 5, 0, 125, 94, 5, 0, 188, 95, 5, 0, 253, 96, 5, 0, 60, 98, 5, 0, 125, 99, 5, 0, 188, 100, 5, 0, 253, 101, 5, 0, 60, 103, 5, 0, 125, 104, 5, 0, 188, 105, 5, 0, 253, 106, 5, 0, 60, 108, 5, 0, 125, 109, 5, 0, 188, 110, 5, 0, 253, 111, 5, 0, 60, 113, 5, 0, 125, 114, 5, 0, 188, 115, 5, 0, 253, 116, 5, 0, 60, 118, 5, 0, 125, 119, 5, 0, 188, 120, 5, 0, 253, 121, 5, 0, 60, 123, 5, 0, 125, 124, 5, 0, 188, 125, 5, 0, 253, 126, 5, 0, 60, 128, 5, 0, 125, 129, 5, 0, 188, 130, 5, 0, 253, 131, 5, 0, 60, 133, 5, 0, 125, 134, 5, 0, 188, 135, 5, 0, 253, 136, 5, 0, 60, 138, 5, 0, 125, 139, 5, 0, 188, 140, 5, 0, 253, 141, 5, 0, 60, 143, 5, 0, 125, 144, 5, 0, 188, 145, 5, 0, 253, 146, 5, 0, 60, 148, 5, 0, 125, 149, 5, 0, 188, 150, 5, 0, 253, 151, 5, 0, 60, 153, 5, 0, 125, 154, 5, 0, 188, 155, 5, 0, 253, 156, 5, 0, 60, 158, 5, 0, 125, 159, 5, 0, 188, 160, 5, 0, 253, 161, 5, 0, 60, 163, 5, 0, 125, 164, 5, 0, 188, 165, 5, 0, 253, 166, 5, 0, 60, 168, 5, 0, 125, 169, 5, 0, 188, 170, 5, 0, 253, 171, 5, 0, 60, 173, 5, 0, 125, 174, 5, 0, 188, 175, 5, 0, 253, 176, 5, 0, 60, 178, 5, 0, 125, 179, 5, 0, 188, 180, 5, 0, 253, 181, 5, 0, 60, 183, 5, 0, 125, 184, 5, 0, 188, 185, 5, 0, 253, 186, 5, 0, 60, 188, 5, 0, 125, 189, 5, 0, 188, 190, 5, 0, 253, 191, 5, 0, 60, 193, 5, 0, 125, 194, 5, 0, 188, 195, 5, 0, 253, 196, 5, 0, 60, 198, 5, 0, 125, 199, 5, 0, 188, 200, 5, 0, 253, 201, 5, 0, 60, 203, 5, 0, 125, 204, 5, 0, 188, 205, 5, 0, 253, 206, 5, 0, 60, 208, 5, 0, 125, 209, 5, 0, 188, 210, 5, 0, 253, 211, 5, 0, 60, 213, 5, 0, 125, 214, 5, 0, 188, 215, 5, 0, 253, 216, 5, 0, 60, 218, 5, 0, 125, 219, 5, 0, 188, 220, 5, 0, 253, 221, 5, 0, 60, 223, 5, 0, 125, 224, 5, 0, 188, 225, 5, 0, 253, 226, 5, 0, 60, 228, 5, 0, 125, 229, 5, 0, 188, 230, 5, 0, 253, 231, 5, 0, 60, 233, 5, 0, 125, 234, 5, 0, 188, 235, 5, 0, 253, 236, 5, 0, 60, 238, 5, 0, 125, 239, 5, 0, 188, 240, 5, 0, 253, 241, 5, 0, 60, 243, 5, 0, 125, 244, 5, 0, 188, 245, 5, 0, 253, 246, 5, 0, 60, 248, 5, 0, 125, 249, 5, 0, 188, 250, 5, 0, 253, 251, 5, 0, 60, 253, 5, 0, 125, 254, 5, 0, 188, 255, 5, 0, 253, 0, 6, 0, 60, 2, 6, 0, 125, 3, 6, 0, 188, 4, 6, 0, 253, 5, 6, 0, 60, 7, 6, 0, 125, 8, 6, 0, 188, 9, 6, 0, 253, 10, 6, 0, 60, 12, 6, 0, 125, 13, 6, 0, 188, 14, 6, 0, 253, 15, 6, 0, 60, 17, 6, 0, 125, 18, 6, 0, 188, 19, 6, 0, 253, 20, 6, 0, 60, 22, 6, 0, 125, 23, 6, 0, 188, 24, 6, 0, 253, 25, 6, 0, 60, 27, 6, 0, 125, 28, 6, 0, 188, 29, 6, 0, 253, 30, 6, 0, 60, 32, 6, 0, 125, 33, 6, 0, 188, 34, 6, 0, 253, 35, 6, 0, 60, 37, 6, 0, 125, 38, 6, 0, 188, 39, 6, 0, 253, 40, 6, 0, 60, 42, 6, 0, 125, 43, 6, 0, 188, 44, 6, 0, 253, 45, 6, 0, 60, 47, 6, 0, 125, 48, 6, 0, 188, 49, 6, 0, 253, 50, 6, 0, 60, 52, 6, 0, 125, 53, 6, 0, 188, 54, 6, 0, 253, 55, 6, 0, 60, 57, 6, 0, 125, 58, 6, 0, 188, 59, 6, 0, 253, 60, 6, 0, 60, 62, 6, 0, 125, 63, 6, 0, 188, 64, 6, 0, 253, 65, 6, 0, 60, 67, 6, 0, 125, 68, 6, 0, 188, 69, 6, 0, 253, 70, 6, 0, 60, 72, 6, 0, 125, 73, 6, 0, 188, 74, 6, 0, 253, 75, 6, 0, 60, 77, 6, 0, 125, 78, 6, 0, 188, 79, 6, 0, 253, 80, 6, 0, 60, 82, 6, 0, 125, 83, 6, 0, 188, 84, 6, 0, 253, 85, 6, 0, 60, 87, 6, 0, 125, 88, 6, 0, 188, 89, 6, 0, 253, 90, 6, 0, 60, 92, 6, 0, 125, 93, 6, 0, 188, 94, 6, 0, 253, 95, 6, 0, 60, 97, 6, 0, 125, 98, 6, 0, 188, 99, 6, 0, 253, 100, 6, 0, 60, 102, 6, 0, 125, 103, 6, 0, 188, 104, 6, 0, 253, 105, 6, 0, 60, 107, 6, 0, 125, 108, 6, 0, 188, 109, 6, 0, 253, 110, 6, 0, 60, 112, 6, 0, 125, 113, 6, 0, 188, 114, 6, 0, 253, 115, 6, 0, 60, 117, 6, 0, 125, 118, 6, 0, 188, 119, 6, 0, 253, 120, 6, 0, 60, 122, 6, 0, 125, 123, 6, 0, 188, 124, 6, 0, 253, 125, 6, 0, 60, 127, 6, 0, 125, 128, 6, 0, 188, 129, 6, 0, 253, 130, 6, 0, 60, 132, 6, 0, 125, 133, 6, 0, 188, 134, 6, 0, 253, 135, 6, 0, 60, 137, 6, 0, 125, 138, 6, 0, 188, 139, 6, 0, 253, 140, 6, 0, 60, 142, 6, 0, 125, 143, 6, 0, 188, 144, 6, 0, 253, 145, 6, 0, 60, 147, 6, 0, 125, 148, 6, 0, 188, 149, 6, 0, 253, 150, 6, 0, 60, 152, 6, 0, 125, 153, 6, 0, 188, 154, 6, 0, 253, 155, 6, 0, 60, 157, 6, 0, 125, 158, 6, 0, 188, 159, 6, 0, 253, 160, 6, 0, 60, 162, 6, 0, 125, 163, 6, 0, 188, 164, 6, 0, 253, 165, 6, 0, 60, 167, 6, 0, 125, 168, 6, 0, 188, 169, 6, 0, 253, 170, 6, 0, 60, 172, 6, 0, 125, 173, 6, 0, 188, 174, 6, 0, 253, 175, 6, 0, 60, 177, 6, 0, 125, 178, 6, 0, 188, 179, 6, 0, 253, 180, 6, 0, 60, 182, 6, 0, 125, 183, 6, 0, 188, 184, 6, 0, 253, 185, 6, 0, 60, 187, 6, 0, 125, 188, 6, 0, 188, 189, 6, 0, 253, 190, 6, 0, 60, 192, 6, 0, 125, 193, 6, 0, 188, 194, 6, 0, 253, 195, 6, 0, 60, 197, 6, 0, 125, 198, 6, 0, 188, 199, 6, 0, 253, 200, 6, 0, 60, 202, 6, 0, 125, 203, 6, 0, 188, 204, 6, 0, 253, 205, 6, 0, 60, 207, 6, 0, 125, 208, 6, 0, 188, 209, 6, 0, 253, 210, 6, 0, 60, 212, 6, 0, 125, 213, 6, 0, 188, 214, 6, 0, 253, 215, 6, 0, 60, 217, 6, 0, 125, 218, 6, 0, 188, 219, 6, 0, 253, 220, 6, 0, 60, 222, 6, 0, 125, 223, 6, 0, 188, 224, 6, 0, 253, 225, 6, 0, 60, 227, 6, 0, 125, 228, 6, 0, 188, 229, 6, 0, 253, 230, 6, 0, 60, 232, 6, 0, 125, 233, 6, 0, 188, 234, 6, 0, 253, 235, 6, 0, 60, 237, 6, 0, 125, 238, 6, 0, 188, 239, 6, 0, 253, 240, 6, 0, 60, 242, 6, 0, 125, 243, 6, 0, 188, 244, 6, 0, 253, 245, 6, 0, 60, 247, 6, 0, 125, 248, 6, 0, 188, 249, 6, 0, 253, 250, 6, 0, 60, 252, 6, 0, 125, 253, 6, 0, 188, 254, 6, 0, 253, 255, 6, 0, 60, 1, 7, 0, 125, 2, 7, 0, 188, 3, 7, 0, 253, 4, 7, 0, 60, 6, 7, 0, 125, 7, 7, 0, 188, 8, 7, 0, 253, 9, 7, 0, 60, 11, 7, 0, 125, 12, 7, 0, 188, 13, 7, 0, 253, 14, 7, 0, 60, 16, 7, 0, 125, 17, 7, 0, 188, 18, 7, 0, 253, 19, 7, 0, 60, 21, 7, 0, 125, 22, 7, 0, 188, 23, 7, 0, 253, 24, 7, 0, 60, 26, 7, 0, 125, 27, 7, 0, 188, 28, 7, 0, 253, 29, 7, 0, 60, 31, 7, 0, 125, 32, 7, 0, 188, 33, 7, 0, 253, 34, 7, 0, 60, 36, 7, 0, 125, 37, 7, 0, 188, 38, 7, 0, 253, 39, 7, 0, 60, 41, 7, 0, 125, 42, 7, 0, 188, 43, 7, 0, 253, 44, 7, 0, 60, 46, 7, 0, 125, 47, 7, 0, 188, 48, 7, 0, 253, 49, 7, 0, 60, 51, 7, 0, 125, 52, 7, 0, 188, 53, 7, 0, 253, 54, 7, 0, 60, 56, 7, 0, 125, 57, 7, 0, 188, 58, 7, 0, 253, 59, 7, 0, 60, 61, 7, 0, 125, 62, 7, 0, 188, 63, 7, 0, 253, 64, 7, 0, 60, 66, 7, 0, 125, 67, 7, 0, 188, 68, 7, 0, 253, 69, 7, 0, 60, 71, 7, 0, 125, 72, 7, 0, 188, 73, 7, 0, 253, 74, 7, 0, 60, 76, 7, 0, 125, 77, 7, 0, 188, 78, 7, 0, 253, 79, 7, 0, 60, 81, 7, 0, 125, 82, 7, 0, 188, 83, 7, 0, 253, 84, 7, 0, 60, 86, 7, 0, 125, 87, 7, 0, 188, 88, 7, 0, 253, 89, 7, 0, 60, 91, 7, 0, 125, 92, 7, 0, 188, 93, 7, 0, 253, 94, 7, 0, 60, 96, 7, 0, 125, 97, 7, 0, 188, 98, 7, 0, 253, 99, 7, 0, 60, 101, 7, 0, 125, 102, 7, 0, 188, 103, 7, 0, 253, 104, 7, 0, 60, 106, 7, 0, 125, 107, 7, 0, 188, 108, 7, 0, 253, 109, 7, 0, 60, 111, 7, 0, 125, 112, 7, 0, 188, 113, 7, 0, 253, 114, 7, 0, 60, 116, 7, 0, 125, 117, 7, 0, 188, 118, 7, 0, 253, 119, 7, 0, 60, 121, 7, 0, 125, 122, 7, 0, 188, 123, 7, 0, 253, 124, 7, 0, 60, 126, 7, 0, 125, 127, 7, 0, 188, 128, 7, 0, 253, 129, 7, 0, 60, 131, 7, 0, 125, 132, 7, 0, 188, 133, 7, 0, 253, 134, 7, 0, 60, 136, 7, 0, 125, 137, 7, 0, 188, 138, 7, 0, 253, 139, 7, 0, 60, 141, 7, 0, 125, 142, 7, 0, 188, 143, 7, 0, 253, 144, 7, 0, 60, 146, 7, 0, 125, 147, 7, 0, 188, 148, 7, 0, 253, 149, 7, 0, 60, 151, 7, 0, 125, 152, 7, 0, 188, 153, 7, 0, 253, 154, 7, 0, 60, 156, 7, 0, 125, 157, 7, 0, 188, 158, 7, 0, 253, 159, 7, 0, 60, 161, 7, 0, 125, 162, 7, 0, 188, 163, 7, 0, 253, 164, 7, 0, 60, 166, 7, 0, 125, 167, 7, 0, 188, 168, 7, 0, 253, 169, 7, 0, 60, 171, 7, 0, 125, 172, 7, 0, 188, 173, 7, 0, 253, 174, 7, 0, 60, 176, 7, 0, 125, 177, 7, 0, 188, 178, 7, 0, 253, 179, 7, 0, 60, 181, 7, 0, 125, 182, 7, 0, 188, 183, 7, 0, 253, 184, 7, 0, 60, 186, 7, 0, 125, 187, 7, 0, 188, 188, 7, 0, 253, 189, 7, 0, 60, 191, 7, 0, 125, 192, 7, 0, 188, 193, 7, 0, 253, 194, 7, 0, 60, 196, 7, 0, 125, 197, 7, 0, 188, 198, 7, 0, 253, 199, 7, 0, 60, 201, 7, 0, 125, 202, 7, 0, 188, 203, 7, 0, 253, 204, 7, 0, 60, 206, 7, 0, 125, 207, 7, 0, 188, 208, 7, 0, 253, 209, 7, 0, 60, 211, 7, 0, 125, 212, 7, 0, 188, 213, 7, 0, 253, 214, 7, 0, 60, 216, 7, 0, 125, 217, 7, 0, 188, 218, 7, 0, 253, 219, 7, 0, 60, 221, 7, 0, 125, 222, 7, 0, 188, 223, 7, 0, 253, 224, 7, 0, 60, 226, 7, 0, 125, 227, 7, 0, 188, 228, 7, 0, 253, 229, 7, 0, 60, 231, 7, 0, 125, 232, 7, 0, 188, 233, 7, 0, 253, 234, 7, 0, 60, 236, 7, 0, 125, 237, 7, 0, 188, 238, 7, 0, 253, 239, 7, 0, 60, 241, 7, 0, 125, 242, 7, 0, 188, 243, 7, 0, 253, 244, 7, 0, 60, 246, 7, 0, 125, 247, 7, 0, 188, 248, 7, 0, 253, 249, 7, 0, 60, 251, 7, 0, 125, 252, 7, 0, 188, 253, 7, 0, 253, 254, 7, 0, 60, 0, 8, 0, 125, 1, 8, 0, 188, 2, 8, 0, 253, 3, 8, 0, 60, 5, 8, 0, 125, 6, 8, 0, 188, 7, 8, 0, 253, 8, 8, 0, 60, 10, 8, 0, 125, 11, 8, 0, 188, 12, 8, 0, 253, 13, 8, 0, 60, 15, 8, 0, 125, 16, 8, 0, 188, 17, 8, 0, 253, 18, 8, 0, 60, 20, 8, 0, 125, 21, 8, 0, 188, 22, 8, 0, 253, 23, 8, 0, 60, 25, 8, 0, 125, 26, 8, 0, 188, 27, 8, 0, 253, 28, 8, 0, 60, 30, 8, 0, 125, 31, 8, 0, 188, 32, 8, 0, 253, 33, 8, 0, 60, 35, 8, 0, 125, 36, 8, 0, 188, 37, 8, 0, 253, 38, 8, 0, 60, 40, 8, 0, 125, 41, 8, 0, 188, 42, 8, 0, 253, 43, 8, 0, 60, 45, 8, 0, 125, 46, 8, 0, 188, 47, 8, 0, 253, 48, 8, 0, 60, 50, 8, 0, 125, 51, 8, 0, 188, 52, 8, 0, 253, 53, 8, 0, 60, 55, 8, 0, 125, 56, 8, 0, 188, 57, 8, 0, 253, 58, 8, 0, 60, 60, 8, 0, 125, 61, 8, 0, 188, 62, 8, 0, 253, 63, 8, 0, 60, 65, 8, 0, 125, 66, 8, 0, 188, 67, 8, 0, 253, 68, 8, 0, 60, 70, 8, 0, 125, 71, 8, 0, 188, 72, 8, 0, 253, 73, 8, 0, 60, 75, 8, 0, 125, 76, 8, 0, 188, 77, 8, 0, 253, 78, 8, 0, 60, 80, 8, 0, 125, 81, 8, 0, 188, 82, 8, 0, 253, 83, 8, 0, 60, 85, 8, 0, 125, 86, 8, 0, 188, 87, 8, 0, 253, 88, 8, 0, 60, 90, 8, 0, 125, 91, 8, 0, 188, 92, 8, 0, 253, 93, 8, 0, 60, 95, 8, 0, 125, 96, 8, 0, 188, 97, 8, 0, 253, 98, 8, 0, 60, 100, 8, 0, 125, 101, 8, 0, 188, 102, 8, 0, 253, 103, 8, 0, 60, 105, 8, 0, 125, 106, 8, 0, 188, 107, 8, 0, 253, 108, 8, 0, 60, 110, 8, 0, 125, 111, 8, 0, 188, 112, 8, 0, 253, 113, 8, 0, 60, 115, 8, 0, 125, 116, 8, 0, 188, 117, 8, 0, 253, 118, 8, 0, 60, 120, 8, 0, 125, 121, 8, 0, 188, 122, 8, 0, 253, 123, 8, 0, 60, 125, 8, 0, 125, 126, 8, 0, 188, 127, 8, 0, 253, 128, 8, 0, 60, 130, 8, 0, 125, 131, 8, 0, 188, 132, 8, 0, 253, 133, 8, 0, 60, 135, 8, 0, 125, 136, 8, 0, 188, 137, 8, 0, 253, 138, 8, 0, 60, 140, 8, 0, 125, 141, 8, 0, 188, 142, 8, 0, 253, 143, 8, 0, 60, 145, 8, 0, 125, 146, 8, 0, 188, 147, 8, 0, 253, 148, 8, 0, 60, 150, 8, 0, 125, 151, 8, 0, 188, 152, 8, 0, 253, 153, 8, 0, 60, 155, 8, 0, 125, 156, 8, 0, 188, 157, 8, 0, 253, 158, 8, 0, 60, 160, 8, 0, 125, 161, 8, 0, 188, 162, 8, 0, 253, 163, 8, 0, 60, 165, 8, 0, 125, 166, 8, 0, 188, 167, 8, 0, 253, 168, 8, 0, 60, 170, 8, 0, 125, 171, 8, 0, 188, 172, 8, 0, 253, 173, 8, 0, 60, 175, 8, 0, 125, 176, 8, 0, 188, 177, 8, 0, 253, 178, 8, 0, 60, 180, 8, 0, 125, 181, 8, 0, 188, 182, 8, 0, 253, 183, 8, 0, 60, 185, 8, 0, 125, 186, 8, 0, 188, 187, 8, 0, 253, 188, 8, 0, 60, 190, 8, 0, 125, 191, 8, 0, 188, 192, 8, 0, 253, 193, 8, 0, 60, 195, 8, 0, 125, 196, 8, 0, 188, 197, 8, 0, 253, 198, 8, 0, 60, 200, 8, 0, 125, 201, 8, 0, 188, 202, 8, 0, 253, 203, 8, 0, 60, 205, 8, 0, 125, 206, 8, 0, 188, 207, 8, 0, 253, 208, 8, 0, 60, 210, 8, 0, 125, 211, 8, 0, 188, 212, 8, 0, 253, 213, 8, 0, 60, 215, 8, 0, 125, 216, 8, 0, 188, 217, 8, 0, 253, 218, 8, 0, 60, 220, 8, 0, 125, 221, 8, 0, 188, 222, 8, 0, 253, 223, 8, 0, 60, 225, 8, 0, 125, 226, 8, 0, 188, 227, 8, 0, 253, 228, 8, 0, 60, 230, 8, 0, 125, 231, 8, 0, 188, 232, 8, 0, 253, 233, 8, 0, 60, 235, 8, 0, 125, 236, 8, 0, 188, 237, 8, 0, 253, 238, 8, 0, 60, 240, 8, 0, 125, 241, 8, 0, 188, 242, 8, 0, 253, 243, 8, 0, 60, 245, 8, 0, 125, 246, 8, 0, 188, 247, 8, 0, 253, 248, 8, 0, 60, 250, 8, 0, 125, 251, 8, 0, 188, 252, 8, 0, 253, 253, 8, 0, 60, 255, 8, 0, 125, 0, 9, 0, 188, 1, 9, 0, 253, 2, 9, 0, 60, 4, 9, 0, 125, 5, 9, 0, 188, 6, 9, 0, 253, 7, 9, 0, 60, 9, 9, 0, 125, 10, 9, 0, 188, 11, 9, 0, 253, 12, 9, 0, 60, 14, 9, 0, 125, 15, 9, 0, 188, 16, 9, 0, 253, 17, 9, 0, 60, 19, 9, 0, 125, 20, 9, 0, 188, 21, 9, 0, 253, 22, 9, 0, 60, 24, 9, 0, 125, 25, 9, 0, 188, 26, 9, 0, 253, 27, 9, 0, 60, 29, 9, 0, 125, 30, 9, 0, 188, 31, 9, 0, 253, 32, 9, 0, 60, 34, 9, 0, 125, 35, 9, 0, 188, 36, 9, 0, 253, 37, 9, 0, 60, 39, 9, 0, 125, 40, 9, 0, 188, 41, 9, 0, 253, 42, 9, 0, 60, 44, 9, 0, 125, 45, 9, 0, 188, 46, 9, 0, 253, 47, 9, 0, 60, 49, 9, 0, 125, 50, 9, 0, 188, 51, 9, 0, 253, 52, 9, 0, 60, 54, 9, 0, 125, 55, 9, 0, 188, 56, 9, 0, 253, 57, 9, 0, 60, 59, 9, 0, 125, 60, 9, 0, 188, 61, 9, 0, 253, 62, 9, 0, 60, 64, 9, 0, 125, 65, 9, 0, 188, 66, 9, 0, 253, 67, 9, 0, 60, 69, 9, 0, 125, 70, 9, 0, 188, 71, 9, 0, 253, 72, 9, 0, 60, 74, 9, 0, 125, 75, 9, 0, 188, 76, 9, 0, 253, 77, 9, 0, 60, 79, 9, 0, 125, 80, 9, 0, 188, 81, 9, 0, 253, 82, 9, 0, 60, 84, 9, 0, 125, 85, 9, 0, 188, 86, 9, 0, 253, 87, 9, 0, 60, 89, 9, 0, 125, 90, 9, 0, 188, 91, 9, 0, 253, 92, 9, 0, 60, 94, 9, 0, 125, 95, 9, 0, 188, 96, 9, 0, 253, 97, 9, 0, 60, 99, 9, 0, 125, 100, 9, 0, 188, 101, 9, 0, 253, 102, 9, 0, 60, 104, 9, 0, 125, 105, 9, 0, 188, 106, 9, 0, 253, 107, 9, 0, 60, 109, 9, 0, 125, 110, 9, 0, 188, 111, 9, 0, 253, 112, 9, 0, 60, 114, 9, 0, 125, 115, 9, 0, 188, 116, 9, 0, 253, 117, 9, 0, 60, 119, 9, 0, 125, 120, 9, 0, 188, 121, 9, 0, 253, 122, 9, 0, 60, 124, 9, 0, 125, 125, 9, 0, 188, 126, 9, 0, 253, 127, 9, 0, 60, 129, 9, 0, 125, 130, 9, 0, 188, 131, 9, 0, 253, 132, 9, 0, 60, 134, 9, 0, 125, 135, 9, 0, 188, 136, 9, 0, 253, 137, 9, 0, 60, 139, 9, 0, 125, 140, 9, 0, 188, 141, 9, 0, 253, 142, 9, 0, 60, 144, 9, 0, 125, 145, 9, 0, 188, 146, 9, 0, 253, 147, 9, 0, 60, 149, 9, 0, 125, 150, 9, 0, 188, 151, 9, 0, 253, 152, 9, 0, 60, 154, 9, 0, 125, 155, 9, 0, 188, 156, 9, 0, 253, 157, 9, 0, 60, 159, 9, 0, 125, 160, 9, 0, 188, 161, 9, 0, 253, 162, 9, 0, 60, 164, 9, 0, 125, 165, 9, 0, 188, 166, 9, 0, 253, 167, 9, 0, 60, 169, 9, 0, 125, 170, 9, 0, 188, 171, 9, 0, 253, 172, 9, 0, 60, 174, 9, 0, 125, 175, 9, 0, 188, 176, 9, 0, 253, 177, 9, 0, 60, 179, 9, 0, 125, 180, 9, 0, 188, 181, 9, 0, 253, 182, 9, 0, 60, 184, 9, 0, 125, 185, 9, 0, 188, 186, 9, 0, 253, 187, 9, 0, 60, 189, 9, 0, 125, 190, 9, 0, 188, 191, 9, 0, 253, 192, 9, 0, 60, 194, 9, 0, 125, 195, 9, 0, 188, 196, 9, 0, 253, 197, 9, 0, 60, 199, 9, 0, 125, 200, 9, 0, 188, 201, 9, 0, 253, 202, 9, 0, 60, 204, 9, 0, 125, 205, 9, 0, 188, 206, 9, 0, 253, 207, 9, 0, 60, 209, 9, 0, 125, 210, 9, 0, 188, 211, 9, 0, 253, 212, 9, 0, 60, 214, 9, 0, 125, 215, 9, 0, 188, 216, 9, 0, 253, 217, 9, 0, 60, 219, 9, 0, 125, 220, 9, 0, 188, 221, 9, 0, 253, 222, 9, 0, 60, 224, 9, 0, 125, 225, 9, 0, 188, 226, 9, 0, 253, 227, 9, 0, 60, 229, 9, 0, 125, 230, 9, 0, 188, 231, 9, 0, 253, 232, 9, 0, 60, 234, 9, 0, 125, 235, 9, 0, 188, 236, 9, 0, 253, 237, 9, 0, 60, 239, 9, 0, 125, 240, 9, 0, 188, 241, 9, 0, 253, 242, 9, 0, 60, 244, 9, 0, 125, 245, 9, 0, 188, 246, 9, 0, 253, 247, 9, 0, 60, 249, 9, 0, 125, 250, 9, 0, 188, 251, 9, 0, 253, 252, 9, 0, 60, 254, 9, 0, 125, 255, 9, 0, 188, 0, 10, 0, 253, 1, 10, 0, 60, 3, 10, 0, 125, 4, 10, 0, 188, 5, 10, 0, 253, 6, 10, 0, 60, 8, 10, 0, 125, 9, 10, 0, 188, 10, 10, 0, 253, 11, 10, 0, 60, 13, 10, 0, 125, 14, 10, 0, 188, 15, 10, 0, 253, 16, 10, 0, 60, 18, 10, 0, 125, 19, 10, 0, 188, 20, 10, 0, 253, 21, 10, 0, 60, 23, 10, 0, 125, 24, 10, 0, 188, 25, 10, 0, 253, 26, 10, 0, 60, 28, 10, 0, 125, 29, 10, 0, 188, 30, 10, 0, 253, 31, 10, 0, 60, 33, 10, 0, 125, 34, 10, 0, 188, 35, 10, 0, 253, 36, 10, 0, 60, 38, 10, 0, 125, 39, 10, 0, 188, 40, 10, 0, 253, 41, 10, 0, 60, 43, 10, 0, 125, 44, 10, 0, 188, 45, 10, 0, 253, 46, 10, 0, 60, 48, 10, 0, 125, 49, 10, 0, 188, 50, 10, 0, 253, 51, 10, 0, 60, 53, 10, 0, 125, 54, 10, 0, 188, 55, 10, 0, 253, 56, 10, 0, 60, 58, 10, 0, 125, 59, 10, 0, 188, 60, 10, 0, 253, 61, 10, 0, 60, 63, 10, 0, 125, 64, 10, 0, 188, 65, 10, 0, 253, 66, 10, 0, 60, 68, 10, 0, 125, 69, 10, 0, 188, 70, 10, 0, 253, 71, 10, 0, 60, 73, 10, 0, 125, 74, 10, 0, 188, 75, 10, 0, 253, 76, 10, 0, 60, 78, 10, 0, 125, 79, 10, 0, 188, 80, 10, 0, 253, 81, 10, 0, 60, 83, 10, 0, 125, 84, 10, 0, 188, 85, 10, 0, 253, 86, 10, 0, 60, 88, 10, 0, 125, 89, 10, 0, 188, 90, 10, 0, 253, 91, 10, 0, 60, 93, 10, 0, 125, 94, 10, 0, 188, 95, 10, 0, 253, 96, 10, 0, 60, 98, 10, 0, 125, 99, 10, 0, 188, 100, 10, 0, 253, 101, 10, 0, 60, 103, 10, 0, 125, 104, 10, 0, 188, 105, 10, 0, 253, 106, 10, 0, 60, 108, 10, 0, 125, 109, 10, 0, 188, 110, 10, 0, 253, 111, 10, 0, 60, 113, 10, 0, 125, 114, 10, 0, 188, 115, 10, 0, 253, 116, 10, 0, 60, 118, 10, 0, 125, 119, 10, 0, 188, 120, 10, 0, 253, 121, 10, 0, 60, 123, 10, 0, 125, 124, 10, 0, 188, 125, 10, 0, 253, 126, 10, 0, 60, 128, 10, 0, 125, 129, 10, 0, 188, 130, 10, 0, 253, 131, 10, 0, 60, 133, 10, 0, 125, 134, 10, 0, 188, 135, 10, 0, 253, 136, 10, 0, 60, 138, 10, 0, 125, 139, 10, 0, 188, 140, 10, 0, 253, 141, 10, 0, 60, 143, 10, 0, 125, 144, 10, 0, 188, 145, 10, 0, 253, 146, 10, 0, 60, 148, 10, 0, 125, 149, 10, 0, 188, 150, 10, 0, 253, 151, 10, 0, 60, 153, 10, 0, 125, 154, 10, 0, 188, 155, 10, 0, 253, 156, 10, 0, 60, 158, 10, 0, 125, 159, 10, 0, 188, 160, 10, 0, 253, 161, 10, 0, 60, 163, 10, 0, 125, 164, 10, 0, 188, 165, 10, 0, 253, 166, 10, 0, 60, 168, 10, 0, 125, 169, 10, 0, 188, 170, 10, 0, 253, 171, 10, 0, 60, 173, 10, 0, 125, 174, 10, 0, 188, 175, 10, 0, 253, 176, 10, 0, 60, 178, 10, 0, 125, 179, 10, 0, 188, 180, 10, 0, 253, 181, 10, 0, 60, 183, 10, 0, 125, 184, 10, 0, 188, 185, 10, 0, 253, 186, 10, 0, 60, 188, 10, 0, 125, 189, 10, 0, 188, 190, 10, 0, 253, 191, 10, 0, 60, 193, 10, 0, 125, 194, 10, 0, 188, 195, 10, 0, 253, 196, 10, 0, 60, 198, 10, 0, 125, 199, 10, 0, 188, 200, 10, 0, 253, 201, 10, 0, 60, 203, 10, 0, 125, 204, 10, 0, 188, 205, 10, 0, 253, 206, 10, 0, 60, 208, 10, 0, 125, 209, 10, 0, 188, 210, 10, 0, 253, 211, 10, 0, 60, 213, 10, 0, 125, 214, 10, 0, 188, 215, 10, 0, 253, 216, 10, 0, 60, 218, 10, 0, 125, 219, 10, 0, 188, 220, 10, 0, 253, 221, 10, 0, 60, 223, 10, 0, 125, 224, 10, 0, 188, 225, 10, 0, 253, 226, 10, 0, 60, 228, 10, 0, 125, 229, 10, 0, 188, 230, 10, 0, 253, 231, 10, 0, 60, 233, 10, 0, 125, 234, 10, 0, 188, 235, 10, 0, 253, 236, 10, 0, 60, 238, 10, 0, 125, 239, 10, 0, 188, 240, 10, 0, 253, 241, 10, 0, 60, 243, 10, 0, 125, 244, 10, 0, 188, 245, 10, 0, 253, 246, 10, 0, 60, 248, 10, 0, 125, 249, 10, 0, 188, 250, 10, 0, 253, 251, 10, 0, 60, 253, 10, 0, 125, 254, 10, 0, 188, 255, 10, 0, 253, 0, 11, 0, 60, 2, 11, 0, 125, 3, 11, 0, 188, 4, 11, 0, 253, 5, 11, 0, 60, 7, 11, 0, 125, 8, 11, 0, 188, 9, 11, 0, 253, 10, 11, 0, 60, 12, 11, 0, 125, 13, 11, 0, 188, 14, 11, 0, 253, 15, 11, 0, 60, 17, 11, 0, 125, 18, 11, 0, 188, 19, 11, 0, 253, 20, 11, 0, 60, 22, 11, 0, 125, 23, 11, 0, 188, 24, 11, 0, 253, 25, 11, 0, 60, 27, 11, 0, 125, 28, 11, 0, 188, 29, 11, 0, 253, 30, 11, 0, 60, 32, 11, 0, 125, 33, 11, 0, 188, 34, 11, 0, 253, 35, 11, 0, 60, 37, 11, 0, 125, 38, 11, 0, 188, 39, 11, 0, 253, 40, 11, 0, 60, 42, 11, 0, 125, 43, 11, 0, 188, 44, 11, 0, 253, 45, 11, 0, 60, 47, 11, 0, 125, 48, 11, 0, 188, 49, 11, 0, 253, 50, 11, 0, 60, 52, 11, 0, 125, 53, 11, 0, 188, 54, 11, 0, 253, 55, 11, 0, 60, 57, 11, 0, 125, 58, 11, 0, 188, 59, 11, 0, 253, 60, 11, 0, 60, 62, 11, 0, 125, 63, 11, 0, 188, 64, 11, 0, 253, 65, 11, 0, 60, 67, 11, 0, 125, 68, 11, 0, 188, 69, 11, 0, 253, 70, 11, 0, 60, 72, 11, 0, 125, 73, 11, 0, 188, 74, 11, 0, 253, 75, 11, 0, 60, 77, 11, 0, 125, 78, 11, 0, 188, 79, 11, 0, 253, 80, 11, 0, 60, 82, 11, 0, 125, 83, 11, 0, 188, 84, 11, 0, 253, 85, 11, 0, 60, 87, 11, 0, 125, 88, 11, 0, 188, 89, 11, 0, 253, 90, 11, 0, 60, 92, 11, 0, 125, 93, 11, 0, 188, 94, 11, 0, 253, 95, 11, 0, 60, 97, 11, 0, 125, 98, 11, 0, 188, 99, 11, 0, 253, 100, 11, 0, 60, 102, 11, 0, 125, 103, 11, 0, 188, 104, 11, 0, 253, 105, 11, 0, 60, 107, 11, 0, 125, 108, 11, 0, 188, 109, 11, 0, 253, 110, 11, 0, 60, 112, 11, 0, 125, 113, 11, 0, 188, 114, 11, 0, 253, 115, 11, 0, 60, 117, 11, 0, 125, 118, 11, 0, 188, 119, 11, 0, 253, 120, 11, 0, 60, 122, 11, 0, 125, 123, 11, 0, 188, 124, 11, 0, 253, 125, 11, 0, 60, 127, 11, 0, 125, 128, 11, 0, 188, 129, 11, 0, 253, 130, 11, 0, 60, 132, 11, 0, 125, 133, 11, 0, 188, 134, 11, 0, 253, 135, 11, 0, 60, 137, 11, 0, 125, 138, 11, 0, 188, 139, 11, 0, 253, 140, 11, 0, 60, 142, 11, 0, 125, 143, 11, 0, 188, 144, 11, 0, 253, 145, 11, 0, 60, 147, 11, 0, 125, 148, 11, 0, 188, 149, 11, 0, 253, 150, 11, 0, 60, 152, 11, 0, 125, 153, 11, 0, 188, 154, 11, 0, 253, 155, 11, 0, 60, 157, 11, 0, 125, 158, 11, 0, 188, 159, 11, 0, 253, 160, 11, 0, 60, 162, 11, 0, 125, 163, 11, 0, 188, 164, 11, 0, 253, 165, 11, 0, 60, 167, 11, 0, 125, 168, 11, 0, 188, 169, 11, 0, 253, 170, 11, 0, 60, 172, 11, 0, 125, 173, 11, 0, 188, 174, 11, 0, 253, 175, 11, 0, 60, 177, 11, 0, 125, 178, 11, 0, 188, 179, 11, 0, 253, 180, 11, 0, 60, 182, 11, 0, 125, 183, 11, 0, 188, 184, 11, 0, 253, 185, 11, 0, 60, 187, 11, 0, 125, 188, 11, 0, 188, 189, 11, 0, 253, 190, 11, 0, 60, 192, 11, 0, 125, 193, 11, 0, 188, 194, 11, 0, 253, 195, 11, 0, 60, 197, 11, 0, 125, 198, 11, 0, 188, 199, 11, 0, 253, 200, 11, 0, 60, 202, 11, 0, 125, 203, 11, 0, 188, 204, 11, 0, 253, 205, 11, 0, 60, 207, 11, 0, 125, 208, 11, 0, 188, 209, 11, 0, 253, 210, 11, 0, 60, 212, 11, 0, 125, 213, 11, 0, 188, 214, 11, 0, 253, 215, 11, 0, 60, 217, 11, 0, 125, 218, 11, 0, 188, 219, 11, 0, 253, 220, 11, 0, 60, 222, 11, 0, 125, 223, 11, 0, 188, 224, 11, 0, 253, 225, 11, 0, 60, 227, 11, 0, 125, 228, 11, 0, 188, 229, 11, 0, 253, 230, 11, 0, 60, 232, 11, 0, 125, 233, 11, 0, 188, 234, 11, 0, 253, 235, 11, 0, 60, 237, 11, 0, 125, 238, 11, 0, 188, 239, 11, 0, 253, 240, 11, 0, 60, 242, 11, 0, 125, 243, 11, 0, 188, 244, 11, 0, 253, 245, 11, 0, 60, 247, 11, 0, 125, 248, 11, 0, 188, 249, 11, 0, 253, 250, 11, 0, 60, 252, 11, 0, 125, 253, 11, 0, 188, 254, 11, 0, 253, 255, 11, 0, 60, 1, 12, 0, 125, 2, 12, 0, 188, 3, 12, 0, 253, 4, 12, 0, 60, 6, 12, 0, 125, 7, 12, 0, 188, 8, 12, 0, 253, 9, 12, 0, 60, 11, 12, 0, 125, 12, 12, 0, 188, 13, 12, 0, 253, 14, 12, 0, 60, 16, 12, 0, 125, 17, 12, 0, 188, 18, 12, 0, 253, 19, 12, 0, 60, 21, 12, 0, 125, 22, 12, 0, 188, 23, 12, 0, 253, 24, 12, 0, 60, 26, 12, 0, 125, 27, 12, 0, 188, 28, 12, 0, 253, 29, 12, 0, 60, 31, 12, 0, 125, 32, 12, 0, 188, 33, 12, 0, 253, 34, 12, 0, 60, 36, 12, 0, 125, 37, 12, 0, 188, 38, 12, 0, 253, 39, 12, 0, 60, 41, 12, 0, 125, 42, 12, 0, 188, 43, 12, 0, 253, 44, 12, 0, 60, 46, 12, 0, 125, 47, 12, 0, 188, 48, 12, 0, 253, 49, 12, 0, 60, 51, 12, 0, 125, 52, 12, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_rising_edges.json b/tests/recordings/logic_analyzer/test_capture_rising_edges.json deleted file mode 100644 index 3e14b3d2..00000000 --- a/tests/recordings/logic_analyzer/test_capture_rising_edges.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [5], [196, 9], [0], [49], [16], [10], [9], [196, 9], [0], [10], [9], [196, 9], [1]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [81, 0, 0, 0, 146, 1, 0, 0, 209, 2, 0, 0, 18, 4, 0, 0, 81, 5, 0, 0, 146, 6, 0, 0, 209, 7, 0, 0, 18, 9, 0, 0, 81, 10, 0, 0, 146, 11, 0, 0, 209, 12, 0, 0, 18, 14, 0, 0, 81, 15, 0, 0, 146, 16, 0, 0, 209, 17, 0, 0, 18, 19, 0, 0, 81, 20, 0, 0, 146, 21, 0, 0, 209, 22, 0, 0, 18, 24, 0, 0, 81, 25, 0, 0, 146, 26, 0, 0, 209, 27, 0, 0, 18, 29, 0, 0, 81, 30, 0, 0, 146, 31, 0, 0, 209, 32, 0, 0, 18, 34, 0, 0, 81, 35, 0, 0, 146, 36, 0, 0, 209, 37, 0, 0, 18, 39, 0, 0, 81, 40, 0, 0, 146, 41, 0, 0, 209, 42, 0, 0, 18, 44, 0, 0, 81, 45, 0, 0, 146, 46, 0, 0, 209, 47, 0, 0, 18, 49, 0, 0, 81, 50, 0, 0, 146, 51, 0, 0, 209, 52, 0, 0, 18, 54, 0, 0, 81, 55, 0, 0, 146, 56, 0, 0, 209, 57, 0, 0, 18, 59, 0, 0, 81, 60, 0, 0, 146, 61, 0, 0, 209, 62, 0, 0, 18, 64, 0, 0, 81, 65, 0, 0, 146, 66, 0, 0, 209, 67, 0, 0, 18, 69, 0, 0, 81, 70, 0, 0, 146, 71, 0, 0, 209, 72, 0, 0, 18, 74, 0, 0, 81, 75, 0, 0, 146, 76, 0, 0, 209, 77, 0, 0, 18, 79, 0, 0, 81, 80, 0, 0, 146, 81, 0, 0, 209, 82, 0, 0, 18, 84, 0, 0, 81, 85, 0, 0, 146, 86, 0, 0, 209, 87, 0, 0, 18, 89, 0, 0, 81, 90, 0, 0, 146, 91, 0, 0, 209, 92, 0, 0, 18, 94, 0, 0, 81, 95, 0, 0, 146, 96, 0, 0, 209, 97, 0, 0, 18, 99, 0, 0, 81, 100, 0, 0, 146, 101, 0, 0, 209, 102, 0, 0, 18, 104, 0, 0, 81, 105, 0, 0, 146, 106, 0, 0, 209, 107, 0, 0, 18, 109, 0, 0, 81, 110, 0, 0, 146, 111, 0, 0, 209, 112, 0, 0, 18, 114, 0, 0, 81, 115, 0, 0, 146, 116, 0, 0, 209, 117, 0, 0, 18, 119, 0, 0, 81, 120, 0, 0, 146, 121, 0, 0, 209, 122, 0, 0, 18, 124, 0, 0, 81, 125, 0, 0, 146, 126, 0, 0, 209, 127, 0, 0, 18, 129, 0, 0, 81, 130, 0, 0, 146, 131, 0, 0, 209, 132, 0, 0, 18, 134, 0, 0, 81, 135, 0, 0, 146, 136, 0, 0, 209, 137, 0, 0, 18, 139, 0, 0, 81, 140, 0, 0, 146, 141, 0, 0, 209, 142, 0, 0, 18, 144, 0, 0, 81, 145, 0, 0, 146, 146, 0, 0, 209, 147, 0, 0, 18, 149, 0, 0, 81, 150, 0, 0, 146, 151, 0, 0, 209, 152, 0, 0, 18, 154, 0, 0, 81, 155, 0, 0, 146, 156, 0, 0, 209, 157, 0, 0, 18, 159, 0, 0, 81, 160, 0, 0, 146, 161, 0, 0, 209, 162, 0, 0, 18, 164, 0, 0, 81, 165, 0, 0, 146, 166, 0, 0, 209, 167, 0, 0, 18, 169, 0, 0, 81, 170, 0, 0, 146, 171, 0, 0, 209, 172, 0, 0, 18, 174, 0, 0, 81, 175, 0, 0, 146, 176, 0, 0, 209, 177, 0, 0, 18, 179, 0, 0, 81, 180, 0, 0, 146, 181, 0, 0, 209, 182, 0, 0, 18, 184, 0, 0, 81, 185, 0, 0, 146, 186, 0, 0, 209, 187, 0, 0, 18, 189, 0, 0, 81, 190, 0, 0, 146, 191, 0, 0, 209, 192, 0, 0, 18, 194, 0, 0, 81, 195, 0, 0, 146, 196, 0, 0, 209, 197, 0, 0, 18, 199, 0, 0, 81, 200, 0, 0, 146, 201, 0, 0, 209, 202, 0, 0, 18, 204, 0, 0, 81, 205, 0, 0, 146, 206, 0, 0, 209, 207, 0, 0, 18, 209, 0, 0, 81, 210, 0, 0, 146, 211, 0, 0, 209, 212, 0, 0, 18, 214, 0, 0, 81, 215, 0, 0, 146, 216, 0, 0, 209, 217, 0, 0, 18, 219, 0, 0, 81, 220, 0, 0, 146, 221, 0, 0, 209, 222, 0, 0, 18, 224, 0, 0, 81, 225, 0, 0, 146, 226, 0, 0, 209, 227, 0, 0, 18, 229, 0, 0, 81, 230, 0, 0, 146, 231, 0, 0, 209, 232, 0, 0, 18, 234, 0, 0, 81, 235, 0, 0, 146, 236, 0, 0, 209, 237, 0, 0, 18, 239, 0, 0, 81, 240, 0, 0, 146, 241, 0, 0, 209, 242, 0, 0, 18, 244, 0, 0, 81, 245, 0, 0, 146, 246, 0, 0, 209, 247, 0, 0, 18, 249, 0, 0, 81, 250, 0, 0, 146, 251, 0, 0, 209, 252, 0, 0, 18, 254, 0, 0, 81, 255, 0, 0, 146, 0, 1, 0, 209, 1, 1, 0, 18, 3, 1, 0, 81, 4, 1, 0, 146, 5, 1, 0, 209, 6, 1, 0, 18, 8, 1, 0, 81, 9, 1, 0, 146, 10, 1, 0, 209, 11, 1, 0, 18, 13, 1, 0, 81, 14, 1, 0, 146, 15, 1, 0, 209, 16, 1, 0, 18, 18, 1, 0, 81, 19, 1, 0, 146, 20, 1, 0, 209, 21, 1, 0, 18, 23, 1, 0, 81, 24, 1, 0, 146, 25, 1, 0, 209, 26, 1, 0, 18, 28, 1, 0, 81, 29, 1, 0, 146, 30, 1, 0, 209, 31, 1, 0, 18, 33, 1, 0, 81, 34, 1, 0, 146, 35, 1, 0, 209, 36, 1, 0, 18, 38, 1, 0, 81, 39, 1, 0, 146, 40, 1, 0, 209, 41, 1, 0, 18, 43, 1, 0, 81, 44, 1, 0, 146, 45, 1, 0, 209, 46, 1, 0, 18, 48, 1, 0, 81, 49, 1, 0, 146, 50, 1, 0, 209, 51, 1, 0, 18, 53, 1, 0, 81, 54, 1, 0, 146, 55, 1, 0, 209, 56, 1, 0, 18, 58, 1, 0, 81, 59, 1, 0, 146, 60, 1, 0, 209, 61, 1, 0, 18, 63, 1, 0, 81, 64, 1, 0, 146, 65, 1, 0, 209, 66, 1, 0, 18, 68, 1, 0, 81, 69, 1, 0, 146, 70, 1, 0, 209, 71, 1, 0, 18, 73, 1, 0, 81, 74, 1, 0, 146, 75, 1, 0, 209, 76, 1, 0, 18, 78, 1, 0, 81, 79, 1, 0, 146, 80, 1, 0, 209, 81, 1, 0, 18, 83, 1, 0, 81, 84, 1, 0, 146, 85, 1, 0, 209, 86, 1, 0, 18, 88, 1, 0, 81, 89, 1, 0, 146, 90, 1, 0, 209, 91, 1, 0, 18, 93, 1, 0, 81, 94, 1, 0, 146, 95, 1, 0, 209, 96, 1, 0, 18, 98, 1, 0, 81, 99, 1, 0, 146, 100, 1, 0, 209, 101, 1, 0, 18, 103, 1, 0, 81, 104, 1, 0, 146, 105, 1, 0, 209, 106, 1, 0, 18, 108, 1, 0, 81, 109, 1, 0, 146, 110, 1, 0, 209, 111, 1, 0, 18, 113, 1, 0, 81, 114, 1, 0, 146, 115, 1, 0, 209, 116, 1, 0, 18, 118, 1, 0, 81, 119, 1, 0, 146, 120, 1, 0, 209, 121, 1, 0, 18, 123, 1, 0, 81, 124, 1, 0, 146, 125, 1, 0, 209, 126, 1, 0, 18, 128, 1, 0, 81, 129, 1, 0, 146, 130, 1, 0, 209, 131, 1, 0, 18, 133, 1, 0, 81, 134, 1, 0, 146, 135, 1, 0, 209, 136, 1, 0, 18, 138, 1, 0, 81, 139, 1, 0, 146, 140, 1, 0, 209, 141, 1, 0, 18, 143, 1, 0, 81, 144, 1, 0, 146, 145, 1, 0, 209, 146, 1, 0, 18, 148, 1, 0, 81, 149, 1, 0, 146, 150, 1, 0, 209, 151, 1, 0, 18, 153, 1, 0, 81, 154, 1, 0, 146, 155, 1, 0, 209, 156, 1, 0, 18, 158, 1, 0, 81, 159, 1, 0, 146, 160, 1, 0, 209, 161, 1, 0, 18, 163, 1, 0, 81, 164, 1, 0, 146, 165, 1, 0, 209, 166, 1, 0, 18, 168, 1, 0, 81, 169, 1, 0, 146, 170, 1, 0, 209, 171, 1, 0, 18, 173, 1, 0, 81, 174, 1, 0, 146, 175, 1, 0, 209, 176, 1, 0, 18, 178, 1, 0, 81, 179, 1, 0, 146, 180, 1, 0, 209, 181, 1, 0, 18, 183, 1, 0, 81, 184, 1, 0, 146, 185, 1, 0, 209, 186, 1, 0, 18, 188, 1, 0, 81, 189, 1, 0, 146, 190, 1, 0, 209, 191, 1, 0, 18, 193, 1, 0, 81, 194, 1, 0, 146, 195, 1, 0, 209, 196, 1, 0, 18, 198, 1, 0, 81, 199, 1, 0, 146, 200, 1, 0, 209, 201, 1, 0, 18, 203, 1, 0, 81, 204, 1, 0, 146, 205, 1, 0, 209, 206, 1, 0, 18, 208, 1, 0, 81, 209, 1, 0, 146, 210, 1, 0, 209, 211, 1, 0, 18, 213, 1, 0, 81, 214, 1, 0, 146, 215, 1, 0, 209, 216, 1, 0, 18, 218, 1, 0, 81, 219, 1, 0, 146, 220, 1, 0, 209, 221, 1, 0, 18, 223, 1, 0, 81, 224, 1, 0, 146, 225, 1, 0, 209, 226, 1, 0, 18, 228, 1, 0, 81, 229, 1, 0, 146, 230, 1, 0, 209, 231, 1, 0, 18, 233, 1, 0, 81, 234, 1, 0, 146, 235, 1, 0, 209, 236, 1, 0, 18, 238, 1, 0, 81, 239, 1, 0, 146, 240, 1, 0, 209, 241, 1, 0, 18, 243, 1, 0, 81, 244, 1, 0, 146, 245, 1, 0, 209, 246, 1, 0, 18, 248, 1, 0, 81, 249, 1, 0, 146, 250, 1, 0, 209, 251, 1, 0, 18, 253, 1, 0, 81, 254, 1, 0, 146, 255, 1, 0, 209, 0, 2, 0, 18, 2, 2, 0, 81, 3, 2, 0, 146, 4, 2, 0, 209, 5, 2, 0, 18, 7, 2, 0, 81, 8, 2, 0, 146, 9, 2, 0, 209, 10, 2, 0, 18, 12, 2, 0, 81, 13, 2, 0, 146, 14, 2, 0, 209, 15, 2, 0, 18, 17, 2, 0, 81, 18, 2, 0, 146, 19, 2, 0, 209, 20, 2, 0, 18, 22, 2, 0, 81, 23, 2, 0, 146, 24, 2, 0, 209, 25, 2, 0, 18, 27, 2, 0, 81, 28, 2, 0, 146, 29, 2, 0, 209, 30, 2, 0, 18, 32, 2, 0, 81, 33, 2, 0, 146, 34, 2, 0, 209, 35, 2, 0, 18, 37, 2, 0, 81, 38, 2, 0, 146, 39, 2, 0, 209, 40, 2, 0, 18, 42, 2, 0, 81, 43, 2, 0, 146, 44, 2, 0, 209, 45, 2, 0, 18, 47, 2, 0, 81, 48, 2, 0, 146, 49, 2, 0, 209, 50, 2, 0, 18, 52, 2, 0, 81, 53, 2, 0, 146, 54, 2, 0, 209, 55, 2, 0, 18, 57, 2, 0, 81, 58, 2, 0, 146, 59, 2, 0, 209, 60, 2, 0, 18, 62, 2, 0, 81, 63, 2, 0, 146, 64, 2, 0, 209, 65, 2, 0, 18, 67, 2, 0, 81, 68, 2, 0, 146, 69, 2, 0, 209, 70, 2, 0, 18, 72, 2, 0, 81, 73, 2, 0, 146, 74, 2, 0, 209, 75, 2, 0, 18, 77, 2, 0, 81, 78, 2, 0, 146, 79, 2, 0, 209, 80, 2, 0, 18, 82, 2, 0, 81, 83, 2, 0, 146, 84, 2, 0, 209, 85, 2, 0, 18, 87, 2, 0, 81, 88, 2, 0, 146, 89, 2, 0, 209, 90, 2, 0, 18, 92, 2, 0, 81, 93, 2, 0, 146, 94, 2, 0, 209, 95, 2, 0, 18, 97, 2, 0, 81, 98, 2, 0, 146, 99, 2, 0, 209, 100, 2, 0, 18, 102, 2, 0, 81, 103, 2, 0, 146, 104, 2, 0, 209, 105, 2, 0, 18, 107, 2, 0, 81, 108, 2, 0, 146, 109, 2, 0, 209, 110, 2, 0, 18, 112, 2, 0, 81, 113, 2, 0, 146, 114, 2, 0, 209, 115, 2, 0, 18, 117, 2, 0, 81, 118, 2, 0, 146, 119, 2, 0, 209, 120, 2, 0, 18, 122, 2, 0, 81, 123, 2, 0, 146, 124, 2, 0, 209, 125, 2, 0, 18, 127, 2, 0, 81, 128, 2, 0, 146, 129, 2, 0, 209, 130, 2, 0, 18, 132, 2, 0, 81, 133, 2, 0, 146, 134, 2, 0, 209, 135, 2, 0, 18, 137, 2, 0, 81, 138, 2, 0, 146, 139, 2, 0, 209, 140, 2, 0, 18, 142, 2, 0, 81, 143, 2, 0, 146, 144, 2, 0, 209, 145, 2, 0, 18, 147, 2, 0, 81, 148, 2, 0, 146, 149, 2, 0, 209, 150, 2, 0, 18, 152, 2, 0, 81, 153, 2, 0, 146, 154, 2, 0, 209, 155, 2, 0, 18, 157, 2, 0, 81, 158, 2, 0, 146, 159, 2, 0, 209, 160, 2, 0, 18, 162, 2, 0, 81, 163, 2, 0, 146, 164, 2, 0, 209, 165, 2, 0, 18, 167, 2, 0, 81, 168, 2, 0, 146, 169, 2, 0, 209, 170, 2, 0, 18, 172, 2, 0, 81, 173, 2, 0, 146, 174, 2, 0, 209, 175, 2, 0, 18, 177, 2, 0, 81, 178, 2, 0, 146, 179, 2, 0, 209, 180, 2, 0, 18, 182, 2, 0, 81, 183, 2, 0, 146, 184, 2, 0, 209, 185, 2, 0, 18, 187, 2, 0, 81, 188, 2, 0, 146, 189, 2, 0, 209, 190, 2, 0, 18, 192, 2, 0, 81, 193, 2, 0, 146, 194, 2, 0, 209, 195, 2, 0, 18, 197, 2, 0, 81, 198, 2, 0, 146, 199, 2, 0, 209, 200, 2, 0, 18, 202, 2, 0, 81, 203, 2, 0, 146, 204, 2, 0, 209, 205, 2, 0, 18, 207, 2, 0, 81, 208, 2, 0, 146, 209, 2, 0, 209, 210, 2, 0, 18, 212, 2, 0, 81, 213, 2, 0, 146, 214, 2, 0, 209, 215, 2, 0, 18, 217, 2, 0, 81, 218, 2, 0, 146, 219, 2, 0, 209, 220, 2, 0, 18, 222, 2, 0, 81, 223, 2, 0, 146, 224, 2, 0, 209, 225, 2, 0, 18, 227, 2, 0, 81, 228, 2, 0, 146, 229, 2, 0, 209, 230, 2, 0, 18, 232, 2, 0, 81, 233, 2, 0, 146, 234, 2, 0, 209, 235, 2, 0, 18, 237, 2, 0, 81, 238, 2, 0, 146, 239, 2, 0, 209, 240, 2, 0, 18, 242, 2, 0, 81, 243, 2, 0, 146, 244, 2, 0, 209, 245, 2, 0, 18, 247, 2, 0, 81, 248, 2, 0, 146, 249, 2, 0, 209, 250, 2, 0, 18, 252, 2, 0, 81, 253, 2, 0, 146, 254, 2, 0, 209, 255, 2, 0, 18, 1, 3, 0, 81, 2, 3, 0, 146, 3, 3, 0, 209, 4, 3, 0, 18, 6, 3, 0, 81, 7, 3, 0, 146, 8, 3, 0, 209, 9, 3, 0, 18, 11, 3, 0, 81, 12, 3, 0, 146, 13, 3, 0, 209, 14, 3, 0, 18, 16, 3, 0, 81, 17, 3, 0, 146, 18, 3, 0, 209, 19, 3, 0, 18, 21, 3, 0, 81, 22, 3, 0, 146, 23, 3, 0, 209, 24, 3, 0, 18, 26, 3, 0, 81, 27, 3, 0, 146, 28, 3, 0, 209, 29, 3, 0, 18, 31, 3, 0, 81, 32, 3, 0, 146, 33, 3, 0, 209, 34, 3, 0, 18, 36, 3, 0, 81, 37, 3, 0, 146, 38, 3, 0, 209, 39, 3, 0, 18, 41, 3, 0, 81, 42, 3, 0, 146, 43, 3, 0, 209, 44, 3, 0, 18, 46, 3, 0, 81, 47, 3, 0, 146, 48, 3, 0, 209, 49, 3, 0, 18, 51, 3, 0, 81, 52, 3, 0, 146, 53, 3, 0, 209, 54, 3, 0, 18, 56, 3, 0, 81, 57, 3, 0, 146, 58, 3, 0, 209, 59, 3, 0, 18, 61, 3, 0, 81, 62, 3, 0, 146, 63, 3, 0, 209, 64, 3, 0, 18, 66, 3, 0, 81, 67, 3, 0, 146, 68, 3, 0, 209, 69, 3, 0, 18, 71, 3, 0, 81, 72, 3, 0, 146, 73, 3, 0, 209, 74, 3, 0, 18, 76, 3, 0, 81, 77, 3, 0, 146, 78, 3, 0, 209, 79, 3, 0, 18, 81, 3, 0, 81, 82, 3, 0, 146, 83, 3, 0, 209, 84, 3, 0, 18, 86, 3, 0, 81, 87, 3, 0, 146, 88, 3, 0, 209, 89, 3, 0, 18, 91, 3, 0, 81, 92, 3, 0, 146, 93, 3, 0, 209, 94, 3, 0, 18, 96, 3, 0, 81, 97, 3, 0, 146, 98, 3, 0, 209, 99, 3, 0, 18, 101, 3, 0, 81, 102, 3, 0, 146, 103, 3, 0, 209, 104, 3, 0, 18, 106, 3, 0, 81, 107, 3, 0, 146, 108, 3, 0, 209, 109, 3, 0, 18, 111, 3, 0, 81, 112, 3, 0, 146, 113, 3, 0, 209, 114, 3, 0, 18, 116, 3, 0, 81, 117, 3, 0, 146, 118, 3, 0, 209, 119, 3, 0, 18, 121, 3, 0, 81, 122, 3, 0, 146, 123, 3, 0, 209, 124, 3, 0, 18, 126, 3, 0, 81, 127, 3, 0, 146, 128, 3, 0, 209, 129, 3, 0, 18, 131, 3, 0, 81, 132, 3, 0, 146, 133, 3, 0, 209, 134, 3, 0, 18, 136, 3, 0, 81, 137, 3, 0, 146, 138, 3, 0, 209, 139, 3, 0, 18, 141, 3, 0, 81, 142, 3, 0, 146, 143, 3, 0, 209, 144, 3, 0, 18, 146, 3, 0, 81, 147, 3, 0, 146, 148, 3, 0, 209, 149, 3, 0, 18, 151, 3, 0, 81, 152, 3, 0, 146, 153, 3, 0, 209, 154, 3, 0, 18, 156, 3, 0, 81, 157, 3, 0, 146, 158, 3, 0, 209, 159, 3, 0, 18, 161, 3, 0, 81, 162, 3, 0, 146, 163, 3, 0, 209, 164, 3, 0, 18, 166, 3, 0, 81, 167, 3, 0, 146, 168, 3, 0, 209, 169, 3, 0, 18, 171, 3, 0, 81, 172, 3, 0, 146, 173, 3, 0, 209, 174, 3, 0, 18, 176, 3, 0, 81, 177, 3, 0, 146, 178, 3, 0, 209, 179, 3, 0, 18, 181, 3, 0, 81, 182, 3, 0, 146, 183, 3, 0, 209, 184, 3, 0, 18, 186, 3, 0, 81, 187, 3, 0, 146, 188, 3, 0, 209, 189, 3, 0, 18, 191, 3, 0, 81, 192, 3, 0, 146, 193, 3, 0, 209, 194, 3, 0, 18, 196, 3, 0, 81, 197, 3, 0, 146, 198, 3, 0, 209, 199, 3, 0, 18, 201, 3, 0, 81, 202, 3, 0, 146, 203, 3, 0, 209, 204, 3, 0, 18, 206, 3, 0, 81, 207, 3, 0, 146, 208, 3, 0, 209, 209, 3, 0, 18, 211, 3, 0, 81, 212, 3, 0, 146, 213, 3, 0, 209, 214, 3, 0, 18, 216, 3, 0, 81, 217, 3, 0, 146, 218, 3, 0, 209, 219, 3, 0, 18, 221, 3, 0, 81, 222, 3, 0, 146, 223, 3, 0, 209, 224, 3, 0, 18, 226, 3, 0, 81, 227, 3, 0, 146, 228, 3, 0, 209, 229, 3, 0, 18, 231, 3, 0, 81, 232, 3, 0, 146, 233, 3, 0, 209, 234, 3, 0, 18, 236, 3, 0, 81, 237, 3, 0, 146, 238, 3, 0, 209, 239, 3, 0, 18, 241, 3, 0, 81, 242, 3, 0, 146, 243, 3, 0, 209, 244, 3, 0, 18, 246, 3, 0, 81, 247, 3, 0, 146, 248, 3, 0, 209, 249, 3, 0, 18, 251, 3, 0, 81, 252, 3, 0, 146, 253, 3, 0, 209, 254, 3, 0, 18, 0, 4, 0, 81, 1, 4, 0, 146, 2, 4, 0, 209, 3, 4, 0, 18, 5, 4, 0, 81, 6, 4, 0, 146, 7, 4, 0, 209, 8, 4, 0, 18, 10, 4, 0, 81, 11, 4, 0, 146, 12, 4, 0, 209, 13, 4, 0, 18, 15, 4, 0, 81, 16, 4, 0, 146, 17, 4, 0, 209, 18, 4, 0, 18, 20, 4, 0, 81, 21, 4, 0, 146, 22, 4, 0, 209, 23, 4, 0, 18, 25, 4, 0, 81, 26, 4, 0, 146, 27, 4, 0, 209, 28, 4, 0, 18, 30, 4, 0, 81, 31, 4, 0, 146, 32, 4, 0, 209, 33, 4, 0, 18, 35, 4, 0, 81, 36, 4, 0, 146, 37, 4, 0, 209, 38, 4, 0, 18, 40, 4, 0, 81, 41, 4, 0, 146, 42, 4, 0, 209, 43, 4, 0, 18, 45, 4, 0, 81, 46, 4, 0, 146, 47, 4, 0, 209, 48, 4, 0, 18, 50, 4, 0, 81, 51, 4, 0, 146, 52, 4, 0, 209, 53, 4, 0, 18, 55, 4, 0, 81, 56, 4, 0, 146, 57, 4, 0, 209, 58, 4, 0, 18, 60, 4, 0, 81, 61, 4, 0, 146, 62, 4, 0, 209, 63, 4, 0, 18, 65, 4, 0, 81, 66, 4, 0, 146, 67, 4, 0, 209, 68, 4, 0, 18, 70, 4, 0, 81, 71, 4, 0, 146, 72, 4, 0, 209, 73, 4, 0, 18, 75, 4, 0, 81, 76, 4, 0, 146, 77, 4, 0, 209, 78, 4, 0, 18, 80, 4, 0, 81, 81, 4, 0, 146, 82, 4, 0, 209, 83, 4, 0, 18, 85, 4, 0, 81, 86, 4, 0, 146, 87, 4, 0, 209, 88, 4, 0, 18, 90, 4, 0, 81, 91, 4, 0, 146, 92, 4, 0, 209, 93, 4, 0, 18, 95, 4, 0, 81, 96, 4, 0, 146, 97, 4, 0, 209, 98, 4, 0, 18, 100, 4, 0, 81, 101, 4, 0, 146, 102, 4, 0, 209, 103, 4, 0, 18, 105, 4, 0, 81, 106, 4, 0, 146, 107, 4, 0, 209, 108, 4, 0, 18, 110, 4, 0, 81, 111, 4, 0, 146, 112, 4, 0, 209, 113, 4, 0, 18, 115, 4, 0, 81, 116, 4, 0, 146, 117, 4, 0, 209, 118, 4, 0, 18, 120, 4, 0, 81, 121, 4, 0, 146, 122, 4, 0, 209, 123, 4, 0, 18, 125, 4, 0, 81, 126, 4, 0, 146, 127, 4, 0, 209, 128, 4, 0, 18, 130, 4, 0, 81, 131, 4, 0, 146, 132, 4, 0, 209, 133, 4, 0, 18, 135, 4, 0, 81, 136, 4, 0, 146, 137, 4, 0, 209, 138, 4, 0, 18, 140, 4, 0, 81, 141, 4, 0, 146, 142, 4, 0, 209, 143, 4, 0, 18, 145, 4, 0, 81, 146, 4, 0, 146, 147, 4, 0, 209, 148, 4, 0, 18, 150, 4, 0, 81, 151, 4, 0, 146, 152, 4, 0, 209, 153, 4, 0, 18, 155, 4, 0, 81, 156, 4, 0, 146, 157, 4, 0, 209, 158, 4, 0, 18, 160, 4, 0, 81, 161, 4, 0, 146, 162, 4, 0, 209, 163, 4, 0, 18, 165, 4, 0, 81, 166, 4, 0, 146, 167, 4, 0, 209, 168, 4, 0, 18, 170, 4, 0, 81, 171, 4, 0, 146, 172, 4, 0, 209, 173, 4, 0, 18, 175, 4, 0, 81, 176, 4, 0, 146, 177, 4, 0, 209, 178, 4, 0, 18, 180, 4, 0, 81, 181, 4, 0, 146, 182, 4, 0, 209, 183, 4, 0, 18, 185, 4, 0, 81, 186, 4, 0, 146, 187, 4, 0, 209, 188, 4, 0, 18, 190, 4, 0, 81, 191, 4, 0, 146, 192, 4, 0, 209, 193, 4, 0, 18, 195, 4, 0, 81, 196, 4, 0, 146, 197, 4, 0, 209, 198, 4, 0, 18, 200, 4, 0, 81, 201, 4, 0, 146, 202, 4, 0, 209, 203, 4, 0, 18, 205, 4, 0, 81, 206, 4, 0, 146, 207, 4, 0, 209, 208, 4, 0, 18, 210, 4, 0, 81, 211, 4, 0, 146, 212, 4, 0, 209, 213, 4, 0, 18, 215, 4, 0, 81, 216, 4, 0, 146, 217, 4, 0, 209, 218, 4, 0, 18, 220, 4, 0, 81, 221, 4, 0, 146, 222, 4, 0, 209, 223, 4, 0, 18, 225, 4, 0, 81, 226, 4, 0, 146, 227, 4, 0, 209, 228, 4, 0, 18, 230, 4, 0, 81, 231, 4, 0, 146, 232, 4, 0, 209, 233, 4, 0, 18, 235, 4, 0, 81, 236, 4, 0, 146, 237, 4, 0, 209, 238, 4, 0, 18, 240, 4, 0, 81, 241, 4, 0, 146, 242, 4, 0, 209, 243, 4, 0, 18, 245, 4, 0, 81, 246, 4, 0, 146, 247, 4, 0, 209, 248, 4, 0, 18, 250, 4, 0, 81, 251, 4, 0, 146, 252, 4, 0, 209, 253, 4, 0, 18, 255, 4, 0, 81, 0, 5, 0, 146, 1, 5, 0, 209, 2, 5, 0, 18, 4, 5, 0, 81, 5, 5, 0, 146, 6, 5, 0, 209, 7, 5, 0, 18, 9, 5, 0, 81, 10, 5, 0, 146, 11, 5, 0, 209, 12, 5, 0, 18, 14, 5, 0, 81, 15, 5, 0, 146, 16, 5, 0, 209, 17, 5, 0, 18, 19, 5, 0, 81, 20, 5, 0, 146, 21, 5, 0, 209, 22, 5, 0, 18, 24, 5, 0, 81, 25, 5, 0, 146, 26, 5, 0, 209, 27, 5, 0, 18, 29, 5, 0, 81, 30, 5, 0, 146, 31, 5, 0, 209, 32, 5, 0, 18, 34, 5, 0, 81, 35, 5, 0, 146, 36, 5, 0, 209, 37, 5, 0, 18, 39, 5, 0, 81, 40, 5, 0, 146, 41, 5, 0, 209, 42, 5, 0, 18, 44, 5, 0, 81, 45, 5, 0, 146, 46, 5, 0, 209, 47, 5, 0, 18, 49, 5, 0, 81, 50, 5, 0, 146, 51, 5, 0, 209, 52, 5, 0, 18, 54, 5, 0, 81, 55, 5, 0, 146, 56, 5, 0, 209, 57, 5, 0, 18, 59, 5, 0, 81, 60, 5, 0, 146, 61, 5, 0, 209, 62, 5, 0, 18, 64, 5, 0, 81, 65, 5, 0, 146, 66, 5, 0, 209, 67, 5, 0, 18, 69, 5, 0, 81, 70, 5, 0, 146, 71, 5, 0, 209, 72, 5, 0, 18, 74, 5, 0, 81, 75, 5, 0, 146, 76, 5, 0, 209, 77, 5, 0, 18, 79, 5, 0, 81, 80, 5, 0, 146, 81, 5, 0, 209, 82, 5, 0, 18, 84, 5, 0, 81, 85, 5, 0, 146, 86, 5, 0, 209, 87, 5, 0, 18, 89, 5, 0, 81, 90, 5, 0, 146, 91, 5, 0, 209, 92, 5, 0, 18, 94, 5, 0, 81, 95, 5, 0, 146, 96, 5, 0, 209, 97, 5, 0, 18, 99, 5, 0, 81, 100, 5, 0, 146, 101, 5, 0, 209, 102, 5, 0, 18, 104, 5, 0, 81, 105, 5, 0, 146, 106, 5, 0, 209, 107, 5, 0, 18, 109, 5, 0, 81, 110, 5, 0, 146, 111, 5, 0, 209, 112, 5, 0, 18, 114, 5, 0, 81, 115, 5, 0, 146, 116, 5, 0, 209, 117, 5, 0, 18, 119, 5, 0, 81, 120, 5, 0, 146, 121, 5, 0, 209, 122, 5, 0, 18, 124, 5, 0, 81, 125, 5, 0, 146, 126, 5, 0, 209, 127, 5, 0, 18, 129, 5, 0, 81, 130, 5, 0, 146, 131, 5, 0, 209, 132, 5, 0, 18, 134, 5, 0, 81, 135, 5, 0, 146, 136, 5, 0, 209, 137, 5, 0, 18, 139, 5, 0, 81, 140, 5, 0, 146, 141, 5, 0, 209, 142, 5, 0, 18, 144, 5, 0, 81, 145, 5, 0, 146, 146, 5, 0, 209, 147, 5, 0, 18, 149, 5, 0, 81, 150, 5, 0, 146, 151, 5, 0, 209, 152, 5, 0, 18, 154, 5, 0, 81, 155, 5, 0, 146, 156, 5, 0, 209, 157, 5, 0, 18, 159, 5, 0, 81, 160, 5, 0, 146, 161, 5, 0, 209, 162, 5, 0, 18, 164, 5, 0, 81, 165, 5, 0, 146, 166, 5, 0, 209, 167, 5, 0, 18, 169, 5, 0, 81, 170, 5, 0, 146, 171, 5, 0, 209, 172, 5, 0, 18, 174, 5, 0, 81, 175, 5, 0, 146, 176, 5, 0, 209, 177, 5, 0, 18, 179, 5, 0, 81, 180, 5, 0, 146, 181, 5, 0, 209, 182, 5, 0, 18, 184, 5, 0, 81, 185, 5, 0, 146, 186, 5, 0, 209, 187, 5, 0, 18, 189, 5, 0, 81, 190, 5, 0, 146, 191, 5, 0, 209, 192, 5, 0, 18, 194, 5, 0, 81, 195, 5, 0, 146, 196, 5, 0, 209, 197, 5, 0, 18, 199, 5, 0, 81, 200, 5, 0, 146, 201, 5, 0, 209, 202, 5, 0, 18, 204, 5, 0, 81, 205, 5, 0, 146, 206, 5, 0, 209, 207, 5, 0, 18, 209, 5, 0, 81, 210, 5, 0, 146, 211, 5, 0, 209, 212, 5, 0, 18, 214, 5, 0, 81, 215, 5, 0, 146, 216, 5, 0, 209, 217, 5, 0, 18, 219, 5, 0, 81, 220, 5, 0, 146, 221, 5, 0, 209, 222, 5, 0, 18, 224, 5, 0, 81, 225, 5, 0, 146, 226, 5, 0, 209, 227, 5, 0, 18, 229, 5, 0, 81, 230, 5, 0, 146, 231, 5, 0, 209, 232, 5, 0, 18, 234, 5, 0, 81, 235, 5, 0, 146, 236, 5, 0, 209, 237, 5, 0, 18, 239, 5, 0, 81, 240, 5, 0, 146, 241, 5, 0, 209, 242, 5, 0, 18, 244, 5, 0, 81, 245, 5, 0, 146, 246, 5, 0, 209, 247, 5, 0, 18, 249, 5, 0, 81, 250, 5, 0, 146, 251, 5, 0, 209, 252, 5, 0, 18, 254, 5, 0, 81, 255, 5, 0, 146, 0, 6, 0, 209, 1, 6, 0, 18, 3, 6, 0, 81, 4, 6, 0, 146, 5, 6, 0, 209, 6, 6, 0, 18, 8, 6, 0, 81, 9, 6, 0, 146, 10, 6, 0, 209, 11, 6, 0, 18, 13, 6, 0, 81, 14, 6, 0, 146, 15, 6, 0, 209, 16, 6, 0, 18, 18, 6, 0, 81, 19, 6, 0, 146, 20, 6, 0, 209, 21, 6, 0, 18, 23, 6, 0, 81, 24, 6, 0, 146, 25, 6, 0, 209, 26, 6, 0, 18, 28, 6, 0, 81, 29, 6, 0, 146, 30, 6, 0, 209, 31, 6, 0, 18, 33, 6, 0, 81, 34, 6, 0, 146, 35, 6, 0, 209, 36, 6, 0, 18, 38, 6, 0, 81, 39, 6, 0, 146, 40, 6, 0, 209, 41, 6, 0, 18, 43, 6, 0, 81, 44, 6, 0, 146, 45, 6, 0, 209, 46, 6, 0, 18, 48, 6, 0, 81, 49, 6, 0, 146, 50, 6, 0, 209, 51, 6, 0, 18, 53, 6, 0, 81, 54, 6, 0, 146, 55, 6, 0, 209, 56, 6, 0, 18, 58, 6, 0, 81, 59, 6, 0, 146, 60, 6, 0, 209, 61, 6, 0, 18, 63, 6, 0, 81, 64, 6, 0, 146, 65, 6, 0, 209, 66, 6, 0, 18, 68, 6, 0, 81, 69, 6, 0, 146, 70, 6, 0, 209, 71, 6, 0, 18, 73, 6, 0, 81, 74, 6, 0, 146, 75, 6, 0, 209, 76, 6, 0, 18, 78, 6, 0, 81, 79, 6, 0, 146, 80, 6, 0, 209, 81, 6, 0, 18, 83, 6, 0, 81, 84, 6, 0, 146, 85, 6, 0, 209, 86, 6, 0, 18, 88, 6, 0, 81, 89, 6, 0, 146, 90, 6, 0, 209, 91, 6, 0, 18, 93, 6, 0, 81, 94, 6, 0, 146, 95, 6, 0, 209, 96, 6, 0, 18, 98, 6, 0, 81, 99, 6, 0, 146, 100, 6, 0, 209, 101, 6, 0, 18, 103, 6, 0, 81, 104, 6, 0, 146, 105, 6, 0, 209, 106, 6, 0, 18, 108, 6, 0, 81, 109, 6, 0, 146, 110, 6, 0, 209, 111, 6, 0, 18, 113, 6, 0, 81, 114, 6, 0, 146, 115, 6, 0, 209, 116, 6, 0, 18, 118, 6, 0, 81, 119, 6, 0, 146, 120, 6, 0, 209, 121, 6, 0, 18, 123, 6, 0, 81, 124, 6, 0, 146, 125, 6, 0, 209, 126, 6, 0, 18, 128, 6, 0, 81, 129, 6, 0, 146, 130, 6, 0, 209, 131, 6, 0, 18, 133, 6, 0, 81, 134, 6, 0, 146, 135, 6, 0, 209, 136, 6, 0, 18, 138, 6, 0, 81, 139, 6, 0, 146, 140, 6, 0, 209, 141, 6, 0, 18, 143, 6, 0, 81, 144, 6, 0, 146, 145, 6, 0, 209, 146, 6, 0, 18, 148, 6, 0, 81, 149, 6, 0, 146, 150, 6, 0, 209, 151, 6, 0, 18, 153, 6, 0, 81, 154, 6, 0, 146, 155, 6, 0, 209, 156, 6, 0, 18, 158, 6, 0, 81, 159, 6, 0, 146, 160, 6, 0, 209, 161, 6, 0, 18, 163, 6, 0, 81, 164, 6, 0, 146, 165, 6, 0, 209, 166, 6, 0, 18, 168, 6, 0, 81, 169, 6, 0, 146, 170, 6, 0, 209, 171, 6, 0, 18, 173, 6, 0, 81, 174, 6, 0, 146, 175, 6, 0, 209, 176, 6, 0, 18, 178, 6, 0, 81, 179, 6, 0, 146, 180, 6, 0, 209, 181, 6, 0, 18, 183, 6, 0, 81, 184, 6, 0, 146, 185, 6, 0, 209, 186, 6, 0, 18, 188, 6, 0, 81, 189, 6, 0, 146, 190, 6, 0, 209, 191, 6, 0, 18, 193, 6, 0, 81, 194, 6, 0, 146, 195, 6, 0, 209, 196, 6, 0, 18, 198, 6, 0, 81, 199, 6, 0, 146, 200, 6, 0, 209, 201, 6, 0, 18, 203, 6, 0, 81, 204, 6, 0, 146, 205, 6, 0, 209, 206, 6, 0, 18, 208, 6, 0, 81, 209, 6, 0, 146, 210, 6, 0, 209, 211, 6, 0, 18, 213, 6, 0, 81, 214, 6, 0, 146, 215, 6, 0, 209, 216, 6, 0, 18, 218, 6, 0, 81, 219, 6, 0, 146, 220, 6, 0, 209, 221, 6, 0, 18, 223, 6, 0, 81, 224, 6, 0, 146, 225, 6, 0, 209, 226, 6, 0, 18, 228, 6, 0, 81, 229, 6, 0, 146, 230, 6, 0, 209, 231, 6, 0, 18, 233, 6, 0, 81, 234, 6, 0, 146, 235, 6, 0, 209, 236, 6, 0, 18, 238, 6, 0, 81, 239, 6, 0, 146, 240, 6, 0, 209, 241, 6, 0, 18, 243, 6, 0, 81, 244, 6, 0, 146, 245, 6, 0, 209, 246, 6, 0, 18, 248, 6, 0, 81, 249, 6, 0, 146, 250, 6, 0, 209, 251, 6, 0, 18, 253, 6, 0, 81, 254, 6, 0, 146, 255, 6, 0, 209, 0, 7, 0, 18, 2, 7, 0, 81, 3, 7, 0, 146, 4, 7, 0, 209, 5, 7, 0, 18, 7, 7, 0, 81, 8, 7, 0, 146, 9, 7, 0, 209, 10, 7, 0, 18, 12, 7, 0, 81, 13, 7, 0, 146, 14, 7, 0, 209, 15, 7, 0, 18, 17, 7, 0, 81, 18, 7, 0, 146, 19, 7, 0, 209, 20, 7, 0, 18, 22, 7, 0, 81, 23, 7, 0, 146, 24, 7, 0, 209, 25, 7, 0, 18, 27, 7, 0, 81, 28, 7, 0, 146, 29, 7, 0, 209, 30, 7, 0, 18, 32, 7, 0, 81, 33, 7, 0, 146, 34, 7, 0, 209, 35, 7, 0, 18, 37, 7, 0, 81, 38, 7, 0, 146, 39, 7, 0, 209, 40, 7, 0, 18, 42, 7, 0, 81, 43, 7, 0, 146, 44, 7, 0, 209, 45, 7, 0, 18, 47, 7, 0, 81, 48, 7, 0, 146, 49, 7, 0, 209, 50, 7, 0, 18, 52, 7, 0, 81, 53, 7, 0, 146, 54, 7, 0, 209, 55, 7, 0, 18, 57, 7, 0, 81, 58, 7, 0, 146, 59, 7, 0, 209, 60, 7, 0, 18, 62, 7, 0, 81, 63, 7, 0, 146, 64, 7, 0, 209, 65, 7, 0, 18, 67, 7, 0, 81, 68, 7, 0, 146, 69, 7, 0, 209, 70, 7, 0, 18, 72, 7, 0, 81, 73, 7, 0, 146, 74, 7, 0, 209, 75, 7, 0, 18, 77, 7, 0, 81, 78, 7, 0, 146, 79, 7, 0, 209, 80, 7, 0, 18, 82, 7, 0, 81, 83, 7, 0, 146, 84, 7, 0, 209, 85, 7, 0, 18, 87, 7, 0, 81, 88, 7, 0, 146, 89, 7, 0, 209, 90, 7, 0, 18, 92, 7, 0, 81, 93, 7, 0, 146, 94, 7, 0, 209, 95, 7, 0, 18, 97, 7, 0, 81, 98, 7, 0, 146, 99, 7, 0, 209, 100, 7, 0, 18, 102, 7, 0, 81, 103, 7, 0, 146, 104, 7, 0, 209, 105, 7, 0, 18, 107, 7, 0, 81, 108, 7, 0, 146, 109, 7, 0, 209, 110, 7, 0, 18, 112, 7, 0, 81, 113, 7, 0, 146, 114, 7, 0, 209, 115, 7, 0, 18, 117, 7, 0, 81, 118, 7, 0, 146, 119, 7, 0, 209, 120, 7, 0, 18, 122, 7, 0, 81, 123, 7, 0, 146, 124, 7, 0, 209, 125, 7, 0, 18, 127, 7, 0, 81, 128, 7, 0, 146, 129, 7, 0, 209, 130, 7, 0, 18, 132, 7, 0, 81, 133, 7, 0, 146, 134, 7, 0, 209, 135, 7, 0, 18, 137, 7, 0, 81, 138, 7, 0, 146, 139, 7, 0, 209, 140, 7, 0, 18, 142, 7, 0, 81, 143, 7, 0, 146, 144, 7, 0, 209, 145, 7, 0, 18, 147, 7, 0, 81, 148, 7, 0, 146, 149, 7, 0, 209, 150, 7, 0, 18, 152, 7, 0, 81, 153, 7, 0, 146, 154, 7, 0, 209, 155, 7, 0, 18, 157, 7, 0, 81, 158, 7, 0, 146, 159, 7, 0, 209, 160, 7, 0, 18, 162, 7, 0, 81, 163, 7, 0, 146, 164, 7, 0, 209, 165, 7, 0, 18, 167, 7, 0, 81, 168, 7, 0, 146, 169, 7, 0, 209, 170, 7, 0, 18, 172, 7, 0, 81, 173, 7, 0, 146, 174, 7, 0, 209, 175, 7, 0, 18, 177, 7, 0, 81, 178, 7, 0, 146, 179, 7, 0, 209, 180, 7, 0, 18, 182, 7, 0, 81, 183, 7, 0, 146, 184, 7, 0, 209, 185, 7, 0, 18, 187, 7, 0, 81, 188, 7, 0, 146, 189, 7, 0, 209, 190, 7, 0, 18, 192, 7, 0, 81, 193, 7, 0, 146, 194, 7, 0, 209, 195, 7, 0, 18, 197, 7, 0, 81, 198, 7, 0, 146, 199, 7, 0, 209, 200, 7, 0, 18, 202, 7, 0, 81, 203, 7, 0, 146, 204, 7, 0, 209, 205, 7, 0, 18, 207, 7, 0, 81, 208, 7, 0, 146, 209, 7, 0, 209, 210, 7, 0, 18, 212, 7, 0, 81, 213, 7, 0, 146, 214, 7, 0, 209, 215, 7, 0, 18, 217, 7, 0, 81, 218, 7, 0, 146, 219, 7, 0, 209, 220, 7, 0, 18, 222, 7, 0, 81, 223, 7, 0, 146, 224, 7, 0, 209, 225, 7, 0, 18, 227, 7, 0, 81, 228, 7, 0, 146, 229, 7, 0, 209, 230, 7, 0, 18, 232, 7, 0, 81, 233, 7, 0, 146, 234, 7, 0, 209, 235, 7, 0, 18, 237, 7, 0, 81, 238, 7, 0, 146, 239, 7, 0, 209, 240, 7, 0, 18, 242, 7, 0, 81, 243, 7, 0, 146, 244, 7, 0, 209, 245, 7, 0, 18, 247, 7, 0, 81, 248, 7, 0, 146, 249, 7, 0, 209, 250, 7, 0, 18, 252, 7, 0, 81, 253, 7, 0, 146, 254, 7, 0, 209, 255, 7, 0, 18, 1, 8, 0, 81, 2, 8, 0, 146, 3, 8, 0, 209, 4, 8, 0, 18, 6, 8, 0, 81, 7, 8, 0, 146, 8, 8, 0, 209, 9, 8, 0, 18, 11, 8, 0, 81, 12, 8, 0, 146, 13, 8, 0, 209, 14, 8, 0, 18, 16, 8, 0, 81, 17, 8, 0, 146, 18, 8, 0, 209, 19, 8, 0, 18, 21, 8, 0, 81, 22, 8, 0, 146, 23, 8, 0, 209, 24, 8, 0, 18, 26, 8, 0, 81, 27, 8, 0, 146, 28, 8, 0, 209, 29, 8, 0, 18, 31, 8, 0, 81, 32, 8, 0, 146, 33, 8, 0, 209, 34, 8, 0, 18, 36, 8, 0, 81, 37, 8, 0, 146, 38, 8, 0, 209, 39, 8, 0, 18, 41, 8, 0, 81, 42, 8, 0, 146, 43, 8, 0, 209, 44, 8, 0, 18, 46, 8, 0, 81, 47, 8, 0, 146, 48, 8, 0, 209, 49, 8, 0, 18, 51, 8, 0, 81, 52, 8, 0, 146, 53, 8, 0, 209, 54, 8, 0, 18, 56, 8, 0, 81, 57, 8, 0, 146, 58, 8, 0, 209, 59, 8, 0, 18, 61, 8, 0, 81, 62, 8, 0, 146, 63, 8, 0, 209, 64, 8, 0, 18, 66, 8, 0, 81, 67, 8, 0, 146, 68, 8, 0, 209, 69, 8, 0, 18, 71, 8, 0, 81, 72, 8, 0, 146, 73, 8, 0, 209, 74, 8, 0, 18, 76, 8, 0, 81, 77, 8, 0, 146, 78, 8, 0, 209, 79, 8, 0, 18, 81, 8, 0, 81, 82, 8, 0, 146, 83, 8, 0, 209, 84, 8, 0, 18, 86, 8, 0, 81, 87, 8, 0, 146, 88, 8, 0, 209, 89, 8, 0, 18, 91, 8, 0, 81, 92, 8, 0, 146, 93, 8, 0, 209, 94, 8, 0, 18, 96, 8, 0, 81, 97, 8, 0, 146, 98, 8, 0, 209, 99, 8, 0, 18, 101, 8, 0, 81, 102, 8, 0, 146, 103, 8, 0, 209, 104, 8, 0, 18, 106, 8, 0, 81, 107, 8, 0, 146, 108, 8, 0, 209, 109, 8, 0, 18, 111, 8, 0, 81, 112, 8, 0, 146, 113, 8, 0, 209, 114, 8, 0, 18, 116, 8, 0, 81, 117, 8, 0, 146, 118, 8, 0, 209, 119, 8, 0, 18, 121, 8, 0, 81, 122, 8, 0, 146, 123, 8, 0, 209, 124, 8, 0, 18, 126, 8, 0, 81, 127, 8, 0, 146, 128, 8, 0, 209, 129, 8, 0, 18, 131, 8, 0, 81, 132, 8, 0, 146, 133, 8, 0, 209, 134, 8, 0, 18, 136, 8, 0, 81, 137, 8, 0, 146, 138, 8, 0, 209, 139, 8, 0, 18, 141, 8, 0, 81, 142, 8, 0, 146, 143, 8, 0, 209, 144, 8, 0, 18, 146, 8, 0, 81, 147, 8, 0, 146, 148, 8, 0, 209, 149, 8, 0, 18, 151, 8, 0, 81, 152, 8, 0, 146, 153, 8, 0, 209, 154, 8, 0, 18, 156, 8, 0, 81, 157, 8, 0, 146, 158, 8, 0, 209, 159, 8, 0, 18, 161, 8, 0, 81, 162, 8, 0, 146, 163, 8, 0, 209, 164, 8, 0, 18, 166, 8, 0, 81, 167, 8, 0, 146, 168, 8, 0, 209, 169, 8, 0, 18, 171, 8, 0, 81, 172, 8, 0, 146, 173, 8, 0, 209, 174, 8, 0, 18, 176, 8, 0, 81, 177, 8, 0, 146, 178, 8, 0, 209, 179, 8, 0, 18, 181, 8, 0, 81, 182, 8, 0, 146, 183, 8, 0, 209, 184, 8, 0, 18, 186, 8, 0, 81, 187, 8, 0, 146, 188, 8, 0, 209, 189, 8, 0, 18, 191, 8, 0, 81, 192, 8, 0, 146, 193, 8, 0, 209, 194, 8, 0, 18, 196, 8, 0, 81, 197, 8, 0, 146, 198, 8, 0, 209, 199, 8, 0, 18, 201, 8, 0, 81, 202, 8, 0, 146, 203, 8, 0, 209, 204, 8, 0, 18, 206, 8, 0, 81, 207, 8, 0, 146, 208, 8, 0, 209, 209, 8, 0, 18, 211, 8, 0, 81, 212, 8, 0, 146, 213, 8, 0, 209, 214, 8, 0, 18, 216, 8, 0, 81, 217, 8, 0, 146, 218, 8, 0, 209, 219, 8, 0, 18, 221, 8, 0, 81, 222, 8, 0, 146, 223, 8, 0, 209, 224, 8, 0, 18, 226, 8, 0, 81, 227, 8, 0, 146, 228, 8, 0, 209, 229, 8, 0, 18, 231, 8, 0, 81, 232, 8, 0, 146, 233, 8, 0, 209, 234, 8, 0, 18, 236, 8, 0, 81, 237, 8, 0, 146, 238, 8, 0, 209, 239, 8, 0, 18, 241, 8, 0, 81, 242, 8, 0, 146, 243, 8, 0, 209, 244, 8, 0, 18, 246, 8, 0, 81, 247, 8, 0, 146, 248, 8, 0, 209, 249, 8, 0, 18, 251, 8, 0, 81, 252, 8, 0, 146, 253, 8, 0, 209, 254, 8, 0, 18, 0, 9, 0, 81, 1, 9, 0, 146, 2, 9, 0, 209, 3, 9, 0, 18, 5, 9, 0, 81, 6, 9, 0, 146, 7, 9, 0, 209, 8, 9, 0, 18, 10, 9, 0, 81, 11, 9, 0, 146, 12, 9, 0, 209, 13, 9, 0, 18, 15, 9, 0, 81, 16, 9, 0, 146, 17, 9, 0, 209, 18, 9, 0, 18, 20, 9, 0, 81, 21, 9, 0, 146, 22, 9, 0, 209, 23, 9, 0, 18, 25, 9, 0, 81, 26, 9, 0, 146, 27, 9, 0, 209, 28, 9, 0, 18, 30, 9, 0, 81, 31, 9, 0, 146, 32, 9, 0, 209, 33, 9, 0, 18, 35, 9, 0, 81, 36, 9, 0, 146, 37, 9, 0, 209, 38, 9, 0, 18, 40, 9, 0, 81, 41, 9, 0, 146, 42, 9, 0, 209, 43, 9, 0, 18, 45, 9, 0, 81, 46, 9, 0, 146, 47, 9, 0, 209, 48, 9, 0, 18, 50, 9, 0, 81, 51, 9, 0, 146, 52, 9, 0, 209, 53, 9, 0, 18, 55, 9, 0, 81, 56, 9, 0, 146, 57, 9, 0, 209, 58, 9, 0, 18, 60, 9, 0, 81, 61, 9, 0, 146, 62, 9, 0, 209, 63, 9, 0, 18, 65, 9, 0, 81, 66, 9, 0, 146, 67, 9, 0, 209, 68, 9, 0, 18, 70, 9, 0, 81, 71, 9, 0, 146, 72, 9, 0, 209, 73, 9, 0, 18, 75, 9, 0, 81, 76, 9, 0, 146, 77, 9, 0, 209, 78, 9, 0, 18, 80, 9, 0, 81, 81, 9, 0, 146, 82, 9, 0, 209, 83, 9, 0, 18, 85, 9, 0, 81, 86, 9, 0, 146, 87, 9, 0, 209, 88, 9, 0, 18, 90, 9, 0, 81, 91, 9, 0, 146, 92, 9, 0, 209, 93, 9, 0, 18, 95, 9, 0, 81, 96, 9, 0, 146, 97, 9, 0, 209, 98, 9, 0, 18, 100, 9, 0, 81, 101, 9, 0, 146, 102, 9, 0, 209, 103, 9, 0, 18, 105, 9, 0, 81, 106, 9, 0, 146, 107, 9, 0, 209, 108, 9, 0, 18, 110, 9, 0, 81, 111, 9, 0, 146, 112, 9, 0, 209, 113, 9, 0, 18, 115, 9, 0, 81, 116, 9, 0, 146, 117, 9, 0, 209, 118, 9, 0, 18, 120, 9, 0, 81, 121, 9, 0, 146, 122, 9, 0, 209, 123, 9, 0, 18, 125, 9, 0, 81, 126, 9, 0, 146, 127, 9, 0, 209, 128, 9, 0, 18, 130, 9, 0, 81, 131, 9, 0, 146, 132, 9, 0, 209, 133, 9, 0, 18, 135, 9, 0, 81, 136, 9, 0, 146, 137, 9, 0, 209, 138, 9, 0, 18, 140, 9, 0, 81, 141, 9, 0, 146, 142, 9, 0, 209, 143, 9, 0, 18, 145, 9, 0, 81, 146, 9, 0, 146, 147, 9, 0, 209, 148, 9, 0, 18, 150, 9, 0, 81, 151, 9, 0, 146, 152, 9, 0, 209, 153, 9, 0, 18, 155, 9, 0, 81, 156, 9, 0, 146, 157, 9, 0, 209, 158, 9, 0, 18, 160, 9, 0, 81, 161, 9, 0, 146, 162, 9, 0, 209, 163, 9, 0, 18, 165, 9, 0, 81, 166, 9, 0, 146, 167, 9, 0, 209, 168, 9, 0, 18, 170, 9, 0, 81, 171, 9, 0, 146, 172, 9, 0, 209, 173, 9, 0, 18, 175, 9, 0, 81, 176, 9, 0, 146, 177, 9, 0, 209, 178, 9, 0, 18, 180, 9, 0, 81, 181, 9, 0, 146, 182, 9, 0, 209, 183, 9, 0, 18, 185, 9, 0, 81, 186, 9, 0, 146, 187, 9, 0, 209, 188, 9, 0, 18, 190, 9, 0, 81, 191, 9, 0, 146, 192, 9, 0, 209, 193, 9, 0, 18, 195, 9, 0, 81, 196, 9, 0, 146, 197, 9, 0, 209, 198, 9, 0, 18, 200, 9, 0, 81, 201, 9, 0, 146, 202, 9, 0, 209, 203, 9, 0, 18, 205, 9, 0, 81, 206, 9, 0, 146, 207, 9, 0, 209, 208, 9, 0, 18, 210, 9, 0, 81, 211, 9, 0, 146, 212, 9, 0, 209, 213, 9, 0, 18, 215, 9, 0, 81, 216, 9, 0, 146, 217, 9, 0, 209, 218, 9, 0, 18, 220, 9, 0, 81, 221, 9, 0, 146, 222, 9, 0, 209, 223, 9, 0, 18, 225, 9, 0, 81, 226, 9, 0, 146, 227, 9, 0, 209, 228, 9, 0, 18, 230, 9, 0, 81, 231, 9, 0, 146, 232, 9, 0, 209, 233, 9, 0, 18, 235, 9, 0, 81, 236, 9, 0, 146, 237, 9, 0, 209, 238, 9, 0, 18, 240, 9, 0, 81, 241, 9, 0, 146, 242, 9, 0, 209, 243, 9, 0, 18, 245, 9, 0, 81, 246, 9, 0, 146, 247, 9, 0, 209, 248, 9, 0, 18, 250, 9, 0, 81, 251, 9, 0, 146, 252, 9, 0, 209, 253, 9, 0, 18, 255, 9, 0, 81, 0, 10, 0, 146, 1, 10, 0, 209, 2, 10, 0, 18, 4, 10, 0, 81, 5, 10, 0, 146, 6, 10, 0, 209, 7, 10, 0, 18, 9, 10, 0, 81, 10, 10, 0, 146, 11, 10, 0, 209, 12, 10, 0, 18, 14, 10, 0, 81, 15, 10, 0, 146, 16, 10, 0, 209, 17, 10, 0, 18, 19, 10, 0, 81, 20, 10, 0, 146, 21, 10, 0, 209, 22, 10, 0, 18, 24, 10, 0, 81, 25, 10, 0, 146, 26, 10, 0, 209, 27, 10, 0, 18, 29, 10, 0, 81, 30, 10, 0, 146, 31, 10, 0, 209, 32, 10, 0, 18, 34, 10, 0, 81, 35, 10, 0, 146, 36, 10, 0, 209, 37, 10, 0, 18, 39, 10, 0, 81, 40, 10, 0, 146, 41, 10, 0, 209, 42, 10, 0, 18, 44, 10, 0, 81, 45, 10, 0, 146, 46, 10, 0, 209, 47, 10, 0, 18, 49, 10, 0, 81, 50, 10, 0, 146, 51, 10, 0, 209, 52, 10, 0, 18, 54, 10, 0, 81, 55, 10, 0, 146, 56, 10, 0, 209, 57, 10, 0, 18, 59, 10, 0, 81, 60, 10, 0, 146, 61, 10, 0, 209, 62, 10, 0, 18, 64, 10, 0, 81, 65, 10, 0, 146, 66, 10, 0, 209, 67, 10, 0, 18, 69, 10, 0, 81, 70, 10, 0, 146, 71, 10, 0, 209, 72, 10, 0, 18, 74, 10, 0, 81, 75, 10, 0, 146, 76, 10, 0, 209, 77, 10, 0, 18, 79, 10, 0, 81, 80, 10, 0, 146, 81, 10, 0, 209, 82, 10, 0, 18, 84, 10, 0, 81, 85, 10, 0, 146, 86, 10, 0, 209, 87, 10, 0, 18, 89, 10, 0, 81, 90, 10, 0, 146, 91, 10, 0, 209, 92, 10, 0, 18, 94, 10, 0, 81, 95, 10, 0, 146, 96, 10, 0, 209, 97, 10, 0, 18, 99, 10, 0, 81, 100, 10, 0, 146, 101, 10, 0, 209, 102, 10, 0, 18, 104, 10, 0, 81, 105, 10, 0, 146, 106, 10, 0, 209, 107, 10, 0, 18, 109, 10, 0, 81, 110, 10, 0, 146, 111, 10, 0, 209, 112, 10, 0, 18, 114, 10, 0, 81, 115, 10, 0, 146, 116, 10, 0, 209, 117, 10, 0, 18, 119, 10, 0, 81, 120, 10, 0, 146, 121, 10, 0, 209, 122, 10, 0, 18, 124, 10, 0, 81, 125, 10, 0, 146, 126, 10, 0, 209, 127, 10, 0, 18, 129, 10, 0, 81, 130, 10, 0, 146, 131, 10, 0, 209, 132, 10, 0, 18, 134, 10, 0, 81, 135, 10, 0, 146, 136, 10, 0, 209, 137, 10, 0, 18, 139, 10, 0, 81, 140, 10, 0, 146, 141, 10, 0, 209, 142, 10, 0, 18, 144, 10, 0, 81, 145, 10, 0, 146, 146, 10, 0, 209, 147, 10, 0, 18, 149, 10, 0, 81, 150, 10, 0, 146, 151, 10, 0, 209, 152, 10, 0, 18, 154, 10, 0, 81, 155, 10, 0, 146, 156, 10, 0, 209, 157, 10, 0, 18, 159, 10, 0, 81, 160, 10, 0, 146, 161, 10, 0, 209, 162, 10, 0, 18, 164, 10, 0, 81, 165, 10, 0, 146, 166, 10, 0, 209, 167, 10, 0, 18, 169, 10, 0, 81, 170, 10, 0, 146, 171, 10, 0, 209, 172, 10, 0, 18, 174, 10, 0, 81, 175, 10, 0, 146, 176, 10, 0, 209, 177, 10, 0, 18, 179, 10, 0, 81, 180, 10, 0, 146, 181, 10, 0, 209, 182, 10, 0, 18, 184, 10, 0, 81, 185, 10, 0, 146, 186, 10, 0, 209, 187, 10, 0, 18, 189, 10, 0, 81, 190, 10, 0, 146, 191, 10, 0, 209, 192, 10, 0, 18, 194, 10, 0, 81, 195, 10, 0, 146, 196, 10, 0, 209, 197, 10, 0, 18, 199, 10, 0, 81, 200, 10, 0, 146, 201, 10, 0, 209, 202, 10, 0, 18, 204, 10, 0, 81, 205, 10, 0, 146, 206, 10, 0, 209, 207, 10, 0, 18, 209, 10, 0, 81, 210, 10, 0, 146, 211, 10, 0, 209, 212, 10, 0, 18, 214, 10, 0, 81, 215, 10, 0, 146, 216, 10, 0, 209, 217, 10, 0, 18, 219, 10, 0, 81, 220, 10, 0, 146, 221, 10, 0, 209, 222, 10, 0, 18, 224, 10, 0, 81, 225, 10, 0, 146, 226, 10, 0, 209, 227, 10, 0, 18, 229, 10, 0, 81, 230, 10, 0, 146, 231, 10, 0, 209, 232, 10, 0, 18, 234, 10, 0, 81, 235, 10, 0, 146, 236, 10, 0, 209, 237, 10, 0, 18, 239, 10, 0, 81, 240, 10, 0, 146, 241, 10, 0, 209, 242, 10, 0, 18, 244, 10, 0, 81, 245, 10, 0, 146, 246, 10, 0, 209, 247, 10, 0, 18, 249, 10, 0, 81, 250, 10, 0, 146, 251, 10, 0, 209, 252, 10, 0, 18, 254, 10, 0, 81, 255, 10, 0, 146, 0, 11, 0, 209, 1, 11, 0, 18, 3, 11, 0, 81, 4, 11, 0, 146, 5, 11, 0, 209, 6, 11, 0, 18, 8, 11, 0, 81, 9, 11, 0, 146, 10, 11, 0, 209, 11, 11, 0, 18, 13, 11, 0, 81, 14, 11, 0, 146, 15, 11, 0, 209, 16, 11, 0, 18, 18, 11, 0, 81, 19, 11, 0, 146, 20, 11, 0, 209, 21, 11, 0, 18, 23, 11, 0, 81, 24, 11, 0, 146, 25, 11, 0, 209, 26, 11, 0, 18, 28, 11, 0, 81, 29, 11, 0, 146, 30, 11, 0, 209, 31, 11, 0, 18, 33, 11, 0, 81, 34, 11, 0, 146, 35, 11, 0, 209, 36, 11, 0, 18, 38, 11, 0, 81, 39, 11, 0, 146, 40, 11, 0, 209, 41, 11, 0, 18, 43, 11, 0, 81, 44, 11, 0, 146, 45, 11, 0, 209, 46, 11, 0, 18, 48, 11, 0, 81, 49, 11, 0, 146, 50, 11, 0, 209, 51, 11, 0, 18, 53, 11, 0, 81, 54, 11, 0, 146, 55, 11, 0, 209, 56, 11, 0, 18, 58, 11, 0, 81, 59, 11, 0, 146, 60, 11, 0, 209, 61, 11, 0, 18, 63, 11, 0, 81, 64, 11, 0, 146, 65, 11, 0, 209, 66, 11, 0, 18, 68, 11, 0, 81, 69, 11, 0, 146, 70, 11, 0, 209, 71, 11, 0, 18, 73, 11, 0, 81, 74, 11, 0, 146, 75, 11, 0, 209, 76, 11, 0, 18, 78, 11, 0, 81, 79, 11, 0, 146, 80, 11, 0, 209, 81, 11, 0, 18, 83, 11, 0, 81, 84, 11, 0, 146, 85, 11, 0, 209, 86, 11, 0, 18, 88, 11, 0, 81, 89, 11, 0, 146, 90, 11, 0, 209, 91, 11, 0, 18, 93, 11, 0, 81, 94, 11, 0, 146, 95, 11, 0, 209, 96, 11, 0, 18, 98, 11, 0, 81, 99, 11, 0, 146, 100, 11, 0, 209, 101, 11, 0, 18, 103, 11, 0, 81, 104, 11, 0, 146, 105, 11, 0, 209, 106, 11, 0, 18, 108, 11, 0, 81, 109, 11, 0, 146, 110, 11, 0, 209, 111, 11, 0, 18, 113, 11, 0, 81, 114, 11, 0, 146, 115, 11, 0, 209, 116, 11, 0, 18, 118, 11, 0, 81, 119, 11, 0, 146, 120, 11, 0, 209, 121, 11, 0, 18, 123, 11, 0, 81, 124, 11, 0, 146, 125, 11, 0, 209, 126, 11, 0, 18, 128, 11, 0, 81, 129, 11, 0, 146, 130, 11, 0, 209, 131, 11, 0, 18, 133, 11, 0, 81, 134, 11, 0, 146, 135, 11, 0, 209, 136, 11, 0, 18, 138, 11, 0, 81, 139, 11, 0, 146, 140, 11, 0, 209, 141, 11, 0, 18, 143, 11, 0, 81, 144, 11, 0, 146, 145, 11, 0, 209, 146, 11, 0, 18, 148, 11, 0, 81, 149, 11, 0, 146, 150, 11, 0, 209, 151, 11, 0, 18, 153, 11, 0, 81, 154, 11, 0, 146, 155, 11, 0, 209, 156, 11, 0, 18, 158, 11, 0, 81, 159, 11, 0, 146, 160, 11, 0, 209, 161, 11, 0, 18, 163, 11, 0, 81, 164, 11, 0, 146, 165, 11, 0, 209, 166, 11, 0, 18, 168, 11, 0, 81, 169, 11, 0, 146, 170, 11, 0, 209, 171, 11, 0, 18, 173, 11, 0, 81, 174, 11, 0, 146, 175, 11, 0, 209, 176, 11, 0, 18, 178, 11, 0, 81, 179, 11, 0, 146, 180, 11, 0, 209, 181, 11, 0, 18, 183, 11, 0, 81, 184, 11, 0, 146, 185, 11, 0, 209, 186, 11, 0, 18, 188, 11, 0, 81, 189, 11, 0, 146, 190, 11, 0, 209, 191, 11, 0, 18, 193, 11, 0, 81, 194, 11, 0, 146, 195, 11, 0, 209, 196, 11, 0, 18, 198, 11, 0, 81, 199, 11, 0, 146, 200, 11, 0, 209, 201, 11, 0, 18, 203, 11, 0, 81, 204, 11, 0, 146, 205, 11, 0, 209, 206, 11, 0, 18, 208, 11, 0, 81, 209, 11, 0, 146, 210, 11, 0, 209, 211, 11, 0, 18, 213, 11, 0, 81, 214, 11, 0, 146, 215, 11, 0, 209, 216, 11, 0, 18, 218, 11, 0, 81, 219, 11, 0, 146, 220, 11, 0, 209, 221, 11, 0, 18, 223, 11, 0, 81, 224, 11, 0, 146, 225, 11, 0, 209, 226, 11, 0, 18, 228, 11, 0, 81, 229, 11, 0, 146, 230, 11, 0, 209, 231, 11, 0, 18, 233, 11, 0, 81, 234, 11, 0, 146, 235, 11, 0, 209, 236, 11, 0, 18, 238, 11, 0, 81, 239, 11, 0, 146, 240, 11, 0, 209, 241, 11, 0, 18, 243, 11, 0, 81, 244, 11, 0, 146, 245, 11, 0, 209, 246, 11, 0, 18, 248, 11, 0, 81, 249, 11, 0, 146, 250, 11, 0, 209, 251, 11, 0, 18, 253, 11, 0, 81, 254, 11, 0, 146, 255, 11, 0, 209, 0, 12, 0, 18, 2, 12, 0, 81, 3, 12, 0, 146, 4, 12, 0, 209, 5, 12, 0, 18, 7, 12, 0, 81, 8, 12, 0, 146, 9, 12, 0, 209, 10, 12, 0, 18, 12, 12, 0, 81, 13, 12, 0, 146, 14, 12, 0, 209, 15, 12, 0, 18, 17, 12, 0, 81, 18, 12, 0, 146, 19, 12, 0, 209, 20, 12, 0, 18, 22, 12, 0, 81, 23, 12, 0, 146, 24, 12, 0, 209, 25, 12, 0, 18, 27, 12, 0, 81, 28, 12, 0, 146, 29, 12, 0, 209, 30, 12, 0, 18, 32, 12, 0, 81, 33, 12, 0, 146, 34, 12, 0, 209, 35, 12, 0, 18, 37, 12, 0, 81, 38, 12, 0, 146, 39, 12, 0, 209, 40, 12, 0, 18, 42, 12, 0, 81, 43, 12, 0, 146, 44, 12, 0, 209, 45, 12, 0, 18, 47, 12, 0, 81, 48, 12, 0, 146, 49, 12, 0, 209, 50, 12, 0, 18, 52, 12, 0, 1], [], [], [], [144, 1, 0, 0, 16, 4, 0, 0, 144, 6, 0, 0, 16, 9, 0, 0, 144, 11, 0, 0, 16, 14, 0, 0, 144, 16, 0, 0, 16, 19, 0, 0, 144, 21, 0, 0, 16, 24, 0, 0, 144, 26, 0, 0, 16, 29, 0, 0, 144, 31, 0, 0, 16, 34, 0, 0, 144, 36, 0, 0, 16, 39, 0, 0, 144, 41, 0, 0, 16, 44, 0, 0, 144, 46, 0, 0, 16, 49, 0, 0, 144, 51, 0, 0, 16, 54, 0, 0, 144, 56, 0, 0, 16, 59, 0, 0, 144, 61, 0, 0, 16, 64, 0, 0, 144, 66, 0, 0, 16, 69, 0, 0, 144, 71, 0, 0, 16, 74, 0, 0, 144, 76, 0, 0, 16, 79, 0, 0, 144, 81, 0, 0, 16, 84, 0, 0, 144, 86, 0, 0, 16, 89, 0, 0, 144, 91, 0, 0, 16, 94, 0, 0, 144, 96, 0, 0, 16, 99, 0, 0, 144, 101, 0, 0, 16, 104, 0, 0, 144, 106, 0, 0, 16, 109, 0, 0, 144, 111, 0, 0, 16, 114, 0, 0, 144, 116, 0, 0, 16, 119, 0, 0, 144, 121, 0, 0, 16, 124, 0, 0, 144, 126, 0, 0, 16, 129, 0, 0, 144, 131, 0, 0, 16, 134, 0, 0, 144, 136, 0, 0, 16, 139, 0, 0, 144, 141, 0, 0, 16, 144, 0, 0, 144, 146, 0, 0, 16, 149, 0, 0, 144, 151, 0, 0, 16, 154, 0, 0, 144, 156, 0, 0, 16, 159, 0, 0, 144, 161, 0, 0, 16, 164, 0, 0, 144, 166, 0, 0, 16, 169, 0, 0, 144, 171, 0, 0, 16, 174, 0, 0, 144, 176, 0, 0, 16, 179, 0, 0, 144, 181, 0, 0, 16, 184, 0, 0, 144, 186, 0, 0, 16, 189, 0, 0, 144, 191, 0, 0, 16, 194, 0, 0, 144, 196, 0, 0, 16, 199, 0, 0, 144, 201, 0, 0, 16, 204, 0, 0, 144, 206, 0, 0, 16, 209, 0, 0, 144, 211, 0, 0, 16, 214, 0, 0, 144, 216, 0, 0, 16, 219, 0, 0, 144, 221, 0, 0, 16, 224, 0, 0, 144, 226, 0, 0, 16, 229, 0, 0, 144, 231, 0, 0, 16, 234, 0, 0, 144, 236, 0, 0, 16, 239, 0, 0, 144, 241, 0, 0, 16, 244, 0, 0, 144, 246, 0, 0, 16, 249, 0, 0, 144, 251, 0, 0, 16, 254, 0, 0, 144, 0, 1, 0, 16, 3, 1, 0, 144, 5, 1, 0, 16, 8, 1, 0, 144, 10, 1, 0, 16, 13, 1, 0, 144, 15, 1, 0, 16, 18, 1, 0, 144, 20, 1, 0, 16, 23, 1, 0, 144, 25, 1, 0, 16, 28, 1, 0, 144, 30, 1, 0, 16, 33, 1, 0, 144, 35, 1, 0, 16, 38, 1, 0, 144, 40, 1, 0, 16, 43, 1, 0, 144, 45, 1, 0, 16, 48, 1, 0, 144, 50, 1, 0, 16, 53, 1, 0, 144, 55, 1, 0, 16, 58, 1, 0, 144, 60, 1, 0, 16, 63, 1, 0, 144, 65, 1, 0, 16, 68, 1, 0, 144, 70, 1, 0, 16, 73, 1, 0, 144, 75, 1, 0, 16, 78, 1, 0, 144, 80, 1, 0, 16, 83, 1, 0, 144, 85, 1, 0, 16, 88, 1, 0, 144, 90, 1, 0, 16, 93, 1, 0, 144, 95, 1, 0, 16, 98, 1, 0, 144, 100, 1, 0, 16, 103, 1, 0, 144, 105, 1, 0, 16, 108, 1, 0, 144, 110, 1, 0, 16, 113, 1, 0, 144, 115, 1, 0, 16, 118, 1, 0, 144, 120, 1, 0, 16, 123, 1, 0, 144, 125, 1, 0, 16, 128, 1, 0, 144, 130, 1, 0, 16, 133, 1, 0, 144, 135, 1, 0, 16, 138, 1, 0, 144, 140, 1, 0, 16, 143, 1, 0, 144, 145, 1, 0, 16, 148, 1, 0, 144, 150, 1, 0, 16, 153, 1, 0, 144, 155, 1, 0, 16, 158, 1, 0, 144, 160, 1, 0, 16, 163, 1, 0, 144, 165, 1, 0, 16, 168, 1, 0, 144, 170, 1, 0, 16, 173, 1, 0, 144, 175, 1, 0, 16, 178, 1, 0, 144, 180, 1, 0, 16, 183, 1, 0, 144, 185, 1, 0, 16, 188, 1, 0, 144, 190, 1, 0, 16, 193, 1, 0, 144, 195, 1, 0, 16, 198, 1, 0, 144, 200, 1, 0, 16, 203, 1, 0, 144, 205, 1, 0, 16, 208, 1, 0, 144, 210, 1, 0, 16, 213, 1, 0, 144, 215, 1, 0, 16, 218, 1, 0, 144, 220, 1, 0, 16, 223, 1, 0, 144, 225, 1, 0, 16, 228, 1, 0, 144, 230, 1, 0, 16, 233, 1, 0, 144, 235, 1, 0, 16, 238, 1, 0, 144, 240, 1, 0, 16, 243, 1, 0, 144, 245, 1, 0, 16, 248, 1, 0, 144, 250, 1, 0, 16, 253, 1, 0, 144, 255, 1, 0, 16, 2, 2, 0, 144, 4, 2, 0, 16, 7, 2, 0, 144, 9, 2, 0, 16, 12, 2, 0, 144, 14, 2, 0, 16, 17, 2, 0, 144, 19, 2, 0, 16, 22, 2, 0, 144, 24, 2, 0, 16, 27, 2, 0, 144, 29, 2, 0, 16, 32, 2, 0, 144, 34, 2, 0, 16, 37, 2, 0, 144, 39, 2, 0, 16, 42, 2, 0, 144, 44, 2, 0, 16, 47, 2, 0, 144, 49, 2, 0, 16, 52, 2, 0, 144, 54, 2, 0, 16, 57, 2, 0, 144, 59, 2, 0, 16, 62, 2, 0, 144, 64, 2, 0, 16, 67, 2, 0, 144, 69, 2, 0, 16, 72, 2, 0, 144, 74, 2, 0, 16, 77, 2, 0, 144, 79, 2, 0, 16, 82, 2, 0, 144, 84, 2, 0, 16, 87, 2, 0, 144, 89, 2, 0, 16, 92, 2, 0, 144, 94, 2, 0, 16, 97, 2, 0, 144, 99, 2, 0, 16, 102, 2, 0, 144, 104, 2, 0, 16, 107, 2, 0, 144, 109, 2, 0, 16, 112, 2, 0, 144, 114, 2, 0, 16, 117, 2, 0, 144, 119, 2, 0, 16, 122, 2, 0, 144, 124, 2, 0, 16, 127, 2, 0, 144, 129, 2, 0, 16, 132, 2, 0, 144, 134, 2, 0, 16, 137, 2, 0, 144, 139, 2, 0, 16, 142, 2, 0, 144, 144, 2, 0, 16, 147, 2, 0, 144, 149, 2, 0, 16, 152, 2, 0, 144, 154, 2, 0, 16, 157, 2, 0, 144, 159, 2, 0, 16, 162, 2, 0, 144, 164, 2, 0, 16, 167, 2, 0, 144, 169, 2, 0, 16, 172, 2, 0, 144, 174, 2, 0, 16, 177, 2, 0, 144, 179, 2, 0, 16, 182, 2, 0, 144, 184, 2, 0, 16, 187, 2, 0, 144, 189, 2, 0, 16, 192, 2, 0, 144, 194, 2, 0, 16, 197, 2, 0, 144, 199, 2, 0, 16, 202, 2, 0, 144, 204, 2, 0, 16, 207, 2, 0, 144, 209, 2, 0, 16, 212, 2, 0, 144, 214, 2, 0, 16, 217, 2, 0, 144, 219, 2, 0, 16, 222, 2, 0, 144, 224, 2, 0, 16, 227, 2, 0, 144, 229, 2, 0, 16, 232, 2, 0, 144, 234, 2, 0, 16, 237, 2, 0, 144, 239, 2, 0, 16, 242, 2, 0, 144, 244, 2, 0, 16, 247, 2, 0, 144, 249, 2, 0, 16, 252, 2, 0, 144, 254, 2, 0, 16, 1, 3, 0, 144, 3, 3, 0, 16, 6, 3, 0, 144, 8, 3, 0, 16, 11, 3, 0, 144, 13, 3, 0, 16, 16, 3, 0, 144, 18, 3, 0, 16, 21, 3, 0, 144, 23, 3, 0, 16, 26, 3, 0, 144, 28, 3, 0, 16, 31, 3, 0, 144, 33, 3, 0, 16, 36, 3, 0, 144, 38, 3, 0, 16, 41, 3, 0, 144, 43, 3, 0, 16, 46, 3, 0, 144, 48, 3, 0, 16, 51, 3, 0, 144, 53, 3, 0, 16, 56, 3, 0, 144, 58, 3, 0, 16, 61, 3, 0, 144, 63, 3, 0, 16, 66, 3, 0, 144, 68, 3, 0, 16, 71, 3, 0, 144, 73, 3, 0, 16, 76, 3, 0, 144, 78, 3, 0, 16, 81, 3, 0, 144, 83, 3, 0, 16, 86, 3, 0, 144, 88, 3, 0, 16, 91, 3, 0, 144, 93, 3, 0, 16, 96, 3, 0, 144, 98, 3, 0, 16, 101, 3, 0, 144, 103, 3, 0, 16, 106, 3, 0, 144, 108, 3, 0, 16, 111, 3, 0, 144, 113, 3, 0, 16, 116, 3, 0, 144, 118, 3, 0, 16, 121, 3, 0, 144, 123, 3, 0, 16, 126, 3, 0, 144, 128, 3, 0, 16, 131, 3, 0, 144, 133, 3, 0, 16, 136, 3, 0, 144, 138, 3, 0, 16, 141, 3, 0, 144, 143, 3, 0, 16, 146, 3, 0, 144, 148, 3, 0, 16, 151, 3, 0, 144, 153, 3, 0, 16, 156, 3, 0, 144, 158, 3, 0, 16, 161, 3, 0, 144, 163, 3, 0, 16, 166, 3, 0, 144, 168, 3, 0, 16, 171, 3, 0, 144, 173, 3, 0, 16, 176, 3, 0, 144, 178, 3, 0, 16, 181, 3, 0, 144, 183, 3, 0, 16, 186, 3, 0, 144, 188, 3, 0, 16, 191, 3, 0, 144, 193, 3, 0, 16, 196, 3, 0, 144, 198, 3, 0, 16, 201, 3, 0, 144, 203, 3, 0, 16, 206, 3, 0, 144, 208, 3, 0, 16, 211, 3, 0, 144, 213, 3, 0, 16, 216, 3, 0, 144, 218, 3, 0, 16, 221, 3, 0, 144, 223, 3, 0, 16, 226, 3, 0, 144, 228, 3, 0, 16, 231, 3, 0, 144, 233, 3, 0, 16, 236, 3, 0, 144, 238, 3, 0, 16, 241, 3, 0, 144, 243, 3, 0, 16, 246, 3, 0, 144, 248, 3, 0, 16, 251, 3, 0, 144, 253, 3, 0, 16, 0, 4, 0, 144, 2, 4, 0, 16, 5, 4, 0, 144, 7, 4, 0, 16, 10, 4, 0, 144, 12, 4, 0, 16, 15, 4, 0, 144, 17, 4, 0, 16, 20, 4, 0, 144, 22, 4, 0, 16, 25, 4, 0, 144, 27, 4, 0, 16, 30, 4, 0, 144, 32, 4, 0, 16, 35, 4, 0, 144, 37, 4, 0, 16, 40, 4, 0, 144, 42, 4, 0, 16, 45, 4, 0, 144, 47, 4, 0, 16, 50, 4, 0, 144, 52, 4, 0, 16, 55, 4, 0, 144, 57, 4, 0, 16, 60, 4, 0, 144, 62, 4, 0, 16, 65, 4, 0, 144, 67, 4, 0, 16, 70, 4, 0, 144, 72, 4, 0, 16, 75, 4, 0, 144, 77, 4, 0, 16, 80, 4, 0, 144, 82, 4, 0, 16, 85, 4, 0, 144, 87, 4, 0, 16, 90, 4, 0, 144, 92, 4, 0, 16, 95, 4, 0, 144, 97, 4, 0, 16, 100, 4, 0, 144, 102, 4, 0, 16, 105, 4, 0, 144, 107, 4, 0, 16, 110, 4, 0, 144, 112, 4, 0, 16, 115, 4, 0, 144, 117, 4, 0, 16, 120, 4, 0, 144, 122, 4, 0, 16, 125, 4, 0, 144, 127, 4, 0, 16, 130, 4, 0, 144, 132, 4, 0, 16, 135, 4, 0, 144, 137, 4, 0, 16, 140, 4, 0, 144, 142, 4, 0, 16, 145, 4, 0, 144, 147, 4, 0, 16, 150, 4, 0, 144, 152, 4, 0, 16, 155, 4, 0, 144, 157, 4, 0, 16, 160, 4, 0, 144, 162, 4, 0, 16, 165, 4, 0, 144, 167, 4, 0, 16, 170, 4, 0, 144, 172, 4, 0, 16, 175, 4, 0, 144, 177, 4, 0, 16, 180, 4, 0, 144, 182, 4, 0, 16, 185, 4, 0, 144, 187, 4, 0, 16, 190, 4, 0, 144, 192, 4, 0, 16, 195, 4, 0, 144, 197, 4, 0, 16, 200, 4, 0, 144, 202, 4, 0, 16, 205, 4, 0, 144, 207, 4, 0, 16, 210, 4, 0, 144, 212, 4, 0, 16, 215, 4, 0, 144, 217, 4, 0, 16, 220, 4, 0, 144, 222, 4, 0, 16, 225, 4, 0, 144, 227, 4, 0, 16, 230, 4, 0, 144, 232, 4, 0, 16, 235, 4, 0, 144, 237, 4, 0, 16, 240, 4, 0, 144, 242, 4, 0, 16, 245, 4, 0, 144, 247, 4, 0, 16, 250, 4, 0, 144, 252, 4, 0, 16, 255, 4, 0, 144, 1, 5, 0, 16, 4, 5, 0, 144, 6, 5, 0, 16, 9, 5, 0, 144, 11, 5, 0, 16, 14, 5, 0, 144, 16, 5, 0, 16, 19, 5, 0, 144, 21, 5, 0, 16, 24, 5, 0, 144, 26, 5, 0, 16, 29, 5, 0, 144, 31, 5, 0, 16, 34, 5, 0, 144, 36, 5, 0, 16, 39, 5, 0, 144, 41, 5, 0, 16, 44, 5, 0, 144, 46, 5, 0, 16, 49, 5, 0, 144, 51, 5, 0, 16, 54, 5, 0, 144, 56, 5, 0, 16, 59, 5, 0, 144, 61, 5, 0, 16, 64, 5, 0, 144, 66, 5, 0, 16, 69, 5, 0, 144, 71, 5, 0, 16, 74, 5, 0, 144, 76, 5, 0, 16, 79, 5, 0, 144, 81, 5, 0, 16, 84, 5, 0, 144, 86, 5, 0, 16, 89, 5, 0, 144, 91, 5, 0, 16, 94, 5, 0, 144, 96, 5, 0, 16, 99, 5, 0, 144, 101, 5, 0, 16, 104, 5, 0, 144, 106, 5, 0, 16, 109, 5, 0, 144, 111, 5, 0, 16, 114, 5, 0, 144, 116, 5, 0, 16, 119, 5, 0, 144, 121, 5, 0, 16, 124, 5, 0, 144, 126, 5, 0, 16, 129, 5, 0, 144, 131, 5, 0, 16, 134, 5, 0, 144, 136, 5, 0, 16, 139, 5, 0, 144, 141, 5, 0, 16, 144, 5, 0, 144, 146, 5, 0, 16, 149, 5, 0, 144, 151, 5, 0, 16, 154, 5, 0, 144, 156, 5, 0, 16, 159, 5, 0, 144, 161, 5, 0, 16, 164, 5, 0, 144, 166, 5, 0, 16, 169, 5, 0, 144, 171, 5, 0, 16, 174, 5, 0, 144, 176, 5, 0, 16, 179, 5, 0, 144, 181, 5, 0, 16, 184, 5, 0, 144, 186, 5, 0, 16, 189, 5, 0, 144, 191, 5, 0, 16, 194, 5, 0, 144, 196, 5, 0, 16, 199, 5, 0, 144, 201, 5, 0, 16, 204, 5, 0, 144, 206, 5, 0, 16, 209, 5, 0, 144, 211, 5, 0, 16, 214, 5, 0, 144, 216, 5, 0, 16, 219, 5, 0, 144, 221, 5, 0, 16, 224, 5, 0, 144, 226, 5, 0, 16, 229, 5, 0, 144, 231, 5, 0, 16, 234, 5, 0, 144, 236, 5, 0, 16, 239, 5, 0, 144, 241, 5, 0, 16, 244, 5, 0, 144, 246, 5, 0, 16, 249, 5, 0, 144, 251, 5, 0, 16, 254, 5, 0, 144, 0, 6, 0, 16, 3, 6, 0, 144, 5, 6, 0, 16, 8, 6, 0, 144, 10, 6, 0, 16, 13, 6, 0, 144, 15, 6, 0, 16, 18, 6, 0, 144, 20, 6, 0, 16, 23, 6, 0, 144, 25, 6, 0, 16, 28, 6, 0, 144, 30, 6, 0, 16, 33, 6, 0, 144, 35, 6, 0, 16, 38, 6, 0, 144, 40, 6, 0, 16, 43, 6, 0, 144, 45, 6, 0, 16, 48, 6, 0, 144, 50, 6, 0, 16, 53, 6, 0, 144, 55, 6, 0, 16, 58, 6, 0, 144, 60, 6, 0, 16, 63, 6, 0, 144, 65, 6, 0, 16, 68, 6, 0, 144, 70, 6, 0, 16, 73, 6, 0, 144, 75, 6, 0, 16, 78, 6, 0, 144, 80, 6, 0, 16, 83, 6, 0, 144, 85, 6, 0, 16, 88, 6, 0, 144, 90, 6, 0, 16, 93, 6, 0, 144, 95, 6, 0, 16, 98, 6, 0, 144, 100, 6, 0, 16, 103, 6, 0, 144, 105, 6, 0, 16, 108, 6, 0, 144, 110, 6, 0, 16, 113, 6, 0, 144, 115, 6, 0, 16, 118, 6, 0, 144, 120, 6, 0, 16, 123, 6, 0, 144, 125, 6, 0, 16, 128, 6, 0, 144, 130, 6, 0, 16, 133, 6, 0, 144, 135, 6, 0, 16, 138, 6, 0, 144, 140, 6, 0, 16, 143, 6, 0, 144, 145, 6, 0, 16, 148, 6, 0, 144, 150, 6, 0, 16, 153, 6, 0, 144, 155, 6, 0, 16, 158, 6, 0, 144, 160, 6, 0, 16, 163, 6, 0, 144, 165, 6, 0, 16, 168, 6, 0, 144, 170, 6, 0, 16, 173, 6, 0, 144, 175, 6, 0, 16, 178, 6, 0, 144, 180, 6, 0, 16, 183, 6, 0, 144, 185, 6, 0, 16, 188, 6, 0, 144, 190, 6, 0, 16, 193, 6, 0, 144, 195, 6, 0, 16, 198, 6, 0, 144, 200, 6, 0, 16, 203, 6, 0, 144, 205, 6, 0, 16, 208, 6, 0, 144, 210, 6, 0, 16, 213, 6, 0, 144, 215, 6, 0, 16, 218, 6, 0, 144, 220, 6, 0, 16, 223, 6, 0, 144, 225, 6, 0, 16, 228, 6, 0, 144, 230, 6, 0, 16, 233, 6, 0, 144, 235, 6, 0, 16, 238, 6, 0, 144, 240, 6, 0, 16, 243, 6, 0, 144, 245, 6, 0, 16, 248, 6, 0, 144, 250, 6, 0, 16, 253, 6, 0, 144, 255, 6, 0, 16, 2, 7, 0, 144, 4, 7, 0, 16, 7, 7, 0, 144, 9, 7, 0, 16, 12, 7, 0, 144, 14, 7, 0, 16, 17, 7, 0, 144, 19, 7, 0, 16, 22, 7, 0, 144, 24, 7, 0, 16, 27, 7, 0, 144, 29, 7, 0, 16, 32, 7, 0, 144, 34, 7, 0, 16, 37, 7, 0, 144, 39, 7, 0, 16, 42, 7, 0, 144, 44, 7, 0, 16, 47, 7, 0, 144, 49, 7, 0, 16, 52, 7, 0, 144, 54, 7, 0, 16, 57, 7, 0, 144, 59, 7, 0, 16, 62, 7, 0, 144, 64, 7, 0, 16, 67, 7, 0, 144, 69, 7, 0, 16, 72, 7, 0, 144, 74, 7, 0, 16, 77, 7, 0, 144, 79, 7, 0, 16, 82, 7, 0, 144, 84, 7, 0, 16, 87, 7, 0, 144, 89, 7, 0, 16, 92, 7, 0, 144, 94, 7, 0, 16, 97, 7, 0, 144, 99, 7, 0, 16, 102, 7, 0, 144, 104, 7, 0, 16, 107, 7, 0, 144, 109, 7, 0, 16, 112, 7, 0, 144, 114, 7, 0, 16, 117, 7, 0, 144, 119, 7, 0, 16, 122, 7, 0, 144, 124, 7, 0, 16, 127, 7, 0, 144, 129, 7, 0, 16, 132, 7, 0, 144, 134, 7, 0, 16, 137, 7, 0, 144, 139, 7, 0, 16, 142, 7, 0, 144, 144, 7, 0, 16, 147, 7, 0, 144, 149, 7, 0, 16, 152, 7, 0, 144, 154, 7, 0, 16, 157, 7, 0, 144, 159, 7, 0, 16, 162, 7, 0, 144, 164, 7, 0, 16, 167, 7, 0, 144, 169, 7, 0, 16, 172, 7, 0, 144, 174, 7, 0, 16, 177, 7, 0, 144, 179, 7, 0, 16, 182, 7, 0, 144, 184, 7, 0, 16, 187, 7, 0, 144, 189, 7, 0, 16, 192, 7, 0, 144, 194, 7, 0, 16, 197, 7, 0, 144, 199, 7, 0, 16, 202, 7, 0, 144, 204, 7, 0, 16, 207, 7, 0, 144, 209, 7, 0, 16, 212, 7, 0, 144, 214, 7, 0, 16, 217, 7, 0, 144, 219, 7, 0, 16, 222, 7, 0, 144, 224, 7, 0, 16, 227, 7, 0, 144, 229, 7, 0, 16, 232, 7, 0, 144, 234, 7, 0, 16, 237, 7, 0, 144, 239, 7, 0, 16, 242, 7, 0, 144, 244, 7, 0, 16, 247, 7, 0, 144, 249, 7, 0, 16, 252, 7, 0, 144, 254, 7, 0, 16, 1, 8, 0, 144, 3, 8, 0, 16, 6, 8, 0, 144, 8, 8, 0, 16, 11, 8, 0, 144, 13, 8, 0, 16, 16, 8, 0, 144, 18, 8, 0, 16, 21, 8, 0, 144, 23, 8, 0, 16, 26, 8, 0, 144, 28, 8, 0, 16, 31, 8, 0, 144, 33, 8, 0, 16, 36, 8, 0, 144, 38, 8, 0, 16, 41, 8, 0, 144, 43, 8, 0, 16, 46, 8, 0, 144, 48, 8, 0, 16, 51, 8, 0, 144, 53, 8, 0, 16, 56, 8, 0, 144, 58, 8, 0, 16, 61, 8, 0, 144, 63, 8, 0, 16, 66, 8, 0, 144, 68, 8, 0, 16, 71, 8, 0, 144, 73, 8, 0, 16, 76, 8, 0, 144, 78, 8, 0, 16, 81, 8, 0, 144, 83, 8, 0, 16, 86, 8, 0, 144, 88, 8, 0, 16, 91, 8, 0, 144, 93, 8, 0, 16, 96, 8, 0, 144, 98, 8, 0, 16, 101, 8, 0, 144, 103, 8, 0, 16, 106, 8, 0, 144, 108, 8, 0, 16, 111, 8, 0, 144, 113, 8, 0, 16, 116, 8, 0, 144, 118, 8, 0, 16, 121, 8, 0, 144, 123, 8, 0, 16, 126, 8, 0, 144, 128, 8, 0, 16, 131, 8, 0, 144, 133, 8, 0, 16, 136, 8, 0, 144, 138, 8, 0, 16, 141, 8, 0, 144, 143, 8, 0, 16, 146, 8, 0, 144, 148, 8, 0, 16, 151, 8, 0, 144, 153, 8, 0, 16, 156, 8, 0, 144, 158, 8, 0, 16, 161, 8, 0, 144, 163, 8, 0, 16, 166, 8, 0, 144, 168, 8, 0, 16, 171, 8, 0, 144, 173, 8, 0, 16, 176, 8, 0, 144, 178, 8, 0, 16, 181, 8, 0, 144, 183, 8, 0, 16, 186, 8, 0, 144, 188, 8, 0, 16, 191, 8, 0, 144, 193, 8, 0, 16, 196, 8, 0, 144, 198, 8, 0, 16, 201, 8, 0, 144, 203, 8, 0, 16, 206, 8, 0, 144, 208, 8, 0, 16, 211, 8, 0, 144, 213, 8, 0, 16, 216, 8, 0, 144, 218, 8, 0, 16, 221, 8, 0, 144, 223, 8, 0, 16, 226, 8, 0, 144, 228, 8, 0, 16, 231, 8, 0, 144, 233, 8, 0, 16, 236, 8, 0, 144, 238, 8, 0, 16, 241, 8, 0, 144, 243, 8, 0, 16, 246, 8, 0, 144, 248, 8, 0, 16, 251, 8, 0, 144, 253, 8, 0, 16, 0, 9, 0, 144, 2, 9, 0, 16, 5, 9, 0, 144, 7, 9, 0, 16, 10, 9, 0, 144, 12, 9, 0, 16, 15, 9, 0, 144, 17, 9, 0, 16, 20, 9, 0, 144, 22, 9, 0, 16, 25, 9, 0, 144, 27, 9, 0, 16, 30, 9, 0, 144, 32, 9, 0, 16, 35, 9, 0, 144, 37, 9, 0, 16, 40, 9, 0, 144, 42, 9, 0, 16, 45, 9, 0, 144, 47, 9, 0, 16, 50, 9, 0, 144, 52, 9, 0, 16, 55, 9, 0, 144, 57, 9, 0, 16, 60, 9, 0, 144, 62, 9, 0, 16, 65, 9, 0, 144, 67, 9, 0, 16, 70, 9, 0, 144, 72, 9, 0, 16, 75, 9, 0, 144, 77, 9, 0, 16, 80, 9, 0, 144, 82, 9, 0, 16, 85, 9, 0, 144, 87, 9, 0, 16, 90, 9, 0, 144, 92, 9, 0, 16, 95, 9, 0, 144, 97, 9, 0, 16, 100, 9, 0, 144, 102, 9, 0, 16, 105, 9, 0, 144, 107, 9, 0, 16, 110, 9, 0, 144, 112, 9, 0, 16, 115, 9, 0, 144, 117, 9, 0, 16, 120, 9, 0, 144, 122, 9, 0, 16, 125, 9, 0, 144, 127, 9, 0, 16, 130, 9, 0, 144, 132, 9, 0, 16, 135, 9, 0, 144, 137, 9, 0, 16, 140, 9, 0, 144, 142, 9, 0, 16, 145, 9, 0, 144, 147, 9, 0, 16, 150, 9, 0, 144, 152, 9, 0, 16, 155, 9, 0, 144, 157, 9, 0, 16, 160, 9, 0, 144, 162, 9, 0, 16, 165, 9, 0, 144, 167, 9, 0, 16, 170, 9, 0, 144, 172, 9, 0, 16, 175, 9, 0, 144, 177, 9, 0, 16, 180, 9, 0, 144, 182, 9, 0, 16, 185, 9, 0, 144, 187, 9, 0, 16, 190, 9, 0, 144, 192, 9, 0, 16, 195, 9, 0, 144, 197, 9, 0, 16, 200, 9, 0, 144, 202, 9, 0, 16, 205, 9, 0, 144, 207, 9, 0, 16, 210, 9, 0, 144, 212, 9, 0, 16, 215, 9, 0, 144, 217, 9, 0, 16, 220, 9, 0, 144, 222, 9, 0, 16, 225, 9, 0, 144, 227, 9, 0, 16, 230, 9, 0, 144, 232, 9, 0, 16, 235, 9, 0, 144, 237, 9, 0, 16, 240, 9, 0, 144, 242, 9, 0, 16, 245, 9, 0, 144, 247, 9, 0, 16, 250, 9, 0, 144, 252, 9, 0, 16, 255, 9, 0, 144, 1, 10, 0, 16, 4, 10, 0, 144, 6, 10, 0, 16, 9, 10, 0, 144, 11, 10, 0, 16, 14, 10, 0, 144, 16, 10, 0, 16, 19, 10, 0, 144, 21, 10, 0, 16, 24, 10, 0, 144, 26, 10, 0, 16, 29, 10, 0, 144, 31, 10, 0, 16, 34, 10, 0, 144, 36, 10, 0, 16, 39, 10, 0, 144, 41, 10, 0, 16, 44, 10, 0, 144, 46, 10, 0, 16, 49, 10, 0, 144, 51, 10, 0, 16, 54, 10, 0, 144, 56, 10, 0, 16, 59, 10, 0, 144, 61, 10, 0, 16, 64, 10, 0, 144, 66, 10, 0, 16, 69, 10, 0, 144, 71, 10, 0, 16, 74, 10, 0, 144, 76, 10, 0, 16, 79, 10, 0, 144, 81, 10, 0, 16, 84, 10, 0, 144, 86, 10, 0, 16, 89, 10, 0, 144, 91, 10, 0, 16, 94, 10, 0, 144, 96, 10, 0, 16, 99, 10, 0, 144, 101, 10, 0, 16, 104, 10, 0, 144, 106, 10, 0, 16, 109, 10, 0, 144, 111, 10, 0, 16, 114, 10, 0, 144, 116, 10, 0, 16, 119, 10, 0, 144, 121, 10, 0, 16, 124, 10, 0, 144, 126, 10, 0, 16, 129, 10, 0, 144, 131, 10, 0, 16, 134, 10, 0, 144, 136, 10, 0, 16, 139, 10, 0, 144, 141, 10, 0, 16, 144, 10, 0, 144, 146, 10, 0, 16, 149, 10, 0, 144, 151, 10, 0, 16, 154, 10, 0, 144, 156, 10, 0, 16, 159, 10, 0, 144, 161, 10, 0, 16, 164, 10, 0, 144, 166, 10, 0, 16, 169, 10, 0, 144, 171, 10, 0, 16, 174, 10, 0, 144, 176, 10, 0, 16, 179, 10, 0, 144, 181, 10, 0, 16, 184, 10, 0, 144, 186, 10, 0, 16, 189, 10, 0, 144, 191, 10, 0, 16, 194, 10, 0, 144, 196, 10, 0, 16, 199, 10, 0, 144, 201, 10, 0, 16, 204, 10, 0, 144, 206, 10, 0, 16, 209, 10, 0, 144, 211, 10, 0, 16, 214, 10, 0, 144, 216, 10, 0, 16, 219, 10, 0, 144, 221, 10, 0, 16, 224, 10, 0, 144, 226, 10, 0, 16, 229, 10, 0, 144, 231, 10, 0, 16, 234, 10, 0, 144, 236, 10, 0, 16, 239, 10, 0, 144, 241, 10, 0, 16, 244, 10, 0, 144, 246, 10, 0, 16, 249, 10, 0, 144, 251, 10, 0, 16, 254, 10, 0, 144, 0, 11, 0, 16, 3, 11, 0, 144, 5, 11, 0, 16, 8, 11, 0, 144, 10, 11, 0, 16, 13, 11, 0, 144, 15, 11, 0, 16, 18, 11, 0, 144, 20, 11, 0, 16, 23, 11, 0, 144, 25, 11, 0, 16, 28, 11, 0, 144, 30, 11, 0, 16, 33, 11, 0, 144, 35, 11, 0, 16, 38, 11, 0, 144, 40, 11, 0, 16, 43, 11, 0, 144, 45, 11, 0, 16, 48, 11, 0, 144, 50, 11, 0, 16, 53, 11, 0, 144, 55, 11, 0, 16, 58, 11, 0, 144, 60, 11, 0, 16, 63, 11, 0, 144, 65, 11, 0, 16, 68, 11, 0, 144, 70, 11, 0, 16, 73, 11, 0, 144, 75, 11, 0, 16, 78, 11, 0, 144, 80, 11, 0, 16, 83, 11, 0, 144, 85, 11, 0, 16, 88, 11, 0, 144, 90, 11, 0, 16, 93, 11, 0, 144, 95, 11, 0, 16, 98, 11, 0, 144, 100, 11, 0, 16, 103, 11, 0, 144, 105, 11, 0, 16, 108, 11, 0, 144, 110, 11, 0, 16, 113, 11, 0, 144, 115, 11, 0, 16, 118, 11, 0, 144, 120, 11, 0, 16, 123, 11, 0, 144, 125, 11, 0, 16, 128, 11, 0, 144, 130, 11, 0, 16, 133, 11, 0, 144, 135, 11, 0, 16, 138, 11, 0, 144, 140, 11, 0, 16, 143, 11, 0, 144, 145, 11, 0, 16, 148, 11, 0, 144, 150, 11, 0, 16, 153, 11, 0, 144, 155, 11, 0, 16, 158, 11, 0, 144, 160, 11, 0, 16, 163, 11, 0, 144, 165, 11, 0, 16, 168, 11, 0, 144, 170, 11, 0, 16, 173, 11, 0, 144, 175, 11, 0, 16, 178, 11, 0, 144, 180, 11, 0, 16, 183, 11, 0, 144, 185, 11, 0, 16, 188, 11, 0, 144, 190, 11, 0, 16, 193, 11, 0, 144, 195, 11, 0, 16, 198, 11, 0, 144, 200, 11, 0, 16, 203, 11, 0, 144, 205, 11, 0, 16, 208, 11, 0, 144, 210, 11, 0, 16, 213, 11, 0, 144, 215, 11, 0, 16, 218, 11, 0, 144, 220, 11, 0, 16, 223, 11, 0, 144, 225, 11, 0, 16, 228, 11, 0, 144, 230, 11, 0, 16, 233, 11, 0, 144, 235, 11, 0, 16, 238, 11, 0, 144, 240, 11, 0, 16, 243, 11, 0, 144, 245, 11, 0, 16, 248, 11, 0, 144, 250, 11, 0, 16, 253, 11, 0, 144, 255, 11, 0, 16, 2, 12, 0, 144, 4, 12, 0, 16, 7, 12, 0, 144, 9, 12, 0, 16, 12, 12, 0, 144, 14, 12, 0, 16, 17, 12, 0, 144, 19, 12, 0, 16, 22, 12, 0, 144, 24, 12, 0, 16, 27, 12, 0, 144, 29, 12, 0, 16, 32, 12, 0, 144, 34, 12, 0, 16, 37, 12, 0, 144, 39, 12, 0, 16, 42, 12, 0, 144, 44, 12, 0, 16, 47, 12, 0, 144, 49, 12, 0, 16, 52, 12, 0, 144, 54, 12, 0, 16, 57, 12, 0, 144, 59, 12, 0, 16, 62, 12, 0, 144, 64, 12, 0, 16, 67, 12, 0, 144, 69, 12, 0, 16, 72, 12, 0, 144, 74, 12, 0, 16, 77, 12, 0, 144, 79, 12, 0, 16, 82, 12, 0, 144, 84, 12, 0, 16, 87, 12, 0, 144, 89, 12, 0, 16, 92, 12, 0, 144, 94, 12, 0, 16, 97, 12, 0, 144, 99, 12, 0, 16, 102, 12, 0, 144, 104, 12, 0, 16, 107, 12, 0, 144, 109, 12, 0, 16, 112, 12, 0, 144, 114, 12, 0, 16, 117, 12, 0, 144, 119, 12, 0, 16, 122, 12, 0, 144, 124, 12, 0, 16, 127, 12, 0, 144, 129, 12, 0, 16, 132, 12, 0, 144, 134, 12, 0, 16, 137, 12, 0, 144, 139, 12, 0, 16, 142, 12, 0, 144, 144, 12, 0, 16, 147, 12, 0, 144, 149, 12, 0, 16, 152, 12, 0, 144, 154, 12, 0, 16, 157, 12, 0, 144, 159, 12, 0, 16, 162, 12, 0, 144, 164, 12, 0, 16, 167, 12, 0, 144, 169, 12, 0, 16, 172, 12, 0, 144, 174, 12, 0, 16, 177, 12, 0, 144, 179, 12, 0, 16, 182, 12, 0, 144, 184, 12, 0, 16, 187, 12, 0, 144, 189, 12, 0, 16, 192, 12, 0, 144, 194, 12, 0, 16, 197, 12, 0, 144, 199, 12, 0, 16, 202, 12, 0, 144, 204, 12, 0, 16, 207, 12, 0, 144, 209, 12, 0, 16, 212, 12, 0, 144, 214, 12, 0, 16, 217, 12, 0, 144, 219, 12, 0, 16, 222, 12, 0, 144, 224, 12, 0, 16, 227, 12, 0, 144, 229, 12, 0, 16, 232, 12, 0, 144, 234, 12, 0, 16, 237, 12, 0, 144, 239, 12, 0, 16, 242, 12, 0, 144, 244, 12, 0, 16, 247, 12, 0, 144, 249, 12, 0, 16, 252, 12, 0, 144, 254, 12, 0, 16, 1, 13, 0, 144, 3, 13, 0, 16, 6, 13, 0, 144, 8, 13, 0, 16, 11, 13, 0, 144, 13, 13, 0, 16, 16, 13, 0, 144, 18, 13, 0, 16, 21, 13, 0, 144, 23, 13, 0, 16, 26, 13, 0, 144, 28, 13, 0, 16, 31, 13, 0, 144, 33, 13, 0, 16, 36, 13, 0, 144, 38, 13, 0, 16, 41, 13, 0, 144, 43, 13, 0, 16, 46, 13, 0, 144, 48, 13, 0, 16, 51, 13, 0, 144, 53, 13, 0, 16, 56, 13, 0, 144, 58, 13, 0, 16, 61, 13, 0, 144, 63, 13, 0, 16, 66, 13, 0, 144, 68, 13, 0, 16, 71, 13, 0, 144, 73, 13, 0, 16, 76, 13, 0, 144, 78, 13, 0, 16, 81, 13, 0, 144, 83, 13, 0, 16, 86, 13, 0, 144, 88, 13, 0, 16, 91, 13, 0, 144, 93, 13, 0, 16, 96, 13, 0, 144, 98, 13, 0, 16, 101, 13, 0, 144, 103, 13, 0, 16, 106, 13, 0, 144, 108, 13, 0, 16, 111, 13, 0, 144, 113, 13, 0, 16, 116, 13, 0, 144, 118, 13, 0, 16, 121, 13, 0, 144, 123, 13, 0, 16, 126, 13, 0, 144, 128, 13, 0, 16, 131, 13, 0, 144, 133, 13, 0, 16, 136, 13, 0, 144, 138, 13, 0, 16, 141, 13, 0, 144, 143, 13, 0, 16, 146, 13, 0, 144, 148, 13, 0, 16, 151, 13, 0, 144, 153, 13, 0, 16, 156, 13, 0, 144, 158, 13, 0, 16, 161, 13, 0, 144, 163, 13, 0, 16, 166, 13, 0, 144, 168, 13, 0, 16, 171, 13, 0, 144, 173, 13, 0, 16, 176, 13, 0, 144, 178, 13, 0, 16, 181, 13, 0, 144, 183, 13, 0, 16, 186, 13, 0, 144, 188, 13, 0, 16, 191, 13, 0, 144, 193, 13, 0, 16, 196, 13, 0, 144, 198, 13, 0, 16, 201, 13, 0, 144, 203, 13, 0, 16, 206, 13, 0, 144, 208, 13, 0, 16, 211, 13, 0, 144, 213, 13, 0, 16, 216, 13, 0, 144, 218, 13, 0, 16, 221, 13, 0, 144, 223, 13, 0, 16, 226, 13, 0, 144, 228, 13, 0, 16, 231, 13, 0, 144, 233, 13, 0, 16, 236, 13, 0, 144, 238, 13, 0, 16, 241, 13, 0, 144, 243, 13, 0, 16, 246, 13, 0, 144, 248, 13, 0, 16, 251, 13, 0, 144, 253, 13, 0, 16, 0, 14, 0, 144, 2, 14, 0, 16, 5, 14, 0, 144, 7, 14, 0, 16, 10, 14, 0, 144, 12, 14, 0, 16, 15, 14, 0, 144, 17, 14, 0, 16, 20, 14, 0, 144, 22, 14, 0, 16, 25, 14, 0, 144, 27, 14, 0, 16, 30, 14, 0, 144, 32, 14, 0, 16, 35, 14, 0, 144, 37, 14, 0, 16, 40, 14, 0, 144, 42, 14, 0, 16, 45, 14, 0, 144, 47, 14, 0, 16, 50, 14, 0, 144, 52, 14, 0, 16, 55, 14, 0, 144, 57, 14, 0, 16, 60, 14, 0, 144, 62, 14, 0, 16, 65, 14, 0, 144, 67, 14, 0, 16, 70, 14, 0, 144, 72, 14, 0, 16, 75, 14, 0, 144, 77, 14, 0, 16, 80, 14, 0, 144, 82, 14, 0, 16, 85, 14, 0, 144, 87, 14, 0, 16, 90, 14, 0, 144, 92, 14, 0, 16, 95, 14, 0, 144, 97, 14, 0, 16, 100, 14, 0, 144, 102, 14, 0, 16, 105, 14, 0, 144, 107, 14, 0, 16, 110, 14, 0, 144, 112, 14, 0, 16, 115, 14, 0, 144, 117, 14, 0, 16, 120, 14, 0, 144, 122, 14, 0, 16, 125, 14, 0, 144, 127, 14, 0, 16, 130, 14, 0, 144, 132, 14, 0, 16, 135, 14, 0, 144, 137, 14, 0, 16, 140, 14, 0, 144, 142, 14, 0, 16, 145, 14, 0, 144, 147, 14, 0, 16, 150, 14, 0, 144, 152, 14, 0, 16, 155, 14, 0, 144, 157, 14, 0, 16, 160, 14, 0, 144, 162, 14, 0, 16, 165, 14, 0, 144, 167, 14, 0, 16, 170, 14, 0, 144, 172, 14, 0, 16, 175, 14, 0, 144, 177, 14, 0, 16, 180, 14, 0, 144, 182, 14, 0, 16, 185, 14, 0, 144, 187, 14, 0, 16, 190, 14, 0, 144, 192, 14, 0, 16, 195, 14, 0, 144, 197, 14, 0, 16, 200, 14, 0, 144, 202, 14, 0, 16, 205, 14, 0, 144, 207, 14, 0, 16, 210, 14, 0, 144, 212, 14, 0, 16, 215, 14, 0, 144, 217, 14, 0, 16, 220, 14, 0, 144, 222, 14, 0, 16, 225, 14, 0, 144, 227, 14, 0, 16, 230, 14, 0, 144, 232, 14, 0, 16, 235, 14, 0, 144, 237, 14, 0, 16, 240, 14, 0, 144, 242, 14, 0, 16, 245, 14, 0, 144, 247, 14, 0, 16, 250, 14, 0, 144, 252, 14, 0, 16, 255, 14, 0, 144, 1, 15, 0, 16, 4, 15, 0, 144, 6, 15, 0, 16, 9, 15, 0, 144, 11, 15, 0, 16, 14, 15, 0, 144, 16, 15, 0, 16, 19, 15, 0, 144, 21, 15, 0, 16, 24, 15, 0, 144, 26, 15, 0, 16, 29, 15, 0, 144, 31, 15, 0, 16, 34, 15, 0, 144, 36, 15, 0, 16, 39, 15, 0, 144, 41, 15, 0, 16, 44, 15, 0, 144, 46, 15, 0, 16, 49, 15, 0, 144, 51, 15, 0, 16, 54, 15, 0, 144, 56, 15, 0, 16, 59, 15, 0, 144, 61, 15, 0, 16, 64, 15, 0, 144, 66, 15, 0, 16, 69, 15, 0, 144, 71, 15, 0, 16, 74, 15, 0, 144, 76, 15, 0, 16, 79, 15, 0, 144, 81, 15, 0, 16, 84, 15, 0, 144, 86, 15, 0, 16, 89, 15, 0, 144, 91, 15, 0, 16, 94, 15, 0, 144, 96, 15, 0, 16, 99, 15, 0, 144, 101, 15, 0, 16, 104, 15, 0, 144, 106, 15, 0, 16, 109, 15, 0, 144, 111, 15, 0, 16, 114, 15, 0, 144, 116, 15, 0, 16, 119, 15, 0, 144, 121, 15, 0, 16, 124, 15, 0, 144, 126, 15, 0, 16, 129, 15, 0, 144, 131, 15, 0, 16, 134, 15, 0, 144, 136, 15, 0, 16, 139, 15, 0, 144, 141, 15, 0, 16, 144, 15, 0, 144, 146, 15, 0, 16, 149, 15, 0, 144, 151, 15, 0, 16, 154, 15, 0, 144, 156, 15, 0, 16, 159, 15, 0, 144, 161, 15, 0, 16, 164, 15, 0, 144, 166, 15, 0, 16, 169, 15, 0, 144, 171, 15, 0, 16, 174, 15, 0, 144, 176, 15, 0, 16, 179, 15, 0, 144, 181, 15, 0, 16, 184, 15, 0, 144, 186, 15, 0, 16, 189, 15, 0, 144, 191, 15, 0, 16, 194, 15, 0, 144, 196, 15, 0, 16, 199, 15, 0, 144, 201, 15, 0, 16, 204, 15, 0, 144, 206, 15, 0, 16, 209, 15, 0, 144, 211, 15, 0, 16, 214, 15, 0, 144, 216, 15, 0, 16, 219, 15, 0, 144, 221, 15, 0, 16, 224, 15, 0, 144, 226, 15, 0, 16, 229, 15, 0, 144, 231, 15, 0, 16, 234, 15, 0, 144, 236, 15, 0, 16, 239, 15, 0, 144, 241, 15, 0, 16, 244, 15, 0, 144, 246, 15, 0, 16, 249, 15, 0, 144, 251, 15, 0, 16, 254, 15, 0, 144, 0, 16, 0, 16, 3, 16, 0, 144, 5, 16, 0, 16, 8, 16, 0, 144, 10, 16, 0, 16, 13, 16, 0, 144, 15, 16, 0, 16, 18, 16, 0, 144, 20, 16, 0, 16, 23, 16, 0, 144, 25, 16, 0, 16, 28, 16, 0, 144, 30, 16, 0, 16, 33, 16, 0, 144, 35, 16, 0, 16, 38, 16, 0, 144, 40, 16, 0, 16, 43, 16, 0, 144, 45, 16, 0, 16, 48, 16, 0, 144, 50, 16, 0, 16, 53, 16, 0, 144, 55, 16, 0, 16, 58, 16, 0, 144, 60, 16, 0, 16, 63, 16, 0, 144, 65, 16, 0, 16, 68, 16, 0, 144, 70, 16, 0, 16, 73, 16, 0, 144, 75, 16, 0, 16, 78, 16, 0, 144, 80, 16, 0, 16, 83, 16, 0, 144, 85, 16, 0, 16, 88, 16, 0, 144, 90, 16, 0, 16, 93, 16, 0, 144, 95, 16, 0, 16, 98, 16, 0, 144, 100, 16, 0, 16, 103, 16, 0, 144, 105, 16, 0, 16, 108, 16, 0, 144, 110, 16, 0, 16, 113, 16, 0, 144, 115, 16, 0, 16, 118, 16, 0, 144, 120, 16, 0, 16, 123, 16, 0, 144, 125, 16, 0, 16, 128, 16, 0, 144, 130, 16, 0, 16, 133, 16, 0, 144, 135, 16, 0, 16, 138, 16, 0, 144, 140, 16, 0, 16, 143, 16, 0, 144, 145, 16, 0, 16, 148, 16, 0, 144, 150, 16, 0, 16, 153, 16, 0, 144, 155, 16, 0, 16, 158, 16, 0, 144, 160, 16, 0, 16, 163, 16, 0, 144, 165, 16, 0, 16, 168, 16, 0, 144, 170, 16, 0, 16, 173, 16, 0, 144, 175, 16, 0, 16, 178, 16, 0, 144, 180, 16, 0, 16, 183, 16, 0, 144, 185, 16, 0, 16, 188, 16, 0, 144, 190, 16, 0, 16, 193, 16, 0, 144, 195, 16, 0, 16, 198, 16, 0, 144, 200, 16, 0, 16, 203, 16, 0, 144, 205, 16, 0, 16, 208, 16, 0, 144, 210, 16, 0, 16, 213, 16, 0, 144, 215, 16, 0, 16, 218, 16, 0, 144, 220, 16, 0, 16, 223, 16, 0, 144, 225, 16, 0, 16, 228, 16, 0, 144, 230, 16, 0, 16, 233, 16, 0, 144, 235, 16, 0, 16, 238, 16, 0, 144, 240, 16, 0, 16, 243, 16, 0, 144, 245, 16, 0, 16, 248, 16, 0, 144, 250, 16, 0, 16, 253, 16, 0, 144, 255, 16, 0, 16, 2, 17, 0, 144, 4, 17, 0, 16, 7, 17, 0, 144, 9, 17, 0, 16, 12, 17, 0, 144, 14, 17, 0, 16, 17, 17, 0, 144, 19, 17, 0, 16, 22, 17, 0, 144, 24, 17, 0, 16, 27, 17, 0, 144, 29, 17, 0, 16, 32, 17, 0, 144, 34, 17, 0, 16, 37, 17, 0, 144, 39, 17, 0, 16, 42, 17, 0, 144, 44, 17, 0, 16, 47, 17, 0, 144, 49, 17, 0, 16, 52, 17, 0, 144, 54, 17, 0, 16, 57, 17, 0, 144, 59, 17, 0, 16, 62, 17, 0, 144, 64, 17, 0, 16, 67, 17, 0, 144, 69, 17, 0, 16, 72, 17, 0, 144, 74, 17, 0, 16, 77, 17, 0, 144, 79, 17, 0, 16, 82, 17, 0, 144, 84, 17, 0, 16, 87, 17, 0, 144, 89, 17, 0, 16, 92, 17, 0, 144, 94, 17, 0, 16, 97, 17, 0, 144, 99, 17, 0, 16, 102, 17, 0, 144, 104, 17, 0, 16, 107, 17, 0, 144, 109, 17, 0, 16, 112, 17, 0, 144, 114, 17, 0, 16, 117, 17, 0, 144, 119, 17, 0, 16, 122, 17, 0, 144, 124, 17, 0, 16, 127, 17, 0, 144, 129, 17, 0, 16, 132, 17, 0, 144, 134, 17, 0, 16, 137, 17, 0, 144, 139, 17, 0, 16, 142, 17, 0, 144, 144, 17, 0, 16, 147, 17, 0, 144, 149, 17, 0, 16, 152, 17, 0, 144, 154, 17, 0, 16, 157, 17, 0, 144, 159, 17, 0, 16, 162, 17, 0, 144, 164, 17, 0, 16, 167, 17, 0, 144, 169, 17, 0, 16, 172, 17, 0, 144, 174, 17, 0, 16, 177, 17, 0, 144, 179, 17, 0, 16, 182, 17, 0, 144, 184, 17, 0, 16, 187, 17, 0, 144, 189, 17, 0, 16, 192, 17, 0, 144, 194, 17, 0, 16, 197, 17, 0, 144, 199, 17, 0, 16, 202, 17, 0, 144, 204, 17, 0, 16, 207, 17, 0, 144, 209, 17, 0, 16, 212, 17, 0, 144, 214, 17, 0, 16, 217, 17, 0, 144, 219, 17, 0, 16, 222, 17, 0, 144, 224, 17, 0, 16, 227, 17, 0, 144, 229, 17, 0, 16, 232, 17, 0, 144, 234, 17, 0, 16, 237, 17, 0, 144, 239, 17, 0, 16, 242, 17, 0, 144, 244, 17, 0, 16, 247, 17, 0, 144, 249, 17, 0, 16, 252, 17, 0, 144, 254, 17, 0, 16, 1, 18, 0, 144, 3, 18, 0, 16, 6, 18, 0, 144, 8, 18, 0, 16, 11, 18, 0, 144, 13, 18, 0, 16, 16, 18, 0, 144, 18, 18, 0, 16, 21, 18, 0, 144, 23, 18, 0, 16, 26, 18, 0, 144, 28, 18, 0, 16, 31, 18, 0, 144, 33, 18, 0, 16, 36, 18, 0, 144, 38, 18, 0, 16, 41, 18, 0, 144, 43, 18, 0, 16, 46, 18, 0, 144, 48, 18, 0, 16, 51, 18, 0, 144, 53, 18, 0, 16, 56, 18, 0, 144, 58, 18, 0, 16, 61, 18, 0, 144, 63, 18, 0, 16, 66, 18, 0, 144, 68, 18, 0, 16, 71, 18, 0, 144, 73, 18, 0, 16, 76, 18, 0, 144, 78, 18, 0, 16, 81, 18, 0, 144, 83, 18, 0, 16, 86, 18, 0, 144, 88, 18, 0, 16, 91, 18, 0, 144, 93, 18, 0, 16, 96, 18, 0, 144, 98, 18, 0, 16, 101, 18, 0, 144, 103, 18, 0, 16, 106, 18, 0, 144, 108, 18, 0, 16, 111, 18, 0, 144, 113, 18, 0, 16, 116, 18, 0, 144, 118, 18, 0, 16, 121, 18, 0, 144, 123, 18, 0, 16, 126, 18, 0, 144, 128, 18, 0, 16, 131, 18, 0, 144, 133, 18, 0, 16, 136, 18, 0, 144, 138, 18, 0, 16, 141, 18, 0, 144, 143, 18, 0, 16, 146, 18, 0, 144, 148, 18, 0, 16, 151, 18, 0, 144, 153, 18, 0, 16, 156, 18, 0, 144, 158, 18, 0, 16, 161, 18, 0, 144, 163, 18, 0, 16, 166, 18, 0, 144, 168, 18, 0, 16, 171, 18, 0, 144, 173, 18, 0, 16, 176, 18, 0, 144, 178, 18, 0, 16, 181, 18, 0, 144, 183, 18, 0, 16, 186, 18, 0, 144, 188, 18, 0, 16, 191, 18, 0, 144, 193, 18, 0, 16, 196, 18, 0, 144, 198, 18, 0, 16, 201, 18, 0, 144, 203, 18, 0, 16, 206, 18, 0, 144, 208, 18, 0, 16, 211, 18, 0, 144, 213, 18, 0, 16, 216, 18, 0, 144, 218, 18, 0, 16, 221, 18, 0, 144, 223, 18, 0, 16, 226, 18, 0, 144, 228, 18, 0, 16, 231, 18, 0, 144, 233, 18, 0, 16, 236, 18, 0, 144, 238, 18, 0, 16, 241, 18, 0, 144, 243, 18, 0, 16, 246, 18, 0, 144, 248, 18, 0, 16, 251, 18, 0, 144, 253, 18, 0, 16, 0, 19, 0, 144, 2, 19, 0, 16, 5, 19, 0, 144, 7, 19, 0, 16, 10, 19, 0, 144, 12, 19, 0, 16, 15, 19, 0, 144, 17, 19, 0, 16, 20, 19, 0, 144, 22, 19, 0, 16, 25, 19, 0, 144, 27, 19, 0, 16, 30, 19, 0, 144, 32, 19, 0, 16, 35, 19, 0, 144, 37, 19, 0, 16, 40, 19, 0, 144, 42, 19, 0, 16, 45, 19, 0, 144, 47, 19, 0, 16, 50, 19, 0, 144, 52, 19, 0, 16, 55, 19, 0, 144, 57, 19, 0, 16, 60, 19, 0, 144, 62, 19, 0, 16, 65, 19, 0, 144, 67, 19, 0, 16, 70, 19, 0, 144, 72, 19, 0, 16, 75, 19, 0, 144, 77, 19, 0, 16, 80, 19, 0, 144, 82, 19, 0, 16, 85, 19, 0, 144, 87, 19, 0, 16, 90, 19, 0, 144, 92, 19, 0, 16, 95, 19, 0, 144, 97, 19, 0, 16, 100, 19, 0, 144, 102, 19, 0, 16, 105, 19, 0, 144, 107, 19, 0, 16, 110, 19, 0, 144, 112, 19, 0, 16, 115, 19, 0, 144, 117, 19, 0, 16, 120, 19, 0, 144, 122, 19, 0, 16, 125, 19, 0, 144, 127, 19, 0, 16, 130, 19, 0, 144, 132, 19, 0, 16, 135, 19, 0, 144, 137, 19, 0, 16, 140, 19, 0, 144, 142, 19, 0, 16, 145, 19, 0, 144, 147, 19, 0, 16, 150, 19, 0, 144, 152, 19, 0, 16, 155, 19, 0, 144, 157, 19, 0, 16, 160, 19, 0, 144, 162, 19, 0, 16, 165, 19, 0, 144, 167, 19, 0, 16, 170, 19, 0, 144, 172, 19, 0, 16, 175, 19, 0, 144, 177, 19, 0, 16, 180, 19, 0, 144, 182, 19, 0, 16, 185, 19, 0, 144, 187, 19, 0, 16, 190, 19, 0, 144, 192, 19, 0, 16, 195, 19, 0, 144, 197, 19, 0, 16, 200, 19, 0, 144, 202, 19, 0, 16, 205, 19, 0, 144, 207, 19, 0, 16, 210, 19, 0, 144, 212, 19, 0, 16, 215, 19, 0, 144, 217, 19, 0, 16, 220, 19, 0, 144, 222, 19, 0, 16, 225, 19, 0, 144, 227, 19, 0, 16, 230, 19, 0, 144, 232, 19, 0, 16, 235, 19, 0, 144, 237, 19, 0, 16, 240, 19, 0, 144, 242, 19, 0, 16, 245, 19, 0, 144, 247, 19, 0, 16, 250, 19, 0, 144, 252, 19, 0, 16, 255, 19, 0, 144, 1, 20, 0, 16, 4, 20, 0, 144, 6, 20, 0, 16, 9, 20, 0, 144, 11, 20, 0, 16, 14, 20, 0, 144, 16, 20, 0, 16, 19, 20, 0, 144, 21, 20, 0, 16, 24, 20, 0, 144, 26, 20, 0, 16, 29, 20, 0, 144, 31, 20, 0, 16, 34, 20, 0, 144, 36, 20, 0, 16, 39, 20, 0, 144, 41, 20, 0, 16, 44, 20, 0, 144, 46, 20, 0, 16, 49, 20, 0, 144, 51, 20, 0, 16, 54, 20, 0, 144, 56, 20, 0, 16, 59, 20, 0, 144, 61, 20, 0, 16, 64, 20, 0, 144, 66, 20, 0, 16, 69, 20, 0, 144, 71, 20, 0, 16, 74, 20, 0, 144, 76, 20, 0, 16, 79, 20, 0, 144, 81, 20, 0, 16, 84, 20, 0, 144, 86, 20, 0, 16, 89, 20, 0, 144, 91, 20, 0, 16, 94, 20, 0, 144, 96, 20, 0, 16, 99, 20, 0, 144, 101, 20, 0, 16, 104, 20, 0, 144, 106, 20, 0, 16, 109, 20, 0, 144, 111, 20, 0, 16, 114, 20, 0, 144, 116, 20, 0, 16, 119, 20, 0, 144, 121, 20, 0, 16, 124, 20, 0, 144, 126, 20, 0, 16, 129, 20, 0, 144, 131, 20, 0, 16, 134, 20, 0, 144, 136, 20, 0, 16, 139, 20, 0, 144, 141, 20, 0, 16, 144, 20, 0, 144, 146, 20, 0, 16, 149, 20, 0, 144, 151, 20, 0, 16, 154, 20, 0, 144, 156, 20, 0, 16, 159, 20, 0, 144, 161, 20, 0, 16, 164, 20, 0, 144, 166, 20, 0, 16, 169, 20, 0, 144, 171, 20, 0, 16, 174, 20, 0, 144, 176, 20, 0, 16, 179, 20, 0, 144, 181, 20, 0, 16, 184, 20, 0, 144, 186, 20, 0, 16, 189, 20, 0, 144, 191, 20, 0, 16, 194, 20, 0, 144, 196, 20, 0, 16, 199, 20, 0, 144, 201, 20, 0, 16, 204, 20, 0, 144, 206, 20, 0, 16, 209, 20, 0, 144, 211, 20, 0, 16, 214, 20, 0, 144, 216, 20, 0, 16, 219, 20, 0, 144, 221, 20, 0, 16, 224, 20, 0, 144, 226, 20, 0, 16, 229, 20, 0, 144, 231, 20, 0, 16, 234, 20, 0, 144, 236, 20, 0, 16, 239, 20, 0, 144, 241, 20, 0, 16, 244, 20, 0, 144, 246, 20, 0, 16, 249, 20, 0, 144, 251, 20, 0, 16, 254, 20, 0, 144, 0, 21, 0, 16, 3, 21, 0, 144, 5, 21, 0, 16, 8, 21, 0, 144, 10, 21, 0, 16, 13, 21, 0, 144, 15, 21, 0, 16, 18, 21, 0, 144, 20, 21, 0, 16, 23, 21, 0, 144, 25, 21, 0, 16, 28, 21, 0, 144, 30, 21, 0, 16, 33, 21, 0, 144, 35, 21, 0, 16, 38, 21, 0, 144, 40, 21, 0, 16, 43, 21, 0, 144, 45, 21, 0, 16, 48, 21, 0, 144, 50, 21, 0, 16, 53, 21, 0, 144, 55, 21, 0, 16, 58, 21, 0, 144, 60, 21, 0, 16, 63, 21, 0, 144, 65, 21, 0, 16, 68, 21, 0, 144, 70, 21, 0, 16, 73, 21, 0, 144, 75, 21, 0, 16, 78, 21, 0, 144, 80, 21, 0, 16, 83, 21, 0, 144, 85, 21, 0, 16, 88, 21, 0, 144, 90, 21, 0, 16, 93, 21, 0, 144, 95, 21, 0, 16, 98, 21, 0, 144, 100, 21, 0, 16, 103, 21, 0, 144, 105, 21, 0, 16, 108, 21, 0, 144, 110, 21, 0, 16, 113, 21, 0, 144, 115, 21, 0, 16, 118, 21, 0, 144, 120, 21, 0, 16, 123, 21, 0, 144, 125, 21, 0, 16, 128, 21, 0, 144, 130, 21, 0, 16, 133, 21, 0, 144, 135, 21, 0, 16, 138, 21, 0, 144, 140, 21, 0, 16, 143, 21, 0, 144, 145, 21, 0, 16, 148, 21, 0, 144, 150, 21, 0, 16, 153, 21, 0, 144, 155, 21, 0, 16, 158, 21, 0, 144, 160, 21, 0, 16, 163, 21, 0, 144, 165, 21, 0, 16, 168, 21, 0, 144, 170, 21, 0, 16, 173, 21, 0, 144, 175, 21, 0, 16, 178, 21, 0, 144, 180, 21, 0, 16, 183, 21, 0, 144, 185, 21, 0, 16, 188, 21, 0, 144, 190, 21, 0, 16, 193, 21, 0, 144, 195, 21, 0, 16, 198, 21, 0, 144, 200, 21, 0, 16, 203, 21, 0, 144, 205, 21, 0, 16, 208, 21, 0, 144, 210, 21, 0, 16, 213, 21, 0, 144, 215, 21, 0, 16, 218, 21, 0, 144, 220, 21, 0, 16, 223, 21, 0, 144, 225, 21, 0, 16, 228, 21, 0, 144, 230, 21, 0, 16, 233, 21, 0, 144, 235, 21, 0, 16, 238, 21, 0, 144, 240, 21, 0, 16, 243, 21, 0, 144, 245, 21, 0, 16, 248, 21, 0, 144, 250, 21, 0, 16, 253, 21, 0, 144, 255, 21, 0, 16, 2, 22, 0, 144, 4, 22, 0, 16, 7, 22, 0, 144, 9, 22, 0, 16, 12, 22, 0, 144, 14, 22, 0, 16, 17, 22, 0, 144, 19, 22, 0, 16, 22, 22, 0, 144, 24, 22, 0, 16, 27, 22, 0, 144, 29, 22, 0, 16, 32, 22, 0, 144, 34, 22, 0, 16, 37, 22, 0, 144, 39, 22, 0, 16, 42, 22, 0, 144, 44, 22, 0, 16, 47, 22, 0, 144, 49, 22, 0, 16, 52, 22, 0, 144, 54, 22, 0, 16, 57, 22, 0, 144, 59, 22, 0, 16, 62, 22, 0, 144, 64, 22, 0, 16, 67, 22, 0, 144, 69, 22, 0, 16, 72, 22, 0, 144, 74, 22, 0, 16, 77, 22, 0, 144, 79, 22, 0, 16, 82, 22, 0, 144, 84, 22, 0, 16, 87, 22, 0, 144, 89, 22, 0, 16, 92, 22, 0, 144, 94, 22, 0, 16, 97, 22, 0, 144, 99, 22, 0, 16, 102, 22, 0, 144, 104, 22, 0, 16, 107, 22, 0, 144, 109, 22, 0, 16, 112, 22, 0, 144, 114, 22, 0, 16, 117, 22, 0, 144, 119, 22, 0, 16, 122, 22, 0, 144, 124, 22, 0, 16, 127, 22, 0, 144, 129, 22, 0, 16, 132, 22, 0, 144, 134, 22, 0, 16, 137, 22, 0, 144, 139, 22, 0, 16, 142, 22, 0, 144, 144, 22, 0, 16, 147, 22, 0, 144, 149, 22, 0, 16, 152, 22, 0, 144, 154, 22, 0, 16, 157, 22, 0, 144, 159, 22, 0, 16, 162, 22, 0, 144, 164, 22, 0, 16, 167, 22, 0, 144, 169, 22, 0, 16, 172, 22, 0, 144, 174, 22, 0, 16, 177, 22, 0, 144, 179, 22, 0, 16, 182, 22, 0, 144, 184, 22, 0, 16, 187, 22, 0, 144, 189, 22, 0, 16, 192, 22, 0, 144, 194, 22, 0, 16, 197, 22, 0, 144, 199, 22, 0, 16, 202, 22, 0, 144, 204, 22, 0, 16, 207, 22, 0, 144, 209, 22, 0, 16, 212, 22, 0, 144, 214, 22, 0, 16, 217, 22, 0, 144, 219, 22, 0, 16, 222, 22, 0, 144, 224, 22, 0, 16, 227, 22, 0, 144, 229, 22, 0, 16, 232, 22, 0, 144, 234, 22, 0, 16, 237, 22, 0, 144, 239, 22, 0, 16, 242, 22, 0, 144, 244, 22, 0, 16, 247, 22, 0, 144, 249, 22, 0, 16, 252, 22, 0, 144, 254, 22, 0, 16, 1, 23, 0, 144, 3, 23, 0, 16, 6, 23, 0, 144, 8, 23, 0, 16, 11, 23, 0, 144, 13, 23, 0, 16, 16, 23, 0, 144, 18, 23, 0, 16, 21, 23, 0, 144, 23, 23, 0, 16, 26, 23, 0, 144, 28, 23, 0, 16, 31, 23, 0, 144, 33, 23, 0, 16, 36, 23, 0, 144, 38, 23, 0, 16, 41, 23, 0, 144, 43, 23, 0, 16, 46, 23, 0, 144, 48, 23, 0, 16, 51, 23, 0, 144, 53, 23, 0, 16, 56, 23, 0, 144, 58, 23, 0, 16, 61, 23, 0, 144, 63, 23, 0, 16, 66, 23, 0, 144, 68, 23, 0, 16, 71, 23, 0, 144, 73, 23, 0, 16, 76, 23, 0, 144, 78, 23, 0, 16, 81, 23, 0, 144, 83, 23, 0, 16, 86, 23, 0, 144, 88, 23, 0, 16, 91, 23, 0, 144, 93, 23, 0, 16, 96, 23, 0, 144, 98, 23, 0, 16, 101, 23, 0, 144, 103, 23, 0, 16, 106, 23, 0, 144, 108, 23, 0, 16, 111, 23, 0, 144, 113, 23, 0, 16, 116, 23, 0, 144, 118, 23, 0, 16, 121, 23, 0, 144, 123, 23, 0, 16, 126, 23, 0, 144, 128, 23, 0, 16, 131, 23, 0, 144, 133, 23, 0, 16, 136, 23, 0, 144, 138, 23, 0, 16, 141, 23, 0, 144, 143, 23, 0, 16, 146, 23, 0, 144, 148, 23, 0, 16, 151, 23, 0, 144, 153, 23, 0, 16, 156, 23, 0, 144, 158, 23, 0, 16, 161, 23, 0, 144, 163, 23, 0, 16, 166, 23, 0, 144, 168, 23, 0, 16, 171, 23, 0, 144, 173, 23, 0, 16, 176, 23, 0, 144, 178, 23, 0, 16, 181, 23, 0, 144, 183, 23, 0, 16, 186, 23, 0, 144, 188, 23, 0, 16, 191, 23, 0, 144, 193, 23, 0, 16, 196, 23, 0, 144, 198, 23, 0, 16, 201, 23, 0, 144, 203, 23, 0, 16, 206, 23, 0, 144, 208, 23, 0, 16, 211, 23, 0, 144, 213, 23, 0, 16, 216, 23, 0, 144, 218, 23, 0, 16, 221, 23, 0, 144, 223, 23, 0, 16, 226, 23, 0, 144, 228, 23, 0, 16, 231, 23, 0, 144, 233, 23, 0, 16, 236, 23, 0, 144, 238, 23, 0, 16, 241, 23, 0, 144, 243, 23, 0, 16, 246, 23, 0, 144, 248, 23, 0, 16, 251, 23, 0, 144, 253, 23, 0, 16, 0, 24, 0, 144, 2, 24, 0, 16, 5, 24, 0, 144, 7, 24, 0, 16, 10, 24, 0, 144, 12, 24, 0, 16, 15, 24, 0, 144, 17, 24, 0, 16, 20, 24, 0, 144, 22, 24, 0, 16, 25, 24, 0, 144, 27, 24, 0, 16, 30, 24, 0, 144, 32, 24, 0, 16, 35, 24, 0, 144, 37, 24, 0, 16, 40, 24, 0, 144, 42, 24, 0, 16, 45, 24, 0, 144, 47, 24, 0, 16, 50, 24, 0, 144, 52, 24, 0, 16, 55, 24, 0, 144, 57, 24, 0, 16, 60, 24, 0, 144, 62, 24, 0, 16, 65, 24, 0, 144, 67, 24, 0, 16, 70, 24, 0, 144, 72, 24, 0, 16, 75, 24, 0, 144, 77, 24, 0, 16, 80, 24, 0, 144, 82, 24, 0, 16, 85, 24, 0, 144, 87, 24, 0, 16, 90, 24, 0, 144, 92, 24, 0, 16, 95, 24, 0, 144, 97, 24, 0, 16, 100, 24, 0, 144, 102, 24, 0, 16, 105, 24, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_sixteen_rising_edges.json b/tests/recordings/logic_analyzer/test_capture_sixteen_rising_edges.json deleted file mode 100644 index fb9e0dce..00000000 --- a/tests/recordings/logic_analyzer/test_capture_sixteen_rising_edges.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [5], [196, 9], [0], [84], [16], [10], [9], [196, 9], [0], [10], [9], [196, 9], [1]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [135, 7, 0, 0, 135, 17, 0, 0, 135, 27, 0, 0, 135, 37, 0, 0, 135, 47, 0, 0, 135, 57, 0, 0, 135, 67, 0, 0, 135, 77, 0, 0, 135, 87, 0, 0, 135, 97, 0, 0, 135, 107, 0, 0, 135, 117, 0, 0, 135, 127, 0, 0, 135, 137, 0, 0, 135, 147, 0, 0, 135, 157, 0, 0, 135, 167, 0, 0, 135, 177, 0, 0, 135, 187, 0, 0, 135, 197, 0, 0, 135, 207, 0, 0, 135, 217, 0, 0, 135, 227, 0, 0, 135, 237, 0, 0, 135, 247, 0, 0, 135, 1, 1, 0, 135, 11, 1, 0, 135, 21, 1, 0, 135, 31, 1, 0, 135, 41, 1, 0, 135, 51, 1, 0, 135, 61, 1, 0, 135, 71, 1, 0, 135, 81, 1, 0, 135, 91, 1, 0, 135, 101, 1, 0, 135, 111, 1, 0, 135, 121, 1, 0, 135, 131, 1, 0, 135, 141, 1, 0, 135, 151, 1, 0, 135, 161, 1, 0, 135, 171, 1, 0, 135, 181, 1, 0, 135, 191, 1, 0, 135, 201, 1, 0, 135, 211, 1, 0, 135, 221, 1, 0, 135, 231, 1, 0, 135, 241, 1, 0, 135, 251, 1, 0, 135, 5, 2, 0, 135, 15, 2, 0, 135, 25, 2, 0, 135, 35, 2, 0, 135, 45, 2, 0, 135, 55, 2, 0, 135, 65, 2, 0, 135, 75, 2, 0, 135, 85, 2, 0, 135, 95, 2, 0, 135, 105, 2, 0, 135, 115, 2, 0, 135, 125, 2, 0, 135, 135, 2, 0, 135, 145, 2, 0, 135, 155, 2, 0, 135, 165, 2, 0, 135, 175, 2, 0, 135, 185, 2, 0, 135, 195, 2, 0, 135, 205, 2, 0, 135, 215, 2, 0, 135, 225, 2, 0, 135, 235, 2, 0, 135, 245, 2, 0, 135, 255, 2, 0, 135, 9, 3, 0, 135, 19, 3, 0, 135, 29, 3, 0, 135, 39, 3, 0, 135, 49, 3, 0, 135, 59, 3, 0, 135, 69, 3, 0, 135, 79, 3, 0, 135, 89, 3, 0, 135, 99, 3, 0, 135, 109, 3, 0, 135, 119, 3, 0, 135, 129, 3, 0, 135, 139, 3, 0, 135, 149, 3, 0, 135, 159, 3, 0, 135, 169, 3, 0, 135, 179, 3, 0, 135, 189, 3, 0, 135, 199, 3, 0, 135, 209, 3, 0, 135, 219, 3, 0, 135, 229, 3, 0, 135, 239, 3, 0, 135, 249, 3, 0, 135, 3, 4, 0, 135, 13, 4, 0, 135, 23, 4, 0, 135, 33, 4, 0, 135, 43, 4, 0, 135, 53, 4, 0, 135, 63, 4, 0, 135, 73, 4, 0, 135, 83, 4, 0, 135, 93, 4, 0, 135, 103, 4, 0, 135, 113, 4, 0, 135, 123, 4, 0, 135, 133, 4, 0, 135, 143, 4, 0, 135, 153, 4, 0, 135, 163, 4, 0, 135, 173, 4, 0, 135, 183, 4, 0, 135, 193, 4, 0, 135, 203, 4, 0, 135, 213, 4, 0, 135, 223, 4, 0, 135, 233, 4, 0, 135, 243, 4, 0, 135, 253, 4, 0, 135, 7, 5, 0, 135, 17, 5, 0, 135, 27, 5, 0, 135, 37, 5, 0, 135, 47, 5, 0, 135, 57, 5, 0, 135, 67, 5, 0, 135, 77, 5, 0, 135, 87, 5, 0, 135, 97, 5, 0, 135, 107, 5, 0, 135, 117, 5, 0, 135, 127, 5, 0, 135, 137, 5, 0, 135, 147, 5, 0, 135, 157, 5, 0, 135, 167, 5, 0, 135, 177, 5, 0, 135, 187, 5, 0, 135, 197, 5, 0, 135, 207, 5, 0, 135, 217, 5, 0, 135, 227, 5, 0, 135, 237, 5, 0, 135, 247, 5, 0, 135, 1, 6, 0, 135, 11, 6, 0, 135, 21, 6, 0, 135, 31, 6, 0, 135, 41, 6, 0, 135, 51, 6, 0, 135, 61, 6, 0, 135, 71, 6, 0, 135, 81, 6, 0, 135, 91, 6, 0, 135, 101, 6, 0, 135, 111, 6, 0, 135, 121, 6, 0, 135, 131, 6, 0, 135, 141, 6, 0, 135, 151, 6, 0, 135, 161, 6, 0, 135, 171, 6, 0, 135, 181, 6, 0, 135, 191, 6, 0, 135, 201, 6, 0, 135, 211, 6, 0, 135, 221, 6, 0, 135, 231, 6, 0, 135, 241, 6, 0, 135, 251, 6, 0, 135, 5, 7, 0, 135, 15, 7, 0, 135, 25, 7, 0, 135, 35, 7, 0, 135, 45, 7, 0, 135, 55, 7, 0, 135, 65, 7, 0, 135, 75, 7, 0, 135, 85, 7, 0, 135, 95, 7, 0, 135, 105, 7, 0, 135, 115, 7, 0, 135, 125, 7, 0, 135, 135, 7, 0, 135, 145, 7, 0, 135, 155, 7, 0, 135, 165, 7, 0, 135, 175, 7, 0, 135, 185, 7, 0, 135, 195, 7, 0, 135, 205, 7, 0, 135, 215, 7, 0, 135, 225, 7, 0, 135, 235, 7, 0, 135, 245, 7, 0, 135, 255, 7, 0, 135, 9, 8, 0, 135, 19, 8, 0, 135, 29, 8, 0, 135, 39, 8, 0, 135, 49, 8, 0, 135, 59, 8, 0, 135, 69, 8, 0, 135, 79, 8, 0, 135, 89, 8, 0, 135, 99, 8, 0, 135, 109, 8, 0, 135, 119, 8, 0, 135, 129, 8, 0, 135, 139, 8, 0, 135, 149, 8, 0, 135, 159, 8, 0, 135, 169, 8, 0, 135, 179, 8, 0, 135, 189, 8, 0, 135, 199, 8, 0, 135, 209, 8, 0, 135, 219, 8, 0, 135, 229, 8, 0, 135, 239, 8, 0, 135, 249, 8, 0, 135, 3, 9, 0, 135, 13, 9, 0, 135, 23, 9, 0, 135, 33, 9, 0, 135, 43, 9, 0, 135, 53, 9, 0, 135, 63, 9, 0, 135, 73, 9, 0, 135, 83, 9, 0, 135, 93, 9, 0, 135, 103, 9, 0, 135, 113, 9, 0, 135, 123, 9, 0, 135, 133, 9, 0, 135, 143, 9, 0, 135, 153, 9, 0, 135, 163, 9, 0, 135, 173, 9, 0, 135, 183, 9, 0, 135, 193, 9, 0, 135, 203, 9, 0, 135, 213, 9, 0, 135, 223, 9, 0, 135, 233, 9, 0, 135, 243, 9, 0, 135, 253, 9, 0, 135, 7, 10, 0, 135, 17, 10, 0, 135, 27, 10, 0, 135, 37, 10, 0, 135, 47, 10, 0, 135, 57, 10, 0, 135, 67, 10, 0, 135, 77, 10, 0, 135, 87, 10, 0, 135, 97, 10, 0, 135, 107, 10, 0, 135, 117, 10, 0, 135, 127, 10, 0, 135, 137, 10, 0, 135, 147, 10, 0, 135, 157, 10, 0, 135, 167, 10, 0, 135, 177, 10, 0, 135, 187, 10, 0, 135, 197, 10, 0, 135, 207, 10, 0, 135, 217, 10, 0, 135, 227, 10, 0, 135, 237, 10, 0, 135, 247, 10, 0, 135, 1, 11, 0, 135, 11, 11, 0, 135, 21, 11, 0, 135, 31, 11, 0, 135, 41, 11, 0, 135, 51, 11, 0, 135, 61, 11, 0, 135, 71, 11, 0, 135, 81, 11, 0, 135, 91, 11, 0, 135, 101, 11, 0, 135, 111, 11, 0, 135, 121, 11, 0, 135, 131, 11, 0, 135, 141, 11, 0, 135, 151, 11, 0, 135, 161, 11, 0, 135, 171, 11, 0, 135, 181, 11, 0, 135, 191, 11, 0, 135, 201, 11, 0, 135, 211, 11, 0, 135, 221, 11, 0, 135, 231, 11, 0, 135, 241, 11, 0, 135, 251, 11, 0, 135, 5, 12, 0, 135, 15, 12, 0, 135, 25, 12, 0, 135, 35, 12, 0, 135, 45, 12, 0, 135, 55, 12, 0, 135, 65, 12, 0, 135, 75, 12, 0, 135, 85, 12, 0, 135, 95, 12, 0, 135, 105, 12, 0, 135, 115, 12, 0, 135, 125, 12, 0, 135, 135, 12, 0, 135, 145, 12, 0, 135, 155, 12, 0, 135, 165, 12, 0, 135, 175, 12, 0, 135, 185, 12, 0, 135, 195, 12, 0, 135, 205, 12, 0, 135, 215, 12, 0, 135, 225, 12, 0, 135, 235, 12, 0, 135, 245, 12, 0, 135, 255, 12, 0, 135, 9, 13, 0, 135, 19, 13, 0, 135, 29, 13, 0, 135, 39, 13, 0, 135, 49, 13, 0, 135, 59, 13, 0, 135, 69, 13, 0, 135, 79, 13, 0, 135, 89, 13, 0, 135, 99, 13, 0, 135, 109, 13, 0, 135, 119, 13, 0, 135, 129, 13, 0, 135, 139, 13, 0, 135, 149, 13, 0, 135, 159, 13, 0, 135, 169, 13, 0, 135, 179, 13, 0, 135, 189, 13, 0, 135, 199, 13, 0, 135, 209, 13, 0, 135, 219, 13, 0, 135, 229, 13, 0, 135, 239, 13, 0, 135, 249, 13, 0, 135, 3, 14, 0, 135, 13, 14, 0, 135, 23, 14, 0, 135, 33, 14, 0, 135, 43, 14, 0, 135, 53, 14, 0, 135, 63, 14, 0, 135, 73, 14, 0, 135, 83, 14, 0, 135, 93, 14, 0, 135, 103, 14, 0, 135, 113, 14, 0, 135, 123, 14, 0, 135, 133, 14, 0, 135, 143, 14, 0, 135, 153, 14, 0, 135, 163, 14, 0, 135, 173, 14, 0, 135, 183, 14, 0, 135, 193, 14, 0, 135, 203, 14, 0, 135, 213, 14, 0, 135, 223, 14, 0, 135, 233, 14, 0, 135, 243, 14, 0, 135, 253, 14, 0, 135, 7, 15, 0, 135, 17, 15, 0, 135, 27, 15, 0, 135, 37, 15, 0, 135, 47, 15, 0, 135, 57, 15, 0, 135, 67, 15, 0, 135, 77, 15, 0, 135, 87, 15, 0, 135, 97, 15, 0, 135, 107, 15, 0, 135, 117, 15, 0, 135, 127, 15, 0, 135, 137, 15, 0, 135, 147, 15, 0, 135, 157, 15, 0, 135, 167, 15, 0, 135, 177, 15, 0, 135, 187, 15, 0, 135, 197, 15, 0, 135, 207, 15, 0, 135, 217, 15, 0, 135, 227, 15, 0, 135, 237, 15, 0, 135, 247, 15, 0, 135, 1, 16, 0, 135, 11, 16, 0, 135, 21, 16, 0, 135, 31, 16, 0, 135, 41, 16, 0, 135, 51, 16, 0, 135, 61, 16, 0, 135, 71, 16, 0, 135, 81, 16, 0, 135, 91, 16, 0, 135, 101, 16, 0, 135, 111, 16, 0, 135, 121, 16, 0, 135, 131, 16, 0, 135, 141, 16, 0, 135, 151, 16, 0, 135, 161, 16, 0, 135, 171, 16, 0, 135, 181, 16, 0, 135, 191, 16, 0, 135, 201, 16, 0, 135, 211, 16, 0, 135, 221, 16, 0, 135, 231, 16, 0, 135, 241, 16, 0, 135, 251, 16, 0, 135, 5, 17, 0, 135, 15, 17, 0, 135, 25, 17, 0, 135, 35, 17, 0, 135, 45, 17, 0, 135, 55, 17, 0, 135, 65, 17, 0, 135, 75, 17, 0, 135, 85, 17, 0, 135, 95, 17, 0, 135, 105, 17, 0, 135, 115, 17, 0, 135, 125, 17, 0, 135, 135, 17, 0, 135, 145, 17, 0, 135, 155, 17, 0, 135, 165, 17, 0, 135, 175, 17, 0, 135, 185, 17, 0, 135, 195, 17, 0, 135, 205, 17, 0, 135, 215, 17, 0, 135, 225, 17, 0, 135, 235, 17, 0, 135, 245, 17, 0, 135, 255, 17, 0, 135, 9, 18, 0, 135, 19, 18, 0, 135, 29, 18, 0, 135, 39, 18, 0, 135, 49, 18, 0, 135, 59, 18, 0, 135, 69, 18, 0, 135, 79, 18, 0, 135, 89, 18, 0, 135, 99, 18, 0, 135, 109, 18, 0, 135, 119, 18, 0, 135, 129, 18, 0, 135, 139, 18, 0, 135, 149, 18, 0, 135, 159, 18, 0, 135, 169, 18, 0, 135, 179, 18, 0, 135, 189, 18, 0, 135, 199, 18, 0, 135, 209, 18, 0, 135, 219, 18, 0, 135, 229, 18, 0, 135, 239, 18, 0, 135, 249, 18, 0, 135, 3, 19, 0, 135, 13, 19, 0, 135, 23, 19, 0, 135, 33, 19, 0, 135, 43, 19, 0, 135, 53, 19, 0, 135, 63, 19, 0, 135, 73, 19, 0, 135, 83, 19, 0, 135, 93, 19, 0, 135, 103, 19, 0, 135, 113, 19, 0, 135, 123, 19, 0, 135, 133, 19, 0, 135, 143, 19, 0, 135, 153, 19, 0, 135, 163, 19, 0, 135, 173, 19, 0, 135, 183, 19, 0, 135, 193, 19, 0, 135, 203, 19, 0, 135, 213, 19, 0, 135, 223, 19, 0, 135, 233, 19, 0, 135, 243, 19, 0, 135, 253, 19, 0, 135, 7, 20, 0, 135, 17, 20, 0, 135, 27, 20, 0, 135, 37, 20, 0, 135, 47, 20, 0, 135, 57, 20, 0, 135, 67, 20, 0, 135, 77, 20, 0, 135, 87, 20, 0, 135, 97, 20, 0, 135, 107, 20, 0, 135, 117, 20, 0, 135, 127, 20, 0, 135, 137, 20, 0, 135, 147, 20, 0, 135, 157, 20, 0, 135, 167, 20, 0, 135, 177, 20, 0, 135, 187, 20, 0, 135, 197, 20, 0, 135, 207, 20, 0, 135, 217, 20, 0, 135, 227, 20, 0, 135, 237, 20, 0, 135, 247, 20, 0, 135, 1, 21, 0, 135, 11, 21, 0, 135, 21, 21, 0, 135, 31, 21, 0, 135, 41, 21, 0, 135, 51, 21, 0, 135, 61, 21, 0, 135, 71, 21, 0, 135, 81, 21, 0, 135, 91, 21, 0, 135, 101, 21, 0, 135, 111, 21, 0, 135, 121, 21, 0, 135, 131, 21, 0, 135, 141, 21, 0, 135, 151, 21, 0, 135, 161, 21, 0, 135, 171, 21, 0, 135, 181, 21, 0, 135, 191, 21, 0, 135, 201, 21, 0, 135, 211, 21, 0, 135, 221, 21, 0, 135, 231, 21, 0, 135, 241, 21, 0, 135, 251, 21, 0, 135, 5, 22, 0, 135, 15, 22, 0, 135, 25, 22, 0, 135, 35, 22, 0, 135, 45, 22, 0, 135, 55, 22, 0, 135, 65, 22, 0, 135, 75, 22, 0, 135, 85, 22, 0, 135, 95, 22, 0, 135, 105, 22, 0, 135, 115, 22, 0, 135, 125, 22, 0, 135, 135, 22, 0, 135, 145, 22, 0, 135, 155, 22, 0, 135, 165, 22, 0, 135, 175, 22, 0, 135, 185, 22, 0, 135, 195, 22, 0, 135, 205, 22, 0, 135, 215, 22, 0, 135, 225, 22, 0, 135, 235, 22, 0, 135, 245, 22, 0, 135, 255, 22, 0, 135, 9, 23, 0, 135, 19, 23, 0, 135, 29, 23, 0, 135, 39, 23, 0, 135, 49, 23, 0, 135, 59, 23, 0, 135, 69, 23, 0, 135, 79, 23, 0, 135, 89, 23, 0, 135, 99, 23, 0, 135, 109, 23, 0, 135, 119, 23, 0, 135, 129, 23, 0, 135, 139, 23, 0, 135, 149, 23, 0, 135, 159, 23, 0, 135, 169, 23, 0, 135, 179, 23, 0, 135, 189, 23, 0, 135, 199, 23, 0, 135, 209, 23, 0, 135, 219, 23, 0, 135, 229, 23, 0, 135, 239, 23, 0, 135, 249, 23, 0, 135, 3, 24, 0, 135, 13, 24, 0, 135, 23, 24, 0, 135, 33, 24, 0, 135, 43, 24, 0, 135, 53, 24, 0, 135, 63, 24, 0, 135, 73, 24, 0, 135, 83, 24, 0, 135, 93, 24, 0, 135, 103, 24, 0, 135, 113, 24, 0, 135, 123, 24, 0, 135, 133, 24, 0, 135, 143, 24, 0, 135, 153, 24, 0, 135, 163, 24, 0, 135, 173, 24, 0, 135, 183, 24, 0, 135, 193, 24, 0, 135, 203, 24, 0, 135, 213, 24, 0, 135, 223, 24, 0, 135, 233, 24, 0, 135, 243, 24, 0, 135, 253, 24, 0, 135, 7, 25, 0, 135, 17, 25, 0, 135, 27, 25, 0, 135, 37, 25, 0, 135, 47, 25, 0, 135, 57, 25, 0, 135, 67, 25, 0, 135, 77, 25, 0, 135, 87, 25, 0, 135, 97, 25, 0, 135, 107, 25, 0, 135, 117, 25, 0, 135, 127, 25, 0, 135, 137, 25, 0, 135, 147, 25, 0, 135, 157, 25, 0, 135, 167, 25, 0, 135, 177, 25, 0, 135, 187, 25, 0, 135, 197, 25, 0, 135, 207, 25, 0, 135, 217, 25, 0, 135, 227, 25, 0, 135, 237, 25, 0, 135, 247, 25, 0, 135, 1, 26, 0, 135, 11, 26, 0, 135, 21, 26, 0, 135, 31, 26, 0, 135, 41, 26, 0, 135, 51, 26, 0, 135, 61, 26, 0, 135, 71, 26, 0, 135, 81, 26, 0, 135, 91, 26, 0, 135, 101, 26, 0, 135, 111, 26, 0, 135, 121, 26, 0, 135, 131, 26, 0, 135, 141, 26, 0, 135, 151, 26, 0, 135, 161, 26, 0, 135, 171, 26, 0, 135, 181, 26, 0, 135, 191, 26, 0, 135, 201, 26, 0, 135, 211, 26, 0, 135, 221, 26, 0, 135, 231, 26, 0, 135, 241, 26, 0, 135, 251, 26, 0, 135, 5, 27, 0, 135, 15, 27, 0, 135, 25, 27, 0, 135, 35, 27, 0, 135, 45, 27, 0, 135, 55, 27, 0, 135, 65, 27, 0, 135, 75, 27, 0, 135, 85, 27, 0, 135, 95, 27, 0, 135, 105, 27, 0, 135, 115, 27, 0, 135, 125, 27, 0, 135, 135, 27, 0, 135, 145, 27, 0, 135, 155, 27, 0, 135, 165, 27, 0, 135, 175, 27, 0, 135, 185, 27, 0, 135, 195, 27, 0, 135, 205, 27, 0, 135, 215, 27, 0, 135, 225, 27, 0, 135, 235, 27, 0, 135, 245, 27, 0, 135, 255, 27, 0, 135, 9, 28, 0, 135, 19, 28, 0, 135, 29, 28, 0, 135, 39, 28, 0, 135, 49, 28, 0, 135, 59, 28, 0, 135, 69, 28, 0, 135, 79, 28, 0, 135, 89, 28, 0, 135, 99, 28, 0, 135, 109, 28, 0, 135, 119, 28, 0, 135, 129, 28, 0, 135, 139, 28, 0, 135, 149, 28, 0, 135, 159, 28, 0, 135, 169, 28, 0, 135, 179, 28, 0, 135, 189, 28, 0, 135, 199, 28, 0, 135, 209, 28, 0, 135, 219, 28, 0, 135, 229, 28, 0, 135, 239, 28, 0, 135, 249, 28, 0, 135, 3, 29, 0, 135, 13, 29, 0, 135, 23, 29, 0, 135, 33, 29, 0, 135, 43, 29, 0, 135, 53, 29, 0, 135, 63, 29, 0, 135, 73, 29, 0, 135, 83, 29, 0, 135, 93, 29, 0, 135, 103, 29, 0, 135, 113, 29, 0, 135, 123, 29, 0, 135, 133, 29, 0, 135, 143, 29, 0, 135, 153, 29, 0, 135, 163, 29, 0, 135, 173, 29, 0, 135, 183, 29, 0, 135, 193, 29, 0, 135, 203, 29, 0, 135, 213, 29, 0, 135, 223, 29, 0, 135, 233, 29, 0, 135, 243, 29, 0, 135, 253, 29, 0, 135, 7, 30, 0, 135, 17, 30, 0, 135, 27, 30, 0, 135, 37, 30, 0, 135, 47, 30, 0, 135, 57, 30, 0, 135, 67, 30, 0, 135, 77, 30, 0, 135, 87, 30, 0, 135, 97, 30, 0, 135, 107, 30, 0, 135, 117, 30, 0, 135, 127, 30, 0, 135, 137, 30, 0, 135, 147, 30, 0, 135, 157, 30, 0, 135, 167, 30, 0, 135, 177, 30, 0, 135, 187, 30, 0, 135, 197, 30, 0, 135, 207, 30, 0, 135, 217, 30, 0, 135, 227, 30, 0, 135, 237, 30, 0, 135, 247, 30, 0, 135, 1, 31, 0, 135, 11, 31, 0, 135, 21, 31, 0, 135, 31, 31, 0, 135, 41, 31, 0, 135, 51, 31, 0, 135, 61, 31, 0, 135, 71, 31, 0, 135, 81, 31, 0, 135, 91, 31, 0, 135, 101, 31, 0, 135, 111, 31, 0, 135, 121, 31, 0, 135, 131, 31, 0, 135, 141, 31, 0, 135, 151, 31, 0, 135, 161, 31, 0, 135, 171, 31, 0, 135, 181, 31, 0, 135, 191, 31, 0, 135, 201, 31, 0, 135, 211, 31, 0, 135, 221, 31, 0, 135, 231, 31, 0, 135, 241, 31, 0, 135, 251, 31, 0, 135, 5, 32, 0, 135, 15, 32, 0, 135, 25, 32, 0, 135, 35, 32, 0, 135, 45, 32, 0, 135, 55, 32, 0, 135, 65, 32, 0, 135, 75, 32, 0, 135, 85, 32, 0, 135, 95, 32, 0, 135, 105, 32, 0, 135, 115, 32, 0, 135, 125, 32, 0, 135, 135, 32, 0, 135, 145, 32, 0, 135, 155, 32, 0, 135, 165, 32, 0, 135, 175, 32, 0, 135, 185, 32, 0, 135, 195, 32, 0, 135, 205, 32, 0, 135, 215, 32, 0, 135, 225, 32, 0, 135, 235, 32, 0, 135, 245, 32, 0, 135, 255, 32, 0, 135, 9, 33, 0, 135, 19, 33, 0, 135, 29, 33, 0, 135, 39, 33, 0, 135, 49, 33, 0, 135, 59, 33, 0, 135, 69, 33, 0, 135, 79, 33, 0, 135, 89, 33, 0, 135, 99, 33, 0, 135, 109, 33, 0, 135, 119, 33, 0, 135, 129, 33, 0, 135, 139, 33, 0, 135, 149, 33, 0, 135, 159, 33, 0, 135, 169, 33, 0, 135, 179, 33, 0, 135, 189, 33, 0, 135, 199, 33, 0, 135, 209, 33, 0, 135, 219, 33, 0, 135, 229, 33, 0, 135, 239, 33, 0, 135, 249, 33, 0, 135, 3, 34, 0, 135, 13, 34, 0, 135, 23, 34, 0, 135, 33, 34, 0, 135, 43, 34, 0, 135, 53, 34, 0, 135, 63, 34, 0, 135, 73, 34, 0, 135, 83, 34, 0, 135, 93, 34, 0, 135, 103, 34, 0, 135, 113, 34, 0, 135, 123, 34, 0, 135, 133, 34, 0, 135, 143, 34, 0, 135, 153, 34, 0, 135, 163, 34, 0, 135, 173, 34, 0, 135, 183, 34, 0, 135, 193, 34, 0, 135, 203, 34, 0, 135, 213, 34, 0, 135, 223, 34, 0, 135, 233, 34, 0, 135, 243, 34, 0, 135, 253, 34, 0, 135, 7, 35, 0, 135, 17, 35, 0, 135, 27, 35, 0, 135, 37, 35, 0, 135, 47, 35, 0, 135, 57, 35, 0, 135, 67, 35, 0, 135, 77, 35, 0, 135, 87, 35, 0, 135, 97, 35, 0, 135, 107, 35, 0, 135, 117, 35, 0, 135, 127, 35, 0, 135, 137, 35, 0, 135, 147, 35, 0, 135, 157, 35, 0, 135, 167, 35, 0, 135, 177, 35, 0, 135, 187, 35, 0, 135, 197, 35, 0, 135, 207, 35, 0, 135, 217, 35, 0, 135, 227, 35, 0, 135, 237, 35, 0, 135, 247, 35, 0, 135, 1, 36, 0, 135, 11, 36, 0, 135, 21, 36, 0, 135, 31, 36, 0, 135, 41, 36, 0, 135, 51, 36, 0, 135, 61, 36, 0, 135, 71, 36, 0, 135, 81, 36, 0, 135, 91, 36, 0, 135, 101, 36, 0, 135, 111, 36, 0, 135, 121, 36, 0, 135, 131, 36, 0, 135, 141, 36, 0, 135, 151, 36, 0, 135, 161, 36, 0, 135, 171, 36, 0, 135, 181, 36, 0, 135, 191, 36, 0, 135, 201, 36, 0, 135, 211, 36, 0, 135, 221, 36, 0, 135, 231, 36, 0, 135, 241, 36, 0, 135, 251, 36, 0, 135, 5, 37, 0, 135, 15, 37, 0, 135, 25, 37, 0, 135, 35, 37, 0, 135, 45, 37, 0, 135, 55, 37, 0, 135, 65, 37, 0, 135, 75, 37, 0, 135, 85, 37, 0, 135, 95, 37, 0, 135, 105, 37, 0, 135, 115, 37, 0, 135, 125, 37, 0, 135, 135, 37, 0, 135, 145, 37, 0, 135, 155, 37, 0, 135, 165, 37, 0, 135, 175, 37, 0, 135, 185, 37, 0, 135, 195, 37, 0, 135, 205, 37, 0, 135, 215, 37, 0, 135, 225, 37, 0, 135, 235, 37, 0, 135, 245, 37, 0, 135, 255, 37, 0, 135, 9, 38, 0, 135, 19, 38, 0, 135, 29, 38, 0, 135, 39, 38, 0, 135, 49, 38, 0, 135, 59, 38, 0, 135, 69, 38, 0, 135, 79, 38, 0, 135, 89, 38, 0, 135, 99, 38, 0, 135, 109, 38, 0, 135, 119, 38, 0, 135, 129, 38, 0, 135, 139, 38, 0, 135, 149, 38, 0, 135, 159, 38, 0, 135, 169, 38, 0, 135, 179, 38, 0, 135, 189, 38, 0, 135, 199, 38, 0, 135, 209, 38, 0, 135, 219, 38, 0, 135, 229, 38, 0, 135, 239, 38, 0, 135, 249, 38, 0, 135, 3, 39, 0, 135, 13, 39, 0, 135, 23, 39, 0, 135, 33, 39, 0, 135, 43, 39, 0, 135, 53, 39, 0, 135, 63, 39, 0, 135, 73, 39, 0, 135, 83, 39, 0, 135, 93, 39, 0, 135, 103, 39, 0, 135, 113, 39, 0, 135, 123, 39, 0, 135, 133, 39, 0, 135, 143, 39, 0, 135, 153, 39, 0, 135, 163, 39, 0, 135, 173, 39, 0, 135, 183, 39, 0, 135, 193, 39, 0, 135, 203, 39, 0, 135, 213, 39, 0, 135, 223, 39, 0, 135, 233, 39, 0, 135, 243, 39, 0, 135, 253, 39, 0, 135, 7, 40, 0, 135, 17, 40, 0, 135, 27, 40, 0, 135, 37, 40, 0, 135, 47, 40, 0, 135, 57, 40, 0, 135, 67, 40, 0, 135, 77, 40, 0, 135, 87, 40, 0, 135, 97, 40, 0, 135, 107, 40, 0, 135, 117, 40, 0, 135, 127, 40, 0, 135, 137, 40, 0, 135, 147, 40, 0, 135, 157, 40, 0, 135, 167, 40, 0, 135, 177, 40, 0, 135, 187, 40, 0, 135, 197, 40, 0, 135, 207, 40, 0, 135, 217, 40, 0, 135, 227, 40, 0, 135, 237, 40, 0, 135, 247, 40, 0, 135, 1, 41, 0, 135, 11, 41, 0, 135, 21, 41, 0, 135, 31, 41, 0, 135, 41, 41, 0, 135, 51, 41, 0, 135, 61, 41, 0, 135, 71, 41, 0, 135, 81, 41, 0, 135, 91, 41, 0, 135, 101, 41, 0, 135, 111, 41, 0, 135, 121, 41, 0, 135, 131, 41, 0, 135, 141, 41, 0, 135, 151, 41, 0, 135, 161, 41, 0, 135, 171, 41, 0, 135, 181, 41, 0, 135, 191, 41, 0, 135, 201, 41, 0, 135, 211, 41, 0, 135, 221, 41, 0, 135, 231, 41, 0, 135, 241, 41, 0, 135, 251, 41, 0, 135, 5, 42, 0, 135, 15, 42, 0, 135, 25, 42, 0, 135, 35, 42, 0, 135, 45, 42, 0, 135, 55, 42, 0, 135, 65, 42, 0, 135, 75, 42, 0, 135, 85, 42, 0, 135, 95, 42, 0, 135, 105, 42, 0, 135, 115, 42, 0, 135, 125, 42, 0, 135, 135, 42, 0, 135, 145, 42, 0, 135, 155, 42, 0, 135, 165, 42, 0, 135, 175, 42, 0, 135, 185, 42, 0, 135, 195, 42, 0, 135, 205, 42, 0, 135, 215, 42, 0, 135, 225, 42, 0, 135, 235, 42, 0, 135, 245, 42, 0, 135, 255, 42, 0, 135, 9, 43, 0, 135, 19, 43, 0, 135, 29, 43, 0, 135, 39, 43, 0, 135, 49, 43, 0, 135, 59, 43, 0, 135, 69, 43, 0, 135, 79, 43, 0, 135, 89, 43, 0, 135, 99, 43, 0, 135, 109, 43, 0, 135, 119, 43, 0, 135, 129, 43, 0, 135, 139, 43, 0, 135, 149, 43, 0, 135, 159, 43, 0, 135, 169, 43, 0, 135, 179, 43, 0, 135, 189, 43, 0, 135, 199, 43, 0, 135, 209, 43, 0, 135, 219, 43, 0, 135, 229, 43, 0, 135, 239, 43, 0, 135, 249, 43, 0, 135, 3, 44, 0, 135, 13, 44, 0, 135, 23, 44, 0, 135, 33, 44, 0, 135, 43, 44, 0, 135, 53, 44, 0, 135, 63, 44, 0, 135, 73, 44, 0, 135, 83, 44, 0, 135, 93, 44, 0, 135, 103, 44, 0, 135, 113, 44, 0, 135, 123, 44, 0, 135, 133, 44, 0, 135, 143, 44, 0, 135, 153, 44, 0, 135, 163, 44, 0, 135, 173, 44, 0, 135, 183, 44, 0, 135, 193, 44, 0, 135, 203, 44, 0, 135, 213, 44, 0, 135, 223, 44, 0, 135, 233, 44, 0, 135, 243, 44, 0, 135, 253, 44, 0, 135, 7, 45, 0, 135, 17, 45, 0, 135, 27, 45, 0, 135, 37, 45, 0, 135, 47, 45, 0, 135, 57, 45, 0, 135, 67, 45, 0, 135, 77, 45, 0, 135, 87, 45, 0, 135, 97, 45, 0, 135, 107, 45, 0, 135, 117, 45, 0, 135, 127, 45, 0, 135, 137, 45, 0, 135, 147, 45, 0, 135, 157, 45, 0, 135, 167, 45, 0, 135, 177, 45, 0, 135, 187, 45, 0, 135, 197, 45, 0, 135, 207, 45, 0, 135, 217, 45, 0, 135, 227, 45, 0, 135, 237, 45, 0, 135, 247, 45, 0, 135, 1, 46, 0, 135, 11, 46, 0, 135, 21, 46, 0, 135, 31, 46, 0, 135, 41, 46, 0, 135, 51, 46, 0, 135, 61, 46, 0, 135, 71, 46, 0, 135, 81, 46, 0, 135, 91, 46, 0, 135, 101, 46, 0, 135, 111, 46, 0, 135, 121, 46, 0, 135, 131, 46, 0, 135, 141, 46, 0, 135, 151, 46, 0, 135, 161, 46, 0, 135, 171, 46, 0, 135, 181, 46, 0, 135, 191, 46, 0, 135, 201, 46, 0, 135, 211, 46, 0, 135, 221, 46, 0, 135, 231, 46, 0, 135, 241, 46, 0, 135, 251, 46, 0, 135, 5, 47, 0, 135, 15, 47, 0, 135, 25, 47, 0, 135, 35, 47, 0, 135, 45, 47, 0, 135, 55, 47, 0, 135, 65, 47, 0, 135, 75, 47, 0, 135, 85, 47, 0, 135, 95, 47, 0, 135, 105, 47, 0, 135, 115, 47, 0, 135, 125, 47, 0, 135, 135, 47, 0, 135, 145, 47, 0, 135, 155, 47, 0, 135, 165, 47, 0, 135, 175, 47, 0, 135, 185, 47, 0, 135, 195, 47, 0, 135, 205, 47, 0, 135, 215, 47, 0, 135, 225, 47, 0, 135, 235, 47, 0, 135, 245, 47, 0, 135, 255, 47, 0, 135, 9, 48, 0, 135, 19, 48, 0, 135, 29, 48, 0, 135, 39, 48, 0, 135, 49, 48, 0, 135, 59, 48, 0, 135, 69, 48, 0, 135, 79, 48, 0, 135, 89, 48, 0, 135, 99, 48, 0, 135, 109, 48, 0, 135, 119, 48, 0, 135, 129, 48, 0, 135, 139, 48, 0, 135, 149, 48, 0, 135, 159, 48, 0, 135, 169, 48, 0, 135, 179, 48, 0, 135, 189, 48, 0, 135, 199, 48, 0, 135, 209, 48, 0, 135, 219, 48, 0, 135, 229, 48, 0, 135, 239, 48, 0, 135, 249, 48, 0, 135, 3, 49, 0, 135, 13, 49, 0, 135, 23, 49, 0, 135, 33, 49, 0, 135, 43, 49, 0, 135, 53, 49, 0, 135, 63, 49, 0, 135, 73, 49, 0, 135, 83, 49, 0, 135, 93, 49, 0, 135, 103, 49, 0, 135, 113, 49, 0, 135, 123, 49, 0, 135, 133, 49, 0, 135, 143, 49, 0, 135, 153, 49, 0, 135, 163, 49, 0, 135, 173, 49, 0, 135, 183, 49, 0, 135, 193, 49, 0, 135, 203, 49, 0, 135, 213, 49, 0, 135, 223, 49, 0, 135, 233, 49, 0, 135, 243, 49, 0, 135, 253, 49, 0, 135, 7, 50, 0, 135, 17, 50, 0, 135, 27, 50, 0, 135, 37, 50, 0, 135, 47, 50, 0, 135, 57, 50, 0, 135, 67, 50, 0, 135, 77, 50, 0, 135, 87, 50, 0, 135, 97, 50, 0, 135, 107, 50, 0, 135, 117, 50, 0, 135, 127, 50, 0, 135, 137, 50, 0, 135, 147, 50, 0, 135, 157, 50, 0, 135, 167, 50, 0, 135, 177, 50, 0, 135, 187, 50, 0, 135, 197, 50, 0, 135, 207, 50, 0, 135, 217, 50, 0, 135, 227, 50, 0, 135, 237, 50, 0, 135, 247, 50, 0, 135, 1, 51, 0, 135, 11, 51, 0, 135, 21, 51, 0, 135, 31, 51, 0, 135, 41, 51, 0, 135, 51, 51, 0, 135, 61, 51, 0, 135, 71, 51, 0, 135, 81, 51, 0, 135, 91, 51, 0, 135, 101, 51, 0, 135, 111, 51, 0, 135, 121, 51, 0, 135, 131, 51, 0, 135, 141, 51, 0, 135, 151, 51, 0, 135, 161, 51, 0, 135, 171, 51, 0, 135, 181, 51, 0, 135, 191, 51, 0, 135, 201, 51, 0, 135, 211, 51, 0, 135, 221, 51, 0, 135, 231, 51, 0, 135, 241, 51, 0, 135, 251, 51, 0, 135, 5, 52, 0, 135, 15, 52, 0, 135, 25, 52, 0, 135, 35, 52, 0, 135, 45, 52, 0, 135, 55, 52, 0, 135, 65, 52, 0, 135, 75, 52, 0, 135, 85, 52, 0, 135, 95, 52, 0, 135, 105, 52, 0, 135, 115, 52, 0, 135, 125, 52, 0, 135, 135, 52, 0, 135, 145, 52, 0, 135, 155, 52, 0, 135, 165, 52, 0, 135, 175, 52, 0, 135, 185, 52, 0, 135, 195, 52, 0, 135, 205, 52, 0, 135, 215, 52, 0, 135, 225, 52, 0, 135, 235, 52, 0, 135, 245, 52, 0, 135, 255, 52, 0, 135, 9, 53, 0, 135, 19, 53, 0, 135, 29, 53, 0, 135, 39, 53, 0, 135, 49, 53, 0, 135, 59, 53, 0, 135, 69, 53, 0, 135, 79, 53, 0, 135, 89, 53, 0, 135, 99, 53, 0, 135, 109, 53, 0, 135, 119, 53, 0, 135, 129, 53, 0, 135, 139, 53, 0, 135, 149, 53, 0, 135, 159, 53, 0, 135, 169, 53, 0, 135, 179, 53, 0, 135, 189, 53, 0, 135, 199, 53, 0, 135, 209, 53, 0, 135, 219, 53, 0, 135, 229, 53, 0, 135, 239, 53, 0, 135, 249, 53, 0, 135, 3, 54, 0, 135, 13, 54, 0, 135, 23, 54, 0, 135, 33, 54, 0, 135, 43, 54, 0, 135, 53, 54, 0, 135, 63, 54, 0, 135, 73, 54, 0, 135, 83, 54, 0, 135, 93, 54, 0, 135, 103, 54, 0, 135, 113, 54, 0, 135, 123, 54, 0, 135, 133, 54, 0, 135, 143, 54, 0, 135, 153, 54, 0, 135, 163, 54, 0, 135, 173, 54, 0, 135, 183, 54, 0, 135, 193, 54, 0, 135, 203, 54, 0, 135, 213, 54, 0, 135, 223, 54, 0, 135, 233, 54, 0, 135, 243, 54, 0, 135, 253, 54, 0, 135, 7, 55, 0, 135, 17, 55, 0, 135, 27, 55, 0, 135, 37, 55, 0, 135, 47, 55, 0, 135, 57, 55, 0, 135, 67, 55, 0, 135, 77, 55, 0, 135, 87, 55, 0, 135, 97, 55, 0, 135, 107, 55, 0, 135, 117, 55, 0, 135, 127, 55, 0, 135, 137, 55, 0, 135, 147, 55, 0, 135, 157, 55, 0, 135, 167, 55, 0, 135, 177, 55, 0, 135, 187, 55, 0, 135, 197, 55, 0, 135, 207, 55, 0, 135, 217, 55, 0, 135, 227, 55, 0, 135, 237, 55, 0, 135, 247, 55, 0, 135, 1, 56, 0, 135, 11, 56, 0, 135, 21, 56, 0, 135, 31, 56, 0, 135, 41, 56, 0, 135, 51, 56, 0, 135, 61, 56, 0, 135, 71, 56, 0, 135, 81, 56, 0, 135, 91, 56, 0, 135, 101, 56, 0, 135, 111, 56, 0, 135, 121, 56, 0, 135, 131, 56, 0, 135, 141, 56, 0, 135, 151, 56, 0, 135, 161, 56, 0, 135, 171, 56, 0, 135, 181, 56, 0, 135, 191, 56, 0, 135, 201, 56, 0, 135, 211, 56, 0, 135, 221, 56, 0, 135, 231, 56, 0, 135, 241, 56, 0, 135, 251, 56, 0, 135, 5, 57, 0, 135, 15, 57, 0, 135, 25, 57, 0, 135, 35, 57, 0, 135, 45, 57, 0, 135, 55, 57, 0, 135, 65, 57, 0, 135, 75, 57, 0, 135, 85, 57, 0, 135, 95, 57, 0, 135, 105, 57, 0, 135, 115, 57, 0, 135, 125, 57, 0, 135, 135, 57, 0, 135, 145, 57, 0, 135, 155, 57, 0, 135, 165, 57, 0, 135, 175, 57, 0, 135, 185, 57, 0, 135, 195, 57, 0, 135, 205, 57, 0, 135, 215, 57, 0, 135, 225, 57, 0, 135, 235, 57, 0, 135, 245, 57, 0, 135, 255, 57, 0, 135, 9, 58, 0, 135, 19, 58, 0, 135, 29, 58, 0, 135, 39, 58, 0, 135, 49, 58, 0, 135, 59, 58, 0, 135, 69, 58, 0, 135, 79, 58, 0, 135, 89, 58, 0, 135, 99, 58, 0, 135, 109, 58, 0, 135, 119, 58, 0, 135, 129, 58, 0, 135, 139, 58, 0, 135, 149, 58, 0, 135, 159, 58, 0, 135, 169, 58, 0, 135, 179, 58, 0, 135, 189, 58, 0, 135, 199, 58, 0, 135, 209, 58, 0, 135, 219, 58, 0, 135, 229, 58, 0, 135, 239, 58, 0, 135, 249, 58, 0, 135, 3, 59, 0, 135, 13, 59, 0, 135, 23, 59, 0, 135, 33, 59, 0, 135, 43, 59, 0, 135, 53, 59, 0, 135, 63, 59, 0, 135, 73, 59, 0, 135, 83, 59, 0, 135, 93, 59, 0, 135, 103, 59, 0, 135, 113, 59, 0, 135, 123, 59, 0, 135, 133, 59, 0, 135, 143, 59, 0, 135, 153, 59, 0, 135, 163, 59, 0, 135, 173, 59, 0, 135, 183, 59, 0, 135, 193, 59, 0, 135, 203, 59, 0, 135, 213, 59, 0, 135, 223, 59, 0, 135, 233, 59, 0, 135, 243, 59, 0, 135, 253, 59, 0, 135, 7, 60, 0, 135, 17, 60, 0, 135, 27, 60, 0, 135, 37, 60, 0, 135, 47, 60, 0, 135, 57, 60, 0, 135, 67, 60, 0, 135, 77, 60, 0, 135, 87, 60, 0, 135, 97, 60, 0, 135, 107, 60, 0, 135, 117, 60, 0, 135, 127, 60, 0, 135, 137, 60, 0, 135, 147, 60, 0, 135, 157, 60, 0, 135, 167, 60, 0, 135, 177, 60, 0, 135, 187, 60, 0, 135, 197, 60, 0, 135, 207, 60, 0, 135, 217, 60, 0, 135, 227, 60, 0, 135, 237, 60, 0, 135, 247, 60, 0, 135, 1, 61, 0, 135, 11, 61, 0, 135, 21, 61, 0, 135, 31, 61, 0, 135, 41, 61, 0, 135, 51, 61, 0, 135, 61, 61, 0, 135, 71, 61, 0, 135, 81, 61, 0, 135, 91, 61, 0, 135, 101, 61, 0, 135, 111, 61, 0, 135, 121, 61, 0, 135, 131, 61, 0, 135, 141, 61, 0, 135, 151, 61, 0, 135, 161, 61, 0, 135, 171, 61, 0, 135, 181, 61, 0, 135, 191, 61, 0, 135, 201, 61, 0, 135, 211, 61, 0, 135, 221, 61, 0, 135, 231, 61, 0, 135, 241, 61, 0, 135, 251, 61, 0, 135, 5, 62, 0, 135, 15, 62, 0, 135, 25, 62, 0, 135, 35, 62, 0, 135, 45, 62, 0, 135, 55, 62, 0, 135, 65, 62, 0, 135, 75, 62, 0, 135, 85, 62, 0, 135, 95, 62, 0, 135, 105, 62, 0, 135, 115, 62, 0, 135, 125, 62, 0, 135, 135, 62, 0, 135, 145, 62, 0, 135, 155, 62, 0, 135, 165, 62, 0, 135, 175, 62, 0, 135, 185, 62, 0, 135, 195, 62, 0, 135, 205, 62, 0, 135, 215, 62, 0, 135, 225, 62, 0, 135, 235, 62, 0, 135, 245, 62, 0, 135, 255, 62, 0, 135, 9, 63, 0, 135, 19, 63, 0, 135, 29, 63, 0, 135, 39, 63, 0, 135, 49, 63, 0, 135, 59, 63, 0, 135, 69, 63, 0, 135, 79, 63, 0, 135, 89, 63, 0, 135, 99, 63, 0, 135, 109, 63, 0, 135, 119, 63, 0, 135, 129, 63, 0, 135, 139, 63, 0, 135, 149, 63, 0, 135, 159, 63, 0, 135, 169, 63, 0, 135, 179, 63, 0, 135, 189, 63, 0, 135, 199, 63, 0, 135, 209, 63, 0, 135, 219, 63, 0, 135, 229, 63, 0, 135, 239, 63, 0, 135, 249, 63, 0, 135, 3, 64, 0, 135, 13, 64, 0, 135, 23, 64, 0, 135, 33, 64, 0, 135, 43, 64, 0, 135, 53, 64, 0, 135, 63, 64, 0, 135, 73, 64, 0, 135, 83, 64, 0, 135, 93, 64, 0, 135, 103, 64, 0, 135, 113, 64, 0, 135, 123, 64, 0, 135, 133, 64, 0, 135, 143, 64, 0, 135, 153, 64, 0, 135, 163, 64, 0, 135, 173, 64, 0, 135, 183, 64, 0, 135, 193, 64, 0, 135, 203, 64, 0, 135, 213, 64, 0, 135, 223, 64, 0, 135, 233, 64, 0, 135, 243, 64, 0, 135, 253, 64, 0, 135, 7, 65, 0, 135, 17, 65, 0, 135, 27, 65, 0, 135, 37, 65, 0, 135, 47, 65, 0, 135, 57, 65, 0, 135, 67, 65, 0, 135, 77, 65, 0, 135, 87, 65, 0, 135, 97, 65, 0, 135, 107, 65, 0, 135, 117, 65, 0, 135, 127, 65, 0, 135, 137, 65, 0, 135, 147, 65, 0, 135, 157, 65, 0, 135, 167, 65, 0, 135, 177, 65, 0, 135, 187, 65, 0, 135, 197, 65, 0, 135, 207, 65, 0, 135, 217, 65, 0, 135, 227, 65, 0, 135, 237, 65, 0, 135, 247, 65, 0, 135, 1, 66, 0, 135, 11, 66, 0, 135, 21, 66, 0, 135, 31, 66, 0, 135, 41, 66, 0, 135, 51, 66, 0, 135, 61, 66, 0, 135, 71, 66, 0, 135, 81, 66, 0, 135, 91, 66, 0, 135, 101, 66, 0, 135, 111, 66, 0, 135, 121, 66, 0, 135, 131, 66, 0, 135, 141, 66, 0, 135, 151, 66, 0, 135, 161, 66, 0, 135, 171, 66, 0, 135, 181, 66, 0, 135, 191, 66, 0, 135, 201, 66, 0, 135, 211, 66, 0, 135, 221, 66, 0, 135, 231, 66, 0, 135, 241, 66, 0, 135, 251, 66, 0, 135, 5, 67, 0, 135, 15, 67, 0, 135, 25, 67, 0, 135, 35, 67, 0, 135, 45, 67, 0, 135, 55, 67, 0, 135, 65, 67, 0, 135, 75, 67, 0, 135, 85, 67, 0, 135, 95, 67, 0, 135, 105, 67, 0, 135, 115, 67, 0, 135, 125, 67, 0, 135, 135, 67, 0, 135, 145, 67, 0, 135, 155, 67, 0, 135, 165, 67, 0, 135, 175, 67, 0, 135, 185, 67, 0, 135, 195, 67, 0, 135, 205, 67, 0, 135, 215, 67, 0, 135, 225, 67, 0, 135, 235, 67, 0, 135, 245, 67, 0, 135, 255, 67, 0, 135, 9, 68, 0, 135, 19, 68, 0, 135, 29, 68, 0, 135, 39, 68, 0, 135, 49, 68, 0, 135, 59, 68, 0, 135, 69, 68, 0, 135, 79, 68, 0, 135, 89, 68, 0, 135, 99, 68, 0, 135, 109, 68, 0, 135, 119, 68, 0, 135, 129, 68, 0, 135, 139, 68, 0, 135, 149, 68, 0, 135, 159, 68, 0, 135, 169, 68, 0, 135, 179, 68, 0, 135, 189, 68, 0, 135, 199, 68, 0, 135, 209, 68, 0, 135, 219, 68, 0, 135, 229, 68, 0, 135, 239, 68, 0, 135, 249, 68, 0, 135, 3, 69, 0, 135, 13, 69, 0, 135, 23, 69, 0, 135, 33, 69, 0, 135, 43, 69, 0, 135, 53, 69, 0, 135, 63, 69, 0, 135, 73, 69, 0, 135, 83, 69, 0, 135, 93, 69, 0, 135, 103, 69, 0, 135, 113, 69, 0, 135, 123, 69, 0, 135, 133, 69, 0, 135, 143, 69, 0, 135, 153, 69, 0, 135, 163, 69, 0, 135, 173, 69, 0, 135, 183, 69, 0, 135, 193, 69, 0, 135, 203, 69, 0, 135, 213, 69, 0, 135, 223, 69, 0, 135, 233, 69, 0, 135, 243, 69, 0, 135, 253, 69, 0, 135, 7, 70, 0, 135, 17, 70, 0, 135, 27, 70, 0, 135, 37, 70, 0, 135, 47, 70, 0, 135, 57, 70, 0, 135, 67, 70, 0, 135, 77, 70, 0, 135, 87, 70, 0, 135, 97, 70, 0, 135, 107, 70, 0, 135, 117, 70, 0, 135, 127, 70, 0, 135, 137, 70, 0, 135, 147, 70, 0, 135, 157, 70, 0, 135, 167, 70, 0, 135, 177, 70, 0, 135, 187, 70, 0, 135, 197, 70, 0, 135, 207, 70, 0, 135, 217, 70, 0, 135, 227, 70, 0, 135, 237, 70, 0, 135, 247, 70, 0, 135, 1, 71, 0, 135, 11, 71, 0, 135, 21, 71, 0, 135, 31, 71, 0, 135, 41, 71, 0, 135, 51, 71, 0, 135, 61, 71, 0, 135, 71, 71, 0, 135, 81, 71, 0, 135, 91, 71, 0, 135, 101, 71, 0, 135, 111, 71, 0, 135, 121, 71, 0, 135, 131, 71, 0, 135, 141, 71, 0, 135, 151, 71, 0, 135, 161, 71, 0, 135, 171, 71, 0, 135, 181, 71, 0, 135, 191, 71, 0, 135, 201, 71, 0, 135, 211, 71, 0, 135, 221, 71, 0, 135, 231, 71, 0, 135, 241, 71, 0, 135, 251, 71, 0, 135, 5, 72, 0, 135, 15, 72, 0, 135, 25, 72, 0, 135, 35, 72, 0, 135, 45, 72, 0, 135, 55, 72, 0, 135, 65, 72, 0, 135, 75, 72, 0, 135, 85, 72, 0, 135, 95, 72, 0, 135, 105, 72, 0, 135, 115, 72, 0, 135, 125, 72, 0, 135, 135, 72, 0, 135, 145, 72, 0, 135, 155, 72, 0, 135, 165, 72, 0, 135, 175, 72, 0, 135, 185, 72, 0, 135, 195, 72, 0, 135, 205, 72, 0, 135, 215, 72, 0, 135, 225, 72, 0, 135, 235, 72, 0, 135, 245, 72, 0, 135, 255, 72, 0, 135, 9, 73, 0, 135, 19, 73, 0, 135, 29, 73, 0, 135, 39, 73, 0, 135, 49, 73, 0, 135, 59, 73, 0, 135, 69, 73, 0, 135, 79, 73, 0, 135, 89, 73, 0, 135, 99, 73, 0, 135, 109, 73, 0, 135, 119, 73, 0, 135, 129, 73, 0, 135, 139, 73, 0, 135, 149, 73, 0, 135, 159, 73, 0, 135, 169, 73, 0, 135, 179, 73, 0, 135, 189, 73, 0, 135, 199, 73, 0, 135, 209, 73, 0, 135, 219, 73, 0, 135, 229, 73, 0, 135, 239, 73, 0, 135, 249, 73, 0, 135, 3, 74, 0, 135, 13, 74, 0, 135, 23, 74, 0, 135, 33, 74, 0, 135, 43, 74, 0, 135, 53, 74, 0, 135, 63, 74, 0, 135, 73, 74, 0, 135, 83, 74, 0, 135, 93, 74, 0, 135, 103, 74, 0, 135, 113, 74, 0, 135, 123, 74, 0, 135, 133, 74, 0, 135, 143, 74, 0, 135, 153, 74, 0, 135, 163, 74, 0, 135, 173, 74, 0, 135, 183, 74, 0, 135, 193, 74, 0, 135, 203, 74, 0, 135, 213, 74, 0, 135, 223, 74, 0, 135, 233, 74, 0, 135, 243, 74, 0, 135, 253, 74, 0, 135, 7, 75, 0, 135, 17, 75, 0, 135, 27, 75, 0, 135, 37, 75, 0, 135, 47, 75, 0, 135, 57, 75, 0, 135, 67, 75, 0, 135, 77, 75, 0, 135, 87, 75, 0, 135, 97, 75, 0, 135, 107, 75, 0, 135, 117, 75, 0, 135, 127, 75, 0, 135, 137, 75, 0, 135, 147, 75, 0, 135, 157, 75, 0, 135, 167, 75, 0, 135, 177, 75, 0, 135, 187, 75, 0, 135, 197, 75, 0, 135, 207, 75, 0, 135, 217, 75, 0, 135, 227, 75, 0, 135, 237, 75, 0, 135, 247, 75, 0, 135, 1, 76, 0, 135, 11, 76, 0, 135, 21, 76, 0, 135, 31, 76, 0, 135, 41, 76, 0, 135, 51, 76, 0, 135, 61, 76, 0, 135, 71, 76, 0, 135, 81, 76, 0, 135, 91, 76, 0, 135, 101, 76, 0, 135, 111, 76, 0, 135, 121, 76, 0, 135, 131, 76, 0, 135, 141, 76, 0, 135, 151, 76, 0, 135, 161, 76, 0, 135, 171, 76, 0, 135, 181, 76, 0, 135, 191, 76, 0, 135, 201, 76, 0, 135, 211, 76, 0, 135, 221, 76, 0, 135, 231, 76, 0, 135, 241, 76, 0, 135, 251, 76, 0, 135, 5, 77, 0, 135, 15, 77, 0, 135, 25, 77, 0, 135, 35, 77, 0, 135, 45, 77, 0, 135, 55, 77, 0, 135, 65, 77, 0, 135, 75, 77, 0, 135, 85, 77, 0, 135, 95, 77, 0, 135, 105, 77, 0, 135, 115, 77, 0, 135, 125, 77, 0, 135, 135, 77, 0, 135, 145, 77, 0, 135, 155, 77, 0, 135, 165, 77, 0, 135, 175, 77, 0, 135, 185, 77, 0, 135, 195, 77, 0, 135, 205, 77, 0, 135, 215, 77, 0, 135, 225, 77, 0, 135, 235, 77, 0, 135, 245, 77, 0, 135, 255, 77, 0, 135, 9, 78, 0, 135, 19, 78, 0, 135, 29, 78, 0, 135, 39, 78, 0, 135, 49, 78, 0, 135, 59, 78, 0, 135, 69, 78, 0, 135, 79, 78, 0, 135, 89, 78, 0, 135, 99, 78, 0, 135, 109, 78, 0, 135, 119, 78, 0, 135, 129, 78, 0, 135, 139, 78, 0, 135, 149, 78, 0, 135, 159, 78, 0, 135, 169, 78, 0, 135, 179, 78, 0, 135, 189, 78, 0, 135, 199, 78, 0, 135, 209, 78, 0, 135, 219, 78, 0, 135, 229, 78, 0, 135, 239, 78, 0, 135, 249, 78, 0, 135, 3, 79, 0, 135, 13, 79, 0, 135, 23, 79, 0, 135, 33, 79, 0, 135, 43, 79, 0, 135, 53, 79, 0, 135, 63, 79, 0, 135, 73, 79, 0, 135, 83, 79, 0, 135, 93, 79, 0, 135, 103, 79, 0, 135, 113, 79, 0, 135, 123, 79, 0, 135, 133, 79, 0, 135, 143, 79, 0, 135, 153, 79, 0, 135, 163, 79, 0, 135, 173, 79, 0, 135, 183, 79, 0, 135, 193, 79, 0, 135, 203, 79, 0, 135, 213, 79, 0, 135, 223, 79, 0, 135, 233, 79, 0, 135, 243, 79, 0, 135, 253, 79, 0, 135, 7, 80, 0, 135, 17, 80, 0, 135, 27, 80, 0, 135, 37, 80, 0, 135, 47, 80, 0, 135, 57, 80, 0, 135, 67, 80, 0, 135, 77, 80, 0, 135, 87, 80, 0, 135, 97, 80, 0, 135, 107, 80, 0, 135, 117, 80, 0, 135, 127, 80, 0, 135, 137, 80, 0, 135, 147, 80, 0, 135, 157, 80, 0, 135, 167, 80, 0, 135, 177, 80, 0, 135, 187, 80, 0, 135, 197, 80, 0, 135, 207, 80, 0, 135, 217, 80, 0, 135, 227, 80, 0, 135, 237, 80, 0, 135, 247, 80, 0, 135, 1, 81, 0, 135, 11, 81, 0, 135, 21, 81, 0, 135, 31, 81, 0, 135, 41, 81, 0, 135, 51, 81, 0, 135, 61, 81, 0, 135, 71, 81, 0, 135, 81, 81, 0, 135, 91, 81, 0, 135, 101, 81, 0, 135, 111, 81, 0, 135, 121, 81, 0, 135, 131, 81, 0, 135, 141, 81, 0, 135, 151, 81, 0, 135, 161, 81, 0, 135, 171, 81, 0, 135, 181, 81, 0, 135, 191, 81, 0, 135, 201, 81, 0, 135, 211, 81, 0, 135, 221, 81, 0, 135, 231, 81, 0, 135, 241, 81, 0, 135, 251, 81, 0, 135, 5, 82, 0, 135, 15, 82, 0, 135, 25, 82, 0, 135, 35, 82, 0, 135, 45, 82, 0, 135, 55, 82, 0, 135, 65, 82, 0, 135, 75, 82, 0, 135, 85, 82, 0, 135, 95, 82, 0, 135, 105, 82, 0, 135, 115, 82, 0, 135, 125, 82, 0, 135, 135, 82, 0, 135, 145, 82, 0, 135, 155, 82, 0, 135, 165, 82, 0, 135, 175, 82, 0, 135, 185, 82, 0, 135, 195, 82, 0, 135, 205, 82, 0, 135, 215, 82, 0, 135, 225, 82, 0, 135, 235, 82, 0, 135, 245, 82, 0, 135, 255, 82, 0, 135, 9, 83, 0, 135, 19, 83, 0, 135, 29, 83, 0, 135, 39, 83, 0, 135, 49, 83, 0, 135, 59, 83, 0, 135, 69, 83, 0, 135, 79, 83, 0, 135, 89, 83, 0, 135, 99, 83, 0, 135, 109, 83, 0, 135, 119, 83, 0, 135, 129, 83, 0, 135, 139, 83, 0, 135, 149, 83, 0, 135, 159, 83, 0, 135, 169, 83, 0, 135, 179, 83, 0, 135, 189, 83, 0, 135, 199, 83, 0, 135, 209, 83, 0, 135, 219, 83, 0, 135, 229, 83, 0, 135, 239, 83, 0, 135, 249, 83, 0, 135, 3, 84, 0, 135, 13, 84, 0, 135, 23, 84, 0, 135, 33, 84, 0, 135, 43, 84, 0, 135, 53, 84, 0, 135, 63, 84, 0, 135, 73, 84, 0, 135, 83, 84, 0, 135, 93, 84, 0, 135, 103, 84, 0, 135, 113, 84, 0, 135, 123, 84, 0, 135, 133, 84, 0, 135, 143, 84, 0, 135, 153, 84, 0, 135, 163, 84, 0, 135, 173, 84, 0, 135, 183, 84, 0, 135, 193, 84, 0, 135, 203, 84, 0, 135, 213, 84, 0, 135, 223, 84, 0, 135, 233, 84, 0, 135, 243, 84, 0, 135, 253, 84, 0, 135, 7, 85, 0, 135, 17, 85, 0, 135, 27, 85, 0, 135, 37, 85, 0, 135, 47, 85, 0, 135, 57, 85, 0, 135, 67, 85, 0, 135, 77, 85, 0, 135, 87, 85, 0, 135, 97, 85, 0, 135, 107, 85, 0, 135, 117, 85, 0, 135, 127, 85, 0, 135, 137, 85, 0, 135, 147, 85, 0, 135, 157, 85, 0, 135, 167, 85, 0, 135, 177, 85, 0, 135, 187, 85, 0, 135, 197, 85, 0, 135, 207, 85, 0, 135, 217, 85, 0, 135, 227, 85, 0, 135, 237, 85, 0, 135, 247, 85, 0, 135, 1, 86, 0, 135, 11, 86, 0, 135, 21, 86, 0, 135, 31, 86, 0, 135, 41, 86, 0, 135, 51, 86, 0, 135, 61, 86, 0, 135, 71, 86, 0, 135, 81, 86, 0, 135, 91, 86, 0, 135, 101, 86, 0, 135, 111, 86, 0, 135, 121, 86, 0, 135, 131, 86, 0, 135, 141, 86, 0, 135, 151, 86, 0, 135, 161, 86, 0, 135, 171, 86, 0, 135, 181, 86, 0, 135, 191, 86, 0, 135, 201, 86, 0, 135, 211, 86, 0, 135, 221, 86, 0, 135, 231, 86, 0, 135, 241, 86, 0, 135, 251, 86, 0, 135, 5, 87, 0, 135, 15, 87, 0, 135, 25, 87, 0, 135, 35, 87, 0, 135, 45, 87, 0, 135, 55, 87, 0, 135, 65, 87, 0, 135, 75, 87, 0, 135, 85, 87, 0, 135, 95, 87, 0, 135, 105, 87, 0, 135, 115, 87, 0, 135, 125, 87, 0, 135, 135, 87, 0, 135, 145, 87, 0, 135, 155, 87, 0, 135, 165, 87, 0, 135, 175, 87, 0, 135, 185, 87, 0, 135, 195, 87, 0, 135, 205, 87, 0, 135, 215, 87, 0, 135, 225, 87, 0, 135, 235, 87, 0, 135, 245, 87, 0, 135, 255, 87, 0, 135, 9, 88, 0, 135, 19, 88, 0, 135, 29, 88, 0, 135, 39, 88, 0, 135, 49, 88, 0, 135, 59, 88, 0, 135, 69, 88, 0, 135, 79, 88, 0, 135, 89, 88, 0, 135, 99, 88, 0, 135, 109, 88, 0, 135, 119, 88, 0, 135, 129, 88, 0, 135, 139, 88, 0, 135, 149, 88, 0, 135, 159, 88, 0, 135, 169, 88, 0, 135, 179, 88, 0, 135, 189, 88, 0, 135, 199, 88, 0, 135, 209, 88, 0, 135, 219, 88, 0, 135, 229, 88, 0, 135, 239, 88, 0, 135, 249, 88, 0, 135, 3, 89, 0, 135, 13, 89, 0, 135, 23, 89, 0, 135, 33, 89, 0, 135, 43, 89, 0, 135, 53, 89, 0, 135, 63, 89, 0, 135, 73, 89, 0, 135, 83, 89, 0, 135, 93, 89, 0, 135, 103, 89, 0, 135, 113, 89, 0, 135, 123, 89, 0, 135, 133, 89, 0, 135, 143, 89, 0, 135, 153, 89, 0, 135, 163, 89, 0, 135, 173, 89, 0, 135, 183, 89, 0, 135, 193, 89, 0, 135, 203, 89, 0, 135, 213, 89, 0, 135, 223, 89, 0, 135, 233, 89, 0, 135, 243, 89, 0, 135, 253, 89, 0, 135, 7, 90, 0, 135, 17, 90, 0, 135, 27, 90, 0, 135, 37, 90, 0, 135, 47, 90, 0, 135, 57, 90, 0, 135, 67, 90, 0, 135, 77, 90, 0, 135, 87, 90, 0, 135, 97, 90, 0, 135, 107, 90, 0, 135, 117, 90, 0, 135, 127, 90, 0, 135, 137, 90, 0, 135, 147, 90, 0, 135, 157, 90, 0, 135, 167, 90, 0, 135, 177, 90, 0, 135, 187, 90, 0, 135, 197, 90, 0, 135, 207, 90, 0, 135, 217, 90, 0, 135, 227, 90, 0, 135, 237, 90, 0, 135, 247, 90, 0, 135, 1, 91, 0, 135, 11, 91, 0, 135, 21, 91, 0, 135, 31, 91, 0, 135, 41, 91, 0, 135, 51, 91, 0, 135, 61, 91, 0, 135, 71, 91, 0, 135, 81, 91, 0, 135, 91, 91, 0, 135, 101, 91, 0, 135, 111, 91, 0, 135, 121, 91, 0, 135, 131, 91, 0, 135, 141, 91, 0, 135, 151, 91, 0, 135, 161, 91, 0, 135, 171, 91, 0, 135, 181, 91, 0, 135, 191, 91, 0, 135, 201, 91, 0, 135, 211, 91, 0, 135, 221, 91, 0, 135, 231, 91, 0, 135, 241, 91, 0, 135, 251, 91, 0, 135, 5, 92, 0, 135, 15, 92, 0, 135, 25, 92, 0, 135, 35, 92, 0, 135, 45, 92, 0, 135, 55, 92, 0, 135, 65, 92, 0, 135, 75, 92, 0, 135, 85, 92, 0, 135, 95, 92, 0, 135, 105, 92, 0, 135, 115, 92, 0, 135, 125, 92, 0, 135, 135, 92, 0, 135, 145, 92, 0, 135, 155, 92, 0, 135, 165, 92, 0, 135, 175, 92, 0, 135, 185, 92, 0, 135, 195, 92, 0, 135, 205, 92, 0, 135, 215, 92, 0, 135, 225, 92, 0, 135, 235, 92, 0, 135, 245, 92, 0, 135, 255, 92, 0, 135, 9, 93, 0, 135, 19, 93, 0, 135, 29, 93, 0, 135, 39, 93, 0, 135, 49, 93, 0, 135, 59, 93, 0, 135, 69, 93, 0, 135, 79, 93, 0, 135, 89, 93, 0, 135, 99, 93, 0, 135, 109, 93, 0, 135, 119, 93, 0, 135, 129, 93, 0, 135, 139, 93, 0, 135, 149, 93, 0, 135, 159, 93, 0, 135, 169, 93, 0, 135, 179, 93, 0, 135, 189, 93, 0, 135, 199, 93, 0, 135, 209, 93, 0, 135, 219, 93, 0, 135, 229, 93, 0, 135, 239, 93, 0, 135, 249, 93, 0, 135, 3, 94, 0, 135, 13, 94, 0, 135, 23, 94, 0, 135, 33, 94, 0, 135, 43, 94, 0, 135, 53, 94, 0, 135, 63, 94, 0, 135, 73, 94, 0, 135, 83, 94, 0, 135, 93, 94, 0, 135, 103, 94, 0, 135, 113, 94, 0, 135, 123, 94, 0, 135, 133, 94, 0, 135, 143, 94, 0, 135, 153, 94, 0, 135, 163, 94, 0, 135, 173, 94, 0, 135, 183, 94, 0, 135, 193, 94, 0, 135, 203, 94, 0, 135, 213, 94, 0, 135, 223, 94, 0, 135, 233, 94, 0, 135, 243, 94, 0, 135, 253, 94, 0, 135, 7, 95, 0, 135, 17, 95, 0, 135, 27, 95, 0, 135, 37, 95, 0, 135, 47, 95, 0, 135, 57, 95, 0, 135, 67, 95, 0, 135, 77, 95, 0, 135, 87, 95, 0, 135, 97, 95, 0, 135, 107, 95, 0, 135, 117, 95, 0, 135, 127, 95, 0, 135, 137, 95, 0, 135, 147, 95, 0, 135, 157, 95, 0, 135, 167, 95, 0, 135, 177, 95, 0, 135, 187, 95, 0, 135, 197, 95, 0, 135, 207, 95, 0, 135, 217, 95, 0, 135, 227, 95, 0, 135, 237, 95, 0, 135, 247, 95, 0, 135, 1, 96, 0, 135, 11, 96, 0, 135, 21, 96, 0, 135, 31, 96, 0, 135, 41, 96, 0, 135, 51, 96, 0, 135, 61, 96, 0, 135, 71, 96, 0, 135, 81, 96, 0, 135, 91, 96, 0, 135, 101, 96, 0, 135, 111, 96, 0, 135, 121, 96, 0, 135, 131, 96, 0, 135, 141, 96, 0, 135, 151, 96, 0, 135, 161, 96, 0, 135, 171, 96, 0, 135, 181, 96, 0, 135, 191, 96, 0, 135, 201, 96, 0, 135, 211, 96, 0, 135, 221, 96, 0, 135, 231, 96, 0, 135, 241, 96, 0, 135, 251, 96, 0, 135, 5, 97, 0, 135, 15, 97, 0, 135, 25, 97, 0, 135, 35, 97, 0, 135, 45, 97, 0, 135, 55, 97, 0, 135, 65, 97, 0, 135, 75, 97, 0, 135, 85, 97, 0, 135, 95, 97, 0, 135, 105, 97, 0, 135, 115, 97, 0, 135, 125, 97, 0, 135, 135, 97, 0, 135, 145, 97, 0, 135, 155, 97, 0, 135, 165, 97, 0, 1], [], [], [], [133, 37, 0, 0, 133, 77, 0, 0, 133, 117, 0, 0, 133, 157, 0, 0, 133, 197, 0, 0, 133, 237, 0, 0, 133, 21, 1, 0, 133, 61, 1, 0, 133, 101, 1, 0, 133, 141, 1, 0, 133, 181, 1, 0, 133, 221, 1, 0, 133, 5, 2, 0, 133, 45, 2, 0, 133, 85, 2, 0, 133, 125, 2, 0, 133, 165, 2, 0, 133, 205, 2, 0, 133, 245, 2, 0, 133, 29, 3, 0, 133, 69, 3, 0, 133, 109, 3, 0, 133, 149, 3, 0, 133, 189, 3, 0, 133, 229, 3, 0, 133, 13, 4, 0, 133, 53, 4, 0, 133, 93, 4, 0, 133, 133, 4, 0, 133, 173, 4, 0, 133, 213, 4, 0, 133, 253, 4, 0, 133, 37, 5, 0, 133, 77, 5, 0, 133, 117, 5, 0, 133, 157, 5, 0, 133, 197, 5, 0, 133, 237, 5, 0, 133, 21, 6, 0, 133, 61, 6, 0, 133, 101, 6, 0, 133, 141, 6, 0, 133, 181, 6, 0, 133, 221, 6, 0, 133, 5, 7, 0, 133, 45, 7, 0, 133, 85, 7, 0, 133, 125, 7, 0, 133, 165, 7, 0, 133, 205, 7, 0, 133, 245, 7, 0, 133, 29, 8, 0, 133, 69, 8, 0, 133, 109, 8, 0, 133, 149, 8, 0, 133, 189, 8, 0, 133, 229, 8, 0, 133, 13, 9, 0, 133, 53, 9, 0, 133, 93, 9, 0, 133, 133, 9, 0, 133, 173, 9, 0, 133, 213, 9, 0, 133, 253, 9, 0, 133, 37, 10, 0, 133, 77, 10, 0, 133, 117, 10, 0, 133, 157, 10, 0, 133, 197, 10, 0, 133, 237, 10, 0, 133, 21, 11, 0, 133, 61, 11, 0, 133, 101, 11, 0, 133, 141, 11, 0, 133, 181, 11, 0, 133, 221, 11, 0, 133, 5, 12, 0, 133, 45, 12, 0, 133, 85, 12, 0, 133, 125, 12, 0, 133, 165, 12, 0, 133, 205, 12, 0, 133, 245, 12, 0, 133, 29, 13, 0, 133, 69, 13, 0, 133, 109, 13, 0, 133, 149, 13, 0, 133, 189, 13, 0, 133, 229, 13, 0, 133, 13, 14, 0, 133, 53, 14, 0, 133, 93, 14, 0, 133, 133, 14, 0, 133, 173, 14, 0, 133, 213, 14, 0, 133, 253, 14, 0, 133, 37, 15, 0, 133, 77, 15, 0, 133, 117, 15, 0, 133, 157, 15, 0, 133, 197, 15, 0, 133, 237, 15, 0, 133, 21, 16, 0, 133, 61, 16, 0, 133, 101, 16, 0, 133, 141, 16, 0, 133, 181, 16, 0, 133, 221, 16, 0, 133, 5, 17, 0, 133, 45, 17, 0, 133, 85, 17, 0, 133, 125, 17, 0, 133, 165, 17, 0, 133, 205, 17, 0, 133, 245, 17, 0, 133, 29, 18, 0, 133, 69, 18, 0, 133, 109, 18, 0, 133, 149, 18, 0, 133, 189, 18, 0, 133, 229, 18, 0, 133, 13, 19, 0, 133, 53, 19, 0, 133, 93, 19, 0, 133, 133, 19, 0, 133, 173, 19, 0, 133, 213, 19, 0, 133, 253, 19, 0, 133, 37, 20, 0, 133, 77, 20, 0, 133, 117, 20, 0, 133, 157, 20, 0, 133, 197, 20, 0, 133, 237, 20, 0, 133, 21, 21, 0, 133, 61, 21, 0, 133, 101, 21, 0, 133, 141, 21, 0, 133, 181, 21, 0, 133, 221, 21, 0, 133, 5, 22, 0, 133, 45, 22, 0, 133, 85, 22, 0, 133, 125, 22, 0, 133, 165, 22, 0, 133, 205, 22, 0, 133, 245, 22, 0, 133, 29, 23, 0, 133, 69, 23, 0, 133, 109, 23, 0, 133, 149, 23, 0, 133, 189, 23, 0, 133, 229, 23, 0, 133, 13, 24, 0, 133, 53, 24, 0, 133, 93, 24, 0, 133, 133, 24, 0, 133, 173, 24, 0, 133, 213, 24, 0, 133, 253, 24, 0, 133, 37, 25, 0, 133, 77, 25, 0, 133, 117, 25, 0, 133, 157, 25, 0, 133, 197, 25, 0, 133, 237, 25, 0, 133, 21, 26, 0, 133, 61, 26, 0, 133, 101, 26, 0, 133, 141, 26, 0, 133, 181, 26, 0, 133, 221, 26, 0, 133, 5, 27, 0, 133, 45, 27, 0, 133, 85, 27, 0, 133, 125, 27, 0, 133, 165, 27, 0, 133, 205, 27, 0, 133, 245, 27, 0, 133, 29, 28, 0, 133, 69, 28, 0, 133, 109, 28, 0, 133, 149, 28, 0, 133, 189, 28, 0, 133, 229, 28, 0, 133, 13, 29, 0, 133, 53, 29, 0, 133, 93, 29, 0, 133, 133, 29, 0, 133, 173, 29, 0, 133, 213, 29, 0, 133, 253, 29, 0, 133, 37, 30, 0, 133, 77, 30, 0, 133, 117, 30, 0, 133, 157, 30, 0, 133, 197, 30, 0, 133, 237, 30, 0, 133, 21, 31, 0, 133, 61, 31, 0, 133, 101, 31, 0, 133, 141, 31, 0, 133, 181, 31, 0, 133, 221, 31, 0, 133, 5, 32, 0, 133, 45, 32, 0, 133, 85, 32, 0, 133, 125, 32, 0, 133, 165, 32, 0, 133, 205, 32, 0, 133, 245, 32, 0, 133, 29, 33, 0, 133, 69, 33, 0, 133, 109, 33, 0, 133, 149, 33, 0, 133, 189, 33, 0, 133, 229, 33, 0, 133, 13, 34, 0, 133, 53, 34, 0, 133, 93, 34, 0, 133, 133, 34, 0, 133, 173, 34, 0, 133, 213, 34, 0, 133, 253, 34, 0, 133, 37, 35, 0, 133, 77, 35, 0, 133, 117, 35, 0, 133, 157, 35, 0, 133, 197, 35, 0, 133, 237, 35, 0, 133, 21, 36, 0, 133, 61, 36, 0, 133, 101, 36, 0, 133, 141, 36, 0, 133, 181, 36, 0, 133, 221, 36, 0, 133, 5, 37, 0, 133, 45, 37, 0, 133, 85, 37, 0, 133, 125, 37, 0, 133, 165, 37, 0, 133, 205, 37, 0, 133, 245, 37, 0, 133, 29, 38, 0, 133, 69, 38, 0, 133, 109, 38, 0, 133, 149, 38, 0, 133, 189, 38, 0, 133, 229, 38, 0, 133, 13, 39, 0, 133, 53, 39, 0, 133, 93, 39, 0, 133, 133, 39, 0, 133, 173, 39, 0, 133, 213, 39, 0, 133, 253, 39, 0, 133, 37, 40, 0, 133, 77, 40, 0, 133, 117, 40, 0, 133, 157, 40, 0, 133, 197, 40, 0, 133, 237, 40, 0, 133, 21, 41, 0, 133, 61, 41, 0, 133, 101, 41, 0, 133, 141, 41, 0, 133, 181, 41, 0, 133, 221, 41, 0, 133, 5, 42, 0, 133, 45, 42, 0, 133, 85, 42, 0, 133, 125, 42, 0, 133, 165, 42, 0, 133, 205, 42, 0, 133, 245, 42, 0, 133, 29, 43, 0, 133, 69, 43, 0, 133, 109, 43, 0, 133, 149, 43, 0, 133, 189, 43, 0, 133, 229, 43, 0, 133, 13, 44, 0, 133, 53, 44, 0, 133, 93, 44, 0, 133, 133, 44, 0, 133, 173, 44, 0, 133, 213, 44, 0, 133, 253, 44, 0, 133, 37, 45, 0, 133, 77, 45, 0, 133, 117, 45, 0, 133, 157, 45, 0, 133, 197, 45, 0, 133, 237, 45, 0, 133, 21, 46, 0, 133, 61, 46, 0, 133, 101, 46, 0, 133, 141, 46, 0, 133, 181, 46, 0, 133, 221, 46, 0, 133, 5, 47, 0, 133, 45, 47, 0, 133, 85, 47, 0, 133, 125, 47, 0, 133, 165, 47, 0, 133, 205, 47, 0, 133, 245, 47, 0, 133, 29, 48, 0, 133, 69, 48, 0, 133, 109, 48, 0, 133, 149, 48, 0, 133, 189, 48, 0, 133, 229, 48, 0, 133, 13, 49, 0, 133, 53, 49, 0, 133, 93, 49, 0, 133, 133, 49, 0, 133, 173, 49, 0, 133, 213, 49, 0, 133, 253, 49, 0, 133, 37, 50, 0, 133, 77, 50, 0, 133, 117, 50, 0, 133, 157, 50, 0, 133, 197, 50, 0, 133, 237, 50, 0, 133, 21, 51, 0, 133, 61, 51, 0, 133, 101, 51, 0, 133, 141, 51, 0, 133, 181, 51, 0, 133, 221, 51, 0, 133, 5, 52, 0, 133, 45, 52, 0, 133, 85, 52, 0, 133, 125, 52, 0, 133, 165, 52, 0, 133, 205, 52, 0, 133, 245, 52, 0, 133, 29, 53, 0, 133, 69, 53, 0, 133, 109, 53, 0, 133, 149, 53, 0, 133, 189, 53, 0, 133, 229, 53, 0, 133, 13, 54, 0, 133, 53, 54, 0, 133, 93, 54, 0, 133, 133, 54, 0, 133, 173, 54, 0, 133, 213, 54, 0, 133, 253, 54, 0, 133, 37, 55, 0, 133, 77, 55, 0, 133, 117, 55, 0, 133, 157, 55, 0, 133, 197, 55, 0, 133, 237, 55, 0, 133, 21, 56, 0, 133, 61, 56, 0, 133, 101, 56, 0, 133, 141, 56, 0, 133, 181, 56, 0, 133, 221, 56, 0, 133, 5, 57, 0, 133, 45, 57, 0, 133, 85, 57, 0, 133, 125, 57, 0, 133, 165, 57, 0, 133, 205, 57, 0, 133, 245, 57, 0, 133, 29, 58, 0, 133, 69, 58, 0, 133, 109, 58, 0, 133, 149, 58, 0, 133, 189, 58, 0, 133, 229, 58, 0, 133, 13, 59, 0, 133, 53, 59, 0, 133, 93, 59, 0, 133, 133, 59, 0, 133, 173, 59, 0, 133, 213, 59, 0, 133, 253, 59, 0, 133, 37, 60, 0, 133, 77, 60, 0, 133, 117, 60, 0, 133, 157, 60, 0, 133, 197, 60, 0, 133, 237, 60, 0, 133, 21, 61, 0, 133, 61, 61, 0, 133, 101, 61, 0, 133, 141, 61, 0, 133, 181, 61, 0, 133, 221, 61, 0, 133, 5, 62, 0, 133, 45, 62, 0, 133, 85, 62, 0, 133, 125, 62, 0, 133, 165, 62, 0, 133, 205, 62, 0, 133, 245, 62, 0, 133, 29, 63, 0, 133, 69, 63, 0, 133, 109, 63, 0, 133, 149, 63, 0, 133, 189, 63, 0, 133, 229, 63, 0, 133, 13, 64, 0, 133, 53, 64, 0, 133, 93, 64, 0, 133, 133, 64, 0, 133, 173, 64, 0, 133, 213, 64, 0, 133, 253, 64, 0, 133, 37, 65, 0, 133, 77, 65, 0, 133, 117, 65, 0, 133, 157, 65, 0, 133, 197, 65, 0, 133, 237, 65, 0, 133, 21, 66, 0, 133, 61, 66, 0, 133, 101, 66, 0, 133, 141, 66, 0, 133, 181, 66, 0, 133, 221, 66, 0, 133, 5, 67, 0, 133, 45, 67, 0, 133, 85, 67, 0, 133, 125, 67, 0, 133, 165, 67, 0, 133, 205, 67, 0, 133, 245, 67, 0, 133, 29, 68, 0, 133, 69, 68, 0, 133, 109, 68, 0, 133, 149, 68, 0, 133, 189, 68, 0, 133, 229, 68, 0, 133, 13, 69, 0, 133, 53, 69, 0, 133, 93, 69, 0, 133, 133, 69, 0, 133, 173, 69, 0, 133, 213, 69, 0, 133, 253, 69, 0, 133, 37, 70, 0, 133, 77, 70, 0, 133, 117, 70, 0, 133, 157, 70, 0, 133, 197, 70, 0, 133, 237, 70, 0, 133, 21, 71, 0, 133, 61, 71, 0, 133, 101, 71, 0, 133, 141, 71, 0, 133, 181, 71, 0, 133, 221, 71, 0, 133, 5, 72, 0, 133, 45, 72, 0, 133, 85, 72, 0, 133, 125, 72, 0, 133, 165, 72, 0, 133, 205, 72, 0, 133, 245, 72, 0, 133, 29, 73, 0, 133, 69, 73, 0, 133, 109, 73, 0, 133, 149, 73, 0, 133, 189, 73, 0, 133, 229, 73, 0, 133, 13, 74, 0, 133, 53, 74, 0, 133, 93, 74, 0, 133, 133, 74, 0, 133, 173, 74, 0, 133, 213, 74, 0, 133, 253, 74, 0, 133, 37, 75, 0, 133, 77, 75, 0, 133, 117, 75, 0, 133, 157, 75, 0, 133, 197, 75, 0, 133, 237, 75, 0, 133, 21, 76, 0, 133, 61, 76, 0, 133, 101, 76, 0, 133, 141, 76, 0, 133, 181, 76, 0, 133, 221, 76, 0, 133, 5, 77, 0, 133, 45, 77, 0, 133, 85, 77, 0, 133, 125, 77, 0, 133, 165, 77, 0, 133, 205, 77, 0, 133, 245, 77, 0, 133, 29, 78, 0, 133, 69, 78, 0, 133, 109, 78, 0, 133, 149, 78, 0, 133, 189, 78, 0, 133, 229, 78, 0, 133, 13, 79, 0, 133, 53, 79, 0, 133, 93, 79, 0, 133, 133, 79, 0, 133, 173, 79, 0, 133, 213, 79, 0, 133, 253, 79, 0, 133, 37, 80, 0, 133, 77, 80, 0, 133, 117, 80, 0, 133, 157, 80, 0, 133, 197, 80, 0, 133, 237, 80, 0, 133, 21, 81, 0, 133, 61, 81, 0, 133, 101, 81, 0, 133, 141, 81, 0, 133, 181, 81, 0, 133, 221, 81, 0, 133, 5, 82, 0, 133, 45, 82, 0, 133, 85, 82, 0, 133, 125, 82, 0, 133, 165, 82, 0, 133, 205, 82, 0, 133, 245, 82, 0, 133, 29, 83, 0, 133, 69, 83, 0, 133, 109, 83, 0, 133, 149, 83, 0, 133, 189, 83, 0, 133, 229, 83, 0, 133, 13, 84, 0, 133, 53, 84, 0, 133, 93, 84, 0, 133, 133, 84, 0, 133, 173, 84, 0, 133, 213, 84, 0, 133, 253, 84, 0, 133, 37, 85, 0, 133, 77, 85, 0, 133, 117, 85, 0, 133, 157, 85, 0, 133, 197, 85, 0, 133, 237, 85, 0, 133, 21, 86, 0, 133, 61, 86, 0, 133, 101, 86, 0, 133, 141, 86, 0, 133, 181, 86, 0, 133, 221, 86, 0, 133, 5, 87, 0, 133, 45, 87, 0, 133, 85, 87, 0, 133, 125, 87, 0, 133, 165, 87, 0, 133, 205, 87, 0, 133, 245, 87, 0, 133, 29, 88, 0, 133, 69, 88, 0, 133, 109, 88, 0, 133, 149, 88, 0, 133, 189, 88, 0, 133, 229, 88, 0, 133, 13, 89, 0, 133, 53, 89, 0, 133, 93, 89, 0, 133, 133, 89, 0, 133, 173, 89, 0, 133, 213, 89, 0, 133, 253, 89, 0, 133, 37, 90, 0, 133, 77, 90, 0, 133, 117, 90, 0, 133, 157, 90, 0, 133, 197, 90, 0, 133, 237, 90, 0, 133, 21, 91, 0, 133, 61, 91, 0, 133, 101, 91, 0, 133, 141, 91, 0, 133, 181, 91, 0, 133, 221, 91, 0, 133, 5, 92, 0, 133, 45, 92, 0, 133, 85, 92, 0, 133, 125, 92, 0, 133, 165, 92, 0, 133, 205, 92, 0, 133, 245, 92, 0, 133, 29, 93, 0, 133, 69, 93, 0, 133, 109, 93, 0, 133, 149, 93, 0, 133, 189, 93, 0, 133, 229, 93, 0, 133, 13, 94, 0, 133, 53, 94, 0, 133, 93, 94, 0, 133, 133, 94, 0, 133, 173, 94, 0, 133, 213, 94, 0, 133, 253, 94, 0, 133, 37, 95, 0, 133, 77, 95, 0, 133, 117, 95, 0, 133, 157, 95, 0, 133, 197, 95, 0, 133, 237, 95, 0, 133, 21, 96, 0, 133, 61, 96, 0, 133, 101, 96, 0, 133, 141, 96, 0, 133, 181, 96, 0, 133, 221, 96, 0, 133, 5, 97, 0, 133, 45, 97, 0, 133, 85, 97, 0, 133, 125, 97, 0, 133, 165, 97, 0, 133, 205, 97, 0, 133, 245, 97, 0, 133, 29, 98, 0, 133, 69, 98, 0, 133, 109, 98, 0, 133, 149, 98, 0, 133, 189, 98, 0, 133, 229, 98, 0, 133, 13, 99, 0, 133, 53, 99, 0, 133, 93, 99, 0, 133, 133, 99, 0, 133, 173, 99, 0, 133, 213, 99, 0, 133, 253, 99, 0, 133, 37, 100, 0, 133, 77, 100, 0, 133, 117, 100, 0, 133, 157, 100, 0, 133, 197, 100, 0, 133, 237, 100, 0, 133, 21, 101, 0, 133, 61, 101, 0, 133, 101, 101, 0, 133, 141, 101, 0, 133, 181, 101, 0, 133, 221, 101, 0, 133, 5, 102, 0, 133, 45, 102, 0, 133, 85, 102, 0, 133, 125, 102, 0, 133, 165, 102, 0, 133, 205, 102, 0, 133, 245, 102, 0, 133, 29, 103, 0, 133, 69, 103, 0, 133, 109, 103, 0, 133, 149, 103, 0, 133, 189, 103, 0, 133, 229, 103, 0, 133, 13, 104, 0, 133, 53, 104, 0, 133, 93, 104, 0, 133, 133, 104, 0, 133, 173, 104, 0, 133, 213, 104, 0, 133, 253, 104, 0, 133, 37, 105, 0, 133, 77, 105, 0, 133, 117, 105, 0, 133, 157, 105, 0, 133, 197, 105, 0, 133, 237, 105, 0, 133, 21, 106, 0, 133, 61, 106, 0, 133, 101, 106, 0, 133, 141, 106, 0, 133, 181, 106, 0, 133, 221, 106, 0, 133, 5, 107, 0, 133, 45, 107, 0, 133, 85, 107, 0, 133, 125, 107, 0, 133, 165, 107, 0, 133, 205, 107, 0, 133, 245, 107, 0, 133, 29, 108, 0, 133, 69, 108, 0, 133, 109, 108, 0, 133, 149, 108, 0, 133, 189, 108, 0, 133, 229, 108, 0, 133, 13, 109, 0, 133, 53, 109, 0, 133, 93, 109, 0, 133, 133, 109, 0, 133, 173, 109, 0, 133, 213, 109, 0, 133, 253, 109, 0, 133, 37, 110, 0, 133, 77, 110, 0, 133, 117, 110, 0, 133, 157, 110, 0, 133, 197, 110, 0, 133, 237, 110, 0, 133, 21, 111, 0, 133, 61, 111, 0, 133, 101, 111, 0, 133, 141, 111, 0, 133, 181, 111, 0, 133, 221, 111, 0, 133, 5, 112, 0, 133, 45, 112, 0, 133, 85, 112, 0, 133, 125, 112, 0, 133, 165, 112, 0, 133, 205, 112, 0, 133, 245, 112, 0, 133, 29, 113, 0, 133, 69, 113, 0, 133, 109, 113, 0, 133, 149, 113, 0, 133, 189, 113, 0, 133, 229, 113, 0, 133, 13, 114, 0, 133, 53, 114, 0, 133, 93, 114, 0, 133, 133, 114, 0, 133, 173, 114, 0, 133, 213, 114, 0, 133, 253, 114, 0, 133, 37, 115, 0, 133, 77, 115, 0, 133, 117, 115, 0, 133, 157, 115, 0, 133, 197, 115, 0, 133, 237, 115, 0, 133, 21, 116, 0, 133, 61, 116, 0, 133, 101, 116, 0, 133, 141, 116, 0, 133, 181, 116, 0, 133, 221, 116, 0, 133, 5, 117, 0, 133, 45, 117, 0, 133, 85, 117, 0, 133, 125, 117, 0, 133, 165, 117, 0, 133, 205, 117, 0, 133, 245, 117, 0, 133, 29, 118, 0, 133, 69, 118, 0, 133, 109, 118, 0, 133, 149, 118, 0, 133, 189, 118, 0, 133, 229, 118, 0, 133, 13, 119, 0, 133, 53, 119, 0, 133, 93, 119, 0, 133, 133, 119, 0, 133, 173, 119, 0, 133, 213, 119, 0, 133, 253, 119, 0, 133, 37, 120, 0, 133, 77, 120, 0, 133, 117, 120, 0, 133, 157, 120, 0, 133, 197, 120, 0, 133, 237, 120, 0, 133, 21, 121, 0, 133, 61, 121, 0, 133, 101, 121, 0, 133, 141, 121, 0, 133, 181, 121, 0, 133, 221, 121, 0, 133, 5, 122, 0, 133, 45, 122, 0, 133, 85, 122, 0, 133, 125, 122, 0, 133, 165, 122, 0, 133, 205, 122, 0, 133, 245, 122, 0, 133, 29, 123, 0, 133, 69, 123, 0, 133, 109, 123, 0, 133, 149, 123, 0, 133, 189, 123, 0, 133, 229, 123, 0, 133, 13, 124, 0, 133, 53, 124, 0, 133, 93, 124, 0, 133, 133, 124, 0, 133, 173, 124, 0, 133, 213, 124, 0, 133, 253, 124, 0, 133, 37, 125, 0, 133, 77, 125, 0, 133, 117, 125, 0, 133, 157, 125, 0, 133, 197, 125, 0, 133, 237, 125, 0, 133, 21, 126, 0, 133, 61, 126, 0, 133, 101, 126, 0, 133, 141, 126, 0, 133, 181, 126, 0, 133, 221, 126, 0, 133, 5, 127, 0, 133, 45, 127, 0, 133, 85, 127, 0, 133, 125, 127, 0, 133, 165, 127, 0, 133, 205, 127, 0, 133, 245, 127, 0, 133, 29, 128, 0, 133, 69, 128, 0, 133, 109, 128, 0, 133, 149, 128, 0, 133, 189, 128, 0, 133, 229, 128, 0, 133, 13, 129, 0, 133, 53, 129, 0, 133, 93, 129, 0, 133, 133, 129, 0, 133, 173, 129, 0, 133, 213, 129, 0, 133, 253, 129, 0, 133, 37, 130, 0, 133, 77, 130, 0, 133, 117, 130, 0, 133, 157, 130, 0, 133, 197, 130, 0, 133, 237, 130, 0, 133, 21, 131, 0, 133, 61, 131, 0, 133, 101, 131, 0, 133, 141, 131, 0, 133, 181, 131, 0, 133, 221, 131, 0, 133, 5, 132, 0, 133, 45, 132, 0, 133, 85, 132, 0, 133, 125, 132, 0, 133, 165, 132, 0, 133, 205, 132, 0, 133, 245, 132, 0, 133, 29, 133, 0, 133, 69, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_too_many_channels.json b/tests/recordings/logic_analyzer/test_capture_too_many_channels.json deleted file mode 100644 index e6f94764..00000000 --- a/tests/recordings/logic_analyzer/test_capture_too_many_channels.json +++ /dev/null @@ -1 +0,0 @@ -[[], []] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_too_many_events.json b/tests/recordings/logic_analyzer/test_capture_too_many_events.json deleted file mode 100644 index e6f94764..00000000 --- a/tests/recordings/logic_analyzer/test_capture_too_many_events.json +++ /dev/null @@ -1 +0,0 @@ -[[], []] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_capture_two_channels.json b/tests/recordings/logic_analyzer/test_capture_two_channels.json deleted file mode 100644 index c4930197..00000000 --- a/tests/recordings/logic_analyzer/test_capture_two_channels.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [5], [196, 9], [0], [17], [16], [10], [9], [196, 9], [0], [10], [9], [196, 9], [1]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [16, 0, 0, 0, 79, 1, 0, 0, 144, 2, 0, 0, 207, 3, 0, 0, 16, 5, 0, 0, 79, 6, 0, 0, 144, 7, 0, 0, 207, 8, 0, 0, 16, 10, 0, 0, 79, 11, 0, 0, 144, 12, 0, 0, 207, 13, 0, 0, 16, 15, 0, 0, 79, 16, 0, 0, 144, 17, 0, 0, 207, 18, 0, 0, 16, 20, 0, 0, 79, 21, 0, 0, 144, 22, 0, 0, 207, 23, 0, 0, 16, 25, 0, 0, 79, 26, 0, 0, 144, 27, 0, 0, 207, 28, 0, 0, 16, 30, 0, 0, 79, 31, 0, 0, 144, 32, 0, 0, 207, 33, 0, 0, 16, 35, 0, 0, 79, 36, 0, 0, 144, 37, 0, 0, 207, 38, 0, 0, 16, 40, 0, 0, 79, 41, 0, 0, 144, 42, 0, 0, 207, 43, 0, 0, 16, 45, 0, 0, 79, 46, 0, 0, 144, 47, 0, 0, 207, 48, 0, 0, 16, 50, 0, 0, 79, 51, 0, 0, 144, 52, 0, 0, 207, 53, 0, 0, 16, 55, 0, 0, 79, 56, 0, 0, 144, 57, 0, 0, 207, 58, 0, 0, 16, 60, 0, 0, 79, 61, 0, 0, 144, 62, 0, 0, 207, 63, 0, 0, 16, 65, 0, 0, 79, 66, 0, 0, 144, 67, 0, 0, 207, 68, 0, 0, 16, 70, 0, 0, 79, 71, 0, 0, 144, 72, 0, 0, 207, 73, 0, 0, 16, 75, 0, 0, 79, 76, 0, 0, 144, 77, 0, 0, 207, 78, 0, 0, 16, 80, 0, 0, 79, 81, 0, 0, 144, 82, 0, 0, 207, 83, 0, 0, 16, 85, 0, 0, 79, 86, 0, 0, 144, 87, 0, 0, 207, 88, 0, 0, 16, 90, 0, 0, 79, 91, 0, 0, 144, 92, 0, 0, 207, 93, 0, 0, 16, 95, 0, 0, 79, 96, 0, 0, 144, 97, 0, 0, 207, 98, 0, 0, 16, 100, 0, 0, 79, 101, 0, 0, 144, 102, 0, 0, 207, 103, 0, 0, 16, 105, 0, 0, 79, 106, 0, 0, 144, 107, 0, 0, 207, 108, 0, 0, 16, 110, 0, 0, 79, 111, 0, 0, 144, 112, 0, 0, 207, 113, 0, 0, 16, 115, 0, 0, 79, 116, 0, 0, 144, 117, 0, 0, 207, 118, 0, 0, 16, 120, 0, 0, 79, 121, 0, 0, 144, 122, 0, 0, 207, 123, 0, 0, 16, 125, 0, 0, 79, 126, 0, 0, 144, 127, 0, 0, 207, 128, 0, 0, 16, 130, 0, 0, 79, 131, 0, 0, 144, 132, 0, 0, 207, 133, 0, 0, 16, 135, 0, 0, 79, 136, 0, 0, 144, 137, 0, 0, 207, 138, 0, 0, 16, 140, 0, 0, 79, 141, 0, 0, 144, 142, 0, 0, 207, 143, 0, 0, 16, 145, 0, 0, 79, 146, 0, 0, 144, 147, 0, 0, 207, 148, 0, 0, 16, 150, 0, 0, 79, 151, 0, 0, 144, 152, 0, 0, 207, 153, 0, 0, 16, 155, 0, 0, 79, 156, 0, 0, 144, 157, 0, 0, 207, 158, 0, 0, 16, 160, 0, 0, 79, 161, 0, 0, 144, 162, 0, 0, 207, 163, 0, 0, 16, 165, 0, 0, 79, 166, 0, 0, 144, 167, 0, 0, 207, 168, 0, 0, 16, 170, 0, 0, 79, 171, 0, 0, 144, 172, 0, 0, 207, 173, 0, 0, 16, 175, 0, 0, 79, 176, 0, 0, 144, 177, 0, 0, 207, 178, 0, 0, 16, 180, 0, 0, 79, 181, 0, 0, 144, 182, 0, 0, 207, 183, 0, 0, 16, 185, 0, 0, 79, 186, 0, 0, 144, 187, 0, 0, 207, 188, 0, 0, 16, 190, 0, 0, 79, 191, 0, 0, 144, 192, 0, 0, 207, 193, 0, 0, 16, 195, 0, 0, 79, 196, 0, 0, 144, 197, 0, 0, 207, 198, 0, 0, 16, 200, 0, 0, 79, 201, 0, 0, 144, 202, 0, 0, 207, 203, 0, 0, 16, 205, 0, 0, 79, 206, 0, 0, 144, 207, 0, 0, 207, 208, 0, 0, 16, 210, 0, 0, 79, 211, 0, 0, 144, 212, 0, 0, 207, 213, 0, 0, 16, 215, 0, 0, 79, 216, 0, 0, 144, 217, 0, 0, 207, 218, 0, 0, 16, 220, 0, 0, 79, 221, 0, 0, 144, 222, 0, 0, 207, 223, 0, 0, 16, 225, 0, 0, 79, 226, 0, 0, 144, 227, 0, 0, 207, 228, 0, 0, 16, 230, 0, 0, 79, 231, 0, 0, 144, 232, 0, 0, 207, 233, 0, 0, 16, 235, 0, 0, 79, 236, 0, 0, 144, 237, 0, 0, 207, 238, 0, 0, 16, 240, 0, 0, 79, 241, 0, 0, 144, 242, 0, 0, 207, 243, 0, 0, 16, 245, 0, 0, 79, 246, 0, 0, 144, 247, 0, 0, 207, 248, 0, 0, 16, 250, 0, 0, 79, 251, 0, 0, 144, 252, 0, 0, 207, 253, 0, 0, 16, 255, 0, 0, 79, 0, 1, 0, 144, 1, 1, 0, 207, 2, 1, 0, 16, 4, 1, 0, 79, 5, 1, 0, 144, 6, 1, 0, 207, 7, 1, 0, 16, 9, 1, 0, 79, 10, 1, 0, 144, 11, 1, 0, 207, 12, 1, 0, 16, 14, 1, 0, 79, 15, 1, 0, 144, 16, 1, 0, 207, 17, 1, 0, 16, 19, 1, 0, 79, 20, 1, 0, 144, 21, 1, 0, 207, 22, 1, 0, 16, 24, 1, 0, 79, 25, 1, 0, 144, 26, 1, 0, 207, 27, 1, 0, 16, 29, 1, 0, 79, 30, 1, 0, 144, 31, 1, 0, 207, 32, 1, 0, 16, 34, 1, 0, 79, 35, 1, 0, 144, 36, 1, 0, 207, 37, 1, 0, 16, 39, 1, 0, 79, 40, 1, 0, 144, 41, 1, 0, 207, 42, 1, 0, 16, 44, 1, 0, 79, 45, 1, 0, 144, 46, 1, 0, 207, 47, 1, 0, 16, 49, 1, 0, 79, 50, 1, 0, 144, 51, 1, 0, 207, 52, 1, 0, 16, 54, 1, 0, 79, 55, 1, 0, 144, 56, 1, 0, 207, 57, 1, 0, 16, 59, 1, 0, 79, 60, 1, 0, 144, 61, 1, 0, 207, 62, 1, 0, 16, 64, 1, 0, 79, 65, 1, 0, 144, 66, 1, 0, 207, 67, 1, 0, 16, 69, 1, 0, 79, 70, 1, 0, 144, 71, 1, 0, 207, 72, 1, 0, 16, 74, 1, 0, 79, 75, 1, 0, 144, 76, 1, 0, 207, 77, 1, 0, 16, 79, 1, 0, 79, 80, 1, 0, 144, 81, 1, 0, 207, 82, 1, 0, 16, 84, 1, 0, 79, 85, 1, 0, 144, 86, 1, 0, 207, 87, 1, 0, 16, 89, 1, 0, 79, 90, 1, 0, 144, 91, 1, 0, 207, 92, 1, 0, 16, 94, 1, 0, 79, 95, 1, 0, 144, 96, 1, 0, 207, 97, 1, 0, 16, 99, 1, 0, 79, 100, 1, 0, 144, 101, 1, 0, 207, 102, 1, 0, 16, 104, 1, 0, 79, 105, 1, 0, 144, 106, 1, 0, 207, 107, 1, 0, 16, 109, 1, 0, 79, 110, 1, 0, 144, 111, 1, 0, 207, 112, 1, 0, 16, 114, 1, 0, 79, 115, 1, 0, 144, 116, 1, 0, 207, 117, 1, 0, 16, 119, 1, 0, 79, 120, 1, 0, 144, 121, 1, 0, 207, 122, 1, 0, 16, 124, 1, 0, 79, 125, 1, 0, 144, 126, 1, 0, 207, 127, 1, 0, 16, 129, 1, 0, 79, 130, 1, 0, 144, 131, 1, 0, 207, 132, 1, 0, 16, 134, 1, 0, 79, 135, 1, 0, 144, 136, 1, 0, 207, 137, 1, 0, 16, 139, 1, 0, 79, 140, 1, 0, 144, 141, 1, 0, 207, 142, 1, 0, 16, 144, 1, 0, 79, 145, 1, 0, 144, 146, 1, 0, 207, 147, 1, 0, 16, 149, 1, 0, 79, 150, 1, 0, 144, 151, 1, 0, 207, 152, 1, 0, 16, 154, 1, 0, 79, 155, 1, 0, 144, 156, 1, 0, 207, 157, 1, 0, 16, 159, 1, 0, 79, 160, 1, 0, 144, 161, 1, 0, 207, 162, 1, 0, 16, 164, 1, 0, 79, 165, 1, 0, 144, 166, 1, 0, 207, 167, 1, 0, 16, 169, 1, 0, 79, 170, 1, 0, 144, 171, 1, 0, 207, 172, 1, 0, 16, 174, 1, 0, 79, 175, 1, 0, 144, 176, 1, 0, 207, 177, 1, 0, 16, 179, 1, 0, 79, 180, 1, 0, 144, 181, 1, 0, 207, 182, 1, 0, 16, 184, 1, 0, 79, 185, 1, 0, 144, 186, 1, 0, 207, 187, 1, 0, 16, 189, 1, 0, 79, 190, 1, 0, 144, 191, 1, 0, 207, 192, 1, 0, 16, 194, 1, 0, 79, 195, 1, 0, 144, 196, 1, 0, 207, 197, 1, 0, 16, 199, 1, 0, 79, 200, 1, 0, 144, 201, 1, 0, 207, 202, 1, 0, 16, 204, 1, 0, 79, 205, 1, 0, 144, 206, 1, 0, 207, 207, 1, 0, 16, 209, 1, 0, 79, 210, 1, 0, 144, 211, 1, 0, 207, 212, 1, 0, 16, 214, 1, 0, 79, 215, 1, 0, 144, 216, 1, 0, 207, 217, 1, 0, 16, 219, 1, 0, 79, 220, 1, 0, 144, 221, 1, 0, 207, 222, 1, 0, 16, 224, 1, 0, 79, 225, 1, 0, 144, 226, 1, 0, 207, 227, 1, 0, 16, 229, 1, 0, 79, 230, 1, 0, 144, 231, 1, 0, 207, 232, 1, 0, 16, 234, 1, 0, 79, 235, 1, 0, 144, 236, 1, 0, 207, 237, 1, 0, 16, 239, 1, 0, 79, 240, 1, 0, 144, 241, 1, 0, 207, 242, 1, 0, 16, 244, 1, 0, 79, 245, 1, 0, 144, 246, 1, 0, 207, 247, 1, 0, 16, 249, 1, 0, 79, 250, 1, 0, 144, 251, 1, 0, 207, 252, 1, 0, 16, 254, 1, 0, 79, 255, 1, 0, 144, 0, 2, 0, 207, 1, 2, 0, 16, 3, 2, 0, 79, 4, 2, 0, 144, 5, 2, 0, 207, 6, 2, 0, 16, 8, 2, 0, 79, 9, 2, 0, 144, 10, 2, 0, 207, 11, 2, 0, 16, 13, 2, 0, 79, 14, 2, 0, 144, 15, 2, 0, 207, 16, 2, 0, 16, 18, 2, 0, 79, 19, 2, 0, 144, 20, 2, 0, 207, 21, 2, 0, 16, 23, 2, 0, 79, 24, 2, 0, 144, 25, 2, 0, 207, 26, 2, 0, 16, 28, 2, 0, 79, 29, 2, 0, 144, 30, 2, 0, 207, 31, 2, 0, 16, 33, 2, 0, 79, 34, 2, 0, 144, 35, 2, 0, 207, 36, 2, 0, 16, 38, 2, 0, 79, 39, 2, 0, 144, 40, 2, 0, 207, 41, 2, 0, 16, 43, 2, 0, 79, 44, 2, 0, 144, 45, 2, 0, 207, 46, 2, 0, 16, 48, 2, 0, 79, 49, 2, 0, 144, 50, 2, 0, 207, 51, 2, 0, 16, 53, 2, 0, 79, 54, 2, 0, 144, 55, 2, 0, 207, 56, 2, 0, 16, 58, 2, 0, 79, 59, 2, 0, 144, 60, 2, 0, 207, 61, 2, 0, 16, 63, 2, 0, 79, 64, 2, 0, 144, 65, 2, 0, 207, 66, 2, 0, 16, 68, 2, 0, 79, 69, 2, 0, 144, 70, 2, 0, 207, 71, 2, 0, 16, 73, 2, 0, 79, 74, 2, 0, 144, 75, 2, 0, 207, 76, 2, 0, 16, 78, 2, 0, 79, 79, 2, 0, 144, 80, 2, 0, 207, 81, 2, 0, 16, 83, 2, 0, 79, 84, 2, 0, 144, 85, 2, 0, 207, 86, 2, 0, 16, 88, 2, 0, 79, 89, 2, 0, 144, 90, 2, 0, 207, 91, 2, 0, 16, 93, 2, 0, 79, 94, 2, 0, 144, 95, 2, 0, 207, 96, 2, 0, 16, 98, 2, 0, 79, 99, 2, 0, 144, 100, 2, 0, 207, 101, 2, 0, 16, 103, 2, 0, 79, 104, 2, 0, 144, 105, 2, 0, 207, 106, 2, 0, 16, 108, 2, 0, 79, 109, 2, 0, 144, 110, 2, 0, 207, 111, 2, 0, 16, 113, 2, 0, 79, 114, 2, 0, 144, 115, 2, 0, 207, 116, 2, 0, 16, 118, 2, 0, 79, 119, 2, 0, 144, 120, 2, 0, 207, 121, 2, 0, 16, 123, 2, 0, 79, 124, 2, 0, 144, 125, 2, 0, 207, 126, 2, 0, 16, 128, 2, 0, 79, 129, 2, 0, 144, 130, 2, 0, 207, 131, 2, 0, 16, 133, 2, 0, 79, 134, 2, 0, 144, 135, 2, 0, 207, 136, 2, 0, 16, 138, 2, 0, 79, 139, 2, 0, 144, 140, 2, 0, 207, 141, 2, 0, 16, 143, 2, 0, 79, 144, 2, 0, 144, 145, 2, 0, 207, 146, 2, 0, 16, 148, 2, 0, 79, 149, 2, 0, 144, 150, 2, 0, 207, 151, 2, 0, 16, 153, 2, 0, 79, 154, 2, 0, 144, 155, 2, 0, 207, 156, 2, 0, 16, 158, 2, 0, 79, 159, 2, 0, 144, 160, 2, 0, 207, 161, 2, 0, 16, 163, 2, 0, 79, 164, 2, 0, 144, 165, 2, 0, 207, 166, 2, 0, 16, 168, 2, 0, 79, 169, 2, 0, 144, 170, 2, 0, 207, 171, 2, 0, 16, 173, 2, 0, 79, 174, 2, 0, 144, 175, 2, 0, 207, 176, 2, 0, 16, 178, 2, 0, 79, 179, 2, 0, 144, 180, 2, 0, 207, 181, 2, 0, 16, 183, 2, 0, 79, 184, 2, 0, 144, 185, 2, 0, 207, 186, 2, 0, 16, 188, 2, 0, 79, 189, 2, 0, 144, 190, 2, 0, 207, 191, 2, 0, 16, 193, 2, 0, 79, 194, 2, 0, 144, 195, 2, 0, 207, 196, 2, 0, 16, 198, 2, 0, 79, 199, 2, 0, 144, 200, 2, 0, 207, 201, 2, 0, 16, 203, 2, 0, 79, 204, 2, 0, 144, 205, 2, 0, 207, 206, 2, 0, 16, 208, 2, 0, 79, 209, 2, 0, 144, 210, 2, 0, 207, 211, 2, 0, 16, 213, 2, 0, 79, 214, 2, 0, 144, 215, 2, 0, 207, 216, 2, 0, 16, 218, 2, 0, 79, 219, 2, 0, 144, 220, 2, 0, 207, 221, 2, 0, 16, 223, 2, 0, 79, 224, 2, 0, 144, 225, 2, 0, 207, 226, 2, 0, 16, 228, 2, 0, 79, 229, 2, 0, 144, 230, 2, 0, 207, 231, 2, 0, 16, 233, 2, 0, 79, 234, 2, 0, 144, 235, 2, 0, 207, 236, 2, 0, 16, 238, 2, 0, 79, 239, 2, 0, 144, 240, 2, 0, 207, 241, 2, 0, 16, 243, 2, 0, 79, 244, 2, 0, 144, 245, 2, 0, 207, 246, 2, 0, 16, 248, 2, 0, 79, 249, 2, 0, 144, 250, 2, 0, 207, 251, 2, 0, 16, 253, 2, 0, 79, 254, 2, 0, 144, 255, 2, 0, 207, 0, 3, 0, 16, 2, 3, 0, 79, 3, 3, 0, 144, 4, 3, 0, 207, 5, 3, 0, 16, 7, 3, 0, 79, 8, 3, 0, 144, 9, 3, 0, 207, 10, 3, 0, 16, 12, 3, 0, 79, 13, 3, 0, 144, 14, 3, 0, 207, 15, 3, 0, 16, 17, 3, 0, 79, 18, 3, 0, 144, 19, 3, 0, 207, 20, 3, 0, 16, 22, 3, 0, 79, 23, 3, 0, 144, 24, 3, 0, 207, 25, 3, 0, 16, 27, 3, 0, 79, 28, 3, 0, 144, 29, 3, 0, 207, 30, 3, 0, 16, 32, 3, 0, 79, 33, 3, 0, 144, 34, 3, 0, 207, 35, 3, 0, 16, 37, 3, 0, 79, 38, 3, 0, 144, 39, 3, 0, 207, 40, 3, 0, 16, 42, 3, 0, 79, 43, 3, 0, 144, 44, 3, 0, 207, 45, 3, 0, 16, 47, 3, 0, 79, 48, 3, 0, 144, 49, 3, 0, 207, 50, 3, 0, 16, 52, 3, 0, 79, 53, 3, 0, 144, 54, 3, 0, 207, 55, 3, 0, 16, 57, 3, 0, 79, 58, 3, 0, 144, 59, 3, 0, 207, 60, 3, 0, 16, 62, 3, 0, 79, 63, 3, 0, 144, 64, 3, 0, 207, 65, 3, 0, 16, 67, 3, 0, 79, 68, 3, 0, 144, 69, 3, 0, 207, 70, 3, 0, 16, 72, 3, 0, 79, 73, 3, 0, 144, 74, 3, 0, 207, 75, 3, 0, 16, 77, 3, 0, 79, 78, 3, 0, 144, 79, 3, 0, 207, 80, 3, 0, 16, 82, 3, 0, 79, 83, 3, 0, 144, 84, 3, 0, 207, 85, 3, 0, 16, 87, 3, 0, 79, 88, 3, 0, 144, 89, 3, 0, 207, 90, 3, 0, 16, 92, 3, 0, 79, 93, 3, 0, 144, 94, 3, 0, 207, 95, 3, 0, 16, 97, 3, 0, 79, 98, 3, 0, 144, 99, 3, 0, 207, 100, 3, 0, 16, 102, 3, 0, 79, 103, 3, 0, 144, 104, 3, 0, 207, 105, 3, 0, 16, 107, 3, 0, 79, 108, 3, 0, 144, 109, 3, 0, 207, 110, 3, 0, 16, 112, 3, 0, 79, 113, 3, 0, 144, 114, 3, 0, 207, 115, 3, 0, 16, 117, 3, 0, 79, 118, 3, 0, 144, 119, 3, 0, 207, 120, 3, 0, 16, 122, 3, 0, 79, 123, 3, 0, 144, 124, 3, 0, 207, 125, 3, 0, 16, 127, 3, 0, 79, 128, 3, 0, 144, 129, 3, 0, 207, 130, 3, 0, 16, 132, 3, 0, 79, 133, 3, 0, 144, 134, 3, 0, 207, 135, 3, 0, 16, 137, 3, 0, 79, 138, 3, 0, 144, 139, 3, 0, 207, 140, 3, 0, 16, 142, 3, 0, 79, 143, 3, 0, 144, 144, 3, 0, 207, 145, 3, 0, 16, 147, 3, 0, 79, 148, 3, 0, 144, 149, 3, 0, 207, 150, 3, 0, 16, 152, 3, 0, 79, 153, 3, 0, 144, 154, 3, 0, 207, 155, 3, 0, 16, 157, 3, 0, 79, 158, 3, 0, 144, 159, 3, 0, 207, 160, 3, 0, 16, 162, 3, 0, 79, 163, 3, 0, 144, 164, 3, 0, 207, 165, 3, 0, 16, 167, 3, 0, 79, 168, 3, 0, 144, 169, 3, 0, 207, 170, 3, 0, 16, 172, 3, 0, 79, 173, 3, 0, 144, 174, 3, 0, 207, 175, 3, 0, 16, 177, 3, 0, 79, 178, 3, 0, 144, 179, 3, 0, 207, 180, 3, 0, 16, 182, 3, 0, 79, 183, 3, 0, 144, 184, 3, 0, 207, 185, 3, 0, 16, 187, 3, 0, 79, 188, 3, 0, 144, 189, 3, 0, 207, 190, 3, 0, 16, 192, 3, 0, 79, 193, 3, 0, 144, 194, 3, 0, 207, 195, 3, 0, 16, 197, 3, 0, 79, 198, 3, 0, 144, 199, 3, 0, 207, 200, 3, 0, 16, 202, 3, 0, 79, 203, 3, 0, 144, 204, 3, 0, 207, 205, 3, 0, 16, 207, 3, 0, 79, 208, 3, 0, 144, 209, 3, 0, 207, 210, 3, 0, 16, 212, 3, 0, 79, 213, 3, 0, 144, 214, 3, 0, 207, 215, 3, 0, 16, 217, 3, 0, 79, 218, 3, 0, 144, 219, 3, 0, 207, 220, 3, 0, 16, 222, 3, 0, 79, 223, 3, 0, 144, 224, 3, 0, 207, 225, 3, 0, 16, 227, 3, 0, 79, 228, 3, 0, 144, 229, 3, 0, 207, 230, 3, 0, 16, 232, 3, 0, 79, 233, 3, 0, 144, 234, 3, 0, 207, 235, 3, 0, 16, 237, 3, 0, 79, 238, 3, 0, 144, 239, 3, 0, 207, 240, 3, 0, 16, 242, 3, 0, 79, 243, 3, 0, 144, 244, 3, 0, 207, 245, 3, 0, 16, 247, 3, 0, 79, 248, 3, 0, 144, 249, 3, 0, 207, 250, 3, 0, 16, 252, 3, 0, 79, 253, 3, 0, 144, 254, 3, 0, 207, 255, 3, 0, 16, 1, 4, 0, 79, 2, 4, 0, 144, 3, 4, 0, 207, 4, 4, 0, 16, 6, 4, 0, 79, 7, 4, 0, 144, 8, 4, 0, 207, 9, 4, 0, 16, 11, 4, 0, 79, 12, 4, 0, 144, 13, 4, 0, 207, 14, 4, 0, 16, 16, 4, 0, 79, 17, 4, 0, 144, 18, 4, 0, 207, 19, 4, 0, 16, 21, 4, 0, 79, 22, 4, 0, 144, 23, 4, 0, 207, 24, 4, 0, 16, 26, 4, 0, 79, 27, 4, 0, 144, 28, 4, 0, 207, 29, 4, 0, 16, 31, 4, 0, 79, 32, 4, 0, 144, 33, 4, 0, 207, 34, 4, 0, 16, 36, 4, 0, 79, 37, 4, 0, 144, 38, 4, 0, 207, 39, 4, 0, 16, 41, 4, 0, 79, 42, 4, 0, 144, 43, 4, 0, 207, 44, 4, 0, 16, 46, 4, 0, 79, 47, 4, 0, 144, 48, 4, 0, 207, 49, 4, 0, 16, 51, 4, 0, 79, 52, 4, 0, 144, 53, 4, 0, 207, 54, 4, 0, 16, 56, 4, 0, 79, 57, 4, 0, 144, 58, 4, 0, 207, 59, 4, 0, 16, 61, 4, 0, 79, 62, 4, 0, 144, 63, 4, 0, 207, 64, 4, 0, 16, 66, 4, 0, 79, 67, 4, 0, 144, 68, 4, 0, 207, 69, 4, 0, 16, 71, 4, 0, 79, 72, 4, 0, 144, 73, 4, 0, 207, 74, 4, 0, 16, 76, 4, 0, 79, 77, 4, 0, 144, 78, 4, 0, 207, 79, 4, 0, 16, 81, 4, 0, 79, 82, 4, 0, 144, 83, 4, 0, 207, 84, 4, 0, 16, 86, 4, 0, 79, 87, 4, 0, 144, 88, 4, 0, 207, 89, 4, 0, 16, 91, 4, 0, 79, 92, 4, 0, 144, 93, 4, 0, 207, 94, 4, 0, 16, 96, 4, 0, 79, 97, 4, 0, 144, 98, 4, 0, 207, 99, 4, 0, 16, 101, 4, 0, 79, 102, 4, 0, 144, 103, 4, 0, 207, 104, 4, 0, 16, 106, 4, 0, 79, 107, 4, 0, 144, 108, 4, 0, 207, 109, 4, 0, 16, 111, 4, 0, 79, 112, 4, 0, 144, 113, 4, 0, 207, 114, 4, 0, 16, 116, 4, 0, 79, 117, 4, 0, 144, 118, 4, 0, 207, 119, 4, 0, 16, 121, 4, 0, 79, 122, 4, 0, 144, 123, 4, 0, 207, 124, 4, 0, 16, 126, 4, 0, 79, 127, 4, 0, 144, 128, 4, 0, 207, 129, 4, 0, 16, 131, 4, 0, 79, 132, 4, 0, 144, 133, 4, 0, 207, 134, 4, 0, 16, 136, 4, 0, 79, 137, 4, 0, 144, 138, 4, 0, 207, 139, 4, 0, 16, 141, 4, 0, 79, 142, 4, 0, 144, 143, 4, 0, 207, 144, 4, 0, 16, 146, 4, 0, 79, 147, 4, 0, 144, 148, 4, 0, 207, 149, 4, 0, 16, 151, 4, 0, 79, 152, 4, 0, 144, 153, 4, 0, 207, 154, 4, 0, 16, 156, 4, 0, 79, 157, 4, 0, 144, 158, 4, 0, 207, 159, 4, 0, 16, 161, 4, 0, 79, 162, 4, 0, 144, 163, 4, 0, 207, 164, 4, 0, 16, 166, 4, 0, 79, 167, 4, 0, 144, 168, 4, 0, 207, 169, 4, 0, 16, 171, 4, 0, 79, 172, 4, 0, 144, 173, 4, 0, 207, 174, 4, 0, 16, 176, 4, 0, 79, 177, 4, 0, 144, 178, 4, 0, 207, 179, 4, 0, 16, 181, 4, 0, 79, 182, 4, 0, 144, 183, 4, 0, 207, 184, 4, 0, 16, 186, 4, 0, 79, 187, 4, 0, 144, 188, 4, 0, 207, 189, 4, 0, 16, 191, 4, 0, 79, 192, 4, 0, 144, 193, 4, 0, 207, 194, 4, 0, 16, 196, 4, 0, 79, 197, 4, 0, 144, 198, 4, 0, 207, 199, 4, 0, 16, 201, 4, 0, 79, 202, 4, 0, 144, 203, 4, 0, 207, 204, 4, 0, 16, 206, 4, 0, 79, 207, 4, 0, 144, 208, 4, 0, 207, 209, 4, 0, 16, 211, 4, 0, 79, 212, 4, 0, 144, 213, 4, 0, 207, 214, 4, 0, 16, 216, 4, 0, 79, 217, 4, 0, 144, 218, 4, 0, 207, 219, 4, 0, 16, 221, 4, 0, 79, 222, 4, 0, 144, 223, 4, 0, 207, 224, 4, 0, 16, 226, 4, 0, 79, 227, 4, 0, 144, 228, 4, 0, 207, 229, 4, 0, 16, 231, 4, 0, 79, 232, 4, 0, 144, 233, 4, 0, 207, 234, 4, 0, 16, 236, 4, 0, 79, 237, 4, 0, 144, 238, 4, 0, 207, 239, 4, 0, 16, 241, 4, 0, 79, 242, 4, 0, 144, 243, 4, 0, 207, 244, 4, 0, 16, 246, 4, 0, 79, 247, 4, 0, 144, 248, 4, 0, 207, 249, 4, 0, 16, 251, 4, 0, 79, 252, 4, 0, 144, 253, 4, 0, 207, 254, 4, 0, 16, 0, 5, 0, 79, 1, 5, 0, 144, 2, 5, 0, 207, 3, 5, 0, 16, 5, 5, 0, 79, 6, 5, 0, 144, 7, 5, 0, 207, 8, 5, 0, 16, 10, 5, 0, 79, 11, 5, 0, 144, 12, 5, 0, 207, 13, 5, 0, 16, 15, 5, 0, 79, 16, 5, 0, 144, 17, 5, 0, 207, 18, 5, 0, 16, 20, 5, 0, 79, 21, 5, 0, 144, 22, 5, 0, 207, 23, 5, 0, 16, 25, 5, 0, 79, 26, 5, 0, 144, 27, 5, 0, 207, 28, 5, 0, 16, 30, 5, 0, 79, 31, 5, 0, 144, 32, 5, 0, 207, 33, 5, 0, 16, 35, 5, 0, 79, 36, 5, 0, 144, 37, 5, 0, 207, 38, 5, 0, 16, 40, 5, 0, 79, 41, 5, 0, 144, 42, 5, 0, 207, 43, 5, 0, 16, 45, 5, 0, 79, 46, 5, 0, 144, 47, 5, 0, 207, 48, 5, 0, 16, 50, 5, 0, 79, 51, 5, 0, 144, 52, 5, 0, 207, 53, 5, 0, 16, 55, 5, 0, 79, 56, 5, 0, 144, 57, 5, 0, 207, 58, 5, 0, 16, 60, 5, 0, 79, 61, 5, 0, 144, 62, 5, 0, 207, 63, 5, 0, 16, 65, 5, 0, 79, 66, 5, 0, 144, 67, 5, 0, 207, 68, 5, 0, 16, 70, 5, 0, 79, 71, 5, 0, 144, 72, 5, 0, 207, 73, 5, 0, 16, 75, 5, 0, 79, 76, 5, 0, 144, 77, 5, 0, 207, 78, 5, 0, 16, 80, 5, 0, 79, 81, 5, 0, 144, 82, 5, 0, 207, 83, 5, 0, 16, 85, 5, 0, 79, 86, 5, 0, 144, 87, 5, 0, 207, 88, 5, 0, 16, 90, 5, 0, 79, 91, 5, 0, 144, 92, 5, 0, 207, 93, 5, 0, 16, 95, 5, 0, 79, 96, 5, 0, 144, 97, 5, 0, 207, 98, 5, 0, 16, 100, 5, 0, 79, 101, 5, 0, 144, 102, 5, 0, 207, 103, 5, 0, 16, 105, 5, 0, 79, 106, 5, 0, 144, 107, 5, 0, 207, 108, 5, 0, 16, 110, 5, 0, 79, 111, 5, 0, 144, 112, 5, 0, 207, 113, 5, 0, 16, 115, 5, 0, 79, 116, 5, 0, 144, 117, 5, 0, 207, 118, 5, 0, 16, 120, 5, 0, 79, 121, 5, 0, 144, 122, 5, 0, 207, 123, 5, 0, 16, 125, 5, 0, 79, 126, 5, 0, 144, 127, 5, 0, 207, 128, 5, 0, 16, 130, 5, 0, 79, 131, 5, 0, 144, 132, 5, 0, 207, 133, 5, 0, 16, 135, 5, 0, 79, 136, 5, 0, 144, 137, 5, 0, 207, 138, 5, 0, 16, 140, 5, 0, 79, 141, 5, 0, 144, 142, 5, 0, 207, 143, 5, 0, 16, 145, 5, 0, 79, 146, 5, 0, 144, 147, 5, 0, 207, 148, 5, 0, 16, 150, 5, 0, 79, 151, 5, 0, 144, 152, 5, 0, 207, 153, 5, 0, 16, 155, 5, 0, 79, 156, 5, 0, 144, 157, 5, 0, 207, 158, 5, 0, 16, 160, 5, 0, 79, 161, 5, 0, 144, 162, 5, 0, 207, 163, 5, 0, 16, 165, 5, 0, 79, 166, 5, 0, 144, 167, 5, 0, 207, 168, 5, 0, 16, 170, 5, 0, 79, 171, 5, 0, 144, 172, 5, 0, 207, 173, 5, 0, 16, 175, 5, 0, 79, 176, 5, 0, 144, 177, 5, 0, 207, 178, 5, 0, 16, 180, 5, 0, 79, 181, 5, 0, 144, 182, 5, 0, 207, 183, 5, 0, 16, 185, 5, 0, 79, 186, 5, 0, 144, 187, 5, 0, 207, 188, 5, 0, 16, 190, 5, 0, 79, 191, 5, 0, 144, 192, 5, 0, 207, 193, 5, 0, 16, 195, 5, 0, 79, 196, 5, 0, 144, 197, 5, 0, 207, 198, 5, 0, 16, 200, 5, 0, 79, 201, 5, 0, 144, 202, 5, 0, 207, 203, 5, 0, 16, 205, 5, 0, 79, 206, 5, 0, 144, 207, 5, 0, 207, 208, 5, 0, 16, 210, 5, 0, 79, 211, 5, 0, 144, 212, 5, 0, 207, 213, 5, 0, 16, 215, 5, 0, 79, 216, 5, 0, 144, 217, 5, 0, 207, 218, 5, 0, 16, 220, 5, 0, 79, 221, 5, 0, 144, 222, 5, 0, 207, 223, 5, 0, 16, 225, 5, 0, 79, 226, 5, 0, 144, 227, 5, 0, 207, 228, 5, 0, 16, 230, 5, 0, 79, 231, 5, 0, 144, 232, 5, 0, 207, 233, 5, 0, 16, 235, 5, 0, 79, 236, 5, 0, 144, 237, 5, 0, 207, 238, 5, 0, 16, 240, 5, 0, 79, 241, 5, 0, 144, 242, 5, 0, 207, 243, 5, 0, 16, 245, 5, 0, 79, 246, 5, 0, 144, 247, 5, 0, 207, 248, 5, 0, 16, 250, 5, 0, 79, 251, 5, 0, 144, 252, 5, 0, 207, 253, 5, 0, 16, 255, 5, 0, 79, 0, 6, 0, 144, 1, 6, 0, 207, 2, 6, 0, 16, 4, 6, 0, 79, 5, 6, 0, 144, 6, 6, 0, 207, 7, 6, 0, 16, 9, 6, 0, 79, 10, 6, 0, 144, 11, 6, 0, 207, 12, 6, 0, 16, 14, 6, 0, 79, 15, 6, 0, 144, 16, 6, 0, 207, 17, 6, 0, 16, 19, 6, 0, 79, 20, 6, 0, 144, 21, 6, 0, 207, 22, 6, 0, 16, 24, 6, 0, 79, 25, 6, 0, 144, 26, 6, 0, 207, 27, 6, 0, 16, 29, 6, 0, 79, 30, 6, 0, 144, 31, 6, 0, 207, 32, 6, 0, 16, 34, 6, 0, 79, 35, 6, 0, 144, 36, 6, 0, 207, 37, 6, 0, 16, 39, 6, 0, 79, 40, 6, 0, 144, 41, 6, 0, 207, 42, 6, 0, 16, 44, 6, 0, 79, 45, 6, 0, 144, 46, 6, 0, 207, 47, 6, 0, 16, 49, 6, 0, 79, 50, 6, 0, 144, 51, 6, 0, 207, 52, 6, 0, 16, 54, 6, 0, 79, 55, 6, 0, 144, 56, 6, 0, 207, 57, 6, 0, 16, 59, 6, 0, 79, 60, 6, 0, 144, 61, 6, 0, 207, 62, 6, 0, 16, 64, 6, 0, 79, 65, 6, 0, 144, 66, 6, 0, 207, 67, 6, 0, 16, 69, 6, 0, 79, 70, 6, 0, 144, 71, 6, 0, 207, 72, 6, 0, 16, 74, 6, 0, 79, 75, 6, 0, 144, 76, 6, 0, 207, 77, 6, 0, 16, 79, 6, 0, 79, 80, 6, 0, 144, 81, 6, 0, 207, 82, 6, 0, 16, 84, 6, 0, 79, 85, 6, 0, 144, 86, 6, 0, 207, 87, 6, 0, 16, 89, 6, 0, 79, 90, 6, 0, 144, 91, 6, 0, 207, 92, 6, 0, 16, 94, 6, 0, 79, 95, 6, 0, 144, 96, 6, 0, 207, 97, 6, 0, 16, 99, 6, 0, 79, 100, 6, 0, 144, 101, 6, 0, 207, 102, 6, 0, 16, 104, 6, 0, 79, 105, 6, 0, 144, 106, 6, 0, 207, 107, 6, 0, 16, 109, 6, 0, 79, 110, 6, 0, 144, 111, 6, 0, 207, 112, 6, 0, 16, 114, 6, 0, 79, 115, 6, 0, 144, 116, 6, 0, 207, 117, 6, 0, 16, 119, 6, 0, 79, 120, 6, 0, 144, 121, 6, 0, 207, 122, 6, 0, 16, 124, 6, 0, 79, 125, 6, 0, 144, 126, 6, 0, 207, 127, 6, 0, 16, 129, 6, 0, 79, 130, 6, 0, 144, 131, 6, 0, 207, 132, 6, 0, 16, 134, 6, 0, 79, 135, 6, 0, 144, 136, 6, 0, 207, 137, 6, 0, 16, 139, 6, 0, 79, 140, 6, 0, 144, 141, 6, 0, 207, 142, 6, 0, 16, 144, 6, 0, 79, 145, 6, 0, 144, 146, 6, 0, 207, 147, 6, 0, 16, 149, 6, 0, 79, 150, 6, 0, 144, 151, 6, 0, 207, 152, 6, 0, 16, 154, 6, 0, 79, 155, 6, 0, 144, 156, 6, 0, 207, 157, 6, 0, 16, 159, 6, 0, 79, 160, 6, 0, 144, 161, 6, 0, 207, 162, 6, 0, 16, 164, 6, 0, 79, 165, 6, 0, 144, 166, 6, 0, 207, 167, 6, 0, 16, 169, 6, 0, 79, 170, 6, 0, 144, 171, 6, 0, 207, 172, 6, 0, 16, 174, 6, 0, 79, 175, 6, 0, 144, 176, 6, 0, 207, 177, 6, 0, 16, 179, 6, 0, 79, 180, 6, 0, 144, 181, 6, 0, 207, 182, 6, 0, 16, 184, 6, 0, 79, 185, 6, 0, 144, 186, 6, 0, 207, 187, 6, 0, 16, 189, 6, 0, 79, 190, 6, 0, 144, 191, 6, 0, 207, 192, 6, 0, 16, 194, 6, 0, 79, 195, 6, 0, 144, 196, 6, 0, 207, 197, 6, 0, 16, 199, 6, 0, 79, 200, 6, 0, 144, 201, 6, 0, 207, 202, 6, 0, 16, 204, 6, 0, 79, 205, 6, 0, 144, 206, 6, 0, 207, 207, 6, 0, 16, 209, 6, 0, 79, 210, 6, 0, 144, 211, 6, 0, 207, 212, 6, 0, 16, 214, 6, 0, 79, 215, 6, 0, 144, 216, 6, 0, 207, 217, 6, 0, 16, 219, 6, 0, 79, 220, 6, 0, 144, 221, 6, 0, 207, 222, 6, 0, 16, 224, 6, 0, 79, 225, 6, 0, 144, 226, 6, 0, 207, 227, 6, 0, 16, 229, 6, 0, 79, 230, 6, 0, 144, 231, 6, 0, 207, 232, 6, 0, 16, 234, 6, 0, 79, 235, 6, 0, 144, 236, 6, 0, 207, 237, 6, 0, 16, 239, 6, 0, 79, 240, 6, 0, 144, 241, 6, 0, 207, 242, 6, 0, 16, 244, 6, 0, 79, 245, 6, 0, 144, 246, 6, 0, 207, 247, 6, 0, 16, 249, 6, 0, 79, 250, 6, 0, 144, 251, 6, 0, 207, 252, 6, 0, 16, 254, 6, 0, 79, 255, 6, 0, 144, 0, 7, 0, 207, 1, 7, 0, 16, 3, 7, 0, 79, 4, 7, 0, 144, 5, 7, 0, 207, 6, 7, 0, 16, 8, 7, 0, 79, 9, 7, 0, 144, 10, 7, 0, 207, 11, 7, 0, 16, 13, 7, 0, 79, 14, 7, 0, 144, 15, 7, 0, 207, 16, 7, 0, 16, 18, 7, 0, 79, 19, 7, 0, 144, 20, 7, 0, 207, 21, 7, 0, 16, 23, 7, 0, 79, 24, 7, 0, 144, 25, 7, 0, 207, 26, 7, 0, 16, 28, 7, 0, 79, 29, 7, 0, 144, 30, 7, 0, 207, 31, 7, 0, 16, 33, 7, 0, 79, 34, 7, 0, 144, 35, 7, 0, 207, 36, 7, 0, 16, 38, 7, 0, 79, 39, 7, 0, 144, 40, 7, 0, 207, 41, 7, 0, 16, 43, 7, 0, 79, 44, 7, 0, 144, 45, 7, 0, 207, 46, 7, 0, 16, 48, 7, 0, 79, 49, 7, 0, 144, 50, 7, 0, 207, 51, 7, 0, 16, 53, 7, 0, 79, 54, 7, 0, 144, 55, 7, 0, 207, 56, 7, 0, 16, 58, 7, 0, 79, 59, 7, 0, 144, 60, 7, 0, 207, 61, 7, 0, 16, 63, 7, 0, 79, 64, 7, 0, 144, 65, 7, 0, 207, 66, 7, 0, 16, 68, 7, 0, 79, 69, 7, 0, 144, 70, 7, 0, 207, 71, 7, 0, 16, 73, 7, 0, 79, 74, 7, 0, 144, 75, 7, 0, 207, 76, 7, 0, 16, 78, 7, 0, 79, 79, 7, 0, 144, 80, 7, 0, 207, 81, 7, 0, 16, 83, 7, 0, 79, 84, 7, 0, 144, 85, 7, 0, 207, 86, 7, 0, 16, 88, 7, 0, 79, 89, 7, 0, 144, 90, 7, 0, 207, 91, 7, 0, 16, 93, 7, 0, 79, 94, 7, 0, 144, 95, 7, 0, 207, 96, 7, 0, 16, 98, 7, 0, 79, 99, 7, 0, 144, 100, 7, 0, 207, 101, 7, 0, 16, 103, 7, 0, 79, 104, 7, 0, 144, 105, 7, 0, 207, 106, 7, 0, 16, 108, 7, 0, 79, 109, 7, 0, 144, 110, 7, 0, 207, 111, 7, 0, 16, 113, 7, 0, 79, 114, 7, 0, 144, 115, 7, 0, 207, 116, 7, 0, 16, 118, 7, 0, 79, 119, 7, 0, 144, 120, 7, 0, 207, 121, 7, 0, 16, 123, 7, 0, 79, 124, 7, 0, 144, 125, 7, 0, 207, 126, 7, 0, 16, 128, 7, 0, 79, 129, 7, 0, 144, 130, 7, 0, 207, 131, 7, 0, 16, 133, 7, 0, 79, 134, 7, 0, 144, 135, 7, 0, 207, 136, 7, 0, 16, 138, 7, 0, 79, 139, 7, 0, 144, 140, 7, 0, 207, 141, 7, 0, 16, 143, 7, 0, 79, 144, 7, 0, 144, 145, 7, 0, 207, 146, 7, 0, 16, 148, 7, 0, 79, 149, 7, 0, 144, 150, 7, 0, 207, 151, 7, 0, 16, 153, 7, 0, 79, 154, 7, 0, 144, 155, 7, 0, 207, 156, 7, 0, 16, 158, 7, 0, 79, 159, 7, 0, 144, 160, 7, 0, 207, 161, 7, 0, 16, 163, 7, 0, 79, 164, 7, 0, 144, 165, 7, 0, 207, 166, 7, 0, 16, 168, 7, 0, 79, 169, 7, 0, 144, 170, 7, 0, 207, 171, 7, 0, 16, 173, 7, 0, 79, 174, 7, 0, 144, 175, 7, 0, 207, 176, 7, 0, 16, 178, 7, 0, 79, 179, 7, 0, 144, 180, 7, 0, 207, 181, 7, 0, 16, 183, 7, 0, 79, 184, 7, 0, 144, 185, 7, 0, 207, 186, 7, 0, 16, 188, 7, 0, 79, 189, 7, 0, 144, 190, 7, 0, 207, 191, 7, 0, 16, 193, 7, 0, 79, 194, 7, 0, 144, 195, 7, 0, 207, 196, 7, 0, 16, 198, 7, 0, 79, 199, 7, 0, 144, 200, 7, 0, 207, 201, 7, 0, 16, 203, 7, 0, 79, 204, 7, 0, 144, 205, 7, 0, 207, 206, 7, 0, 16, 208, 7, 0, 79, 209, 7, 0, 144, 210, 7, 0, 207, 211, 7, 0, 16, 213, 7, 0, 79, 214, 7, 0, 144, 215, 7, 0, 207, 216, 7, 0, 16, 218, 7, 0, 79, 219, 7, 0, 144, 220, 7, 0, 207, 221, 7, 0, 16, 223, 7, 0, 79, 224, 7, 0, 144, 225, 7, 0, 207, 226, 7, 0, 16, 228, 7, 0, 79, 229, 7, 0, 144, 230, 7, 0, 207, 231, 7, 0, 16, 233, 7, 0, 79, 234, 7, 0, 144, 235, 7, 0, 207, 236, 7, 0, 16, 238, 7, 0, 79, 239, 7, 0, 144, 240, 7, 0, 207, 241, 7, 0, 16, 243, 7, 0, 79, 244, 7, 0, 144, 245, 7, 0, 207, 246, 7, 0, 16, 248, 7, 0, 79, 249, 7, 0, 144, 250, 7, 0, 207, 251, 7, 0, 16, 253, 7, 0, 79, 254, 7, 0, 144, 255, 7, 0, 207, 0, 8, 0, 16, 2, 8, 0, 79, 3, 8, 0, 144, 4, 8, 0, 207, 5, 8, 0, 16, 7, 8, 0, 79, 8, 8, 0, 144, 9, 8, 0, 207, 10, 8, 0, 16, 12, 8, 0, 79, 13, 8, 0, 144, 14, 8, 0, 207, 15, 8, 0, 16, 17, 8, 0, 79, 18, 8, 0, 144, 19, 8, 0, 207, 20, 8, 0, 16, 22, 8, 0, 79, 23, 8, 0, 144, 24, 8, 0, 207, 25, 8, 0, 16, 27, 8, 0, 79, 28, 8, 0, 144, 29, 8, 0, 207, 30, 8, 0, 16, 32, 8, 0, 79, 33, 8, 0, 144, 34, 8, 0, 207, 35, 8, 0, 16, 37, 8, 0, 79, 38, 8, 0, 144, 39, 8, 0, 207, 40, 8, 0, 16, 42, 8, 0, 79, 43, 8, 0, 144, 44, 8, 0, 207, 45, 8, 0, 16, 47, 8, 0, 79, 48, 8, 0, 144, 49, 8, 0, 207, 50, 8, 0, 16, 52, 8, 0, 79, 53, 8, 0, 144, 54, 8, 0, 207, 55, 8, 0, 16, 57, 8, 0, 79, 58, 8, 0, 144, 59, 8, 0, 207, 60, 8, 0, 16, 62, 8, 0, 79, 63, 8, 0, 144, 64, 8, 0, 207, 65, 8, 0, 16, 67, 8, 0, 79, 68, 8, 0, 144, 69, 8, 0, 207, 70, 8, 0, 16, 72, 8, 0, 79, 73, 8, 0, 144, 74, 8, 0, 207, 75, 8, 0, 16, 77, 8, 0, 79, 78, 8, 0, 144, 79, 8, 0, 207, 80, 8, 0, 16, 82, 8, 0, 79, 83, 8, 0, 144, 84, 8, 0, 207, 85, 8, 0, 16, 87, 8, 0, 79, 88, 8, 0, 144, 89, 8, 0, 207, 90, 8, 0, 16, 92, 8, 0, 79, 93, 8, 0, 144, 94, 8, 0, 207, 95, 8, 0, 16, 97, 8, 0, 79, 98, 8, 0, 144, 99, 8, 0, 207, 100, 8, 0, 16, 102, 8, 0, 79, 103, 8, 0, 144, 104, 8, 0, 207, 105, 8, 0, 16, 107, 8, 0, 79, 108, 8, 0, 144, 109, 8, 0, 207, 110, 8, 0, 16, 112, 8, 0, 79, 113, 8, 0, 144, 114, 8, 0, 207, 115, 8, 0, 16, 117, 8, 0, 79, 118, 8, 0, 144, 119, 8, 0, 207, 120, 8, 0, 16, 122, 8, 0, 79, 123, 8, 0, 144, 124, 8, 0, 207, 125, 8, 0, 16, 127, 8, 0, 79, 128, 8, 0, 144, 129, 8, 0, 207, 130, 8, 0, 16, 132, 8, 0, 79, 133, 8, 0, 144, 134, 8, 0, 207, 135, 8, 0, 16, 137, 8, 0, 79, 138, 8, 0, 144, 139, 8, 0, 207, 140, 8, 0, 16, 142, 8, 0, 79, 143, 8, 0, 144, 144, 8, 0, 207, 145, 8, 0, 16, 147, 8, 0, 79, 148, 8, 0, 144, 149, 8, 0, 207, 150, 8, 0, 16, 152, 8, 0, 79, 153, 8, 0, 144, 154, 8, 0, 207, 155, 8, 0, 16, 157, 8, 0, 79, 158, 8, 0, 144, 159, 8, 0, 207, 160, 8, 0, 16, 162, 8, 0, 79, 163, 8, 0, 144, 164, 8, 0, 207, 165, 8, 0, 16, 167, 8, 0, 79, 168, 8, 0, 144, 169, 8, 0, 207, 170, 8, 0, 16, 172, 8, 0, 79, 173, 8, 0, 144, 174, 8, 0, 207, 175, 8, 0, 16, 177, 8, 0, 79, 178, 8, 0, 144, 179, 8, 0, 207, 180, 8, 0, 16, 182, 8, 0, 79, 183, 8, 0, 144, 184, 8, 0, 207, 185, 8, 0, 16, 187, 8, 0, 79, 188, 8, 0, 144, 189, 8, 0, 207, 190, 8, 0, 16, 192, 8, 0, 79, 193, 8, 0, 144, 194, 8, 0, 207, 195, 8, 0, 16, 197, 8, 0, 79, 198, 8, 0, 144, 199, 8, 0, 207, 200, 8, 0, 16, 202, 8, 0, 79, 203, 8, 0, 144, 204, 8, 0, 207, 205, 8, 0, 16, 207, 8, 0, 79, 208, 8, 0, 144, 209, 8, 0, 207, 210, 8, 0, 16, 212, 8, 0, 79, 213, 8, 0, 144, 214, 8, 0, 207, 215, 8, 0, 16, 217, 8, 0, 79, 218, 8, 0, 144, 219, 8, 0, 207, 220, 8, 0, 16, 222, 8, 0, 79, 223, 8, 0, 144, 224, 8, 0, 207, 225, 8, 0, 16, 227, 8, 0, 79, 228, 8, 0, 144, 229, 8, 0, 207, 230, 8, 0, 16, 232, 8, 0, 79, 233, 8, 0, 144, 234, 8, 0, 207, 235, 8, 0, 16, 237, 8, 0, 79, 238, 8, 0, 144, 239, 8, 0, 207, 240, 8, 0, 16, 242, 8, 0, 79, 243, 8, 0, 144, 244, 8, 0, 207, 245, 8, 0, 16, 247, 8, 0, 79, 248, 8, 0, 144, 249, 8, 0, 207, 250, 8, 0, 16, 252, 8, 0, 79, 253, 8, 0, 144, 254, 8, 0, 207, 255, 8, 0, 16, 1, 9, 0, 79, 2, 9, 0, 144, 3, 9, 0, 207, 4, 9, 0, 16, 6, 9, 0, 79, 7, 9, 0, 144, 8, 9, 0, 207, 9, 9, 0, 16, 11, 9, 0, 79, 12, 9, 0, 144, 13, 9, 0, 207, 14, 9, 0, 16, 16, 9, 0, 79, 17, 9, 0, 144, 18, 9, 0, 207, 19, 9, 0, 16, 21, 9, 0, 79, 22, 9, 0, 144, 23, 9, 0, 207, 24, 9, 0, 16, 26, 9, 0, 79, 27, 9, 0, 144, 28, 9, 0, 207, 29, 9, 0, 16, 31, 9, 0, 79, 32, 9, 0, 144, 33, 9, 0, 207, 34, 9, 0, 16, 36, 9, 0, 79, 37, 9, 0, 144, 38, 9, 0, 207, 39, 9, 0, 16, 41, 9, 0, 79, 42, 9, 0, 144, 43, 9, 0, 207, 44, 9, 0, 16, 46, 9, 0, 79, 47, 9, 0, 144, 48, 9, 0, 207, 49, 9, 0, 16, 51, 9, 0, 79, 52, 9, 0, 144, 53, 9, 0, 207, 54, 9, 0, 16, 56, 9, 0, 79, 57, 9, 0, 144, 58, 9, 0, 207, 59, 9, 0, 16, 61, 9, 0, 79, 62, 9, 0, 144, 63, 9, 0, 207, 64, 9, 0, 16, 66, 9, 0, 79, 67, 9, 0, 144, 68, 9, 0, 207, 69, 9, 0, 16, 71, 9, 0, 79, 72, 9, 0, 144, 73, 9, 0, 207, 74, 9, 0, 16, 76, 9, 0, 79, 77, 9, 0, 144, 78, 9, 0, 207, 79, 9, 0, 16, 81, 9, 0, 79, 82, 9, 0, 144, 83, 9, 0, 207, 84, 9, 0, 16, 86, 9, 0, 79, 87, 9, 0, 144, 88, 9, 0, 207, 89, 9, 0, 16, 91, 9, 0, 79, 92, 9, 0, 144, 93, 9, 0, 207, 94, 9, 0, 16, 96, 9, 0, 79, 97, 9, 0, 144, 98, 9, 0, 207, 99, 9, 0, 16, 101, 9, 0, 79, 102, 9, 0, 144, 103, 9, 0, 207, 104, 9, 0, 16, 106, 9, 0, 79, 107, 9, 0, 144, 108, 9, 0, 207, 109, 9, 0, 16, 111, 9, 0, 79, 112, 9, 0, 144, 113, 9, 0, 207, 114, 9, 0, 16, 116, 9, 0, 79, 117, 9, 0, 144, 118, 9, 0, 207, 119, 9, 0, 16, 121, 9, 0, 79, 122, 9, 0, 144, 123, 9, 0, 207, 124, 9, 0, 16, 126, 9, 0, 79, 127, 9, 0, 144, 128, 9, 0, 207, 129, 9, 0, 16, 131, 9, 0, 79, 132, 9, 0, 144, 133, 9, 0, 207, 134, 9, 0, 16, 136, 9, 0, 79, 137, 9, 0, 144, 138, 9, 0, 207, 139, 9, 0, 16, 141, 9, 0, 79, 142, 9, 0, 144, 143, 9, 0, 207, 144, 9, 0, 16, 146, 9, 0, 79, 147, 9, 0, 144, 148, 9, 0, 207, 149, 9, 0, 16, 151, 9, 0, 79, 152, 9, 0, 144, 153, 9, 0, 207, 154, 9, 0, 16, 156, 9, 0, 79, 157, 9, 0, 144, 158, 9, 0, 207, 159, 9, 0, 16, 161, 9, 0, 79, 162, 9, 0, 144, 163, 9, 0, 207, 164, 9, 0, 16, 166, 9, 0, 79, 167, 9, 0, 144, 168, 9, 0, 207, 169, 9, 0, 16, 171, 9, 0, 79, 172, 9, 0, 144, 173, 9, 0, 207, 174, 9, 0, 16, 176, 9, 0, 79, 177, 9, 0, 144, 178, 9, 0, 207, 179, 9, 0, 16, 181, 9, 0, 79, 182, 9, 0, 144, 183, 9, 0, 207, 184, 9, 0, 16, 186, 9, 0, 79, 187, 9, 0, 144, 188, 9, 0, 207, 189, 9, 0, 16, 191, 9, 0, 79, 192, 9, 0, 144, 193, 9, 0, 207, 194, 9, 0, 16, 196, 9, 0, 79, 197, 9, 0, 144, 198, 9, 0, 207, 199, 9, 0, 16, 201, 9, 0, 79, 202, 9, 0, 144, 203, 9, 0, 207, 204, 9, 0, 16, 206, 9, 0, 79, 207, 9, 0, 144, 208, 9, 0, 207, 209, 9, 0, 16, 211, 9, 0, 79, 212, 9, 0, 144, 213, 9, 0, 207, 214, 9, 0, 16, 216, 9, 0, 79, 217, 9, 0, 144, 218, 9, 0, 207, 219, 9, 0, 16, 221, 9, 0, 79, 222, 9, 0, 144, 223, 9, 0, 207, 224, 9, 0, 16, 226, 9, 0, 79, 227, 9, 0, 144, 228, 9, 0, 207, 229, 9, 0, 16, 231, 9, 0, 79, 232, 9, 0, 144, 233, 9, 0, 207, 234, 9, 0, 16, 236, 9, 0, 79, 237, 9, 0, 144, 238, 9, 0, 207, 239, 9, 0, 16, 241, 9, 0, 79, 242, 9, 0, 144, 243, 9, 0, 207, 244, 9, 0, 16, 246, 9, 0, 79, 247, 9, 0, 144, 248, 9, 0, 207, 249, 9, 0, 16, 251, 9, 0, 79, 252, 9, 0, 144, 253, 9, 0, 207, 254, 9, 0, 16, 0, 10, 0, 79, 1, 10, 0, 144, 2, 10, 0, 207, 3, 10, 0, 16, 5, 10, 0, 79, 6, 10, 0, 144, 7, 10, 0, 207, 8, 10, 0, 16, 10, 10, 0, 79, 11, 10, 0, 144, 12, 10, 0, 207, 13, 10, 0, 16, 15, 10, 0, 79, 16, 10, 0, 144, 17, 10, 0, 207, 18, 10, 0, 16, 20, 10, 0, 79, 21, 10, 0, 144, 22, 10, 0, 207, 23, 10, 0, 16, 25, 10, 0, 79, 26, 10, 0, 144, 27, 10, 0, 207, 28, 10, 0, 16, 30, 10, 0, 79, 31, 10, 0, 144, 32, 10, 0, 207, 33, 10, 0, 16, 35, 10, 0, 79, 36, 10, 0, 144, 37, 10, 0, 207, 38, 10, 0, 16, 40, 10, 0, 79, 41, 10, 0, 144, 42, 10, 0, 207, 43, 10, 0, 16, 45, 10, 0, 79, 46, 10, 0, 144, 47, 10, 0, 207, 48, 10, 0, 16, 50, 10, 0, 79, 51, 10, 0, 144, 52, 10, 0, 207, 53, 10, 0, 16, 55, 10, 0, 79, 56, 10, 0, 144, 57, 10, 0, 207, 58, 10, 0, 16, 60, 10, 0, 79, 61, 10, 0, 144, 62, 10, 0, 207, 63, 10, 0, 16, 65, 10, 0, 79, 66, 10, 0, 144, 67, 10, 0, 207, 68, 10, 0, 16, 70, 10, 0, 79, 71, 10, 0, 144, 72, 10, 0, 207, 73, 10, 0, 16, 75, 10, 0, 79, 76, 10, 0, 144, 77, 10, 0, 207, 78, 10, 0, 16, 80, 10, 0, 79, 81, 10, 0, 144, 82, 10, 0, 207, 83, 10, 0, 16, 85, 10, 0, 79, 86, 10, 0, 144, 87, 10, 0, 207, 88, 10, 0, 16, 90, 10, 0, 79, 91, 10, 0, 144, 92, 10, 0, 207, 93, 10, 0, 16, 95, 10, 0, 79, 96, 10, 0, 144, 97, 10, 0, 207, 98, 10, 0, 16, 100, 10, 0, 79, 101, 10, 0, 144, 102, 10, 0, 207, 103, 10, 0, 16, 105, 10, 0, 79, 106, 10, 0, 144, 107, 10, 0, 207, 108, 10, 0, 16, 110, 10, 0, 79, 111, 10, 0, 144, 112, 10, 0, 207, 113, 10, 0, 16, 115, 10, 0, 79, 116, 10, 0, 144, 117, 10, 0, 207, 118, 10, 0, 16, 120, 10, 0, 79, 121, 10, 0, 144, 122, 10, 0, 207, 123, 10, 0, 16, 125, 10, 0, 79, 126, 10, 0, 144, 127, 10, 0, 207, 128, 10, 0, 16, 130, 10, 0, 79, 131, 10, 0, 144, 132, 10, 0, 207, 133, 10, 0, 16, 135, 10, 0, 79, 136, 10, 0, 144, 137, 10, 0, 207, 138, 10, 0, 16, 140, 10, 0, 79, 141, 10, 0, 144, 142, 10, 0, 207, 143, 10, 0, 16, 145, 10, 0, 79, 146, 10, 0, 144, 147, 10, 0, 207, 148, 10, 0, 16, 150, 10, 0, 79, 151, 10, 0, 144, 152, 10, 0, 207, 153, 10, 0, 16, 155, 10, 0, 79, 156, 10, 0, 144, 157, 10, 0, 207, 158, 10, 0, 16, 160, 10, 0, 79, 161, 10, 0, 144, 162, 10, 0, 207, 163, 10, 0, 16, 165, 10, 0, 79, 166, 10, 0, 144, 167, 10, 0, 207, 168, 10, 0, 16, 170, 10, 0, 79, 171, 10, 0, 144, 172, 10, 0, 207, 173, 10, 0, 16, 175, 10, 0, 79, 176, 10, 0, 144, 177, 10, 0, 207, 178, 10, 0, 16, 180, 10, 0, 79, 181, 10, 0, 144, 182, 10, 0, 207, 183, 10, 0, 16, 185, 10, 0, 79, 186, 10, 0, 144, 187, 10, 0, 207, 188, 10, 0, 16, 190, 10, 0, 79, 191, 10, 0, 144, 192, 10, 0, 207, 193, 10, 0, 16, 195, 10, 0, 79, 196, 10, 0, 144, 197, 10, 0, 207, 198, 10, 0, 16, 200, 10, 0, 79, 201, 10, 0, 144, 202, 10, 0, 207, 203, 10, 0, 16, 205, 10, 0, 79, 206, 10, 0, 144, 207, 10, 0, 207, 208, 10, 0, 16, 210, 10, 0, 79, 211, 10, 0, 144, 212, 10, 0, 207, 213, 10, 0, 16, 215, 10, 0, 79, 216, 10, 0, 144, 217, 10, 0, 207, 218, 10, 0, 16, 220, 10, 0, 79, 221, 10, 0, 144, 222, 10, 0, 207, 223, 10, 0, 16, 225, 10, 0, 79, 226, 10, 0, 144, 227, 10, 0, 207, 228, 10, 0, 16, 230, 10, 0, 79, 231, 10, 0, 144, 232, 10, 0, 207, 233, 10, 0, 16, 235, 10, 0, 79, 236, 10, 0, 144, 237, 10, 0, 207, 238, 10, 0, 16, 240, 10, 0, 79, 241, 10, 0, 144, 242, 10, 0, 207, 243, 10, 0, 16, 245, 10, 0, 79, 246, 10, 0, 144, 247, 10, 0, 207, 248, 10, 0, 16, 250, 10, 0, 79, 251, 10, 0, 144, 252, 10, 0, 207, 253, 10, 0, 16, 255, 10, 0, 79, 0, 11, 0, 144, 1, 11, 0, 207, 2, 11, 0, 16, 4, 11, 0, 79, 5, 11, 0, 144, 6, 11, 0, 207, 7, 11, 0, 16, 9, 11, 0, 79, 10, 11, 0, 144, 11, 11, 0, 207, 12, 11, 0, 16, 14, 11, 0, 79, 15, 11, 0, 144, 16, 11, 0, 207, 17, 11, 0, 16, 19, 11, 0, 79, 20, 11, 0, 144, 21, 11, 0, 207, 22, 11, 0, 16, 24, 11, 0, 79, 25, 11, 0, 144, 26, 11, 0, 207, 27, 11, 0, 16, 29, 11, 0, 79, 30, 11, 0, 144, 31, 11, 0, 207, 32, 11, 0, 16, 34, 11, 0, 79, 35, 11, 0, 144, 36, 11, 0, 207, 37, 11, 0, 16, 39, 11, 0, 79, 40, 11, 0, 144, 41, 11, 0, 207, 42, 11, 0, 16, 44, 11, 0, 79, 45, 11, 0, 144, 46, 11, 0, 207, 47, 11, 0, 16, 49, 11, 0, 79, 50, 11, 0, 144, 51, 11, 0, 207, 52, 11, 0, 16, 54, 11, 0, 79, 55, 11, 0, 144, 56, 11, 0, 207, 57, 11, 0, 16, 59, 11, 0, 79, 60, 11, 0, 144, 61, 11, 0, 207, 62, 11, 0, 16, 64, 11, 0, 79, 65, 11, 0, 144, 66, 11, 0, 207, 67, 11, 0, 16, 69, 11, 0, 79, 70, 11, 0, 144, 71, 11, 0, 207, 72, 11, 0, 16, 74, 11, 0, 79, 75, 11, 0, 144, 76, 11, 0, 207, 77, 11, 0, 16, 79, 11, 0, 79, 80, 11, 0, 144, 81, 11, 0, 207, 82, 11, 0, 16, 84, 11, 0, 79, 85, 11, 0, 144, 86, 11, 0, 207, 87, 11, 0, 16, 89, 11, 0, 79, 90, 11, 0, 144, 91, 11, 0, 207, 92, 11, 0, 16, 94, 11, 0, 79, 95, 11, 0, 144, 96, 11, 0, 207, 97, 11, 0, 16, 99, 11, 0, 79, 100, 11, 0, 144, 101, 11, 0, 207, 102, 11, 0, 16, 104, 11, 0, 79, 105, 11, 0, 144, 106, 11, 0, 207, 107, 11, 0, 16, 109, 11, 0, 79, 110, 11, 0, 144, 111, 11, 0, 207, 112, 11, 0, 16, 114, 11, 0, 79, 115, 11, 0, 144, 116, 11, 0, 207, 117, 11, 0, 16, 119, 11, 0, 79, 120, 11, 0, 144, 121, 11, 0, 207, 122, 11, 0, 16, 124, 11, 0, 79, 125, 11, 0, 144, 126, 11, 0, 207, 127, 11, 0, 16, 129, 11, 0, 79, 130, 11, 0, 144, 131, 11, 0, 207, 132, 11, 0, 16, 134, 11, 0, 79, 135, 11, 0, 144, 136, 11, 0, 207, 137, 11, 0, 16, 139, 11, 0, 79, 140, 11, 0, 144, 141, 11, 0, 207, 142, 11, 0, 16, 144, 11, 0, 79, 145, 11, 0, 144, 146, 11, 0, 207, 147, 11, 0, 16, 149, 11, 0, 79, 150, 11, 0, 144, 151, 11, 0, 207, 152, 11, 0, 16, 154, 11, 0, 79, 155, 11, 0, 144, 156, 11, 0, 207, 157, 11, 0, 16, 159, 11, 0, 79, 160, 11, 0, 144, 161, 11, 0, 207, 162, 11, 0, 16, 164, 11, 0, 79, 165, 11, 0, 144, 166, 11, 0, 207, 167, 11, 0, 16, 169, 11, 0, 79, 170, 11, 0, 144, 171, 11, 0, 207, 172, 11, 0, 16, 174, 11, 0, 79, 175, 11, 0, 144, 176, 11, 0, 207, 177, 11, 0, 16, 179, 11, 0, 79, 180, 11, 0, 144, 181, 11, 0, 207, 182, 11, 0, 16, 184, 11, 0, 79, 185, 11, 0, 144, 186, 11, 0, 207, 187, 11, 0, 16, 189, 11, 0, 79, 190, 11, 0, 144, 191, 11, 0, 207, 192, 11, 0, 16, 194, 11, 0, 79, 195, 11, 0, 144, 196, 11, 0, 207, 197, 11, 0, 16, 199, 11, 0, 79, 200, 11, 0, 144, 201, 11, 0, 207, 202, 11, 0, 16, 204, 11, 0, 79, 205, 11, 0, 144, 206, 11, 0, 207, 207, 11, 0, 16, 209, 11, 0, 79, 210, 11, 0, 144, 211, 11, 0, 207, 212, 11, 0, 16, 214, 11, 0, 79, 215, 11, 0, 144, 216, 11, 0, 207, 217, 11, 0, 16, 219, 11, 0, 79, 220, 11, 0, 144, 221, 11, 0, 207, 222, 11, 0, 16, 224, 11, 0, 79, 225, 11, 0, 144, 226, 11, 0, 207, 227, 11, 0, 16, 229, 11, 0, 79, 230, 11, 0, 144, 231, 11, 0, 207, 232, 11, 0, 16, 234, 11, 0, 79, 235, 11, 0, 144, 236, 11, 0, 207, 237, 11, 0, 16, 239, 11, 0, 79, 240, 11, 0, 144, 241, 11, 0, 207, 242, 11, 0, 16, 244, 11, 0, 79, 245, 11, 0, 144, 246, 11, 0, 207, 247, 11, 0, 16, 249, 11, 0, 79, 250, 11, 0, 144, 251, 11, 0, 207, 252, 11, 0, 16, 254, 11, 0, 79, 255, 11, 0, 144, 0, 12, 0, 207, 1, 12, 0, 16, 3, 12, 0, 79, 4, 12, 0, 144, 5, 12, 0, 207, 6, 12, 0, 16, 8, 12, 0, 79, 9, 12, 0, 144, 10, 12, 0, 207, 11, 12, 0, 16, 13, 12, 0, 79, 14, 12, 0, 144, 15, 12, 0, 207, 16, 12, 0, 16, 18, 12, 0, 79, 19, 12, 0, 144, 20, 12, 0, 207, 21, 12, 0, 16, 23, 12, 0, 79, 24, 12, 0, 144, 25, 12, 0, 207, 26, 12, 0, 16, 28, 12, 0, 79, 29, 12, 0, 144, 30, 12, 0, 207, 31, 12, 0, 16, 33, 12, 0, 79, 34, 12, 0, 144, 35, 12, 0, 207, 36, 12, 0, 16, 38, 12, 0, 79, 39, 12, 0, 144, 40, 12, 0, 207, 41, 12, 0, 16, 43, 12, 0, 79, 44, 12, 0, 144, 45, 12, 0, 207, 46, 12, 0, 16, 48, 12, 0, 79, 49, 12, 0, 144, 50, 12, 0, 207, 51, 12, 0, 1], [], [], [], [14, 0, 0, 0, 77, 1, 0, 0, 142, 2, 0, 0, 205, 3, 0, 0, 14, 5, 0, 0, 77, 6, 0, 0, 142, 7, 0, 0, 205, 8, 0, 0, 14, 10, 0, 0, 77, 11, 0, 0, 142, 12, 0, 0, 205, 13, 0, 0, 14, 15, 0, 0, 77, 16, 0, 0, 142, 17, 0, 0, 205, 18, 0, 0, 14, 20, 0, 0, 77, 21, 0, 0, 142, 22, 0, 0, 205, 23, 0, 0, 14, 25, 0, 0, 77, 26, 0, 0, 142, 27, 0, 0, 205, 28, 0, 0, 14, 30, 0, 0, 77, 31, 0, 0, 142, 32, 0, 0, 205, 33, 0, 0, 14, 35, 0, 0, 77, 36, 0, 0, 142, 37, 0, 0, 205, 38, 0, 0, 14, 40, 0, 0, 77, 41, 0, 0, 142, 42, 0, 0, 205, 43, 0, 0, 14, 45, 0, 0, 77, 46, 0, 0, 142, 47, 0, 0, 205, 48, 0, 0, 14, 50, 0, 0, 77, 51, 0, 0, 142, 52, 0, 0, 205, 53, 0, 0, 14, 55, 0, 0, 77, 56, 0, 0, 142, 57, 0, 0, 205, 58, 0, 0, 14, 60, 0, 0, 77, 61, 0, 0, 142, 62, 0, 0, 205, 63, 0, 0, 14, 65, 0, 0, 77, 66, 0, 0, 142, 67, 0, 0, 205, 68, 0, 0, 14, 70, 0, 0, 77, 71, 0, 0, 142, 72, 0, 0, 205, 73, 0, 0, 14, 75, 0, 0, 77, 76, 0, 0, 142, 77, 0, 0, 205, 78, 0, 0, 14, 80, 0, 0, 77, 81, 0, 0, 142, 82, 0, 0, 205, 83, 0, 0, 14, 85, 0, 0, 77, 86, 0, 0, 142, 87, 0, 0, 205, 88, 0, 0, 14, 90, 0, 0, 77, 91, 0, 0, 142, 92, 0, 0, 205, 93, 0, 0, 14, 95, 0, 0, 77, 96, 0, 0, 142, 97, 0, 0, 205, 98, 0, 0, 14, 100, 0, 0, 77, 101, 0, 0, 142, 102, 0, 0, 205, 103, 0, 0, 14, 105, 0, 0, 77, 106, 0, 0, 142, 107, 0, 0, 205, 108, 0, 0, 14, 110, 0, 0, 77, 111, 0, 0, 142, 112, 0, 0, 205, 113, 0, 0, 14, 115, 0, 0, 77, 116, 0, 0, 142, 117, 0, 0, 205, 118, 0, 0, 14, 120, 0, 0, 77, 121, 0, 0, 142, 122, 0, 0, 205, 123, 0, 0, 14, 125, 0, 0, 77, 126, 0, 0, 142, 127, 0, 0, 205, 128, 0, 0, 14, 130, 0, 0, 77, 131, 0, 0, 142, 132, 0, 0, 205, 133, 0, 0, 14, 135, 0, 0, 77, 136, 0, 0, 142, 137, 0, 0, 205, 138, 0, 0, 14, 140, 0, 0, 77, 141, 0, 0, 142, 142, 0, 0, 205, 143, 0, 0, 14, 145, 0, 0, 77, 146, 0, 0, 142, 147, 0, 0, 205, 148, 0, 0, 14, 150, 0, 0, 77, 151, 0, 0, 142, 152, 0, 0, 205, 153, 0, 0, 14, 155, 0, 0, 77, 156, 0, 0, 142, 157, 0, 0, 205, 158, 0, 0, 14, 160, 0, 0, 77, 161, 0, 0, 142, 162, 0, 0, 205, 163, 0, 0, 14, 165, 0, 0, 77, 166, 0, 0, 142, 167, 0, 0, 205, 168, 0, 0, 14, 170, 0, 0, 77, 171, 0, 0, 142, 172, 0, 0, 205, 173, 0, 0, 14, 175, 0, 0, 77, 176, 0, 0, 142, 177, 0, 0, 205, 178, 0, 0, 14, 180, 0, 0, 77, 181, 0, 0, 142, 182, 0, 0, 205, 183, 0, 0, 14, 185, 0, 0, 77, 186, 0, 0, 142, 187, 0, 0, 205, 188, 0, 0, 14, 190, 0, 0, 77, 191, 0, 0, 142, 192, 0, 0, 205, 193, 0, 0, 14, 195, 0, 0, 77, 196, 0, 0, 142, 197, 0, 0, 205, 198, 0, 0, 14, 200, 0, 0, 77, 201, 0, 0, 142, 202, 0, 0, 205, 203, 0, 0, 14, 205, 0, 0, 77, 206, 0, 0, 142, 207, 0, 0, 205, 208, 0, 0, 14, 210, 0, 0, 77, 211, 0, 0, 142, 212, 0, 0, 205, 213, 0, 0, 14, 215, 0, 0, 77, 216, 0, 0, 142, 217, 0, 0, 205, 218, 0, 0, 14, 220, 0, 0, 77, 221, 0, 0, 142, 222, 0, 0, 205, 223, 0, 0, 14, 225, 0, 0, 77, 226, 0, 0, 142, 227, 0, 0, 205, 228, 0, 0, 14, 230, 0, 0, 77, 231, 0, 0, 142, 232, 0, 0, 205, 233, 0, 0, 14, 235, 0, 0, 77, 236, 0, 0, 142, 237, 0, 0, 205, 238, 0, 0, 14, 240, 0, 0, 77, 241, 0, 0, 142, 242, 0, 0, 205, 243, 0, 0, 14, 245, 0, 0, 77, 246, 0, 0, 142, 247, 0, 0, 205, 248, 0, 0, 14, 250, 0, 0, 77, 251, 0, 0, 142, 252, 0, 0, 205, 253, 0, 0, 14, 255, 0, 0, 77, 0, 1, 0, 142, 1, 1, 0, 205, 2, 1, 0, 14, 4, 1, 0, 77, 5, 1, 0, 142, 6, 1, 0, 205, 7, 1, 0, 14, 9, 1, 0, 77, 10, 1, 0, 142, 11, 1, 0, 205, 12, 1, 0, 14, 14, 1, 0, 77, 15, 1, 0, 142, 16, 1, 0, 205, 17, 1, 0, 14, 19, 1, 0, 77, 20, 1, 0, 142, 21, 1, 0, 205, 22, 1, 0, 14, 24, 1, 0, 77, 25, 1, 0, 142, 26, 1, 0, 205, 27, 1, 0, 14, 29, 1, 0, 77, 30, 1, 0, 142, 31, 1, 0, 205, 32, 1, 0, 14, 34, 1, 0, 77, 35, 1, 0, 142, 36, 1, 0, 205, 37, 1, 0, 14, 39, 1, 0, 77, 40, 1, 0, 142, 41, 1, 0, 205, 42, 1, 0, 14, 44, 1, 0, 77, 45, 1, 0, 142, 46, 1, 0, 205, 47, 1, 0, 14, 49, 1, 0, 77, 50, 1, 0, 142, 51, 1, 0, 205, 52, 1, 0, 14, 54, 1, 0, 77, 55, 1, 0, 142, 56, 1, 0, 205, 57, 1, 0, 14, 59, 1, 0, 77, 60, 1, 0, 142, 61, 1, 0, 205, 62, 1, 0, 14, 64, 1, 0, 77, 65, 1, 0, 142, 66, 1, 0, 205, 67, 1, 0, 14, 69, 1, 0, 77, 70, 1, 0, 142, 71, 1, 0, 205, 72, 1, 0, 14, 74, 1, 0, 77, 75, 1, 0, 142, 76, 1, 0, 205, 77, 1, 0, 14, 79, 1, 0, 77, 80, 1, 0, 142, 81, 1, 0, 205, 82, 1, 0, 14, 84, 1, 0, 77, 85, 1, 0, 142, 86, 1, 0, 205, 87, 1, 0, 14, 89, 1, 0, 77, 90, 1, 0, 142, 91, 1, 0, 205, 92, 1, 0, 14, 94, 1, 0, 77, 95, 1, 0, 142, 96, 1, 0, 205, 97, 1, 0, 14, 99, 1, 0, 77, 100, 1, 0, 142, 101, 1, 0, 205, 102, 1, 0, 14, 104, 1, 0, 77, 105, 1, 0, 142, 106, 1, 0, 205, 107, 1, 0, 14, 109, 1, 0, 77, 110, 1, 0, 142, 111, 1, 0, 205, 112, 1, 0, 14, 114, 1, 0, 77, 115, 1, 0, 142, 116, 1, 0, 205, 117, 1, 0, 14, 119, 1, 0, 77, 120, 1, 0, 142, 121, 1, 0, 205, 122, 1, 0, 14, 124, 1, 0, 77, 125, 1, 0, 142, 126, 1, 0, 205, 127, 1, 0, 14, 129, 1, 0, 77, 130, 1, 0, 142, 131, 1, 0, 205, 132, 1, 0, 14, 134, 1, 0, 77, 135, 1, 0, 142, 136, 1, 0, 205, 137, 1, 0, 14, 139, 1, 0, 77, 140, 1, 0, 142, 141, 1, 0, 205, 142, 1, 0, 14, 144, 1, 0, 77, 145, 1, 0, 142, 146, 1, 0, 205, 147, 1, 0, 14, 149, 1, 0, 77, 150, 1, 0, 142, 151, 1, 0, 205, 152, 1, 0, 14, 154, 1, 0, 77, 155, 1, 0, 142, 156, 1, 0, 205, 157, 1, 0, 14, 159, 1, 0, 77, 160, 1, 0, 142, 161, 1, 0, 205, 162, 1, 0, 14, 164, 1, 0, 77, 165, 1, 0, 142, 166, 1, 0, 205, 167, 1, 0, 14, 169, 1, 0, 77, 170, 1, 0, 142, 171, 1, 0, 205, 172, 1, 0, 14, 174, 1, 0, 77, 175, 1, 0, 142, 176, 1, 0, 205, 177, 1, 0, 14, 179, 1, 0, 77, 180, 1, 0, 142, 181, 1, 0, 205, 182, 1, 0, 14, 184, 1, 0, 77, 185, 1, 0, 142, 186, 1, 0, 205, 187, 1, 0, 14, 189, 1, 0, 77, 190, 1, 0, 142, 191, 1, 0, 205, 192, 1, 0, 14, 194, 1, 0, 77, 195, 1, 0, 142, 196, 1, 0, 205, 197, 1, 0, 14, 199, 1, 0, 77, 200, 1, 0, 142, 201, 1, 0, 205, 202, 1, 0, 14, 204, 1, 0, 77, 205, 1, 0, 142, 206, 1, 0, 205, 207, 1, 0, 14, 209, 1, 0, 77, 210, 1, 0, 142, 211, 1, 0, 205, 212, 1, 0, 14, 214, 1, 0, 77, 215, 1, 0, 142, 216, 1, 0, 205, 217, 1, 0, 14, 219, 1, 0, 77, 220, 1, 0, 142, 221, 1, 0, 205, 222, 1, 0, 14, 224, 1, 0, 77, 225, 1, 0, 142, 226, 1, 0, 205, 227, 1, 0, 14, 229, 1, 0, 77, 230, 1, 0, 142, 231, 1, 0, 205, 232, 1, 0, 14, 234, 1, 0, 77, 235, 1, 0, 142, 236, 1, 0, 205, 237, 1, 0, 14, 239, 1, 0, 77, 240, 1, 0, 142, 241, 1, 0, 205, 242, 1, 0, 14, 244, 1, 0, 77, 245, 1, 0, 142, 246, 1, 0, 205, 247, 1, 0, 14, 249, 1, 0, 77, 250, 1, 0, 142, 251, 1, 0, 205, 252, 1, 0, 14, 254, 1, 0, 77, 255, 1, 0, 142, 0, 2, 0, 205, 1, 2, 0, 14, 3, 2, 0, 77, 4, 2, 0, 142, 5, 2, 0, 205, 6, 2, 0, 14, 8, 2, 0, 77, 9, 2, 0, 142, 10, 2, 0, 205, 11, 2, 0, 14, 13, 2, 0, 77, 14, 2, 0, 142, 15, 2, 0, 205, 16, 2, 0, 14, 18, 2, 0, 77, 19, 2, 0, 142, 20, 2, 0, 205, 21, 2, 0, 14, 23, 2, 0, 77, 24, 2, 0, 142, 25, 2, 0, 205, 26, 2, 0, 14, 28, 2, 0, 77, 29, 2, 0, 142, 30, 2, 0, 205, 31, 2, 0, 14, 33, 2, 0, 77, 34, 2, 0, 142, 35, 2, 0, 205, 36, 2, 0, 14, 38, 2, 0, 77, 39, 2, 0, 142, 40, 2, 0, 205, 41, 2, 0, 14, 43, 2, 0, 77, 44, 2, 0, 142, 45, 2, 0, 205, 46, 2, 0, 14, 48, 2, 0, 77, 49, 2, 0, 142, 50, 2, 0, 205, 51, 2, 0, 14, 53, 2, 0, 77, 54, 2, 0, 142, 55, 2, 0, 205, 56, 2, 0, 14, 58, 2, 0, 77, 59, 2, 0, 142, 60, 2, 0, 205, 61, 2, 0, 14, 63, 2, 0, 77, 64, 2, 0, 142, 65, 2, 0, 205, 66, 2, 0, 14, 68, 2, 0, 77, 69, 2, 0, 142, 70, 2, 0, 205, 71, 2, 0, 14, 73, 2, 0, 77, 74, 2, 0, 142, 75, 2, 0, 205, 76, 2, 0, 14, 78, 2, 0, 77, 79, 2, 0, 142, 80, 2, 0, 205, 81, 2, 0, 14, 83, 2, 0, 77, 84, 2, 0, 142, 85, 2, 0, 205, 86, 2, 0, 14, 88, 2, 0, 77, 89, 2, 0, 142, 90, 2, 0, 205, 91, 2, 0, 14, 93, 2, 0, 77, 94, 2, 0, 142, 95, 2, 0, 205, 96, 2, 0, 14, 98, 2, 0, 77, 99, 2, 0, 142, 100, 2, 0, 205, 101, 2, 0, 14, 103, 2, 0, 77, 104, 2, 0, 142, 105, 2, 0, 205, 106, 2, 0, 14, 108, 2, 0, 77, 109, 2, 0, 142, 110, 2, 0, 205, 111, 2, 0, 14, 113, 2, 0, 77, 114, 2, 0, 142, 115, 2, 0, 205, 116, 2, 0, 14, 118, 2, 0, 77, 119, 2, 0, 142, 120, 2, 0, 205, 121, 2, 0, 14, 123, 2, 0, 77, 124, 2, 0, 142, 125, 2, 0, 205, 126, 2, 0, 14, 128, 2, 0, 77, 129, 2, 0, 142, 130, 2, 0, 205, 131, 2, 0, 14, 133, 2, 0, 77, 134, 2, 0, 142, 135, 2, 0, 205, 136, 2, 0, 14, 138, 2, 0, 77, 139, 2, 0, 142, 140, 2, 0, 205, 141, 2, 0, 14, 143, 2, 0, 77, 144, 2, 0, 142, 145, 2, 0, 205, 146, 2, 0, 14, 148, 2, 0, 77, 149, 2, 0, 142, 150, 2, 0, 205, 151, 2, 0, 14, 153, 2, 0, 77, 154, 2, 0, 142, 155, 2, 0, 205, 156, 2, 0, 14, 158, 2, 0, 77, 159, 2, 0, 142, 160, 2, 0, 205, 161, 2, 0, 14, 163, 2, 0, 77, 164, 2, 0, 142, 165, 2, 0, 205, 166, 2, 0, 14, 168, 2, 0, 77, 169, 2, 0, 142, 170, 2, 0, 205, 171, 2, 0, 14, 173, 2, 0, 77, 174, 2, 0, 142, 175, 2, 0, 205, 176, 2, 0, 14, 178, 2, 0, 77, 179, 2, 0, 142, 180, 2, 0, 205, 181, 2, 0, 14, 183, 2, 0, 77, 184, 2, 0, 142, 185, 2, 0, 205, 186, 2, 0, 14, 188, 2, 0, 77, 189, 2, 0, 142, 190, 2, 0, 205, 191, 2, 0, 14, 193, 2, 0, 77, 194, 2, 0, 142, 195, 2, 0, 205, 196, 2, 0, 14, 198, 2, 0, 77, 199, 2, 0, 142, 200, 2, 0, 205, 201, 2, 0, 14, 203, 2, 0, 77, 204, 2, 0, 142, 205, 2, 0, 205, 206, 2, 0, 14, 208, 2, 0, 77, 209, 2, 0, 142, 210, 2, 0, 205, 211, 2, 0, 14, 213, 2, 0, 77, 214, 2, 0, 142, 215, 2, 0, 205, 216, 2, 0, 14, 218, 2, 0, 77, 219, 2, 0, 142, 220, 2, 0, 205, 221, 2, 0, 14, 223, 2, 0, 77, 224, 2, 0, 142, 225, 2, 0, 205, 226, 2, 0, 14, 228, 2, 0, 77, 229, 2, 0, 142, 230, 2, 0, 205, 231, 2, 0, 14, 233, 2, 0, 77, 234, 2, 0, 142, 235, 2, 0, 205, 236, 2, 0, 14, 238, 2, 0, 77, 239, 2, 0, 142, 240, 2, 0, 205, 241, 2, 0, 14, 243, 2, 0, 77, 244, 2, 0, 142, 245, 2, 0, 205, 246, 2, 0, 14, 248, 2, 0, 77, 249, 2, 0, 142, 250, 2, 0, 205, 251, 2, 0, 14, 253, 2, 0, 77, 254, 2, 0, 142, 255, 2, 0, 205, 0, 3, 0, 14, 2, 3, 0, 77, 3, 3, 0, 142, 4, 3, 0, 205, 5, 3, 0, 14, 7, 3, 0, 77, 8, 3, 0, 142, 9, 3, 0, 205, 10, 3, 0, 14, 12, 3, 0, 77, 13, 3, 0, 142, 14, 3, 0, 205, 15, 3, 0, 14, 17, 3, 0, 77, 18, 3, 0, 142, 19, 3, 0, 205, 20, 3, 0, 14, 22, 3, 0, 77, 23, 3, 0, 142, 24, 3, 0, 205, 25, 3, 0, 14, 27, 3, 0, 77, 28, 3, 0, 142, 29, 3, 0, 205, 30, 3, 0, 14, 32, 3, 0, 77, 33, 3, 0, 142, 34, 3, 0, 205, 35, 3, 0, 14, 37, 3, 0, 77, 38, 3, 0, 142, 39, 3, 0, 205, 40, 3, 0, 14, 42, 3, 0, 77, 43, 3, 0, 142, 44, 3, 0, 205, 45, 3, 0, 14, 47, 3, 0, 77, 48, 3, 0, 142, 49, 3, 0, 205, 50, 3, 0, 14, 52, 3, 0, 77, 53, 3, 0, 142, 54, 3, 0, 205, 55, 3, 0, 14, 57, 3, 0, 77, 58, 3, 0, 142, 59, 3, 0, 205, 60, 3, 0, 14, 62, 3, 0, 77, 63, 3, 0, 142, 64, 3, 0, 205, 65, 3, 0, 14, 67, 3, 0, 77, 68, 3, 0, 142, 69, 3, 0, 205, 70, 3, 0, 14, 72, 3, 0, 77, 73, 3, 0, 142, 74, 3, 0, 205, 75, 3, 0, 14, 77, 3, 0, 77, 78, 3, 0, 142, 79, 3, 0, 205, 80, 3, 0, 14, 82, 3, 0, 77, 83, 3, 0, 142, 84, 3, 0, 205, 85, 3, 0, 14, 87, 3, 0, 77, 88, 3, 0, 142, 89, 3, 0, 205, 90, 3, 0, 14, 92, 3, 0, 77, 93, 3, 0, 142, 94, 3, 0, 205, 95, 3, 0, 14, 97, 3, 0, 77, 98, 3, 0, 142, 99, 3, 0, 205, 100, 3, 0, 14, 102, 3, 0, 77, 103, 3, 0, 142, 104, 3, 0, 205, 105, 3, 0, 14, 107, 3, 0, 77, 108, 3, 0, 142, 109, 3, 0, 205, 110, 3, 0, 14, 112, 3, 0, 77, 113, 3, 0, 142, 114, 3, 0, 205, 115, 3, 0, 14, 117, 3, 0, 77, 118, 3, 0, 142, 119, 3, 0, 205, 120, 3, 0, 14, 122, 3, 0, 77, 123, 3, 0, 142, 124, 3, 0, 205, 125, 3, 0, 14, 127, 3, 0, 77, 128, 3, 0, 142, 129, 3, 0, 205, 130, 3, 0, 14, 132, 3, 0, 77, 133, 3, 0, 142, 134, 3, 0, 205, 135, 3, 0, 14, 137, 3, 0, 77, 138, 3, 0, 142, 139, 3, 0, 205, 140, 3, 0, 14, 142, 3, 0, 77, 143, 3, 0, 142, 144, 3, 0, 205, 145, 3, 0, 14, 147, 3, 0, 77, 148, 3, 0, 142, 149, 3, 0, 205, 150, 3, 0, 14, 152, 3, 0, 77, 153, 3, 0, 142, 154, 3, 0, 205, 155, 3, 0, 14, 157, 3, 0, 77, 158, 3, 0, 142, 159, 3, 0, 205, 160, 3, 0, 14, 162, 3, 0, 77, 163, 3, 0, 142, 164, 3, 0, 205, 165, 3, 0, 14, 167, 3, 0, 77, 168, 3, 0, 142, 169, 3, 0, 205, 170, 3, 0, 14, 172, 3, 0, 77, 173, 3, 0, 142, 174, 3, 0, 205, 175, 3, 0, 14, 177, 3, 0, 77, 178, 3, 0, 142, 179, 3, 0, 205, 180, 3, 0, 14, 182, 3, 0, 77, 183, 3, 0, 142, 184, 3, 0, 205, 185, 3, 0, 14, 187, 3, 0, 77, 188, 3, 0, 142, 189, 3, 0, 205, 190, 3, 0, 14, 192, 3, 0, 77, 193, 3, 0, 142, 194, 3, 0, 205, 195, 3, 0, 14, 197, 3, 0, 77, 198, 3, 0, 142, 199, 3, 0, 205, 200, 3, 0, 14, 202, 3, 0, 77, 203, 3, 0, 142, 204, 3, 0, 205, 205, 3, 0, 14, 207, 3, 0, 77, 208, 3, 0, 142, 209, 3, 0, 205, 210, 3, 0, 14, 212, 3, 0, 77, 213, 3, 0, 142, 214, 3, 0, 205, 215, 3, 0, 14, 217, 3, 0, 77, 218, 3, 0, 142, 219, 3, 0, 205, 220, 3, 0, 14, 222, 3, 0, 77, 223, 3, 0, 142, 224, 3, 0, 205, 225, 3, 0, 14, 227, 3, 0, 77, 228, 3, 0, 142, 229, 3, 0, 205, 230, 3, 0, 14, 232, 3, 0, 77, 233, 3, 0, 142, 234, 3, 0, 205, 235, 3, 0, 14, 237, 3, 0, 77, 238, 3, 0, 142, 239, 3, 0, 205, 240, 3, 0, 14, 242, 3, 0, 77, 243, 3, 0, 142, 244, 3, 0, 205, 245, 3, 0, 14, 247, 3, 0, 77, 248, 3, 0, 142, 249, 3, 0, 205, 250, 3, 0, 14, 252, 3, 0, 77, 253, 3, 0, 142, 254, 3, 0, 205, 255, 3, 0, 14, 1, 4, 0, 77, 2, 4, 0, 142, 3, 4, 0, 205, 4, 4, 0, 14, 6, 4, 0, 77, 7, 4, 0, 142, 8, 4, 0, 205, 9, 4, 0, 14, 11, 4, 0, 77, 12, 4, 0, 142, 13, 4, 0, 205, 14, 4, 0, 14, 16, 4, 0, 77, 17, 4, 0, 142, 18, 4, 0, 205, 19, 4, 0, 14, 21, 4, 0, 77, 22, 4, 0, 142, 23, 4, 0, 205, 24, 4, 0, 14, 26, 4, 0, 77, 27, 4, 0, 142, 28, 4, 0, 205, 29, 4, 0, 14, 31, 4, 0, 77, 32, 4, 0, 142, 33, 4, 0, 205, 34, 4, 0, 14, 36, 4, 0, 77, 37, 4, 0, 142, 38, 4, 0, 205, 39, 4, 0, 14, 41, 4, 0, 77, 42, 4, 0, 142, 43, 4, 0, 205, 44, 4, 0, 14, 46, 4, 0, 77, 47, 4, 0, 142, 48, 4, 0, 205, 49, 4, 0, 14, 51, 4, 0, 77, 52, 4, 0, 142, 53, 4, 0, 205, 54, 4, 0, 14, 56, 4, 0, 77, 57, 4, 0, 142, 58, 4, 0, 205, 59, 4, 0, 14, 61, 4, 0, 77, 62, 4, 0, 142, 63, 4, 0, 205, 64, 4, 0, 14, 66, 4, 0, 77, 67, 4, 0, 142, 68, 4, 0, 205, 69, 4, 0, 14, 71, 4, 0, 77, 72, 4, 0, 142, 73, 4, 0, 205, 74, 4, 0, 14, 76, 4, 0, 77, 77, 4, 0, 142, 78, 4, 0, 205, 79, 4, 0, 14, 81, 4, 0, 77, 82, 4, 0, 142, 83, 4, 0, 205, 84, 4, 0, 14, 86, 4, 0, 77, 87, 4, 0, 142, 88, 4, 0, 205, 89, 4, 0, 14, 91, 4, 0, 77, 92, 4, 0, 142, 93, 4, 0, 205, 94, 4, 0, 14, 96, 4, 0, 77, 97, 4, 0, 142, 98, 4, 0, 205, 99, 4, 0, 14, 101, 4, 0, 77, 102, 4, 0, 142, 103, 4, 0, 205, 104, 4, 0, 14, 106, 4, 0, 77, 107, 4, 0, 142, 108, 4, 0, 205, 109, 4, 0, 14, 111, 4, 0, 77, 112, 4, 0, 142, 113, 4, 0, 205, 114, 4, 0, 14, 116, 4, 0, 77, 117, 4, 0, 142, 118, 4, 0, 205, 119, 4, 0, 14, 121, 4, 0, 77, 122, 4, 0, 142, 123, 4, 0, 205, 124, 4, 0, 14, 126, 4, 0, 77, 127, 4, 0, 142, 128, 4, 0, 205, 129, 4, 0, 14, 131, 4, 0, 77, 132, 4, 0, 142, 133, 4, 0, 205, 134, 4, 0, 14, 136, 4, 0, 77, 137, 4, 0, 142, 138, 4, 0, 205, 139, 4, 0, 14, 141, 4, 0, 77, 142, 4, 0, 142, 143, 4, 0, 205, 144, 4, 0, 14, 146, 4, 0, 77, 147, 4, 0, 142, 148, 4, 0, 205, 149, 4, 0, 14, 151, 4, 0, 77, 152, 4, 0, 142, 153, 4, 0, 205, 154, 4, 0, 14, 156, 4, 0, 77, 157, 4, 0, 142, 158, 4, 0, 205, 159, 4, 0, 14, 161, 4, 0, 77, 162, 4, 0, 142, 163, 4, 0, 205, 164, 4, 0, 14, 166, 4, 0, 77, 167, 4, 0, 142, 168, 4, 0, 205, 169, 4, 0, 14, 171, 4, 0, 77, 172, 4, 0, 142, 173, 4, 0, 205, 174, 4, 0, 14, 176, 4, 0, 77, 177, 4, 0, 142, 178, 4, 0, 205, 179, 4, 0, 14, 181, 4, 0, 77, 182, 4, 0, 142, 183, 4, 0, 205, 184, 4, 0, 14, 186, 4, 0, 77, 187, 4, 0, 142, 188, 4, 0, 205, 189, 4, 0, 14, 191, 4, 0, 77, 192, 4, 0, 142, 193, 4, 0, 205, 194, 4, 0, 14, 196, 4, 0, 77, 197, 4, 0, 142, 198, 4, 0, 205, 199, 4, 0, 14, 201, 4, 0, 77, 202, 4, 0, 142, 203, 4, 0, 205, 204, 4, 0, 14, 206, 4, 0, 77, 207, 4, 0, 142, 208, 4, 0, 205, 209, 4, 0, 14, 211, 4, 0, 77, 212, 4, 0, 142, 213, 4, 0, 205, 214, 4, 0, 14, 216, 4, 0, 77, 217, 4, 0, 142, 218, 4, 0, 205, 219, 4, 0, 14, 221, 4, 0, 77, 222, 4, 0, 142, 223, 4, 0, 205, 224, 4, 0, 14, 226, 4, 0, 77, 227, 4, 0, 142, 228, 4, 0, 205, 229, 4, 0, 14, 231, 4, 0, 77, 232, 4, 0, 142, 233, 4, 0, 205, 234, 4, 0, 14, 236, 4, 0, 77, 237, 4, 0, 142, 238, 4, 0, 205, 239, 4, 0, 14, 241, 4, 0, 77, 242, 4, 0, 142, 243, 4, 0, 205, 244, 4, 0, 14, 246, 4, 0, 77, 247, 4, 0, 142, 248, 4, 0, 205, 249, 4, 0, 14, 251, 4, 0, 77, 252, 4, 0, 142, 253, 4, 0, 205, 254, 4, 0, 14, 0, 5, 0, 77, 1, 5, 0, 142, 2, 5, 0, 205, 3, 5, 0, 14, 5, 5, 0, 77, 6, 5, 0, 142, 7, 5, 0, 205, 8, 5, 0, 14, 10, 5, 0, 77, 11, 5, 0, 142, 12, 5, 0, 205, 13, 5, 0, 14, 15, 5, 0, 77, 16, 5, 0, 142, 17, 5, 0, 205, 18, 5, 0, 14, 20, 5, 0, 77, 21, 5, 0, 142, 22, 5, 0, 205, 23, 5, 0, 14, 25, 5, 0, 77, 26, 5, 0, 142, 27, 5, 0, 205, 28, 5, 0, 14, 30, 5, 0, 77, 31, 5, 0, 142, 32, 5, 0, 205, 33, 5, 0, 14, 35, 5, 0, 77, 36, 5, 0, 142, 37, 5, 0, 205, 38, 5, 0, 14, 40, 5, 0, 77, 41, 5, 0, 142, 42, 5, 0, 205, 43, 5, 0, 14, 45, 5, 0, 77, 46, 5, 0, 142, 47, 5, 0, 205, 48, 5, 0, 14, 50, 5, 0, 77, 51, 5, 0, 142, 52, 5, 0, 205, 53, 5, 0, 14, 55, 5, 0, 77, 56, 5, 0, 142, 57, 5, 0, 205, 58, 5, 0, 14, 60, 5, 0, 77, 61, 5, 0, 142, 62, 5, 0, 205, 63, 5, 0, 14, 65, 5, 0, 77, 66, 5, 0, 142, 67, 5, 0, 205, 68, 5, 0, 14, 70, 5, 0, 77, 71, 5, 0, 142, 72, 5, 0, 205, 73, 5, 0, 14, 75, 5, 0, 77, 76, 5, 0, 142, 77, 5, 0, 205, 78, 5, 0, 14, 80, 5, 0, 77, 81, 5, 0, 142, 82, 5, 0, 205, 83, 5, 0, 14, 85, 5, 0, 77, 86, 5, 0, 142, 87, 5, 0, 205, 88, 5, 0, 14, 90, 5, 0, 77, 91, 5, 0, 142, 92, 5, 0, 205, 93, 5, 0, 14, 95, 5, 0, 77, 96, 5, 0, 142, 97, 5, 0, 205, 98, 5, 0, 14, 100, 5, 0, 77, 101, 5, 0, 142, 102, 5, 0, 205, 103, 5, 0, 14, 105, 5, 0, 77, 106, 5, 0, 142, 107, 5, 0, 205, 108, 5, 0, 14, 110, 5, 0, 77, 111, 5, 0, 142, 112, 5, 0, 205, 113, 5, 0, 14, 115, 5, 0, 77, 116, 5, 0, 142, 117, 5, 0, 205, 118, 5, 0, 14, 120, 5, 0, 77, 121, 5, 0, 142, 122, 5, 0, 205, 123, 5, 0, 14, 125, 5, 0, 77, 126, 5, 0, 142, 127, 5, 0, 205, 128, 5, 0, 14, 130, 5, 0, 77, 131, 5, 0, 142, 132, 5, 0, 205, 133, 5, 0, 14, 135, 5, 0, 77, 136, 5, 0, 142, 137, 5, 0, 205, 138, 5, 0, 14, 140, 5, 0, 77, 141, 5, 0, 142, 142, 5, 0, 205, 143, 5, 0, 14, 145, 5, 0, 77, 146, 5, 0, 142, 147, 5, 0, 205, 148, 5, 0, 14, 150, 5, 0, 77, 151, 5, 0, 142, 152, 5, 0, 205, 153, 5, 0, 14, 155, 5, 0, 77, 156, 5, 0, 142, 157, 5, 0, 205, 158, 5, 0, 14, 160, 5, 0, 77, 161, 5, 0, 142, 162, 5, 0, 205, 163, 5, 0, 14, 165, 5, 0, 77, 166, 5, 0, 142, 167, 5, 0, 205, 168, 5, 0, 14, 170, 5, 0, 77, 171, 5, 0, 142, 172, 5, 0, 205, 173, 5, 0, 14, 175, 5, 0, 77, 176, 5, 0, 142, 177, 5, 0, 205, 178, 5, 0, 14, 180, 5, 0, 77, 181, 5, 0, 142, 182, 5, 0, 205, 183, 5, 0, 14, 185, 5, 0, 77, 186, 5, 0, 142, 187, 5, 0, 205, 188, 5, 0, 14, 190, 5, 0, 77, 191, 5, 0, 142, 192, 5, 0, 205, 193, 5, 0, 14, 195, 5, 0, 77, 196, 5, 0, 142, 197, 5, 0, 205, 198, 5, 0, 14, 200, 5, 0, 77, 201, 5, 0, 142, 202, 5, 0, 205, 203, 5, 0, 14, 205, 5, 0, 77, 206, 5, 0, 142, 207, 5, 0, 205, 208, 5, 0, 14, 210, 5, 0, 77, 211, 5, 0, 142, 212, 5, 0, 205, 213, 5, 0, 14, 215, 5, 0, 77, 216, 5, 0, 142, 217, 5, 0, 205, 218, 5, 0, 14, 220, 5, 0, 77, 221, 5, 0, 142, 222, 5, 0, 205, 223, 5, 0, 14, 225, 5, 0, 77, 226, 5, 0, 142, 227, 5, 0, 205, 228, 5, 0, 14, 230, 5, 0, 77, 231, 5, 0, 142, 232, 5, 0, 205, 233, 5, 0, 14, 235, 5, 0, 77, 236, 5, 0, 142, 237, 5, 0, 205, 238, 5, 0, 14, 240, 5, 0, 77, 241, 5, 0, 142, 242, 5, 0, 205, 243, 5, 0, 14, 245, 5, 0, 77, 246, 5, 0, 142, 247, 5, 0, 205, 248, 5, 0, 14, 250, 5, 0, 77, 251, 5, 0, 142, 252, 5, 0, 205, 253, 5, 0, 14, 255, 5, 0, 77, 0, 6, 0, 142, 1, 6, 0, 205, 2, 6, 0, 14, 4, 6, 0, 77, 5, 6, 0, 142, 6, 6, 0, 205, 7, 6, 0, 14, 9, 6, 0, 77, 10, 6, 0, 142, 11, 6, 0, 205, 12, 6, 0, 14, 14, 6, 0, 77, 15, 6, 0, 142, 16, 6, 0, 205, 17, 6, 0, 14, 19, 6, 0, 77, 20, 6, 0, 142, 21, 6, 0, 205, 22, 6, 0, 14, 24, 6, 0, 77, 25, 6, 0, 142, 26, 6, 0, 205, 27, 6, 0, 14, 29, 6, 0, 77, 30, 6, 0, 142, 31, 6, 0, 205, 32, 6, 0, 14, 34, 6, 0, 77, 35, 6, 0, 142, 36, 6, 0, 205, 37, 6, 0, 14, 39, 6, 0, 77, 40, 6, 0, 142, 41, 6, 0, 205, 42, 6, 0, 14, 44, 6, 0, 77, 45, 6, 0, 142, 46, 6, 0, 205, 47, 6, 0, 14, 49, 6, 0, 77, 50, 6, 0, 142, 51, 6, 0, 205, 52, 6, 0, 14, 54, 6, 0, 77, 55, 6, 0, 142, 56, 6, 0, 205, 57, 6, 0, 14, 59, 6, 0, 77, 60, 6, 0, 142, 61, 6, 0, 205, 62, 6, 0, 14, 64, 6, 0, 77, 65, 6, 0, 142, 66, 6, 0, 205, 67, 6, 0, 14, 69, 6, 0, 77, 70, 6, 0, 142, 71, 6, 0, 205, 72, 6, 0, 14, 74, 6, 0, 77, 75, 6, 0, 142, 76, 6, 0, 205, 77, 6, 0, 14, 79, 6, 0, 77, 80, 6, 0, 142, 81, 6, 0, 205, 82, 6, 0, 14, 84, 6, 0, 77, 85, 6, 0, 142, 86, 6, 0, 205, 87, 6, 0, 14, 89, 6, 0, 77, 90, 6, 0, 142, 91, 6, 0, 205, 92, 6, 0, 14, 94, 6, 0, 77, 95, 6, 0, 142, 96, 6, 0, 205, 97, 6, 0, 14, 99, 6, 0, 77, 100, 6, 0, 142, 101, 6, 0, 205, 102, 6, 0, 14, 104, 6, 0, 77, 105, 6, 0, 142, 106, 6, 0, 205, 107, 6, 0, 14, 109, 6, 0, 77, 110, 6, 0, 142, 111, 6, 0, 205, 112, 6, 0, 14, 114, 6, 0, 77, 115, 6, 0, 142, 116, 6, 0, 205, 117, 6, 0, 14, 119, 6, 0, 77, 120, 6, 0, 142, 121, 6, 0, 205, 122, 6, 0, 14, 124, 6, 0, 77, 125, 6, 0, 142, 126, 6, 0, 205, 127, 6, 0, 14, 129, 6, 0, 77, 130, 6, 0, 142, 131, 6, 0, 205, 132, 6, 0, 14, 134, 6, 0, 77, 135, 6, 0, 142, 136, 6, 0, 205, 137, 6, 0, 14, 139, 6, 0, 77, 140, 6, 0, 142, 141, 6, 0, 205, 142, 6, 0, 14, 144, 6, 0, 77, 145, 6, 0, 142, 146, 6, 0, 205, 147, 6, 0, 14, 149, 6, 0, 77, 150, 6, 0, 142, 151, 6, 0, 205, 152, 6, 0, 14, 154, 6, 0, 77, 155, 6, 0, 142, 156, 6, 0, 205, 157, 6, 0, 14, 159, 6, 0, 77, 160, 6, 0, 142, 161, 6, 0, 205, 162, 6, 0, 14, 164, 6, 0, 77, 165, 6, 0, 142, 166, 6, 0, 205, 167, 6, 0, 14, 169, 6, 0, 77, 170, 6, 0, 142, 171, 6, 0, 205, 172, 6, 0, 14, 174, 6, 0, 77, 175, 6, 0, 142, 176, 6, 0, 205, 177, 6, 0, 14, 179, 6, 0, 77, 180, 6, 0, 142, 181, 6, 0, 205, 182, 6, 0, 14, 184, 6, 0, 77, 185, 6, 0, 142, 186, 6, 0, 205, 187, 6, 0, 14, 189, 6, 0, 77, 190, 6, 0, 142, 191, 6, 0, 205, 192, 6, 0, 14, 194, 6, 0, 77, 195, 6, 0, 142, 196, 6, 0, 205, 197, 6, 0, 14, 199, 6, 0, 77, 200, 6, 0, 142, 201, 6, 0, 205, 202, 6, 0, 14, 204, 6, 0, 77, 205, 6, 0, 142, 206, 6, 0, 205, 207, 6, 0, 14, 209, 6, 0, 77, 210, 6, 0, 142, 211, 6, 0, 205, 212, 6, 0, 14, 214, 6, 0, 77, 215, 6, 0, 142, 216, 6, 0, 205, 217, 6, 0, 14, 219, 6, 0, 77, 220, 6, 0, 142, 221, 6, 0, 205, 222, 6, 0, 14, 224, 6, 0, 77, 225, 6, 0, 142, 226, 6, 0, 205, 227, 6, 0, 14, 229, 6, 0, 77, 230, 6, 0, 142, 231, 6, 0, 205, 232, 6, 0, 14, 234, 6, 0, 77, 235, 6, 0, 142, 236, 6, 0, 205, 237, 6, 0, 14, 239, 6, 0, 77, 240, 6, 0, 142, 241, 6, 0, 205, 242, 6, 0, 14, 244, 6, 0, 77, 245, 6, 0, 142, 246, 6, 0, 205, 247, 6, 0, 14, 249, 6, 0, 77, 250, 6, 0, 142, 251, 6, 0, 205, 252, 6, 0, 14, 254, 6, 0, 77, 255, 6, 0, 142, 0, 7, 0, 205, 1, 7, 0, 14, 3, 7, 0, 77, 4, 7, 0, 142, 5, 7, 0, 205, 6, 7, 0, 14, 8, 7, 0, 77, 9, 7, 0, 142, 10, 7, 0, 205, 11, 7, 0, 14, 13, 7, 0, 77, 14, 7, 0, 142, 15, 7, 0, 205, 16, 7, 0, 14, 18, 7, 0, 77, 19, 7, 0, 142, 20, 7, 0, 205, 21, 7, 0, 14, 23, 7, 0, 77, 24, 7, 0, 142, 25, 7, 0, 205, 26, 7, 0, 14, 28, 7, 0, 77, 29, 7, 0, 142, 30, 7, 0, 205, 31, 7, 0, 14, 33, 7, 0, 77, 34, 7, 0, 142, 35, 7, 0, 205, 36, 7, 0, 14, 38, 7, 0, 77, 39, 7, 0, 142, 40, 7, 0, 205, 41, 7, 0, 14, 43, 7, 0, 77, 44, 7, 0, 142, 45, 7, 0, 205, 46, 7, 0, 14, 48, 7, 0, 77, 49, 7, 0, 142, 50, 7, 0, 205, 51, 7, 0, 14, 53, 7, 0, 77, 54, 7, 0, 142, 55, 7, 0, 205, 56, 7, 0, 14, 58, 7, 0, 77, 59, 7, 0, 142, 60, 7, 0, 205, 61, 7, 0, 14, 63, 7, 0, 77, 64, 7, 0, 142, 65, 7, 0, 205, 66, 7, 0, 14, 68, 7, 0, 77, 69, 7, 0, 142, 70, 7, 0, 205, 71, 7, 0, 14, 73, 7, 0, 77, 74, 7, 0, 142, 75, 7, 0, 205, 76, 7, 0, 14, 78, 7, 0, 77, 79, 7, 0, 142, 80, 7, 0, 205, 81, 7, 0, 14, 83, 7, 0, 77, 84, 7, 0, 142, 85, 7, 0, 205, 86, 7, 0, 14, 88, 7, 0, 77, 89, 7, 0, 142, 90, 7, 0, 205, 91, 7, 0, 14, 93, 7, 0, 77, 94, 7, 0, 142, 95, 7, 0, 205, 96, 7, 0, 14, 98, 7, 0, 77, 99, 7, 0, 142, 100, 7, 0, 205, 101, 7, 0, 14, 103, 7, 0, 77, 104, 7, 0, 142, 105, 7, 0, 205, 106, 7, 0, 14, 108, 7, 0, 77, 109, 7, 0, 142, 110, 7, 0, 205, 111, 7, 0, 14, 113, 7, 0, 77, 114, 7, 0, 142, 115, 7, 0, 205, 116, 7, 0, 14, 118, 7, 0, 77, 119, 7, 0, 142, 120, 7, 0, 205, 121, 7, 0, 14, 123, 7, 0, 77, 124, 7, 0, 142, 125, 7, 0, 205, 126, 7, 0, 14, 128, 7, 0, 77, 129, 7, 0, 142, 130, 7, 0, 205, 131, 7, 0, 14, 133, 7, 0, 77, 134, 7, 0, 142, 135, 7, 0, 205, 136, 7, 0, 14, 138, 7, 0, 77, 139, 7, 0, 142, 140, 7, 0, 205, 141, 7, 0, 14, 143, 7, 0, 77, 144, 7, 0, 142, 145, 7, 0, 205, 146, 7, 0, 14, 148, 7, 0, 77, 149, 7, 0, 142, 150, 7, 0, 205, 151, 7, 0, 14, 153, 7, 0, 77, 154, 7, 0, 142, 155, 7, 0, 205, 156, 7, 0, 14, 158, 7, 0, 77, 159, 7, 0, 142, 160, 7, 0, 205, 161, 7, 0, 14, 163, 7, 0, 77, 164, 7, 0, 142, 165, 7, 0, 205, 166, 7, 0, 14, 168, 7, 0, 77, 169, 7, 0, 142, 170, 7, 0, 205, 171, 7, 0, 14, 173, 7, 0, 77, 174, 7, 0, 142, 175, 7, 0, 205, 176, 7, 0, 14, 178, 7, 0, 77, 179, 7, 0, 142, 180, 7, 0, 205, 181, 7, 0, 14, 183, 7, 0, 77, 184, 7, 0, 142, 185, 7, 0, 205, 186, 7, 0, 14, 188, 7, 0, 77, 189, 7, 0, 142, 190, 7, 0, 205, 191, 7, 0, 14, 193, 7, 0, 77, 194, 7, 0, 142, 195, 7, 0, 205, 196, 7, 0, 14, 198, 7, 0, 77, 199, 7, 0, 142, 200, 7, 0, 205, 201, 7, 0, 14, 203, 7, 0, 77, 204, 7, 0, 142, 205, 7, 0, 205, 206, 7, 0, 14, 208, 7, 0, 77, 209, 7, 0, 142, 210, 7, 0, 205, 211, 7, 0, 14, 213, 7, 0, 77, 214, 7, 0, 142, 215, 7, 0, 205, 216, 7, 0, 14, 218, 7, 0, 77, 219, 7, 0, 142, 220, 7, 0, 205, 221, 7, 0, 14, 223, 7, 0, 77, 224, 7, 0, 142, 225, 7, 0, 205, 226, 7, 0, 14, 228, 7, 0, 77, 229, 7, 0, 142, 230, 7, 0, 205, 231, 7, 0, 14, 233, 7, 0, 77, 234, 7, 0, 142, 235, 7, 0, 205, 236, 7, 0, 14, 238, 7, 0, 77, 239, 7, 0, 142, 240, 7, 0, 205, 241, 7, 0, 14, 243, 7, 0, 77, 244, 7, 0, 142, 245, 7, 0, 205, 246, 7, 0, 14, 248, 7, 0, 77, 249, 7, 0, 142, 250, 7, 0, 205, 251, 7, 0, 14, 253, 7, 0, 77, 254, 7, 0, 142, 255, 7, 0, 205, 0, 8, 0, 14, 2, 8, 0, 77, 3, 8, 0, 142, 4, 8, 0, 205, 5, 8, 0, 14, 7, 8, 0, 77, 8, 8, 0, 142, 9, 8, 0, 205, 10, 8, 0, 14, 12, 8, 0, 77, 13, 8, 0, 142, 14, 8, 0, 205, 15, 8, 0, 14, 17, 8, 0, 77, 18, 8, 0, 142, 19, 8, 0, 205, 20, 8, 0, 14, 22, 8, 0, 77, 23, 8, 0, 142, 24, 8, 0, 205, 25, 8, 0, 14, 27, 8, 0, 77, 28, 8, 0, 142, 29, 8, 0, 205, 30, 8, 0, 14, 32, 8, 0, 77, 33, 8, 0, 142, 34, 8, 0, 205, 35, 8, 0, 14, 37, 8, 0, 77, 38, 8, 0, 142, 39, 8, 0, 205, 40, 8, 0, 14, 42, 8, 0, 77, 43, 8, 0, 142, 44, 8, 0, 205, 45, 8, 0, 14, 47, 8, 0, 77, 48, 8, 0, 142, 49, 8, 0, 205, 50, 8, 0, 14, 52, 8, 0, 77, 53, 8, 0, 142, 54, 8, 0, 205, 55, 8, 0, 14, 57, 8, 0, 77, 58, 8, 0, 142, 59, 8, 0, 205, 60, 8, 0, 14, 62, 8, 0, 77, 63, 8, 0, 142, 64, 8, 0, 205, 65, 8, 0, 14, 67, 8, 0, 77, 68, 8, 0, 142, 69, 8, 0, 205, 70, 8, 0, 14, 72, 8, 0, 77, 73, 8, 0, 142, 74, 8, 0, 205, 75, 8, 0, 14, 77, 8, 0, 77, 78, 8, 0, 142, 79, 8, 0, 205, 80, 8, 0, 14, 82, 8, 0, 77, 83, 8, 0, 142, 84, 8, 0, 205, 85, 8, 0, 14, 87, 8, 0, 77, 88, 8, 0, 142, 89, 8, 0, 205, 90, 8, 0, 14, 92, 8, 0, 77, 93, 8, 0, 142, 94, 8, 0, 205, 95, 8, 0, 14, 97, 8, 0, 77, 98, 8, 0, 142, 99, 8, 0, 205, 100, 8, 0, 14, 102, 8, 0, 77, 103, 8, 0, 142, 104, 8, 0, 205, 105, 8, 0, 14, 107, 8, 0, 77, 108, 8, 0, 142, 109, 8, 0, 205, 110, 8, 0, 14, 112, 8, 0, 77, 113, 8, 0, 142, 114, 8, 0, 205, 115, 8, 0, 14, 117, 8, 0, 77, 118, 8, 0, 142, 119, 8, 0, 205, 120, 8, 0, 14, 122, 8, 0, 77, 123, 8, 0, 142, 124, 8, 0, 205, 125, 8, 0, 14, 127, 8, 0, 77, 128, 8, 0, 142, 129, 8, 0, 205, 130, 8, 0, 14, 132, 8, 0, 77, 133, 8, 0, 142, 134, 8, 0, 205, 135, 8, 0, 14, 137, 8, 0, 77, 138, 8, 0, 142, 139, 8, 0, 205, 140, 8, 0, 14, 142, 8, 0, 77, 143, 8, 0, 142, 144, 8, 0, 205, 145, 8, 0, 14, 147, 8, 0, 77, 148, 8, 0, 142, 149, 8, 0, 205, 150, 8, 0, 14, 152, 8, 0, 77, 153, 8, 0, 142, 154, 8, 0, 205, 155, 8, 0, 14, 157, 8, 0, 77, 158, 8, 0, 142, 159, 8, 0, 205, 160, 8, 0, 14, 162, 8, 0, 77, 163, 8, 0, 142, 164, 8, 0, 205, 165, 8, 0, 14, 167, 8, 0, 77, 168, 8, 0, 142, 169, 8, 0, 205, 170, 8, 0, 14, 172, 8, 0, 77, 173, 8, 0, 142, 174, 8, 0, 205, 175, 8, 0, 14, 177, 8, 0, 77, 178, 8, 0, 142, 179, 8, 0, 205, 180, 8, 0, 14, 182, 8, 0, 77, 183, 8, 0, 142, 184, 8, 0, 205, 185, 8, 0, 14, 187, 8, 0, 77, 188, 8, 0, 142, 189, 8, 0, 205, 190, 8, 0, 14, 192, 8, 0, 77, 193, 8, 0, 142, 194, 8, 0, 205, 195, 8, 0, 14, 197, 8, 0, 77, 198, 8, 0, 142, 199, 8, 0, 205, 200, 8, 0, 14, 202, 8, 0, 77, 203, 8, 0, 142, 204, 8, 0, 205, 205, 8, 0, 14, 207, 8, 0, 77, 208, 8, 0, 142, 209, 8, 0, 205, 210, 8, 0, 14, 212, 8, 0, 77, 213, 8, 0, 142, 214, 8, 0, 205, 215, 8, 0, 14, 217, 8, 0, 77, 218, 8, 0, 142, 219, 8, 0, 205, 220, 8, 0, 14, 222, 8, 0, 77, 223, 8, 0, 142, 224, 8, 0, 205, 225, 8, 0, 14, 227, 8, 0, 77, 228, 8, 0, 142, 229, 8, 0, 205, 230, 8, 0, 14, 232, 8, 0, 77, 233, 8, 0, 142, 234, 8, 0, 205, 235, 8, 0, 14, 237, 8, 0, 77, 238, 8, 0, 142, 239, 8, 0, 205, 240, 8, 0, 14, 242, 8, 0, 77, 243, 8, 0, 142, 244, 8, 0, 205, 245, 8, 0, 14, 247, 8, 0, 77, 248, 8, 0, 142, 249, 8, 0, 205, 250, 8, 0, 14, 252, 8, 0, 77, 253, 8, 0, 142, 254, 8, 0, 205, 255, 8, 0, 14, 1, 9, 0, 77, 2, 9, 0, 142, 3, 9, 0, 205, 4, 9, 0, 14, 6, 9, 0, 77, 7, 9, 0, 142, 8, 9, 0, 205, 9, 9, 0, 14, 11, 9, 0, 77, 12, 9, 0, 142, 13, 9, 0, 205, 14, 9, 0, 14, 16, 9, 0, 77, 17, 9, 0, 142, 18, 9, 0, 205, 19, 9, 0, 14, 21, 9, 0, 77, 22, 9, 0, 142, 23, 9, 0, 205, 24, 9, 0, 14, 26, 9, 0, 77, 27, 9, 0, 142, 28, 9, 0, 205, 29, 9, 0, 14, 31, 9, 0, 77, 32, 9, 0, 142, 33, 9, 0, 205, 34, 9, 0, 14, 36, 9, 0, 77, 37, 9, 0, 142, 38, 9, 0, 205, 39, 9, 0, 14, 41, 9, 0, 77, 42, 9, 0, 142, 43, 9, 0, 205, 44, 9, 0, 14, 46, 9, 0, 77, 47, 9, 0, 142, 48, 9, 0, 205, 49, 9, 0, 14, 51, 9, 0, 77, 52, 9, 0, 142, 53, 9, 0, 205, 54, 9, 0, 14, 56, 9, 0, 77, 57, 9, 0, 142, 58, 9, 0, 205, 59, 9, 0, 14, 61, 9, 0, 77, 62, 9, 0, 142, 63, 9, 0, 205, 64, 9, 0, 14, 66, 9, 0, 77, 67, 9, 0, 142, 68, 9, 0, 205, 69, 9, 0, 14, 71, 9, 0, 77, 72, 9, 0, 142, 73, 9, 0, 205, 74, 9, 0, 14, 76, 9, 0, 77, 77, 9, 0, 142, 78, 9, 0, 205, 79, 9, 0, 14, 81, 9, 0, 77, 82, 9, 0, 142, 83, 9, 0, 205, 84, 9, 0, 14, 86, 9, 0, 77, 87, 9, 0, 142, 88, 9, 0, 205, 89, 9, 0, 14, 91, 9, 0, 77, 92, 9, 0, 142, 93, 9, 0, 205, 94, 9, 0, 14, 96, 9, 0, 77, 97, 9, 0, 142, 98, 9, 0, 205, 99, 9, 0, 14, 101, 9, 0, 77, 102, 9, 0, 142, 103, 9, 0, 205, 104, 9, 0, 14, 106, 9, 0, 77, 107, 9, 0, 142, 108, 9, 0, 205, 109, 9, 0, 14, 111, 9, 0, 77, 112, 9, 0, 142, 113, 9, 0, 205, 114, 9, 0, 14, 116, 9, 0, 77, 117, 9, 0, 142, 118, 9, 0, 205, 119, 9, 0, 14, 121, 9, 0, 77, 122, 9, 0, 142, 123, 9, 0, 205, 124, 9, 0, 14, 126, 9, 0, 77, 127, 9, 0, 142, 128, 9, 0, 205, 129, 9, 0, 14, 131, 9, 0, 77, 132, 9, 0, 142, 133, 9, 0, 205, 134, 9, 0, 14, 136, 9, 0, 77, 137, 9, 0, 142, 138, 9, 0, 205, 139, 9, 0, 14, 141, 9, 0, 77, 142, 9, 0, 142, 143, 9, 0, 205, 144, 9, 0, 14, 146, 9, 0, 77, 147, 9, 0, 142, 148, 9, 0, 205, 149, 9, 0, 14, 151, 9, 0, 77, 152, 9, 0, 142, 153, 9, 0, 205, 154, 9, 0, 14, 156, 9, 0, 77, 157, 9, 0, 142, 158, 9, 0, 205, 159, 9, 0, 14, 161, 9, 0, 77, 162, 9, 0, 142, 163, 9, 0, 205, 164, 9, 0, 14, 166, 9, 0, 77, 167, 9, 0, 142, 168, 9, 0, 205, 169, 9, 0, 14, 171, 9, 0, 77, 172, 9, 0, 142, 173, 9, 0, 205, 174, 9, 0, 14, 176, 9, 0, 77, 177, 9, 0, 142, 178, 9, 0, 205, 179, 9, 0, 14, 181, 9, 0, 77, 182, 9, 0, 142, 183, 9, 0, 205, 184, 9, 0, 14, 186, 9, 0, 77, 187, 9, 0, 142, 188, 9, 0, 205, 189, 9, 0, 14, 191, 9, 0, 77, 192, 9, 0, 142, 193, 9, 0, 205, 194, 9, 0, 14, 196, 9, 0, 77, 197, 9, 0, 142, 198, 9, 0, 205, 199, 9, 0, 14, 201, 9, 0, 77, 202, 9, 0, 142, 203, 9, 0, 205, 204, 9, 0, 14, 206, 9, 0, 77, 207, 9, 0, 142, 208, 9, 0, 205, 209, 9, 0, 14, 211, 9, 0, 77, 212, 9, 0, 142, 213, 9, 0, 205, 214, 9, 0, 14, 216, 9, 0, 77, 217, 9, 0, 142, 218, 9, 0, 205, 219, 9, 0, 14, 221, 9, 0, 77, 222, 9, 0, 142, 223, 9, 0, 205, 224, 9, 0, 14, 226, 9, 0, 77, 227, 9, 0, 142, 228, 9, 0, 205, 229, 9, 0, 14, 231, 9, 0, 77, 232, 9, 0, 142, 233, 9, 0, 205, 234, 9, 0, 14, 236, 9, 0, 77, 237, 9, 0, 142, 238, 9, 0, 205, 239, 9, 0, 14, 241, 9, 0, 77, 242, 9, 0, 142, 243, 9, 0, 205, 244, 9, 0, 14, 246, 9, 0, 77, 247, 9, 0, 142, 248, 9, 0, 205, 249, 9, 0, 14, 251, 9, 0, 77, 252, 9, 0, 142, 253, 9, 0, 205, 254, 9, 0, 14, 0, 10, 0, 77, 1, 10, 0, 142, 2, 10, 0, 205, 3, 10, 0, 14, 5, 10, 0, 77, 6, 10, 0, 142, 7, 10, 0, 205, 8, 10, 0, 14, 10, 10, 0, 77, 11, 10, 0, 142, 12, 10, 0, 205, 13, 10, 0, 14, 15, 10, 0, 77, 16, 10, 0, 142, 17, 10, 0, 205, 18, 10, 0, 14, 20, 10, 0, 77, 21, 10, 0, 142, 22, 10, 0, 205, 23, 10, 0, 14, 25, 10, 0, 77, 26, 10, 0, 142, 27, 10, 0, 205, 28, 10, 0, 14, 30, 10, 0, 77, 31, 10, 0, 142, 32, 10, 0, 205, 33, 10, 0, 14, 35, 10, 0, 77, 36, 10, 0, 142, 37, 10, 0, 205, 38, 10, 0, 14, 40, 10, 0, 77, 41, 10, 0, 142, 42, 10, 0, 205, 43, 10, 0, 14, 45, 10, 0, 77, 46, 10, 0, 142, 47, 10, 0, 205, 48, 10, 0, 14, 50, 10, 0, 77, 51, 10, 0, 142, 52, 10, 0, 205, 53, 10, 0, 14, 55, 10, 0, 77, 56, 10, 0, 142, 57, 10, 0, 205, 58, 10, 0, 14, 60, 10, 0, 77, 61, 10, 0, 142, 62, 10, 0, 205, 63, 10, 0, 14, 65, 10, 0, 77, 66, 10, 0, 142, 67, 10, 0, 205, 68, 10, 0, 14, 70, 10, 0, 77, 71, 10, 0, 142, 72, 10, 0, 205, 73, 10, 0, 14, 75, 10, 0, 77, 76, 10, 0, 142, 77, 10, 0, 205, 78, 10, 0, 14, 80, 10, 0, 77, 81, 10, 0, 142, 82, 10, 0, 205, 83, 10, 0, 14, 85, 10, 0, 77, 86, 10, 0, 142, 87, 10, 0, 205, 88, 10, 0, 14, 90, 10, 0, 77, 91, 10, 0, 142, 92, 10, 0, 205, 93, 10, 0, 14, 95, 10, 0, 77, 96, 10, 0, 142, 97, 10, 0, 205, 98, 10, 0, 14, 100, 10, 0, 77, 101, 10, 0, 142, 102, 10, 0, 205, 103, 10, 0, 14, 105, 10, 0, 77, 106, 10, 0, 142, 107, 10, 0, 205, 108, 10, 0, 14, 110, 10, 0, 77, 111, 10, 0, 142, 112, 10, 0, 205, 113, 10, 0, 14, 115, 10, 0, 77, 116, 10, 0, 142, 117, 10, 0, 205, 118, 10, 0, 14, 120, 10, 0, 77, 121, 10, 0, 142, 122, 10, 0, 205, 123, 10, 0, 14, 125, 10, 0, 77, 126, 10, 0, 142, 127, 10, 0, 205, 128, 10, 0, 14, 130, 10, 0, 77, 131, 10, 0, 142, 132, 10, 0, 205, 133, 10, 0, 14, 135, 10, 0, 77, 136, 10, 0, 142, 137, 10, 0, 205, 138, 10, 0, 14, 140, 10, 0, 77, 141, 10, 0, 142, 142, 10, 0, 205, 143, 10, 0, 14, 145, 10, 0, 77, 146, 10, 0, 142, 147, 10, 0, 205, 148, 10, 0, 14, 150, 10, 0, 77, 151, 10, 0, 142, 152, 10, 0, 205, 153, 10, 0, 14, 155, 10, 0, 77, 156, 10, 0, 142, 157, 10, 0, 205, 158, 10, 0, 14, 160, 10, 0, 77, 161, 10, 0, 142, 162, 10, 0, 205, 163, 10, 0, 14, 165, 10, 0, 77, 166, 10, 0, 142, 167, 10, 0, 205, 168, 10, 0, 14, 170, 10, 0, 77, 171, 10, 0, 142, 172, 10, 0, 205, 173, 10, 0, 14, 175, 10, 0, 77, 176, 10, 0, 142, 177, 10, 0, 205, 178, 10, 0, 14, 180, 10, 0, 77, 181, 10, 0, 142, 182, 10, 0, 205, 183, 10, 0, 14, 185, 10, 0, 77, 186, 10, 0, 142, 187, 10, 0, 205, 188, 10, 0, 14, 190, 10, 0, 77, 191, 10, 0, 142, 192, 10, 0, 205, 193, 10, 0, 14, 195, 10, 0, 77, 196, 10, 0, 142, 197, 10, 0, 205, 198, 10, 0, 14, 200, 10, 0, 77, 201, 10, 0, 142, 202, 10, 0, 205, 203, 10, 0, 14, 205, 10, 0, 77, 206, 10, 0, 142, 207, 10, 0, 205, 208, 10, 0, 14, 210, 10, 0, 77, 211, 10, 0, 142, 212, 10, 0, 205, 213, 10, 0, 14, 215, 10, 0, 77, 216, 10, 0, 142, 217, 10, 0, 205, 218, 10, 0, 14, 220, 10, 0, 77, 221, 10, 0, 142, 222, 10, 0, 205, 223, 10, 0, 14, 225, 10, 0, 77, 226, 10, 0, 142, 227, 10, 0, 205, 228, 10, 0, 14, 230, 10, 0, 77, 231, 10, 0, 142, 232, 10, 0, 205, 233, 10, 0, 14, 235, 10, 0, 77, 236, 10, 0, 142, 237, 10, 0, 205, 238, 10, 0, 14, 240, 10, 0, 77, 241, 10, 0, 142, 242, 10, 0, 205, 243, 10, 0, 14, 245, 10, 0, 77, 246, 10, 0, 142, 247, 10, 0, 205, 248, 10, 0, 14, 250, 10, 0, 77, 251, 10, 0, 142, 252, 10, 0, 205, 253, 10, 0, 14, 255, 10, 0, 77, 0, 11, 0, 142, 1, 11, 0, 205, 2, 11, 0, 14, 4, 11, 0, 77, 5, 11, 0, 142, 6, 11, 0, 205, 7, 11, 0, 14, 9, 11, 0, 77, 10, 11, 0, 142, 11, 11, 0, 205, 12, 11, 0, 14, 14, 11, 0, 77, 15, 11, 0, 142, 16, 11, 0, 205, 17, 11, 0, 14, 19, 11, 0, 77, 20, 11, 0, 142, 21, 11, 0, 205, 22, 11, 0, 14, 24, 11, 0, 77, 25, 11, 0, 142, 26, 11, 0, 205, 27, 11, 0, 14, 29, 11, 0, 77, 30, 11, 0, 142, 31, 11, 0, 205, 32, 11, 0, 14, 34, 11, 0, 77, 35, 11, 0, 142, 36, 11, 0, 205, 37, 11, 0, 14, 39, 11, 0, 77, 40, 11, 0, 142, 41, 11, 0, 205, 42, 11, 0, 14, 44, 11, 0, 77, 45, 11, 0, 142, 46, 11, 0, 205, 47, 11, 0, 14, 49, 11, 0, 77, 50, 11, 0, 142, 51, 11, 0, 205, 52, 11, 0, 14, 54, 11, 0, 77, 55, 11, 0, 142, 56, 11, 0, 205, 57, 11, 0, 14, 59, 11, 0, 77, 60, 11, 0, 142, 61, 11, 0, 205, 62, 11, 0, 14, 64, 11, 0, 77, 65, 11, 0, 142, 66, 11, 0, 205, 67, 11, 0, 14, 69, 11, 0, 77, 70, 11, 0, 142, 71, 11, 0, 205, 72, 11, 0, 14, 74, 11, 0, 77, 75, 11, 0, 142, 76, 11, 0, 205, 77, 11, 0, 14, 79, 11, 0, 77, 80, 11, 0, 142, 81, 11, 0, 205, 82, 11, 0, 14, 84, 11, 0, 77, 85, 11, 0, 142, 86, 11, 0, 205, 87, 11, 0, 14, 89, 11, 0, 77, 90, 11, 0, 142, 91, 11, 0, 205, 92, 11, 0, 14, 94, 11, 0, 77, 95, 11, 0, 142, 96, 11, 0, 205, 97, 11, 0, 14, 99, 11, 0, 77, 100, 11, 0, 142, 101, 11, 0, 205, 102, 11, 0, 14, 104, 11, 0, 77, 105, 11, 0, 142, 106, 11, 0, 205, 107, 11, 0, 14, 109, 11, 0, 77, 110, 11, 0, 142, 111, 11, 0, 205, 112, 11, 0, 14, 114, 11, 0, 77, 115, 11, 0, 142, 116, 11, 0, 205, 117, 11, 0, 14, 119, 11, 0, 77, 120, 11, 0, 142, 121, 11, 0, 205, 122, 11, 0, 14, 124, 11, 0, 77, 125, 11, 0, 142, 126, 11, 0, 205, 127, 11, 0, 14, 129, 11, 0, 77, 130, 11, 0, 142, 131, 11, 0, 205, 132, 11, 0, 14, 134, 11, 0, 77, 135, 11, 0, 142, 136, 11, 0, 205, 137, 11, 0, 14, 139, 11, 0, 77, 140, 11, 0, 142, 141, 11, 0, 205, 142, 11, 0, 14, 144, 11, 0, 77, 145, 11, 0, 142, 146, 11, 0, 205, 147, 11, 0, 14, 149, 11, 0, 77, 150, 11, 0, 142, 151, 11, 0, 205, 152, 11, 0, 14, 154, 11, 0, 77, 155, 11, 0, 142, 156, 11, 0, 205, 157, 11, 0, 14, 159, 11, 0, 77, 160, 11, 0, 142, 161, 11, 0, 205, 162, 11, 0, 14, 164, 11, 0, 77, 165, 11, 0, 142, 166, 11, 0, 205, 167, 11, 0, 14, 169, 11, 0, 77, 170, 11, 0, 142, 171, 11, 0, 205, 172, 11, 0, 14, 174, 11, 0, 77, 175, 11, 0, 142, 176, 11, 0, 205, 177, 11, 0, 14, 179, 11, 0, 77, 180, 11, 0, 142, 181, 11, 0, 205, 182, 11, 0, 14, 184, 11, 0, 77, 185, 11, 0, 142, 186, 11, 0, 205, 187, 11, 0, 14, 189, 11, 0, 77, 190, 11, 0, 142, 191, 11, 0, 205, 192, 11, 0, 14, 194, 11, 0, 77, 195, 11, 0, 142, 196, 11, 0, 205, 197, 11, 0, 14, 199, 11, 0, 77, 200, 11, 0, 142, 201, 11, 0, 205, 202, 11, 0, 14, 204, 11, 0, 77, 205, 11, 0, 142, 206, 11, 0, 205, 207, 11, 0, 14, 209, 11, 0, 77, 210, 11, 0, 142, 211, 11, 0, 205, 212, 11, 0, 14, 214, 11, 0, 77, 215, 11, 0, 142, 216, 11, 0, 205, 217, 11, 0, 14, 219, 11, 0, 77, 220, 11, 0, 142, 221, 11, 0, 205, 222, 11, 0, 14, 224, 11, 0, 77, 225, 11, 0, 142, 226, 11, 0, 205, 227, 11, 0, 14, 229, 11, 0, 77, 230, 11, 0, 142, 231, 11, 0, 205, 232, 11, 0, 14, 234, 11, 0, 77, 235, 11, 0, 142, 236, 11, 0, 205, 237, 11, 0, 14, 239, 11, 0, 77, 240, 11, 0, 142, 241, 11, 0, 205, 242, 11, 0, 14, 244, 11, 0, 77, 245, 11, 0, 142, 246, 11, 0, 205, 247, 11, 0, 14, 249, 11, 0, 77, 250, 11, 0, 142, 251, 11, 0, 205, 252, 11, 0, 14, 254, 11, 0, 77, 255, 11, 0, 142, 0, 12, 0, 205, 1, 12, 0, 14, 3, 12, 0, 77, 4, 12, 0, 142, 5, 12, 0, 205, 6, 12, 0, 14, 8, 12, 0, 77, 9, 12, 0, 142, 10, 12, 0, 205, 11, 12, 0, 14, 13, 12, 0, 77, 14, 12, 0, 142, 15, 12, 0, 205, 16, 12, 0, 14, 18, 12, 0, 77, 19, 12, 0, 142, 20, 12, 0, 205, 21, 12, 0, 14, 23, 12, 0, 77, 24, 12, 0, 142, 25, 12, 0, 205, 26, 12, 0, 14, 28, 12, 0, 77, 29, 12, 0, 142, 30, 12, 0, 205, 31, 12, 0, 14, 33, 12, 0, 77, 34, 12, 0, 142, 35, 12, 0, 205, 36, 12, 0, 14, 38, 12, 0, 77, 39, 12, 0, 142, 40, 12, 0, 205, 41, 12, 0, 14, 43, 12, 0, 77, 44, 12, 0, 142, 45, 12, 0, 205, 46, 12, 0, 14, 48, 12, 0, 77, 49, 12, 0, 142, 50, 12, 0, 205, 51, 12, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_count_pulses.json b/tests/recordings/logic_analyzer/test_count_pulses.json deleted file mode 100644 index 25e4ac06..00000000 --- a/tests/recordings/logic_analyzer/test_count_pulses.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [6], [0, 0], [0, 0], [0], [0], [10], [17], [11], [25], [1], [11], [26]], [[], [], [], [], [], [1], [], [1], [], [], [1], [], [102, 78, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_get_states.json b/tests/recordings/logic_analyzer/test_get_states.json deleted file mode 100644 index e062bee1..00000000 --- a/tests/recordings/logic_analyzer/test_get_states.json +++ /dev/null @@ -1 +0,0 @@ -[[[9], [2]], [[], [15, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_get_xy_falling_capture.json b/tests/recordings/logic_analyzer/test_get_xy_falling_capture.json deleted file mode 100644 index b6b0795d..00000000 --- a/tests/recordings/logic_analyzer/test_get_xy_falling_capture.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [2], [0], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [183, 1, 0, 0, 55, 4, 0, 0, 183, 6, 0, 0, 55, 9, 0, 0, 183, 11, 0, 0, 55, 14, 0, 0, 183, 16, 0, 0, 55, 19, 0, 0, 183, 21, 0, 0, 55, 24, 0, 0, 183, 26, 0, 0, 55, 29, 0, 0, 183, 31, 0, 0, 55, 34, 0, 0, 183, 36, 0, 0, 55, 39, 0, 0, 183, 41, 0, 0, 55, 44, 0, 0, 183, 46, 0, 0, 55, 49, 0, 0, 183, 51, 0, 0, 55, 54, 0, 0, 183, 56, 0, 0, 55, 59, 0, 0, 183, 61, 0, 0, 55, 64, 0, 0, 183, 66, 0, 0, 55, 69, 0, 0, 183, 71, 0, 0, 55, 74, 0, 0, 183, 76, 0, 0, 55, 79, 0, 0, 183, 81, 0, 0, 55, 84, 0, 0, 183, 86, 0, 0, 55, 89, 0, 0, 183, 91, 0, 0, 55, 94, 0, 0, 183, 96, 0, 0, 55, 99, 0, 0, 183, 101, 0, 0, 55, 104, 0, 0, 183, 106, 0, 0, 55, 109, 0, 0, 183, 111, 0, 0, 55, 114, 0, 0, 183, 116, 0, 0, 55, 119, 0, 0, 183, 121, 0, 0, 55, 124, 0, 0, 183, 126, 0, 0, 55, 129, 0, 0, 183, 131, 0, 0, 55, 134, 0, 0, 183, 136, 0, 0, 55, 139, 0, 0, 183, 141, 0, 0, 55, 144, 0, 0, 183, 146, 0, 0, 55, 149, 0, 0, 183, 151, 0, 0, 55, 154, 0, 0, 183, 156, 0, 0, 55, 159, 0, 0, 183, 161, 0, 0, 55, 164, 0, 0, 183, 166, 0, 0, 55, 169, 0, 0, 183, 171, 0, 0, 55, 174, 0, 0, 183, 176, 0, 0, 55, 179, 0, 0, 183, 181, 0, 0, 55, 184, 0, 0, 183, 186, 0, 0, 55, 189, 0, 0, 183, 191, 0, 0, 55, 194, 0, 0, 183, 196, 0, 0, 55, 199, 0, 0, 183, 201, 0, 0, 55, 204, 0, 0, 183, 206, 0, 0, 55, 209, 0, 0, 183, 211, 0, 0, 55, 214, 0, 0, 183, 216, 0, 0, 55, 219, 0, 0, 183, 221, 0, 0, 55, 224, 0, 0, 183, 226, 0, 0, 55, 229, 0, 0, 183, 231, 0, 0, 55, 234, 0, 0, 183, 236, 0, 0, 55, 239, 0, 0, 183, 241, 0, 0, 55, 244, 0, 0, 183, 246, 0, 0, 55, 249, 0, 0, 183, 251, 0, 0, 55, 254, 0, 0, 183, 0, 1, 0, 55, 3, 1, 0, 183, 5, 1, 0, 55, 8, 1, 0, 183, 10, 1, 0, 55, 13, 1, 0, 183, 15, 1, 0, 55, 18, 1, 0, 183, 20, 1, 0, 55, 23, 1, 0, 183, 25, 1, 0, 55, 28, 1, 0, 183, 30, 1, 0, 55, 33, 1, 0, 183, 35, 1, 0, 55, 38, 1, 0, 183, 40, 1, 0, 55, 43, 1, 0, 183, 45, 1, 0, 55, 48, 1, 0, 183, 50, 1, 0, 55, 53, 1, 0, 183, 55, 1, 0, 55, 58, 1, 0, 183, 60, 1, 0, 55, 63, 1, 0, 183, 65, 1, 0, 55, 68, 1, 0, 183, 70, 1, 0, 55, 73, 1, 0, 183, 75, 1, 0, 55, 78, 1, 0, 183, 80, 1, 0, 55, 83, 1, 0, 183, 85, 1, 0, 55, 88, 1, 0, 183, 90, 1, 0, 55, 93, 1, 0, 183, 95, 1, 0, 55, 98, 1, 0, 183, 100, 1, 0, 55, 103, 1, 0, 183, 105, 1, 0, 55, 108, 1, 0, 183, 110, 1, 0, 55, 113, 1, 0, 183, 115, 1, 0, 55, 118, 1, 0, 183, 120, 1, 0, 55, 123, 1, 0, 183, 125, 1, 0, 55, 128, 1, 0, 183, 130, 1, 0, 55, 133, 1, 0, 183, 135, 1, 0, 55, 138, 1, 0, 183, 140, 1, 0, 55, 143, 1, 0, 183, 145, 1, 0, 55, 148, 1, 0, 183, 150, 1, 0, 55, 153, 1, 0, 183, 155, 1, 0, 55, 158, 1, 0, 183, 160, 1, 0, 55, 163, 1, 0, 183, 165, 1, 0, 55, 168, 1, 0, 183, 170, 1, 0, 55, 173, 1, 0, 183, 175, 1, 0, 55, 178, 1, 0, 183, 180, 1, 0, 55, 183, 1, 0, 183, 185, 1, 0, 55, 188, 1, 0, 183, 190, 1, 0, 55, 193, 1, 0, 183, 195, 1, 0, 55, 198, 1, 0, 183, 200, 1, 0, 55, 203, 1, 0, 183, 205, 1, 0, 55, 208, 1, 0, 183, 210, 1, 0, 55, 213, 1, 0, 183, 215, 1, 0, 55, 218, 1, 0, 183, 220, 1, 0, 55, 223, 1, 0, 183, 225, 1, 0, 55, 228, 1, 0, 183, 230, 1, 0, 55, 233, 1, 0, 183, 235, 1, 0, 55, 238, 1, 0, 183, 240, 1, 0, 55, 243, 1, 0, 183, 245, 1, 0, 55, 248, 1, 0, 183, 250, 1, 0, 55, 253, 1, 0, 183, 255, 1, 0, 55, 2, 2, 0, 183, 4, 2, 0, 55, 7, 2, 0, 183, 9, 2, 0, 55, 12, 2, 0, 183, 14, 2, 0, 55, 17, 2, 0, 183, 19, 2, 0, 55, 22, 2, 0, 183, 24, 2, 0, 55, 27, 2, 0, 183, 29, 2, 0, 55, 32, 2, 0, 183, 34, 2, 0, 55, 37, 2, 0, 183, 39, 2, 0, 55, 42, 2, 0, 183, 44, 2, 0, 55, 47, 2, 0, 183, 49, 2, 0, 55, 52, 2, 0, 183, 54, 2, 0, 55, 57, 2, 0, 183, 59, 2, 0, 55, 62, 2, 0, 183, 64, 2, 0, 55, 67, 2, 0, 183, 69, 2, 0, 55, 72, 2, 0, 183, 74, 2, 0, 55, 77, 2, 0, 183, 79, 2, 0, 55, 82, 2, 0, 183, 84, 2, 0, 55, 87, 2, 0, 183, 89, 2, 0, 55, 92, 2, 0, 183, 94, 2, 0, 55, 97, 2, 0, 183, 99, 2, 0, 55, 102, 2, 0, 183, 104, 2, 0, 55, 107, 2, 0, 183, 109, 2, 0, 55, 112, 2, 0, 183, 114, 2, 0, 55, 117, 2, 0, 183, 119, 2, 0, 55, 122, 2, 0, 183, 124, 2, 0, 55, 127, 2, 0, 183, 129, 2, 0, 55, 132, 2, 0, 183, 134, 2, 0, 55, 137, 2, 0, 183, 139, 2, 0, 55, 142, 2, 0, 183, 144, 2, 0, 55, 147, 2, 0, 183, 149, 2, 0, 55, 152, 2, 0, 183, 154, 2, 0, 55, 157, 2, 0, 183, 159, 2, 0, 55, 162, 2, 0, 183, 164, 2, 0, 55, 167, 2, 0, 183, 169, 2, 0, 55, 172, 2, 0, 183, 174, 2, 0, 55, 177, 2, 0, 183, 179, 2, 0, 55, 182, 2, 0, 183, 184, 2, 0, 55, 187, 2, 0, 183, 189, 2, 0, 55, 192, 2, 0, 183, 194, 2, 0, 55, 197, 2, 0, 183, 199, 2, 0, 55, 202, 2, 0, 183, 204, 2, 0, 55, 207, 2, 0, 183, 209, 2, 0, 55, 212, 2, 0, 183, 214, 2, 0, 55, 217, 2, 0, 183, 219, 2, 0, 55, 222, 2, 0, 183, 224, 2, 0, 55, 227, 2, 0, 183, 229, 2, 0, 55, 232, 2, 0, 183, 234, 2, 0, 55, 237, 2, 0, 183, 239, 2, 0, 55, 242, 2, 0, 183, 244, 2, 0, 55, 247, 2, 0, 183, 249, 2, 0, 55, 252, 2, 0, 183, 254, 2, 0, 55, 1, 3, 0, 183, 3, 3, 0, 55, 6, 3, 0, 183, 8, 3, 0, 55, 11, 3, 0, 183, 13, 3, 0, 55, 16, 3, 0, 183, 18, 3, 0, 55, 21, 3, 0, 183, 23, 3, 0, 55, 26, 3, 0, 183, 28, 3, 0, 55, 31, 3, 0, 183, 33, 3, 0, 55, 36, 3, 0, 183, 38, 3, 0, 55, 41, 3, 0, 183, 43, 3, 0, 55, 46, 3, 0, 183, 48, 3, 0, 55, 51, 3, 0, 183, 53, 3, 0, 55, 56, 3, 0, 183, 58, 3, 0, 55, 61, 3, 0, 183, 63, 3, 0, 55, 66, 3, 0, 183, 68, 3, 0, 55, 71, 3, 0, 183, 73, 3, 0, 55, 76, 3, 0, 183, 78, 3, 0, 55, 81, 3, 0, 183, 83, 3, 0, 55, 86, 3, 0, 183, 88, 3, 0, 55, 91, 3, 0, 183, 93, 3, 0, 55, 96, 3, 0, 183, 98, 3, 0, 55, 101, 3, 0, 183, 103, 3, 0, 55, 106, 3, 0, 183, 108, 3, 0, 55, 111, 3, 0, 183, 113, 3, 0, 55, 116, 3, 0, 183, 118, 3, 0, 55, 121, 3, 0, 183, 123, 3, 0, 55, 126, 3, 0, 183, 128, 3, 0, 55, 131, 3, 0, 183, 133, 3, 0, 55, 136, 3, 0, 183, 138, 3, 0, 55, 141, 3, 0, 183, 143, 3, 0, 55, 146, 3, 0, 183, 148, 3, 0, 55, 151, 3, 0, 183, 153, 3, 0, 55, 156, 3, 0, 183, 158, 3, 0, 55, 161, 3, 0, 183, 163, 3, 0, 55, 166, 3, 0, 183, 168, 3, 0, 55, 171, 3, 0, 183, 173, 3, 0, 55, 176, 3, 0, 183, 178, 3, 0, 55, 181, 3, 0, 183, 183, 3, 0, 55, 186, 3, 0, 183, 188, 3, 0, 55, 191, 3, 0, 183, 193, 3, 0, 55, 196, 3, 0, 183, 198, 3, 0, 55, 201, 3, 0, 183, 203, 3, 0, 55, 206, 3, 0, 183, 208, 3, 0, 55, 211, 3, 0, 183, 213, 3, 0, 55, 216, 3, 0, 183, 218, 3, 0, 55, 221, 3, 0, 183, 223, 3, 0, 55, 226, 3, 0, 183, 228, 3, 0, 55, 231, 3, 0, 183, 233, 3, 0, 55, 236, 3, 0, 183, 238, 3, 0, 55, 241, 3, 0, 183, 243, 3, 0, 55, 246, 3, 0, 183, 248, 3, 0, 55, 251, 3, 0, 183, 253, 3, 0, 55, 0, 4, 0, 183, 2, 4, 0, 55, 5, 4, 0, 183, 7, 4, 0, 55, 10, 4, 0, 183, 12, 4, 0, 55, 15, 4, 0, 183, 17, 4, 0, 55, 20, 4, 0, 183, 22, 4, 0, 55, 25, 4, 0, 183, 27, 4, 0, 55, 30, 4, 0, 183, 32, 4, 0, 55, 35, 4, 0, 183, 37, 4, 0, 55, 40, 4, 0, 183, 42, 4, 0, 55, 45, 4, 0, 183, 47, 4, 0, 55, 50, 4, 0, 183, 52, 4, 0, 55, 55, 4, 0, 183, 57, 4, 0, 55, 60, 4, 0, 183, 62, 4, 0, 55, 65, 4, 0, 183, 67, 4, 0, 55, 70, 4, 0, 183, 72, 4, 0, 55, 75, 4, 0, 183, 77, 4, 0, 55, 80, 4, 0, 183, 82, 4, 0, 55, 85, 4, 0, 183, 87, 4, 0, 55, 90, 4, 0, 183, 92, 4, 0, 55, 95, 4, 0, 183, 97, 4, 0, 55, 100, 4, 0, 183, 102, 4, 0, 55, 105, 4, 0, 183, 107, 4, 0, 55, 110, 4, 0, 183, 112, 4, 0, 55, 115, 4, 0, 183, 117, 4, 0, 55, 120, 4, 0, 183, 122, 4, 0, 55, 125, 4, 0, 183, 127, 4, 0, 55, 130, 4, 0, 183, 132, 4, 0, 55, 135, 4, 0, 183, 137, 4, 0, 55, 140, 4, 0, 183, 142, 4, 0, 55, 145, 4, 0, 183, 147, 4, 0, 55, 150, 4, 0, 183, 152, 4, 0, 55, 155, 4, 0, 183, 157, 4, 0, 55, 160, 4, 0, 183, 162, 4, 0, 55, 165, 4, 0, 183, 167, 4, 0, 55, 170, 4, 0, 183, 172, 4, 0, 55, 175, 4, 0, 183, 177, 4, 0, 55, 180, 4, 0, 183, 182, 4, 0, 55, 185, 4, 0, 183, 187, 4, 0, 55, 190, 4, 0, 183, 192, 4, 0, 55, 195, 4, 0, 183, 197, 4, 0, 55, 200, 4, 0, 183, 202, 4, 0, 55, 205, 4, 0, 183, 207, 4, 0, 55, 210, 4, 0, 183, 212, 4, 0, 55, 215, 4, 0, 183, 217, 4, 0, 55, 220, 4, 0, 183, 222, 4, 0, 55, 225, 4, 0, 183, 227, 4, 0, 55, 230, 4, 0, 183, 232, 4, 0, 55, 235, 4, 0, 183, 237, 4, 0, 55, 240, 4, 0, 183, 242, 4, 0, 55, 245, 4, 0, 183, 247, 4, 0, 55, 250, 4, 0, 183, 252, 4, 0, 55, 255, 4, 0, 183, 1, 5, 0, 55, 4, 5, 0, 183, 6, 5, 0, 55, 9, 5, 0, 183, 11, 5, 0, 55, 14, 5, 0, 183, 16, 5, 0, 55, 19, 5, 0, 183, 21, 5, 0, 55, 24, 5, 0, 183, 26, 5, 0, 55, 29, 5, 0, 183, 31, 5, 0, 55, 34, 5, 0, 183, 36, 5, 0, 55, 39, 5, 0, 183, 41, 5, 0, 55, 44, 5, 0, 183, 46, 5, 0, 55, 49, 5, 0, 183, 51, 5, 0, 55, 54, 5, 0, 183, 56, 5, 0, 55, 59, 5, 0, 183, 61, 5, 0, 55, 64, 5, 0, 183, 66, 5, 0, 55, 69, 5, 0, 183, 71, 5, 0, 55, 74, 5, 0, 183, 76, 5, 0, 55, 79, 5, 0, 183, 81, 5, 0, 55, 84, 5, 0, 183, 86, 5, 0, 55, 89, 5, 0, 183, 91, 5, 0, 55, 94, 5, 0, 183, 96, 5, 0, 55, 99, 5, 0, 183, 101, 5, 0, 55, 104, 5, 0, 183, 106, 5, 0, 55, 109, 5, 0, 183, 111, 5, 0, 55, 114, 5, 0, 183, 116, 5, 0, 55, 119, 5, 0, 183, 121, 5, 0, 55, 124, 5, 0, 183, 126, 5, 0, 55, 129, 5, 0, 183, 131, 5, 0, 55, 134, 5, 0, 183, 136, 5, 0, 55, 139, 5, 0, 183, 141, 5, 0, 55, 144, 5, 0, 183, 146, 5, 0, 55, 149, 5, 0, 183, 151, 5, 0, 55, 154, 5, 0, 183, 156, 5, 0, 55, 159, 5, 0, 183, 161, 5, 0, 55, 164, 5, 0, 183, 166, 5, 0, 55, 169, 5, 0, 183, 171, 5, 0, 55, 174, 5, 0, 183, 176, 5, 0, 55, 179, 5, 0, 183, 181, 5, 0, 55, 184, 5, 0, 183, 186, 5, 0, 55, 189, 5, 0, 183, 191, 5, 0, 55, 194, 5, 0, 183, 196, 5, 0, 55, 199, 5, 0, 183, 201, 5, 0, 55, 204, 5, 0, 183, 206, 5, 0, 55, 209, 5, 0, 183, 211, 5, 0, 55, 214, 5, 0, 183, 216, 5, 0, 55, 219, 5, 0, 183, 221, 5, 0, 55, 224, 5, 0, 183, 226, 5, 0, 55, 229, 5, 0, 183, 231, 5, 0, 55, 234, 5, 0, 183, 236, 5, 0, 55, 239, 5, 0, 183, 241, 5, 0, 55, 244, 5, 0, 183, 246, 5, 0, 55, 249, 5, 0, 183, 251, 5, 0, 55, 254, 5, 0, 183, 0, 6, 0, 55, 3, 6, 0, 183, 5, 6, 0, 55, 8, 6, 0, 183, 10, 6, 0, 55, 13, 6, 0, 183, 15, 6, 0, 55, 18, 6, 0, 183, 20, 6, 0, 55, 23, 6, 0, 183, 25, 6, 0, 55, 28, 6, 0, 183, 30, 6, 0, 55, 33, 6, 0, 183, 35, 6, 0, 55, 38, 6, 0, 183, 40, 6, 0, 55, 43, 6, 0, 183, 45, 6, 0, 55, 48, 6, 0, 183, 50, 6, 0, 55, 53, 6, 0, 183, 55, 6, 0, 55, 58, 6, 0, 183, 60, 6, 0, 55, 63, 6, 0, 183, 65, 6, 0, 55, 68, 6, 0, 183, 70, 6, 0, 55, 73, 6, 0, 183, 75, 6, 0, 55, 78, 6, 0, 183, 80, 6, 0, 55, 83, 6, 0, 183, 85, 6, 0, 55, 88, 6, 0, 183, 90, 6, 0, 55, 93, 6, 0, 183, 95, 6, 0, 55, 98, 6, 0, 183, 100, 6, 0, 55, 103, 6, 0, 183, 105, 6, 0, 55, 108, 6, 0, 183, 110, 6, 0, 55, 113, 6, 0, 183, 115, 6, 0, 55, 118, 6, 0, 183, 120, 6, 0, 55, 123, 6, 0, 183, 125, 6, 0, 55, 128, 6, 0, 183, 130, 6, 0, 55, 133, 6, 0, 183, 135, 6, 0, 55, 138, 6, 0, 183, 140, 6, 0, 55, 143, 6, 0, 183, 145, 6, 0, 55, 148, 6, 0, 183, 150, 6, 0, 55, 153, 6, 0, 183, 155, 6, 0, 55, 158, 6, 0, 183, 160, 6, 0, 55, 163, 6, 0, 183, 165, 6, 0, 55, 168, 6, 0, 183, 170, 6, 0, 55, 173, 6, 0, 183, 175, 6, 0, 55, 178, 6, 0, 183, 180, 6, 0, 55, 183, 6, 0, 183, 185, 6, 0, 55, 188, 6, 0, 183, 190, 6, 0, 55, 193, 6, 0, 183, 195, 6, 0, 55, 198, 6, 0, 183, 200, 6, 0, 55, 203, 6, 0, 183, 205, 6, 0, 55, 208, 6, 0, 183, 210, 6, 0, 55, 213, 6, 0, 183, 215, 6, 0, 55, 218, 6, 0, 183, 220, 6, 0, 55, 223, 6, 0, 183, 225, 6, 0, 55, 228, 6, 0, 183, 230, 6, 0, 55, 233, 6, 0, 183, 235, 6, 0, 55, 238, 6, 0, 183, 240, 6, 0, 55, 243, 6, 0, 183, 245, 6, 0, 55, 248, 6, 0, 183, 250, 6, 0, 55, 253, 6, 0, 183, 255, 6, 0, 55, 2, 7, 0, 183, 4, 7, 0, 55, 7, 7, 0, 183, 9, 7, 0, 55, 12, 7, 0, 183, 14, 7, 0, 55, 17, 7, 0, 183, 19, 7, 0, 55, 22, 7, 0, 183, 24, 7, 0, 55, 27, 7, 0, 183, 29, 7, 0, 55, 32, 7, 0, 183, 34, 7, 0, 55, 37, 7, 0, 183, 39, 7, 0, 55, 42, 7, 0, 183, 44, 7, 0, 55, 47, 7, 0, 183, 49, 7, 0, 55, 52, 7, 0, 183, 54, 7, 0, 55, 57, 7, 0, 183, 59, 7, 0, 55, 62, 7, 0, 183, 64, 7, 0, 55, 67, 7, 0, 183, 69, 7, 0, 55, 72, 7, 0, 183, 74, 7, 0, 55, 77, 7, 0, 183, 79, 7, 0, 55, 82, 7, 0, 183, 84, 7, 0, 55, 87, 7, 0, 183, 89, 7, 0, 55, 92, 7, 0, 183, 94, 7, 0, 55, 97, 7, 0, 183, 99, 7, 0, 55, 102, 7, 0, 183, 104, 7, 0, 55, 107, 7, 0, 183, 109, 7, 0, 55, 112, 7, 0, 183, 114, 7, 0, 55, 117, 7, 0, 183, 119, 7, 0, 55, 122, 7, 0, 183, 124, 7, 0, 55, 127, 7, 0, 183, 129, 7, 0, 55, 132, 7, 0, 183, 134, 7, 0, 55, 137, 7, 0, 183, 139, 7, 0, 55, 142, 7, 0, 183, 144, 7, 0, 55, 147, 7, 0, 183, 149, 7, 0, 55, 152, 7, 0, 183, 154, 7, 0, 55, 157, 7, 0, 183, 159, 7, 0, 55, 162, 7, 0, 183, 164, 7, 0, 55, 167, 7, 0, 183, 169, 7, 0, 55, 172, 7, 0, 183, 174, 7, 0, 55, 177, 7, 0, 183, 179, 7, 0, 55, 182, 7, 0, 183, 184, 7, 0, 55, 187, 7, 0, 183, 189, 7, 0, 55, 192, 7, 0, 183, 194, 7, 0, 55, 197, 7, 0, 183, 199, 7, 0, 55, 202, 7, 0, 183, 204, 7, 0, 55, 207, 7, 0, 183, 209, 7, 0, 55, 212, 7, 0, 183, 214, 7, 0, 55, 217, 7, 0, 183, 219, 7, 0, 55, 222, 7, 0, 183, 224, 7, 0, 55, 227, 7, 0, 183, 229, 7, 0, 55, 232, 7, 0, 183, 234, 7, 0, 55, 237, 7, 0, 183, 239, 7, 0, 55, 242, 7, 0, 183, 244, 7, 0, 55, 247, 7, 0, 183, 249, 7, 0, 55, 252, 7, 0, 183, 254, 7, 0, 55, 1, 8, 0, 183, 3, 8, 0, 55, 6, 8, 0, 183, 8, 8, 0, 55, 11, 8, 0, 183, 13, 8, 0, 55, 16, 8, 0, 183, 18, 8, 0, 55, 21, 8, 0, 183, 23, 8, 0, 55, 26, 8, 0, 183, 28, 8, 0, 55, 31, 8, 0, 183, 33, 8, 0, 55, 36, 8, 0, 183, 38, 8, 0, 55, 41, 8, 0, 183, 43, 8, 0, 55, 46, 8, 0, 183, 48, 8, 0, 55, 51, 8, 0, 183, 53, 8, 0, 55, 56, 8, 0, 183, 58, 8, 0, 55, 61, 8, 0, 183, 63, 8, 0, 55, 66, 8, 0, 183, 68, 8, 0, 55, 71, 8, 0, 183, 73, 8, 0, 55, 76, 8, 0, 183, 78, 8, 0, 55, 81, 8, 0, 183, 83, 8, 0, 55, 86, 8, 0, 183, 88, 8, 0, 55, 91, 8, 0, 183, 93, 8, 0, 55, 96, 8, 0, 183, 98, 8, 0, 55, 101, 8, 0, 183, 103, 8, 0, 55, 106, 8, 0, 183, 108, 8, 0, 55, 111, 8, 0, 183, 113, 8, 0, 55, 116, 8, 0, 183, 118, 8, 0, 55, 121, 8, 0, 183, 123, 8, 0, 55, 126, 8, 0, 183, 128, 8, 0, 55, 131, 8, 0, 183, 133, 8, 0, 55, 136, 8, 0, 183, 138, 8, 0, 55, 141, 8, 0, 183, 143, 8, 0, 55, 146, 8, 0, 183, 148, 8, 0, 55, 151, 8, 0, 183, 153, 8, 0, 55, 156, 8, 0, 183, 158, 8, 0, 55, 161, 8, 0, 183, 163, 8, 0, 55, 166, 8, 0, 183, 168, 8, 0, 55, 171, 8, 0, 183, 173, 8, 0, 55, 176, 8, 0, 183, 178, 8, 0, 55, 181, 8, 0, 183, 183, 8, 0, 55, 186, 8, 0, 183, 188, 8, 0, 55, 191, 8, 0, 183, 193, 8, 0, 55, 196, 8, 0, 183, 198, 8, 0, 55, 201, 8, 0, 183, 203, 8, 0, 55, 206, 8, 0, 183, 208, 8, 0, 55, 211, 8, 0, 183, 213, 8, 0, 55, 216, 8, 0, 183, 218, 8, 0, 55, 221, 8, 0, 183, 223, 8, 0, 55, 226, 8, 0, 183, 228, 8, 0, 55, 231, 8, 0, 183, 233, 8, 0, 55, 236, 8, 0, 183, 238, 8, 0, 55, 241, 8, 0, 183, 243, 8, 0, 55, 246, 8, 0, 183, 248, 8, 0, 55, 251, 8, 0, 183, 253, 8, 0, 55, 0, 9, 0, 183, 2, 9, 0, 55, 5, 9, 0, 183, 7, 9, 0, 55, 10, 9, 0, 183, 12, 9, 0, 55, 15, 9, 0, 183, 17, 9, 0, 55, 20, 9, 0, 183, 22, 9, 0, 55, 25, 9, 0, 183, 27, 9, 0, 55, 30, 9, 0, 183, 32, 9, 0, 55, 35, 9, 0, 183, 37, 9, 0, 55, 40, 9, 0, 183, 42, 9, 0, 55, 45, 9, 0, 183, 47, 9, 0, 55, 50, 9, 0, 183, 52, 9, 0, 55, 55, 9, 0, 183, 57, 9, 0, 55, 60, 9, 0, 183, 62, 9, 0, 55, 65, 9, 0, 183, 67, 9, 0, 55, 70, 9, 0, 183, 72, 9, 0, 55, 75, 9, 0, 183, 77, 9, 0, 55, 80, 9, 0, 183, 82, 9, 0, 55, 85, 9, 0, 183, 87, 9, 0, 55, 90, 9, 0, 183, 92, 9, 0, 55, 95, 9, 0, 183, 97, 9, 0, 55, 100, 9, 0, 183, 102, 9, 0, 55, 105, 9, 0, 183, 107, 9, 0, 55, 110, 9, 0, 183, 112, 9, 0, 55, 115, 9, 0, 183, 117, 9, 0, 55, 120, 9, 0, 183, 122, 9, 0, 55, 125, 9, 0, 183, 127, 9, 0, 55, 130, 9, 0, 183, 132, 9, 0, 55, 135, 9, 0, 183, 137, 9, 0, 55, 140, 9, 0, 183, 142, 9, 0, 55, 145, 9, 0, 183, 147, 9, 0, 55, 150, 9, 0, 183, 152, 9, 0, 55, 155, 9, 0, 183, 157, 9, 0, 55, 160, 9, 0, 183, 162, 9, 0, 55, 165, 9, 0, 183, 167, 9, 0, 55, 170, 9, 0, 183, 172, 9, 0, 55, 175, 9, 0, 183, 177, 9, 0, 55, 180, 9, 0, 183, 182, 9, 0, 55, 185, 9, 0, 183, 187, 9, 0, 55, 190, 9, 0, 183, 192, 9, 0, 55, 195, 9, 0, 183, 197, 9, 0, 55, 200, 9, 0, 183, 202, 9, 0, 55, 205, 9, 0, 183, 207, 9, 0, 55, 210, 9, 0, 183, 212, 9, 0, 55, 215, 9, 0, 183, 217, 9, 0, 55, 220, 9, 0, 183, 222, 9, 0, 55, 225, 9, 0, 183, 227, 9, 0, 55, 230, 9, 0, 183, 232, 9, 0, 55, 235, 9, 0, 183, 237, 9, 0, 55, 240, 9, 0, 183, 242, 9, 0, 55, 245, 9, 0, 183, 247, 9, 0, 55, 250, 9, 0, 183, 252, 9, 0, 55, 255, 9, 0, 183, 1, 10, 0, 55, 4, 10, 0, 183, 6, 10, 0, 55, 9, 10, 0, 183, 11, 10, 0, 55, 14, 10, 0, 183, 16, 10, 0, 55, 19, 10, 0, 183, 21, 10, 0, 55, 24, 10, 0, 183, 26, 10, 0, 55, 29, 10, 0, 183, 31, 10, 0, 55, 34, 10, 0, 183, 36, 10, 0, 55, 39, 10, 0, 183, 41, 10, 0, 55, 44, 10, 0, 183, 46, 10, 0, 55, 49, 10, 0, 183, 51, 10, 0, 55, 54, 10, 0, 183, 56, 10, 0, 55, 59, 10, 0, 183, 61, 10, 0, 55, 64, 10, 0, 183, 66, 10, 0, 55, 69, 10, 0, 183, 71, 10, 0, 55, 74, 10, 0, 183, 76, 10, 0, 55, 79, 10, 0, 183, 81, 10, 0, 55, 84, 10, 0, 183, 86, 10, 0, 55, 89, 10, 0, 183, 91, 10, 0, 55, 94, 10, 0, 183, 96, 10, 0, 55, 99, 10, 0, 183, 101, 10, 0, 55, 104, 10, 0, 183, 106, 10, 0, 55, 109, 10, 0, 183, 111, 10, 0, 55, 114, 10, 0, 183, 116, 10, 0, 55, 119, 10, 0, 183, 121, 10, 0, 55, 124, 10, 0, 183, 126, 10, 0, 55, 129, 10, 0, 183, 131, 10, 0, 55, 134, 10, 0, 183, 136, 10, 0, 55, 139, 10, 0, 183, 141, 10, 0, 55, 144, 10, 0, 183, 146, 10, 0, 55, 149, 10, 0, 183, 151, 10, 0, 55, 154, 10, 0, 183, 156, 10, 0, 55, 159, 10, 0, 183, 161, 10, 0, 55, 164, 10, 0, 183, 166, 10, 0, 55, 169, 10, 0, 183, 171, 10, 0, 55, 174, 10, 0, 183, 176, 10, 0, 55, 179, 10, 0, 183, 181, 10, 0, 55, 184, 10, 0, 183, 186, 10, 0, 55, 189, 10, 0, 183, 191, 10, 0, 55, 194, 10, 0, 183, 196, 10, 0, 55, 199, 10, 0, 183, 201, 10, 0, 55, 204, 10, 0, 183, 206, 10, 0, 55, 209, 10, 0, 183, 211, 10, 0, 55, 214, 10, 0, 183, 216, 10, 0, 55, 219, 10, 0, 183, 221, 10, 0, 55, 224, 10, 0, 183, 226, 10, 0, 55, 229, 10, 0, 183, 231, 10, 0, 55, 234, 10, 0, 183, 236, 10, 0, 55, 239, 10, 0, 183, 241, 10, 0, 55, 244, 10, 0, 183, 246, 10, 0, 55, 249, 10, 0, 183, 251, 10, 0, 55, 254, 10, 0, 183, 0, 11, 0, 55, 3, 11, 0, 183, 5, 11, 0, 55, 8, 11, 0, 183, 10, 11, 0, 55, 13, 11, 0, 183, 15, 11, 0, 55, 18, 11, 0, 183, 20, 11, 0, 55, 23, 11, 0, 183, 25, 11, 0, 55, 28, 11, 0, 183, 30, 11, 0, 55, 33, 11, 0, 183, 35, 11, 0, 55, 38, 11, 0, 183, 40, 11, 0, 55, 43, 11, 0, 183, 45, 11, 0, 55, 48, 11, 0, 183, 50, 11, 0, 55, 53, 11, 0, 183, 55, 11, 0, 55, 58, 11, 0, 183, 60, 11, 0, 55, 63, 11, 0, 183, 65, 11, 0, 55, 68, 11, 0, 183, 70, 11, 0, 55, 73, 11, 0, 183, 75, 11, 0, 55, 78, 11, 0, 183, 80, 11, 0, 55, 83, 11, 0, 183, 85, 11, 0, 55, 88, 11, 0, 183, 90, 11, 0, 55, 93, 11, 0, 183, 95, 11, 0, 55, 98, 11, 0, 183, 100, 11, 0, 55, 103, 11, 0, 183, 105, 11, 0, 55, 108, 11, 0, 183, 110, 11, 0, 55, 113, 11, 0, 183, 115, 11, 0, 55, 118, 11, 0, 183, 120, 11, 0, 55, 123, 11, 0, 183, 125, 11, 0, 55, 128, 11, 0, 183, 130, 11, 0, 55, 133, 11, 0, 183, 135, 11, 0, 55, 138, 11, 0, 183, 140, 11, 0, 55, 143, 11, 0, 183, 145, 11, 0, 55, 148, 11, 0, 183, 150, 11, 0, 55, 153, 11, 0, 183, 155, 11, 0, 55, 158, 11, 0, 183, 160, 11, 0, 55, 163, 11, 0, 183, 165, 11, 0, 55, 168, 11, 0, 183, 170, 11, 0, 55, 173, 11, 0, 183, 175, 11, 0, 55, 178, 11, 0, 183, 180, 11, 0, 55, 183, 11, 0, 183, 185, 11, 0, 55, 188, 11, 0, 183, 190, 11, 0, 55, 193, 11, 0, 183, 195, 11, 0, 55, 198, 11, 0, 183, 200, 11, 0, 55, 203, 11, 0, 183, 205, 11, 0, 55, 208, 11, 0, 183, 210, 11, 0, 55, 213, 11, 0, 183, 215, 11, 0, 55, 218, 11, 0, 183, 220, 11, 0, 55, 223, 11, 0, 183, 225, 11, 0, 55, 228, 11, 0, 183, 230, 11, 0, 55, 233, 11, 0, 183, 235, 11, 0, 55, 238, 11, 0, 183, 240, 11, 0, 55, 243, 11, 0, 183, 245, 11, 0, 55, 248, 11, 0, 183, 250, 11, 0, 55, 253, 11, 0, 183, 255, 11, 0, 55, 2, 12, 0, 183, 4, 12, 0, 55, 7, 12, 0, 183, 9, 12, 0, 55, 12, 12, 0, 183, 14, 12, 0, 55, 17, 12, 0, 183, 19, 12, 0, 55, 22, 12, 0, 183, 24, 12, 0, 55, 27, 12, 0, 183, 29, 12, 0, 55, 32, 12, 0, 183, 34, 12, 0, 55, 37, 12, 0, 183, 39, 12, 0, 55, 42, 12, 0, 183, 44, 12, 0, 55, 47, 12, 0, 183, 49, 12, 0, 55, 52, 12, 0, 183, 54, 12, 0, 55, 57, 12, 0, 183, 59, 12, 0, 55, 62, 12, 0, 183, 64, 12, 0, 55, 67, 12, 0, 183, 69, 12, 0, 55, 72, 12, 0, 183, 74, 12, 0, 55, 77, 12, 0, 183, 79, 12, 0, 55, 82, 12, 0, 183, 84, 12, 0, 55, 87, 12, 0, 183, 89, 12, 0, 55, 92, 12, 0, 183, 94, 12, 0, 55, 97, 12, 0, 183, 99, 12, 0, 55, 102, 12, 0, 183, 104, 12, 0, 55, 107, 12, 0, 183, 109, 12, 0, 55, 112, 12, 0, 183, 114, 12, 0, 55, 117, 12, 0, 183, 119, 12, 0, 55, 122, 12, 0, 183, 124, 12, 0, 55, 127, 12, 0, 183, 129, 12, 0, 55, 132, 12, 0, 183, 134, 12, 0, 55, 137, 12, 0, 183, 139, 12, 0, 55, 142, 12, 0, 183, 144, 12, 0, 55, 147, 12, 0, 183, 149, 12, 0, 55, 152, 12, 0, 183, 154, 12, 0, 55, 157, 12, 0, 183, 159, 12, 0, 55, 162, 12, 0, 183, 164, 12, 0, 55, 167, 12, 0, 183, 169, 12, 0, 55, 172, 12, 0, 183, 174, 12, 0, 55, 177, 12, 0, 183, 179, 12, 0, 55, 182, 12, 0, 183, 184, 12, 0, 55, 187, 12, 0, 183, 189, 12, 0, 55, 192, 12, 0, 183, 194, 12, 0, 55, 197, 12, 0, 183, 199, 12, 0, 55, 202, 12, 0, 183, 204, 12, 0, 55, 207, 12, 0, 183, 209, 12, 0, 55, 212, 12, 0, 183, 214, 12, 0, 55, 217, 12, 0, 183, 219, 12, 0, 55, 222, 12, 0, 183, 224, 12, 0, 55, 227, 12, 0, 183, 229, 12, 0, 55, 232, 12, 0, 183, 234, 12, 0, 55, 237, 12, 0, 183, 239, 12, 0, 55, 242, 12, 0, 183, 244, 12, 0, 55, 247, 12, 0, 183, 249, 12, 0, 55, 252, 12, 0, 183, 254, 12, 0, 55, 1, 13, 0, 183, 3, 13, 0, 55, 6, 13, 0, 183, 8, 13, 0, 55, 11, 13, 0, 183, 13, 13, 0, 55, 16, 13, 0, 183, 18, 13, 0, 55, 21, 13, 0, 183, 23, 13, 0, 55, 26, 13, 0, 183, 28, 13, 0, 55, 31, 13, 0, 183, 33, 13, 0, 55, 36, 13, 0, 183, 38, 13, 0, 55, 41, 13, 0, 183, 43, 13, 0, 55, 46, 13, 0, 183, 48, 13, 0, 55, 51, 13, 0, 183, 53, 13, 0, 55, 56, 13, 0, 183, 58, 13, 0, 55, 61, 13, 0, 183, 63, 13, 0, 55, 66, 13, 0, 183, 68, 13, 0, 55, 71, 13, 0, 183, 73, 13, 0, 55, 76, 13, 0, 183, 78, 13, 0, 55, 81, 13, 0, 183, 83, 13, 0, 55, 86, 13, 0, 183, 88, 13, 0, 55, 91, 13, 0, 183, 93, 13, 0, 55, 96, 13, 0, 183, 98, 13, 0, 55, 101, 13, 0, 183, 103, 13, 0, 55, 106, 13, 0, 183, 108, 13, 0, 55, 111, 13, 0, 183, 113, 13, 0, 55, 116, 13, 0, 183, 118, 13, 0, 55, 121, 13, 0, 183, 123, 13, 0, 55, 126, 13, 0, 183, 128, 13, 0, 55, 131, 13, 0, 183, 133, 13, 0, 55, 136, 13, 0, 183, 138, 13, 0, 55, 141, 13, 0, 183, 143, 13, 0, 55, 146, 13, 0, 183, 148, 13, 0, 55, 151, 13, 0, 183, 153, 13, 0, 55, 156, 13, 0, 183, 158, 13, 0, 55, 161, 13, 0, 183, 163, 13, 0, 55, 166, 13, 0, 183, 168, 13, 0, 55, 171, 13, 0, 183, 173, 13, 0, 55, 176, 13, 0, 183, 178, 13, 0, 55, 181, 13, 0, 183, 183, 13, 0, 55, 186, 13, 0, 183, 188, 13, 0, 55, 191, 13, 0, 183, 193, 13, 0, 55, 196, 13, 0, 183, 198, 13, 0, 55, 201, 13, 0, 183, 203, 13, 0, 55, 206, 13, 0, 183, 208, 13, 0, 55, 211, 13, 0, 183, 213, 13, 0, 55, 216, 13, 0, 183, 218, 13, 0, 55, 221, 13, 0, 183, 223, 13, 0, 55, 226, 13, 0, 183, 228, 13, 0, 55, 231, 13, 0, 183, 233, 13, 0, 55, 236, 13, 0, 183, 238, 13, 0, 55, 241, 13, 0, 183, 243, 13, 0, 55, 246, 13, 0, 183, 248, 13, 0, 55, 251, 13, 0, 183, 253, 13, 0, 55, 0, 14, 0, 183, 2, 14, 0, 55, 5, 14, 0, 183, 7, 14, 0, 55, 10, 14, 0, 183, 12, 14, 0, 55, 15, 14, 0, 183, 17, 14, 0, 55, 20, 14, 0, 183, 22, 14, 0, 55, 25, 14, 0, 183, 27, 14, 0, 55, 30, 14, 0, 183, 32, 14, 0, 55, 35, 14, 0, 183, 37, 14, 0, 55, 40, 14, 0, 183, 42, 14, 0, 55, 45, 14, 0, 183, 47, 14, 0, 55, 50, 14, 0, 183, 52, 14, 0, 55, 55, 14, 0, 183, 57, 14, 0, 55, 60, 14, 0, 183, 62, 14, 0, 55, 65, 14, 0, 183, 67, 14, 0, 55, 70, 14, 0, 183, 72, 14, 0, 55, 75, 14, 0, 183, 77, 14, 0, 55, 80, 14, 0, 183, 82, 14, 0, 55, 85, 14, 0, 183, 87, 14, 0, 55, 90, 14, 0, 183, 92, 14, 0, 55, 95, 14, 0, 183, 97, 14, 0, 55, 100, 14, 0, 183, 102, 14, 0, 55, 105, 14, 0, 183, 107, 14, 0, 55, 110, 14, 0, 183, 112, 14, 0, 55, 115, 14, 0, 183, 117, 14, 0, 55, 120, 14, 0, 183, 122, 14, 0, 55, 125, 14, 0, 183, 127, 14, 0, 55, 130, 14, 0, 183, 132, 14, 0, 55, 135, 14, 0, 183, 137, 14, 0, 55, 140, 14, 0, 183, 142, 14, 0, 55, 145, 14, 0, 183, 147, 14, 0, 55, 150, 14, 0, 183, 152, 14, 0, 55, 155, 14, 0, 183, 157, 14, 0, 55, 160, 14, 0, 183, 162, 14, 0, 55, 165, 14, 0, 183, 167, 14, 0, 55, 170, 14, 0, 183, 172, 14, 0, 55, 175, 14, 0, 183, 177, 14, 0, 55, 180, 14, 0, 183, 182, 14, 0, 55, 185, 14, 0, 183, 187, 14, 0, 55, 190, 14, 0, 183, 192, 14, 0, 55, 195, 14, 0, 183, 197, 14, 0, 55, 200, 14, 0, 183, 202, 14, 0, 55, 205, 14, 0, 183, 207, 14, 0, 55, 210, 14, 0, 183, 212, 14, 0, 55, 215, 14, 0, 183, 217, 14, 0, 55, 220, 14, 0, 183, 222, 14, 0, 55, 225, 14, 0, 183, 227, 14, 0, 55, 230, 14, 0, 183, 232, 14, 0, 55, 235, 14, 0, 183, 237, 14, 0, 55, 240, 14, 0, 183, 242, 14, 0, 55, 245, 14, 0, 183, 247, 14, 0, 55, 250, 14, 0, 183, 252, 14, 0, 55, 255, 14, 0, 183, 1, 15, 0, 55, 4, 15, 0, 183, 6, 15, 0, 55, 9, 15, 0, 183, 11, 15, 0, 55, 14, 15, 0, 183, 16, 15, 0, 55, 19, 15, 0, 183, 21, 15, 0, 55, 24, 15, 0, 183, 26, 15, 0, 55, 29, 15, 0, 183, 31, 15, 0, 55, 34, 15, 0, 183, 36, 15, 0, 55, 39, 15, 0, 183, 41, 15, 0, 55, 44, 15, 0, 183, 46, 15, 0, 55, 49, 15, 0, 183, 51, 15, 0, 55, 54, 15, 0, 183, 56, 15, 0, 55, 59, 15, 0, 183, 61, 15, 0, 55, 64, 15, 0, 183, 66, 15, 0, 55, 69, 15, 0, 183, 71, 15, 0, 55, 74, 15, 0, 183, 76, 15, 0, 55, 79, 15, 0, 183, 81, 15, 0, 55, 84, 15, 0, 183, 86, 15, 0, 55, 89, 15, 0, 183, 91, 15, 0, 55, 94, 15, 0, 183, 96, 15, 0, 55, 99, 15, 0, 183, 101, 15, 0, 55, 104, 15, 0, 183, 106, 15, 0, 55, 109, 15, 0, 183, 111, 15, 0, 55, 114, 15, 0, 183, 116, 15, 0, 55, 119, 15, 0, 183, 121, 15, 0, 55, 124, 15, 0, 183, 126, 15, 0, 55, 129, 15, 0, 183, 131, 15, 0, 55, 134, 15, 0, 183, 136, 15, 0, 55, 139, 15, 0, 183, 141, 15, 0, 55, 144, 15, 0, 183, 146, 15, 0, 55, 149, 15, 0, 183, 151, 15, 0, 55, 154, 15, 0, 183, 156, 15, 0, 55, 159, 15, 0, 183, 161, 15, 0, 55, 164, 15, 0, 183, 166, 15, 0, 55, 169, 15, 0, 183, 171, 15, 0, 55, 174, 15, 0, 183, 176, 15, 0, 55, 179, 15, 0, 183, 181, 15, 0, 55, 184, 15, 0, 183, 186, 15, 0, 55, 189, 15, 0, 183, 191, 15, 0, 55, 194, 15, 0, 183, 196, 15, 0, 55, 199, 15, 0, 183, 201, 15, 0, 55, 204, 15, 0, 183, 206, 15, 0, 55, 209, 15, 0, 183, 211, 15, 0, 55, 214, 15, 0, 183, 216, 15, 0, 55, 219, 15, 0, 183, 221, 15, 0, 55, 224, 15, 0, 183, 226, 15, 0, 55, 229, 15, 0, 183, 231, 15, 0, 55, 234, 15, 0, 183, 236, 15, 0, 55, 239, 15, 0, 183, 241, 15, 0, 55, 244, 15, 0, 183, 246, 15, 0, 55, 249, 15, 0, 183, 251, 15, 0, 55, 254, 15, 0, 183, 0, 16, 0, 55, 3, 16, 0, 183, 5, 16, 0, 55, 8, 16, 0, 183, 10, 16, 0, 55, 13, 16, 0, 183, 15, 16, 0, 55, 18, 16, 0, 183, 20, 16, 0, 55, 23, 16, 0, 183, 25, 16, 0, 55, 28, 16, 0, 183, 30, 16, 0, 55, 33, 16, 0, 183, 35, 16, 0, 55, 38, 16, 0, 183, 40, 16, 0, 55, 43, 16, 0, 183, 45, 16, 0, 55, 48, 16, 0, 183, 50, 16, 0, 55, 53, 16, 0, 183, 55, 16, 0, 55, 58, 16, 0, 183, 60, 16, 0, 55, 63, 16, 0, 183, 65, 16, 0, 55, 68, 16, 0, 183, 70, 16, 0, 55, 73, 16, 0, 183, 75, 16, 0, 55, 78, 16, 0, 183, 80, 16, 0, 55, 83, 16, 0, 183, 85, 16, 0, 55, 88, 16, 0, 183, 90, 16, 0, 55, 93, 16, 0, 183, 95, 16, 0, 55, 98, 16, 0, 183, 100, 16, 0, 55, 103, 16, 0, 183, 105, 16, 0, 55, 108, 16, 0, 183, 110, 16, 0, 55, 113, 16, 0, 183, 115, 16, 0, 55, 118, 16, 0, 183, 120, 16, 0, 55, 123, 16, 0, 183, 125, 16, 0, 55, 128, 16, 0, 183, 130, 16, 0, 55, 133, 16, 0, 183, 135, 16, 0, 55, 138, 16, 0, 183, 140, 16, 0, 55, 143, 16, 0, 183, 145, 16, 0, 55, 148, 16, 0, 183, 150, 16, 0, 55, 153, 16, 0, 183, 155, 16, 0, 55, 158, 16, 0, 183, 160, 16, 0, 55, 163, 16, 0, 183, 165, 16, 0, 55, 168, 16, 0, 183, 170, 16, 0, 55, 173, 16, 0, 183, 175, 16, 0, 55, 178, 16, 0, 183, 180, 16, 0, 55, 183, 16, 0, 183, 185, 16, 0, 55, 188, 16, 0, 183, 190, 16, 0, 55, 193, 16, 0, 183, 195, 16, 0, 55, 198, 16, 0, 183, 200, 16, 0, 55, 203, 16, 0, 183, 205, 16, 0, 55, 208, 16, 0, 183, 210, 16, 0, 55, 213, 16, 0, 183, 215, 16, 0, 55, 218, 16, 0, 183, 220, 16, 0, 55, 223, 16, 0, 183, 225, 16, 0, 55, 228, 16, 0, 183, 230, 16, 0, 55, 233, 16, 0, 183, 235, 16, 0, 55, 238, 16, 0, 183, 240, 16, 0, 55, 243, 16, 0, 183, 245, 16, 0, 55, 248, 16, 0, 183, 250, 16, 0, 55, 253, 16, 0, 183, 255, 16, 0, 55, 2, 17, 0, 183, 4, 17, 0, 55, 7, 17, 0, 183, 9, 17, 0, 55, 12, 17, 0, 183, 14, 17, 0, 55, 17, 17, 0, 183, 19, 17, 0, 55, 22, 17, 0, 183, 24, 17, 0, 55, 27, 17, 0, 183, 29, 17, 0, 55, 32, 17, 0, 183, 34, 17, 0, 55, 37, 17, 0, 183, 39, 17, 0, 55, 42, 17, 0, 183, 44, 17, 0, 55, 47, 17, 0, 183, 49, 17, 0, 55, 52, 17, 0, 183, 54, 17, 0, 55, 57, 17, 0, 183, 59, 17, 0, 55, 62, 17, 0, 183, 64, 17, 0, 55, 67, 17, 0, 183, 69, 17, 0, 55, 72, 17, 0, 183, 74, 17, 0, 55, 77, 17, 0, 183, 79, 17, 0, 55, 82, 17, 0, 183, 84, 17, 0, 55, 87, 17, 0, 183, 89, 17, 0, 55, 92, 17, 0, 183, 94, 17, 0, 55, 97, 17, 0, 183, 99, 17, 0, 55, 102, 17, 0, 183, 104, 17, 0, 55, 107, 17, 0, 183, 109, 17, 0, 55, 112, 17, 0, 183, 114, 17, 0, 55, 117, 17, 0, 183, 119, 17, 0, 55, 122, 17, 0, 183, 124, 17, 0, 55, 127, 17, 0, 183, 129, 17, 0, 55, 132, 17, 0, 183, 134, 17, 0, 55, 137, 17, 0, 183, 139, 17, 0, 55, 142, 17, 0, 183, 144, 17, 0, 55, 147, 17, 0, 183, 149, 17, 0, 55, 152, 17, 0, 183, 154, 17, 0, 55, 157, 17, 0, 183, 159, 17, 0, 55, 162, 17, 0, 183, 164, 17, 0, 55, 167, 17, 0, 183, 169, 17, 0, 55, 172, 17, 0, 183, 174, 17, 0, 55, 177, 17, 0, 183, 179, 17, 0, 55, 182, 17, 0, 183, 184, 17, 0, 55, 187, 17, 0, 183, 189, 17, 0, 55, 192, 17, 0, 183, 194, 17, 0, 55, 197, 17, 0, 183, 199, 17, 0, 55, 202, 17, 0, 183, 204, 17, 0, 55, 207, 17, 0, 183, 209, 17, 0, 55, 212, 17, 0, 183, 214, 17, 0, 55, 217, 17, 0, 183, 219, 17, 0, 55, 222, 17, 0, 183, 224, 17, 0, 55, 227, 17, 0, 183, 229, 17, 0, 55, 232, 17, 0, 183, 234, 17, 0, 55, 237, 17, 0, 183, 239, 17, 0, 55, 242, 17, 0, 183, 244, 17, 0, 55, 247, 17, 0, 183, 249, 17, 0, 55, 252, 17, 0, 183, 254, 17, 0, 55, 1, 18, 0, 183, 3, 18, 0, 55, 6, 18, 0, 183, 8, 18, 0, 55, 11, 18, 0, 183, 13, 18, 0, 55, 16, 18, 0, 183, 18, 18, 0, 55, 21, 18, 0, 183, 23, 18, 0, 55, 26, 18, 0, 183, 28, 18, 0, 55, 31, 18, 0, 183, 33, 18, 0, 55, 36, 18, 0, 183, 38, 18, 0, 55, 41, 18, 0, 183, 43, 18, 0, 55, 46, 18, 0, 183, 48, 18, 0, 55, 51, 18, 0, 183, 53, 18, 0, 55, 56, 18, 0, 183, 58, 18, 0, 55, 61, 18, 0, 183, 63, 18, 0, 55, 66, 18, 0, 183, 68, 18, 0, 55, 71, 18, 0, 183, 73, 18, 0, 55, 76, 18, 0, 183, 78, 18, 0, 55, 81, 18, 0, 183, 83, 18, 0, 55, 86, 18, 0, 183, 88, 18, 0, 55, 91, 18, 0, 183, 93, 18, 0, 55, 96, 18, 0, 183, 98, 18, 0, 55, 101, 18, 0, 183, 103, 18, 0, 55, 106, 18, 0, 183, 108, 18, 0, 55, 111, 18, 0, 183, 113, 18, 0, 55, 116, 18, 0, 183, 118, 18, 0, 55, 121, 18, 0, 183, 123, 18, 0, 55, 126, 18, 0, 183, 128, 18, 0, 55, 131, 18, 0, 183, 133, 18, 0, 55, 136, 18, 0, 183, 138, 18, 0, 55, 141, 18, 0, 183, 143, 18, 0, 55, 146, 18, 0, 183, 148, 18, 0, 55, 151, 18, 0, 183, 153, 18, 0, 55, 156, 18, 0, 183, 158, 18, 0, 55, 161, 18, 0, 183, 163, 18, 0, 55, 166, 18, 0, 183, 168, 18, 0, 55, 171, 18, 0, 183, 173, 18, 0, 55, 176, 18, 0, 183, 178, 18, 0, 55, 181, 18, 0, 183, 183, 18, 0, 55, 186, 18, 0, 183, 188, 18, 0, 55, 191, 18, 0, 183, 193, 18, 0, 55, 196, 18, 0, 183, 198, 18, 0, 55, 201, 18, 0, 183, 203, 18, 0, 55, 206, 18, 0, 183, 208, 18, 0, 55, 211, 18, 0, 183, 213, 18, 0, 55, 216, 18, 0, 183, 218, 18, 0, 55, 221, 18, 0, 183, 223, 18, 0, 55, 226, 18, 0, 183, 228, 18, 0, 55, 231, 18, 0, 183, 233, 18, 0, 55, 236, 18, 0, 183, 238, 18, 0, 55, 241, 18, 0, 183, 243, 18, 0, 55, 246, 18, 0, 183, 248, 18, 0, 55, 251, 18, 0, 183, 253, 18, 0, 55, 0, 19, 0, 183, 2, 19, 0, 55, 5, 19, 0, 183, 7, 19, 0, 55, 10, 19, 0, 183, 12, 19, 0, 55, 15, 19, 0, 183, 17, 19, 0, 55, 20, 19, 0, 183, 22, 19, 0, 55, 25, 19, 0, 183, 27, 19, 0, 55, 30, 19, 0, 183, 32, 19, 0, 55, 35, 19, 0, 183, 37, 19, 0, 55, 40, 19, 0, 183, 42, 19, 0, 55, 45, 19, 0, 183, 47, 19, 0, 55, 50, 19, 0, 183, 52, 19, 0, 55, 55, 19, 0, 183, 57, 19, 0, 55, 60, 19, 0, 183, 62, 19, 0, 55, 65, 19, 0, 183, 67, 19, 0, 55, 70, 19, 0, 183, 72, 19, 0, 55, 75, 19, 0, 183, 77, 19, 0, 55, 80, 19, 0, 183, 82, 19, 0, 55, 85, 19, 0, 183, 87, 19, 0, 55, 90, 19, 0, 183, 92, 19, 0, 55, 95, 19, 0, 183, 97, 19, 0, 55, 100, 19, 0, 183, 102, 19, 0, 55, 105, 19, 0, 183, 107, 19, 0, 55, 110, 19, 0, 183, 112, 19, 0, 55, 115, 19, 0, 183, 117, 19, 0, 55, 120, 19, 0, 183, 122, 19, 0, 55, 125, 19, 0, 183, 127, 19, 0, 55, 130, 19, 0, 183, 132, 19, 0, 55, 135, 19, 0, 183, 137, 19, 0, 55, 140, 19, 0, 183, 142, 19, 0, 55, 145, 19, 0, 183, 147, 19, 0, 55, 150, 19, 0, 183, 152, 19, 0, 55, 155, 19, 0, 183, 157, 19, 0, 55, 160, 19, 0, 183, 162, 19, 0, 55, 165, 19, 0, 183, 167, 19, 0, 55, 170, 19, 0, 183, 172, 19, 0, 55, 175, 19, 0, 183, 177, 19, 0, 55, 180, 19, 0, 183, 182, 19, 0, 55, 185, 19, 0, 183, 187, 19, 0, 55, 190, 19, 0, 183, 192, 19, 0, 55, 195, 19, 0, 183, 197, 19, 0, 55, 200, 19, 0, 183, 202, 19, 0, 55, 205, 19, 0, 183, 207, 19, 0, 55, 210, 19, 0, 183, 212, 19, 0, 55, 215, 19, 0, 183, 217, 19, 0, 55, 220, 19, 0, 183, 222, 19, 0, 55, 225, 19, 0, 183, 227, 19, 0, 55, 230, 19, 0, 183, 232, 19, 0, 55, 235, 19, 0, 183, 237, 19, 0, 55, 240, 19, 0, 183, 242, 19, 0, 55, 245, 19, 0, 183, 247, 19, 0, 55, 250, 19, 0, 183, 252, 19, 0, 55, 255, 19, 0, 183, 1, 20, 0, 55, 4, 20, 0, 183, 6, 20, 0, 55, 9, 20, 0, 183, 11, 20, 0, 55, 14, 20, 0, 183, 16, 20, 0, 55, 19, 20, 0, 183, 21, 20, 0, 55, 24, 20, 0, 183, 26, 20, 0, 55, 29, 20, 0, 183, 31, 20, 0, 55, 34, 20, 0, 183, 36, 20, 0, 55, 39, 20, 0, 183, 41, 20, 0, 55, 44, 20, 0, 183, 46, 20, 0, 55, 49, 20, 0, 183, 51, 20, 0, 55, 54, 20, 0, 183, 56, 20, 0, 55, 59, 20, 0, 183, 61, 20, 0, 55, 64, 20, 0, 183, 66, 20, 0, 55, 69, 20, 0, 183, 71, 20, 0, 55, 74, 20, 0, 183, 76, 20, 0, 55, 79, 20, 0, 183, 81, 20, 0, 55, 84, 20, 0, 183, 86, 20, 0, 55, 89, 20, 0, 183, 91, 20, 0, 55, 94, 20, 0, 183, 96, 20, 0, 55, 99, 20, 0, 183, 101, 20, 0, 55, 104, 20, 0, 183, 106, 20, 0, 55, 109, 20, 0, 183, 111, 20, 0, 55, 114, 20, 0, 183, 116, 20, 0, 55, 119, 20, 0, 183, 121, 20, 0, 55, 124, 20, 0, 183, 126, 20, 0, 55, 129, 20, 0, 183, 131, 20, 0, 55, 134, 20, 0, 183, 136, 20, 0, 55, 139, 20, 0, 183, 141, 20, 0, 55, 144, 20, 0, 183, 146, 20, 0, 55, 149, 20, 0, 183, 151, 20, 0, 55, 154, 20, 0, 183, 156, 20, 0, 55, 159, 20, 0, 183, 161, 20, 0, 55, 164, 20, 0, 183, 166, 20, 0, 55, 169, 20, 0, 183, 171, 20, 0, 55, 174, 20, 0, 183, 176, 20, 0, 55, 179, 20, 0, 183, 181, 20, 0, 55, 184, 20, 0, 183, 186, 20, 0, 55, 189, 20, 0, 183, 191, 20, 0, 55, 194, 20, 0, 183, 196, 20, 0, 55, 199, 20, 0, 183, 201, 20, 0, 55, 204, 20, 0, 183, 206, 20, 0, 55, 209, 20, 0, 183, 211, 20, 0, 55, 214, 20, 0, 183, 216, 20, 0, 55, 219, 20, 0, 183, 221, 20, 0, 55, 224, 20, 0, 183, 226, 20, 0, 55, 229, 20, 0, 183, 231, 20, 0, 55, 234, 20, 0, 183, 236, 20, 0, 55, 239, 20, 0, 183, 241, 20, 0, 55, 244, 20, 0, 183, 246, 20, 0, 55, 249, 20, 0, 183, 251, 20, 0, 55, 254, 20, 0, 183, 0, 21, 0, 55, 3, 21, 0, 183, 5, 21, 0, 55, 8, 21, 0, 183, 10, 21, 0, 55, 13, 21, 0, 183, 15, 21, 0, 55, 18, 21, 0, 183, 20, 21, 0, 55, 23, 21, 0, 183, 25, 21, 0, 55, 28, 21, 0, 183, 30, 21, 0, 55, 33, 21, 0, 183, 35, 21, 0, 55, 38, 21, 0, 183, 40, 21, 0, 55, 43, 21, 0, 183, 45, 21, 0, 55, 48, 21, 0, 183, 50, 21, 0, 55, 53, 21, 0, 183, 55, 21, 0, 55, 58, 21, 0, 183, 60, 21, 0, 55, 63, 21, 0, 183, 65, 21, 0, 55, 68, 21, 0, 183, 70, 21, 0, 55, 73, 21, 0, 183, 75, 21, 0, 55, 78, 21, 0, 183, 80, 21, 0, 55, 83, 21, 0, 183, 85, 21, 0, 55, 88, 21, 0, 183, 90, 21, 0, 55, 93, 21, 0, 183, 95, 21, 0, 55, 98, 21, 0, 183, 100, 21, 0, 55, 103, 21, 0, 183, 105, 21, 0, 55, 108, 21, 0, 183, 110, 21, 0, 55, 113, 21, 0, 183, 115, 21, 0, 55, 118, 21, 0, 183, 120, 21, 0, 55, 123, 21, 0, 183, 125, 21, 0, 55, 128, 21, 0, 183, 130, 21, 0, 55, 133, 21, 0, 183, 135, 21, 0, 55, 138, 21, 0, 183, 140, 21, 0, 55, 143, 21, 0, 183, 145, 21, 0, 55, 148, 21, 0, 183, 150, 21, 0, 55, 153, 21, 0, 183, 155, 21, 0, 55, 158, 21, 0, 183, 160, 21, 0, 55, 163, 21, 0, 183, 165, 21, 0, 55, 168, 21, 0, 183, 170, 21, 0, 55, 173, 21, 0, 183, 175, 21, 0, 55, 178, 21, 0, 183, 180, 21, 0, 55, 183, 21, 0, 183, 185, 21, 0, 55, 188, 21, 0, 183, 190, 21, 0, 55, 193, 21, 0, 183, 195, 21, 0, 55, 198, 21, 0, 183, 200, 21, 0, 55, 203, 21, 0, 183, 205, 21, 0, 55, 208, 21, 0, 183, 210, 21, 0, 55, 213, 21, 0, 183, 215, 21, 0, 55, 218, 21, 0, 183, 220, 21, 0, 55, 223, 21, 0, 183, 225, 21, 0, 55, 228, 21, 0, 183, 230, 21, 0, 55, 233, 21, 0, 183, 235, 21, 0, 55, 238, 21, 0, 183, 240, 21, 0, 55, 243, 21, 0, 183, 245, 21, 0, 55, 248, 21, 0, 183, 250, 21, 0, 55, 253, 21, 0, 183, 255, 21, 0, 55, 2, 22, 0, 183, 4, 22, 0, 55, 7, 22, 0, 183, 9, 22, 0, 55, 12, 22, 0, 183, 14, 22, 0, 55, 17, 22, 0, 183, 19, 22, 0, 55, 22, 22, 0, 183, 24, 22, 0, 55, 27, 22, 0, 183, 29, 22, 0, 55, 32, 22, 0, 183, 34, 22, 0, 55, 37, 22, 0, 183, 39, 22, 0, 55, 42, 22, 0, 183, 44, 22, 0, 55, 47, 22, 0, 183, 49, 22, 0, 55, 52, 22, 0, 183, 54, 22, 0, 55, 57, 22, 0, 183, 59, 22, 0, 55, 62, 22, 0, 183, 64, 22, 0, 55, 67, 22, 0, 183, 69, 22, 0, 55, 72, 22, 0, 183, 74, 22, 0, 55, 77, 22, 0, 183, 79, 22, 0, 55, 82, 22, 0, 183, 84, 22, 0, 55, 87, 22, 0, 183, 89, 22, 0, 55, 92, 22, 0, 183, 94, 22, 0, 55, 97, 22, 0, 183, 99, 22, 0, 55, 102, 22, 0, 183, 104, 22, 0, 55, 107, 22, 0, 183, 109, 22, 0, 55, 112, 22, 0, 183, 114, 22, 0, 55, 117, 22, 0, 183, 119, 22, 0, 55, 122, 22, 0, 183, 124, 22, 0, 55, 127, 22, 0, 183, 129, 22, 0, 55, 132, 22, 0, 183, 134, 22, 0, 55, 137, 22, 0, 183, 139, 22, 0, 55, 142, 22, 0, 183, 144, 22, 0, 55, 147, 22, 0, 183, 149, 22, 0, 55, 152, 22, 0, 183, 154, 22, 0, 55, 157, 22, 0, 183, 159, 22, 0, 55, 162, 22, 0, 183, 164, 22, 0, 55, 167, 22, 0, 183, 169, 22, 0, 55, 172, 22, 0, 183, 174, 22, 0, 55, 177, 22, 0, 183, 179, 22, 0, 55, 182, 22, 0, 183, 184, 22, 0, 55, 187, 22, 0, 183, 189, 22, 0, 55, 192, 22, 0, 183, 194, 22, 0, 55, 197, 22, 0, 183, 199, 22, 0, 55, 202, 22, 0, 183, 204, 22, 0, 55, 207, 22, 0, 183, 209, 22, 0, 55, 212, 22, 0, 183, 214, 22, 0, 55, 217, 22, 0, 183, 219, 22, 0, 55, 222, 22, 0, 183, 224, 22, 0, 55, 227, 22, 0, 183, 229, 22, 0, 55, 232, 22, 0, 183, 234, 22, 0, 55, 237, 22, 0, 183, 239, 22, 0, 55, 242, 22, 0, 183, 244, 22, 0, 55, 247, 22, 0, 183, 249, 22, 0, 55, 252, 22, 0, 183, 254, 22, 0, 55, 1, 23, 0, 183, 3, 23, 0, 55, 6, 23, 0, 183, 8, 23, 0, 55, 11, 23, 0, 183, 13, 23, 0, 55, 16, 23, 0, 183, 18, 23, 0, 55, 21, 23, 0, 183, 23, 23, 0, 55, 26, 23, 0, 183, 28, 23, 0, 55, 31, 23, 0, 183, 33, 23, 0, 55, 36, 23, 0, 183, 38, 23, 0, 55, 41, 23, 0, 183, 43, 23, 0, 55, 46, 23, 0, 183, 48, 23, 0, 55, 51, 23, 0, 183, 53, 23, 0, 55, 56, 23, 0, 183, 58, 23, 0, 55, 61, 23, 0, 183, 63, 23, 0, 55, 66, 23, 0, 183, 68, 23, 0, 55, 71, 23, 0, 183, 73, 23, 0, 55, 76, 23, 0, 183, 78, 23, 0, 55, 81, 23, 0, 183, 83, 23, 0, 55, 86, 23, 0, 183, 88, 23, 0, 55, 91, 23, 0, 183, 93, 23, 0, 55, 96, 23, 0, 183, 98, 23, 0, 55, 101, 23, 0, 183, 103, 23, 0, 55, 106, 23, 0, 183, 108, 23, 0, 55, 111, 23, 0, 183, 113, 23, 0, 55, 116, 23, 0, 183, 118, 23, 0, 55, 121, 23, 0, 183, 123, 23, 0, 55, 126, 23, 0, 183, 128, 23, 0, 55, 131, 23, 0, 183, 133, 23, 0, 55, 136, 23, 0, 183, 138, 23, 0, 55, 141, 23, 0, 183, 143, 23, 0, 55, 146, 23, 0, 183, 148, 23, 0, 55, 151, 23, 0, 183, 153, 23, 0, 55, 156, 23, 0, 183, 158, 23, 0, 55, 161, 23, 0, 183, 163, 23, 0, 55, 166, 23, 0, 183, 168, 23, 0, 55, 171, 23, 0, 183, 173, 23, 0, 55, 176, 23, 0, 183, 178, 23, 0, 55, 181, 23, 0, 183, 183, 23, 0, 55, 186, 23, 0, 183, 188, 23, 0, 55, 191, 23, 0, 183, 193, 23, 0, 55, 196, 23, 0, 183, 198, 23, 0, 55, 201, 23, 0, 183, 203, 23, 0, 55, 206, 23, 0, 183, 208, 23, 0, 55, 211, 23, 0, 183, 213, 23, 0, 55, 216, 23, 0, 183, 218, 23, 0, 55, 221, 23, 0, 183, 223, 23, 0, 55, 226, 23, 0, 183, 228, 23, 0, 55, 231, 23, 0, 183, 233, 23, 0, 55, 236, 23, 0, 183, 238, 23, 0, 55, 241, 23, 0, 183, 243, 23, 0, 55, 246, 23, 0, 183, 248, 23, 0, 55, 251, 23, 0, 183, 253, 23, 0, 55, 0, 24, 0, 183, 2, 24, 0, 55, 5, 24, 0, 183, 7, 24, 0, 55, 10, 24, 0, 183, 12, 24, 0, 55, 15, 24, 0, 183, 17, 24, 0, 55, 20, 24, 0, 183, 22, 24, 0, 55, 25, 24, 0, 183, 27, 24, 0, 55, 30, 24, 0, 183, 32, 24, 0, 55, 35, 24, 0, 183, 37, 24, 0, 55, 40, 24, 0, 183, 42, 24, 0, 55, 45, 24, 0, 183, 47, 24, 0, 55, 50, 24, 0, 183, 52, 24, 0, 55, 55, 24, 0, 183, 57, 24, 0, 55, 60, 24, 0, 183, 62, 24, 0, 55, 65, 24, 0, 183, 67, 24, 0, 55, 70, 24, 0, 183, 72, 24, 0, 55, 75, 24, 0, 183, 77, 24, 0, 55, 80, 24, 0, 183, 82, 24, 0, 55, 85, 24, 0, 183, 87, 24, 0, 55, 90, 24, 0, 183, 92, 24, 0, 55, 95, 24, 0, 183, 97, 24, 0, 55, 100, 24, 0, 183, 102, 24, 0, 55, 105, 24, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_get_xy_falling_trigger.json b/tests/recordings/logic_analyzer/test_get_xy_falling_trigger.json deleted file mode 100644 index c16d099e..00000000 --- a/tests/recordings/logic_analyzer/test_get_xy_falling_trigger.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [2], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 61, 1, 0, 0, 124, 2, 0, 0, 189, 3, 0, 0, 252, 4, 0, 0, 61, 6, 0, 0, 124, 7, 0, 0, 189, 8, 0, 0, 252, 9, 0, 0, 61, 11, 0, 0, 124, 12, 0, 0, 189, 13, 0, 0, 252, 14, 0, 0, 61, 16, 0, 0, 124, 17, 0, 0, 189, 18, 0, 0, 252, 19, 0, 0, 61, 21, 0, 0, 124, 22, 0, 0, 189, 23, 0, 0, 252, 24, 0, 0, 61, 26, 0, 0, 124, 27, 0, 0, 189, 28, 0, 0, 252, 29, 0, 0, 61, 31, 0, 0, 124, 32, 0, 0, 189, 33, 0, 0, 252, 34, 0, 0, 61, 36, 0, 0, 124, 37, 0, 0, 189, 38, 0, 0, 252, 39, 0, 0, 61, 41, 0, 0, 124, 42, 0, 0, 189, 43, 0, 0, 252, 44, 0, 0, 61, 46, 0, 0, 124, 47, 0, 0, 189, 48, 0, 0, 252, 49, 0, 0, 61, 51, 0, 0, 124, 52, 0, 0, 189, 53, 0, 0, 252, 54, 0, 0, 61, 56, 0, 0, 124, 57, 0, 0, 189, 58, 0, 0, 252, 59, 0, 0, 61, 61, 0, 0, 124, 62, 0, 0, 189, 63, 0, 0, 252, 64, 0, 0, 61, 66, 0, 0, 124, 67, 0, 0, 189, 68, 0, 0, 252, 69, 0, 0, 61, 71, 0, 0, 124, 72, 0, 0, 189, 73, 0, 0, 252, 74, 0, 0, 61, 76, 0, 0, 124, 77, 0, 0, 189, 78, 0, 0, 252, 79, 0, 0, 61, 81, 0, 0, 124, 82, 0, 0, 189, 83, 0, 0, 252, 84, 0, 0, 61, 86, 0, 0, 124, 87, 0, 0, 189, 88, 0, 0, 252, 89, 0, 0, 61, 91, 0, 0, 124, 92, 0, 0, 189, 93, 0, 0, 252, 94, 0, 0, 61, 96, 0, 0, 124, 97, 0, 0, 189, 98, 0, 0, 252, 99, 0, 0, 61, 101, 0, 0, 124, 102, 0, 0, 189, 103, 0, 0, 252, 104, 0, 0, 61, 106, 0, 0, 124, 107, 0, 0, 189, 108, 0, 0, 252, 109, 0, 0, 61, 111, 0, 0, 124, 112, 0, 0, 189, 113, 0, 0, 252, 114, 0, 0, 61, 116, 0, 0, 124, 117, 0, 0, 189, 118, 0, 0, 252, 119, 0, 0, 61, 121, 0, 0, 124, 122, 0, 0, 189, 123, 0, 0, 252, 124, 0, 0, 61, 126, 0, 0, 124, 127, 0, 0, 189, 128, 0, 0, 252, 129, 0, 0, 61, 131, 0, 0, 124, 132, 0, 0, 189, 133, 0, 0, 252, 134, 0, 0, 61, 136, 0, 0, 124, 137, 0, 0, 189, 138, 0, 0, 252, 139, 0, 0, 61, 141, 0, 0, 124, 142, 0, 0, 189, 143, 0, 0, 252, 144, 0, 0, 61, 146, 0, 0, 124, 147, 0, 0, 189, 148, 0, 0, 252, 149, 0, 0, 61, 151, 0, 0, 124, 152, 0, 0, 189, 153, 0, 0, 252, 154, 0, 0, 61, 156, 0, 0, 124, 157, 0, 0, 189, 158, 0, 0, 252, 159, 0, 0, 61, 161, 0, 0, 124, 162, 0, 0, 189, 163, 0, 0, 252, 164, 0, 0, 61, 166, 0, 0, 124, 167, 0, 0, 189, 168, 0, 0, 252, 169, 0, 0, 61, 171, 0, 0, 124, 172, 0, 0, 189, 173, 0, 0, 252, 174, 0, 0, 61, 176, 0, 0, 124, 177, 0, 0, 189, 178, 0, 0, 252, 179, 0, 0, 61, 181, 0, 0, 124, 182, 0, 0, 189, 183, 0, 0, 252, 184, 0, 0, 61, 186, 0, 0, 124, 187, 0, 0, 189, 188, 0, 0, 252, 189, 0, 0, 61, 191, 0, 0, 124, 192, 0, 0, 189, 193, 0, 0, 252, 194, 0, 0, 61, 196, 0, 0, 124, 197, 0, 0, 189, 198, 0, 0, 252, 199, 0, 0, 61, 201, 0, 0, 124, 202, 0, 0, 189, 203, 0, 0, 252, 204, 0, 0, 61, 206, 0, 0, 124, 207, 0, 0, 189, 208, 0, 0, 252, 209, 0, 0, 61, 211, 0, 0, 124, 212, 0, 0, 189, 213, 0, 0, 252, 214, 0, 0, 61, 216, 0, 0, 124, 217, 0, 0, 189, 218, 0, 0, 252, 219, 0, 0, 61, 221, 0, 0, 124, 222, 0, 0, 189, 223, 0, 0, 252, 224, 0, 0, 61, 226, 0, 0, 124, 227, 0, 0, 189, 228, 0, 0, 252, 229, 0, 0, 61, 231, 0, 0, 124, 232, 0, 0, 189, 233, 0, 0, 252, 234, 0, 0, 61, 236, 0, 0, 124, 237, 0, 0, 189, 238, 0, 0, 252, 239, 0, 0, 61, 241, 0, 0, 124, 242, 0, 0, 189, 243, 0, 0, 252, 244, 0, 0, 61, 246, 0, 0, 124, 247, 0, 0, 189, 248, 0, 0, 252, 249, 0, 0, 61, 251, 0, 0, 124, 252, 0, 0, 189, 253, 0, 0, 252, 254, 0, 0, 61, 0, 1, 0, 124, 1, 1, 0, 189, 2, 1, 0, 252, 3, 1, 0, 61, 5, 1, 0, 124, 6, 1, 0, 189, 7, 1, 0, 252, 8, 1, 0, 61, 10, 1, 0, 124, 11, 1, 0, 189, 12, 1, 0, 252, 13, 1, 0, 61, 15, 1, 0, 124, 16, 1, 0, 189, 17, 1, 0, 252, 18, 1, 0, 61, 20, 1, 0, 124, 21, 1, 0, 189, 22, 1, 0, 252, 23, 1, 0, 61, 25, 1, 0, 124, 26, 1, 0, 189, 27, 1, 0, 252, 28, 1, 0, 61, 30, 1, 0, 124, 31, 1, 0, 189, 32, 1, 0, 252, 33, 1, 0, 61, 35, 1, 0, 124, 36, 1, 0, 189, 37, 1, 0, 252, 38, 1, 0, 61, 40, 1, 0, 124, 41, 1, 0, 189, 42, 1, 0, 252, 43, 1, 0, 61, 45, 1, 0, 124, 46, 1, 0, 189, 47, 1, 0, 252, 48, 1, 0, 61, 50, 1, 0, 124, 51, 1, 0, 189, 52, 1, 0, 252, 53, 1, 0, 61, 55, 1, 0, 124, 56, 1, 0, 189, 57, 1, 0, 252, 58, 1, 0, 61, 60, 1, 0, 124, 61, 1, 0, 189, 62, 1, 0, 252, 63, 1, 0, 61, 65, 1, 0, 124, 66, 1, 0, 189, 67, 1, 0, 252, 68, 1, 0, 61, 70, 1, 0, 124, 71, 1, 0, 189, 72, 1, 0, 252, 73, 1, 0, 61, 75, 1, 0, 124, 76, 1, 0, 189, 77, 1, 0, 252, 78, 1, 0, 61, 80, 1, 0, 124, 81, 1, 0, 189, 82, 1, 0, 252, 83, 1, 0, 61, 85, 1, 0, 124, 86, 1, 0, 189, 87, 1, 0, 252, 88, 1, 0, 61, 90, 1, 0, 124, 91, 1, 0, 189, 92, 1, 0, 252, 93, 1, 0, 61, 95, 1, 0, 124, 96, 1, 0, 189, 97, 1, 0, 252, 98, 1, 0, 61, 100, 1, 0, 124, 101, 1, 0, 189, 102, 1, 0, 252, 103, 1, 0, 61, 105, 1, 0, 124, 106, 1, 0, 189, 107, 1, 0, 252, 108, 1, 0, 61, 110, 1, 0, 124, 111, 1, 0, 189, 112, 1, 0, 252, 113, 1, 0, 61, 115, 1, 0, 124, 116, 1, 0, 189, 117, 1, 0, 252, 118, 1, 0, 61, 120, 1, 0, 124, 121, 1, 0, 189, 122, 1, 0, 252, 123, 1, 0, 61, 125, 1, 0, 124, 126, 1, 0, 189, 127, 1, 0, 252, 128, 1, 0, 61, 130, 1, 0, 124, 131, 1, 0, 189, 132, 1, 0, 252, 133, 1, 0, 61, 135, 1, 0, 124, 136, 1, 0, 189, 137, 1, 0, 252, 138, 1, 0, 61, 140, 1, 0, 124, 141, 1, 0, 189, 142, 1, 0, 252, 143, 1, 0, 61, 145, 1, 0, 124, 146, 1, 0, 189, 147, 1, 0, 252, 148, 1, 0, 61, 150, 1, 0, 124, 151, 1, 0, 189, 152, 1, 0, 252, 153, 1, 0, 61, 155, 1, 0, 124, 156, 1, 0, 189, 157, 1, 0, 252, 158, 1, 0, 61, 160, 1, 0, 124, 161, 1, 0, 189, 162, 1, 0, 252, 163, 1, 0, 61, 165, 1, 0, 124, 166, 1, 0, 189, 167, 1, 0, 252, 168, 1, 0, 61, 170, 1, 0, 124, 171, 1, 0, 189, 172, 1, 0, 252, 173, 1, 0, 61, 175, 1, 0, 124, 176, 1, 0, 189, 177, 1, 0, 252, 178, 1, 0, 61, 180, 1, 0, 124, 181, 1, 0, 189, 182, 1, 0, 252, 183, 1, 0, 61, 185, 1, 0, 124, 186, 1, 0, 189, 187, 1, 0, 252, 188, 1, 0, 61, 190, 1, 0, 124, 191, 1, 0, 189, 192, 1, 0, 252, 193, 1, 0, 61, 195, 1, 0, 124, 196, 1, 0, 189, 197, 1, 0, 252, 198, 1, 0, 61, 200, 1, 0, 124, 201, 1, 0, 189, 202, 1, 0, 252, 203, 1, 0, 61, 205, 1, 0, 124, 206, 1, 0, 189, 207, 1, 0, 252, 208, 1, 0, 61, 210, 1, 0, 124, 211, 1, 0, 189, 212, 1, 0, 252, 213, 1, 0, 61, 215, 1, 0, 124, 216, 1, 0, 189, 217, 1, 0, 252, 218, 1, 0, 61, 220, 1, 0, 124, 221, 1, 0, 189, 222, 1, 0, 252, 223, 1, 0, 61, 225, 1, 0, 124, 226, 1, 0, 189, 227, 1, 0, 252, 228, 1, 0, 61, 230, 1, 0, 124, 231, 1, 0, 189, 232, 1, 0, 252, 233, 1, 0, 61, 235, 1, 0, 124, 236, 1, 0, 189, 237, 1, 0, 252, 238, 1, 0, 61, 240, 1, 0, 124, 241, 1, 0, 189, 242, 1, 0, 252, 243, 1, 0, 61, 245, 1, 0, 124, 246, 1, 0, 189, 247, 1, 0, 252, 248, 1, 0, 61, 250, 1, 0, 124, 251, 1, 0, 189, 252, 1, 0, 252, 253, 1, 0, 61, 255, 1, 0, 124, 0, 2, 0, 189, 1, 2, 0, 252, 2, 2, 0, 61, 4, 2, 0, 124, 5, 2, 0, 189, 6, 2, 0, 252, 7, 2, 0, 61, 9, 2, 0, 124, 10, 2, 0, 189, 11, 2, 0, 252, 12, 2, 0, 61, 14, 2, 0, 124, 15, 2, 0, 189, 16, 2, 0, 252, 17, 2, 0, 61, 19, 2, 0, 124, 20, 2, 0, 189, 21, 2, 0, 252, 22, 2, 0, 61, 24, 2, 0, 124, 25, 2, 0, 189, 26, 2, 0, 252, 27, 2, 0, 61, 29, 2, 0, 124, 30, 2, 0, 189, 31, 2, 0, 252, 32, 2, 0, 61, 34, 2, 0, 124, 35, 2, 0, 189, 36, 2, 0, 252, 37, 2, 0, 61, 39, 2, 0, 124, 40, 2, 0, 189, 41, 2, 0, 252, 42, 2, 0, 61, 44, 2, 0, 124, 45, 2, 0, 189, 46, 2, 0, 252, 47, 2, 0, 61, 49, 2, 0, 124, 50, 2, 0, 189, 51, 2, 0, 252, 52, 2, 0, 61, 54, 2, 0, 124, 55, 2, 0, 189, 56, 2, 0, 252, 57, 2, 0, 61, 59, 2, 0, 124, 60, 2, 0, 189, 61, 2, 0, 252, 62, 2, 0, 61, 64, 2, 0, 124, 65, 2, 0, 189, 66, 2, 0, 252, 67, 2, 0, 61, 69, 2, 0, 124, 70, 2, 0, 189, 71, 2, 0, 252, 72, 2, 0, 61, 74, 2, 0, 124, 75, 2, 0, 189, 76, 2, 0, 252, 77, 2, 0, 61, 79, 2, 0, 124, 80, 2, 0, 189, 81, 2, 0, 252, 82, 2, 0, 61, 84, 2, 0, 124, 85, 2, 0, 189, 86, 2, 0, 252, 87, 2, 0, 61, 89, 2, 0, 124, 90, 2, 0, 189, 91, 2, 0, 252, 92, 2, 0, 61, 94, 2, 0, 124, 95, 2, 0, 189, 96, 2, 0, 252, 97, 2, 0, 61, 99, 2, 0, 124, 100, 2, 0, 189, 101, 2, 0, 252, 102, 2, 0, 61, 104, 2, 0, 124, 105, 2, 0, 189, 106, 2, 0, 252, 107, 2, 0, 61, 109, 2, 0, 124, 110, 2, 0, 189, 111, 2, 0, 252, 112, 2, 0, 61, 114, 2, 0, 124, 115, 2, 0, 189, 116, 2, 0, 252, 117, 2, 0, 61, 119, 2, 0, 124, 120, 2, 0, 189, 121, 2, 0, 252, 122, 2, 0, 61, 124, 2, 0, 124, 125, 2, 0, 189, 126, 2, 0, 252, 127, 2, 0, 61, 129, 2, 0, 124, 130, 2, 0, 189, 131, 2, 0, 252, 132, 2, 0, 61, 134, 2, 0, 124, 135, 2, 0, 189, 136, 2, 0, 252, 137, 2, 0, 61, 139, 2, 0, 124, 140, 2, 0, 189, 141, 2, 0, 252, 142, 2, 0, 61, 144, 2, 0, 124, 145, 2, 0, 189, 146, 2, 0, 252, 147, 2, 0, 61, 149, 2, 0, 124, 150, 2, 0, 189, 151, 2, 0, 252, 152, 2, 0, 61, 154, 2, 0, 124, 155, 2, 0, 189, 156, 2, 0, 252, 157, 2, 0, 61, 159, 2, 0, 124, 160, 2, 0, 189, 161, 2, 0, 252, 162, 2, 0, 61, 164, 2, 0, 124, 165, 2, 0, 189, 166, 2, 0, 252, 167, 2, 0, 61, 169, 2, 0, 124, 170, 2, 0, 189, 171, 2, 0, 252, 172, 2, 0, 61, 174, 2, 0, 124, 175, 2, 0, 189, 176, 2, 0, 252, 177, 2, 0, 61, 179, 2, 0, 124, 180, 2, 0, 189, 181, 2, 0, 252, 182, 2, 0, 61, 184, 2, 0, 124, 185, 2, 0, 189, 186, 2, 0, 252, 187, 2, 0, 61, 189, 2, 0, 124, 190, 2, 0, 189, 191, 2, 0, 252, 192, 2, 0, 61, 194, 2, 0, 124, 195, 2, 0, 189, 196, 2, 0, 252, 197, 2, 0, 61, 199, 2, 0, 124, 200, 2, 0, 189, 201, 2, 0, 252, 202, 2, 0, 61, 204, 2, 0, 124, 205, 2, 0, 189, 206, 2, 0, 252, 207, 2, 0, 61, 209, 2, 0, 124, 210, 2, 0, 189, 211, 2, 0, 252, 212, 2, 0, 61, 214, 2, 0, 124, 215, 2, 0, 189, 216, 2, 0, 252, 217, 2, 0, 61, 219, 2, 0, 124, 220, 2, 0, 189, 221, 2, 0, 252, 222, 2, 0, 61, 224, 2, 0, 124, 225, 2, 0, 189, 226, 2, 0, 252, 227, 2, 0, 61, 229, 2, 0, 124, 230, 2, 0, 189, 231, 2, 0, 252, 232, 2, 0, 61, 234, 2, 0, 124, 235, 2, 0, 189, 236, 2, 0, 252, 237, 2, 0, 61, 239, 2, 0, 124, 240, 2, 0, 189, 241, 2, 0, 252, 242, 2, 0, 61, 244, 2, 0, 124, 245, 2, 0, 189, 246, 2, 0, 252, 247, 2, 0, 61, 249, 2, 0, 124, 250, 2, 0, 189, 251, 2, 0, 252, 252, 2, 0, 61, 254, 2, 0, 124, 255, 2, 0, 189, 0, 3, 0, 252, 1, 3, 0, 61, 3, 3, 0, 124, 4, 3, 0, 189, 5, 3, 0, 252, 6, 3, 0, 61, 8, 3, 0, 124, 9, 3, 0, 189, 10, 3, 0, 252, 11, 3, 0, 61, 13, 3, 0, 124, 14, 3, 0, 189, 15, 3, 0, 252, 16, 3, 0, 61, 18, 3, 0, 124, 19, 3, 0, 189, 20, 3, 0, 252, 21, 3, 0, 61, 23, 3, 0, 124, 24, 3, 0, 189, 25, 3, 0, 252, 26, 3, 0, 61, 28, 3, 0, 124, 29, 3, 0, 189, 30, 3, 0, 252, 31, 3, 0, 61, 33, 3, 0, 124, 34, 3, 0, 189, 35, 3, 0, 252, 36, 3, 0, 61, 38, 3, 0, 124, 39, 3, 0, 189, 40, 3, 0, 252, 41, 3, 0, 61, 43, 3, 0, 124, 44, 3, 0, 189, 45, 3, 0, 252, 46, 3, 0, 61, 48, 3, 0, 124, 49, 3, 0, 189, 50, 3, 0, 252, 51, 3, 0, 61, 53, 3, 0, 124, 54, 3, 0, 189, 55, 3, 0, 252, 56, 3, 0, 61, 58, 3, 0, 124, 59, 3, 0, 189, 60, 3, 0, 252, 61, 3, 0, 61, 63, 3, 0, 124, 64, 3, 0, 189, 65, 3, 0, 252, 66, 3, 0, 61, 68, 3, 0, 124, 69, 3, 0, 189, 70, 3, 0, 252, 71, 3, 0, 61, 73, 3, 0, 124, 74, 3, 0, 189, 75, 3, 0, 252, 76, 3, 0, 61, 78, 3, 0, 124, 79, 3, 0, 189, 80, 3, 0, 252, 81, 3, 0, 61, 83, 3, 0, 124, 84, 3, 0, 189, 85, 3, 0, 252, 86, 3, 0, 61, 88, 3, 0, 124, 89, 3, 0, 189, 90, 3, 0, 252, 91, 3, 0, 61, 93, 3, 0, 124, 94, 3, 0, 189, 95, 3, 0, 252, 96, 3, 0, 61, 98, 3, 0, 124, 99, 3, 0, 189, 100, 3, 0, 252, 101, 3, 0, 61, 103, 3, 0, 124, 104, 3, 0, 189, 105, 3, 0, 252, 106, 3, 0, 61, 108, 3, 0, 124, 109, 3, 0, 189, 110, 3, 0, 252, 111, 3, 0, 61, 113, 3, 0, 124, 114, 3, 0, 189, 115, 3, 0, 252, 116, 3, 0, 61, 118, 3, 0, 124, 119, 3, 0, 189, 120, 3, 0, 252, 121, 3, 0, 61, 123, 3, 0, 124, 124, 3, 0, 189, 125, 3, 0, 252, 126, 3, 0, 61, 128, 3, 0, 124, 129, 3, 0, 189, 130, 3, 0, 252, 131, 3, 0, 61, 133, 3, 0, 124, 134, 3, 0, 189, 135, 3, 0, 252, 136, 3, 0, 61, 138, 3, 0, 124, 139, 3, 0, 189, 140, 3, 0, 252, 141, 3, 0, 61, 143, 3, 0, 124, 144, 3, 0, 189, 145, 3, 0, 252, 146, 3, 0, 61, 148, 3, 0, 124, 149, 3, 0, 189, 150, 3, 0, 252, 151, 3, 0, 61, 153, 3, 0, 124, 154, 3, 0, 189, 155, 3, 0, 252, 156, 3, 0, 61, 158, 3, 0, 124, 159, 3, 0, 189, 160, 3, 0, 252, 161, 3, 0, 61, 163, 3, 0, 124, 164, 3, 0, 189, 165, 3, 0, 252, 166, 3, 0, 61, 168, 3, 0, 124, 169, 3, 0, 189, 170, 3, 0, 252, 171, 3, 0, 61, 173, 3, 0, 124, 174, 3, 0, 189, 175, 3, 0, 252, 176, 3, 0, 61, 178, 3, 0, 124, 179, 3, 0, 189, 180, 3, 0, 252, 181, 3, 0, 61, 183, 3, 0, 124, 184, 3, 0, 189, 185, 3, 0, 252, 186, 3, 0, 61, 188, 3, 0, 124, 189, 3, 0, 189, 190, 3, 0, 252, 191, 3, 0, 61, 193, 3, 0, 124, 194, 3, 0, 189, 195, 3, 0, 252, 196, 3, 0, 61, 198, 3, 0, 124, 199, 3, 0, 189, 200, 3, 0, 252, 201, 3, 0, 61, 203, 3, 0, 124, 204, 3, 0, 189, 205, 3, 0, 252, 206, 3, 0, 61, 208, 3, 0, 124, 209, 3, 0, 189, 210, 3, 0, 252, 211, 3, 0, 61, 213, 3, 0, 124, 214, 3, 0, 189, 215, 3, 0, 252, 216, 3, 0, 61, 218, 3, 0, 124, 219, 3, 0, 189, 220, 3, 0, 252, 221, 3, 0, 61, 223, 3, 0, 124, 224, 3, 0, 189, 225, 3, 0, 252, 226, 3, 0, 61, 228, 3, 0, 124, 229, 3, 0, 189, 230, 3, 0, 252, 231, 3, 0, 61, 233, 3, 0, 124, 234, 3, 0, 189, 235, 3, 0, 252, 236, 3, 0, 61, 238, 3, 0, 124, 239, 3, 0, 189, 240, 3, 0, 252, 241, 3, 0, 61, 243, 3, 0, 124, 244, 3, 0, 189, 245, 3, 0, 252, 246, 3, 0, 61, 248, 3, 0, 124, 249, 3, 0, 189, 250, 3, 0, 252, 251, 3, 0, 61, 253, 3, 0, 124, 254, 3, 0, 189, 255, 3, 0, 252, 0, 4, 0, 61, 2, 4, 0, 124, 3, 4, 0, 189, 4, 4, 0, 252, 5, 4, 0, 61, 7, 4, 0, 124, 8, 4, 0, 189, 9, 4, 0, 252, 10, 4, 0, 61, 12, 4, 0, 124, 13, 4, 0, 189, 14, 4, 0, 252, 15, 4, 0, 61, 17, 4, 0, 124, 18, 4, 0, 189, 19, 4, 0, 252, 20, 4, 0, 61, 22, 4, 0, 124, 23, 4, 0, 189, 24, 4, 0, 252, 25, 4, 0, 61, 27, 4, 0, 124, 28, 4, 0, 189, 29, 4, 0, 252, 30, 4, 0, 61, 32, 4, 0, 124, 33, 4, 0, 189, 34, 4, 0, 252, 35, 4, 0, 61, 37, 4, 0, 124, 38, 4, 0, 189, 39, 4, 0, 252, 40, 4, 0, 61, 42, 4, 0, 124, 43, 4, 0, 189, 44, 4, 0, 252, 45, 4, 0, 61, 47, 4, 0, 124, 48, 4, 0, 189, 49, 4, 0, 252, 50, 4, 0, 61, 52, 4, 0, 124, 53, 4, 0, 189, 54, 4, 0, 252, 55, 4, 0, 61, 57, 4, 0, 124, 58, 4, 0, 189, 59, 4, 0, 252, 60, 4, 0, 61, 62, 4, 0, 124, 63, 4, 0, 189, 64, 4, 0, 252, 65, 4, 0, 61, 67, 4, 0, 124, 68, 4, 0, 189, 69, 4, 0, 252, 70, 4, 0, 61, 72, 4, 0, 124, 73, 4, 0, 189, 74, 4, 0, 252, 75, 4, 0, 61, 77, 4, 0, 124, 78, 4, 0, 189, 79, 4, 0, 252, 80, 4, 0, 61, 82, 4, 0, 124, 83, 4, 0, 189, 84, 4, 0, 252, 85, 4, 0, 61, 87, 4, 0, 124, 88, 4, 0, 189, 89, 4, 0, 252, 90, 4, 0, 61, 92, 4, 0, 124, 93, 4, 0, 189, 94, 4, 0, 252, 95, 4, 0, 61, 97, 4, 0, 124, 98, 4, 0, 189, 99, 4, 0, 252, 100, 4, 0, 61, 102, 4, 0, 124, 103, 4, 0, 189, 104, 4, 0, 252, 105, 4, 0, 61, 107, 4, 0, 124, 108, 4, 0, 189, 109, 4, 0, 252, 110, 4, 0, 61, 112, 4, 0, 124, 113, 4, 0, 189, 114, 4, 0, 252, 115, 4, 0, 61, 117, 4, 0, 124, 118, 4, 0, 189, 119, 4, 0, 252, 120, 4, 0, 61, 122, 4, 0, 124, 123, 4, 0, 189, 124, 4, 0, 252, 125, 4, 0, 61, 127, 4, 0, 124, 128, 4, 0, 189, 129, 4, 0, 252, 130, 4, 0, 61, 132, 4, 0, 124, 133, 4, 0, 189, 134, 4, 0, 252, 135, 4, 0, 61, 137, 4, 0, 124, 138, 4, 0, 189, 139, 4, 0, 252, 140, 4, 0, 61, 142, 4, 0, 124, 143, 4, 0, 189, 144, 4, 0, 252, 145, 4, 0, 61, 147, 4, 0, 124, 148, 4, 0, 189, 149, 4, 0, 252, 150, 4, 0, 61, 152, 4, 0, 124, 153, 4, 0, 189, 154, 4, 0, 252, 155, 4, 0, 61, 157, 4, 0, 124, 158, 4, 0, 189, 159, 4, 0, 252, 160, 4, 0, 61, 162, 4, 0, 124, 163, 4, 0, 189, 164, 4, 0, 252, 165, 4, 0, 61, 167, 4, 0, 124, 168, 4, 0, 189, 169, 4, 0, 252, 170, 4, 0, 61, 172, 4, 0, 124, 173, 4, 0, 189, 174, 4, 0, 252, 175, 4, 0, 61, 177, 4, 0, 124, 178, 4, 0, 189, 179, 4, 0, 252, 180, 4, 0, 61, 182, 4, 0, 124, 183, 4, 0, 189, 184, 4, 0, 252, 185, 4, 0, 61, 187, 4, 0, 124, 188, 4, 0, 189, 189, 4, 0, 252, 190, 4, 0, 61, 192, 4, 0, 124, 193, 4, 0, 189, 194, 4, 0, 252, 195, 4, 0, 61, 197, 4, 0, 124, 198, 4, 0, 189, 199, 4, 0, 252, 200, 4, 0, 61, 202, 4, 0, 124, 203, 4, 0, 189, 204, 4, 0, 252, 205, 4, 0, 61, 207, 4, 0, 124, 208, 4, 0, 189, 209, 4, 0, 252, 210, 4, 0, 61, 212, 4, 0, 124, 213, 4, 0, 189, 214, 4, 0, 252, 215, 4, 0, 61, 217, 4, 0, 124, 218, 4, 0, 189, 219, 4, 0, 252, 220, 4, 0, 61, 222, 4, 0, 124, 223, 4, 0, 189, 224, 4, 0, 252, 225, 4, 0, 61, 227, 4, 0, 124, 228, 4, 0, 189, 229, 4, 0, 252, 230, 4, 0, 61, 232, 4, 0, 124, 233, 4, 0, 189, 234, 4, 0, 252, 235, 4, 0, 61, 237, 4, 0, 124, 238, 4, 0, 189, 239, 4, 0, 252, 240, 4, 0, 61, 242, 4, 0, 124, 243, 4, 0, 189, 244, 4, 0, 252, 245, 4, 0, 61, 247, 4, 0, 124, 248, 4, 0, 189, 249, 4, 0, 252, 250, 4, 0, 61, 252, 4, 0, 124, 253, 4, 0, 189, 254, 4, 0, 252, 255, 4, 0, 61, 1, 5, 0, 124, 2, 5, 0, 189, 3, 5, 0, 252, 4, 5, 0, 61, 6, 5, 0, 124, 7, 5, 0, 189, 8, 5, 0, 252, 9, 5, 0, 61, 11, 5, 0, 124, 12, 5, 0, 189, 13, 5, 0, 252, 14, 5, 0, 61, 16, 5, 0, 124, 17, 5, 0, 189, 18, 5, 0, 252, 19, 5, 0, 61, 21, 5, 0, 124, 22, 5, 0, 189, 23, 5, 0, 252, 24, 5, 0, 61, 26, 5, 0, 124, 27, 5, 0, 189, 28, 5, 0, 252, 29, 5, 0, 61, 31, 5, 0, 124, 32, 5, 0, 189, 33, 5, 0, 252, 34, 5, 0, 61, 36, 5, 0, 124, 37, 5, 0, 189, 38, 5, 0, 252, 39, 5, 0, 61, 41, 5, 0, 124, 42, 5, 0, 189, 43, 5, 0, 252, 44, 5, 0, 61, 46, 5, 0, 124, 47, 5, 0, 189, 48, 5, 0, 252, 49, 5, 0, 61, 51, 5, 0, 124, 52, 5, 0, 189, 53, 5, 0, 252, 54, 5, 0, 61, 56, 5, 0, 124, 57, 5, 0, 189, 58, 5, 0, 252, 59, 5, 0, 61, 61, 5, 0, 124, 62, 5, 0, 189, 63, 5, 0, 252, 64, 5, 0, 61, 66, 5, 0, 124, 67, 5, 0, 189, 68, 5, 0, 252, 69, 5, 0, 61, 71, 5, 0, 124, 72, 5, 0, 189, 73, 5, 0, 252, 74, 5, 0, 61, 76, 5, 0, 124, 77, 5, 0, 189, 78, 5, 0, 252, 79, 5, 0, 61, 81, 5, 0, 124, 82, 5, 0, 189, 83, 5, 0, 252, 84, 5, 0, 61, 86, 5, 0, 124, 87, 5, 0, 189, 88, 5, 0, 252, 89, 5, 0, 61, 91, 5, 0, 124, 92, 5, 0, 189, 93, 5, 0, 252, 94, 5, 0, 61, 96, 5, 0, 124, 97, 5, 0, 189, 98, 5, 0, 252, 99, 5, 0, 61, 101, 5, 0, 124, 102, 5, 0, 189, 103, 5, 0, 252, 104, 5, 0, 61, 106, 5, 0, 124, 107, 5, 0, 189, 108, 5, 0, 252, 109, 5, 0, 61, 111, 5, 0, 124, 112, 5, 0, 189, 113, 5, 0, 252, 114, 5, 0, 61, 116, 5, 0, 124, 117, 5, 0, 189, 118, 5, 0, 252, 119, 5, 0, 61, 121, 5, 0, 124, 122, 5, 0, 189, 123, 5, 0, 252, 124, 5, 0, 61, 126, 5, 0, 124, 127, 5, 0, 189, 128, 5, 0, 252, 129, 5, 0, 61, 131, 5, 0, 124, 132, 5, 0, 189, 133, 5, 0, 252, 134, 5, 0, 61, 136, 5, 0, 124, 137, 5, 0, 189, 138, 5, 0, 252, 139, 5, 0, 61, 141, 5, 0, 124, 142, 5, 0, 189, 143, 5, 0, 252, 144, 5, 0, 61, 146, 5, 0, 124, 147, 5, 0, 189, 148, 5, 0, 252, 149, 5, 0, 61, 151, 5, 0, 124, 152, 5, 0, 189, 153, 5, 0, 252, 154, 5, 0, 61, 156, 5, 0, 124, 157, 5, 0, 189, 158, 5, 0, 252, 159, 5, 0, 61, 161, 5, 0, 124, 162, 5, 0, 189, 163, 5, 0, 252, 164, 5, 0, 61, 166, 5, 0, 124, 167, 5, 0, 189, 168, 5, 0, 252, 169, 5, 0, 61, 171, 5, 0, 124, 172, 5, 0, 189, 173, 5, 0, 252, 174, 5, 0, 61, 176, 5, 0, 124, 177, 5, 0, 189, 178, 5, 0, 252, 179, 5, 0, 61, 181, 5, 0, 124, 182, 5, 0, 189, 183, 5, 0, 252, 184, 5, 0, 61, 186, 5, 0, 124, 187, 5, 0, 189, 188, 5, 0, 252, 189, 5, 0, 61, 191, 5, 0, 124, 192, 5, 0, 189, 193, 5, 0, 252, 194, 5, 0, 61, 196, 5, 0, 124, 197, 5, 0, 189, 198, 5, 0, 252, 199, 5, 0, 61, 201, 5, 0, 124, 202, 5, 0, 189, 203, 5, 0, 252, 204, 5, 0, 61, 206, 5, 0, 124, 207, 5, 0, 189, 208, 5, 0, 252, 209, 5, 0, 61, 211, 5, 0, 124, 212, 5, 0, 189, 213, 5, 0, 252, 214, 5, 0, 61, 216, 5, 0, 124, 217, 5, 0, 189, 218, 5, 0, 252, 219, 5, 0, 61, 221, 5, 0, 124, 222, 5, 0, 189, 223, 5, 0, 252, 224, 5, 0, 61, 226, 5, 0, 124, 227, 5, 0, 189, 228, 5, 0, 252, 229, 5, 0, 61, 231, 5, 0, 124, 232, 5, 0, 189, 233, 5, 0, 252, 234, 5, 0, 61, 236, 5, 0, 124, 237, 5, 0, 189, 238, 5, 0, 252, 239, 5, 0, 61, 241, 5, 0, 124, 242, 5, 0, 189, 243, 5, 0, 252, 244, 5, 0, 61, 246, 5, 0, 124, 247, 5, 0, 189, 248, 5, 0, 252, 249, 5, 0, 61, 251, 5, 0, 124, 252, 5, 0, 189, 253, 5, 0, 252, 254, 5, 0, 61, 0, 6, 0, 124, 1, 6, 0, 189, 2, 6, 0, 252, 3, 6, 0, 61, 5, 6, 0, 124, 6, 6, 0, 189, 7, 6, 0, 252, 8, 6, 0, 61, 10, 6, 0, 124, 11, 6, 0, 189, 12, 6, 0, 252, 13, 6, 0, 61, 15, 6, 0, 124, 16, 6, 0, 189, 17, 6, 0, 252, 18, 6, 0, 61, 20, 6, 0, 124, 21, 6, 0, 189, 22, 6, 0, 252, 23, 6, 0, 61, 25, 6, 0, 124, 26, 6, 0, 189, 27, 6, 0, 252, 28, 6, 0, 61, 30, 6, 0, 124, 31, 6, 0, 189, 32, 6, 0, 252, 33, 6, 0, 61, 35, 6, 0, 124, 36, 6, 0, 189, 37, 6, 0, 252, 38, 6, 0, 61, 40, 6, 0, 124, 41, 6, 0, 189, 42, 6, 0, 252, 43, 6, 0, 61, 45, 6, 0, 124, 46, 6, 0, 189, 47, 6, 0, 252, 48, 6, 0, 61, 50, 6, 0, 124, 51, 6, 0, 189, 52, 6, 0, 252, 53, 6, 0, 61, 55, 6, 0, 124, 56, 6, 0, 189, 57, 6, 0, 252, 58, 6, 0, 61, 60, 6, 0, 124, 61, 6, 0, 189, 62, 6, 0, 252, 63, 6, 0, 61, 65, 6, 0, 124, 66, 6, 0, 189, 67, 6, 0, 252, 68, 6, 0, 61, 70, 6, 0, 124, 71, 6, 0, 189, 72, 6, 0, 252, 73, 6, 0, 61, 75, 6, 0, 124, 76, 6, 0, 189, 77, 6, 0, 252, 78, 6, 0, 61, 80, 6, 0, 124, 81, 6, 0, 189, 82, 6, 0, 252, 83, 6, 0, 61, 85, 6, 0, 124, 86, 6, 0, 189, 87, 6, 0, 252, 88, 6, 0, 61, 90, 6, 0, 124, 91, 6, 0, 189, 92, 6, 0, 252, 93, 6, 0, 61, 95, 6, 0, 124, 96, 6, 0, 189, 97, 6, 0, 252, 98, 6, 0, 61, 100, 6, 0, 124, 101, 6, 0, 189, 102, 6, 0, 252, 103, 6, 0, 61, 105, 6, 0, 124, 106, 6, 0, 189, 107, 6, 0, 252, 108, 6, 0, 61, 110, 6, 0, 124, 111, 6, 0, 189, 112, 6, 0, 252, 113, 6, 0, 61, 115, 6, 0, 124, 116, 6, 0, 189, 117, 6, 0, 252, 118, 6, 0, 61, 120, 6, 0, 124, 121, 6, 0, 189, 122, 6, 0, 252, 123, 6, 0, 61, 125, 6, 0, 124, 126, 6, 0, 189, 127, 6, 0, 252, 128, 6, 0, 61, 130, 6, 0, 124, 131, 6, 0, 189, 132, 6, 0, 252, 133, 6, 0, 61, 135, 6, 0, 124, 136, 6, 0, 189, 137, 6, 0, 252, 138, 6, 0, 61, 140, 6, 0, 124, 141, 6, 0, 189, 142, 6, 0, 252, 143, 6, 0, 61, 145, 6, 0, 124, 146, 6, 0, 189, 147, 6, 0, 252, 148, 6, 0, 61, 150, 6, 0, 124, 151, 6, 0, 189, 152, 6, 0, 252, 153, 6, 0, 61, 155, 6, 0, 124, 156, 6, 0, 189, 157, 6, 0, 252, 158, 6, 0, 61, 160, 6, 0, 124, 161, 6, 0, 189, 162, 6, 0, 252, 163, 6, 0, 61, 165, 6, 0, 124, 166, 6, 0, 189, 167, 6, 0, 252, 168, 6, 0, 61, 170, 6, 0, 124, 171, 6, 0, 189, 172, 6, 0, 252, 173, 6, 0, 61, 175, 6, 0, 124, 176, 6, 0, 189, 177, 6, 0, 252, 178, 6, 0, 61, 180, 6, 0, 124, 181, 6, 0, 189, 182, 6, 0, 252, 183, 6, 0, 61, 185, 6, 0, 124, 186, 6, 0, 189, 187, 6, 0, 252, 188, 6, 0, 61, 190, 6, 0, 124, 191, 6, 0, 189, 192, 6, 0, 252, 193, 6, 0, 61, 195, 6, 0, 124, 196, 6, 0, 189, 197, 6, 0, 252, 198, 6, 0, 61, 200, 6, 0, 124, 201, 6, 0, 189, 202, 6, 0, 252, 203, 6, 0, 61, 205, 6, 0, 124, 206, 6, 0, 189, 207, 6, 0, 252, 208, 6, 0, 61, 210, 6, 0, 124, 211, 6, 0, 189, 212, 6, 0, 252, 213, 6, 0, 61, 215, 6, 0, 124, 216, 6, 0, 189, 217, 6, 0, 252, 218, 6, 0, 61, 220, 6, 0, 124, 221, 6, 0, 189, 222, 6, 0, 252, 223, 6, 0, 61, 225, 6, 0, 124, 226, 6, 0, 189, 227, 6, 0, 252, 228, 6, 0, 61, 230, 6, 0, 124, 231, 6, 0, 189, 232, 6, 0, 252, 233, 6, 0, 61, 235, 6, 0, 124, 236, 6, 0, 189, 237, 6, 0, 252, 238, 6, 0, 61, 240, 6, 0, 124, 241, 6, 0, 189, 242, 6, 0, 252, 243, 6, 0, 61, 245, 6, 0, 124, 246, 6, 0, 189, 247, 6, 0, 252, 248, 6, 0, 61, 250, 6, 0, 124, 251, 6, 0, 189, 252, 6, 0, 252, 253, 6, 0, 61, 255, 6, 0, 124, 0, 7, 0, 189, 1, 7, 0, 252, 2, 7, 0, 61, 4, 7, 0, 124, 5, 7, 0, 189, 6, 7, 0, 252, 7, 7, 0, 61, 9, 7, 0, 124, 10, 7, 0, 189, 11, 7, 0, 252, 12, 7, 0, 61, 14, 7, 0, 124, 15, 7, 0, 189, 16, 7, 0, 252, 17, 7, 0, 61, 19, 7, 0, 124, 20, 7, 0, 189, 21, 7, 0, 252, 22, 7, 0, 61, 24, 7, 0, 124, 25, 7, 0, 189, 26, 7, 0, 252, 27, 7, 0, 61, 29, 7, 0, 124, 30, 7, 0, 189, 31, 7, 0, 252, 32, 7, 0, 61, 34, 7, 0, 124, 35, 7, 0, 189, 36, 7, 0, 252, 37, 7, 0, 61, 39, 7, 0, 124, 40, 7, 0, 189, 41, 7, 0, 252, 42, 7, 0, 61, 44, 7, 0, 124, 45, 7, 0, 189, 46, 7, 0, 252, 47, 7, 0, 61, 49, 7, 0, 124, 50, 7, 0, 189, 51, 7, 0, 252, 52, 7, 0, 61, 54, 7, 0, 124, 55, 7, 0, 189, 56, 7, 0, 252, 57, 7, 0, 61, 59, 7, 0, 124, 60, 7, 0, 189, 61, 7, 0, 252, 62, 7, 0, 61, 64, 7, 0, 124, 65, 7, 0, 189, 66, 7, 0, 252, 67, 7, 0, 61, 69, 7, 0, 124, 70, 7, 0, 189, 71, 7, 0, 252, 72, 7, 0, 61, 74, 7, 0, 124, 75, 7, 0, 189, 76, 7, 0, 252, 77, 7, 0, 61, 79, 7, 0, 124, 80, 7, 0, 189, 81, 7, 0, 252, 82, 7, 0, 61, 84, 7, 0, 124, 85, 7, 0, 189, 86, 7, 0, 252, 87, 7, 0, 61, 89, 7, 0, 124, 90, 7, 0, 189, 91, 7, 0, 252, 92, 7, 0, 61, 94, 7, 0, 124, 95, 7, 0, 189, 96, 7, 0, 252, 97, 7, 0, 61, 99, 7, 0, 124, 100, 7, 0, 189, 101, 7, 0, 252, 102, 7, 0, 61, 104, 7, 0, 124, 105, 7, 0, 189, 106, 7, 0, 252, 107, 7, 0, 61, 109, 7, 0, 124, 110, 7, 0, 189, 111, 7, 0, 252, 112, 7, 0, 61, 114, 7, 0, 124, 115, 7, 0, 189, 116, 7, 0, 252, 117, 7, 0, 61, 119, 7, 0, 124, 120, 7, 0, 189, 121, 7, 0, 252, 122, 7, 0, 61, 124, 7, 0, 124, 125, 7, 0, 189, 126, 7, 0, 252, 127, 7, 0, 61, 129, 7, 0, 124, 130, 7, 0, 189, 131, 7, 0, 252, 132, 7, 0, 61, 134, 7, 0, 124, 135, 7, 0, 189, 136, 7, 0, 252, 137, 7, 0, 61, 139, 7, 0, 124, 140, 7, 0, 189, 141, 7, 0, 252, 142, 7, 0, 61, 144, 7, 0, 124, 145, 7, 0, 189, 146, 7, 0, 252, 147, 7, 0, 61, 149, 7, 0, 124, 150, 7, 0, 189, 151, 7, 0, 252, 152, 7, 0, 61, 154, 7, 0, 124, 155, 7, 0, 189, 156, 7, 0, 252, 157, 7, 0, 61, 159, 7, 0, 124, 160, 7, 0, 189, 161, 7, 0, 252, 162, 7, 0, 61, 164, 7, 0, 124, 165, 7, 0, 189, 166, 7, 0, 252, 167, 7, 0, 61, 169, 7, 0, 124, 170, 7, 0, 189, 171, 7, 0, 252, 172, 7, 0, 61, 174, 7, 0, 124, 175, 7, 0, 189, 176, 7, 0, 252, 177, 7, 0, 61, 179, 7, 0, 124, 180, 7, 0, 189, 181, 7, 0, 252, 182, 7, 0, 61, 184, 7, 0, 124, 185, 7, 0, 189, 186, 7, 0, 252, 187, 7, 0, 61, 189, 7, 0, 124, 190, 7, 0, 189, 191, 7, 0, 252, 192, 7, 0, 61, 194, 7, 0, 124, 195, 7, 0, 189, 196, 7, 0, 252, 197, 7, 0, 61, 199, 7, 0, 124, 200, 7, 0, 189, 201, 7, 0, 252, 202, 7, 0, 61, 204, 7, 0, 124, 205, 7, 0, 189, 206, 7, 0, 252, 207, 7, 0, 61, 209, 7, 0, 124, 210, 7, 0, 189, 211, 7, 0, 252, 212, 7, 0, 61, 214, 7, 0, 124, 215, 7, 0, 189, 216, 7, 0, 252, 217, 7, 0, 61, 219, 7, 0, 124, 220, 7, 0, 189, 221, 7, 0, 252, 222, 7, 0, 61, 224, 7, 0, 124, 225, 7, 0, 189, 226, 7, 0, 252, 227, 7, 0, 61, 229, 7, 0, 124, 230, 7, 0, 189, 231, 7, 0, 252, 232, 7, 0, 61, 234, 7, 0, 124, 235, 7, 0, 189, 236, 7, 0, 252, 237, 7, 0, 61, 239, 7, 0, 124, 240, 7, 0, 189, 241, 7, 0, 252, 242, 7, 0, 61, 244, 7, 0, 124, 245, 7, 0, 189, 246, 7, 0, 252, 247, 7, 0, 61, 249, 7, 0, 124, 250, 7, 0, 189, 251, 7, 0, 252, 252, 7, 0, 61, 254, 7, 0, 124, 255, 7, 0, 189, 0, 8, 0, 252, 1, 8, 0, 61, 3, 8, 0, 124, 4, 8, 0, 189, 5, 8, 0, 252, 6, 8, 0, 61, 8, 8, 0, 124, 9, 8, 0, 189, 10, 8, 0, 252, 11, 8, 0, 61, 13, 8, 0, 124, 14, 8, 0, 189, 15, 8, 0, 252, 16, 8, 0, 61, 18, 8, 0, 124, 19, 8, 0, 189, 20, 8, 0, 252, 21, 8, 0, 61, 23, 8, 0, 124, 24, 8, 0, 189, 25, 8, 0, 252, 26, 8, 0, 61, 28, 8, 0, 124, 29, 8, 0, 189, 30, 8, 0, 252, 31, 8, 0, 61, 33, 8, 0, 124, 34, 8, 0, 189, 35, 8, 0, 252, 36, 8, 0, 61, 38, 8, 0, 124, 39, 8, 0, 189, 40, 8, 0, 252, 41, 8, 0, 61, 43, 8, 0, 124, 44, 8, 0, 189, 45, 8, 0, 252, 46, 8, 0, 61, 48, 8, 0, 124, 49, 8, 0, 189, 50, 8, 0, 252, 51, 8, 0, 61, 53, 8, 0, 124, 54, 8, 0, 189, 55, 8, 0, 252, 56, 8, 0, 61, 58, 8, 0, 124, 59, 8, 0, 189, 60, 8, 0, 252, 61, 8, 0, 61, 63, 8, 0, 124, 64, 8, 0, 189, 65, 8, 0, 252, 66, 8, 0, 61, 68, 8, 0, 124, 69, 8, 0, 189, 70, 8, 0, 252, 71, 8, 0, 61, 73, 8, 0, 124, 74, 8, 0, 189, 75, 8, 0, 252, 76, 8, 0, 61, 78, 8, 0, 124, 79, 8, 0, 189, 80, 8, 0, 252, 81, 8, 0, 61, 83, 8, 0, 124, 84, 8, 0, 189, 85, 8, 0, 252, 86, 8, 0, 61, 88, 8, 0, 124, 89, 8, 0, 189, 90, 8, 0, 252, 91, 8, 0, 61, 93, 8, 0, 124, 94, 8, 0, 189, 95, 8, 0, 252, 96, 8, 0, 61, 98, 8, 0, 124, 99, 8, 0, 189, 100, 8, 0, 252, 101, 8, 0, 61, 103, 8, 0, 124, 104, 8, 0, 189, 105, 8, 0, 252, 106, 8, 0, 61, 108, 8, 0, 124, 109, 8, 0, 189, 110, 8, 0, 252, 111, 8, 0, 61, 113, 8, 0, 124, 114, 8, 0, 189, 115, 8, 0, 252, 116, 8, 0, 61, 118, 8, 0, 124, 119, 8, 0, 189, 120, 8, 0, 252, 121, 8, 0, 61, 123, 8, 0, 124, 124, 8, 0, 189, 125, 8, 0, 252, 126, 8, 0, 61, 128, 8, 0, 124, 129, 8, 0, 189, 130, 8, 0, 252, 131, 8, 0, 61, 133, 8, 0, 124, 134, 8, 0, 189, 135, 8, 0, 252, 136, 8, 0, 61, 138, 8, 0, 124, 139, 8, 0, 189, 140, 8, 0, 252, 141, 8, 0, 61, 143, 8, 0, 124, 144, 8, 0, 189, 145, 8, 0, 252, 146, 8, 0, 61, 148, 8, 0, 124, 149, 8, 0, 189, 150, 8, 0, 252, 151, 8, 0, 61, 153, 8, 0, 124, 154, 8, 0, 189, 155, 8, 0, 252, 156, 8, 0, 61, 158, 8, 0, 124, 159, 8, 0, 189, 160, 8, 0, 252, 161, 8, 0, 61, 163, 8, 0, 124, 164, 8, 0, 189, 165, 8, 0, 252, 166, 8, 0, 61, 168, 8, 0, 124, 169, 8, 0, 189, 170, 8, 0, 252, 171, 8, 0, 61, 173, 8, 0, 124, 174, 8, 0, 189, 175, 8, 0, 252, 176, 8, 0, 61, 178, 8, 0, 124, 179, 8, 0, 189, 180, 8, 0, 252, 181, 8, 0, 61, 183, 8, 0, 124, 184, 8, 0, 189, 185, 8, 0, 252, 186, 8, 0, 61, 188, 8, 0, 124, 189, 8, 0, 189, 190, 8, 0, 252, 191, 8, 0, 61, 193, 8, 0, 124, 194, 8, 0, 189, 195, 8, 0, 252, 196, 8, 0, 61, 198, 8, 0, 124, 199, 8, 0, 189, 200, 8, 0, 252, 201, 8, 0, 61, 203, 8, 0, 124, 204, 8, 0, 189, 205, 8, 0, 252, 206, 8, 0, 61, 208, 8, 0, 124, 209, 8, 0, 189, 210, 8, 0, 252, 211, 8, 0, 61, 213, 8, 0, 124, 214, 8, 0, 189, 215, 8, 0, 252, 216, 8, 0, 61, 218, 8, 0, 124, 219, 8, 0, 189, 220, 8, 0, 252, 221, 8, 0, 61, 223, 8, 0, 124, 224, 8, 0, 189, 225, 8, 0, 252, 226, 8, 0, 61, 228, 8, 0, 124, 229, 8, 0, 189, 230, 8, 0, 252, 231, 8, 0, 61, 233, 8, 0, 124, 234, 8, 0, 189, 235, 8, 0, 252, 236, 8, 0, 61, 238, 8, 0, 124, 239, 8, 0, 189, 240, 8, 0, 252, 241, 8, 0, 61, 243, 8, 0, 124, 244, 8, 0, 189, 245, 8, 0, 252, 246, 8, 0, 61, 248, 8, 0, 124, 249, 8, 0, 189, 250, 8, 0, 252, 251, 8, 0, 61, 253, 8, 0, 124, 254, 8, 0, 189, 255, 8, 0, 252, 0, 9, 0, 61, 2, 9, 0, 124, 3, 9, 0, 189, 4, 9, 0, 252, 5, 9, 0, 61, 7, 9, 0, 124, 8, 9, 0, 189, 9, 9, 0, 252, 10, 9, 0, 61, 12, 9, 0, 124, 13, 9, 0, 189, 14, 9, 0, 252, 15, 9, 0, 61, 17, 9, 0, 124, 18, 9, 0, 189, 19, 9, 0, 252, 20, 9, 0, 61, 22, 9, 0, 124, 23, 9, 0, 189, 24, 9, 0, 252, 25, 9, 0, 61, 27, 9, 0, 124, 28, 9, 0, 189, 29, 9, 0, 252, 30, 9, 0, 61, 32, 9, 0, 124, 33, 9, 0, 189, 34, 9, 0, 252, 35, 9, 0, 61, 37, 9, 0, 124, 38, 9, 0, 189, 39, 9, 0, 252, 40, 9, 0, 61, 42, 9, 0, 124, 43, 9, 0, 189, 44, 9, 0, 252, 45, 9, 0, 61, 47, 9, 0, 124, 48, 9, 0, 189, 49, 9, 0, 252, 50, 9, 0, 61, 52, 9, 0, 124, 53, 9, 0, 189, 54, 9, 0, 252, 55, 9, 0, 61, 57, 9, 0, 124, 58, 9, 0, 189, 59, 9, 0, 252, 60, 9, 0, 61, 62, 9, 0, 124, 63, 9, 0, 189, 64, 9, 0, 252, 65, 9, 0, 61, 67, 9, 0, 124, 68, 9, 0, 189, 69, 9, 0, 252, 70, 9, 0, 61, 72, 9, 0, 124, 73, 9, 0, 189, 74, 9, 0, 252, 75, 9, 0, 61, 77, 9, 0, 124, 78, 9, 0, 189, 79, 9, 0, 252, 80, 9, 0, 61, 82, 9, 0, 124, 83, 9, 0, 189, 84, 9, 0, 252, 85, 9, 0, 61, 87, 9, 0, 124, 88, 9, 0, 189, 89, 9, 0, 252, 90, 9, 0, 61, 92, 9, 0, 124, 93, 9, 0, 189, 94, 9, 0, 252, 95, 9, 0, 61, 97, 9, 0, 124, 98, 9, 0, 189, 99, 9, 0, 252, 100, 9, 0, 61, 102, 9, 0, 124, 103, 9, 0, 189, 104, 9, 0, 252, 105, 9, 0, 61, 107, 9, 0, 124, 108, 9, 0, 189, 109, 9, 0, 252, 110, 9, 0, 61, 112, 9, 0, 124, 113, 9, 0, 189, 114, 9, 0, 252, 115, 9, 0, 61, 117, 9, 0, 124, 118, 9, 0, 189, 119, 9, 0, 252, 120, 9, 0, 61, 122, 9, 0, 124, 123, 9, 0, 189, 124, 9, 0, 252, 125, 9, 0, 61, 127, 9, 0, 124, 128, 9, 0, 189, 129, 9, 0, 252, 130, 9, 0, 61, 132, 9, 0, 124, 133, 9, 0, 189, 134, 9, 0, 252, 135, 9, 0, 61, 137, 9, 0, 124, 138, 9, 0, 189, 139, 9, 0, 252, 140, 9, 0, 61, 142, 9, 0, 124, 143, 9, 0, 189, 144, 9, 0, 252, 145, 9, 0, 61, 147, 9, 0, 124, 148, 9, 0, 189, 149, 9, 0, 252, 150, 9, 0, 61, 152, 9, 0, 124, 153, 9, 0, 189, 154, 9, 0, 252, 155, 9, 0, 61, 157, 9, 0, 124, 158, 9, 0, 189, 159, 9, 0, 252, 160, 9, 0, 61, 162, 9, 0, 124, 163, 9, 0, 189, 164, 9, 0, 252, 165, 9, 0, 61, 167, 9, 0, 124, 168, 9, 0, 189, 169, 9, 0, 252, 170, 9, 0, 61, 172, 9, 0, 124, 173, 9, 0, 189, 174, 9, 0, 252, 175, 9, 0, 61, 177, 9, 0, 124, 178, 9, 0, 189, 179, 9, 0, 252, 180, 9, 0, 61, 182, 9, 0, 124, 183, 9, 0, 189, 184, 9, 0, 252, 185, 9, 0, 61, 187, 9, 0, 124, 188, 9, 0, 189, 189, 9, 0, 252, 190, 9, 0, 61, 192, 9, 0, 124, 193, 9, 0, 189, 194, 9, 0, 252, 195, 9, 0, 61, 197, 9, 0, 124, 198, 9, 0, 189, 199, 9, 0, 252, 200, 9, 0, 61, 202, 9, 0, 124, 203, 9, 0, 189, 204, 9, 0, 252, 205, 9, 0, 61, 207, 9, 0, 124, 208, 9, 0, 189, 209, 9, 0, 252, 210, 9, 0, 61, 212, 9, 0, 124, 213, 9, 0, 189, 214, 9, 0, 252, 215, 9, 0, 61, 217, 9, 0, 124, 218, 9, 0, 189, 219, 9, 0, 252, 220, 9, 0, 61, 222, 9, 0, 124, 223, 9, 0, 189, 224, 9, 0, 252, 225, 9, 0, 61, 227, 9, 0, 124, 228, 9, 0, 189, 229, 9, 0, 252, 230, 9, 0, 61, 232, 9, 0, 124, 233, 9, 0, 189, 234, 9, 0, 252, 235, 9, 0, 61, 237, 9, 0, 124, 238, 9, 0, 189, 239, 9, 0, 252, 240, 9, 0, 61, 242, 9, 0, 124, 243, 9, 0, 189, 244, 9, 0, 252, 245, 9, 0, 61, 247, 9, 0, 124, 248, 9, 0, 189, 249, 9, 0, 252, 250, 9, 0, 61, 252, 9, 0, 124, 253, 9, 0, 189, 254, 9, 0, 252, 255, 9, 0, 61, 1, 10, 0, 124, 2, 10, 0, 189, 3, 10, 0, 252, 4, 10, 0, 61, 6, 10, 0, 124, 7, 10, 0, 189, 8, 10, 0, 252, 9, 10, 0, 61, 11, 10, 0, 124, 12, 10, 0, 189, 13, 10, 0, 252, 14, 10, 0, 61, 16, 10, 0, 124, 17, 10, 0, 189, 18, 10, 0, 252, 19, 10, 0, 61, 21, 10, 0, 124, 22, 10, 0, 189, 23, 10, 0, 252, 24, 10, 0, 61, 26, 10, 0, 124, 27, 10, 0, 189, 28, 10, 0, 252, 29, 10, 0, 61, 31, 10, 0, 124, 32, 10, 0, 189, 33, 10, 0, 252, 34, 10, 0, 61, 36, 10, 0, 124, 37, 10, 0, 189, 38, 10, 0, 252, 39, 10, 0, 61, 41, 10, 0, 124, 42, 10, 0, 189, 43, 10, 0, 252, 44, 10, 0, 61, 46, 10, 0, 124, 47, 10, 0, 189, 48, 10, 0, 252, 49, 10, 0, 61, 51, 10, 0, 124, 52, 10, 0, 189, 53, 10, 0, 252, 54, 10, 0, 61, 56, 10, 0, 124, 57, 10, 0, 189, 58, 10, 0, 252, 59, 10, 0, 61, 61, 10, 0, 124, 62, 10, 0, 189, 63, 10, 0, 252, 64, 10, 0, 61, 66, 10, 0, 124, 67, 10, 0, 189, 68, 10, 0, 252, 69, 10, 0, 61, 71, 10, 0, 124, 72, 10, 0, 189, 73, 10, 0, 252, 74, 10, 0, 61, 76, 10, 0, 124, 77, 10, 0, 189, 78, 10, 0, 252, 79, 10, 0, 61, 81, 10, 0, 124, 82, 10, 0, 189, 83, 10, 0, 252, 84, 10, 0, 61, 86, 10, 0, 124, 87, 10, 0, 189, 88, 10, 0, 252, 89, 10, 0, 61, 91, 10, 0, 124, 92, 10, 0, 189, 93, 10, 0, 252, 94, 10, 0, 61, 96, 10, 0, 124, 97, 10, 0, 189, 98, 10, 0, 252, 99, 10, 0, 61, 101, 10, 0, 124, 102, 10, 0, 189, 103, 10, 0, 252, 104, 10, 0, 61, 106, 10, 0, 124, 107, 10, 0, 189, 108, 10, 0, 252, 109, 10, 0, 61, 111, 10, 0, 124, 112, 10, 0, 189, 113, 10, 0, 252, 114, 10, 0, 61, 116, 10, 0, 124, 117, 10, 0, 189, 118, 10, 0, 252, 119, 10, 0, 61, 121, 10, 0, 124, 122, 10, 0, 189, 123, 10, 0, 252, 124, 10, 0, 61, 126, 10, 0, 124, 127, 10, 0, 189, 128, 10, 0, 252, 129, 10, 0, 61, 131, 10, 0, 124, 132, 10, 0, 189, 133, 10, 0, 252, 134, 10, 0, 61, 136, 10, 0, 124, 137, 10, 0, 189, 138, 10, 0, 252, 139, 10, 0, 61, 141, 10, 0, 124, 142, 10, 0, 189, 143, 10, 0, 252, 144, 10, 0, 61, 146, 10, 0, 124, 147, 10, 0, 189, 148, 10, 0, 252, 149, 10, 0, 61, 151, 10, 0, 124, 152, 10, 0, 189, 153, 10, 0, 252, 154, 10, 0, 61, 156, 10, 0, 124, 157, 10, 0, 189, 158, 10, 0, 252, 159, 10, 0, 61, 161, 10, 0, 124, 162, 10, 0, 189, 163, 10, 0, 252, 164, 10, 0, 61, 166, 10, 0, 124, 167, 10, 0, 189, 168, 10, 0, 252, 169, 10, 0, 61, 171, 10, 0, 124, 172, 10, 0, 189, 173, 10, 0, 252, 174, 10, 0, 61, 176, 10, 0, 124, 177, 10, 0, 189, 178, 10, 0, 252, 179, 10, 0, 61, 181, 10, 0, 124, 182, 10, 0, 189, 183, 10, 0, 252, 184, 10, 0, 61, 186, 10, 0, 124, 187, 10, 0, 189, 188, 10, 0, 252, 189, 10, 0, 61, 191, 10, 0, 124, 192, 10, 0, 189, 193, 10, 0, 252, 194, 10, 0, 61, 196, 10, 0, 124, 197, 10, 0, 189, 198, 10, 0, 252, 199, 10, 0, 61, 201, 10, 0, 124, 202, 10, 0, 189, 203, 10, 0, 252, 204, 10, 0, 61, 206, 10, 0, 124, 207, 10, 0, 189, 208, 10, 0, 252, 209, 10, 0, 61, 211, 10, 0, 124, 212, 10, 0, 189, 213, 10, 0, 252, 214, 10, 0, 61, 216, 10, 0, 124, 217, 10, 0, 189, 218, 10, 0, 252, 219, 10, 0, 61, 221, 10, 0, 124, 222, 10, 0, 189, 223, 10, 0, 252, 224, 10, 0, 61, 226, 10, 0, 124, 227, 10, 0, 189, 228, 10, 0, 252, 229, 10, 0, 61, 231, 10, 0, 124, 232, 10, 0, 189, 233, 10, 0, 252, 234, 10, 0, 61, 236, 10, 0, 124, 237, 10, 0, 189, 238, 10, 0, 252, 239, 10, 0, 61, 241, 10, 0, 124, 242, 10, 0, 189, 243, 10, 0, 252, 244, 10, 0, 61, 246, 10, 0, 124, 247, 10, 0, 189, 248, 10, 0, 252, 249, 10, 0, 61, 251, 10, 0, 124, 252, 10, 0, 189, 253, 10, 0, 252, 254, 10, 0, 61, 0, 11, 0, 124, 1, 11, 0, 189, 2, 11, 0, 252, 3, 11, 0, 61, 5, 11, 0, 124, 6, 11, 0, 189, 7, 11, 0, 252, 8, 11, 0, 61, 10, 11, 0, 124, 11, 11, 0, 189, 12, 11, 0, 252, 13, 11, 0, 61, 15, 11, 0, 124, 16, 11, 0, 189, 17, 11, 0, 252, 18, 11, 0, 61, 20, 11, 0, 124, 21, 11, 0, 189, 22, 11, 0, 252, 23, 11, 0, 61, 25, 11, 0, 124, 26, 11, 0, 189, 27, 11, 0, 252, 28, 11, 0, 61, 30, 11, 0, 124, 31, 11, 0, 189, 32, 11, 0, 252, 33, 11, 0, 61, 35, 11, 0, 124, 36, 11, 0, 189, 37, 11, 0, 252, 38, 11, 0, 61, 40, 11, 0, 124, 41, 11, 0, 189, 42, 11, 0, 252, 43, 11, 0, 61, 45, 11, 0, 124, 46, 11, 0, 189, 47, 11, 0, 252, 48, 11, 0, 61, 50, 11, 0, 124, 51, 11, 0, 189, 52, 11, 0, 252, 53, 11, 0, 61, 55, 11, 0, 124, 56, 11, 0, 189, 57, 11, 0, 252, 58, 11, 0, 61, 60, 11, 0, 124, 61, 11, 0, 189, 62, 11, 0, 252, 63, 11, 0, 61, 65, 11, 0, 124, 66, 11, 0, 189, 67, 11, 0, 252, 68, 11, 0, 61, 70, 11, 0, 124, 71, 11, 0, 189, 72, 11, 0, 252, 73, 11, 0, 61, 75, 11, 0, 124, 76, 11, 0, 189, 77, 11, 0, 252, 78, 11, 0, 61, 80, 11, 0, 124, 81, 11, 0, 189, 82, 11, 0, 252, 83, 11, 0, 61, 85, 11, 0, 124, 86, 11, 0, 189, 87, 11, 0, 252, 88, 11, 0, 61, 90, 11, 0, 124, 91, 11, 0, 189, 92, 11, 0, 252, 93, 11, 0, 61, 95, 11, 0, 124, 96, 11, 0, 189, 97, 11, 0, 252, 98, 11, 0, 61, 100, 11, 0, 124, 101, 11, 0, 189, 102, 11, 0, 252, 103, 11, 0, 61, 105, 11, 0, 124, 106, 11, 0, 189, 107, 11, 0, 252, 108, 11, 0, 61, 110, 11, 0, 124, 111, 11, 0, 189, 112, 11, 0, 252, 113, 11, 0, 61, 115, 11, 0, 124, 116, 11, 0, 189, 117, 11, 0, 252, 118, 11, 0, 61, 120, 11, 0, 124, 121, 11, 0, 189, 122, 11, 0, 252, 123, 11, 0, 61, 125, 11, 0, 124, 126, 11, 0, 189, 127, 11, 0, 252, 128, 11, 0, 61, 130, 11, 0, 124, 131, 11, 0, 189, 132, 11, 0, 252, 133, 11, 0, 61, 135, 11, 0, 124, 136, 11, 0, 189, 137, 11, 0, 252, 138, 11, 0, 61, 140, 11, 0, 124, 141, 11, 0, 189, 142, 11, 0, 252, 143, 11, 0, 61, 145, 11, 0, 124, 146, 11, 0, 189, 147, 11, 0, 252, 148, 11, 0, 61, 150, 11, 0, 124, 151, 11, 0, 189, 152, 11, 0, 252, 153, 11, 0, 61, 155, 11, 0, 124, 156, 11, 0, 189, 157, 11, 0, 252, 158, 11, 0, 61, 160, 11, 0, 124, 161, 11, 0, 189, 162, 11, 0, 252, 163, 11, 0, 61, 165, 11, 0, 124, 166, 11, 0, 189, 167, 11, 0, 252, 168, 11, 0, 61, 170, 11, 0, 124, 171, 11, 0, 189, 172, 11, 0, 252, 173, 11, 0, 61, 175, 11, 0, 124, 176, 11, 0, 189, 177, 11, 0, 252, 178, 11, 0, 61, 180, 11, 0, 124, 181, 11, 0, 189, 182, 11, 0, 252, 183, 11, 0, 61, 185, 11, 0, 124, 186, 11, 0, 189, 187, 11, 0, 252, 188, 11, 0, 61, 190, 11, 0, 124, 191, 11, 0, 189, 192, 11, 0, 252, 193, 11, 0, 61, 195, 11, 0, 124, 196, 11, 0, 189, 197, 11, 0, 252, 198, 11, 0, 61, 200, 11, 0, 124, 201, 11, 0, 189, 202, 11, 0, 252, 203, 11, 0, 61, 205, 11, 0, 124, 206, 11, 0, 189, 207, 11, 0, 252, 208, 11, 0, 61, 210, 11, 0, 124, 211, 11, 0, 189, 212, 11, 0, 252, 213, 11, 0, 61, 215, 11, 0, 124, 216, 11, 0, 189, 217, 11, 0, 252, 218, 11, 0, 61, 220, 11, 0, 124, 221, 11, 0, 189, 222, 11, 0, 252, 223, 11, 0, 61, 225, 11, 0, 124, 226, 11, 0, 189, 227, 11, 0, 252, 228, 11, 0, 61, 230, 11, 0, 124, 231, 11, 0, 189, 232, 11, 0, 252, 233, 11, 0, 61, 235, 11, 0, 124, 236, 11, 0, 189, 237, 11, 0, 252, 238, 11, 0, 61, 240, 11, 0, 124, 241, 11, 0, 189, 242, 11, 0, 252, 243, 11, 0, 61, 245, 11, 0, 124, 246, 11, 0, 189, 247, 11, 0, 252, 248, 11, 0, 61, 250, 11, 0, 124, 251, 11, 0, 189, 252, 11, 0, 252, 253, 11, 0, 61, 255, 11, 0, 124, 0, 12, 0, 189, 1, 12, 0, 252, 2, 12, 0, 61, 4, 12, 0, 124, 5, 12, 0, 189, 6, 12, 0, 252, 7, 12, 0, 61, 9, 12, 0, 124, 10, 12, 0, 189, 11, 12, 0, 252, 12, 12, 0, 61, 14, 12, 0, 124, 15, 12, 0, 189, 16, 12, 0, 252, 17, 12, 0, 61, 19, 12, 0, 124, 20, 12, 0, 189, 21, 12, 0, 252, 22, 12, 0, 61, 24, 12, 0, 124, 25, 12, 0, 189, 26, 12, 0, 252, 27, 12, 0, 61, 29, 12, 0, 124, 30, 12, 0, 189, 31, 12, 0, 252, 32, 12, 0, 61, 34, 12, 0, 124, 35, 12, 0, 189, 36, 12, 0, 252, 37, 12, 0, 61, 39, 12, 0, 124, 40, 12, 0, 189, 41, 12, 0, 252, 42, 12, 0, 61, 44, 12, 0, 124, 45, 12, 0, 189, 46, 12, 0, 252, 47, 12, 0, 61, 49, 12, 0, 124, 50, 12, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_get_xy_rising_capture.json b/tests/recordings/logic_analyzer/test_get_xy_rising_capture.json deleted file mode 100644 index 435dd8bc..00000000 --- a/tests/recordings/logic_analyzer/test_get_xy_rising_capture.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [3], [0], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [254, 0, 0, 0, 126, 3, 0, 0, 254, 5, 0, 0, 126, 8, 0, 0, 254, 10, 0, 0, 126, 13, 0, 0, 254, 15, 0, 0, 126, 18, 0, 0, 254, 20, 0, 0, 126, 23, 0, 0, 254, 25, 0, 0, 126, 28, 0, 0, 254, 30, 0, 0, 126, 33, 0, 0, 254, 35, 0, 0, 126, 38, 0, 0, 254, 40, 0, 0, 126, 43, 0, 0, 254, 45, 0, 0, 126, 48, 0, 0, 254, 50, 0, 0, 126, 53, 0, 0, 254, 55, 0, 0, 126, 58, 0, 0, 254, 60, 0, 0, 126, 63, 0, 0, 254, 65, 0, 0, 126, 68, 0, 0, 254, 70, 0, 0, 126, 73, 0, 0, 254, 75, 0, 0, 126, 78, 0, 0, 254, 80, 0, 0, 126, 83, 0, 0, 254, 85, 0, 0, 126, 88, 0, 0, 254, 90, 0, 0, 126, 93, 0, 0, 254, 95, 0, 0, 126, 98, 0, 0, 254, 100, 0, 0, 126, 103, 0, 0, 254, 105, 0, 0, 126, 108, 0, 0, 254, 110, 0, 0, 126, 113, 0, 0, 254, 115, 0, 0, 126, 118, 0, 0, 254, 120, 0, 0, 126, 123, 0, 0, 254, 125, 0, 0, 126, 128, 0, 0, 254, 130, 0, 0, 126, 133, 0, 0, 254, 135, 0, 0, 126, 138, 0, 0, 254, 140, 0, 0, 126, 143, 0, 0, 254, 145, 0, 0, 126, 148, 0, 0, 254, 150, 0, 0, 126, 153, 0, 0, 254, 155, 0, 0, 126, 158, 0, 0, 254, 160, 0, 0, 126, 163, 0, 0, 254, 165, 0, 0, 126, 168, 0, 0, 254, 170, 0, 0, 126, 173, 0, 0, 254, 175, 0, 0, 126, 178, 0, 0, 254, 180, 0, 0, 126, 183, 0, 0, 254, 185, 0, 0, 126, 188, 0, 0, 254, 190, 0, 0, 126, 193, 0, 0, 254, 195, 0, 0, 126, 198, 0, 0, 254, 200, 0, 0, 126, 203, 0, 0, 254, 205, 0, 0, 126, 208, 0, 0, 254, 210, 0, 0, 126, 213, 0, 0, 254, 215, 0, 0, 126, 218, 0, 0, 254, 220, 0, 0, 126, 223, 0, 0, 254, 225, 0, 0, 126, 228, 0, 0, 254, 230, 0, 0, 126, 233, 0, 0, 254, 235, 0, 0, 126, 238, 0, 0, 254, 240, 0, 0, 126, 243, 0, 0, 254, 245, 0, 0, 126, 248, 0, 0, 254, 250, 0, 0, 126, 253, 0, 0, 254, 255, 0, 0, 126, 2, 1, 0, 254, 4, 1, 0, 126, 7, 1, 0, 254, 9, 1, 0, 126, 12, 1, 0, 254, 14, 1, 0, 126, 17, 1, 0, 254, 19, 1, 0, 126, 22, 1, 0, 254, 24, 1, 0, 126, 27, 1, 0, 254, 29, 1, 0, 126, 32, 1, 0, 254, 34, 1, 0, 126, 37, 1, 0, 254, 39, 1, 0, 126, 42, 1, 0, 254, 44, 1, 0, 126, 47, 1, 0, 254, 49, 1, 0, 126, 52, 1, 0, 254, 54, 1, 0, 126, 57, 1, 0, 254, 59, 1, 0, 126, 62, 1, 0, 254, 64, 1, 0, 126, 67, 1, 0, 254, 69, 1, 0, 126, 72, 1, 0, 254, 74, 1, 0, 126, 77, 1, 0, 254, 79, 1, 0, 126, 82, 1, 0, 254, 84, 1, 0, 126, 87, 1, 0, 254, 89, 1, 0, 126, 92, 1, 0, 254, 94, 1, 0, 126, 97, 1, 0, 254, 99, 1, 0, 126, 102, 1, 0, 254, 104, 1, 0, 126, 107, 1, 0, 254, 109, 1, 0, 126, 112, 1, 0, 254, 114, 1, 0, 126, 117, 1, 0, 254, 119, 1, 0, 126, 122, 1, 0, 254, 124, 1, 0, 126, 127, 1, 0, 254, 129, 1, 0, 126, 132, 1, 0, 254, 134, 1, 0, 126, 137, 1, 0, 254, 139, 1, 0, 126, 142, 1, 0, 254, 144, 1, 0, 126, 147, 1, 0, 254, 149, 1, 0, 126, 152, 1, 0, 254, 154, 1, 0, 126, 157, 1, 0, 254, 159, 1, 0, 126, 162, 1, 0, 254, 164, 1, 0, 126, 167, 1, 0, 254, 169, 1, 0, 126, 172, 1, 0, 254, 174, 1, 0, 126, 177, 1, 0, 254, 179, 1, 0, 126, 182, 1, 0, 254, 184, 1, 0, 126, 187, 1, 0, 254, 189, 1, 0, 126, 192, 1, 0, 254, 194, 1, 0, 126, 197, 1, 0, 254, 199, 1, 0, 126, 202, 1, 0, 254, 204, 1, 0, 126, 207, 1, 0, 254, 209, 1, 0, 126, 212, 1, 0, 254, 214, 1, 0, 126, 217, 1, 0, 254, 219, 1, 0, 126, 222, 1, 0, 254, 224, 1, 0, 126, 227, 1, 0, 254, 229, 1, 0, 126, 232, 1, 0, 254, 234, 1, 0, 126, 237, 1, 0, 254, 239, 1, 0, 126, 242, 1, 0, 254, 244, 1, 0, 126, 247, 1, 0, 254, 249, 1, 0, 126, 252, 1, 0, 254, 254, 1, 0, 126, 1, 2, 0, 254, 3, 2, 0, 126, 6, 2, 0, 254, 8, 2, 0, 126, 11, 2, 0, 254, 13, 2, 0, 126, 16, 2, 0, 254, 18, 2, 0, 126, 21, 2, 0, 254, 23, 2, 0, 126, 26, 2, 0, 254, 28, 2, 0, 126, 31, 2, 0, 254, 33, 2, 0, 126, 36, 2, 0, 254, 38, 2, 0, 126, 41, 2, 0, 254, 43, 2, 0, 126, 46, 2, 0, 254, 48, 2, 0, 126, 51, 2, 0, 254, 53, 2, 0, 126, 56, 2, 0, 254, 58, 2, 0, 126, 61, 2, 0, 254, 63, 2, 0, 126, 66, 2, 0, 254, 68, 2, 0, 126, 71, 2, 0, 254, 73, 2, 0, 126, 76, 2, 0, 254, 78, 2, 0, 126, 81, 2, 0, 254, 83, 2, 0, 126, 86, 2, 0, 254, 88, 2, 0, 126, 91, 2, 0, 254, 93, 2, 0, 126, 96, 2, 0, 254, 98, 2, 0, 126, 101, 2, 0, 254, 103, 2, 0, 126, 106, 2, 0, 254, 108, 2, 0, 126, 111, 2, 0, 254, 113, 2, 0, 126, 116, 2, 0, 254, 118, 2, 0, 126, 121, 2, 0, 254, 123, 2, 0, 126, 126, 2, 0, 254, 128, 2, 0, 126, 131, 2, 0, 254, 133, 2, 0, 126, 136, 2, 0, 254, 138, 2, 0, 126, 141, 2, 0, 254, 143, 2, 0, 126, 146, 2, 0, 254, 148, 2, 0, 126, 151, 2, 0, 254, 153, 2, 0, 126, 156, 2, 0, 254, 158, 2, 0, 126, 161, 2, 0, 254, 163, 2, 0, 126, 166, 2, 0, 254, 168, 2, 0, 126, 171, 2, 0, 254, 173, 2, 0, 126, 176, 2, 0, 254, 178, 2, 0, 126, 181, 2, 0, 254, 183, 2, 0, 126, 186, 2, 0, 254, 188, 2, 0, 126, 191, 2, 0, 254, 193, 2, 0, 126, 196, 2, 0, 254, 198, 2, 0, 126, 201, 2, 0, 254, 203, 2, 0, 126, 206, 2, 0, 254, 208, 2, 0, 126, 211, 2, 0, 254, 213, 2, 0, 126, 216, 2, 0, 254, 218, 2, 0, 126, 221, 2, 0, 254, 223, 2, 0, 126, 226, 2, 0, 254, 228, 2, 0, 126, 231, 2, 0, 254, 233, 2, 0, 126, 236, 2, 0, 254, 238, 2, 0, 126, 241, 2, 0, 254, 243, 2, 0, 126, 246, 2, 0, 254, 248, 2, 0, 126, 251, 2, 0, 254, 253, 2, 0, 126, 0, 3, 0, 254, 2, 3, 0, 126, 5, 3, 0, 254, 7, 3, 0, 126, 10, 3, 0, 254, 12, 3, 0, 126, 15, 3, 0, 254, 17, 3, 0, 126, 20, 3, 0, 254, 22, 3, 0, 126, 25, 3, 0, 254, 27, 3, 0, 126, 30, 3, 0, 254, 32, 3, 0, 126, 35, 3, 0, 254, 37, 3, 0, 126, 40, 3, 0, 254, 42, 3, 0, 126, 45, 3, 0, 254, 47, 3, 0, 126, 50, 3, 0, 254, 52, 3, 0, 126, 55, 3, 0, 254, 57, 3, 0, 126, 60, 3, 0, 254, 62, 3, 0, 126, 65, 3, 0, 254, 67, 3, 0, 126, 70, 3, 0, 254, 72, 3, 0, 126, 75, 3, 0, 254, 77, 3, 0, 126, 80, 3, 0, 254, 82, 3, 0, 126, 85, 3, 0, 254, 87, 3, 0, 126, 90, 3, 0, 254, 92, 3, 0, 126, 95, 3, 0, 254, 97, 3, 0, 126, 100, 3, 0, 254, 102, 3, 0, 126, 105, 3, 0, 254, 107, 3, 0, 126, 110, 3, 0, 254, 112, 3, 0, 126, 115, 3, 0, 254, 117, 3, 0, 126, 120, 3, 0, 254, 122, 3, 0, 126, 125, 3, 0, 254, 127, 3, 0, 126, 130, 3, 0, 254, 132, 3, 0, 126, 135, 3, 0, 254, 137, 3, 0, 126, 140, 3, 0, 254, 142, 3, 0, 126, 145, 3, 0, 254, 147, 3, 0, 126, 150, 3, 0, 254, 152, 3, 0, 126, 155, 3, 0, 254, 157, 3, 0, 126, 160, 3, 0, 254, 162, 3, 0, 126, 165, 3, 0, 254, 167, 3, 0, 126, 170, 3, 0, 254, 172, 3, 0, 126, 175, 3, 0, 254, 177, 3, 0, 126, 180, 3, 0, 254, 182, 3, 0, 126, 185, 3, 0, 254, 187, 3, 0, 126, 190, 3, 0, 254, 192, 3, 0, 126, 195, 3, 0, 254, 197, 3, 0, 126, 200, 3, 0, 254, 202, 3, 0, 126, 205, 3, 0, 254, 207, 3, 0, 126, 210, 3, 0, 254, 212, 3, 0, 126, 215, 3, 0, 254, 217, 3, 0, 126, 220, 3, 0, 254, 222, 3, 0, 126, 225, 3, 0, 254, 227, 3, 0, 126, 230, 3, 0, 254, 232, 3, 0, 126, 235, 3, 0, 254, 237, 3, 0, 126, 240, 3, 0, 254, 242, 3, 0, 126, 245, 3, 0, 254, 247, 3, 0, 126, 250, 3, 0, 254, 252, 3, 0, 126, 255, 3, 0, 254, 1, 4, 0, 126, 4, 4, 0, 254, 6, 4, 0, 126, 9, 4, 0, 254, 11, 4, 0, 126, 14, 4, 0, 254, 16, 4, 0, 126, 19, 4, 0, 254, 21, 4, 0, 126, 24, 4, 0, 254, 26, 4, 0, 126, 29, 4, 0, 254, 31, 4, 0, 126, 34, 4, 0, 254, 36, 4, 0, 126, 39, 4, 0, 254, 41, 4, 0, 126, 44, 4, 0, 254, 46, 4, 0, 126, 49, 4, 0, 254, 51, 4, 0, 126, 54, 4, 0, 254, 56, 4, 0, 126, 59, 4, 0, 254, 61, 4, 0, 126, 64, 4, 0, 254, 66, 4, 0, 126, 69, 4, 0, 254, 71, 4, 0, 126, 74, 4, 0, 254, 76, 4, 0, 126, 79, 4, 0, 254, 81, 4, 0, 126, 84, 4, 0, 254, 86, 4, 0, 126, 89, 4, 0, 254, 91, 4, 0, 126, 94, 4, 0, 254, 96, 4, 0, 126, 99, 4, 0, 254, 101, 4, 0, 126, 104, 4, 0, 254, 106, 4, 0, 126, 109, 4, 0, 254, 111, 4, 0, 126, 114, 4, 0, 254, 116, 4, 0, 126, 119, 4, 0, 254, 121, 4, 0, 126, 124, 4, 0, 254, 126, 4, 0, 126, 129, 4, 0, 254, 131, 4, 0, 126, 134, 4, 0, 254, 136, 4, 0, 126, 139, 4, 0, 254, 141, 4, 0, 126, 144, 4, 0, 254, 146, 4, 0, 126, 149, 4, 0, 254, 151, 4, 0, 126, 154, 4, 0, 254, 156, 4, 0, 126, 159, 4, 0, 254, 161, 4, 0, 126, 164, 4, 0, 254, 166, 4, 0, 126, 169, 4, 0, 254, 171, 4, 0, 126, 174, 4, 0, 254, 176, 4, 0, 126, 179, 4, 0, 254, 181, 4, 0, 126, 184, 4, 0, 254, 186, 4, 0, 126, 189, 4, 0, 254, 191, 4, 0, 126, 194, 4, 0, 254, 196, 4, 0, 126, 199, 4, 0, 254, 201, 4, 0, 126, 204, 4, 0, 254, 206, 4, 0, 126, 209, 4, 0, 254, 211, 4, 0, 126, 214, 4, 0, 254, 216, 4, 0, 126, 219, 4, 0, 254, 221, 4, 0, 126, 224, 4, 0, 254, 226, 4, 0, 126, 229, 4, 0, 254, 231, 4, 0, 126, 234, 4, 0, 254, 236, 4, 0, 126, 239, 4, 0, 254, 241, 4, 0, 126, 244, 4, 0, 254, 246, 4, 0, 126, 249, 4, 0, 254, 251, 4, 0, 126, 254, 4, 0, 254, 0, 5, 0, 126, 3, 5, 0, 254, 5, 5, 0, 126, 8, 5, 0, 254, 10, 5, 0, 126, 13, 5, 0, 254, 15, 5, 0, 126, 18, 5, 0, 254, 20, 5, 0, 126, 23, 5, 0, 254, 25, 5, 0, 126, 28, 5, 0, 254, 30, 5, 0, 126, 33, 5, 0, 254, 35, 5, 0, 126, 38, 5, 0, 254, 40, 5, 0, 126, 43, 5, 0, 254, 45, 5, 0, 126, 48, 5, 0, 254, 50, 5, 0, 126, 53, 5, 0, 254, 55, 5, 0, 126, 58, 5, 0, 254, 60, 5, 0, 126, 63, 5, 0, 254, 65, 5, 0, 126, 68, 5, 0, 254, 70, 5, 0, 126, 73, 5, 0, 254, 75, 5, 0, 126, 78, 5, 0, 254, 80, 5, 0, 126, 83, 5, 0, 254, 85, 5, 0, 126, 88, 5, 0, 254, 90, 5, 0, 126, 93, 5, 0, 254, 95, 5, 0, 126, 98, 5, 0, 254, 100, 5, 0, 126, 103, 5, 0, 254, 105, 5, 0, 126, 108, 5, 0, 254, 110, 5, 0, 126, 113, 5, 0, 254, 115, 5, 0, 126, 118, 5, 0, 254, 120, 5, 0, 126, 123, 5, 0, 254, 125, 5, 0, 126, 128, 5, 0, 254, 130, 5, 0, 126, 133, 5, 0, 254, 135, 5, 0, 126, 138, 5, 0, 254, 140, 5, 0, 126, 143, 5, 0, 254, 145, 5, 0, 126, 148, 5, 0, 254, 150, 5, 0, 126, 153, 5, 0, 254, 155, 5, 0, 126, 158, 5, 0, 254, 160, 5, 0, 126, 163, 5, 0, 254, 165, 5, 0, 126, 168, 5, 0, 254, 170, 5, 0, 126, 173, 5, 0, 254, 175, 5, 0, 126, 178, 5, 0, 254, 180, 5, 0, 126, 183, 5, 0, 254, 185, 5, 0, 126, 188, 5, 0, 254, 190, 5, 0, 126, 193, 5, 0, 254, 195, 5, 0, 126, 198, 5, 0, 254, 200, 5, 0, 126, 203, 5, 0, 254, 205, 5, 0, 126, 208, 5, 0, 254, 210, 5, 0, 126, 213, 5, 0, 254, 215, 5, 0, 126, 218, 5, 0, 254, 220, 5, 0, 126, 223, 5, 0, 254, 225, 5, 0, 126, 228, 5, 0, 254, 230, 5, 0, 126, 233, 5, 0, 254, 235, 5, 0, 126, 238, 5, 0, 254, 240, 5, 0, 126, 243, 5, 0, 254, 245, 5, 0, 126, 248, 5, 0, 254, 250, 5, 0, 126, 253, 5, 0, 254, 255, 5, 0, 126, 2, 6, 0, 254, 4, 6, 0, 126, 7, 6, 0, 254, 9, 6, 0, 126, 12, 6, 0, 254, 14, 6, 0, 126, 17, 6, 0, 254, 19, 6, 0, 126, 22, 6, 0, 254, 24, 6, 0, 126, 27, 6, 0, 254, 29, 6, 0, 126, 32, 6, 0, 254, 34, 6, 0, 126, 37, 6, 0, 254, 39, 6, 0, 126, 42, 6, 0, 254, 44, 6, 0, 126, 47, 6, 0, 254, 49, 6, 0, 126, 52, 6, 0, 254, 54, 6, 0, 126, 57, 6, 0, 254, 59, 6, 0, 126, 62, 6, 0, 254, 64, 6, 0, 126, 67, 6, 0, 254, 69, 6, 0, 126, 72, 6, 0, 254, 74, 6, 0, 126, 77, 6, 0, 254, 79, 6, 0, 126, 82, 6, 0, 254, 84, 6, 0, 126, 87, 6, 0, 254, 89, 6, 0, 126, 92, 6, 0, 254, 94, 6, 0, 126, 97, 6, 0, 254, 99, 6, 0, 126, 102, 6, 0, 254, 104, 6, 0, 126, 107, 6, 0, 254, 109, 6, 0, 126, 112, 6, 0, 254, 114, 6, 0, 126, 117, 6, 0, 254, 119, 6, 0, 126, 122, 6, 0, 254, 124, 6, 0, 126, 127, 6, 0, 254, 129, 6, 0, 126, 132, 6, 0, 254, 134, 6, 0, 126, 137, 6, 0, 254, 139, 6, 0, 126, 142, 6, 0, 254, 144, 6, 0, 126, 147, 6, 0, 254, 149, 6, 0, 126, 152, 6, 0, 254, 154, 6, 0, 126, 157, 6, 0, 254, 159, 6, 0, 126, 162, 6, 0, 254, 164, 6, 0, 126, 167, 6, 0, 254, 169, 6, 0, 126, 172, 6, 0, 254, 174, 6, 0, 126, 177, 6, 0, 254, 179, 6, 0, 126, 182, 6, 0, 254, 184, 6, 0, 126, 187, 6, 0, 254, 189, 6, 0, 126, 192, 6, 0, 254, 194, 6, 0, 126, 197, 6, 0, 254, 199, 6, 0, 126, 202, 6, 0, 254, 204, 6, 0, 126, 207, 6, 0, 254, 209, 6, 0, 126, 212, 6, 0, 254, 214, 6, 0, 126, 217, 6, 0, 254, 219, 6, 0, 126, 222, 6, 0, 254, 224, 6, 0, 126, 227, 6, 0, 254, 229, 6, 0, 126, 232, 6, 0, 254, 234, 6, 0, 126, 237, 6, 0, 254, 239, 6, 0, 126, 242, 6, 0, 254, 244, 6, 0, 126, 247, 6, 0, 254, 249, 6, 0, 126, 252, 6, 0, 254, 254, 6, 0, 126, 1, 7, 0, 254, 3, 7, 0, 126, 6, 7, 0, 254, 8, 7, 0, 126, 11, 7, 0, 254, 13, 7, 0, 126, 16, 7, 0, 254, 18, 7, 0, 126, 21, 7, 0, 254, 23, 7, 0, 126, 26, 7, 0, 254, 28, 7, 0, 126, 31, 7, 0, 254, 33, 7, 0, 126, 36, 7, 0, 254, 38, 7, 0, 126, 41, 7, 0, 254, 43, 7, 0, 126, 46, 7, 0, 254, 48, 7, 0, 126, 51, 7, 0, 254, 53, 7, 0, 126, 56, 7, 0, 254, 58, 7, 0, 126, 61, 7, 0, 254, 63, 7, 0, 126, 66, 7, 0, 254, 68, 7, 0, 126, 71, 7, 0, 254, 73, 7, 0, 126, 76, 7, 0, 254, 78, 7, 0, 126, 81, 7, 0, 254, 83, 7, 0, 126, 86, 7, 0, 254, 88, 7, 0, 126, 91, 7, 0, 254, 93, 7, 0, 126, 96, 7, 0, 254, 98, 7, 0, 126, 101, 7, 0, 254, 103, 7, 0, 126, 106, 7, 0, 254, 108, 7, 0, 126, 111, 7, 0, 254, 113, 7, 0, 126, 116, 7, 0, 254, 118, 7, 0, 126, 121, 7, 0, 254, 123, 7, 0, 126, 126, 7, 0, 254, 128, 7, 0, 126, 131, 7, 0, 254, 133, 7, 0, 126, 136, 7, 0, 254, 138, 7, 0, 126, 141, 7, 0, 254, 143, 7, 0, 126, 146, 7, 0, 254, 148, 7, 0, 126, 151, 7, 0, 254, 153, 7, 0, 126, 156, 7, 0, 254, 158, 7, 0, 126, 161, 7, 0, 254, 163, 7, 0, 126, 166, 7, 0, 254, 168, 7, 0, 126, 171, 7, 0, 254, 173, 7, 0, 126, 176, 7, 0, 254, 178, 7, 0, 126, 181, 7, 0, 254, 183, 7, 0, 126, 186, 7, 0, 254, 188, 7, 0, 126, 191, 7, 0, 254, 193, 7, 0, 126, 196, 7, 0, 254, 198, 7, 0, 126, 201, 7, 0, 254, 203, 7, 0, 126, 206, 7, 0, 254, 208, 7, 0, 126, 211, 7, 0, 254, 213, 7, 0, 126, 216, 7, 0, 254, 218, 7, 0, 126, 221, 7, 0, 254, 223, 7, 0, 126, 226, 7, 0, 254, 228, 7, 0, 126, 231, 7, 0, 254, 233, 7, 0, 126, 236, 7, 0, 254, 238, 7, 0, 126, 241, 7, 0, 254, 243, 7, 0, 126, 246, 7, 0, 254, 248, 7, 0, 126, 251, 7, 0, 254, 253, 7, 0, 126, 0, 8, 0, 254, 2, 8, 0, 126, 5, 8, 0, 254, 7, 8, 0, 126, 10, 8, 0, 254, 12, 8, 0, 126, 15, 8, 0, 254, 17, 8, 0, 126, 20, 8, 0, 254, 22, 8, 0, 126, 25, 8, 0, 254, 27, 8, 0, 126, 30, 8, 0, 254, 32, 8, 0, 126, 35, 8, 0, 254, 37, 8, 0, 126, 40, 8, 0, 254, 42, 8, 0, 126, 45, 8, 0, 254, 47, 8, 0, 126, 50, 8, 0, 254, 52, 8, 0, 126, 55, 8, 0, 254, 57, 8, 0, 126, 60, 8, 0, 254, 62, 8, 0, 126, 65, 8, 0, 254, 67, 8, 0, 126, 70, 8, 0, 254, 72, 8, 0, 126, 75, 8, 0, 254, 77, 8, 0, 126, 80, 8, 0, 254, 82, 8, 0, 126, 85, 8, 0, 254, 87, 8, 0, 126, 90, 8, 0, 254, 92, 8, 0, 126, 95, 8, 0, 254, 97, 8, 0, 126, 100, 8, 0, 254, 102, 8, 0, 126, 105, 8, 0, 254, 107, 8, 0, 126, 110, 8, 0, 254, 112, 8, 0, 126, 115, 8, 0, 254, 117, 8, 0, 126, 120, 8, 0, 254, 122, 8, 0, 126, 125, 8, 0, 254, 127, 8, 0, 126, 130, 8, 0, 254, 132, 8, 0, 126, 135, 8, 0, 254, 137, 8, 0, 126, 140, 8, 0, 254, 142, 8, 0, 126, 145, 8, 0, 254, 147, 8, 0, 126, 150, 8, 0, 254, 152, 8, 0, 126, 155, 8, 0, 254, 157, 8, 0, 126, 160, 8, 0, 254, 162, 8, 0, 126, 165, 8, 0, 254, 167, 8, 0, 126, 170, 8, 0, 254, 172, 8, 0, 126, 175, 8, 0, 254, 177, 8, 0, 126, 180, 8, 0, 254, 182, 8, 0, 126, 185, 8, 0, 254, 187, 8, 0, 126, 190, 8, 0, 254, 192, 8, 0, 126, 195, 8, 0, 254, 197, 8, 0, 126, 200, 8, 0, 254, 202, 8, 0, 126, 205, 8, 0, 254, 207, 8, 0, 126, 210, 8, 0, 254, 212, 8, 0, 126, 215, 8, 0, 254, 217, 8, 0, 126, 220, 8, 0, 254, 222, 8, 0, 126, 225, 8, 0, 254, 227, 8, 0, 126, 230, 8, 0, 254, 232, 8, 0, 126, 235, 8, 0, 254, 237, 8, 0, 126, 240, 8, 0, 254, 242, 8, 0, 126, 245, 8, 0, 254, 247, 8, 0, 126, 250, 8, 0, 254, 252, 8, 0, 126, 255, 8, 0, 254, 1, 9, 0, 126, 4, 9, 0, 254, 6, 9, 0, 126, 9, 9, 0, 254, 11, 9, 0, 126, 14, 9, 0, 254, 16, 9, 0, 126, 19, 9, 0, 254, 21, 9, 0, 126, 24, 9, 0, 254, 26, 9, 0, 126, 29, 9, 0, 254, 31, 9, 0, 126, 34, 9, 0, 254, 36, 9, 0, 126, 39, 9, 0, 254, 41, 9, 0, 126, 44, 9, 0, 254, 46, 9, 0, 126, 49, 9, 0, 254, 51, 9, 0, 126, 54, 9, 0, 254, 56, 9, 0, 126, 59, 9, 0, 254, 61, 9, 0, 126, 64, 9, 0, 254, 66, 9, 0, 126, 69, 9, 0, 254, 71, 9, 0, 126, 74, 9, 0, 254, 76, 9, 0, 126, 79, 9, 0, 254, 81, 9, 0, 126, 84, 9, 0, 254, 86, 9, 0, 126, 89, 9, 0, 254, 91, 9, 0, 126, 94, 9, 0, 254, 96, 9, 0, 126, 99, 9, 0, 254, 101, 9, 0, 126, 104, 9, 0, 254, 106, 9, 0, 126, 109, 9, 0, 254, 111, 9, 0, 126, 114, 9, 0, 254, 116, 9, 0, 126, 119, 9, 0, 254, 121, 9, 0, 126, 124, 9, 0, 254, 126, 9, 0, 126, 129, 9, 0, 254, 131, 9, 0, 126, 134, 9, 0, 254, 136, 9, 0, 126, 139, 9, 0, 254, 141, 9, 0, 126, 144, 9, 0, 254, 146, 9, 0, 126, 149, 9, 0, 254, 151, 9, 0, 126, 154, 9, 0, 254, 156, 9, 0, 126, 159, 9, 0, 254, 161, 9, 0, 126, 164, 9, 0, 254, 166, 9, 0, 126, 169, 9, 0, 254, 171, 9, 0, 126, 174, 9, 0, 254, 176, 9, 0, 126, 179, 9, 0, 254, 181, 9, 0, 126, 184, 9, 0, 254, 186, 9, 0, 126, 189, 9, 0, 254, 191, 9, 0, 126, 194, 9, 0, 254, 196, 9, 0, 126, 199, 9, 0, 254, 201, 9, 0, 126, 204, 9, 0, 254, 206, 9, 0, 126, 209, 9, 0, 254, 211, 9, 0, 126, 214, 9, 0, 254, 216, 9, 0, 126, 219, 9, 0, 254, 221, 9, 0, 126, 224, 9, 0, 254, 226, 9, 0, 126, 229, 9, 0, 254, 231, 9, 0, 126, 234, 9, 0, 254, 236, 9, 0, 126, 239, 9, 0, 254, 241, 9, 0, 126, 244, 9, 0, 254, 246, 9, 0, 126, 249, 9, 0, 254, 251, 9, 0, 126, 254, 9, 0, 254, 0, 10, 0, 126, 3, 10, 0, 254, 5, 10, 0, 126, 8, 10, 0, 254, 10, 10, 0, 126, 13, 10, 0, 254, 15, 10, 0, 126, 18, 10, 0, 254, 20, 10, 0, 126, 23, 10, 0, 254, 25, 10, 0, 126, 28, 10, 0, 254, 30, 10, 0, 126, 33, 10, 0, 254, 35, 10, 0, 126, 38, 10, 0, 254, 40, 10, 0, 126, 43, 10, 0, 254, 45, 10, 0, 126, 48, 10, 0, 254, 50, 10, 0, 126, 53, 10, 0, 254, 55, 10, 0, 126, 58, 10, 0, 254, 60, 10, 0, 126, 63, 10, 0, 254, 65, 10, 0, 126, 68, 10, 0, 254, 70, 10, 0, 126, 73, 10, 0, 254, 75, 10, 0, 126, 78, 10, 0, 254, 80, 10, 0, 126, 83, 10, 0, 254, 85, 10, 0, 126, 88, 10, 0, 254, 90, 10, 0, 126, 93, 10, 0, 254, 95, 10, 0, 126, 98, 10, 0, 254, 100, 10, 0, 126, 103, 10, 0, 254, 105, 10, 0, 126, 108, 10, 0, 254, 110, 10, 0, 126, 113, 10, 0, 254, 115, 10, 0, 126, 118, 10, 0, 254, 120, 10, 0, 126, 123, 10, 0, 254, 125, 10, 0, 126, 128, 10, 0, 254, 130, 10, 0, 126, 133, 10, 0, 254, 135, 10, 0, 126, 138, 10, 0, 254, 140, 10, 0, 126, 143, 10, 0, 254, 145, 10, 0, 126, 148, 10, 0, 254, 150, 10, 0, 126, 153, 10, 0, 254, 155, 10, 0, 126, 158, 10, 0, 254, 160, 10, 0, 126, 163, 10, 0, 254, 165, 10, 0, 126, 168, 10, 0, 254, 170, 10, 0, 126, 173, 10, 0, 254, 175, 10, 0, 126, 178, 10, 0, 254, 180, 10, 0, 126, 183, 10, 0, 254, 185, 10, 0, 126, 188, 10, 0, 254, 190, 10, 0, 126, 193, 10, 0, 254, 195, 10, 0, 126, 198, 10, 0, 254, 200, 10, 0, 126, 203, 10, 0, 254, 205, 10, 0, 126, 208, 10, 0, 254, 210, 10, 0, 126, 213, 10, 0, 254, 215, 10, 0, 126, 218, 10, 0, 254, 220, 10, 0, 126, 223, 10, 0, 254, 225, 10, 0, 126, 228, 10, 0, 254, 230, 10, 0, 126, 233, 10, 0, 254, 235, 10, 0, 126, 238, 10, 0, 254, 240, 10, 0, 126, 243, 10, 0, 254, 245, 10, 0, 126, 248, 10, 0, 254, 250, 10, 0, 126, 253, 10, 0, 254, 255, 10, 0, 126, 2, 11, 0, 254, 4, 11, 0, 126, 7, 11, 0, 254, 9, 11, 0, 126, 12, 11, 0, 254, 14, 11, 0, 126, 17, 11, 0, 254, 19, 11, 0, 126, 22, 11, 0, 254, 24, 11, 0, 126, 27, 11, 0, 254, 29, 11, 0, 126, 32, 11, 0, 254, 34, 11, 0, 126, 37, 11, 0, 254, 39, 11, 0, 126, 42, 11, 0, 254, 44, 11, 0, 126, 47, 11, 0, 254, 49, 11, 0, 126, 52, 11, 0, 254, 54, 11, 0, 126, 57, 11, 0, 254, 59, 11, 0, 126, 62, 11, 0, 254, 64, 11, 0, 126, 67, 11, 0, 254, 69, 11, 0, 126, 72, 11, 0, 254, 74, 11, 0, 126, 77, 11, 0, 254, 79, 11, 0, 126, 82, 11, 0, 254, 84, 11, 0, 126, 87, 11, 0, 254, 89, 11, 0, 126, 92, 11, 0, 254, 94, 11, 0, 126, 97, 11, 0, 254, 99, 11, 0, 126, 102, 11, 0, 254, 104, 11, 0, 126, 107, 11, 0, 254, 109, 11, 0, 126, 112, 11, 0, 254, 114, 11, 0, 126, 117, 11, 0, 254, 119, 11, 0, 126, 122, 11, 0, 254, 124, 11, 0, 126, 127, 11, 0, 254, 129, 11, 0, 126, 132, 11, 0, 254, 134, 11, 0, 126, 137, 11, 0, 254, 139, 11, 0, 126, 142, 11, 0, 254, 144, 11, 0, 126, 147, 11, 0, 254, 149, 11, 0, 126, 152, 11, 0, 254, 154, 11, 0, 126, 157, 11, 0, 254, 159, 11, 0, 126, 162, 11, 0, 254, 164, 11, 0, 126, 167, 11, 0, 254, 169, 11, 0, 126, 172, 11, 0, 254, 174, 11, 0, 126, 177, 11, 0, 254, 179, 11, 0, 126, 182, 11, 0, 254, 184, 11, 0, 126, 187, 11, 0, 254, 189, 11, 0, 126, 192, 11, 0, 254, 194, 11, 0, 126, 197, 11, 0, 254, 199, 11, 0, 126, 202, 11, 0, 254, 204, 11, 0, 126, 207, 11, 0, 254, 209, 11, 0, 126, 212, 11, 0, 254, 214, 11, 0, 126, 217, 11, 0, 254, 219, 11, 0, 126, 222, 11, 0, 254, 224, 11, 0, 126, 227, 11, 0, 254, 229, 11, 0, 126, 232, 11, 0, 254, 234, 11, 0, 126, 237, 11, 0, 254, 239, 11, 0, 126, 242, 11, 0, 254, 244, 11, 0, 126, 247, 11, 0, 254, 249, 11, 0, 126, 252, 11, 0, 254, 254, 11, 0, 126, 1, 12, 0, 254, 3, 12, 0, 126, 6, 12, 0, 254, 8, 12, 0, 126, 11, 12, 0, 254, 13, 12, 0, 126, 16, 12, 0, 254, 18, 12, 0, 126, 21, 12, 0, 254, 23, 12, 0, 126, 26, 12, 0, 254, 28, 12, 0, 126, 31, 12, 0, 254, 33, 12, 0, 126, 36, 12, 0, 254, 38, 12, 0, 126, 41, 12, 0, 254, 43, 12, 0, 126, 46, 12, 0, 254, 48, 12, 0, 126, 51, 12, 0, 254, 53, 12, 0, 126, 56, 12, 0, 254, 58, 12, 0, 126, 61, 12, 0, 254, 63, 12, 0, 126, 66, 12, 0, 254, 68, 12, 0, 126, 71, 12, 0, 254, 73, 12, 0, 126, 76, 12, 0, 254, 78, 12, 0, 126, 81, 12, 0, 254, 83, 12, 0, 126, 86, 12, 0, 254, 88, 12, 0, 126, 91, 12, 0, 254, 93, 12, 0, 126, 96, 12, 0, 254, 98, 12, 0, 126, 101, 12, 0, 254, 103, 12, 0, 126, 106, 12, 0, 254, 108, 12, 0, 126, 111, 12, 0, 254, 113, 12, 0, 126, 116, 12, 0, 254, 118, 12, 0, 126, 121, 12, 0, 254, 123, 12, 0, 126, 126, 12, 0, 254, 128, 12, 0, 126, 131, 12, 0, 254, 133, 12, 0, 126, 136, 12, 0, 254, 138, 12, 0, 126, 141, 12, 0, 254, 143, 12, 0, 126, 146, 12, 0, 254, 148, 12, 0, 126, 151, 12, 0, 254, 153, 12, 0, 126, 156, 12, 0, 254, 158, 12, 0, 126, 161, 12, 0, 254, 163, 12, 0, 126, 166, 12, 0, 254, 168, 12, 0, 126, 171, 12, 0, 254, 173, 12, 0, 126, 176, 12, 0, 254, 178, 12, 0, 126, 181, 12, 0, 254, 183, 12, 0, 126, 186, 12, 0, 254, 188, 12, 0, 126, 191, 12, 0, 254, 193, 12, 0, 126, 196, 12, 0, 254, 198, 12, 0, 126, 201, 12, 0, 254, 203, 12, 0, 126, 206, 12, 0, 254, 208, 12, 0, 126, 211, 12, 0, 254, 213, 12, 0, 126, 216, 12, 0, 254, 218, 12, 0, 126, 221, 12, 0, 254, 223, 12, 0, 126, 226, 12, 0, 254, 228, 12, 0, 126, 231, 12, 0, 254, 233, 12, 0, 126, 236, 12, 0, 254, 238, 12, 0, 126, 241, 12, 0, 254, 243, 12, 0, 126, 246, 12, 0, 254, 248, 12, 0, 126, 251, 12, 0, 254, 253, 12, 0, 126, 0, 13, 0, 254, 2, 13, 0, 126, 5, 13, 0, 254, 7, 13, 0, 126, 10, 13, 0, 254, 12, 13, 0, 126, 15, 13, 0, 254, 17, 13, 0, 126, 20, 13, 0, 254, 22, 13, 0, 126, 25, 13, 0, 254, 27, 13, 0, 126, 30, 13, 0, 254, 32, 13, 0, 126, 35, 13, 0, 254, 37, 13, 0, 126, 40, 13, 0, 254, 42, 13, 0, 126, 45, 13, 0, 254, 47, 13, 0, 126, 50, 13, 0, 254, 52, 13, 0, 126, 55, 13, 0, 254, 57, 13, 0, 126, 60, 13, 0, 254, 62, 13, 0, 126, 65, 13, 0, 254, 67, 13, 0, 126, 70, 13, 0, 254, 72, 13, 0, 126, 75, 13, 0, 254, 77, 13, 0, 126, 80, 13, 0, 254, 82, 13, 0, 126, 85, 13, 0, 254, 87, 13, 0, 126, 90, 13, 0, 254, 92, 13, 0, 126, 95, 13, 0, 254, 97, 13, 0, 126, 100, 13, 0, 254, 102, 13, 0, 126, 105, 13, 0, 254, 107, 13, 0, 126, 110, 13, 0, 254, 112, 13, 0, 126, 115, 13, 0, 254, 117, 13, 0, 126, 120, 13, 0, 254, 122, 13, 0, 126, 125, 13, 0, 254, 127, 13, 0, 126, 130, 13, 0, 254, 132, 13, 0, 126, 135, 13, 0, 254, 137, 13, 0, 126, 140, 13, 0, 254, 142, 13, 0, 126, 145, 13, 0, 254, 147, 13, 0, 126, 150, 13, 0, 254, 152, 13, 0, 126, 155, 13, 0, 254, 157, 13, 0, 126, 160, 13, 0, 254, 162, 13, 0, 126, 165, 13, 0, 254, 167, 13, 0, 126, 170, 13, 0, 254, 172, 13, 0, 126, 175, 13, 0, 254, 177, 13, 0, 126, 180, 13, 0, 254, 182, 13, 0, 126, 185, 13, 0, 254, 187, 13, 0, 126, 190, 13, 0, 254, 192, 13, 0, 126, 195, 13, 0, 254, 197, 13, 0, 126, 200, 13, 0, 254, 202, 13, 0, 126, 205, 13, 0, 254, 207, 13, 0, 126, 210, 13, 0, 254, 212, 13, 0, 126, 215, 13, 0, 254, 217, 13, 0, 126, 220, 13, 0, 254, 222, 13, 0, 126, 225, 13, 0, 254, 227, 13, 0, 126, 230, 13, 0, 254, 232, 13, 0, 126, 235, 13, 0, 254, 237, 13, 0, 126, 240, 13, 0, 254, 242, 13, 0, 126, 245, 13, 0, 254, 247, 13, 0, 126, 250, 13, 0, 254, 252, 13, 0, 126, 255, 13, 0, 254, 1, 14, 0, 126, 4, 14, 0, 254, 6, 14, 0, 126, 9, 14, 0, 254, 11, 14, 0, 126, 14, 14, 0, 254, 16, 14, 0, 126, 19, 14, 0, 254, 21, 14, 0, 126, 24, 14, 0, 254, 26, 14, 0, 126, 29, 14, 0, 254, 31, 14, 0, 126, 34, 14, 0, 254, 36, 14, 0, 126, 39, 14, 0, 254, 41, 14, 0, 126, 44, 14, 0, 254, 46, 14, 0, 126, 49, 14, 0, 254, 51, 14, 0, 126, 54, 14, 0, 254, 56, 14, 0, 126, 59, 14, 0, 254, 61, 14, 0, 126, 64, 14, 0, 254, 66, 14, 0, 126, 69, 14, 0, 254, 71, 14, 0, 126, 74, 14, 0, 254, 76, 14, 0, 126, 79, 14, 0, 254, 81, 14, 0, 126, 84, 14, 0, 254, 86, 14, 0, 126, 89, 14, 0, 254, 91, 14, 0, 126, 94, 14, 0, 254, 96, 14, 0, 126, 99, 14, 0, 254, 101, 14, 0, 126, 104, 14, 0, 254, 106, 14, 0, 126, 109, 14, 0, 254, 111, 14, 0, 126, 114, 14, 0, 254, 116, 14, 0, 126, 119, 14, 0, 254, 121, 14, 0, 126, 124, 14, 0, 254, 126, 14, 0, 126, 129, 14, 0, 254, 131, 14, 0, 126, 134, 14, 0, 254, 136, 14, 0, 126, 139, 14, 0, 254, 141, 14, 0, 126, 144, 14, 0, 254, 146, 14, 0, 126, 149, 14, 0, 254, 151, 14, 0, 126, 154, 14, 0, 254, 156, 14, 0, 126, 159, 14, 0, 254, 161, 14, 0, 126, 164, 14, 0, 254, 166, 14, 0, 126, 169, 14, 0, 254, 171, 14, 0, 126, 174, 14, 0, 254, 176, 14, 0, 126, 179, 14, 0, 254, 181, 14, 0, 126, 184, 14, 0, 254, 186, 14, 0, 126, 189, 14, 0, 254, 191, 14, 0, 126, 194, 14, 0, 254, 196, 14, 0, 126, 199, 14, 0, 254, 201, 14, 0, 126, 204, 14, 0, 254, 206, 14, 0, 126, 209, 14, 0, 254, 211, 14, 0, 126, 214, 14, 0, 254, 216, 14, 0, 126, 219, 14, 0, 254, 221, 14, 0, 126, 224, 14, 0, 254, 226, 14, 0, 126, 229, 14, 0, 254, 231, 14, 0, 126, 234, 14, 0, 254, 236, 14, 0, 126, 239, 14, 0, 254, 241, 14, 0, 126, 244, 14, 0, 254, 246, 14, 0, 126, 249, 14, 0, 254, 251, 14, 0, 126, 254, 14, 0, 254, 0, 15, 0, 126, 3, 15, 0, 254, 5, 15, 0, 126, 8, 15, 0, 254, 10, 15, 0, 126, 13, 15, 0, 254, 15, 15, 0, 126, 18, 15, 0, 254, 20, 15, 0, 126, 23, 15, 0, 254, 25, 15, 0, 126, 28, 15, 0, 254, 30, 15, 0, 126, 33, 15, 0, 254, 35, 15, 0, 126, 38, 15, 0, 254, 40, 15, 0, 126, 43, 15, 0, 254, 45, 15, 0, 126, 48, 15, 0, 254, 50, 15, 0, 126, 53, 15, 0, 254, 55, 15, 0, 126, 58, 15, 0, 254, 60, 15, 0, 126, 63, 15, 0, 254, 65, 15, 0, 126, 68, 15, 0, 254, 70, 15, 0, 126, 73, 15, 0, 254, 75, 15, 0, 126, 78, 15, 0, 254, 80, 15, 0, 126, 83, 15, 0, 254, 85, 15, 0, 126, 88, 15, 0, 254, 90, 15, 0, 126, 93, 15, 0, 254, 95, 15, 0, 126, 98, 15, 0, 254, 100, 15, 0, 126, 103, 15, 0, 254, 105, 15, 0, 126, 108, 15, 0, 254, 110, 15, 0, 126, 113, 15, 0, 254, 115, 15, 0, 126, 118, 15, 0, 254, 120, 15, 0, 126, 123, 15, 0, 254, 125, 15, 0, 126, 128, 15, 0, 254, 130, 15, 0, 126, 133, 15, 0, 254, 135, 15, 0, 126, 138, 15, 0, 254, 140, 15, 0, 126, 143, 15, 0, 254, 145, 15, 0, 126, 148, 15, 0, 254, 150, 15, 0, 126, 153, 15, 0, 254, 155, 15, 0, 126, 158, 15, 0, 254, 160, 15, 0, 126, 163, 15, 0, 254, 165, 15, 0, 126, 168, 15, 0, 254, 170, 15, 0, 126, 173, 15, 0, 254, 175, 15, 0, 126, 178, 15, 0, 254, 180, 15, 0, 126, 183, 15, 0, 254, 185, 15, 0, 126, 188, 15, 0, 254, 190, 15, 0, 126, 193, 15, 0, 254, 195, 15, 0, 126, 198, 15, 0, 254, 200, 15, 0, 126, 203, 15, 0, 254, 205, 15, 0, 126, 208, 15, 0, 254, 210, 15, 0, 126, 213, 15, 0, 254, 215, 15, 0, 126, 218, 15, 0, 254, 220, 15, 0, 126, 223, 15, 0, 254, 225, 15, 0, 126, 228, 15, 0, 254, 230, 15, 0, 126, 233, 15, 0, 254, 235, 15, 0, 126, 238, 15, 0, 254, 240, 15, 0, 126, 243, 15, 0, 254, 245, 15, 0, 126, 248, 15, 0, 254, 250, 15, 0, 126, 253, 15, 0, 254, 255, 15, 0, 126, 2, 16, 0, 254, 4, 16, 0, 126, 7, 16, 0, 254, 9, 16, 0, 126, 12, 16, 0, 254, 14, 16, 0, 126, 17, 16, 0, 254, 19, 16, 0, 126, 22, 16, 0, 254, 24, 16, 0, 126, 27, 16, 0, 254, 29, 16, 0, 126, 32, 16, 0, 254, 34, 16, 0, 126, 37, 16, 0, 254, 39, 16, 0, 126, 42, 16, 0, 254, 44, 16, 0, 126, 47, 16, 0, 254, 49, 16, 0, 126, 52, 16, 0, 254, 54, 16, 0, 126, 57, 16, 0, 254, 59, 16, 0, 126, 62, 16, 0, 254, 64, 16, 0, 126, 67, 16, 0, 254, 69, 16, 0, 126, 72, 16, 0, 254, 74, 16, 0, 126, 77, 16, 0, 254, 79, 16, 0, 126, 82, 16, 0, 254, 84, 16, 0, 126, 87, 16, 0, 254, 89, 16, 0, 126, 92, 16, 0, 254, 94, 16, 0, 126, 97, 16, 0, 254, 99, 16, 0, 126, 102, 16, 0, 254, 104, 16, 0, 126, 107, 16, 0, 254, 109, 16, 0, 126, 112, 16, 0, 254, 114, 16, 0, 126, 117, 16, 0, 254, 119, 16, 0, 126, 122, 16, 0, 254, 124, 16, 0, 126, 127, 16, 0, 254, 129, 16, 0, 126, 132, 16, 0, 254, 134, 16, 0, 126, 137, 16, 0, 254, 139, 16, 0, 126, 142, 16, 0, 254, 144, 16, 0, 126, 147, 16, 0, 254, 149, 16, 0, 126, 152, 16, 0, 254, 154, 16, 0, 126, 157, 16, 0, 254, 159, 16, 0, 126, 162, 16, 0, 254, 164, 16, 0, 126, 167, 16, 0, 254, 169, 16, 0, 126, 172, 16, 0, 254, 174, 16, 0, 126, 177, 16, 0, 254, 179, 16, 0, 126, 182, 16, 0, 254, 184, 16, 0, 126, 187, 16, 0, 254, 189, 16, 0, 126, 192, 16, 0, 254, 194, 16, 0, 126, 197, 16, 0, 254, 199, 16, 0, 126, 202, 16, 0, 254, 204, 16, 0, 126, 207, 16, 0, 254, 209, 16, 0, 126, 212, 16, 0, 254, 214, 16, 0, 126, 217, 16, 0, 254, 219, 16, 0, 126, 222, 16, 0, 254, 224, 16, 0, 126, 227, 16, 0, 254, 229, 16, 0, 126, 232, 16, 0, 254, 234, 16, 0, 126, 237, 16, 0, 254, 239, 16, 0, 126, 242, 16, 0, 254, 244, 16, 0, 126, 247, 16, 0, 254, 249, 16, 0, 126, 252, 16, 0, 254, 254, 16, 0, 126, 1, 17, 0, 254, 3, 17, 0, 126, 6, 17, 0, 254, 8, 17, 0, 126, 11, 17, 0, 254, 13, 17, 0, 126, 16, 17, 0, 254, 18, 17, 0, 126, 21, 17, 0, 254, 23, 17, 0, 126, 26, 17, 0, 254, 28, 17, 0, 126, 31, 17, 0, 254, 33, 17, 0, 126, 36, 17, 0, 254, 38, 17, 0, 126, 41, 17, 0, 254, 43, 17, 0, 126, 46, 17, 0, 254, 48, 17, 0, 126, 51, 17, 0, 254, 53, 17, 0, 126, 56, 17, 0, 254, 58, 17, 0, 126, 61, 17, 0, 254, 63, 17, 0, 126, 66, 17, 0, 254, 68, 17, 0, 126, 71, 17, 0, 254, 73, 17, 0, 126, 76, 17, 0, 254, 78, 17, 0, 126, 81, 17, 0, 254, 83, 17, 0, 126, 86, 17, 0, 254, 88, 17, 0, 126, 91, 17, 0, 254, 93, 17, 0, 126, 96, 17, 0, 254, 98, 17, 0, 126, 101, 17, 0, 254, 103, 17, 0, 126, 106, 17, 0, 254, 108, 17, 0, 126, 111, 17, 0, 254, 113, 17, 0, 126, 116, 17, 0, 254, 118, 17, 0, 126, 121, 17, 0, 254, 123, 17, 0, 126, 126, 17, 0, 254, 128, 17, 0, 126, 131, 17, 0, 254, 133, 17, 0, 126, 136, 17, 0, 254, 138, 17, 0, 126, 141, 17, 0, 254, 143, 17, 0, 126, 146, 17, 0, 254, 148, 17, 0, 126, 151, 17, 0, 254, 153, 17, 0, 126, 156, 17, 0, 254, 158, 17, 0, 126, 161, 17, 0, 254, 163, 17, 0, 126, 166, 17, 0, 254, 168, 17, 0, 126, 171, 17, 0, 254, 173, 17, 0, 126, 176, 17, 0, 254, 178, 17, 0, 126, 181, 17, 0, 254, 183, 17, 0, 126, 186, 17, 0, 254, 188, 17, 0, 126, 191, 17, 0, 254, 193, 17, 0, 126, 196, 17, 0, 254, 198, 17, 0, 126, 201, 17, 0, 254, 203, 17, 0, 126, 206, 17, 0, 254, 208, 17, 0, 126, 211, 17, 0, 254, 213, 17, 0, 126, 216, 17, 0, 254, 218, 17, 0, 126, 221, 17, 0, 254, 223, 17, 0, 126, 226, 17, 0, 254, 228, 17, 0, 126, 231, 17, 0, 254, 233, 17, 0, 126, 236, 17, 0, 254, 238, 17, 0, 126, 241, 17, 0, 254, 243, 17, 0, 126, 246, 17, 0, 254, 248, 17, 0, 126, 251, 17, 0, 254, 253, 17, 0, 126, 0, 18, 0, 254, 2, 18, 0, 126, 5, 18, 0, 254, 7, 18, 0, 126, 10, 18, 0, 254, 12, 18, 0, 126, 15, 18, 0, 254, 17, 18, 0, 126, 20, 18, 0, 254, 22, 18, 0, 126, 25, 18, 0, 254, 27, 18, 0, 126, 30, 18, 0, 254, 32, 18, 0, 126, 35, 18, 0, 254, 37, 18, 0, 126, 40, 18, 0, 254, 42, 18, 0, 126, 45, 18, 0, 254, 47, 18, 0, 126, 50, 18, 0, 254, 52, 18, 0, 126, 55, 18, 0, 254, 57, 18, 0, 126, 60, 18, 0, 254, 62, 18, 0, 126, 65, 18, 0, 254, 67, 18, 0, 126, 70, 18, 0, 254, 72, 18, 0, 126, 75, 18, 0, 254, 77, 18, 0, 126, 80, 18, 0, 254, 82, 18, 0, 126, 85, 18, 0, 254, 87, 18, 0, 126, 90, 18, 0, 254, 92, 18, 0, 126, 95, 18, 0, 254, 97, 18, 0, 126, 100, 18, 0, 254, 102, 18, 0, 126, 105, 18, 0, 254, 107, 18, 0, 126, 110, 18, 0, 254, 112, 18, 0, 126, 115, 18, 0, 254, 117, 18, 0, 126, 120, 18, 0, 254, 122, 18, 0, 126, 125, 18, 0, 254, 127, 18, 0, 126, 130, 18, 0, 254, 132, 18, 0, 126, 135, 18, 0, 254, 137, 18, 0, 126, 140, 18, 0, 254, 142, 18, 0, 126, 145, 18, 0, 254, 147, 18, 0, 126, 150, 18, 0, 254, 152, 18, 0, 126, 155, 18, 0, 254, 157, 18, 0, 126, 160, 18, 0, 254, 162, 18, 0, 126, 165, 18, 0, 254, 167, 18, 0, 126, 170, 18, 0, 254, 172, 18, 0, 126, 175, 18, 0, 254, 177, 18, 0, 126, 180, 18, 0, 254, 182, 18, 0, 126, 185, 18, 0, 254, 187, 18, 0, 126, 190, 18, 0, 254, 192, 18, 0, 126, 195, 18, 0, 254, 197, 18, 0, 126, 200, 18, 0, 254, 202, 18, 0, 126, 205, 18, 0, 254, 207, 18, 0, 126, 210, 18, 0, 254, 212, 18, 0, 126, 215, 18, 0, 254, 217, 18, 0, 126, 220, 18, 0, 254, 222, 18, 0, 126, 225, 18, 0, 254, 227, 18, 0, 126, 230, 18, 0, 254, 232, 18, 0, 126, 235, 18, 0, 254, 237, 18, 0, 126, 240, 18, 0, 254, 242, 18, 0, 126, 245, 18, 0, 254, 247, 18, 0, 126, 250, 18, 0, 254, 252, 18, 0, 126, 255, 18, 0, 254, 1, 19, 0, 126, 4, 19, 0, 254, 6, 19, 0, 126, 9, 19, 0, 254, 11, 19, 0, 126, 14, 19, 0, 254, 16, 19, 0, 126, 19, 19, 0, 254, 21, 19, 0, 126, 24, 19, 0, 254, 26, 19, 0, 126, 29, 19, 0, 254, 31, 19, 0, 126, 34, 19, 0, 254, 36, 19, 0, 126, 39, 19, 0, 254, 41, 19, 0, 126, 44, 19, 0, 254, 46, 19, 0, 126, 49, 19, 0, 254, 51, 19, 0, 126, 54, 19, 0, 254, 56, 19, 0, 126, 59, 19, 0, 254, 61, 19, 0, 126, 64, 19, 0, 254, 66, 19, 0, 126, 69, 19, 0, 254, 71, 19, 0, 126, 74, 19, 0, 254, 76, 19, 0, 126, 79, 19, 0, 254, 81, 19, 0, 126, 84, 19, 0, 254, 86, 19, 0, 126, 89, 19, 0, 254, 91, 19, 0, 126, 94, 19, 0, 254, 96, 19, 0, 126, 99, 19, 0, 254, 101, 19, 0, 126, 104, 19, 0, 254, 106, 19, 0, 126, 109, 19, 0, 254, 111, 19, 0, 126, 114, 19, 0, 254, 116, 19, 0, 126, 119, 19, 0, 254, 121, 19, 0, 126, 124, 19, 0, 254, 126, 19, 0, 126, 129, 19, 0, 254, 131, 19, 0, 126, 134, 19, 0, 254, 136, 19, 0, 126, 139, 19, 0, 254, 141, 19, 0, 126, 144, 19, 0, 254, 146, 19, 0, 126, 149, 19, 0, 254, 151, 19, 0, 126, 154, 19, 0, 254, 156, 19, 0, 126, 159, 19, 0, 254, 161, 19, 0, 126, 164, 19, 0, 254, 166, 19, 0, 126, 169, 19, 0, 254, 171, 19, 0, 126, 174, 19, 0, 254, 176, 19, 0, 126, 179, 19, 0, 254, 181, 19, 0, 126, 184, 19, 0, 254, 186, 19, 0, 126, 189, 19, 0, 254, 191, 19, 0, 126, 194, 19, 0, 254, 196, 19, 0, 126, 199, 19, 0, 254, 201, 19, 0, 126, 204, 19, 0, 254, 206, 19, 0, 126, 209, 19, 0, 254, 211, 19, 0, 126, 214, 19, 0, 254, 216, 19, 0, 126, 219, 19, 0, 254, 221, 19, 0, 126, 224, 19, 0, 254, 226, 19, 0, 126, 229, 19, 0, 254, 231, 19, 0, 126, 234, 19, 0, 254, 236, 19, 0, 126, 239, 19, 0, 254, 241, 19, 0, 126, 244, 19, 0, 254, 246, 19, 0, 126, 249, 19, 0, 254, 251, 19, 0, 126, 254, 19, 0, 254, 0, 20, 0, 126, 3, 20, 0, 254, 5, 20, 0, 126, 8, 20, 0, 254, 10, 20, 0, 126, 13, 20, 0, 254, 15, 20, 0, 126, 18, 20, 0, 254, 20, 20, 0, 126, 23, 20, 0, 254, 25, 20, 0, 126, 28, 20, 0, 254, 30, 20, 0, 126, 33, 20, 0, 254, 35, 20, 0, 126, 38, 20, 0, 254, 40, 20, 0, 126, 43, 20, 0, 254, 45, 20, 0, 126, 48, 20, 0, 254, 50, 20, 0, 126, 53, 20, 0, 254, 55, 20, 0, 126, 58, 20, 0, 254, 60, 20, 0, 126, 63, 20, 0, 254, 65, 20, 0, 126, 68, 20, 0, 254, 70, 20, 0, 126, 73, 20, 0, 254, 75, 20, 0, 126, 78, 20, 0, 254, 80, 20, 0, 126, 83, 20, 0, 254, 85, 20, 0, 126, 88, 20, 0, 254, 90, 20, 0, 126, 93, 20, 0, 254, 95, 20, 0, 126, 98, 20, 0, 254, 100, 20, 0, 126, 103, 20, 0, 254, 105, 20, 0, 126, 108, 20, 0, 254, 110, 20, 0, 126, 113, 20, 0, 254, 115, 20, 0, 126, 118, 20, 0, 254, 120, 20, 0, 126, 123, 20, 0, 254, 125, 20, 0, 126, 128, 20, 0, 254, 130, 20, 0, 126, 133, 20, 0, 254, 135, 20, 0, 126, 138, 20, 0, 254, 140, 20, 0, 126, 143, 20, 0, 254, 145, 20, 0, 126, 148, 20, 0, 254, 150, 20, 0, 126, 153, 20, 0, 254, 155, 20, 0, 126, 158, 20, 0, 254, 160, 20, 0, 126, 163, 20, 0, 254, 165, 20, 0, 126, 168, 20, 0, 254, 170, 20, 0, 126, 173, 20, 0, 254, 175, 20, 0, 126, 178, 20, 0, 254, 180, 20, 0, 126, 183, 20, 0, 254, 185, 20, 0, 126, 188, 20, 0, 254, 190, 20, 0, 126, 193, 20, 0, 254, 195, 20, 0, 126, 198, 20, 0, 254, 200, 20, 0, 126, 203, 20, 0, 254, 205, 20, 0, 126, 208, 20, 0, 254, 210, 20, 0, 126, 213, 20, 0, 254, 215, 20, 0, 126, 218, 20, 0, 254, 220, 20, 0, 126, 223, 20, 0, 254, 225, 20, 0, 126, 228, 20, 0, 254, 230, 20, 0, 126, 233, 20, 0, 254, 235, 20, 0, 126, 238, 20, 0, 254, 240, 20, 0, 126, 243, 20, 0, 254, 245, 20, 0, 126, 248, 20, 0, 254, 250, 20, 0, 126, 253, 20, 0, 254, 255, 20, 0, 126, 2, 21, 0, 254, 4, 21, 0, 126, 7, 21, 0, 254, 9, 21, 0, 126, 12, 21, 0, 254, 14, 21, 0, 126, 17, 21, 0, 254, 19, 21, 0, 126, 22, 21, 0, 254, 24, 21, 0, 126, 27, 21, 0, 254, 29, 21, 0, 126, 32, 21, 0, 254, 34, 21, 0, 126, 37, 21, 0, 254, 39, 21, 0, 126, 42, 21, 0, 254, 44, 21, 0, 126, 47, 21, 0, 254, 49, 21, 0, 126, 52, 21, 0, 254, 54, 21, 0, 126, 57, 21, 0, 254, 59, 21, 0, 126, 62, 21, 0, 254, 64, 21, 0, 126, 67, 21, 0, 254, 69, 21, 0, 126, 72, 21, 0, 254, 74, 21, 0, 126, 77, 21, 0, 254, 79, 21, 0, 126, 82, 21, 0, 254, 84, 21, 0, 126, 87, 21, 0, 254, 89, 21, 0, 126, 92, 21, 0, 254, 94, 21, 0, 126, 97, 21, 0, 254, 99, 21, 0, 126, 102, 21, 0, 254, 104, 21, 0, 126, 107, 21, 0, 254, 109, 21, 0, 126, 112, 21, 0, 254, 114, 21, 0, 126, 117, 21, 0, 254, 119, 21, 0, 126, 122, 21, 0, 254, 124, 21, 0, 126, 127, 21, 0, 254, 129, 21, 0, 126, 132, 21, 0, 254, 134, 21, 0, 126, 137, 21, 0, 254, 139, 21, 0, 126, 142, 21, 0, 254, 144, 21, 0, 126, 147, 21, 0, 254, 149, 21, 0, 126, 152, 21, 0, 254, 154, 21, 0, 126, 157, 21, 0, 254, 159, 21, 0, 126, 162, 21, 0, 254, 164, 21, 0, 126, 167, 21, 0, 254, 169, 21, 0, 126, 172, 21, 0, 254, 174, 21, 0, 126, 177, 21, 0, 254, 179, 21, 0, 126, 182, 21, 0, 254, 184, 21, 0, 126, 187, 21, 0, 254, 189, 21, 0, 126, 192, 21, 0, 254, 194, 21, 0, 126, 197, 21, 0, 254, 199, 21, 0, 126, 202, 21, 0, 254, 204, 21, 0, 126, 207, 21, 0, 254, 209, 21, 0, 126, 212, 21, 0, 254, 214, 21, 0, 126, 217, 21, 0, 254, 219, 21, 0, 126, 222, 21, 0, 254, 224, 21, 0, 126, 227, 21, 0, 254, 229, 21, 0, 126, 232, 21, 0, 254, 234, 21, 0, 126, 237, 21, 0, 254, 239, 21, 0, 126, 242, 21, 0, 254, 244, 21, 0, 126, 247, 21, 0, 254, 249, 21, 0, 126, 252, 21, 0, 254, 254, 21, 0, 126, 1, 22, 0, 254, 3, 22, 0, 126, 6, 22, 0, 254, 8, 22, 0, 126, 11, 22, 0, 254, 13, 22, 0, 126, 16, 22, 0, 254, 18, 22, 0, 126, 21, 22, 0, 254, 23, 22, 0, 126, 26, 22, 0, 254, 28, 22, 0, 126, 31, 22, 0, 254, 33, 22, 0, 126, 36, 22, 0, 254, 38, 22, 0, 126, 41, 22, 0, 254, 43, 22, 0, 126, 46, 22, 0, 254, 48, 22, 0, 126, 51, 22, 0, 254, 53, 22, 0, 126, 56, 22, 0, 254, 58, 22, 0, 126, 61, 22, 0, 254, 63, 22, 0, 126, 66, 22, 0, 254, 68, 22, 0, 126, 71, 22, 0, 254, 73, 22, 0, 126, 76, 22, 0, 254, 78, 22, 0, 126, 81, 22, 0, 254, 83, 22, 0, 126, 86, 22, 0, 254, 88, 22, 0, 126, 91, 22, 0, 254, 93, 22, 0, 126, 96, 22, 0, 254, 98, 22, 0, 126, 101, 22, 0, 254, 103, 22, 0, 126, 106, 22, 0, 254, 108, 22, 0, 126, 111, 22, 0, 254, 113, 22, 0, 126, 116, 22, 0, 254, 118, 22, 0, 126, 121, 22, 0, 254, 123, 22, 0, 126, 126, 22, 0, 254, 128, 22, 0, 126, 131, 22, 0, 254, 133, 22, 0, 126, 136, 22, 0, 254, 138, 22, 0, 126, 141, 22, 0, 254, 143, 22, 0, 126, 146, 22, 0, 254, 148, 22, 0, 126, 151, 22, 0, 254, 153, 22, 0, 126, 156, 22, 0, 254, 158, 22, 0, 126, 161, 22, 0, 254, 163, 22, 0, 126, 166, 22, 0, 254, 168, 22, 0, 126, 171, 22, 0, 254, 173, 22, 0, 126, 176, 22, 0, 254, 178, 22, 0, 126, 181, 22, 0, 254, 183, 22, 0, 126, 186, 22, 0, 254, 188, 22, 0, 126, 191, 22, 0, 254, 193, 22, 0, 126, 196, 22, 0, 254, 198, 22, 0, 126, 201, 22, 0, 254, 203, 22, 0, 126, 206, 22, 0, 254, 208, 22, 0, 126, 211, 22, 0, 254, 213, 22, 0, 126, 216, 22, 0, 254, 218, 22, 0, 126, 221, 22, 0, 254, 223, 22, 0, 126, 226, 22, 0, 254, 228, 22, 0, 126, 231, 22, 0, 254, 233, 22, 0, 126, 236, 22, 0, 254, 238, 22, 0, 126, 241, 22, 0, 254, 243, 22, 0, 126, 246, 22, 0, 254, 248, 22, 0, 126, 251, 22, 0, 254, 253, 22, 0, 126, 0, 23, 0, 254, 2, 23, 0, 126, 5, 23, 0, 254, 7, 23, 0, 126, 10, 23, 0, 254, 12, 23, 0, 126, 15, 23, 0, 254, 17, 23, 0, 126, 20, 23, 0, 254, 22, 23, 0, 126, 25, 23, 0, 254, 27, 23, 0, 126, 30, 23, 0, 254, 32, 23, 0, 126, 35, 23, 0, 254, 37, 23, 0, 126, 40, 23, 0, 254, 42, 23, 0, 126, 45, 23, 0, 254, 47, 23, 0, 126, 50, 23, 0, 254, 52, 23, 0, 126, 55, 23, 0, 254, 57, 23, 0, 126, 60, 23, 0, 254, 62, 23, 0, 126, 65, 23, 0, 254, 67, 23, 0, 126, 70, 23, 0, 254, 72, 23, 0, 126, 75, 23, 0, 254, 77, 23, 0, 126, 80, 23, 0, 254, 82, 23, 0, 126, 85, 23, 0, 254, 87, 23, 0, 126, 90, 23, 0, 254, 92, 23, 0, 126, 95, 23, 0, 254, 97, 23, 0, 126, 100, 23, 0, 254, 102, 23, 0, 126, 105, 23, 0, 254, 107, 23, 0, 126, 110, 23, 0, 254, 112, 23, 0, 126, 115, 23, 0, 254, 117, 23, 0, 126, 120, 23, 0, 254, 122, 23, 0, 126, 125, 23, 0, 254, 127, 23, 0, 126, 130, 23, 0, 254, 132, 23, 0, 126, 135, 23, 0, 254, 137, 23, 0, 126, 140, 23, 0, 254, 142, 23, 0, 126, 145, 23, 0, 254, 147, 23, 0, 126, 150, 23, 0, 254, 152, 23, 0, 126, 155, 23, 0, 254, 157, 23, 0, 126, 160, 23, 0, 254, 162, 23, 0, 126, 165, 23, 0, 254, 167, 23, 0, 126, 170, 23, 0, 254, 172, 23, 0, 126, 175, 23, 0, 254, 177, 23, 0, 126, 180, 23, 0, 254, 182, 23, 0, 126, 185, 23, 0, 254, 187, 23, 0, 126, 190, 23, 0, 254, 192, 23, 0, 126, 195, 23, 0, 254, 197, 23, 0, 126, 200, 23, 0, 254, 202, 23, 0, 126, 205, 23, 0, 254, 207, 23, 0, 126, 210, 23, 0, 254, 212, 23, 0, 126, 215, 23, 0, 254, 217, 23, 0, 126, 220, 23, 0, 254, 222, 23, 0, 126, 225, 23, 0, 254, 227, 23, 0, 126, 230, 23, 0, 254, 232, 23, 0, 126, 235, 23, 0, 254, 237, 23, 0, 126, 240, 23, 0, 254, 242, 23, 0, 126, 245, 23, 0, 254, 247, 23, 0, 126, 250, 23, 0, 254, 252, 23, 0, 126, 255, 23, 0, 254, 1, 24, 0, 126, 4, 24, 0, 254, 6, 24, 0, 126, 9, 24, 0, 254, 11, 24, 0, 126, 14, 24, 0, 254, 16, 24, 0, 126, 19, 24, 0, 254, 21, 24, 0, 126, 24, 24, 0, 254, 26, 24, 0, 126, 29, 24, 0, 254, 31, 24, 0, 126, 34, 24, 0, 254, 36, 24, 0, 126, 39, 24, 0, 254, 41, 24, 0, 126, 44, 24, 0, 254, 46, 24, 0, 126, 49, 24, 0, 254, 51, 24, 0, 126, 54, 24, 0, 254, 56, 24, 0, 126, 59, 24, 0, 254, 61, 24, 0, 126, 64, 24, 0, 254, 66, 24, 0, 126, 69, 24, 0, 254, 71, 24, 0, 126, 74, 24, 0, 254, 76, 24, 0, 126, 79, 24, 0, 254, 81, 24, 0, 126, 84, 24, 0, 254, 86, 24, 0, 126, 89, 24, 0, 254, 91, 24, 0, 126, 94, 24, 0, 254, 96, 24, 0, 126, 99, 24, 0, 254, 101, 24, 0, 126, 104, 24, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_get_xy_rising_trigger.json b/tests/recordings/logic_analyzer/test_get_xy_rising_trigger.json deleted file mode 100644 index 7c38326a..00000000 --- a/tests/recordings/logic_analyzer/test_get_xy_rising_trigger.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [3], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, 124, 2, 0, 0, 187, 3, 0, 0, 252, 4, 0, 0, 59, 6, 0, 0, 124, 7, 0, 0, 187, 8, 0, 0, 252, 9, 0, 0, 59, 11, 0, 0, 124, 12, 0, 0, 187, 13, 0, 0, 252, 14, 0, 0, 59, 16, 0, 0, 124, 17, 0, 0, 187, 18, 0, 0, 252, 19, 0, 0, 59, 21, 0, 0, 124, 22, 0, 0, 187, 23, 0, 0, 252, 24, 0, 0, 59, 26, 0, 0, 124, 27, 0, 0, 187, 28, 0, 0, 252, 29, 0, 0, 59, 31, 0, 0, 124, 32, 0, 0, 187, 33, 0, 0, 252, 34, 0, 0, 59, 36, 0, 0, 124, 37, 0, 0, 187, 38, 0, 0, 252, 39, 0, 0, 59, 41, 0, 0, 124, 42, 0, 0, 187, 43, 0, 0, 252, 44, 0, 0, 59, 46, 0, 0, 124, 47, 0, 0, 187, 48, 0, 0, 252, 49, 0, 0, 59, 51, 0, 0, 124, 52, 0, 0, 187, 53, 0, 0, 252, 54, 0, 0, 59, 56, 0, 0, 124, 57, 0, 0, 187, 58, 0, 0, 252, 59, 0, 0, 59, 61, 0, 0, 124, 62, 0, 0, 187, 63, 0, 0, 252, 64, 0, 0, 59, 66, 0, 0, 124, 67, 0, 0, 187, 68, 0, 0, 252, 69, 0, 0, 59, 71, 0, 0, 124, 72, 0, 0, 187, 73, 0, 0, 252, 74, 0, 0, 59, 76, 0, 0, 124, 77, 0, 0, 187, 78, 0, 0, 252, 79, 0, 0, 59, 81, 0, 0, 124, 82, 0, 0, 187, 83, 0, 0, 252, 84, 0, 0, 59, 86, 0, 0, 124, 87, 0, 0, 187, 88, 0, 0, 252, 89, 0, 0, 59, 91, 0, 0, 124, 92, 0, 0, 187, 93, 0, 0, 252, 94, 0, 0, 59, 96, 0, 0, 124, 97, 0, 0, 187, 98, 0, 0, 252, 99, 0, 0, 59, 101, 0, 0, 124, 102, 0, 0, 187, 103, 0, 0, 252, 104, 0, 0, 59, 106, 0, 0, 124, 107, 0, 0, 187, 108, 0, 0, 252, 109, 0, 0, 59, 111, 0, 0, 124, 112, 0, 0, 187, 113, 0, 0, 252, 114, 0, 0, 59, 116, 0, 0, 124, 117, 0, 0, 187, 118, 0, 0, 252, 119, 0, 0, 59, 121, 0, 0, 124, 122, 0, 0, 187, 123, 0, 0, 252, 124, 0, 0, 59, 126, 0, 0, 124, 127, 0, 0, 187, 128, 0, 0, 252, 129, 0, 0, 59, 131, 0, 0, 124, 132, 0, 0, 187, 133, 0, 0, 252, 134, 0, 0, 59, 136, 0, 0, 124, 137, 0, 0, 187, 138, 0, 0, 252, 139, 0, 0, 59, 141, 0, 0, 124, 142, 0, 0, 187, 143, 0, 0, 252, 144, 0, 0, 59, 146, 0, 0, 124, 147, 0, 0, 187, 148, 0, 0, 252, 149, 0, 0, 59, 151, 0, 0, 124, 152, 0, 0, 187, 153, 0, 0, 252, 154, 0, 0, 59, 156, 0, 0, 124, 157, 0, 0, 187, 158, 0, 0, 252, 159, 0, 0, 59, 161, 0, 0, 124, 162, 0, 0, 187, 163, 0, 0, 252, 164, 0, 0, 59, 166, 0, 0, 124, 167, 0, 0, 187, 168, 0, 0, 252, 169, 0, 0, 59, 171, 0, 0, 124, 172, 0, 0, 187, 173, 0, 0, 252, 174, 0, 0, 59, 176, 0, 0, 124, 177, 0, 0, 187, 178, 0, 0, 252, 179, 0, 0, 59, 181, 0, 0, 124, 182, 0, 0, 187, 183, 0, 0, 252, 184, 0, 0, 59, 186, 0, 0, 124, 187, 0, 0, 187, 188, 0, 0, 252, 189, 0, 0, 59, 191, 0, 0, 124, 192, 0, 0, 187, 193, 0, 0, 252, 194, 0, 0, 59, 196, 0, 0, 124, 197, 0, 0, 187, 198, 0, 0, 252, 199, 0, 0, 59, 201, 0, 0, 124, 202, 0, 0, 187, 203, 0, 0, 252, 204, 0, 0, 59, 206, 0, 0, 124, 207, 0, 0, 187, 208, 0, 0, 252, 209, 0, 0, 59, 211, 0, 0, 124, 212, 0, 0, 187, 213, 0, 0, 252, 214, 0, 0, 59, 216, 0, 0, 124, 217, 0, 0, 187, 218, 0, 0, 252, 219, 0, 0, 59, 221, 0, 0, 124, 222, 0, 0, 187, 223, 0, 0, 252, 224, 0, 0, 59, 226, 0, 0, 124, 227, 0, 0, 187, 228, 0, 0, 252, 229, 0, 0, 59, 231, 0, 0, 124, 232, 0, 0, 187, 233, 0, 0, 252, 234, 0, 0, 59, 236, 0, 0, 124, 237, 0, 0, 187, 238, 0, 0, 252, 239, 0, 0, 59, 241, 0, 0, 124, 242, 0, 0, 187, 243, 0, 0, 252, 244, 0, 0, 59, 246, 0, 0, 124, 247, 0, 0, 187, 248, 0, 0, 252, 249, 0, 0, 59, 251, 0, 0, 124, 252, 0, 0, 187, 253, 0, 0, 252, 254, 0, 0, 59, 0, 1, 0, 124, 1, 1, 0, 187, 2, 1, 0, 252, 3, 1, 0, 59, 5, 1, 0, 124, 6, 1, 0, 187, 7, 1, 0, 252, 8, 1, 0, 59, 10, 1, 0, 124, 11, 1, 0, 187, 12, 1, 0, 252, 13, 1, 0, 59, 15, 1, 0, 124, 16, 1, 0, 187, 17, 1, 0, 252, 18, 1, 0, 59, 20, 1, 0, 124, 21, 1, 0, 187, 22, 1, 0, 252, 23, 1, 0, 59, 25, 1, 0, 124, 26, 1, 0, 187, 27, 1, 0, 252, 28, 1, 0, 59, 30, 1, 0, 124, 31, 1, 0, 187, 32, 1, 0, 252, 33, 1, 0, 59, 35, 1, 0, 124, 36, 1, 0, 187, 37, 1, 0, 252, 38, 1, 0, 59, 40, 1, 0, 124, 41, 1, 0, 187, 42, 1, 0, 252, 43, 1, 0, 59, 45, 1, 0, 124, 46, 1, 0, 187, 47, 1, 0, 252, 48, 1, 0, 59, 50, 1, 0, 124, 51, 1, 0, 187, 52, 1, 0, 252, 53, 1, 0, 59, 55, 1, 0, 124, 56, 1, 0, 187, 57, 1, 0, 252, 58, 1, 0, 59, 60, 1, 0, 124, 61, 1, 0, 187, 62, 1, 0, 252, 63, 1, 0, 59, 65, 1, 0, 124, 66, 1, 0, 187, 67, 1, 0, 252, 68, 1, 0, 59, 70, 1, 0, 124, 71, 1, 0, 187, 72, 1, 0, 252, 73, 1, 0, 59, 75, 1, 0, 124, 76, 1, 0, 187, 77, 1, 0, 252, 78, 1, 0, 59, 80, 1, 0, 124, 81, 1, 0, 187, 82, 1, 0, 252, 83, 1, 0, 59, 85, 1, 0, 124, 86, 1, 0, 187, 87, 1, 0, 252, 88, 1, 0, 59, 90, 1, 0, 124, 91, 1, 0, 187, 92, 1, 0, 252, 93, 1, 0, 59, 95, 1, 0, 124, 96, 1, 0, 187, 97, 1, 0, 252, 98, 1, 0, 59, 100, 1, 0, 124, 101, 1, 0, 187, 102, 1, 0, 252, 103, 1, 0, 59, 105, 1, 0, 124, 106, 1, 0, 187, 107, 1, 0, 252, 108, 1, 0, 59, 110, 1, 0, 124, 111, 1, 0, 187, 112, 1, 0, 252, 113, 1, 0, 59, 115, 1, 0, 124, 116, 1, 0, 187, 117, 1, 0, 252, 118, 1, 0, 59, 120, 1, 0, 124, 121, 1, 0, 187, 122, 1, 0, 252, 123, 1, 0, 59, 125, 1, 0, 124, 126, 1, 0, 187, 127, 1, 0, 252, 128, 1, 0, 59, 130, 1, 0, 124, 131, 1, 0, 187, 132, 1, 0, 252, 133, 1, 0, 59, 135, 1, 0, 124, 136, 1, 0, 187, 137, 1, 0, 252, 138, 1, 0, 59, 140, 1, 0, 124, 141, 1, 0, 187, 142, 1, 0, 252, 143, 1, 0, 59, 145, 1, 0, 124, 146, 1, 0, 187, 147, 1, 0, 252, 148, 1, 0, 59, 150, 1, 0, 124, 151, 1, 0, 187, 152, 1, 0, 252, 153, 1, 0, 59, 155, 1, 0, 124, 156, 1, 0, 187, 157, 1, 0, 252, 158, 1, 0, 59, 160, 1, 0, 124, 161, 1, 0, 187, 162, 1, 0, 252, 163, 1, 0, 59, 165, 1, 0, 124, 166, 1, 0, 187, 167, 1, 0, 252, 168, 1, 0, 59, 170, 1, 0, 124, 171, 1, 0, 187, 172, 1, 0, 252, 173, 1, 0, 59, 175, 1, 0, 124, 176, 1, 0, 187, 177, 1, 0, 252, 178, 1, 0, 59, 180, 1, 0, 124, 181, 1, 0, 187, 182, 1, 0, 252, 183, 1, 0, 59, 185, 1, 0, 124, 186, 1, 0, 187, 187, 1, 0, 252, 188, 1, 0, 59, 190, 1, 0, 124, 191, 1, 0, 187, 192, 1, 0, 252, 193, 1, 0, 59, 195, 1, 0, 124, 196, 1, 0, 187, 197, 1, 0, 252, 198, 1, 0, 59, 200, 1, 0, 124, 201, 1, 0, 187, 202, 1, 0, 252, 203, 1, 0, 59, 205, 1, 0, 124, 206, 1, 0, 187, 207, 1, 0, 252, 208, 1, 0, 59, 210, 1, 0, 124, 211, 1, 0, 187, 212, 1, 0, 252, 213, 1, 0, 59, 215, 1, 0, 124, 216, 1, 0, 187, 217, 1, 0, 252, 218, 1, 0, 59, 220, 1, 0, 124, 221, 1, 0, 187, 222, 1, 0, 252, 223, 1, 0, 59, 225, 1, 0, 124, 226, 1, 0, 187, 227, 1, 0, 252, 228, 1, 0, 59, 230, 1, 0, 124, 231, 1, 0, 187, 232, 1, 0, 252, 233, 1, 0, 59, 235, 1, 0, 124, 236, 1, 0, 187, 237, 1, 0, 252, 238, 1, 0, 59, 240, 1, 0, 124, 241, 1, 0, 187, 242, 1, 0, 252, 243, 1, 0, 59, 245, 1, 0, 124, 246, 1, 0, 187, 247, 1, 0, 252, 248, 1, 0, 59, 250, 1, 0, 124, 251, 1, 0, 187, 252, 1, 0, 252, 253, 1, 0, 59, 255, 1, 0, 124, 0, 2, 0, 187, 1, 2, 0, 252, 2, 2, 0, 59, 4, 2, 0, 124, 5, 2, 0, 187, 6, 2, 0, 252, 7, 2, 0, 59, 9, 2, 0, 124, 10, 2, 0, 187, 11, 2, 0, 252, 12, 2, 0, 59, 14, 2, 0, 124, 15, 2, 0, 187, 16, 2, 0, 252, 17, 2, 0, 59, 19, 2, 0, 124, 20, 2, 0, 187, 21, 2, 0, 252, 22, 2, 0, 59, 24, 2, 0, 124, 25, 2, 0, 187, 26, 2, 0, 252, 27, 2, 0, 59, 29, 2, 0, 124, 30, 2, 0, 187, 31, 2, 0, 252, 32, 2, 0, 59, 34, 2, 0, 124, 35, 2, 0, 187, 36, 2, 0, 252, 37, 2, 0, 59, 39, 2, 0, 124, 40, 2, 0, 187, 41, 2, 0, 252, 42, 2, 0, 59, 44, 2, 0, 124, 45, 2, 0, 187, 46, 2, 0, 252, 47, 2, 0, 59, 49, 2, 0, 124, 50, 2, 0, 187, 51, 2, 0, 252, 52, 2, 0, 59, 54, 2, 0, 124, 55, 2, 0, 187, 56, 2, 0, 252, 57, 2, 0, 59, 59, 2, 0, 124, 60, 2, 0, 187, 61, 2, 0, 252, 62, 2, 0, 59, 64, 2, 0, 124, 65, 2, 0, 187, 66, 2, 0, 252, 67, 2, 0, 59, 69, 2, 0, 124, 70, 2, 0, 187, 71, 2, 0, 252, 72, 2, 0, 59, 74, 2, 0, 124, 75, 2, 0, 187, 76, 2, 0, 252, 77, 2, 0, 59, 79, 2, 0, 124, 80, 2, 0, 187, 81, 2, 0, 252, 82, 2, 0, 59, 84, 2, 0, 124, 85, 2, 0, 187, 86, 2, 0, 252, 87, 2, 0, 59, 89, 2, 0, 124, 90, 2, 0, 187, 91, 2, 0, 252, 92, 2, 0, 59, 94, 2, 0, 124, 95, 2, 0, 187, 96, 2, 0, 252, 97, 2, 0, 59, 99, 2, 0, 124, 100, 2, 0, 187, 101, 2, 0, 252, 102, 2, 0, 59, 104, 2, 0, 124, 105, 2, 0, 187, 106, 2, 0, 252, 107, 2, 0, 59, 109, 2, 0, 124, 110, 2, 0, 187, 111, 2, 0, 252, 112, 2, 0, 59, 114, 2, 0, 124, 115, 2, 0, 187, 116, 2, 0, 252, 117, 2, 0, 59, 119, 2, 0, 124, 120, 2, 0, 187, 121, 2, 0, 252, 122, 2, 0, 59, 124, 2, 0, 124, 125, 2, 0, 187, 126, 2, 0, 252, 127, 2, 0, 59, 129, 2, 0, 124, 130, 2, 0, 187, 131, 2, 0, 252, 132, 2, 0, 59, 134, 2, 0, 124, 135, 2, 0, 187, 136, 2, 0, 252, 137, 2, 0, 59, 139, 2, 0, 124, 140, 2, 0, 187, 141, 2, 0, 252, 142, 2, 0, 59, 144, 2, 0, 124, 145, 2, 0, 187, 146, 2, 0, 252, 147, 2, 0, 59, 149, 2, 0, 124, 150, 2, 0, 187, 151, 2, 0, 252, 152, 2, 0, 59, 154, 2, 0, 124, 155, 2, 0, 187, 156, 2, 0, 252, 157, 2, 0, 59, 159, 2, 0, 124, 160, 2, 0, 187, 161, 2, 0, 252, 162, 2, 0, 59, 164, 2, 0, 124, 165, 2, 0, 187, 166, 2, 0, 252, 167, 2, 0, 59, 169, 2, 0, 124, 170, 2, 0, 187, 171, 2, 0, 252, 172, 2, 0, 59, 174, 2, 0, 124, 175, 2, 0, 187, 176, 2, 0, 252, 177, 2, 0, 59, 179, 2, 0, 124, 180, 2, 0, 187, 181, 2, 0, 252, 182, 2, 0, 59, 184, 2, 0, 124, 185, 2, 0, 187, 186, 2, 0, 252, 187, 2, 0, 59, 189, 2, 0, 124, 190, 2, 0, 187, 191, 2, 0, 252, 192, 2, 0, 59, 194, 2, 0, 124, 195, 2, 0, 187, 196, 2, 0, 252, 197, 2, 0, 59, 199, 2, 0, 124, 200, 2, 0, 187, 201, 2, 0, 252, 202, 2, 0, 59, 204, 2, 0, 124, 205, 2, 0, 187, 206, 2, 0, 252, 207, 2, 0, 59, 209, 2, 0, 124, 210, 2, 0, 187, 211, 2, 0, 252, 212, 2, 0, 59, 214, 2, 0, 124, 215, 2, 0, 187, 216, 2, 0, 252, 217, 2, 0, 59, 219, 2, 0, 124, 220, 2, 0, 187, 221, 2, 0, 252, 222, 2, 0, 59, 224, 2, 0, 124, 225, 2, 0, 187, 226, 2, 0, 252, 227, 2, 0, 59, 229, 2, 0, 124, 230, 2, 0, 187, 231, 2, 0, 252, 232, 2, 0, 59, 234, 2, 0, 124, 235, 2, 0, 187, 236, 2, 0, 252, 237, 2, 0, 59, 239, 2, 0, 124, 240, 2, 0, 187, 241, 2, 0, 252, 242, 2, 0, 59, 244, 2, 0, 124, 245, 2, 0, 187, 246, 2, 0, 252, 247, 2, 0, 59, 249, 2, 0, 124, 250, 2, 0, 187, 251, 2, 0, 252, 252, 2, 0, 59, 254, 2, 0, 124, 255, 2, 0, 187, 0, 3, 0, 252, 1, 3, 0, 59, 3, 3, 0, 124, 4, 3, 0, 187, 5, 3, 0, 252, 6, 3, 0, 59, 8, 3, 0, 124, 9, 3, 0, 187, 10, 3, 0, 252, 11, 3, 0, 59, 13, 3, 0, 124, 14, 3, 0, 187, 15, 3, 0, 252, 16, 3, 0, 59, 18, 3, 0, 124, 19, 3, 0, 187, 20, 3, 0, 252, 21, 3, 0, 59, 23, 3, 0, 124, 24, 3, 0, 187, 25, 3, 0, 252, 26, 3, 0, 59, 28, 3, 0, 124, 29, 3, 0, 187, 30, 3, 0, 252, 31, 3, 0, 59, 33, 3, 0, 124, 34, 3, 0, 187, 35, 3, 0, 252, 36, 3, 0, 59, 38, 3, 0, 124, 39, 3, 0, 187, 40, 3, 0, 252, 41, 3, 0, 59, 43, 3, 0, 124, 44, 3, 0, 187, 45, 3, 0, 252, 46, 3, 0, 59, 48, 3, 0, 124, 49, 3, 0, 187, 50, 3, 0, 252, 51, 3, 0, 59, 53, 3, 0, 124, 54, 3, 0, 187, 55, 3, 0, 252, 56, 3, 0, 59, 58, 3, 0, 124, 59, 3, 0, 187, 60, 3, 0, 252, 61, 3, 0, 59, 63, 3, 0, 124, 64, 3, 0, 187, 65, 3, 0, 252, 66, 3, 0, 59, 68, 3, 0, 124, 69, 3, 0, 187, 70, 3, 0, 252, 71, 3, 0, 59, 73, 3, 0, 124, 74, 3, 0, 187, 75, 3, 0, 252, 76, 3, 0, 59, 78, 3, 0, 124, 79, 3, 0, 187, 80, 3, 0, 252, 81, 3, 0, 59, 83, 3, 0, 124, 84, 3, 0, 187, 85, 3, 0, 252, 86, 3, 0, 59, 88, 3, 0, 124, 89, 3, 0, 187, 90, 3, 0, 252, 91, 3, 0, 59, 93, 3, 0, 124, 94, 3, 0, 187, 95, 3, 0, 252, 96, 3, 0, 59, 98, 3, 0, 124, 99, 3, 0, 187, 100, 3, 0, 252, 101, 3, 0, 59, 103, 3, 0, 124, 104, 3, 0, 187, 105, 3, 0, 252, 106, 3, 0, 59, 108, 3, 0, 124, 109, 3, 0, 187, 110, 3, 0, 252, 111, 3, 0, 59, 113, 3, 0, 124, 114, 3, 0, 187, 115, 3, 0, 252, 116, 3, 0, 59, 118, 3, 0, 124, 119, 3, 0, 187, 120, 3, 0, 252, 121, 3, 0, 59, 123, 3, 0, 124, 124, 3, 0, 187, 125, 3, 0, 252, 126, 3, 0, 59, 128, 3, 0, 124, 129, 3, 0, 187, 130, 3, 0, 252, 131, 3, 0, 59, 133, 3, 0, 124, 134, 3, 0, 187, 135, 3, 0, 252, 136, 3, 0, 59, 138, 3, 0, 124, 139, 3, 0, 187, 140, 3, 0, 252, 141, 3, 0, 59, 143, 3, 0, 124, 144, 3, 0, 187, 145, 3, 0, 252, 146, 3, 0, 59, 148, 3, 0, 124, 149, 3, 0, 187, 150, 3, 0, 252, 151, 3, 0, 59, 153, 3, 0, 124, 154, 3, 0, 187, 155, 3, 0, 252, 156, 3, 0, 59, 158, 3, 0, 124, 159, 3, 0, 187, 160, 3, 0, 252, 161, 3, 0, 59, 163, 3, 0, 124, 164, 3, 0, 187, 165, 3, 0, 252, 166, 3, 0, 59, 168, 3, 0, 124, 169, 3, 0, 187, 170, 3, 0, 252, 171, 3, 0, 59, 173, 3, 0, 124, 174, 3, 0, 187, 175, 3, 0, 252, 176, 3, 0, 59, 178, 3, 0, 124, 179, 3, 0, 187, 180, 3, 0, 252, 181, 3, 0, 59, 183, 3, 0, 124, 184, 3, 0, 187, 185, 3, 0, 252, 186, 3, 0, 59, 188, 3, 0, 124, 189, 3, 0, 187, 190, 3, 0, 252, 191, 3, 0, 59, 193, 3, 0, 124, 194, 3, 0, 187, 195, 3, 0, 252, 196, 3, 0, 59, 198, 3, 0, 124, 199, 3, 0, 187, 200, 3, 0, 252, 201, 3, 0, 59, 203, 3, 0, 124, 204, 3, 0, 187, 205, 3, 0, 252, 206, 3, 0, 59, 208, 3, 0, 124, 209, 3, 0, 187, 210, 3, 0, 252, 211, 3, 0, 59, 213, 3, 0, 124, 214, 3, 0, 187, 215, 3, 0, 252, 216, 3, 0, 59, 218, 3, 0, 124, 219, 3, 0, 187, 220, 3, 0, 252, 221, 3, 0, 59, 223, 3, 0, 124, 224, 3, 0, 187, 225, 3, 0, 252, 226, 3, 0, 59, 228, 3, 0, 124, 229, 3, 0, 187, 230, 3, 0, 252, 231, 3, 0, 59, 233, 3, 0, 124, 234, 3, 0, 187, 235, 3, 0, 252, 236, 3, 0, 59, 238, 3, 0, 124, 239, 3, 0, 187, 240, 3, 0, 252, 241, 3, 0, 59, 243, 3, 0, 124, 244, 3, 0, 187, 245, 3, 0, 252, 246, 3, 0, 59, 248, 3, 0, 124, 249, 3, 0, 187, 250, 3, 0, 252, 251, 3, 0, 59, 253, 3, 0, 124, 254, 3, 0, 187, 255, 3, 0, 252, 0, 4, 0, 59, 2, 4, 0, 124, 3, 4, 0, 187, 4, 4, 0, 252, 5, 4, 0, 59, 7, 4, 0, 124, 8, 4, 0, 187, 9, 4, 0, 252, 10, 4, 0, 59, 12, 4, 0, 124, 13, 4, 0, 187, 14, 4, 0, 252, 15, 4, 0, 59, 17, 4, 0, 124, 18, 4, 0, 187, 19, 4, 0, 252, 20, 4, 0, 59, 22, 4, 0, 124, 23, 4, 0, 187, 24, 4, 0, 252, 25, 4, 0, 59, 27, 4, 0, 124, 28, 4, 0, 187, 29, 4, 0, 252, 30, 4, 0, 59, 32, 4, 0, 124, 33, 4, 0, 187, 34, 4, 0, 252, 35, 4, 0, 59, 37, 4, 0, 124, 38, 4, 0, 187, 39, 4, 0, 252, 40, 4, 0, 59, 42, 4, 0, 124, 43, 4, 0, 187, 44, 4, 0, 252, 45, 4, 0, 59, 47, 4, 0, 124, 48, 4, 0, 187, 49, 4, 0, 252, 50, 4, 0, 59, 52, 4, 0, 124, 53, 4, 0, 187, 54, 4, 0, 252, 55, 4, 0, 59, 57, 4, 0, 124, 58, 4, 0, 187, 59, 4, 0, 252, 60, 4, 0, 59, 62, 4, 0, 124, 63, 4, 0, 187, 64, 4, 0, 252, 65, 4, 0, 59, 67, 4, 0, 124, 68, 4, 0, 187, 69, 4, 0, 252, 70, 4, 0, 59, 72, 4, 0, 124, 73, 4, 0, 187, 74, 4, 0, 252, 75, 4, 0, 59, 77, 4, 0, 124, 78, 4, 0, 187, 79, 4, 0, 252, 80, 4, 0, 59, 82, 4, 0, 124, 83, 4, 0, 187, 84, 4, 0, 252, 85, 4, 0, 59, 87, 4, 0, 124, 88, 4, 0, 187, 89, 4, 0, 252, 90, 4, 0, 59, 92, 4, 0, 124, 93, 4, 0, 187, 94, 4, 0, 252, 95, 4, 0, 59, 97, 4, 0, 124, 98, 4, 0, 187, 99, 4, 0, 252, 100, 4, 0, 59, 102, 4, 0, 124, 103, 4, 0, 187, 104, 4, 0, 252, 105, 4, 0, 59, 107, 4, 0, 124, 108, 4, 0, 187, 109, 4, 0, 252, 110, 4, 0, 59, 112, 4, 0, 124, 113, 4, 0, 187, 114, 4, 0, 252, 115, 4, 0, 59, 117, 4, 0, 124, 118, 4, 0, 187, 119, 4, 0, 252, 120, 4, 0, 59, 122, 4, 0, 124, 123, 4, 0, 187, 124, 4, 0, 252, 125, 4, 0, 59, 127, 4, 0, 124, 128, 4, 0, 187, 129, 4, 0, 252, 130, 4, 0, 59, 132, 4, 0, 124, 133, 4, 0, 187, 134, 4, 0, 252, 135, 4, 0, 59, 137, 4, 0, 124, 138, 4, 0, 187, 139, 4, 0, 252, 140, 4, 0, 59, 142, 4, 0, 124, 143, 4, 0, 187, 144, 4, 0, 252, 145, 4, 0, 59, 147, 4, 0, 124, 148, 4, 0, 187, 149, 4, 0, 252, 150, 4, 0, 59, 152, 4, 0, 124, 153, 4, 0, 187, 154, 4, 0, 252, 155, 4, 0, 59, 157, 4, 0, 124, 158, 4, 0, 187, 159, 4, 0, 252, 160, 4, 0, 59, 162, 4, 0, 124, 163, 4, 0, 187, 164, 4, 0, 252, 165, 4, 0, 59, 167, 4, 0, 124, 168, 4, 0, 187, 169, 4, 0, 252, 170, 4, 0, 59, 172, 4, 0, 124, 173, 4, 0, 187, 174, 4, 0, 252, 175, 4, 0, 59, 177, 4, 0, 124, 178, 4, 0, 187, 179, 4, 0, 252, 180, 4, 0, 59, 182, 4, 0, 124, 183, 4, 0, 187, 184, 4, 0, 252, 185, 4, 0, 59, 187, 4, 0, 124, 188, 4, 0, 187, 189, 4, 0, 252, 190, 4, 0, 59, 192, 4, 0, 124, 193, 4, 0, 187, 194, 4, 0, 252, 195, 4, 0, 59, 197, 4, 0, 124, 198, 4, 0, 187, 199, 4, 0, 252, 200, 4, 0, 59, 202, 4, 0, 124, 203, 4, 0, 187, 204, 4, 0, 252, 205, 4, 0, 59, 207, 4, 0, 124, 208, 4, 0, 187, 209, 4, 0, 252, 210, 4, 0, 59, 212, 4, 0, 124, 213, 4, 0, 187, 214, 4, 0, 252, 215, 4, 0, 59, 217, 4, 0, 124, 218, 4, 0, 187, 219, 4, 0, 252, 220, 4, 0, 59, 222, 4, 0, 124, 223, 4, 0, 187, 224, 4, 0, 252, 225, 4, 0, 59, 227, 4, 0, 124, 228, 4, 0, 187, 229, 4, 0, 252, 230, 4, 0, 59, 232, 4, 0, 124, 233, 4, 0, 187, 234, 4, 0, 252, 235, 4, 0, 59, 237, 4, 0, 124, 238, 4, 0, 187, 239, 4, 0, 252, 240, 4, 0, 59, 242, 4, 0, 124, 243, 4, 0, 187, 244, 4, 0, 252, 245, 4, 0, 59, 247, 4, 0, 124, 248, 4, 0, 187, 249, 4, 0, 252, 250, 4, 0, 59, 252, 4, 0, 124, 253, 4, 0, 187, 254, 4, 0, 252, 255, 4, 0, 59, 1, 5, 0, 124, 2, 5, 0, 187, 3, 5, 0, 252, 4, 5, 0, 59, 6, 5, 0, 124, 7, 5, 0, 187, 8, 5, 0, 252, 9, 5, 0, 59, 11, 5, 0, 124, 12, 5, 0, 187, 13, 5, 0, 252, 14, 5, 0, 59, 16, 5, 0, 124, 17, 5, 0, 187, 18, 5, 0, 252, 19, 5, 0, 59, 21, 5, 0, 124, 22, 5, 0, 187, 23, 5, 0, 252, 24, 5, 0, 59, 26, 5, 0, 124, 27, 5, 0, 187, 28, 5, 0, 252, 29, 5, 0, 59, 31, 5, 0, 124, 32, 5, 0, 187, 33, 5, 0, 252, 34, 5, 0, 59, 36, 5, 0, 124, 37, 5, 0, 187, 38, 5, 0, 252, 39, 5, 0, 59, 41, 5, 0, 124, 42, 5, 0, 187, 43, 5, 0, 252, 44, 5, 0, 59, 46, 5, 0, 124, 47, 5, 0, 187, 48, 5, 0, 252, 49, 5, 0, 59, 51, 5, 0, 124, 52, 5, 0, 187, 53, 5, 0, 252, 54, 5, 0, 59, 56, 5, 0, 124, 57, 5, 0, 187, 58, 5, 0, 252, 59, 5, 0, 59, 61, 5, 0, 124, 62, 5, 0, 187, 63, 5, 0, 252, 64, 5, 0, 59, 66, 5, 0, 124, 67, 5, 0, 187, 68, 5, 0, 252, 69, 5, 0, 59, 71, 5, 0, 124, 72, 5, 0, 187, 73, 5, 0, 252, 74, 5, 0, 59, 76, 5, 0, 124, 77, 5, 0, 187, 78, 5, 0, 252, 79, 5, 0, 59, 81, 5, 0, 124, 82, 5, 0, 187, 83, 5, 0, 252, 84, 5, 0, 59, 86, 5, 0, 124, 87, 5, 0, 187, 88, 5, 0, 252, 89, 5, 0, 59, 91, 5, 0, 124, 92, 5, 0, 187, 93, 5, 0, 252, 94, 5, 0, 59, 96, 5, 0, 124, 97, 5, 0, 187, 98, 5, 0, 252, 99, 5, 0, 59, 101, 5, 0, 124, 102, 5, 0, 187, 103, 5, 0, 252, 104, 5, 0, 59, 106, 5, 0, 124, 107, 5, 0, 187, 108, 5, 0, 252, 109, 5, 0, 59, 111, 5, 0, 124, 112, 5, 0, 187, 113, 5, 0, 252, 114, 5, 0, 59, 116, 5, 0, 124, 117, 5, 0, 187, 118, 5, 0, 252, 119, 5, 0, 59, 121, 5, 0, 124, 122, 5, 0, 187, 123, 5, 0, 252, 124, 5, 0, 59, 126, 5, 0, 124, 127, 5, 0, 187, 128, 5, 0, 252, 129, 5, 0, 59, 131, 5, 0, 124, 132, 5, 0, 187, 133, 5, 0, 252, 134, 5, 0, 59, 136, 5, 0, 124, 137, 5, 0, 187, 138, 5, 0, 252, 139, 5, 0, 59, 141, 5, 0, 124, 142, 5, 0, 187, 143, 5, 0, 252, 144, 5, 0, 59, 146, 5, 0, 124, 147, 5, 0, 187, 148, 5, 0, 252, 149, 5, 0, 59, 151, 5, 0, 124, 152, 5, 0, 187, 153, 5, 0, 252, 154, 5, 0, 59, 156, 5, 0, 124, 157, 5, 0, 187, 158, 5, 0, 252, 159, 5, 0, 59, 161, 5, 0, 124, 162, 5, 0, 187, 163, 5, 0, 252, 164, 5, 0, 59, 166, 5, 0, 124, 167, 5, 0, 187, 168, 5, 0, 252, 169, 5, 0, 59, 171, 5, 0, 124, 172, 5, 0, 187, 173, 5, 0, 252, 174, 5, 0, 59, 176, 5, 0, 124, 177, 5, 0, 187, 178, 5, 0, 252, 179, 5, 0, 59, 181, 5, 0, 124, 182, 5, 0, 187, 183, 5, 0, 252, 184, 5, 0, 59, 186, 5, 0, 124, 187, 5, 0, 187, 188, 5, 0, 252, 189, 5, 0, 59, 191, 5, 0, 124, 192, 5, 0, 187, 193, 5, 0, 252, 194, 5, 0, 59, 196, 5, 0, 124, 197, 5, 0, 187, 198, 5, 0, 252, 199, 5, 0, 59, 201, 5, 0, 124, 202, 5, 0, 187, 203, 5, 0, 252, 204, 5, 0, 59, 206, 5, 0, 124, 207, 5, 0, 187, 208, 5, 0, 252, 209, 5, 0, 59, 211, 5, 0, 124, 212, 5, 0, 187, 213, 5, 0, 252, 214, 5, 0, 59, 216, 5, 0, 124, 217, 5, 0, 187, 218, 5, 0, 252, 219, 5, 0, 59, 221, 5, 0, 124, 222, 5, 0, 187, 223, 5, 0, 252, 224, 5, 0, 59, 226, 5, 0, 124, 227, 5, 0, 187, 228, 5, 0, 252, 229, 5, 0, 59, 231, 5, 0, 124, 232, 5, 0, 187, 233, 5, 0, 252, 234, 5, 0, 59, 236, 5, 0, 124, 237, 5, 0, 187, 238, 5, 0, 252, 239, 5, 0, 59, 241, 5, 0, 124, 242, 5, 0, 187, 243, 5, 0, 252, 244, 5, 0, 59, 246, 5, 0, 124, 247, 5, 0, 187, 248, 5, 0, 252, 249, 5, 0, 59, 251, 5, 0, 124, 252, 5, 0, 187, 253, 5, 0, 252, 254, 5, 0, 59, 0, 6, 0, 124, 1, 6, 0, 187, 2, 6, 0, 252, 3, 6, 0, 59, 5, 6, 0, 124, 6, 6, 0, 187, 7, 6, 0, 252, 8, 6, 0, 59, 10, 6, 0, 124, 11, 6, 0, 187, 12, 6, 0, 252, 13, 6, 0, 59, 15, 6, 0, 124, 16, 6, 0, 187, 17, 6, 0, 252, 18, 6, 0, 59, 20, 6, 0, 124, 21, 6, 0, 187, 22, 6, 0, 252, 23, 6, 0, 59, 25, 6, 0, 124, 26, 6, 0, 187, 27, 6, 0, 252, 28, 6, 0, 59, 30, 6, 0, 124, 31, 6, 0, 187, 32, 6, 0, 252, 33, 6, 0, 59, 35, 6, 0, 124, 36, 6, 0, 187, 37, 6, 0, 252, 38, 6, 0, 59, 40, 6, 0, 124, 41, 6, 0, 187, 42, 6, 0, 252, 43, 6, 0, 59, 45, 6, 0, 124, 46, 6, 0, 187, 47, 6, 0, 252, 48, 6, 0, 59, 50, 6, 0, 124, 51, 6, 0, 187, 52, 6, 0, 252, 53, 6, 0, 59, 55, 6, 0, 124, 56, 6, 0, 187, 57, 6, 0, 252, 58, 6, 0, 59, 60, 6, 0, 124, 61, 6, 0, 187, 62, 6, 0, 252, 63, 6, 0, 59, 65, 6, 0, 124, 66, 6, 0, 187, 67, 6, 0, 252, 68, 6, 0, 59, 70, 6, 0, 124, 71, 6, 0, 187, 72, 6, 0, 252, 73, 6, 0, 59, 75, 6, 0, 124, 76, 6, 0, 187, 77, 6, 0, 252, 78, 6, 0, 59, 80, 6, 0, 124, 81, 6, 0, 187, 82, 6, 0, 252, 83, 6, 0, 59, 85, 6, 0, 124, 86, 6, 0, 187, 87, 6, 0, 252, 88, 6, 0, 59, 90, 6, 0, 124, 91, 6, 0, 187, 92, 6, 0, 252, 93, 6, 0, 59, 95, 6, 0, 124, 96, 6, 0, 187, 97, 6, 0, 252, 98, 6, 0, 59, 100, 6, 0, 124, 101, 6, 0, 187, 102, 6, 0, 252, 103, 6, 0, 59, 105, 6, 0, 124, 106, 6, 0, 187, 107, 6, 0, 252, 108, 6, 0, 59, 110, 6, 0, 124, 111, 6, 0, 187, 112, 6, 0, 252, 113, 6, 0, 59, 115, 6, 0, 124, 116, 6, 0, 187, 117, 6, 0, 252, 118, 6, 0, 59, 120, 6, 0, 124, 121, 6, 0, 187, 122, 6, 0, 252, 123, 6, 0, 59, 125, 6, 0, 124, 126, 6, 0, 187, 127, 6, 0, 252, 128, 6, 0, 59, 130, 6, 0, 124, 131, 6, 0, 187, 132, 6, 0, 252, 133, 6, 0, 59, 135, 6, 0, 124, 136, 6, 0, 187, 137, 6, 0, 252, 138, 6, 0, 59, 140, 6, 0, 124, 141, 6, 0, 187, 142, 6, 0, 252, 143, 6, 0, 59, 145, 6, 0, 124, 146, 6, 0, 187, 147, 6, 0, 252, 148, 6, 0, 59, 150, 6, 0, 124, 151, 6, 0, 187, 152, 6, 0, 252, 153, 6, 0, 59, 155, 6, 0, 124, 156, 6, 0, 187, 157, 6, 0, 252, 158, 6, 0, 59, 160, 6, 0, 124, 161, 6, 0, 187, 162, 6, 0, 252, 163, 6, 0, 59, 165, 6, 0, 124, 166, 6, 0, 187, 167, 6, 0, 252, 168, 6, 0, 59, 170, 6, 0, 124, 171, 6, 0, 187, 172, 6, 0, 252, 173, 6, 0, 59, 175, 6, 0, 124, 176, 6, 0, 187, 177, 6, 0, 252, 178, 6, 0, 59, 180, 6, 0, 124, 181, 6, 0, 187, 182, 6, 0, 252, 183, 6, 0, 59, 185, 6, 0, 124, 186, 6, 0, 187, 187, 6, 0, 252, 188, 6, 0, 59, 190, 6, 0, 124, 191, 6, 0, 187, 192, 6, 0, 252, 193, 6, 0, 59, 195, 6, 0, 124, 196, 6, 0, 187, 197, 6, 0, 252, 198, 6, 0, 59, 200, 6, 0, 124, 201, 6, 0, 187, 202, 6, 0, 252, 203, 6, 0, 59, 205, 6, 0, 124, 206, 6, 0, 187, 207, 6, 0, 252, 208, 6, 0, 59, 210, 6, 0, 124, 211, 6, 0, 187, 212, 6, 0, 252, 213, 6, 0, 59, 215, 6, 0, 124, 216, 6, 0, 187, 217, 6, 0, 252, 218, 6, 0, 59, 220, 6, 0, 124, 221, 6, 0, 187, 222, 6, 0, 252, 223, 6, 0, 59, 225, 6, 0, 124, 226, 6, 0, 187, 227, 6, 0, 252, 228, 6, 0, 59, 230, 6, 0, 124, 231, 6, 0, 187, 232, 6, 0, 252, 233, 6, 0, 59, 235, 6, 0, 124, 236, 6, 0, 187, 237, 6, 0, 252, 238, 6, 0, 59, 240, 6, 0, 124, 241, 6, 0, 187, 242, 6, 0, 252, 243, 6, 0, 59, 245, 6, 0, 124, 246, 6, 0, 187, 247, 6, 0, 252, 248, 6, 0, 59, 250, 6, 0, 124, 251, 6, 0, 187, 252, 6, 0, 252, 253, 6, 0, 59, 255, 6, 0, 124, 0, 7, 0, 187, 1, 7, 0, 252, 2, 7, 0, 59, 4, 7, 0, 124, 5, 7, 0, 187, 6, 7, 0, 252, 7, 7, 0, 59, 9, 7, 0, 124, 10, 7, 0, 187, 11, 7, 0, 252, 12, 7, 0, 59, 14, 7, 0, 124, 15, 7, 0, 187, 16, 7, 0, 252, 17, 7, 0, 59, 19, 7, 0, 124, 20, 7, 0, 187, 21, 7, 0, 252, 22, 7, 0, 59, 24, 7, 0, 124, 25, 7, 0, 187, 26, 7, 0, 252, 27, 7, 0, 59, 29, 7, 0, 124, 30, 7, 0, 187, 31, 7, 0, 252, 32, 7, 0, 59, 34, 7, 0, 124, 35, 7, 0, 187, 36, 7, 0, 252, 37, 7, 0, 59, 39, 7, 0, 124, 40, 7, 0, 187, 41, 7, 0, 252, 42, 7, 0, 59, 44, 7, 0, 124, 45, 7, 0, 187, 46, 7, 0, 252, 47, 7, 0, 59, 49, 7, 0, 124, 50, 7, 0, 187, 51, 7, 0, 252, 52, 7, 0, 59, 54, 7, 0, 124, 55, 7, 0, 187, 56, 7, 0, 252, 57, 7, 0, 59, 59, 7, 0, 124, 60, 7, 0, 187, 61, 7, 0, 252, 62, 7, 0, 59, 64, 7, 0, 124, 65, 7, 0, 187, 66, 7, 0, 252, 67, 7, 0, 59, 69, 7, 0, 124, 70, 7, 0, 187, 71, 7, 0, 252, 72, 7, 0, 59, 74, 7, 0, 124, 75, 7, 0, 187, 76, 7, 0, 252, 77, 7, 0, 59, 79, 7, 0, 124, 80, 7, 0, 187, 81, 7, 0, 252, 82, 7, 0, 59, 84, 7, 0, 124, 85, 7, 0, 187, 86, 7, 0, 252, 87, 7, 0, 59, 89, 7, 0, 124, 90, 7, 0, 187, 91, 7, 0, 252, 92, 7, 0, 59, 94, 7, 0, 124, 95, 7, 0, 187, 96, 7, 0, 252, 97, 7, 0, 59, 99, 7, 0, 124, 100, 7, 0, 187, 101, 7, 0, 252, 102, 7, 0, 59, 104, 7, 0, 124, 105, 7, 0, 187, 106, 7, 0, 252, 107, 7, 0, 59, 109, 7, 0, 124, 110, 7, 0, 187, 111, 7, 0, 252, 112, 7, 0, 59, 114, 7, 0, 124, 115, 7, 0, 187, 116, 7, 0, 252, 117, 7, 0, 59, 119, 7, 0, 124, 120, 7, 0, 187, 121, 7, 0, 252, 122, 7, 0, 59, 124, 7, 0, 124, 125, 7, 0, 187, 126, 7, 0, 252, 127, 7, 0, 59, 129, 7, 0, 124, 130, 7, 0, 187, 131, 7, 0, 252, 132, 7, 0, 59, 134, 7, 0, 124, 135, 7, 0, 187, 136, 7, 0, 252, 137, 7, 0, 59, 139, 7, 0, 124, 140, 7, 0, 187, 141, 7, 0, 252, 142, 7, 0, 59, 144, 7, 0, 124, 145, 7, 0, 187, 146, 7, 0, 252, 147, 7, 0, 59, 149, 7, 0, 124, 150, 7, 0, 187, 151, 7, 0, 252, 152, 7, 0, 59, 154, 7, 0, 124, 155, 7, 0, 187, 156, 7, 0, 252, 157, 7, 0, 59, 159, 7, 0, 124, 160, 7, 0, 187, 161, 7, 0, 252, 162, 7, 0, 59, 164, 7, 0, 124, 165, 7, 0, 187, 166, 7, 0, 252, 167, 7, 0, 59, 169, 7, 0, 124, 170, 7, 0, 187, 171, 7, 0, 252, 172, 7, 0, 59, 174, 7, 0, 124, 175, 7, 0, 187, 176, 7, 0, 252, 177, 7, 0, 59, 179, 7, 0, 124, 180, 7, 0, 187, 181, 7, 0, 252, 182, 7, 0, 59, 184, 7, 0, 124, 185, 7, 0, 187, 186, 7, 0, 252, 187, 7, 0, 59, 189, 7, 0, 124, 190, 7, 0, 187, 191, 7, 0, 252, 192, 7, 0, 59, 194, 7, 0, 124, 195, 7, 0, 187, 196, 7, 0, 252, 197, 7, 0, 59, 199, 7, 0, 124, 200, 7, 0, 187, 201, 7, 0, 252, 202, 7, 0, 59, 204, 7, 0, 124, 205, 7, 0, 187, 206, 7, 0, 252, 207, 7, 0, 59, 209, 7, 0, 124, 210, 7, 0, 187, 211, 7, 0, 252, 212, 7, 0, 59, 214, 7, 0, 124, 215, 7, 0, 187, 216, 7, 0, 252, 217, 7, 0, 59, 219, 7, 0, 124, 220, 7, 0, 187, 221, 7, 0, 252, 222, 7, 0, 59, 224, 7, 0, 124, 225, 7, 0, 187, 226, 7, 0, 252, 227, 7, 0, 59, 229, 7, 0, 124, 230, 7, 0, 187, 231, 7, 0, 252, 232, 7, 0, 59, 234, 7, 0, 124, 235, 7, 0, 187, 236, 7, 0, 252, 237, 7, 0, 59, 239, 7, 0, 124, 240, 7, 0, 187, 241, 7, 0, 252, 242, 7, 0, 59, 244, 7, 0, 124, 245, 7, 0, 187, 246, 7, 0, 252, 247, 7, 0, 59, 249, 7, 0, 124, 250, 7, 0, 187, 251, 7, 0, 252, 252, 7, 0, 59, 254, 7, 0, 124, 255, 7, 0, 187, 0, 8, 0, 252, 1, 8, 0, 59, 3, 8, 0, 124, 4, 8, 0, 187, 5, 8, 0, 252, 6, 8, 0, 59, 8, 8, 0, 124, 9, 8, 0, 187, 10, 8, 0, 252, 11, 8, 0, 59, 13, 8, 0, 124, 14, 8, 0, 187, 15, 8, 0, 252, 16, 8, 0, 59, 18, 8, 0, 124, 19, 8, 0, 187, 20, 8, 0, 252, 21, 8, 0, 59, 23, 8, 0, 124, 24, 8, 0, 187, 25, 8, 0, 252, 26, 8, 0, 59, 28, 8, 0, 124, 29, 8, 0, 187, 30, 8, 0, 252, 31, 8, 0, 59, 33, 8, 0, 124, 34, 8, 0, 187, 35, 8, 0, 252, 36, 8, 0, 59, 38, 8, 0, 124, 39, 8, 0, 187, 40, 8, 0, 252, 41, 8, 0, 59, 43, 8, 0, 124, 44, 8, 0, 187, 45, 8, 0, 252, 46, 8, 0, 59, 48, 8, 0, 124, 49, 8, 0, 187, 50, 8, 0, 252, 51, 8, 0, 59, 53, 8, 0, 124, 54, 8, 0, 187, 55, 8, 0, 252, 56, 8, 0, 59, 58, 8, 0, 124, 59, 8, 0, 187, 60, 8, 0, 252, 61, 8, 0, 59, 63, 8, 0, 124, 64, 8, 0, 187, 65, 8, 0, 252, 66, 8, 0, 59, 68, 8, 0, 124, 69, 8, 0, 187, 70, 8, 0, 252, 71, 8, 0, 59, 73, 8, 0, 124, 74, 8, 0, 187, 75, 8, 0, 252, 76, 8, 0, 59, 78, 8, 0, 124, 79, 8, 0, 187, 80, 8, 0, 252, 81, 8, 0, 59, 83, 8, 0, 124, 84, 8, 0, 187, 85, 8, 0, 252, 86, 8, 0, 59, 88, 8, 0, 124, 89, 8, 0, 187, 90, 8, 0, 252, 91, 8, 0, 59, 93, 8, 0, 124, 94, 8, 0, 187, 95, 8, 0, 252, 96, 8, 0, 59, 98, 8, 0, 124, 99, 8, 0, 187, 100, 8, 0, 252, 101, 8, 0, 59, 103, 8, 0, 124, 104, 8, 0, 187, 105, 8, 0, 252, 106, 8, 0, 59, 108, 8, 0, 124, 109, 8, 0, 187, 110, 8, 0, 252, 111, 8, 0, 59, 113, 8, 0, 124, 114, 8, 0, 187, 115, 8, 0, 252, 116, 8, 0, 59, 118, 8, 0, 124, 119, 8, 0, 187, 120, 8, 0, 252, 121, 8, 0, 59, 123, 8, 0, 124, 124, 8, 0, 187, 125, 8, 0, 252, 126, 8, 0, 59, 128, 8, 0, 124, 129, 8, 0, 187, 130, 8, 0, 252, 131, 8, 0, 59, 133, 8, 0, 124, 134, 8, 0, 187, 135, 8, 0, 252, 136, 8, 0, 59, 138, 8, 0, 124, 139, 8, 0, 187, 140, 8, 0, 252, 141, 8, 0, 59, 143, 8, 0, 124, 144, 8, 0, 187, 145, 8, 0, 252, 146, 8, 0, 59, 148, 8, 0, 124, 149, 8, 0, 187, 150, 8, 0, 252, 151, 8, 0, 59, 153, 8, 0, 124, 154, 8, 0, 187, 155, 8, 0, 252, 156, 8, 0, 59, 158, 8, 0, 124, 159, 8, 0, 187, 160, 8, 0, 252, 161, 8, 0, 59, 163, 8, 0, 124, 164, 8, 0, 187, 165, 8, 0, 252, 166, 8, 0, 59, 168, 8, 0, 124, 169, 8, 0, 187, 170, 8, 0, 252, 171, 8, 0, 59, 173, 8, 0, 124, 174, 8, 0, 187, 175, 8, 0, 252, 176, 8, 0, 59, 178, 8, 0, 124, 179, 8, 0, 187, 180, 8, 0, 252, 181, 8, 0, 59, 183, 8, 0, 124, 184, 8, 0, 187, 185, 8, 0, 252, 186, 8, 0, 59, 188, 8, 0, 124, 189, 8, 0, 187, 190, 8, 0, 252, 191, 8, 0, 59, 193, 8, 0, 124, 194, 8, 0, 187, 195, 8, 0, 252, 196, 8, 0, 59, 198, 8, 0, 124, 199, 8, 0, 187, 200, 8, 0, 252, 201, 8, 0, 59, 203, 8, 0, 124, 204, 8, 0, 187, 205, 8, 0, 252, 206, 8, 0, 59, 208, 8, 0, 124, 209, 8, 0, 187, 210, 8, 0, 252, 211, 8, 0, 59, 213, 8, 0, 124, 214, 8, 0, 187, 215, 8, 0, 252, 216, 8, 0, 59, 218, 8, 0, 124, 219, 8, 0, 187, 220, 8, 0, 252, 221, 8, 0, 59, 223, 8, 0, 124, 224, 8, 0, 187, 225, 8, 0, 252, 226, 8, 0, 59, 228, 8, 0, 124, 229, 8, 0, 187, 230, 8, 0, 252, 231, 8, 0, 59, 233, 8, 0, 124, 234, 8, 0, 187, 235, 8, 0, 252, 236, 8, 0, 59, 238, 8, 0, 124, 239, 8, 0, 187, 240, 8, 0, 252, 241, 8, 0, 59, 243, 8, 0, 124, 244, 8, 0, 187, 245, 8, 0, 252, 246, 8, 0, 59, 248, 8, 0, 124, 249, 8, 0, 187, 250, 8, 0, 252, 251, 8, 0, 59, 253, 8, 0, 124, 254, 8, 0, 187, 255, 8, 0, 252, 0, 9, 0, 59, 2, 9, 0, 124, 3, 9, 0, 187, 4, 9, 0, 252, 5, 9, 0, 59, 7, 9, 0, 124, 8, 9, 0, 187, 9, 9, 0, 252, 10, 9, 0, 59, 12, 9, 0, 124, 13, 9, 0, 187, 14, 9, 0, 252, 15, 9, 0, 59, 17, 9, 0, 124, 18, 9, 0, 187, 19, 9, 0, 252, 20, 9, 0, 59, 22, 9, 0, 124, 23, 9, 0, 187, 24, 9, 0, 252, 25, 9, 0, 59, 27, 9, 0, 124, 28, 9, 0, 187, 29, 9, 0, 252, 30, 9, 0, 59, 32, 9, 0, 124, 33, 9, 0, 187, 34, 9, 0, 252, 35, 9, 0, 59, 37, 9, 0, 124, 38, 9, 0, 187, 39, 9, 0, 252, 40, 9, 0, 59, 42, 9, 0, 124, 43, 9, 0, 187, 44, 9, 0, 252, 45, 9, 0, 59, 47, 9, 0, 124, 48, 9, 0, 187, 49, 9, 0, 252, 50, 9, 0, 59, 52, 9, 0, 124, 53, 9, 0, 187, 54, 9, 0, 252, 55, 9, 0, 59, 57, 9, 0, 124, 58, 9, 0, 187, 59, 9, 0, 252, 60, 9, 0, 59, 62, 9, 0, 124, 63, 9, 0, 187, 64, 9, 0, 252, 65, 9, 0, 59, 67, 9, 0, 124, 68, 9, 0, 187, 69, 9, 0, 252, 70, 9, 0, 59, 72, 9, 0, 124, 73, 9, 0, 187, 74, 9, 0, 252, 75, 9, 0, 59, 77, 9, 0, 124, 78, 9, 0, 187, 79, 9, 0, 252, 80, 9, 0, 59, 82, 9, 0, 124, 83, 9, 0, 187, 84, 9, 0, 252, 85, 9, 0, 59, 87, 9, 0, 124, 88, 9, 0, 187, 89, 9, 0, 252, 90, 9, 0, 59, 92, 9, 0, 124, 93, 9, 0, 187, 94, 9, 0, 252, 95, 9, 0, 59, 97, 9, 0, 124, 98, 9, 0, 187, 99, 9, 0, 252, 100, 9, 0, 59, 102, 9, 0, 124, 103, 9, 0, 187, 104, 9, 0, 252, 105, 9, 0, 59, 107, 9, 0, 124, 108, 9, 0, 187, 109, 9, 0, 252, 110, 9, 0, 59, 112, 9, 0, 124, 113, 9, 0, 187, 114, 9, 0, 252, 115, 9, 0, 59, 117, 9, 0, 124, 118, 9, 0, 187, 119, 9, 0, 252, 120, 9, 0, 59, 122, 9, 0, 124, 123, 9, 0, 187, 124, 9, 0, 252, 125, 9, 0, 59, 127, 9, 0, 124, 128, 9, 0, 187, 129, 9, 0, 252, 130, 9, 0, 59, 132, 9, 0, 124, 133, 9, 0, 187, 134, 9, 0, 252, 135, 9, 0, 59, 137, 9, 0, 124, 138, 9, 0, 187, 139, 9, 0, 252, 140, 9, 0, 59, 142, 9, 0, 124, 143, 9, 0, 187, 144, 9, 0, 252, 145, 9, 0, 59, 147, 9, 0, 124, 148, 9, 0, 187, 149, 9, 0, 252, 150, 9, 0, 59, 152, 9, 0, 124, 153, 9, 0, 187, 154, 9, 0, 252, 155, 9, 0, 59, 157, 9, 0, 124, 158, 9, 0, 187, 159, 9, 0, 252, 160, 9, 0, 59, 162, 9, 0, 124, 163, 9, 0, 187, 164, 9, 0, 252, 165, 9, 0, 59, 167, 9, 0, 124, 168, 9, 0, 187, 169, 9, 0, 252, 170, 9, 0, 59, 172, 9, 0, 124, 173, 9, 0, 187, 174, 9, 0, 252, 175, 9, 0, 59, 177, 9, 0, 124, 178, 9, 0, 187, 179, 9, 0, 252, 180, 9, 0, 59, 182, 9, 0, 124, 183, 9, 0, 187, 184, 9, 0, 252, 185, 9, 0, 59, 187, 9, 0, 124, 188, 9, 0, 187, 189, 9, 0, 252, 190, 9, 0, 59, 192, 9, 0, 124, 193, 9, 0, 187, 194, 9, 0, 252, 195, 9, 0, 59, 197, 9, 0, 124, 198, 9, 0, 187, 199, 9, 0, 252, 200, 9, 0, 59, 202, 9, 0, 124, 203, 9, 0, 187, 204, 9, 0, 252, 205, 9, 0, 59, 207, 9, 0, 124, 208, 9, 0, 187, 209, 9, 0, 252, 210, 9, 0, 59, 212, 9, 0, 124, 213, 9, 0, 187, 214, 9, 0, 252, 215, 9, 0, 59, 217, 9, 0, 124, 218, 9, 0, 187, 219, 9, 0, 252, 220, 9, 0, 59, 222, 9, 0, 124, 223, 9, 0, 187, 224, 9, 0, 252, 225, 9, 0, 59, 227, 9, 0, 124, 228, 9, 0, 187, 229, 9, 0, 252, 230, 9, 0, 59, 232, 9, 0, 124, 233, 9, 0, 187, 234, 9, 0, 252, 235, 9, 0, 59, 237, 9, 0, 124, 238, 9, 0, 187, 239, 9, 0, 252, 240, 9, 0, 59, 242, 9, 0, 124, 243, 9, 0, 187, 244, 9, 0, 252, 245, 9, 0, 59, 247, 9, 0, 124, 248, 9, 0, 187, 249, 9, 0, 252, 250, 9, 0, 59, 252, 9, 0, 124, 253, 9, 0, 187, 254, 9, 0, 252, 255, 9, 0, 59, 1, 10, 0, 124, 2, 10, 0, 187, 3, 10, 0, 252, 4, 10, 0, 59, 6, 10, 0, 124, 7, 10, 0, 187, 8, 10, 0, 252, 9, 10, 0, 59, 11, 10, 0, 124, 12, 10, 0, 187, 13, 10, 0, 252, 14, 10, 0, 59, 16, 10, 0, 124, 17, 10, 0, 187, 18, 10, 0, 252, 19, 10, 0, 59, 21, 10, 0, 124, 22, 10, 0, 187, 23, 10, 0, 252, 24, 10, 0, 59, 26, 10, 0, 124, 27, 10, 0, 187, 28, 10, 0, 252, 29, 10, 0, 59, 31, 10, 0, 124, 32, 10, 0, 187, 33, 10, 0, 252, 34, 10, 0, 59, 36, 10, 0, 124, 37, 10, 0, 187, 38, 10, 0, 252, 39, 10, 0, 59, 41, 10, 0, 124, 42, 10, 0, 187, 43, 10, 0, 252, 44, 10, 0, 59, 46, 10, 0, 124, 47, 10, 0, 187, 48, 10, 0, 252, 49, 10, 0, 59, 51, 10, 0, 124, 52, 10, 0, 187, 53, 10, 0, 252, 54, 10, 0, 59, 56, 10, 0, 124, 57, 10, 0, 187, 58, 10, 0, 252, 59, 10, 0, 59, 61, 10, 0, 124, 62, 10, 0, 187, 63, 10, 0, 252, 64, 10, 0, 59, 66, 10, 0, 124, 67, 10, 0, 187, 68, 10, 0, 252, 69, 10, 0, 59, 71, 10, 0, 124, 72, 10, 0, 187, 73, 10, 0, 252, 74, 10, 0, 59, 76, 10, 0, 124, 77, 10, 0, 187, 78, 10, 0, 252, 79, 10, 0, 59, 81, 10, 0, 124, 82, 10, 0, 187, 83, 10, 0, 252, 84, 10, 0, 59, 86, 10, 0, 124, 87, 10, 0, 187, 88, 10, 0, 252, 89, 10, 0, 59, 91, 10, 0, 124, 92, 10, 0, 187, 93, 10, 0, 252, 94, 10, 0, 59, 96, 10, 0, 124, 97, 10, 0, 187, 98, 10, 0, 252, 99, 10, 0, 59, 101, 10, 0, 124, 102, 10, 0, 187, 103, 10, 0, 252, 104, 10, 0, 59, 106, 10, 0, 124, 107, 10, 0, 187, 108, 10, 0, 252, 109, 10, 0, 59, 111, 10, 0, 124, 112, 10, 0, 187, 113, 10, 0, 252, 114, 10, 0, 59, 116, 10, 0, 124, 117, 10, 0, 187, 118, 10, 0, 252, 119, 10, 0, 59, 121, 10, 0, 124, 122, 10, 0, 187, 123, 10, 0, 252, 124, 10, 0, 59, 126, 10, 0, 124, 127, 10, 0, 187, 128, 10, 0, 252, 129, 10, 0, 59, 131, 10, 0, 124, 132, 10, 0, 187, 133, 10, 0, 252, 134, 10, 0, 59, 136, 10, 0, 124, 137, 10, 0, 187, 138, 10, 0, 252, 139, 10, 0, 59, 141, 10, 0, 124, 142, 10, 0, 187, 143, 10, 0, 252, 144, 10, 0, 59, 146, 10, 0, 124, 147, 10, 0, 187, 148, 10, 0, 252, 149, 10, 0, 59, 151, 10, 0, 124, 152, 10, 0, 187, 153, 10, 0, 252, 154, 10, 0, 59, 156, 10, 0, 124, 157, 10, 0, 187, 158, 10, 0, 252, 159, 10, 0, 59, 161, 10, 0, 124, 162, 10, 0, 187, 163, 10, 0, 252, 164, 10, 0, 59, 166, 10, 0, 124, 167, 10, 0, 187, 168, 10, 0, 252, 169, 10, 0, 59, 171, 10, 0, 124, 172, 10, 0, 187, 173, 10, 0, 252, 174, 10, 0, 59, 176, 10, 0, 124, 177, 10, 0, 187, 178, 10, 0, 252, 179, 10, 0, 59, 181, 10, 0, 124, 182, 10, 0, 187, 183, 10, 0, 252, 184, 10, 0, 59, 186, 10, 0, 124, 187, 10, 0, 187, 188, 10, 0, 252, 189, 10, 0, 59, 191, 10, 0, 124, 192, 10, 0, 187, 193, 10, 0, 252, 194, 10, 0, 59, 196, 10, 0, 124, 197, 10, 0, 187, 198, 10, 0, 252, 199, 10, 0, 59, 201, 10, 0, 124, 202, 10, 0, 187, 203, 10, 0, 252, 204, 10, 0, 59, 206, 10, 0, 124, 207, 10, 0, 187, 208, 10, 0, 252, 209, 10, 0, 59, 211, 10, 0, 124, 212, 10, 0, 187, 213, 10, 0, 252, 214, 10, 0, 59, 216, 10, 0, 124, 217, 10, 0, 187, 218, 10, 0, 252, 219, 10, 0, 59, 221, 10, 0, 124, 222, 10, 0, 187, 223, 10, 0, 252, 224, 10, 0, 59, 226, 10, 0, 124, 227, 10, 0, 187, 228, 10, 0, 252, 229, 10, 0, 59, 231, 10, 0, 124, 232, 10, 0, 187, 233, 10, 0, 252, 234, 10, 0, 59, 236, 10, 0, 124, 237, 10, 0, 187, 238, 10, 0, 252, 239, 10, 0, 59, 241, 10, 0, 124, 242, 10, 0, 187, 243, 10, 0, 252, 244, 10, 0, 59, 246, 10, 0, 124, 247, 10, 0, 187, 248, 10, 0, 252, 249, 10, 0, 59, 251, 10, 0, 124, 252, 10, 0, 187, 253, 10, 0, 252, 254, 10, 0, 59, 0, 11, 0, 124, 1, 11, 0, 187, 2, 11, 0, 252, 3, 11, 0, 59, 5, 11, 0, 124, 6, 11, 0, 187, 7, 11, 0, 252, 8, 11, 0, 59, 10, 11, 0, 124, 11, 11, 0, 187, 12, 11, 0, 252, 13, 11, 0, 59, 15, 11, 0, 124, 16, 11, 0, 187, 17, 11, 0, 252, 18, 11, 0, 59, 20, 11, 0, 124, 21, 11, 0, 187, 22, 11, 0, 252, 23, 11, 0, 59, 25, 11, 0, 124, 26, 11, 0, 187, 27, 11, 0, 252, 28, 11, 0, 59, 30, 11, 0, 124, 31, 11, 0, 187, 32, 11, 0, 252, 33, 11, 0, 59, 35, 11, 0, 124, 36, 11, 0, 187, 37, 11, 0, 252, 38, 11, 0, 59, 40, 11, 0, 124, 41, 11, 0, 187, 42, 11, 0, 252, 43, 11, 0, 59, 45, 11, 0, 124, 46, 11, 0, 187, 47, 11, 0, 252, 48, 11, 0, 59, 50, 11, 0, 124, 51, 11, 0, 187, 52, 11, 0, 252, 53, 11, 0, 59, 55, 11, 0, 124, 56, 11, 0, 187, 57, 11, 0, 252, 58, 11, 0, 59, 60, 11, 0, 124, 61, 11, 0, 187, 62, 11, 0, 252, 63, 11, 0, 59, 65, 11, 0, 124, 66, 11, 0, 187, 67, 11, 0, 252, 68, 11, 0, 59, 70, 11, 0, 124, 71, 11, 0, 187, 72, 11, 0, 252, 73, 11, 0, 59, 75, 11, 0, 124, 76, 11, 0, 187, 77, 11, 0, 252, 78, 11, 0, 59, 80, 11, 0, 124, 81, 11, 0, 187, 82, 11, 0, 252, 83, 11, 0, 59, 85, 11, 0, 124, 86, 11, 0, 187, 87, 11, 0, 252, 88, 11, 0, 59, 90, 11, 0, 124, 91, 11, 0, 187, 92, 11, 0, 252, 93, 11, 0, 59, 95, 11, 0, 124, 96, 11, 0, 187, 97, 11, 0, 252, 98, 11, 0, 59, 100, 11, 0, 124, 101, 11, 0, 187, 102, 11, 0, 252, 103, 11, 0, 59, 105, 11, 0, 124, 106, 11, 0, 187, 107, 11, 0, 252, 108, 11, 0, 59, 110, 11, 0, 124, 111, 11, 0, 187, 112, 11, 0, 252, 113, 11, 0, 59, 115, 11, 0, 124, 116, 11, 0, 187, 117, 11, 0, 252, 118, 11, 0, 59, 120, 11, 0, 124, 121, 11, 0, 187, 122, 11, 0, 252, 123, 11, 0, 59, 125, 11, 0, 124, 126, 11, 0, 187, 127, 11, 0, 252, 128, 11, 0, 59, 130, 11, 0, 124, 131, 11, 0, 187, 132, 11, 0, 252, 133, 11, 0, 59, 135, 11, 0, 124, 136, 11, 0, 187, 137, 11, 0, 252, 138, 11, 0, 59, 140, 11, 0, 124, 141, 11, 0, 187, 142, 11, 0, 252, 143, 11, 0, 59, 145, 11, 0, 124, 146, 11, 0, 187, 147, 11, 0, 252, 148, 11, 0, 59, 150, 11, 0, 124, 151, 11, 0, 187, 152, 11, 0, 252, 153, 11, 0, 59, 155, 11, 0, 124, 156, 11, 0, 187, 157, 11, 0, 252, 158, 11, 0, 59, 160, 11, 0, 124, 161, 11, 0, 187, 162, 11, 0, 252, 163, 11, 0, 59, 165, 11, 0, 124, 166, 11, 0, 187, 167, 11, 0, 252, 168, 11, 0, 59, 170, 11, 0, 124, 171, 11, 0, 187, 172, 11, 0, 252, 173, 11, 0, 59, 175, 11, 0, 124, 176, 11, 0, 187, 177, 11, 0, 252, 178, 11, 0, 59, 180, 11, 0, 124, 181, 11, 0, 187, 182, 11, 0, 252, 183, 11, 0, 59, 185, 11, 0, 124, 186, 11, 0, 187, 187, 11, 0, 252, 188, 11, 0, 59, 190, 11, 0, 124, 191, 11, 0, 187, 192, 11, 0, 252, 193, 11, 0, 59, 195, 11, 0, 124, 196, 11, 0, 187, 197, 11, 0, 252, 198, 11, 0, 59, 200, 11, 0, 124, 201, 11, 0, 187, 202, 11, 0, 252, 203, 11, 0, 59, 205, 11, 0, 124, 206, 11, 0, 187, 207, 11, 0, 252, 208, 11, 0, 59, 210, 11, 0, 124, 211, 11, 0, 187, 212, 11, 0, 252, 213, 11, 0, 59, 215, 11, 0, 124, 216, 11, 0, 187, 217, 11, 0, 252, 218, 11, 0, 59, 220, 11, 0, 124, 221, 11, 0, 187, 222, 11, 0, 252, 223, 11, 0, 59, 225, 11, 0, 124, 226, 11, 0, 187, 227, 11, 0, 252, 228, 11, 0, 59, 230, 11, 0, 124, 231, 11, 0, 187, 232, 11, 0, 252, 233, 11, 0, 59, 235, 11, 0, 124, 236, 11, 0, 187, 237, 11, 0, 252, 238, 11, 0, 59, 240, 11, 0, 124, 241, 11, 0, 187, 242, 11, 0, 252, 243, 11, 0, 59, 245, 11, 0, 124, 246, 11, 0, 187, 247, 11, 0, 252, 248, 11, 0, 59, 250, 11, 0, 124, 251, 11, 0, 187, 252, 11, 0, 252, 253, 11, 0, 59, 255, 11, 0, 124, 0, 12, 0, 187, 1, 12, 0, 252, 2, 12, 0, 59, 4, 12, 0, 124, 5, 12, 0, 187, 6, 12, 0, 252, 7, 12, 0, 59, 9, 12, 0, 124, 10, 12, 0, 187, 11, 12, 0, 252, 12, 12, 0, 59, 14, 12, 0, 124, 15, 12, 0, 187, 16, 12, 0, 252, 17, 12, 0, 59, 19, 12, 0, 124, 20, 12, 0, 187, 21, 12, 0, 252, 22, 12, 0, 59, 24, 12, 0, 124, 25, 12, 0, 187, 26, 12, 0, 252, 27, 12, 0, 59, 29, 12, 0, 124, 30, 12, 0, 187, 31, 12, 0, 252, 32, 12, 0, 59, 34, 12, 0, 124, 35, 12, 0, 187, 36, 12, 0, 252, 37, 12, 0, 59, 39, 12, 0, 124, 40, 12, 0, 187, 41, 12, 0, 252, 42, 12, 0, 59, 44, 12, 0, 124, 45, 12, 0, 187, 46, 12, 0, 252, 47, 12, 0, 59, 49, 12, 0, 124, 50, 12, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 15, 15, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_duty_cycle.json b/tests/recordings/logic_analyzer/test_measure_duty_cycle.json deleted file mode 100644 index 6bd6f3fb..00000000 --- a/tests/recordings/logic_analyzer/test_measure_duty_cycle.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [49], [51], [10], [9], [196, 9], [0]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 59, 1, 0, 0, 124, 2, 0, 0, 187, 3, 0, 0, 252, 4, 0, 0, 59, 6, 0, 0, 124, 7, 0, 0, 187, 8, 0, 0, 252, 9, 0, 0, 59, 11, 0, 0, 124, 12, 0, 0, 187, 13, 0, 0, 252, 14, 0, 0, 59, 16, 0, 0, 124, 17, 0, 0, 187, 18, 0, 0, 252, 19, 0, 0, 59, 21, 0, 0, 124, 22, 0, 0, 187, 23, 0, 0, 252, 24, 0, 0, 59, 26, 0, 0, 124, 27, 0, 0, 187, 28, 0, 0, 252, 29, 0, 0, 59, 31, 0, 0, 124, 32, 0, 0, 187, 33, 0, 0, 252, 34, 0, 0, 59, 36, 0, 0, 124, 37, 0, 0, 187, 38, 0, 0, 252, 39, 0, 0, 59, 41, 0, 0, 124, 42, 0, 0, 187, 43, 0, 0, 252, 44, 0, 0, 59, 46, 0, 0, 124, 47, 0, 0, 187, 48, 0, 0, 252, 49, 0, 0, 59, 51, 0, 0, 124, 52, 0, 0, 187, 53, 0, 0, 252, 54, 0, 0, 59, 56, 0, 0, 124, 57, 0, 0, 187, 58, 0, 0, 252, 59, 0, 0, 59, 61, 0, 0, 124, 62, 0, 0, 187, 63, 0, 0, 252, 64, 0, 0, 59, 66, 0, 0, 124, 67, 0, 0, 187, 68, 0, 0, 252, 69, 0, 0, 59, 71, 0, 0, 124, 72, 0, 0, 187, 73, 0, 0, 252, 74, 0, 0, 59, 76, 0, 0, 124, 77, 0, 0, 187, 78, 0, 0, 252, 79, 0, 0, 59, 81, 0, 0, 124, 82, 0, 0, 187, 83, 0, 0, 252, 84, 0, 0, 59, 86, 0, 0, 124, 87, 0, 0, 187, 88, 0, 0, 252, 89, 0, 0, 59, 91, 0, 0, 124, 92, 0, 0, 187, 93, 0, 0, 252, 94, 0, 0, 59, 96, 0, 0, 124, 97, 0, 0, 187, 98, 0, 0, 252, 99, 0, 0, 59, 101, 0, 0, 124, 102, 0, 0, 187, 103, 0, 0, 252, 104, 0, 0, 59, 106, 0, 0, 124, 107, 0, 0, 187, 108, 0, 0, 252, 109, 0, 0, 59, 111, 0, 0, 124, 112, 0, 0, 187, 113, 0, 0, 252, 114, 0, 0, 59, 116, 0, 0, 124, 117, 0, 0, 187, 118, 0, 0, 252, 119, 0, 0, 59, 121, 0, 0, 124, 122, 0, 0, 187, 123, 0, 0, 252, 124, 0, 0, 59, 126, 0, 0, 124, 127, 0, 0, 187, 128, 0, 0, 252, 129, 0, 0, 59, 131, 0, 0, 124, 132, 0, 0, 187, 133, 0, 0, 252, 134, 0, 0, 59, 136, 0, 0, 124, 137, 0, 0, 187, 138, 0, 0, 252, 139, 0, 0, 59, 141, 0, 0, 124, 142, 0, 0, 187, 143, 0, 0, 252, 144, 0, 0, 59, 146, 0, 0, 124, 147, 0, 0, 187, 148, 0, 0, 252, 149, 0, 0, 59, 151, 0, 0, 124, 152, 0, 0, 187, 153, 0, 0, 252, 154, 0, 0, 59, 156, 0, 0, 124, 157, 0, 0, 187, 158, 0, 0, 252, 159, 0, 0, 59, 161, 0, 0, 124, 162, 0, 0, 187, 163, 0, 0, 252, 164, 0, 0, 59, 166, 0, 0, 124, 167, 0, 0, 187, 168, 0, 0, 252, 169, 0, 0, 59, 171, 0, 0, 124, 172, 0, 0, 187, 173, 0, 0, 252, 174, 0, 0, 59, 176, 0, 0, 124, 177, 0, 0, 187, 178, 0, 0, 252, 179, 0, 0, 59, 181, 0, 0, 124, 182, 0, 0, 187, 183, 0, 0, 252, 184, 0, 0, 59, 186, 0, 0, 124, 187, 0, 0, 187, 188, 0, 0, 252, 189, 0, 0, 59, 191, 0, 0, 124, 192, 0, 0, 187, 193, 0, 0, 252, 194, 0, 0, 59, 196, 0, 0, 124, 197, 0, 0, 187, 198, 0, 0, 252, 199, 0, 0, 59, 201, 0, 0, 124, 202, 0, 0, 187, 203, 0, 0, 252, 204, 0, 0, 59, 206, 0, 0, 124, 207, 0, 0, 187, 208, 0, 0, 252, 209, 0, 0, 59, 211, 0, 0, 124, 212, 0, 0, 187, 213, 0, 0, 252, 214, 0, 0, 59, 216, 0, 0, 124, 217, 0, 0, 187, 218, 0, 0, 252, 219, 0, 0, 59, 221, 0, 0, 124, 222, 0, 0, 187, 223, 0, 0, 252, 224, 0, 0, 59, 226, 0, 0, 124, 227, 0, 0, 187, 228, 0, 0, 252, 229, 0, 0, 59, 231, 0, 0, 124, 232, 0, 0, 187, 233, 0, 0, 252, 234, 0, 0, 59, 236, 0, 0, 124, 237, 0, 0, 187, 238, 0, 0, 252, 239, 0, 0, 59, 241, 0, 0, 124, 242, 0, 0, 187, 243, 0, 0, 252, 244, 0, 0, 59, 246, 0, 0, 124, 247, 0, 0, 187, 248, 0, 0, 252, 249, 0, 0, 59, 251, 0, 0, 124, 252, 0, 0, 187, 253, 0, 0, 252, 254, 0, 0, 59, 0, 1, 0, 124, 1, 1, 0, 187, 2, 1, 0, 252, 3, 1, 0, 59, 5, 1, 0, 124, 6, 1, 0, 187, 7, 1, 0, 252, 8, 1, 0, 59, 10, 1, 0, 124, 11, 1, 0, 187, 12, 1, 0, 252, 13, 1, 0, 59, 15, 1, 0, 124, 16, 1, 0, 187, 17, 1, 0, 252, 18, 1, 0, 59, 20, 1, 0, 124, 21, 1, 0, 187, 22, 1, 0, 252, 23, 1, 0, 59, 25, 1, 0, 124, 26, 1, 0, 187, 27, 1, 0, 252, 28, 1, 0, 59, 30, 1, 0, 124, 31, 1, 0, 187, 32, 1, 0, 252, 33, 1, 0, 59, 35, 1, 0, 124, 36, 1, 0, 187, 37, 1, 0, 252, 38, 1, 0, 59, 40, 1, 0, 124, 41, 1, 0, 187, 42, 1, 0, 252, 43, 1, 0, 59, 45, 1, 0, 124, 46, 1, 0, 187, 47, 1, 0, 252, 48, 1, 0, 59, 50, 1, 0, 124, 51, 1, 0, 187, 52, 1, 0, 252, 53, 1, 0, 59, 55, 1, 0, 124, 56, 1, 0, 187, 57, 1, 0, 252, 58, 1, 0, 59, 60, 1, 0, 124, 61, 1, 0, 187, 62, 1, 0, 252, 63, 1, 0, 59, 65, 1, 0, 124, 66, 1, 0, 187, 67, 1, 0, 252, 68, 1, 0, 59, 70, 1, 0, 124, 71, 1, 0, 187, 72, 1, 0, 252, 73, 1, 0, 59, 75, 1, 0, 124, 76, 1, 0, 187, 77, 1, 0, 252, 78, 1, 0, 59, 80, 1, 0, 124, 81, 1, 0, 187, 82, 1, 0, 252, 83, 1, 0, 59, 85, 1, 0, 124, 86, 1, 0, 187, 87, 1, 0, 252, 88, 1, 0, 59, 90, 1, 0, 124, 91, 1, 0, 187, 92, 1, 0, 252, 93, 1, 0, 59, 95, 1, 0, 124, 96, 1, 0, 187, 97, 1, 0, 252, 98, 1, 0, 59, 100, 1, 0, 124, 101, 1, 0, 187, 102, 1, 0, 252, 103, 1, 0, 59, 105, 1, 0, 124, 106, 1, 0, 187, 107, 1, 0, 252, 108, 1, 0, 59, 110, 1, 0, 124, 111, 1, 0, 187, 112, 1, 0, 252, 113, 1, 0, 59, 115, 1, 0, 124, 116, 1, 0, 187, 117, 1, 0, 252, 118, 1, 0, 59, 120, 1, 0, 124, 121, 1, 0, 187, 122, 1, 0, 252, 123, 1, 0, 59, 125, 1, 0, 124, 126, 1, 0, 187, 127, 1, 0, 252, 128, 1, 0, 59, 130, 1, 0, 124, 131, 1, 0, 187, 132, 1, 0, 252, 133, 1, 0, 59, 135, 1, 0, 124, 136, 1, 0, 187, 137, 1, 0, 252, 138, 1, 0, 59, 140, 1, 0, 124, 141, 1, 0, 187, 142, 1, 0, 252, 143, 1, 0, 59, 145, 1, 0, 124, 146, 1, 0, 187, 147, 1, 0, 252, 148, 1, 0, 59, 150, 1, 0, 124, 151, 1, 0, 187, 152, 1, 0, 252, 153, 1, 0, 59, 155, 1, 0, 124, 156, 1, 0, 187, 157, 1, 0, 252, 158, 1, 0, 59, 160, 1, 0, 124, 161, 1, 0, 187, 162, 1, 0, 252, 163, 1, 0, 59, 165, 1, 0, 124, 166, 1, 0, 187, 167, 1, 0, 252, 168, 1, 0, 59, 170, 1, 0, 124, 171, 1, 0, 187, 172, 1, 0, 252, 173, 1, 0, 59, 175, 1, 0, 124, 176, 1, 0, 187, 177, 1, 0, 252, 178, 1, 0, 59, 180, 1, 0, 124, 181, 1, 0, 187, 182, 1, 0, 252, 183, 1, 0, 59, 185, 1, 0, 124, 186, 1, 0, 187, 187, 1, 0, 252, 188, 1, 0, 59, 190, 1, 0, 124, 191, 1, 0, 187, 192, 1, 0, 252, 193, 1, 0, 59, 195, 1, 0, 124, 196, 1, 0, 187, 197, 1, 0, 252, 198, 1, 0, 59, 200, 1, 0, 124, 201, 1, 0, 187, 202, 1, 0, 252, 203, 1, 0, 59, 205, 1, 0, 124, 206, 1, 0, 187, 207, 1, 0, 252, 208, 1, 0, 59, 210, 1, 0, 124, 211, 1, 0, 187, 212, 1, 0, 252, 213, 1, 0, 59, 215, 1, 0, 124, 216, 1, 0, 187, 217, 1, 0, 252, 218, 1, 0, 59, 220, 1, 0, 124, 221, 1, 0, 187, 222, 1, 0, 252, 223, 1, 0, 59, 225, 1, 0, 124, 226, 1, 0, 187, 227, 1, 0, 252, 228, 1, 0, 59, 230, 1, 0, 124, 231, 1, 0, 187, 232, 1, 0, 252, 233, 1, 0, 59, 235, 1, 0, 124, 236, 1, 0, 187, 237, 1, 0, 252, 238, 1, 0, 59, 240, 1, 0, 124, 241, 1, 0, 187, 242, 1, 0, 252, 243, 1, 0, 59, 245, 1, 0, 124, 246, 1, 0, 187, 247, 1, 0, 252, 248, 1, 0, 59, 250, 1, 0, 124, 251, 1, 0, 187, 252, 1, 0, 252, 253, 1, 0, 59, 255, 1, 0, 124, 0, 2, 0, 187, 1, 2, 0, 252, 2, 2, 0, 59, 4, 2, 0, 124, 5, 2, 0, 187, 6, 2, 0, 252, 7, 2, 0, 59, 9, 2, 0, 124, 10, 2, 0, 187, 11, 2, 0, 252, 12, 2, 0, 59, 14, 2, 0, 124, 15, 2, 0, 187, 16, 2, 0, 252, 17, 2, 0, 59, 19, 2, 0, 124, 20, 2, 0, 187, 21, 2, 0, 252, 22, 2, 0, 59, 24, 2, 0, 124, 25, 2, 0, 187, 26, 2, 0, 252, 27, 2, 0, 59, 29, 2, 0, 124, 30, 2, 0, 187, 31, 2, 0, 252, 32, 2, 0, 59, 34, 2, 0, 124, 35, 2, 0, 187, 36, 2, 0, 252, 37, 2, 0, 59, 39, 2, 0, 124, 40, 2, 0, 187, 41, 2, 0, 252, 42, 2, 0, 59, 44, 2, 0, 124, 45, 2, 0, 187, 46, 2, 0, 252, 47, 2, 0, 59, 49, 2, 0, 124, 50, 2, 0, 187, 51, 2, 0, 252, 52, 2, 0, 59, 54, 2, 0, 124, 55, 2, 0, 187, 56, 2, 0, 252, 57, 2, 0, 59, 59, 2, 0, 124, 60, 2, 0, 187, 61, 2, 0, 252, 62, 2, 0, 59, 64, 2, 0, 124, 65, 2, 0, 187, 66, 2, 0, 252, 67, 2, 0, 59, 69, 2, 0, 124, 70, 2, 0, 187, 71, 2, 0, 252, 72, 2, 0, 59, 74, 2, 0, 124, 75, 2, 0, 187, 76, 2, 0, 252, 77, 2, 0, 59, 79, 2, 0, 124, 80, 2, 0, 187, 81, 2, 0, 252, 82, 2, 0, 59, 84, 2, 0, 124, 85, 2, 0, 187, 86, 2, 0, 252, 87, 2, 0, 59, 89, 2, 0, 124, 90, 2, 0, 187, 91, 2, 0, 252, 92, 2, 0, 59, 94, 2, 0, 124, 95, 2, 0, 187, 96, 2, 0, 252, 97, 2, 0, 59, 99, 2, 0, 124, 100, 2, 0, 187, 101, 2, 0, 252, 102, 2, 0, 59, 104, 2, 0, 124, 105, 2, 0, 187, 106, 2, 0, 252, 107, 2, 0, 59, 109, 2, 0, 124, 110, 2, 0, 187, 111, 2, 0, 252, 112, 2, 0, 59, 114, 2, 0, 124, 115, 2, 0, 187, 116, 2, 0, 252, 117, 2, 0, 59, 119, 2, 0, 124, 120, 2, 0, 187, 121, 2, 0, 252, 122, 2, 0, 59, 124, 2, 0, 124, 125, 2, 0, 187, 126, 2, 0, 252, 127, 2, 0, 59, 129, 2, 0, 124, 130, 2, 0, 187, 131, 2, 0, 252, 132, 2, 0, 59, 134, 2, 0, 124, 135, 2, 0, 187, 136, 2, 0, 252, 137, 2, 0, 59, 139, 2, 0, 124, 140, 2, 0, 187, 141, 2, 0, 252, 142, 2, 0, 59, 144, 2, 0, 124, 145, 2, 0, 187, 146, 2, 0, 252, 147, 2, 0, 59, 149, 2, 0, 124, 150, 2, 0, 187, 151, 2, 0, 252, 152, 2, 0, 59, 154, 2, 0, 124, 155, 2, 0, 187, 156, 2, 0, 252, 157, 2, 0, 59, 159, 2, 0, 124, 160, 2, 0, 187, 161, 2, 0, 252, 162, 2, 0, 59, 164, 2, 0, 124, 165, 2, 0, 187, 166, 2, 0, 252, 167, 2, 0, 59, 169, 2, 0, 124, 170, 2, 0, 187, 171, 2, 0, 252, 172, 2, 0, 59, 174, 2, 0, 124, 175, 2, 0, 187, 176, 2, 0, 252, 177, 2, 0, 59, 179, 2, 0, 124, 180, 2, 0, 187, 181, 2, 0, 252, 182, 2, 0, 59, 184, 2, 0, 124, 185, 2, 0, 187, 186, 2, 0, 252, 187, 2, 0, 59, 189, 2, 0, 124, 190, 2, 0, 187, 191, 2, 0, 252, 192, 2, 0, 59, 194, 2, 0, 124, 195, 2, 0, 187, 196, 2, 0, 252, 197, 2, 0, 59, 199, 2, 0, 124, 200, 2, 0, 187, 201, 2, 0, 252, 202, 2, 0, 59, 204, 2, 0, 124, 205, 2, 0, 187, 206, 2, 0, 252, 207, 2, 0, 59, 209, 2, 0, 124, 210, 2, 0, 187, 211, 2, 0, 252, 212, 2, 0, 59, 214, 2, 0, 124, 215, 2, 0, 187, 216, 2, 0, 252, 217, 2, 0, 59, 219, 2, 0, 124, 220, 2, 0, 187, 221, 2, 0, 252, 222, 2, 0, 59, 224, 2, 0, 124, 225, 2, 0, 187, 226, 2, 0, 252, 227, 2, 0, 59, 229, 2, 0, 124, 230, 2, 0, 187, 231, 2, 0, 252, 232, 2, 0, 59, 234, 2, 0, 124, 235, 2, 0, 187, 236, 2, 0, 252, 237, 2, 0, 59, 239, 2, 0, 124, 240, 2, 0, 187, 241, 2, 0, 252, 242, 2, 0, 59, 244, 2, 0, 124, 245, 2, 0, 187, 246, 2, 0, 252, 247, 2, 0, 59, 249, 2, 0, 124, 250, 2, 0, 187, 251, 2, 0, 252, 252, 2, 0, 59, 254, 2, 0, 124, 255, 2, 0, 187, 0, 3, 0, 252, 1, 3, 0, 59, 3, 3, 0, 124, 4, 3, 0, 187, 5, 3, 0, 252, 6, 3, 0, 59, 8, 3, 0, 124, 9, 3, 0, 187, 10, 3, 0, 252, 11, 3, 0, 59, 13, 3, 0, 124, 14, 3, 0, 187, 15, 3, 0, 252, 16, 3, 0, 59, 18, 3, 0, 124, 19, 3, 0, 187, 20, 3, 0, 252, 21, 3, 0, 59, 23, 3, 0, 124, 24, 3, 0, 187, 25, 3, 0, 252, 26, 3, 0, 59, 28, 3, 0, 124, 29, 3, 0, 187, 30, 3, 0, 252, 31, 3, 0, 59, 33, 3, 0, 124, 34, 3, 0, 187, 35, 3, 0, 252, 36, 3, 0, 59, 38, 3, 0, 124, 39, 3, 0, 187, 40, 3, 0, 252, 41, 3, 0, 59, 43, 3, 0, 124, 44, 3, 0, 187, 45, 3, 0, 252, 46, 3, 0, 59, 48, 3, 0, 124, 49, 3, 0, 187, 50, 3, 0, 252, 51, 3, 0, 59, 53, 3, 0, 124, 54, 3, 0, 187, 55, 3, 0, 252, 56, 3, 0, 59, 58, 3, 0, 124, 59, 3, 0, 187, 60, 3, 0, 252, 61, 3, 0, 59, 63, 3, 0, 124, 64, 3, 0, 187, 65, 3, 0, 252, 66, 3, 0, 59, 68, 3, 0, 124, 69, 3, 0, 187, 70, 3, 0, 252, 71, 3, 0, 59, 73, 3, 0, 124, 74, 3, 0, 187, 75, 3, 0, 252, 76, 3, 0, 59, 78, 3, 0, 124, 79, 3, 0, 187, 80, 3, 0, 252, 81, 3, 0, 59, 83, 3, 0, 124, 84, 3, 0, 187, 85, 3, 0, 252, 86, 3, 0, 59, 88, 3, 0, 124, 89, 3, 0, 187, 90, 3, 0, 252, 91, 3, 0, 59, 93, 3, 0, 124, 94, 3, 0, 187, 95, 3, 0, 252, 96, 3, 0, 59, 98, 3, 0, 124, 99, 3, 0, 187, 100, 3, 0, 252, 101, 3, 0, 59, 103, 3, 0, 124, 104, 3, 0, 187, 105, 3, 0, 252, 106, 3, 0, 59, 108, 3, 0, 124, 109, 3, 0, 187, 110, 3, 0, 252, 111, 3, 0, 59, 113, 3, 0, 124, 114, 3, 0, 187, 115, 3, 0, 252, 116, 3, 0, 59, 118, 3, 0, 124, 119, 3, 0, 187, 120, 3, 0, 252, 121, 3, 0, 59, 123, 3, 0, 124, 124, 3, 0, 187, 125, 3, 0, 252, 126, 3, 0, 59, 128, 3, 0, 124, 129, 3, 0, 187, 130, 3, 0, 252, 131, 3, 0, 59, 133, 3, 0, 124, 134, 3, 0, 187, 135, 3, 0, 252, 136, 3, 0, 59, 138, 3, 0, 124, 139, 3, 0, 187, 140, 3, 0, 252, 141, 3, 0, 59, 143, 3, 0, 124, 144, 3, 0, 187, 145, 3, 0, 252, 146, 3, 0, 59, 148, 3, 0, 124, 149, 3, 0, 187, 150, 3, 0, 252, 151, 3, 0, 59, 153, 3, 0, 124, 154, 3, 0, 187, 155, 3, 0, 252, 156, 3, 0, 59, 158, 3, 0, 124, 159, 3, 0, 187, 160, 3, 0, 252, 161, 3, 0, 59, 163, 3, 0, 124, 164, 3, 0, 187, 165, 3, 0, 252, 166, 3, 0, 59, 168, 3, 0, 124, 169, 3, 0, 187, 170, 3, 0, 252, 171, 3, 0, 59, 173, 3, 0, 124, 174, 3, 0, 187, 175, 3, 0, 252, 176, 3, 0, 59, 178, 3, 0, 124, 179, 3, 0, 187, 180, 3, 0, 252, 181, 3, 0, 59, 183, 3, 0, 124, 184, 3, 0, 187, 185, 3, 0, 252, 186, 3, 0, 59, 188, 3, 0, 124, 189, 3, 0, 187, 190, 3, 0, 252, 191, 3, 0, 59, 193, 3, 0, 124, 194, 3, 0, 187, 195, 3, 0, 252, 196, 3, 0, 59, 198, 3, 0, 124, 199, 3, 0, 187, 200, 3, 0, 252, 201, 3, 0, 59, 203, 3, 0, 124, 204, 3, 0, 187, 205, 3, 0, 252, 206, 3, 0, 59, 208, 3, 0, 124, 209, 3, 0, 187, 210, 3, 0, 252, 211, 3, 0, 59, 213, 3, 0, 124, 214, 3, 0, 187, 215, 3, 0, 252, 216, 3, 0, 59, 218, 3, 0, 124, 219, 3, 0, 187, 220, 3, 0, 252, 221, 3, 0, 59, 223, 3, 0, 124, 224, 3, 0, 187, 225, 3, 0, 252, 226, 3, 0, 59, 228, 3, 0, 124, 229, 3, 0, 187, 230, 3, 0, 252, 231, 3, 0, 59, 233, 3, 0, 124, 234, 3, 0, 187, 235, 3, 0, 252, 236, 3, 0, 59, 238, 3, 0, 124, 239, 3, 0, 187, 240, 3, 0, 252, 241, 3, 0, 59, 243, 3, 0, 124, 244, 3, 0, 187, 245, 3, 0, 252, 246, 3, 0, 59, 248, 3, 0, 124, 249, 3, 0, 187, 250, 3, 0, 252, 251, 3, 0, 59, 253, 3, 0, 124, 254, 3, 0, 187, 255, 3, 0, 252, 0, 4, 0, 59, 2, 4, 0, 124, 3, 4, 0, 187, 4, 4, 0, 252, 5, 4, 0, 59, 7, 4, 0, 124, 8, 4, 0, 187, 9, 4, 0, 252, 10, 4, 0, 59, 12, 4, 0, 124, 13, 4, 0, 187, 14, 4, 0, 252, 15, 4, 0, 59, 17, 4, 0, 124, 18, 4, 0, 187, 19, 4, 0, 252, 20, 4, 0, 59, 22, 4, 0, 124, 23, 4, 0, 187, 24, 4, 0, 252, 25, 4, 0, 59, 27, 4, 0, 124, 28, 4, 0, 187, 29, 4, 0, 252, 30, 4, 0, 59, 32, 4, 0, 124, 33, 4, 0, 187, 34, 4, 0, 252, 35, 4, 0, 59, 37, 4, 0, 124, 38, 4, 0, 187, 39, 4, 0, 252, 40, 4, 0, 59, 42, 4, 0, 124, 43, 4, 0, 187, 44, 4, 0, 252, 45, 4, 0, 59, 47, 4, 0, 124, 48, 4, 0, 187, 49, 4, 0, 252, 50, 4, 0, 59, 52, 4, 0, 124, 53, 4, 0, 187, 54, 4, 0, 252, 55, 4, 0, 59, 57, 4, 0, 124, 58, 4, 0, 187, 59, 4, 0, 252, 60, 4, 0, 59, 62, 4, 0, 124, 63, 4, 0, 187, 64, 4, 0, 252, 65, 4, 0, 59, 67, 4, 0, 124, 68, 4, 0, 187, 69, 4, 0, 252, 70, 4, 0, 59, 72, 4, 0, 124, 73, 4, 0, 187, 74, 4, 0, 252, 75, 4, 0, 59, 77, 4, 0, 124, 78, 4, 0, 187, 79, 4, 0, 252, 80, 4, 0, 59, 82, 4, 0, 124, 83, 4, 0, 187, 84, 4, 0, 252, 85, 4, 0, 59, 87, 4, 0, 124, 88, 4, 0, 187, 89, 4, 0, 252, 90, 4, 0, 59, 92, 4, 0, 124, 93, 4, 0, 187, 94, 4, 0, 252, 95, 4, 0, 59, 97, 4, 0, 124, 98, 4, 0, 187, 99, 4, 0, 252, 100, 4, 0, 59, 102, 4, 0, 124, 103, 4, 0, 187, 104, 4, 0, 252, 105, 4, 0, 59, 107, 4, 0, 124, 108, 4, 0, 187, 109, 4, 0, 252, 110, 4, 0, 59, 112, 4, 0, 124, 113, 4, 0, 187, 114, 4, 0, 252, 115, 4, 0, 59, 117, 4, 0, 124, 118, 4, 0, 187, 119, 4, 0, 252, 120, 4, 0, 59, 122, 4, 0, 124, 123, 4, 0, 187, 124, 4, 0, 252, 125, 4, 0, 59, 127, 4, 0, 124, 128, 4, 0, 187, 129, 4, 0, 252, 130, 4, 0, 59, 132, 4, 0, 124, 133, 4, 0, 187, 134, 4, 0, 252, 135, 4, 0, 59, 137, 4, 0, 124, 138, 4, 0, 187, 139, 4, 0, 252, 140, 4, 0, 59, 142, 4, 0, 124, 143, 4, 0, 187, 144, 4, 0, 252, 145, 4, 0, 59, 147, 4, 0, 124, 148, 4, 0, 187, 149, 4, 0, 252, 150, 4, 0, 59, 152, 4, 0, 124, 153, 4, 0, 187, 154, 4, 0, 252, 155, 4, 0, 59, 157, 4, 0, 124, 158, 4, 0, 187, 159, 4, 0, 252, 160, 4, 0, 59, 162, 4, 0, 124, 163, 4, 0, 187, 164, 4, 0, 252, 165, 4, 0, 59, 167, 4, 0, 124, 168, 4, 0, 187, 169, 4, 0, 252, 170, 4, 0, 59, 172, 4, 0, 124, 173, 4, 0, 187, 174, 4, 0, 252, 175, 4, 0, 59, 177, 4, 0, 124, 178, 4, 0, 187, 179, 4, 0, 252, 180, 4, 0, 59, 182, 4, 0, 124, 183, 4, 0, 187, 184, 4, 0, 252, 185, 4, 0, 59, 187, 4, 0, 124, 188, 4, 0, 187, 189, 4, 0, 252, 190, 4, 0, 59, 192, 4, 0, 124, 193, 4, 0, 187, 194, 4, 0, 252, 195, 4, 0, 59, 197, 4, 0, 124, 198, 4, 0, 187, 199, 4, 0, 252, 200, 4, 0, 59, 202, 4, 0, 124, 203, 4, 0, 187, 204, 4, 0, 252, 205, 4, 0, 59, 207, 4, 0, 124, 208, 4, 0, 187, 209, 4, 0, 252, 210, 4, 0, 59, 212, 4, 0, 124, 213, 4, 0, 187, 214, 4, 0, 252, 215, 4, 0, 59, 217, 4, 0, 124, 218, 4, 0, 187, 219, 4, 0, 252, 220, 4, 0, 59, 222, 4, 0, 124, 223, 4, 0, 187, 224, 4, 0, 252, 225, 4, 0, 59, 227, 4, 0, 124, 228, 4, 0, 187, 229, 4, 0, 252, 230, 4, 0, 59, 232, 4, 0, 124, 233, 4, 0, 187, 234, 4, 0, 252, 235, 4, 0, 59, 237, 4, 0, 124, 238, 4, 0, 187, 239, 4, 0, 252, 240, 4, 0, 59, 242, 4, 0, 124, 243, 4, 0, 187, 244, 4, 0, 252, 245, 4, 0, 59, 247, 4, 0, 124, 248, 4, 0, 187, 249, 4, 0, 252, 250, 4, 0, 59, 252, 4, 0, 124, 253, 4, 0, 187, 254, 4, 0, 252, 255, 4, 0, 59, 1, 5, 0, 124, 2, 5, 0, 187, 3, 5, 0, 252, 4, 5, 0, 59, 6, 5, 0, 124, 7, 5, 0, 187, 8, 5, 0, 252, 9, 5, 0, 59, 11, 5, 0, 124, 12, 5, 0, 187, 13, 5, 0, 252, 14, 5, 0, 59, 16, 5, 0, 124, 17, 5, 0, 187, 18, 5, 0, 252, 19, 5, 0, 59, 21, 5, 0, 124, 22, 5, 0, 187, 23, 5, 0, 252, 24, 5, 0, 59, 26, 5, 0, 124, 27, 5, 0, 187, 28, 5, 0, 252, 29, 5, 0, 59, 31, 5, 0, 124, 32, 5, 0, 187, 33, 5, 0, 252, 34, 5, 0, 59, 36, 5, 0, 124, 37, 5, 0, 187, 38, 5, 0, 252, 39, 5, 0, 59, 41, 5, 0, 124, 42, 5, 0, 187, 43, 5, 0, 252, 44, 5, 0, 59, 46, 5, 0, 124, 47, 5, 0, 187, 48, 5, 0, 252, 49, 5, 0, 59, 51, 5, 0, 124, 52, 5, 0, 187, 53, 5, 0, 252, 54, 5, 0, 59, 56, 5, 0, 124, 57, 5, 0, 187, 58, 5, 0, 252, 59, 5, 0, 59, 61, 5, 0, 124, 62, 5, 0, 187, 63, 5, 0, 252, 64, 5, 0, 59, 66, 5, 0, 124, 67, 5, 0, 187, 68, 5, 0, 252, 69, 5, 0, 59, 71, 5, 0, 124, 72, 5, 0, 187, 73, 5, 0, 252, 74, 5, 0, 59, 76, 5, 0, 124, 77, 5, 0, 187, 78, 5, 0, 252, 79, 5, 0, 59, 81, 5, 0, 124, 82, 5, 0, 187, 83, 5, 0, 252, 84, 5, 0, 59, 86, 5, 0, 124, 87, 5, 0, 187, 88, 5, 0, 252, 89, 5, 0, 59, 91, 5, 0, 124, 92, 5, 0, 187, 93, 5, 0, 252, 94, 5, 0, 59, 96, 5, 0, 124, 97, 5, 0, 187, 98, 5, 0, 252, 99, 5, 0, 59, 101, 5, 0, 124, 102, 5, 0, 187, 103, 5, 0, 252, 104, 5, 0, 59, 106, 5, 0, 124, 107, 5, 0, 187, 108, 5, 0, 252, 109, 5, 0, 59, 111, 5, 0, 124, 112, 5, 0, 187, 113, 5, 0, 252, 114, 5, 0, 59, 116, 5, 0, 124, 117, 5, 0, 187, 118, 5, 0, 252, 119, 5, 0, 59, 121, 5, 0, 124, 122, 5, 0, 187, 123, 5, 0, 252, 124, 5, 0, 59, 126, 5, 0, 124, 127, 5, 0, 187, 128, 5, 0, 252, 129, 5, 0, 59, 131, 5, 0, 124, 132, 5, 0, 187, 133, 5, 0, 252, 134, 5, 0, 59, 136, 5, 0, 124, 137, 5, 0, 187, 138, 5, 0, 252, 139, 5, 0, 59, 141, 5, 0, 124, 142, 5, 0, 187, 143, 5, 0, 252, 144, 5, 0, 59, 146, 5, 0, 124, 147, 5, 0, 187, 148, 5, 0, 252, 149, 5, 0, 59, 151, 5, 0, 124, 152, 5, 0, 187, 153, 5, 0, 252, 154, 5, 0, 59, 156, 5, 0, 124, 157, 5, 0, 187, 158, 5, 0, 252, 159, 5, 0, 59, 161, 5, 0, 124, 162, 5, 0, 187, 163, 5, 0, 252, 164, 5, 0, 59, 166, 5, 0, 124, 167, 5, 0, 187, 168, 5, 0, 252, 169, 5, 0, 59, 171, 5, 0, 124, 172, 5, 0, 187, 173, 5, 0, 252, 174, 5, 0, 59, 176, 5, 0, 124, 177, 5, 0, 187, 178, 5, 0, 252, 179, 5, 0, 59, 181, 5, 0, 124, 182, 5, 0, 187, 183, 5, 0, 252, 184, 5, 0, 59, 186, 5, 0, 124, 187, 5, 0, 187, 188, 5, 0, 252, 189, 5, 0, 59, 191, 5, 0, 124, 192, 5, 0, 187, 193, 5, 0, 252, 194, 5, 0, 59, 196, 5, 0, 124, 197, 5, 0, 187, 198, 5, 0, 252, 199, 5, 0, 59, 201, 5, 0, 124, 202, 5, 0, 187, 203, 5, 0, 252, 204, 5, 0, 59, 206, 5, 0, 124, 207, 5, 0, 187, 208, 5, 0, 252, 209, 5, 0, 59, 211, 5, 0, 124, 212, 5, 0, 187, 213, 5, 0, 252, 214, 5, 0, 59, 216, 5, 0, 124, 217, 5, 0, 187, 218, 5, 0, 252, 219, 5, 0, 59, 221, 5, 0, 124, 222, 5, 0, 187, 223, 5, 0, 252, 224, 5, 0, 59, 226, 5, 0, 124, 227, 5, 0, 187, 228, 5, 0, 252, 229, 5, 0, 59, 231, 5, 0, 124, 232, 5, 0, 187, 233, 5, 0, 252, 234, 5, 0, 59, 236, 5, 0, 124, 237, 5, 0, 187, 238, 5, 0, 252, 239, 5, 0, 59, 241, 5, 0, 124, 242, 5, 0, 187, 243, 5, 0, 252, 244, 5, 0, 59, 246, 5, 0, 124, 247, 5, 0, 187, 248, 5, 0, 252, 249, 5, 0, 59, 251, 5, 0, 124, 252, 5, 0, 187, 253, 5, 0, 252, 254, 5, 0, 59, 0, 6, 0, 124, 1, 6, 0, 187, 2, 6, 0, 252, 3, 6, 0, 59, 5, 6, 0, 124, 6, 6, 0, 187, 7, 6, 0, 252, 8, 6, 0, 59, 10, 6, 0, 124, 11, 6, 0, 187, 12, 6, 0, 252, 13, 6, 0, 59, 15, 6, 0, 124, 16, 6, 0, 187, 17, 6, 0, 252, 18, 6, 0, 59, 20, 6, 0, 124, 21, 6, 0, 187, 22, 6, 0, 252, 23, 6, 0, 59, 25, 6, 0, 124, 26, 6, 0, 187, 27, 6, 0, 252, 28, 6, 0, 59, 30, 6, 0, 124, 31, 6, 0, 187, 32, 6, 0, 252, 33, 6, 0, 59, 35, 6, 0, 124, 36, 6, 0, 187, 37, 6, 0, 252, 38, 6, 0, 59, 40, 6, 0, 124, 41, 6, 0, 187, 42, 6, 0, 252, 43, 6, 0, 59, 45, 6, 0, 124, 46, 6, 0, 187, 47, 6, 0, 252, 48, 6, 0, 59, 50, 6, 0, 124, 51, 6, 0, 187, 52, 6, 0, 252, 53, 6, 0, 59, 55, 6, 0, 124, 56, 6, 0, 187, 57, 6, 0, 252, 58, 6, 0, 59, 60, 6, 0, 124, 61, 6, 0, 187, 62, 6, 0, 252, 63, 6, 0, 59, 65, 6, 0, 124, 66, 6, 0, 187, 67, 6, 0, 252, 68, 6, 0, 59, 70, 6, 0, 124, 71, 6, 0, 187, 72, 6, 0, 252, 73, 6, 0, 59, 75, 6, 0, 124, 76, 6, 0, 187, 77, 6, 0, 252, 78, 6, 0, 59, 80, 6, 0, 124, 81, 6, 0, 187, 82, 6, 0, 252, 83, 6, 0, 59, 85, 6, 0, 124, 86, 6, 0, 187, 87, 6, 0, 252, 88, 6, 0, 59, 90, 6, 0, 124, 91, 6, 0, 187, 92, 6, 0, 252, 93, 6, 0, 59, 95, 6, 0, 124, 96, 6, 0, 187, 97, 6, 0, 252, 98, 6, 0, 59, 100, 6, 0, 124, 101, 6, 0, 187, 102, 6, 0, 252, 103, 6, 0, 59, 105, 6, 0, 124, 106, 6, 0, 187, 107, 6, 0, 252, 108, 6, 0, 59, 110, 6, 0, 124, 111, 6, 0, 187, 112, 6, 0, 252, 113, 6, 0, 59, 115, 6, 0, 124, 116, 6, 0, 187, 117, 6, 0, 252, 118, 6, 0, 59, 120, 6, 0, 124, 121, 6, 0, 187, 122, 6, 0, 252, 123, 6, 0, 59, 125, 6, 0, 124, 126, 6, 0, 187, 127, 6, 0, 252, 128, 6, 0, 59, 130, 6, 0, 124, 131, 6, 0, 187, 132, 6, 0, 252, 133, 6, 0, 59, 135, 6, 0, 124, 136, 6, 0, 187, 137, 6, 0, 252, 138, 6, 0, 59, 140, 6, 0, 124, 141, 6, 0, 187, 142, 6, 0, 252, 143, 6, 0, 59, 145, 6, 0, 124, 146, 6, 0, 187, 147, 6, 0, 252, 148, 6, 0, 59, 150, 6, 0, 124, 151, 6, 0, 187, 152, 6, 0, 252, 153, 6, 0, 59, 155, 6, 0, 124, 156, 6, 0, 187, 157, 6, 0, 252, 158, 6, 0, 59, 160, 6, 0, 124, 161, 6, 0, 187, 162, 6, 0, 252, 163, 6, 0, 59, 165, 6, 0, 124, 166, 6, 0, 187, 167, 6, 0, 252, 168, 6, 0, 59, 170, 6, 0, 124, 171, 6, 0, 187, 172, 6, 0, 252, 173, 6, 0, 59, 175, 6, 0, 124, 176, 6, 0, 187, 177, 6, 0, 252, 178, 6, 0, 59, 180, 6, 0, 124, 181, 6, 0, 187, 182, 6, 0, 252, 183, 6, 0, 59, 185, 6, 0, 124, 186, 6, 0, 187, 187, 6, 0, 252, 188, 6, 0, 59, 190, 6, 0, 124, 191, 6, 0, 187, 192, 6, 0, 252, 193, 6, 0, 59, 195, 6, 0, 124, 196, 6, 0, 187, 197, 6, 0, 252, 198, 6, 0, 59, 200, 6, 0, 124, 201, 6, 0, 187, 202, 6, 0, 252, 203, 6, 0, 59, 205, 6, 0, 124, 206, 6, 0, 187, 207, 6, 0, 252, 208, 6, 0, 59, 210, 6, 0, 124, 211, 6, 0, 187, 212, 6, 0, 252, 213, 6, 0, 59, 215, 6, 0, 124, 216, 6, 0, 187, 217, 6, 0, 252, 218, 6, 0, 59, 220, 6, 0, 124, 221, 6, 0, 187, 222, 6, 0, 252, 223, 6, 0, 59, 225, 6, 0, 124, 226, 6, 0, 187, 227, 6, 0, 252, 228, 6, 0, 59, 230, 6, 0, 124, 231, 6, 0, 187, 232, 6, 0, 252, 233, 6, 0, 59, 235, 6, 0, 124, 236, 6, 0, 187, 237, 6, 0, 252, 238, 6, 0, 59, 240, 6, 0, 124, 241, 6, 0, 187, 242, 6, 0, 252, 243, 6, 0, 59, 245, 6, 0, 124, 246, 6, 0, 187, 247, 6, 0, 252, 248, 6, 0, 59, 250, 6, 0, 124, 251, 6, 0, 187, 252, 6, 0, 252, 253, 6, 0, 59, 255, 6, 0, 124, 0, 7, 0, 187, 1, 7, 0, 252, 2, 7, 0, 59, 4, 7, 0, 124, 5, 7, 0, 187, 6, 7, 0, 252, 7, 7, 0, 59, 9, 7, 0, 124, 10, 7, 0, 187, 11, 7, 0, 252, 12, 7, 0, 59, 14, 7, 0, 124, 15, 7, 0, 187, 16, 7, 0, 252, 17, 7, 0, 59, 19, 7, 0, 124, 20, 7, 0, 187, 21, 7, 0, 252, 22, 7, 0, 59, 24, 7, 0, 124, 25, 7, 0, 187, 26, 7, 0, 252, 27, 7, 0, 59, 29, 7, 0, 124, 30, 7, 0, 187, 31, 7, 0, 252, 32, 7, 0, 59, 34, 7, 0, 124, 35, 7, 0, 187, 36, 7, 0, 252, 37, 7, 0, 59, 39, 7, 0, 124, 40, 7, 0, 187, 41, 7, 0, 252, 42, 7, 0, 59, 44, 7, 0, 124, 45, 7, 0, 187, 46, 7, 0, 252, 47, 7, 0, 59, 49, 7, 0, 124, 50, 7, 0, 187, 51, 7, 0, 252, 52, 7, 0, 59, 54, 7, 0, 124, 55, 7, 0, 187, 56, 7, 0, 252, 57, 7, 0, 59, 59, 7, 0, 124, 60, 7, 0, 187, 61, 7, 0, 252, 62, 7, 0, 59, 64, 7, 0, 124, 65, 7, 0, 187, 66, 7, 0, 252, 67, 7, 0, 59, 69, 7, 0, 124, 70, 7, 0, 187, 71, 7, 0, 252, 72, 7, 0, 59, 74, 7, 0, 124, 75, 7, 0, 187, 76, 7, 0, 252, 77, 7, 0, 59, 79, 7, 0, 124, 80, 7, 0, 187, 81, 7, 0, 252, 82, 7, 0, 59, 84, 7, 0, 124, 85, 7, 0, 187, 86, 7, 0, 252, 87, 7, 0, 59, 89, 7, 0, 124, 90, 7, 0, 187, 91, 7, 0, 252, 92, 7, 0, 59, 94, 7, 0, 124, 95, 7, 0, 187, 96, 7, 0, 252, 97, 7, 0, 59, 99, 7, 0, 124, 100, 7, 0, 187, 101, 7, 0, 252, 102, 7, 0, 59, 104, 7, 0, 124, 105, 7, 0, 187, 106, 7, 0, 252, 107, 7, 0, 59, 109, 7, 0, 124, 110, 7, 0, 187, 111, 7, 0, 252, 112, 7, 0, 59, 114, 7, 0, 124, 115, 7, 0, 187, 116, 7, 0, 252, 117, 7, 0, 59, 119, 7, 0, 124, 120, 7, 0, 187, 121, 7, 0, 252, 122, 7, 0, 59, 124, 7, 0, 124, 125, 7, 0, 187, 126, 7, 0, 252, 127, 7, 0, 59, 129, 7, 0, 124, 130, 7, 0, 187, 131, 7, 0, 252, 132, 7, 0, 59, 134, 7, 0, 124, 135, 7, 0, 187, 136, 7, 0, 252, 137, 7, 0, 59, 139, 7, 0, 124, 140, 7, 0, 187, 141, 7, 0, 252, 142, 7, 0, 59, 144, 7, 0, 124, 145, 7, 0, 187, 146, 7, 0, 252, 147, 7, 0, 59, 149, 7, 0, 124, 150, 7, 0, 187, 151, 7, 0, 252, 152, 7, 0, 59, 154, 7, 0, 124, 155, 7, 0, 187, 156, 7, 0, 252, 157, 7, 0, 59, 159, 7, 0, 124, 160, 7, 0, 187, 161, 7, 0, 252, 162, 7, 0, 59, 164, 7, 0, 124, 165, 7, 0, 187, 166, 7, 0, 252, 167, 7, 0, 59, 169, 7, 0, 124, 170, 7, 0, 187, 171, 7, 0, 252, 172, 7, 0, 59, 174, 7, 0, 124, 175, 7, 0, 187, 176, 7, 0, 252, 177, 7, 0, 59, 179, 7, 0, 124, 180, 7, 0, 187, 181, 7, 0, 252, 182, 7, 0, 59, 184, 7, 0, 124, 185, 7, 0, 187, 186, 7, 0, 252, 187, 7, 0, 59, 189, 7, 0, 124, 190, 7, 0, 187, 191, 7, 0, 252, 192, 7, 0, 59, 194, 7, 0, 124, 195, 7, 0, 187, 196, 7, 0, 252, 197, 7, 0, 59, 199, 7, 0, 124, 200, 7, 0, 187, 201, 7, 0, 252, 202, 7, 0, 59, 204, 7, 0, 124, 205, 7, 0, 187, 206, 7, 0, 252, 207, 7, 0, 59, 209, 7, 0, 124, 210, 7, 0, 187, 211, 7, 0, 252, 212, 7, 0, 59, 214, 7, 0, 124, 215, 7, 0, 187, 216, 7, 0, 252, 217, 7, 0, 59, 219, 7, 0, 124, 220, 7, 0, 187, 221, 7, 0, 252, 222, 7, 0, 59, 224, 7, 0, 124, 225, 7, 0, 187, 226, 7, 0, 252, 227, 7, 0, 59, 229, 7, 0, 124, 230, 7, 0, 187, 231, 7, 0, 252, 232, 7, 0, 59, 234, 7, 0, 124, 235, 7, 0, 187, 236, 7, 0, 252, 237, 7, 0, 59, 239, 7, 0, 124, 240, 7, 0, 187, 241, 7, 0, 252, 242, 7, 0, 59, 244, 7, 0, 124, 245, 7, 0, 187, 246, 7, 0, 252, 247, 7, 0, 59, 249, 7, 0, 124, 250, 7, 0, 187, 251, 7, 0, 252, 252, 7, 0, 59, 254, 7, 0, 124, 255, 7, 0, 187, 0, 8, 0, 252, 1, 8, 0, 59, 3, 8, 0, 124, 4, 8, 0, 187, 5, 8, 0, 252, 6, 8, 0, 59, 8, 8, 0, 124, 9, 8, 0, 187, 10, 8, 0, 252, 11, 8, 0, 59, 13, 8, 0, 124, 14, 8, 0, 187, 15, 8, 0, 252, 16, 8, 0, 59, 18, 8, 0, 124, 19, 8, 0, 187, 20, 8, 0, 252, 21, 8, 0, 59, 23, 8, 0, 124, 24, 8, 0, 187, 25, 8, 0, 252, 26, 8, 0, 59, 28, 8, 0, 124, 29, 8, 0, 187, 30, 8, 0, 252, 31, 8, 0, 59, 33, 8, 0, 124, 34, 8, 0, 187, 35, 8, 0, 252, 36, 8, 0, 59, 38, 8, 0, 124, 39, 8, 0, 187, 40, 8, 0, 252, 41, 8, 0, 59, 43, 8, 0, 124, 44, 8, 0, 187, 45, 8, 0, 252, 46, 8, 0, 59, 48, 8, 0, 124, 49, 8, 0, 187, 50, 8, 0, 252, 51, 8, 0, 59, 53, 8, 0, 124, 54, 8, 0, 187, 55, 8, 0, 252, 56, 8, 0, 59, 58, 8, 0, 124, 59, 8, 0, 187, 60, 8, 0, 252, 61, 8, 0, 59, 63, 8, 0, 124, 64, 8, 0, 187, 65, 8, 0, 252, 66, 8, 0, 59, 68, 8, 0, 124, 69, 8, 0, 187, 70, 8, 0, 252, 71, 8, 0, 59, 73, 8, 0, 124, 74, 8, 0, 187, 75, 8, 0, 252, 76, 8, 0, 59, 78, 8, 0, 124, 79, 8, 0, 187, 80, 8, 0, 252, 81, 8, 0, 59, 83, 8, 0, 124, 84, 8, 0, 187, 85, 8, 0, 252, 86, 8, 0, 59, 88, 8, 0, 124, 89, 8, 0, 187, 90, 8, 0, 252, 91, 8, 0, 59, 93, 8, 0, 124, 94, 8, 0, 187, 95, 8, 0, 252, 96, 8, 0, 59, 98, 8, 0, 124, 99, 8, 0, 187, 100, 8, 0, 252, 101, 8, 0, 59, 103, 8, 0, 124, 104, 8, 0, 187, 105, 8, 0, 252, 106, 8, 0, 59, 108, 8, 0, 124, 109, 8, 0, 187, 110, 8, 0, 252, 111, 8, 0, 59, 113, 8, 0, 124, 114, 8, 0, 187, 115, 8, 0, 252, 116, 8, 0, 59, 118, 8, 0, 124, 119, 8, 0, 187, 120, 8, 0, 252, 121, 8, 0, 59, 123, 8, 0, 124, 124, 8, 0, 187, 125, 8, 0, 252, 126, 8, 0, 59, 128, 8, 0, 124, 129, 8, 0, 187, 130, 8, 0, 252, 131, 8, 0, 59, 133, 8, 0, 124, 134, 8, 0, 187, 135, 8, 0, 252, 136, 8, 0, 59, 138, 8, 0, 124, 139, 8, 0, 187, 140, 8, 0, 252, 141, 8, 0, 59, 143, 8, 0, 124, 144, 8, 0, 187, 145, 8, 0, 252, 146, 8, 0, 59, 148, 8, 0, 124, 149, 8, 0, 187, 150, 8, 0, 252, 151, 8, 0, 59, 153, 8, 0, 124, 154, 8, 0, 187, 155, 8, 0, 252, 156, 8, 0, 59, 158, 8, 0, 124, 159, 8, 0, 187, 160, 8, 0, 252, 161, 8, 0, 59, 163, 8, 0, 124, 164, 8, 0, 187, 165, 8, 0, 252, 166, 8, 0, 59, 168, 8, 0, 124, 169, 8, 0, 187, 170, 8, 0, 252, 171, 8, 0, 59, 173, 8, 0, 124, 174, 8, 0, 187, 175, 8, 0, 252, 176, 8, 0, 59, 178, 8, 0, 124, 179, 8, 0, 187, 180, 8, 0, 252, 181, 8, 0, 59, 183, 8, 0, 124, 184, 8, 0, 187, 185, 8, 0, 252, 186, 8, 0, 59, 188, 8, 0, 124, 189, 8, 0, 187, 190, 8, 0, 252, 191, 8, 0, 59, 193, 8, 0, 124, 194, 8, 0, 187, 195, 8, 0, 252, 196, 8, 0, 59, 198, 8, 0, 124, 199, 8, 0, 187, 200, 8, 0, 252, 201, 8, 0, 59, 203, 8, 0, 124, 204, 8, 0, 187, 205, 8, 0, 252, 206, 8, 0, 59, 208, 8, 0, 124, 209, 8, 0, 187, 210, 8, 0, 252, 211, 8, 0, 59, 213, 8, 0, 124, 214, 8, 0, 187, 215, 8, 0, 252, 216, 8, 0, 59, 218, 8, 0, 124, 219, 8, 0, 187, 220, 8, 0, 252, 221, 8, 0, 59, 223, 8, 0, 124, 224, 8, 0, 187, 225, 8, 0, 252, 226, 8, 0, 59, 228, 8, 0, 124, 229, 8, 0, 187, 230, 8, 0, 252, 231, 8, 0, 59, 233, 8, 0, 124, 234, 8, 0, 187, 235, 8, 0, 252, 236, 8, 0, 59, 238, 8, 0, 124, 239, 8, 0, 187, 240, 8, 0, 252, 241, 8, 0, 59, 243, 8, 0, 124, 244, 8, 0, 187, 245, 8, 0, 252, 246, 8, 0, 59, 248, 8, 0, 124, 249, 8, 0, 187, 250, 8, 0, 252, 251, 8, 0, 59, 253, 8, 0, 124, 254, 8, 0, 187, 255, 8, 0, 252, 0, 9, 0, 59, 2, 9, 0, 124, 3, 9, 0, 187, 4, 9, 0, 252, 5, 9, 0, 59, 7, 9, 0, 124, 8, 9, 0, 187, 9, 9, 0, 252, 10, 9, 0, 59, 12, 9, 0, 124, 13, 9, 0, 187, 14, 9, 0, 252, 15, 9, 0, 59, 17, 9, 0, 124, 18, 9, 0, 187, 19, 9, 0, 252, 20, 9, 0, 59, 22, 9, 0, 124, 23, 9, 0, 187, 24, 9, 0, 252, 25, 9, 0, 59, 27, 9, 0, 124, 28, 9, 0, 187, 29, 9, 0, 252, 30, 9, 0, 59, 32, 9, 0, 124, 33, 9, 0, 187, 34, 9, 0, 252, 35, 9, 0, 59, 37, 9, 0, 124, 38, 9, 0, 187, 39, 9, 0, 252, 40, 9, 0, 59, 42, 9, 0, 124, 43, 9, 0, 187, 44, 9, 0, 252, 45, 9, 0, 59, 47, 9, 0, 124, 48, 9, 0, 187, 49, 9, 0, 252, 50, 9, 0, 59, 52, 9, 0, 124, 53, 9, 0, 187, 54, 9, 0, 252, 55, 9, 0, 59, 57, 9, 0, 124, 58, 9, 0, 187, 59, 9, 0, 252, 60, 9, 0, 59, 62, 9, 0, 124, 63, 9, 0, 187, 64, 9, 0, 252, 65, 9, 0, 59, 67, 9, 0, 124, 68, 9, 0, 187, 69, 9, 0, 252, 70, 9, 0, 59, 72, 9, 0, 124, 73, 9, 0, 187, 74, 9, 0, 252, 75, 9, 0, 59, 77, 9, 0, 124, 78, 9, 0, 187, 79, 9, 0, 252, 80, 9, 0, 59, 82, 9, 0, 124, 83, 9, 0, 187, 84, 9, 0, 252, 85, 9, 0, 59, 87, 9, 0, 124, 88, 9, 0, 187, 89, 9, 0, 252, 90, 9, 0, 59, 92, 9, 0, 124, 93, 9, 0, 187, 94, 9, 0, 252, 95, 9, 0, 59, 97, 9, 0, 124, 98, 9, 0, 187, 99, 9, 0, 252, 100, 9, 0, 59, 102, 9, 0, 124, 103, 9, 0, 187, 104, 9, 0, 252, 105, 9, 0, 59, 107, 9, 0, 124, 108, 9, 0, 187, 109, 9, 0, 252, 110, 9, 0, 59, 112, 9, 0, 124, 113, 9, 0, 187, 114, 9, 0, 252, 115, 9, 0, 59, 117, 9, 0, 124, 118, 9, 0, 187, 119, 9, 0, 252, 120, 9, 0, 59, 122, 9, 0, 124, 123, 9, 0, 187, 124, 9, 0, 252, 125, 9, 0, 59, 127, 9, 0, 124, 128, 9, 0, 187, 129, 9, 0, 252, 130, 9, 0, 59, 132, 9, 0, 124, 133, 9, 0, 187, 134, 9, 0, 252, 135, 9, 0, 59, 137, 9, 0, 124, 138, 9, 0, 187, 139, 9, 0, 252, 140, 9, 0, 59, 142, 9, 0, 124, 143, 9, 0, 187, 144, 9, 0, 252, 145, 9, 0, 59, 147, 9, 0, 124, 148, 9, 0, 187, 149, 9, 0, 252, 150, 9, 0, 59, 152, 9, 0, 124, 153, 9, 0, 187, 154, 9, 0, 252, 155, 9, 0, 59, 157, 9, 0, 124, 158, 9, 0, 187, 159, 9, 0, 252, 160, 9, 0, 59, 162, 9, 0, 124, 163, 9, 0, 187, 164, 9, 0, 252, 165, 9, 0, 59, 167, 9, 0, 124, 168, 9, 0, 187, 169, 9, 0, 252, 170, 9, 0, 59, 172, 9, 0, 124, 173, 9, 0, 187, 174, 9, 0, 252, 175, 9, 0, 59, 177, 9, 0, 124, 178, 9, 0, 187, 179, 9, 0, 252, 180, 9, 0, 59, 182, 9, 0, 124, 183, 9, 0, 187, 184, 9, 0, 252, 185, 9, 0, 59, 187, 9, 0, 124, 188, 9, 0, 187, 189, 9, 0, 252, 190, 9, 0, 59, 192, 9, 0, 124, 193, 9, 0, 187, 194, 9, 0, 252, 195, 9, 0, 59, 197, 9, 0, 124, 198, 9, 0, 187, 199, 9, 0, 252, 200, 9, 0, 59, 202, 9, 0, 124, 203, 9, 0, 187, 204, 9, 0, 252, 205, 9, 0, 59, 207, 9, 0, 124, 208, 9, 0, 187, 209, 9, 0, 252, 210, 9, 0, 59, 212, 9, 0, 124, 213, 9, 0, 187, 214, 9, 0, 252, 215, 9, 0, 59, 217, 9, 0, 124, 218, 9, 0, 187, 219, 9, 0, 252, 220, 9, 0, 59, 222, 9, 0, 124, 223, 9, 0, 187, 224, 9, 0, 252, 225, 9, 0, 59, 227, 9, 0, 124, 228, 9, 0, 187, 229, 9, 0, 252, 230, 9, 0, 59, 232, 9, 0, 124, 233, 9, 0, 187, 234, 9, 0, 252, 235, 9, 0, 59, 237, 9, 0, 124, 238, 9, 0, 187, 239, 9, 0, 252, 240, 9, 0, 59, 242, 9, 0, 124, 243, 9, 0, 187, 244, 9, 0, 252, 245, 9, 0, 59, 247, 9, 0, 124, 248, 9, 0, 187, 249, 9, 0, 252, 250, 9, 0, 59, 252, 9, 0, 124, 253, 9, 0, 187, 254, 9, 0, 252, 255, 9, 0, 59, 1, 10, 0, 124, 2, 10, 0, 187, 3, 10, 0, 252, 4, 10, 0, 59, 6, 10, 0, 124, 7, 10, 0, 187, 8, 10, 0, 252, 9, 10, 0, 59, 11, 10, 0, 124, 12, 10, 0, 187, 13, 10, 0, 252, 14, 10, 0, 59, 16, 10, 0, 124, 17, 10, 0, 187, 18, 10, 0, 252, 19, 10, 0, 59, 21, 10, 0, 124, 22, 10, 0, 187, 23, 10, 0, 252, 24, 10, 0, 59, 26, 10, 0, 124, 27, 10, 0, 187, 28, 10, 0, 252, 29, 10, 0, 59, 31, 10, 0, 124, 32, 10, 0, 187, 33, 10, 0, 252, 34, 10, 0, 59, 36, 10, 0, 124, 37, 10, 0, 187, 38, 10, 0, 252, 39, 10, 0, 59, 41, 10, 0, 124, 42, 10, 0, 187, 43, 10, 0, 252, 44, 10, 0, 59, 46, 10, 0, 124, 47, 10, 0, 187, 48, 10, 0, 252, 49, 10, 0, 59, 51, 10, 0, 124, 52, 10, 0, 187, 53, 10, 0, 252, 54, 10, 0, 59, 56, 10, 0, 124, 57, 10, 0, 187, 58, 10, 0, 252, 59, 10, 0, 59, 61, 10, 0, 124, 62, 10, 0, 187, 63, 10, 0, 252, 64, 10, 0, 59, 66, 10, 0, 124, 67, 10, 0, 187, 68, 10, 0, 252, 69, 10, 0, 59, 71, 10, 0, 124, 72, 10, 0, 187, 73, 10, 0, 252, 74, 10, 0, 59, 76, 10, 0, 124, 77, 10, 0, 187, 78, 10, 0, 252, 79, 10, 0, 59, 81, 10, 0, 124, 82, 10, 0, 187, 83, 10, 0, 252, 84, 10, 0, 59, 86, 10, 0, 124, 87, 10, 0, 187, 88, 10, 0, 252, 89, 10, 0, 59, 91, 10, 0, 124, 92, 10, 0, 187, 93, 10, 0, 252, 94, 10, 0, 59, 96, 10, 0, 124, 97, 10, 0, 187, 98, 10, 0, 252, 99, 10, 0, 59, 101, 10, 0, 124, 102, 10, 0, 187, 103, 10, 0, 252, 104, 10, 0, 59, 106, 10, 0, 124, 107, 10, 0, 187, 108, 10, 0, 252, 109, 10, 0, 59, 111, 10, 0, 124, 112, 10, 0, 187, 113, 10, 0, 252, 114, 10, 0, 59, 116, 10, 0, 124, 117, 10, 0, 187, 118, 10, 0, 252, 119, 10, 0, 59, 121, 10, 0, 124, 122, 10, 0, 187, 123, 10, 0, 252, 124, 10, 0, 59, 126, 10, 0, 124, 127, 10, 0, 187, 128, 10, 0, 252, 129, 10, 0, 59, 131, 10, 0, 124, 132, 10, 0, 187, 133, 10, 0, 252, 134, 10, 0, 59, 136, 10, 0, 124, 137, 10, 0, 187, 138, 10, 0, 252, 139, 10, 0, 59, 141, 10, 0, 124, 142, 10, 0, 187, 143, 10, 0, 252, 144, 10, 0, 59, 146, 10, 0, 124, 147, 10, 0, 187, 148, 10, 0, 252, 149, 10, 0, 59, 151, 10, 0, 124, 152, 10, 0, 187, 153, 10, 0, 252, 154, 10, 0, 59, 156, 10, 0, 124, 157, 10, 0, 187, 158, 10, 0, 252, 159, 10, 0, 59, 161, 10, 0, 124, 162, 10, 0, 187, 163, 10, 0, 252, 164, 10, 0, 59, 166, 10, 0, 124, 167, 10, 0, 187, 168, 10, 0, 252, 169, 10, 0, 59, 171, 10, 0, 124, 172, 10, 0, 187, 173, 10, 0, 252, 174, 10, 0, 59, 176, 10, 0, 124, 177, 10, 0, 187, 178, 10, 0, 252, 179, 10, 0, 59, 181, 10, 0, 124, 182, 10, 0, 187, 183, 10, 0, 252, 184, 10, 0, 59, 186, 10, 0, 124, 187, 10, 0, 187, 188, 10, 0, 252, 189, 10, 0, 59, 191, 10, 0, 124, 192, 10, 0, 187, 193, 10, 0, 252, 194, 10, 0, 59, 196, 10, 0, 124, 197, 10, 0, 187, 198, 10, 0, 252, 199, 10, 0, 59, 201, 10, 0, 124, 202, 10, 0, 187, 203, 10, 0, 252, 204, 10, 0, 59, 206, 10, 0, 124, 207, 10, 0, 187, 208, 10, 0, 252, 209, 10, 0, 59, 211, 10, 0, 124, 212, 10, 0, 187, 213, 10, 0, 252, 214, 10, 0, 59, 216, 10, 0, 124, 217, 10, 0, 187, 218, 10, 0, 252, 219, 10, 0, 59, 221, 10, 0, 124, 222, 10, 0, 187, 223, 10, 0, 252, 224, 10, 0, 59, 226, 10, 0, 124, 227, 10, 0, 187, 228, 10, 0, 252, 229, 10, 0, 59, 231, 10, 0, 124, 232, 10, 0, 187, 233, 10, 0, 252, 234, 10, 0, 59, 236, 10, 0, 124, 237, 10, 0, 187, 238, 10, 0, 252, 239, 10, 0, 59, 241, 10, 0, 124, 242, 10, 0, 187, 243, 10, 0, 252, 244, 10, 0, 59, 246, 10, 0, 124, 247, 10, 0, 187, 248, 10, 0, 252, 249, 10, 0, 59, 251, 10, 0, 124, 252, 10, 0, 187, 253, 10, 0, 252, 254, 10, 0, 59, 0, 11, 0, 124, 1, 11, 0, 187, 2, 11, 0, 252, 3, 11, 0, 59, 5, 11, 0, 124, 6, 11, 0, 187, 7, 11, 0, 252, 8, 11, 0, 59, 10, 11, 0, 124, 11, 11, 0, 187, 12, 11, 0, 252, 13, 11, 0, 59, 15, 11, 0, 124, 16, 11, 0, 187, 17, 11, 0, 252, 18, 11, 0, 59, 20, 11, 0, 124, 21, 11, 0, 187, 22, 11, 0, 252, 23, 11, 0, 59, 25, 11, 0, 124, 26, 11, 0, 187, 27, 11, 0, 252, 28, 11, 0, 59, 30, 11, 0, 124, 31, 11, 0, 187, 32, 11, 0, 252, 33, 11, 0, 59, 35, 11, 0, 124, 36, 11, 0, 187, 37, 11, 0, 252, 38, 11, 0, 59, 40, 11, 0, 124, 41, 11, 0, 187, 42, 11, 0, 252, 43, 11, 0, 59, 45, 11, 0, 124, 46, 11, 0, 187, 47, 11, 0, 252, 48, 11, 0, 59, 50, 11, 0, 124, 51, 11, 0, 187, 52, 11, 0, 252, 53, 11, 0, 59, 55, 11, 0, 124, 56, 11, 0, 187, 57, 11, 0, 252, 58, 11, 0, 59, 60, 11, 0, 124, 61, 11, 0, 187, 62, 11, 0, 252, 63, 11, 0, 59, 65, 11, 0, 124, 66, 11, 0, 187, 67, 11, 0, 252, 68, 11, 0, 59, 70, 11, 0, 124, 71, 11, 0, 187, 72, 11, 0, 252, 73, 11, 0, 59, 75, 11, 0, 124, 76, 11, 0, 187, 77, 11, 0, 252, 78, 11, 0, 59, 80, 11, 0, 124, 81, 11, 0, 187, 82, 11, 0, 252, 83, 11, 0, 59, 85, 11, 0, 124, 86, 11, 0, 187, 87, 11, 0, 252, 88, 11, 0, 59, 90, 11, 0, 124, 91, 11, 0, 187, 92, 11, 0, 252, 93, 11, 0, 59, 95, 11, 0, 124, 96, 11, 0, 187, 97, 11, 0, 252, 98, 11, 0, 59, 100, 11, 0, 124, 101, 11, 0, 187, 102, 11, 0, 252, 103, 11, 0, 59, 105, 11, 0, 124, 106, 11, 0, 187, 107, 11, 0, 252, 108, 11, 0, 59, 110, 11, 0, 124, 111, 11, 0, 187, 112, 11, 0, 252, 113, 11, 0, 59, 115, 11, 0, 124, 116, 11, 0, 187, 117, 11, 0, 252, 118, 11, 0, 59, 120, 11, 0, 124, 121, 11, 0, 187, 122, 11, 0, 252, 123, 11, 0, 59, 125, 11, 0, 124, 126, 11, 0, 187, 127, 11, 0, 252, 128, 11, 0, 59, 130, 11, 0, 124, 131, 11, 0, 187, 132, 11, 0, 252, 133, 11, 0, 59, 135, 11, 0, 124, 136, 11, 0, 187, 137, 11, 0, 252, 138, 11, 0, 59, 140, 11, 0, 124, 141, 11, 0, 187, 142, 11, 0, 252, 143, 11, 0, 59, 145, 11, 0, 124, 146, 11, 0, 187, 147, 11, 0, 252, 148, 11, 0, 59, 150, 11, 0, 124, 151, 11, 0, 187, 152, 11, 0, 252, 153, 11, 0, 59, 155, 11, 0, 124, 156, 11, 0, 187, 157, 11, 0, 252, 158, 11, 0, 59, 160, 11, 0, 124, 161, 11, 0, 187, 162, 11, 0, 252, 163, 11, 0, 59, 165, 11, 0, 124, 166, 11, 0, 187, 167, 11, 0, 252, 168, 11, 0, 59, 170, 11, 0, 124, 171, 11, 0, 187, 172, 11, 0, 252, 173, 11, 0, 59, 175, 11, 0, 124, 176, 11, 0, 187, 177, 11, 0, 252, 178, 11, 0, 59, 180, 11, 0, 124, 181, 11, 0, 187, 182, 11, 0, 252, 183, 11, 0, 59, 185, 11, 0, 124, 186, 11, 0, 187, 187, 11, 0, 252, 188, 11, 0, 59, 190, 11, 0, 124, 191, 11, 0, 187, 192, 11, 0, 252, 193, 11, 0, 59, 195, 11, 0, 124, 196, 11, 0, 187, 197, 11, 0, 252, 198, 11, 0, 59, 200, 11, 0, 124, 201, 11, 0, 187, 202, 11, 0, 252, 203, 11, 0, 59, 205, 11, 0, 124, 206, 11, 0, 187, 207, 11, 0, 252, 208, 11, 0, 59, 210, 11, 0, 124, 211, 11, 0, 187, 212, 11, 0, 252, 213, 11, 0, 59, 215, 11, 0, 124, 216, 11, 0, 187, 217, 11, 0, 252, 218, 11, 0, 59, 220, 11, 0, 124, 221, 11, 0, 187, 222, 11, 0, 252, 223, 11, 0, 59, 225, 11, 0, 124, 226, 11, 0, 187, 227, 11, 0, 252, 228, 11, 0, 59, 230, 11, 0, 124, 231, 11, 0, 187, 232, 11, 0, 252, 233, 11, 0, 59, 235, 11, 0, 124, 236, 11, 0, 187, 237, 11, 0, 252, 238, 11, 0, 59, 240, 11, 0, 124, 241, 11, 0, 187, 242, 11, 0, 252, 243, 11, 0, 59, 245, 11, 0, 124, 246, 11, 0, 187, 247, 11, 0, 252, 248, 11, 0, 59, 250, 11, 0, 124, 251, 11, 0, 187, 252, 11, 0, 252, 253, 11, 0, 59, 255, 11, 0, 124, 0, 12, 0, 187, 1, 12, 0, 252, 2, 12, 0, 59, 4, 12, 0, 124, 5, 12, 0, 187, 6, 12, 0, 252, 7, 12, 0, 59, 9, 12, 0, 124, 10, 12, 0, 187, 11, 12, 0, 252, 12, 12, 0, 59, 14, 12, 0, 124, 15, 12, 0, 187, 16, 12, 0, 252, 17, 12, 0, 59, 19, 12, 0, 124, 20, 12, 0, 187, 21, 12, 0, 252, 22, 12, 0, 59, 24, 12, 0, 124, 25, 12, 0, 187, 26, 12, 0, 252, 27, 12, 0, 59, 29, 12, 0, 124, 30, 12, 0, 187, 31, 12, 0, 252, 32, 12, 0, 59, 34, 12, 0, 124, 35, 12, 0, 187, 36, 12, 0, 252, 37, 12, 0, 59, 39, 12, 0, 124, 40, 12, 0, 187, 41, 12, 0, 252, 42, 12, 0, 59, 44, 12, 0, 124, 45, 12, 0, 187, 46, 12, 0, 252, 47, 12, 0, 59, 49, 12, 0, 124, 50, 12, 0, 187, 51, 12, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_frequency.json b/tests/recordings/logic_analyzer/test_measure_frequency.json deleted file mode 100644 index 53e36dbc..00000000 --- a/tests/recordings/logic_analyzer/test_measure_frequency.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [5], [0], [10], [9], [196, 9], [0]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [251, 37, 0, 0, 251, 77, 0, 0, 251, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_frequency_firmware.json b/tests/recordings/logic_analyzer/test_measure_frequency_firmware.json deleted file mode 100644 index f97b5d8b..00000000 --- a/tests/recordings/logic_analyzer/test_measure_frequency_firmware.json +++ /dev/null @@ -1 +0,0 @@ -[[[11], [3], [97, 0], [1], [11], [3], [97, 0], [1]], [[], [], [], [0, 141, 231, 228, 0, 141, 231, 228, 0, 1], [], [], [], [0, 207, 38, 0, 0, 207, 78, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_interval.json b/tests/recordings/logic_analyzer/test_measure_interval.json deleted file mode 100644 index 99bc7f74..00000000 --- a/tests/recordings/logic_analyzer/test_measure_interval.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [5], [196, 9], [3], [35], [16], [10], [9], [196, 9], [0], [10], [9], [196, 9], [1]], [[], [1], [], [], [], [1], [], [], [], [], [], [1], [], [], [], [251, 0, 0, 0, 123, 3, 0, 0, 251, 5, 0, 0, 123, 8, 0, 0, 251, 10, 0, 0, 123, 13, 0, 0, 251, 15, 0, 0, 123, 18, 0, 0, 251, 20, 0, 0, 123, 23, 0, 0, 251, 25, 0, 0, 123, 28, 0, 0, 251, 30, 0, 0, 123, 33, 0, 0, 251, 35, 0, 0, 123, 38, 0, 0, 251, 40, 0, 0, 123, 43, 0, 0, 251, 45, 0, 0, 123, 48, 0, 0, 251, 50, 0, 0, 123, 53, 0, 0, 251, 55, 0, 0, 123, 58, 0, 0, 251, 60, 0, 0, 123, 63, 0, 0, 251, 65, 0, 0, 123, 68, 0, 0, 251, 70, 0, 0, 123, 73, 0, 0, 251, 75, 0, 0, 123, 78, 0, 0, 251, 80, 0, 0, 123, 83, 0, 0, 251, 85, 0, 0, 123, 88, 0, 0, 251, 90, 0, 0, 123, 93, 0, 0, 251, 95, 0, 0, 123, 98, 0, 0, 251, 100, 0, 0, 123, 103, 0, 0, 251, 105, 0, 0, 123, 108, 0, 0, 251, 110, 0, 0, 123, 113, 0, 0, 251, 115, 0, 0, 123, 118, 0, 0, 251, 120, 0, 0, 123, 123, 0, 0, 251, 125, 0, 0, 123, 128, 0, 0, 251, 130, 0, 0, 123, 133, 0, 0, 251, 135, 0, 0, 123, 138, 0, 0, 251, 140, 0, 0, 123, 143, 0, 0, 251, 145, 0, 0, 123, 148, 0, 0, 251, 150, 0, 0, 123, 153, 0, 0, 251, 155, 0, 0, 123, 158, 0, 0, 251, 160, 0, 0, 123, 163, 0, 0, 251, 165, 0, 0, 123, 168, 0, 0, 251, 170, 0, 0, 123, 173, 0, 0, 251, 175, 0, 0, 123, 178, 0, 0, 251, 180, 0, 0, 123, 183, 0, 0, 251, 185, 0, 0, 123, 188, 0, 0, 251, 190, 0, 0, 123, 193, 0, 0, 251, 195, 0, 0, 123, 198, 0, 0, 251, 200, 0, 0, 123, 203, 0, 0, 251, 205, 0, 0, 123, 208, 0, 0, 251, 210, 0, 0, 123, 213, 0, 0, 251, 215, 0, 0, 123, 218, 0, 0, 251, 220, 0, 0, 123, 223, 0, 0, 251, 225, 0, 0, 123, 228, 0, 0, 251, 230, 0, 0, 123, 233, 0, 0, 251, 235, 0, 0, 123, 238, 0, 0, 251, 240, 0, 0, 123, 243, 0, 0, 251, 245, 0, 0, 123, 248, 0, 0, 251, 250, 0, 0, 123, 253, 0, 0, 251, 255, 0, 0, 123, 2, 1, 0, 251, 4, 1, 0, 123, 7, 1, 0, 251, 9, 1, 0, 123, 12, 1, 0, 251, 14, 1, 0, 123, 17, 1, 0, 251, 19, 1, 0, 123, 22, 1, 0, 251, 24, 1, 0, 123, 27, 1, 0, 251, 29, 1, 0, 123, 32, 1, 0, 251, 34, 1, 0, 123, 37, 1, 0, 251, 39, 1, 0, 123, 42, 1, 0, 251, 44, 1, 0, 123, 47, 1, 0, 251, 49, 1, 0, 123, 52, 1, 0, 251, 54, 1, 0, 123, 57, 1, 0, 251, 59, 1, 0, 123, 62, 1, 0, 251, 64, 1, 0, 123, 67, 1, 0, 251, 69, 1, 0, 123, 72, 1, 0, 251, 74, 1, 0, 123, 77, 1, 0, 251, 79, 1, 0, 123, 82, 1, 0, 251, 84, 1, 0, 123, 87, 1, 0, 251, 89, 1, 0, 123, 92, 1, 0, 251, 94, 1, 0, 123, 97, 1, 0, 251, 99, 1, 0, 123, 102, 1, 0, 251, 104, 1, 0, 123, 107, 1, 0, 251, 109, 1, 0, 123, 112, 1, 0, 251, 114, 1, 0, 123, 117, 1, 0, 251, 119, 1, 0, 123, 122, 1, 0, 251, 124, 1, 0, 123, 127, 1, 0, 251, 129, 1, 0, 123, 132, 1, 0, 251, 134, 1, 0, 123, 137, 1, 0, 251, 139, 1, 0, 123, 142, 1, 0, 251, 144, 1, 0, 123, 147, 1, 0, 251, 149, 1, 0, 123, 152, 1, 0, 251, 154, 1, 0, 123, 157, 1, 0, 251, 159, 1, 0, 123, 162, 1, 0, 251, 164, 1, 0, 123, 167, 1, 0, 251, 169, 1, 0, 123, 172, 1, 0, 251, 174, 1, 0, 123, 177, 1, 0, 251, 179, 1, 0, 123, 182, 1, 0, 251, 184, 1, 0, 123, 187, 1, 0, 251, 189, 1, 0, 123, 192, 1, 0, 251, 194, 1, 0, 123, 197, 1, 0, 251, 199, 1, 0, 123, 202, 1, 0, 251, 204, 1, 0, 123, 207, 1, 0, 251, 209, 1, 0, 123, 212, 1, 0, 251, 214, 1, 0, 123, 217, 1, 0, 251, 219, 1, 0, 123, 222, 1, 0, 251, 224, 1, 0, 123, 227, 1, 0, 251, 229, 1, 0, 123, 232, 1, 0, 251, 234, 1, 0, 123, 237, 1, 0, 251, 239, 1, 0, 123, 242, 1, 0, 251, 244, 1, 0, 123, 247, 1, 0, 251, 249, 1, 0, 123, 252, 1, 0, 251, 254, 1, 0, 123, 1, 2, 0, 251, 3, 2, 0, 123, 6, 2, 0, 251, 8, 2, 0, 123, 11, 2, 0, 251, 13, 2, 0, 123, 16, 2, 0, 251, 18, 2, 0, 123, 21, 2, 0, 251, 23, 2, 0, 123, 26, 2, 0, 251, 28, 2, 0, 123, 31, 2, 0, 251, 33, 2, 0, 123, 36, 2, 0, 251, 38, 2, 0, 123, 41, 2, 0, 251, 43, 2, 0, 123, 46, 2, 0, 251, 48, 2, 0, 123, 51, 2, 0, 251, 53, 2, 0, 123, 56, 2, 0, 251, 58, 2, 0, 123, 61, 2, 0, 251, 63, 2, 0, 123, 66, 2, 0, 251, 68, 2, 0, 123, 71, 2, 0, 251, 73, 2, 0, 123, 76, 2, 0, 251, 78, 2, 0, 123, 81, 2, 0, 251, 83, 2, 0, 123, 86, 2, 0, 251, 88, 2, 0, 123, 91, 2, 0, 251, 93, 2, 0, 123, 96, 2, 0, 251, 98, 2, 0, 123, 101, 2, 0, 251, 103, 2, 0, 123, 106, 2, 0, 251, 108, 2, 0, 123, 111, 2, 0, 251, 113, 2, 0, 123, 116, 2, 0, 251, 118, 2, 0, 123, 121, 2, 0, 251, 123, 2, 0, 123, 126, 2, 0, 251, 128, 2, 0, 123, 131, 2, 0, 251, 133, 2, 0, 123, 136, 2, 0, 251, 138, 2, 0, 123, 141, 2, 0, 251, 143, 2, 0, 123, 146, 2, 0, 251, 148, 2, 0, 123, 151, 2, 0, 251, 153, 2, 0, 123, 156, 2, 0, 251, 158, 2, 0, 123, 161, 2, 0, 251, 163, 2, 0, 123, 166, 2, 0, 251, 168, 2, 0, 123, 171, 2, 0, 251, 173, 2, 0, 123, 176, 2, 0, 251, 178, 2, 0, 123, 181, 2, 0, 251, 183, 2, 0, 123, 186, 2, 0, 251, 188, 2, 0, 123, 191, 2, 0, 251, 193, 2, 0, 123, 196, 2, 0, 251, 198, 2, 0, 123, 201, 2, 0, 251, 203, 2, 0, 123, 206, 2, 0, 251, 208, 2, 0, 123, 211, 2, 0, 251, 213, 2, 0, 123, 216, 2, 0, 251, 218, 2, 0, 123, 221, 2, 0, 251, 223, 2, 0, 123, 226, 2, 0, 251, 228, 2, 0, 123, 231, 2, 0, 251, 233, 2, 0, 123, 236, 2, 0, 251, 238, 2, 0, 123, 241, 2, 0, 251, 243, 2, 0, 123, 246, 2, 0, 251, 248, 2, 0, 123, 251, 2, 0, 251, 253, 2, 0, 123, 0, 3, 0, 251, 2, 3, 0, 123, 5, 3, 0, 251, 7, 3, 0, 123, 10, 3, 0, 251, 12, 3, 0, 123, 15, 3, 0, 251, 17, 3, 0, 123, 20, 3, 0, 251, 22, 3, 0, 123, 25, 3, 0, 251, 27, 3, 0, 123, 30, 3, 0, 251, 32, 3, 0, 123, 35, 3, 0, 251, 37, 3, 0, 123, 40, 3, 0, 251, 42, 3, 0, 123, 45, 3, 0, 251, 47, 3, 0, 123, 50, 3, 0, 251, 52, 3, 0, 123, 55, 3, 0, 251, 57, 3, 0, 123, 60, 3, 0, 251, 62, 3, 0, 123, 65, 3, 0, 251, 67, 3, 0, 123, 70, 3, 0, 251, 72, 3, 0, 123, 75, 3, 0, 251, 77, 3, 0, 123, 80, 3, 0, 251, 82, 3, 0, 123, 85, 3, 0, 251, 87, 3, 0, 123, 90, 3, 0, 251, 92, 3, 0, 123, 95, 3, 0, 251, 97, 3, 0, 123, 100, 3, 0, 251, 102, 3, 0, 123, 105, 3, 0, 251, 107, 3, 0, 123, 110, 3, 0, 251, 112, 3, 0, 123, 115, 3, 0, 251, 117, 3, 0, 123, 120, 3, 0, 251, 122, 3, 0, 123, 125, 3, 0, 251, 127, 3, 0, 123, 130, 3, 0, 251, 132, 3, 0, 123, 135, 3, 0, 251, 137, 3, 0, 123, 140, 3, 0, 251, 142, 3, 0, 123, 145, 3, 0, 251, 147, 3, 0, 123, 150, 3, 0, 251, 152, 3, 0, 123, 155, 3, 0, 251, 157, 3, 0, 123, 160, 3, 0, 251, 162, 3, 0, 123, 165, 3, 0, 251, 167, 3, 0, 123, 170, 3, 0, 251, 172, 3, 0, 123, 175, 3, 0, 251, 177, 3, 0, 123, 180, 3, 0, 251, 182, 3, 0, 123, 185, 3, 0, 251, 187, 3, 0, 123, 190, 3, 0, 251, 192, 3, 0, 123, 195, 3, 0, 251, 197, 3, 0, 123, 200, 3, 0, 251, 202, 3, 0, 123, 205, 3, 0, 251, 207, 3, 0, 123, 210, 3, 0, 251, 212, 3, 0, 123, 215, 3, 0, 251, 217, 3, 0, 123, 220, 3, 0, 251, 222, 3, 0, 123, 225, 3, 0, 251, 227, 3, 0, 123, 230, 3, 0, 251, 232, 3, 0, 123, 235, 3, 0, 251, 237, 3, 0, 123, 240, 3, 0, 251, 242, 3, 0, 123, 245, 3, 0, 251, 247, 3, 0, 123, 250, 3, 0, 251, 252, 3, 0, 123, 255, 3, 0, 251, 1, 4, 0, 123, 4, 4, 0, 251, 6, 4, 0, 123, 9, 4, 0, 251, 11, 4, 0, 123, 14, 4, 0, 251, 16, 4, 0, 123, 19, 4, 0, 251, 21, 4, 0, 123, 24, 4, 0, 251, 26, 4, 0, 123, 29, 4, 0, 251, 31, 4, 0, 123, 34, 4, 0, 251, 36, 4, 0, 123, 39, 4, 0, 251, 41, 4, 0, 123, 44, 4, 0, 251, 46, 4, 0, 123, 49, 4, 0, 251, 51, 4, 0, 123, 54, 4, 0, 251, 56, 4, 0, 123, 59, 4, 0, 251, 61, 4, 0, 123, 64, 4, 0, 251, 66, 4, 0, 123, 69, 4, 0, 251, 71, 4, 0, 123, 74, 4, 0, 251, 76, 4, 0, 123, 79, 4, 0, 251, 81, 4, 0, 123, 84, 4, 0, 251, 86, 4, 0, 123, 89, 4, 0, 251, 91, 4, 0, 123, 94, 4, 0, 251, 96, 4, 0, 123, 99, 4, 0, 251, 101, 4, 0, 123, 104, 4, 0, 251, 106, 4, 0, 123, 109, 4, 0, 251, 111, 4, 0, 123, 114, 4, 0, 251, 116, 4, 0, 123, 119, 4, 0, 251, 121, 4, 0, 123, 124, 4, 0, 251, 126, 4, 0, 123, 129, 4, 0, 251, 131, 4, 0, 123, 134, 4, 0, 251, 136, 4, 0, 123, 139, 4, 0, 251, 141, 4, 0, 123, 144, 4, 0, 251, 146, 4, 0, 123, 149, 4, 0, 251, 151, 4, 0, 123, 154, 4, 0, 251, 156, 4, 0, 123, 159, 4, 0, 251, 161, 4, 0, 123, 164, 4, 0, 251, 166, 4, 0, 123, 169, 4, 0, 251, 171, 4, 0, 123, 174, 4, 0, 251, 176, 4, 0, 123, 179, 4, 0, 251, 181, 4, 0, 123, 184, 4, 0, 251, 186, 4, 0, 123, 189, 4, 0, 251, 191, 4, 0, 123, 194, 4, 0, 251, 196, 4, 0, 123, 199, 4, 0, 251, 201, 4, 0, 123, 204, 4, 0, 251, 206, 4, 0, 123, 209, 4, 0, 251, 211, 4, 0, 123, 214, 4, 0, 251, 216, 4, 0, 123, 219, 4, 0, 251, 221, 4, 0, 123, 224, 4, 0, 251, 226, 4, 0, 123, 229, 4, 0, 251, 231, 4, 0, 123, 234, 4, 0, 251, 236, 4, 0, 123, 239, 4, 0, 251, 241, 4, 0, 123, 244, 4, 0, 251, 246, 4, 0, 123, 249, 4, 0, 251, 251, 4, 0, 123, 254, 4, 0, 251, 0, 5, 0, 123, 3, 5, 0, 251, 5, 5, 0, 123, 8, 5, 0, 251, 10, 5, 0, 123, 13, 5, 0, 251, 15, 5, 0, 123, 18, 5, 0, 251, 20, 5, 0, 123, 23, 5, 0, 251, 25, 5, 0, 123, 28, 5, 0, 251, 30, 5, 0, 123, 33, 5, 0, 251, 35, 5, 0, 123, 38, 5, 0, 251, 40, 5, 0, 123, 43, 5, 0, 251, 45, 5, 0, 123, 48, 5, 0, 251, 50, 5, 0, 123, 53, 5, 0, 251, 55, 5, 0, 123, 58, 5, 0, 251, 60, 5, 0, 123, 63, 5, 0, 251, 65, 5, 0, 123, 68, 5, 0, 251, 70, 5, 0, 123, 73, 5, 0, 251, 75, 5, 0, 123, 78, 5, 0, 251, 80, 5, 0, 123, 83, 5, 0, 251, 85, 5, 0, 123, 88, 5, 0, 251, 90, 5, 0, 123, 93, 5, 0, 251, 95, 5, 0, 123, 98, 5, 0, 251, 100, 5, 0, 123, 103, 5, 0, 251, 105, 5, 0, 123, 108, 5, 0, 251, 110, 5, 0, 123, 113, 5, 0, 251, 115, 5, 0, 123, 118, 5, 0, 251, 120, 5, 0, 123, 123, 5, 0, 251, 125, 5, 0, 123, 128, 5, 0, 251, 130, 5, 0, 123, 133, 5, 0, 251, 135, 5, 0, 123, 138, 5, 0, 251, 140, 5, 0, 123, 143, 5, 0, 251, 145, 5, 0, 123, 148, 5, 0, 251, 150, 5, 0, 123, 153, 5, 0, 251, 155, 5, 0, 123, 158, 5, 0, 251, 160, 5, 0, 123, 163, 5, 0, 251, 165, 5, 0, 123, 168, 5, 0, 251, 170, 5, 0, 123, 173, 5, 0, 251, 175, 5, 0, 123, 178, 5, 0, 251, 180, 5, 0, 123, 183, 5, 0, 251, 185, 5, 0, 123, 188, 5, 0, 251, 190, 5, 0, 123, 193, 5, 0, 251, 195, 5, 0, 123, 198, 5, 0, 251, 200, 5, 0, 123, 203, 5, 0, 251, 205, 5, 0, 123, 208, 5, 0, 251, 210, 5, 0, 123, 213, 5, 0, 251, 215, 5, 0, 123, 218, 5, 0, 251, 220, 5, 0, 123, 223, 5, 0, 251, 225, 5, 0, 123, 228, 5, 0, 251, 230, 5, 0, 123, 233, 5, 0, 251, 235, 5, 0, 123, 238, 5, 0, 251, 240, 5, 0, 123, 243, 5, 0, 251, 245, 5, 0, 123, 248, 5, 0, 251, 250, 5, 0, 123, 253, 5, 0, 251, 255, 5, 0, 123, 2, 6, 0, 251, 4, 6, 0, 123, 7, 6, 0, 251, 9, 6, 0, 123, 12, 6, 0, 251, 14, 6, 0, 123, 17, 6, 0, 251, 19, 6, 0, 123, 22, 6, 0, 251, 24, 6, 0, 123, 27, 6, 0, 251, 29, 6, 0, 123, 32, 6, 0, 251, 34, 6, 0, 123, 37, 6, 0, 251, 39, 6, 0, 123, 42, 6, 0, 251, 44, 6, 0, 123, 47, 6, 0, 251, 49, 6, 0, 123, 52, 6, 0, 251, 54, 6, 0, 123, 57, 6, 0, 251, 59, 6, 0, 123, 62, 6, 0, 251, 64, 6, 0, 123, 67, 6, 0, 251, 69, 6, 0, 123, 72, 6, 0, 251, 74, 6, 0, 123, 77, 6, 0, 251, 79, 6, 0, 123, 82, 6, 0, 251, 84, 6, 0, 123, 87, 6, 0, 251, 89, 6, 0, 123, 92, 6, 0, 251, 94, 6, 0, 123, 97, 6, 0, 251, 99, 6, 0, 123, 102, 6, 0, 251, 104, 6, 0, 123, 107, 6, 0, 251, 109, 6, 0, 123, 112, 6, 0, 251, 114, 6, 0, 123, 117, 6, 0, 251, 119, 6, 0, 123, 122, 6, 0, 251, 124, 6, 0, 123, 127, 6, 0, 251, 129, 6, 0, 123, 132, 6, 0, 251, 134, 6, 0, 123, 137, 6, 0, 251, 139, 6, 0, 123, 142, 6, 0, 251, 144, 6, 0, 123, 147, 6, 0, 251, 149, 6, 0, 123, 152, 6, 0, 251, 154, 6, 0, 123, 157, 6, 0, 251, 159, 6, 0, 123, 162, 6, 0, 251, 164, 6, 0, 123, 167, 6, 0, 251, 169, 6, 0, 123, 172, 6, 0, 251, 174, 6, 0, 123, 177, 6, 0, 251, 179, 6, 0, 123, 182, 6, 0, 251, 184, 6, 0, 123, 187, 6, 0, 251, 189, 6, 0, 123, 192, 6, 0, 251, 194, 6, 0, 123, 197, 6, 0, 251, 199, 6, 0, 123, 202, 6, 0, 251, 204, 6, 0, 123, 207, 6, 0, 251, 209, 6, 0, 123, 212, 6, 0, 251, 214, 6, 0, 123, 217, 6, 0, 251, 219, 6, 0, 123, 222, 6, 0, 251, 224, 6, 0, 123, 227, 6, 0, 251, 229, 6, 0, 123, 232, 6, 0, 251, 234, 6, 0, 123, 237, 6, 0, 251, 239, 6, 0, 123, 242, 6, 0, 251, 244, 6, 0, 123, 247, 6, 0, 251, 249, 6, 0, 123, 252, 6, 0, 251, 254, 6, 0, 123, 1, 7, 0, 251, 3, 7, 0, 123, 6, 7, 0, 251, 8, 7, 0, 123, 11, 7, 0, 251, 13, 7, 0, 123, 16, 7, 0, 251, 18, 7, 0, 123, 21, 7, 0, 251, 23, 7, 0, 123, 26, 7, 0, 251, 28, 7, 0, 123, 31, 7, 0, 251, 33, 7, 0, 123, 36, 7, 0, 251, 38, 7, 0, 123, 41, 7, 0, 251, 43, 7, 0, 123, 46, 7, 0, 251, 48, 7, 0, 123, 51, 7, 0, 251, 53, 7, 0, 123, 56, 7, 0, 251, 58, 7, 0, 123, 61, 7, 0, 251, 63, 7, 0, 123, 66, 7, 0, 251, 68, 7, 0, 123, 71, 7, 0, 251, 73, 7, 0, 123, 76, 7, 0, 251, 78, 7, 0, 123, 81, 7, 0, 251, 83, 7, 0, 123, 86, 7, 0, 251, 88, 7, 0, 123, 91, 7, 0, 251, 93, 7, 0, 123, 96, 7, 0, 251, 98, 7, 0, 123, 101, 7, 0, 251, 103, 7, 0, 123, 106, 7, 0, 251, 108, 7, 0, 123, 111, 7, 0, 251, 113, 7, 0, 123, 116, 7, 0, 251, 118, 7, 0, 123, 121, 7, 0, 251, 123, 7, 0, 123, 126, 7, 0, 251, 128, 7, 0, 123, 131, 7, 0, 251, 133, 7, 0, 123, 136, 7, 0, 251, 138, 7, 0, 123, 141, 7, 0, 251, 143, 7, 0, 123, 146, 7, 0, 251, 148, 7, 0, 123, 151, 7, 0, 251, 153, 7, 0, 123, 156, 7, 0, 251, 158, 7, 0, 123, 161, 7, 0, 251, 163, 7, 0, 123, 166, 7, 0, 251, 168, 7, 0, 123, 171, 7, 0, 251, 173, 7, 0, 123, 176, 7, 0, 251, 178, 7, 0, 123, 181, 7, 0, 251, 183, 7, 0, 123, 186, 7, 0, 251, 188, 7, 0, 123, 191, 7, 0, 251, 193, 7, 0, 123, 196, 7, 0, 251, 198, 7, 0, 123, 201, 7, 0, 251, 203, 7, 0, 123, 206, 7, 0, 251, 208, 7, 0, 123, 211, 7, 0, 251, 213, 7, 0, 123, 216, 7, 0, 251, 218, 7, 0, 123, 221, 7, 0, 251, 223, 7, 0, 123, 226, 7, 0, 251, 228, 7, 0, 123, 231, 7, 0, 251, 233, 7, 0, 123, 236, 7, 0, 251, 238, 7, 0, 123, 241, 7, 0, 251, 243, 7, 0, 123, 246, 7, 0, 251, 248, 7, 0, 123, 251, 7, 0, 251, 253, 7, 0, 123, 0, 8, 0, 251, 2, 8, 0, 123, 5, 8, 0, 251, 7, 8, 0, 123, 10, 8, 0, 251, 12, 8, 0, 123, 15, 8, 0, 251, 17, 8, 0, 123, 20, 8, 0, 251, 22, 8, 0, 123, 25, 8, 0, 251, 27, 8, 0, 123, 30, 8, 0, 251, 32, 8, 0, 123, 35, 8, 0, 251, 37, 8, 0, 123, 40, 8, 0, 251, 42, 8, 0, 123, 45, 8, 0, 251, 47, 8, 0, 123, 50, 8, 0, 251, 52, 8, 0, 123, 55, 8, 0, 251, 57, 8, 0, 123, 60, 8, 0, 251, 62, 8, 0, 123, 65, 8, 0, 251, 67, 8, 0, 123, 70, 8, 0, 251, 72, 8, 0, 123, 75, 8, 0, 251, 77, 8, 0, 123, 80, 8, 0, 251, 82, 8, 0, 123, 85, 8, 0, 251, 87, 8, 0, 123, 90, 8, 0, 251, 92, 8, 0, 123, 95, 8, 0, 251, 97, 8, 0, 123, 100, 8, 0, 251, 102, 8, 0, 123, 105, 8, 0, 251, 107, 8, 0, 123, 110, 8, 0, 251, 112, 8, 0, 123, 115, 8, 0, 251, 117, 8, 0, 123, 120, 8, 0, 251, 122, 8, 0, 123, 125, 8, 0, 251, 127, 8, 0, 123, 130, 8, 0, 251, 132, 8, 0, 123, 135, 8, 0, 251, 137, 8, 0, 123, 140, 8, 0, 251, 142, 8, 0, 123, 145, 8, 0, 251, 147, 8, 0, 123, 150, 8, 0, 251, 152, 8, 0, 123, 155, 8, 0, 251, 157, 8, 0, 123, 160, 8, 0, 251, 162, 8, 0, 123, 165, 8, 0, 251, 167, 8, 0, 123, 170, 8, 0, 251, 172, 8, 0, 123, 175, 8, 0, 251, 177, 8, 0, 123, 180, 8, 0, 251, 182, 8, 0, 123, 185, 8, 0, 251, 187, 8, 0, 123, 190, 8, 0, 251, 192, 8, 0, 123, 195, 8, 0, 251, 197, 8, 0, 123, 200, 8, 0, 251, 202, 8, 0, 123, 205, 8, 0, 251, 207, 8, 0, 123, 210, 8, 0, 251, 212, 8, 0, 123, 215, 8, 0, 251, 217, 8, 0, 123, 220, 8, 0, 251, 222, 8, 0, 123, 225, 8, 0, 251, 227, 8, 0, 123, 230, 8, 0, 251, 232, 8, 0, 123, 235, 8, 0, 251, 237, 8, 0, 123, 240, 8, 0, 251, 242, 8, 0, 123, 245, 8, 0, 251, 247, 8, 0, 123, 250, 8, 0, 251, 252, 8, 0, 123, 255, 8, 0, 251, 1, 9, 0, 123, 4, 9, 0, 251, 6, 9, 0, 123, 9, 9, 0, 251, 11, 9, 0, 123, 14, 9, 0, 251, 16, 9, 0, 123, 19, 9, 0, 251, 21, 9, 0, 123, 24, 9, 0, 251, 26, 9, 0, 123, 29, 9, 0, 251, 31, 9, 0, 123, 34, 9, 0, 251, 36, 9, 0, 123, 39, 9, 0, 251, 41, 9, 0, 123, 44, 9, 0, 251, 46, 9, 0, 123, 49, 9, 0, 251, 51, 9, 0, 123, 54, 9, 0, 251, 56, 9, 0, 123, 59, 9, 0, 251, 61, 9, 0, 123, 64, 9, 0, 251, 66, 9, 0, 123, 69, 9, 0, 251, 71, 9, 0, 123, 74, 9, 0, 251, 76, 9, 0, 123, 79, 9, 0, 251, 81, 9, 0, 123, 84, 9, 0, 251, 86, 9, 0, 123, 89, 9, 0, 251, 91, 9, 0, 123, 94, 9, 0, 251, 96, 9, 0, 123, 99, 9, 0, 251, 101, 9, 0, 123, 104, 9, 0, 251, 106, 9, 0, 123, 109, 9, 0, 251, 111, 9, 0, 123, 114, 9, 0, 251, 116, 9, 0, 123, 119, 9, 0, 251, 121, 9, 0, 123, 124, 9, 0, 251, 126, 9, 0, 123, 129, 9, 0, 251, 131, 9, 0, 123, 134, 9, 0, 251, 136, 9, 0, 123, 139, 9, 0, 251, 141, 9, 0, 123, 144, 9, 0, 251, 146, 9, 0, 123, 149, 9, 0, 251, 151, 9, 0, 123, 154, 9, 0, 251, 156, 9, 0, 123, 159, 9, 0, 251, 161, 9, 0, 123, 164, 9, 0, 251, 166, 9, 0, 123, 169, 9, 0, 251, 171, 9, 0, 123, 174, 9, 0, 251, 176, 9, 0, 123, 179, 9, 0, 251, 181, 9, 0, 123, 184, 9, 0, 251, 186, 9, 0, 123, 189, 9, 0, 251, 191, 9, 0, 123, 194, 9, 0, 251, 196, 9, 0, 123, 199, 9, 0, 251, 201, 9, 0, 123, 204, 9, 0, 251, 206, 9, 0, 123, 209, 9, 0, 251, 211, 9, 0, 123, 214, 9, 0, 251, 216, 9, 0, 123, 219, 9, 0, 251, 221, 9, 0, 123, 224, 9, 0, 251, 226, 9, 0, 123, 229, 9, 0, 251, 231, 9, 0, 123, 234, 9, 0, 251, 236, 9, 0, 123, 239, 9, 0, 251, 241, 9, 0, 123, 244, 9, 0, 251, 246, 9, 0, 123, 249, 9, 0, 251, 251, 9, 0, 123, 254, 9, 0, 251, 0, 10, 0, 123, 3, 10, 0, 251, 5, 10, 0, 123, 8, 10, 0, 251, 10, 10, 0, 123, 13, 10, 0, 251, 15, 10, 0, 123, 18, 10, 0, 251, 20, 10, 0, 123, 23, 10, 0, 251, 25, 10, 0, 123, 28, 10, 0, 251, 30, 10, 0, 123, 33, 10, 0, 251, 35, 10, 0, 123, 38, 10, 0, 251, 40, 10, 0, 123, 43, 10, 0, 251, 45, 10, 0, 123, 48, 10, 0, 251, 50, 10, 0, 123, 53, 10, 0, 251, 55, 10, 0, 123, 58, 10, 0, 251, 60, 10, 0, 123, 63, 10, 0, 251, 65, 10, 0, 123, 68, 10, 0, 251, 70, 10, 0, 123, 73, 10, 0, 251, 75, 10, 0, 123, 78, 10, 0, 251, 80, 10, 0, 123, 83, 10, 0, 251, 85, 10, 0, 123, 88, 10, 0, 251, 90, 10, 0, 123, 93, 10, 0, 251, 95, 10, 0, 123, 98, 10, 0, 251, 100, 10, 0, 123, 103, 10, 0, 251, 105, 10, 0, 123, 108, 10, 0, 251, 110, 10, 0, 123, 113, 10, 0, 251, 115, 10, 0, 123, 118, 10, 0, 251, 120, 10, 0, 123, 123, 10, 0, 251, 125, 10, 0, 123, 128, 10, 0, 251, 130, 10, 0, 123, 133, 10, 0, 251, 135, 10, 0, 123, 138, 10, 0, 251, 140, 10, 0, 123, 143, 10, 0, 251, 145, 10, 0, 123, 148, 10, 0, 251, 150, 10, 0, 123, 153, 10, 0, 251, 155, 10, 0, 123, 158, 10, 0, 251, 160, 10, 0, 123, 163, 10, 0, 251, 165, 10, 0, 123, 168, 10, 0, 251, 170, 10, 0, 123, 173, 10, 0, 251, 175, 10, 0, 123, 178, 10, 0, 251, 180, 10, 0, 123, 183, 10, 0, 251, 185, 10, 0, 123, 188, 10, 0, 251, 190, 10, 0, 123, 193, 10, 0, 251, 195, 10, 0, 123, 198, 10, 0, 251, 200, 10, 0, 123, 203, 10, 0, 251, 205, 10, 0, 123, 208, 10, 0, 251, 210, 10, 0, 123, 213, 10, 0, 251, 215, 10, 0, 123, 218, 10, 0, 251, 220, 10, 0, 123, 223, 10, 0, 251, 225, 10, 0, 123, 228, 10, 0, 251, 230, 10, 0, 123, 233, 10, 0, 251, 235, 10, 0, 123, 238, 10, 0, 251, 240, 10, 0, 123, 243, 10, 0, 251, 245, 10, 0, 123, 248, 10, 0, 251, 250, 10, 0, 123, 253, 10, 0, 251, 255, 10, 0, 123, 2, 11, 0, 251, 4, 11, 0, 123, 7, 11, 0, 251, 9, 11, 0, 123, 12, 11, 0, 251, 14, 11, 0, 123, 17, 11, 0, 251, 19, 11, 0, 123, 22, 11, 0, 251, 24, 11, 0, 123, 27, 11, 0, 251, 29, 11, 0, 123, 32, 11, 0, 251, 34, 11, 0, 123, 37, 11, 0, 251, 39, 11, 0, 123, 42, 11, 0, 251, 44, 11, 0, 123, 47, 11, 0, 251, 49, 11, 0, 123, 52, 11, 0, 251, 54, 11, 0, 123, 57, 11, 0, 251, 59, 11, 0, 123, 62, 11, 0, 251, 64, 11, 0, 123, 67, 11, 0, 251, 69, 11, 0, 123, 72, 11, 0, 251, 74, 11, 0, 123, 77, 11, 0, 251, 79, 11, 0, 123, 82, 11, 0, 251, 84, 11, 0, 123, 87, 11, 0, 251, 89, 11, 0, 123, 92, 11, 0, 251, 94, 11, 0, 123, 97, 11, 0, 251, 99, 11, 0, 123, 102, 11, 0, 251, 104, 11, 0, 123, 107, 11, 0, 251, 109, 11, 0, 123, 112, 11, 0, 251, 114, 11, 0, 123, 117, 11, 0, 251, 119, 11, 0, 123, 122, 11, 0, 251, 124, 11, 0, 123, 127, 11, 0, 251, 129, 11, 0, 123, 132, 11, 0, 251, 134, 11, 0, 123, 137, 11, 0, 251, 139, 11, 0, 123, 142, 11, 0, 251, 144, 11, 0, 123, 147, 11, 0, 251, 149, 11, 0, 123, 152, 11, 0, 251, 154, 11, 0, 123, 157, 11, 0, 251, 159, 11, 0, 123, 162, 11, 0, 251, 164, 11, 0, 123, 167, 11, 0, 251, 169, 11, 0, 123, 172, 11, 0, 251, 174, 11, 0, 123, 177, 11, 0, 251, 179, 11, 0, 123, 182, 11, 0, 251, 184, 11, 0, 123, 187, 11, 0, 251, 189, 11, 0, 123, 192, 11, 0, 251, 194, 11, 0, 123, 197, 11, 0, 251, 199, 11, 0, 123, 202, 11, 0, 251, 204, 11, 0, 123, 207, 11, 0, 251, 209, 11, 0, 123, 212, 11, 0, 251, 214, 11, 0, 123, 217, 11, 0, 251, 219, 11, 0, 123, 222, 11, 0, 251, 224, 11, 0, 123, 227, 11, 0, 251, 229, 11, 0, 123, 232, 11, 0, 251, 234, 11, 0, 123, 237, 11, 0, 251, 239, 11, 0, 123, 242, 11, 0, 251, 244, 11, 0, 123, 247, 11, 0, 251, 249, 11, 0, 123, 252, 11, 0, 251, 254, 11, 0, 123, 1, 12, 0, 251, 3, 12, 0, 123, 6, 12, 0, 251, 8, 12, 0, 123, 11, 12, 0, 251, 13, 12, 0, 123, 16, 12, 0, 251, 18, 12, 0, 123, 21, 12, 0, 251, 23, 12, 0, 123, 26, 12, 0, 251, 28, 12, 0, 123, 31, 12, 0, 251, 33, 12, 0, 123, 36, 12, 0, 251, 38, 12, 0, 123, 41, 12, 0, 251, 43, 12, 0, 123, 46, 12, 0, 251, 48, 12, 0, 123, 51, 12, 0, 251, 53, 12, 0, 123, 56, 12, 0, 251, 58, 12, 0, 123, 61, 12, 0, 251, 63, 12, 0, 123, 66, 12, 0, 251, 68, 12, 0, 123, 71, 12, 0, 251, 73, 12, 0, 123, 76, 12, 0, 251, 78, 12, 0, 123, 81, 12, 0, 251, 83, 12, 0, 123, 86, 12, 0, 251, 88, 12, 0, 123, 91, 12, 0, 251, 93, 12, 0, 123, 96, 12, 0, 251, 98, 12, 0, 123, 101, 12, 0, 251, 103, 12, 0, 123, 106, 12, 0, 251, 108, 12, 0, 123, 111, 12, 0, 251, 113, 12, 0, 123, 116, 12, 0, 251, 118, 12, 0, 123, 121, 12, 0, 251, 123, 12, 0, 123, 126, 12, 0, 251, 128, 12, 0, 123, 131, 12, 0, 251, 133, 12, 0, 123, 136, 12, 0, 251, 138, 12, 0, 123, 141, 12, 0, 251, 143, 12, 0, 123, 146, 12, 0, 251, 148, 12, 0, 123, 151, 12, 0, 251, 153, 12, 0, 123, 156, 12, 0, 251, 158, 12, 0, 123, 161, 12, 0, 251, 163, 12, 0, 123, 166, 12, 0, 251, 168, 12, 0, 123, 171, 12, 0, 251, 173, 12, 0, 123, 176, 12, 0, 251, 178, 12, 0, 123, 181, 12, 0, 251, 183, 12, 0, 123, 186, 12, 0, 251, 188, 12, 0, 123, 191, 12, 0, 251, 193, 12, 0, 123, 196, 12, 0, 251, 198, 12, 0, 123, 201, 12, 0, 251, 203, 12, 0, 123, 206, 12, 0, 251, 208, 12, 0, 123, 211, 12, 0, 251, 213, 12, 0, 123, 216, 12, 0, 251, 218, 12, 0, 123, 221, 12, 0, 251, 223, 12, 0, 123, 226, 12, 0, 251, 228, 12, 0, 123, 231, 12, 0, 251, 233, 12, 0, 123, 236, 12, 0, 251, 238, 12, 0, 123, 241, 12, 0, 251, 243, 12, 0, 123, 246, 12, 0, 251, 248, 12, 0, 123, 251, 12, 0, 251, 253, 12, 0, 123, 0, 13, 0, 251, 2, 13, 0, 123, 5, 13, 0, 251, 7, 13, 0, 123, 10, 13, 0, 251, 12, 13, 0, 123, 15, 13, 0, 251, 17, 13, 0, 123, 20, 13, 0, 251, 22, 13, 0, 123, 25, 13, 0, 251, 27, 13, 0, 123, 30, 13, 0, 251, 32, 13, 0, 123, 35, 13, 0, 251, 37, 13, 0, 123, 40, 13, 0, 251, 42, 13, 0, 123, 45, 13, 0, 251, 47, 13, 0, 123, 50, 13, 0, 251, 52, 13, 0, 123, 55, 13, 0, 251, 57, 13, 0, 123, 60, 13, 0, 251, 62, 13, 0, 123, 65, 13, 0, 251, 67, 13, 0, 123, 70, 13, 0, 251, 72, 13, 0, 123, 75, 13, 0, 251, 77, 13, 0, 123, 80, 13, 0, 251, 82, 13, 0, 123, 85, 13, 0, 251, 87, 13, 0, 123, 90, 13, 0, 251, 92, 13, 0, 123, 95, 13, 0, 251, 97, 13, 0, 123, 100, 13, 0, 251, 102, 13, 0, 123, 105, 13, 0, 251, 107, 13, 0, 123, 110, 13, 0, 251, 112, 13, 0, 123, 115, 13, 0, 251, 117, 13, 0, 123, 120, 13, 0, 251, 122, 13, 0, 123, 125, 13, 0, 251, 127, 13, 0, 123, 130, 13, 0, 251, 132, 13, 0, 123, 135, 13, 0, 251, 137, 13, 0, 123, 140, 13, 0, 251, 142, 13, 0, 123, 145, 13, 0, 251, 147, 13, 0, 123, 150, 13, 0, 251, 152, 13, 0, 123, 155, 13, 0, 251, 157, 13, 0, 123, 160, 13, 0, 251, 162, 13, 0, 123, 165, 13, 0, 251, 167, 13, 0, 123, 170, 13, 0, 251, 172, 13, 0, 123, 175, 13, 0, 251, 177, 13, 0, 123, 180, 13, 0, 251, 182, 13, 0, 123, 185, 13, 0, 251, 187, 13, 0, 123, 190, 13, 0, 251, 192, 13, 0, 123, 195, 13, 0, 251, 197, 13, 0, 123, 200, 13, 0, 251, 202, 13, 0, 123, 205, 13, 0, 251, 207, 13, 0, 123, 210, 13, 0, 251, 212, 13, 0, 123, 215, 13, 0, 251, 217, 13, 0, 123, 220, 13, 0, 251, 222, 13, 0, 123, 225, 13, 0, 251, 227, 13, 0, 123, 230, 13, 0, 251, 232, 13, 0, 123, 235, 13, 0, 251, 237, 13, 0, 123, 240, 13, 0, 251, 242, 13, 0, 123, 245, 13, 0, 251, 247, 13, 0, 123, 250, 13, 0, 251, 252, 13, 0, 123, 255, 13, 0, 251, 1, 14, 0, 123, 4, 14, 0, 251, 6, 14, 0, 123, 9, 14, 0, 251, 11, 14, 0, 123, 14, 14, 0, 251, 16, 14, 0, 123, 19, 14, 0, 251, 21, 14, 0, 123, 24, 14, 0, 251, 26, 14, 0, 123, 29, 14, 0, 251, 31, 14, 0, 123, 34, 14, 0, 251, 36, 14, 0, 123, 39, 14, 0, 251, 41, 14, 0, 123, 44, 14, 0, 251, 46, 14, 0, 123, 49, 14, 0, 251, 51, 14, 0, 123, 54, 14, 0, 251, 56, 14, 0, 123, 59, 14, 0, 251, 61, 14, 0, 123, 64, 14, 0, 251, 66, 14, 0, 123, 69, 14, 0, 251, 71, 14, 0, 123, 74, 14, 0, 251, 76, 14, 0, 123, 79, 14, 0, 251, 81, 14, 0, 123, 84, 14, 0, 251, 86, 14, 0, 123, 89, 14, 0, 251, 91, 14, 0, 123, 94, 14, 0, 251, 96, 14, 0, 123, 99, 14, 0, 251, 101, 14, 0, 123, 104, 14, 0, 251, 106, 14, 0, 123, 109, 14, 0, 251, 111, 14, 0, 123, 114, 14, 0, 251, 116, 14, 0, 123, 119, 14, 0, 251, 121, 14, 0, 123, 124, 14, 0, 251, 126, 14, 0, 123, 129, 14, 0, 251, 131, 14, 0, 123, 134, 14, 0, 251, 136, 14, 0, 123, 139, 14, 0, 251, 141, 14, 0, 123, 144, 14, 0, 251, 146, 14, 0, 123, 149, 14, 0, 251, 151, 14, 0, 123, 154, 14, 0, 251, 156, 14, 0, 123, 159, 14, 0, 251, 161, 14, 0, 123, 164, 14, 0, 251, 166, 14, 0, 123, 169, 14, 0, 251, 171, 14, 0, 123, 174, 14, 0, 251, 176, 14, 0, 123, 179, 14, 0, 251, 181, 14, 0, 123, 184, 14, 0, 251, 186, 14, 0, 123, 189, 14, 0, 251, 191, 14, 0, 123, 194, 14, 0, 251, 196, 14, 0, 123, 199, 14, 0, 251, 201, 14, 0, 123, 204, 14, 0, 251, 206, 14, 0, 123, 209, 14, 0, 251, 211, 14, 0, 123, 214, 14, 0, 251, 216, 14, 0, 123, 219, 14, 0, 251, 221, 14, 0, 123, 224, 14, 0, 251, 226, 14, 0, 123, 229, 14, 0, 251, 231, 14, 0, 123, 234, 14, 0, 251, 236, 14, 0, 123, 239, 14, 0, 251, 241, 14, 0, 123, 244, 14, 0, 251, 246, 14, 0, 123, 249, 14, 0, 251, 251, 14, 0, 123, 254, 14, 0, 251, 0, 15, 0, 123, 3, 15, 0, 251, 5, 15, 0, 123, 8, 15, 0, 251, 10, 15, 0, 123, 13, 15, 0, 251, 15, 15, 0, 123, 18, 15, 0, 251, 20, 15, 0, 123, 23, 15, 0, 251, 25, 15, 0, 123, 28, 15, 0, 251, 30, 15, 0, 123, 33, 15, 0, 251, 35, 15, 0, 123, 38, 15, 0, 251, 40, 15, 0, 123, 43, 15, 0, 251, 45, 15, 0, 123, 48, 15, 0, 251, 50, 15, 0, 123, 53, 15, 0, 251, 55, 15, 0, 123, 58, 15, 0, 251, 60, 15, 0, 123, 63, 15, 0, 251, 65, 15, 0, 123, 68, 15, 0, 251, 70, 15, 0, 123, 73, 15, 0, 251, 75, 15, 0, 123, 78, 15, 0, 251, 80, 15, 0, 123, 83, 15, 0, 251, 85, 15, 0, 123, 88, 15, 0, 251, 90, 15, 0, 123, 93, 15, 0, 251, 95, 15, 0, 123, 98, 15, 0, 251, 100, 15, 0, 123, 103, 15, 0, 251, 105, 15, 0, 123, 108, 15, 0, 251, 110, 15, 0, 123, 113, 15, 0, 251, 115, 15, 0, 123, 118, 15, 0, 251, 120, 15, 0, 123, 123, 15, 0, 251, 125, 15, 0, 123, 128, 15, 0, 251, 130, 15, 0, 123, 133, 15, 0, 251, 135, 15, 0, 123, 138, 15, 0, 251, 140, 15, 0, 123, 143, 15, 0, 251, 145, 15, 0, 123, 148, 15, 0, 251, 150, 15, 0, 123, 153, 15, 0, 251, 155, 15, 0, 123, 158, 15, 0, 251, 160, 15, 0, 123, 163, 15, 0, 251, 165, 15, 0, 123, 168, 15, 0, 251, 170, 15, 0, 123, 173, 15, 0, 251, 175, 15, 0, 123, 178, 15, 0, 251, 180, 15, 0, 123, 183, 15, 0, 251, 185, 15, 0, 123, 188, 15, 0, 251, 190, 15, 0, 123, 193, 15, 0, 251, 195, 15, 0, 123, 198, 15, 0, 251, 200, 15, 0, 123, 203, 15, 0, 251, 205, 15, 0, 123, 208, 15, 0, 251, 210, 15, 0, 123, 213, 15, 0, 251, 215, 15, 0, 123, 218, 15, 0, 251, 220, 15, 0, 123, 223, 15, 0, 251, 225, 15, 0, 123, 228, 15, 0, 251, 230, 15, 0, 123, 233, 15, 0, 251, 235, 15, 0, 123, 238, 15, 0, 251, 240, 15, 0, 123, 243, 15, 0, 251, 245, 15, 0, 123, 248, 15, 0, 251, 250, 15, 0, 123, 253, 15, 0, 251, 255, 15, 0, 123, 2, 16, 0, 251, 4, 16, 0, 123, 7, 16, 0, 251, 9, 16, 0, 123, 12, 16, 0, 251, 14, 16, 0, 123, 17, 16, 0, 251, 19, 16, 0, 123, 22, 16, 0, 251, 24, 16, 0, 123, 27, 16, 0, 251, 29, 16, 0, 123, 32, 16, 0, 251, 34, 16, 0, 123, 37, 16, 0, 251, 39, 16, 0, 123, 42, 16, 0, 251, 44, 16, 0, 123, 47, 16, 0, 251, 49, 16, 0, 123, 52, 16, 0, 251, 54, 16, 0, 123, 57, 16, 0, 251, 59, 16, 0, 123, 62, 16, 0, 251, 64, 16, 0, 123, 67, 16, 0, 251, 69, 16, 0, 123, 72, 16, 0, 251, 74, 16, 0, 123, 77, 16, 0, 251, 79, 16, 0, 123, 82, 16, 0, 251, 84, 16, 0, 123, 87, 16, 0, 251, 89, 16, 0, 123, 92, 16, 0, 251, 94, 16, 0, 123, 97, 16, 0, 251, 99, 16, 0, 123, 102, 16, 0, 251, 104, 16, 0, 123, 107, 16, 0, 251, 109, 16, 0, 123, 112, 16, 0, 251, 114, 16, 0, 123, 117, 16, 0, 251, 119, 16, 0, 123, 122, 16, 0, 251, 124, 16, 0, 123, 127, 16, 0, 251, 129, 16, 0, 123, 132, 16, 0, 251, 134, 16, 0, 123, 137, 16, 0, 251, 139, 16, 0, 123, 142, 16, 0, 251, 144, 16, 0, 123, 147, 16, 0, 251, 149, 16, 0, 123, 152, 16, 0, 251, 154, 16, 0, 123, 157, 16, 0, 251, 159, 16, 0, 123, 162, 16, 0, 251, 164, 16, 0, 123, 167, 16, 0, 251, 169, 16, 0, 123, 172, 16, 0, 251, 174, 16, 0, 123, 177, 16, 0, 251, 179, 16, 0, 123, 182, 16, 0, 251, 184, 16, 0, 123, 187, 16, 0, 251, 189, 16, 0, 123, 192, 16, 0, 251, 194, 16, 0, 123, 197, 16, 0, 251, 199, 16, 0, 123, 202, 16, 0, 251, 204, 16, 0, 123, 207, 16, 0, 251, 209, 16, 0, 123, 212, 16, 0, 251, 214, 16, 0, 123, 217, 16, 0, 251, 219, 16, 0, 123, 222, 16, 0, 251, 224, 16, 0, 123, 227, 16, 0, 251, 229, 16, 0, 123, 232, 16, 0, 251, 234, 16, 0, 123, 237, 16, 0, 251, 239, 16, 0, 123, 242, 16, 0, 251, 244, 16, 0, 123, 247, 16, 0, 251, 249, 16, 0, 123, 252, 16, 0, 251, 254, 16, 0, 123, 1, 17, 0, 251, 3, 17, 0, 123, 6, 17, 0, 251, 8, 17, 0, 123, 11, 17, 0, 251, 13, 17, 0, 123, 16, 17, 0, 251, 18, 17, 0, 123, 21, 17, 0, 251, 23, 17, 0, 123, 26, 17, 0, 251, 28, 17, 0, 123, 31, 17, 0, 251, 33, 17, 0, 123, 36, 17, 0, 251, 38, 17, 0, 123, 41, 17, 0, 251, 43, 17, 0, 123, 46, 17, 0, 251, 48, 17, 0, 123, 51, 17, 0, 251, 53, 17, 0, 123, 56, 17, 0, 251, 58, 17, 0, 123, 61, 17, 0, 251, 63, 17, 0, 123, 66, 17, 0, 251, 68, 17, 0, 123, 71, 17, 0, 251, 73, 17, 0, 123, 76, 17, 0, 251, 78, 17, 0, 123, 81, 17, 0, 251, 83, 17, 0, 123, 86, 17, 0, 251, 88, 17, 0, 123, 91, 17, 0, 251, 93, 17, 0, 123, 96, 17, 0, 251, 98, 17, 0, 123, 101, 17, 0, 251, 103, 17, 0, 123, 106, 17, 0, 251, 108, 17, 0, 123, 111, 17, 0, 251, 113, 17, 0, 123, 116, 17, 0, 251, 118, 17, 0, 123, 121, 17, 0, 251, 123, 17, 0, 123, 126, 17, 0, 251, 128, 17, 0, 123, 131, 17, 0, 251, 133, 17, 0, 123, 136, 17, 0, 251, 138, 17, 0, 123, 141, 17, 0, 251, 143, 17, 0, 123, 146, 17, 0, 251, 148, 17, 0, 123, 151, 17, 0, 251, 153, 17, 0, 123, 156, 17, 0, 251, 158, 17, 0, 123, 161, 17, 0, 251, 163, 17, 0, 123, 166, 17, 0, 251, 168, 17, 0, 123, 171, 17, 0, 251, 173, 17, 0, 123, 176, 17, 0, 251, 178, 17, 0, 123, 181, 17, 0, 251, 183, 17, 0, 123, 186, 17, 0, 251, 188, 17, 0, 123, 191, 17, 0, 251, 193, 17, 0, 123, 196, 17, 0, 251, 198, 17, 0, 123, 201, 17, 0, 251, 203, 17, 0, 123, 206, 17, 0, 251, 208, 17, 0, 123, 211, 17, 0, 251, 213, 17, 0, 123, 216, 17, 0, 251, 218, 17, 0, 123, 221, 17, 0, 251, 223, 17, 0, 123, 226, 17, 0, 251, 228, 17, 0, 123, 231, 17, 0, 251, 233, 17, 0, 123, 236, 17, 0, 251, 238, 17, 0, 123, 241, 17, 0, 251, 243, 17, 0, 123, 246, 17, 0, 251, 248, 17, 0, 123, 251, 17, 0, 251, 253, 17, 0, 123, 0, 18, 0, 251, 2, 18, 0, 123, 5, 18, 0, 251, 7, 18, 0, 123, 10, 18, 0, 251, 12, 18, 0, 123, 15, 18, 0, 251, 17, 18, 0, 123, 20, 18, 0, 251, 22, 18, 0, 123, 25, 18, 0, 251, 27, 18, 0, 123, 30, 18, 0, 251, 32, 18, 0, 123, 35, 18, 0, 251, 37, 18, 0, 123, 40, 18, 0, 251, 42, 18, 0, 123, 45, 18, 0, 251, 47, 18, 0, 123, 50, 18, 0, 251, 52, 18, 0, 123, 55, 18, 0, 251, 57, 18, 0, 123, 60, 18, 0, 251, 62, 18, 0, 123, 65, 18, 0, 251, 67, 18, 0, 123, 70, 18, 0, 251, 72, 18, 0, 123, 75, 18, 0, 251, 77, 18, 0, 123, 80, 18, 0, 251, 82, 18, 0, 123, 85, 18, 0, 251, 87, 18, 0, 123, 90, 18, 0, 251, 92, 18, 0, 123, 95, 18, 0, 251, 97, 18, 0, 123, 100, 18, 0, 251, 102, 18, 0, 123, 105, 18, 0, 251, 107, 18, 0, 123, 110, 18, 0, 251, 112, 18, 0, 123, 115, 18, 0, 251, 117, 18, 0, 123, 120, 18, 0, 251, 122, 18, 0, 123, 125, 18, 0, 251, 127, 18, 0, 123, 130, 18, 0, 251, 132, 18, 0, 123, 135, 18, 0, 251, 137, 18, 0, 123, 140, 18, 0, 251, 142, 18, 0, 123, 145, 18, 0, 251, 147, 18, 0, 123, 150, 18, 0, 251, 152, 18, 0, 123, 155, 18, 0, 251, 157, 18, 0, 123, 160, 18, 0, 251, 162, 18, 0, 123, 165, 18, 0, 251, 167, 18, 0, 123, 170, 18, 0, 251, 172, 18, 0, 123, 175, 18, 0, 251, 177, 18, 0, 123, 180, 18, 0, 251, 182, 18, 0, 123, 185, 18, 0, 251, 187, 18, 0, 123, 190, 18, 0, 251, 192, 18, 0, 123, 195, 18, 0, 251, 197, 18, 0, 123, 200, 18, 0, 251, 202, 18, 0, 123, 205, 18, 0, 251, 207, 18, 0, 123, 210, 18, 0, 251, 212, 18, 0, 123, 215, 18, 0, 251, 217, 18, 0, 123, 220, 18, 0, 251, 222, 18, 0, 123, 225, 18, 0, 251, 227, 18, 0, 123, 230, 18, 0, 251, 232, 18, 0, 123, 235, 18, 0, 251, 237, 18, 0, 123, 240, 18, 0, 251, 242, 18, 0, 123, 245, 18, 0, 251, 247, 18, 0, 123, 250, 18, 0, 251, 252, 18, 0, 123, 255, 18, 0, 251, 1, 19, 0, 123, 4, 19, 0, 251, 6, 19, 0, 123, 9, 19, 0, 251, 11, 19, 0, 123, 14, 19, 0, 251, 16, 19, 0, 123, 19, 19, 0, 251, 21, 19, 0, 123, 24, 19, 0, 251, 26, 19, 0, 123, 29, 19, 0, 251, 31, 19, 0, 123, 34, 19, 0, 251, 36, 19, 0, 123, 39, 19, 0, 251, 41, 19, 0, 123, 44, 19, 0, 251, 46, 19, 0, 123, 49, 19, 0, 251, 51, 19, 0, 123, 54, 19, 0, 251, 56, 19, 0, 123, 59, 19, 0, 251, 61, 19, 0, 123, 64, 19, 0, 251, 66, 19, 0, 123, 69, 19, 0, 251, 71, 19, 0, 123, 74, 19, 0, 251, 76, 19, 0, 123, 79, 19, 0, 251, 81, 19, 0, 123, 84, 19, 0, 251, 86, 19, 0, 123, 89, 19, 0, 251, 91, 19, 0, 123, 94, 19, 0, 251, 96, 19, 0, 123, 99, 19, 0, 251, 101, 19, 0, 123, 104, 19, 0, 251, 106, 19, 0, 123, 109, 19, 0, 251, 111, 19, 0, 123, 114, 19, 0, 251, 116, 19, 0, 123, 119, 19, 0, 251, 121, 19, 0, 123, 124, 19, 0, 251, 126, 19, 0, 123, 129, 19, 0, 251, 131, 19, 0, 123, 134, 19, 0, 251, 136, 19, 0, 123, 139, 19, 0, 251, 141, 19, 0, 123, 144, 19, 0, 251, 146, 19, 0, 123, 149, 19, 0, 251, 151, 19, 0, 123, 154, 19, 0, 251, 156, 19, 0, 123, 159, 19, 0, 251, 161, 19, 0, 123, 164, 19, 0, 251, 166, 19, 0, 123, 169, 19, 0, 251, 171, 19, 0, 123, 174, 19, 0, 251, 176, 19, 0, 123, 179, 19, 0, 251, 181, 19, 0, 123, 184, 19, 0, 251, 186, 19, 0, 123, 189, 19, 0, 251, 191, 19, 0, 123, 194, 19, 0, 251, 196, 19, 0, 123, 199, 19, 0, 251, 201, 19, 0, 123, 204, 19, 0, 251, 206, 19, 0, 123, 209, 19, 0, 251, 211, 19, 0, 123, 214, 19, 0, 251, 216, 19, 0, 123, 219, 19, 0, 251, 221, 19, 0, 123, 224, 19, 0, 251, 226, 19, 0, 123, 229, 19, 0, 251, 231, 19, 0, 123, 234, 19, 0, 251, 236, 19, 0, 123, 239, 19, 0, 251, 241, 19, 0, 123, 244, 19, 0, 251, 246, 19, 0, 123, 249, 19, 0, 251, 251, 19, 0, 123, 254, 19, 0, 251, 0, 20, 0, 123, 3, 20, 0, 251, 5, 20, 0, 123, 8, 20, 0, 251, 10, 20, 0, 123, 13, 20, 0, 251, 15, 20, 0, 123, 18, 20, 0, 251, 20, 20, 0, 123, 23, 20, 0, 251, 25, 20, 0, 123, 28, 20, 0, 251, 30, 20, 0, 123, 33, 20, 0, 251, 35, 20, 0, 123, 38, 20, 0, 251, 40, 20, 0, 123, 43, 20, 0, 251, 45, 20, 0, 123, 48, 20, 0, 251, 50, 20, 0, 123, 53, 20, 0, 251, 55, 20, 0, 123, 58, 20, 0, 251, 60, 20, 0, 123, 63, 20, 0, 251, 65, 20, 0, 123, 68, 20, 0, 251, 70, 20, 0, 123, 73, 20, 0, 251, 75, 20, 0, 123, 78, 20, 0, 251, 80, 20, 0, 123, 83, 20, 0, 251, 85, 20, 0, 123, 88, 20, 0, 251, 90, 20, 0, 123, 93, 20, 0, 251, 95, 20, 0, 123, 98, 20, 0, 251, 100, 20, 0, 123, 103, 20, 0, 251, 105, 20, 0, 123, 108, 20, 0, 251, 110, 20, 0, 123, 113, 20, 0, 251, 115, 20, 0, 123, 118, 20, 0, 251, 120, 20, 0, 123, 123, 20, 0, 251, 125, 20, 0, 123, 128, 20, 0, 251, 130, 20, 0, 123, 133, 20, 0, 251, 135, 20, 0, 123, 138, 20, 0, 251, 140, 20, 0, 123, 143, 20, 0, 251, 145, 20, 0, 123, 148, 20, 0, 251, 150, 20, 0, 123, 153, 20, 0, 251, 155, 20, 0, 123, 158, 20, 0, 251, 160, 20, 0, 123, 163, 20, 0, 251, 165, 20, 0, 123, 168, 20, 0, 251, 170, 20, 0, 123, 173, 20, 0, 251, 175, 20, 0, 123, 178, 20, 0, 251, 180, 20, 0, 123, 183, 20, 0, 251, 185, 20, 0, 123, 188, 20, 0, 251, 190, 20, 0, 123, 193, 20, 0, 251, 195, 20, 0, 123, 198, 20, 0, 251, 200, 20, 0, 123, 203, 20, 0, 251, 205, 20, 0, 123, 208, 20, 0, 251, 210, 20, 0, 123, 213, 20, 0, 251, 215, 20, 0, 123, 218, 20, 0, 251, 220, 20, 0, 123, 223, 20, 0, 251, 225, 20, 0, 123, 228, 20, 0, 251, 230, 20, 0, 123, 233, 20, 0, 251, 235, 20, 0, 123, 238, 20, 0, 251, 240, 20, 0, 123, 243, 20, 0, 251, 245, 20, 0, 123, 248, 20, 0, 251, 250, 20, 0, 123, 253, 20, 0, 251, 255, 20, 0, 123, 2, 21, 0, 251, 4, 21, 0, 123, 7, 21, 0, 251, 9, 21, 0, 123, 12, 21, 0, 251, 14, 21, 0, 123, 17, 21, 0, 251, 19, 21, 0, 123, 22, 21, 0, 251, 24, 21, 0, 123, 27, 21, 0, 251, 29, 21, 0, 123, 32, 21, 0, 251, 34, 21, 0, 123, 37, 21, 0, 251, 39, 21, 0, 123, 42, 21, 0, 251, 44, 21, 0, 123, 47, 21, 0, 251, 49, 21, 0, 123, 52, 21, 0, 251, 54, 21, 0, 123, 57, 21, 0, 251, 59, 21, 0, 123, 62, 21, 0, 251, 64, 21, 0, 123, 67, 21, 0, 251, 69, 21, 0, 123, 72, 21, 0, 251, 74, 21, 0, 123, 77, 21, 0, 251, 79, 21, 0, 123, 82, 21, 0, 251, 84, 21, 0, 123, 87, 21, 0, 251, 89, 21, 0, 123, 92, 21, 0, 251, 94, 21, 0, 123, 97, 21, 0, 251, 99, 21, 0, 123, 102, 21, 0, 251, 104, 21, 0, 123, 107, 21, 0, 251, 109, 21, 0, 123, 112, 21, 0, 251, 114, 21, 0, 123, 117, 21, 0, 251, 119, 21, 0, 123, 122, 21, 0, 251, 124, 21, 0, 123, 127, 21, 0, 251, 129, 21, 0, 123, 132, 21, 0, 251, 134, 21, 0, 123, 137, 21, 0, 251, 139, 21, 0, 123, 142, 21, 0, 251, 144, 21, 0, 123, 147, 21, 0, 251, 149, 21, 0, 123, 152, 21, 0, 251, 154, 21, 0, 123, 157, 21, 0, 251, 159, 21, 0, 123, 162, 21, 0, 251, 164, 21, 0, 123, 167, 21, 0, 251, 169, 21, 0, 123, 172, 21, 0, 251, 174, 21, 0, 123, 177, 21, 0, 251, 179, 21, 0, 123, 182, 21, 0, 251, 184, 21, 0, 123, 187, 21, 0, 251, 189, 21, 0, 123, 192, 21, 0, 251, 194, 21, 0, 123, 197, 21, 0, 251, 199, 21, 0, 123, 202, 21, 0, 251, 204, 21, 0, 123, 207, 21, 0, 251, 209, 21, 0, 123, 212, 21, 0, 251, 214, 21, 0, 123, 217, 21, 0, 251, 219, 21, 0, 123, 222, 21, 0, 251, 224, 21, 0, 123, 227, 21, 0, 251, 229, 21, 0, 123, 232, 21, 0, 251, 234, 21, 0, 123, 237, 21, 0, 251, 239, 21, 0, 123, 242, 21, 0, 251, 244, 21, 0, 123, 247, 21, 0, 251, 249, 21, 0, 123, 252, 21, 0, 251, 254, 21, 0, 123, 1, 22, 0, 251, 3, 22, 0, 123, 6, 22, 0, 251, 8, 22, 0, 123, 11, 22, 0, 251, 13, 22, 0, 123, 16, 22, 0, 251, 18, 22, 0, 123, 21, 22, 0, 251, 23, 22, 0, 123, 26, 22, 0, 251, 28, 22, 0, 123, 31, 22, 0, 251, 33, 22, 0, 123, 36, 22, 0, 251, 38, 22, 0, 123, 41, 22, 0, 251, 43, 22, 0, 123, 46, 22, 0, 251, 48, 22, 0, 123, 51, 22, 0, 251, 53, 22, 0, 123, 56, 22, 0, 251, 58, 22, 0, 123, 61, 22, 0, 251, 63, 22, 0, 123, 66, 22, 0, 251, 68, 22, 0, 123, 71, 22, 0, 251, 73, 22, 0, 123, 76, 22, 0, 251, 78, 22, 0, 123, 81, 22, 0, 251, 83, 22, 0, 123, 86, 22, 0, 251, 88, 22, 0, 123, 91, 22, 0, 251, 93, 22, 0, 123, 96, 22, 0, 251, 98, 22, 0, 123, 101, 22, 0, 251, 103, 22, 0, 123, 106, 22, 0, 251, 108, 22, 0, 123, 111, 22, 0, 251, 113, 22, 0, 123, 116, 22, 0, 251, 118, 22, 0, 123, 121, 22, 0, 251, 123, 22, 0, 123, 126, 22, 0, 251, 128, 22, 0, 123, 131, 22, 0, 251, 133, 22, 0, 123, 136, 22, 0, 251, 138, 22, 0, 123, 141, 22, 0, 251, 143, 22, 0, 123, 146, 22, 0, 251, 148, 22, 0, 123, 151, 22, 0, 251, 153, 22, 0, 123, 156, 22, 0, 251, 158, 22, 0, 123, 161, 22, 0, 251, 163, 22, 0, 123, 166, 22, 0, 251, 168, 22, 0, 123, 171, 22, 0, 251, 173, 22, 0, 123, 176, 22, 0, 251, 178, 22, 0, 123, 181, 22, 0, 251, 183, 22, 0, 123, 186, 22, 0, 251, 188, 22, 0, 123, 191, 22, 0, 251, 193, 22, 0, 123, 196, 22, 0, 251, 198, 22, 0, 123, 201, 22, 0, 251, 203, 22, 0, 123, 206, 22, 0, 251, 208, 22, 0, 123, 211, 22, 0, 251, 213, 22, 0, 123, 216, 22, 0, 251, 218, 22, 0, 123, 221, 22, 0, 251, 223, 22, 0, 123, 226, 22, 0, 251, 228, 22, 0, 123, 231, 22, 0, 251, 233, 22, 0, 123, 236, 22, 0, 251, 238, 22, 0, 123, 241, 22, 0, 251, 243, 22, 0, 123, 246, 22, 0, 251, 248, 22, 0, 123, 251, 22, 0, 251, 253, 22, 0, 123, 0, 23, 0, 251, 2, 23, 0, 123, 5, 23, 0, 251, 7, 23, 0, 123, 10, 23, 0, 251, 12, 23, 0, 123, 15, 23, 0, 251, 17, 23, 0, 123, 20, 23, 0, 251, 22, 23, 0, 123, 25, 23, 0, 251, 27, 23, 0, 123, 30, 23, 0, 251, 32, 23, 0, 123, 35, 23, 0, 251, 37, 23, 0, 123, 40, 23, 0, 251, 42, 23, 0, 123, 45, 23, 0, 251, 47, 23, 0, 123, 50, 23, 0, 251, 52, 23, 0, 123, 55, 23, 0, 251, 57, 23, 0, 123, 60, 23, 0, 251, 62, 23, 0, 123, 65, 23, 0, 251, 67, 23, 0, 123, 70, 23, 0, 251, 72, 23, 0, 123, 75, 23, 0, 251, 77, 23, 0, 123, 80, 23, 0, 251, 82, 23, 0, 123, 85, 23, 0, 251, 87, 23, 0, 123, 90, 23, 0, 251, 92, 23, 0, 123, 95, 23, 0, 251, 97, 23, 0, 123, 100, 23, 0, 251, 102, 23, 0, 123, 105, 23, 0, 251, 107, 23, 0, 123, 110, 23, 0, 251, 112, 23, 0, 123, 115, 23, 0, 251, 117, 23, 0, 123, 120, 23, 0, 251, 122, 23, 0, 123, 125, 23, 0, 251, 127, 23, 0, 123, 130, 23, 0, 251, 132, 23, 0, 123, 135, 23, 0, 251, 137, 23, 0, 123, 140, 23, 0, 251, 142, 23, 0, 123, 145, 23, 0, 251, 147, 23, 0, 123, 150, 23, 0, 251, 152, 23, 0, 123, 155, 23, 0, 251, 157, 23, 0, 123, 160, 23, 0, 251, 162, 23, 0, 123, 165, 23, 0, 251, 167, 23, 0, 123, 170, 23, 0, 251, 172, 23, 0, 123, 175, 23, 0, 251, 177, 23, 0, 123, 180, 23, 0, 251, 182, 23, 0, 123, 185, 23, 0, 251, 187, 23, 0, 123, 190, 23, 0, 251, 192, 23, 0, 123, 195, 23, 0, 251, 197, 23, 0, 123, 200, 23, 0, 251, 202, 23, 0, 123, 205, 23, 0, 251, 207, 23, 0, 123, 210, 23, 0, 251, 212, 23, 0, 123, 215, 23, 0, 251, 217, 23, 0, 123, 220, 23, 0, 251, 222, 23, 0, 123, 225, 23, 0, 251, 227, 23, 0, 123, 230, 23, 0, 251, 232, 23, 0, 123, 235, 23, 0, 251, 237, 23, 0, 123, 240, 23, 0, 251, 242, 23, 0, 123, 245, 23, 0, 251, 247, 23, 0, 123, 250, 23, 0, 251, 252, 23, 0, 123, 255, 23, 0, 251, 1, 24, 0, 123, 4, 24, 0, 251, 6, 24, 0, 123, 9, 24, 0, 251, 11, 24, 0, 123, 14, 24, 0, 251, 16, 24, 0, 123, 19, 24, 0, 251, 21, 24, 0, 123, 24, 24, 0, 251, 26, 24, 0, 123, 29, 24, 0, 251, 31, 24, 0, 123, 34, 24, 0, 251, 36, 24, 0, 123, 39, 24, 0, 251, 41, 24, 0, 123, 44, 24, 0, 251, 46, 24, 0, 123, 49, 24, 0, 251, 51, 24, 0, 123, 54, 24, 0, 251, 56, 24, 0, 123, 59, 24, 0, 251, 61, 24, 0, 123, 64, 24, 0, 251, 66, 24, 0, 123, 69, 24, 0, 251, 71, 24, 0, 123, 74, 24, 0, 251, 76, 24, 0, 123, 79, 24, 0, 251, 81, 24, 0, 123, 84, 24, 0, 251, 86, 24, 0, 123, 89, 24, 0, 251, 91, 24, 0, 123, 94, 24, 0, 251, 96, 24, 0, 123, 99, 24, 0, 251, 101, 24, 0, 123, 104, 24, 0, 1], [], [], [], [56, 2, 0, 0, 184, 4, 0, 0, 56, 7, 0, 0, 184, 9, 0, 0, 56, 12, 0, 0, 184, 14, 0, 0, 56, 17, 0, 0, 184, 19, 0, 0, 56, 22, 0, 0, 184, 24, 0, 0, 56, 27, 0, 0, 184, 29, 0, 0, 56, 32, 0, 0, 184, 34, 0, 0, 56, 37, 0, 0, 184, 39, 0, 0, 56, 42, 0, 0, 184, 44, 0, 0, 56, 47, 0, 0, 184, 49, 0, 0, 56, 52, 0, 0, 184, 54, 0, 0, 56, 57, 0, 0, 184, 59, 0, 0, 56, 62, 0, 0, 184, 64, 0, 0, 56, 67, 0, 0, 184, 69, 0, 0, 56, 72, 0, 0, 184, 74, 0, 0, 56, 77, 0, 0, 184, 79, 0, 0, 56, 82, 0, 0, 184, 84, 0, 0, 56, 87, 0, 0, 184, 89, 0, 0, 56, 92, 0, 0, 184, 94, 0, 0, 56, 97, 0, 0, 184, 99, 0, 0, 56, 102, 0, 0, 184, 104, 0, 0, 56, 107, 0, 0, 184, 109, 0, 0, 56, 112, 0, 0, 184, 114, 0, 0, 56, 117, 0, 0, 184, 119, 0, 0, 56, 122, 0, 0, 184, 124, 0, 0, 56, 127, 0, 0, 184, 129, 0, 0, 56, 132, 0, 0, 184, 134, 0, 0, 56, 137, 0, 0, 184, 139, 0, 0, 56, 142, 0, 0, 184, 144, 0, 0, 56, 147, 0, 0, 184, 149, 0, 0, 56, 152, 0, 0, 184, 154, 0, 0, 56, 157, 0, 0, 184, 159, 0, 0, 56, 162, 0, 0, 184, 164, 0, 0, 56, 167, 0, 0, 184, 169, 0, 0, 56, 172, 0, 0, 184, 174, 0, 0, 56, 177, 0, 0, 184, 179, 0, 0, 56, 182, 0, 0, 184, 184, 0, 0, 56, 187, 0, 0, 184, 189, 0, 0, 56, 192, 0, 0, 184, 194, 0, 0, 56, 197, 0, 0, 184, 199, 0, 0, 56, 202, 0, 0, 184, 204, 0, 0, 56, 207, 0, 0, 184, 209, 0, 0, 56, 212, 0, 0, 184, 214, 0, 0, 56, 217, 0, 0, 184, 219, 0, 0, 56, 222, 0, 0, 184, 224, 0, 0, 56, 227, 0, 0, 184, 229, 0, 0, 56, 232, 0, 0, 184, 234, 0, 0, 56, 237, 0, 0, 184, 239, 0, 0, 56, 242, 0, 0, 184, 244, 0, 0, 56, 247, 0, 0, 184, 249, 0, 0, 56, 252, 0, 0, 184, 254, 0, 0, 56, 1, 1, 0, 184, 3, 1, 0, 56, 6, 1, 0, 184, 8, 1, 0, 56, 11, 1, 0, 184, 13, 1, 0, 56, 16, 1, 0, 184, 18, 1, 0, 56, 21, 1, 0, 184, 23, 1, 0, 56, 26, 1, 0, 184, 28, 1, 0, 56, 31, 1, 0, 184, 33, 1, 0, 56, 36, 1, 0, 184, 38, 1, 0, 56, 41, 1, 0, 184, 43, 1, 0, 56, 46, 1, 0, 184, 48, 1, 0, 56, 51, 1, 0, 184, 53, 1, 0, 56, 56, 1, 0, 184, 58, 1, 0, 56, 61, 1, 0, 184, 63, 1, 0, 56, 66, 1, 0, 184, 68, 1, 0, 56, 71, 1, 0, 184, 73, 1, 0, 56, 76, 1, 0, 184, 78, 1, 0, 56, 81, 1, 0, 184, 83, 1, 0, 56, 86, 1, 0, 184, 88, 1, 0, 56, 91, 1, 0, 184, 93, 1, 0, 56, 96, 1, 0, 184, 98, 1, 0, 56, 101, 1, 0, 184, 103, 1, 0, 56, 106, 1, 0, 184, 108, 1, 0, 56, 111, 1, 0, 184, 113, 1, 0, 56, 116, 1, 0, 184, 118, 1, 0, 56, 121, 1, 0, 184, 123, 1, 0, 56, 126, 1, 0, 184, 128, 1, 0, 56, 131, 1, 0, 184, 133, 1, 0, 56, 136, 1, 0, 184, 138, 1, 0, 56, 141, 1, 0, 184, 143, 1, 0, 56, 146, 1, 0, 184, 148, 1, 0, 56, 151, 1, 0, 184, 153, 1, 0, 56, 156, 1, 0, 184, 158, 1, 0, 56, 161, 1, 0, 184, 163, 1, 0, 56, 166, 1, 0, 184, 168, 1, 0, 56, 171, 1, 0, 184, 173, 1, 0, 56, 176, 1, 0, 184, 178, 1, 0, 56, 181, 1, 0, 184, 183, 1, 0, 56, 186, 1, 0, 184, 188, 1, 0, 56, 191, 1, 0, 184, 193, 1, 0, 56, 196, 1, 0, 184, 198, 1, 0, 56, 201, 1, 0, 184, 203, 1, 0, 56, 206, 1, 0, 184, 208, 1, 0, 56, 211, 1, 0, 184, 213, 1, 0, 56, 216, 1, 0, 184, 218, 1, 0, 56, 221, 1, 0, 184, 223, 1, 0, 56, 226, 1, 0, 184, 228, 1, 0, 56, 231, 1, 0, 184, 233, 1, 0, 56, 236, 1, 0, 184, 238, 1, 0, 56, 241, 1, 0, 184, 243, 1, 0, 56, 246, 1, 0, 184, 248, 1, 0, 56, 251, 1, 0, 184, 253, 1, 0, 56, 0, 2, 0, 184, 2, 2, 0, 56, 5, 2, 0, 184, 7, 2, 0, 56, 10, 2, 0, 184, 12, 2, 0, 56, 15, 2, 0, 184, 17, 2, 0, 56, 20, 2, 0, 184, 22, 2, 0, 56, 25, 2, 0, 184, 27, 2, 0, 56, 30, 2, 0, 184, 32, 2, 0, 56, 35, 2, 0, 184, 37, 2, 0, 56, 40, 2, 0, 184, 42, 2, 0, 56, 45, 2, 0, 184, 47, 2, 0, 56, 50, 2, 0, 184, 52, 2, 0, 56, 55, 2, 0, 184, 57, 2, 0, 56, 60, 2, 0, 184, 62, 2, 0, 56, 65, 2, 0, 184, 67, 2, 0, 56, 70, 2, 0, 184, 72, 2, 0, 56, 75, 2, 0, 184, 77, 2, 0, 56, 80, 2, 0, 184, 82, 2, 0, 56, 85, 2, 0, 184, 87, 2, 0, 56, 90, 2, 0, 184, 92, 2, 0, 56, 95, 2, 0, 184, 97, 2, 0, 56, 100, 2, 0, 184, 102, 2, 0, 56, 105, 2, 0, 184, 107, 2, 0, 56, 110, 2, 0, 184, 112, 2, 0, 56, 115, 2, 0, 184, 117, 2, 0, 56, 120, 2, 0, 184, 122, 2, 0, 56, 125, 2, 0, 184, 127, 2, 0, 56, 130, 2, 0, 184, 132, 2, 0, 56, 135, 2, 0, 184, 137, 2, 0, 56, 140, 2, 0, 184, 142, 2, 0, 56, 145, 2, 0, 184, 147, 2, 0, 56, 150, 2, 0, 184, 152, 2, 0, 56, 155, 2, 0, 184, 157, 2, 0, 56, 160, 2, 0, 184, 162, 2, 0, 56, 165, 2, 0, 184, 167, 2, 0, 56, 170, 2, 0, 184, 172, 2, 0, 56, 175, 2, 0, 184, 177, 2, 0, 56, 180, 2, 0, 184, 182, 2, 0, 56, 185, 2, 0, 184, 187, 2, 0, 56, 190, 2, 0, 184, 192, 2, 0, 56, 195, 2, 0, 184, 197, 2, 0, 56, 200, 2, 0, 184, 202, 2, 0, 56, 205, 2, 0, 184, 207, 2, 0, 56, 210, 2, 0, 184, 212, 2, 0, 56, 215, 2, 0, 184, 217, 2, 0, 56, 220, 2, 0, 184, 222, 2, 0, 56, 225, 2, 0, 184, 227, 2, 0, 56, 230, 2, 0, 184, 232, 2, 0, 56, 235, 2, 0, 184, 237, 2, 0, 56, 240, 2, 0, 184, 242, 2, 0, 56, 245, 2, 0, 184, 247, 2, 0, 56, 250, 2, 0, 184, 252, 2, 0, 56, 255, 2, 0, 184, 1, 3, 0, 56, 4, 3, 0, 184, 6, 3, 0, 56, 9, 3, 0, 184, 11, 3, 0, 56, 14, 3, 0, 184, 16, 3, 0, 56, 19, 3, 0, 184, 21, 3, 0, 56, 24, 3, 0, 184, 26, 3, 0, 56, 29, 3, 0, 184, 31, 3, 0, 56, 34, 3, 0, 184, 36, 3, 0, 56, 39, 3, 0, 184, 41, 3, 0, 56, 44, 3, 0, 184, 46, 3, 0, 56, 49, 3, 0, 184, 51, 3, 0, 56, 54, 3, 0, 184, 56, 3, 0, 56, 59, 3, 0, 184, 61, 3, 0, 56, 64, 3, 0, 184, 66, 3, 0, 56, 69, 3, 0, 184, 71, 3, 0, 56, 74, 3, 0, 184, 76, 3, 0, 56, 79, 3, 0, 184, 81, 3, 0, 56, 84, 3, 0, 184, 86, 3, 0, 56, 89, 3, 0, 184, 91, 3, 0, 56, 94, 3, 0, 184, 96, 3, 0, 56, 99, 3, 0, 184, 101, 3, 0, 56, 104, 3, 0, 184, 106, 3, 0, 56, 109, 3, 0, 184, 111, 3, 0, 56, 114, 3, 0, 184, 116, 3, 0, 56, 119, 3, 0, 184, 121, 3, 0, 56, 124, 3, 0, 184, 126, 3, 0, 56, 129, 3, 0, 184, 131, 3, 0, 56, 134, 3, 0, 184, 136, 3, 0, 56, 139, 3, 0, 184, 141, 3, 0, 56, 144, 3, 0, 184, 146, 3, 0, 56, 149, 3, 0, 184, 151, 3, 0, 56, 154, 3, 0, 184, 156, 3, 0, 56, 159, 3, 0, 184, 161, 3, 0, 56, 164, 3, 0, 184, 166, 3, 0, 56, 169, 3, 0, 184, 171, 3, 0, 56, 174, 3, 0, 184, 176, 3, 0, 56, 179, 3, 0, 184, 181, 3, 0, 56, 184, 3, 0, 184, 186, 3, 0, 56, 189, 3, 0, 184, 191, 3, 0, 56, 194, 3, 0, 184, 196, 3, 0, 56, 199, 3, 0, 184, 201, 3, 0, 56, 204, 3, 0, 184, 206, 3, 0, 56, 209, 3, 0, 184, 211, 3, 0, 56, 214, 3, 0, 184, 216, 3, 0, 56, 219, 3, 0, 184, 221, 3, 0, 56, 224, 3, 0, 184, 226, 3, 0, 56, 229, 3, 0, 184, 231, 3, 0, 56, 234, 3, 0, 184, 236, 3, 0, 56, 239, 3, 0, 184, 241, 3, 0, 56, 244, 3, 0, 184, 246, 3, 0, 56, 249, 3, 0, 184, 251, 3, 0, 56, 254, 3, 0, 184, 0, 4, 0, 56, 3, 4, 0, 184, 5, 4, 0, 56, 8, 4, 0, 184, 10, 4, 0, 56, 13, 4, 0, 184, 15, 4, 0, 56, 18, 4, 0, 184, 20, 4, 0, 56, 23, 4, 0, 184, 25, 4, 0, 56, 28, 4, 0, 184, 30, 4, 0, 56, 33, 4, 0, 184, 35, 4, 0, 56, 38, 4, 0, 184, 40, 4, 0, 56, 43, 4, 0, 184, 45, 4, 0, 56, 48, 4, 0, 184, 50, 4, 0, 56, 53, 4, 0, 184, 55, 4, 0, 56, 58, 4, 0, 184, 60, 4, 0, 56, 63, 4, 0, 184, 65, 4, 0, 56, 68, 4, 0, 184, 70, 4, 0, 56, 73, 4, 0, 184, 75, 4, 0, 56, 78, 4, 0, 184, 80, 4, 0, 56, 83, 4, 0, 184, 85, 4, 0, 56, 88, 4, 0, 184, 90, 4, 0, 56, 93, 4, 0, 184, 95, 4, 0, 56, 98, 4, 0, 184, 100, 4, 0, 56, 103, 4, 0, 184, 105, 4, 0, 56, 108, 4, 0, 184, 110, 4, 0, 56, 113, 4, 0, 184, 115, 4, 0, 56, 118, 4, 0, 184, 120, 4, 0, 56, 123, 4, 0, 184, 125, 4, 0, 56, 128, 4, 0, 184, 130, 4, 0, 56, 133, 4, 0, 184, 135, 4, 0, 56, 138, 4, 0, 184, 140, 4, 0, 56, 143, 4, 0, 184, 145, 4, 0, 56, 148, 4, 0, 184, 150, 4, 0, 56, 153, 4, 0, 184, 155, 4, 0, 56, 158, 4, 0, 184, 160, 4, 0, 56, 163, 4, 0, 184, 165, 4, 0, 56, 168, 4, 0, 184, 170, 4, 0, 56, 173, 4, 0, 184, 175, 4, 0, 56, 178, 4, 0, 184, 180, 4, 0, 56, 183, 4, 0, 184, 185, 4, 0, 56, 188, 4, 0, 184, 190, 4, 0, 56, 193, 4, 0, 184, 195, 4, 0, 56, 198, 4, 0, 184, 200, 4, 0, 56, 203, 4, 0, 184, 205, 4, 0, 56, 208, 4, 0, 184, 210, 4, 0, 56, 213, 4, 0, 184, 215, 4, 0, 56, 218, 4, 0, 184, 220, 4, 0, 56, 223, 4, 0, 184, 225, 4, 0, 56, 228, 4, 0, 184, 230, 4, 0, 56, 233, 4, 0, 184, 235, 4, 0, 56, 238, 4, 0, 184, 240, 4, 0, 56, 243, 4, 0, 184, 245, 4, 0, 56, 248, 4, 0, 184, 250, 4, 0, 56, 253, 4, 0, 184, 255, 4, 0, 56, 2, 5, 0, 184, 4, 5, 0, 56, 7, 5, 0, 184, 9, 5, 0, 56, 12, 5, 0, 184, 14, 5, 0, 56, 17, 5, 0, 184, 19, 5, 0, 56, 22, 5, 0, 184, 24, 5, 0, 56, 27, 5, 0, 184, 29, 5, 0, 56, 32, 5, 0, 184, 34, 5, 0, 56, 37, 5, 0, 184, 39, 5, 0, 56, 42, 5, 0, 184, 44, 5, 0, 56, 47, 5, 0, 184, 49, 5, 0, 56, 52, 5, 0, 184, 54, 5, 0, 56, 57, 5, 0, 184, 59, 5, 0, 56, 62, 5, 0, 184, 64, 5, 0, 56, 67, 5, 0, 184, 69, 5, 0, 56, 72, 5, 0, 184, 74, 5, 0, 56, 77, 5, 0, 184, 79, 5, 0, 56, 82, 5, 0, 184, 84, 5, 0, 56, 87, 5, 0, 184, 89, 5, 0, 56, 92, 5, 0, 184, 94, 5, 0, 56, 97, 5, 0, 184, 99, 5, 0, 56, 102, 5, 0, 184, 104, 5, 0, 56, 107, 5, 0, 184, 109, 5, 0, 56, 112, 5, 0, 184, 114, 5, 0, 56, 117, 5, 0, 184, 119, 5, 0, 56, 122, 5, 0, 184, 124, 5, 0, 56, 127, 5, 0, 184, 129, 5, 0, 56, 132, 5, 0, 184, 134, 5, 0, 56, 137, 5, 0, 184, 139, 5, 0, 56, 142, 5, 0, 184, 144, 5, 0, 56, 147, 5, 0, 184, 149, 5, 0, 56, 152, 5, 0, 184, 154, 5, 0, 56, 157, 5, 0, 184, 159, 5, 0, 56, 162, 5, 0, 184, 164, 5, 0, 56, 167, 5, 0, 184, 169, 5, 0, 56, 172, 5, 0, 184, 174, 5, 0, 56, 177, 5, 0, 184, 179, 5, 0, 56, 182, 5, 0, 184, 184, 5, 0, 56, 187, 5, 0, 184, 189, 5, 0, 56, 192, 5, 0, 184, 194, 5, 0, 56, 197, 5, 0, 184, 199, 5, 0, 56, 202, 5, 0, 184, 204, 5, 0, 56, 207, 5, 0, 184, 209, 5, 0, 56, 212, 5, 0, 184, 214, 5, 0, 56, 217, 5, 0, 184, 219, 5, 0, 56, 222, 5, 0, 184, 224, 5, 0, 56, 227, 5, 0, 184, 229, 5, 0, 56, 232, 5, 0, 184, 234, 5, 0, 56, 237, 5, 0, 184, 239, 5, 0, 56, 242, 5, 0, 184, 244, 5, 0, 56, 247, 5, 0, 184, 249, 5, 0, 56, 252, 5, 0, 184, 254, 5, 0, 56, 1, 6, 0, 184, 3, 6, 0, 56, 6, 6, 0, 184, 8, 6, 0, 56, 11, 6, 0, 184, 13, 6, 0, 56, 16, 6, 0, 184, 18, 6, 0, 56, 21, 6, 0, 184, 23, 6, 0, 56, 26, 6, 0, 184, 28, 6, 0, 56, 31, 6, 0, 184, 33, 6, 0, 56, 36, 6, 0, 184, 38, 6, 0, 56, 41, 6, 0, 184, 43, 6, 0, 56, 46, 6, 0, 184, 48, 6, 0, 56, 51, 6, 0, 184, 53, 6, 0, 56, 56, 6, 0, 184, 58, 6, 0, 56, 61, 6, 0, 184, 63, 6, 0, 56, 66, 6, 0, 184, 68, 6, 0, 56, 71, 6, 0, 184, 73, 6, 0, 56, 76, 6, 0, 184, 78, 6, 0, 56, 81, 6, 0, 184, 83, 6, 0, 56, 86, 6, 0, 184, 88, 6, 0, 56, 91, 6, 0, 184, 93, 6, 0, 56, 96, 6, 0, 184, 98, 6, 0, 56, 101, 6, 0, 184, 103, 6, 0, 56, 106, 6, 0, 184, 108, 6, 0, 56, 111, 6, 0, 184, 113, 6, 0, 56, 116, 6, 0, 184, 118, 6, 0, 56, 121, 6, 0, 184, 123, 6, 0, 56, 126, 6, 0, 184, 128, 6, 0, 56, 131, 6, 0, 184, 133, 6, 0, 56, 136, 6, 0, 184, 138, 6, 0, 56, 141, 6, 0, 184, 143, 6, 0, 56, 146, 6, 0, 184, 148, 6, 0, 56, 151, 6, 0, 184, 153, 6, 0, 56, 156, 6, 0, 184, 158, 6, 0, 56, 161, 6, 0, 184, 163, 6, 0, 56, 166, 6, 0, 184, 168, 6, 0, 56, 171, 6, 0, 184, 173, 6, 0, 56, 176, 6, 0, 184, 178, 6, 0, 56, 181, 6, 0, 184, 183, 6, 0, 56, 186, 6, 0, 184, 188, 6, 0, 56, 191, 6, 0, 184, 193, 6, 0, 56, 196, 6, 0, 184, 198, 6, 0, 56, 201, 6, 0, 184, 203, 6, 0, 56, 206, 6, 0, 184, 208, 6, 0, 56, 211, 6, 0, 184, 213, 6, 0, 56, 216, 6, 0, 184, 218, 6, 0, 56, 221, 6, 0, 184, 223, 6, 0, 56, 226, 6, 0, 184, 228, 6, 0, 56, 231, 6, 0, 184, 233, 6, 0, 56, 236, 6, 0, 184, 238, 6, 0, 56, 241, 6, 0, 184, 243, 6, 0, 56, 246, 6, 0, 184, 248, 6, 0, 56, 251, 6, 0, 184, 253, 6, 0, 56, 0, 7, 0, 184, 2, 7, 0, 56, 5, 7, 0, 184, 7, 7, 0, 56, 10, 7, 0, 184, 12, 7, 0, 56, 15, 7, 0, 184, 17, 7, 0, 56, 20, 7, 0, 184, 22, 7, 0, 56, 25, 7, 0, 184, 27, 7, 0, 56, 30, 7, 0, 184, 32, 7, 0, 56, 35, 7, 0, 184, 37, 7, 0, 56, 40, 7, 0, 184, 42, 7, 0, 56, 45, 7, 0, 184, 47, 7, 0, 56, 50, 7, 0, 184, 52, 7, 0, 56, 55, 7, 0, 184, 57, 7, 0, 56, 60, 7, 0, 184, 62, 7, 0, 56, 65, 7, 0, 184, 67, 7, 0, 56, 70, 7, 0, 184, 72, 7, 0, 56, 75, 7, 0, 184, 77, 7, 0, 56, 80, 7, 0, 184, 82, 7, 0, 56, 85, 7, 0, 184, 87, 7, 0, 56, 90, 7, 0, 184, 92, 7, 0, 56, 95, 7, 0, 184, 97, 7, 0, 56, 100, 7, 0, 184, 102, 7, 0, 56, 105, 7, 0, 184, 107, 7, 0, 56, 110, 7, 0, 184, 112, 7, 0, 56, 115, 7, 0, 184, 117, 7, 0, 56, 120, 7, 0, 184, 122, 7, 0, 56, 125, 7, 0, 184, 127, 7, 0, 56, 130, 7, 0, 184, 132, 7, 0, 56, 135, 7, 0, 184, 137, 7, 0, 56, 140, 7, 0, 184, 142, 7, 0, 56, 145, 7, 0, 184, 147, 7, 0, 56, 150, 7, 0, 184, 152, 7, 0, 56, 155, 7, 0, 184, 157, 7, 0, 56, 160, 7, 0, 184, 162, 7, 0, 56, 165, 7, 0, 184, 167, 7, 0, 56, 170, 7, 0, 184, 172, 7, 0, 56, 175, 7, 0, 184, 177, 7, 0, 56, 180, 7, 0, 184, 182, 7, 0, 56, 185, 7, 0, 184, 187, 7, 0, 56, 190, 7, 0, 184, 192, 7, 0, 56, 195, 7, 0, 184, 197, 7, 0, 56, 200, 7, 0, 184, 202, 7, 0, 56, 205, 7, 0, 184, 207, 7, 0, 56, 210, 7, 0, 184, 212, 7, 0, 56, 215, 7, 0, 184, 217, 7, 0, 56, 220, 7, 0, 184, 222, 7, 0, 56, 225, 7, 0, 184, 227, 7, 0, 56, 230, 7, 0, 184, 232, 7, 0, 56, 235, 7, 0, 184, 237, 7, 0, 56, 240, 7, 0, 184, 242, 7, 0, 56, 245, 7, 0, 184, 247, 7, 0, 56, 250, 7, 0, 184, 252, 7, 0, 56, 255, 7, 0, 184, 1, 8, 0, 56, 4, 8, 0, 184, 6, 8, 0, 56, 9, 8, 0, 184, 11, 8, 0, 56, 14, 8, 0, 184, 16, 8, 0, 56, 19, 8, 0, 184, 21, 8, 0, 56, 24, 8, 0, 184, 26, 8, 0, 56, 29, 8, 0, 184, 31, 8, 0, 56, 34, 8, 0, 184, 36, 8, 0, 56, 39, 8, 0, 184, 41, 8, 0, 56, 44, 8, 0, 184, 46, 8, 0, 56, 49, 8, 0, 184, 51, 8, 0, 56, 54, 8, 0, 184, 56, 8, 0, 56, 59, 8, 0, 184, 61, 8, 0, 56, 64, 8, 0, 184, 66, 8, 0, 56, 69, 8, 0, 184, 71, 8, 0, 56, 74, 8, 0, 184, 76, 8, 0, 56, 79, 8, 0, 184, 81, 8, 0, 56, 84, 8, 0, 184, 86, 8, 0, 56, 89, 8, 0, 184, 91, 8, 0, 56, 94, 8, 0, 184, 96, 8, 0, 56, 99, 8, 0, 184, 101, 8, 0, 56, 104, 8, 0, 184, 106, 8, 0, 56, 109, 8, 0, 184, 111, 8, 0, 56, 114, 8, 0, 184, 116, 8, 0, 56, 119, 8, 0, 184, 121, 8, 0, 56, 124, 8, 0, 184, 126, 8, 0, 56, 129, 8, 0, 184, 131, 8, 0, 56, 134, 8, 0, 184, 136, 8, 0, 56, 139, 8, 0, 184, 141, 8, 0, 56, 144, 8, 0, 184, 146, 8, 0, 56, 149, 8, 0, 184, 151, 8, 0, 56, 154, 8, 0, 184, 156, 8, 0, 56, 159, 8, 0, 184, 161, 8, 0, 56, 164, 8, 0, 184, 166, 8, 0, 56, 169, 8, 0, 184, 171, 8, 0, 56, 174, 8, 0, 184, 176, 8, 0, 56, 179, 8, 0, 184, 181, 8, 0, 56, 184, 8, 0, 184, 186, 8, 0, 56, 189, 8, 0, 184, 191, 8, 0, 56, 194, 8, 0, 184, 196, 8, 0, 56, 199, 8, 0, 184, 201, 8, 0, 56, 204, 8, 0, 184, 206, 8, 0, 56, 209, 8, 0, 184, 211, 8, 0, 56, 214, 8, 0, 184, 216, 8, 0, 56, 219, 8, 0, 184, 221, 8, 0, 56, 224, 8, 0, 184, 226, 8, 0, 56, 229, 8, 0, 184, 231, 8, 0, 56, 234, 8, 0, 184, 236, 8, 0, 56, 239, 8, 0, 184, 241, 8, 0, 56, 244, 8, 0, 184, 246, 8, 0, 56, 249, 8, 0, 184, 251, 8, 0, 56, 254, 8, 0, 184, 0, 9, 0, 56, 3, 9, 0, 184, 5, 9, 0, 56, 8, 9, 0, 184, 10, 9, 0, 56, 13, 9, 0, 184, 15, 9, 0, 56, 18, 9, 0, 184, 20, 9, 0, 56, 23, 9, 0, 184, 25, 9, 0, 56, 28, 9, 0, 184, 30, 9, 0, 56, 33, 9, 0, 184, 35, 9, 0, 56, 38, 9, 0, 184, 40, 9, 0, 56, 43, 9, 0, 184, 45, 9, 0, 56, 48, 9, 0, 184, 50, 9, 0, 56, 53, 9, 0, 184, 55, 9, 0, 56, 58, 9, 0, 184, 60, 9, 0, 56, 63, 9, 0, 184, 65, 9, 0, 56, 68, 9, 0, 184, 70, 9, 0, 56, 73, 9, 0, 184, 75, 9, 0, 56, 78, 9, 0, 184, 80, 9, 0, 56, 83, 9, 0, 184, 85, 9, 0, 56, 88, 9, 0, 184, 90, 9, 0, 56, 93, 9, 0, 184, 95, 9, 0, 56, 98, 9, 0, 184, 100, 9, 0, 56, 103, 9, 0, 184, 105, 9, 0, 56, 108, 9, 0, 184, 110, 9, 0, 56, 113, 9, 0, 184, 115, 9, 0, 56, 118, 9, 0, 184, 120, 9, 0, 56, 123, 9, 0, 184, 125, 9, 0, 56, 128, 9, 0, 184, 130, 9, 0, 56, 133, 9, 0, 184, 135, 9, 0, 56, 138, 9, 0, 184, 140, 9, 0, 56, 143, 9, 0, 184, 145, 9, 0, 56, 148, 9, 0, 184, 150, 9, 0, 56, 153, 9, 0, 184, 155, 9, 0, 56, 158, 9, 0, 184, 160, 9, 0, 56, 163, 9, 0, 184, 165, 9, 0, 56, 168, 9, 0, 184, 170, 9, 0, 56, 173, 9, 0, 184, 175, 9, 0, 56, 178, 9, 0, 184, 180, 9, 0, 56, 183, 9, 0, 184, 185, 9, 0, 56, 188, 9, 0, 184, 190, 9, 0, 56, 193, 9, 0, 184, 195, 9, 0, 56, 198, 9, 0, 184, 200, 9, 0, 56, 203, 9, 0, 184, 205, 9, 0, 56, 208, 9, 0, 184, 210, 9, 0, 56, 213, 9, 0, 184, 215, 9, 0, 56, 218, 9, 0, 184, 220, 9, 0, 56, 223, 9, 0, 184, 225, 9, 0, 56, 228, 9, 0, 184, 230, 9, 0, 56, 233, 9, 0, 184, 235, 9, 0, 56, 238, 9, 0, 184, 240, 9, 0, 56, 243, 9, 0, 184, 245, 9, 0, 56, 248, 9, 0, 184, 250, 9, 0, 56, 253, 9, 0, 184, 255, 9, 0, 56, 2, 10, 0, 184, 4, 10, 0, 56, 7, 10, 0, 184, 9, 10, 0, 56, 12, 10, 0, 184, 14, 10, 0, 56, 17, 10, 0, 184, 19, 10, 0, 56, 22, 10, 0, 184, 24, 10, 0, 56, 27, 10, 0, 184, 29, 10, 0, 56, 32, 10, 0, 184, 34, 10, 0, 56, 37, 10, 0, 184, 39, 10, 0, 56, 42, 10, 0, 184, 44, 10, 0, 56, 47, 10, 0, 184, 49, 10, 0, 56, 52, 10, 0, 184, 54, 10, 0, 56, 57, 10, 0, 184, 59, 10, 0, 56, 62, 10, 0, 184, 64, 10, 0, 56, 67, 10, 0, 184, 69, 10, 0, 56, 72, 10, 0, 184, 74, 10, 0, 56, 77, 10, 0, 184, 79, 10, 0, 56, 82, 10, 0, 184, 84, 10, 0, 56, 87, 10, 0, 184, 89, 10, 0, 56, 92, 10, 0, 184, 94, 10, 0, 56, 97, 10, 0, 184, 99, 10, 0, 56, 102, 10, 0, 184, 104, 10, 0, 56, 107, 10, 0, 184, 109, 10, 0, 56, 112, 10, 0, 184, 114, 10, 0, 56, 117, 10, 0, 184, 119, 10, 0, 56, 122, 10, 0, 184, 124, 10, 0, 56, 127, 10, 0, 184, 129, 10, 0, 56, 132, 10, 0, 184, 134, 10, 0, 56, 137, 10, 0, 184, 139, 10, 0, 56, 142, 10, 0, 184, 144, 10, 0, 56, 147, 10, 0, 184, 149, 10, 0, 56, 152, 10, 0, 184, 154, 10, 0, 56, 157, 10, 0, 184, 159, 10, 0, 56, 162, 10, 0, 184, 164, 10, 0, 56, 167, 10, 0, 184, 169, 10, 0, 56, 172, 10, 0, 184, 174, 10, 0, 56, 177, 10, 0, 184, 179, 10, 0, 56, 182, 10, 0, 184, 184, 10, 0, 56, 187, 10, 0, 184, 189, 10, 0, 56, 192, 10, 0, 184, 194, 10, 0, 56, 197, 10, 0, 184, 199, 10, 0, 56, 202, 10, 0, 184, 204, 10, 0, 56, 207, 10, 0, 184, 209, 10, 0, 56, 212, 10, 0, 184, 214, 10, 0, 56, 217, 10, 0, 184, 219, 10, 0, 56, 222, 10, 0, 184, 224, 10, 0, 56, 227, 10, 0, 184, 229, 10, 0, 56, 232, 10, 0, 184, 234, 10, 0, 56, 237, 10, 0, 184, 239, 10, 0, 56, 242, 10, 0, 184, 244, 10, 0, 56, 247, 10, 0, 184, 249, 10, 0, 56, 252, 10, 0, 184, 254, 10, 0, 56, 1, 11, 0, 184, 3, 11, 0, 56, 6, 11, 0, 184, 8, 11, 0, 56, 11, 11, 0, 184, 13, 11, 0, 56, 16, 11, 0, 184, 18, 11, 0, 56, 21, 11, 0, 184, 23, 11, 0, 56, 26, 11, 0, 184, 28, 11, 0, 56, 31, 11, 0, 184, 33, 11, 0, 56, 36, 11, 0, 184, 38, 11, 0, 56, 41, 11, 0, 184, 43, 11, 0, 56, 46, 11, 0, 184, 48, 11, 0, 56, 51, 11, 0, 184, 53, 11, 0, 56, 56, 11, 0, 184, 58, 11, 0, 56, 61, 11, 0, 184, 63, 11, 0, 56, 66, 11, 0, 184, 68, 11, 0, 56, 71, 11, 0, 184, 73, 11, 0, 56, 76, 11, 0, 184, 78, 11, 0, 56, 81, 11, 0, 184, 83, 11, 0, 56, 86, 11, 0, 184, 88, 11, 0, 56, 91, 11, 0, 184, 93, 11, 0, 56, 96, 11, 0, 184, 98, 11, 0, 56, 101, 11, 0, 184, 103, 11, 0, 56, 106, 11, 0, 184, 108, 11, 0, 56, 111, 11, 0, 184, 113, 11, 0, 56, 116, 11, 0, 184, 118, 11, 0, 56, 121, 11, 0, 184, 123, 11, 0, 56, 126, 11, 0, 184, 128, 11, 0, 56, 131, 11, 0, 184, 133, 11, 0, 56, 136, 11, 0, 184, 138, 11, 0, 56, 141, 11, 0, 184, 143, 11, 0, 56, 146, 11, 0, 184, 148, 11, 0, 56, 151, 11, 0, 184, 153, 11, 0, 56, 156, 11, 0, 184, 158, 11, 0, 56, 161, 11, 0, 184, 163, 11, 0, 56, 166, 11, 0, 184, 168, 11, 0, 56, 171, 11, 0, 184, 173, 11, 0, 56, 176, 11, 0, 184, 178, 11, 0, 56, 181, 11, 0, 184, 183, 11, 0, 56, 186, 11, 0, 184, 188, 11, 0, 56, 191, 11, 0, 184, 193, 11, 0, 56, 196, 11, 0, 184, 198, 11, 0, 56, 201, 11, 0, 184, 203, 11, 0, 56, 206, 11, 0, 184, 208, 11, 0, 56, 211, 11, 0, 184, 213, 11, 0, 56, 216, 11, 0, 184, 218, 11, 0, 56, 221, 11, 0, 184, 223, 11, 0, 56, 226, 11, 0, 184, 228, 11, 0, 56, 231, 11, 0, 184, 233, 11, 0, 56, 236, 11, 0, 184, 238, 11, 0, 56, 241, 11, 0, 184, 243, 11, 0, 56, 246, 11, 0, 184, 248, 11, 0, 56, 251, 11, 0, 184, 253, 11, 0, 56, 0, 12, 0, 184, 2, 12, 0, 56, 5, 12, 0, 184, 7, 12, 0, 56, 10, 12, 0, 184, 12, 12, 0, 56, 15, 12, 0, 184, 17, 12, 0, 56, 20, 12, 0, 184, 22, 12, 0, 56, 25, 12, 0, 184, 27, 12, 0, 56, 30, 12, 0, 184, 32, 12, 0, 56, 35, 12, 0, 184, 37, 12, 0, 56, 40, 12, 0, 184, 42, 12, 0, 56, 45, 12, 0, 184, 47, 12, 0, 56, 50, 12, 0, 184, 52, 12, 0, 56, 55, 12, 0, 184, 57, 12, 0, 56, 60, 12, 0, 184, 62, 12, 0, 56, 65, 12, 0, 184, 67, 12, 0, 56, 70, 12, 0, 184, 72, 12, 0, 56, 75, 12, 0, 184, 77, 12, 0, 56, 80, 12, 0, 184, 82, 12, 0, 56, 85, 12, 0, 184, 87, 12, 0, 56, 90, 12, 0, 184, 92, 12, 0, 56, 95, 12, 0, 184, 97, 12, 0, 56, 100, 12, 0, 184, 102, 12, 0, 56, 105, 12, 0, 184, 107, 12, 0, 56, 110, 12, 0, 184, 112, 12, 0, 56, 115, 12, 0, 184, 117, 12, 0, 56, 120, 12, 0, 184, 122, 12, 0, 56, 125, 12, 0, 184, 127, 12, 0, 56, 130, 12, 0, 184, 132, 12, 0, 56, 135, 12, 0, 184, 137, 12, 0, 56, 140, 12, 0, 184, 142, 12, 0, 56, 145, 12, 0, 184, 147, 12, 0, 56, 150, 12, 0, 184, 152, 12, 0, 56, 155, 12, 0, 184, 157, 12, 0, 56, 160, 12, 0, 184, 162, 12, 0, 56, 165, 12, 0, 184, 167, 12, 0, 56, 170, 12, 0, 184, 172, 12, 0, 56, 175, 12, 0, 184, 177, 12, 0, 56, 180, 12, 0, 184, 182, 12, 0, 56, 185, 12, 0, 184, 187, 12, 0, 56, 190, 12, 0, 184, 192, 12, 0, 56, 195, 12, 0, 184, 197, 12, 0, 56, 200, 12, 0, 184, 202, 12, 0, 56, 205, 12, 0, 184, 207, 12, 0, 56, 210, 12, 0, 184, 212, 12, 0, 56, 215, 12, 0, 184, 217, 12, 0, 56, 220, 12, 0, 184, 222, 12, 0, 56, 225, 12, 0, 184, 227, 12, 0, 56, 230, 12, 0, 184, 232, 12, 0, 56, 235, 12, 0, 184, 237, 12, 0, 56, 240, 12, 0, 184, 242, 12, 0, 56, 245, 12, 0, 184, 247, 12, 0, 56, 250, 12, 0, 184, 252, 12, 0, 56, 255, 12, 0, 184, 1, 13, 0, 56, 4, 13, 0, 184, 6, 13, 0, 56, 9, 13, 0, 184, 11, 13, 0, 56, 14, 13, 0, 184, 16, 13, 0, 56, 19, 13, 0, 184, 21, 13, 0, 56, 24, 13, 0, 184, 26, 13, 0, 56, 29, 13, 0, 184, 31, 13, 0, 56, 34, 13, 0, 184, 36, 13, 0, 56, 39, 13, 0, 184, 41, 13, 0, 56, 44, 13, 0, 184, 46, 13, 0, 56, 49, 13, 0, 184, 51, 13, 0, 56, 54, 13, 0, 184, 56, 13, 0, 56, 59, 13, 0, 184, 61, 13, 0, 56, 64, 13, 0, 184, 66, 13, 0, 56, 69, 13, 0, 184, 71, 13, 0, 56, 74, 13, 0, 184, 76, 13, 0, 56, 79, 13, 0, 184, 81, 13, 0, 56, 84, 13, 0, 184, 86, 13, 0, 56, 89, 13, 0, 184, 91, 13, 0, 56, 94, 13, 0, 184, 96, 13, 0, 56, 99, 13, 0, 184, 101, 13, 0, 56, 104, 13, 0, 184, 106, 13, 0, 56, 109, 13, 0, 184, 111, 13, 0, 56, 114, 13, 0, 184, 116, 13, 0, 56, 119, 13, 0, 184, 121, 13, 0, 56, 124, 13, 0, 184, 126, 13, 0, 56, 129, 13, 0, 184, 131, 13, 0, 56, 134, 13, 0, 184, 136, 13, 0, 56, 139, 13, 0, 184, 141, 13, 0, 56, 144, 13, 0, 184, 146, 13, 0, 56, 149, 13, 0, 184, 151, 13, 0, 56, 154, 13, 0, 184, 156, 13, 0, 56, 159, 13, 0, 184, 161, 13, 0, 56, 164, 13, 0, 184, 166, 13, 0, 56, 169, 13, 0, 184, 171, 13, 0, 56, 174, 13, 0, 184, 176, 13, 0, 56, 179, 13, 0, 184, 181, 13, 0, 56, 184, 13, 0, 184, 186, 13, 0, 56, 189, 13, 0, 184, 191, 13, 0, 56, 194, 13, 0, 184, 196, 13, 0, 56, 199, 13, 0, 184, 201, 13, 0, 56, 204, 13, 0, 184, 206, 13, 0, 56, 209, 13, 0, 184, 211, 13, 0, 56, 214, 13, 0, 184, 216, 13, 0, 56, 219, 13, 0, 184, 221, 13, 0, 56, 224, 13, 0, 184, 226, 13, 0, 56, 229, 13, 0, 184, 231, 13, 0, 56, 234, 13, 0, 184, 236, 13, 0, 56, 239, 13, 0, 184, 241, 13, 0, 56, 244, 13, 0, 184, 246, 13, 0, 56, 249, 13, 0, 184, 251, 13, 0, 56, 254, 13, 0, 184, 0, 14, 0, 56, 3, 14, 0, 184, 5, 14, 0, 56, 8, 14, 0, 184, 10, 14, 0, 56, 13, 14, 0, 184, 15, 14, 0, 56, 18, 14, 0, 184, 20, 14, 0, 56, 23, 14, 0, 184, 25, 14, 0, 56, 28, 14, 0, 184, 30, 14, 0, 56, 33, 14, 0, 184, 35, 14, 0, 56, 38, 14, 0, 184, 40, 14, 0, 56, 43, 14, 0, 184, 45, 14, 0, 56, 48, 14, 0, 184, 50, 14, 0, 56, 53, 14, 0, 184, 55, 14, 0, 56, 58, 14, 0, 184, 60, 14, 0, 56, 63, 14, 0, 184, 65, 14, 0, 56, 68, 14, 0, 184, 70, 14, 0, 56, 73, 14, 0, 184, 75, 14, 0, 56, 78, 14, 0, 184, 80, 14, 0, 56, 83, 14, 0, 184, 85, 14, 0, 56, 88, 14, 0, 184, 90, 14, 0, 56, 93, 14, 0, 184, 95, 14, 0, 56, 98, 14, 0, 184, 100, 14, 0, 56, 103, 14, 0, 184, 105, 14, 0, 56, 108, 14, 0, 184, 110, 14, 0, 56, 113, 14, 0, 184, 115, 14, 0, 56, 118, 14, 0, 184, 120, 14, 0, 56, 123, 14, 0, 184, 125, 14, 0, 56, 128, 14, 0, 184, 130, 14, 0, 56, 133, 14, 0, 184, 135, 14, 0, 56, 138, 14, 0, 184, 140, 14, 0, 56, 143, 14, 0, 184, 145, 14, 0, 56, 148, 14, 0, 184, 150, 14, 0, 56, 153, 14, 0, 184, 155, 14, 0, 56, 158, 14, 0, 184, 160, 14, 0, 56, 163, 14, 0, 184, 165, 14, 0, 56, 168, 14, 0, 184, 170, 14, 0, 56, 173, 14, 0, 184, 175, 14, 0, 56, 178, 14, 0, 184, 180, 14, 0, 56, 183, 14, 0, 184, 185, 14, 0, 56, 188, 14, 0, 184, 190, 14, 0, 56, 193, 14, 0, 184, 195, 14, 0, 56, 198, 14, 0, 184, 200, 14, 0, 56, 203, 14, 0, 184, 205, 14, 0, 56, 208, 14, 0, 184, 210, 14, 0, 56, 213, 14, 0, 184, 215, 14, 0, 56, 218, 14, 0, 184, 220, 14, 0, 56, 223, 14, 0, 184, 225, 14, 0, 56, 228, 14, 0, 184, 230, 14, 0, 56, 233, 14, 0, 184, 235, 14, 0, 56, 238, 14, 0, 184, 240, 14, 0, 56, 243, 14, 0, 184, 245, 14, 0, 56, 248, 14, 0, 184, 250, 14, 0, 56, 253, 14, 0, 184, 255, 14, 0, 56, 2, 15, 0, 184, 4, 15, 0, 56, 7, 15, 0, 184, 9, 15, 0, 56, 12, 15, 0, 184, 14, 15, 0, 56, 17, 15, 0, 184, 19, 15, 0, 56, 22, 15, 0, 184, 24, 15, 0, 56, 27, 15, 0, 184, 29, 15, 0, 56, 32, 15, 0, 184, 34, 15, 0, 56, 37, 15, 0, 184, 39, 15, 0, 56, 42, 15, 0, 184, 44, 15, 0, 56, 47, 15, 0, 184, 49, 15, 0, 56, 52, 15, 0, 184, 54, 15, 0, 56, 57, 15, 0, 184, 59, 15, 0, 56, 62, 15, 0, 184, 64, 15, 0, 56, 67, 15, 0, 184, 69, 15, 0, 56, 72, 15, 0, 184, 74, 15, 0, 56, 77, 15, 0, 184, 79, 15, 0, 56, 82, 15, 0, 184, 84, 15, 0, 56, 87, 15, 0, 184, 89, 15, 0, 56, 92, 15, 0, 184, 94, 15, 0, 56, 97, 15, 0, 184, 99, 15, 0, 56, 102, 15, 0, 184, 104, 15, 0, 56, 107, 15, 0, 184, 109, 15, 0, 56, 112, 15, 0, 184, 114, 15, 0, 56, 117, 15, 0, 184, 119, 15, 0, 56, 122, 15, 0, 184, 124, 15, 0, 56, 127, 15, 0, 184, 129, 15, 0, 56, 132, 15, 0, 184, 134, 15, 0, 56, 137, 15, 0, 184, 139, 15, 0, 56, 142, 15, 0, 184, 144, 15, 0, 56, 147, 15, 0, 184, 149, 15, 0, 56, 152, 15, 0, 184, 154, 15, 0, 56, 157, 15, 0, 184, 159, 15, 0, 56, 162, 15, 0, 184, 164, 15, 0, 56, 167, 15, 0, 184, 169, 15, 0, 56, 172, 15, 0, 184, 174, 15, 0, 56, 177, 15, 0, 184, 179, 15, 0, 56, 182, 15, 0, 184, 184, 15, 0, 56, 187, 15, 0, 184, 189, 15, 0, 56, 192, 15, 0, 184, 194, 15, 0, 56, 197, 15, 0, 184, 199, 15, 0, 56, 202, 15, 0, 184, 204, 15, 0, 56, 207, 15, 0, 184, 209, 15, 0, 56, 212, 15, 0, 184, 214, 15, 0, 56, 217, 15, 0, 184, 219, 15, 0, 56, 222, 15, 0, 184, 224, 15, 0, 56, 227, 15, 0, 184, 229, 15, 0, 56, 232, 15, 0, 184, 234, 15, 0, 56, 237, 15, 0, 184, 239, 15, 0, 56, 242, 15, 0, 184, 244, 15, 0, 56, 247, 15, 0, 184, 249, 15, 0, 56, 252, 15, 0, 184, 254, 15, 0, 56, 1, 16, 0, 184, 3, 16, 0, 56, 6, 16, 0, 184, 8, 16, 0, 56, 11, 16, 0, 184, 13, 16, 0, 56, 16, 16, 0, 184, 18, 16, 0, 56, 21, 16, 0, 184, 23, 16, 0, 56, 26, 16, 0, 184, 28, 16, 0, 56, 31, 16, 0, 184, 33, 16, 0, 56, 36, 16, 0, 184, 38, 16, 0, 56, 41, 16, 0, 184, 43, 16, 0, 56, 46, 16, 0, 184, 48, 16, 0, 56, 51, 16, 0, 184, 53, 16, 0, 56, 56, 16, 0, 184, 58, 16, 0, 56, 61, 16, 0, 184, 63, 16, 0, 56, 66, 16, 0, 184, 68, 16, 0, 56, 71, 16, 0, 184, 73, 16, 0, 56, 76, 16, 0, 184, 78, 16, 0, 56, 81, 16, 0, 184, 83, 16, 0, 56, 86, 16, 0, 184, 88, 16, 0, 56, 91, 16, 0, 184, 93, 16, 0, 56, 96, 16, 0, 184, 98, 16, 0, 56, 101, 16, 0, 184, 103, 16, 0, 56, 106, 16, 0, 184, 108, 16, 0, 56, 111, 16, 0, 184, 113, 16, 0, 56, 116, 16, 0, 184, 118, 16, 0, 56, 121, 16, 0, 184, 123, 16, 0, 56, 126, 16, 0, 184, 128, 16, 0, 56, 131, 16, 0, 184, 133, 16, 0, 56, 136, 16, 0, 184, 138, 16, 0, 56, 141, 16, 0, 184, 143, 16, 0, 56, 146, 16, 0, 184, 148, 16, 0, 56, 151, 16, 0, 184, 153, 16, 0, 56, 156, 16, 0, 184, 158, 16, 0, 56, 161, 16, 0, 184, 163, 16, 0, 56, 166, 16, 0, 184, 168, 16, 0, 56, 171, 16, 0, 184, 173, 16, 0, 56, 176, 16, 0, 184, 178, 16, 0, 56, 181, 16, 0, 184, 183, 16, 0, 56, 186, 16, 0, 184, 188, 16, 0, 56, 191, 16, 0, 184, 193, 16, 0, 56, 196, 16, 0, 184, 198, 16, 0, 56, 201, 16, 0, 184, 203, 16, 0, 56, 206, 16, 0, 184, 208, 16, 0, 56, 211, 16, 0, 184, 213, 16, 0, 56, 216, 16, 0, 184, 218, 16, 0, 56, 221, 16, 0, 184, 223, 16, 0, 56, 226, 16, 0, 184, 228, 16, 0, 56, 231, 16, 0, 184, 233, 16, 0, 56, 236, 16, 0, 184, 238, 16, 0, 56, 241, 16, 0, 184, 243, 16, 0, 56, 246, 16, 0, 184, 248, 16, 0, 56, 251, 16, 0, 184, 253, 16, 0, 56, 0, 17, 0, 184, 2, 17, 0, 56, 5, 17, 0, 184, 7, 17, 0, 56, 10, 17, 0, 184, 12, 17, 0, 56, 15, 17, 0, 184, 17, 17, 0, 56, 20, 17, 0, 184, 22, 17, 0, 56, 25, 17, 0, 184, 27, 17, 0, 56, 30, 17, 0, 184, 32, 17, 0, 56, 35, 17, 0, 184, 37, 17, 0, 56, 40, 17, 0, 184, 42, 17, 0, 56, 45, 17, 0, 184, 47, 17, 0, 56, 50, 17, 0, 184, 52, 17, 0, 56, 55, 17, 0, 184, 57, 17, 0, 56, 60, 17, 0, 184, 62, 17, 0, 56, 65, 17, 0, 184, 67, 17, 0, 56, 70, 17, 0, 184, 72, 17, 0, 56, 75, 17, 0, 184, 77, 17, 0, 56, 80, 17, 0, 184, 82, 17, 0, 56, 85, 17, 0, 184, 87, 17, 0, 56, 90, 17, 0, 184, 92, 17, 0, 56, 95, 17, 0, 184, 97, 17, 0, 56, 100, 17, 0, 184, 102, 17, 0, 56, 105, 17, 0, 184, 107, 17, 0, 56, 110, 17, 0, 184, 112, 17, 0, 56, 115, 17, 0, 184, 117, 17, 0, 56, 120, 17, 0, 184, 122, 17, 0, 56, 125, 17, 0, 184, 127, 17, 0, 56, 130, 17, 0, 184, 132, 17, 0, 56, 135, 17, 0, 184, 137, 17, 0, 56, 140, 17, 0, 184, 142, 17, 0, 56, 145, 17, 0, 184, 147, 17, 0, 56, 150, 17, 0, 184, 152, 17, 0, 56, 155, 17, 0, 184, 157, 17, 0, 56, 160, 17, 0, 184, 162, 17, 0, 56, 165, 17, 0, 184, 167, 17, 0, 56, 170, 17, 0, 184, 172, 17, 0, 56, 175, 17, 0, 184, 177, 17, 0, 56, 180, 17, 0, 184, 182, 17, 0, 56, 185, 17, 0, 184, 187, 17, 0, 56, 190, 17, 0, 184, 192, 17, 0, 56, 195, 17, 0, 184, 197, 17, 0, 56, 200, 17, 0, 184, 202, 17, 0, 56, 205, 17, 0, 184, 207, 17, 0, 56, 210, 17, 0, 184, 212, 17, 0, 56, 215, 17, 0, 184, 217, 17, 0, 56, 220, 17, 0, 184, 222, 17, 0, 56, 225, 17, 0, 184, 227, 17, 0, 56, 230, 17, 0, 184, 232, 17, 0, 56, 235, 17, 0, 184, 237, 17, 0, 56, 240, 17, 0, 184, 242, 17, 0, 56, 245, 17, 0, 184, 247, 17, 0, 56, 250, 17, 0, 184, 252, 17, 0, 56, 255, 17, 0, 184, 1, 18, 0, 56, 4, 18, 0, 184, 6, 18, 0, 56, 9, 18, 0, 184, 11, 18, 0, 56, 14, 18, 0, 184, 16, 18, 0, 56, 19, 18, 0, 184, 21, 18, 0, 56, 24, 18, 0, 184, 26, 18, 0, 56, 29, 18, 0, 184, 31, 18, 0, 56, 34, 18, 0, 184, 36, 18, 0, 56, 39, 18, 0, 184, 41, 18, 0, 56, 44, 18, 0, 184, 46, 18, 0, 56, 49, 18, 0, 184, 51, 18, 0, 56, 54, 18, 0, 184, 56, 18, 0, 56, 59, 18, 0, 184, 61, 18, 0, 56, 64, 18, 0, 184, 66, 18, 0, 56, 69, 18, 0, 184, 71, 18, 0, 56, 74, 18, 0, 184, 76, 18, 0, 56, 79, 18, 0, 184, 81, 18, 0, 56, 84, 18, 0, 184, 86, 18, 0, 56, 89, 18, 0, 184, 91, 18, 0, 56, 94, 18, 0, 184, 96, 18, 0, 56, 99, 18, 0, 184, 101, 18, 0, 56, 104, 18, 0, 184, 106, 18, 0, 56, 109, 18, 0, 184, 111, 18, 0, 56, 114, 18, 0, 184, 116, 18, 0, 56, 119, 18, 0, 184, 121, 18, 0, 56, 124, 18, 0, 184, 126, 18, 0, 56, 129, 18, 0, 184, 131, 18, 0, 56, 134, 18, 0, 184, 136, 18, 0, 56, 139, 18, 0, 184, 141, 18, 0, 56, 144, 18, 0, 184, 146, 18, 0, 56, 149, 18, 0, 184, 151, 18, 0, 56, 154, 18, 0, 184, 156, 18, 0, 56, 159, 18, 0, 184, 161, 18, 0, 56, 164, 18, 0, 184, 166, 18, 0, 56, 169, 18, 0, 184, 171, 18, 0, 56, 174, 18, 0, 184, 176, 18, 0, 56, 179, 18, 0, 184, 181, 18, 0, 56, 184, 18, 0, 184, 186, 18, 0, 56, 189, 18, 0, 184, 191, 18, 0, 56, 194, 18, 0, 184, 196, 18, 0, 56, 199, 18, 0, 184, 201, 18, 0, 56, 204, 18, 0, 184, 206, 18, 0, 56, 209, 18, 0, 184, 211, 18, 0, 56, 214, 18, 0, 184, 216, 18, 0, 56, 219, 18, 0, 184, 221, 18, 0, 56, 224, 18, 0, 184, 226, 18, 0, 56, 229, 18, 0, 184, 231, 18, 0, 56, 234, 18, 0, 184, 236, 18, 0, 56, 239, 18, 0, 184, 241, 18, 0, 56, 244, 18, 0, 184, 246, 18, 0, 56, 249, 18, 0, 184, 251, 18, 0, 56, 254, 18, 0, 184, 0, 19, 0, 56, 3, 19, 0, 184, 5, 19, 0, 56, 8, 19, 0, 184, 10, 19, 0, 56, 13, 19, 0, 184, 15, 19, 0, 56, 18, 19, 0, 184, 20, 19, 0, 56, 23, 19, 0, 184, 25, 19, 0, 56, 28, 19, 0, 184, 30, 19, 0, 56, 33, 19, 0, 184, 35, 19, 0, 56, 38, 19, 0, 184, 40, 19, 0, 56, 43, 19, 0, 184, 45, 19, 0, 56, 48, 19, 0, 184, 50, 19, 0, 56, 53, 19, 0, 184, 55, 19, 0, 56, 58, 19, 0, 184, 60, 19, 0, 56, 63, 19, 0, 184, 65, 19, 0, 56, 68, 19, 0, 184, 70, 19, 0, 56, 73, 19, 0, 184, 75, 19, 0, 56, 78, 19, 0, 184, 80, 19, 0, 56, 83, 19, 0, 184, 85, 19, 0, 56, 88, 19, 0, 184, 90, 19, 0, 56, 93, 19, 0, 184, 95, 19, 0, 56, 98, 19, 0, 184, 100, 19, 0, 56, 103, 19, 0, 184, 105, 19, 0, 56, 108, 19, 0, 184, 110, 19, 0, 56, 113, 19, 0, 184, 115, 19, 0, 56, 118, 19, 0, 184, 120, 19, 0, 56, 123, 19, 0, 184, 125, 19, 0, 56, 128, 19, 0, 184, 130, 19, 0, 56, 133, 19, 0, 184, 135, 19, 0, 56, 138, 19, 0, 184, 140, 19, 0, 56, 143, 19, 0, 184, 145, 19, 0, 56, 148, 19, 0, 184, 150, 19, 0, 56, 153, 19, 0, 184, 155, 19, 0, 56, 158, 19, 0, 184, 160, 19, 0, 56, 163, 19, 0, 184, 165, 19, 0, 56, 168, 19, 0, 184, 170, 19, 0, 56, 173, 19, 0, 184, 175, 19, 0, 56, 178, 19, 0, 184, 180, 19, 0, 56, 183, 19, 0, 184, 185, 19, 0, 56, 188, 19, 0, 184, 190, 19, 0, 56, 193, 19, 0, 184, 195, 19, 0, 56, 198, 19, 0, 184, 200, 19, 0, 56, 203, 19, 0, 184, 205, 19, 0, 56, 208, 19, 0, 184, 210, 19, 0, 56, 213, 19, 0, 184, 215, 19, 0, 56, 218, 19, 0, 184, 220, 19, 0, 56, 223, 19, 0, 184, 225, 19, 0, 56, 228, 19, 0, 184, 230, 19, 0, 56, 233, 19, 0, 184, 235, 19, 0, 56, 238, 19, 0, 184, 240, 19, 0, 56, 243, 19, 0, 184, 245, 19, 0, 56, 248, 19, 0, 184, 250, 19, 0, 56, 253, 19, 0, 184, 255, 19, 0, 56, 2, 20, 0, 184, 4, 20, 0, 56, 7, 20, 0, 184, 9, 20, 0, 56, 12, 20, 0, 184, 14, 20, 0, 56, 17, 20, 0, 184, 19, 20, 0, 56, 22, 20, 0, 184, 24, 20, 0, 56, 27, 20, 0, 184, 29, 20, 0, 56, 32, 20, 0, 184, 34, 20, 0, 56, 37, 20, 0, 184, 39, 20, 0, 56, 42, 20, 0, 184, 44, 20, 0, 56, 47, 20, 0, 184, 49, 20, 0, 56, 52, 20, 0, 184, 54, 20, 0, 56, 57, 20, 0, 184, 59, 20, 0, 56, 62, 20, 0, 184, 64, 20, 0, 56, 67, 20, 0, 184, 69, 20, 0, 56, 72, 20, 0, 184, 74, 20, 0, 56, 77, 20, 0, 184, 79, 20, 0, 56, 82, 20, 0, 184, 84, 20, 0, 56, 87, 20, 0, 184, 89, 20, 0, 56, 92, 20, 0, 184, 94, 20, 0, 56, 97, 20, 0, 184, 99, 20, 0, 56, 102, 20, 0, 184, 104, 20, 0, 56, 107, 20, 0, 184, 109, 20, 0, 56, 112, 20, 0, 184, 114, 20, 0, 56, 117, 20, 0, 184, 119, 20, 0, 56, 122, 20, 0, 184, 124, 20, 0, 56, 127, 20, 0, 184, 129, 20, 0, 56, 132, 20, 0, 184, 134, 20, 0, 56, 137, 20, 0, 184, 139, 20, 0, 56, 142, 20, 0, 184, 144, 20, 0, 56, 147, 20, 0, 184, 149, 20, 0, 56, 152, 20, 0, 184, 154, 20, 0, 56, 157, 20, 0, 184, 159, 20, 0, 56, 162, 20, 0, 184, 164, 20, 0, 56, 167, 20, 0, 184, 169, 20, 0, 56, 172, 20, 0, 184, 174, 20, 0, 56, 177, 20, 0, 184, 179, 20, 0, 56, 182, 20, 0, 184, 184, 20, 0, 56, 187, 20, 0, 184, 189, 20, 0, 56, 192, 20, 0, 184, 194, 20, 0, 56, 197, 20, 0, 184, 199, 20, 0, 56, 202, 20, 0, 184, 204, 20, 0, 56, 207, 20, 0, 184, 209, 20, 0, 56, 212, 20, 0, 184, 214, 20, 0, 56, 217, 20, 0, 184, 219, 20, 0, 56, 222, 20, 0, 184, 224, 20, 0, 56, 227, 20, 0, 184, 229, 20, 0, 56, 232, 20, 0, 184, 234, 20, 0, 56, 237, 20, 0, 184, 239, 20, 0, 56, 242, 20, 0, 184, 244, 20, 0, 56, 247, 20, 0, 184, 249, 20, 0, 56, 252, 20, 0, 184, 254, 20, 0, 56, 1, 21, 0, 184, 3, 21, 0, 56, 6, 21, 0, 184, 8, 21, 0, 56, 11, 21, 0, 184, 13, 21, 0, 56, 16, 21, 0, 184, 18, 21, 0, 56, 21, 21, 0, 184, 23, 21, 0, 56, 26, 21, 0, 184, 28, 21, 0, 56, 31, 21, 0, 184, 33, 21, 0, 56, 36, 21, 0, 184, 38, 21, 0, 56, 41, 21, 0, 184, 43, 21, 0, 56, 46, 21, 0, 184, 48, 21, 0, 56, 51, 21, 0, 184, 53, 21, 0, 56, 56, 21, 0, 184, 58, 21, 0, 56, 61, 21, 0, 184, 63, 21, 0, 56, 66, 21, 0, 184, 68, 21, 0, 56, 71, 21, 0, 184, 73, 21, 0, 56, 76, 21, 0, 184, 78, 21, 0, 56, 81, 21, 0, 184, 83, 21, 0, 56, 86, 21, 0, 184, 88, 21, 0, 56, 91, 21, 0, 184, 93, 21, 0, 56, 96, 21, 0, 184, 98, 21, 0, 56, 101, 21, 0, 184, 103, 21, 0, 56, 106, 21, 0, 184, 108, 21, 0, 56, 111, 21, 0, 184, 113, 21, 0, 56, 116, 21, 0, 184, 118, 21, 0, 56, 121, 21, 0, 184, 123, 21, 0, 56, 126, 21, 0, 184, 128, 21, 0, 56, 131, 21, 0, 184, 133, 21, 0, 56, 136, 21, 0, 184, 138, 21, 0, 56, 141, 21, 0, 184, 143, 21, 0, 56, 146, 21, 0, 184, 148, 21, 0, 56, 151, 21, 0, 184, 153, 21, 0, 56, 156, 21, 0, 184, 158, 21, 0, 56, 161, 21, 0, 184, 163, 21, 0, 56, 166, 21, 0, 184, 168, 21, 0, 56, 171, 21, 0, 184, 173, 21, 0, 56, 176, 21, 0, 184, 178, 21, 0, 56, 181, 21, 0, 184, 183, 21, 0, 56, 186, 21, 0, 184, 188, 21, 0, 56, 191, 21, 0, 184, 193, 21, 0, 56, 196, 21, 0, 184, 198, 21, 0, 56, 201, 21, 0, 184, 203, 21, 0, 56, 206, 21, 0, 184, 208, 21, 0, 56, 211, 21, 0, 184, 213, 21, 0, 56, 216, 21, 0, 184, 218, 21, 0, 56, 221, 21, 0, 184, 223, 21, 0, 56, 226, 21, 0, 184, 228, 21, 0, 56, 231, 21, 0, 184, 233, 21, 0, 56, 236, 21, 0, 184, 238, 21, 0, 56, 241, 21, 0, 184, 243, 21, 0, 56, 246, 21, 0, 184, 248, 21, 0, 56, 251, 21, 0, 184, 253, 21, 0, 56, 0, 22, 0, 184, 2, 22, 0, 56, 5, 22, 0, 184, 7, 22, 0, 56, 10, 22, 0, 184, 12, 22, 0, 56, 15, 22, 0, 184, 17, 22, 0, 56, 20, 22, 0, 184, 22, 22, 0, 56, 25, 22, 0, 184, 27, 22, 0, 56, 30, 22, 0, 184, 32, 22, 0, 56, 35, 22, 0, 184, 37, 22, 0, 56, 40, 22, 0, 184, 42, 22, 0, 56, 45, 22, 0, 184, 47, 22, 0, 56, 50, 22, 0, 184, 52, 22, 0, 56, 55, 22, 0, 184, 57, 22, 0, 56, 60, 22, 0, 184, 62, 22, 0, 56, 65, 22, 0, 184, 67, 22, 0, 56, 70, 22, 0, 184, 72, 22, 0, 56, 75, 22, 0, 184, 77, 22, 0, 56, 80, 22, 0, 184, 82, 22, 0, 56, 85, 22, 0, 184, 87, 22, 0, 56, 90, 22, 0, 184, 92, 22, 0, 56, 95, 22, 0, 184, 97, 22, 0, 56, 100, 22, 0, 184, 102, 22, 0, 56, 105, 22, 0, 184, 107, 22, 0, 56, 110, 22, 0, 184, 112, 22, 0, 56, 115, 22, 0, 184, 117, 22, 0, 56, 120, 22, 0, 184, 122, 22, 0, 56, 125, 22, 0, 184, 127, 22, 0, 56, 130, 22, 0, 184, 132, 22, 0, 56, 135, 22, 0, 184, 137, 22, 0, 56, 140, 22, 0, 184, 142, 22, 0, 56, 145, 22, 0, 184, 147, 22, 0, 56, 150, 22, 0, 184, 152, 22, 0, 56, 155, 22, 0, 184, 157, 22, 0, 56, 160, 22, 0, 184, 162, 22, 0, 56, 165, 22, 0, 184, 167, 22, 0, 56, 170, 22, 0, 184, 172, 22, 0, 56, 175, 22, 0, 184, 177, 22, 0, 56, 180, 22, 0, 184, 182, 22, 0, 56, 185, 22, 0, 184, 187, 22, 0, 56, 190, 22, 0, 184, 192, 22, 0, 56, 195, 22, 0, 184, 197, 22, 0, 56, 200, 22, 0, 184, 202, 22, 0, 56, 205, 22, 0, 184, 207, 22, 0, 56, 210, 22, 0, 184, 212, 22, 0, 56, 215, 22, 0, 184, 217, 22, 0, 56, 220, 22, 0, 184, 222, 22, 0, 56, 225, 22, 0, 184, 227, 22, 0, 56, 230, 22, 0, 184, 232, 22, 0, 56, 235, 22, 0, 184, 237, 22, 0, 56, 240, 22, 0, 184, 242, 22, 0, 56, 245, 22, 0, 184, 247, 22, 0, 56, 250, 22, 0, 184, 252, 22, 0, 56, 255, 22, 0, 184, 1, 23, 0, 56, 4, 23, 0, 184, 6, 23, 0, 56, 9, 23, 0, 184, 11, 23, 0, 56, 14, 23, 0, 184, 16, 23, 0, 56, 19, 23, 0, 184, 21, 23, 0, 56, 24, 23, 0, 184, 26, 23, 0, 56, 29, 23, 0, 184, 31, 23, 0, 56, 34, 23, 0, 184, 36, 23, 0, 56, 39, 23, 0, 184, 41, 23, 0, 56, 44, 23, 0, 184, 46, 23, 0, 56, 49, 23, 0, 184, 51, 23, 0, 56, 54, 23, 0, 184, 56, 23, 0, 56, 59, 23, 0, 184, 61, 23, 0, 56, 64, 23, 0, 184, 66, 23, 0, 56, 69, 23, 0, 184, 71, 23, 0, 56, 74, 23, 0, 184, 76, 23, 0, 56, 79, 23, 0, 184, 81, 23, 0, 56, 84, 23, 0, 184, 86, 23, 0, 56, 89, 23, 0, 184, 91, 23, 0, 56, 94, 23, 0, 184, 96, 23, 0, 56, 99, 23, 0, 184, 101, 23, 0, 56, 104, 23, 0, 184, 106, 23, 0, 56, 109, 23, 0, 184, 111, 23, 0, 56, 114, 23, 0, 184, 116, 23, 0, 56, 119, 23, 0, 184, 121, 23, 0, 56, 124, 23, 0, 184, 126, 23, 0, 56, 129, 23, 0, 184, 131, 23, 0, 56, 134, 23, 0, 184, 136, 23, 0, 56, 139, 23, 0, 184, 141, 23, 0, 56, 144, 23, 0, 184, 146, 23, 0, 56, 149, 23, 0, 184, 151, 23, 0, 56, 154, 23, 0, 184, 156, 23, 0, 56, 159, 23, 0, 184, 161, 23, 0, 56, 164, 23, 0, 184, 166, 23, 0, 56, 169, 23, 0, 184, 171, 23, 0, 56, 174, 23, 0, 184, 176, 23, 0, 56, 179, 23, 0, 184, 181, 23, 0, 56, 184, 23, 0, 184, 186, 23, 0, 56, 189, 23, 0, 184, 191, 23, 0, 56, 194, 23, 0, 184, 196, 23, 0, 56, 199, 23, 0, 184, 201, 23, 0, 56, 204, 23, 0, 184, 206, 23, 0, 56, 209, 23, 0, 184, 211, 23, 0, 56, 214, 23, 0, 184, 216, 23, 0, 56, 219, 23, 0, 184, 221, 23, 0, 56, 224, 23, 0, 184, 226, 23, 0, 56, 229, 23, 0, 184, 231, 23, 0, 56, 234, 23, 0, 184, 236, 23, 0, 56, 239, 23, 0, 184, 241, 23, 0, 56, 244, 23, 0, 184, 246, 23, 0, 56, 249, 23, 0, 184, 251, 23, 0, 56, 254, 23, 0, 184, 0, 24, 0, 56, 3, 24, 0, 184, 5, 24, 0, 56, 8, 24, 0, 184, 10, 24, 0, 56, 13, 24, 0, 184, 15, 24, 0, 56, 18, 24, 0, 184, 20, 24, 0, 56, 23, 24, 0, 184, 25, 24, 0, 56, 28, 24, 0, 184, 30, 24, 0, 56, 33, 24, 0, 184, 35, 24, 0, 56, 38, 24, 0, 184, 40, 24, 0, 56, 43, 24, 0, 184, 45, 24, 0, 56, 48, 24, 0, 184, 50, 24, 0, 56, 53, 24, 0, 184, 55, 24, 0, 56, 58, 24, 0, 184, 60, 24, 0, 56, 63, 24, 0, 184, 65, 24, 0, 56, 68, 24, 0, 184, 70, 24, 0, 56, 73, 24, 0, 184, 75, 24, 0, 56, 78, 24, 0, 184, 80, 24, 0, 56, 83, 24, 0, 184, 85, 24, 0, 56, 88, 24, 0, 184, 90, 24, 0, 56, 93, 24, 0, 184, 95, 24, 0, 56, 98, 24, 0, 184, 100, 24, 0, 56, 103, 24, 0, 184, 105, 24, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_interval_same_channel.json b/tests/recordings/logic_analyzer/test_measure_interval_same_channel.json deleted file mode 100644 index cddd6c45..00000000 --- a/tests/recordings/logic_analyzer/test_measure_interval_same_channel.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [2], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 61, 1, 0, 0, 124, 2, 0, 0, 189, 3, 0, 0, 252, 4, 0, 0, 61, 6, 0, 0, 124, 7, 0, 0, 189, 8, 0, 0, 252, 9, 0, 0, 61, 11, 0, 0, 124, 12, 0, 0, 189, 13, 0, 0, 252, 14, 0, 0, 61, 16, 0, 0, 124, 17, 0, 0, 189, 18, 0, 0, 252, 19, 0, 0, 61, 21, 0, 0, 124, 22, 0, 0, 189, 23, 0, 0, 252, 24, 0, 0, 61, 26, 0, 0, 124, 27, 0, 0, 189, 28, 0, 0, 252, 29, 0, 0, 61, 31, 0, 0, 124, 32, 0, 0, 189, 33, 0, 0, 252, 34, 0, 0, 61, 36, 0, 0, 124, 37, 0, 0, 189, 38, 0, 0, 252, 39, 0, 0, 61, 41, 0, 0, 124, 42, 0, 0, 189, 43, 0, 0, 252, 44, 0, 0, 61, 46, 0, 0, 124, 47, 0, 0, 189, 48, 0, 0, 252, 49, 0, 0, 61, 51, 0, 0, 124, 52, 0, 0, 189, 53, 0, 0, 252, 54, 0, 0, 61, 56, 0, 0, 124, 57, 0, 0, 189, 58, 0, 0, 252, 59, 0, 0, 61, 61, 0, 0, 124, 62, 0, 0, 189, 63, 0, 0, 252, 64, 0, 0, 61, 66, 0, 0, 124, 67, 0, 0, 189, 68, 0, 0, 252, 69, 0, 0, 61, 71, 0, 0, 124, 72, 0, 0, 189, 73, 0, 0, 252, 74, 0, 0, 61, 76, 0, 0, 124, 77, 0, 0, 189, 78, 0, 0, 252, 79, 0, 0, 61, 81, 0, 0, 124, 82, 0, 0, 189, 83, 0, 0, 252, 84, 0, 0, 61, 86, 0, 0, 124, 87, 0, 0, 189, 88, 0, 0, 252, 89, 0, 0, 61, 91, 0, 0, 124, 92, 0, 0, 189, 93, 0, 0, 252, 94, 0, 0, 61, 96, 0, 0, 124, 97, 0, 0, 189, 98, 0, 0, 252, 99, 0, 0, 61, 101, 0, 0, 124, 102, 0, 0, 189, 103, 0, 0, 252, 104, 0, 0, 61, 106, 0, 0, 124, 107, 0, 0, 189, 108, 0, 0, 252, 109, 0, 0, 61, 111, 0, 0, 124, 112, 0, 0, 189, 113, 0, 0, 252, 114, 0, 0, 61, 116, 0, 0, 124, 117, 0, 0, 189, 118, 0, 0, 252, 119, 0, 0, 61, 121, 0, 0, 124, 122, 0, 0, 189, 123, 0, 0, 252, 124, 0, 0, 61, 126, 0, 0, 124, 127, 0, 0, 189, 128, 0, 0, 252, 129, 0, 0, 61, 131, 0, 0, 124, 132, 0, 0, 189, 133, 0, 0, 252, 134, 0, 0, 61, 136, 0, 0, 124, 137, 0, 0, 189, 138, 0, 0, 252, 139, 0, 0, 61, 141, 0, 0, 124, 142, 0, 0, 189, 143, 0, 0, 252, 144, 0, 0, 61, 146, 0, 0, 124, 147, 0, 0, 189, 148, 0, 0, 252, 149, 0, 0, 61, 151, 0, 0, 124, 152, 0, 0, 189, 153, 0, 0, 252, 154, 0, 0, 61, 156, 0, 0, 124, 157, 0, 0, 189, 158, 0, 0, 252, 159, 0, 0, 61, 161, 0, 0, 124, 162, 0, 0, 189, 163, 0, 0, 252, 164, 0, 0, 61, 166, 0, 0, 124, 167, 0, 0, 189, 168, 0, 0, 252, 169, 0, 0, 61, 171, 0, 0, 124, 172, 0, 0, 189, 173, 0, 0, 252, 174, 0, 0, 61, 176, 0, 0, 124, 177, 0, 0, 189, 178, 0, 0, 252, 179, 0, 0, 61, 181, 0, 0, 124, 182, 0, 0, 189, 183, 0, 0, 252, 184, 0, 0, 61, 186, 0, 0, 124, 187, 0, 0, 189, 188, 0, 0, 252, 189, 0, 0, 61, 191, 0, 0, 124, 192, 0, 0, 189, 193, 0, 0, 252, 194, 0, 0, 61, 196, 0, 0, 124, 197, 0, 0, 189, 198, 0, 0, 252, 199, 0, 0, 61, 201, 0, 0, 124, 202, 0, 0, 189, 203, 0, 0, 252, 204, 0, 0, 61, 206, 0, 0, 124, 207, 0, 0, 189, 208, 0, 0, 252, 209, 0, 0, 61, 211, 0, 0, 124, 212, 0, 0, 189, 213, 0, 0, 252, 214, 0, 0, 61, 216, 0, 0, 124, 217, 0, 0, 189, 218, 0, 0, 252, 219, 0, 0, 61, 221, 0, 0, 124, 222, 0, 0, 189, 223, 0, 0, 252, 224, 0, 0, 61, 226, 0, 0, 124, 227, 0, 0, 189, 228, 0, 0, 252, 229, 0, 0, 61, 231, 0, 0, 124, 232, 0, 0, 189, 233, 0, 0, 252, 234, 0, 0, 61, 236, 0, 0, 124, 237, 0, 0, 189, 238, 0, 0, 252, 239, 0, 0, 61, 241, 0, 0, 124, 242, 0, 0, 189, 243, 0, 0, 252, 244, 0, 0, 61, 246, 0, 0, 124, 247, 0, 0, 189, 248, 0, 0, 252, 249, 0, 0, 61, 251, 0, 0, 124, 252, 0, 0, 189, 253, 0, 0, 252, 254, 0, 0, 61, 0, 1, 0, 124, 1, 1, 0, 189, 2, 1, 0, 252, 3, 1, 0, 61, 5, 1, 0, 124, 6, 1, 0, 189, 7, 1, 0, 252, 8, 1, 0, 61, 10, 1, 0, 124, 11, 1, 0, 189, 12, 1, 0, 252, 13, 1, 0, 61, 15, 1, 0, 124, 16, 1, 0, 189, 17, 1, 0, 252, 18, 1, 0, 61, 20, 1, 0, 124, 21, 1, 0, 189, 22, 1, 0, 252, 23, 1, 0, 61, 25, 1, 0, 124, 26, 1, 0, 189, 27, 1, 0, 252, 28, 1, 0, 61, 30, 1, 0, 124, 31, 1, 0, 189, 32, 1, 0, 252, 33, 1, 0, 61, 35, 1, 0, 124, 36, 1, 0, 189, 37, 1, 0, 252, 38, 1, 0, 61, 40, 1, 0, 124, 41, 1, 0, 189, 42, 1, 0, 252, 43, 1, 0, 61, 45, 1, 0, 124, 46, 1, 0, 189, 47, 1, 0, 252, 48, 1, 0, 61, 50, 1, 0, 124, 51, 1, 0, 189, 52, 1, 0, 252, 53, 1, 0, 61, 55, 1, 0, 124, 56, 1, 0, 189, 57, 1, 0, 252, 58, 1, 0, 61, 60, 1, 0, 124, 61, 1, 0, 189, 62, 1, 0, 252, 63, 1, 0, 61, 65, 1, 0, 124, 66, 1, 0, 189, 67, 1, 0, 252, 68, 1, 0, 61, 70, 1, 0, 124, 71, 1, 0, 189, 72, 1, 0, 252, 73, 1, 0, 61, 75, 1, 0, 124, 76, 1, 0, 189, 77, 1, 0, 252, 78, 1, 0, 61, 80, 1, 0, 124, 81, 1, 0, 189, 82, 1, 0, 252, 83, 1, 0, 61, 85, 1, 0, 124, 86, 1, 0, 189, 87, 1, 0, 252, 88, 1, 0, 61, 90, 1, 0, 124, 91, 1, 0, 189, 92, 1, 0, 252, 93, 1, 0, 61, 95, 1, 0, 124, 96, 1, 0, 189, 97, 1, 0, 252, 98, 1, 0, 61, 100, 1, 0, 124, 101, 1, 0, 189, 102, 1, 0, 252, 103, 1, 0, 61, 105, 1, 0, 124, 106, 1, 0, 189, 107, 1, 0, 252, 108, 1, 0, 61, 110, 1, 0, 124, 111, 1, 0, 189, 112, 1, 0, 252, 113, 1, 0, 61, 115, 1, 0, 124, 116, 1, 0, 189, 117, 1, 0, 252, 118, 1, 0, 61, 120, 1, 0, 124, 121, 1, 0, 189, 122, 1, 0, 252, 123, 1, 0, 61, 125, 1, 0, 124, 126, 1, 0, 189, 127, 1, 0, 252, 128, 1, 0, 61, 130, 1, 0, 124, 131, 1, 0, 189, 132, 1, 0, 252, 133, 1, 0, 61, 135, 1, 0, 124, 136, 1, 0, 189, 137, 1, 0, 252, 138, 1, 0, 61, 140, 1, 0, 124, 141, 1, 0, 189, 142, 1, 0, 252, 143, 1, 0, 61, 145, 1, 0, 124, 146, 1, 0, 189, 147, 1, 0, 252, 148, 1, 0, 61, 150, 1, 0, 124, 151, 1, 0, 189, 152, 1, 0, 252, 153, 1, 0, 61, 155, 1, 0, 124, 156, 1, 0, 189, 157, 1, 0, 252, 158, 1, 0, 61, 160, 1, 0, 124, 161, 1, 0, 189, 162, 1, 0, 252, 163, 1, 0, 61, 165, 1, 0, 124, 166, 1, 0, 189, 167, 1, 0, 252, 168, 1, 0, 61, 170, 1, 0, 124, 171, 1, 0, 189, 172, 1, 0, 252, 173, 1, 0, 61, 175, 1, 0, 124, 176, 1, 0, 189, 177, 1, 0, 252, 178, 1, 0, 61, 180, 1, 0, 124, 181, 1, 0, 189, 182, 1, 0, 252, 183, 1, 0, 61, 185, 1, 0, 124, 186, 1, 0, 189, 187, 1, 0, 252, 188, 1, 0, 61, 190, 1, 0, 124, 191, 1, 0, 189, 192, 1, 0, 252, 193, 1, 0, 61, 195, 1, 0, 124, 196, 1, 0, 189, 197, 1, 0, 252, 198, 1, 0, 61, 200, 1, 0, 124, 201, 1, 0, 189, 202, 1, 0, 252, 203, 1, 0, 61, 205, 1, 0, 124, 206, 1, 0, 189, 207, 1, 0, 252, 208, 1, 0, 61, 210, 1, 0, 124, 211, 1, 0, 189, 212, 1, 0, 252, 213, 1, 0, 61, 215, 1, 0, 124, 216, 1, 0, 189, 217, 1, 0, 252, 218, 1, 0, 61, 220, 1, 0, 124, 221, 1, 0, 189, 222, 1, 0, 252, 223, 1, 0, 61, 225, 1, 0, 124, 226, 1, 0, 189, 227, 1, 0, 252, 228, 1, 0, 61, 230, 1, 0, 124, 231, 1, 0, 189, 232, 1, 0, 252, 233, 1, 0, 61, 235, 1, 0, 124, 236, 1, 0, 189, 237, 1, 0, 252, 238, 1, 0, 61, 240, 1, 0, 124, 241, 1, 0, 189, 242, 1, 0, 252, 243, 1, 0, 61, 245, 1, 0, 124, 246, 1, 0, 189, 247, 1, 0, 252, 248, 1, 0, 61, 250, 1, 0, 124, 251, 1, 0, 189, 252, 1, 0, 252, 253, 1, 0, 61, 255, 1, 0, 124, 0, 2, 0, 189, 1, 2, 0, 252, 2, 2, 0, 61, 4, 2, 0, 124, 5, 2, 0, 189, 6, 2, 0, 252, 7, 2, 0, 61, 9, 2, 0, 124, 10, 2, 0, 189, 11, 2, 0, 252, 12, 2, 0, 61, 14, 2, 0, 124, 15, 2, 0, 189, 16, 2, 0, 252, 17, 2, 0, 61, 19, 2, 0, 124, 20, 2, 0, 189, 21, 2, 0, 252, 22, 2, 0, 61, 24, 2, 0, 124, 25, 2, 0, 189, 26, 2, 0, 252, 27, 2, 0, 61, 29, 2, 0, 124, 30, 2, 0, 189, 31, 2, 0, 252, 32, 2, 0, 61, 34, 2, 0, 124, 35, 2, 0, 189, 36, 2, 0, 252, 37, 2, 0, 61, 39, 2, 0, 124, 40, 2, 0, 189, 41, 2, 0, 252, 42, 2, 0, 61, 44, 2, 0, 124, 45, 2, 0, 189, 46, 2, 0, 252, 47, 2, 0, 61, 49, 2, 0, 124, 50, 2, 0, 189, 51, 2, 0, 252, 52, 2, 0, 61, 54, 2, 0, 124, 55, 2, 0, 189, 56, 2, 0, 252, 57, 2, 0, 61, 59, 2, 0, 124, 60, 2, 0, 189, 61, 2, 0, 252, 62, 2, 0, 61, 64, 2, 0, 124, 65, 2, 0, 189, 66, 2, 0, 252, 67, 2, 0, 61, 69, 2, 0, 124, 70, 2, 0, 189, 71, 2, 0, 252, 72, 2, 0, 61, 74, 2, 0, 124, 75, 2, 0, 189, 76, 2, 0, 252, 77, 2, 0, 61, 79, 2, 0, 124, 80, 2, 0, 189, 81, 2, 0, 252, 82, 2, 0, 61, 84, 2, 0, 124, 85, 2, 0, 189, 86, 2, 0, 252, 87, 2, 0, 61, 89, 2, 0, 124, 90, 2, 0, 189, 91, 2, 0, 252, 92, 2, 0, 61, 94, 2, 0, 124, 95, 2, 0, 189, 96, 2, 0, 252, 97, 2, 0, 61, 99, 2, 0, 124, 100, 2, 0, 189, 101, 2, 0, 252, 102, 2, 0, 61, 104, 2, 0, 124, 105, 2, 0, 189, 106, 2, 0, 252, 107, 2, 0, 61, 109, 2, 0, 124, 110, 2, 0, 189, 111, 2, 0, 252, 112, 2, 0, 61, 114, 2, 0, 124, 115, 2, 0, 189, 116, 2, 0, 252, 117, 2, 0, 61, 119, 2, 0, 124, 120, 2, 0, 189, 121, 2, 0, 252, 122, 2, 0, 61, 124, 2, 0, 124, 125, 2, 0, 189, 126, 2, 0, 252, 127, 2, 0, 61, 129, 2, 0, 124, 130, 2, 0, 189, 131, 2, 0, 252, 132, 2, 0, 61, 134, 2, 0, 124, 135, 2, 0, 189, 136, 2, 0, 252, 137, 2, 0, 61, 139, 2, 0, 124, 140, 2, 0, 189, 141, 2, 0, 252, 142, 2, 0, 61, 144, 2, 0, 124, 145, 2, 0, 189, 146, 2, 0, 252, 147, 2, 0, 61, 149, 2, 0, 124, 150, 2, 0, 189, 151, 2, 0, 252, 152, 2, 0, 61, 154, 2, 0, 124, 155, 2, 0, 189, 156, 2, 0, 252, 157, 2, 0, 61, 159, 2, 0, 124, 160, 2, 0, 189, 161, 2, 0, 252, 162, 2, 0, 61, 164, 2, 0, 124, 165, 2, 0, 189, 166, 2, 0, 252, 167, 2, 0, 61, 169, 2, 0, 124, 170, 2, 0, 189, 171, 2, 0, 252, 172, 2, 0, 61, 174, 2, 0, 124, 175, 2, 0, 189, 176, 2, 0, 252, 177, 2, 0, 61, 179, 2, 0, 124, 180, 2, 0, 189, 181, 2, 0, 252, 182, 2, 0, 61, 184, 2, 0, 124, 185, 2, 0, 189, 186, 2, 0, 252, 187, 2, 0, 61, 189, 2, 0, 124, 190, 2, 0, 189, 191, 2, 0, 252, 192, 2, 0, 61, 194, 2, 0, 124, 195, 2, 0, 189, 196, 2, 0, 252, 197, 2, 0, 61, 199, 2, 0, 124, 200, 2, 0, 189, 201, 2, 0, 252, 202, 2, 0, 61, 204, 2, 0, 124, 205, 2, 0, 189, 206, 2, 0, 252, 207, 2, 0, 61, 209, 2, 0, 124, 210, 2, 0, 189, 211, 2, 0, 252, 212, 2, 0, 61, 214, 2, 0, 124, 215, 2, 0, 189, 216, 2, 0, 252, 217, 2, 0, 61, 219, 2, 0, 124, 220, 2, 0, 189, 221, 2, 0, 252, 222, 2, 0, 61, 224, 2, 0, 124, 225, 2, 0, 189, 226, 2, 0, 252, 227, 2, 0, 61, 229, 2, 0, 124, 230, 2, 0, 189, 231, 2, 0, 252, 232, 2, 0, 61, 234, 2, 0, 124, 235, 2, 0, 189, 236, 2, 0, 252, 237, 2, 0, 61, 239, 2, 0, 124, 240, 2, 0, 189, 241, 2, 0, 252, 242, 2, 0, 61, 244, 2, 0, 124, 245, 2, 0, 189, 246, 2, 0, 252, 247, 2, 0, 61, 249, 2, 0, 124, 250, 2, 0, 189, 251, 2, 0, 252, 252, 2, 0, 61, 254, 2, 0, 124, 255, 2, 0, 189, 0, 3, 0, 252, 1, 3, 0, 61, 3, 3, 0, 124, 4, 3, 0, 189, 5, 3, 0, 252, 6, 3, 0, 61, 8, 3, 0, 124, 9, 3, 0, 189, 10, 3, 0, 252, 11, 3, 0, 61, 13, 3, 0, 124, 14, 3, 0, 189, 15, 3, 0, 252, 16, 3, 0, 61, 18, 3, 0, 124, 19, 3, 0, 189, 20, 3, 0, 252, 21, 3, 0, 61, 23, 3, 0, 124, 24, 3, 0, 189, 25, 3, 0, 252, 26, 3, 0, 61, 28, 3, 0, 124, 29, 3, 0, 189, 30, 3, 0, 252, 31, 3, 0, 61, 33, 3, 0, 124, 34, 3, 0, 189, 35, 3, 0, 252, 36, 3, 0, 61, 38, 3, 0, 124, 39, 3, 0, 189, 40, 3, 0, 252, 41, 3, 0, 61, 43, 3, 0, 124, 44, 3, 0, 189, 45, 3, 0, 252, 46, 3, 0, 61, 48, 3, 0, 124, 49, 3, 0, 189, 50, 3, 0, 252, 51, 3, 0, 61, 53, 3, 0, 124, 54, 3, 0, 189, 55, 3, 0, 252, 56, 3, 0, 61, 58, 3, 0, 124, 59, 3, 0, 189, 60, 3, 0, 252, 61, 3, 0, 61, 63, 3, 0, 124, 64, 3, 0, 189, 65, 3, 0, 252, 66, 3, 0, 61, 68, 3, 0, 124, 69, 3, 0, 189, 70, 3, 0, 252, 71, 3, 0, 61, 73, 3, 0, 124, 74, 3, 0, 189, 75, 3, 0, 252, 76, 3, 0, 61, 78, 3, 0, 124, 79, 3, 0, 189, 80, 3, 0, 252, 81, 3, 0, 61, 83, 3, 0, 124, 84, 3, 0, 189, 85, 3, 0, 252, 86, 3, 0, 61, 88, 3, 0, 124, 89, 3, 0, 189, 90, 3, 0, 252, 91, 3, 0, 61, 93, 3, 0, 124, 94, 3, 0, 189, 95, 3, 0, 252, 96, 3, 0, 61, 98, 3, 0, 124, 99, 3, 0, 189, 100, 3, 0, 252, 101, 3, 0, 61, 103, 3, 0, 124, 104, 3, 0, 189, 105, 3, 0, 252, 106, 3, 0, 61, 108, 3, 0, 124, 109, 3, 0, 189, 110, 3, 0, 252, 111, 3, 0, 61, 113, 3, 0, 124, 114, 3, 0, 189, 115, 3, 0, 252, 116, 3, 0, 61, 118, 3, 0, 124, 119, 3, 0, 189, 120, 3, 0, 252, 121, 3, 0, 61, 123, 3, 0, 124, 124, 3, 0, 189, 125, 3, 0, 252, 126, 3, 0, 61, 128, 3, 0, 124, 129, 3, 0, 189, 130, 3, 0, 252, 131, 3, 0, 61, 133, 3, 0, 124, 134, 3, 0, 189, 135, 3, 0, 252, 136, 3, 0, 61, 138, 3, 0, 124, 139, 3, 0, 189, 140, 3, 0, 252, 141, 3, 0, 61, 143, 3, 0, 124, 144, 3, 0, 189, 145, 3, 0, 252, 146, 3, 0, 61, 148, 3, 0, 124, 149, 3, 0, 189, 150, 3, 0, 252, 151, 3, 0, 61, 153, 3, 0, 124, 154, 3, 0, 189, 155, 3, 0, 252, 156, 3, 0, 61, 158, 3, 0, 124, 159, 3, 0, 189, 160, 3, 0, 252, 161, 3, 0, 61, 163, 3, 0, 124, 164, 3, 0, 189, 165, 3, 0, 252, 166, 3, 0, 61, 168, 3, 0, 124, 169, 3, 0, 189, 170, 3, 0, 252, 171, 3, 0, 61, 173, 3, 0, 124, 174, 3, 0, 189, 175, 3, 0, 252, 176, 3, 0, 61, 178, 3, 0, 124, 179, 3, 0, 189, 180, 3, 0, 252, 181, 3, 0, 61, 183, 3, 0, 124, 184, 3, 0, 189, 185, 3, 0, 252, 186, 3, 0, 61, 188, 3, 0, 124, 189, 3, 0, 189, 190, 3, 0, 252, 191, 3, 0, 61, 193, 3, 0, 124, 194, 3, 0, 189, 195, 3, 0, 252, 196, 3, 0, 61, 198, 3, 0, 124, 199, 3, 0, 189, 200, 3, 0, 252, 201, 3, 0, 61, 203, 3, 0, 124, 204, 3, 0, 189, 205, 3, 0, 252, 206, 3, 0, 61, 208, 3, 0, 124, 209, 3, 0, 189, 210, 3, 0, 252, 211, 3, 0, 61, 213, 3, 0, 124, 214, 3, 0, 189, 215, 3, 0, 252, 216, 3, 0, 61, 218, 3, 0, 124, 219, 3, 0, 189, 220, 3, 0, 252, 221, 3, 0, 61, 223, 3, 0, 124, 224, 3, 0, 189, 225, 3, 0, 252, 226, 3, 0, 61, 228, 3, 0, 124, 229, 3, 0, 189, 230, 3, 0, 252, 231, 3, 0, 61, 233, 3, 0, 124, 234, 3, 0, 189, 235, 3, 0, 252, 236, 3, 0, 61, 238, 3, 0, 124, 239, 3, 0, 189, 240, 3, 0, 252, 241, 3, 0, 61, 243, 3, 0, 124, 244, 3, 0, 189, 245, 3, 0, 252, 246, 3, 0, 61, 248, 3, 0, 124, 249, 3, 0, 189, 250, 3, 0, 252, 251, 3, 0, 61, 253, 3, 0, 124, 254, 3, 0, 189, 255, 3, 0, 252, 0, 4, 0, 61, 2, 4, 0, 124, 3, 4, 0, 189, 4, 4, 0, 252, 5, 4, 0, 61, 7, 4, 0, 124, 8, 4, 0, 189, 9, 4, 0, 252, 10, 4, 0, 61, 12, 4, 0, 124, 13, 4, 0, 189, 14, 4, 0, 252, 15, 4, 0, 61, 17, 4, 0, 124, 18, 4, 0, 189, 19, 4, 0, 252, 20, 4, 0, 61, 22, 4, 0, 124, 23, 4, 0, 189, 24, 4, 0, 252, 25, 4, 0, 61, 27, 4, 0, 124, 28, 4, 0, 189, 29, 4, 0, 252, 30, 4, 0, 61, 32, 4, 0, 124, 33, 4, 0, 189, 34, 4, 0, 252, 35, 4, 0, 61, 37, 4, 0, 124, 38, 4, 0, 189, 39, 4, 0, 252, 40, 4, 0, 61, 42, 4, 0, 124, 43, 4, 0, 189, 44, 4, 0, 252, 45, 4, 0, 61, 47, 4, 0, 124, 48, 4, 0, 189, 49, 4, 0, 252, 50, 4, 0, 61, 52, 4, 0, 124, 53, 4, 0, 189, 54, 4, 0, 252, 55, 4, 0, 61, 57, 4, 0, 124, 58, 4, 0, 189, 59, 4, 0, 252, 60, 4, 0, 61, 62, 4, 0, 124, 63, 4, 0, 189, 64, 4, 0, 252, 65, 4, 0, 61, 67, 4, 0, 124, 68, 4, 0, 189, 69, 4, 0, 252, 70, 4, 0, 61, 72, 4, 0, 124, 73, 4, 0, 189, 74, 4, 0, 252, 75, 4, 0, 61, 77, 4, 0, 124, 78, 4, 0, 189, 79, 4, 0, 252, 80, 4, 0, 61, 82, 4, 0, 124, 83, 4, 0, 189, 84, 4, 0, 252, 85, 4, 0, 61, 87, 4, 0, 124, 88, 4, 0, 189, 89, 4, 0, 252, 90, 4, 0, 61, 92, 4, 0, 124, 93, 4, 0, 189, 94, 4, 0, 252, 95, 4, 0, 61, 97, 4, 0, 124, 98, 4, 0, 189, 99, 4, 0, 252, 100, 4, 0, 61, 102, 4, 0, 124, 103, 4, 0, 189, 104, 4, 0, 252, 105, 4, 0, 61, 107, 4, 0, 124, 108, 4, 0, 189, 109, 4, 0, 252, 110, 4, 0, 61, 112, 4, 0, 124, 113, 4, 0, 189, 114, 4, 0, 252, 115, 4, 0, 61, 117, 4, 0, 124, 118, 4, 0, 189, 119, 4, 0, 252, 120, 4, 0, 61, 122, 4, 0, 124, 123, 4, 0, 189, 124, 4, 0, 252, 125, 4, 0, 61, 127, 4, 0, 124, 128, 4, 0, 189, 129, 4, 0, 252, 130, 4, 0, 61, 132, 4, 0, 124, 133, 4, 0, 189, 134, 4, 0, 252, 135, 4, 0, 61, 137, 4, 0, 124, 138, 4, 0, 189, 139, 4, 0, 252, 140, 4, 0, 61, 142, 4, 0, 124, 143, 4, 0, 189, 144, 4, 0, 252, 145, 4, 0, 61, 147, 4, 0, 124, 148, 4, 0, 189, 149, 4, 0, 252, 150, 4, 0, 61, 152, 4, 0, 124, 153, 4, 0, 189, 154, 4, 0, 252, 155, 4, 0, 61, 157, 4, 0, 124, 158, 4, 0, 189, 159, 4, 0, 252, 160, 4, 0, 61, 162, 4, 0, 124, 163, 4, 0, 189, 164, 4, 0, 252, 165, 4, 0, 61, 167, 4, 0, 124, 168, 4, 0, 189, 169, 4, 0, 252, 170, 4, 0, 61, 172, 4, 0, 124, 173, 4, 0, 189, 174, 4, 0, 252, 175, 4, 0, 61, 177, 4, 0, 124, 178, 4, 0, 189, 179, 4, 0, 252, 180, 4, 0, 61, 182, 4, 0, 124, 183, 4, 0, 189, 184, 4, 0, 252, 185, 4, 0, 61, 187, 4, 0, 124, 188, 4, 0, 189, 189, 4, 0, 252, 190, 4, 0, 61, 192, 4, 0, 124, 193, 4, 0, 189, 194, 4, 0, 252, 195, 4, 0, 61, 197, 4, 0, 124, 198, 4, 0, 189, 199, 4, 0, 252, 200, 4, 0, 61, 202, 4, 0, 124, 203, 4, 0, 189, 204, 4, 0, 252, 205, 4, 0, 61, 207, 4, 0, 124, 208, 4, 0, 189, 209, 4, 0, 252, 210, 4, 0, 61, 212, 4, 0, 124, 213, 4, 0, 189, 214, 4, 0, 252, 215, 4, 0, 61, 217, 4, 0, 124, 218, 4, 0, 189, 219, 4, 0, 252, 220, 4, 0, 61, 222, 4, 0, 124, 223, 4, 0, 189, 224, 4, 0, 252, 225, 4, 0, 61, 227, 4, 0, 124, 228, 4, 0, 189, 229, 4, 0, 252, 230, 4, 0, 61, 232, 4, 0, 124, 233, 4, 0, 189, 234, 4, 0, 252, 235, 4, 0, 61, 237, 4, 0, 124, 238, 4, 0, 189, 239, 4, 0, 252, 240, 4, 0, 61, 242, 4, 0, 124, 243, 4, 0, 189, 244, 4, 0, 252, 245, 4, 0, 61, 247, 4, 0, 124, 248, 4, 0, 189, 249, 4, 0, 252, 250, 4, 0, 61, 252, 4, 0, 124, 253, 4, 0, 189, 254, 4, 0, 252, 255, 4, 0, 61, 1, 5, 0, 124, 2, 5, 0, 189, 3, 5, 0, 252, 4, 5, 0, 61, 6, 5, 0, 124, 7, 5, 0, 189, 8, 5, 0, 252, 9, 5, 0, 61, 11, 5, 0, 124, 12, 5, 0, 189, 13, 5, 0, 252, 14, 5, 0, 61, 16, 5, 0, 124, 17, 5, 0, 189, 18, 5, 0, 252, 19, 5, 0, 61, 21, 5, 0, 124, 22, 5, 0, 189, 23, 5, 0, 252, 24, 5, 0, 61, 26, 5, 0, 124, 27, 5, 0, 189, 28, 5, 0, 252, 29, 5, 0, 61, 31, 5, 0, 124, 32, 5, 0, 189, 33, 5, 0, 252, 34, 5, 0, 61, 36, 5, 0, 124, 37, 5, 0, 189, 38, 5, 0, 252, 39, 5, 0, 61, 41, 5, 0, 124, 42, 5, 0, 189, 43, 5, 0, 252, 44, 5, 0, 61, 46, 5, 0, 124, 47, 5, 0, 189, 48, 5, 0, 252, 49, 5, 0, 61, 51, 5, 0, 124, 52, 5, 0, 189, 53, 5, 0, 252, 54, 5, 0, 61, 56, 5, 0, 124, 57, 5, 0, 189, 58, 5, 0, 252, 59, 5, 0, 61, 61, 5, 0, 124, 62, 5, 0, 189, 63, 5, 0, 252, 64, 5, 0, 61, 66, 5, 0, 124, 67, 5, 0, 189, 68, 5, 0, 252, 69, 5, 0, 61, 71, 5, 0, 124, 72, 5, 0, 189, 73, 5, 0, 252, 74, 5, 0, 61, 76, 5, 0, 124, 77, 5, 0, 189, 78, 5, 0, 252, 79, 5, 0, 61, 81, 5, 0, 124, 82, 5, 0, 189, 83, 5, 0, 252, 84, 5, 0, 61, 86, 5, 0, 124, 87, 5, 0, 189, 88, 5, 0, 252, 89, 5, 0, 61, 91, 5, 0, 124, 92, 5, 0, 189, 93, 5, 0, 252, 94, 5, 0, 61, 96, 5, 0, 124, 97, 5, 0, 189, 98, 5, 0, 252, 99, 5, 0, 61, 101, 5, 0, 124, 102, 5, 0, 189, 103, 5, 0, 252, 104, 5, 0, 61, 106, 5, 0, 124, 107, 5, 0, 189, 108, 5, 0, 252, 109, 5, 0, 61, 111, 5, 0, 124, 112, 5, 0, 189, 113, 5, 0, 252, 114, 5, 0, 61, 116, 5, 0, 124, 117, 5, 0, 189, 118, 5, 0, 252, 119, 5, 0, 61, 121, 5, 0, 124, 122, 5, 0, 189, 123, 5, 0, 252, 124, 5, 0, 61, 126, 5, 0, 124, 127, 5, 0, 189, 128, 5, 0, 252, 129, 5, 0, 61, 131, 5, 0, 124, 132, 5, 0, 189, 133, 5, 0, 252, 134, 5, 0, 61, 136, 5, 0, 124, 137, 5, 0, 189, 138, 5, 0, 252, 139, 5, 0, 61, 141, 5, 0, 124, 142, 5, 0, 189, 143, 5, 0, 252, 144, 5, 0, 61, 146, 5, 0, 124, 147, 5, 0, 189, 148, 5, 0, 252, 149, 5, 0, 61, 151, 5, 0, 124, 152, 5, 0, 189, 153, 5, 0, 252, 154, 5, 0, 61, 156, 5, 0, 124, 157, 5, 0, 189, 158, 5, 0, 252, 159, 5, 0, 61, 161, 5, 0, 124, 162, 5, 0, 189, 163, 5, 0, 252, 164, 5, 0, 61, 166, 5, 0, 124, 167, 5, 0, 189, 168, 5, 0, 252, 169, 5, 0, 61, 171, 5, 0, 124, 172, 5, 0, 189, 173, 5, 0, 252, 174, 5, 0, 61, 176, 5, 0, 124, 177, 5, 0, 189, 178, 5, 0, 252, 179, 5, 0, 61, 181, 5, 0, 124, 182, 5, 0, 189, 183, 5, 0, 252, 184, 5, 0, 61, 186, 5, 0, 124, 187, 5, 0, 189, 188, 5, 0, 252, 189, 5, 0, 61, 191, 5, 0, 124, 192, 5, 0, 189, 193, 5, 0, 252, 194, 5, 0, 61, 196, 5, 0, 124, 197, 5, 0, 189, 198, 5, 0, 252, 199, 5, 0, 61, 201, 5, 0, 124, 202, 5, 0, 189, 203, 5, 0, 252, 204, 5, 0, 61, 206, 5, 0, 124, 207, 5, 0, 189, 208, 5, 0, 252, 209, 5, 0, 61, 211, 5, 0, 124, 212, 5, 0, 189, 213, 5, 0, 252, 214, 5, 0, 61, 216, 5, 0, 124, 217, 5, 0, 189, 218, 5, 0, 252, 219, 5, 0, 61, 221, 5, 0, 124, 222, 5, 0, 189, 223, 5, 0, 252, 224, 5, 0, 61, 226, 5, 0, 124, 227, 5, 0, 189, 228, 5, 0, 252, 229, 5, 0, 61, 231, 5, 0, 124, 232, 5, 0, 189, 233, 5, 0, 252, 234, 5, 0, 61, 236, 5, 0, 124, 237, 5, 0, 189, 238, 5, 0, 252, 239, 5, 0, 61, 241, 5, 0, 124, 242, 5, 0, 189, 243, 5, 0, 252, 244, 5, 0, 61, 246, 5, 0, 124, 247, 5, 0, 189, 248, 5, 0, 252, 249, 5, 0, 61, 251, 5, 0, 124, 252, 5, 0, 189, 253, 5, 0, 252, 254, 5, 0, 61, 0, 6, 0, 124, 1, 6, 0, 189, 2, 6, 0, 252, 3, 6, 0, 61, 5, 6, 0, 124, 6, 6, 0, 189, 7, 6, 0, 252, 8, 6, 0, 61, 10, 6, 0, 124, 11, 6, 0, 189, 12, 6, 0, 252, 13, 6, 0, 61, 15, 6, 0, 124, 16, 6, 0, 189, 17, 6, 0, 252, 18, 6, 0, 61, 20, 6, 0, 124, 21, 6, 0, 189, 22, 6, 0, 252, 23, 6, 0, 61, 25, 6, 0, 124, 26, 6, 0, 189, 27, 6, 0, 252, 28, 6, 0, 61, 30, 6, 0, 124, 31, 6, 0, 189, 32, 6, 0, 252, 33, 6, 0, 61, 35, 6, 0, 124, 36, 6, 0, 189, 37, 6, 0, 252, 38, 6, 0, 61, 40, 6, 0, 124, 41, 6, 0, 189, 42, 6, 0, 252, 43, 6, 0, 61, 45, 6, 0, 124, 46, 6, 0, 189, 47, 6, 0, 252, 48, 6, 0, 61, 50, 6, 0, 124, 51, 6, 0, 189, 52, 6, 0, 252, 53, 6, 0, 61, 55, 6, 0, 124, 56, 6, 0, 189, 57, 6, 0, 252, 58, 6, 0, 61, 60, 6, 0, 124, 61, 6, 0, 189, 62, 6, 0, 252, 63, 6, 0, 61, 65, 6, 0, 124, 66, 6, 0, 189, 67, 6, 0, 252, 68, 6, 0, 61, 70, 6, 0, 124, 71, 6, 0, 189, 72, 6, 0, 252, 73, 6, 0, 61, 75, 6, 0, 124, 76, 6, 0, 189, 77, 6, 0, 252, 78, 6, 0, 61, 80, 6, 0, 124, 81, 6, 0, 189, 82, 6, 0, 252, 83, 6, 0, 61, 85, 6, 0, 124, 86, 6, 0, 189, 87, 6, 0, 252, 88, 6, 0, 61, 90, 6, 0, 124, 91, 6, 0, 189, 92, 6, 0, 252, 93, 6, 0, 61, 95, 6, 0, 124, 96, 6, 0, 189, 97, 6, 0, 252, 98, 6, 0, 61, 100, 6, 0, 124, 101, 6, 0, 189, 102, 6, 0, 252, 103, 6, 0, 61, 105, 6, 0, 124, 106, 6, 0, 189, 107, 6, 0, 252, 108, 6, 0, 61, 110, 6, 0, 124, 111, 6, 0, 189, 112, 6, 0, 252, 113, 6, 0, 61, 115, 6, 0, 124, 116, 6, 0, 189, 117, 6, 0, 252, 118, 6, 0, 61, 120, 6, 0, 124, 121, 6, 0, 189, 122, 6, 0, 252, 123, 6, 0, 61, 125, 6, 0, 124, 126, 6, 0, 189, 127, 6, 0, 252, 128, 6, 0, 61, 130, 6, 0, 124, 131, 6, 0, 189, 132, 6, 0, 252, 133, 6, 0, 61, 135, 6, 0, 124, 136, 6, 0, 189, 137, 6, 0, 252, 138, 6, 0, 61, 140, 6, 0, 124, 141, 6, 0, 189, 142, 6, 0, 252, 143, 6, 0, 61, 145, 6, 0, 124, 146, 6, 0, 189, 147, 6, 0, 252, 148, 6, 0, 61, 150, 6, 0, 124, 151, 6, 0, 189, 152, 6, 0, 252, 153, 6, 0, 61, 155, 6, 0, 124, 156, 6, 0, 189, 157, 6, 0, 252, 158, 6, 0, 61, 160, 6, 0, 124, 161, 6, 0, 189, 162, 6, 0, 252, 163, 6, 0, 61, 165, 6, 0, 124, 166, 6, 0, 189, 167, 6, 0, 252, 168, 6, 0, 61, 170, 6, 0, 124, 171, 6, 0, 189, 172, 6, 0, 252, 173, 6, 0, 61, 175, 6, 0, 124, 176, 6, 0, 189, 177, 6, 0, 252, 178, 6, 0, 61, 180, 6, 0, 124, 181, 6, 0, 189, 182, 6, 0, 252, 183, 6, 0, 61, 185, 6, 0, 124, 186, 6, 0, 189, 187, 6, 0, 252, 188, 6, 0, 61, 190, 6, 0, 124, 191, 6, 0, 189, 192, 6, 0, 252, 193, 6, 0, 61, 195, 6, 0, 124, 196, 6, 0, 189, 197, 6, 0, 252, 198, 6, 0, 61, 200, 6, 0, 124, 201, 6, 0, 189, 202, 6, 0, 252, 203, 6, 0, 61, 205, 6, 0, 124, 206, 6, 0, 189, 207, 6, 0, 252, 208, 6, 0, 61, 210, 6, 0, 124, 211, 6, 0, 189, 212, 6, 0, 252, 213, 6, 0, 61, 215, 6, 0, 124, 216, 6, 0, 189, 217, 6, 0, 252, 218, 6, 0, 61, 220, 6, 0, 124, 221, 6, 0, 189, 222, 6, 0, 252, 223, 6, 0, 61, 225, 6, 0, 124, 226, 6, 0, 189, 227, 6, 0, 252, 228, 6, 0, 61, 230, 6, 0, 124, 231, 6, 0, 189, 232, 6, 0, 252, 233, 6, 0, 61, 235, 6, 0, 124, 236, 6, 0, 189, 237, 6, 0, 252, 238, 6, 0, 61, 240, 6, 0, 124, 241, 6, 0, 189, 242, 6, 0, 252, 243, 6, 0, 61, 245, 6, 0, 124, 246, 6, 0, 189, 247, 6, 0, 252, 248, 6, 0, 61, 250, 6, 0, 124, 251, 6, 0, 189, 252, 6, 0, 252, 253, 6, 0, 61, 255, 6, 0, 124, 0, 7, 0, 189, 1, 7, 0, 252, 2, 7, 0, 61, 4, 7, 0, 124, 5, 7, 0, 189, 6, 7, 0, 252, 7, 7, 0, 61, 9, 7, 0, 124, 10, 7, 0, 189, 11, 7, 0, 252, 12, 7, 0, 61, 14, 7, 0, 124, 15, 7, 0, 189, 16, 7, 0, 252, 17, 7, 0, 61, 19, 7, 0, 124, 20, 7, 0, 189, 21, 7, 0, 252, 22, 7, 0, 61, 24, 7, 0, 124, 25, 7, 0, 189, 26, 7, 0, 252, 27, 7, 0, 61, 29, 7, 0, 124, 30, 7, 0, 189, 31, 7, 0, 252, 32, 7, 0, 61, 34, 7, 0, 124, 35, 7, 0, 189, 36, 7, 0, 252, 37, 7, 0, 61, 39, 7, 0, 124, 40, 7, 0, 189, 41, 7, 0, 252, 42, 7, 0, 61, 44, 7, 0, 124, 45, 7, 0, 189, 46, 7, 0, 252, 47, 7, 0, 61, 49, 7, 0, 124, 50, 7, 0, 189, 51, 7, 0, 252, 52, 7, 0, 61, 54, 7, 0, 124, 55, 7, 0, 189, 56, 7, 0, 252, 57, 7, 0, 61, 59, 7, 0, 124, 60, 7, 0, 189, 61, 7, 0, 252, 62, 7, 0, 61, 64, 7, 0, 124, 65, 7, 0, 189, 66, 7, 0, 252, 67, 7, 0, 61, 69, 7, 0, 124, 70, 7, 0, 189, 71, 7, 0, 252, 72, 7, 0, 61, 74, 7, 0, 124, 75, 7, 0, 189, 76, 7, 0, 252, 77, 7, 0, 61, 79, 7, 0, 124, 80, 7, 0, 189, 81, 7, 0, 252, 82, 7, 0, 61, 84, 7, 0, 124, 85, 7, 0, 189, 86, 7, 0, 252, 87, 7, 0, 61, 89, 7, 0, 124, 90, 7, 0, 189, 91, 7, 0, 252, 92, 7, 0, 61, 94, 7, 0, 124, 95, 7, 0, 189, 96, 7, 0, 252, 97, 7, 0, 61, 99, 7, 0, 124, 100, 7, 0, 189, 101, 7, 0, 252, 102, 7, 0, 61, 104, 7, 0, 124, 105, 7, 0, 189, 106, 7, 0, 252, 107, 7, 0, 61, 109, 7, 0, 124, 110, 7, 0, 189, 111, 7, 0, 252, 112, 7, 0, 61, 114, 7, 0, 124, 115, 7, 0, 189, 116, 7, 0, 252, 117, 7, 0, 61, 119, 7, 0, 124, 120, 7, 0, 189, 121, 7, 0, 252, 122, 7, 0, 61, 124, 7, 0, 124, 125, 7, 0, 189, 126, 7, 0, 252, 127, 7, 0, 61, 129, 7, 0, 124, 130, 7, 0, 189, 131, 7, 0, 252, 132, 7, 0, 61, 134, 7, 0, 124, 135, 7, 0, 189, 136, 7, 0, 252, 137, 7, 0, 61, 139, 7, 0, 124, 140, 7, 0, 189, 141, 7, 0, 252, 142, 7, 0, 61, 144, 7, 0, 124, 145, 7, 0, 189, 146, 7, 0, 252, 147, 7, 0, 61, 149, 7, 0, 124, 150, 7, 0, 189, 151, 7, 0, 252, 152, 7, 0, 61, 154, 7, 0, 124, 155, 7, 0, 189, 156, 7, 0, 252, 157, 7, 0, 61, 159, 7, 0, 124, 160, 7, 0, 189, 161, 7, 0, 252, 162, 7, 0, 61, 164, 7, 0, 124, 165, 7, 0, 189, 166, 7, 0, 252, 167, 7, 0, 61, 169, 7, 0, 124, 170, 7, 0, 189, 171, 7, 0, 252, 172, 7, 0, 61, 174, 7, 0, 124, 175, 7, 0, 189, 176, 7, 0, 252, 177, 7, 0, 61, 179, 7, 0, 124, 180, 7, 0, 189, 181, 7, 0, 252, 182, 7, 0, 61, 184, 7, 0, 124, 185, 7, 0, 189, 186, 7, 0, 252, 187, 7, 0, 61, 189, 7, 0, 124, 190, 7, 0, 189, 191, 7, 0, 252, 192, 7, 0, 61, 194, 7, 0, 124, 195, 7, 0, 189, 196, 7, 0, 252, 197, 7, 0, 61, 199, 7, 0, 124, 200, 7, 0, 189, 201, 7, 0, 252, 202, 7, 0, 61, 204, 7, 0, 124, 205, 7, 0, 189, 206, 7, 0, 252, 207, 7, 0, 61, 209, 7, 0, 124, 210, 7, 0, 189, 211, 7, 0, 252, 212, 7, 0, 61, 214, 7, 0, 124, 215, 7, 0, 189, 216, 7, 0, 252, 217, 7, 0, 61, 219, 7, 0, 124, 220, 7, 0, 189, 221, 7, 0, 252, 222, 7, 0, 61, 224, 7, 0, 124, 225, 7, 0, 189, 226, 7, 0, 252, 227, 7, 0, 61, 229, 7, 0, 124, 230, 7, 0, 189, 231, 7, 0, 252, 232, 7, 0, 61, 234, 7, 0, 124, 235, 7, 0, 189, 236, 7, 0, 252, 237, 7, 0, 61, 239, 7, 0, 124, 240, 7, 0, 189, 241, 7, 0, 252, 242, 7, 0, 61, 244, 7, 0, 124, 245, 7, 0, 189, 246, 7, 0, 252, 247, 7, 0, 61, 249, 7, 0, 124, 250, 7, 0, 189, 251, 7, 0, 252, 252, 7, 0, 61, 254, 7, 0, 124, 255, 7, 0, 189, 0, 8, 0, 252, 1, 8, 0, 61, 3, 8, 0, 124, 4, 8, 0, 189, 5, 8, 0, 252, 6, 8, 0, 61, 8, 8, 0, 124, 9, 8, 0, 189, 10, 8, 0, 252, 11, 8, 0, 61, 13, 8, 0, 124, 14, 8, 0, 189, 15, 8, 0, 252, 16, 8, 0, 61, 18, 8, 0, 124, 19, 8, 0, 189, 20, 8, 0, 252, 21, 8, 0, 61, 23, 8, 0, 124, 24, 8, 0, 189, 25, 8, 0, 252, 26, 8, 0, 61, 28, 8, 0, 124, 29, 8, 0, 189, 30, 8, 0, 252, 31, 8, 0, 61, 33, 8, 0, 124, 34, 8, 0, 189, 35, 8, 0, 252, 36, 8, 0, 61, 38, 8, 0, 124, 39, 8, 0, 189, 40, 8, 0, 252, 41, 8, 0, 61, 43, 8, 0, 124, 44, 8, 0, 189, 45, 8, 0, 252, 46, 8, 0, 61, 48, 8, 0, 124, 49, 8, 0, 189, 50, 8, 0, 252, 51, 8, 0, 61, 53, 8, 0, 124, 54, 8, 0, 189, 55, 8, 0, 252, 56, 8, 0, 61, 58, 8, 0, 124, 59, 8, 0, 189, 60, 8, 0, 252, 61, 8, 0, 61, 63, 8, 0, 124, 64, 8, 0, 189, 65, 8, 0, 252, 66, 8, 0, 61, 68, 8, 0, 124, 69, 8, 0, 189, 70, 8, 0, 252, 71, 8, 0, 61, 73, 8, 0, 124, 74, 8, 0, 189, 75, 8, 0, 252, 76, 8, 0, 61, 78, 8, 0, 124, 79, 8, 0, 189, 80, 8, 0, 252, 81, 8, 0, 61, 83, 8, 0, 124, 84, 8, 0, 189, 85, 8, 0, 252, 86, 8, 0, 61, 88, 8, 0, 124, 89, 8, 0, 189, 90, 8, 0, 252, 91, 8, 0, 61, 93, 8, 0, 124, 94, 8, 0, 189, 95, 8, 0, 252, 96, 8, 0, 61, 98, 8, 0, 124, 99, 8, 0, 189, 100, 8, 0, 252, 101, 8, 0, 61, 103, 8, 0, 124, 104, 8, 0, 189, 105, 8, 0, 252, 106, 8, 0, 61, 108, 8, 0, 124, 109, 8, 0, 189, 110, 8, 0, 252, 111, 8, 0, 61, 113, 8, 0, 124, 114, 8, 0, 189, 115, 8, 0, 252, 116, 8, 0, 61, 118, 8, 0, 124, 119, 8, 0, 189, 120, 8, 0, 252, 121, 8, 0, 61, 123, 8, 0, 124, 124, 8, 0, 189, 125, 8, 0, 252, 126, 8, 0, 61, 128, 8, 0, 124, 129, 8, 0, 189, 130, 8, 0, 252, 131, 8, 0, 61, 133, 8, 0, 124, 134, 8, 0, 189, 135, 8, 0, 252, 136, 8, 0, 61, 138, 8, 0, 124, 139, 8, 0, 189, 140, 8, 0, 252, 141, 8, 0, 61, 143, 8, 0, 124, 144, 8, 0, 189, 145, 8, 0, 252, 146, 8, 0, 61, 148, 8, 0, 124, 149, 8, 0, 189, 150, 8, 0, 252, 151, 8, 0, 61, 153, 8, 0, 124, 154, 8, 0, 189, 155, 8, 0, 252, 156, 8, 0, 61, 158, 8, 0, 124, 159, 8, 0, 189, 160, 8, 0, 252, 161, 8, 0, 61, 163, 8, 0, 124, 164, 8, 0, 189, 165, 8, 0, 252, 166, 8, 0, 61, 168, 8, 0, 124, 169, 8, 0, 189, 170, 8, 0, 252, 171, 8, 0, 61, 173, 8, 0, 124, 174, 8, 0, 189, 175, 8, 0, 252, 176, 8, 0, 61, 178, 8, 0, 124, 179, 8, 0, 189, 180, 8, 0, 252, 181, 8, 0, 61, 183, 8, 0, 124, 184, 8, 0, 189, 185, 8, 0, 252, 186, 8, 0, 61, 188, 8, 0, 124, 189, 8, 0, 189, 190, 8, 0, 252, 191, 8, 0, 61, 193, 8, 0, 124, 194, 8, 0, 189, 195, 8, 0, 252, 196, 8, 0, 61, 198, 8, 0, 124, 199, 8, 0, 189, 200, 8, 0, 252, 201, 8, 0, 61, 203, 8, 0, 124, 204, 8, 0, 189, 205, 8, 0, 252, 206, 8, 0, 61, 208, 8, 0, 124, 209, 8, 0, 189, 210, 8, 0, 252, 211, 8, 0, 61, 213, 8, 0, 124, 214, 8, 0, 189, 215, 8, 0, 252, 216, 8, 0, 61, 218, 8, 0, 124, 219, 8, 0, 189, 220, 8, 0, 252, 221, 8, 0, 61, 223, 8, 0, 124, 224, 8, 0, 189, 225, 8, 0, 252, 226, 8, 0, 61, 228, 8, 0, 124, 229, 8, 0, 189, 230, 8, 0, 252, 231, 8, 0, 61, 233, 8, 0, 124, 234, 8, 0, 189, 235, 8, 0, 252, 236, 8, 0, 61, 238, 8, 0, 124, 239, 8, 0, 189, 240, 8, 0, 252, 241, 8, 0, 61, 243, 8, 0, 124, 244, 8, 0, 189, 245, 8, 0, 252, 246, 8, 0, 61, 248, 8, 0, 124, 249, 8, 0, 189, 250, 8, 0, 252, 251, 8, 0, 61, 253, 8, 0, 124, 254, 8, 0, 189, 255, 8, 0, 252, 0, 9, 0, 61, 2, 9, 0, 124, 3, 9, 0, 189, 4, 9, 0, 252, 5, 9, 0, 61, 7, 9, 0, 124, 8, 9, 0, 189, 9, 9, 0, 252, 10, 9, 0, 61, 12, 9, 0, 124, 13, 9, 0, 189, 14, 9, 0, 252, 15, 9, 0, 61, 17, 9, 0, 124, 18, 9, 0, 189, 19, 9, 0, 252, 20, 9, 0, 61, 22, 9, 0, 124, 23, 9, 0, 189, 24, 9, 0, 252, 25, 9, 0, 61, 27, 9, 0, 124, 28, 9, 0, 189, 29, 9, 0, 252, 30, 9, 0, 61, 32, 9, 0, 124, 33, 9, 0, 189, 34, 9, 0, 252, 35, 9, 0, 61, 37, 9, 0, 124, 38, 9, 0, 189, 39, 9, 0, 252, 40, 9, 0, 61, 42, 9, 0, 124, 43, 9, 0, 189, 44, 9, 0, 252, 45, 9, 0, 61, 47, 9, 0, 124, 48, 9, 0, 189, 49, 9, 0, 252, 50, 9, 0, 61, 52, 9, 0, 124, 53, 9, 0, 189, 54, 9, 0, 252, 55, 9, 0, 61, 57, 9, 0, 124, 58, 9, 0, 189, 59, 9, 0, 252, 60, 9, 0, 61, 62, 9, 0, 124, 63, 9, 0, 189, 64, 9, 0, 252, 65, 9, 0, 61, 67, 9, 0, 124, 68, 9, 0, 189, 69, 9, 0, 252, 70, 9, 0, 61, 72, 9, 0, 124, 73, 9, 0, 189, 74, 9, 0, 252, 75, 9, 0, 61, 77, 9, 0, 124, 78, 9, 0, 189, 79, 9, 0, 252, 80, 9, 0, 61, 82, 9, 0, 124, 83, 9, 0, 189, 84, 9, 0, 252, 85, 9, 0, 61, 87, 9, 0, 124, 88, 9, 0, 189, 89, 9, 0, 252, 90, 9, 0, 61, 92, 9, 0, 124, 93, 9, 0, 189, 94, 9, 0, 252, 95, 9, 0, 61, 97, 9, 0, 124, 98, 9, 0, 189, 99, 9, 0, 252, 100, 9, 0, 61, 102, 9, 0, 124, 103, 9, 0, 189, 104, 9, 0, 252, 105, 9, 0, 61, 107, 9, 0, 124, 108, 9, 0, 189, 109, 9, 0, 252, 110, 9, 0, 61, 112, 9, 0, 124, 113, 9, 0, 189, 114, 9, 0, 252, 115, 9, 0, 61, 117, 9, 0, 124, 118, 9, 0, 189, 119, 9, 0, 252, 120, 9, 0, 61, 122, 9, 0, 124, 123, 9, 0, 189, 124, 9, 0, 252, 125, 9, 0, 61, 127, 9, 0, 124, 128, 9, 0, 189, 129, 9, 0, 252, 130, 9, 0, 61, 132, 9, 0, 124, 133, 9, 0, 189, 134, 9, 0, 252, 135, 9, 0, 61, 137, 9, 0, 124, 138, 9, 0, 189, 139, 9, 0, 252, 140, 9, 0, 61, 142, 9, 0, 124, 143, 9, 0, 189, 144, 9, 0, 252, 145, 9, 0, 61, 147, 9, 0, 124, 148, 9, 0, 189, 149, 9, 0, 252, 150, 9, 0, 61, 152, 9, 0, 124, 153, 9, 0, 189, 154, 9, 0, 252, 155, 9, 0, 61, 157, 9, 0, 124, 158, 9, 0, 189, 159, 9, 0, 252, 160, 9, 0, 61, 162, 9, 0, 124, 163, 9, 0, 189, 164, 9, 0, 252, 165, 9, 0, 61, 167, 9, 0, 124, 168, 9, 0, 189, 169, 9, 0, 252, 170, 9, 0, 61, 172, 9, 0, 124, 173, 9, 0, 189, 174, 9, 0, 252, 175, 9, 0, 61, 177, 9, 0, 124, 178, 9, 0, 189, 179, 9, 0, 252, 180, 9, 0, 61, 182, 9, 0, 124, 183, 9, 0, 189, 184, 9, 0, 252, 185, 9, 0, 61, 187, 9, 0, 124, 188, 9, 0, 189, 189, 9, 0, 252, 190, 9, 0, 61, 192, 9, 0, 124, 193, 9, 0, 189, 194, 9, 0, 252, 195, 9, 0, 61, 197, 9, 0, 124, 198, 9, 0, 189, 199, 9, 0, 252, 200, 9, 0, 61, 202, 9, 0, 124, 203, 9, 0, 189, 204, 9, 0, 252, 205, 9, 0, 61, 207, 9, 0, 124, 208, 9, 0, 189, 209, 9, 0, 252, 210, 9, 0, 61, 212, 9, 0, 124, 213, 9, 0, 189, 214, 9, 0, 252, 215, 9, 0, 61, 217, 9, 0, 124, 218, 9, 0, 189, 219, 9, 0, 252, 220, 9, 0, 61, 222, 9, 0, 124, 223, 9, 0, 189, 224, 9, 0, 252, 225, 9, 0, 61, 227, 9, 0, 124, 228, 9, 0, 189, 229, 9, 0, 252, 230, 9, 0, 61, 232, 9, 0, 124, 233, 9, 0, 189, 234, 9, 0, 252, 235, 9, 0, 61, 237, 9, 0, 124, 238, 9, 0, 189, 239, 9, 0, 252, 240, 9, 0, 61, 242, 9, 0, 124, 243, 9, 0, 189, 244, 9, 0, 252, 245, 9, 0, 61, 247, 9, 0, 124, 248, 9, 0, 189, 249, 9, 0, 252, 250, 9, 0, 61, 252, 9, 0, 124, 253, 9, 0, 189, 254, 9, 0, 252, 255, 9, 0, 61, 1, 10, 0, 124, 2, 10, 0, 189, 3, 10, 0, 252, 4, 10, 0, 61, 6, 10, 0, 124, 7, 10, 0, 189, 8, 10, 0, 252, 9, 10, 0, 61, 11, 10, 0, 124, 12, 10, 0, 189, 13, 10, 0, 252, 14, 10, 0, 61, 16, 10, 0, 124, 17, 10, 0, 189, 18, 10, 0, 252, 19, 10, 0, 61, 21, 10, 0, 124, 22, 10, 0, 189, 23, 10, 0, 252, 24, 10, 0, 61, 26, 10, 0, 124, 27, 10, 0, 189, 28, 10, 0, 252, 29, 10, 0, 61, 31, 10, 0, 124, 32, 10, 0, 189, 33, 10, 0, 252, 34, 10, 0, 61, 36, 10, 0, 124, 37, 10, 0, 189, 38, 10, 0, 252, 39, 10, 0, 61, 41, 10, 0, 124, 42, 10, 0, 189, 43, 10, 0, 252, 44, 10, 0, 61, 46, 10, 0, 124, 47, 10, 0, 189, 48, 10, 0, 252, 49, 10, 0, 61, 51, 10, 0, 124, 52, 10, 0, 189, 53, 10, 0, 252, 54, 10, 0, 61, 56, 10, 0, 124, 57, 10, 0, 189, 58, 10, 0, 252, 59, 10, 0, 61, 61, 10, 0, 124, 62, 10, 0, 189, 63, 10, 0, 252, 64, 10, 0, 61, 66, 10, 0, 124, 67, 10, 0, 189, 68, 10, 0, 252, 69, 10, 0, 61, 71, 10, 0, 124, 72, 10, 0, 189, 73, 10, 0, 252, 74, 10, 0, 61, 76, 10, 0, 124, 77, 10, 0, 189, 78, 10, 0, 252, 79, 10, 0, 61, 81, 10, 0, 124, 82, 10, 0, 189, 83, 10, 0, 252, 84, 10, 0, 61, 86, 10, 0, 124, 87, 10, 0, 189, 88, 10, 0, 252, 89, 10, 0, 61, 91, 10, 0, 124, 92, 10, 0, 189, 93, 10, 0, 252, 94, 10, 0, 61, 96, 10, 0, 124, 97, 10, 0, 189, 98, 10, 0, 252, 99, 10, 0, 61, 101, 10, 0, 124, 102, 10, 0, 189, 103, 10, 0, 252, 104, 10, 0, 61, 106, 10, 0, 124, 107, 10, 0, 189, 108, 10, 0, 252, 109, 10, 0, 61, 111, 10, 0, 124, 112, 10, 0, 189, 113, 10, 0, 252, 114, 10, 0, 61, 116, 10, 0, 124, 117, 10, 0, 189, 118, 10, 0, 252, 119, 10, 0, 61, 121, 10, 0, 124, 122, 10, 0, 189, 123, 10, 0, 252, 124, 10, 0, 61, 126, 10, 0, 124, 127, 10, 0, 189, 128, 10, 0, 252, 129, 10, 0, 61, 131, 10, 0, 124, 132, 10, 0, 189, 133, 10, 0, 252, 134, 10, 0, 61, 136, 10, 0, 124, 137, 10, 0, 189, 138, 10, 0, 252, 139, 10, 0, 61, 141, 10, 0, 124, 142, 10, 0, 189, 143, 10, 0, 252, 144, 10, 0, 61, 146, 10, 0, 124, 147, 10, 0, 189, 148, 10, 0, 252, 149, 10, 0, 61, 151, 10, 0, 124, 152, 10, 0, 189, 153, 10, 0, 252, 154, 10, 0, 61, 156, 10, 0, 124, 157, 10, 0, 189, 158, 10, 0, 252, 159, 10, 0, 61, 161, 10, 0, 124, 162, 10, 0, 189, 163, 10, 0, 252, 164, 10, 0, 61, 166, 10, 0, 124, 167, 10, 0, 189, 168, 10, 0, 252, 169, 10, 0, 61, 171, 10, 0, 124, 172, 10, 0, 189, 173, 10, 0, 252, 174, 10, 0, 61, 176, 10, 0, 124, 177, 10, 0, 189, 178, 10, 0, 252, 179, 10, 0, 61, 181, 10, 0, 124, 182, 10, 0, 189, 183, 10, 0, 252, 184, 10, 0, 61, 186, 10, 0, 124, 187, 10, 0, 189, 188, 10, 0, 252, 189, 10, 0, 61, 191, 10, 0, 124, 192, 10, 0, 189, 193, 10, 0, 252, 194, 10, 0, 61, 196, 10, 0, 124, 197, 10, 0, 189, 198, 10, 0, 252, 199, 10, 0, 61, 201, 10, 0, 124, 202, 10, 0, 189, 203, 10, 0, 252, 204, 10, 0, 61, 206, 10, 0, 124, 207, 10, 0, 189, 208, 10, 0, 252, 209, 10, 0, 61, 211, 10, 0, 124, 212, 10, 0, 189, 213, 10, 0, 252, 214, 10, 0, 61, 216, 10, 0, 124, 217, 10, 0, 189, 218, 10, 0, 252, 219, 10, 0, 61, 221, 10, 0, 124, 222, 10, 0, 189, 223, 10, 0, 252, 224, 10, 0, 61, 226, 10, 0, 124, 227, 10, 0, 189, 228, 10, 0, 252, 229, 10, 0, 61, 231, 10, 0, 124, 232, 10, 0, 189, 233, 10, 0, 252, 234, 10, 0, 61, 236, 10, 0, 124, 237, 10, 0, 189, 238, 10, 0, 252, 239, 10, 0, 61, 241, 10, 0, 124, 242, 10, 0, 189, 243, 10, 0, 252, 244, 10, 0, 61, 246, 10, 0, 124, 247, 10, 0, 189, 248, 10, 0, 252, 249, 10, 0, 61, 251, 10, 0, 124, 252, 10, 0, 189, 253, 10, 0, 252, 254, 10, 0, 61, 0, 11, 0, 124, 1, 11, 0, 189, 2, 11, 0, 252, 3, 11, 0, 61, 5, 11, 0, 124, 6, 11, 0, 189, 7, 11, 0, 252, 8, 11, 0, 61, 10, 11, 0, 124, 11, 11, 0, 189, 12, 11, 0, 252, 13, 11, 0, 61, 15, 11, 0, 124, 16, 11, 0, 189, 17, 11, 0, 252, 18, 11, 0, 61, 20, 11, 0, 124, 21, 11, 0, 189, 22, 11, 0, 252, 23, 11, 0, 61, 25, 11, 0, 124, 26, 11, 0, 189, 27, 11, 0, 252, 28, 11, 0, 61, 30, 11, 0, 124, 31, 11, 0, 189, 32, 11, 0, 252, 33, 11, 0, 61, 35, 11, 0, 124, 36, 11, 0, 189, 37, 11, 0, 252, 38, 11, 0, 61, 40, 11, 0, 124, 41, 11, 0, 189, 42, 11, 0, 252, 43, 11, 0, 61, 45, 11, 0, 124, 46, 11, 0, 189, 47, 11, 0, 252, 48, 11, 0, 61, 50, 11, 0, 124, 51, 11, 0, 189, 52, 11, 0, 252, 53, 11, 0, 61, 55, 11, 0, 124, 56, 11, 0, 189, 57, 11, 0, 252, 58, 11, 0, 61, 60, 11, 0, 124, 61, 11, 0, 189, 62, 11, 0, 252, 63, 11, 0, 61, 65, 11, 0, 124, 66, 11, 0, 189, 67, 11, 0, 252, 68, 11, 0, 61, 70, 11, 0, 124, 71, 11, 0, 189, 72, 11, 0, 252, 73, 11, 0, 61, 75, 11, 0, 124, 76, 11, 0, 189, 77, 11, 0, 252, 78, 11, 0, 61, 80, 11, 0, 124, 81, 11, 0, 189, 82, 11, 0, 252, 83, 11, 0, 61, 85, 11, 0, 124, 86, 11, 0, 189, 87, 11, 0, 252, 88, 11, 0, 61, 90, 11, 0, 124, 91, 11, 0, 189, 92, 11, 0, 252, 93, 11, 0, 61, 95, 11, 0, 124, 96, 11, 0, 189, 97, 11, 0, 252, 98, 11, 0, 61, 100, 11, 0, 124, 101, 11, 0, 189, 102, 11, 0, 252, 103, 11, 0, 61, 105, 11, 0, 124, 106, 11, 0, 189, 107, 11, 0, 252, 108, 11, 0, 61, 110, 11, 0, 124, 111, 11, 0, 189, 112, 11, 0, 252, 113, 11, 0, 61, 115, 11, 0, 124, 116, 11, 0, 189, 117, 11, 0, 252, 118, 11, 0, 61, 120, 11, 0, 124, 121, 11, 0, 189, 122, 11, 0, 252, 123, 11, 0, 61, 125, 11, 0, 124, 126, 11, 0, 189, 127, 11, 0, 252, 128, 11, 0, 61, 130, 11, 0, 124, 131, 11, 0, 189, 132, 11, 0, 252, 133, 11, 0, 61, 135, 11, 0, 124, 136, 11, 0, 189, 137, 11, 0, 252, 138, 11, 0, 61, 140, 11, 0, 124, 141, 11, 0, 189, 142, 11, 0, 252, 143, 11, 0, 61, 145, 11, 0, 124, 146, 11, 0, 189, 147, 11, 0, 252, 148, 11, 0, 61, 150, 11, 0, 124, 151, 11, 0, 189, 152, 11, 0, 252, 153, 11, 0, 61, 155, 11, 0, 124, 156, 11, 0, 189, 157, 11, 0, 252, 158, 11, 0, 61, 160, 11, 0, 124, 161, 11, 0, 189, 162, 11, 0, 252, 163, 11, 0, 61, 165, 11, 0, 124, 166, 11, 0, 189, 167, 11, 0, 252, 168, 11, 0, 61, 170, 11, 0, 124, 171, 11, 0, 189, 172, 11, 0, 252, 173, 11, 0, 61, 175, 11, 0, 124, 176, 11, 0, 189, 177, 11, 0, 252, 178, 11, 0, 61, 180, 11, 0, 124, 181, 11, 0, 189, 182, 11, 0, 252, 183, 11, 0, 61, 185, 11, 0, 124, 186, 11, 0, 189, 187, 11, 0, 252, 188, 11, 0, 61, 190, 11, 0, 124, 191, 11, 0, 189, 192, 11, 0, 252, 193, 11, 0, 61, 195, 11, 0, 124, 196, 11, 0, 189, 197, 11, 0, 252, 198, 11, 0, 61, 200, 11, 0, 124, 201, 11, 0, 189, 202, 11, 0, 252, 203, 11, 0, 61, 205, 11, 0, 124, 206, 11, 0, 189, 207, 11, 0, 252, 208, 11, 0, 61, 210, 11, 0, 124, 211, 11, 0, 189, 212, 11, 0, 252, 213, 11, 0, 61, 215, 11, 0, 124, 216, 11, 0, 189, 217, 11, 0, 252, 218, 11, 0, 61, 220, 11, 0, 124, 221, 11, 0, 189, 222, 11, 0, 252, 223, 11, 0, 61, 225, 11, 0, 124, 226, 11, 0, 189, 227, 11, 0, 252, 228, 11, 0, 61, 230, 11, 0, 124, 231, 11, 0, 189, 232, 11, 0, 252, 233, 11, 0, 61, 235, 11, 0, 124, 236, 11, 0, 189, 237, 11, 0, 252, 238, 11, 0, 61, 240, 11, 0, 124, 241, 11, 0, 189, 242, 11, 0, 252, 243, 11, 0, 61, 245, 11, 0, 124, 246, 11, 0, 189, 247, 11, 0, 252, 248, 11, 0, 61, 250, 11, 0, 124, 251, 11, 0, 189, 252, 11, 0, 252, 253, 11, 0, 61, 255, 11, 0, 124, 0, 12, 0, 189, 1, 12, 0, 252, 2, 12, 0, 61, 4, 12, 0, 124, 5, 12, 0, 189, 6, 12, 0, 252, 7, 12, 0, 61, 9, 12, 0, 124, 10, 12, 0, 189, 11, 12, 0, 252, 12, 12, 0, 61, 14, 12, 0, 124, 15, 12, 0, 189, 16, 12, 0, 252, 17, 12, 0, 61, 19, 12, 0, 124, 20, 12, 0, 189, 21, 12, 0, 252, 22, 12, 0, 61, 24, 12, 0, 124, 25, 12, 0, 189, 26, 12, 0, 252, 27, 12, 0, 61, 29, 12, 0, 124, 30, 12, 0, 189, 31, 12, 0, 252, 32, 12, 0, 61, 34, 12, 0, 124, 35, 12, 0, 189, 36, 12, 0, 252, 37, 12, 0, 61, 39, 12, 0, 124, 40, 12, 0, 189, 41, 12, 0, 252, 42, 12, 0, 61, 44, 12, 0, 124, 45, 12, 0, 189, 46, 12, 0, 252, 47, 12, 0, 61, 49, 12, 0, 124, 50, 12, 0, 189, 51, 12, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_any.json b/tests/recordings/logic_analyzer/test_measure_interval_same_channel_any.json deleted file mode 100644 index c16d099e..00000000 --- a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_any.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [2], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 61, 1, 0, 0, 124, 2, 0, 0, 189, 3, 0, 0, 252, 4, 0, 0, 61, 6, 0, 0, 124, 7, 0, 0, 189, 8, 0, 0, 252, 9, 0, 0, 61, 11, 0, 0, 124, 12, 0, 0, 189, 13, 0, 0, 252, 14, 0, 0, 61, 16, 0, 0, 124, 17, 0, 0, 189, 18, 0, 0, 252, 19, 0, 0, 61, 21, 0, 0, 124, 22, 0, 0, 189, 23, 0, 0, 252, 24, 0, 0, 61, 26, 0, 0, 124, 27, 0, 0, 189, 28, 0, 0, 252, 29, 0, 0, 61, 31, 0, 0, 124, 32, 0, 0, 189, 33, 0, 0, 252, 34, 0, 0, 61, 36, 0, 0, 124, 37, 0, 0, 189, 38, 0, 0, 252, 39, 0, 0, 61, 41, 0, 0, 124, 42, 0, 0, 189, 43, 0, 0, 252, 44, 0, 0, 61, 46, 0, 0, 124, 47, 0, 0, 189, 48, 0, 0, 252, 49, 0, 0, 61, 51, 0, 0, 124, 52, 0, 0, 189, 53, 0, 0, 252, 54, 0, 0, 61, 56, 0, 0, 124, 57, 0, 0, 189, 58, 0, 0, 252, 59, 0, 0, 61, 61, 0, 0, 124, 62, 0, 0, 189, 63, 0, 0, 252, 64, 0, 0, 61, 66, 0, 0, 124, 67, 0, 0, 189, 68, 0, 0, 252, 69, 0, 0, 61, 71, 0, 0, 124, 72, 0, 0, 189, 73, 0, 0, 252, 74, 0, 0, 61, 76, 0, 0, 124, 77, 0, 0, 189, 78, 0, 0, 252, 79, 0, 0, 61, 81, 0, 0, 124, 82, 0, 0, 189, 83, 0, 0, 252, 84, 0, 0, 61, 86, 0, 0, 124, 87, 0, 0, 189, 88, 0, 0, 252, 89, 0, 0, 61, 91, 0, 0, 124, 92, 0, 0, 189, 93, 0, 0, 252, 94, 0, 0, 61, 96, 0, 0, 124, 97, 0, 0, 189, 98, 0, 0, 252, 99, 0, 0, 61, 101, 0, 0, 124, 102, 0, 0, 189, 103, 0, 0, 252, 104, 0, 0, 61, 106, 0, 0, 124, 107, 0, 0, 189, 108, 0, 0, 252, 109, 0, 0, 61, 111, 0, 0, 124, 112, 0, 0, 189, 113, 0, 0, 252, 114, 0, 0, 61, 116, 0, 0, 124, 117, 0, 0, 189, 118, 0, 0, 252, 119, 0, 0, 61, 121, 0, 0, 124, 122, 0, 0, 189, 123, 0, 0, 252, 124, 0, 0, 61, 126, 0, 0, 124, 127, 0, 0, 189, 128, 0, 0, 252, 129, 0, 0, 61, 131, 0, 0, 124, 132, 0, 0, 189, 133, 0, 0, 252, 134, 0, 0, 61, 136, 0, 0, 124, 137, 0, 0, 189, 138, 0, 0, 252, 139, 0, 0, 61, 141, 0, 0, 124, 142, 0, 0, 189, 143, 0, 0, 252, 144, 0, 0, 61, 146, 0, 0, 124, 147, 0, 0, 189, 148, 0, 0, 252, 149, 0, 0, 61, 151, 0, 0, 124, 152, 0, 0, 189, 153, 0, 0, 252, 154, 0, 0, 61, 156, 0, 0, 124, 157, 0, 0, 189, 158, 0, 0, 252, 159, 0, 0, 61, 161, 0, 0, 124, 162, 0, 0, 189, 163, 0, 0, 252, 164, 0, 0, 61, 166, 0, 0, 124, 167, 0, 0, 189, 168, 0, 0, 252, 169, 0, 0, 61, 171, 0, 0, 124, 172, 0, 0, 189, 173, 0, 0, 252, 174, 0, 0, 61, 176, 0, 0, 124, 177, 0, 0, 189, 178, 0, 0, 252, 179, 0, 0, 61, 181, 0, 0, 124, 182, 0, 0, 189, 183, 0, 0, 252, 184, 0, 0, 61, 186, 0, 0, 124, 187, 0, 0, 189, 188, 0, 0, 252, 189, 0, 0, 61, 191, 0, 0, 124, 192, 0, 0, 189, 193, 0, 0, 252, 194, 0, 0, 61, 196, 0, 0, 124, 197, 0, 0, 189, 198, 0, 0, 252, 199, 0, 0, 61, 201, 0, 0, 124, 202, 0, 0, 189, 203, 0, 0, 252, 204, 0, 0, 61, 206, 0, 0, 124, 207, 0, 0, 189, 208, 0, 0, 252, 209, 0, 0, 61, 211, 0, 0, 124, 212, 0, 0, 189, 213, 0, 0, 252, 214, 0, 0, 61, 216, 0, 0, 124, 217, 0, 0, 189, 218, 0, 0, 252, 219, 0, 0, 61, 221, 0, 0, 124, 222, 0, 0, 189, 223, 0, 0, 252, 224, 0, 0, 61, 226, 0, 0, 124, 227, 0, 0, 189, 228, 0, 0, 252, 229, 0, 0, 61, 231, 0, 0, 124, 232, 0, 0, 189, 233, 0, 0, 252, 234, 0, 0, 61, 236, 0, 0, 124, 237, 0, 0, 189, 238, 0, 0, 252, 239, 0, 0, 61, 241, 0, 0, 124, 242, 0, 0, 189, 243, 0, 0, 252, 244, 0, 0, 61, 246, 0, 0, 124, 247, 0, 0, 189, 248, 0, 0, 252, 249, 0, 0, 61, 251, 0, 0, 124, 252, 0, 0, 189, 253, 0, 0, 252, 254, 0, 0, 61, 0, 1, 0, 124, 1, 1, 0, 189, 2, 1, 0, 252, 3, 1, 0, 61, 5, 1, 0, 124, 6, 1, 0, 189, 7, 1, 0, 252, 8, 1, 0, 61, 10, 1, 0, 124, 11, 1, 0, 189, 12, 1, 0, 252, 13, 1, 0, 61, 15, 1, 0, 124, 16, 1, 0, 189, 17, 1, 0, 252, 18, 1, 0, 61, 20, 1, 0, 124, 21, 1, 0, 189, 22, 1, 0, 252, 23, 1, 0, 61, 25, 1, 0, 124, 26, 1, 0, 189, 27, 1, 0, 252, 28, 1, 0, 61, 30, 1, 0, 124, 31, 1, 0, 189, 32, 1, 0, 252, 33, 1, 0, 61, 35, 1, 0, 124, 36, 1, 0, 189, 37, 1, 0, 252, 38, 1, 0, 61, 40, 1, 0, 124, 41, 1, 0, 189, 42, 1, 0, 252, 43, 1, 0, 61, 45, 1, 0, 124, 46, 1, 0, 189, 47, 1, 0, 252, 48, 1, 0, 61, 50, 1, 0, 124, 51, 1, 0, 189, 52, 1, 0, 252, 53, 1, 0, 61, 55, 1, 0, 124, 56, 1, 0, 189, 57, 1, 0, 252, 58, 1, 0, 61, 60, 1, 0, 124, 61, 1, 0, 189, 62, 1, 0, 252, 63, 1, 0, 61, 65, 1, 0, 124, 66, 1, 0, 189, 67, 1, 0, 252, 68, 1, 0, 61, 70, 1, 0, 124, 71, 1, 0, 189, 72, 1, 0, 252, 73, 1, 0, 61, 75, 1, 0, 124, 76, 1, 0, 189, 77, 1, 0, 252, 78, 1, 0, 61, 80, 1, 0, 124, 81, 1, 0, 189, 82, 1, 0, 252, 83, 1, 0, 61, 85, 1, 0, 124, 86, 1, 0, 189, 87, 1, 0, 252, 88, 1, 0, 61, 90, 1, 0, 124, 91, 1, 0, 189, 92, 1, 0, 252, 93, 1, 0, 61, 95, 1, 0, 124, 96, 1, 0, 189, 97, 1, 0, 252, 98, 1, 0, 61, 100, 1, 0, 124, 101, 1, 0, 189, 102, 1, 0, 252, 103, 1, 0, 61, 105, 1, 0, 124, 106, 1, 0, 189, 107, 1, 0, 252, 108, 1, 0, 61, 110, 1, 0, 124, 111, 1, 0, 189, 112, 1, 0, 252, 113, 1, 0, 61, 115, 1, 0, 124, 116, 1, 0, 189, 117, 1, 0, 252, 118, 1, 0, 61, 120, 1, 0, 124, 121, 1, 0, 189, 122, 1, 0, 252, 123, 1, 0, 61, 125, 1, 0, 124, 126, 1, 0, 189, 127, 1, 0, 252, 128, 1, 0, 61, 130, 1, 0, 124, 131, 1, 0, 189, 132, 1, 0, 252, 133, 1, 0, 61, 135, 1, 0, 124, 136, 1, 0, 189, 137, 1, 0, 252, 138, 1, 0, 61, 140, 1, 0, 124, 141, 1, 0, 189, 142, 1, 0, 252, 143, 1, 0, 61, 145, 1, 0, 124, 146, 1, 0, 189, 147, 1, 0, 252, 148, 1, 0, 61, 150, 1, 0, 124, 151, 1, 0, 189, 152, 1, 0, 252, 153, 1, 0, 61, 155, 1, 0, 124, 156, 1, 0, 189, 157, 1, 0, 252, 158, 1, 0, 61, 160, 1, 0, 124, 161, 1, 0, 189, 162, 1, 0, 252, 163, 1, 0, 61, 165, 1, 0, 124, 166, 1, 0, 189, 167, 1, 0, 252, 168, 1, 0, 61, 170, 1, 0, 124, 171, 1, 0, 189, 172, 1, 0, 252, 173, 1, 0, 61, 175, 1, 0, 124, 176, 1, 0, 189, 177, 1, 0, 252, 178, 1, 0, 61, 180, 1, 0, 124, 181, 1, 0, 189, 182, 1, 0, 252, 183, 1, 0, 61, 185, 1, 0, 124, 186, 1, 0, 189, 187, 1, 0, 252, 188, 1, 0, 61, 190, 1, 0, 124, 191, 1, 0, 189, 192, 1, 0, 252, 193, 1, 0, 61, 195, 1, 0, 124, 196, 1, 0, 189, 197, 1, 0, 252, 198, 1, 0, 61, 200, 1, 0, 124, 201, 1, 0, 189, 202, 1, 0, 252, 203, 1, 0, 61, 205, 1, 0, 124, 206, 1, 0, 189, 207, 1, 0, 252, 208, 1, 0, 61, 210, 1, 0, 124, 211, 1, 0, 189, 212, 1, 0, 252, 213, 1, 0, 61, 215, 1, 0, 124, 216, 1, 0, 189, 217, 1, 0, 252, 218, 1, 0, 61, 220, 1, 0, 124, 221, 1, 0, 189, 222, 1, 0, 252, 223, 1, 0, 61, 225, 1, 0, 124, 226, 1, 0, 189, 227, 1, 0, 252, 228, 1, 0, 61, 230, 1, 0, 124, 231, 1, 0, 189, 232, 1, 0, 252, 233, 1, 0, 61, 235, 1, 0, 124, 236, 1, 0, 189, 237, 1, 0, 252, 238, 1, 0, 61, 240, 1, 0, 124, 241, 1, 0, 189, 242, 1, 0, 252, 243, 1, 0, 61, 245, 1, 0, 124, 246, 1, 0, 189, 247, 1, 0, 252, 248, 1, 0, 61, 250, 1, 0, 124, 251, 1, 0, 189, 252, 1, 0, 252, 253, 1, 0, 61, 255, 1, 0, 124, 0, 2, 0, 189, 1, 2, 0, 252, 2, 2, 0, 61, 4, 2, 0, 124, 5, 2, 0, 189, 6, 2, 0, 252, 7, 2, 0, 61, 9, 2, 0, 124, 10, 2, 0, 189, 11, 2, 0, 252, 12, 2, 0, 61, 14, 2, 0, 124, 15, 2, 0, 189, 16, 2, 0, 252, 17, 2, 0, 61, 19, 2, 0, 124, 20, 2, 0, 189, 21, 2, 0, 252, 22, 2, 0, 61, 24, 2, 0, 124, 25, 2, 0, 189, 26, 2, 0, 252, 27, 2, 0, 61, 29, 2, 0, 124, 30, 2, 0, 189, 31, 2, 0, 252, 32, 2, 0, 61, 34, 2, 0, 124, 35, 2, 0, 189, 36, 2, 0, 252, 37, 2, 0, 61, 39, 2, 0, 124, 40, 2, 0, 189, 41, 2, 0, 252, 42, 2, 0, 61, 44, 2, 0, 124, 45, 2, 0, 189, 46, 2, 0, 252, 47, 2, 0, 61, 49, 2, 0, 124, 50, 2, 0, 189, 51, 2, 0, 252, 52, 2, 0, 61, 54, 2, 0, 124, 55, 2, 0, 189, 56, 2, 0, 252, 57, 2, 0, 61, 59, 2, 0, 124, 60, 2, 0, 189, 61, 2, 0, 252, 62, 2, 0, 61, 64, 2, 0, 124, 65, 2, 0, 189, 66, 2, 0, 252, 67, 2, 0, 61, 69, 2, 0, 124, 70, 2, 0, 189, 71, 2, 0, 252, 72, 2, 0, 61, 74, 2, 0, 124, 75, 2, 0, 189, 76, 2, 0, 252, 77, 2, 0, 61, 79, 2, 0, 124, 80, 2, 0, 189, 81, 2, 0, 252, 82, 2, 0, 61, 84, 2, 0, 124, 85, 2, 0, 189, 86, 2, 0, 252, 87, 2, 0, 61, 89, 2, 0, 124, 90, 2, 0, 189, 91, 2, 0, 252, 92, 2, 0, 61, 94, 2, 0, 124, 95, 2, 0, 189, 96, 2, 0, 252, 97, 2, 0, 61, 99, 2, 0, 124, 100, 2, 0, 189, 101, 2, 0, 252, 102, 2, 0, 61, 104, 2, 0, 124, 105, 2, 0, 189, 106, 2, 0, 252, 107, 2, 0, 61, 109, 2, 0, 124, 110, 2, 0, 189, 111, 2, 0, 252, 112, 2, 0, 61, 114, 2, 0, 124, 115, 2, 0, 189, 116, 2, 0, 252, 117, 2, 0, 61, 119, 2, 0, 124, 120, 2, 0, 189, 121, 2, 0, 252, 122, 2, 0, 61, 124, 2, 0, 124, 125, 2, 0, 189, 126, 2, 0, 252, 127, 2, 0, 61, 129, 2, 0, 124, 130, 2, 0, 189, 131, 2, 0, 252, 132, 2, 0, 61, 134, 2, 0, 124, 135, 2, 0, 189, 136, 2, 0, 252, 137, 2, 0, 61, 139, 2, 0, 124, 140, 2, 0, 189, 141, 2, 0, 252, 142, 2, 0, 61, 144, 2, 0, 124, 145, 2, 0, 189, 146, 2, 0, 252, 147, 2, 0, 61, 149, 2, 0, 124, 150, 2, 0, 189, 151, 2, 0, 252, 152, 2, 0, 61, 154, 2, 0, 124, 155, 2, 0, 189, 156, 2, 0, 252, 157, 2, 0, 61, 159, 2, 0, 124, 160, 2, 0, 189, 161, 2, 0, 252, 162, 2, 0, 61, 164, 2, 0, 124, 165, 2, 0, 189, 166, 2, 0, 252, 167, 2, 0, 61, 169, 2, 0, 124, 170, 2, 0, 189, 171, 2, 0, 252, 172, 2, 0, 61, 174, 2, 0, 124, 175, 2, 0, 189, 176, 2, 0, 252, 177, 2, 0, 61, 179, 2, 0, 124, 180, 2, 0, 189, 181, 2, 0, 252, 182, 2, 0, 61, 184, 2, 0, 124, 185, 2, 0, 189, 186, 2, 0, 252, 187, 2, 0, 61, 189, 2, 0, 124, 190, 2, 0, 189, 191, 2, 0, 252, 192, 2, 0, 61, 194, 2, 0, 124, 195, 2, 0, 189, 196, 2, 0, 252, 197, 2, 0, 61, 199, 2, 0, 124, 200, 2, 0, 189, 201, 2, 0, 252, 202, 2, 0, 61, 204, 2, 0, 124, 205, 2, 0, 189, 206, 2, 0, 252, 207, 2, 0, 61, 209, 2, 0, 124, 210, 2, 0, 189, 211, 2, 0, 252, 212, 2, 0, 61, 214, 2, 0, 124, 215, 2, 0, 189, 216, 2, 0, 252, 217, 2, 0, 61, 219, 2, 0, 124, 220, 2, 0, 189, 221, 2, 0, 252, 222, 2, 0, 61, 224, 2, 0, 124, 225, 2, 0, 189, 226, 2, 0, 252, 227, 2, 0, 61, 229, 2, 0, 124, 230, 2, 0, 189, 231, 2, 0, 252, 232, 2, 0, 61, 234, 2, 0, 124, 235, 2, 0, 189, 236, 2, 0, 252, 237, 2, 0, 61, 239, 2, 0, 124, 240, 2, 0, 189, 241, 2, 0, 252, 242, 2, 0, 61, 244, 2, 0, 124, 245, 2, 0, 189, 246, 2, 0, 252, 247, 2, 0, 61, 249, 2, 0, 124, 250, 2, 0, 189, 251, 2, 0, 252, 252, 2, 0, 61, 254, 2, 0, 124, 255, 2, 0, 189, 0, 3, 0, 252, 1, 3, 0, 61, 3, 3, 0, 124, 4, 3, 0, 189, 5, 3, 0, 252, 6, 3, 0, 61, 8, 3, 0, 124, 9, 3, 0, 189, 10, 3, 0, 252, 11, 3, 0, 61, 13, 3, 0, 124, 14, 3, 0, 189, 15, 3, 0, 252, 16, 3, 0, 61, 18, 3, 0, 124, 19, 3, 0, 189, 20, 3, 0, 252, 21, 3, 0, 61, 23, 3, 0, 124, 24, 3, 0, 189, 25, 3, 0, 252, 26, 3, 0, 61, 28, 3, 0, 124, 29, 3, 0, 189, 30, 3, 0, 252, 31, 3, 0, 61, 33, 3, 0, 124, 34, 3, 0, 189, 35, 3, 0, 252, 36, 3, 0, 61, 38, 3, 0, 124, 39, 3, 0, 189, 40, 3, 0, 252, 41, 3, 0, 61, 43, 3, 0, 124, 44, 3, 0, 189, 45, 3, 0, 252, 46, 3, 0, 61, 48, 3, 0, 124, 49, 3, 0, 189, 50, 3, 0, 252, 51, 3, 0, 61, 53, 3, 0, 124, 54, 3, 0, 189, 55, 3, 0, 252, 56, 3, 0, 61, 58, 3, 0, 124, 59, 3, 0, 189, 60, 3, 0, 252, 61, 3, 0, 61, 63, 3, 0, 124, 64, 3, 0, 189, 65, 3, 0, 252, 66, 3, 0, 61, 68, 3, 0, 124, 69, 3, 0, 189, 70, 3, 0, 252, 71, 3, 0, 61, 73, 3, 0, 124, 74, 3, 0, 189, 75, 3, 0, 252, 76, 3, 0, 61, 78, 3, 0, 124, 79, 3, 0, 189, 80, 3, 0, 252, 81, 3, 0, 61, 83, 3, 0, 124, 84, 3, 0, 189, 85, 3, 0, 252, 86, 3, 0, 61, 88, 3, 0, 124, 89, 3, 0, 189, 90, 3, 0, 252, 91, 3, 0, 61, 93, 3, 0, 124, 94, 3, 0, 189, 95, 3, 0, 252, 96, 3, 0, 61, 98, 3, 0, 124, 99, 3, 0, 189, 100, 3, 0, 252, 101, 3, 0, 61, 103, 3, 0, 124, 104, 3, 0, 189, 105, 3, 0, 252, 106, 3, 0, 61, 108, 3, 0, 124, 109, 3, 0, 189, 110, 3, 0, 252, 111, 3, 0, 61, 113, 3, 0, 124, 114, 3, 0, 189, 115, 3, 0, 252, 116, 3, 0, 61, 118, 3, 0, 124, 119, 3, 0, 189, 120, 3, 0, 252, 121, 3, 0, 61, 123, 3, 0, 124, 124, 3, 0, 189, 125, 3, 0, 252, 126, 3, 0, 61, 128, 3, 0, 124, 129, 3, 0, 189, 130, 3, 0, 252, 131, 3, 0, 61, 133, 3, 0, 124, 134, 3, 0, 189, 135, 3, 0, 252, 136, 3, 0, 61, 138, 3, 0, 124, 139, 3, 0, 189, 140, 3, 0, 252, 141, 3, 0, 61, 143, 3, 0, 124, 144, 3, 0, 189, 145, 3, 0, 252, 146, 3, 0, 61, 148, 3, 0, 124, 149, 3, 0, 189, 150, 3, 0, 252, 151, 3, 0, 61, 153, 3, 0, 124, 154, 3, 0, 189, 155, 3, 0, 252, 156, 3, 0, 61, 158, 3, 0, 124, 159, 3, 0, 189, 160, 3, 0, 252, 161, 3, 0, 61, 163, 3, 0, 124, 164, 3, 0, 189, 165, 3, 0, 252, 166, 3, 0, 61, 168, 3, 0, 124, 169, 3, 0, 189, 170, 3, 0, 252, 171, 3, 0, 61, 173, 3, 0, 124, 174, 3, 0, 189, 175, 3, 0, 252, 176, 3, 0, 61, 178, 3, 0, 124, 179, 3, 0, 189, 180, 3, 0, 252, 181, 3, 0, 61, 183, 3, 0, 124, 184, 3, 0, 189, 185, 3, 0, 252, 186, 3, 0, 61, 188, 3, 0, 124, 189, 3, 0, 189, 190, 3, 0, 252, 191, 3, 0, 61, 193, 3, 0, 124, 194, 3, 0, 189, 195, 3, 0, 252, 196, 3, 0, 61, 198, 3, 0, 124, 199, 3, 0, 189, 200, 3, 0, 252, 201, 3, 0, 61, 203, 3, 0, 124, 204, 3, 0, 189, 205, 3, 0, 252, 206, 3, 0, 61, 208, 3, 0, 124, 209, 3, 0, 189, 210, 3, 0, 252, 211, 3, 0, 61, 213, 3, 0, 124, 214, 3, 0, 189, 215, 3, 0, 252, 216, 3, 0, 61, 218, 3, 0, 124, 219, 3, 0, 189, 220, 3, 0, 252, 221, 3, 0, 61, 223, 3, 0, 124, 224, 3, 0, 189, 225, 3, 0, 252, 226, 3, 0, 61, 228, 3, 0, 124, 229, 3, 0, 189, 230, 3, 0, 252, 231, 3, 0, 61, 233, 3, 0, 124, 234, 3, 0, 189, 235, 3, 0, 252, 236, 3, 0, 61, 238, 3, 0, 124, 239, 3, 0, 189, 240, 3, 0, 252, 241, 3, 0, 61, 243, 3, 0, 124, 244, 3, 0, 189, 245, 3, 0, 252, 246, 3, 0, 61, 248, 3, 0, 124, 249, 3, 0, 189, 250, 3, 0, 252, 251, 3, 0, 61, 253, 3, 0, 124, 254, 3, 0, 189, 255, 3, 0, 252, 0, 4, 0, 61, 2, 4, 0, 124, 3, 4, 0, 189, 4, 4, 0, 252, 5, 4, 0, 61, 7, 4, 0, 124, 8, 4, 0, 189, 9, 4, 0, 252, 10, 4, 0, 61, 12, 4, 0, 124, 13, 4, 0, 189, 14, 4, 0, 252, 15, 4, 0, 61, 17, 4, 0, 124, 18, 4, 0, 189, 19, 4, 0, 252, 20, 4, 0, 61, 22, 4, 0, 124, 23, 4, 0, 189, 24, 4, 0, 252, 25, 4, 0, 61, 27, 4, 0, 124, 28, 4, 0, 189, 29, 4, 0, 252, 30, 4, 0, 61, 32, 4, 0, 124, 33, 4, 0, 189, 34, 4, 0, 252, 35, 4, 0, 61, 37, 4, 0, 124, 38, 4, 0, 189, 39, 4, 0, 252, 40, 4, 0, 61, 42, 4, 0, 124, 43, 4, 0, 189, 44, 4, 0, 252, 45, 4, 0, 61, 47, 4, 0, 124, 48, 4, 0, 189, 49, 4, 0, 252, 50, 4, 0, 61, 52, 4, 0, 124, 53, 4, 0, 189, 54, 4, 0, 252, 55, 4, 0, 61, 57, 4, 0, 124, 58, 4, 0, 189, 59, 4, 0, 252, 60, 4, 0, 61, 62, 4, 0, 124, 63, 4, 0, 189, 64, 4, 0, 252, 65, 4, 0, 61, 67, 4, 0, 124, 68, 4, 0, 189, 69, 4, 0, 252, 70, 4, 0, 61, 72, 4, 0, 124, 73, 4, 0, 189, 74, 4, 0, 252, 75, 4, 0, 61, 77, 4, 0, 124, 78, 4, 0, 189, 79, 4, 0, 252, 80, 4, 0, 61, 82, 4, 0, 124, 83, 4, 0, 189, 84, 4, 0, 252, 85, 4, 0, 61, 87, 4, 0, 124, 88, 4, 0, 189, 89, 4, 0, 252, 90, 4, 0, 61, 92, 4, 0, 124, 93, 4, 0, 189, 94, 4, 0, 252, 95, 4, 0, 61, 97, 4, 0, 124, 98, 4, 0, 189, 99, 4, 0, 252, 100, 4, 0, 61, 102, 4, 0, 124, 103, 4, 0, 189, 104, 4, 0, 252, 105, 4, 0, 61, 107, 4, 0, 124, 108, 4, 0, 189, 109, 4, 0, 252, 110, 4, 0, 61, 112, 4, 0, 124, 113, 4, 0, 189, 114, 4, 0, 252, 115, 4, 0, 61, 117, 4, 0, 124, 118, 4, 0, 189, 119, 4, 0, 252, 120, 4, 0, 61, 122, 4, 0, 124, 123, 4, 0, 189, 124, 4, 0, 252, 125, 4, 0, 61, 127, 4, 0, 124, 128, 4, 0, 189, 129, 4, 0, 252, 130, 4, 0, 61, 132, 4, 0, 124, 133, 4, 0, 189, 134, 4, 0, 252, 135, 4, 0, 61, 137, 4, 0, 124, 138, 4, 0, 189, 139, 4, 0, 252, 140, 4, 0, 61, 142, 4, 0, 124, 143, 4, 0, 189, 144, 4, 0, 252, 145, 4, 0, 61, 147, 4, 0, 124, 148, 4, 0, 189, 149, 4, 0, 252, 150, 4, 0, 61, 152, 4, 0, 124, 153, 4, 0, 189, 154, 4, 0, 252, 155, 4, 0, 61, 157, 4, 0, 124, 158, 4, 0, 189, 159, 4, 0, 252, 160, 4, 0, 61, 162, 4, 0, 124, 163, 4, 0, 189, 164, 4, 0, 252, 165, 4, 0, 61, 167, 4, 0, 124, 168, 4, 0, 189, 169, 4, 0, 252, 170, 4, 0, 61, 172, 4, 0, 124, 173, 4, 0, 189, 174, 4, 0, 252, 175, 4, 0, 61, 177, 4, 0, 124, 178, 4, 0, 189, 179, 4, 0, 252, 180, 4, 0, 61, 182, 4, 0, 124, 183, 4, 0, 189, 184, 4, 0, 252, 185, 4, 0, 61, 187, 4, 0, 124, 188, 4, 0, 189, 189, 4, 0, 252, 190, 4, 0, 61, 192, 4, 0, 124, 193, 4, 0, 189, 194, 4, 0, 252, 195, 4, 0, 61, 197, 4, 0, 124, 198, 4, 0, 189, 199, 4, 0, 252, 200, 4, 0, 61, 202, 4, 0, 124, 203, 4, 0, 189, 204, 4, 0, 252, 205, 4, 0, 61, 207, 4, 0, 124, 208, 4, 0, 189, 209, 4, 0, 252, 210, 4, 0, 61, 212, 4, 0, 124, 213, 4, 0, 189, 214, 4, 0, 252, 215, 4, 0, 61, 217, 4, 0, 124, 218, 4, 0, 189, 219, 4, 0, 252, 220, 4, 0, 61, 222, 4, 0, 124, 223, 4, 0, 189, 224, 4, 0, 252, 225, 4, 0, 61, 227, 4, 0, 124, 228, 4, 0, 189, 229, 4, 0, 252, 230, 4, 0, 61, 232, 4, 0, 124, 233, 4, 0, 189, 234, 4, 0, 252, 235, 4, 0, 61, 237, 4, 0, 124, 238, 4, 0, 189, 239, 4, 0, 252, 240, 4, 0, 61, 242, 4, 0, 124, 243, 4, 0, 189, 244, 4, 0, 252, 245, 4, 0, 61, 247, 4, 0, 124, 248, 4, 0, 189, 249, 4, 0, 252, 250, 4, 0, 61, 252, 4, 0, 124, 253, 4, 0, 189, 254, 4, 0, 252, 255, 4, 0, 61, 1, 5, 0, 124, 2, 5, 0, 189, 3, 5, 0, 252, 4, 5, 0, 61, 6, 5, 0, 124, 7, 5, 0, 189, 8, 5, 0, 252, 9, 5, 0, 61, 11, 5, 0, 124, 12, 5, 0, 189, 13, 5, 0, 252, 14, 5, 0, 61, 16, 5, 0, 124, 17, 5, 0, 189, 18, 5, 0, 252, 19, 5, 0, 61, 21, 5, 0, 124, 22, 5, 0, 189, 23, 5, 0, 252, 24, 5, 0, 61, 26, 5, 0, 124, 27, 5, 0, 189, 28, 5, 0, 252, 29, 5, 0, 61, 31, 5, 0, 124, 32, 5, 0, 189, 33, 5, 0, 252, 34, 5, 0, 61, 36, 5, 0, 124, 37, 5, 0, 189, 38, 5, 0, 252, 39, 5, 0, 61, 41, 5, 0, 124, 42, 5, 0, 189, 43, 5, 0, 252, 44, 5, 0, 61, 46, 5, 0, 124, 47, 5, 0, 189, 48, 5, 0, 252, 49, 5, 0, 61, 51, 5, 0, 124, 52, 5, 0, 189, 53, 5, 0, 252, 54, 5, 0, 61, 56, 5, 0, 124, 57, 5, 0, 189, 58, 5, 0, 252, 59, 5, 0, 61, 61, 5, 0, 124, 62, 5, 0, 189, 63, 5, 0, 252, 64, 5, 0, 61, 66, 5, 0, 124, 67, 5, 0, 189, 68, 5, 0, 252, 69, 5, 0, 61, 71, 5, 0, 124, 72, 5, 0, 189, 73, 5, 0, 252, 74, 5, 0, 61, 76, 5, 0, 124, 77, 5, 0, 189, 78, 5, 0, 252, 79, 5, 0, 61, 81, 5, 0, 124, 82, 5, 0, 189, 83, 5, 0, 252, 84, 5, 0, 61, 86, 5, 0, 124, 87, 5, 0, 189, 88, 5, 0, 252, 89, 5, 0, 61, 91, 5, 0, 124, 92, 5, 0, 189, 93, 5, 0, 252, 94, 5, 0, 61, 96, 5, 0, 124, 97, 5, 0, 189, 98, 5, 0, 252, 99, 5, 0, 61, 101, 5, 0, 124, 102, 5, 0, 189, 103, 5, 0, 252, 104, 5, 0, 61, 106, 5, 0, 124, 107, 5, 0, 189, 108, 5, 0, 252, 109, 5, 0, 61, 111, 5, 0, 124, 112, 5, 0, 189, 113, 5, 0, 252, 114, 5, 0, 61, 116, 5, 0, 124, 117, 5, 0, 189, 118, 5, 0, 252, 119, 5, 0, 61, 121, 5, 0, 124, 122, 5, 0, 189, 123, 5, 0, 252, 124, 5, 0, 61, 126, 5, 0, 124, 127, 5, 0, 189, 128, 5, 0, 252, 129, 5, 0, 61, 131, 5, 0, 124, 132, 5, 0, 189, 133, 5, 0, 252, 134, 5, 0, 61, 136, 5, 0, 124, 137, 5, 0, 189, 138, 5, 0, 252, 139, 5, 0, 61, 141, 5, 0, 124, 142, 5, 0, 189, 143, 5, 0, 252, 144, 5, 0, 61, 146, 5, 0, 124, 147, 5, 0, 189, 148, 5, 0, 252, 149, 5, 0, 61, 151, 5, 0, 124, 152, 5, 0, 189, 153, 5, 0, 252, 154, 5, 0, 61, 156, 5, 0, 124, 157, 5, 0, 189, 158, 5, 0, 252, 159, 5, 0, 61, 161, 5, 0, 124, 162, 5, 0, 189, 163, 5, 0, 252, 164, 5, 0, 61, 166, 5, 0, 124, 167, 5, 0, 189, 168, 5, 0, 252, 169, 5, 0, 61, 171, 5, 0, 124, 172, 5, 0, 189, 173, 5, 0, 252, 174, 5, 0, 61, 176, 5, 0, 124, 177, 5, 0, 189, 178, 5, 0, 252, 179, 5, 0, 61, 181, 5, 0, 124, 182, 5, 0, 189, 183, 5, 0, 252, 184, 5, 0, 61, 186, 5, 0, 124, 187, 5, 0, 189, 188, 5, 0, 252, 189, 5, 0, 61, 191, 5, 0, 124, 192, 5, 0, 189, 193, 5, 0, 252, 194, 5, 0, 61, 196, 5, 0, 124, 197, 5, 0, 189, 198, 5, 0, 252, 199, 5, 0, 61, 201, 5, 0, 124, 202, 5, 0, 189, 203, 5, 0, 252, 204, 5, 0, 61, 206, 5, 0, 124, 207, 5, 0, 189, 208, 5, 0, 252, 209, 5, 0, 61, 211, 5, 0, 124, 212, 5, 0, 189, 213, 5, 0, 252, 214, 5, 0, 61, 216, 5, 0, 124, 217, 5, 0, 189, 218, 5, 0, 252, 219, 5, 0, 61, 221, 5, 0, 124, 222, 5, 0, 189, 223, 5, 0, 252, 224, 5, 0, 61, 226, 5, 0, 124, 227, 5, 0, 189, 228, 5, 0, 252, 229, 5, 0, 61, 231, 5, 0, 124, 232, 5, 0, 189, 233, 5, 0, 252, 234, 5, 0, 61, 236, 5, 0, 124, 237, 5, 0, 189, 238, 5, 0, 252, 239, 5, 0, 61, 241, 5, 0, 124, 242, 5, 0, 189, 243, 5, 0, 252, 244, 5, 0, 61, 246, 5, 0, 124, 247, 5, 0, 189, 248, 5, 0, 252, 249, 5, 0, 61, 251, 5, 0, 124, 252, 5, 0, 189, 253, 5, 0, 252, 254, 5, 0, 61, 0, 6, 0, 124, 1, 6, 0, 189, 2, 6, 0, 252, 3, 6, 0, 61, 5, 6, 0, 124, 6, 6, 0, 189, 7, 6, 0, 252, 8, 6, 0, 61, 10, 6, 0, 124, 11, 6, 0, 189, 12, 6, 0, 252, 13, 6, 0, 61, 15, 6, 0, 124, 16, 6, 0, 189, 17, 6, 0, 252, 18, 6, 0, 61, 20, 6, 0, 124, 21, 6, 0, 189, 22, 6, 0, 252, 23, 6, 0, 61, 25, 6, 0, 124, 26, 6, 0, 189, 27, 6, 0, 252, 28, 6, 0, 61, 30, 6, 0, 124, 31, 6, 0, 189, 32, 6, 0, 252, 33, 6, 0, 61, 35, 6, 0, 124, 36, 6, 0, 189, 37, 6, 0, 252, 38, 6, 0, 61, 40, 6, 0, 124, 41, 6, 0, 189, 42, 6, 0, 252, 43, 6, 0, 61, 45, 6, 0, 124, 46, 6, 0, 189, 47, 6, 0, 252, 48, 6, 0, 61, 50, 6, 0, 124, 51, 6, 0, 189, 52, 6, 0, 252, 53, 6, 0, 61, 55, 6, 0, 124, 56, 6, 0, 189, 57, 6, 0, 252, 58, 6, 0, 61, 60, 6, 0, 124, 61, 6, 0, 189, 62, 6, 0, 252, 63, 6, 0, 61, 65, 6, 0, 124, 66, 6, 0, 189, 67, 6, 0, 252, 68, 6, 0, 61, 70, 6, 0, 124, 71, 6, 0, 189, 72, 6, 0, 252, 73, 6, 0, 61, 75, 6, 0, 124, 76, 6, 0, 189, 77, 6, 0, 252, 78, 6, 0, 61, 80, 6, 0, 124, 81, 6, 0, 189, 82, 6, 0, 252, 83, 6, 0, 61, 85, 6, 0, 124, 86, 6, 0, 189, 87, 6, 0, 252, 88, 6, 0, 61, 90, 6, 0, 124, 91, 6, 0, 189, 92, 6, 0, 252, 93, 6, 0, 61, 95, 6, 0, 124, 96, 6, 0, 189, 97, 6, 0, 252, 98, 6, 0, 61, 100, 6, 0, 124, 101, 6, 0, 189, 102, 6, 0, 252, 103, 6, 0, 61, 105, 6, 0, 124, 106, 6, 0, 189, 107, 6, 0, 252, 108, 6, 0, 61, 110, 6, 0, 124, 111, 6, 0, 189, 112, 6, 0, 252, 113, 6, 0, 61, 115, 6, 0, 124, 116, 6, 0, 189, 117, 6, 0, 252, 118, 6, 0, 61, 120, 6, 0, 124, 121, 6, 0, 189, 122, 6, 0, 252, 123, 6, 0, 61, 125, 6, 0, 124, 126, 6, 0, 189, 127, 6, 0, 252, 128, 6, 0, 61, 130, 6, 0, 124, 131, 6, 0, 189, 132, 6, 0, 252, 133, 6, 0, 61, 135, 6, 0, 124, 136, 6, 0, 189, 137, 6, 0, 252, 138, 6, 0, 61, 140, 6, 0, 124, 141, 6, 0, 189, 142, 6, 0, 252, 143, 6, 0, 61, 145, 6, 0, 124, 146, 6, 0, 189, 147, 6, 0, 252, 148, 6, 0, 61, 150, 6, 0, 124, 151, 6, 0, 189, 152, 6, 0, 252, 153, 6, 0, 61, 155, 6, 0, 124, 156, 6, 0, 189, 157, 6, 0, 252, 158, 6, 0, 61, 160, 6, 0, 124, 161, 6, 0, 189, 162, 6, 0, 252, 163, 6, 0, 61, 165, 6, 0, 124, 166, 6, 0, 189, 167, 6, 0, 252, 168, 6, 0, 61, 170, 6, 0, 124, 171, 6, 0, 189, 172, 6, 0, 252, 173, 6, 0, 61, 175, 6, 0, 124, 176, 6, 0, 189, 177, 6, 0, 252, 178, 6, 0, 61, 180, 6, 0, 124, 181, 6, 0, 189, 182, 6, 0, 252, 183, 6, 0, 61, 185, 6, 0, 124, 186, 6, 0, 189, 187, 6, 0, 252, 188, 6, 0, 61, 190, 6, 0, 124, 191, 6, 0, 189, 192, 6, 0, 252, 193, 6, 0, 61, 195, 6, 0, 124, 196, 6, 0, 189, 197, 6, 0, 252, 198, 6, 0, 61, 200, 6, 0, 124, 201, 6, 0, 189, 202, 6, 0, 252, 203, 6, 0, 61, 205, 6, 0, 124, 206, 6, 0, 189, 207, 6, 0, 252, 208, 6, 0, 61, 210, 6, 0, 124, 211, 6, 0, 189, 212, 6, 0, 252, 213, 6, 0, 61, 215, 6, 0, 124, 216, 6, 0, 189, 217, 6, 0, 252, 218, 6, 0, 61, 220, 6, 0, 124, 221, 6, 0, 189, 222, 6, 0, 252, 223, 6, 0, 61, 225, 6, 0, 124, 226, 6, 0, 189, 227, 6, 0, 252, 228, 6, 0, 61, 230, 6, 0, 124, 231, 6, 0, 189, 232, 6, 0, 252, 233, 6, 0, 61, 235, 6, 0, 124, 236, 6, 0, 189, 237, 6, 0, 252, 238, 6, 0, 61, 240, 6, 0, 124, 241, 6, 0, 189, 242, 6, 0, 252, 243, 6, 0, 61, 245, 6, 0, 124, 246, 6, 0, 189, 247, 6, 0, 252, 248, 6, 0, 61, 250, 6, 0, 124, 251, 6, 0, 189, 252, 6, 0, 252, 253, 6, 0, 61, 255, 6, 0, 124, 0, 7, 0, 189, 1, 7, 0, 252, 2, 7, 0, 61, 4, 7, 0, 124, 5, 7, 0, 189, 6, 7, 0, 252, 7, 7, 0, 61, 9, 7, 0, 124, 10, 7, 0, 189, 11, 7, 0, 252, 12, 7, 0, 61, 14, 7, 0, 124, 15, 7, 0, 189, 16, 7, 0, 252, 17, 7, 0, 61, 19, 7, 0, 124, 20, 7, 0, 189, 21, 7, 0, 252, 22, 7, 0, 61, 24, 7, 0, 124, 25, 7, 0, 189, 26, 7, 0, 252, 27, 7, 0, 61, 29, 7, 0, 124, 30, 7, 0, 189, 31, 7, 0, 252, 32, 7, 0, 61, 34, 7, 0, 124, 35, 7, 0, 189, 36, 7, 0, 252, 37, 7, 0, 61, 39, 7, 0, 124, 40, 7, 0, 189, 41, 7, 0, 252, 42, 7, 0, 61, 44, 7, 0, 124, 45, 7, 0, 189, 46, 7, 0, 252, 47, 7, 0, 61, 49, 7, 0, 124, 50, 7, 0, 189, 51, 7, 0, 252, 52, 7, 0, 61, 54, 7, 0, 124, 55, 7, 0, 189, 56, 7, 0, 252, 57, 7, 0, 61, 59, 7, 0, 124, 60, 7, 0, 189, 61, 7, 0, 252, 62, 7, 0, 61, 64, 7, 0, 124, 65, 7, 0, 189, 66, 7, 0, 252, 67, 7, 0, 61, 69, 7, 0, 124, 70, 7, 0, 189, 71, 7, 0, 252, 72, 7, 0, 61, 74, 7, 0, 124, 75, 7, 0, 189, 76, 7, 0, 252, 77, 7, 0, 61, 79, 7, 0, 124, 80, 7, 0, 189, 81, 7, 0, 252, 82, 7, 0, 61, 84, 7, 0, 124, 85, 7, 0, 189, 86, 7, 0, 252, 87, 7, 0, 61, 89, 7, 0, 124, 90, 7, 0, 189, 91, 7, 0, 252, 92, 7, 0, 61, 94, 7, 0, 124, 95, 7, 0, 189, 96, 7, 0, 252, 97, 7, 0, 61, 99, 7, 0, 124, 100, 7, 0, 189, 101, 7, 0, 252, 102, 7, 0, 61, 104, 7, 0, 124, 105, 7, 0, 189, 106, 7, 0, 252, 107, 7, 0, 61, 109, 7, 0, 124, 110, 7, 0, 189, 111, 7, 0, 252, 112, 7, 0, 61, 114, 7, 0, 124, 115, 7, 0, 189, 116, 7, 0, 252, 117, 7, 0, 61, 119, 7, 0, 124, 120, 7, 0, 189, 121, 7, 0, 252, 122, 7, 0, 61, 124, 7, 0, 124, 125, 7, 0, 189, 126, 7, 0, 252, 127, 7, 0, 61, 129, 7, 0, 124, 130, 7, 0, 189, 131, 7, 0, 252, 132, 7, 0, 61, 134, 7, 0, 124, 135, 7, 0, 189, 136, 7, 0, 252, 137, 7, 0, 61, 139, 7, 0, 124, 140, 7, 0, 189, 141, 7, 0, 252, 142, 7, 0, 61, 144, 7, 0, 124, 145, 7, 0, 189, 146, 7, 0, 252, 147, 7, 0, 61, 149, 7, 0, 124, 150, 7, 0, 189, 151, 7, 0, 252, 152, 7, 0, 61, 154, 7, 0, 124, 155, 7, 0, 189, 156, 7, 0, 252, 157, 7, 0, 61, 159, 7, 0, 124, 160, 7, 0, 189, 161, 7, 0, 252, 162, 7, 0, 61, 164, 7, 0, 124, 165, 7, 0, 189, 166, 7, 0, 252, 167, 7, 0, 61, 169, 7, 0, 124, 170, 7, 0, 189, 171, 7, 0, 252, 172, 7, 0, 61, 174, 7, 0, 124, 175, 7, 0, 189, 176, 7, 0, 252, 177, 7, 0, 61, 179, 7, 0, 124, 180, 7, 0, 189, 181, 7, 0, 252, 182, 7, 0, 61, 184, 7, 0, 124, 185, 7, 0, 189, 186, 7, 0, 252, 187, 7, 0, 61, 189, 7, 0, 124, 190, 7, 0, 189, 191, 7, 0, 252, 192, 7, 0, 61, 194, 7, 0, 124, 195, 7, 0, 189, 196, 7, 0, 252, 197, 7, 0, 61, 199, 7, 0, 124, 200, 7, 0, 189, 201, 7, 0, 252, 202, 7, 0, 61, 204, 7, 0, 124, 205, 7, 0, 189, 206, 7, 0, 252, 207, 7, 0, 61, 209, 7, 0, 124, 210, 7, 0, 189, 211, 7, 0, 252, 212, 7, 0, 61, 214, 7, 0, 124, 215, 7, 0, 189, 216, 7, 0, 252, 217, 7, 0, 61, 219, 7, 0, 124, 220, 7, 0, 189, 221, 7, 0, 252, 222, 7, 0, 61, 224, 7, 0, 124, 225, 7, 0, 189, 226, 7, 0, 252, 227, 7, 0, 61, 229, 7, 0, 124, 230, 7, 0, 189, 231, 7, 0, 252, 232, 7, 0, 61, 234, 7, 0, 124, 235, 7, 0, 189, 236, 7, 0, 252, 237, 7, 0, 61, 239, 7, 0, 124, 240, 7, 0, 189, 241, 7, 0, 252, 242, 7, 0, 61, 244, 7, 0, 124, 245, 7, 0, 189, 246, 7, 0, 252, 247, 7, 0, 61, 249, 7, 0, 124, 250, 7, 0, 189, 251, 7, 0, 252, 252, 7, 0, 61, 254, 7, 0, 124, 255, 7, 0, 189, 0, 8, 0, 252, 1, 8, 0, 61, 3, 8, 0, 124, 4, 8, 0, 189, 5, 8, 0, 252, 6, 8, 0, 61, 8, 8, 0, 124, 9, 8, 0, 189, 10, 8, 0, 252, 11, 8, 0, 61, 13, 8, 0, 124, 14, 8, 0, 189, 15, 8, 0, 252, 16, 8, 0, 61, 18, 8, 0, 124, 19, 8, 0, 189, 20, 8, 0, 252, 21, 8, 0, 61, 23, 8, 0, 124, 24, 8, 0, 189, 25, 8, 0, 252, 26, 8, 0, 61, 28, 8, 0, 124, 29, 8, 0, 189, 30, 8, 0, 252, 31, 8, 0, 61, 33, 8, 0, 124, 34, 8, 0, 189, 35, 8, 0, 252, 36, 8, 0, 61, 38, 8, 0, 124, 39, 8, 0, 189, 40, 8, 0, 252, 41, 8, 0, 61, 43, 8, 0, 124, 44, 8, 0, 189, 45, 8, 0, 252, 46, 8, 0, 61, 48, 8, 0, 124, 49, 8, 0, 189, 50, 8, 0, 252, 51, 8, 0, 61, 53, 8, 0, 124, 54, 8, 0, 189, 55, 8, 0, 252, 56, 8, 0, 61, 58, 8, 0, 124, 59, 8, 0, 189, 60, 8, 0, 252, 61, 8, 0, 61, 63, 8, 0, 124, 64, 8, 0, 189, 65, 8, 0, 252, 66, 8, 0, 61, 68, 8, 0, 124, 69, 8, 0, 189, 70, 8, 0, 252, 71, 8, 0, 61, 73, 8, 0, 124, 74, 8, 0, 189, 75, 8, 0, 252, 76, 8, 0, 61, 78, 8, 0, 124, 79, 8, 0, 189, 80, 8, 0, 252, 81, 8, 0, 61, 83, 8, 0, 124, 84, 8, 0, 189, 85, 8, 0, 252, 86, 8, 0, 61, 88, 8, 0, 124, 89, 8, 0, 189, 90, 8, 0, 252, 91, 8, 0, 61, 93, 8, 0, 124, 94, 8, 0, 189, 95, 8, 0, 252, 96, 8, 0, 61, 98, 8, 0, 124, 99, 8, 0, 189, 100, 8, 0, 252, 101, 8, 0, 61, 103, 8, 0, 124, 104, 8, 0, 189, 105, 8, 0, 252, 106, 8, 0, 61, 108, 8, 0, 124, 109, 8, 0, 189, 110, 8, 0, 252, 111, 8, 0, 61, 113, 8, 0, 124, 114, 8, 0, 189, 115, 8, 0, 252, 116, 8, 0, 61, 118, 8, 0, 124, 119, 8, 0, 189, 120, 8, 0, 252, 121, 8, 0, 61, 123, 8, 0, 124, 124, 8, 0, 189, 125, 8, 0, 252, 126, 8, 0, 61, 128, 8, 0, 124, 129, 8, 0, 189, 130, 8, 0, 252, 131, 8, 0, 61, 133, 8, 0, 124, 134, 8, 0, 189, 135, 8, 0, 252, 136, 8, 0, 61, 138, 8, 0, 124, 139, 8, 0, 189, 140, 8, 0, 252, 141, 8, 0, 61, 143, 8, 0, 124, 144, 8, 0, 189, 145, 8, 0, 252, 146, 8, 0, 61, 148, 8, 0, 124, 149, 8, 0, 189, 150, 8, 0, 252, 151, 8, 0, 61, 153, 8, 0, 124, 154, 8, 0, 189, 155, 8, 0, 252, 156, 8, 0, 61, 158, 8, 0, 124, 159, 8, 0, 189, 160, 8, 0, 252, 161, 8, 0, 61, 163, 8, 0, 124, 164, 8, 0, 189, 165, 8, 0, 252, 166, 8, 0, 61, 168, 8, 0, 124, 169, 8, 0, 189, 170, 8, 0, 252, 171, 8, 0, 61, 173, 8, 0, 124, 174, 8, 0, 189, 175, 8, 0, 252, 176, 8, 0, 61, 178, 8, 0, 124, 179, 8, 0, 189, 180, 8, 0, 252, 181, 8, 0, 61, 183, 8, 0, 124, 184, 8, 0, 189, 185, 8, 0, 252, 186, 8, 0, 61, 188, 8, 0, 124, 189, 8, 0, 189, 190, 8, 0, 252, 191, 8, 0, 61, 193, 8, 0, 124, 194, 8, 0, 189, 195, 8, 0, 252, 196, 8, 0, 61, 198, 8, 0, 124, 199, 8, 0, 189, 200, 8, 0, 252, 201, 8, 0, 61, 203, 8, 0, 124, 204, 8, 0, 189, 205, 8, 0, 252, 206, 8, 0, 61, 208, 8, 0, 124, 209, 8, 0, 189, 210, 8, 0, 252, 211, 8, 0, 61, 213, 8, 0, 124, 214, 8, 0, 189, 215, 8, 0, 252, 216, 8, 0, 61, 218, 8, 0, 124, 219, 8, 0, 189, 220, 8, 0, 252, 221, 8, 0, 61, 223, 8, 0, 124, 224, 8, 0, 189, 225, 8, 0, 252, 226, 8, 0, 61, 228, 8, 0, 124, 229, 8, 0, 189, 230, 8, 0, 252, 231, 8, 0, 61, 233, 8, 0, 124, 234, 8, 0, 189, 235, 8, 0, 252, 236, 8, 0, 61, 238, 8, 0, 124, 239, 8, 0, 189, 240, 8, 0, 252, 241, 8, 0, 61, 243, 8, 0, 124, 244, 8, 0, 189, 245, 8, 0, 252, 246, 8, 0, 61, 248, 8, 0, 124, 249, 8, 0, 189, 250, 8, 0, 252, 251, 8, 0, 61, 253, 8, 0, 124, 254, 8, 0, 189, 255, 8, 0, 252, 0, 9, 0, 61, 2, 9, 0, 124, 3, 9, 0, 189, 4, 9, 0, 252, 5, 9, 0, 61, 7, 9, 0, 124, 8, 9, 0, 189, 9, 9, 0, 252, 10, 9, 0, 61, 12, 9, 0, 124, 13, 9, 0, 189, 14, 9, 0, 252, 15, 9, 0, 61, 17, 9, 0, 124, 18, 9, 0, 189, 19, 9, 0, 252, 20, 9, 0, 61, 22, 9, 0, 124, 23, 9, 0, 189, 24, 9, 0, 252, 25, 9, 0, 61, 27, 9, 0, 124, 28, 9, 0, 189, 29, 9, 0, 252, 30, 9, 0, 61, 32, 9, 0, 124, 33, 9, 0, 189, 34, 9, 0, 252, 35, 9, 0, 61, 37, 9, 0, 124, 38, 9, 0, 189, 39, 9, 0, 252, 40, 9, 0, 61, 42, 9, 0, 124, 43, 9, 0, 189, 44, 9, 0, 252, 45, 9, 0, 61, 47, 9, 0, 124, 48, 9, 0, 189, 49, 9, 0, 252, 50, 9, 0, 61, 52, 9, 0, 124, 53, 9, 0, 189, 54, 9, 0, 252, 55, 9, 0, 61, 57, 9, 0, 124, 58, 9, 0, 189, 59, 9, 0, 252, 60, 9, 0, 61, 62, 9, 0, 124, 63, 9, 0, 189, 64, 9, 0, 252, 65, 9, 0, 61, 67, 9, 0, 124, 68, 9, 0, 189, 69, 9, 0, 252, 70, 9, 0, 61, 72, 9, 0, 124, 73, 9, 0, 189, 74, 9, 0, 252, 75, 9, 0, 61, 77, 9, 0, 124, 78, 9, 0, 189, 79, 9, 0, 252, 80, 9, 0, 61, 82, 9, 0, 124, 83, 9, 0, 189, 84, 9, 0, 252, 85, 9, 0, 61, 87, 9, 0, 124, 88, 9, 0, 189, 89, 9, 0, 252, 90, 9, 0, 61, 92, 9, 0, 124, 93, 9, 0, 189, 94, 9, 0, 252, 95, 9, 0, 61, 97, 9, 0, 124, 98, 9, 0, 189, 99, 9, 0, 252, 100, 9, 0, 61, 102, 9, 0, 124, 103, 9, 0, 189, 104, 9, 0, 252, 105, 9, 0, 61, 107, 9, 0, 124, 108, 9, 0, 189, 109, 9, 0, 252, 110, 9, 0, 61, 112, 9, 0, 124, 113, 9, 0, 189, 114, 9, 0, 252, 115, 9, 0, 61, 117, 9, 0, 124, 118, 9, 0, 189, 119, 9, 0, 252, 120, 9, 0, 61, 122, 9, 0, 124, 123, 9, 0, 189, 124, 9, 0, 252, 125, 9, 0, 61, 127, 9, 0, 124, 128, 9, 0, 189, 129, 9, 0, 252, 130, 9, 0, 61, 132, 9, 0, 124, 133, 9, 0, 189, 134, 9, 0, 252, 135, 9, 0, 61, 137, 9, 0, 124, 138, 9, 0, 189, 139, 9, 0, 252, 140, 9, 0, 61, 142, 9, 0, 124, 143, 9, 0, 189, 144, 9, 0, 252, 145, 9, 0, 61, 147, 9, 0, 124, 148, 9, 0, 189, 149, 9, 0, 252, 150, 9, 0, 61, 152, 9, 0, 124, 153, 9, 0, 189, 154, 9, 0, 252, 155, 9, 0, 61, 157, 9, 0, 124, 158, 9, 0, 189, 159, 9, 0, 252, 160, 9, 0, 61, 162, 9, 0, 124, 163, 9, 0, 189, 164, 9, 0, 252, 165, 9, 0, 61, 167, 9, 0, 124, 168, 9, 0, 189, 169, 9, 0, 252, 170, 9, 0, 61, 172, 9, 0, 124, 173, 9, 0, 189, 174, 9, 0, 252, 175, 9, 0, 61, 177, 9, 0, 124, 178, 9, 0, 189, 179, 9, 0, 252, 180, 9, 0, 61, 182, 9, 0, 124, 183, 9, 0, 189, 184, 9, 0, 252, 185, 9, 0, 61, 187, 9, 0, 124, 188, 9, 0, 189, 189, 9, 0, 252, 190, 9, 0, 61, 192, 9, 0, 124, 193, 9, 0, 189, 194, 9, 0, 252, 195, 9, 0, 61, 197, 9, 0, 124, 198, 9, 0, 189, 199, 9, 0, 252, 200, 9, 0, 61, 202, 9, 0, 124, 203, 9, 0, 189, 204, 9, 0, 252, 205, 9, 0, 61, 207, 9, 0, 124, 208, 9, 0, 189, 209, 9, 0, 252, 210, 9, 0, 61, 212, 9, 0, 124, 213, 9, 0, 189, 214, 9, 0, 252, 215, 9, 0, 61, 217, 9, 0, 124, 218, 9, 0, 189, 219, 9, 0, 252, 220, 9, 0, 61, 222, 9, 0, 124, 223, 9, 0, 189, 224, 9, 0, 252, 225, 9, 0, 61, 227, 9, 0, 124, 228, 9, 0, 189, 229, 9, 0, 252, 230, 9, 0, 61, 232, 9, 0, 124, 233, 9, 0, 189, 234, 9, 0, 252, 235, 9, 0, 61, 237, 9, 0, 124, 238, 9, 0, 189, 239, 9, 0, 252, 240, 9, 0, 61, 242, 9, 0, 124, 243, 9, 0, 189, 244, 9, 0, 252, 245, 9, 0, 61, 247, 9, 0, 124, 248, 9, 0, 189, 249, 9, 0, 252, 250, 9, 0, 61, 252, 9, 0, 124, 253, 9, 0, 189, 254, 9, 0, 252, 255, 9, 0, 61, 1, 10, 0, 124, 2, 10, 0, 189, 3, 10, 0, 252, 4, 10, 0, 61, 6, 10, 0, 124, 7, 10, 0, 189, 8, 10, 0, 252, 9, 10, 0, 61, 11, 10, 0, 124, 12, 10, 0, 189, 13, 10, 0, 252, 14, 10, 0, 61, 16, 10, 0, 124, 17, 10, 0, 189, 18, 10, 0, 252, 19, 10, 0, 61, 21, 10, 0, 124, 22, 10, 0, 189, 23, 10, 0, 252, 24, 10, 0, 61, 26, 10, 0, 124, 27, 10, 0, 189, 28, 10, 0, 252, 29, 10, 0, 61, 31, 10, 0, 124, 32, 10, 0, 189, 33, 10, 0, 252, 34, 10, 0, 61, 36, 10, 0, 124, 37, 10, 0, 189, 38, 10, 0, 252, 39, 10, 0, 61, 41, 10, 0, 124, 42, 10, 0, 189, 43, 10, 0, 252, 44, 10, 0, 61, 46, 10, 0, 124, 47, 10, 0, 189, 48, 10, 0, 252, 49, 10, 0, 61, 51, 10, 0, 124, 52, 10, 0, 189, 53, 10, 0, 252, 54, 10, 0, 61, 56, 10, 0, 124, 57, 10, 0, 189, 58, 10, 0, 252, 59, 10, 0, 61, 61, 10, 0, 124, 62, 10, 0, 189, 63, 10, 0, 252, 64, 10, 0, 61, 66, 10, 0, 124, 67, 10, 0, 189, 68, 10, 0, 252, 69, 10, 0, 61, 71, 10, 0, 124, 72, 10, 0, 189, 73, 10, 0, 252, 74, 10, 0, 61, 76, 10, 0, 124, 77, 10, 0, 189, 78, 10, 0, 252, 79, 10, 0, 61, 81, 10, 0, 124, 82, 10, 0, 189, 83, 10, 0, 252, 84, 10, 0, 61, 86, 10, 0, 124, 87, 10, 0, 189, 88, 10, 0, 252, 89, 10, 0, 61, 91, 10, 0, 124, 92, 10, 0, 189, 93, 10, 0, 252, 94, 10, 0, 61, 96, 10, 0, 124, 97, 10, 0, 189, 98, 10, 0, 252, 99, 10, 0, 61, 101, 10, 0, 124, 102, 10, 0, 189, 103, 10, 0, 252, 104, 10, 0, 61, 106, 10, 0, 124, 107, 10, 0, 189, 108, 10, 0, 252, 109, 10, 0, 61, 111, 10, 0, 124, 112, 10, 0, 189, 113, 10, 0, 252, 114, 10, 0, 61, 116, 10, 0, 124, 117, 10, 0, 189, 118, 10, 0, 252, 119, 10, 0, 61, 121, 10, 0, 124, 122, 10, 0, 189, 123, 10, 0, 252, 124, 10, 0, 61, 126, 10, 0, 124, 127, 10, 0, 189, 128, 10, 0, 252, 129, 10, 0, 61, 131, 10, 0, 124, 132, 10, 0, 189, 133, 10, 0, 252, 134, 10, 0, 61, 136, 10, 0, 124, 137, 10, 0, 189, 138, 10, 0, 252, 139, 10, 0, 61, 141, 10, 0, 124, 142, 10, 0, 189, 143, 10, 0, 252, 144, 10, 0, 61, 146, 10, 0, 124, 147, 10, 0, 189, 148, 10, 0, 252, 149, 10, 0, 61, 151, 10, 0, 124, 152, 10, 0, 189, 153, 10, 0, 252, 154, 10, 0, 61, 156, 10, 0, 124, 157, 10, 0, 189, 158, 10, 0, 252, 159, 10, 0, 61, 161, 10, 0, 124, 162, 10, 0, 189, 163, 10, 0, 252, 164, 10, 0, 61, 166, 10, 0, 124, 167, 10, 0, 189, 168, 10, 0, 252, 169, 10, 0, 61, 171, 10, 0, 124, 172, 10, 0, 189, 173, 10, 0, 252, 174, 10, 0, 61, 176, 10, 0, 124, 177, 10, 0, 189, 178, 10, 0, 252, 179, 10, 0, 61, 181, 10, 0, 124, 182, 10, 0, 189, 183, 10, 0, 252, 184, 10, 0, 61, 186, 10, 0, 124, 187, 10, 0, 189, 188, 10, 0, 252, 189, 10, 0, 61, 191, 10, 0, 124, 192, 10, 0, 189, 193, 10, 0, 252, 194, 10, 0, 61, 196, 10, 0, 124, 197, 10, 0, 189, 198, 10, 0, 252, 199, 10, 0, 61, 201, 10, 0, 124, 202, 10, 0, 189, 203, 10, 0, 252, 204, 10, 0, 61, 206, 10, 0, 124, 207, 10, 0, 189, 208, 10, 0, 252, 209, 10, 0, 61, 211, 10, 0, 124, 212, 10, 0, 189, 213, 10, 0, 252, 214, 10, 0, 61, 216, 10, 0, 124, 217, 10, 0, 189, 218, 10, 0, 252, 219, 10, 0, 61, 221, 10, 0, 124, 222, 10, 0, 189, 223, 10, 0, 252, 224, 10, 0, 61, 226, 10, 0, 124, 227, 10, 0, 189, 228, 10, 0, 252, 229, 10, 0, 61, 231, 10, 0, 124, 232, 10, 0, 189, 233, 10, 0, 252, 234, 10, 0, 61, 236, 10, 0, 124, 237, 10, 0, 189, 238, 10, 0, 252, 239, 10, 0, 61, 241, 10, 0, 124, 242, 10, 0, 189, 243, 10, 0, 252, 244, 10, 0, 61, 246, 10, 0, 124, 247, 10, 0, 189, 248, 10, 0, 252, 249, 10, 0, 61, 251, 10, 0, 124, 252, 10, 0, 189, 253, 10, 0, 252, 254, 10, 0, 61, 0, 11, 0, 124, 1, 11, 0, 189, 2, 11, 0, 252, 3, 11, 0, 61, 5, 11, 0, 124, 6, 11, 0, 189, 7, 11, 0, 252, 8, 11, 0, 61, 10, 11, 0, 124, 11, 11, 0, 189, 12, 11, 0, 252, 13, 11, 0, 61, 15, 11, 0, 124, 16, 11, 0, 189, 17, 11, 0, 252, 18, 11, 0, 61, 20, 11, 0, 124, 21, 11, 0, 189, 22, 11, 0, 252, 23, 11, 0, 61, 25, 11, 0, 124, 26, 11, 0, 189, 27, 11, 0, 252, 28, 11, 0, 61, 30, 11, 0, 124, 31, 11, 0, 189, 32, 11, 0, 252, 33, 11, 0, 61, 35, 11, 0, 124, 36, 11, 0, 189, 37, 11, 0, 252, 38, 11, 0, 61, 40, 11, 0, 124, 41, 11, 0, 189, 42, 11, 0, 252, 43, 11, 0, 61, 45, 11, 0, 124, 46, 11, 0, 189, 47, 11, 0, 252, 48, 11, 0, 61, 50, 11, 0, 124, 51, 11, 0, 189, 52, 11, 0, 252, 53, 11, 0, 61, 55, 11, 0, 124, 56, 11, 0, 189, 57, 11, 0, 252, 58, 11, 0, 61, 60, 11, 0, 124, 61, 11, 0, 189, 62, 11, 0, 252, 63, 11, 0, 61, 65, 11, 0, 124, 66, 11, 0, 189, 67, 11, 0, 252, 68, 11, 0, 61, 70, 11, 0, 124, 71, 11, 0, 189, 72, 11, 0, 252, 73, 11, 0, 61, 75, 11, 0, 124, 76, 11, 0, 189, 77, 11, 0, 252, 78, 11, 0, 61, 80, 11, 0, 124, 81, 11, 0, 189, 82, 11, 0, 252, 83, 11, 0, 61, 85, 11, 0, 124, 86, 11, 0, 189, 87, 11, 0, 252, 88, 11, 0, 61, 90, 11, 0, 124, 91, 11, 0, 189, 92, 11, 0, 252, 93, 11, 0, 61, 95, 11, 0, 124, 96, 11, 0, 189, 97, 11, 0, 252, 98, 11, 0, 61, 100, 11, 0, 124, 101, 11, 0, 189, 102, 11, 0, 252, 103, 11, 0, 61, 105, 11, 0, 124, 106, 11, 0, 189, 107, 11, 0, 252, 108, 11, 0, 61, 110, 11, 0, 124, 111, 11, 0, 189, 112, 11, 0, 252, 113, 11, 0, 61, 115, 11, 0, 124, 116, 11, 0, 189, 117, 11, 0, 252, 118, 11, 0, 61, 120, 11, 0, 124, 121, 11, 0, 189, 122, 11, 0, 252, 123, 11, 0, 61, 125, 11, 0, 124, 126, 11, 0, 189, 127, 11, 0, 252, 128, 11, 0, 61, 130, 11, 0, 124, 131, 11, 0, 189, 132, 11, 0, 252, 133, 11, 0, 61, 135, 11, 0, 124, 136, 11, 0, 189, 137, 11, 0, 252, 138, 11, 0, 61, 140, 11, 0, 124, 141, 11, 0, 189, 142, 11, 0, 252, 143, 11, 0, 61, 145, 11, 0, 124, 146, 11, 0, 189, 147, 11, 0, 252, 148, 11, 0, 61, 150, 11, 0, 124, 151, 11, 0, 189, 152, 11, 0, 252, 153, 11, 0, 61, 155, 11, 0, 124, 156, 11, 0, 189, 157, 11, 0, 252, 158, 11, 0, 61, 160, 11, 0, 124, 161, 11, 0, 189, 162, 11, 0, 252, 163, 11, 0, 61, 165, 11, 0, 124, 166, 11, 0, 189, 167, 11, 0, 252, 168, 11, 0, 61, 170, 11, 0, 124, 171, 11, 0, 189, 172, 11, 0, 252, 173, 11, 0, 61, 175, 11, 0, 124, 176, 11, 0, 189, 177, 11, 0, 252, 178, 11, 0, 61, 180, 11, 0, 124, 181, 11, 0, 189, 182, 11, 0, 252, 183, 11, 0, 61, 185, 11, 0, 124, 186, 11, 0, 189, 187, 11, 0, 252, 188, 11, 0, 61, 190, 11, 0, 124, 191, 11, 0, 189, 192, 11, 0, 252, 193, 11, 0, 61, 195, 11, 0, 124, 196, 11, 0, 189, 197, 11, 0, 252, 198, 11, 0, 61, 200, 11, 0, 124, 201, 11, 0, 189, 202, 11, 0, 252, 203, 11, 0, 61, 205, 11, 0, 124, 206, 11, 0, 189, 207, 11, 0, 252, 208, 11, 0, 61, 210, 11, 0, 124, 211, 11, 0, 189, 212, 11, 0, 252, 213, 11, 0, 61, 215, 11, 0, 124, 216, 11, 0, 189, 217, 11, 0, 252, 218, 11, 0, 61, 220, 11, 0, 124, 221, 11, 0, 189, 222, 11, 0, 252, 223, 11, 0, 61, 225, 11, 0, 124, 226, 11, 0, 189, 227, 11, 0, 252, 228, 11, 0, 61, 230, 11, 0, 124, 231, 11, 0, 189, 232, 11, 0, 252, 233, 11, 0, 61, 235, 11, 0, 124, 236, 11, 0, 189, 237, 11, 0, 252, 238, 11, 0, 61, 240, 11, 0, 124, 241, 11, 0, 189, 242, 11, 0, 252, 243, 11, 0, 61, 245, 11, 0, 124, 246, 11, 0, 189, 247, 11, 0, 252, 248, 11, 0, 61, 250, 11, 0, 124, 251, 11, 0, 189, 252, 11, 0, 252, 253, 11, 0, 61, 255, 11, 0, 124, 0, 12, 0, 189, 1, 12, 0, 252, 2, 12, 0, 61, 4, 12, 0, 124, 5, 12, 0, 189, 6, 12, 0, 252, 7, 12, 0, 61, 9, 12, 0, 124, 10, 12, 0, 189, 11, 12, 0, 252, 12, 12, 0, 61, 14, 12, 0, 124, 15, 12, 0, 189, 16, 12, 0, 252, 17, 12, 0, 61, 19, 12, 0, 124, 20, 12, 0, 189, 21, 12, 0, 252, 22, 12, 0, 61, 24, 12, 0, 124, 25, 12, 0, 189, 26, 12, 0, 252, 27, 12, 0, 61, 29, 12, 0, 124, 30, 12, 0, 189, 31, 12, 0, 252, 32, 12, 0, 61, 34, 12, 0, 124, 35, 12, 0, 189, 36, 12, 0, 252, 37, 12, 0, 61, 39, 12, 0, 124, 40, 12, 0, 189, 41, 12, 0, 252, 42, 12, 0, 61, 44, 12, 0, 124, 45, 12, 0, 189, 46, 12, 0, 252, 47, 12, 0, 61, 49, 12, 0, 124, 50, 12, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_four_rising.json b/tests/recordings/logic_analyzer/test_measure_interval_same_channel_four_rising.json deleted file mode 100644 index cddd6c45..00000000 --- a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_four_rising.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [2], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 61, 1, 0, 0, 124, 2, 0, 0, 189, 3, 0, 0, 252, 4, 0, 0, 61, 6, 0, 0, 124, 7, 0, 0, 189, 8, 0, 0, 252, 9, 0, 0, 61, 11, 0, 0, 124, 12, 0, 0, 189, 13, 0, 0, 252, 14, 0, 0, 61, 16, 0, 0, 124, 17, 0, 0, 189, 18, 0, 0, 252, 19, 0, 0, 61, 21, 0, 0, 124, 22, 0, 0, 189, 23, 0, 0, 252, 24, 0, 0, 61, 26, 0, 0, 124, 27, 0, 0, 189, 28, 0, 0, 252, 29, 0, 0, 61, 31, 0, 0, 124, 32, 0, 0, 189, 33, 0, 0, 252, 34, 0, 0, 61, 36, 0, 0, 124, 37, 0, 0, 189, 38, 0, 0, 252, 39, 0, 0, 61, 41, 0, 0, 124, 42, 0, 0, 189, 43, 0, 0, 252, 44, 0, 0, 61, 46, 0, 0, 124, 47, 0, 0, 189, 48, 0, 0, 252, 49, 0, 0, 61, 51, 0, 0, 124, 52, 0, 0, 189, 53, 0, 0, 252, 54, 0, 0, 61, 56, 0, 0, 124, 57, 0, 0, 189, 58, 0, 0, 252, 59, 0, 0, 61, 61, 0, 0, 124, 62, 0, 0, 189, 63, 0, 0, 252, 64, 0, 0, 61, 66, 0, 0, 124, 67, 0, 0, 189, 68, 0, 0, 252, 69, 0, 0, 61, 71, 0, 0, 124, 72, 0, 0, 189, 73, 0, 0, 252, 74, 0, 0, 61, 76, 0, 0, 124, 77, 0, 0, 189, 78, 0, 0, 252, 79, 0, 0, 61, 81, 0, 0, 124, 82, 0, 0, 189, 83, 0, 0, 252, 84, 0, 0, 61, 86, 0, 0, 124, 87, 0, 0, 189, 88, 0, 0, 252, 89, 0, 0, 61, 91, 0, 0, 124, 92, 0, 0, 189, 93, 0, 0, 252, 94, 0, 0, 61, 96, 0, 0, 124, 97, 0, 0, 189, 98, 0, 0, 252, 99, 0, 0, 61, 101, 0, 0, 124, 102, 0, 0, 189, 103, 0, 0, 252, 104, 0, 0, 61, 106, 0, 0, 124, 107, 0, 0, 189, 108, 0, 0, 252, 109, 0, 0, 61, 111, 0, 0, 124, 112, 0, 0, 189, 113, 0, 0, 252, 114, 0, 0, 61, 116, 0, 0, 124, 117, 0, 0, 189, 118, 0, 0, 252, 119, 0, 0, 61, 121, 0, 0, 124, 122, 0, 0, 189, 123, 0, 0, 252, 124, 0, 0, 61, 126, 0, 0, 124, 127, 0, 0, 189, 128, 0, 0, 252, 129, 0, 0, 61, 131, 0, 0, 124, 132, 0, 0, 189, 133, 0, 0, 252, 134, 0, 0, 61, 136, 0, 0, 124, 137, 0, 0, 189, 138, 0, 0, 252, 139, 0, 0, 61, 141, 0, 0, 124, 142, 0, 0, 189, 143, 0, 0, 252, 144, 0, 0, 61, 146, 0, 0, 124, 147, 0, 0, 189, 148, 0, 0, 252, 149, 0, 0, 61, 151, 0, 0, 124, 152, 0, 0, 189, 153, 0, 0, 252, 154, 0, 0, 61, 156, 0, 0, 124, 157, 0, 0, 189, 158, 0, 0, 252, 159, 0, 0, 61, 161, 0, 0, 124, 162, 0, 0, 189, 163, 0, 0, 252, 164, 0, 0, 61, 166, 0, 0, 124, 167, 0, 0, 189, 168, 0, 0, 252, 169, 0, 0, 61, 171, 0, 0, 124, 172, 0, 0, 189, 173, 0, 0, 252, 174, 0, 0, 61, 176, 0, 0, 124, 177, 0, 0, 189, 178, 0, 0, 252, 179, 0, 0, 61, 181, 0, 0, 124, 182, 0, 0, 189, 183, 0, 0, 252, 184, 0, 0, 61, 186, 0, 0, 124, 187, 0, 0, 189, 188, 0, 0, 252, 189, 0, 0, 61, 191, 0, 0, 124, 192, 0, 0, 189, 193, 0, 0, 252, 194, 0, 0, 61, 196, 0, 0, 124, 197, 0, 0, 189, 198, 0, 0, 252, 199, 0, 0, 61, 201, 0, 0, 124, 202, 0, 0, 189, 203, 0, 0, 252, 204, 0, 0, 61, 206, 0, 0, 124, 207, 0, 0, 189, 208, 0, 0, 252, 209, 0, 0, 61, 211, 0, 0, 124, 212, 0, 0, 189, 213, 0, 0, 252, 214, 0, 0, 61, 216, 0, 0, 124, 217, 0, 0, 189, 218, 0, 0, 252, 219, 0, 0, 61, 221, 0, 0, 124, 222, 0, 0, 189, 223, 0, 0, 252, 224, 0, 0, 61, 226, 0, 0, 124, 227, 0, 0, 189, 228, 0, 0, 252, 229, 0, 0, 61, 231, 0, 0, 124, 232, 0, 0, 189, 233, 0, 0, 252, 234, 0, 0, 61, 236, 0, 0, 124, 237, 0, 0, 189, 238, 0, 0, 252, 239, 0, 0, 61, 241, 0, 0, 124, 242, 0, 0, 189, 243, 0, 0, 252, 244, 0, 0, 61, 246, 0, 0, 124, 247, 0, 0, 189, 248, 0, 0, 252, 249, 0, 0, 61, 251, 0, 0, 124, 252, 0, 0, 189, 253, 0, 0, 252, 254, 0, 0, 61, 0, 1, 0, 124, 1, 1, 0, 189, 2, 1, 0, 252, 3, 1, 0, 61, 5, 1, 0, 124, 6, 1, 0, 189, 7, 1, 0, 252, 8, 1, 0, 61, 10, 1, 0, 124, 11, 1, 0, 189, 12, 1, 0, 252, 13, 1, 0, 61, 15, 1, 0, 124, 16, 1, 0, 189, 17, 1, 0, 252, 18, 1, 0, 61, 20, 1, 0, 124, 21, 1, 0, 189, 22, 1, 0, 252, 23, 1, 0, 61, 25, 1, 0, 124, 26, 1, 0, 189, 27, 1, 0, 252, 28, 1, 0, 61, 30, 1, 0, 124, 31, 1, 0, 189, 32, 1, 0, 252, 33, 1, 0, 61, 35, 1, 0, 124, 36, 1, 0, 189, 37, 1, 0, 252, 38, 1, 0, 61, 40, 1, 0, 124, 41, 1, 0, 189, 42, 1, 0, 252, 43, 1, 0, 61, 45, 1, 0, 124, 46, 1, 0, 189, 47, 1, 0, 252, 48, 1, 0, 61, 50, 1, 0, 124, 51, 1, 0, 189, 52, 1, 0, 252, 53, 1, 0, 61, 55, 1, 0, 124, 56, 1, 0, 189, 57, 1, 0, 252, 58, 1, 0, 61, 60, 1, 0, 124, 61, 1, 0, 189, 62, 1, 0, 252, 63, 1, 0, 61, 65, 1, 0, 124, 66, 1, 0, 189, 67, 1, 0, 252, 68, 1, 0, 61, 70, 1, 0, 124, 71, 1, 0, 189, 72, 1, 0, 252, 73, 1, 0, 61, 75, 1, 0, 124, 76, 1, 0, 189, 77, 1, 0, 252, 78, 1, 0, 61, 80, 1, 0, 124, 81, 1, 0, 189, 82, 1, 0, 252, 83, 1, 0, 61, 85, 1, 0, 124, 86, 1, 0, 189, 87, 1, 0, 252, 88, 1, 0, 61, 90, 1, 0, 124, 91, 1, 0, 189, 92, 1, 0, 252, 93, 1, 0, 61, 95, 1, 0, 124, 96, 1, 0, 189, 97, 1, 0, 252, 98, 1, 0, 61, 100, 1, 0, 124, 101, 1, 0, 189, 102, 1, 0, 252, 103, 1, 0, 61, 105, 1, 0, 124, 106, 1, 0, 189, 107, 1, 0, 252, 108, 1, 0, 61, 110, 1, 0, 124, 111, 1, 0, 189, 112, 1, 0, 252, 113, 1, 0, 61, 115, 1, 0, 124, 116, 1, 0, 189, 117, 1, 0, 252, 118, 1, 0, 61, 120, 1, 0, 124, 121, 1, 0, 189, 122, 1, 0, 252, 123, 1, 0, 61, 125, 1, 0, 124, 126, 1, 0, 189, 127, 1, 0, 252, 128, 1, 0, 61, 130, 1, 0, 124, 131, 1, 0, 189, 132, 1, 0, 252, 133, 1, 0, 61, 135, 1, 0, 124, 136, 1, 0, 189, 137, 1, 0, 252, 138, 1, 0, 61, 140, 1, 0, 124, 141, 1, 0, 189, 142, 1, 0, 252, 143, 1, 0, 61, 145, 1, 0, 124, 146, 1, 0, 189, 147, 1, 0, 252, 148, 1, 0, 61, 150, 1, 0, 124, 151, 1, 0, 189, 152, 1, 0, 252, 153, 1, 0, 61, 155, 1, 0, 124, 156, 1, 0, 189, 157, 1, 0, 252, 158, 1, 0, 61, 160, 1, 0, 124, 161, 1, 0, 189, 162, 1, 0, 252, 163, 1, 0, 61, 165, 1, 0, 124, 166, 1, 0, 189, 167, 1, 0, 252, 168, 1, 0, 61, 170, 1, 0, 124, 171, 1, 0, 189, 172, 1, 0, 252, 173, 1, 0, 61, 175, 1, 0, 124, 176, 1, 0, 189, 177, 1, 0, 252, 178, 1, 0, 61, 180, 1, 0, 124, 181, 1, 0, 189, 182, 1, 0, 252, 183, 1, 0, 61, 185, 1, 0, 124, 186, 1, 0, 189, 187, 1, 0, 252, 188, 1, 0, 61, 190, 1, 0, 124, 191, 1, 0, 189, 192, 1, 0, 252, 193, 1, 0, 61, 195, 1, 0, 124, 196, 1, 0, 189, 197, 1, 0, 252, 198, 1, 0, 61, 200, 1, 0, 124, 201, 1, 0, 189, 202, 1, 0, 252, 203, 1, 0, 61, 205, 1, 0, 124, 206, 1, 0, 189, 207, 1, 0, 252, 208, 1, 0, 61, 210, 1, 0, 124, 211, 1, 0, 189, 212, 1, 0, 252, 213, 1, 0, 61, 215, 1, 0, 124, 216, 1, 0, 189, 217, 1, 0, 252, 218, 1, 0, 61, 220, 1, 0, 124, 221, 1, 0, 189, 222, 1, 0, 252, 223, 1, 0, 61, 225, 1, 0, 124, 226, 1, 0, 189, 227, 1, 0, 252, 228, 1, 0, 61, 230, 1, 0, 124, 231, 1, 0, 189, 232, 1, 0, 252, 233, 1, 0, 61, 235, 1, 0, 124, 236, 1, 0, 189, 237, 1, 0, 252, 238, 1, 0, 61, 240, 1, 0, 124, 241, 1, 0, 189, 242, 1, 0, 252, 243, 1, 0, 61, 245, 1, 0, 124, 246, 1, 0, 189, 247, 1, 0, 252, 248, 1, 0, 61, 250, 1, 0, 124, 251, 1, 0, 189, 252, 1, 0, 252, 253, 1, 0, 61, 255, 1, 0, 124, 0, 2, 0, 189, 1, 2, 0, 252, 2, 2, 0, 61, 4, 2, 0, 124, 5, 2, 0, 189, 6, 2, 0, 252, 7, 2, 0, 61, 9, 2, 0, 124, 10, 2, 0, 189, 11, 2, 0, 252, 12, 2, 0, 61, 14, 2, 0, 124, 15, 2, 0, 189, 16, 2, 0, 252, 17, 2, 0, 61, 19, 2, 0, 124, 20, 2, 0, 189, 21, 2, 0, 252, 22, 2, 0, 61, 24, 2, 0, 124, 25, 2, 0, 189, 26, 2, 0, 252, 27, 2, 0, 61, 29, 2, 0, 124, 30, 2, 0, 189, 31, 2, 0, 252, 32, 2, 0, 61, 34, 2, 0, 124, 35, 2, 0, 189, 36, 2, 0, 252, 37, 2, 0, 61, 39, 2, 0, 124, 40, 2, 0, 189, 41, 2, 0, 252, 42, 2, 0, 61, 44, 2, 0, 124, 45, 2, 0, 189, 46, 2, 0, 252, 47, 2, 0, 61, 49, 2, 0, 124, 50, 2, 0, 189, 51, 2, 0, 252, 52, 2, 0, 61, 54, 2, 0, 124, 55, 2, 0, 189, 56, 2, 0, 252, 57, 2, 0, 61, 59, 2, 0, 124, 60, 2, 0, 189, 61, 2, 0, 252, 62, 2, 0, 61, 64, 2, 0, 124, 65, 2, 0, 189, 66, 2, 0, 252, 67, 2, 0, 61, 69, 2, 0, 124, 70, 2, 0, 189, 71, 2, 0, 252, 72, 2, 0, 61, 74, 2, 0, 124, 75, 2, 0, 189, 76, 2, 0, 252, 77, 2, 0, 61, 79, 2, 0, 124, 80, 2, 0, 189, 81, 2, 0, 252, 82, 2, 0, 61, 84, 2, 0, 124, 85, 2, 0, 189, 86, 2, 0, 252, 87, 2, 0, 61, 89, 2, 0, 124, 90, 2, 0, 189, 91, 2, 0, 252, 92, 2, 0, 61, 94, 2, 0, 124, 95, 2, 0, 189, 96, 2, 0, 252, 97, 2, 0, 61, 99, 2, 0, 124, 100, 2, 0, 189, 101, 2, 0, 252, 102, 2, 0, 61, 104, 2, 0, 124, 105, 2, 0, 189, 106, 2, 0, 252, 107, 2, 0, 61, 109, 2, 0, 124, 110, 2, 0, 189, 111, 2, 0, 252, 112, 2, 0, 61, 114, 2, 0, 124, 115, 2, 0, 189, 116, 2, 0, 252, 117, 2, 0, 61, 119, 2, 0, 124, 120, 2, 0, 189, 121, 2, 0, 252, 122, 2, 0, 61, 124, 2, 0, 124, 125, 2, 0, 189, 126, 2, 0, 252, 127, 2, 0, 61, 129, 2, 0, 124, 130, 2, 0, 189, 131, 2, 0, 252, 132, 2, 0, 61, 134, 2, 0, 124, 135, 2, 0, 189, 136, 2, 0, 252, 137, 2, 0, 61, 139, 2, 0, 124, 140, 2, 0, 189, 141, 2, 0, 252, 142, 2, 0, 61, 144, 2, 0, 124, 145, 2, 0, 189, 146, 2, 0, 252, 147, 2, 0, 61, 149, 2, 0, 124, 150, 2, 0, 189, 151, 2, 0, 252, 152, 2, 0, 61, 154, 2, 0, 124, 155, 2, 0, 189, 156, 2, 0, 252, 157, 2, 0, 61, 159, 2, 0, 124, 160, 2, 0, 189, 161, 2, 0, 252, 162, 2, 0, 61, 164, 2, 0, 124, 165, 2, 0, 189, 166, 2, 0, 252, 167, 2, 0, 61, 169, 2, 0, 124, 170, 2, 0, 189, 171, 2, 0, 252, 172, 2, 0, 61, 174, 2, 0, 124, 175, 2, 0, 189, 176, 2, 0, 252, 177, 2, 0, 61, 179, 2, 0, 124, 180, 2, 0, 189, 181, 2, 0, 252, 182, 2, 0, 61, 184, 2, 0, 124, 185, 2, 0, 189, 186, 2, 0, 252, 187, 2, 0, 61, 189, 2, 0, 124, 190, 2, 0, 189, 191, 2, 0, 252, 192, 2, 0, 61, 194, 2, 0, 124, 195, 2, 0, 189, 196, 2, 0, 252, 197, 2, 0, 61, 199, 2, 0, 124, 200, 2, 0, 189, 201, 2, 0, 252, 202, 2, 0, 61, 204, 2, 0, 124, 205, 2, 0, 189, 206, 2, 0, 252, 207, 2, 0, 61, 209, 2, 0, 124, 210, 2, 0, 189, 211, 2, 0, 252, 212, 2, 0, 61, 214, 2, 0, 124, 215, 2, 0, 189, 216, 2, 0, 252, 217, 2, 0, 61, 219, 2, 0, 124, 220, 2, 0, 189, 221, 2, 0, 252, 222, 2, 0, 61, 224, 2, 0, 124, 225, 2, 0, 189, 226, 2, 0, 252, 227, 2, 0, 61, 229, 2, 0, 124, 230, 2, 0, 189, 231, 2, 0, 252, 232, 2, 0, 61, 234, 2, 0, 124, 235, 2, 0, 189, 236, 2, 0, 252, 237, 2, 0, 61, 239, 2, 0, 124, 240, 2, 0, 189, 241, 2, 0, 252, 242, 2, 0, 61, 244, 2, 0, 124, 245, 2, 0, 189, 246, 2, 0, 252, 247, 2, 0, 61, 249, 2, 0, 124, 250, 2, 0, 189, 251, 2, 0, 252, 252, 2, 0, 61, 254, 2, 0, 124, 255, 2, 0, 189, 0, 3, 0, 252, 1, 3, 0, 61, 3, 3, 0, 124, 4, 3, 0, 189, 5, 3, 0, 252, 6, 3, 0, 61, 8, 3, 0, 124, 9, 3, 0, 189, 10, 3, 0, 252, 11, 3, 0, 61, 13, 3, 0, 124, 14, 3, 0, 189, 15, 3, 0, 252, 16, 3, 0, 61, 18, 3, 0, 124, 19, 3, 0, 189, 20, 3, 0, 252, 21, 3, 0, 61, 23, 3, 0, 124, 24, 3, 0, 189, 25, 3, 0, 252, 26, 3, 0, 61, 28, 3, 0, 124, 29, 3, 0, 189, 30, 3, 0, 252, 31, 3, 0, 61, 33, 3, 0, 124, 34, 3, 0, 189, 35, 3, 0, 252, 36, 3, 0, 61, 38, 3, 0, 124, 39, 3, 0, 189, 40, 3, 0, 252, 41, 3, 0, 61, 43, 3, 0, 124, 44, 3, 0, 189, 45, 3, 0, 252, 46, 3, 0, 61, 48, 3, 0, 124, 49, 3, 0, 189, 50, 3, 0, 252, 51, 3, 0, 61, 53, 3, 0, 124, 54, 3, 0, 189, 55, 3, 0, 252, 56, 3, 0, 61, 58, 3, 0, 124, 59, 3, 0, 189, 60, 3, 0, 252, 61, 3, 0, 61, 63, 3, 0, 124, 64, 3, 0, 189, 65, 3, 0, 252, 66, 3, 0, 61, 68, 3, 0, 124, 69, 3, 0, 189, 70, 3, 0, 252, 71, 3, 0, 61, 73, 3, 0, 124, 74, 3, 0, 189, 75, 3, 0, 252, 76, 3, 0, 61, 78, 3, 0, 124, 79, 3, 0, 189, 80, 3, 0, 252, 81, 3, 0, 61, 83, 3, 0, 124, 84, 3, 0, 189, 85, 3, 0, 252, 86, 3, 0, 61, 88, 3, 0, 124, 89, 3, 0, 189, 90, 3, 0, 252, 91, 3, 0, 61, 93, 3, 0, 124, 94, 3, 0, 189, 95, 3, 0, 252, 96, 3, 0, 61, 98, 3, 0, 124, 99, 3, 0, 189, 100, 3, 0, 252, 101, 3, 0, 61, 103, 3, 0, 124, 104, 3, 0, 189, 105, 3, 0, 252, 106, 3, 0, 61, 108, 3, 0, 124, 109, 3, 0, 189, 110, 3, 0, 252, 111, 3, 0, 61, 113, 3, 0, 124, 114, 3, 0, 189, 115, 3, 0, 252, 116, 3, 0, 61, 118, 3, 0, 124, 119, 3, 0, 189, 120, 3, 0, 252, 121, 3, 0, 61, 123, 3, 0, 124, 124, 3, 0, 189, 125, 3, 0, 252, 126, 3, 0, 61, 128, 3, 0, 124, 129, 3, 0, 189, 130, 3, 0, 252, 131, 3, 0, 61, 133, 3, 0, 124, 134, 3, 0, 189, 135, 3, 0, 252, 136, 3, 0, 61, 138, 3, 0, 124, 139, 3, 0, 189, 140, 3, 0, 252, 141, 3, 0, 61, 143, 3, 0, 124, 144, 3, 0, 189, 145, 3, 0, 252, 146, 3, 0, 61, 148, 3, 0, 124, 149, 3, 0, 189, 150, 3, 0, 252, 151, 3, 0, 61, 153, 3, 0, 124, 154, 3, 0, 189, 155, 3, 0, 252, 156, 3, 0, 61, 158, 3, 0, 124, 159, 3, 0, 189, 160, 3, 0, 252, 161, 3, 0, 61, 163, 3, 0, 124, 164, 3, 0, 189, 165, 3, 0, 252, 166, 3, 0, 61, 168, 3, 0, 124, 169, 3, 0, 189, 170, 3, 0, 252, 171, 3, 0, 61, 173, 3, 0, 124, 174, 3, 0, 189, 175, 3, 0, 252, 176, 3, 0, 61, 178, 3, 0, 124, 179, 3, 0, 189, 180, 3, 0, 252, 181, 3, 0, 61, 183, 3, 0, 124, 184, 3, 0, 189, 185, 3, 0, 252, 186, 3, 0, 61, 188, 3, 0, 124, 189, 3, 0, 189, 190, 3, 0, 252, 191, 3, 0, 61, 193, 3, 0, 124, 194, 3, 0, 189, 195, 3, 0, 252, 196, 3, 0, 61, 198, 3, 0, 124, 199, 3, 0, 189, 200, 3, 0, 252, 201, 3, 0, 61, 203, 3, 0, 124, 204, 3, 0, 189, 205, 3, 0, 252, 206, 3, 0, 61, 208, 3, 0, 124, 209, 3, 0, 189, 210, 3, 0, 252, 211, 3, 0, 61, 213, 3, 0, 124, 214, 3, 0, 189, 215, 3, 0, 252, 216, 3, 0, 61, 218, 3, 0, 124, 219, 3, 0, 189, 220, 3, 0, 252, 221, 3, 0, 61, 223, 3, 0, 124, 224, 3, 0, 189, 225, 3, 0, 252, 226, 3, 0, 61, 228, 3, 0, 124, 229, 3, 0, 189, 230, 3, 0, 252, 231, 3, 0, 61, 233, 3, 0, 124, 234, 3, 0, 189, 235, 3, 0, 252, 236, 3, 0, 61, 238, 3, 0, 124, 239, 3, 0, 189, 240, 3, 0, 252, 241, 3, 0, 61, 243, 3, 0, 124, 244, 3, 0, 189, 245, 3, 0, 252, 246, 3, 0, 61, 248, 3, 0, 124, 249, 3, 0, 189, 250, 3, 0, 252, 251, 3, 0, 61, 253, 3, 0, 124, 254, 3, 0, 189, 255, 3, 0, 252, 0, 4, 0, 61, 2, 4, 0, 124, 3, 4, 0, 189, 4, 4, 0, 252, 5, 4, 0, 61, 7, 4, 0, 124, 8, 4, 0, 189, 9, 4, 0, 252, 10, 4, 0, 61, 12, 4, 0, 124, 13, 4, 0, 189, 14, 4, 0, 252, 15, 4, 0, 61, 17, 4, 0, 124, 18, 4, 0, 189, 19, 4, 0, 252, 20, 4, 0, 61, 22, 4, 0, 124, 23, 4, 0, 189, 24, 4, 0, 252, 25, 4, 0, 61, 27, 4, 0, 124, 28, 4, 0, 189, 29, 4, 0, 252, 30, 4, 0, 61, 32, 4, 0, 124, 33, 4, 0, 189, 34, 4, 0, 252, 35, 4, 0, 61, 37, 4, 0, 124, 38, 4, 0, 189, 39, 4, 0, 252, 40, 4, 0, 61, 42, 4, 0, 124, 43, 4, 0, 189, 44, 4, 0, 252, 45, 4, 0, 61, 47, 4, 0, 124, 48, 4, 0, 189, 49, 4, 0, 252, 50, 4, 0, 61, 52, 4, 0, 124, 53, 4, 0, 189, 54, 4, 0, 252, 55, 4, 0, 61, 57, 4, 0, 124, 58, 4, 0, 189, 59, 4, 0, 252, 60, 4, 0, 61, 62, 4, 0, 124, 63, 4, 0, 189, 64, 4, 0, 252, 65, 4, 0, 61, 67, 4, 0, 124, 68, 4, 0, 189, 69, 4, 0, 252, 70, 4, 0, 61, 72, 4, 0, 124, 73, 4, 0, 189, 74, 4, 0, 252, 75, 4, 0, 61, 77, 4, 0, 124, 78, 4, 0, 189, 79, 4, 0, 252, 80, 4, 0, 61, 82, 4, 0, 124, 83, 4, 0, 189, 84, 4, 0, 252, 85, 4, 0, 61, 87, 4, 0, 124, 88, 4, 0, 189, 89, 4, 0, 252, 90, 4, 0, 61, 92, 4, 0, 124, 93, 4, 0, 189, 94, 4, 0, 252, 95, 4, 0, 61, 97, 4, 0, 124, 98, 4, 0, 189, 99, 4, 0, 252, 100, 4, 0, 61, 102, 4, 0, 124, 103, 4, 0, 189, 104, 4, 0, 252, 105, 4, 0, 61, 107, 4, 0, 124, 108, 4, 0, 189, 109, 4, 0, 252, 110, 4, 0, 61, 112, 4, 0, 124, 113, 4, 0, 189, 114, 4, 0, 252, 115, 4, 0, 61, 117, 4, 0, 124, 118, 4, 0, 189, 119, 4, 0, 252, 120, 4, 0, 61, 122, 4, 0, 124, 123, 4, 0, 189, 124, 4, 0, 252, 125, 4, 0, 61, 127, 4, 0, 124, 128, 4, 0, 189, 129, 4, 0, 252, 130, 4, 0, 61, 132, 4, 0, 124, 133, 4, 0, 189, 134, 4, 0, 252, 135, 4, 0, 61, 137, 4, 0, 124, 138, 4, 0, 189, 139, 4, 0, 252, 140, 4, 0, 61, 142, 4, 0, 124, 143, 4, 0, 189, 144, 4, 0, 252, 145, 4, 0, 61, 147, 4, 0, 124, 148, 4, 0, 189, 149, 4, 0, 252, 150, 4, 0, 61, 152, 4, 0, 124, 153, 4, 0, 189, 154, 4, 0, 252, 155, 4, 0, 61, 157, 4, 0, 124, 158, 4, 0, 189, 159, 4, 0, 252, 160, 4, 0, 61, 162, 4, 0, 124, 163, 4, 0, 189, 164, 4, 0, 252, 165, 4, 0, 61, 167, 4, 0, 124, 168, 4, 0, 189, 169, 4, 0, 252, 170, 4, 0, 61, 172, 4, 0, 124, 173, 4, 0, 189, 174, 4, 0, 252, 175, 4, 0, 61, 177, 4, 0, 124, 178, 4, 0, 189, 179, 4, 0, 252, 180, 4, 0, 61, 182, 4, 0, 124, 183, 4, 0, 189, 184, 4, 0, 252, 185, 4, 0, 61, 187, 4, 0, 124, 188, 4, 0, 189, 189, 4, 0, 252, 190, 4, 0, 61, 192, 4, 0, 124, 193, 4, 0, 189, 194, 4, 0, 252, 195, 4, 0, 61, 197, 4, 0, 124, 198, 4, 0, 189, 199, 4, 0, 252, 200, 4, 0, 61, 202, 4, 0, 124, 203, 4, 0, 189, 204, 4, 0, 252, 205, 4, 0, 61, 207, 4, 0, 124, 208, 4, 0, 189, 209, 4, 0, 252, 210, 4, 0, 61, 212, 4, 0, 124, 213, 4, 0, 189, 214, 4, 0, 252, 215, 4, 0, 61, 217, 4, 0, 124, 218, 4, 0, 189, 219, 4, 0, 252, 220, 4, 0, 61, 222, 4, 0, 124, 223, 4, 0, 189, 224, 4, 0, 252, 225, 4, 0, 61, 227, 4, 0, 124, 228, 4, 0, 189, 229, 4, 0, 252, 230, 4, 0, 61, 232, 4, 0, 124, 233, 4, 0, 189, 234, 4, 0, 252, 235, 4, 0, 61, 237, 4, 0, 124, 238, 4, 0, 189, 239, 4, 0, 252, 240, 4, 0, 61, 242, 4, 0, 124, 243, 4, 0, 189, 244, 4, 0, 252, 245, 4, 0, 61, 247, 4, 0, 124, 248, 4, 0, 189, 249, 4, 0, 252, 250, 4, 0, 61, 252, 4, 0, 124, 253, 4, 0, 189, 254, 4, 0, 252, 255, 4, 0, 61, 1, 5, 0, 124, 2, 5, 0, 189, 3, 5, 0, 252, 4, 5, 0, 61, 6, 5, 0, 124, 7, 5, 0, 189, 8, 5, 0, 252, 9, 5, 0, 61, 11, 5, 0, 124, 12, 5, 0, 189, 13, 5, 0, 252, 14, 5, 0, 61, 16, 5, 0, 124, 17, 5, 0, 189, 18, 5, 0, 252, 19, 5, 0, 61, 21, 5, 0, 124, 22, 5, 0, 189, 23, 5, 0, 252, 24, 5, 0, 61, 26, 5, 0, 124, 27, 5, 0, 189, 28, 5, 0, 252, 29, 5, 0, 61, 31, 5, 0, 124, 32, 5, 0, 189, 33, 5, 0, 252, 34, 5, 0, 61, 36, 5, 0, 124, 37, 5, 0, 189, 38, 5, 0, 252, 39, 5, 0, 61, 41, 5, 0, 124, 42, 5, 0, 189, 43, 5, 0, 252, 44, 5, 0, 61, 46, 5, 0, 124, 47, 5, 0, 189, 48, 5, 0, 252, 49, 5, 0, 61, 51, 5, 0, 124, 52, 5, 0, 189, 53, 5, 0, 252, 54, 5, 0, 61, 56, 5, 0, 124, 57, 5, 0, 189, 58, 5, 0, 252, 59, 5, 0, 61, 61, 5, 0, 124, 62, 5, 0, 189, 63, 5, 0, 252, 64, 5, 0, 61, 66, 5, 0, 124, 67, 5, 0, 189, 68, 5, 0, 252, 69, 5, 0, 61, 71, 5, 0, 124, 72, 5, 0, 189, 73, 5, 0, 252, 74, 5, 0, 61, 76, 5, 0, 124, 77, 5, 0, 189, 78, 5, 0, 252, 79, 5, 0, 61, 81, 5, 0, 124, 82, 5, 0, 189, 83, 5, 0, 252, 84, 5, 0, 61, 86, 5, 0, 124, 87, 5, 0, 189, 88, 5, 0, 252, 89, 5, 0, 61, 91, 5, 0, 124, 92, 5, 0, 189, 93, 5, 0, 252, 94, 5, 0, 61, 96, 5, 0, 124, 97, 5, 0, 189, 98, 5, 0, 252, 99, 5, 0, 61, 101, 5, 0, 124, 102, 5, 0, 189, 103, 5, 0, 252, 104, 5, 0, 61, 106, 5, 0, 124, 107, 5, 0, 189, 108, 5, 0, 252, 109, 5, 0, 61, 111, 5, 0, 124, 112, 5, 0, 189, 113, 5, 0, 252, 114, 5, 0, 61, 116, 5, 0, 124, 117, 5, 0, 189, 118, 5, 0, 252, 119, 5, 0, 61, 121, 5, 0, 124, 122, 5, 0, 189, 123, 5, 0, 252, 124, 5, 0, 61, 126, 5, 0, 124, 127, 5, 0, 189, 128, 5, 0, 252, 129, 5, 0, 61, 131, 5, 0, 124, 132, 5, 0, 189, 133, 5, 0, 252, 134, 5, 0, 61, 136, 5, 0, 124, 137, 5, 0, 189, 138, 5, 0, 252, 139, 5, 0, 61, 141, 5, 0, 124, 142, 5, 0, 189, 143, 5, 0, 252, 144, 5, 0, 61, 146, 5, 0, 124, 147, 5, 0, 189, 148, 5, 0, 252, 149, 5, 0, 61, 151, 5, 0, 124, 152, 5, 0, 189, 153, 5, 0, 252, 154, 5, 0, 61, 156, 5, 0, 124, 157, 5, 0, 189, 158, 5, 0, 252, 159, 5, 0, 61, 161, 5, 0, 124, 162, 5, 0, 189, 163, 5, 0, 252, 164, 5, 0, 61, 166, 5, 0, 124, 167, 5, 0, 189, 168, 5, 0, 252, 169, 5, 0, 61, 171, 5, 0, 124, 172, 5, 0, 189, 173, 5, 0, 252, 174, 5, 0, 61, 176, 5, 0, 124, 177, 5, 0, 189, 178, 5, 0, 252, 179, 5, 0, 61, 181, 5, 0, 124, 182, 5, 0, 189, 183, 5, 0, 252, 184, 5, 0, 61, 186, 5, 0, 124, 187, 5, 0, 189, 188, 5, 0, 252, 189, 5, 0, 61, 191, 5, 0, 124, 192, 5, 0, 189, 193, 5, 0, 252, 194, 5, 0, 61, 196, 5, 0, 124, 197, 5, 0, 189, 198, 5, 0, 252, 199, 5, 0, 61, 201, 5, 0, 124, 202, 5, 0, 189, 203, 5, 0, 252, 204, 5, 0, 61, 206, 5, 0, 124, 207, 5, 0, 189, 208, 5, 0, 252, 209, 5, 0, 61, 211, 5, 0, 124, 212, 5, 0, 189, 213, 5, 0, 252, 214, 5, 0, 61, 216, 5, 0, 124, 217, 5, 0, 189, 218, 5, 0, 252, 219, 5, 0, 61, 221, 5, 0, 124, 222, 5, 0, 189, 223, 5, 0, 252, 224, 5, 0, 61, 226, 5, 0, 124, 227, 5, 0, 189, 228, 5, 0, 252, 229, 5, 0, 61, 231, 5, 0, 124, 232, 5, 0, 189, 233, 5, 0, 252, 234, 5, 0, 61, 236, 5, 0, 124, 237, 5, 0, 189, 238, 5, 0, 252, 239, 5, 0, 61, 241, 5, 0, 124, 242, 5, 0, 189, 243, 5, 0, 252, 244, 5, 0, 61, 246, 5, 0, 124, 247, 5, 0, 189, 248, 5, 0, 252, 249, 5, 0, 61, 251, 5, 0, 124, 252, 5, 0, 189, 253, 5, 0, 252, 254, 5, 0, 61, 0, 6, 0, 124, 1, 6, 0, 189, 2, 6, 0, 252, 3, 6, 0, 61, 5, 6, 0, 124, 6, 6, 0, 189, 7, 6, 0, 252, 8, 6, 0, 61, 10, 6, 0, 124, 11, 6, 0, 189, 12, 6, 0, 252, 13, 6, 0, 61, 15, 6, 0, 124, 16, 6, 0, 189, 17, 6, 0, 252, 18, 6, 0, 61, 20, 6, 0, 124, 21, 6, 0, 189, 22, 6, 0, 252, 23, 6, 0, 61, 25, 6, 0, 124, 26, 6, 0, 189, 27, 6, 0, 252, 28, 6, 0, 61, 30, 6, 0, 124, 31, 6, 0, 189, 32, 6, 0, 252, 33, 6, 0, 61, 35, 6, 0, 124, 36, 6, 0, 189, 37, 6, 0, 252, 38, 6, 0, 61, 40, 6, 0, 124, 41, 6, 0, 189, 42, 6, 0, 252, 43, 6, 0, 61, 45, 6, 0, 124, 46, 6, 0, 189, 47, 6, 0, 252, 48, 6, 0, 61, 50, 6, 0, 124, 51, 6, 0, 189, 52, 6, 0, 252, 53, 6, 0, 61, 55, 6, 0, 124, 56, 6, 0, 189, 57, 6, 0, 252, 58, 6, 0, 61, 60, 6, 0, 124, 61, 6, 0, 189, 62, 6, 0, 252, 63, 6, 0, 61, 65, 6, 0, 124, 66, 6, 0, 189, 67, 6, 0, 252, 68, 6, 0, 61, 70, 6, 0, 124, 71, 6, 0, 189, 72, 6, 0, 252, 73, 6, 0, 61, 75, 6, 0, 124, 76, 6, 0, 189, 77, 6, 0, 252, 78, 6, 0, 61, 80, 6, 0, 124, 81, 6, 0, 189, 82, 6, 0, 252, 83, 6, 0, 61, 85, 6, 0, 124, 86, 6, 0, 189, 87, 6, 0, 252, 88, 6, 0, 61, 90, 6, 0, 124, 91, 6, 0, 189, 92, 6, 0, 252, 93, 6, 0, 61, 95, 6, 0, 124, 96, 6, 0, 189, 97, 6, 0, 252, 98, 6, 0, 61, 100, 6, 0, 124, 101, 6, 0, 189, 102, 6, 0, 252, 103, 6, 0, 61, 105, 6, 0, 124, 106, 6, 0, 189, 107, 6, 0, 252, 108, 6, 0, 61, 110, 6, 0, 124, 111, 6, 0, 189, 112, 6, 0, 252, 113, 6, 0, 61, 115, 6, 0, 124, 116, 6, 0, 189, 117, 6, 0, 252, 118, 6, 0, 61, 120, 6, 0, 124, 121, 6, 0, 189, 122, 6, 0, 252, 123, 6, 0, 61, 125, 6, 0, 124, 126, 6, 0, 189, 127, 6, 0, 252, 128, 6, 0, 61, 130, 6, 0, 124, 131, 6, 0, 189, 132, 6, 0, 252, 133, 6, 0, 61, 135, 6, 0, 124, 136, 6, 0, 189, 137, 6, 0, 252, 138, 6, 0, 61, 140, 6, 0, 124, 141, 6, 0, 189, 142, 6, 0, 252, 143, 6, 0, 61, 145, 6, 0, 124, 146, 6, 0, 189, 147, 6, 0, 252, 148, 6, 0, 61, 150, 6, 0, 124, 151, 6, 0, 189, 152, 6, 0, 252, 153, 6, 0, 61, 155, 6, 0, 124, 156, 6, 0, 189, 157, 6, 0, 252, 158, 6, 0, 61, 160, 6, 0, 124, 161, 6, 0, 189, 162, 6, 0, 252, 163, 6, 0, 61, 165, 6, 0, 124, 166, 6, 0, 189, 167, 6, 0, 252, 168, 6, 0, 61, 170, 6, 0, 124, 171, 6, 0, 189, 172, 6, 0, 252, 173, 6, 0, 61, 175, 6, 0, 124, 176, 6, 0, 189, 177, 6, 0, 252, 178, 6, 0, 61, 180, 6, 0, 124, 181, 6, 0, 189, 182, 6, 0, 252, 183, 6, 0, 61, 185, 6, 0, 124, 186, 6, 0, 189, 187, 6, 0, 252, 188, 6, 0, 61, 190, 6, 0, 124, 191, 6, 0, 189, 192, 6, 0, 252, 193, 6, 0, 61, 195, 6, 0, 124, 196, 6, 0, 189, 197, 6, 0, 252, 198, 6, 0, 61, 200, 6, 0, 124, 201, 6, 0, 189, 202, 6, 0, 252, 203, 6, 0, 61, 205, 6, 0, 124, 206, 6, 0, 189, 207, 6, 0, 252, 208, 6, 0, 61, 210, 6, 0, 124, 211, 6, 0, 189, 212, 6, 0, 252, 213, 6, 0, 61, 215, 6, 0, 124, 216, 6, 0, 189, 217, 6, 0, 252, 218, 6, 0, 61, 220, 6, 0, 124, 221, 6, 0, 189, 222, 6, 0, 252, 223, 6, 0, 61, 225, 6, 0, 124, 226, 6, 0, 189, 227, 6, 0, 252, 228, 6, 0, 61, 230, 6, 0, 124, 231, 6, 0, 189, 232, 6, 0, 252, 233, 6, 0, 61, 235, 6, 0, 124, 236, 6, 0, 189, 237, 6, 0, 252, 238, 6, 0, 61, 240, 6, 0, 124, 241, 6, 0, 189, 242, 6, 0, 252, 243, 6, 0, 61, 245, 6, 0, 124, 246, 6, 0, 189, 247, 6, 0, 252, 248, 6, 0, 61, 250, 6, 0, 124, 251, 6, 0, 189, 252, 6, 0, 252, 253, 6, 0, 61, 255, 6, 0, 124, 0, 7, 0, 189, 1, 7, 0, 252, 2, 7, 0, 61, 4, 7, 0, 124, 5, 7, 0, 189, 6, 7, 0, 252, 7, 7, 0, 61, 9, 7, 0, 124, 10, 7, 0, 189, 11, 7, 0, 252, 12, 7, 0, 61, 14, 7, 0, 124, 15, 7, 0, 189, 16, 7, 0, 252, 17, 7, 0, 61, 19, 7, 0, 124, 20, 7, 0, 189, 21, 7, 0, 252, 22, 7, 0, 61, 24, 7, 0, 124, 25, 7, 0, 189, 26, 7, 0, 252, 27, 7, 0, 61, 29, 7, 0, 124, 30, 7, 0, 189, 31, 7, 0, 252, 32, 7, 0, 61, 34, 7, 0, 124, 35, 7, 0, 189, 36, 7, 0, 252, 37, 7, 0, 61, 39, 7, 0, 124, 40, 7, 0, 189, 41, 7, 0, 252, 42, 7, 0, 61, 44, 7, 0, 124, 45, 7, 0, 189, 46, 7, 0, 252, 47, 7, 0, 61, 49, 7, 0, 124, 50, 7, 0, 189, 51, 7, 0, 252, 52, 7, 0, 61, 54, 7, 0, 124, 55, 7, 0, 189, 56, 7, 0, 252, 57, 7, 0, 61, 59, 7, 0, 124, 60, 7, 0, 189, 61, 7, 0, 252, 62, 7, 0, 61, 64, 7, 0, 124, 65, 7, 0, 189, 66, 7, 0, 252, 67, 7, 0, 61, 69, 7, 0, 124, 70, 7, 0, 189, 71, 7, 0, 252, 72, 7, 0, 61, 74, 7, 0, 124, 75, 7, 0, 189, 76, 7, 0, 252, 77, 7, 0, 61, 79, 7, 0, 124, 80, 7, 0, 189, 81, 7, 0, 252, 82, 7, 0, 61, 84, 7, 0, 124, 85, 7, 0, 189, 86, 7, 0, 252, 87, 7, 0, 61, 89, 7, 0, 124, 90, 7, 0, 189, 91, 7, 0, 252, 92, 7, 0, 61, 94, 7, 0, 124, 95, 7, 0, 189, 96, 7, 0, 252, 97, 7, 0, 61, 99, 7, 0, 124, 100, 7, 0, 189, 101, 7, 0, 252, 102, 7, 0, 61, 104, 7, 0, 124, 105, 7, 0, 189, 106, 7, 0, 252, 107, 7, 0, 61, 109, 7, 0, 124, 110, 7, 0, 189, 111, 7, 0, 252, 112, 7, 0, 61, 114, 7, 0, 124, 115, 7, 0, 189, 116, 7, 0, 252, 117, 7, 0, 61, 119, 7, 0, 124, 120, 7, 0, 189, 121, 7, 0, 252, 122, 7, 0, 61, 124, 7, 0, 124, 125, 7, 0, 189, 126, 7, 0, 252, 127, 7, 0, 61, 129, 7, 0, 124, 130, 7, 0, 189, 131, 7, 0, 252, 132, 7, 0, 61, 134, 7, 0, 124, 135, 7, 0, 189, 136, 7, 0, 252, 137, 7, 0, 61, 139, 7, 0, 124, 140, 7, 0, 189, 141, 7, 0, 252, 142, 7, 0, 61, 144, 7, 0, 124, 145, 7, 0, 189, 146, 7, 0, 252, 147, 7, 0, 61, 149, 7, 0, 124, 150, 7, 0, 189, 151, 7, 0, 252, 152, 7, 0, 61, 154, 7, 0, 124, 155, 7, 0, 189, 156, 7, 0, 252, 157, 7, 0, 61, 159, 7, 0, 124, 160, 7, 0, 189, 161, 7, 0, 252, 162, 7, 0, 61, 164, 7, 0, 124, 165, 7, 0, 189, 166, 7, 0, 252, 167, 7, 0, 61, 169, 7, 0, 124, 170, 7, 0, 189, 171, 7, 0, 252, 172, 7, 0, 61, 174, 7, 0, 124, 175, 7, 0, 189, 176, 7, 0, 252, 177, 7, 0, 61, 179, 7, 0, 124, 180, 7, 0, 189, 181, 7, 0, 252, 182, 7, 0, 61, 184, 7, 0, 124, 185, 7, 0, 189, 186, 7, 0, 252, 187, 7, 0, 61, 189, 7, 0, 124, 190, 7, 0, 189, 191, 7, 0, 252, 192, 7, 0, 61, 194, 7, 0, 124, 195, 7, 0, 189, 196, 7, 0, 252, 197, 7, 0, 61, 199, 7, 0, 124, 200, 7, 0, 189, 201, 7, 0, 252, 202, 7, 0, 61, 204, 7, 0, 124, 205, 7, 0, 189, 206, 7, 0, 252, 207, 7, 0, 61, 209, 7, 0, 124, 210, 7, 0, 189, 211, 7, 0, 252, 212, 7, 0, 61, 214, 7, 0, 124, 215, 7, 0, 189, 216, 7, 0, 252, 217, 7, 0, 61, 219, 7, 0, 124, 220, 7, 0, 189, 221, 7, 0, 252, 222, 7, 0, 61, 224, 7, 0, 124, 225, 7, 0, 189, 226, 7, 0, 252, 227, 7, 0, 61, 229, 7, 0, 124, 230, 7, 0, 189, 231, 7, 0, 252, 232, 7, 0, 61, 234, 7, 0, 124, 235, 7, 0, 189, 236, 7, 0, 252, 237, 7, 0, 61, 239, 7, 0, 124, 240, 7, 0, 189, 241, 7, 0, 252, 242, 7, 0, 61, 244, 7, 0, 124, 245, 7, 0, 189, 246, 7, 0, 252, 247, 7, 0, 61, 249, 7, 0, 124, 250, 7, 0, 189, 251, 7, 0, 252, 252, 7, 0, 61, 254, 7, 0, 124, 255, 7, 0, 189, 0, 8, 0, 252, 1, 8, 0, 61, 3, 8, 0, 124, 4, 8, 0, 189, 5, 8, 0, 252, 6, 8, 0, 61, 8, 8, 0, 124, 9, 8, 0, 189, 10, 8, 0, 252, 11, 8, 0, 61, 13, 8, 0, 124, 14, 8, 0, 189, 15, 8, 0, 252, 16, 8, 0, 61, 18, 8, 0, 124, 19, 8, 0, 189, 20, 8, 0, 252, 21, 8, 0, 61, 23, 8, 0, 124, 24, 8, 0, 189, 25, 8, 0, 252, 26, 8, 0, 61, 28, 8, 0, 124, 29, 8, 0, 189, 30, 8, 0, 252, 31, 8, 0, 61, 33, 8, 0, 124, 34, 8, 0, 189, 35, 8, 0, 252, 36, 8, 0, 61, 38, 8, 0, 124, 39, 8, 0, 189, 40, 8, 0, 252, 41, 8, 0, 61, 43, 8, 0, 124, 44, 8, 0, 189, 45, 8, 0, 252, 46, 8, 0, 61, 48, 8, 0, 124, 49, 8, 0, 189, 50, 8, 0, 252, 51, 8, 0, 61, 53, 8, 0, 124, 54, 8, 0, 189, 55, 8, 0, 252, 56, 8, 0, 61, 58, 8, 0, 124, 59, 8, 0, 189, 60, 8, 0, 252, 61, 8, 0, 61, 63, 8, 0, 124, 64, 8, 0, 189, 65, 8, 0, 252, 66, 8, 0, 61, 68, 8, 0, 124, 69, 8, 0, 189, 70, 8, 0, 252, 71, 8, 0, 61, 73, 8, 0, 124, 74, 8, 0, 189, 75, 8, 0, 252, 76, 8, 0, 61, 78, 8, 0, 124, 79, 8, 0, 189, 80, 8, 0, 252, 81, 8, 0, 61, 83, 8, 0, 124, 84, 8, 0, 189, 85, 8, 0, 252, 86, 8, 0, 61, 88, 8, 0, 124, 89, 8, 0, 189, 90, 8, 0, 252, 91, 8, 0, 61, 93, 8, 0, 124, 94, 8, 0, 189, 95, 8, 0, 252, 96, 8, 0, 61, 98, 8, 0, 124, 99, 8, 0, 189, 100, 8, 0, 252, 101, 8, 0, 61, 103, 8, 0, 124, 104, 8, 0, 189, 105, 8, 0, 252, 106, 8, 0, 61, 108, 8, 0, 124, 109, 8, 0, 189, 110, 8, 0, 252, 111, 8, 0, 61, 113, 8, 0, 124, 114, 8, 0, 189, 115, 8, 0, 252, 116, 8, 0, 61, 118, 8, 0, 124, 119, 8, 0, 189, 120, 8, 0, 252, 121, 8, 0, 61, 123, 8, 0, 124, 124, 8, 0, 189, 125, 8, 0, 252, 126, 8, 0, 61, 128, 8, 0, 124, 129, 8, 0, 189, 130, 8, 0, 252, 131, 8, 0, 61, 133, 8, 0, 124, 134, 8, 0, 189, 135, 8, 0, 252, 136, 8, 0, 61, 138, 8, 0, 124, 139, 8, 0, 189, 140, 8, 0, 252, 141, 8, 0, 61, 143, 8, 0, 124, 144, 8, 0, 189, 145, 8, 0, 252, 146, 8, 0, 61, 148, 8, 0, 124, 149, 8, 0, 189, 150, 8, 0, 252, 151, 8, 0, 61, 153, 8, 0, 124, 154, 8, 0, 189, 155, 8, 0, 252, 156, 8, 0, 61, 158, 8, 0, 124, 159, 8, 0, 189, 160, 8, 0, 252, 161, 8, 0, 61, 163, 8, 0, 124, 164, 8, 0, 189, 165, 8, 0, 252, 166, 8, 0, 61, 168, 8, 0, 124, 169, 8, 0, 189, 170, 8, 0, 252, 171, 8, 0, 61, 173, 8, 0, 124, 174, 8, 0, 189, 175, 8, 0, 252, 176, 8, 0, 61, 178, 8, 0, 124, 179, 8, 0, 189, 180, 8, 0, 252, 181, 8, 0, 61, 183, 8, 0, 124, 184, 8, 0, 189, 185, 8, 0, 252, 186, 8, 0, 61, 188, 8, 0, 124, 189, 8, 0, 189, 190, 8, 0, 252, 191, 8, 0, 61, 193, 8, 0, 124, 194, 8, 0, 189, 195, 8, 0, 252, 196, 8, 0, 61, 198, 8, 0, 124, 199, 8, 0, 189, 200, 8, 0, 252, 201, 8, 0, 61, 203, 8, 0, 124, 204, 8, 0, 189, 205, 8, 0, 252, 206, 8, 0, 61, 208, 8, 0, 124, 209, 8, 0, 189, 210, 8, 0, 252, 211, 8, 0, 61, 213, 8, 0, 124, 214, 8, 0, 189, 215, 8, 0, 252, 216, 8, 0, 61, 218, 8, 0, 124, 219, 8, 0, 189, 220, 8, 0, 252, 221, 8, 0, 61, 223, 8, 0, 124, 224, 8, 0, 189, 225, 8, 0, 252, 226, 8, 0, 61, 228, 8, 0, 124, 229, 8, 0, 189, 230, 8, 0, 252, 231, 8, 0, 61, 233, 8, 0, 124, 234, 8, 0, 189, 235, 8, 0, 252, 236, 8, 0, 61, 238, 8, 0, 124, 239, 8, 0, 189, 240, 8, 0, 252, 241, 8, 0, 61, 243, 8, 0, 124, 244, 8, 0, 189, 245, 8, 0, 252, 246, 8, 0, 61, 248, 8, 0, 124, 249, 8, 0, 189, 250, 8, 0, 252, 251, 8, 0, 61, 253, 8, 0, 124, 254, 8, 0, 189, 255, 8, 0, 252, 0, 9, 0, 61, 2, 9, 0, 124, 3, 9, 0, 189, 4, 9, 0, 252, 5, 9, 0, 61, 7, 9, 0, 124, 8, 9, 0, 189, 9, 9, 0, 252, 10, 9, 0, 61, 12, 9, 0, 124, 13, 9, 0, 189, 14, 9, 0, 252, 15, 9, 0, 61, 17, 9, 0, 124, 18, 9, 0, 189, 19, 9, 0, 252, 20, 9, 0, 61, 22, 9, 0, 124, 23, 9, 0, 189, 24, 9, 0, 252, 25, 9, 0, 61, 27, 9, 0, 124, 28, 9, 0, 189, 29, 9, 0, 252, 30, 9, 0, 61, 32, 9, 0, 124, 33, 9, 0, 189, 34, 9, 0, 252, 35, 9, 0, 61, 37, 9, 0, 124, 38, 9, 0, 189, 39, 9, 0, 252, 40, 9, 0, 61, 42, 9, 0, 124, 43, 9, 0, 189, 44, 9, 0, 252, 45, 9, 0, 61, 47, 9, 0, 124, 48, 9, 0, 189, 49, 9, 0, 252, 50, 9, 0, 61, 52, 9, 0, 124, 53, 9, 0, 189, 54, 9, 0, 252, 55, 9, 0, 61, 57, 9, 0, 124, 58, 9, 0, 189, 59, 9, 0, 252, 60, 9, 0, 61, 62, 9, 0, 124, 63, 9, 0, 189, 64, 9, 0, 252, 65, 9, 0, 61, 67, 9, 0, 124, 68, 9, 0, 189, 69, 9, 0, 252, 70, 9, 0, 61, 72, 9, 0, 124, 73, 9, 0, 189, 74, 9, 0, 252, 75, 9, 0, 61, 77, 9, 0, 124, 78, 9, 0, 189, 79, 9, 0, 252, 80, 9, 0, 61, 82, 9, 0, 124, 83, 9, 0, 189, 84, 9, 0, 252, 85, 9, 0, 61, 87, 9, 0, 124, 88, 9, 0, 189, 89, 9, 0, 252, 90, 9, 0, 61, 92, 9, 0, 124, 93, 9, 0, 189, 94, 9, 0, 252, 95, 9, 0, 61, 97, 9, 0, 124, 98, 9, 0, 189, 99, 9, 0, 252, 100, 9, 0, 61, 102, 9, 0, 124, 103, 9, 0, 189, 104, 9, 0, 252, 105, 9, 0, 61, 107, 9, 0, 124, 108, 9, 0, 189, 109, 9, 0, 252, 110, 9, 0, 61, 112, 9, 0, 124, 113, 9, 0, 189, 114, 9, 0, 252, 115, 9, 0, 61, 117, 9, 0, 124, 118, 9, 0, 189, 119, 9, 0, 252, 120, 9, 0, 61, 122, 9, 0, 124, 123, 9, 0, 189, 124, 9, 0, 252, 125, 9, 0, 61, 127, 9, 0, 124, 128, 9, 0, 189, 129, 9, 0, 252, 130, 9, 0, 61, 132, 9, 0, 124, 133, 9, 0, 189, 134, 9, 0, 252, 135, 9, 0, 61, 137, 9, 0, 124, 138, 9, 0, 189, 139, 9, 0, 252, 140, 9, 0, 61, 142, 9, 0, 124, 143, 9, 0, 189, 144, 9, 0, 252, 145, 9, 0, 61, 147, 9, 0, 124, 148, 9, 0, 189, 149, 9, 0, 252, 150, 9, 0, 61, 152, 9, 0, 124, 153, 9, 0, 189, 154, 9, 0, 252, 155, 9, 0, 61, 157, 9, 0, 124, 158, 9, 0, 189, 159, 9, 0, 252, 160, 9, 0, 61, 162, 9, 0, 124, 163, 9, 0, 189, 164, 9, 0, 252, 165, 9, 0, 61, 167, 9, 0, 124, 168, 9, 0, 189, 169, 9, 0, 252, 170, 9, 0, 61, 172, 9, 0, 124, 173, 9, 0, 189, 174, 9, 0, 252, 175, 9, 0, 61, 177, 9, 0, 124, 178, 9, 0, 189, 179, 9, 0, 252, 180, 9, 0, 61, 182, 9, 0, 124, 183, 9, 0, 189, 184, 9, 0, 252, 185, 9, 0, 61, 187, 9, 0, 124, 188, 9, 0, 189, 189, 9, 0, 252, 190, 9, 0, 61, 192, 9, 0, 124, 193, 9, 0, 189, 194, 9, 0, 252, 195, 9, 0, 61, 197, 9, 0, 124, 198, 9, 0, 189, 199, 9, 0, 252, 200, 9, 0, 61, 202, 9, 0, 124, 203, 9, 0, 189, 204, 9, 0, 252, 205, 9, 0, 61, 207, 9, 0, 124, 208, 9, 0, 189, 209, 9, 0, 252, 210, 9, 0, 61, 212, 9, 0, 124, 213, 9, 0, 189, 214, 9, 0, 252, 215, 9, 0, 61, 217, 9, 0, 124, 218, 9, 0, 189, 219, 9, 0, 252, 220, 9, 0, 61, 222, 9, 0, 124, 223, 9, 0, 189, 224, 9, 0, 252, 225, 9, 0, 61, 227, 9, 0, 124, 228, 9, 0, 189, 229, 9, 0, 252, 230, 9, 0, 61, 232, 9, 0, 124, 233, 9, 0, 189, 234, 9, 0, 252, 235, 9, 0, 61, 237, 9, 0, 124, 238, 9, 0, 189, 239, 9, 0, 252, 240, 9, 0, 61, 242, 9, 0, 124, 243, 9, 0, 189, 244, 9, 0, 252, 245, 9, 0, 61, 247, 9, 0, 124, 248, 9, 0, 189, 249, 9, 0, 252, 250, 9, 0, 61, 252, 9, 0, 124, 253, 9, 0, 189, 254, 9, 0, 252, 255, 9, 0, 61, 1, 10, 0, 124, 2, 10, 0, 189, 3, 10, 0, 252, 4, 10, 0, 61, 6, 10, 0, 124, 7, 10, 0, 189, 8, 10, 0, 252, 9, 10, 0, 61, 11, 10, 0, 124, 12, 10, 0, 189, 13, 10, 0, 252, 14, 10, 0, 61, 16, 10, 0, 124, 17, 10, 0, 189, 18, 10, 0, 252, 19, 10, 0, 61, 21, 10, 0, 124, 22, 10, 0, 189, 23, 10, 0, 252, 24, 10, 0, 61, 26, 10, 0, 124, 27, 10, 0, 189, 28, 10, 0, 252, 29, 10, 0, 61, 31, 10, 0, 124, 32, 10, 0, 189, 33, 10, 0, 252, 34, 10, 0, 61, 36, 10, 0, 124, 37, 10, 0, 189, 38, 10, 0, 252, 39, 10, 0, 61, 41, 10, 0, 124, 42, 10, 0, 189, 43, 10, 0, 252, 44, 10, 0, 61, 46, 10, 0, 124, 47, 10, 0, 189, 48, 10, 0, 252, 49, 10, 0, 61, 51, 10, 0, 124, 52, 10, 0, 189, 53, 10, 0, 252, 54, 10, 0, 61, 56, 10, 0, 124, 57, 10, 0, 189, 58, 10, 0, 252, 59, 10, 0, 61, 61, 10, 0, 124, 62, 10, 0, 189, 63, 10, 0, 252, 64, 10, 0, 61, 66, 10, 0, 124, 67, 10, 0, 189, 68, 10, 0, 252, 69, 10, 0, 61, 71, 10, 0, 124, 72, 10, 0, 189, 73, 10, 0, 252, 74, 10, 0, 61, 76, 10, 0, 124, 77, 10, 0, 189, 78, 10, 0, 252, 79, 10, 0, 61, 81, 10, 0, 124, 82, 10, 0, 189, 83, 10, 0, 252, 84, 10, 0, 61, 86, 10, 0, 124, 87, 10, 0, 189, 88, 10, 0, 252, 89, 10, 0, 61, 91, 10, 0, 124, 92, 10, 0, 189, 93, 10, 0, 252, 94, 10, 0, 61, 96, 10, 0, 124, 97, 10, 0, 189, 98, 10, 0, 252, 99, 10, 0, 61, 101, 10, 0, 124, 102, 10, 0, 189, 103, 10, 0, 252, 104, 10, 0, 61, 106, 10, 0, 124, 107, 10, 0, 189, 108, 10, 0, 252, 109, 10, 0, 61, 111, 10, 0, 124, 112, 10, 0, 189, 113, 10, 0, 252, 114, 10, 0, 61, 116, 10, 0, 124, 117, 10, 0, 189, 118, 10, 0, 252, 119, 10, 0, 61, 121, 10, 0, 124, 122, 10, 0, 189, 123, 10, 0, 252, 124, 10, 0, 61, 126, 10, 0, 124, 127, 10, 0, 189, 128, 10, 0, 252, 129, 10, 0, 61, 131, 10, 0, 124, 132, 10, 0, 189, 133, 10, 0, 252, 134, 10, 0, 61, 136, 10, 0, 124, 137, 10, 0, 189, 138, 10, 0, 252, 139, 10, 0, 61, 141, 10, 0, 124, 142, 10, 0, 189, 143, 10, 0, 252, 144, 10, 0, 61, 146, 10, 0, 124, 147, 10, 0, 189, 148, 10, 0, 252, 149, 10, 0, 61, 151, 10, 0, 124, 152, 10, 0, 189, 153, 10, 0, 252, 154, 10, 0, 61, 156, 10, 0, 124, 157, 10, 0, 189, 158, 10, 0, 252, 159, 10, 0, 61, 161, 10, 0, 124, 162, 10, 0, 189, 163, 10, 0, 252, 164, 10, 0, 61, 166, 10, 0, 124, 167, 10, 0, 189, 168, 10, 0, 252, 169, 10, 0, 61, 171, 10, 0, 124, 172, 10, 0, 189, 173, 10, 0, 252, 174, 10, 0, 61, 176, 10, 0, 124, 177, 10, 0, 189, 178, 10, 0, 252, 179, 10, 0, 61, 181, 10, 0, 124, 182, 10, 0, 189, 183, 10, 0, 252, 184, 10, 0, 61, 186, 10, 0, 124, 187, 10, 0, 189, 188, 10, 0, 252, 189, 10, 0, 61, 191, 10, 0, 124, 192, 10, 0, 189, 193, 10, 0, 252, 194, 10, 0, 61, 196, 10, 0, 124, 197, 10, 0, 189, 198, 10, 0, 252, 199, 10, 0, 61, 201, 10, 0, 124, 202, 10, 0, 189, 203, 10, 0, 252, 204, 10, 0, 61, 206, 10, 0, 124, 207, 10, 0, 189, 208, 10, 0, 252, 209, 10, 0, 61, 211, 10, 0, 124, 212, 10, 0, 189, 213, 10, 0, 252, 214, 10, 0, 61, 216, 10, 0, 124, 217, 10, 0, 189, 218, 10, 0, 252, 219, 10, 0, 61, 221, 10, 0, 124, 222, 10, 0, 189, 223, 10, 0, 252, 224, 10, 0, 61, 226, 10, 0, 124, 227, 10, 0, 189, 228, 10, 0, 252, 229, 10, 0, 61, 231, 10, 0, 124, 232, 10, 0, 189, 233, 10, 0, 252, 234, 10, 0, 61, 236, 10, 0, 124, 237, 10, 0, 189, 238, 10, 0, 252, 239, 10, 0, 61, 241, 10, 0, 124, 242, 10, 0, 189, 243, 10, 0, 252, 244, 10, 0, 61, 246, 10, 0, 124, 247, 10, 0, 189, 248, 10, 0, 252, 249, 10, 0, 61, 251, 10, 0, 124, 252, 10, 0, 189, 253, 10, 0, 252, 254, 10, 0, 61, 0, 11, 0, 124, 1, 11, 0, 189, 2, 11, 0, 252, 3, 11, 0, 61, 5, 11, 0, 124, 6, 11, 0, 189, 7, 11, 0, 252, 8, 11, 0, 61, 10, 11, 0, 124, 11, 11, 0, 189, 12, 11, 0, 252, 13, 11, 0, 61, 15, 11, 0, 124, 16, 11, 0, 189, 17, 11, 0, 252, 18, 11, 0, 61, 20, 11, 0, 124, 21, 11, 0, 189, 22, 11, 0, 252, 23, 11, 0, 61, 25, 11, 0, 124, 26, 11, 0, 189, 27, 11, 0, 252, 28, 11, 0, 61, 30, 11, 0, 124, 31, 11, 0, 189, 32, 11, 0, 252, 33, 11, 0, 61, 35, 11, 0, 124, 36, 11, 0, 189, 37, 11, 0, 252, 38, 11, 0, 61, 40, 11, 0, 124, 41, 11, 0, 189, 42, 11, 0, 252, 43, 11, 0, 61, 45, 11, 0, 124, 46, 11, 0, 189, 47, 11, 0, 252, 48, 11, 0, 61, 50, 11, 0, 124, 51, 11, 0, 189, 52, 11, 0, 252, 53, 11, 0, 61, 55, 11, 0, 124, 56, 11, 0, 189, 57, 11, 0, 252, 58, 11, 0, 61, 60, 11, 0, 124, 61, 11, 0, 189, 62, 11, 0, 252, 63, 11, 0, 61, 65, 11, 0, 124, 66, 11, 0, 189, 67, 11, 0, 252, 68, 11, 0, 61, 70, 11, 0, 124, 71, 11, 0, 189, 72, 11, 0, 252, 73, 11, 0, 61, 75, 11, 0, 124, 76, 11, 0, 189, 77, 11, 0, 252, 78, 11, 0, 61, 80, 11, 0, 124, 81, 11, 0, 189, 82, 11, 0, 252, 83, 11, 0, 61, 85, 11, 0, 124, 86, 11, 0, 189, 87, 11, 0, 252, 88, 11, 0, 61, 90, 11, 0, 124, 91, 11, 0, 189, 92, 11, 0, 252, 93, 11, 0, 61, 95, 11, 0, 124, 96, 11, 0, 189, 97, 11, 0, 252, 98, 11, 0, 61, 100, 11, 0, 124, 101, 11, 0, 189, 102, 11, 0, 252, 103, 11, 0, 61, 105, 11, 0, 124, 106, 11, 0, 189, 107, 11, 0, 252, 108, 11, 0, 61, 110, 11, 0, 124, 111, 11, 0, 189, 112, 11, 0, 252, 113, 11, 0, 61, 115, 11, 0, 124, 116, 11, 0, 189, 117, 11, 0, 252, 118, 11, 0, 61, 120, 11, 0, 124, 121, 11, 0, 189, 122, 11, 0, 252, 123, 11, 0, 61, 125, 11, 0, 124, 126, 11, 0, 189, 127, 11, 0, 252, 128, 11, 0, 61, 130, 11, 0, 124, 131, 11, 0, 189, 132, 11, 0, 252, 133, 11, 0, 61, 135, 11, 0, 124, 136, 11, 0, 189, 137, 11, 0, 252, 138, 11, 0, 61, 140, 11, 0, 124, 141, 11, 0, 189, 142, 11, 0, 252, 143, 11, 0, 61, 145, 11, 0, 124, 146, 11, 0, 189, 147, 11, 0, 252, 148, 11, 0, 61, 150, 11, 0, 124, 151, 11, 0, 189, 152, 11, 0, 252, 153, 11, 0, 61, 155, 11, 0, 124, 156, 11, 0, 189, 157, 11, 0, 252, 158, 11, 0, 61, 160, 11, 0, 124, 161, 11, 0, 189, 162, 11, 0, 252, 163, 11, 0, 61, 165, 11, 0, 124, 166, 11, 0, 189, 167, 11, 0, 252, 168, 11, 0, 61, 170, 11, 0, 124, 171, 11, 0, 189, 172, 11, 0, 252, 173, 11, 0, 61, 175, 11, 0, 124, 176, 11, 0, 189, 177, 11, 0, 252, 178, 11, 0, 61, 180, 11, 0, 124, 181, 11, 0, 189, 182, 11, 0, 252, 183, 11, 0, 61, 185, 11, 0, 124, 186, 11, 0, 189, 187, 11, 0, 252, 188, 11, 0, 61, 190, 11, 0, 124, 191, 11, 0, 189, 192, 11, 0, 252, 193, 11, 0, 61, 195, 11, 0, 124, 196, 11, 0, 189, 197, 11, 0, 252, 198, 11, 0, 61, 200, 11, 0, 124, 201, 11, 0, 189, 202, 11, 0, 252, 203, 11, 0, 61, 205, 11, 0, 124, 206, 11, 0, 189, 207, 11, 0, 252, 208, 11, 0, 61, 210, 11, 0, 124, 211, 11, 0, 189, 212, 11, 0, 252, 213, 11, 0, 61, 215, 11, 0, 124, 216, 11, 0, 189, 217, 11, 0, 252, 218, 11, 0, 61, 220, 11, 0, 124, 221, 11, 0, 189, 222, 11, 0, 252, 223, 11, 0, 61, 225, 11, 0, 124, 226, 11, 0, 189, 227, 11, 0, 252, 228, 11, 0, 61, 230, 11, 0, 124, 231, 11, 0, 189, 232, 11, 0, 252, 233, 11, 0, 61, 235, 11, 0, 124, 236, 11, 0, 189, 237, 11, 0, 252, 238, 11, 0, 61, 240, 11, 0, 124, 241, 11, 0, 189, 242, 11, 0, 252, 243, 11, 0, 61, 245, 11, 0, 124, 246, 11, 0, 189, 247, 11, 0, 252, 248, 11, 0, 61, 250, 11, 0, 124, 251, 11, 0, 189, 252, 11, 0, 252, 253, 11, 0, 61, 255, 11, 0, 124, 0, 12, 0, 189, 1, 12, 0, 252, 2, 12, 0, 61, 4, 12, 0, 124, 5, 12, 0, 189, 6, 12, 0, 252, 7, 12, 0, 61, 9, 12, 0, 124, 10, 12, 0, 189, 11, 12, 0, 252, 12, 12, 0, 61, 14, 12, 0, 124, 15, 12, 0, 189, 16, 12, 0, 252, 17, 12, 0, 61, 19, 12, 0, 124, 20, 12, 0, 189, 21, 12, 0, 252, 22, 12, 0, 61, 24, 12, 0, 124, 25, 12, 0, 189, 26, 12, 0, 252, 27, 12, 0, 61, 29, 12, 0, 124, 30, 12, 0, 189, 31, 12, 0, 252, 32, 12, 0, 61, 34, 12, 0, 124, 35, 12, 0, 189, 36, 12, 0, 252, 37, 12, 0, 61, 39, 12, 0, 124, 40, 12, 0, 189, 41, 12, 0, 252, 42, 12, 0, 61, 44, 12, 0, 124, 45, 12, 0, 189, 46, 12, 0, 252, 47, 12, 0, 61, 49, 12, 0, 124, 50, 12, 0, 189, 51, 12, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_same_event.json b/tests/recordings/logic_analyzer/test_measure_interval_same_channel_same_event.json deleted file mode 100644 index 8ce282af..00000000 --- a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_same_event.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [33], [34], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 61, 1, 0, 0, 124, 2, 0, 0, 189, 3, 0, 0, 252, 4, 0, 0, 61, 6, 0, 0, 124, 7, 0, 0, 189, 8, 0, 0, 252, 9, 0, 0, 61, 11, 0, 0, 124, 12, 0, 0, 189, 13, 0, 0, 252, 14, 0, 0, 61, 16, 0, 0, 124, 17, 0, 0, 189, 18, 0, 0, 252, 19, 0, 0, 61, 21, 0, 0, 124, 22, 0, 0, 189, 23, 0, 0, 252, 24, 0, 0, 61, 26, 0, 0, 124, 27, 0, 0, 189, 28, 0, 0, 252, 29, 0, 0, 61, 31, 0, 0, 124, 32, 0, 0, 189, 33, 0, 0, 252, 34, 0, 0, 61, 36, 0, 0, 124, 37, 0, 0, 189, 38, 0, 0, 252, 39, 0, 0, 61, 41, 0, 0, 124, 42, 0, 0, 189, 43, 0, 0, 252, 44, 0, 0, 61, 46, 0, 0, 124, 47, 0, 0, 189, 48, 0, 0, 252, 49, 0, 0, 61, 51, 0, 0, 124, 52, 0, 0, 189, 53, 0, 0, 252, 54, 0, 0, 61, 56, 0, 0, 124, 57, 0, 0, 189, 58, 0, 0, 252, 59, 0, 0, 61, 61, 0, 0, 124, 62, 0, 0, 189, 63, 0, 0, 252, 64, 0, 0, 61, 66, 0, 0, 124, 67, 0, 0, 189, 68, 0, 0, 252, 69, 0, 0, 61, 71, 0, 0, 124, 72, 0, 0, 189, 73, 0, 0, 252, 74, 0, 0, 61, 76, 0, 0, 124, 77, 0, 0, 189, 78, 0, 0, 252, 79, 0, 0, 61, 81, 0, 0, 124, 82, 0, 0, 189, 83, 0, 0, 252, 84, 0, 0, 61, 86, 0, 0, 124, 87, 0, 0, 189, 88, 0, 0, 252, 89, 0, 0, 61, 91, 0, 0, 124, 92, 0, 0, 189, 93, 0, 0, 252, 94, 0, 0, 61, 96, 0, 0, 124, 97, 0, 0, 189, 98, 0, 0, 252, 99, 0, 0, 61, 101, 0, 0, 124, 102, 0, 0, 189, 103, 0, 0, 252, 104, 0, 0, 61, 106, 0, 0, 124, 107, 0, 0, 189, 108, 0, 0, 252, 109, 0, 0, 61, 111, 0, 0, 124, 112, 0, 0, 189, 113, 0, 0, 252, 114, 0, 0, 61, 116, 0, 0, 124, 117, 0, 0, 189, 118, 0, 0, 252, 119, 0, 0, 61, 121, 0, 0, 124, 122, 0, 0, 189, 123, 0, 0, 252, 124, 0, 0, 61, 126, 0, 0, 124, 127, 0, 0, 189, 128, 0, 0, 252, 129, 0, 0, 61, 131, 0, 0, 124, 132, 0, 0, 189, 133, 0, 0, 252, 134, 0, 0, 61, 136, 0, 0, 124, 137, 0, 0, 189, 138, 0, 0, 252, 139, 0, 0, 61, 141, 0, 0, 124, 142, 0, 0, 189, 143, 0, 0, 252, 144, 0, 0, 61, 146, 0, 0, 124, 147, 0, 0, 189, 148, 0, 0, 252, 149, 0, 0, 61, 151, 0, 0, 124, 152, 0, 0, 189, 153, 0, 0, 252, 154, 0, 0, 61, 156, 0, 0, 124, 157, 0, 0, 189, 158, 0, 0, 252, 159, 0, 0, 61, 161, 0, 0, 124, 162, 0, 0, 189, 163, 0, 0, 252, 164, 0, 0, 61, 166, 0, 0, 124, 167, 0, 0, 189, 168, 0, 0, 252, 169, 0, 0, 61, 171, 0, 0, 124, 172, 0, 0, 189, 173, 0, 0, 252, 174, 0, 0, 61, 176, 0, 0, 124, 177, 0, 0, 189, 178, 0, 0, 252, 179, 0, 0, 61, 181, 0, 0, 124, 182, 0, 0, 189, 183, 0, 0, 252, 184, 0, 0, 61, 186, 0, 0, 124, 187, 0, 0, 189, 188, 0, 0, 252, 189, 0, 0, 61, 191, 0, 0, 124, 192, 0, 0, 189, 193, 0, 0, 252, 194, 0, 0, 61, 196, 0, 0, 124, 197, 0, 0, 189, 198, 0, 0, 252, 199, 0, 0, 61, 201, 0, 0, 124, 202, 0, 0, 189, 203, 0, 0, 252, 204, 0, 0, 61, 206, 0, 0, 124, 207, 0, 0, 189, 208, 0, 0, 252, 209, 0, 0, 61, 211, 0, 0, 124, 212, 0, 0, 189, 213, 0, 0, 252, 214, 0, 0, 61, 216, 0, 0, 124, 217, 0, 0, 189, 218, 0, 0, 252, 219, 0, 0, 61, 221, 0, 0, 124, 222, 0, 0, 189, 223, 0, 0, 252, 224, 0, 0, 61, 226, 0, 0, 124, 227, 0, 0, 189, 228, 0, 0, 252, 229, 0, 0, 61, 231, 0, 0, 124, 232, 0, 0, 189, 233, 0, 0, 252, 234, 0, 0, 61, 236, 0, 0, 124, 237, 0, 0, 189, 238, 0, 0, 252, 239, 0, 0, 61, 241, 0, 0, 124, 242, 0, 0, 189, 243, 0, 0, 252, 244, 0, 0, 61, 246, 0, 0, 124, 247, 0, 0, 189, 248, 0, 0, 252, 249, 0, 0, 61, 251, 0, 0, 124, 252, 0, 0, 189, 253, 0, 0, 252, 254, 0, 0, 61, 0, 1, 0, 124, 1, 1, 0, 189, 2, 1, 0, 252, 3, 1, 0, 61, 5, 1, 0, 124, 6, 1, 0, 189, 7, 1, 0, 252, 8, 1, 0, 61, 10, 1, 0, 124, 11, 1, 0, 189, 12, 1, 0, 252, 13, 1, 0, 61, 15, 1, 0, 124, 16, 1, 0, 189, 17, 1, 0, 252, 18, 1, 0, 61, 20, 1, 0, 124, 21, 1, 0, 189, 22, 1, 0, 252, 23, 1, 0, 61, 25, 1, 0, 124, 26, 1, 0, 189, 27, 1, 0, 252, 28, 1, 0, 61, 30, 1, 0, 124, 31, 1, 0, 189, 32, 1, 0, 252, 33, 1, 0, 61, 35, 1, 0, 124, 36, 1, 0, 189, 37, 1, 0, 252, 38, 1, 0, 61, 40, 1, 0, 124, 41, 1, 0, 189, 42, 1, 0, 252, 43, 1, 0, 61, 45, 1, 0, 124, 46, 1, 0, 189, 47, 1, 0, 252, 48, 1, 0, 61, 50, 1, 0, 124, 51, 1, 0, 189, 52, 1, 0, 252, 53, 1, 0, 61, 55, 1, 0, 124, 56, 1, 0, 189, 57, 1, 0, 252, 58, 1, 0, 61, 60, 1, 0, 124, 61, 1, 0, 189, 62, 1, 0, 252, 63, 1, 0, 61, 65, 1, 0, 124, 66, 1, 0, 189, 67, 1, 0, 252, 68, 1, 0, 61, 70, 1, 0, 124, 71, 1, 0, 189, 72, 1, 0, 252, 73, 1, 0, 61, 75, 1, 0, 124, 76, 1, 0, 189, 77, 1, 0, 252, 78, 1, 0, 61, 80, 1, 0, 124, 81, 1, 0, 189, 82, 1, 0, 252, 83, 1, 0, 61, 85, 1, 0, 124, 86, 1, 0, 189, 87, 1, 0, 252, 88, 1, 0, 61, 90, 1, 0, 124, 91, 1, 0, 189, 92, 1, 0, 252, 93, 1, 0, 61, 95, 1, 0, 124, 96, 1, 0, 189, 97, 1, 0, 252, 98, 1, 0, 61, 100, 1, 0, 124, 101, 1, 0, 189, 102, 1, 0, 252, 103, 1, 0, 61, 105, 1, 0, 124, 106, 1, 0, 189, 107, 1, 0, 252, 108, 1, 0, 61, 110, 1, 0, 124, 111, 1, 0, 189, 112, 1, 0, 252, 113, 1, 0, 61, 115, 1, 0, 124, 116, 1, 0, 189, 117, 1, 0, 252, 118, 1, 0, 61, 120, 1, 0, 124, 121, 1, 0, 189, 122, 1, 0, 252, 123, 1, 0, 61, 125, 1, 0, 124, 126, 1, 0, 189, 127, 1, 0, 252, 128, 1, 0, 61, 130, 1, 0, 124, 131, 1, 0, 189, 132, 1, 0, 252, 133, 1, 0, 61, 135, 1, 0, 124, 136, 1, 0, 189, 137, 1, 0, 252, 138, 1, 0, 61, 140, 1, 0, 124, 141, 1, 0, 189, 142, 1, 0, 252, 143, 1, 0, 61, 145, 1, 0, 124, 146, 1, 0, 189, 147, 1, 0, 252, 148, 1, 0, 61, 150, 1, 0, 124, 151, 1, 0, 189, 152, 1, 0, 252, 153, 1, 0, 61, 155, 1, 0, 124, 156, 1, 0, 189, 157, 1, 0, 252, 158, 1, 0, 61, 160, 1, 0, 124, 161, 1, 0, 189, 162, 1, 0, 252, 163, 1, 0, 61, 165, 1, 0, 124, 166, 1, 0, 189, 167, 1, 0, 252, 168, 1, 0, 61, 170, 1, 0, 124, 171, 1, 0, 189, 172, 1, 0, 252, 173, 1, 0, 61, 175, 1, 0, 124, 176, 1, 0, 189, 177, 1, 0, 252, 178, 1, 0, 61, 180, 1, 0, 124, 181, 1, 0, 189, 182, 1, 0, 252, 183, 1, 0, 61, 185, 1, 0, 124, 186, 1, 0, 189, 187, 1, 0, 252, 188, 1, 0, 61, 190, 1, 0, 124, 191, 1, 0, 189, 192, 1, 0, 252, 193, 1, 0, 61, 195, 1, 0, 124, 196, 1, 0, 189, 197, 1, 0, 252, 198, 1, 0, 61, 200, 1, 0, 124, 201, 1, 0, 189, 202, 1, 0, 252, 203, 1, 0, 61, 205, 1, 0, 124, 206, 1, 0, 189, 207, 1, 0, 252, 208, 1, 0, 61, 210, 1, 0, 124, 211, 1, 0, 189, 212, 1, 0, 252, 213, 1, 0, 61, 215, 1, 0, 124, 216, 1, 0, 189, 217, 1, 0, 252, 218, 1, 0, 61, 220, 1, 0, 124, 221, 1, 0, 189, 222, 1, 0, 252, 223, 1, 0, 61, 225, 1, 0, 124, 226, 1, 0, 189, 227, 1, 0, 252, 228, 1, 0, 61, 230, 1, 0, 124, 231, 1, 0, 189, 232, 1, 0, 252, 233, 1, 0, 61, 235, 1, 0, 124, 236, 1, 0, 189, 237, 1, 0, 252, 238, 1, 0, 61, 240, 1, 0, 124, 241, 1, 0, 189, 242, 1, 0, 252, 243, 1, 0, 61, 245, 1, 0, 124, 246, 1, 0, 189, 247, 1, 0, 252, 248, 1, 0, 61, 250, 1, 0, 124, 251, 1, 0, 189, 252, 1, 0, 252, 253, 1, 0, 61, 255, 1, 0, 124, 0, 2, 0, 189, 1, 2, 0, 252, 2, 2, 0, 61, 4, 2, 0, 124, 5, 2, 0, 189, 6, 2, 0, 252, 7, 2, 0, 61, 9, 2, 0, 124, 10, 2, 0, 189, 11, 2, 0, 252, 12, 2, 0, 61, 14, 2, 0, 124, 15, 2, 0, 189, 16, 2, 0, 252, 17, 2, 0, 61, 19, 2, 0, 124, 20, 2, 0, 189, 21, 2, 0, 252, 22, 2, 0, 61, 24, 2, 0, 124, 25, 2, 0, 189, 26, 2, 0, 252, 27, 2, 0, 61, 29, 2, 0, 124, 30, 2, 0, 189, 31, 2, 0, 252, 32, 2, 0, 61, 34, 2, 0, 124, 35, 2, 0, 189, 36, 2, 0, 252, 37, 2, 0, 61, 39, 2, 0, 124, 40, 2, 0, 189, 41, 2, 0, 252, 42, 2, 0, 61, 44, 2, 0, 124, 45, 2, 0, 189, 46, 2, 0, 252, 47, 2, 0, 61, 49, 2, 0, 124, 50, 2, 0, 189, 51, 2, 0, 252, 52, 2, 0, 61, 54, 2, 0, 124, 55, 2, 0, 189, 56, 2, 0, 252, 57, 2, 0, 61, 59, 2, 0, 124, 60, 2, 0, 189, 61, 2, 0, 252, 62, 2, 0, 61, 64, 2, 0, 124, 65, 2, 0, 189, 66, 2, 0, 252, 67, 2, 0, 61, 69, 2, 0, 124, 70, 2, 0, 189, 71, 2, 0, 252, 72, 2, 0, 61, 74, 2, 0, 124, 75, 2, 0, 189, 76, 2, 0, 252, 77, 2, 0, 61, 79, 2, 0, 124, 80, 2, 0, 189, 81, 2, 0, 252, 82, 2, 0, 61, 84, 2, 0, 124, 85, 2, 0, 189, 86, 2, 0, 252, 87, 2, 0, 61, 89, 2, 0, 124, 90, 2, 0, 189, 91, 2, 0, 252, 92, 2, 0, 61, 94, 2, 0, 124, 95, 2, 0, 189, 96, 2, 0, 252, 97, 2, 0, 61, 99, 2, 0, 124, 100, 2, 0, 189, 101, 2, 0, 252, 102, 2, 0, 61, 104, 2, 0, 124, 105, 2, 0, 189, 106, 2, 0, 252, 107, 2, 0, 61, 109, 2, 0, 124, 110, 2, 0, 189, 111, 2, 0, 252, 112, 2, 0, 61, 114, 2, 0, 124, 115, 2, 0, 189, 116, 2, 0, 252, 117, 2, 0, 61, 119, 2, 0, 124, 120, 2, 0, 189, 121, 2, 0, 252, 122, 2, 0, 61, 124, 2, 0, 124, 125, 2, 0, 189, 126, 2, 0, 252, 127, 2, 0, 61, 129, 2, 0, 124, 130, 2, 0, 189, 131, 2, 0, 252, 132, 2, 0, 61, 134, 2, 0, 124, 135, 2, 0, 189, 136, 2, 0, 252, 137, 2, 0, 61, 139, 2, 0, 124, 140, 2, 0, 189, 141, 2, 0, 252, 142, 2, 0, 61, 144, 2, 0, 124, 145, 2, 0, 189, 146, 2, 0, 252, 147, 2, 0, 61, 149, 2, 0, 124, 150, 2, 0, 189, 151, 2, 0, 252, 152, 2, 0, 61, 154, 2, 0, 124, 155, 2, 0, 189, 156, 2, 0, 252, 157, 2, 0, 61, 159, 2, 0, 124, 160, 2, 0, 189, 161, 2, 0, 252, 162, 2, 0, 61, 164, 2, 0, 124, 165, 2, 0, 189, 166, 2, 0, 252, 167, 2, 0, 61, 169, 2, 0, 124, 170, 2, 0, 189, 171, 2, 0, 252, 172, 2, 0, 61, 174, 2, 0, 124, 175, 2, 0, 189, 176, 2, 0, 252, 177, 2, 0, 61, 179, 2, 0, 124, 180, 2, 0, 189, 181, 2, 0, 252, 182, 2, 0, 61, 184, 2, 0, 124, 185, 2, 0, 189, 186, 2, 0, 252, 187, 2, 0, 61, 189, 2, 0, 124, 190, 2, 0, 189, 191, 2, 0, 252, 192, 2, 0, 61, 194, 2, 0, 124, 195, 2, 0, 189, 196, 2, 0, 252, 197, 2, 0, 61, 199, 2, 0, 124, 200, 2, 0, 189, 201, 2, 0, 252, 202, 2, 0, 61, 204, 2, 0, 124, 205, 2, 0, 189, 206, 2, 0, 252, 207, 2, 0, 61, 209, 2, 0, 124, 210, 2, 0, 189, 211, 2, 0, 252, 212, 2, 0, 61, 214, 2, 0, 124, 215, 2, 0, 189, 216, 2, 0, 252, 217, 2, 0, 61, 219, 2, 0, 124, 220, 2, 0, 189, 221, 2, 0, 252, 222, 2, 0, 61, 224, 2, 0, 124, 225, 2, 0, 189, 226, 2, 0, 252, 227, 2, 0, 61, 229, 2, 0, 124, 230, 2, 0, 189, 231, 2, 0, 252, 232, 2, 0, 61, 234, 2, 0, 124, 235, 2, 0, 189, 236, 2, 0, 252, 237, 2, 0, 61, 239, 2, 0, 124, 240, 2, 0, 189, 241, 2, 0, 252, 242, 2, 0, 61, 244, 2, 0, 124, 245, 2, 0, 189, 246, 2, 0, 252, 247, 2, 0, 61, 249, 2, 0, 124, 250, 2, 0, 189, 251, 2, 0, 252, 252, 2, 0, 61, 254, 2, 0, 124, 255, 2, 0, 189, 0, 3, 0, 252, 1, 3, 0, 61, 3, 3, 0, 124, 4, 3, 0, 189, 5, 3, 0, 252, 6, 3, 0, 61, 8, 3, 0, 124, 9, 3, 0, 189, 10, 3, 0, 252, 11, 3, 0, 61, 13, 3, 0, 124, 14, 3, 0, 189, 15, 3, 0, 252, 16, 3, 0, 61, 18, 3, 0, 124, 19, 3, 0, 189, 20, 3, 0, 252, 21, 3, 0, 61, 23, 3, 0, 124, 24, 3, 0, 189, 25, 3, 0, 252, 26, 3, 0, 61, 28, 3, 0, 124, 29, 3, 0, 189, 30, 3, 0, 252, 31, 3, 0, 61, 33, 3, 0, 124, 34, 3, 0, 189, 35, 3, 0, 252, 36, 3, 0, 61, 38, 3, 0, 124, 39, 3, 0, 189, 40, 3, 0, 252, 41, 3, 0, 61, 43, 3, 0, 124, 44, 3, 0, 189, 45, 3, 0, 252, 46, 3, 0, 61, 48, 3, 0, 124, 49, 3, 0, 189, 50, 3, 0, 252, 51, 3, 0, 61, 53, 3, 0, 124, 54, 3, 0, 189, 55, 3, 0, 252, 56, 3, 0, 61, 58, 3, 0, 124, 59, 3, 0, 189, 60, 3, 0, 252, 61, 3, 0, 61, 63, 3, 0, 124, 64, 3, 0, 189, 65, 3, 0, 252, 66, 3, 0, 61, 68, 3, 0, 124, 69, 3, 0, 189, 70, 3, 0, 252, 71, 3, 0, 61, 73, 3, 0, 124, 74, 3, 0, 189, 75, 3, 0, 252, 76, 3, 0, 61, 78, 3, 0, 124, 79, 3, 0, 189, 80, 3, 0, 252, 81, 3, 0, 61, 83, 3, 0, 124, 84, 3, 0, 189, 85, 3, 0, 252, 86, 3, 0, 61, 88, 3, 0, 124, 89, 3, 0, 189, 90, 3, 0, 252, 91, 3, 0, 61, 93, 3, 0, 124, 94, 3, 0, 189, 95, 3, 0, 252, 96, 3, 0, 61, 98, 3, 0, 124, 99, 3, 0, 189, 100, 3, 0, 252, 101, 3, 0, 61, 103, 3, 0, 124, 104, 3, 0, 189, 105, 3, 0, 252, 106, 3, 0, 61, 108, 3, 0, 124, 109, 3, 0, 189, 110, 3, 0, 252, 111, 3, 0, 61, 113, 3, 0, 124, 114, 3, 0, 189, 115, 3, 0, 252, 116, 3, 0, 61, 118, 3, 0, 124, 119, 3, 0, 189, 120, 3, 0, 252, 121, 3, 0, 61, 123, 3, 0, 124, 124, 3, 0, 189, 125, 3, 0, 252, 126, 3, 0, 61, 128, 3, 0, 124, 129, 3, 0, 189, 130, 3, 0, 252, 131, 3, 0, 61, 133, 3, 0, 124, 134, 3, 0, 189, 135, 3, 0, 252, 136, 3, 0, 61, 138, 3, 0, 124, 139, 3, 0, 189, 140, 3, 0, 252, 141, 3, 0, 61, 143, 3, 0, 124, 144, 3, 0, 189, 145, 3, 0, 252, 146, 3, 0, 61, 148, 3, 0, 124, 149, 3, 0, 189, 150, 3, 0, 252, 151, 3, 0, 61, 153, 3, 0, 124, 154, 3, 0, 189, 155, 3, 0, 252, 156, 3, 0, 61, 158, 3, 0, 124, 159, 3, 0, 189, 160, 3, 0, 252, 161, 3, 0, 61, 163, 3, 0, 124, 164, 3, 0, 189, 165, 3, 0, 252, 166, 3, 0, 61, 168, 3, 0, 124, 169, 3, 0, 189, 170, 3, 0, 252, 171, 3, 0, 61, 173, 3, 0, 124, 174, 3, 0, 189, 175, 3, 0, 252, 176, 3, 0, 61, 178, 3, 0, 124, 179, 3, 0, 189, 180, 3, 0, 252, 181, 3, 0, 61, 183, 3, 0, 124, 184, 3, 0, 189, 185, 3, 0, 252, 186, 3, 0, 61, 188, 3, 0, 124, 189, 3, 0, 189, 190, 3, 0, 252, 191, 3, 0, 61, 193, 3, 0, 124, 194, 3, 0, 189, 195, 3, 0, 252, 196, 3, 0, 61, 198, 3, 0, 124, 199, 3, 0, 189, 200, 3, 0, 252, 201, 3, 0, 61, 203, 3, 0, 124, 204, 3, 0, 189, 205, 3, 0, 252, 206, 3, 0, 61, 208, 3, 0, 124, 209, 3, 0, 189, 210, 3, 0, 252, 211, 3, 0, 61, 213, 3, 0, 124, 214, 3, 0, 189, 215, 3, 0, 252, 216, 3, 0, 61, 218, 3, 0, 124, 219, 3, 0, 189, 220, 3, 0, 252, 221, 3, 0, 61, 223, 3, 0, 124, 224, 3, 0, 189, 225, 3, 0, 252, 226, 3, 0, 61, 228, 3, 0, 124, 229, 3, 0, 189, 230, 3, 0, 252, 231, 3, 0, 61, 233, 3, 0, 124, 234, 3, 0, 189, 235, 3, 0, 252, 236, 3, 0, 61, 238, 3, 0, 124, 239, 3, 0, 189, 240, 3, 0, 252, 241, 3, 0, 61, 243, 3, 0, 124, 244, 3, 0, 189, 245, 3, 0, 252, 246, 3, 0, 61, 248, 3, 0, 124, 249, 3, 0, 189, 250, 3, 0, 252, 251, 3, 0, 61, 253, 3, 0, 124, 254, 3, 0, 189, 255, 3, 0, 252, 0, 4, 0, 61, 2, 4, 0, 124, 3, 4, 0, 189, 4, 4, 0, 252, 5, 4, 0, 61, 7, 4, 0, 124, 8, 4, 0, 189, 9, 4, 0, 252, 10, 4, 0, 61, 12, 4, 0, 124, 13, 4, 0, 189, 14, 4, 0, 252, 15, 4, 0, 61, 17, 4, 0, 124, 18, 4, 0, 189, 19, 4, 0, 252, 20, 4, 0, 61, 22, 4, 0, 124, 23, 4, 0, 189, 24, 4, 0, 252, 25, 4, 0, 61, 27, 4, 0, 124, 28, 4, 0, 189, 29, 4, 0, 252, 30, 4, 0, 61, 32, 4, 0, 124, 33, 4, 0, 189, 34, 4, 0, 252, 35, 4, 0, 61, 37, 4, 0, 124, 38, 4, 0, 189, 39, 4, 0, 252, 40, 4, 0, 61, 42, 4, 0, 124, 43, 4, 0, 189, 44, 4, 0, 252, 45, 4, 0, 61, 47, 4, 0, 124, 48, 4, 0, 189, 49, 4, 0, 252, 50, 4, 0, 61, 52, 4, 0, 124, 53, 4, 0, 189, 54, 4, 0, 252, 55, 4, 0, 61, 57, 4, 0, 124, 58, 4, 0, 189, 59, 4, 0, 252, 60, 4, 0, 61, 62, 4, 0, 124, 63, 4, 0, 189, 64, 4, 0, 252, 65, 4, 0, 61, 67, 4, 0, 124, 68, 4, 0, 189, 69, 4, 0, 252, 70, 4, 0, 61, 72, 4, 0, 124, 73, 4, 0, 189, 74, 4, 0, 252, 75, 4, 0, 61, 77, 4, 0, 124, 78, 4, 0, 189, 79, 4, 0, 252, 80, 4, 0, 61, 82, 4, 0, 124, 83, 4, 0, 189, 84, 4, 0, 252, 85, 4, 0, 61, 87, 4, 0, 124, 88, 4, 0, 189, 89, 4, 0, 252, 90, 4, 0, 61, 92, 4, 0, 124, 93, 4, 0, 189, 94, 4, 0, 252, 95, 4, 0, 61, 97, 4, 0, 124, 98, 4, 0, 189, 99, 4, 0, 252, 100, 4, 0, 61, 102, 4, 0, 124, 103, 4, 0, 189, 104, 4, 0, 252, 105, 4, 0, 61, 107, 4, 0, 124, 108, 4, 0, 189, 109, 4, 0, 252, 110, 4, 0, 61, 112, 4, 0, 124, 113, 4, 0, 189, 114, 4, 0, 252, 115, 4, 0, 61, 117, 4, 0, 124, 118, 4, 0, 189, 119, 4, 0, 252, 120, 4, 0, 61, 122, 4, 0, 124, 123, 4, 0, 189, 124, 4, 0, 252, 125, 4, 0, 61, 127, 4, 0, 124, 128, 4, 0, 189, 129, 4, 0, 252, 130, 4, 0, 61, 132, 4, 0, 124, 133, 4, 0, 189, 134, 4, 0, 252, 135, 4, 0, 61, 137, 4, 0, 124, 138, 4, 0, 189, 139, 4, 0, 252, 140, 4, 0, 61, 142, 4, 0, 124, 143, 4, 0, 189, 144, 4, 0, 252, 145, 4, 0, 61, 147, 4, 0, 124, 148, 4, 0, 189, 149, 4, 0, 252, 150, 4, 0, 61, 152, 4, 0, 124, 153, 4, 0, 189, 154, 4, 0, 252, 155, 4, 0, 61, 157, 4, 0, 124, 158, 4, 0, 189, 159, 4, 0, 252, 160, 4, 0, 61, 162, 4, 0, 124, 163, 4, 0, 189, 164, 4, 0, 252, 165, 4, 0, 61, 167, 4, 0, 124, 168, 4, 0, 189, 169, 4, 0, 252, 170, 4, 0, 61, 172, 4, 0, 124, 173, 4, 0, 189, 174, 4, 0, 252, 175, 4, 0, 61, 177, 4, 0, 124, 178, 4, 0, 189, 179, 4, 0, 252, 180, 4, 0, 61, 182, 4, 0, 124, 183, 4, 0, 189, 184, 4, 0, 252, 185, 4, 0, 61, 187, 4, 0, 124, 188, 4, 0, 189, 189, 4, 0, 252, 190, 4, 0, 61, 192, 4, 0, 124, 193, 4, 0, 189, 194, 4, 0, 252, 195, 4, 0, 61, 197, 4, 0, 124, 198, 4, 0, 189, 199, 4, 0, 252, 200, 4, 0, 61, 202, 4, 0, 124, 203, 4, 0, 189, 204, 4, 0, 252, 205, 4, 0, 61, 207, 4, 0, 124, 208, 4, 0, 189, 209, 4, 0, 252, 210, 4, 0, 61, 212, 4, 0, 124, 213, 4, 0, 189, 214, 4, 0, 252, 215, 4, 0, 61, 217, 4, 0, 124, 218, 4, 0, 189, 219, 4, 0, 252, 220, 4, 0, 61, 222, 4, 0, 124, 223, 4, 0, 189, 224, 4, 0, 252, 225, 4, 0, 61, 227, 4, 0, 124, 228, 4, 0, 189, 229, 4, 0, 252, 230, 4, 0, 61, 232, 4, 0, 124, 233, 4, 0, 189, 234, 4, 0, 252, 235, 4, 0, 61, 237, 4, 0, 124, 238, 4, 0, 189, 239, 4, 0, 252, 240, 4, 0, 61, 242, 4, 0, 124, 243, 4, 0, 189, 244, 4, 0, 252, 245, 4, 0, 61, 247, 4, 0, 124, 248, 4, 0, 189, 249, 4, 0, 252, 250, 4, 0, 61, 252, 4, 0, 124, 253, 4, 0, 189, 254, 4, 0, 252, 255, 4, 0, 61, 1, 5, 0, 124, 2, 5, 0, 189, 3, 5, 0, 252, 4, 5, 0, 61, 6, 5, 0, 124, 7, 5, 0, 189, 8, 5, 0, 252, 9, 5, 0, 61, 11, 5, 0, 124, 12, 5, 0, 189, 13, 5, 0, 252, 14, 5, 0, 61, 16, 5, 0, 124, 17, 5, 0, 189, 18, 5, 0, 252, 19, 5, 0, 61, 21, 5, 0, 124, 22, 5, 0, 189, 23, 5, 0, 252, 24, 5, 0, 61, 26, 5, 0, 124, 27, 5, 0, 189, 28, 5, 0, 252, 29, 5, 0, 61, 31, 5, 0, 124, 32, 5, 0, 189, 33, 5, 0, 252, 34, 5, 0, 61, 36, 5, 0, 124, 37, 5, 0, 189, 38, 5, 0, 252, 39, 5, 0, 61, 41, 5, 0, 124, 42, 5, 0, 189, 43, 5, 0, 252, 44, 5, 0, 61, 46, 5, 0, 124, 47, 5, 0, 189, 48, 5, 0, 252, 49, 5, 0, 61, 51, 5, 0, 124, 52, 5, 0, 189, 53, 5, 0, 252, 54, 5, 0, 61, 56, 5, 0, 124, 57, 5, 0, 189, 58, 5, 0, 252, 59, 5, 0, 61, 61, 5, 0, 124, 62, 5, 0, 189, 63, 5, 0, 252, 64, 5, 0, 61, 66, 5, 0, 124, 67, 5, 0, 189, 68, 5, 0, 252, 69, 5, 0, 61, 71, 5, 0, 124, 72, 5, 0, 189, 73, 5, 0, 252, 74, 5, 0, 61, 76, 5, 0, 124, 77, 5, 0, 189, 78, 5, 0, 252, 79, 5, 0, 61, 81, 5, 0, 124, 82, 5, 0, 189, 83, 5, 0, 252, 84, 5, 0, 61, 86, 5, 0, 124, 87, 5, 0, 189, 88, 5, 0, 252, 89, 5, 0, 61, 91, 5, 0, 124, 92, 5, 0, 189, 93, 5, 0, 252, 94, 5, 0, 61, 96, 5, 0, 124, 97, 5, 0, 189, 98, 5, 0, 252, 99, 5, 0, 61, 101, 5, 0, 124, 102, 5, 0, 189, 103, 5, 0, 252, 104, 5, 0, 61, 106, 5, 0, 124, 107, 5, 0, 189, 108, 5, 0, 252, 109, 5, 0, 61, 111, 5, 0, 124, 112, 5, 0, 189, 113, 5, 0, 252, 114, 5, 0, 61, 116, 5, 0, 124, 117, 5, 0, 189, 118, 5, 0, 252, 119, 5, 0, 61, 121, 5, 0, 124, 122, 5, 0, 189, 123, 5, 0, 252, 124, 5, 0, 61, 126, 5, 0, 124, 127, 5, 0, 189, 128, 5, 0, 252, 129, 5, 0, 61, 131, 5, 0, 124, 132, 5, 0, 189, 133, 5, 0, 252, 134, 5, 0, 61, 136, 5, 0, 124, 137, 5, 0, 189, 138, 5, 0, 252, 139, 5, 0, 61, 141, 5, 0, 124, 142, 5, 0, 189, 143, 5, 0, 252, 144, 5, 0, 61, 146, 5, 0, 124, 147, 5, 0, 189, 148, 5, 0, 252, 149, 5, 0, 61, 151, 5, 0, 124, 152, 5, 0, 189, 153, 5, 0, 252, 154, 5, 0, 61, 156, 5, 0, 124, 157, 5, 0, 189, 158, 5, 0, 252, 159, 5, 0, 61, 161, 5, 0, 124, 162, 5, 0, 189, 163, 5, 0, 252, 164, 5, 0, 61, 166, 5, 0, 124, 167, 5, 0, 189, 168, 5, 0, 252, 169, 5, 0, 61, 171, 5, 0, 124, 172, 5, 0, 189, 173, 5, 0, 252, 174, 5, 0, 61, 176, 5, 0, 124, 177, 5, 0, 189, 178, 5, 0, 252, 179, 5, 0, 61, 181, 5, 0, 124, 182, 5, 0, 189, 183, 5, 0, 252, 184, 5, 0, 61, 186, 5, 0, 124, 187, 5, 0, 189, 188, 5, 0, 252, 189, 5, 0, 61, 191, 5, 0, 124, 192, 5, 0, 189, 193, 5, 0, 252, 194, 5, 0, 61, 196, 5, 0, 124, 197, 5, 0, 189, 198, 5, 0, 252, 199, 5, 0, 61, 201, 5, 0, 124, 202, 5, 0, 189, 203, 5, 0, 252, 204, 5, 0, 61, 206, 5, 0, 124, 207, 5, 0, 189, 208, 5, 0, 252, 209, 5, 0, 61, 211, 5, 0, 124, 212, 5, 0, 189, 213, 5, 0, 252, 214, 5, 0, 61, 216, 5, 0, 124, 217, 5, 0, 189, 218, 5, 0, 252, 219, 5, 0, 61, 221, 5, 0, 124, 222, 5, 0, 189, 223, 5, 0, 252, 224, 5, 0, 61, 226, 5, 0, 124, 227, 5, 0, 189, 228, 5, 0, 252, 229, 5, 0, 61, 231, 5, 0, 124, 232, 5, 0, 189, 233, 5, 0, 252, 234, 5, 0, 61, 236, 5, 0, 124, 237, 5, 0, 189, 238, 5, 0, 252, 239, 5, 0, 61, 241, 5, 0, 124, 242, 5, 0, 189, 243, 5, 0, 252, 244, 5, 0, 61, 246, 5, 0, 124, 247, 5, 0, 189, 248, 5, 0, 252, 249, 5, 0, 61, 251, 5, 0, 124, 252, 5, 0, 189, 253, 5, 0, 252, 254, 5, 0, 61, 0, 6, 0, 124, 1, 6, 0, 189, 2, 6, 0, 252, 3, 6, 0, 61, 5, 6, 0, 124, 6, 6, 0, 189, 7, 6, 0, 252, 8, 6, 0, 61, 10, 6, 0, 124, 11, 6, 0, 189, 12, 6, 0, 252, 13, 6, 0, 61, 15, 6, 0, 124, 16, 6, 0, 189, 17, 6, 0, 252, 18, 6, 0, 61, 20, 6, 0, 124, 21, 6, 0, 189, 22, 6, 0, 252, 23, 6, 0, 61, 25, 6, 0, 124, 26, 6, 0, 189, 27, 6, 0, 252, 28, 6, 0, 61, 30, 6, 0, 124, 31, 6, 0, 189, 32, 6, 0, 252, 33, 6, 0, 61, 35, 6, 0, 124, 36, 6, 0, 189, 37, 6, 0, 252, 38, 6, 0, 61, 40, 6, 0, 124, 41, 6, 0, 189, 42, 6, 0, 252, 43, 6, 0, 61, 45, 6, 0, 124, 46, 6, 0, 189, 47, 6, 0, 252, 48, 6, 0, 61, 50, 6, 0, 124, 51, 6, 0, 189, 52, 6, 0, 252, 53, 6, 0, 61, 55, 6, 0, 124, 56, 6, 0, 189, 57, 6, 0, 252, 58, 6, 0, 61, 60, 6, 0, 124, 61, 6, 0, 189, 62, 6, 0, 252, 63, 6, 0, 61, 65, 6, 0, 124, 66, 6, 0, 189, 67, 6, 0, 252, 68, 6, 0, 61, 70, 6, 0, 124, 71, 6, 0, 189, 72, 6, 0, 252, 73, 6, 0, 61, 75, 6, 0, 124, 76, 6, 0, 189, 77, 6, 0, 252, 78, 6, 0, 61, 80, 6, 0, 124, 81, 6, 0, 189, 82, 6, 0, 252, 83, 6, 0, 61, 85, 6, 0, 124, 86, 6, 0, 189, 87, 6, 0, 252, 88, 6, 0, 61, 90, 6, 0, 124, 91, 6, 0, 189, 92, 6, 0, 252, 93, 6, 0, 61, 95, 6, 0, 124, 96, 6, 0, 189, 97, 6, 0, 252, 98, 6, 0, 61, 100, 6, 0, 124, 101, 6, 0, 189, 102, 6, 0, 252, 103, 6, 0, 61, 105, 6, 0, 124, 106, 6, 0, 189, 107, 6, 0, 252, 108, 6, 0, 61, 110, 6, 0, 124, 111, 6, 0, 189, 112, 6, 0, 252, 113, 6, 0, 61, 115, 6, 0, 124, 116, 6, 0, 189, 117, 6, 0, 252, 118, 6, 0, 61, 120, 6, 0, 124, 121, 6, 0, 189, 122, 6, 0, 252, 123, 6, 0, 61, 125, 6, 0, 124, 126, 6, 0, 189, 127, 6, 0, 252, 128, 6, 0, 61, 130, 6, 0, 124, 131, 6, 0, 189, 132, 6, 0, 252, 133, 6, 0, 61, 135, 6, 0, 124, 136, 6, 0, 189, 137, 6, 0, 252, 138, 6, 0, 61, 140, 6, 0, 124, 141, 6, 0, 189, 142, 6, 0, 252, 143, 6, 0, 61, 145, 6, 0, 124, 146, 6, 0, 189, 147, 6, 0, 252, 148, 6, 0, 61, 150, 6, 0, 124, 151, 6, 0, 189, 152, 6, 0, 252, 153, 6, 0, 61, 155, 6, 0, 124, 156, 6, 0, 189, 157, 6, 0, 252, 158, 6, 0, 61, 160, 6, 0, 124, 161, 6, 0, 189, 162, 6, 0, 252, 163, 6, 0, 61, 165, 6, 0, 124, 166, 6, 0, 189, 167, 6, 0, 252, 168, 6, 0, 61, 170, 6, 0, 124, 171, 6, 0, 189, 172, 6, 0, 252, 173, 6, 0, 61, 175, 6, 0, 124, 176, 6, 0, 189, 177, 6, 0, 252, 178, 6, 0, 61, 180, 6, 0, 124, 181, 6, 0, 189, 182, 6, 0, 252, 183, 6, 0, 61, 185, 6, 0, 124, 186, 6, 0, 189, 187, 6, 0, 252, 188, 6, 0, 61, 190, 6, 0, 124, 191, 6, 0, 189, 192, 6, 0, 252, 193, 6, 0, 61, 195, 6, 0, 124, 196, 6, 0, 189, 197, 6, 0, 252, 198, 6, 0, 61, 200, 6, 0, 124, 201, 6, 0, 189, 202, 6, 0, 252, 203, 6, 0, 61, 205, 6, 0, 124, 206, 6, 0, 189, 207, 6, 0, 252, 208, 6, 0, 61, 210, 6, 0, 124, 211, 6, 0, 189, 212, 6, 0, 252, 213, 6, 0, 61, 215, 6, 0, 124, 216, 6, 0, 189, 217, 6, 0, 252, 218, 6, 0, 61, 220, 6, 0, 124, 221, 6, 0, 189, 222, 6, 0, 252, 223, 6, 0, 61, 225, 6, 0, 124, 226, 6, 0, 189, 227, 6, 0, 252, 228, 6, 0, 61, 230, 6, 0, 124, 231, 6, 0, 189, 232, 6, 0, 252, 233, 6, 0, 61, 235, 6, 0, 124, 236, 6, 0, 189, 237, 6, 0, 252, 238, 6, 0, 61, 240, 6, 0, 124, 241, 6, 0, 189, 242, 6, 0, 252, 243, 6, 0, 61, 245, 6, 0, 124, 246, 6, 0, 189, 247, 6, 0, 252, 248, 6, 0, 61, 250, 6, 0, 124, 251, 6, 0, 189, 252, 6, 0, 252, 253, 6, 0, 61, 255, 6, 0, 124, 0, 7, 0, 189, 1, 7, 0, 252, 2, 7, 0, 61, 4, 7, 0, 124, 5, 7, 0, 189, 6, 7, 0, 252, 7, 7, 0, 61, 9, 7, 0, 124, 10, 7, 0, 189, 11, 7, 0, 252, 12, 7, 0, 61, 14, 7, 0, 124, 15, 7, 0, 189, 16, 7, 0, 252, 17, 7, 0, 61, 19, 7, 0, 124, 20, 7, 0, 189, 21, 7, 0, 252, 22, 7, 0, 61, 24, 7, 0, 124, 25, 7, 0, 189, 26, 7, 0, 252, 27, 7, 0, 61, 29, 7, 0, 124, 30, 7, 0, 189, 31, 7, 0, 252, 32, 7, 0, 61, 34, 7, 0, 124, 35, 7, 0, 189, 36, 7, 0, 252, 37, 7, 0, 61, 39, 7, 0, 124, 40, 7, 0, 189, 41, 7, 0, 252, 42, 7, 0, 61, 44, 7, 0, 124, 45, 7, 0, 189, 46, 7, 0, 252, 47, 7, 0, 61, 49, 7, 0, 124, 50, 7, 0, 189, 51, 7, 0, 252, 52, 7, 0, 61, 54, 7, 0, 124, 55, 7, 0, 189, 56, 7, 0, 252, 57, 7, 0, 61, 59, 7, 0, 124, 60, 7, 0, 189, 61, 7, 0, 252, 62, 7, 0, 61, 64, 7, 0, 124, 65, 7, 0, 189, 66, 7, 0, 252, 67, 7, 0, 61, 69, 7, 0, 124, 70, 7, 0, 189, 71, 7, 0, 252, 72, 7, 0, 61, 74, 7, 0, 124, 75, 7, 0, 189, 76, 7, 0, 252, 77, 7, 0, 61, 79, 7, 0, 124, 80, 7, 0, 189, 81, 7, 0, 252, 82, 7, 0, 61, 84, 7, 0, 124, 85, 7, 0, 189, 86, 7, 0, 252, 87, 7, 0, 61, 89, 7, 0, 124, 90, 7, 0, 189, 91, 7, 0, 252, 92, 7, 0, 61, 94, 7, 0, 124, 95, 7, 0, 189, 96, 7, 0, 252, 97, 7, 0, 61, 99, 7, 0, 124, 100, 7, 0, 189, 101, 7, 0, 252, 102, 7, 0, 61, 104, 7, 0, 124, 105, 7, 0, 189, 106, 7, 0, 252, 107, 7, 0, 61, 109, 7, 0, 124, 110, 7, 0, 189, 111, 7, 0, 252, 112, 7, 0, 61, 114, 7, 0, 124, 115, 7, 0, 189, 116, 7, 0, 252, 117, 7, 0, 61, 119, 7, 0, 124, 120, 7, 0, 189, 121, 7, 0, 252, 122, 7, 0, 61, 124, 7, 0, 124, 125, 7, 0, 189, 126, 7, 0, 252, 127, 7, 0, 61, 129, 7, 0, 124, 130, 7, 0, 189, 131, 7, 0, 252, 132, 7, 0, 61, 134, 7, 0, 124, 135, 7, 0, 189, 136, 7, 0, 252, 137, 7, 0, 61, 139, 7, 0, 124, 140, 7, 0, 189, 141, 7, 0, 252, 142, 7, 0, 61, 144, 7, 0, 124, 145, 7, 0, 189, 146, 7, 0, 252, 147, 7, 0, 61, 149, 7, 0, 124, 150, 7, 0, 189, 151, 7, 0, 252, 152, 7, 0, 61, 154, 7, 0, 124, 155, 7, 0, 189, 156, 7, 0, 252, 157, 7, 0, 61, 159, 7, 0, 124, 160, 7, 0, 189, 161, 7, 0, 252, 162, 7, 0, 61, 164, 7, 0, 124, 165, 7, 0, 189, 166, 7, 0, 252, 167, 7, 0, 61, 169, 7, 0, 124, 170, 7, 0, 189, 171, 7, 0, 252, 172, 7, 0, 61, 174, 7, 0, 124, 175, 7, 0, 189, 176, 7, 0, 252, 177, 7, 0, 61, 179, 7, 0, 124, 180, 7, 0, 189, 181, 7, 0, 252, 182, 7, 0, 61, 184, 7, 0, 124, 185, 7, 0, 189, 186, 7, 0, 252, 187, 7, 0, 61, 189, 7, 0, 124, 190, 7, 0, 189, 191, 7, 0, 252, 192, 7, 0, 61, 194, 7, 0, 124, 195, 7, 0, 189, 196, 7, 0, 252, 197, 7, 0, 61, 199, 7, 0, 124, 200, 7, 0, 189, 201, 7, 0, 252, 202, 7, 0, 61, 204, 7, 0, 124, 205, 7, 0, 189, 206, 7, 0, 252, 207, 7, 0, 61, 209, 7, 0, 124, 210, 7, 0, 189, 211, 7, 0, 252, 212, 7, 0, 61, 214, 7, 0, 124, 215, 7, 0, 189, 216, 7, 0, 252, 217, 7, 0, 61, 219, 7, 0, 124, 220, 7, 0, 189, 221, 7, 0, 252, 222, 7, 0, 61, 224, 7, 0, 124, 225, 7, 0, 189, 226, 7, 0, 252, 227, 7, 0, 61, 229, 7, 0, 124, 230, 7, 0, 189, 231, 7, 0, 252, 232, 7, 0, 61, 234, 7, 0, 124, 235, 7, 0, 189, 236, 7, 0, 252, 237, 7, 0, 61, 239, 7, 0, 124, 240, 7, 0, 189, 241, 7, 0, 252, 242, 7, 0, 61, 244, 7, 0, 124, 245, 7, 0, 189, 246, 7, 0, 252, 247, 7, 0, 61, 249, 7, 0, 124, 250, 7, 0, 189, 251, 7, 0, 252, 252, 7, 0, 61, 254, 7, 0, 124, 255, 7, 0, 189, 0, 8, 0, 252, 1, 8, 0, 61, 3, 8, 0, 124, 4, 8, 0, 189, 5, 8, 0, 252, 6, 8, 0, 61, 8, 8, 0, 124, 9, 8, 0, 189, 10, 8, 0, 252, 11, 8, 0, 61, 13, 8, 0, 124, 14, 8, 0, 189, 15, 8, 0, 252, 16, 8, 0, 61, 18, 8, 0, 124, 19, 8, 0, 189, 20, 8, 0, 252, 21, 8, 0, 61, 23, 8, 0, 124, 24, 8, 0, 189, 25, 8, 0, 252, 26, 8, 0, 61, 28, 8, 0, 124, 29, 8, 0, 189, 30, 8, 0, 252, 31, 8, 0, 61, 33, 8, 0, 124, 34, 8, 0, 189, 35, 8, 0, 252, 36, 8, 0, 61, 38, 8, 0, 124, 39, 8, 0, 189, 40, 8, 0, 252, 41, 8, 0, 61, 43, 8, 0, 124, 44, 8, 0, 189, 45, 8, 0, 252, 46, 8, 0, 61, 48, 8, 0, 124, 49, 8, 0, 189, 50, 8, 0, 252, 51, 8, 0, 61, 53, 8, 0, 124, 54, 8, 0, 189, 55, 8, 0, 252, 56, 8, 0, 61, 58, 8, 0, 124, 59, 8, 0, 189, 60, 8, 0, 252, 61, 8, 0, 61, 63, 8, 0, 124, 64, 8, 0, 189, 65, 8, 0, 252, 66, 8, 0, 61, 68, 8, 0, 124, 69, 8, 0, 189, 70, 8, 0, 252, 71, 8, 0, 61, 73, 8, 0, 124, 74, 8, 0, 189, 75, 8, 0, 252, 76, 8, 0, 61, 78, 8, 0, 124, 79, 8, 0, 189, 80, 8, 0, 252, 81, 8, 0, 61, 83, 8, 0, 124, 84, 8, 0, 189, 85, 8, 0, 252, 86, 8, 0, 61, 88, 8, 0, 124, 89, 8, 0, 189, 90, 8, 0, 252, 91, 8, 0, 61, 93, 8, 0, 124, 94, 8, 0, 189, 95, 8, 0, 252, 96, 8, 0, 61, 98, 8, 0, 124, 99, 8, 0, 189, 100, 8, 0, 252, 101, 8, 0, 61, 103, 8, 0, 124, 104, 8, 0, 189, 105, 8, 0, 252, 106, 8, 0, 61, 108, 8, 0, 124, 109, 8, 0, 189, 110, 8, 0, 252, 111, 8, 0, 61, 113, 8, 0, 124, 114, 8, 0, 189, 115, 8, 0, 252, 116, 8, 0, 61, 118, 8, 0, 124, 119, 8, 0, 189, 120, 8, 0, 252, 121, 8, 0, 61, 123, 8, 0, 124, 124, 8, 0, 189, 125, 8, 0, 252, 126, 8, 0, 61, 128, 8, 0, 124, 129, 8, 0, 189, 130, 8, 0, 252, 131, 8, 0, 61, 133, 8, 0, 124, 134, 8, 0, 189, 135, 8, 0, 252, 136, 8, 0, 61, 138, 8, 0, 124, 139, 8, 0, 189, 140, 8, 0, 252, 141, 8, 0, 61, 143, 8, 0, 124, 144, 8, 0, 189, 145, 8, 0, 252, 146, 8, 0, 61, 148, 8, 0, 124, 149, 8, 0, 189, 150, 8, 0, 252, 151, 8, 0, 61, 153, 8, 0, 124, 154, 8, 0, 189, 155, 8, 0, 252, 156, 8, 0, 61, 158, 8, 0, 124, 159, 8, 0, 189, 160, 8, 0, 252, 161, 8, 0, 61, 163, 8, 0, 124, 164, 8, 0, 189, 165, 8, 0, 252, 166, 8, 0, 61, 168, 8, 0, 124, 169, 8, 0, 189, 170, 8, 0, 252, 171, 8, 0, 61, 173, 8, 0, 124, 174, 8, 0, 189, 175, 8, 0, 252, 176, 8, 0, 61, 178, 8, 0, 124, 179, 8, 0, 189, 180, 8, 0, 252, 181, 8, 0, 61, 183, 8, 0, 124, 184, 8, 0, 189, 185, 8, 0, 252, 186, 8, 0, 61, 188, 8, 0, 124, 189, 8, 0, 189, 190, 8, 0, 252, 191, 8, 0, 61, 193, 8, 0, 124, 194, 8, 0, 189, 195, 8, 0, 252, 196, 8, 0, 61, 198, 8, 0, 124, 199, 8, 0, 189, 200, 8, 0, 252, 201, 8, 0, 61, 203, 8, 0, 124, 204, 8, 0, 189, 205, 8, 0, 252, 206, 8, 0, 61, 208, 8, 0, 124, 209, 8, 0, 189, 210, 8, 0, 252, 211, 8, 0, 61, 213, 8, 0, 124, 214, 8, 0, 189, 215, 8, 0, 252, 216, 8, 0, 61, 218, 8, 0, 124, 219, 8, 0, 189, 220, 8, 0, 252, 221, 8, 0, 61, 223, 8, 0, 124, 224, 8, 0, 189, 225, 8, 0, 252, 226, 8, 0, 61, 228, 8, 0, 124, 229, 8, 0, 189, 230, 8, 0, 252, 231, 8, 0, 61, 233, 8, 0, 124, 234, 8, 0, 189, 235, 8, 0, 252, 236, 8, 0, 61, 238, 8, 0, 124, 239, 8, 0, 189, 240, 8, 0, 252, 241, 8, 0, 61, 243, 8, 0, 124, 244, 8, 0, 189, 245, 8, 0, 252, 246, 8, 0, 61, 248, 8, 0, 124, 249, 8, 0, 189, 250, 8, 0, 252, 251, 8, 0, 61, 253, 8, 0, 124, 254, 8, 0, 189, 255, 8, 0, 252, 0, 9, 0, 61, 2, 9, 0, 124, 3, 9, 0, 189, 4, 9, 0, 252, 5, 9, 0, 61, 7, 9, 0, 124, 8, 9, 0, 189, 9, 9, 0, 252, 10, 9, 0, 61, 12, 9, 0, 124, 13, 9, 0, 189, 14, 9, 0, 252, 15, 9, 0, 61, 17, 9, 0, 124, 18, 9, 0, 189, 19, 9, 0, 252, 20, 9, 0, 61, 22, 9, 0, 124, 23, 9, 0, 189, 24, 9, 0, 252, 25, 9, 0, 61, 27, 9, 0, 124, 28, 9, 0, 189, 29, 9, 0, 252, 30, 9, 0, 61, 32, 9, 0, 124, 33, 9, 0, 189, 34, 9, 0, 252, 35, 9, 0, 61, 37, 9, 0, 124, 38, 9, 0, 189, 39, 9, 0, 252, 40, 9, 0, 61, 42, 9, 0, 124, 43, 9, 0, 189, 44, 9, 0, 252, 45, 9, 0, 61, 47, 9, 0, 124, 48, 9, 0, 189, 49, 9, 0, 252, 50, 9, 0, 61, 52, 9, 0, 124, 53, 9, 0, 189, 54, 9, 0, 252, 55, 9, 0, 61, 57, 9, 0, 124, 58, 9, 0, 189, 59, 9, 0, 252, 60, 9, 0, 61, 62, 9, 0, 124, 63, 9, 0, 189, 64, 9, 0, 252, 65, 9, 0, 61, 67, 9, 0, 124, 68, 9, 0, 189, 69, 9, 0, 252, 70, 9, 0, 61, 72, 9, 0, 124, 73, 9, 0, 189, 74, 9, 0, 252, 75, 9, 0, 61, 77, 9, 0, 124, 78, 9, 0, 189, 79, 9, 0, 252, 80, 9, 0, 61, 82, 9, 0, 124, 83, 9, 0, 189, 84, 9, 0, 252, 85, 9, 0, 61, 87, 9, 0, 124, 88, 9, 0, 189, 89, 9, 0, 252, 90, 9, 0, 61, 92, 9, 0, 124, 93, 9, 0, 189, 94, 9, 0, 252, 95, 9, 0, 61, 97, 9, 0, 124, 98, 9, 0, 189, 99, 9, 0, 252, 100, 9, 0, 61, 102, 9, 0, 124, 103, 9, 0, 189, 104, 9, 0, 252, 105, 9, 0, 61, 107, 9, 0, 124, 108, 9, 0, 189, 109, 9, 0, 252, 110, 9, 0, 61, 112, 9, 0, 124, 113, 9, 0, 189, 114, 9, 0, 252, 115, 9, 0, 61, 117, 9, 0, 124, 118, 9, 0, 189, 119, 9, 0, 252, 120, 9, 0, 61, 122, 9, 0, 124, 123, 9, 0, 189, 124, 9, 0, 252, 125, 9, 0, 61, 127, 9, 0, 124, 128, 9, 0, 189, 129, 9, 0, 252, 130, 9, 0, 61, 132, 9, 0, 124, 133, 9, 0, 189, 134, 9, 0, 252, 135, 9, 0, 61, 137, 9, 0, 124, 138, 9, 0, 189, 139, 9, 0, 252, 140, 9, 0, 61, 142, 9, 0, 124, 143, 9, 0, 189, 144, 9, 0, 252, 145, 9, 0, 61, 147, 9, 0, 124, 148, 9, 0, 189, 149, 9, 0, 252, 150, 9, 0, 61, 152, 9, 0, 124, 153, 9, 0, 189, 154, 9, 0, 252, 155, 9, 0, 61, 157, 9, 0, 124, 158, 9, 0, 189, 159, 9, 0, 252, 160, 9, 0, 61, 162, 9, 0, 124, 163, 9, 0, 189, 164, 9, 0, 252, 165, 9, 0, 61, 167, 9, 0, 124, 168, 9, 0, 189, 169, 9, 0, 252, 170, 9, 0, 61, 172, 9, 0, 124, 173, 9, 0, 189, 174, 9, 0, 252, 175, 9, 0, 61, 177, 9, 0, 124, 178, 9, 0, 189, 179, 9, 0, 252, 180, 9, 0, 61, 182, 9, 0, 124, 183, 9, 0, 189, 184, 9, 0, 252, 185, 9, 0, 61, 187, 9, 0, 124, 188, 9, 0, 189, 189, 9, 0, 252, 190, 9, 0, 61, 192, 9, 0, 124, 193, 9, 0, 189, 194, 9, 0, 252, 195, 9, 0, 61, 197, 9, 0, 124, 198, 9, 0, 189, 199, 9, 0, 252, 200, 9, 0, 61, 202, 9, 0, 124, 203, 9, 0, 189, 204, 9, 0, 252, 205, 9, 0, 61, 207, 9, 0, 124, 208, 9, 0, 189, 209, 9, 0, 252, 210, 9, 0, 61, 212, 9, 0, 124, 213, 9, 0, 189, 214, 9, 0, 252, 215, 9, 0, 61, 217, 9, 0, 124, 218, 9, 0, 189, 219, 9, 0, 252, 220, 9, 0, 61, 222, 9, 0, 124, 223, 9, 0, 189, 224, 9, 0, 252, 225, 9, 0, 61, 227, 9, 0, 124, 228, 9, 0, 189, 229, 9, 0, 252, 230, 9, 0, 61, 232, 9, 0, 124, 233, 9, 0, 189, 234, 9, 0, 252, 235, 9, 0, 61, 237, 9, 0, 124, 238, 9, 0, 189, 239, 9, 0, 252, 240, 9, 0, 61, 242, 9, 0, 124, 243, 9, 0, 189, 244, 9, 0, 252, 245, 9, 0, 61, 247, 9, 0, 124, 248, 9, 0, 189, 249, 9, 0, 252, 250, 9, 0, 61, 252, 9, 0, 124, 253, 9, 0, 189, 254, 9, 0, 252, 255, 9, 0, 61, 1, 10, 0, 124, 2, 10, 0, 189, 3, 10, 0, 252, 4, 10, 0, 61, 6, 10, 0, 124, 7, 10, 0, 189, 8, 10, 0, 252, 9, 10, 0, 61, 11, 10, 0, 124, 12, 10, 0, 189, 13, 10, 0, 252, 14, 10, 0, 61, 16, 10, 0, 124, 17, 10, 0, 189, 18, 10, 0, 252, 19, 10, 0, 61, 21, 10, 0, 124, 22, 10, 0, 189, 23, 10, 0, 252, 24, 10, 0, 61, 26, 10, 0, 124, 27, 10, 0, 189, 28, 10, 0, 252, 29, 10, 0, 61, 31, 10, 0, 124, 32, 10, 0, 189, 33, 10, 0, 252, 34, 10, 0, 61, 36, 10, 0, 124, 37, 10, 0, 189, 38, 10, 0, 252, 39, 10, 0, 61, 41, 10, 0, 124, 42, 10, 0, 189, 43, 10, 0, 252, 44, 10, 0, 61, 46, 10, 0, 124, 47, 10, 0, 189, 48, 10, 0, 252, 49, 10, 0, 61, 51, 10, 0, 124, 52, 10, 0, 189, 53, 10, 0, 252, 54, 10, 0, 61, 56, 10, 0, 124, 57, 10, 0, 189, 58, 10, 0, 252, 59, 10, 0, 61, 61, 10, 0, 124, 62, 10, 0, 189, 63, 10, 0, 252, 64, 10, 0, 61, 66, 10, 0, 124, 67, 10, 0, 189, 68, 10, 0, 252, 69, 10, 0, 61, 71, 10, 0, 124, 72, 10, 0, 189, 73, 10, 0, 252, 74, 10, 0, 61, 76, 10, 0, 124, 77, 10, 0, 189, 78, 10, 0, 252, 79, 10, 0, 61, 81, 10, 0, 124, 82, 10, 0, 189, 83, 10, 0, 252, 84, 10, 0, 61, 86, 10, 0, 124, 87, 10, 0, 189, 88, 10, 0, 252, 89, 10, 0, 61, 91, 10, 0, 124, 92, 10, 0, 189, 93, 10, 0, 252, 94, 10, 0, 61, 96, 10, 0, 124, 97, 10, 0, 189, 98, 10, 0, 252, 99, 10, 0, 61, 101, 10, 0, 124, 102, 10, 0, 189, 103, 10, 0, 252, 104, 10, 0, 61, 106, 10, 0, 124, 107, 10, 0, 189, 108, 10, 0, 252, 109, 10, 0, 61, 111, 10, 0, 124, 112, 10, 0, 189, 113, 10, 0, 252, 114, 10, 0, 61, 116, 10, 0, 124, 117, 10, 0, 189, 118, 10, 0, 252, 119, 10, 0, 61, 121, 10, 0, 124, 122, 10, 0, 189, 123, 10, 0, 252, 124, 10, 0, 61, 126, 10, 0, 124, 127, 10, 0, 189, 128, 10, 0, 252, 129, 10, 0, 61, 131, 10, 0, 124, 132, 10, 0, 189, 133, 10, 0, 252, 134, 10, 0, 61, 136, 10, 0, 124, 137, 10, 0, 189, 138, 10, 0, 252, 139, 10, 0, 61, 141, 10, 0, 124, 142, 10, 0, 189, 143, 10, 0, 252, 144, 10, 0, 61, 146, 10, 0, 124, 147, 10, 0, 189, 148, 10, 0, 252, 149, 10, 0, 61, 151, 10, 0, 124, 152, 10, 0, 189, 153, 10, 0, 252, 154, 10, 0, 61, 156, 10, 0, 124, 157, 10, 0, 189, 158, 10, 0, 252, 159, 10, 0, 61, 161, 10, 0, 124, 162, 10, 0, 189, 163, 10, 0, 252, 164, 10, 0, 61, 166, 10, 0, 124, 167, 10, 0, 189, 168, 10, 0, 252, 169, 10, 0, 61, 171, 10, 0, 124, 172, 10, 0, 189, 173, 10, 0, 252, 174, 10, 0, 61, 176, 10, 0, 124, 177, 10, 0, 189, 178, 10, 0, 252, 179, 10, 0, 61, 181, 10, 0, 124, 182, 10, 0, 189, 183, 10, 0, 252, 184, 10, 0, 61, 186, 10, 0, 124, 187, 10, 0, 189, 188, 10, 0, 252, 189, 10, 0, 61, 191, 10, 0, 124, 192, 10, 0, 189, 193, 10, 0, 252, 194, 10, 0, 61, 196, 10, 0, 124, 197, 10, 0, 189, 198, 10, 0, 252, 199, 10, 0, 61, 201, 10, 0, 124, 202, 10, 0, 189, 203, 10, 0, 252, 204, 10, 0, 61, 206, 10, 0, 124, 207, 10, 0, 189, 208, 10, 0, 252, 209, 10, 0, 61, 211, 10, 0, 124, 212, 10, 0, 189, 213, 10, 0, 252, 214, 10, 0, 61, 216, 10, 0, 124, 217, 10, 0, 189, 218, 10, 0, 252, 219, 10, 0, 61, 221, 10, 0, 124, 222, 10, 0, 189, 223, 10, 0, 252, 224, 10, 0, 61, 226, 10, 0, 124, 227, 10, 0, 189, 228, 10, 0, 252, 229, 10, 0, 61, 231, 10, 0, 124, 232, 10, 0, 189, 233, 10, 0, 252, 234, 10, 0, 61, 236, 10, 0, 124, 237, 10, 0, 189, 238, 10, 0, 252, 239, 10, 0, 61, 241, 10, 0, 124, 242, 10, 0, 189, 243, 10, 0, 252, 244, 10, 0, 61, 246, 10, 0, 124, 247, 10, 0, 189, 248, 10, 0, 252, 249, 10, 0, 61, 251, 10, 0, 124, 252, 10, 0, 189, 253, 10, 0, 252, 254, 10, 0, 61, 0, 11, 0, 124, 1, 11, 0, 189, 2, 11, 0, 252, 3, 11, 0, 61, 5, 11, 0, 124, 6, 11, 0, 189, 7, 11, 0, 252, 8, 11, 0, 61, 10, 11, 0, 124, 11, 11, 0, 189, 12, 11, 0, 252, 13, 11, 0, 61, 15, 11, 0, 124, 16, 11, 0, 189, 17, 11, 0, 252, 18, 11, 0, 61, 20, 11, 0, 124, 21, 11, 0, 189, 22, 11, 0, 252, 23, 11, 0, 61, 25, 11, 0, 124, 26, 11, 0, 189, 27, 11, 0, 252, 28, 11, 0, 61, 30, 11, 0, 124, 31, 11, 0, 189, 32, 11, 0, 252, 33, 11, 0, 61, 35, 11, 0, 124, 36, 11, 0, 189, 37, 11, 0, 252, 38, 11, 0, 61, 40, 11, 0, 124, 41, 11, 0, 189, 42, 11, 0, 252, 43, 11, 0, 61, 45, 11, 0, 124, 46, 11, 0, 189, 47, 11, 0, 252, 48, 11, 0, 61, 50, 11, 0, 124, 51, 11, 0, 189, 52, 11, 0, 252, 53, 11, 0, 61, 55, 11, 0, 124, 56, 11, 0, 189, 57, 11, 0, 252, 58, 11, 0, 61, 60, 11, 0, 124, 61, 11, 0, 189, 62, 11, 0, 252, 63, 11, 0, 61, 65, 11, 0, 124, 66, 11, 0, 189, 67, 11, 0, 252, 68, 11, 0, 61, 70, 11, 0, 124, 71, 11, 0, 189, 72, 11, 0, 252, 73, 11, 0, 61, 75, 11, 0, 124, 76, 11, 0, 189, 77, 11, 0, 252, 78, 11, 0, 61, 80, 11, 0, 124, 81, 11, 0, 189, 82, 11, 0, 252, 83, 11, 0, 61, 85, 11, 0, 124, 86, 11, 0, 189, 87, 11, 0, 252, 88, 11, 0, 61, 90, 11, 0, 124, 91, 11, 0, 189, 92, 11, 0, 252, 93, 11, 0, 61, 95, 11, 0, 124, 96, 11, 0, 189, 97, 11, 0, 252, 98, 11, 0, 61, 100, 11, 0, 124, 101, 11, 0, 189, 102, 11, 0, 252, 103, 11, 0, 61, 105, 11, 0, 124, 106, 11, 0, 189, 107, 11, 0, 252, 108, 11, 0, 61, 110, 11, 0, 124, 111, 11, 0, 189, 112, 11, 0, 252, 113, 11, 0, 61, 115, 11, 0, 124, 116, 11, 0, 189, 117, 11, 0, 252, 118, 11, 0, 61, 120, 11, 0, 124, 121, 11, 0, 189, 122, 11, 0, 252, 123, 11, 0, 61, 125, 11, 0, 124, 126, 11, 0, 189, 127, 11, 0, 252, 128, 11, 0, 61, 130, 11, 0, 124, 131, 11, 0, 189, 132, 11, 0, 252, 133, 11, 0, 61, 135, 11, 0, 124, 136, 11, 0, 189, 137, 11, 0, 252, 138, 11, 0, 61, 140, 11, 0, 124, 141, 11, 0, 189, 142, 11, 0, 252, 143, 11, 0, 61, 145, 11, 0, 124, 146, 11, 0, 189, 147, 11, 0, 252, 148, 11, 0, 61, 150, 11, 0, 124, 151, 11, 0, 189, 152, 11, 0, 252, 153, 11, 0, 61, 155, 11, 0, 124, 156, 11, 0, 189, 157, 11, 0, 252, 158, 11, 0, 61, 160, 11, 0, 124, 161, 11, 0, 189, 162, 11, 0, 252, 163, 11, 0, 61, 165, 11, 0, 124, 166, 11, 0, 189, 167, 11, 0, 252, 168, 11, 0, 61, 170, 11, 0, 124, 171, 11, 0, 189, 172, 11, 0, 252, 173, 11, 0, 61, 175, 11, 0, 124, 176, 11, 0, 189, 177, 11, 0, 252, 178, 11, 0, 61, 180, 11, 0, 124, 181, 11, 0, 189, 182, 11, 0, 252, 183, 11, 0, 61, 185, 11, 0, 124, 186, 11, 0, 189, 187, 11, 0, 252, 188, 11, 0, 61, 190, 11, 0, 124, 191, 11, 0, 189, 192, 11, 0, 252, 193, 11, 0, 61, 195, 11, 0, 124, 196, 11, 0, 189, 197, 11, 0, 252, 198, 11, 0, 61, 200, 11, 0, 124, 201, 11, 0, 189, 202, 11, 0, 252, 203, 11, 0, 61, 205, 11, 0, 124, 206, 11, 0, 189, 207, 11, 0, 252, 208, 11, 0, 61, 210, 11, 0, 124, 211, 11, 0, 189, 212, 11, 0, 252, 213, 11, 0, 61, 215, 11, 0, 124, 216, 11, 0, 189, 217, 11, 0, 252, 218, 11, 0, 61, 220, 11, 0, 124, 221, 11, 0, 189, 222, 11, 0, 252, 223, 11, 0, 61, 225, 11, 0, 124, 226, 11, 0, 189, 227, 11, 0, 252, 228, 11, 0, 61, 230, 11, 0, 124, 231, 11, 0, 189, 232, 11, 0, 252, 233, 11, 0, 61, 235, 11, 0, 124, 236, 11, 0, 189, 237, 11, 0, 252, 238, 11, 0, 61, 240, 11, 0, 124, 241, 11, 0, 189, 242, 11, 0, 252, 243, 11, 0, 61, 245, 11, 0, 124, 246, 11, 0, 189, 247, 11, 0, 252, 248, 11, 0, 61, 250, 11, 0, 124, 251, 11, 0, 189, 252, 11, 0, 252, 253, 11, 0, 61, 255, 11, 0, 124, 0, 12, 0, 189, 1, 12, 0, 252, 2, 12, 0, 61, 4, 12, 0, 124, 5, 12, 0, 189, 6, 12, 0, 252, 7, 12, 0, 61, 9, 12, 0, 124, 10, 12, 0, 189, 11, 12, 0, 252, 12, 12, 0, 61, 14, 12, 0, 124, 15, 12, 0, 189, 16, 12, 0, 252, 17, 12, 0, 61, 19, 12, 0, 124, 20, 12, 0, 189, 21, 12, 0, 252, 22, 12, 0, 61, 24, 12, 0, 124, 25, 12, 0, 189, 26, 12, 0, 252, 27, 12, 0, 61, 29, 12, 0, 124, 30, 12, 0, 189, 31, 12, 0, 252, 32, 12, 0, 61, 34, 12, 0, 124, 35, 12, 0, 189, 36, 12, 0, 252, 37, 12, 0, 61, 39, 12, 0, 124, 40, 12, 0, 189, 41, 12, 0, 252, 42, 12, 0, 61, 44, 12, 0, 124, 45, 12, 0, 189, 46, 12, 0, 252, 47, 12, 0, 61, 49, 12, 0, 124, 50, 12, 0, 189, 51, 12, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_sixteen_rising.json b/tests/recordings/logic_analyzer/test_measure_interval_same_channel_sixteen_rising.json deleted file mode 100644 index c16d099e..00000000 --- a/tests/recordings/logic_analyzer/test_measure_interval_same_channel_sixteen_rising.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [1], [2], [10], [9], [196, 9], [0], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [0, 0, 0, 0, 0, 0, 0, 0, 61, 1, 0, 0, 124, 2, 0, 0, 189, 3, 0, 0, 252, 4, 0, 0, 61, 6, 0, 0, 124, 7, 0, 0, 189, 8, 0, 0, 252, 9, 0, 0, 61, 11, 0, 0, 124, 12, 0, 0, 189, 13, 0, 0, 252, 14, 0, 0, 61, 16, 0, 0, 124, 17, 0, 0, 189, 18, 0, 0, 252, 19, 0, 0, 61, 21, 0, 0, 124, 22, 0, 0, 189, 23, 0, 0, 252, 24, 0, 0, 61, 26, 0, 0, 124, 27, 0, 0, 189, 28, 0, 0, 252, 29, 0, 0, 61, 31, 0, 0, 124, 32, 0, 0, 189, 33, 0, 0, 252, 34, 0, 0, 61, 36, 0, 0, 124, 37, 0, 0, 189, 38, 0, 0, 252, 39, 0, 0, 61, 41, 0, 0, 124, 42, 0, 0, 189, 43, 0, 0, 252, 44, 0, 0, 61, 46, 0, 0, 124, 47, 0, 0, 189, 48, 0, 0, 252, 49, 0, 0, 61, 51, 0, 0, 124, 52, 0, 0, 189, 53, 0, 0, 252, 54, 0, 0, 61, 56, 0, 0, 124, 57, 0, 0, 189, 58, 0, 0, 252, 59, 0, 0, 61, 61, 0, 0, 124, 62, 0, 0, 189, 63, 0, 0, 252, 64, 0, 0, 61, 66, 0, 0, 124, 67, 0, 0, 189, 68, 0, 0, 252, 69, 0, 0, 61, 71, 0, 0, 124, 72, 0, 0, 189, 73, 0, 0, 252, 74, 0, 0, 61, 76, 0, 0, 124, 77, 0, 0, 189, 78, 0, 0, 252, 79, 0, 0, 61, 81, 0, 0, 124, 82, 0, 0, 189, 83, 0, 0, 252, 84, 0, 0, 61, 86, 0, 0, 124, 87, 0, 0, 189, 88, 0, 0, 252, 89, 0, 0, 61, 91, 0, 0, 124, 92, 0, 0, 189, 93, 0, 0, 252, 94, 0, 0, 61, 96, 0, 0, 124, 97, 0, 0, 189, 98, 0, 0, 252, 99, 0, 0, 61, 101, 0, 0, 124, 102, 0, 0, 189, 103, 0, 0, 252, 104, 0, 0, 61, 106, 0, 0, 124, 107, 0, 0, 189, 108, 0, 0, 252, 109, 0, 0, 61, 111, 0, 0, 124, 112, 0, 0, 189, 113, 0, 0, 252, 114, 0, 0, 61, 116, 0, 0, 124, 117, 0, 0, 189, 118, 0, 0, 252, 119, 0, 0, 61, 121, 0, 0, 124, 122, 0, 0, 189, 123, 0, 0, 252, 124, 0, 0, 61, 126, 0, 0, 124, 127, 0, 0, 189, 128, 0, 0, 252, 129, 0, 0, 61, 131, 0, 0, 124, 132, 0, 0, 189, 133, 0, 0, 252, 134, 0, 0, 61, 136, 0, 0, 124, 137, 0, 0, 189, 138, 0, 0, 252, 139, 0, 0, 61, 141, 0, 0, 124, 142, 0, 0, 189, 143, 0, 0, 252, 144, 0, 0, 61, 146, 0, 0, 124, 147, 0, 0, 189, 148, 0, 0, 252, 149, 0, 0, 61, 151, 0, 0, 124, 152, 0, 0, 189, 153, 0, 0, 252, 154, 0, 0, 61, 156, 0, 0, 124, 157, 0, 0, 189, 158, 0, 0, 252, 159, 0, 0, 61, 161, 0, 0, 124, 162, 0, 0, 189, 163, 0, 0, 252, 164, 0, 0, 61, 166, 0, 0, 124, 167, 0, 0, 189, 168, 0, 0, 252, 169, 0, 0, 61, 171, 0, 0, 124, 172, 0, 0, 189, 173, 0, 0, 252, 174, 0, 0, 61, 176, 0, 0, 124, 177, 0, 0, 189, 178, 0, 0, 252, 179, 0, 0, 61, 181, 0, 0, 124, 182, 0, 0, 189, 183, 0, 0, 252, 184, 0, 0, 61, 186, 0, 0, 124, 187, 0, 0, 189, 188, 0, 0, 252, 189, 0, 0, 61, 191, 0, 0, 124, 192, 0, 0, 189, 193, 0, 0, 252, 194, 0, 0, 61, 196, 0, 0, 124, 197, 0, 0, 189, 198, 0, 0, 252, 199, 0, 0, 61, 201, 0, 0, 124, 202, 0, 0, 189, 203, 0, 0, 252, 204, 0, 0, 61, 206, 0, 0, 124, 207, 0, 0, 189, 208, 0, 0, 252, 209, 0, 0, 61, 211, 0, 0, 124, 212, 0, 0, 189, 213, 0, 0, 252, 214, 0, 0, 61, 216, 0, 0, 124, 217, 0, 0, 189, 218, 0, 0, 252, 219, 0, 0, 61, 221, 0, 0, 124, 222, 0, 0, 189, 223, 0, 0, 252, 224, 0, 0, 61, 226, 0, 0, 124, 227, 0, 0, 189, 228, 0, 0, 252, 229, 0, 0, 61, 231, 0, 0, 124, 232, 0, 0, 189, 233, 0, 0, 252, 234, 0, 0, 61, 236, 0, 0, 124, 237, 0, 0, 189, 238, 0, 0, 252, 239, 0, 0, 61, 241, 0, 0, 124, 242, 0, 0, 189, 243, 0, 0, 252, 244, 0, 0, 61, 246, 0, 0, 124, 247, 0, 0, 189, 248, 0, 0, 252, 249, 0, 0, 61, 251, 0, 0, 124, 252, 0, 0, 189, 253, 0, 0, 252, 254, 0, 0, 61, 0, 1, 0, 124, 1, 1, 0, 189, 2, 1, 0, 252, 3, 1, 0, 61, 5, 1, 0, 124, 6, 1, 0, 189, 7, 1, 0, 252, 8, 1, 0, 61, 10, 1, 0, 124, 11, 1, 0, 189, 12, 1, 0, 252, 13, 1, 0, 61, 15, 1, 0, 124, 16, 1, 0, 189, 17, 1, 0, 252, 18, 1, 0, 61, 20, 1, 0, 124, 21, 1, 0, 189, 22, 1, 0, 252, 23, 1, 0, 61, 25, 1, 0, 124, 26, 1, 0, 189, 27, 1, 0, 252, 28, 1, 0, 61, 30, 1, 0, 124, 31, 1, 0, 189, 32, 1, 0, 252, 33, 1, 0, 61, 35, 1, 0, 124, 36, 1, 0, 189, 37, 1, 0, 252, 38, 1, 0, 61, 40, 1, 0, 124, 41, 1, 0, 189, 42, 1, 0, 252, 43, 1, 0, 61, 45, 1, 0, 124, 46, 1, 0, 189, 47, 1, 0, 252, 48, 1, 0, 61, 50, 1, 0, 124, 51, 1, 0, 189, 52, 1, 0, 252, 53, 1, 0, 61, 55, 1, 0, 124, 56, 1, 0, 189, 57, 1, 0, 252, 58, 1, 0, 61, 60, 1, 0, 124, 61, 1, 0, 189, 62, 1, 0, 252, 63, 1, 0, 61, 65, 1, 0, 124, 66, 1, 0, 189, 67, 1, 0, 252, 68, 1, 0, 61, 70, 1, 0, 124, 71, 1, 0, 189, 72, 1, 0, 252, 73, 1, 0, 61, 75, 1, 0, 124, 76, 1, 0, 189, 77, 1, 0, 252, 78, 1, 0, 61, 80, 1, 0, 124, 81, 1, 0, 189, 82, 1, 0, 252, 83, 1, 0, 61, 85, 1, 0, 124, 86, 1, 0, 189, 87, 1, 0, 252, 88, 1, 0, 61, 90, 1, 0, 124, 91, 1, 0, 189, 92, 1, 0, 252, 93, 1, 0, 61, 95, 1, 0, 124, 96, 1, 0, 189, 97, 1, 0, 252, 98, 1, 0, 61, 100, 1, 0, 124, 101, 1, 0, 189, 102, 1, 0, 252, 103, 1, 0, 61, 105, 1, 0, 124, 106, 1, 0, 189, 107, 1, 0, 252, 108, 1, 0, 61, 110, 1, 0, 124, 111, 1, 0, 189, 112, 1, 0, 252, 113, 1, 0, 61, 115, 1, 0, 124, 116, 1, 0, 189, 117, 1, 0, 252, 118, 1, 0, 61, 120, 1, 0, 124, 121, 1, 0, 189, 122, 1, 0, 252, 123, 1, 0, 61, 125, 1, 0, 124, 126, 1, 0, 189, 127, 1, 0, 252, 128, 1, 0, 61, 130, 1, 0, 124, 131, 1, 0, 189, 132, 1, 0, 252, 133, 1, 0, 61, 135, 1, 0, 124, 136, 1, 0, 189, 137, 1, 0, 252, 138, 1, 0, 61, 140, 1, 0, 124, 141, 1, 0, 189, 142, 1, 0, 252, 143, 1, 0, 61, 145, 1, 0, 124, 146, 1, 0, 189, 147, 1, 0, 252, 148, 1, 0, 61, 150, 1, 0, 124, 151, 1, 0, 189, 152, 1, 0, 252, 153, 1, 0, 61, 155, 1, 0, 124, 156, 1, 0, 189, 157, 1, 0, 252, 158, 1, 0, 61, 160, 1, 0, 124, 161, 1, 0, 189, 162, 1, 0, 252, 163, 1, 0, 61, 165, 1, 0, 124, 166, 1, 0, 189, 167, 1, 0, 252, 168, 1, 0, 61, 170, 1, 0, 124, 171, 1, 0, 189, 172, 1, 0, 252, 173, 1, 0, 61, 175, 1, 0, 124, 176, 1, 0, 189, 177, 1, 0, 252, 178, 1, 0, 61, 180, 1, 0, 124, 181, 1, 0, 189, 182, 1, 0, 252, 183, 1, 0, 61, 185, 1, 0, 124, 186, 1, 0, 189, 187, 1, 0, 252, 188, 1, 0, 61, 190, 1, 0, 124, 191, 1, 0, 189, 192, 1, 0, 252, 193, 1, 0, 61, 195, 1, 0, 124, 196, 1, 0, 189, 197, 1, 0, 252, 198, 1, 0, 61, 200, 1, 0, 124, 201, 1, 0, 189, 202, 1, 0, 252, 203, 1, 0, 61, 205, 1, 0, 124, 206, 1, 0, 189, 207, 1, 0, 252, 208, 1, 0, 61, 210, 1, 0, 124, 211, 1, 0, 189, 212, 1, 0, 252, 213, 1, 0, 61, 215, 1, 0, 124, 216, 1, 0, 189, 217, 1, 0, 252, 218, 1, 0, 61, 220, 1, 0, 124, 221, 1, 0, 189, 222, 1, 0, 252, 223, 1, 0, 61, 225, 1, 0, 124, 226, 1, 0, 189, 227, 1, 0, 252, 228, 1, 0, 61, 230, 1, 0, 124, 231, 1, 0, 189, 232, 1, 0, 252, 233, 1, 0, 61, 235, 1, 0, 124, 236, 1, 0, 189, 237, 1, 0, 252, 238, 1, 0, 61, 240, 1, 0, 124, 241, 1, 0, 189, 242, 1, 0, 252, 243, 1, 0, 61, 245, 1, 0, 124, 246, 1, 0, 189, 247, 1, 0, 252, 248, 1, 0, 61, 250, 1, 0, 124, 251, 1, 0, 189, 252, 1, 0, 252, 253, 1, 0, 61, 255, 1, 0, 124, 0, 2, 0, 189, 1, 2, 0, 252, 2, 2, 0, 61, 4, 2, 0, 124, 5, 2, 0, 189, 6, 2, 0, 252, 7, 2, 0, 61, 9, 2, 0, 124, 10, 2, 0, 189, 11, 2, 0, 252, 12, 2, 0, 61, 14, 2, 0, 124, 15, 2, 0, 189, 16, 2, 0, 252, 17, 2, 0, 61, 19, 2, 0, 124, 20, 2, 0, 189, 21, 2, 0, 252, 22, 2, 0, 61, 24, 2, 0, 124, 25, 2, 0, 189, 26, 2, 0, 252, 27, 2, 0, 61, 29, 2, 0, 124, 30, 2, 0, 189, 31, 2, 0, 252, 32, 2, 0, 61, 34, 2, 0, 124, 35, 2, 0, 189, 36, 2, 0, 252, 37, 2, 0, 61, 39, 2, 0, 124, 40, 2, 0, 189, 41, 2, 0, 252, 42, 2, 0, 61, 44, 2, 0, 124, 45, 2, 0, 189, 46, 2, 0, 252, 47, 2, 0, 61, 49, 2, 0, 124, 50, 2, 0, 189, 51, 2, 0, 252, 52, 2, 0, 61, 54, 2, 0, 124, 55, 2, 0, 189, 56, 2, 0, 252, 57, 2, 0, 61, 59, 2, 0, 124, 60, 2, 0, 189, 61, 2, 0, 252, 62, 2, 0, 61, 64, 2, 0, 124, 65, 2, 0, 189, 66, 2, 0, 252, 67, 2, 0, 61, 69, 2, 0, 124, 70, 2, 0, 189, 71, 2, 0, 252, 72, 2, 0, 61, 74, 2, 0, 124, 75, 2, 0, 189, 76, 2, 0, 252, 77, 2, 0, 61, 79, 2, 0, 124, 80, 2, 0, 189, 81, 2, 0, 252, 82, 2, 0, 61, 84, 2, 0, 124, 85, 2, 0, 189, 86, 2, 0, 252, 87, 2, 0, 61, 89, 2, 0, 124, 90, 2, 0, 189, 91, 2, 0, 252, 92, 2, 0, 61, 94, 2, 0, 124, 95, 2, 0, 189, 96, 2, 0, 252, 97, 2, 0, 61, 99, 2, 0, 124, 100, 2, 0, 189, 101, 2, 0, 252, 102, 2, 0, 61, 104, 2, 0, 124, 105, 2, 0, 189, 106, 2, 0, 252, 107, 2, 0, 61, 109, 2, 0, 124, 110, 2, 0, 189, 111, 2, 0, 252, 112, 2, 0, 61, 114, 2, 0, 124, 115, 2, 0, 189, 116, 2, 0, 252, 117, 2, 0, 61, 119, 2, 0, 124, 120, 2, 0, 189, 121, 2, 0, 252, 122, 2, 0, 61, 124, 2, 0, 124, 125, 2, 0, 189, 126, 2, 0, 252, 127, 2, 0, 61, 129, 2, 0, 124, 130, 2, 0, 189, 131, 2, 0, 252, 132, 2, 0, 61, 134, 2, 0, 124, 135, 2, 0, 189, 136, 2, 0, 252, 137, 2, 0, 61, 139, 2, 0, 124, 140, 2, 0, 189, 141, 2, 0, 252, 142, 2, 0, 61, 144, 2, 0, 124, 145, 2, 0, 189, 146, 2, 0, 252, 147, 2, 0, 61, 149, 2, 0, 124, 150, 2, 0, 189, 151, 2, 0, 252, 152, 2, 0, 61, 154, 2, 0, 124, 155, 2, 0, 189, 156, 2, 0, 252, 157, 2, 0, 61, 159, 2, 0, 124, 160, 2, 0, 189, 161, 2, 0, 252, 162, 2, 0, 61, 164, 2, 0, 124, 165, 2, 0, 189, 166, 2, 0, 252, 167, 2, 0, 61, 169, 2, 0, 124, 170, 2, 0, 189, 171, 2, 0, 252, 172, 2, 0, 61, 174, 2, 0, 124, 175, 2, 0, 189, 176, 2, 0, 252, 177, 2, 0, 61, 179, 2, 0, 124, 180, 2, 0, 189, 181, 2, 0, 252, 182, 2, 0, 61, 184, 2, 0, 124, 185, 2, 0, 189, 186, 2, 0, 252, 187, 2, 0, 61, 189, 2, 0, 124, 190, 2, 0, 189, 191, 2, 0, 252, 192, 2, 0, 61, 194, 2, 0, 124, 195, 2, 0, 189, 196, 2, 0, 252, 197, 2, 0, 61, 199, 2, 0, 124, 200, 2, 0, 189, 201, 2, 0, 252, 202, 2, 0, 61, 204, 2, 0, 124, 205, 2, 0, 189, 206, 2, 0, 252, 207, 2, 0, 61, 209, 2, 0, 124, 210, 2, 0, 189, 211, 2, 0, 252, 212, 2, 0, 61, 214, 2, 0, 124, 215, 2, 0, 189, 216, 2, 0, 252, 217, 2, 0, 61, 219, 2, 0, 124, 220, 2, 0, 189, 221, 2, 0, 252, 222, 2, 0, 61, 224, 2, 0, 124, 225, 2, 0, 189, 226, 2, 0, 252, 227, 2, 0, 61, 229, 2, 0, 124, 230, 2, 0, 189, 231, 2, 0, 252, 232, 2, 0, 61, 234, 2, 0, 124, 235, 2, 0, 189, 236, 2, 0, 252, 237, 2, 0, 61, 239, 2, 0, 124, 240, 2, 0, 189, 241, 2, 0, 252, 242, 2, 0, 61, 244, 2, 0, 124, 245, 2, 0, 189, 246, 2, 0, 252, 247, 2, 0, 61, 249, 2, 0, 124, 250, 2, 0, 189, 251, 2, 0, 252, 252, 2, 0, 61, 254, 2, 0, 124, 255, 2, 0, 189, 0, 3, 0, 252, 1, 3, 0, 61, 3, 3, 0, 124, 4, 3, 0, 189, 5, 3, 0, 252, 6, 3, 0, 61, 8, 3, 0, 124, 9, 3, 0, 189, 10, 3, 0, 252, 11, 3, 0, 61, 13, 3, 0, 124, 14, 3, 0, 189, 15, 3, 0, 252, 16, 3, 0, 61, 18, 3, 0, 124, 19, 3, 0, 189, 20, 3, 0, 252, 21, 3, 0, 61, 23, 3, 0, 124, 24, 3, 0, 189, 25, 3, 0, 252, 26, 3, 0, 61, 28, 3, 0, 124, 29, 3, 0, 189, 30, 3, 0, 252, 31, 3, 0, 61, 33, 3, 0, 124, 34, 3, 0, 189, 35, 3, 0, 252, 36, 3, 0, 61, 38, 3, 0, 124, 39, 3, 0, 189, 40, 3, 0, 252, 41, 3, 0, 61, 43, 3, 0, 124, 44, 3, 0, 189, 45, 3, 0, 252, 46, 3, 0, 61, 48, 3, 0, 124, 49, 3, 0, 189, 50, 3, 0, 252, 51, 3, 0, 61, 53, 3, 0, 124, 54, 3, 0, 189, 55, 3, 0, 252, 56, 3, 0, 61, 58, 3, 0, 124, 59, 3, 0, 189, 60, 3, 0, 252, 61, 3, 0, 61, 63, 3, 0, 124, 64, 3, 0, 189, 65, 3, 0, 252, 66, 3, 0, 61, 68, 3, 0, 124, 69, 3, 0, 189, 70, 3, 0, 252, 71, 3, 0, 61, 73, 3, 0, 124, 74, 3, 0, 189, 75, 3, 0, 252, 76, 3, 0, 61, 78, 3, 0, 124, 79, 3, 0, 189, 80, 3, 0, 252, 81, 3, 0, 61, 83, 3, 0, 124, 84, 3, 0, 189, 85, 3, 0, 252, 86, 3, 0, 61, 88, 3, 0, 124, 89, 3, 0, 189, 90, 3, 0, 252, 91, 3, 0, 61, 93, 3, 0, 124, 94, 3, 0, 189, 95, 3, 0, 252, 96, 3, 0, 61, 98, 3, 0, 124, 99, 3, 0, 189, 100, 3, 0, 252, 101, 3, 0, 61, 103, 3, 0, 124, 104, 3, 0, 189, 105, 3, 0, 252, 106, 3, 0, 61, 108, 3, 0, 124, 109, 3, 0, 189, 110, 3, 0, 252, 111, 3, 0, 61, 113, 3, 0, 124, 114, 3, 0, 189, 115, 3, 0, 252, 116, 3, 0, 61, 118, 3, 0, 124, 119, 3, 0, 189, 120, 3, 0, 252, 121, 3, 0, 61, 123, 3, 0, 124, 124, 3, 0, 189, 125, 3, 0, 252, 126, 3, 0, 61, 128, 3, 0, 124, 129, 3, 0, 189, 130, 3, 0, 252, 131, 3, 0, 61, 133, 3, 0, 124, 134, 3, 0, 189, 135, 3, 0, 252, 136, 3, 0, 61, 138, 3, 0, 124, 139, 3, 0, 189, 140, 3, 0, 252, 141, 3, 0, 61, 143, 3, 0, 124, 144, 3, 0, 189, 145, 3, 0, 252, 146, 3, 0, 61, 148, 3, 0, 124, 149, 3, 0, 189, 150, 3, 0, 252, 151, 3, 0, 61, 153, 3, 0, 124, 154, 3, 0, 189, 155, 3, 0, 252, 156, 3, 0, 61, 158, 3, 0, 124, 159, 3, 0, 189, 160, 3, 0, 252, 161, 3, 0, 61, 163, 3, 0, 124, 164, 3, 0, 189, 165, 3, 0, 252, 166, 3, 0, 61, 168, 3, 0, 124, 169, 3, 0, 189, 170, 3, 0, 252, 171, 3, 0, 61, 173, 3, 0, 124, 174, 3, 0, 189, 175, 3, 0, 252, 176, 3, 0, 61, 178, 3, 0, 124, 179, 3, 0, 189, 180, 3, 0, 252, 181, 3, 0, 61, 183, 3, 0, 124, 184, 3, 0, 189, 185, 3, 0, 252, 186, 3, 0, 61, 188, 3, 0, 124, 189, 3, 0, 189, 190, 3, 0, 252, 191, 3, 0, 61, 193, 3, 0, 124, 194, 3, 0, 189, 195, 3, 0, 252, 196, 3, 0, 61, 198, 3, 0, 124, 199, 3, 0, 189, 200, 3, 0, 252, 201, 3, 0, 61, 203, 3, 0, 124, 204, 3, 0, 189, 205, 3, 0, 252, 206, 3, 0, 61, 208, 3, 0, 124, 209, 3, 0, 189, 210, 3, 0, 252, 211, 3, 0, 61, 213, 3, 0, 124, 214, 3, 0, 189, 215, 3, 0, 252, 216, 3, 0, 61, 218, 3, 0, 124, 219, 3, 0, 189, 220, 3, 0, 252, 221, 3, 0, 61, 223, 3, 0, 124, 224, 3, 0, 189, 225, 3, 0, 252, 226, 3, 0, 61, 228, 3, 0, 124, 229, 3, 0, 189, 230, 3, 0, 252, 231, 3, 0, 61, 233, 3, 0, 124, 234, 3, 0, 189, 235, 3, 0, 252, 236, 3, 0, 61, 238, 3, 0, 124, 239, 3, 0, 189, 240, 3, 0, 252, 241, 3, 0, 61, 243, 3, 0, 124, 244, 3, 0, 189, 245, 3, 0, 252, 246, 3, 0, 61, 248, 3, 0, 124, 249, 3, 0, 189, 250, 3, 0, 252, 251, 3, 0, 61, 253, 3, 0, 124, 254, 3, 0, 189, 255, 3, 0, 252, 0, 4, 0, 61, 2, 4, 0, 124, 3, 4, 0, 189, 4, 4, 0, 252, 5, 4, 0, 61, 7, 4, 0, 124, 8, 4, 0, 189, 9, 4, 0, 252, 10, 4, 0, 61, 12, 4, 0, 124, 13, 4, 0, 189, 14, 4, 0, 252, 15, 4, 0, 61, 17, 4, 0, 124, 18, 4, 0, 189, 19, 4, 0, 252, 20, 4, 0, 61, 22, 4, 0, 124, 23, 4, 0, 189, 24, 4, 0, 252, 25, 4, 0, 61, 27, 4, 0, 124, 28, 4, 0, 189, 29, 4, 0, 252, 30, 4, 0, 61, 32, 4, 0, 124, 33, 4, 0, 189, 34, 4, 0, 252, 35, 4, 0, 61, 37, 4, 0, 124, 38, 4, 0, 189, 39, 4, 0, 252, 40, 4, 0, 61, 42, 4, 0, 124, 43, 4, 0, 189, 44, 4, 0, 252, 45, 4, 0, 61, 47, 4, 0, 124, 48, 4, 0, 189, 49, 4, 0, 252, 50, 4, 0, 61, 52, 4, 0, 124, 53, 4, 0, 189, 54, 4, 0, 252, 55, 4, 0, 61, 57, 4, 0, 124, 58, 4, 0, 189, 59, 4, 0, 252, 60, 4, 0, 61, 62, 4, 0, 124, 63, 4, 0, 189, 64, 4, 0, 252, 65, 4, 0, 61, 67, 4, 0, 124, 68, 4, 0, 189, 69, 4, 0, 252, 70, 4, 0, 61, 72, 4, 0, 124, 73, 4, 0, 189, 74, 4, 0, 252, 75, 4, 0, 61, 77, 4, 0, 124, 78, 4, 0, 189, 79, 4, 0, 252, 80, 4, 0, 61, 82, 4, 0, 124, 83, 4, 0, 189, 84, 4, 0, 252, 85, 4, 0, 61, 87, 4, 0, 124, 88, 4, 0, 189, 89, 4, 0, 252, 90, 4, 0, 61, 92, 4, 0, 124, 93, 4, 0, 189, 94, 4, 0, 252, 95, 4, 0, 61, 97, 4, 0, 124, 98, 4, 0, 189, 99, 4, 0, 252, 100, 4, 0, 61, 102, 4, 0, 124, 103, 4, 0, 189, 104, 4, 0, 252, 105, 4, 0, 61, 107, 4, 0, 124, 108, 4, 0, 189, 109, 4, 0, 252, 110, 4, 0, 61, 112, 4, 0, 124, 113, 4, 0, 189, 114, 4, 0, 252, 115, 4, 0, 61, 117, 4, 0, 124, 118, 4, 0, 189, 119, 4, 0, 252, 120, 4, 0, 61, 122, 4, 0, 124, 123, 4, 0, 189, 124, 4, 0, 252, 125, 4, 0, 61, 127, 4, 0, 124, 128, 4, 0, 189, 129, 4, 0, 252, 130, 4, 0, 61, 132, 4, 0, 124, 133, 4, 0, 189, 134, 4, 0, 252, 135, 4, 0, 61, 137, 4, 0, 124, 138, 4, 0, 189, 139, 4, 0, 252, 140, 4, 0, 61, 142, 4, 0, 124, 143, 4, 0, 189, 144, 4, 0, 252, 145, 4, 0, 61, 147, 4, 0, 124, 148, 4, 0, 189, 149, 4, 0, 252, 150, 4, 0, 61, 152, 4, 0, 124, 153, 4, 0, 189, 154, 4, 0, 252, 155, 4, 0, 61, 157, 4, 0, 124, 158, 4, 0, 189, 159, 4, 0, 252, 160, 4, 0, 61, 162, 4, 0, 124, 163, 4, 0, 189, 164, 4, 0, 252, 165, 4, 0, 61, 167, 4, 0, 124, 168, 4, 0, 189, 169, 4, 0, 252, 170, 4, 0, 61, 172, 4, 0, 124, 173, 4, 0, 189, 174, 4, 0, 252, 175, 4, 0, 61, 177, 4, 0, 124, 178, 4, 0, 189, 179, 4, 0, 252, 180, 4, 0, 61, 182, 4, 0, 124, 183, 4, 0, 189, 184, 4, 0, 252, 185, 4, 0, 61, 187, 4, 0, 124, 188, 4, 0, 189, 189, 4, 0, 252, 190, 4, 0, 61, 192, 4, 0, 124, 193, 4, 0, 189, 194, 4, 0, 252, 195, 4, 0, 61, 197, 4, 0, 124, 198, 4, 0, 189, 199, 4, 0, 252, 200, 4, 0, 61, 202, 4, 0, 124, 203, 4, 0, 189, 204, 4, 0, 252, 205, 4, 0, 61, 207, 4, 0, 124, 208, 4, 0, 189, 209, 4, 0, 252, 210, 4, 0, 61, 212, 4, 0, 124, 213, 4, 0, 189, 214, 4, 0, 252, 215, 4, 0, 61, 217, 4, 0, 124, 218, 4, 0, 189, 219, 4, 0, 252, 220, 4, 0, 61, 222, 4, 0, 124, 223, 4, 0, 189, 224, 4, 0, 252, 225, 4, 0, 61, 227, 4, 0, 124, 228, 4, 0, 189, 229, 4, 0, 252, 230, 4, 0, 61, 232, 4, 0, 124, 233, 4, 0, 189, 234, 4, 0, 252, 235, 4, 0, 61, 237, 4, 0, 124, 238, 4, 0, 189, 239, 4, 0, 252, 240, 4, 0, 61, 242, 4, 0, 124, 243, 4, 0, 189, 244, 4, 0, 252, 245, 4, 0, 61, 247, 4, 0, 124, 248, 4, 0, 189, 249, 4, 0, 252, 250, 4, 0, 61, 252, 4, 0, 124, 253, 4, 0, 189, 254, 4, 0, 252, 255, 4, 0, 61, 1, 5, 0, 124, 2, 5, 0, 189, 3, 5, 0, 252, 4, 5, 0, 61, 6, 5, 0, 124, 7, 5, 0, 189, 8, 5, 0, 252, 9, 5, 0, 61, 11, 5, 0, 124, 12, 5, 0, 189, 13, 5, 0, 252, 14, 5, 0, 61, 16, 5, 0, 124, 17, 5, 0, 189, 18, 5, 0, 252, 19, 5, 0, 61, 21, 5, 0, 124, 22, 5, 0, 189, 23, 5, 0, 252, 24, 5, 0, 61, 26, 5, 0, 124, 27, 5, 0, 189, 28, 5, 0, 252, 29, 5, 0, 61, 31, 5, 0, 124, 32, 5, 0, 189, 33, 5, 0, 252, 34, 5, 0, 61, 36, 5, 0, 124, 37, 5, 0, 189, 38, 5, 0, 252, 39, 5, 0, 61, 41, 5, 0, 124, 42, 5, 0, 189, 43, 5, 0, 252, 44, 5, 0, 61, 46, 5, 0, 124, 47, 5, 0, 189, 48, 5, 0, 252, 49, 5, 0, 61, 51, 5, 0, 124, 52, 5, 0, 189, 53, 5, 0, 252, 54, 5, 0, 61, 56, 5, 0, 124, 57, 5, 0, 189, 58, 5, 0, 252, 59, 5, 0, 61, 61, 5, 0, 124, 62, 5, 0, 189, 63, 5, 0, 252, 64, 5, 0, 61, 66, 5, 0, 124, 67, 5, 0, 189, 68, 5, 0, 252, 69, 5, 0, 61, 71, 5, 0, 124, 72, 5, 0, 189, 73, 5, 0, 252, 74, 5, 0, 61, 76, 5, 0, 124, 77, 5, 0, 189, 78, 5, 0, 252, 79, 5, 0, 61, 81, 5, 0, 124, 82, 5, 0, 189, 83, 5, 0, 252, 84, 5, 0, 61, 86, 5, 0, 124, 87, 5, 0, 189, 88, 5, 0, 252, 89, 5, 0, 61, 91, 5, 0, 124, 92, 5, 0, 189, 93, 5, 0, 252, 94, 5, 0, 61, 96, 5, 0, 124, 97, 5, 0, 189, 98, 5, 0, 252, 99, 5, 0, 61, 101, 5, 0, 124, 102, 5, 0, 189, 103, 5, 0, 252, 104, 5, 0, 61, 106, 5, 0, 124, 107, 5, 0, 189, 108, 5, 0, 252, 109, 5, 0, 61, 111, 5, 0, 124, 112, 5, 0, 189, 113, 5, 0, 252, 114, 5, 0, 61, 116, 5, 0, 124, 117, 5, 0, 189, 118, 5, 0, 252, 119, 5, 0, 61, 121, 5, 0, 124, 122, 5, 0, 189, 123, 5, 0, 252, 124, 5, 0, 61, 126, 5, 0, 124, 127, 5, 0, 189, 128, 5, 0, 252, 129, 5, 0, 61, 131, 5, 0, 124, 132, 5, 0, 189, 133, 5, 0, 252, 134, 5, 0, 61, 136, 5, 0, 124, 137, 5, 0, 189, 138, 5, 0, 252, 139, 5, 0, 61, 141, 5, 0, 124, 142, 5, 0, 189, 143, 5, 0, 252, 144, 5, 0, 61, 146, 5, 0, 124, 147, 5, 0, 189, 148, 5, 0, 252, 149, 5, 0, 61, 151, 5, 0, 124, 152, 5, 0, 189, 153, 5, 0, 252, 154, 5, 0, 61, 156, 5, 0, 124, 157, 5, 0, 189, 158, 5, 0, 252, 159, 5, 0, 61, 161, 5, 0, 124, 162, 5, 0, 189, 163, 5, 0, 252, 164, 5, 0, 61, 166, 5, 0, 124, 167, 5, 0, 189, 168, 5, 0, 252, 169, 5, 0, 61, 171, 5, 0, 124, 172, 5, 0, 189, 173, 5, 0, 252, 174, 5, 0, 61, 176, 5, 0, 124, 177, 5, 0, 189, 178, 5, 0, 252, 179, 5, 0, 61, 181, 5, 0, 124, 182, 5, 0, 189, 183, 5, 0, 252, 184, 5, 0, 61, 186, 5, 0, 124, 187, 5, 0, 189, 188, 5, 0, 252, 189, 5, 0, 61, 191, 5, 0, 124, 192, 5, 0, 189, 193, 5, 0, 252, 194, 5, 0, 61, 196, 5, 0, 124, 197, 5, 0, 189, 198, 5, 0, 252, 199, 5, 0, 61, 201, 5, 0, 124, 202, 5, 0, 189, 203, 5, 0, 252, 204, 5, 0, 61, 206, 5, 0, 124, 207, 5, 0, 189, 208, 5, 0, 252, 209, 5, 0, 61, 211, 5, 0, 124, 212, 5, 0, 189, 213, 5, 0, 252, 214, 5, 0, 61, 216, 5, 0, 124, 217, 5, 0, 189, 218, 5, 0, 252, 219, 5, 0, 61, 221, 5, 0, 124, 222, 5, 0, 189, 223, 5, 0, 252, 224, 5, 0, 61, 226, 5, 0, 124, 227, 5, 0, 189, 228, 5, 0, 252, 229, 5, 0, 61, 231, 5, 0, 124, 232, 5, 0, 189, 233, 5, 0, 252, 234, 5, 0, 61, 236, 5, 0, 124, 237, 5, 0, 189, 238, 5, 0, 252, 239, 5, 0, 61, 241, 5, 0, 124, 242, 5, 0, 189, 243, 5, 0, 252, 244, 5, 0, 61, 246, 5, 0, 124, 247, 5, 0, 189, 248, 5, 0, 252, 249, 5, 0, 61, 251, 5, 0, 124, 252, 5, 0, 189, 253, 5, 0, 252, 254, 5, 0, 61, 0, 6, 0, 124, 1, 6, 0, 189, 2, 6, 0, 252, 3, 6, 0, 61, 5, 6, 0, 124, 6, 6, 0, 189, 7, 6, 0, 252, 8, 6, 0, 61, 10, 6, 0, 124, 11, 6, 0, 189, 12, 6, 0, 252, 13, 6, 0, 61, 15, 6, 0, 124, 16, 6, 0, 189, 17, 6, 0, 252, 18, 6, 0, 61, 20, 6, 0, 124, 21, 6, 0, 189, 22, 6, 0, 252, 23, 6, 0, 61, 25, 6, 0, 124, 26, 6, 0, 189, 27, 6, 0, 252, 28, 6, 0, 61, 30, 6, 0, 124, 31, 6, 0, 189, 32, 6, 0, 252, 33, 6, 0, 61, 35, 6, 0, 124, 36, 6, 0, 189, 37, 6, 0, 252, 38, 6, 0, 61, 40, 6, 0, 124, 41, 6, 0, 189, 42, 6, 0, 252, 43, 6, 0, 61, 45, 6, 0, 124, 46, 6, 0, 189, 47, 6, 0, 252, 48, 6, 0, 61, 50, 6, 0, 124, 51, 6, 0, 189, 52, 6, 0, 252, 53, 6, 0, 61, 55, 6, 0, 124, 56, 6, 0, 189, 57, 6, 0, 252, 58, 6, 0, 61, 60, 6, 0, 124, 61, 6, 0, 189, 62, 6, 0, 252, 63, 6, 0, 61, 65, 6, 0, 124, 66, 6, 0, 189, 67, 6, 0, 252, 68, 6, 0, 61, 70, 6, 0, 124, 71, 6, 0, 189, 72, 6, 0, 252, 73, 6, 0, 61, 75, 6, 0, 124, 76, 6, 0, 189, 77, 6, 0, 252, 78, 6, 0, 61, 80, 6, 0, 124, 81, 6, 0, 189, 82, 6, 0, 252, 83, 6, 0, 61, 85, 6, 0, 124, 86, 6, 0, 189, 87, 6, 0, 252, 88, 6, 0, 61, 90, 6, 0, 124, 91, 6, 0, 189, 92, 6, 0, 252, 93, 6, 0, 61, 95, 6, 0, 124, 96, 6, 0, 189, 97, 6, 0, 252, 98, 6, 0, 61, 100, 6, 0, 124, 101, 6, 0, 189, 102, 6, 0, 252, 103, 6, 0, 61, 105, 6, 0, 124, 106, 6, 0, 189, 107, 6, 0, 252, 108, 6, 0, 61, 110, 6, 0, 124, 111, 6, 0, 189, 112, 6, 0, 252, 113, 6, 0, 61, 115, 6, 0, 124, 116, 6, 0, 189, 117, 6, 0, 252, 118, 6, 0, 61, 120, 6, 0, 124, 121, 6, 0, 189, 122, 6, 0, 252, 123, 6, 0, 61, 125, 6, 0, 124, 126, 6, 0, 189, 127, 6, 0, 252, 128, 6, 0, 61, 130, 6, 0, 124, 131, 6, 0, 189, 132, 6, 0, 252, 133, 6, 0, 61, 135, 6, 0, 124, 136, 6, 0, 189, 137, 6, 0, 252, 138, 6, 0, 61, 140, 6, 0, 124, 141, 6, 0, 189, 142, 6, 0, 252, 143, 6, 0, 61, 145, 6, 0, 124, 146, 6, 0, 189, 147, 6, 0, 252, 148, 6, 0, 61, 150, 6, 0, 124, 151, 6, 0, 189, 152, 6, 0, 252, 153, 6, 0, 61, 155, 6, 0, 124, 156, 6, 0, 189, 157, 6, 0, 252, 158, 6, 0, 61, 160, 6, 0, 124, 161, 6, 0, 189, 162, 6, 0, 252, 163, 6, 0, 61, 165, 6, 0, 124, 166, 6, 0, 189, 167, 6, 0, 252, 168, 6, 0, 61, 170, 6, 0, 124, 171, 6, 0, 189, 172, 6, 0, 252, 173, 6, 0, 61, 175, 6, 0, 124, 176, 6, 0, 189, 177, 6, 0, 252, 178, 6, 0, 61, 180, 6, 0, 124, 181, 6, 0, 189, 182, 6, 0, 252, 183, 6, 0, 61, 185, 6, 0, 124, 186, 6, 0, 189, 187, 6, 0, 252, 188, 6, 0, 61, 190, 6, 0, 124, 191, 6, 0, 189, 192, 6, 0, 252, 193, 6, 0, 61, 195, 6, 0, 124, 196, 6, 0, 189, 197, 6, 0, 252, 198, 6, 0, 61, 200, 6, 0, 124, 201, 6, 0, 189, 202, 6, 0, 252, 203, 6, 0, 61, 205, 6, 0, 124, 206, 6, 0, 189, 207, 6, 0, 252, 208, 6, 0, 61, 210, 6, 0, 124, 211, 6, 0, 189, 212, 6, 0, 252, 213, 6, 0, 61, 215, 6, 0, 124, 216, 6, 0, 189, 217, 6, 0, 252, 218, 6, 0, 61, 220, 6, 0, 124, 221, 6, 0, 189, 222, 6, 0, 252, 223, 6, 0, 61, 225, 6, 0, 124, 226, 6, 0, 189, 227, 6, 0, 252, 228, 6, 0, 61, 230, 6, 0, 124, 231, 6, 0, 189, 232, 6, 0, 252, 233, 6, 0, 61, 235, 6, 0, 124, 236, 6, 0, 189, 237, 6, 0, 252, 238, 6, 0, 61, 240, 6, 0, 124, 241, 6, 0, 189, 242, 6, 0, 252, 243, 6, 0, 61, 245, 6, 0, 124, 246, 6, 0, 189, 247, 6, 0, 252, 248, 6, 0, 61, 250, 6, 0, 124, 251, 6, 0, 189, 252, 6, 0, 252, 253, 6, 0, 61, 255, 6, 0, 124, 0, 7, 0, 189, 1, 7, 0, 252, 2, 7, 0, 61, 4, 7, 0, 124, 5, 7, 0, 189, 6, 7, 0, 252, 7, 7, 0, 61, 9, 7, 0, 124, 10, 7, 0, 189, 11, 7, 0, 252, 12, 7, 0, 61, 14, 7, 0, 124, 15, 7, 0, 189, 16, 7, 0, 252, 17, 7, 0, 61, 19, 7, 0, 124, 20, 7, 0, 189, 21, 7, 0, 252, 22, 7, 0, 61, 24, 7, 0, 124, 25, 7, 0, 189, 26, 7, 0, 252, 27, 7, 0, 61, 29, 7, 0, 124, 30, 7, 0, 189, 31, 7, 0, 252, 32, 7, 0, 61, 34, 7, 0, 124, 35, 7, 0, 189, 36, 7, 0, 252, 37, 7, 0, 61, 39, 7, 0, 124, 40, 7, 0, 189, 41, 7, 0, 252, 42, 7, 0, 61, 44, 7, 0, 124, 45, 7, 0, 189, 46, 7, 0, 252, 47, 7, 0, 61, 49, 7, 0, 124, 50, 7, 0, 189, 51, 7, 0, 252, 52, 7, 0, 61, 54, 7, 0, 124, 55, 7, 0, 189, 56, 7, 0, 252, 57, 7, 0, 61, 59, 7, 0, 124, 60, 7, 0, 189, 61, 7, 0, 252, 62, 7, 0, 61, 64, 7, 0, 124, 65, 7, 0, 189, 66, 7, 0, 252, 67, 7, 0, 61, 69, 7, 0, 124, 70, 7, 0, 189, 71, 7, 0, 252, 72, 7, 0, 61, 74, 7, 0, 124, 75, 7, 0, 189, 76, 7, 0, 252, 77, 7, 0, 61, 79, 7, 0, 124, 80, 7, 0, 189, 81, 7, 0, 252, 82, 7, 0, 61, 84, 7, 0, 124, 85, 7, 0, 189, 86, 7, 0, 252, 87, 7, 0, 61, 89, 7, 0, 124, 90, 7, 0, 189, 91, 7, 0, 252, 92, 7, 0, 61, 94, 7, 0, 124, 95, 7, 0, 189, 96, 7, 0, 252, 97, 7, 0, 61, 99, 7, 0, 124, 100, 7, 0, 189, 101, 7, 0, 252, 102, 7, 0, 61, 104, 7, 0, 124, 105, 7, 0, 189, 106, 7, 0, 252, 107, 7, 0, 61, 109, 7, 0, 124, 110, 7, 0, 189, 111, 7, 0, 252, 112, 7, 0, 61, 114, 7, 0, 124, 115, 7, 0, 189, 116, 7, 0, 252, 117, 7, 0, 61, 119, 7, 0, 124, 120, 7, 0, 189, 121, 7, 0, 252, 122, 7, 0, 61, 124, 7, 0, 124, 125, 7, 0, 189, 126, 7, 0, 252, 127, 7, 0, 61, 129, 7, 0, 124, 130, 7, 0, 189, 131, 7, 0, 252, 132, 7, 0, 61, 134, 7, 0, 124, 135, 7, 0, 189, 136, 7, 0, 252, 137, 7, 0, 61, 139, 7, 0, 124, 140, 7, 0, 189, 141, 7, 0, 252, 142, 7, 0, 61, 144, 7, 0, 124, 145, 7, 0, 189, 146, 7, 0, 252, 147, 7, 0, 61, 149, 7, 0, 124, 150, 7, 0, 189, 151, 7, 0, 252, 152, 7, 0, 61, 154, 7, 0, 124, 155, 7, 0, 189, 156, 7, 0, 252, 157, 7, 0, 61, 159, 7, 0, 124, 160, 7, 0, 189, 161, 7, 0, 252, 162, 7, 0, 61, 164, 7, 0, 124, 165, 7, 0, 189, 166, 7, 0, 252, 167, 7, 0, 61, 169, 7, 0, 124, 170, 7, 0, 189, 171, 7, 0, 252, 172, 7, 0, 61, 174, 7, 0, 124, 175, 7, 0, 189, 176, 7, 0, 252, 177, 7, 0, 61, 179, 7, 0, 124, 180, 7, 0, 189, 181, 7, 0, 252, 182, 7, 0, 61, 184, 7, 0, 124, 185, 7, 0, 189, 186, 7, 0, 252, 187, 7, 0, 61, 189, 7, 0, 124, 190, 7, 0, 189, 191, 7, 0, 252, 192, 7, 0, 61, 194, 7, 0, 124, 195, 7, 0, 189, 196, 7, 0, 252, 197, 7, 0, 61, 199, 7, 0, 124, 200, 7, 0, 189, 201, 7, 0, 252, 202, 7, 0, 61, 204, 7, 0, 124, 205, 7, 0, 189, 206, 7, 0, 252, 207, 7, 0, 61, 209, 7, 0, 124, 210, 7, 0, 189, 211, 7, 0, 252, 212, 7, 0, 61, 214, 7, 0, 124, 215, 7, 0, 189, 216, 7, 0, 252, 217, 7, 0, 61, 219, 7, 0, 124, 220, 7, 0, 189, 221, 7, 0, 252, 222, 7, 0, 61, 224, 7, 0, 124, 225, 7, 0, 189, 226, 7, 0, 252, 227, 7, 0, 61, 229, 7, 0, 124, 230, 7, 0, 189, 231, 7, 0, 252, 232, 7, 0, 61, 234, 7, 0, 124, 235, 7, 0, 189, 236, 7, 0, 252, 237, 7, 0, 61, 239, 7, 0, 124, 240, 7, 0, 189, 241, 7, 0, 252, 242, 7, 0, 61, 244, 7, 0, 124, 245, 7, 0, 189, 246, 7, 0, 252, 247, 7, 0, 61, 249, 7, 0, 124, 250, 7, 0, 189, 251, 7, 0, 252, 252, 7, 0, 61, 254, 7, 0, 124, 255, 7, 0, 189, 0, 8, 0, 252, 1, 8, 0, 61, 3, 8, 0, 124, 4, 8, 0, 189, 5, 8, 0, 252, 6, 8, 0, 61, 8, 8, 0, 124, 9, 8, 0, 189, 10, 8, 0, 252, 11, 8, 0, 61, 13, 8, 0, 124, 14, 8, 0, 189, 15, 8, 0, 252, 16, 8, 0, 61, 18, 8, 0, 124, 19, 8, 0, 189, 20, 8, 0, 252, 21, 8, 0, 61, 23, 8, 0, 124, 24, 8, 0, 189, 25, 8, 0, 252, 26, 8, 0, 61, 28, 8, 0, 124, 29, 8, 0, 189, 30, 8, 0, 252, 31, 8, 0, 61, 33, 8, 0, 124, 34, 8, 0, 189, 35, 8, 0, 252, 36, 8, 0, 61, 38, 8, 0, 124, 39, 8, 0, 189, 40, 8, 0, 252, 41, 8, 0, 61, 43, 8, 0, 124, 44, 8, 0, 189, 45, 8, 0, 252, 46, 8, 0, 61, 48, 8, 0, 124, 49, 8, 0, 189, 50, 8, 0, 252, 51, 8, 0, 61, 53, 8, 0, 124, 54, 8, 0, 189, 55, 8, 0, 252, 56, 8, 0, 61, 58, 8, 0, 124, 59, 8, 0, 189, 60, 8, 0, 252, 61, 8, 0, 61, 63, 8, 0, 124, 64, 8, 0, 189, 65, 8, 0, 252, 66, 8, 0, 61, 68, 8, 0, 124, 69, 8, 0, 189, 70, 8, 0, 252, 71, 8, 0, 61, 73, 8, 0, 124, 74, 8, 0, 189, 75, 8, 0, 252, 76, 8, 0, 61, 78, 8, 0, 124, 79, 8, 0, 189, 80, 8, 0, 252, 81, 8, 0, 61, 83, 8, 0, 124, 84, 8, 0, 189, 85, 8, 0, 252, 86, 8, 0, 61, 88, 8, 0, 124, 89, 8, 0, 189, 90, 8, 0, 252, 91, 8, 0, 61, 93, 8, 0, 124, 94, 8, 0, 189, 95, 8, 0, 252, 96, 8, 0, 61, 98, 8, 0, 124, 99, 8, 0, 189, 100, 8, 0, 252, 101, 8, 0, 61, 103, 8, 0, 124, 104, 8, 0, 189, 105, 8, 0, 252, 106, 8, 0, 61, 108, 8, 0, 124, 109, 8, 0, 189, 110, 8, 0, 252, 111, 8, 0, 61, 113, 8, 0, 124, 114, 8, 0, 189, 115, 8, 0, 252, 116, 8, 0, 61, 118, 8, 0, 124, 119, 8, 0, 189, 120, 8, 0, 252, 121, 8, 0, 61, 123, 8, 0, 124, 124, 8, 0, 189, 125, 8, 0, 252, 126, 8, 0, 61, 128, 8, 0, 124, 129, 8, 0, 189, 130, 8, 0, 252, 131, 8, 0, 61, 133, 8, 0, 124, 134, 8, 0, 189, 135, 8, 0, 252, 136, 8, 0, 61, 138, 8, 0, 124, 139, 8, 0, 189, 140, 8, 0, 252, 141, 8, 0, 61, 143, 8, 0, 124, 144, 8, 0, 189, 145, 8, 0, 252, 146, 8, 0, 61, 148, 8, 0, 124, 149, 8, 0, 189, 150, 8, 0, 252, 151, 8, 0, 61, 153, 8, 0, 124, 154, 8, 0, 189, 155, 8, 0, 252, 156, 8, 0, 61, 158, 8, 0, 124, 159, 8, 0, 189, 160, 8, 0, 252, 161, 8, 0, 61, 163, 8, 0, 124, 164, 8, 0, 189, 165, 8, 0, 252, 166, 8, 0, 61, 168, 8, 0, 124, 169, 8, 0, 189, 170, 8, 0, 252, 171, 8, 0, 61, 173, 8, 0, 124, 174, 8, 0, 189, 175, 8, 0, 252, 176, 8, 0, 61, 178, 8, 0, 124, 179, 8, 0, 189, 180, 8, 0, 252, 181, 8, 0, 61, 183, 8, 0, 124, 184, 8, 0, 189, 185, 8, 0, 252, 186, 8, 0, 61, 188, 8, 0, 124, 189, 8, 0, 189, 190, 8, 0, 252, 191, 8, 0, 61, 193, 8, 0, 124, 194, 8, 0, 189, 195, 8, 0, 252, 196, 8, 0, 61, 198, 8, 0, 124, 199, 8, 0, 189, 200, 8, 0, 252, 201, 8, 0, 61, 203, 8, 0, 124, 204, 8, 0, 189, 205, 8, 0, 252, 206, 8, 0, 61, 208, 8, 0, 124, 209, 8, 0, 189, 210, 8, 0, 252, 211, 8, 0, 61, 213, 8, 0, 124, 214, 8, 0, 189, 215, 8, 0, 252, 216, 8, 0, 61, 218, 8, 0, 124, 219, 8, 0, 189, 220, 8, 0, 252, 221, 8, 0, 61, 223, 8, 0, 124, 224, 8, 0, 189, 225, 8, 0, 252, 226, 8, 0, 61, 228, 8, 0, 124, 229, 8, 0, 189, 230, 8, 0, 252, 231, 8, 0, 61, 233, 8, 0, 124, 234, 8, 0, 189, 235, 8, 0, 252, 236, 8, 0, 61, 238, 8, 0, 124, 239, 8, 0, 189, 240, 8, 0, 252, 241, 8, 0, 61, 243, 8, 0, 124, 244, 8, 0, 189, 245, 8, 0, 252, 246, 8, 0, 61, 248, 8, 0, 124, 249, 8, 0, 189, 250, 8, 0, 252, 251, 8, 0, 61, 253, 8, 0, 124, 254, 8, 0, 189, 255, 8, 0, 252, 0, 9, 0, 61, 2, 9, 0, 124, 3, 9, 0, 189, 4, 9, 0, 252, 5, 9, 0, 61, 7, 9, 0, 124, 8, 9, 0, 189, 9, 9, 0, 252, 10, 9, 0, 61, 12, 9, 0, 124, 13, 9, 0, 189, 14, 9, 0, 252, 15, 9, 0, 61, 17, 9, 0, 124, 18, 9, 0, 189, 19, 9, 0, 252, 20, 9, 0, 61, 22, 9, 0, 124, 23, 9, 0, 189, 24, 9, 0, 252, 25, 9, 0, 61, 27, 9, 0, 124, 28, 9, 0, 189, 29, 9, 0, 252, 30, 9, 0, 61, 32, 9, 0, 124, 33, 9, 0, 189, 34, 9, 0, 252, 35, 9, 0, 61, 37, 9, 0, 124, 38, 9, 0, 189, 39, 9, 0, 252, 40, 9, 0, 61, 42, 9, 0, 124, 43, 9, 0, 189, 44, 9, 0, 252, 45, 9, 0, 61, 47, 9, 0, 124, 48, 9, 0, 189, 49, 9, 0, 252, 50, 9, 0, 61, 52, 9, 0, 124, 53, 9, 0, 189, 54, 9, 0, 252, 55, 9, 0, 61, 57, 9, 0, 124, 58, 9, 0, 189, 59, 9, 0, 252, 60, 9, 0, 61, 62, 9, 0, 124, 63, 9, 0, 189, 64, 9, 0, 252, 65, 9, 0, 61, 67, 9, 0, 124, 68, 9, 0, 189, 69, 9, 0, 252, 70, 9, 0, 61, 72, 9, 0, 124, 73, 9, 0, 189, 74, 9, 0, 252, 75, 9, 0, 61, 77, 9, 0, 124, 78, 9, 0, 189, 79, 9, 0, 252, 80, 9, 0, 61, 82, 9, 0, 124, 83, 9, 0, 189, 84, 9, 0, 252, 85, 9, 0, 61, 87, 9, 0, 124, 88, 9, 0, 189, 89, 9, 0, 252, 90, 9, 0, 61, 92, 9, 0, 124, 93, 9, 0, 189, 94, 9, 0, 252, 95, 9, 0, 61, 97, 9, 0, 124, 98, 9, 0, 189, 99, 9, 0, 252, 100, 9, 0, 61, 102, 9, 0, 124, 103, 9, 0, 189, 104, 9, 0, 252, 105, 9, 0, 61, 107, 9, 0, 124, 108, 9, 0, 189, 109, 9, 0, 252, 110, 9, 0, 61, 112, 9, 0, 124, 113, 9, 0, 189, 114, 9, 0, 252, 115, 9, 0, 61, 117, 9, 0, 124, 118, 9, 0, 189, 119, 9, 0, 252, 120, 9, 0, 61, 122, 9, 0, 124, 123, 9, 0, 189, 124, 9, 0, 252, 125, 9, 0, 61, 127, 9, 0, 124, 128, 9, 0, 189, 129, 9, 0, 252, 130, 9, 0, 61, 132, 9, 0, 124, 133, 9, 0, 189, 134, 9, 0, 252, 135, 9, 0, 61, 137, 9, 0, 124, 138, 9, 0, 189, 139, 9, 0, 252, 140, 9, 0, 61, 142, 9, 0, 124, 143, 9, 0, 189, 144, 9, 0, 252, 145, 9, 0, 61, 147, 9, 0, 124, 148, 9, 0, 189, 149, 9, 0, 252, 150, 9, 0, 61, 152, 9, 0, 124, 153, 9, 0, 189, 154, 9, 0, 252, 155, 9, 0, 61, 157, 9, 0, 124, 158, 9, 0, 189, 159, 9, 0, 252, 160, 9, 0, 61, 162, 9, 0, 124, 163, 9, 0, 189, 164, 9, 0, 252, 165, 9, 0, 61, 167, 9, 0, 124, 168, 9, 0, 189, 169, 9, 0, 252, 170, 9, 0, 61, 172, 9, 0, 124, 173, 9, 0, 189, 174, 9, 0, 252, 175, 9, 0, 61, 177, 9, 0, 124, 178, 9, 0, 189, 179, 9, 0, 252, 180, 9, 0, 61, 182, 9, 0, 124, 183, 9, 0, 189, 184, 9, 0, 252, 185, 9, 0, 61, 187, 9, 0, 124, 188, 9, 0, 189, 189, 9, 0, 252, 190, 9, 0, 61, 192, 9, 0, 124, 193, 9, 0, 189, 194, 9, 0, 252, 195, 9, 0, 61, 197, 9, 0, 124, 198, 9, 0, 189, 199, 9, 0, 252, 200, 9, 0, 61, 202, 9, 0, 124, 203, 9, 0, 189, 204, 9, 0, 252, 205, 9, 0, 61, 207, 9, 0, 124, 208, 9, 0, 189, 209, 9, 0, 252, 210, 9, 0, 61, 212, 9, 0, 124, 213, 9, 0, 189, 214, 9, 0, 252, 215, 9, 0, 61, 217, 9, 0, 124, 218, 9, 0, 189, 219, 9, 0, 252, 220, 9, 0, 61, 222, 9, 0, 124, 223, 9, 0, 189, 224, 9, 0, 252, 225, 9, 0, 61, 227, 9, 0, 124, 228, 9, 0, 189, 229, 9, 0, 252, 230, 9, 0, 61, 232, 9, 0, 124, 233, 9, 0, 189, 234, 9, 0, 252, 235, 9, 0, 61, 237, 9, 0, 124, 238, 9, 0, 189, 239, 9, 0, 252, 240, 9, 0, 61, 242, 9, 0, 124, 243, 9, 0, 189, 244, 9, 0, 252, 245, 9, 0, 61, 247, 9, 0, 124, 248, 9, 0, 189, 249, 9, 0, 252, 250, 9, 0, 61, 252, 9, 0, 124, 253, 9, 0, 189, 254, 9, 0, 252, 255, 9, 0, 61, 1, 10, 0, 124, 2, 10, 0, 189, 3, 10, 0, 252, 4, 10, 0, 61, 6, 10, 0, 124, 7, 10, 0, 189, 8, 10, 0, 252, 9, 10, 0, 61, 11, 10, 0, 124, 12, 10, 0, 189, 13, 10, 0, 252, 14, 10, 0, 61, 16, 10, 0, 124, 17, 10, 0, 189, 18, 10, 0, 252, 19, 10, 0, 61, 21, 10, 0, 124, 22, 10, 0, 189, 23, 10, 0, 252, 24, 10, 0, 61, 26, 10, 0, 124, 27, 10, 0, 189, 28, 10, 0, 252, 29, 10, 0, 61, 31, 10, 0, 124, 32, 10, 0, 189, 33, 10, 0, 252, 34, 10, 0, 61, 36, 10, 0, 124, 37, 10, 0, 189, 38, 10, 0, 252, 39, 10, 0, 61, 41, 10, 0, 124, 42, 10, 0, 189, 43, 10, 0, 252, 44, 10, 0, 61, 46, 10, 0, 124, 47, 10, 0, 189, 48, 10, 0, 252, 49, 10, 0, 61, 51, 10, 0, 124, 52, 10, 0, 189, 53, 10, 0, 252, 54, 10, 0, 61, 56, 10, 0, 124, 57, 10, 0, 189, 58, 10, 0, 252, 59, 10, 0, 61, 61, 10, 0, 124, 62, 10, 0, 189, 63, 10, 0, 252, 64, 10, 0, 61, 66, 10, 0, 124, 67, 10, 0, 189, 68, 10, 0, 252, 69, 10, 0, 61, 71, 10, 0, 124, 72, 10, 0, 189, 73, 10, 0, 252, 74, 10, 0, 61, 76, 10, 0, 124, 77, 10, 0, 189, 78, 10, 0, 252, 79, 10, 0, 61, 81, 10, 0, 124, 82, 10, 0, 189, 83, 10, 0, 252, 84, 10, 0, 61, 86, 10, 0, 124, 87, 10, 0, 189, 88, 10, 0, 252, 89, 10, 0, 61, 91, 10, 0, 124, 92, 10, 0, 189, 93, 10, 0, 252, 94, 10, 0, 61, 96, 10, 0, 124, 97, 10, 0, 189, 98, 10, 0, 252, 99, 10, 0, 61, 101, 10, 0, 124, 102, 10, 0, 189, 103, 10, 0, 252, 104, 10, 0, 61, 106, 10, 0, 124, 107, 10, 0, 189, 108, 10, 0, 252, 109, 10, 0, 61, 111, 10, 0, 124, 112, 10, 0, 189, 113, 10, 0, 252, 114, 10, 0, 61, 116, 10, 0, 124, 117, 10, 0, 189, 118, 10, 0, 252, 119, 10, 0, 61, 121, 10, 0, 124, 122, 10, 0, 189, 123, 10, 0, 252, 124, 10, 0, 61, 126, 10, 0, 124, 127, 10, 0, 189, 128, 10, 0, 252, 129, 10, 0, 61, 131, 10, 0, 124, 132, 10, 0, 189, 133, 10, 0, 252, 134, 10, 0, 61, 136, 10, 0, 124, 137, 10, 0, 189, 138, 10, 0, 252, 139, 10, 0, 61, 141, 10, 0, 124, 142, 10, 0, 189, 143, 10, 0, 252, 144, 10, 0, 61, 146, 10, 0, 124, 147, 10, 0, 189, 148, 10, 0, 252, 149, 10, 0, 61, 151, 10, 0, 124, 152, 10, 0, 189, 153, 10, 0, 252, 154, 10, 0, 61, 156, 10, 0, 124, 157, 10, 0, 189, 158, 10, 0, 252, 159, 10, 0, 61, 161, 10, 0, 124, 162, 10, 0, 189, 163, 10, 0, 252, 164, 10, 0, 61, 166, 10, 0, 124, 167, 10, 0, 189, 168, 10, 0, 252, 169, 10, 0, 61, 171, 10, 0, 124, 172, 10, 0, 189, 173, 10, 0, 252, 174, 10, 0, 61, 176, 10, 0, 124, 177, 10, 0, 189, 178, 10, 0, 252, 179, 10, 0, 61, 181, 10, 0, 124, 182, 10, 0, 189, 183, 10, 0, 252, 184, 10, 0, 61, 186, 10, 0, 124, 187, 10, 0, 189, 188, 10, 0, 252, 189, 10, 0, 61, 191, 10, 0, 124, 192, 10, 0, 189, 193, 10, 0, 252, 194, 10, 0, 61, 196, 10, 0, 124, 197, 10, 0, 189, 198, 10, 0, 252, 199, 10, 0, 61, 201, 10, 0, 124, 202, 10, 0, 189, 203, 10, 0, 252, 204, 10, 0, 61, 206, 10, 0, 124, 207, 10, 0, 189, 208, 10, 0, 252, 209, 10, 0, 61, 211, 10, 0, 124, 212, 10, 0, 189, 213, 10, 0, 252, 214, 10, 0, 61, 216, 10, 0, 124, 217, 10, 0, 189, 218, 10, 0, 252, 219, 10, 0, 61, 221, 10, 0, 124, 222, 10, 0, 189, 223, 10, 0, 252, 224, 10, 0, 61, 226, 10, 0, 124, 227, 10, 0, 189, 228, 10, 0, 252, 229, 10, 0, 61, 231, 10, 0, 124, 232, 10, 0, 189, 233, 10, 0, 252, 234, 10, 0, 61, 236, 10, 0, 124, 237, 10, 0, 189, 238, 10, 0, 252, 239, 10, 0, 61, 241, 10, 0, 124, 242, 10, 0, 189, 243, 10, 0, 252, 244, 10, 0, 61, 246, 10, 0, 124, 247, 10, 0, 189, 248, 10, 0, 252, 249, 10, 0, 61, 251, 10, 0, 124, 252, 10, 0, 189, 253, 10, 0, 252, 254, 10, 0, 61, 0, 11, 0, 124, 1, 11, 0, 189, 2, 11, 0, 252, 3, 11, 0, 61, 5, 11, 0, 124, 6, 11, 0, 189, 7, 11, 0, 252, 8, 11, 0, 61, 10, 11, 0, 124, 11, 11, 0, 189, 12, 11, 0, 252, 13, 11, 0, 61, 15, 11, 0, 124, 16, 11, 0, 189, 17, 11, 0, 252, 18, 11, 0, 61, 20, 11, 0, 124, 21, 11, 0, 189, 22, 11, 0, 252, 23, 11, 0, 61, 25, 11, 0, 124, 26, 11, 0, 189, 27, 11, 0, 252, 28, 11, 0, 61, 30, 11, 0, 124, 31, 11, 0, 189, 32, 11, 0, 252, 33, 11, 0, 61, 35, 11, 0, 124, 36, 11, 0, 189, 37, 11, 0, 252, 38, 11, 0, 61, 40, 11, 0, 124, 41, 11, 0, 189, 42, 11, 0, 252, 43, 11, 0, 61, 45, 11, 0, 124, 46, 11, 0, 189, 47, 11, 0, 252, 48, 11, 0, 61, 50, 11, 0, 124, 51, 11, 0, 189, 52, 11, 0, 252, 53, 11, 0, 61, 55, 11, 0, 124, 56, 11, 0, 189, 57, 11, 0, 252, 58, 11, 0, 61, 60, 11, 0, 124, 61, 11, 0, 189, 62, 11, 0, 252, 63, 11, 0, 61, 65, 11, 0, 124, 66, 11, 0, 189, 67, 11, 0, 252, 68, 11, 0, 61, 70, 11, 0, 124, 71, 11, 0, 189, 72, 11, 0, 252, 73, 11, 0, 61, 75, 11, 0, 124, 76, 11, 0, 189, 77, 11, 0, 252, 78, 11, 0, 61, 80, 11, 0, 124, 81, 11, 0, 189, 82, 11, 0, 252, 83, 11, 0, 61, 85, 11, 0, 124, 86, 11, 0, 189, 87, 11, 0, 252, 88, 11, 0, 61, 90, 11, 0, 124, 91, 11, 0, 189, 92, 11, 0, 252, 93, 11, 0, 61, 95, 11, 0, 124, 96, 11, 0, 189, 97, 11, 0, 252, 98, 11, 0, 61, 100, 11, 0, 124, 101, 11, 0, 189, 102, 11, 0, 252, 103, 11, 0, 61, 105, 11, 0, 124, 106, 11, 0, 189, 107, 11, 0, 252, 108, 11, 0, 61, 110, 11, 0, 124, 111, 11, 0, 189, 112, 11, 0, 252, 113, 11, 0, 61, 115, 11, 0, 124, 116, 11, 0, 189, 117, 11, 0, 252, 118, 11, 0, 61, 120, 11, 0, 124, 121, 11, 0, 189, 122, 11, 0, 252, 123, 11, 0, 61, 125, 11, 0, 124, 126, 11, 0, 189, 127, 11, 0, 252, 128, 11, 0, 61, 130, 11, 0, 124, 131, 11, 0, 189, 132, 11, 0, 252, 133, 11, 0, 61, 135, 11, 0, 124, 136, 11, 0, 189, 137, 11, 0, 252, 138, 11, 0, 61, 140, 11, 0, 124, 141, 11, 0, 189, 142, 11, 0, 252, 143, 11, 0, 61, 145, 11, 0, 124, 146, 11, 0, 189, 147, 11, 0, 252, 148, 11, 0, 61, 150, 11, 0, 124, 151, 11, 0, 189, 152, 11, 0, 252, 153, 11, 0, 61, 155, 11, 0, 124, 156, 11, 0, 189, 157, 11, 0, 252, 158, 11, 0, 61, 160, 11, 0, 124, 161, 11, 0, 189, 162, 11, 0, 252, 163, 11, 0, 61, 165, 11, 0, 124, 166, 11, 0, 189, 167, 11, 0, 252, 168, 11, 0, 61, 170, 11, 0, 124, 171, 11, 0, 189, 172, 11, 0, 252, 173, 11, 0, 61, 175, 11, 0, 124, 176, 11, 0, 189, 177, 11, 0, 252, 178, 11, 0, 61, 180, 11, 0, 124, 181, 11, 0, 189, 182, 11, 0, 252, 183, 11, 0, 61, 185, 11, 0, 124, 186, 11, 0, 189, 187, 11, 0, 252, 188, 11, 0, 61, 190, 11, 0, 124, 191, 11, 0, 189, 192, 11, 0, 252, 193, 11, 0, 61, 195, 11, 0, 124, 196, 11, 0, 189, 197, 11, 0, 252, 198, 11, 0, 61, 200, 11, 0, 124, 201, 11, 0, 189, 202, 11, 0, 252, 203, 11, 0, 61, 205, 11, 0, 124, 206, 11, 0, 189, 207, 11, 0, 252, 208, 11, 0, 61, 210, 11, 0, 124, 211, 11, 0, 189, 212, 11, 0, 252, 213, 11, 0, 61, 215, 11, 0, 124, 216, 11, 0, 189, 217, 11, 0, 252, 218, 11, 0, 61, 220, 11, 0, 124, 221, 11, 0, 189, 222, 11, 0, 252, 223, 11, 0, 61, 225, 11, 0, 124, 226, 11, 0, 189, 227, 11, 0, 252, 228, 11, 0, 61, 230, 11, 0, 124, 231, 11, 0, 189, 232, 11, 0, 252, 233, 11, 0, 61, 235, 11, 0, 124, 236, 11, 0, 189, 237, 11, 0, 252, 238, 11, 0, 61, 240, 11, 0, 124, 241, 11, 0, 189, 242, 11, 0, 252, 243, 11, 0, 61, 245, 11, 0, 124, 246, 11, 0, 189, 247, 11, 0, 252, 248, 11, 0, 61, 250, 11, 0, 124, 251, 11, 0, 189, 252, 11, 0, 252, 253, 11, 0, 61, 255, 11, 0, 124, 0, 12, 0, 189, 1, 12, 0, 252, 2, 12, 0, 61, 4, 12, 0, 124, 5, 12, 0, 189, 6, 12, 0, 252, 7, 12, 0, 61, 9, 12, 0, 124, 10, 12, 0, 189, 11, 12, 0, 252, 12, 12, 0, 61, 14, 12, 0, 124, 15, 12, 0, 189, 16, 12, 0, 252, 17, 12, 0, 61, 19, 12, 0, 124, 20, 12, 0, 189, 21, 12, 0, 252, 22, 12, 0, 61, 24, 12, 0, 124, 25, 12, 0, 189, 26, 12, 0, 252, 27, 12, 0, 61, 29, 12, 0, 124, 30, 12, 0, 189, 31, 12, 0, 252, 32, 12, 0, 61, 34, 12, 0, 124, 35, 12, 0, 189, 36, 12, 0, 252, 37, 12, 0, 61, 39, 12, 0, 124, 40, 12, 0, 189, 41, 12, 0, 252, 42, 12, 0, 61, 44, 12, 0, 124, 45, 12, 0, 189, 46, 12, 0, 252, 47, 12, 0, 61, 49, 12, 0, 124, 50, 12, 0, 1], [], [162, 16, 162, 16, 42, 36, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/recordings/logic_analyzer/test_stop.json b/tests/recordings/logic_analyzer/test_stop.json deleted file mode 100644 index 45b40c26..00000000 --- a/tests/recordings/logic_analyzer/test_stop.json +++ /dev/null @@ -1 +0,0 @@ -[[[10], [17], [11], [10], [0, 0], [16, 39], [10], [15], [196, 9], [5], [0], [10], [11], [10], [17], [10], [11]], [[], [1], [], [], [], [1], [], [], [], [], [1], [], [162, 16, 224, 17, 104, 37, 178, 55, 58, 75, 0, 0, 1], [], [1], [], [162, 16, 232, 17, 112, 37, 178, 55, 58, 75, 0, 0, 1]]] \ No newline at end of file diff --git a/tests/test_achan.py b/tests/test_achan.py deleted file mode 100644 index f16350d9..00000000 --- a/tests/test_achan.py +++ /dev/null @@ -1,81 +0,0 @@ -import unittest -from unittest.mock import patch - -from PSL import achan - - -class TestAnalogInput(unittest.TestCase): - def setUp(self): - self.Handler_patcher = patch("PSL.achan.packet_handler.Handler") - self.mock_device = self.Handler_patcher.start() - - def tearDown(self): - self.Handler_patcher.stop() - - def test_gain(self): - ch1 = achan.AnalogInput("CH1", self.mock_device) - example_gain = 8 - ch1.gain = example_gain - self.assertEqual(ch1.gain, example_gain) - gain_idx = achan.GAIN_VALUES.index(example_gain) - self.mock_device.send_byte.assert_called_with(gain_idx) - - def test_gain_unsupported_value(self): - ch2 = achan.AnalogInput("CH2", self.mock_device) - bad_gain = 3 - with self.assertRaises(ValueError): - ch2.gain = bad_gain - - def test_gain_set_unsupported_channel(self): - ch3 = achan.AnalogInput("CH3", self.mock_device) - example_gain = 10 - with self.assertRaises(TypeError): - ch3.gain = example_gain - - def test_gain_get_unsupported_channel(self): - ch3 = achan.AnalogInput("CH3", self.mock_device) - self.assertIsNone(ch3.gain) - self.assertEqual(ch3._gain, 1) - - def test_resolution(self): - mic = achan.AnalogInput("MIC", self.mock_device) - resolution_12bit = 12 - mic.resolution = resolution_12bit - self.assertEqual(mic.resolution, resolution_12bit) - self.assertEqual(mic._resolution, 2 ** resolution_12bit - 1) - - def test_resolution_unsupported_value(self): - cap = achan.AnalogInput("CAP", self.mock_device) - bad_resolution = 8 - with self.assertRaises(ValueError): - cap.resolution = bad_resolution - - def test_scale(self): - ch1 = achan.AnalogInput("CH1", self.mock_device) - example_gain = 16 - ch1.gain = example_gain - resolution_10bit = 10 - ch1.resolution = resolution_10bit - raw_value = 588 - corresponding_voltage = -0.154233870967742 - self.assertAlmostEqual(ch1.scale(raw_value), corresponding_voltage) - - def test_unscale(self): - ch1 = achan.AnalogInput("CH1", self.mock_device) - example_gain = 16 - ch1.gain = example_gain - resolution_10bit = 10 - ch1.resolution = resolution_10bit - raw_value = 588 - corresponding_voltage = -0.154233870967742 - self.assertEqual(ch1.unscale(corresponding_voltage), raw_value) - - def test_unscale_clip(self): - ch1 = achan.AnalogInput("CH1", self.mock_device) - example_gain = 16 - ch1.gain = example_gain - resolution_10bit = 10 - ch1.resolution = resolution_10bit - raw_max = 2 ** resolution_10bit - 1 # 1023 - voltage_outside_range = -3.001008064516129 # raw = 2000 - self.assertEqual(ch1.unscale(voltage_outside_range), raw_max) diff --git a/tests/test_analytics.py b/tests/test_analytics.py deleted file mode 100644 index b5ce380e..00000000 --- a/tests/test_analytics.py +++ /dev/null @@ -1,50 +0,0 @@ -import unittest - -from PSL import analyticsClass - - -class TestAnalytics(unittest.TestCase): - def test_frexp10(self): - input_value = 43.0982 - expected_result = (4.30982, 1) - self.assertAlmostEqual(analyticsClass.frexp10(input_value), expected_result) - - def test_apply_si_prefix_rounding(self): - input_value = { - "value": 7545.230053, - "unit": "J", - } - expected_result = "7.55 kJ" - self.assertEqual(analyticsClass.apply_si_prefix(**input_value), expected_result) - - def test_apply_si_prefix_high_precision(self): - input_value = { - "value": -0.000002000008, - "unit": "A", - "precision": 6, - } - expected_result = "-2.000008 µA" - self.assertEqual(analyticsClass.apply_si_prefix(**input_value), expected_result) - - def test_apply_si_prefix_low_precision(self): - input_value = { - "value": -1, - "unit": "V", - "precision": 0, - } - expected_result = "-1 V" - self.assertEqual(analyticsClass.apply_si_prefix(**input_value), expected_result) - - def test_apply_si_prefix_too_big(self): - input_value = { - "value": 1e27, - "unit": "V", - } - self.assertRaises(ValueError, analyticsClass.apply_si_prefix, **input_value) - - def test_apply_si_prefix_too_small(self): - input_value = { - "value": 1e-25, - "unit": "V", - } - self.assertRaises(ValueError, analyticsClass.apply_si_prefix, **input_value) diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 00000000..5c64144d --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,236 @@ +"""Tests for PSL.cli. + +Before running the tests, connect: + SQ1 -> LA1 + SQ2 -> LA2 + SQ3 -> LA3 + SQ4 -> LA4 + SI1 -> CH1 + SI2 -> CH2 + SI1 -> CH3 +""" + +import csv +import json + +import numpy as np +import pytest + +import pslab.protocol as CP +from pslab import cli +from pslab.instrument.analog import AnalogOutput +from pslab.instrument.waveform_generator import WaveformGenerator + +LA_CHANNELS = 4 +EVENTS = 2450 +LA_DURATION = 1.5 + +SCOPE_CHANNELS = 4 +SAMPLES = CP.MAX_SAMPLES // SCOPE_CHANNELS +SCOPE_DURATION = 0.5 + + +@pytest.fixture +def la(mocker): + mock = mocker.patch("pslab.cli.LogicAnalyzer") + mock().fetch_data.return_value = [np.arange(2500)] * LA_CHANNELS + return mock + + +@pytest.fixture +def scope(mocker): + mock = mocker.patch("pslab.cli.Oscilloscope") + mock()._lookup_mininum_timegap.return_value = 0.5 + mock().capture.return_value = [np.zeros(SAMPLES)] * (SCOPE_CHANNELS + 1) + mock()._channel_one_map = "CH1" + mock()._CH234 = ["CH2", "CH3", "MIC"] + return mock + + +def logic_analyzer(device, channels, duration): + headers = ["LA1", "LA2", "LA3", "LA4"][:channels] + timestamps = [np.arange(0, duration * 1e6, (duration * 1e6) / EVENTS)] * channels + return headers, timestamps + + +def oscilloscope(device, channels, duration): + headers = ["Timestamp", "CH1", "CH2", "CH3", "MIC"][: 1 + channels] + timestamp = np.arange(0, duration * 1e6, (duration * 1e6) / SAMPLES) + data = [np.random.random_sample(SAMPLES)] * channels + return headers, [timestamp] + data + + +@pytest.fixture(name="collect") +def setup_collect(mocker, monkeypatch): + """Return a ArgumentParser instance with all arguments added.""" + mocker.patch("pslab.cli.SerialHandler") + INSTRUMENTS = { + "logic_analyzer": logic_analyzer, + "oscilloscope": oscilloscope, + } + monkeypatch.setattr(cli, "INSTRUMENTS", INSTRUMENTS) + + +@pytest.fixture(name="wave") +def setup_wave(mocker): + mocker.patch("pslab.cli.SerialHandler") + + +def test_logic_analyzer(la): + channels, timestamps = cli.logic_analyzer(la, LA_CHANNELS, LA_DURATION) + assert len(channels) == LA_CHANNELS + for timestamp in timestamps: + assert len(timestamp) > EVENTS + + +def test_oscilloscope(scope): + headers, values = cli.oscilloscope(scope, SCOPE_CHANNELS, SCOPE_DURATION) + assert len(headers) == 1 + SCOPE_CHANNELS + for value in values: + assert len(value) > SAMPLES + + +def test_collect_csv_stdout(collect, capsys): + cli.cmdline(["collect", "logic_analyzer", "--channels", str(LA_CHANNELS)]) + output = list(csv.reader(capsys.readouterr().out.splitlines())) + assert len(output[0]) == LA_CHANNELS + assert len(output) == 1 + EVENTS + + cli.cmdline(["collect", "oscilloscope", "--channels", str(SCOPE_CHANNELS)]) + output = list(csv.reader(capsys.readouterr().out.splitlines())) + assert len(output[0]) == 1 + SCOPE_CHANNELS + assert len(output) == 1 + SAMPLES + + +def test_collect_csv_file(collect, tmp_path): + la_temp_csv = str(tmp_path / "logic_analyzer.csv") + cli.cmdline( + [ + "collect", + "logic_analyzer", + "--channels", + str(LA_CHANNELS), + "--output", + la_temp_csv, + ] + ) + with open(la_temp_csv) as csv_file: + output = list(csv.reader(csv_file.read().splitlines())) + assert len(output[0]) == LA_CHANNELS + assert len(output) == 1 + EVENTS + + scope_temp_csv = str(tmp_path / "oscilloscope.csv") + cli.cmdline( + [ + "collect", + "oscilloscope", + "--channels", + str(SCOPE_CHANNELS), + "--output", + scope_temp_csv, + ] + ) + with open(scope_temp_csv) as csv_file: + output = list(csv.reader(csv_file.read().splitlines())) + assert len(output[0]) == 1 + SCOPE_CHANNELS + assert len(output) == 1 + SAMPLES + + +def test_collect_json_stdout(collect, capsys): + cli.cmdline(["collect", "logic_analyzer", "--channels", str(LA_CHANNELS), "--json"]) + output = json.loads(capsys.readouterr().out) + assert len(output) == LA_CHANNELS + assert len(list(output.values())[0]) == EVENTS + + cli.cmdline( + ["collect", "oscilloscope", "--channels", str(SCOPE_CHANNELS), "--json"] + ) + output = json.loads(capsys.readouterr().out) + assert len(output) == 1 + SCOPE_CHANNELS + assert len(list(output.values())[0]) == SAMPLES + + +def test_collect_json_file(collect, tmp_path): + la_tmp_json = str(tmp_path / "logic_analyzer.json") + cli.cmdline( + [ + "collect", + "logic_analyzer", + "--channels", + str(LA_CHANNELS), + "--output", + la_tmp_json, + "--json", + ] + ) + with open(la_tmp_json) as json_file: + output = json.load(json_file) + assert len(output) == LA_CHANNELS + assert len(list(output.values())[0]) == EVENTS + + scope_tmp_json = str(tmp_path / "oscilloscope.json") + cli.cmdline( + [ + "collect", + "oscilloscope", + "--channels", + str(SCOPE_CHANNELS), + "--output", + scope_tmp_json, + "--json", + ] + ) + with open(scope_tmp_json) as json_file: + output = json.load(json_file) + assert len(output) == 1 + SCOPE_CHANNELS + assert len(list(output.values())[0]) == SAMPLES + + +def test_wave_load_table(wave, mocker): + wavegen = WaveformGenerator(mocker.Mock()) + wavegen.load_function("SI1", "tria") + + def tria(x): + return AnalogOutput.RANGE[1] * (abs(x % 4 - 2) - 1) + + span = [-1, 3] + x = np.arange(span[0], span[1], (span[1] - span[0]) / 512) + table = json.dumps(tria(x).tolist()) + cli.cmdline(["wave", "load", "SI2", "--table", table]) + assert AnalogOutput("SI1").waveform_table == AnalogOutput("SI2").waveform_table + + +def test_wave_load_table_expand(wave): + table1 = json.dumps([0, 1]) + cli.cmdline(["wave", "load", "SI1", "--table", table1]) + table2 = json.dumps(([0] * (512 // 2)) + ([1] * (512 // 2))) + cli.cmdline(["wave", "load", "SI2", "--table", table2]) + assert AnalogOutput("SI1").waveform_table == AnalogOutput("SI2").waveform_table + + +def test_wave_load_tablefile(wave, mocker, tmp_path): + wavegen = WaveformGenerator(mocker.Mock()) + wavegen.load_function("SI1", "tria") + + def tria(x): + return AnalogOutput.RANGE[1] * (abs(x % 4 - 2) - 1) + + span = [-1, 3] + x = np.arange(span[0], span[1], (span[1] - span[0]) / 512) + table_tmp_json = str(tmp_path / "table.json") + with open(table_tmp_json, "w") as json_file: + json.dump(tria(x).tolist(), json_file) + cli.cmdline(["wave", "load", "SI2", "--table-file", table_tmp_json]) + assert AnalogOutput("SI1").waveform_table == AnalogOutput("SI2").waveform_table + + +def test_wave_load_tablefile_expand(wave, tmp_path): + table1_tmp_json = str(tmp_path / "table1.json") + with open(table1_tmp_json, "w") as json_file: + json.dump([0, 1], json_file) + cli.cmdline(["wave", "load", "SI1", "--table-file", table1_tmp_json]) + table2_tmp_json = str(tmp_path / "table2.json") + with open(table2_tmp_json, "w") as json_file: + json.dump(([0] * (512 // 2)) + ([1] * (512 // 2)), json_file) + cli.cmdline(["wave", "load", "SI2", "--table-file", table2_tmp_json]) + assert AnalogOutput("SI1").waveform_table == AnalogOutput("SI2").waveform_table diff --git a/tests/test_i2c.py b/tests/test_i2c.py new file mode 100644 index 00000000..9bb899f2 --- /dev/null +++ b/tests/test_i2c.py @@ -0,0 +1,228 @@ +"""Tests for pslab.bus.i2c. + +The PSLab's logic analyzer is used to verify the function of the I2C bus. Before running +the tests, connect: + SCL->LA1 + SDA->LA2 +""" + +import pytest + +from pslab.bus.i2c import I2CMaster, I2CSlave +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.connection import SerialHandler + +ADDRESS = 0x52 # Not a real device. +REGISTER_ADDRESS = 0x06 +WRITE_DATA = 0x0 +SCL = "LA1" +SDA = "LA2" +MICROSECONDS = 1e-6 +RELTOL = 0.05 +# Number of expected logic level changes. +SCL_START = 1 +SCL_RESTART = 2 +SCL_READ = 18 +SCL_WRITE = 18 +SCL_STOP = 1 +SDA_START = 1 +SDA_DEVICE_ADDRESS = 7 +SDA_REGISTER_ADDRESS = 4 +SDA_RESTART = 1 +SDA_READ = 0 +SDA_NACK = 0 +SDA_ACK = 2 +SDA_WRITE = 2 + + +@pytest.fixture +def master(handler: SerialHandler) -> I2CMaster: + return I2CMaster(device=handler) + + +@pytest.fixture +def slave(handler: SerialHandler) -> I2CSlave: + return I2CSlave(ADDRESS, device=handler) + + +@pytest.fixture +def la(handler: SerialHandler) -> LogicAnalyzer: + return LogicAnalyzer(handler) + + +def test_configure(la: LogicAnalyzer, master: I2CMaster, slave: I2CSlave): + frequency = 1.25e5 + master.configure(frequency) + la.capture(1, block=False) + slave._start(ADDRESS, 1) + slave._stop() + la.stop() + (scl,) = la.fetch_data() + write_start = scl[1] # First event is start bit. + write_stop = scl[-2] # Final event is stop bit. + start_to_stop = 8.5 # 9 periods, but initial and final states are the same. + period = (write_stop - write_start) / start_to_stop + assert (period * MICROSECONDS) ** -1 == pytest.approx(frequency, rel=RELTOL) + + +def test_scan(master: I2CMaster): + mcp4728_address = 0x60 + assert mcp4728_address in master.scan() + + +def test_status(master: I2CMaster): + master.configure(1.25e5) + # No status bits should be set on a newly configured bus. + assert not master._status + + +def test_start_slave(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave._start(ADDRESS, 1) + la.stop() + slave._stop() + init = la.get_initial_states() + scl, sda = la.fetch_data() + + assert all([init[c] for c in [SCL, SDA]]) # Both start HIGH. + assert sda[0] < scl[0] # Start bit: SDA 1->0 while SCL is 1. + + +def test_stop_slave(la: LogicAnalyzer, slave: I2CSlave): + slave._start(ADDRESS, 1) + la.capture(2, block=False) + slave._stop() + la.stop() + init = la.get_initial_states() + scl, sda = la.fetch_data() + + assert not init[SCL] and init[SDA] # SDA starts HIGH, SCL starts LOW. + assert sda[0] < scl[0] < sda[1] # Stop bit: SDA 0->1 while SCL is 1. + + +def test_ping_slave(slave: I2CSlave): + assert not slave.ping() + + +def test_read(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.read(1, REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == ( + SCL_START + SCL_WRITE * 2 + SCL_RESTART + SCL_WRITE + SCL_READ + SCL_STOP + ) + assert len(sda) == ( + SDA_START + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_REGISTER_ADDRESS + SDA_NACK) + + SDA_RESTART + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_READ + SDA_ACK) + ) + + +def test_read_byte(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.read_byte(REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == ( + SCL_START + SCL_WRITE * 2 + SCL_RESTART + SCL_WRITE + SCL_READ + SCL_STOP + ) + assert len(sda) == ( + SDA_START + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_REGISTER_ADDRESS + SDA_NACK) + + SDA_RESTART + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_READ + SDA_ACK) + ) + + +def test_read_int(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.read_int(REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == ( + SCL_START + SCL_WRITE * 2 + SCL_RESTART + SCL_WRITE + SCL_READ * 2 + SCL_STOP + ) + assert len(sda) == ( + SDA_START + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_REGISTER_ADDRESS + SDA_NACK) + + SDA_RESTART + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_READ + SDA_ACK) * 2 + ) + + +def test_read_long(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.read_long(REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == ( + SCL_START + SCL_WRITE * 2 + SCL_RESTART + SCL_WRITE + SCL_READ * 4 + SCL_STOP + ) + assert len(sda) == ( + SDA_START + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_REGISTER_ADDRESS + SDA_NACK) + + SDA_RESTART + + (SDA_DEVICE_ADDRESS + SDA_NACK) + + (SDA_READ + SDA_ACK) * 4 + ) + + +def test_write(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.write(bytearray(b"\x00"), REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == (SCL_START + SCL_WRITE * 3 + SCL_STOP) + assert len(sda) == ( + SDA_START + SDA_DEVICE_ADDRESS + SDA_REGISTER_ADDRESS + SDA_WRITE + SDA_ACK + ) + + +def test_write_byte(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.write_byte(WRITE_DATA, REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == (SCL_START + SCL_WRITE * 3 + SCL_STOP) + assert len(sda) == ( + SDA_START + SDA_DEVICE_ADDRESS + SDA_REGISTER_ADDRESS + SDA_WRITE + SDA_ACK + ) + + +def test_write_int(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.write_int(WRITE_DATA, REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == (SCL_START + SCL_WRITE * 4 + SCL_STOP) + assert len(sda) == ( + SDA_START + SDA_DEVICE_ADDRESS + SDA_REGISTER_ADDRESS + SDA_WRITE * 2 + SDA_ACK + ) + + +def test_write_long(la: LogicAnalyzer, slave: I2CSlave): + la.capture(2, block=False) + slave.write_long(WRITE_DATA, REGISTER_ADDRESS) + la.stop() + scl, sda = la.fetch_data() + + assert len(scl) == (SCL_START + SCL_WRITE * 6 + SCL_STOP) + assert len(sda) == ( + SDA_START + SDA_DEVICE_ADDRESS + SDA_REGISTER_ADDRESS + SDA_WRITE * 4 + SDA_ACK + ) diff --git a/tests/test_logic_analyzer.py b/tests/test_logic_analyzer.py index 6535640e..550a929b 100644 --- a/tests/test_logic_analyzer.py +++ b/tests/test_logic_analyzer.py @@ -1,31 +1,23 @@ -"""These tests can be run as either unit tests or integration tests. - -By default, they are run as unit tests. When running as unit tests, recorded serial -traffic from passing integration tests are played back during the test. - -By calling pytest with the --integration flag, the tests will instead be run as -integration tests. In this test mode, the PSLab's PWM output is used to generate a -signal which is analyzed by the logic analyzer. Before running the integration tests, -connect SQ1->ID1->ID2->ID3->ID4. - -By calling pytest with the --record flag, the serial traffic generated by the -integration tests will be recorded to JSON files, which are played back during unit -testing. The --record flag implies --integration. +"""Tests for pslab.instrument.logic_analyzer. + +When integration testing, the PSLab's PWM output is used to generate a signal +which is analyzed by the logic analyzer. Before running the integration tests, +connect: + SQ1 -> LA1 + SQ2 -> LA2 + SQ3 -> LA3 + SQ4 -> LA4 """ -import json -import os.path import time import numpy as np import pytest -import PSL.commands_proto as CP -from PSL import logic_analyzer -from PSL import packet_handler -from PSL import sciencelab +import pslab.protocol as CP +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.waveform_generator import PWMGenerator -LOGDIR = os.path.join("tests", "recordings", "logic_analyzer") EVENTS = 2495 FREQUENCY = 1e5 @@ -33,12 +25,19 @@ LOW_FREQUENCY = 100 LOWER_FREQUENCY = 10 MICROSECONDS = 1e6 -ONE_CLOCK_CYCLE = logic_analyzer.CLOCK_RATE ** -1 * MICROSECONDS +TWO_CLOCK_CYCLES = 2 * CP.CLOCK_RATE**-1 * MICROSECONDS + + +@pytest.fixture +def la(handler, request): + """Turn on PWM output and return a LogicAnalyzer instance.""" + pwm = PWMGenerator(handler) + enable_pwm(pwm, request.node.name) + return LogicAnalyzer(handler) -def get_frequency(test_name): - """Return the PWM frequency for integration tests. - """ +def enable_pwm(pwm: PWMGenerator, test_name: str): + """Enable PWM output for integration testing.""" low_frequency_tests = ( "test_capture_four_low_frequency", "test_capture_four_lower_frequency", @@ -47,303 +46,237 @@ def get_frequency(test_name): "test_get_states", ) if test_name in low_frequency_tests: - return LOW_FREQUENCY + frequency = LOW_FREQUENCY elif test_name == "test_capture_four_too_low_frequency": - return LOWER_FREQUENCY + frequency = LOWER_FREQUENCY else: - return FREQUENCY + frequency = FREQUENCY + pwm.generate( + ["SQ1", "SQ2", "SQ3", "SQ4"], + frequency, + DUTY_CYCLE, + 0, + ) -@pytest.fixture -def scaffold(monkeypatch, request, integration, record): - """Handle setup and teardown of tests. - """ - if record: - integration = True - - test_name = request.node.name - handler = get_handler(monkeypatch, test_name, integration) - - if record: - handler._logging = True - - yield logic_analyzer.LogicAnalyzer(handler) - - if record: - log = handler._log.split(b"STOP")[:-1] - record_traffic(test_name, log) - - -def get_handler(monkeypatch, test_name: str, integration: bool = True): - """Return a Handler instance. - - When running unit tests, the Handler is a MockHandler. When running integration - tests, this method also sets up the PWM signals before returning the Handler. - """ - if integration: - psl = sciencelab.connect() - psl.sqrPWM( - freq=get_frequency(test_name), - h0=DUTY_CYCLE, - p1=0, - h1=DUTY_CYCLE, - p2=0, - h2=DUTY_CYCLE, - p3=0, - h3=DUTY_CYCLE, - ) - return psl.H - else: - logfile = os.path.join(LOGDIR, test_name + ".json") - tx, rx = json.load(open(logfile, "r")) - traffic = ((bytes(t), bytes(r)) for t, r in zip(tx, rx)) - monkeypatch.setattr(packet_handler, "RECORDED_TRAFFIC", traffic) - return packet_handler.MockHandler() - - -def record_traffic(test_name: str, log: list): - """Record serial traffic to a JSON file. - - The file name is the test name + .json. - """ - tx = [] - rx = [] - - for b in log: - direction = b[:2] - data = b[2:] - if direction == b"TX": - tx.append(list(data)) - rx.append([]) - elif direction == b"RX": - rx[-1] += list(data) - else: - raise ValueError("Unknown direction: {direction}") - - logfile = os.path.join(LOGDIR, test_name + ".json") - print([tx, rx]) - json.dump([tx, rx], open(logfile, "w")) - - -def test_capture_one_channel(scaffold): - t = scaffold.capture(1, EVENTS) + +def test_capture_one_channel(la): + t = la.capture(1, EVENTS) assert len(t[0]) == EVENTS -def test_capture_two_channels(scaffold): - t1, t2 = scaffold.capture(2, EVENTS) +def test_capture_two_channels(la): + t1, t2 = la.capture(2, EVENTS) assert len(t1) == len(t2) == EVENTS -def test_capture_four_channels(scaffold): - t1, t2, t3, t4 = scaffold.capture(4, EVENTS) +def test_capture_four_channels(la): + t1, t2, t3, t4 = la.capture(4, EVENTS) assert len(t1) == len(t2) == len(t3) == len(t4) == EVENTS -def test_capture_four_low_frequency(scaffold): - e2e_time = (LOW_FREQUENCY ** -1) / 2 - t1 = scaffold.capture(4, 10, e2e_time=e2e_time)[0] +def test_capture_four_low_frequency(la): + e2e_time = (LOW_FREQUENCY**-1) / 2 + t1 = la.capture(4, 10, e2e_time=e2e_time)[0] # When capturing every edge, the accuracy seems to depend on # the PWM prescaler as well as the logic analyzer prescaler. - pwm_abstol = ONE_CLOCK_CYCLE * logic_analyzer.PRESCALERS[2] + pwm_abstol = TWO_CLOCK_CYCLES * LogicAnalyzer._PRESCALERS[2] assert np.array(9 * [e2e_time * MICROSECONDS]) == pytest.approx( - np.diff(t1), abs=ONE_CLOCK_CYCLE * logic_analyzer.PRESCALERS[1] + pwm_abstol + np.diff(t1), abs=TWO_CLOCK_CYCLES * LogicAnalyzer._PRESCALERS[1] + pwm_abstol ) -def test_capture_four_lower_frequency(scaffold): - e2e_time = LOW_FREQUENCY ** -1 - t1 = scaffold.capture(4, 10, modes=4 * ["rising"], e2e_time=e2e_time)[0] +def test_capture_four_lower_frequency(la): + e2e_time = LOW_FREQUENCY**-1 + t1 = la.capture(4, 10, modes=4 * ["rising"], e2e_time=e2e_time)[0] assert np.array(9 * [e2e_time * MICROSECONDS]) == pytest.approx( - np.diff(t1), abs=ONE_CLOCK_CYCLE * logic_analyzer.PRESCALERS[2] + np.diff(t1), abs=TWO_CLOCK_CYCLES * LogicAnalyzer._PRESCALERS[2] ) -def test_capture_four_lowest_frequency(scaffold): - e2e_time = (LOW_FREQUENCY ** -1) * 16 - t1 = scaffold.capture( - 4, 10, modes=4 * ["sixteen rising"], e2e_time=e2e_time, timeout=2 - )[0] +def test_capture_four_lowest_frequency(la): + e2e_time = (LOW_FREQUENCY**-1) * 16 + t1 = la.capture(4, 10, modes=4 * ["sixteen rising"], e2e_time=e2e_time, timeout=2)[ + 0 + ] assert np.array(9 * [e2e_time * MICROSECONDS]) == pytest.approx( - np.diff(t1), abs=ONE_CLOCK_CYCLE * logic_analyzer.PRESCALERS[3] + np.diff(t1), abs=TWO_CLOCK_CYCLES * LogicAnalyzer._PRESCALERS[3] ) -def test_capture_four_too_low_frequency(scaffold): - e2e_time = (LOWER_FREQUENCY ** -1) * 4 +def test_capture_four_too_low_frequency(la): + e2e_time = (LOWER_FREQUENCY**-1) * 4 with pytest.raises(ValueError): - scaffold.capture(4, 10, modes=4 * ["four rising"], e2e_time=e2e_time, timeout=5) + la.capture(4, 10, modes=4 * ["four rising"], e2e_time=e2e_time, timeout=5) -def test_capture_nonblocking(scaffold): - scaffold.capture(1, EVENTS, block=False) - time.sleep(EVENTS * FREQUENCY ** -1) - t = scaffold.fetch_data() +def test_capture_nonblocking(la): + la.capture(1, EVENTS, block=False) + time.sleep(EVENTS * FREQUENCY**-1) + t = la.fetch_data() assert len(t[0]) >= EVENTS -def test_capture_rising_edges(scaffold): +def test_capture_rising_edges(la): events = 100 - t1, t2 = scaffold.capture(2, events, modes=["any", "rising"]) - expected = FREQUENCY ** -1 * MICROSECONDS / 2 + t1, t2 = la.capture(2, events, modes=["any", "rising"]) + expected = FREQUENCY**-1 * MICROSECONDS / 2 result = t2 - t1 - (t2 - t1)[0] assert np.arange(0, expected * events, expected) == pytest.approx( - result, abs=ONE_CLOCK_CYCLE + result, abs=TWO_CLOCK_CYCLES ) -def test_capture_four_rising_edges(scaffold): +def test_capture_four_rising_edges(la): events = 100 - t1, t2 = scaffold.capture(2, events, modes=["rising", "four rising"]) - expected = FREQUENCY ** -1 * MICROSECONDS * 3 + t1, t2 = la.capture(2, events, modes=["rising", "four rising"]) + expected = FREQUENCY**-1 * MICROSECONDS * 3 result = t2 - t1 - (t2 - t1)[0] assert np.arange(0, expected * events, expected) == pytest.approx( - result, abs=ONE_CLOCK_CYCLE + result, abs=TWO_CLOCK_CYCLES ) -def test_capture_sixteen_rising_edges(scaffold): +def test_capture_sixteen_rising_edges(la): events = 100 - t1, t2 = scaffold.capture(2, events, modes=["four rising", "sixteen rising"]) - expected = FREQUENCY ** -1 * MICROSECONDS * 12 + t1, t2 = la.capture(2, events, modes=["four rising", "sixteen rising"]) + expected = FREQUENCY**-1 * MICROSECONDS * 12 result = t2 - t1 - (t2 - t1)[0] assert np.arange(0, expected * events, expected) == pytest.approx( - result, abs=ONE_CLOCK_CYCLE + result, abs=TWO_CLOCK_CYCLES ) -def test_capture_too_many_events(scaffold): +def test_capture_too_many_events(la): with pytest.raises(ValueError): - scaffold.capture(1, CP.MAX_SAMPLES // 4 + 1) + la.capture(1, CP.MAX_SAMPLES // 4 + 1) -def test_capture_too_many_channels(scaffold): +def test_capture_too_many_channels(la): with pytest.raises(ValueError): - scaffold.capture(5) + la.capture(5) -def test_measure_frequency(scaffold): - frequency = scaffold.measure_frequency("ID1", timeout=0.1) +def test_measure_frequency(la): + frequency = la.measure_frequency("LA1", timeout=0.1) assert FREQUENCY == pytest.approx(frequency) -def test_measure_frequency_firmware(scaffold): - frequency = scaffold.measure_frequency( - "ID2", timeout=0.1, simultaneous_oscilloscope=True - ) +def test_measure_frequency_firmware(la): + frequency = la.measure_frequency("LA2", timeout=0.1, simultaneous_oscilloscope=True) assert FREQUENCY == pytest.approx(frequency) -def test_measure_interval(scaffold): - scaffold.configure_trigger("ID1", "falling") - interval = scaffold.measure_interval( - channels=["ID1", "ID2"], modes=["rising", "falling"], timeout=0.1 +def test_measure_interval(la): + la.configure_trigger("LA1", "falling") + interval = la.measure_interval( + channels=["LA1", "LA2"], modes=["rising", "falling"], timeout=0.1 ) - expected_interval = FREQUENCY ** -1 * MICROSECONDS * 0.5 - assert expected_interval == pytest.approx(interval, abs=ONE_CLOCK_CYCLE) + expected_interval = FREQUENCY**-1 * MICROSECONDS * 0.5 + assert expected_interval == pytest.approx(interval, abs=TWO_CLOCK_CYCLES) -def test_measure_interval_same_channel(scaffold): - scaffold.configure_trigger("ID1", "falling") - interval = scaffold.measure_interval( - channels=["ID1", "ID1"], modes=["rising", "falling"], timeout=0.1 +def test_measure_interval_same_channel(la): + la.configure_trigger("LA1", "falling") + interval = la.measure_interval( + channels=["LA1", "LA1"], modes=["rising", "falling"], timeout=0.1 ) - expected_interval = FREQUENCY ** -1 * DUTY_CYCLE * MICROSECONDS - assert expected_interval == pytest.approx(interval, abs=ONE_CLOCK_CYCLE) + expected_interval = FREQUENCY**-1 * DUTY_CYCLE * MICROSECONDS + assert expected_interval == pytest.approx(interval, abs=TWO_CLOCK_CYCLES) -def test_measure_interval_same_channel_any(scaffold): - scaffold.configure_trigger("ID1", "falling") - interval = scaffold.measure_interval( - channels=["ID1", "ID1"], modes=["any", "any"], timeout=0.1 +def test_measure_interval_same_channel_any(la): + la.configure_trigger("LA1", "falling") + interval = la.measure_interval( + channels=["LA1", "LA1"], modes=["any", "any"], timeout=0.1 ) - expected_interval = FREQUENCY ** -1 * DUTY_CYCLE * MICROSECONDS - assert expected_interval == pytest.approx(interval, abs=ONE_CLOCK_CYCLE) + expected_interval = FREQUENCY**-1 * DUTY_CYCLE * MICROSECONDS + assert expected_interval == pytest.approx(interval, abs=TWO_CLOCK_CYCLES) -def test_measure_interval_same_channel_four_rising(scaffold): - scaffold.configure_trigger("ID1", "falling") - interval = scaffold.measure_interval( - channels=["ID1", "ID1"], modes=["rising", "four rising"], timeout=0.1 +def test_measure_interval_same_channel_four_rising(la): + la.configure_trigger("LA1", "falling") + interval = la.measure_interval( + channels=["LA1", "LA1"], modes=["rising", "four rising"], timeout=0.1 ) - expected_interval = FREQUENCY ** -1 * 3 * MICROSECONDS - assert expected_interval == pytest.approx(interval, abs=ONE_CLOCK_CYCLE) + expected_interval = FREQUENCY**-1 * 3 * MICROSECONDS + assert expected_interval == pytest.approx(interval, abs=TWO_CLOCK_CYCLES) -def test_measure_interval_same_channel_sixteen_rising(scaffold): - scaffold.configure_trigger("ID1", "falling") - interval = scaffold.measure_interval( - channels=["ID1", "ID1"], modes=["rising", "sixteen rising"], timeout=0.1 +def test_measure_interval_same_channel_sixteen_rising(la): + la.configure_trigger("LA1", "falling") + interval = la.measure_interval( + channels=["LA1", "LA1"], modes=["rising", "sixteen rising"], timeout=0.1 ) - expected_interval = FREQUENCY ** -1 * 15 * MICROSECONDS - assert expected_interval == pytest.approx(interval, abs=ONE_CLOCK_CYCLE) + expected_interval = FREQUENCY**-1 * 15 * MICROSECONDS + assert expected_interval == pytest.approx(interval, abs=TWO_CLOCK_CYCLES) -def test_measure_interval_same_channel_same_event(scaffold): - scaffold.configure_trigger("ID1", "falling") - interval = scaffold.measure_interval( - channels=["ID3", "ID3"], modes=["rising", "rising"], timeout=0.1 +def test_measure_interval_same_channel_same_event(la): + la.configure_trigger("LA1", "falling") + interval = la.measure_interval( + channels=["LA3", "LA3"], modes=["rising", "rising"], timeout=0.1 ) - expected_interval = FREQUENCY ** -1 * MICROSECONDS - assert expected_interval == pytest.approx(interval, abs=ONE_CLOCK_CYCLE) + expected_interval = FREQUENCY**-1 * MICROSECONDS + assert expected_interval == pytest.approx(interval, abs=TWO_CLOCK_CYCLES) -def test_measure_duty_cycle(scaffold): - period, duty_cycle = scaffold.measure_duty_cycle("ID4", timeout=0.1) - expected_period = FREQUENCY ** -1 * MICROSECONDS +def test_measure_duty_cycle(la): + period, duty_cycle = la.measure_duty_cycle("LA4", timeout=0.1) + expected_period = FREQUENCY**-1 * MICROSECONDS assert (expected_period, DUTY_CYCLE) == pytest.approx( - (period, duty_cycle), abs=ONE_CLOCK_CYCLE + (period, duty_cycle), abs=TWO_CLOCK_CYCLES ) -def test_get_xy_rising_trigger(scaffold): - scaffold.configure_trigger("ID1", "rising") - t = scaffold.capture(1, 100) - _, y = scaffold.get_xy(t) +def test_get_xy_rising_trigger(la): + la.configure_trigger("LA1", "rising") + t = la.capture(1, 100) + _, y = la.get_xy(t) assert y[0] -def test_get_xy_falling_trigger(scaffold): - scaffold.configure_trigger("ID1", "falling") - t = scaffold.capture(1, 100) - _, y = scaffold.get_xy(t) +def test_get_xy_falling_trigger(la): + la.configure_trigger("LA1", "falling") + t = la.capture(1, 100) + _, y = la.get_xy(t) assert not y[0] -def test_get_xy_rising_capture(scaffold): - t = scaffold.capture(1, 100, modes=["rising"]) - _, y = scaffold.get_xy(t) +def test_get_xy_rising_capture(la): + t = la.capture(1, 100, modes=["rising"]) + _, y = la.get_xy(t) assert sum(y) == 100 -def test_get_xy_falling_capture(scaffold): - t = scaffold.capture(1, 100, modes=["falling"]) - _, y = scaffold.get_xy(t) +def test_get_xy_falling_capture(la): + t = la.capture(1, 100, modes=["falling"]) + _, y = la.get_xy(t) assert sum(~y) == 100 -def test_stop(scaffold): - scaffold.capture(1, EVENTS, modes=["sixteen rising"], block=False) - time.sleep(EVENTS * FREQUENCY ** -1) +def test_stop(la): + la.capture(1, EVENTS, modes=["sixteen rising"], block=False) + time.sleep(EVENTS * FREQUENCY**-1) progress_time = time.time() - progress = scaffold.get_progress() - scaffold.stop() + progress = la.get_progress() + la.stop() stop_time = time.time() - time.sleep(EVENTS * FREQUENCY ** -1) + time.sleep(EVENTS * FREQUENCY**-1) assert progress < CP.MAX_SAMPLES // 4 abstol = FREQUENCY * (stop_time - progress_time) - assert progress == pytest.approx(scaffold.get_progress(), abs=abstol) + assert progress == pytest.approx(la.get_progress(), abs=abstol) -def test_get_states(scaffold): - time.sleep(LOW_FREQUENCY ** -1) - states = scaffold.get_states() - expected_states = {"ID1": True, "ID2": True, "ID3": True, "ID4": True} +def test_get_states(la): + time.sleep(LOW_FREQUENCY**-1) + states = la.get_states() + expected_states = {"LA1": True, "LA2": True, "LA3": True, "LA4": True} assert states == expected_states -def test_count_pulses(scaffold): +def test_count_pulses(la): interval = 0.2 - pulses = scaffold.count_pulses("ID2", interval) + pulses = la.count_pulses("LA2", interval) expected_pulses = FREQUENCY * interval assert expected_pulses == pytest.approx(pulses, rel=0.1) # Pretty bad accuracy. diff --git a/tests/test_motor.py b/tests/test_motor.py new file mode 100644 index 00000000..4330e87e --- /dev/null +++ b/tests/test_motor.py @@ -0,0 +1,34 @@ +"""Tests for pslab.external.motor. + +Connect SQ1 -> LA1. +""" + +import pytest + +from pslab.external.motor import Servo +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.waveform_generator import PWMGenerator +from pslab.connection import SerialHandler + +RELTOL = 0.01 + + +@pytest.fixture +def servo(handler: SerialHandler) -> Servo: + return Servo("SQ1", PWMGenerator(handler)) + + +@pytest.fixture +def la(handler: SerialHandler) -> LogicAnalyzer: + return LogicAnalyzer(handler) + + +def test_set_angle(servo: Servo, la: LogicAnalyzer): + servo.angle = 90 + wavelength, duty_cycle = la.measure_duty_cycle("LA1") + assert wavelength * duty_cycle == pytest.approx(1500, rel=RELTOL) + + +def test_get_angle(servo: Servo): + servo.angle = 90 + assert servo.angle == 90 diff --git a/tests/test_mq135.py b/tests/test_mq135.py new file mode 100644 index 00000000..2773fbb7 --- /dev/null +++ b/tests/test_mq135.py @@ -0,0 +1,42 @@ +import pytest + +from pslab.external.gas_sensor import MQ135 + +R_LOAD = 22e3 +R0 = 50e3 +VCC = 5 +VOUT = 2 +A, B, C, D = *MQ135._TEMPERATURE_CORRECTION, MQ135._HUMIDITY_CORRECTION +E, F = MQ135._PARAMS["CO2"] +STANDARD_CORRECTION = A * 20 ** 2 + B * 20 + C + D * (0.65 - 0.65) +EXPECTED_SENSOR_RESISTANCE = (VCC / VOUT - 1) * R_LOAD / STANDARD_CORRECTION +CALIBRATION_CONCENTRATION = E * (EXPECTED_SENSOR_RESISTANCE / R0) ** F + + +@pytest.fixture +def mq135(mocker): + mock = mocker.patch("pslab.external.gas_sensor.Multimeter") + mock().measure_voltage.return_value = VOUT + return MQ135("CO2", R_LOAD) + + +def test_correction(mq135): + assert mq135._correction == STANDARD_CORRECTION + + +def test_sensor_resistance(mq135): + assert mq135._sensor_resistance == EXPECTED_SENSOR_RESISTANCE + + +def test_measure_concentration(mq135): + mq135.r0 = R0 + assert mq135.measure_concentration() == E * (EXPECTED_SENSOR_RESISTANCE / R0) ** F + + +def test_measure_concentration_r0_unset(mq135): + with pytest.raises(TypeError): + mq135.measure_concentration() + + +def test_measure_r0(mq135): + assert mq135.measure_r0(CALIBRATION_CONCENTRATION) == pytest.approx(R0) diff --git a/tests/test_multimeter.py b/tests/test_multimeter.py new file mode 100644 index 00000000..d83581f8 --- /dev/null +++ b/tests/test_multimeter.py @@ -0,0 +1,54 @@ +"""Tests for PSL.multimeter. + +Before running the tests, connect: + PV1 -> 10K resistor -> VOL + RES -> 10K resistor -> GND + CAP -> 1 nF capacitor -> GND +""" + +import pytest + +from pslab.instrument.multimeter import Multimeter +from pslab.instrument.power_supply import PowerSupply +from pslab.connection import SerialHandler + + +RELTOL = 0.05 + + +@pytest.fixture +def multi(handler: SerialHandler) -> Multimeter: + return Multimeter(handler) + + +@pytest.fixture +def source(handler: SerialHandler): + ps = PowerSupply() + ps.pv1.voltage = 2.2 + + +def test_measure_resistance(multi: Multimeter): + assert multi.measure_resistance() == pytest.approx(1e4, rel=RELTOL) + + +def test_measure_voltage(multi: Multimeter, source): + assert multi.measure_voltage("VOL") == pytest.approx(2.2, rel=RELTOL) + + +def test_voltmeter_autorange(multi: Multimeter): + assert multi._voltmeter_autorange("CH1") <= 3.3 + + +def test_calibrate_capacitance(multi: Multimeter): + multi.calibrate_capacitance() + # Need bigger tolerance because measurement will be 1 nF + actual stray + # capacitance (ca 50 pF). + assert multi._stray_capacitance == pytest.approx(1e-9, rel=3 * RELTOL) + + +def test_measure_capacitance(multi: Multimeter): + assert multi.measure_capacitance() == pytest.approx(1e-9, rel=RELTOL) + + +def test_measure_rc_capacitance(multi: Multimeter): + assert multi._measure_rc_capacitance() == pytest.approx(1e-9, rel=RELTOL) diff --git a/tests/test_oscilloscope.py b/tests/test_oscilloscope.py index ad3b2a64..c67854ed 100644 --- a/tests/test_oscilloscope.py +++ b/tests/test_oscilloscope.py @@ -1,102 +1,111 @@ -import unittest -from unittest.mock import patch +"""Tests for PSL.oscilloscope. + +The PSLab's waveform generator is used to generate a signal which is sampled by the +oscilloscope. Before running the tests, connect: + SI1 -> CH1 + SI2 -> CH2 + SI1 -> CH3 +""" import numpy as np +import pytest + +from pslab.instrument.oscilloscope import Oscilloscope +from pslab.instrument.waveform_generator import WaveformGenerator + + +FREQUENCY = 1000 +MICROSECONDS = 1e-6 +ABSTOL = 4 * (16.5 - (-16.5)) / (2**10 - 1) # Four times lowest CH1/CH2 resolution. + + +@pytest.fixture +def scope(handler): + """Enable waveform generator and return an Oscilloscope instance.""" + wave = WaveformGenerator(handler) + wave.generate(["SI1", "SI2"], FREQUENCY) + return Oscilloscope(handler) + + +def count_zero_crossings(x, y): + sample_rate = (np.diff(x)[0] * MICROSECONDS) ** -1 + samples_per_period = sample_rate / FREQUENCY + zero_crossings = np.where(np.diff(np.sign(y)))[0] + real_crossings = np.where(np.diff(zero_crossings) > samples_per_period * 0.01) + real_crossings = np.append(real_crossings, True) + + if len(real_crossings) % 1: + if y[0] * y[-1] <= 0: + return len(real_crossings) + 1 + + return len(real_crossings) + + +def verify_periods(x, y, channel, periods=1): + zero_crossings = count_zero_crossings(x, y) + assert zero_crossings == 2 * periods + assert y[0] == pytest.approx(y[-1], abs=ABSTOL) + + +def test_capture_one_12bit(scope): + _, y = scope.capture(channels=1, samples=1000, timegap=1) + y.sort() + resolution = min(np.diff(y)[np.diff(y) > 0]) + expected = (16.5 - (-16.5)) / (2**12 - 1) + assert resolution == pytest.approx(expected) + + +def test_capture_one_high_speed(scope): + x, y = scope.capture(channels=1, samples=2000, timegap=0.5) + verify_periods(x, y, scope._channels["CH1"]) + + +def test_capture_one_trigger(scope): + _, y = scope.capture(channels=1, samples=1, timegap=1, trigger=0) + assert y[0] == pytest.approx(0, abs=ABSTOL) + + +def test_capture_two(scope): + x, y1, y2 = scope.capture(channels=2, samples=500, timegap=2) + verify_periods(x, y1, scope._channels["CH1"]) + verify_periods(x, y2, scope._channels["CH2"]) + + +def test_capture_three(scope): + x, y1, y2, y3 = scope.capture(channels=3, samples=500, timegap=2) + verify_periods(x, y1, scope._channels["CH1"]) + verify_periods(x, y2, scope._channels["CH2"]) + verify_periods(x, y3, scope._channels["CH3"]) + + +def test_capture_four(scope): + x, y1, y2, y3, _ = scope.capture(channels=4, samples=500, timegap=2) + verify_periods(x, y1, scope._channels["CH1"]) + verify_periods(x, y2, scope._channels["CH2"]) + verify_periods(x, y3, scope._channels["CH3"]) + + +def test_capture_invalid_channel_one(scope): + with pytest.raises(ValueError): + scope.capture(channels="BAD", samples=200, timegap=2) + + +def test_capture_timegap_too_small(scope): + with pytest.raises(ValueError): + scope.capture(channels=1, samples=200, timegap=0.2) + + +def test_capture_too_many_channels(scope): + with pytest.raises(ValueError): + scope.capture(channels=5, samples=200, timegap=2) + + +def test_capture_too_many_samples(scope): + with pytest.raises(ValueError): + scope.capture(channels=4, samples=3000, timegap=2) + -import PSL.commands_proto as CP -from PSL import oscilloscope - - -class TestOscilloscope(unittest.TestCase): - def setUp(self): - self.Handler_patcher = patch("PSL.oscilloscope.packet_handler.Handler") - self.mock_device = self.Handler_patcher.start() - example_signal = np.sin(np.arange(200) / 20) - self.scope = oscilloscope.Oscilloscope(device=self.mock_device) - unscale = self.scope._channels["CH1"].unscale - example_raw_signal = [unscale(s) for s in example_signal] - example_incoming_bytes = b"" - for r in example_raw_signal: - example_incoming_bytes += CP.ShortInt.pack(r) - self.mock_device.interface.read.return_value = example_incoming_bytes - self.mock_device.get_byte.return_value = 1 - self.mock_device.get_int.return_value = 200 - - def tearDown(self): - self.Handler_patcher.stop() - - def test_capture_one_12bit(self): - xy = self.scope.capture(channels=1, samples=200, timegap=2) - self.assertEqual(np.shape(xy), (2, 200)) - self.assertEqual(self.scope._channels["CH1"].resolution, 12) - - def test_capture_one_high_speed(self): - xy = self.scope.capture(channels=1, samples=200, timegap=0.5) - self.assertEqual(np.shape(xy), (2, 200)) - self.assertEqual(self.scope._channels["CH1"].resolution, 10) - - def test_capture_one_trigger(self): - self.scope.trigger_enabled = True - xy = self.scope.capture(channels=1, samples=200, timegap=1) - self.assertEqual(np.shape(xy), (2, 200)) - self.assertEqual(self.scope._channels["CH1"].resolution, 10) - - def test_capture_two(self): - xy = self.scope.capture(channels=2, samples=200, timegap=2) - self.assertEqual(np.shape(xy), (3, 200)) - - def test_capture_four(self): - xy = self.scope.capture(channels=4, samples=200, timegap=2) - self.assertEqual(np.shape(xy), (5, 200)) - - def test_capture_invalid_channel_one(self): - self.scope.channel_one_map = "BAD" - with self.assertRaises(ValueError): - self.scope.capture(channels=1, samples=200, timegap=2) - - def test_capture_timegap_too_small(self): - with self.assertRaises(ValueError): - self.scope.capture(channels=1, samples=200, timegap=0.2) - - def test_capture_too_many_channels(self): - with self.assertRaises(ValueError): - self.scope.capture(channels=5, samples=200, timegap=2) - - def test_capture_too_many_samples(self): - with self.assertRaises(ValueError): - self.scope.capture(channels=4, samples=3000, timegap=2) - - def test_invalidate_buffer(self): - self.scope._channels["CH1"].samples_in_buffer = 100 - self.scope._channels["CH1"].buffer_idx = 0 - self.scope.channel_one_map = "CH2" - self.scope.capture(channels=1, samples=200, timegap=2) - self.assertEqual(self.scope._channels["CH1"].samples_in_buffer, 0) - self.assertIsNone(self.scope._channels["CH1"].buffer_idx) - - def test_configure_trigger(self): - self.scope.configure_trigger(channel="CH3", voltage=1.5) - self.assertTrue(self.scope.trigger_enabled) - self.mock_device.send_byte.assert_any_call(CP.CONFIGURE_TRIGGER) - - def test_configure_trigger_on_unmapped(self): - with self.assertRaises(TypeError): - self.scope.configure_trigger(channel="AN8", voltage=1.5) - - def test_configure_trigger_on_remapped_ch1(self): - self.scope.channel_one_map = "CAP" - with self.assertRaises(TypeError): - self.scope.configure_trigger(channel="CH1", voltage=1.5) - - def test_trigger_enabled(self): - self.scope.trigger_enabled = True - self.mock_device.send_byte.assert_any_call(CP.CONFIGURE_TRIGGER) - - def test_select_range(self): - self.scope.select_range("CH1", 1.5) - self.mock_device.send_byte.assert_called() - self.assertEqual(self.scope._channels["CH1"].gain, 10) - - def test_select_range_invalid(self): - with self.assertRaises(ValueError): - self.scope.select_range("CH1", 15) +def test_select_range(scope): + scope.select_range("CH1", 1.5) + _, y = scope.capture(channels=1, samples=1000, timegap=1) + assert 1.5 <= max(y) <= 1.65 diff --git a/tests/test_packet_handler.py b/tests/test_packet_handler.py deleted file mode 100644 index af95c046..00000000 --- a/tests/test_packet_handler.py +++ /dev/null @@ -1,193 +0,0 @@ -import unittest -from unittest.mock import patch - -import serial -from serial.tools.list_ports_common import ListPortInfo - -import PSL.commands_proto as CP -from PSL.packet_handler import Handler - -VERSION = "PSLab vMOCK\n" -PORT = "mockport" - - -class TestHandler(unittest.TestCase): - @staticmethod - def mock_ListPortInfo(found=True): - if found: - yield ListPortInfo(device=PORT) - else: - return - - def setUp(self): - self.Serial_patcher = patch("PSL.packet_handler.serial.Serial") - self.list_ports_patcher = patch("PSL.packet_handler.list_ports") - self.mock_Serial = self.Serial_patcher.start() - self.mock_list_ports = self.list_ports_patcher.start() - self.mock_Serial().readline.return_value = VERSION.encode("utf-8") - - def tearDown(self): - self.Serial_patcher.stop() - self.list_ports_patcher.stop() - - def test_connect_port_provided(self): - Handler(port=PORT) - self.assertTrue(self.mock_Serial().is_open) - - def test_connect_scan_port(self): - self.mock_Serial().is_open = False - self.mock_list_ports.grep.return_value = self.mock_ListPortInfo() - Handler() - self.mock_Serial().open.assert_called() - - def test_connect_scan_failure(self): - self.mock_Serial().is_open = False - self.mock_list_ports.grep.return_value = self.mock_ListPortInfo(found=False) - self.assertRaises(serial.SerialException, Handler) - - def test_disconnect(self): - H = Handler() - H.disconnect() - self.mock_Serial().close.assert_called() - - def test_reconnect(self): - H = Handler(port=PORT) - H.reconnect(port=PORT[::-1]) - self.assertIn({"port": PORT}, self.mock_Serial.call_args_list) - self.assertIn({"port": PORT[::-1]}, self.mock_Serial.call_args_list) - self.mock_Serial().close.assert_called() - - def test_del(self): - H = Handler() - H.__del__() - self.mock_Serial().close.assert_called() - - def test_get_version(self): - H = Handler() - - self.mock_Serial().write.assert_called_with(CP.GET_VERSION) - self.assertEqual(H.version, VERSION) - - def test_get_ack_success(self): - H = Handler() - success = 1 - self.mock_Serial().read.return_value = CP.Byte.pack(success) - self.assertEqual(H.get_ack(), success) - - def test_get_ack_burst_mode(self): - H = Handler() - success = 1 - H.load_burst = True - queue_size = H.input_queue_size - self.mock_Serial().read.return_value = b"" - - self.assertEqual(H.get_ack(), success) - self.assertEqual(H.input_queue_size, queue_size + 1) - - def test_get_ack_failure(self): - H = Handler() - error = 3 - self.mock_Serial().read.return_value = b"" - self.assertEqual(H.get_ack(), error) - - def test_send_bytes(self): - H = Handler() - H._send(CP.Byte.pack(0xFF)) - self.mock_Serial().write.assert_called_with(CP.Byte.pack(0xFF)) - - def test_send_byte(self): - H = Handler() - H._send(0xFF) - self.mock_Serial().write.assert_called_with(CP.Byte.pack(0xFF)) - - def test_send_byte_burst_mode(self): - H = Handler() - H.load_burst = True - H._send(0xFF) - self.assertEqual(H.burst_buffer, CP.Byte.pack(0xFF)) - - def test_send_int(self): - H = Handler() - H._send(0xFFFF) - self.mock_Serial().write.assert_called_with(CP.ShortInt.pack(0xFFFF)) - - def test_send_int_burst_mode(self): - H = Handler() - H.load_burst = True - H._send(0xFFFF) - self.assertEqual(H.burst_buffer, CP.ShortInt.pack(0xFFFF)) - - def test_send_long(self): - H = Handler() - H._send(0xFFFFFFFF) - self.mock_Serial().write.assert_called_with(CP.Integer.pack(0xFFFFFFFF)) - - def test_send_long_burst_mode(self): - H = Handler() - H.load_burst = True - H._send(0xFFFFFFFF) - self.assertEqual(H.burst_buffer, CP.Integer.pack(0xFFFFFFFF)) - - def test_receive(self): - H = Handler() - self.mock_Serial().read.return_value = CP.Byte.pack(0xFF) - r = H._receive(1) - self.mock_Serial().read.assert_called_with(1) - self.assertEqual(r, 0xFF) - - def test_receive_uneven_bytes(self): - H = Handler() - self.mock_Serial().read.return_value = int.to_bytes( - 0xFFFFFF, length=3, byteorder="little", signed=False - ) - r = H._receive(3) - self.mock_Serial().read.assert_called_with(3) - self.assertEqual(r, 0xFFFFFF) - - def test_receive_failure(self): - H = Handler() - self.mock_Serial().read.return_value = b"" - r = H._receive(1) - self.mock_Serial().read.assert_called_with(1) - self.assertEqual(r, -1) - - def test_wait_for_data(self): - H = Handler() - self.assertTrue(H.wait_for_data()) - - def test_wait_for_data_timeout(self): - H = Handler() - self.mock_Serial().in_waiting = False - self.assertFalse(H.wait_for_data()) - - def test_send_burst(self): - H = Handler() - H.load_burst = True - - for b in b"abc": - H._send(b) - H.get_ack() - - self.mock_Serial().read.return_value = b"\x01\x01\x01" - acks = H.send_burst() - - self.mock_Serial().write.assert_called_with(b"abc") - self.mock_Serial().read.assert_called_with(3) - self.assertFalse(H.load_burst) - self.assertEqual(H.burst_buffer, b"") - self.assertEqual(H.input_queue_size, 0) - self.assertEqual(acks, [1, 1, 1]) - - def test_get_integer_unsupported_size(self): - H = Handler() - self.assertRaises(ValueError, H._get_integer_type, size=3) - - def test_list_ports(self): - self.list_ports_patcher.stop() - H = Handler() - self.assertTrue(isinstance(H._list_ports(), list)) - self.list_ports_patcher.start() - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_power_supply.py b/tests/test_power_supply.py new file mode 100644 index 00000000..ccb22120 --- /dev/null +++ b/tests/test_power_supply.py @@ -0,0 +1,80 @@ +"""Tests for PSL.power_supply. + +When running integration tests, connect: + PV1 -> CH1 + PV2 -> CH2 + PV3 -> VOL + PCS -> 100R -> GND + PCS -> CH3 +""" + +import time + +import pytest +import numpy as np + +from pslab.connection import SerialHandler +from pslab.instrument.multimeter import Multimeter +from pslab.instrument.power_supply import PowerSupply + +RELTOL = 0.1 +ABSTOL = 0.1 + + +@pytest.fixture +def power(handler: SerialHandler) -> PowerSupply: + return PowerSupply(handler) + + +@pytest.fixture +def multi(handler: SerialHandler) -> Multimeter: + return Multimeter(handler) + + +def test_set_voltage_pv1(power: PowerSupply, multi: Multimeter): + voltages = np.arange(-5, 5, 0.1) + measured = np.zeros(len(voltages)) + + for i, v in enumerate(voltages): + power.pv1 = v + time.sleep(0.01) + measured[i] = multi.measure_voltage("CH1") + + assert measured == pytest.approx(voltages, rel=RELTOL * 2, abs=ABSTOL * 2) + + +def test_set_voltage_pv2(power: PowerSupply, multi: Multimeter): + voltages = np.arange(-3.3, 3.3, 0.1) + measured = np.zeros(len(voltages)) + + for i, v in enumerate(voltages): + power.pv2 = v + time.sleep(0.01) + measured[i] = multi.measure_voltage("CH2") + + assert measured == pytest.approx(voltages, rel=RELTOL * 2, abs=ABSTOL * 2) + + +def test_set_voltage_pv3(power: PowerSupply, multi: Multimeter): + voltages = np.arange(0, 3.3, 0.1) + measured = np.zeros(len(voltages)) + + for i, v in enumerate(voltages): + power.pv3 = v + time.sleep(0.01) + measured[i] = multi.measure_voltage("VOL") + + assert measured == pytest.approx(voltages, rel=RELTOL * 2, abs=ABSTOL * 2) + + +def test_set_current(power: PowerSupply, multi: Multimeter): + currents = np.arange(0, 2.5e-3, 1e-4) + measured = np.zeros(len(currents)) + + for i, c in enumerate(currents): + power.pcs = c + time.sleep(0.01) + measured[i] = multi.measure_voltage("CH3") + + resistor = 100 + assert measured == pytest.approx(currents * resistor, rel=RELTOL, abs=ABSTOL) diff --git a/tests/test_serial_handler.py b/tests/test_serial_handler.py new file mode 100644 index 00000000..dcbf1a1a --- /dev/null +++ b/tests/test_serial_handler.py @@ -0,0 +1,127 @@ +import pytest +from serial import SerialException +from serial.tools.list_ports_common import ListPortInfo + +import pslab.protocol as CP +from pslab.connection import detect, SerialHandler + +VERSION = "PSLab vMOCK\n" +PORT = "mock_port" +PORT2 = "mock_port_2" + + +def mock_ListPortInfo(found=True, multiple=False): + if found: + if multiple: + yield from [ListPortInfo(device=PORT), ListPortInfo(device=PORT2)] + else: + yield ListPortInfo(device=PORT) + else: + return + + +@pytest.fixture +def mock_serial(mocker): + serial_patch = mocker.patch("pslab.connection._serial.serial.Serial") + serial_patch().readline.return_value = VERSION.encode() + serial_patch().is_open = False + return serial_patch + + +@pytest.fixture +def mock_handler(mocker, mock_serial, mock_list_ports): + mocker.patch("pslab.connection._serial._check_serial_access_permission") + mock_list_ports.grep.return_value = mock_ListPortInfo() + return SerialHandler() + + +@pytest.fixture +def mock_list_ports(mocker): + return mocker.patch("pslab.connection.list_ports") + + +def test_detect(mocker, mock_serial, mock_list_ports): + mock_list_ports.grep.return_value = mock_ListPortInfo(multiple=True) + assert len(detect()) == 2 + + +def test_connect_scan_port(mocker, mock_serial, mock_list_ports): + mock_list_ports.grep.return_value = mock_ListPortInfo() + mocker.patch("pslab.connection._serial._check_serial_access_permission") + SerialHandler() + mock_serial().open.assert_called() + + +def test_connect_scan_failure(mocker, mock_serial, mock_list_ports): + mock_list_ports.grep.return_value = mock_ListPortInfo(found=False) + mocker.patch("pslab.connection._serial._check_serial_access_permission") + with pytest.raises(SerialException): + SerialHandler() + + +def test_connect_multiple_connected(mocker, mock_serial, mock_list_ports): + mock_list_ports.grep.return_value = mock_ListPortInfo(multiple=True) + mocker.patch("pslab.connection._serial._check_serial_access_permission") + with pytest.raises(RuntimeError): + SerialHandler() + + +def test_disconnect(mock_serial, mock_handler): + mock_handler.disconnect() + mock_serial().close.assert_called() + + +def test_reconnect(mock_serial, mock_handler, mock_list_ports): + mock_list_ports.grep.return_value = mock_ListPortInfo() + mock_handler.reconnect() + mock_serial().close.assert_called() + + +def test_get_version(mock_serial, mock_handler): + mock_handler.get_version() + mock_serial().write.assert_called_with(CP.GET_VERSION) + assert mock_handler.version == VERSION + + +def test_get_ack_success(mock_serial, mock_handler): + success = 1 + mock_serial().read.return_value = CP.Byte.pack(success) + assert mock_handler.get_ack() == success + + +def test_get_ack_failure(mock_serial, mock_handler): + mock_serial().read.return_value = b"" + with pytest.raises(SerialException): + mock_handler.get_ack() + + +def test_send_bytes(mock_serial, mock_handler): + mock_handler.send_byte(CP.Byte.pack(0xFF)) + mock_serial().write.assert_called_with(CP.Byte.pack(0xFF)) + + +def test_send_byte(mock_serial, mock_handler): + mock_handler.send_byte(0xFF) + mock_serial().write.assert_called_with(CP.Byte.pack(0xFF)) + + +def test_receive(mock_serial, mock_handler): + mock_serial().read.return_value = CP.Byte.pack(0xFF) + r = mock_handler.get_byte() + mock_serial().read.assert_called_with(1) + assert r == 0xFF + + +def test_receive_failure(mock_serial, mock_handler): + mock_serial().read.return_value = b"" + with pytest.raises(SerialException): + mock_handler.get_byte() + + +def test_get_integer_unsupported_size(mock_serial, mock_handler): + with pytest.raises(ValueError): + mock_handler._get_integer_type(size=3) + + +def test_list_ports(mock_serial, mock_handler): + assert isinstance(mock_handler._list_ports(), list) diff --git a/tests/test_spi.py b/tests/test_spi.py new file mode 100644 index 00000000..ecd73d92 --- /dev/null +++ b/tests/test_spi.py @@ -0,0 +1,312 @@ +"""Tests for pslab.bus.spi. + +The PSLab's logic analyzer and PWM output are used to verify the function of the SPI +bus. Before running the tests, connect: + SCK -> LA1 + SDO -> LA2 + SDI -> SQ1 and LA4 + SPI.CS -> LA3 +""" + +import pytest +import re +from numpy import ndarray + +from pslab.bus.spi import SPIMaster, SPISlave +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.waveform_generator import PWMGenerator +from pslab.connection import SerialHandler + +SPI_SUPPORTED_DEVICES = [ + # "PSLab vMOCK", # Uncomment after adding recording json files. + "PSLab V6\n", +] + +WRITE_DATA8 = 0b10100101 +WRITE_DATA16 = 0xAA55 +SCK = "LA1" +SDO = "LA2" +SDI = ["LA4", "SQ1"] +CS = "LA3" +SPIMaster._primary_prescaler = PPRE = 0 +SPIMaster._secondary_prescaler = SPRE = 0 +PWM_FERQUENCY = SPIMaster._frequency * 2 / 3 +MICROSECONDS = 1e-6 +RELTOL = 0.05 +# Number of expected logic level changes. +CS_START = 1 +CS_STOP = 1 +SCK_WRITE8 = 16 +SCK_WRITE16 = 2 * 16 +SDO_WRITE_DATA8 = 8 +SDO_WRITE_DATA16 = 16 + + +@pytest.fixture +def master(handler: SerialHandler) -> SPIMaster: + if handler.version not in SPI_SUPPORTED_DEVICES: + pytest.skip("SPI not supported by this device.") + spi_master = SPIMaster(device=handler) + yield spi_master + spi_master.set_parameters() + + +@pytest.fixture +def slave(handler: SerialHandler) -> SPISlave: + if handler.version not in SPI_SUPPORTED_DEVICES: + pytest.skip("SPI not supported by this device.") + return SPISlave(device=handler) + + +@pytest.fixture +def la(handler: SerialHandler) -> LogicAnalyzer: + pwm = PWMGenerator(handler) + pwm.generate(SDI[1], PWM_FERQUENCY, 0.5) + return LogicAnalyzer(handler) + + +def verify_value( + value: int, + sck_timestamps: ndarray, + sdi_initstate: int, + sdi_timestamps: ndarray, + smp: int = 0, +): + sck_ts = sck_timestamps[smp::2] + pwm_half_period = ((1 / PWM_FERQUENCY) * 1e6) / 2 # microsecond + + pattern = "" + for t in sck_ts: + d, m = divmod(t - sdi_timestamps[0], pwm_half_period) + if m == pytest.approx(0, abs=0.1) or m == pytest.approx( + pwm_half_period, abs=0.1 + ): + pattern += "[0,1]" + elif d % 2: + pattern += "1" if sdi_initstate else "0" + else: + pattern += "0" if sdi_initstate else "1" + + pattern = re.compile(pattern) + bits = len(sck_ts) + value = bin(value)[2:].zfill(bits) + + return bool(pattern.match(value)) + + +def test_set_parameter_frequency(la: LogicAnalyzer, master: SPIMaster, slave: SPISlave): + # frequency 166666.66666666666 + ppre = 0 + spre = 2 + master.set_parameters(primary_prescaler=ppre, secondary_prescaler=spre) + la.capture(1, block=False) + slave.write8(0) + la.stop() + (sck,) = la.fetch_data() + write_start = sck[0] + write_stop = sck[-2] # Output data on rising edge only (in mode 0) + start_to_stop = 7 + period = (write_stop - write_start) / start_to_stop + assert (period * MICROSECONDS) ** -1 == pytest.approx(master._frequency, rel=RELTOL) + + +@pytest.mark.parametrize("ckp", [0, 1]) +def test_set_parameter_clock_polarity( + la: LogicAnalyzer, master: SPIMaster, slave: SPISlave, ckp: int +): + master.set_parameters(CKP=ckp) + assert la.get_states()[SCK] == bool(ckp) + + +@pytest.mark.parametrize("cke", [0, 1]) +def test_set_parameter_clock_edge( + la: LogicAnalyzer, master: SPIMaster, slave: SPISlave, cke: int +): + master.set_parameters(CKE=cke) + la.capture(2, block=False) + slave.write8(WRITE_DATA8) + la.stop() + (sck, sdo) = la.fetch_data() + idle_to_active = sck[0] + first_bit = sdo[0] + # Serial output data changes on transition + # {0: from Idle clock state to active state (first event before data change), + # 1: from active clock state to Idle state (data change before first event)}. + assert first_bit < idle_to_active == bool(cke) + + +@pytest.mark.parametrize("smp", [0, 1]) +def test_set_parameter_smp( + la: LogicAnalyzer, master: SPIMaster, slave: SPISlave, pwm: PWMGenerator, smp: int +): + master.set_parameters(SMP=smp) + la.capture([SCK, SDI[0]], block=False) + value = slave.read8() + la.stop() + (sck, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert verify_value(value, sck, sdi_initstate, sdi, smp) + + +def test_chip_select(la: LogicAnalyzer, slave: SPISlave): + assert la.get_states()[CS] + + la.capture(CS, block=False) + slave._start() + slave._stop() + la.stop() + (cs,) = la.fetch_data() + assert len(cs) == (CS_START + CS_STOP) + + +def test_write8(la: LogicAnalyzer, slave: SPISlave): + la.capture(3, block=False) + slave.write8(WRITE_DATA8) + la.stop() + (sck, sdo, cs) = la.fetch_data() + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE8 + assert len(sdo) == SDO_WRITE_DATA8 + + +def test_write16(la: LogicAnalyzer, slave: SPISlave): + la.capture(3, block=False) + slave.write16(WRITE_DATA16) + la.stop() + (sck, sdo, cs) = la.fetch_data() + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE16 + assert len(sdo) == SDO_WRITE_DATA16 + + +def test_read8(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.read8() + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE8 + assert len(sdo) == 0 + assert verify_value(value, sck, sdi_initstate, sdi) + + +def test_read16(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.read16() + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE16 + assert len(sdo) == 0 + assert verify_value(value, sck, sdi_initstate, sdi) + + +def test_transfer8(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.transfer8(WRITE_DATA8) + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE8 + assert len(sdo) == SDO_WRITE_DATA8 + assert verify_value(value, sck, sdi_initstate, sdi) + + +def test_transfer16(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.transfer16(WRITE_DATA16) + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE16 + assert len(sdo) == SDO_WRITE_DATA16 + assert verify_value(value, sck, sdi_initstate, sdi) + + +def test_write8_bulk(la: LogicAnalyzer, slave: SPISlave): + la.capture(3, block=False) + slave.write8_bulk([WRITE_DATA8, WRITE_DATA8]) + la.stop() + (sck, sdo, cs) = la.fetch_data() + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE8 + SCK_WRITE8 + assert len(sdo) == SDO_WRITE_DATA8 + SDO_WRITE_DATA16 + + +def test_write16_bulk(la: LogicAnalyzer, slave: SPISlave): + la.capture(3, block=False) + slave.write16_bulk([WRITE_DATA16, WRITE_DATA16]) + la.stop() + (sck, sdo, cs) = la.fetch_data() + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE16 + SCK_WRITE16 + assert len(sdo) == SDO_WRITE_DATA16 + SDO_WRITE_DATA16 + + +def test_read8_bulk(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.read8_bulk(2) + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE8 + SCK_WRITE8 + assert len(sdo) == 0 + assert verify_value(value[0], sck, sdi_initstate, sdi[:16]) + assert verify_value(value[1], sck, sdi_initstate, sdi[16:]) + + +def test_read16_bulk(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.read16_bulk(2) + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE16 + SCK_WRITE16 + assert len(sdo) == 0 + assert verify_value(value[0], sck, sdi_initstate, sdi[:32]) + assert verify_value(value[1], sck, sdi_initstate, sdi[32:]) + + +def test_transfer8_bulk(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.transfer8_bulk([WRITE_DATA8, WRITE_DATA8]) + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE8 + SCK_WRITE8 + assert len(sdo) == 0 + assert verify_value(value[0], sck, sdi_initstate, sdi[:16]) + assert verify_value(value[1], sck, sdi_initstate, sdi[16:]) + + +def test_transfer16_bulk(la: LogicAnalyzer, slave: SPISlave): + la.capture(4, block=False) + value = slave.transfer16_bulk([WRITE_DATA16, WRITE_DATA16]) + la.stop() + (sck, sdo, cs, sdi) = la.fetch_data() + sdi_initstate = la.get_initial_states()[SDI[0]] + + assert len(cs) == (CS_START + CS_STOP) + assert len(sck) == SCK_WRITE16 + SCK_WRITE16 + assert len(sdo) == 0 + assert verify_value(value[0], sck, sdi_initstate, sdi[:32]) + assert verify_value(value[1], sck, sdi_initstate, sdi[32:]) diff --git a/tests/test_uart.py b/tests/test_uart.py new file mode 100644 index 00000000..fd861e52 --- /dev/null +++ b/tests/test_uart.py @@ -0,0 +1,84 @@ +"""Tests for pslab.bus.uart. + +The PSLab's logic analyzer is used to verify the function of the UART bus. Before +running the tests, connect: + TxD2->LA1 | PGD2 -> LA1 (for v5) + RxD2->SQ1 | PGC2 -> SQ1 (for v5) +""" + +import pytest + +from pslab.bus.uart import UART +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.waveform_generator import PWMGenerator +from pslab.connection import SerialHandler + +WRITE_DATA = 0x55 +TXD2 = "LA1" +RXD2 = "SQ1" +PWM_FERQUENCY = UART._baudrate // 2 +MICROSECONDS = 1e-6 +RELTOL = 0.05 +# Number of expected logic level changes. +TXD_START = 1 +TXD_WRITE_DATA = 8 # if LSB is 1 +TXD_STOP = 1 # if data MSB is 0 + + +@pytest.fixture +def uart(handler: SerialHandler) -> UART: + return UART(device=handler) + + +@pytest.fixture +def la(handler: SerialHandler) -> LogicAnalyzer: + return LogicAnalyzer(handler) + + +@pytest.fixture +def pwm(handler: SerialHandler) -> None: + pwm = PWMGenerator(handler) + pwm.generate(RXD2, PWM_FERQUENCY, 0.5) + + +def test_configure(la: LogicAnalyzer, uart: UART): + baudrate = 1000000 + uart.configure(baudrate) + la.capture(1, block=False) + uart.write_byte(WRITE_DATA) + la.stop() + (txd2,) = la.fetch_data() + start_to_stop = 9 + period = (txd2[-1] - txd2[0]) / start_to_stop + + assert (period * MICROSECONDS) ** -1 == pytest.approx(baudrate, rel=RELTOL) + + +def test_write_byte(la: LogicAnalyzer, uart: UART): + la.capture(1, block=False) + uart.write_byte(WRITE_DATA) + la.stop() + (txd2,) = la.fetch_data() + + assert len(txd2) == (TXD_START + TXD_WRITE_DATA + TXD_STOP) + + +def test_write_int(la: LogicAnalyzer, uart: UART): + la.capture(1, block=False) + uart.write_int((WRITE_DATA << 8) | WRITE_DATA) + la.stop() + (txd2,) = la.fetch_data() + + assert len(txd2) == 2 * (TXD_START + TXD_WRITE_DATA + TXD_STOP) + + +def test_read_byte(pwm: PWMGenerator, uart: UART): + value = uart.read_byte() + + assert value in (0x55, 0xAA) + + +def test_read_int(pwm: PWMGenerator, uart: UART): + value = uart.read_int() + + assert value in (0x5555, 0x55AA, 0xAA55, 0xAAAA) diff --git a/tests/test_waveform_generator.py b/tests/test_waveform_generator.py new file mode 100644 index 00000000..3f12c05a --- /dev/null +++ b/tests/test_waveform_generator.py @@ -0,0 +1,257 @@ +"""Tests for pslab.waveform_generator. + +Before running the tests, connect: + SQ1 -> LA1 + SQ2 -> LA2 + SQ3 -> LA3 + SQ4 -> LA4 + SI1 -> CH1 + SI2 -> CH2 +""" + +import time + +import numpy as np +import pytest +from scipy.optimize import curve_fit +from _pytest.logging import LogCaptureFixture + +from pslab.instrument.logic_analyzer import LogicAnalyzer +from pslab.instrument.oscilloscope import Oscilloscope +from pslab.instrument.waveform_generator import PWMGenerator, WaveformGenerator +from pslab.connection import SerialHandler + + +MICROSECONDS = 1e-6 +RELTOL = 0.05 +GOOD_FIT = 0.99 + + +def r_squared(y: np.ndarray, y_fit: np.ndarray) -> float: + """Calculate the coefficient of determination.""" + ss_res = np.sum((y - y_fit) ** 2) # Residual sum of squares. + ss_tot = np.sum((y - y.mean()) ** 2) # Total sum of squares. + return 1 - (ss_res / ss_tot) + + +@pytest.fixture +def pwm(handler: SerialHandler) -> PWMGenerator: + return PWMGenerator(handler) + + +@pytest.fixture +def wave(handler: SerialHandler) -> WaveformGenerator: + return WaveformGenerator(handler) + + +@pytest.fixture +def la(handler: SerialHandler) -> LogicAnalyzer: + return LogicAnalyzer(handler) + + +@pytest.fixture +def scope(handler: SerialHandler) -> Oscilloscope: + return Oscilloscope(handler) + + +def test_sine_wave(wave: WaveformGenerator, scope: Oscilloscope): + frequency = 500 + wave.load_function("SI1", "sine") + wave.generate("SI1", frequency) + time.sleep(0.1) + x, y = scope.capture(1, 10000, 1, trigger=0) + + def expected_f(x, amplitude, frequency, phase): + return amplitude * np.sin(2 * np.pi * frequency * x + phase) + + amplitude = 3.3 + guess = [amplitude, frequency, 0] + [amplitude_est, frequency_est, phase_est], _ = curve_fit( + expected_f, x * MICROSECONDS, y, guess + ) + + assert amplitude_est == pytest.approx(amplitude, rel=RELTOL) + assert frequency_est == pytest.approx(frequency, rel=RELTOL) + + coeff_of_det = r_squared( + y, expected_f(x * MICROSECONDS, amplitude_est, frequency_est, phase_est) + ) + + assert coeff_of_det >= GOOD_FIT + + +def test_triangle_wave(wave: WaveformGenerator, scope: Oscilloscope): + frequency = 2000 + wave.load_function("SI1", "tria") + wave.generate("SI1", frequency) + time.sleep(0.1) + x, y = scope.capture(1, 10000, 1, trigger=0) + + def expected_f(x, amplitude, frequency, phase): + return ( + 2 * amplitude / np.pi * np.arcsin(np.sin(2 * np.pi * frequency * x + phase)) + ) + + amplitude = 3.3 + guess = [amplitude, frequency, 0] + [amplitude_est, frequency_est, phase_est], _ = curve_fit( + expected_f, x * MICROSECONDS, y, guess + ) + + assert amplitude_est == pytest.approx(amplitude, rel=RELTOL) + assert frequency_est == pytest.approx(frequency, rel=RELTOL) + + coeff_of_det = r_squared( + y, expected_f(x * MICROSECONDS, amplitude_est, frequency_est, phase_est) + ) + + assert coeff_of_det >= GOOD_FIT + + +def test_superposition(wave: WaveformGenerator, scope: Oscilloscope): + frequency = 1000 + amplitude1 = 2 + amplitude2 = 1 + + def super_sine(x): + return amplitude1 * np.sin(x) + amplitude2 * np.sin(5 * x) + + wave.load_function("SI1", super_sine, [0, 2 * np.pi]) + wave.generate("SI1", frequency) + time.sleep(0.1) + x, y = scope.capture(1, 10000, 1, trigger=0) + + def expected_f(x, amplitude1, amplitude2, frequency, phase): + return amplitude1 * np.sin( + 2 * np.pi * frequency * x + phase + ) + amplitude2 * np.sin(5 * (2 * np.pi * frequency * x + phase)) + + amplitude1 = 2 + amplitude2 = 1 + guess = [amplitude1, amplitude2, frequency, 0] + [amplitude1_est, amplitude2_est, frequency_est, phase_est], _ = curve_fit( + expected_f, x * MICROSECONDS, y, guess + ) + + assert amplitude1_est == pytest.approx(amplitude1, rel=RELTOL) + assert amplitude2_est == pytest.approx(amplitude2, rel=RELTOL) + assert frequency_est == pytest.approx(frequency, rel=RELTOL) + + coeff_of_det = r_squared( + y, + expected_f( + x * MICROSECONDS, amplitude1_est, amplitude2_est, frequency_est, phase_est + ), + ) + + assert coeff_of_det >= GOOD_FIT + + +def test_sine_phase(wave: WaveformGenerator, scope: Oscilloscope): + frequency = 500 + phase = 90 + wave.load_function("SI1", "sine") + wave.load_function("SI2", "sine") + wave.generate(["SI1", "SI2"], frequency, phase) + time.sleep(0.1) + x, y1, y2 = scope.capture(2, 5000, 2, trigger=0) + + def expected_f(x, amplitude, frequency, phase): + return amplitude * np.sin(2 * np.pi * frequency * x + phase) + + guess1 = [3.3, frequency, 0] + [_, _, phase1_est], _ = curve_fit(expected_f, x * MICROSECONDS, y1, guess1) + guess2 = [3.3, frequency, phase * np.pi / 180] + [_, _, phase2_est], _ = curve_fit(expected_f, x * MICROSECONDS, y2, guess2) + + assert phase2_est - phase1_est == pytest.approx(phase * np.pi / 180, rel=RELTOL) + + +def test_low_frequency_warning(caplog: LogCaptureFixture, wave: WaveformGenerator): + wave.generate("SI1", 1) + assert "AC coupling" in caplog.text + + +def test_low_frequency_error(wave: WaveformGenerator): + with pytest.raises(ValueError): + wave.generate("SI1", 0.05) + + +def test_high_frequency_warning(caplog: LogCaptureFixture, wave: WaveformGenerator): + wave.generate("SI1", 1e4) + assert "Frequencies above" + + +def test_dimension_mismatch(wave: WaveformGenerator): + with pytest.raises(ValueError): + wave.generate("SI2", [500, 1000]) + + +def test_pwm(pwm: PWMGenerator, la: LogicAnalyzer): + frequency = 5e4 + duty_cycle = 0.4 + pwm.generate("SQ1", frequency, duty_cycle) + time.sleep(0.1) + + assert la.measure_frequency("LA1") == pytest.approx(frequency, rel=RELTOL) + assert la.measure_duty_cycle("LA1")[1] == pytest.approx(duty_cycle, rel=RELTOL) + + +def test_pwm_phase(pwm: PWMGenerator, la: LogicAnalyzer): + frequency = 1e4 + duty_cycle = 0.5 + phase = 0.25 + pwm.generate(["SQ1", "SQ2"], frequency, duty_cycle, phase) + time.sleep(0.1) + interval = la.measure_interval(["LA1", "LA2"], ["rising", "rising"]) + + if interval < 0: + interval += frequency**-1 / MICROSECONDS + + assert interval * MICROSECONDS == pytest.approx(frequency**-1 * phase, rel=RELTOL) + + +def test_set_state(pwm: PWMGenerator, la: LogicAnalyzer): + states = [True, False, True, True] + pwm.set_state(*states) + time.sleep(0.1) + assert list(la.get_states().values()) == states + + +def test_unchanged_state(pwm: PWMGenerator, la: LogicAnalyzer): + frequency = 2.5e3 + duty_cycle = 0.9 + pwm.generate(["SQ1", "SQ4"], frequency, duty_cycle) + states = [None, True, False, None] + pwm.set_state(*states) + time.sleep(0.1) + + assert list(la.get_states().values())[1:3] == states[1:3] + assert la.measure_frequency("LA1") == pytest.approx(frequency, rel=RELTOL) + assert la.measure_frequency("LA4") == pytest.approx(frequency, rel=RELTOL) + assert la.measure_duty_cycle("LA1")[1] == pytest.approx(duty_cycle, rel=RELTOL) + assert la.measure_duty_cycle("LA4")[1] == pytest.approx(duty_cycle, rel=RELTOL) + + +def test_map_reference_clock(pwm: PWMGenerator, la: LogicAnalyzer): + prescaler = 5 + pwm.map_reference_clock(["SQ3"], prescaler) + assert la.measure_frequency("LA3") == pytest.approx( + 128e6 / (1 << prescaler), rel=RELTOL + ) + + +def test_pwm_high_frequency_error(pwm: PWMGenerator): + with pytest.raises(ValueError): + pwm.generate("SQ1", 2e7, 0.5) + + +def test_pwm_get_frequency(pwm: PWMGenerator): + frequency = 1500 + pwm.generate("SQ2", frequency, 0.1) + assert pwm.frequency == pytest.approx(frequency, rel=RELTOL) + + +def test_pwm_set_negative_frequency(pwm: PWMGenerator): + with pytest.raises(ValueError): + pwm.generate("SQ1", -1, 0.5) diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..00be71d5 --- /dev/null +++ b/tox.ini @@ -0,0 +1,38 @@ +[tox] + +[gh-actions] + +[testenv:integration] +deps = + -rrequirements.txt + pytest + coverage +commands = coverage run --source pslab -m pytest + +[testenv:lint] +deps = -rlint-requirements.txt +setenv = + INCLUDE_PSL_FILES = pslab/bus/ pslab/connection pslab/instrument/ pslab/serial_handler.py pslab/cli.py pslab/external/motor.py pslab/external/gas_sensor.py pslab/external/hcsr04.py +commands = + black --check {env:INCLUDE_PSL_FILES} + flake8 --show-source {env:INCLUDE_PSL_FILES} + bandit -q -r {env:INCLUDE_PSL_FILES} + pydocstyle {env:INCLUDE_PSL_FILES} + +[testenv:docs] +deps = + sphinx>=1.8.4 + -rdoc-requirements.txt +commands = sphinx-build -d docs/_build/doctrees docs docs/_build/html + +[flake8] +max-line-length = 88 +max-complexity = 10 +select = B,C,E,F,W,T4,B9 +# These rules conflict with black. +ignore = E203,W503 + + +[pydocstyle] +convention = numpy +add-select = D212 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy