diff --git a/.gitmodules b/.gitmodules index ec0b01e337..59048d6c03 100644 --- a/.gitmodules +++ b/.gitmodules @@ -11,6 +11,9 @@ [submodule "lib/berkeley-db-1.xx"] path = lib/berkeley-db-1.xx url = https://github.com/pfalcon/berkeley-db-1.xx +[submodule "lib/uzlib"] + path = lib/uzlib + url = https://github.com/pfalcon/uzlib [submodule "tools/uf2"] path = tools/uf2 url = https://github.com/Microsoft/uf2.git @@ -46,3 +49,9 @@ [submodule "ports/atmel-samd/freetouch"] path = ports/atmel-samd/freetouch url = https://github.com/adafruit/Adafruit_FreeTouch.git +[submodule "frozen/Adafruit_CircuitPython_CircuitPlayground"] + path = frozen/Adafruit_CircuitPython_CircuitPlayground + url = https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground.git +[submodule "frozen/Adafruit_CircuitPython_HID"] + path = frozen/Adafruit_CircuitPython_HID + url = https://github.com/adafruit/Adafruit_CircuitPython_HID.git diff --git a/.travis.yml b/.travis.yml index 0bb20b73b5..1e18640c81 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,6 @@ env: - TRAVIS_BOARD=itsybitsy_m4_express - TRAVIS_BOARD=metro_m0_express - TRAVIS_BOARD=metro_m4_express - - TRAVIS_BOARD=metro_m4_express_revb - TRAVIS_BOARD=pirkey_m0 - TRAVIS_BOARD=trinket_m0 - TRAVIS_BOARD=gemma_m0 diff --git a/docs/Makefile b/Makefile similarity index 90% rename from docs/Makefile rename to Makefile index e9c128e900..7251d4d17a 100644 --- a/docs/Makefile +++ b/Makefile @@ -6,13 +6,16 @@ PYTHON = python3 SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = -BUILDDIR = build/$(MICROPY_PORT) -CPYDIFFDIR = ../tools -CPYDIFF = gen-cpydiff.py -GENRSTDIR = genrst +# path to build the generated docs +BUILDDIR = _build +# path to source files to process +SOURCEDIR = . +# path to conf.py +CONFDIR = . # Run "make FORCE= ..." to avoid rebuilding from scratch (and risk # producing incorrect docs). FORCE = -E +VERBOSE = -v # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) @@ -22,9 +25,10 @@ endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +BASEOPTS = -c $(CONFDIR) $(PAPEROPT_$(PAPER)) $(FORCE) $(VERBOSE) $(SPHINXOPTS) $(SOURCEDIR) +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(BASEOPTS) # the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +I18NSPHINXOPTS = $(BASEOPTS) .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext @@ -52,19 +56,12 @@ help: @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " cpydiff to generate the MicroPython differences from CPython" clean: rm -rf $(BUILDDIR)/* - rm -f $(GENRSTDIR)/* -cpydiff: - @echo "Generating MicroPython Differences." - rm -f $(GENRSTDIR)/* - cd $(CPYDIFFDIR) && $(PYTHON) $(CPYDIFF) - -html: cpydiff - $(SPHINXBUILD) $(FORCE) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." @@ -117,30 +114,34 @@ epub: @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." -latex: cpydiff +latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." -latexpdf: cpydiff - $(SPHINXBUILD) $(FORCE) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex +# seems to be malfunctioning +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." -latexpdfja: cpydiff +# seems to be malfunctioning +latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." +# seems to be malfunctioning text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." +# seems to be malfunctioning man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo diff --git a/README.rst b/README.rst index 31c0cce595..6017be207c 100644 --- a/README.rst +++ b/README.rst @@ -31,11 +31,14 @@ Designed for CircuitPython ~~~~~~~~~~~~~~~~~~~~~~~~~~ - `Adafruit CircuitPlayground - Express `__ + Express `__ (`CircuitPython Guide `__) - `Adafruit Feather M0 - Express `__ -- `Adafruit Metro M0 Express `__ -- `Adafruit Gemma M0 `__ + Express `__ (`CircuitPython Guide `__) +- `Adafruit Metro M0 Express `_ (`CircuitPython Guide `__) +- `Adafruit Gemma M0 `__ (`CircuitPython Guide `__) +- `Adafruit ItsyBitsy M0 Express `_ (no CircuitPython Guide yet!) +- `Adafruit Trinket M0 `__ (`CircuitPython Guide `__) +- `Adafruit Metro M4 `__ (`CircuitPython Guide `__) Other ~~~~~ @@ -69,8 +72,15 @@ System `__ under the `CircuitPython category `__ and `MicroPython category `__. An API -reference is also available on `Read the -Docs `__. +reference is also available on `Read the Docs +`__. A collection of awesome +resources can be found at `Awesome CircuitPython `__. + +Specifically useful documentation when starting out: + +- `Welcome to CircuitPython `__ +- `CircuitPython Essentials `__ +- `Example Code `__ Contributing ------------ diff --git a/docs/README.md b/docs/README.md index 15db6aef13..b01ae9d491 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,6 +22,27 @@ preferably in a virtualenv: In `circuitpython/`, build the docs: - sphinx-build -v -b html . _build/html + make html You'll find the index page at `_build/html/index.html`. + +### More flexibility + +Running `make` by itself will list out the multiple doc generating commands available. + +All commands will, by default, run with `-E` (forces a rebuild from scratch of docs) and `-v` (verbosity level 1). This can be customized as desired: + + # will turn OFF the force rebuild + make html FORCE= + + # will turn OFF the verbosity + make html VERBOSE= + + # will turn OFF the force rebuild and make it doubly verbose when running + make html FORCE= VERBOSE="-v -v" + +You can also pass other options to sphinx by using `SPHINXOPTS`. + + make html SPHINXOPTS="-T" + +For more flexibility and customization, take a look at the Makefile for all variables you can pass in and overwrite. diff --git a/docs/library/ubinascii.rst b/docs/library/binascii.rst similarity index 89% rename from docs/library/ubinascii.rst rename to docs/library/binascii.rst index edf4a9fdf5..e4878a6faa 100644 --- a/docs/library/ubinascii.rst +++ b/docs/library/binascii.rst @@ -1,9 +1,7 @@ -:mod:`ubinascii` -- binary/ASCII conversions +:mod:`binascii` -- binary/ASCII conversions ============================================ -.. include:: ../templates/unsupported_in_circuitpython.inc - -.. module:: ubinascii +.. module:: binascii :synopsis: binary/ASCII conversions |see_cpython_module| :mod:`cpython:binascii`. diff --git a/docs/library/ucollections.rst b/docs/library/collections.rst similarity index 90% rename from docs/library/ucollections.rst rename to docs/library/collections.rst index 396ba3c87d..849e8b6944 100644 --- a/docs/library/ucollections.rst +++ b/docs/library/collections.rst @@ -1,9 +1,9 @@ -:mod:`ucollections` -- collection and container types +:mod:`collections` -- collection and container types ===================================================== .. include:: ../templates/unsupported_in_circuitpython.inc -.. module:: ucollections +.. module:: collections :synopsis: collection and container types |see_cpython_module| :mod:`cpython:collections`. @@ -24,7 +24,7 @@ Classes a string with space-separated field named (but this is less efficient). Example of use:: - from ucollections import namedtuple + from collections import namedtuple MyTuple = namedtuple("MyTuple", ("id", "name")) t1 = MyTuple(1, "foo") @@ -38,7 +38,7 @@ Classes added. When ordered dict is iterated over, keys/items are returned in the order they were added:: - from ucollections import OrderedDict + from collections import OrderedDict # To make benefit of ordered keys, OrderedDict should be initialized # from sequence of (key, value) pairs. diff --git a/docs/library/uhashlib.rst b/docs/library/hashlib.rst similarity index 87% rename from docs/library/uhashlib.rst rename to docs/library/hashlib.rst index 0f20413f75..0205d5e6a8 100644 --- a/docs/library/uhashlib.rst +++ b/docs/library/hashlib.rst @@ -1,9 +1,9 @@ -:mod:`uhashlib` -- hashing algorithms +:mod:`hashlib` -- hashing algorithms ===================================== .. include:: ../templates/unsupported_in_circuitpython.inc -.. module:: uhashlib +.. module:: hashlib :synopsis: hashing algorithms |see_cpython_module| :mod:`cpython:hashlib`. @@ -29,15 +29,15 @@ be implemented: Constructors ------------ -.. class:: uhashlib.sha256([data]) +.. class:: hashlib.sha256([data]) Create an SHA256 hasher object and optionally feed ``data`` into it. -.. class:: uhashlib.sha1([data]) +.. class:: hashlib.sha1([data]) Create an SHA1 hasher object and optionally feed ``data`` into it. -.. class:: uhashlib.md5([data]) +.. class:: hashlib.md5([data]) Create an MD5 hasher object and optionally feed ``data`` into it. @@ -55,5 +55,5 @@ Methods .. method:: hash.hexdigest() - This method is NOT implemented. Use ``ubinascii.hexlify(hash.digest())`` + This method is NOT implemented. Use ``binascii.hexlify(hash.digest())`` to achieve a similar effect. diff --git a/docs/library/index.rst b/docs/library/index.rst index 647a25c8a5..c7b6879aa4 100644 --- a/docs/library/index.rst +++ b/docs/library/index.rst @@ -20,10 +20,10 @@ Python standard libraries and micro-libraries array.rst gc.rst sys.rst - ubinascii.rst - ucollections.rst + binascii.rst + collections.rst uerrno.rst - uhashlib.rst + hashlib.rst uheapq.rst uio.rst ujson.rst diff --git a/docs/library/network.rst b/docs/library/network.rst index 60c9756dbb..d25f9f3884 100644 --- a/docs/library/network.rst +++ b/docs/library/network.rst @@ -202,7 +202,7 @@ Methods (ssid, bssid, channel, RSSI, authmode, hidden) *bssid* is hardware address of an access point, in binary form, returned as - bytes object. You can use `ubinascii.hexlify()` to convert it to ASCII form. + bytes object. You can use `binascii.hexlify()` to convert it to ASCII form. There are five values for authmode: diff --git a/extmod/modubinascii.c b/extmod/modubinascii.c index 8256a50cf2..ba4af54f20 100644 --- a/extmod/modubinascii.c +++ b/extmod/modubinascii.c @@ -32,11 +32,20 @@ #include "py/binary.h" #include "extmod/modubinascii.h" +static void check_not_unicode(const mp_obj_t arg) { +#if MICROPY_CPYTHON_COMPAT + if (MP_OBJ_IS_STR(arg)) { + mp_raise_TypeError("a bytes-like object is required"); + } +#endif +} + mp_obj_t mod_binascii_hexlify(size_t n_args, const mp_obj_t *args) { // Second argument is for an extension to allow a separator to be used // between values. const char *sep = NULL; mp_buffer_info_t bufinfo; + check_not_unicode(args[0]); mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ); // Code below assumes non-zero buffer length when computing size with @@ -165,6 +174,7 @@ mp_obj_t mod_binascii_a2b_base64(mp_obj_t data) { MP_DEFINE_CONST_FUN_OBJ_1(mod_binascii_a2b_base64_obj, mod_binascii_a2b_base64); mp_obj_t mod_binascii_b2a_base64(mp_obj_t data) { + check_not_unicode(data); mp_buffer_info_t bufinfo; mp_get_buffer_raise(data, &bufinfo, MP_BUFFER_READ); @@ -218,10 +228,11 @@ mp_obj_t mod_binascii_b2a_base64(mp_obj_t data) { MP_DEFINE_CONST_FUN_OBJ_1(mod_binascii_b2a_base64_obj, mod_binascii_b2a_base64); #if MICROPY_PY_UBINASCII_CRC32 -#include "uzlib/tinf.h" +#include "../../lib/uzlib/src/tinf.h" mp_obj_t mod_binascii_crc32(size_t n_args, const mp_obj_t *args) { mp_buffer_info_t bufinfo; + check_not_unicode(args[0]); mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ); uint32_t crc = (n_args > 1) ? mp_obj_get_int_truncated(args[1]) : 0; crc = uzlib_crc32(bufinfo.buf, bufinfo.len, crc ^ 0xffffffff); @@ -233,7 +244,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_binascii_crc32_obj, 1, 2, mod_binascii_c #if MICROPY_PY_UBINASCII STATIC const mp_rom_map_elem_t mp_module_binascii_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ubinascii) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_binascii) }, { MP_ROM_QSTR(MP_QSTR_hexlify), MP_ROM_PTR(&mod_binascii_hexlify_obj) }, { MP_ROM_QSTR(MP_QSTR_unhexlify), MP_ROM_PTR(&mod_binascii_unhexlify_obj) }, { MP_ROM_QSTR(MP_QSTR_a2b_base64), MP_ROM_PTR(&mod_binascii_a2b_base64_obj) }, diff --git a/extmod/moduhashlib.c b/extmod/moduhashlib.c index 3fad69247e..7ae42a15f1 100644 --- a/extmod/moduhashlib.c +++ b/extmod/moduhashlib.c @@ -36,6 +36,14 @@ #include "lib/axtls/crypto/crypto.h" #endif +static void check_not_unicode(const mp_obj_t arg) { +#if MICROPY_CPYTHON_COMPAT + if (MP_OBJ_IS_STR(arg)) { + mp_raise_TypeError("a bytes-like object is required"); + } +#endif +} + typedef struct _mp_obj_hash_t { mp_obj_base_t base; char state[0]; @@ -70,6 +78,7 @@ STATIC mp_obj_t sha1_make_new(const mp_obj_type_t *type, size_t n_args, size_t n #endif STATIC mp_obj_t hash_update(mp_obj_t self_in, mp_obj_t arg) { + check_not_unicode(arg); mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); mp_buffer_info_t bufinfo; mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ); @@ -80,6 +89,7 @@ MP_DEFINE_CONST_FUN_OBJ_2(hash_update_obj, hash_update); #if MICROPY_PY_UHASHLIB_SHA1 STATIC mp_obj_t sha1_update(mp_obj_t self_in, mp_obj_t arg) { + check_not_unicode(arg); mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); mp_buffer_info_t bufinfo; mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ); @@ -139,7 +149,7 @@ STATIC const mp_obj_type_t sha1_type = { #endif STATIC const mp_rom_map_elem_t mp_module_hashlib_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uhashlib) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_hashlib) }, { MP_ROM_QSTR(MP_QSTR_sha256), MP_ROM_PTR(&sha256_type) }, #if MICROPY_PY_UHASHLIB_SHA1 { MP_ROM_QSTR(MP_QSTR_sha1), MP_ROM_PTR(&sha1_type) }, diff --git a/extmod/moduzlib.c b/extmod/moduzlib.c index e9af07370e..3d2ab88af1 100644 --- a/extmod/moduzlib.c +++ b/extmod/moduzlib.c @@ -33,7 +33,7 @@ #if MICROPY_PY_UZLIB -#include "uzlib/tinf.h" +#include "../../lib/uzlib/src/tinf.h" #if 0 // print debugging info #define DEBUG_printf DEBUG_printf @@ -215,10 +215,10 @@ const mp_obj_module_t mp_module_uzlib = { // Source files #include'd here to make sure they're compiled in // only if module is enabled by config setting. -#include "uzlib/tinflate.c" -#include "uzlib/tinfzlib.c" -#include "uzlib/tinfgzip.c" -#include "uzlib/adler32.c" -#include "uzlib/crc32.c" +#include "../../lib/uzlib/src/tinflate.c" +#include "../../lib/uzlib/src/tinfzlib.c" +#include "../../lib/uzlib/src/tinfgzip.c" +#include "../../lib/uzlib/src/adler32.c" +#include "../../lib/uzlib/src/crc32.c" #endif // MICROPY_PY_UZLIB diff --git a/extmod/uzlib/adler32.c b/extmod/uzlib/adler32.c deleted file mode 100644 index 1f1759493b..0000000000 --- a/extmod/uzlib/adler32.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Adler-32 checksum - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -/* - * Adler-32 algorithm taken from the zlib source, which is - * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - */ - -#include "tinf.h" - -#define A32_BASE 65521 -#define A32_NMAX 5552 - -uint32_t uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum /* 1 */) -{ - const unsigned char *buf = (const unsigned char *)data; - - unsigned int s1 = prev_sum & 0xffff; - unsigned int s2 = prev_sum >> 16; - - while (length > 0) - { - int k = length < A32_NMAX ? length : A32_NMAX; - int i; - - for (i = k / 16; i; --i, buf += 16) - { - s1 += buf[0]; s2 += s1; s1 += buf[1]; s2 += s1; - s1 += buf[2]; s2 += s1; s1 += buf[3]; s2 += s1; - s1 += buf[4]; s2 += s1; s1 += buf[5]; s2 += s1; - s1 += buf[6]; s2 += s1; s1 += buf[7]; s2 += s1; - - s1 += buf[8]; s2 += s1; s1 += buf[9]; s2 += s1; - s1 += buf[10]; s2 += s1; s1 += buf[11]; s2 += s1; - s1 += buf[12]; s2 += s1; s1 += buf[13]; s2 += s1; - s1 += buf[14]; s2 += s1; s1 += buf[15]; s2 += s1; - } - - for (i = k % 16; i; --i) { s1 += *buf++; s2 += s1; } - - s1 %= A32_BASE; - s2 %= A32_BASE; - - length -= k; - } - - return (s2 << 16) | s1; -} diff --git a/extmod/uzlib/crc32.c b/extmod/uzlib/crc32.c deleted file mode 100644 index e24c643b6a..0000000000 --- a/extmod/uzlib/crc32.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * CRC32 checksum - * - * Copyright (c) 1998-2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -/* - * CRC32 algorithm taken from the zlib source, which is - * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - */ - -#include "tinf.h" - -static const unsigned int tinf_crc32tab[16] = { - 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, - 0x6b6b51f4, 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, - 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, - 0xbdbdf21c -}; - -/* crc is previous value for incremental computation, 0xffffffff initially */ -uint32_t uzlib_crc32(const void *data, unsigned int length, uint32_t crc) -{ - const unsigned char *buf = (const unsigned char *)data; - unsigned int i; - - for (i = 0; i < length; ++i) - { - crc ^= buf[i]; - crc = tinf_crc32tab[crc & 0x0f] ^ (crc >> 4); - crc = tinf_crc32tab[crc & 0x0f] ^ (crc >> 4); - } - - // return value suitable for passing in next time, for final value invert it - return crc/* ^ 0xffffffff*/; -} diff --git a/extmod/uzlib/tinf.h b/extmod/uzlib/tinf.h deleted file mode 100644 index 106203a099..0000000000 --- a/extmod/uzlib/tinf.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2016 by Paul Sokolovsky - */ - -#ifndef TINF_H_INCLUDED -#define TINF_H_INCLUDED - -#include - -/* calling convention */ -#ifndef TINFCC - #ifdef __WATCOMC__ - #define TINFCC __cdecl - #else - #define TINFCC - #endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* ok status, more data produced */ -#define TINF_OK 0 -/* end of compressed stream reached */ -#define TINF_DONE 1 -#define TINF_DATA_ERROR (-3) -#define TINF_CHKSUM_ERROR (-4) -#define TINF_DICT_ERROR (-5) - -/* checksum types */ -#define TINF_CHKSUM_NONE 0 -#define TINF_CHKSUM_ADLER 1 -#define TINF_CHKSUM_CRC 2 - -/* data structures */ - -typedef struct { - unsigned short table[16]; /* table of code length counts */ - unsigned short trans[288]; /* code -> symbol translation table */ -} TINF_TREE; - -struct TINF_DATA; -typedef struct TINF_DATA { - const unsigned char *source; - /* If source above is NULL, this function will be used to read - next byte from source stream */ - unsigned char (*readSource)(struct TINF_DATA *data); - - unsigned int tag; - unsigned int bitcount; - - /* Buffer start */ - unsigned char *destStart; - /* Buffer total size */ - unsigned int destSize; - /* Current pointer in buffer */ - unsigned char *dest; - /* Remaining bytes in buffer */ - unsigned int destRemaining; - - /* Accumulating checksum */ - unsigned int checksum; - char checksum_type; - - int btype; - int bfinal; - unsigned int curlen; - int lzOff; - unsigned char *dict_ring; - unsigned int dict_size; - unsigned int dict_idx; - - TINF_TREE ltree; /* dynamic length/symbol tree */ - TINF_TREE dtree; /* dynamic distance tree */ -} TINF_DATA; - -#define TINF_PUT(d, c) \ - { \ - *d->dest++ = c; \ - if (d->dict_ring) { d->dict_ring[d->dict_idx++] = c; if (d->dict_idx == d->dict_size) d->dict_idx = 0; } \ - } - -unsigned char TINFCC uzlib_get_byte(TINF_DATA *d); - -/* Decompression API */ - -void TINFCC uzlib_init(void); -void TINFCC uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen); -int TINFCC uzlib_uncompress(TINF_DATA *d); -int TINFCC uzlib_uncompress_chksum(TINF_DATA *d); - -int TINFCC uzlib_zlib_parse_header(TINF_DATA *d); -int TINFCC uzlib_gzip_parse_header(TINF_DATA *d); - -/* Compression API */ - -void TINFCC uzlib_compress(void *data, const uint8_t *src, unsigned slen); - -/* Checksum API */ - -/* prev_sum is previous value for incremental computation, 1 initially */ -uint32_t TINFCC uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum); -/* crc is previous value for incremental computation, 0xffffffff initially */ -uint32_t TINFCC uzlib_crc32(const void *data, unsigned int length, uint32_t crc); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* TINF_H_INCLUDED */ diff --git a/extmod/uzlib/tinfgzip.c b/extmod/uzlib/tinfgzip.c deleted file mode 100644 index f1afdd0b8d..0000000000 --- a/extmod/uzlib/tinfgzip.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * tinfgzip - tiny gzip decompressor - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2016 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include "tinf.h" - -#define FTEXT 1 -#define FHCRC 2 -#define FEXTRA 4 -#define FNAME 8 -#define FCOMMENT 16 - -void tinf_skip_bytes(TINF_DATA *d, int num); -uint16_t tinf_get_uint16(TINF_DATA *d); - -void tinf_skip_bytes(TINF_DATA *d, int num) -{ - while (num--) uzlib_get_byte(d); -} - -uint16_t tinf_get_uint16(TINF_DATA *d) -{ - unsigned int v = uzlib_get_byte(d); - v = (uzlib_get_byte(d) << 8) | v; - return v; -} - -int uzlib_gzip_parse_header(TINF_DATA *d) -{ - unsigned char flg; - - /* -- check format -- */ - - /* check id bytes */ - if (uzlib_get_byte(d) != 0x1f || uzlib_get_byte(d) != 0x8b) return TINF_DATA_ERROR; - - /* check method is deflate */ - if (uzlib_get_byte(d) != 8) return TINF_DATA_ERROR; - - /* get flag byte */ - flg = uzlib_get_byte(d); - - /* check that reserved bits are zero */ - if (flg & 0xe0) return TINF_DATA_ERROR; - - /* -- find start of compressed data -- */ - - /* skip rest of base header of 10 bytes */ - tinf_skip_bytes(d, 6); - - /* skip extra data if present */ - if (flg & FEXTRA) - { - unsigned int xlen = tinf_get_uint16(d); - tinf_skip_bytes(d, xlen); - } - - /* skip file name if present */ - if (flg & FNAME) { while (uzlib_get_byte(d)); } - - /* skip file comment if present */ - if (flg & FCOMMENT) { while (uzlib_get_byte(d)); } - - /* check header crc if present */ - if (flg & FHCRC) - { - /*unsigned int hcrc =*/ tinf_get_uint16(d); - - // TODO: Check! -// if (hcrc != (tinf_crc32(src, start - src) & 0x0000ffff)) -// return TINF_DATA_ERROR; - } - - /* initialize for crc32 checksum */ - d->checksum_type = TINF_CHKSUM_CRC; - d->checksum = ~0; - - return TINF_OK; -} diff --git a/extmod/uzlib/tinflate.c b/extmod/uzlib/tinflate.c deleted file mode 100644 index 58850eb4a2..0000000000 --- a/extmod/uzlib/tinflate.c +++ /dev/null @@ -1,551 +0,0 @@ -/* - * tinflate - tiny inflate - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2016 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include -#include "tinf.h" - -uint32_t tinf_get_le_uint32(TINF_DATA *d); -uint32_t tinf_get_be_uint32(TINF_DATA *d); - -/* --------------------------------------------------- * - * -- uninitialized global data (static structures) -- * - * --------------------------------------------------- */ - -#ifdef RUNTIME_BITS_TABLES - -/* extra bits and base tables for length codes */ -unsigned char length_bits[30]; -unsigned short length_base[30]; - -/* extra bits and base tables for distance codes */ -unsigned char dist_bits[30]; -unsigned short dist_base[30]; - -#else - -const unsigned char length_bits[30] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, - 5, 5, 5, 5 -}; -const unsigned short length_base[30] = { - 3, 4, 5, 6, 7, 8, 9, 10, - 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, - 131, 163, 195, 227, 258 -}; - -const unsigned char dist_bits[30] = { - 0, 0, 0, 0, 1, 1, 2, 2, - 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, - 11, 11, 12, 12, 13, 13 -}; -const unsigned short dist_base[30] = { - 1, 2, 3, 4, 5, 7, 9, 13, - 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, - 4097, 6145, 8193, 12289, 16385, 24577 -}; - -#endif - -/* special ordering of code length codes */ -const unsigned char clcidx[] = { - 16, 17, 18, 0, 8, 7, 9, 6, - 10, 5, 11, 4, 12, 3, 13, 2, - 14, 1, 15 -}; - -/* ----------------------- * - * -- utility functions -- * - * ----------------------- */ - -#ifdef RUNTIME_BITS_TABLES -/* build extra bits and base tables */ -static void tinf_build_bits_base(unsigned char *bits, unsigned short *base, int delta, int first) -{ - int i, sum; - - /* build bits table */ - for (i = 0; i < delta; ++i) bits[i] = 0; - for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta; - - /* build base table */ - for (sum = first, i = 0; i < 30; ++i) - { - base[i] = sum; - sum += 1 << bits[i]; - } -} -#endif - -/* build the fixed huffman trees */ -static void tinf_build_fixed_trees(TINF_TREE *lt, TINF_TREE *dt) -{ - int i; - - /* build fixed length tree */ - for (i = 0; i < 7; ++i) lt->table[i] = 0; - - lt->table[7] = 24; - lt->table[8] = 152; - lt->table[9] = 112; - - for (i = 0; i < 24; ++i) lt->trans[i] = 256 + i; - for (i = 0; i < 144; ++i) lt->trans[24 + i] = i; - for (i = 0; i < 8; ++i) lt->trans[24 + 144 + i] = 280 + i; - for (i = 0; i < 112; ++i) lt->trans[24 + 144 + 8 + i] = 144 + i; - - /* build fixed distance tree */ - for (i = 0; i < 5; ++i) dt->table[i] = 0; - - dt->table[5] = 32; - - for (i = 0; i < 32; ++i) dt->trans[i] = i; -} - -/* given an array of code lengths, build a tree */ -static void tinf_build_tree(TINF_TREE *t, const unsigned char *lengths, unsigned int num) -{ - unsigned short offs[16]; - unsigned int i, sum; - - /* clear code length count table */ - for (i = 0; i < 16; ++i) t->table[i] = 0; - - /* scan symbol lengths, and sum code length counts */ - for (i = 0; i < num; ++i) t->table[lengths[i]]++; - - t->table[0] = 0; - - /* compute offset table for distribution sort */ - for (sum = 0, i = 0; i < 16; ++i) - { - offs[i] = sum; - sum += t->table[i]; - } - - /* create code->symbol translation table (symbols sorted by code) */ - for (i = 0; i < num; ++i) - { - if (lengths[i]) t->trans[offs[lengths[i]]++] = i; - } -} - -/* ---------------------- * - * -- decode functions -- * - * ---------------------- */ - -unsigned char uzlib_get_byte(TINF_DATA *d) -{ - if (d->source) { - return *d->source++; - } - return d->readSource(d); -} - -uint32_t tinf_get_le_uint32(TINF_DATA *d) -{ - uint32_t val = 0; - int i; - for (i = 4; i--;) { - val = val >> 8 | uzlib_get_byte(d) << 24; - } - return val; -} - -uint32_t tinf_get_be_uint32(TINF_DATA *d) -{ - uint32_t val = 0; - int i; - for (i = 4; i--;) { - val = val << 8 | uzlib_get_byte(d); - } - return val; -} - -/* get one bit from source stream */ -static int tinf_getbit(TINF_DATA *d) -{ - unsigned int bit; - - /* check if tag is empty */ - if (!d->bitcount--) - { - /* load next tag */ - d->tag = uzlib_get_byte(d); - d->bitcount = 7; - } - - /* shift bit out of tag */ - bit = d->tag & 0x01; - d->tag >>= 1; - - return bit; -} - -/* read a num bit value from a stream and add base */ -static unsigned int tinf_read_bits(TINF_DATA *d, int num, int base) -{ - unsigned int val = 0; - - /* read num bits */ - if (num) - { - unsigned int limit = 1 << (num); - unsigned int mask; - - for (mask = 1; mask < limit; mask *= 2) - if (tinf_getbit(d)) val += mask; - } - - return val + base; -} - -/* given a data stream and a tree, decode a symbol */ -static int tinf_decode_symbol(TINF_DATA *d, TINF_TREE *t) -{ - int sum = 0, cur = 0, len = 0; - - /* get more bits while code value is above sum */ - do { - - cur = 2*cur + tinf_getbit(d); - - ++len; - - sum += t->table[len]; - cur -= t->table[len]; - - } while (cur >= 0); - - return t->trans[sum + cur]; -} - -/* given a data stream, decode dynamic trees from it */ -static void tinf_decode_trees(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) -{ - unsigned char lengths[288+32]; - unsigned int hlit, hdist, hclen; - unsigned int i, num, length; - - /* get 5 bits HLIT (257-286) */ - hlit = tinf_read_bits(d, 5, 257); - - /* get 5 bits HDIST (1-32) */ - hdist = tinf_read_bits(d, 5, 1); - - /* get 4 bits HCLEN (4-19) */ - hclen = tinf_read_bits(d, 4, 4); - - for (i = 0; i < 19; ++i) lengths[i] = 0; - - /* read code lengths for code length alphabet */ - for (i = 0; i < hclen; ++i) - { - /* get 3 bits code length (0-7) */ - unsigned int clen = tinf_read_bits(d, 3, 0); - - lengths[clcidx[i]] = clen; - } - - /* build code length tree, temporarily use length tree */ - tinf_build_tree(lt, lengths, 19); - - /* decode code lengths for the dynamic trees */ - for (num = 0; num < hlit + hdist; ) - { - int sym = tinf_decode_symbol(d, lt); - - switch (sym) - { - case 16: - /* copy previous code length 3-6 times (read 2 bits) */ - { - unsigned char prev = lengths[num - 1]; - for (length = tinf_read_bits(d, 2, 3); length; --length) - { - lengths[num++] = prev; - } - } - break; - case 17: - /* repeat code length 0 for 3-10 times (read 3 bits) */ - for (length = tinf_read_bits(d, 3, 3); length; --length) - { - lengths[num++] = 0; - } - break; - case 18: - /* repeat code length 0 for 11-138 times (read 7 bits) */ - for (length = tinf_read_bits(d, 7, 11); length; --length) - { - lengths[num++] = 0; - } - break; - default: - /* values 0-15 represent the actual code lengths */ - lengths[num++] = sym; - break; - } - } - - /* build dynamic trees */ - tinf_build_tree(lt, lengths, hlit); - tinf_build_tree(dt, lengths + hlit, hdist); -} - -/* ----------------------------- * - * -- block inflate functions -- * - * ----------------------------- */ - -/* given a stream and two trees, inflate a block of data */ -static int tinf_inflate_block_data(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) -{ - if (d->curlen == 0) { - unsigned int offs; - int dist; - int sym = tinf_decode_symbol(d, lt); - //printf("huff sym: %02x\n", sym); - - /* literal byte */ - if (sym < 256) { - TINF_PUT(d, sym); - return TINF_OK; - } - - /* end of block */ - if (sym == 256) { - return TINF_DONE; - } - - /* substring from sliding dictionary */ - sym -= 257; - /* possibly get more bits from length code */ - d->curlen = tinf_read_bits(d, length_bits[sym], length_base[sym]); - - dist = tinf_decode_symbol(d, dt); - /* possibly get more bits from distance code */ - offs = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); - if (d->dict_ring) { - if (offs > d->dict_size) { - return TINF_DICT_ERROR; - } - d->lzOff = d->dict_idx - offs; - if (d->lzOff < 0) { - d->lzOff += d->dict_size; - } - } else { - d->lzOff = -offs; - } - } - - /* copy next byte from dict substring */ - if (d->dict_ring) { - TINF_PUT(d, d->dict_ring[d->lzOff]); - if ((unsigned)++d->lzOff == d->dict_size) { - d->lzOff = 0; - } - } else { - d->dest[0] = d->dest[d->lzOff]; - d->dest++; - } - d->curlen--; - return TINF_OK; -} - -/* inflate an uncompressed block of data */ -static int tinf_inflate_uncompressed_block(TINF_DATA *d) -{ - if (d->curlen == 0) { - unsigned int length, invlength; - - /* get length */ - length = uzlib_get_byte(d) + 256 * uzlib_get_byte(d); - /* get one's complement of length */ - invlength = uzlib_get_byte(d) + 256 * uzlib_get_byte(d); - /* check length */ - if (length != (~invlength & 0x0000ffff)) return TINF_DATA_ERROR; - - /* increment length to properly return TINF_DONE below, without - producing data at the same time */ - d->curlen = length + 1; - - /* make sure we start next block on a byte boundary */ - d->bitcount = 0; - } - - if (--d->curlen == 0) { - return TINF_DONE; - } - - unsigned char c = uzlib_get_byte(d); - TINF_PUT(d, c); - return TINF_OK; -} - -/* ---------------------- * - * -- public functions -- * - * ---------------------- */ - -/* initialize global (static) data */ -void uzlib_init(void) -{ -#ifdef RUNTIME_BITS_TABLES - /* build extra bits and base tables */ - tinf_build_bits_base(length_bits, length_base, 4, 3); - tinf_build_bits_base(dist_bits, dist_base, 2, 1); - - /* fix a special case */ - length_bits[28] = 0; - length_base[28] = 258; -#endif -} - -/* initialize decompression structure */ -void uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen) -{ - d->bitcount = 0; - d->bfinal = 0; - d->btype = -1; - d->dict_size = dictLen; - d->dict_ring = dict; - d->dict_idx = 0; - d->curlen = 0; -} - -/* inflate next byte of compressed stream */ -int uzlib_uncompress(TINF_DATA *d) -{ - do { - int res; - - /* start a new block */ - if (d->btype == -1) { -next_blk: - /* read final block flag */ - d->bfinal = tinf_getbit(d); - /* read block type (2 bits) */ - d->btype = tinf_read_bits(d, 2, 0); - - //printf("Started new block: type=%d final=%d\n", d->btype, d->bfinal); - - if (d->btype == 1) { - /* build fixed huffman trees */ - tinf_build_fixed_trees(&d->ltree, &d->dtree); - } else if (d->btype == 2) { - /* decode trees from stream */ - tinf_decode_trees(d, &d->ltree, &d->dtree); - } - } - - /* process current block */ - switch (d->btype) - { - case 0: - /* decompress uncompressed block */ - res = tinf_inflate_uncompressed_block(d); - break; - case 1: - case 2: - /* decompress block with fixed/dyanamic huffman trees */ - /* trees were decoded previously, so it's the same routine for both */ - res = tinf_inflate_block_data(d, &d->ltree, &d->dtree); - break; - default: - return TINF_DATA_ERROR; - } - - if (res == TINF_DONE && !d->bfinal) { - /* the block has ended (without producing more data), but we - can't return without data, so start procesing next block */ - goto next_blk; - } - - if (res != TINF_OK) { - return res; - } - - } while (--d->destSize); - - return TINF_OK; -} - -int uzlib_uncompress_chksum(TINF_DATA *d) -{ - int res; - unsigned char *data = d->dest; - - res = uzlib_uncompress(d); - - if (res < 0) return res; - - switch (d->checksum_type) { - - case TINF_CHKSUM_ADLER: - d->checksum = uzlib_adler32(data, d->dest - data, d->checksum); - break; - - case TINF_CHKSUM_CRC: - d->checksum = uzlib_crc32(data, d->dest - data, d->checksum); - break; - } - - if (res == TINF_DONE) { - unsigned int val; - - switch (d->checksum_type) { - - case TINF_CHKSUM_ADLER: - val = tinf_get_be_uint32(d); - if (d->checksum != val) { - return TINF_CHKSUM_ERROR; - } - break; - - case TINF_CHKSUM_CRC: - val = tinf_get_le_uint32(d); - if (~d->checksum != val) { - return TINF_CHKSUM_ERROR; - } - // Uncompressed size. TODO: Check - val = tinf_get_le_uint32(d); - break; - } - } - - return res; -} diff --git a/extmod/uzlib/tinfzlib.c b/extmod/uzlib/tinfzlib.c deleted file mode 100644 index 74fade3b9d..0000000000 --- a/extmod/uzlib/tinfzlib.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * tinfzlib - tiny zlib decompressor - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2016 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include "tinf.h" - -int uzlib_zlib_parse_header(TINF_DATA *d) -{ - unsigned char cmf, flg; - - /* -- get header bytes -- */ - - cmf = uzlib_get_byte(d); - flg = uzlib_get_byte(d); - - /* -- check format -- */ - - /* check checksum */ - if ((256*cmf + flg) % 31) return TINF_DATA_ERROR; - - /* check method is deflate */ - if ((cmf & 0x0f) != 8) return TINF_DATA_ERROR; - - /* check window size is valid */ - if ((cmf >> 4) > 7) return TINF_DATA_ERROR; - - /* check there is no preset dictionary */ - if (flg & 0x20) return TINF_DATA_ERROR; - - /* initialize for adler32 checksum */ - d->checksum_type = TINF_CHKSUM_ADLER; - d->checksum = 1; - - return cmf >> 4; -} diff --git a/frozen/Adafruit_CircuitPython_BusDevice b/frozen/Adafruit_CircuitPython_BusDevice index 39f28ed4e0..de2d0d33ca 160000 --- a/frozen/Adafruit_CircuitPython_BusDevice +++ b/frozen/Adafruit_CircuitPython_BusDevice @@ -1 +1 @@ -Subproject commit 39f28ed4e0e5a06fc33fd01c1efc8c52c4140f03 +Subproject commit de2d0d33cace54532467e411128521dfc8d253c3 diff --git a/frozen/Adafruit_CircuitPython_CircuitPlayground b/frozen/Adafruit_CircuitPython_CircuitPlayground new file mode 160000 index 0000000000..a669915237 --- /dev/null +++ b/frozen/Adafruit_CircuitPython_CircuitPlayground @@ -0,0 +1 @@ +Subproject commit a669915237545638c64f89400f368a91c408cd5d diff --git a/frozen/Adafruit_CircuitPython_HID b/frozen/Adafruit_CircuitPython_HID new file mode 160000 index 0000000000..90e4ca931a --- /dev/null +++ b/frozen/Adafruit_CircuitPython_HID @@ -0,0 +1 @@ +Subproject commit 90e4ca931a991718985e655bdcd527c1b0543f55 diff --git a/frozen/Adafruit_CircuitPython_LIS3DH b/frozen/Adafruit_CircuitPython_LIS3DH index fa00b61d1b..d5491cded0 160000 --- a/frozen/Adafruit_CircuitPython_LIS3DH +++ b/frozen/Adafruit_CircuitPython_LIS3DH @@ -1 +1 @@ -Subproject commit fa00b61d1bde90c3cf9cce74388cb9717058b2be +Subproject commit d5491cded0d12716ceb1111ca4c4431111a22df6 diff --git a/frozen/Adafruit_CircuitPython_NeoPixel b/frozen/Adafruit_CircuitPython_NeoPixel index 1142f1c7fd..e9f50cb667 160000 --- a/frozen/Adafruit_CircuitPython_NeoPixel +++ b/frozen/Adafruit_CircuitPython_NeoPixel @@ -1 +1 @@ -Subproject commit 1142f1c7fdc232a46d74dd4f1946a5f462ae2555 +Subproject commit e9f50cb6678a1684591ee021b95a3c4b51786fee diff --git a/frozen/Adafruit_CircuitPython_Thermistor b/frozen/Adafruit_CircuitPython_Thermistor index 2d57c0ba9a..00f4ebca6c 160000 --- a/frozen/Adafruit_CircuitPython_Thermistor +++ b/frozen/Adafruit_CircuitPython_Thermistor @@ -1 +1 @@ -Subproject commit 2d57c0ba9a09d6d30f0ae2b98aba9567c25e6fb6 +Subproject commit 00f4ebca6c740b76c1c464f83d514ac20b0600e1 diff --git a/lib/uzlib b/lib/uzlib new file mode 160000 index 0000000000..27176508e1 --- /dev/null +++ b/lib/uzlib @@ -0,0 +1 @@ +Subproject commit 27176508e188c0900877e810be34198cd88dcb63 diff --git a/logo/1bit-logo.png b/logo/1bit-logo.png deleted file mode 100644 index 42927f3140..0000000000 Binary files a/logo/1bit-logo.png and /dev/null differ diff --git a/logo/FONT-LICENSE.txt b/logo/FONT-LICENSE.txt deleted file mode 100644 index 69c49d84c8..0000000000 --- a/logo/FONT-LICENSE.txt +++ /dev/null @@ -1,97 +0,0 @@ -The font used for the MicroPython logo is "Exo", -http://www.google.com/fonts/specimen/Exo. - -Copyright (c) 2013, Natanael Gama (https://plus.google.com/u/0/+NatanaelGama), -with Reserved Font Name Exo. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/logo/adafruit_blinka_angles-back.svg b/logo/adafruit_blinka_angles-back.svg new file mode 100644 index 0000000000..589ed6f0a6 --- /dev/null +++ b/logo/adafruit_blinka_angles-back.svg @@ -0,0 +1,371 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_blinka_angles-front.svg b/logo/adafruit_blinka_angles-front.svg new file mode 100644 index 0000000000..f09ce38607 --- /dev/null +++ b/logo/adafruit_blinka_angles-front.svg @@ -0,0 +1,416 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_blinka_angles-left.svg b/logo/adafruit_blinka_angles-left.svg new file mode 100644 index 0000000000..32c83c4074 --- /dev/null +++ b/logo/adafruit_blinka_angles-left.svg @@ -0,0 +1,5876 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_blinka_angles-right.svg b/logo/adafruit_blinka_angles-right.svg new file mode 100644 index 0000000000..51f9279aac --- /dev/null +++ b/logo/adafruit_blinka_angles-right.svg @@ -0,0 +1,481 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_blinka_computer.svg b/logo/adafruit_blinka_computer.svg new file mode 100644 index 0000000000..31753081ae --- /dev/null +++ b/logo/adafruit_blinka_computer.svg @@ -0,0 +1,621 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_circuit_python_ourboros_color.svg b/logo/adafruit_circuit_python_ourboros_color.svg new file mode 100644 index 0000000000..d1177ef224 --- /dev/null +++ b/logo/adafruit_circuit_python_ourboros_color.svg @@ -0,0 +1,555 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_circuit_python_ouroboros_logo_final.svg b/logo/adafruit_circuit_python_ouroboros_logo_final.svg new file mode 100644 index 0000000000..051966d4ac --- /dev/null +++ b/logo/adafruit_circuit_python_ouroboros_logo_final.svg @@ -0,0 +1,96 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_circuit_python_sitting_color.svg b/logo/adafruit_circuit_python_sitting_color.svg new file mode 100644 index 0000000000..6da7f5ca86 --- /dev/null +++ b/logo/adafruit_circuit_python_sitting_color.svg @@ -0,0 +1,606 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/adafruit_circuit_python_stacked_lockup_logo_final.svg b/logo/adafruit_circuit_python_stacked_lockup_logo_final.svg new file mode 100644 index 0000000000..3fbce7126e --- /dev/null +++ b/logo/adafruit_circuit_python_stacked_lockup_logo_final.svg @@ -0,0 +1,77 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/awesome_circuitpython.svg b/logo/awesome_circuitpython.svg new file mode 100644 index 0000000000..f60b0c6593 --- /dev/null +++ b/logo/awesome_circuitpython.svg @@ -0,0 +1,636 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/blinka_colorform-cooking.png b/logo/blinka_colorform-cooking.png new file mode 100644 index 0000000000..38b2f53ff4 Binary files /dev/null and b/logo/blinka_colorform-cooking.png differ diff --git a/logo/blinka_colorform-cooking.svg b/logo/blinka_colorform-cooking.svg new file mode 100644 index 0000000000..d108479f75 --- /dev/null +++ b/logo/blinka_colorform-cooking.svg @@ -0,0 +1,1085 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/blinka_colorform-first-birthday.svg b/logo/blinka_colorform-first-birthday.svg new file mode 100644 index 0000000000..37626864c3 --- /dev/null +++ b/logo/blinka_colorform-first-birthday.svg @@ -0,0 +1,886 @@ + +image/svg+xml1 + \ No newline at end of file diff --git a/logo/blinka_colorform-painting.svg b/logo/blinka_colorform-painting.svg new file mode 100644 index 0000000000..c7493207ac --- /dev/null +++ b/logo/blinka_colorform-painting.svg @@ -0,0 +1,1022 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/blinka_colorform-reading.svg b/logo/blinka_colorform-reading.svg new file mode 100644 index 0000000000..761895ac06 --- /dev/null +++ b/logo/blinka_colorform-reading.svg @@ -0,0 +1,906 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/blinka_colorform-singing.svg b/logo/blinka_colorform-singing.svg new file mode 100644 index 0000000000..ec22f43627 --- /dev/null +++ b/logo/blinka_colorform-singing.svg @@ -0,0 +1,1037 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/blinka_colorform-telescope.svg b/logo/blinka_colorform-telescope.svg new file mode 100644 index 0000000000..8b3724171b --- /dev/null +++ b/logo/blinka_colorform-telescope.svg @@ -0,0 +1,965 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/blinka_colorform-test_tubes.svg b/logo/blinka_colorform-test_tubes.svg new file mode 100644 index 0000000000..b6b939d2f0 --- /dev/null +++ b/logo/blinka_colorform-test_tubes.svg @@ -0,0 +1,1217 @@ + +image/svg+xml \ No newline at end of file diff --git a/logo/logo.jpg b/logo/logo.jpg deleted file mode 100644 index 377aa8ac28..0000000000 Binary files a/logo/logo.jpg and /dev/null differ diff --git a/logo/micropythonpowered-art.png b/logo/micropythonpowered-art.png deleted file mode 100644 index 9045bb0a43..0000000000 Binary files a/logo/micropythonpowered-art.png and /dev/null differ diff --git a/logo/trans-logo.png b/logo/trans-logo.png deleted file mode 100644 index b114d90bd8..0000000000 Binary files a/logo/trans-logo.png and /dev/null differ diff --git a/logo/upython-with-micro.jpg b/logo/upython-with-micro.jpg deleted file mode 100644 index 4984d8e2f2..0000000000 Binary files a/logo/upython-with-micro.jpg and /dev/null differ diff --git a/logo/upython-with-micro.png b/logo/upython-with-micro.png deleted file mode 100644 index 2b3431cbdd..0000000000 Binary files a/logo/upython-with-micro.png and /dev/null differ diff --git a/logo/vector-logo-2-BW.svg b/logo/vector-logo-2-BW.svg deleted file mode 100644 index d7ff920f98..0000000000 --- a/logo/vector-logo-2-BW.svg +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/logo/vector-logo-2.png b/logo/vector-logo-2.png deleted file mode 100644 index 72ce88e1d5..0000000000 Binary files a/logo/vector-logo-2.png and /dev/null differ diff --git a/logo/vector-logo-3.png b/logo/vector-logo-3.png deleted file mode 100644 index ba75b05624..0000000000 Binary files a/logo/vector-logo-3.png and /dev/null differ diff --git a/logo/vector-logo-R2000.dxf b/logo/vector-logo-R2000.dxf deleted file mode 100644 index 4b28e7a23d..0000000000 --- a/logo/vector-logo-R2000.dxf +++ /dev/null @@ -1,33724 +0,0 @@ - 0 -SECTION - 2 -HEADER - 9 -$ACADVER - 1 -AC1015 - 9 -$ACADMAINTVER - 70 - 6 - 9 -$DWGCODEPAGE - 3 -ANSI_1252 - 9 -$INSBASE - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$EXTMIN - 10 -0.1721479520991333 - 20 -0.1940338359368368 - 30 -0.0 - 9 -$EXTMAX - 10 -3.827852047900866 - 20 -3.91966423026812 - 30 -0.0 - 9 -$LIMMIN - 10 -0.0 - 20 -0.0 - 9 -$LIMMAX - 10 -12.0 - 20 -9.0 - 9 -$ORTHOMODE - 70 - 0 - 9 -$REGENMODE - 70 - 1 - 9 -$FILLMODE - 70 - 1 - 9 -$QTEXTMODE - 70 - 0 - 9 -$MIRRTEXT - 70 - 0 - 9 -$LTSCALE - 40 -1.0 - 9 -$ATTMODE - 70 - 1 - 9 -$TEXTSIZE - 40 -0.2 - 9 -$TRACEWID - 40 -0.05 - 9 -$TEXTSTYLE - 7 -Standard - 9 -$CLAYER - 8 -0 - 9 -$CELTYPE - 6 -ByLayer - 9 -$CECOLOR - 62 - 256 - 9 -$CELTSCALE - 40 -1.0 - 9 -$DISPSILH - 70 - 0 - 9 -$DIMSCALE - 40 -1.0 - 9 -$DIMASZ - 40 -0.18 - 9 -$DIMEXO - 40 -0.0625 - 9 -$DIMDLI - 40 -0.38 - 9 -$DIMRND - 40 -0.0 - 9 -$DIMDLE - 40 -0.0 - 9 -$DIMEXE - 40 -0.18 - 9 -$DIMTP - 40 -0.0 - 9 -$DIMTM - 40 -0.0 - 9 -$DIMTXT - 40 -0.18 - 9 -$DIMCEN - 40 -0.09 - 9 -$DIMTSZ - 40 -0.0 - 9 -$DIMTOL - 70 - 0 - 9 -$DIMLIM - 70 - 0 - 9 -$DIMTIH - 70 - 1 - 9 -$DIMTOH - 70 - 1 - 9 -$DIMSE1 - 70 - 0 - 9 -$DIMSE2 - 70 - 0 - 9 -$DIMTAD - 70 - 0 - 9 -$DIMZIN - 70 - 0 - 9 -$DIMBLK - 1 - - 9 -$DIMASO - 70 - 1 - 9 -$DIMSHO - 70 - 1 - 9 -$DIMPOST - 1 - - 9 -$DIMAPOST - 1 - - 9 -$DIMALT - 70 - 0 - 9 -$DIMALTD - 70 - 2 - 9 -$DIMALTF - 40 -25.4 - 9 -$DIMLFAC - 40 -1.0 - 9 -$DIMTOFL - 70 - 0 - 9 -$DIMTVP - 40 -0.0 - 9 -$DIMTIX - 70 - 0 - 9 -$DIMSOXD - 70 - 0 - 9 -$DIMSAH - 70 - 0 - 9 -$DIMBLK1 - 1 - - 9 -$DIMBLK2 - 1 - - 9 -$DIMSTYLE - 2 -Standard - 9 -$DIMCLRD - 70 - 0 - 9 -$DIMCLRE - 70 - 0 - 9 -$DIMCLRT - 70 - 0 - 9 -$DIMTFAC - 40 -1.0 - 9 -$DIMGAP - 40 -0.09 - 9 -$DIMJUST - 70 - 0 - 9 -$DIMSD1 - 70 - 0 - 9 -$DIMSD2 - 70 - 0 - 9 -$DIMTOLJ - 70 - 1 - 9 -$DIMTZIN - 70 - 0 - 9 -$DIMALTZ - 70 - 0 - 9 -$DIMALTTZ - 70 - 0 - 9 -$DIMUPT - 70 - 0 - 9 -$DIMDEC - 70 - 4 - 9 -$DIMTDEC - 70 - 4 - 9 -$DIMALTU - 70 - 2 - 9 -$DIMALTTD - 70 - 2 - 9 -$DIMTXSTY - 7 -Standard - 9 -$DIMAUNIT - 70 - 0 - 9 -$DIMADEC - 70 - 0 - 9 -$DIMALTRND - 40 -0.0 - 9 -$DIMAZIN - 70 - 0 - 9 -$DIMDSEP - 70 - 46 - 9 -$DIMATFIT - 70 - 3 - 9 -$DIMFRAC - 70 - 0 - 9 -$DIMLDRBLK - 1 - - 9 -$DIMLUNIT - 70 - 2 - 9 -$DIMLWD - 70 - -2 - 9 -$DIMLWE - 70 - -2 - 9 -$DIMTMOVE - 70 - 0 - 9 -$LUNITS - 70 - 2 - 9 -$LUPREC - 70 - 4 - 9 -$SKETCHINC - 40 -0.1 - 9 -$FILLETRAD - 40 -0.0196850393700787 - 9 -$AUNITS - 70 - 0 - 9 -$AUPREC - 70 - 0 - 9 -$MENU - 1 -. - 9 -$ELEVATION - 40 -0.0 - 9 -$PELEVATION - 40 -0.0 - 9 -$THICKNESS - 40 -0.0 - 9 -$LIMCHECK - 70 - 0 - 9 -$CHAMFERA - 40 -0.0 - 9 -$CHAMFERB - 40 -0.0 - 9 -$CHAMFERC - 40 -0.0 - 9 -$CHAMFERD - 40 -0.0 - 9 -$SKPOLY - 70 - 0 - 9 -$TDCREATE - 40 -2452642.813384259 - 9 -$TDUCREATE - 40 -2452643.063384271 - 9 -$TDUPDATE - 40 -2456660.752361111 - 9 -$TDUUPDATE - 40 -2456661.002361111 - 9 -$TDINDWG - 40 -0.0 - 9 -$TDUSRTIMER - 40 -2456661.001018519 - 9 -$USRTIMER - 70 - 1 - 9 -$ANGBASE - 50 -0.0 - 9 -$ANGDIR - 70 - 0 - 9 -$PDMODE - 70 - 0 - 9 -$PDSIZE - 40 -0.0 - 9 -$PLINEWID - 40 -0.0 - 9 -$SPLFRAME - 70 - 0 - 9 -$SPLINETYPE - 70 - 6 - 9 -$SPLINESEGS - 70 - 8 - 9 -$HANDSEED - 5 -1B45 - 9 -$SURFTAB1 - 70 - 6 - 9 -$SURFTAB2 - 70 - 6 - 9 -$SURFTYPE - 70 - 6 - 9 -$SURFU - 70 - 6 - 9 -$SURFV - 70 - 6 - 9 -$UCSBASE - 2 - - 9 -$UCSNAME - 2 - - 9 -$UCSORG - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSXDIR - 10 -1.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSYDIR - 10 -0.0 - 20 -1.0 - 30 -0.0 - 9 -$UCSORTHOREF - 2 - - 9 -$UCSORTHOVIEW - 70 - 0 - 9 -$UCSORGTOP - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGBOTTOM - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGLEFT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGRIGHT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGFRONT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGBACK - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSBASE - 2 - - 9 -$PUCSNAME - 2 - - 9 -$PUCSORG - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSXDIR - 10 -1.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSYDIR - 10 -0.0 - 20 -1.0 - 30 -0.0 - 9 -$PUCSORTHOREF - 2 - - 9 -$PUCSORTHOVIEW - 70 - 0 - 9 -$PUCSORGTOP - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGBOTTOM - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGLEFT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGRIGHT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGFRONT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGBACK - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$USERI1 - 70 - 0 - 9 -$USERI2 - 70 - 0 - 9 -$USERI3 - 70 - 0 - 9 -$USERI4 - 70 - 0 - 9 -$USERI5 - 70 - 0 - 9 -$USERR1 - 40 -0.0 - 9 -$USERR2 - 40 -0.0 - 9 -$USERR3 - 40 -0.0 - 9 -$USERR4 - 40 -0.0 - 9 -$USERR5 - 40 -0.0 - 9 -$WORLDVIEW - 70 - 1 - 9 -$SHADEDGE - 70 - 3 - 9 -$SHADEDIF - 70 - 70 - 9 -$TILEMODE - 70 - 1 - 9 -$MAXACTVP - 70 - 64 - 9 -$PINSBASE - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PLIMCHECK - 70 - 0 - 9 -$PEXTMIN - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PEXTMAX - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PLIMMIN - 10 -0.0 - 20 -0.0 - 9 -$PLIMMAX - 10 -0.0 - 20 -0.0 - 9 -$UNITMODE - 70 - 0 - 9 -$VISRETAIN - 70 - 1 - 9 -$PLINEGEN - 70 - 0 - 9 -$PSLTSCALE - 70 - 1 - 9 -$TREEDEPTH - 70 - 3020 - 9 -$CMLSTYLE - 2 -Standard - 9 -$CMLJUST - 70 - 0 - 9 -$CMLSCALE - 40 -1.0 - 9 -$PROXYGRAPHICS - 70 - 1 - 9 -$MEASUREMENT - 70 - 0 - 9 -$CELWEIGHT -370 - -1 - 9 -$ENDCAPS -280 - 0 - 9 -$JOINSTYLE -280 - 0 - 9 -$LWDISPLAY -290 - 0 - 9 -$INSUNITS - 70 - 1 - 9 -$HYPERLINKBASE - 1 - - 9 -$STYLESHEET - 1 - - 9 -$XEDIT -290 - 1 - 9 -$CEPSNTYPE -380 - 0 - 9 -$PSTYLEMODE -290 - 1 - 9 -$FINGERPRINTGUID - 2 -{FDEAD576-A652-11D2-9A35-0060089B3A3F} - 9 -$VERSIONGUID - 2 -{FBC2AE19-5C5C-49EC-81BC-71B1A3362A02} - 9 -$EXTNAMES -290 - 1 - 9 -$PSVPSCALE - 40 -0.0 - 9 -$OLESTARTUP -290 - 0 - 0 -ENDSEC - 0 -SECTION - 2 -CLASSES - 0 -CLASS - 1 -ACDBDICTIONARYWDFLT - 2 -AcDbDictionaryWithDefault - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -ACDBPLACEHOLDER - 2 -AcDbPlaceHolder - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -LAYOUT - 2 -AcDbLayout - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -DICTIONARYVAR - 2 -AcDbDictionaryVar - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -TABLESTYLE - 2 -AcDbTableStyle - 3 -ObjectDBX Classes - 90 - 4095 -280 - 0 -281 - 0 - 0 -CLASS - 1 -MATERIAL - 2 -AcDbMaterial - 3 -ObjectDBX Classes - 90 - 1153 -280 - 0 -281 - 0 - 0 -CLASS - 1 -VISUALSTYLE - 2 -AcDbVisualStyle - 3 -ObjectDBX Classes - 90 - 4095 -280 - 0 -281 - 0 - 0 -CLASS - 1 -SCALE - 2 -AcDbScale - 3 -ObjectDBX Classes - 90 - 1153 -280 - 0 -281 - 0 - 0 -CLASS - 1 -CELLSTYLEMAP - 2 -AcDbCellStyleMap - 3 -ObjectDBX Classes - 90 - 1152 -280 - 0 -281 - 0 - 0 -CLASS - 1 -RASTERVARIABLES - 2 -AcDbRasterVariables - 3 -ISM - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -SUN - 2 -AcDbSun - 3 -SCENEOE - 90 - 1153 -280 - 0 -281 - 0 - 0 -CLASS - 1 -IMAGEDEF - 2 -AcDbRasterImageDef - 3 -ISM - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -IMAGE - 2 -AcDbRasterImage - 3 -ISM - 90 - 127 -280 - 0 -281 - 1 - 0 -CLASS - 1 -IMAGEDEF_REACTOR - 2 -AcDbRasterImageDefReactor - 3 -ISM - 90 - 1 -280 - 0 -281 - 0 - 0 -CLASS - 1 -SORTENTSTABLE - 2 -AcDbSortentsTable - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -ENDSEC - 0 -SECTION - 2 -TABLES - 0 -TABLE - 2 -VPORT - 5 -8 -330 -0 -100 -AcDbSymbolTable - 70 - 1 - 0 -VPORT - 5 -94 -330 -8 -100 -AcDbSymbolTableRecord -100 -AcDbViewportTableRecord - 2 -*Active - 70 - 0 - 10 -0.0 - 20 -0.0 - 11 -1.0 - 21 -1.0 - 12 -29.66959356597982 - 22 -21.59555199096451 - 13 -0.0 - 23 -0.0 - 14 -0.5 - 24 -0.5 - 15 -0.5 - 25 -0.5 - 16 -0.0 - 26 -0.0 - 36 -1.0 - 17 --27.66959356597982 - 27 --19.53870295786203 - 37 -0.0 - 40 -3.800143002217909 - 41 -2.172519083969465 - 42 -50.0 - 43 -0.0 - 44 -0.0 - 50 -0.0 - 51 -0.0 - 71 - 16 - 72 - 1000 - 73 - 1 - 74 - 3 - 75 - 0 - 76 - 0 - 77 - 0 - 78 - 1 -281 - 5 - 65 - 1 -110 -0.0 -120 -0.0 -130 -0.0 -111 -1.0 -121 -0.0 -131 -0.0 -112 -0.0 -122 -1.0 -132 -0.0 - 79 - 0 -146 -0.0 - 0 -ENDTAB - 0 -TABLE - 2 -LTYPE - 5 -5 -330 -0 -100 -AcDbSymbolTable - 70 - 1 - 0 -LTYPE - 5 -14 -330 -5 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -ByBlock - 70 - 0 - 3 - - 72 - 65 - 73 - 0 - 40 -0.0 - 0 -LTYPE - 5 -15 -330 -5 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -ByLayer - 70 - 0 - 3 - - 72 - 65 - 73 - 0 - 40 -0.0 - 0 -LTYPE - 5 -16 -330 -5 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -Continuous - 70 - 0 - 3 -Solid line - 72 - 65 - 73 - 0 - 40 -0.0 - 0 -ENDTAB - 0 -TABLE - 2 -LAYER - 5 -2 -102 -{ACAD_XDICTIONARY -360 -133 -102 -} -330 -0 -100 -AcDbSymbolTable - 70 - 8 - 0 -LAYER - 5 -10 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -0 - 70 - 0 - 62 - 7 - 6 -Continuous -370 - -3 -390 -F - 0 -LAYER - 5 -4B2 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -OUTLINE - 70 - 0 - 62 - 3 - 6 -Continuous -370 - -3 -390 -F -1001 -AcAecLayerStandard -1000 - -1000 - - 0 -LAYER - 5 -B85 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -HATCH-BLACK - 70 - 0 - 62 - -178 - 6 -Continuous -370 - -3 -390 -F -1001 -AcAecLayerStandard -1000 - -1000 - - 0 -LAYER - 5 -B86 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -HATCH-RED - 70 - 0 - 62 - -1 - 6 -Continuous -370 - -3 -390 -F -1001 -AcAecLayerStandard -1000 - -1000 - - 0 -LAYER - 5 -B87 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -HATCH-YELLOW - 70 - 0 - 62 - -2 - 6 -Continuous -370 - -3 -390 -F -1001 -AcAecLayerStandard -1000 - -1000 - - 0 -LAYER - 5 -C34 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -HATCH-WHITE - 70 - 0 - 62 - -7 - 6 -Continuous -370 - -3 -390 -F -1001 -AcAecLayerStandard -1000 - -1000 - - 0 -LAYER - 5 -C35 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -CENTERLINE - 70 - 0 - 62 - 5 - 6 -Continuous -370 - -3 -390 -F -1001 -AcAecLayerStandard -1000 - -1000 - - 0 -ENDTAB - 0 -TABLE - 2 -STYLE - 5 -3 -330 -0 -100 -AcDbSymbolTable - 70 - 1 - 0 -STYLE - 5 -11 -330 -3 -100 -AcDbSymbolTableRecord -100 -AcDbTextStyleTableRecord - 2 -Standard - 70 - 0 - 40 -0.0 - 41 -1.0 - 50 -0.0 - 71 - 0 - 42 -0.2 - 3 -arial.ttf - 4 - -1001 -ACAD -1000 -Arial -1071 - 0 - 0 -ENDTAB - 0 -TABLE - 2 -VIEW - 5 -6 -330 -0 -100 -AcDbSymbolTable - 70 - 0 - 0 -ENDTAB - 0 -TABLE - 2 -UCS - 5 -7 -330 -0 -100 -AcDbSymbolTable - 70 - 0 - 0 -ENDTAB - 0 -TABLE - 2 -APPID - 5 -9 -330 -0 -100 -AcDbSymbolTable - 70 - 2 - 0 -APPID - 5 -12 -330 -9 -100 -AcDbSymbolTableRecord -100 -AcDbRegAppTableRecord - 2 -ACAD - 70 - 0 - 0 -APPID - 5 -4B3 -330 -9 -100 -AcDbSymbolTableRecord -100 -AcDbRegAppTableRecord - 2 -AcAecLayerStandard - 70 - 0 - 0 -ENDTAB - 0 -TABLE - 2 -DIMSTYLE - 5 -A -330 -0 -100 -AcDbSymbolTable - 70 - 1 -100 -AcDbDimStyleTable - 0 -DIMSTYLE -105 -27 -330 -A -100 -AcDbSymbolTableRecord -100 -AcDbDimStyleTableRecord - 2 -Standard - 70 - 0 -178 - 0 -340 -11 - 0 -ENDTAB - 0 -TABLE - 2 -BLOCK_RECORD - 5 -1 -330 -0 -100 -AcDbSymbolTable - 70 - 1 - 0 -BLOCK_RECORD - 5 -1F -102 -{ACAD_XDICTIONARY -360 -C3A -102 -} -330 -1 -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Model_Space -340 -22 - 0 -BLOCK_RECORD - 5 -58 -330 -1 -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Paper_Space -340 -59 - 0 -BLOCK_RECORD - 5 -5D -330 -1 -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Paper_Space0 -340 -5E - 0 -ENDTAB - 0 -ENDSEC - 0 -SECTION - 2 -BLOCKS - 0 -BLOCK - 5 -20 -330 -1F -100 -AcDbEntity - 8 -0 -100 -AcDbBlockBegin - 2 -*Model_Space - 70 - 0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Model_Space - 1 -*Model_Space - 0 -ENDBLK - 5 -21 -330 -1F -100 -AcDbEntity - 8 -0 -100 -AcDbBlockEnd - 0 -BLOCK - 5 -5A -330 -58 -100 -AcDbEntity - 67 - 1 - 8 -0 -100 -AcDbBlockBegin - 2 -*Paper_Space - 70 - 0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Paper_Space - 1 -*Paper_Space - 0 -ENDBLK - 5 -5B -330 -58 -100 -AcDbEntity - 67 - 1 - 8 -0 -100 -AcDbBlockEnd - 0 -BLOCK - 5 -5F -330 -5D -100 -AcDbEntity - 8 -0 -100 -AcDbBlockBegin - 2 -*Paper_Space0 - 70 - 0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Paper_Space0 - 1 -*Paper_Space0 - 0 -ENDBLK - 5 -60 -330 -5D -100 -AcDbEntity - 8 -0 -100 -AcDbBlockEnd - 0 -ENDSEC - 0 -SECTION - 2 -ENTITIES - 0 -LWPOLYLINE - 5 -12A -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 12 - 70 - 1 - 43 -0.0 - 10 -2.051456726858387 - 20 -3.24742480916928 - 10 -2.123046084816941 - 20 -3.189691455976897 - 42 -0.4158687069147495 - 10 -2.238512791201705 - 20 -3.202392793679222 - 42 -0.26959558438999 - 10 -2.297400811457934 - 20 -3.601907597770506 - 42 -0.5584229650981822 - 10 -2.131128754263874 - 20 -3.630774274366697 - 42 -0.0728974356199314 - 10 -2.083688019187524 - 20 -3.556961618598168 - 10 -2.102120376925607 - 20 -3.616965010523272 - 42 -0.2082143708428352 - 10 -2.078212672061864 - 20 -3.708788569361961 - 42 -0.3964961476078332 - 10 -1.961304941181418 - 20 -3.726524255462661 - 42 -0.3247796006490571 - 10 -1.824130493996318 - 20 -3.336662468025144 - 42 -0.2118780432517558 - 10 -1.926924729355354 - 20 -3.21641832666371 - 42 -0.2797558288082047 - 10 -2.010060757952385 - 20 -3.224731929523413 - 0 -LWPOLYLINE - 5 -137 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.002382887993199 - 20 -2.593662641184479 - 42 -0.1140103683665206 - 10 -2.015684652568724 - 20 -2.695642836263502 - 0 -LWPOLYLINE - 5 -138 -102 -{ACAD_REACTORS -330 -C20 -330 -C24 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.020828542221933 - 20 -2.58678815101607 - 42 -0.1140103683665206 - 10 -2.035276511011441 - 20 -2.697555911735634 - 42 -1.000000000000011 - 10 -1.996092794126006 - 20 -2.693729760791369 - 42 --0.1140103683665206 - 10 -1.983937233764465 - 20 -2.600537131352887 - 42 -0.9999999999999872 - 0 -LWPOLYLINE - 5 -14D -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.722674860472906 - 20 -2.732887777074972 - 42 -0.0678677703915072 - 10 -1.716999440920682 - 20 -2.659580274525414 - 0 -LWPOLYLINE - 5 -14E -102 -{ACAD_REACTORS -330 -C20 -330 -C25 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -1.697347802700083 - 20 -2.658434024008193 - 42 --0.0678677703915072 - 10 -1.703433819452505 - 20 -2.73704507372698 - 42 --0.999999999999989 - 10 -1.741915901493307 - 20 -2.728730480422965 - 42 -0.0678677703915072 - 10 -1.736651079141282 - 20 -2.660726525042634 - 42 --0.9999999999999999 - 0 -LWPOLYLINE - 5 -164 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 11 - 70 - 0 - 43 -0.0 - 10 -1.811731838460656 - 20 -3.397331983591354 - 42 -0.2124467312467683 - 10 -1.672244722447104 - 20 -3.269516246350102 - 42 -0.1056357518612903 - 10 -1.585025186716269 - 20 -2.838970667001557 - 42 -0.1451314237734208 - 10 -1.646476928687697 - 20 -2.639513658809246 - 42 -0.1600067868781768 - 10 -1.833948673174001 - 20 -2.492097314767818 - 42 -0.1190176972929128 - 10 -1.973432454486796 - 20 -2.47639384269949 - 42 -0.0768957533116813 - 10 -2.089822894522638 - 20 -2.509648254138302 - 42 -0.0709021530444379 - 10 -2.251476283461308 - 20 -2.614030156710129 - 42 -0.2070922264234396 - 10 -2.404700602833892 - 20 -2.933295599864002 - 42 -0.0419975136654783 - 10 -2.393883717863114 - 20 -3.174067136850973 - 42 -0.2398427593227676 - 10 -2.300258287041964 - 20 -3.311026577316722 - 42 -0.027034225506599 - 0 -LWPOLYLINE - 5 -1D5 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.848504434043273 - 20 -2.228690132322405 - 42 --0.3662698243153691 - 10 -1.793291568736173 - 20 -2.065168888754275 - 0 -LWPOLYLINE - 5 -1E1 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 4 - 70 - 0 - 43 -0.0 - 10 -1.838460881357442 - 20 -2.490495972621108 - 42 -0.1790279848154445 - 10 -1.825573029994973 - 20 -2.288268448973123 - 42 -0.0769094708198934 - 10 -1.880276536811822 - 20 -2.173319033432963 - 42 --0.3080726058837938 - 10 -1.880276536811822 - 20 -2.030140317515856 - 0 -LWPOLYLINE - 5 -21B -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.842082767727739 - 20 -1.084629450592382 - 42 -0.1471000450502847 - 10 -2.973927140373517 - 20 -1.328615998752327 - 42 -0.012522411014275 - 0 -LWPOLYLINE - 5 -222 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.698425240848715 - 20 -1.242823919320058 - 42 --0.1015039731478666 - 10 -2.611250576927156 - 20 -1.057272707094957 - 42 --0.0126876031091603 - 0 -LWPOLYLINE - 5 -225 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.242747987090025 - 20 -1.529761688692975 - 42 -0.0725476044851412 - 10 -2.257696032217536 - 20 -1.639194230959991 - 42 -0.0343380551866947 - 0 -LWPOLYLINE - 5 -226 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.495551054582072 - 20 -1.53241438712026 - 42 -0.1036418617890253 - 10 -2.558948542514864 - 20 -1.68753297643855 - 42 -0.053253313175051 - 0 -LWPOLYLINE - 5 -227 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.821324146542795 - 20 -1.632324731905094 - 42 -0.1131246587363501 - 10 -2.830405427290065 - 20 -1.811571024886944 - 42 -0.0627672114645879 - 0 -LWPOLYLINE - 5 -22E -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 13 - 70 - 0 - 43 -0.0 - 10 -2.093724705533888 - 20 -1.557613530636603 - 42 -0.2441872791679012 - 10 -3.026855656910417 - 20 -1.767371768597087 - 42 --0.2679491924311224 - 10 -3.157725822448509 - 20 -1.69686877794936 - 42 --0.1202060689774955 - 10 -3.218222973836714 - 20 -1.510442253718783 - 42 --0.1376749084255927 - 10 -3.164885690739821 - 20 -1.246107314101505 - 42 --0.1576175352251851 - 10 -3.093739724933785 - 20 -1.174961348295469 - 42 --0.0918492106817739 - 10 -2.728380896324767 - 20 -1.066112269787028 - 42 --0.0504127972198909 - 10 -2.347761134221376 - 20 -1.063970822126171 - 42 --0.1916344722089164 - 10 -2.225767565997291 - 20 -1.163124980703929 - 42 --0.1572294045872512 - 10 -2.090834049478103 - 20 -1.818212016772601 - 42 --0.082508630093775 - 10 -2.21598539544255 - 20 -2.26448668874584 - 42 -0.000862340954801 - 10 -2.279411658998576 - 20 -2.40050474988379 - 42 -0.1021773121869368 - 10 -2.404700602833892 - 20 -2.933295599864003 - 42 -0.1021773121869368 - 0 -LWPOLYLINE - 5 -231 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 4 - 70 - 0 - 43 -0.0 - 10 -2.099277124665835 - 20 -3.285428055915363 - 42 -0.5205670505517482 - 10 -2.139077350685995 - 20 -3.338013952617782 - 42 -0.1061689985690478 - 10 -2.120029457222835 - 20 -3.371005871873133 - 42 -0.613270554273111 - 10 -2.068634698539837 - 20 -3.335369986556996 - 0 -LWPOLYLINE - 5 -232 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 4 - 70 - 0 - 43 -0.0 - 10 -1.973661171909946 - 20 -3.292995281984995 - 42 --0.3922502215719873 - 10 -1.946797519362752 - 20 -3.372829517019611 - 42 --0.7101707266102861 - 10 -2.015384873593222 - 20 -3.366828901063208 - 42 --0.0639643640494128 - 10 -2.018358052101874 - 20 -3.342323304531541 - 0 -LWPOLYLINE - 5 -235 -102 -{ACAD_REACTORS -330 -BFB -330 -C40 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 8 - 70 - 1 - 43 -0.0 - 10 -2.098548696321338 - 20 -3.265756498601605 - 42 -0.5205670505517482 - 10 -2.157811705099888 - 20 -3.344057522729578 - 42 -0.1134405246031883 - 10 -2.132468959817252 - 20 -3.3865310504764 - 42 -0.6360781342605795 - 10 -2.049130653843808 - 20 -3.332706714979239 - 42 -0.9999999999999999 - 10 -2.088138743235865 - 20 -3.338033258134752 - 42 --0.5492430075431818 - 10 -2.107983316870547 - 20 -3.354815495403025 - 42 --0.0921948717360171 - 10 -2.120342996272102 - 20 -3.331970382505986 - 42 --0.5205670505517482 - 10 -2.100005553010331 - 20 -3.305099613229121 - 42 -0.999999999999977 - 0 -LWPOLYLINE - 5 -267 -102 -{ACAD_REACTORS -330 -BFC -330 -C40 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 8 - 70 - 1 - 43 -0.0 - 10 -1.998673497536078 - 20 -3.342461458603947 - 42 -0.0639643640494127 - 10 -1.996304467484263 - 20 -3.361987529592359 - 42 -0.7101707266102861 - 10 -1.964747355896155 - 20 -3.364748419109942 - 42 -0.3922502215719873 - 10 -1.983074304769177 - 20 -3.310283824571807 - 42 --0.9999999999999997 - 10 -1.964248039050714 - 20 -3.275706739398183 - 42 --0.3922502215719873 - 10 -1.92884768282935 - 20 -3.380910614929281 - 42 --0.7101707266102861 - 10 -2.034465279702181 - 20 -3.371670272534057 - 42 --0.0639643640494129 - 10 -2.038042606667671 - 20 -3.342185150459134 - 42 --0.9999999999999888 - 0 -LWPOLYLINE - 5 -2AF -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.085608292827229 - 20 -1.648485389947214 - 42 -0.2371550452328881 - 10 -3.038263728075514 - 20 -1.980095333928444 - 42 -0.0363699080748577 - 0 -LWPOLYLINE - 5 -2B5 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.428981511922024 - 20 -1.228952354254482 - 42 --0.1215147796354945 - 10 -2.347761134221376 - 20 -1.063970822126171 - 42 --0.0158934016013214 - 0 -LWPOLYLINE - 5 -34A -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 6 - 70 - 0 - 43 -0.0 - 10 -2.100129120524675 - 20 -1.887439157700382 - 42 -0.1601220285391677 - 10 -2.669056601079002 - 20 -2.103591135847005 - 42 -0.3249446074510534 - 10 -2.710306617856964 - 20 -2.257538294275427 - 42 -0.3057060432679023 - 10 -2.64763418517673 - 20 -2.301422004076068 - 42 -0.1122985838264234 - 10 -2.540456015841269 - 20 -2.279007501710551 - 42 -0.067059303923133 - 10 -2.127272926405246 - 20 -2.017804783046922 - 42 -0.0105768622903034 - 0 -LWPOLYLINE - 5 -34C -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 5 - 70 - 0 - 43 -0.0 - 10 -2.669056601079002 - 20 -2.103591135847005 - 10 -2.735759906135099 - 20 -2.150297292870786 - 42 --0.2679491924311215 - 10 -2.905437956246976 - 20 -2.165142198704758 - 42 --0.3152987888789877 - 10 -3.038801514311188 - 20 -1.93414974025938 - 42 --0.0857659994463428 - 10 -2.98610429311309 - 20 -1.734756081375588 - 42 --0.0017098342482428 - 0 -LWPOLYLINE - 5 -38C -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.169209475319699 - 20 -1.278410952985928 - 42 -0.2549125200517152 - 10 -3.219511504449442 - 20 -1.483099110977059 - 42 -0.0218867276949896 - 0 -LWPOLYLINE - 5 -44D -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.380970941004577 - 20 -3.751630247646181 - 42 -0.2679491924311219 - 10 -2.309791821489833 - 20 -3.828814460633206 - 0 -LWPOLYLINE - 5 -44E -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -2.028658926483394 - 20 -3.899981872009325 - 42 -0.1316524975873958 - 10 -1.971574507059384 - 20 -3.857657770838914 - 0 -LWPOLYLINE - 5 -44F -102 -{ACAD_REACTORS -330 -BFE -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.035890886983224 - 20 -3.881673417068221 - 42 -0.1316524975873958 - 10 -1.986991796041955 - 20 -3.84541816400579 - 42 --1.000000000000004 - 10 -1.956157218076813 - 20 -3.869897377672038 - 42 --0.1316524975873958 - 10 -2.021426965983563 - 20 -3.918290326950429 - 42 --1.0 - 0 -LWPOLYLINE - 5 -451 -102 -{ACAD_REACTORS -330 -BFD -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.36176616039695 - 20 -3.747308537705142 - 42 -0.2679491924311219 - 10 -2.303932141782747 - 20 -3.810021777782375 - 42 --1.000000000000003 - 10 -2.315651501196919 - 20 -3.847607143484037 - 42 --0.2679491924311219 - 10 -2.400175721612204 - 20 -3.755951957587221 - 42 --1.0 - 0 -LWPOLYLINE - 5 -480 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 15 - 70 - 0 - 43 -0.0 - 10 -2.164414868289778 - 20 -1.116788876483231 - 42 --0.1509933859269548 - 10 -2.011994434051636 - 20 -1.339405082556968 - 42 --0.1070963951594745 - 10 -1.964337309124437 - 20 -1.884128513074088 - 42 --0.0569571948585108 - 10 -1.999005825805648 - 20 -2.025855120814207 - 42 -0.1145587361047281 - 10 -2.02996377257399 - 20 -2.271091588487681 - 42 -0.1238858905685379 - 10 -1.988035257076031 - 20 -2.386289238049577 - 42 -0.3726487049030961 - 10 -1.897599265772163 - 20 -2.410521488886157 - 42 -0.1535645609181053 - 10 -1.752129598807603 - 20 -2.273262792103868 - 42 -0.013230494041686 - 10 -1.679912845283239 - 20 -2.135632504011972 - 42 --0.0334295576837925 - 10 -1.547372627715803 - 20 -1.906066113138941 - 42 -0.1212729089747999 - 10 -1.459245452693659 - 20 -1.663938689725279 - 42 -0.142060045402927 - 10 -1.535615350530265 - 20 -1.230823476558462 - 42 -0.2110002865385294 - 10 -1.767733703190374 - 20 -1.036053052451884 - 42 -0.0977925466168199 - 10 -1.905714464335645 - 20 -1.023981300066994 - 42 -0.1523642735345087 - 10 -2.225767565997291 - 20 -1.16312498070393 - 42 -0.0131161693340735 - 0 -LWPOLYLINE - 5 -489 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.726540556633805 - 20 -2.226489993047315 - 42 -0.1491830429238438 - 10 -1.791794192050712 - 20 -2.183894323205893 - 0 -LWPOLYLINE - 5 -48A -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.654521263715424 - 20 -2.085752782994799 - 42 -0.2936017206055124 - 10 -1.910780338072042 - 20 -1.973525769477851 - 0 -LWPOLYLINE - 5 -48B -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.551496630284455 - 20 -1.912244632638939 - 42 -0.2413057746814911 - 10 -1.835672170020508 - 20 -1.78904239903142 - 0 -LWPOLYLINE - 5 -48C -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.460547644534427 - 20 -1.674926403649493 - 42 -0.2628135643200116 - 10 -1.85610884645455 - 20 -1.543874911031386 - 0 -LWPOLYLINE - 5 -48D -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.476099861503821 - 20 -1.396361427764304 - 42 -0.4559232792117359 - 10 -1.995510222782983 - 20 -1.397313095656098 - 42 -0.0249343028351756 - 0 -LWPOLYLINE - 5 -48E -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.940182455435743 - 20 -1.155046537921709 - 42 --0.1735068790932082 - 10 -1.591939878857363 - 20 -1.147027352610094 - 42 --0.0902466536252015 - 0 -LWPOLYLINE - 5 -48F -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 5 - 70 - 0 - 43 -0.0 - 10 -1.685157252816573 - 20 -1.071176985228859 - 42 --0.0967671337827555 - 10 -1.386905873969099 - 20 -1.073654945933856 - 42 --0.1283919655451407 - 10 -0.9396849704065366 - 20 -1.293355139281928 - 42 --0.2277426076900994 - 10 -0.8184698262111015 - 20 -1.571535724136809 - 42 --0.2585706959153292 - 10 -0.9396146897297675 - 20 -1.77228158619182 - 42 --0.0016259949892818 - 0 -LWPOLYLINE - 5 -490 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 6 - 70 - 0 - 43 -0.0 - 10 -1.454805769320285 - 20 -1.564461529127514 - 42 --0.1581711632332484 - 10 -1.079130851571503 - 20 -1.639243530487171 - 42 --0.1439729528407531 - 10 -0.9262274383574314 - 20 -1.795491369527463 - 42 --0.2034041621669866 - 10 -0.9154532561194422 - 20 -1.918640836027165 - 42 --0.194428280448302 - 10 -1.041151067775051 - 20 -2.068441654648967 - 42 --0.1994742666452343 - 10 -1.19286906097098 - 20 -2.082870785844477 - 42 --0.0611756567655047 - 0 -LWPOLYLINE - 5 -492 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 5 - 70 - 0 - 43 -0.0 - 10 -1.527535040931072 - 20 -1.87410829973367 - 42 --0.1177728459219032 - 10 -1.312388080418405 - 20 -1.947278913508062 - 42 --0.1120190572174949 - 10 -1.206886139482316 - 20 -2.052780854444151 - 42 --0.6961980985337713 - 10 -1.357198164134302 - 20 -2.248853535690163 - 42 --0.1138630283068457 - 10 -1.650613743929805 - 20 -2.078374984748495 - 42 --0.0035904482483965 - 0 -LWPOLYLINE - 5 -4AD -102 -{ACAD_REACTORS -330 -BAE -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 5 - 70 - 1 - 43 -0.0 - 10 -2.991096081171635 - 20 -1.314895048081054 - 42 -0.0536325233126152 - 10 -3.198865278725419 - 20 -1.441471338442461 - 42 --0.1019234865027202 - 10 -3.147359585391412 - 20 -1.255070371967993 - 42 --0.1576175352251851 - 10 -3.084776667067298 - 20 -1.19248745364388 - 42 --0.0487853903884156 - 10 -2.898805094451518 - 20 -1.119232145882148 - 42 -0.1091929375390922 - 0 -LWPOLYLINE - 5 -4B5 -102 -{ACAD_REACTORS -330 -BBA -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 6 - 70 - 1 - 43 -0.0 - 10 -2.183868006181016 - 20 -1.294456920706576 - 42 -0.2503802653463202 - 10 -3.199550468590465 - 20 -1.49218169636237 - 42 -0.0087756063211912 - 10 -3.19859257272434 - 20 -1.508976604658183 - 42 -0.1202060689774955 - 10 -3.140975326177503 - 20 -1.686528485415947 - 42 -0.2542613217194215 - 10 -3.034045022847889 - 20 -1.747720550442733 - 42 --0.2349955175811071 - 10 -2.117425810875627 - 20 -1.531432319991749 - 42 -0.0576901279999135 - 0 -LWPOLYLINE - 5 -4B9 -102 -{ACAD_REACTORS -330 -BAD -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 5 - 70 - 1 - 43 -0.0 - 10 -2.714378415408047 - 20 -1.225693872673844 - 42 --0.0759384074577222 - 10 -2.650179425501943 - 20 -1.079126736500261 - 42 -0.0101996300129822 - 10 -2.726291014277126 - 20 -1.085686057566314 - 42 -0.0261370793966787 - 10 -2.832212463468567 - 20 -1.102630606438461 - 42 -0.1222814332374564 - 10 -2.945078532962091 - 20 -1.294462394011187 - 42 --0.0530654994633163 - 0 -LWPOLYLINE - 5 -4BA -102 -{ACAD_REACTORS -330 -BAC -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.385206484967541 - 20 -1.080514837710239 - 42 -0.0878528142492813 - 10 -2.44424140664477 - 20 -1.208278724252974 - 42 -0.0501038956066548 - 10 -2.671374519065504 - 20 -1.218555099887139 - 42 --0.0813315417893164 - 10 -2.600965728709292 - 20 -1.076545040917626 - 42 --0.0288327089816677 - 0 -LWPOLYLINE - 5 -4BC -102 -{ACAD_REACTORS -330 -BAB -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.204441612310571 - 20 -1.2474540192852 - 42 -0.0447207077553119 - 10 -2.404217085512474 - 20 -1.211187767388987 - 42 --0.0963940214031873 - 10 -2.341193762157614 - 20 -1.087133059592365 - 42 --0.1740198039637825 - 10 -2.242925650927047 - 20 -1.172774016895618 - 42 --0.0196351821885444 - 0 -LWPOLYLINE - 5 -4C0 -102 -{ACAD_REACTORS -330 -BAF -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.111590265540881 - 20 -1.573348926544125 - 42 -0.0291422971591348 - 10 -2.228085740598704 - 20 -1.551356274330868 - 42 -0.0473221239695471 - 10 -2.237652044114153 - 20 -1.619229653732975 - 42 --0.0287252676909968 - 10 -2.106626866510892 - 20 -1.626116355527945 - 42 -0.0123842072538969 - 0 -LWPOLYLINE - 5 -4C1 -102 -{ACAD_REACTORS -330 -BB0 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.267503548545168 - 20 -1.547048928709969 - 42 -0.0533543951524521 - 10 -2.484089073429926 - 20 -1.550784222461052 - 42 -0.0768690501849397 - 10 -2.532391987223791 - 20 -1.659393561191435 - 42 --0.0566860153224456 - 10 -2.277093772004332 - 20 -1.620104770218732 - 42 --0.0458852076194563 - 0 -LWPOLYLINE - 5 -4C3 -102 -{ACAD_REACTORS -330 -BB1 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.575978434475863 - 20 -1.672202312238555 - 42 --0.0711923834185597 - 10 -2.534187811152101 - 20 -1.558291292956125 - 42 -0.0701806584121727 - 10 -2.804649062203535 - 20 -1.646049204465365 - 42 -0.0880028594988734 - 10 -2.815004646385387 - 20 -1.779090298343385 - 42 --0.0574665063324246 - 0 -LWPOLYLINE - 5 -4C7 -102 -{ACAD_REACTORS -330 -BBB -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 7 - 70 - 1 - 43 -0.0 - 10 -2.10461778187463 - 20 -1.665965877260762 - 42 --0.0351389292849169 - 10 -2.110402761135924 - 20 -1.8160751267299 - 42 --0.0095038145827776 - 10 -2.117156173606469 - 20 -1.868640946110094 - 42 -0.1557808751637161 - 10 -2.680907394207461 - 20 -2.087858154687554 - 10 -2.747050780866419 - 20 -2.134172252628876 - 42 --0.2679491924311215 - 10 -2.897118699126096 - 20 -2.147301494235533 - 42 --0.2502096061484992 - 10 -3.017490352158867 - 20 -1.987010103205812 - 42 --0.2309255538296563 - 0 -LWPOLYLINE - 5 -4C8 -102 -{ACAD_REACTORS -330 -BBC -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 6 - 70 - 1 - 43 -0.0 - 10 -2.123645620818254 - 20 -1.90852967158985 - 42 -0.1535620368154201 - 10 -2.656669093820602 - 20 -2.118889842946778 - 42 -0.3249446074510534 - 10 -2.691929368331739 - 20 -2.250482978911167 - 42 -0.3057060432679023 - 10 -2.647289746908166 - 20 -2.281739978334781 - 42 -0.1122985838264234 - 10 -2.548658946753702 - 20 -2.261113013747846 - 42 -0.0661825067963756 - 10 -2.144771760651222 - 20 -2.006772737968957 - 42 -0.0180243406510753 - 0 -LWPOLYLINE - 5 -4C9 -102 -{ACAD_REACTORS -330 -C20 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 17 - 70 - 1 - 43 -0.0 - 10 -1.795927086013099 - 20 -3.369886028656918 - 42 -0.1834763883041901 - 10 -1.690295415947398 - 20 -3.261663015221454 - 42 -0.1056357518612903 - 10 -1.604709116716065 - 20 -2.839179652083978 - 42 -0.1451314237734208 - 10 -1.66286553317314 - 20 -2.650418447574797 - 42 -0.1600067868781768 - 10 -1.84068071995552 - 20 -2.510595431459335 - 42 -0.1190176972929128 - 10 -1.970981934519221 - 20 -2.495925758296534 - 42 -0.0768957533116813 - 10 -2.081584776821197 - 20 -2.527526570382813 - 42 -0.0709021530444379 - 10 -2.238571559817636 - 20 -2.628895178831943 - 42 -0.2070922264234396 - 10 -2.385030570405729 - 20 -2.934064104435615 - 42 -0.0419975136654783 - 10 -2.374361839564172 - 20 -3.171537899281493 - 42 -0.2041023265544078 - 10 -2.30953573868931 - 20 -3.281794913306262 - 42 --0.0638786287537656 - 10 -2.253905428386551 - 20 -3.190122198930097 - 42 --0.4158687069147495 - 10 -2.110688753100606 - 20 -3.174368364648643 - 10 -2.049360338450518 - 20 -3.223826763560005 - 10 -2.020698206844207 - 20 -3.208114453397319 - 42 --0.275738643742557 - 10 -1.918435234414153 - 20 -3.198657998664349 - 42 --0.2118780432517558 - 10 -1.805265959929118 - 20 -3.331038401042169 - 42 --0.0269158367577847 - 0 -LWPOLYLINE - 5 -4CB -102 -{ACAD_REACTORS -330 -C28 -330 -C40 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 13 - 70 - 1 - 43 -0.0 - 10 -2.053553115266256 - 20 -3.271022854778554 - 10 -2.135403416533275 - 20 -3.205014547305152 - 42 -0.4158687069147495 - 10 -2.223120154016859 - 20 -3.214663388428346 - 42 -0.26959558438999 - 10 -2.279122382999181 - 20 -3.59460007917116 - 42 -0.5581360462772155 - 10 -2.145920537005866 - 20 -3.617785434351675 - 42 -0.0728307330332283 - 10 -2.101616152707511 - 20 -3.548832485588364 - 42 --0.9381223686609327 - 10 -2.064870809553132 - 20 -3.562742050811843 - 10 -2.082872800905891 - 20 -3.621344458486482 - 42 -0.2046959930292842 - 10 -2.062725504642901 - 20 -3.696637502728181 - 42 -0.3964961476078332 - 10 -1.972491420232154 - 20 -3.71032661793588 - 42 -0.3247796006490571 - 10 -1.842995028063519 - 20 -3.342286535008118 - 42 -0.2118780432517558 - 10 -1.935414224296555 - 20 -3.23417865466307 - 42 -0.2856103122495783 - 10 -1.999267568517967 - 20 -3.241264030153233 - 0 -LWPOLYLINE - 5 -4CD -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.541590875260533 - 20 -1.219181584929098 - 42 --0.2584842710932977 - 10 -0.820082757115996 - 20 -1.522632196851646 - 42 --0.0230272271526239 - 0 -LWPOLYLINE - 5 -4CE -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.458123574270783 - 20 -1.652827431708805 - 42 --0.2951443317480729 - 10 -0.941461714899275 - 20 -1.974891353638494 - 42 --0.0281477710443027 - 0 -LWPOLYLINE - 5 -4CF -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.149191552360515 - 20 -1.154795257187257 - 42 -0.1554073147032292 - 10 -0.735992563639889 - 20 -1.096559104863405 - 42 --0.383579166426189 - 10 -0.9194102381455578 - 20 -1.312304764434089 - 42 --0.023050174561539 - 0 -LWPOLYLINE - 5 -4D0 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.24989523667859 - 20 -1.240900333949516 - 42 -0.1256439210154252 - 10 -1.345357819803049 - 20 -1.083069957917427 - 42 -0.0704007111098051 - 0 -LWPOLYLINE - 5 -4D1 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.037864942416157 - 20 -1.3303917414282 - 42 -0.0872453218025478 - 10 -1.042370972787492 - 20 -1.21582065403204 - 42 -0.0971278145482142 - 0 -LWPOLYLINE - 5 -4D2 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.252136016103313 - 20 -1.688388482710066 - 42 -0.0590285034647111 - 10 -1.266518295486159 - 20 -1.571079816805446 - 42 -0.040710128897272 - 0 -LWPOLYLINE - 5 -4D3 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.052845021272466 - 20 -1.816519721371516 - 42 -0.1113687809723345 - 10 -1.031596064763292 - 20 -1.670646745988808 - 42 -0.1054872080523193 - 0 -LWPOLYLINE - 5 -4E7 -102 -{ACAD_REACTORS -330 -BB6 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -1.055916139802069 - 20 -1.183858027338503 - 42 -0.1086902960134493 - 10 -0.7572717136065252 - 20 -1.127799089885956 - 42 --0.3246303955088655 - 10 -0.9126882033208936 - 20 -1.29130332219202 - 42 -0.0129078914938259 - 10 -0.9268235401588977 - 20 -1.278452643283383 - 42 -0.0398388581973403 - 0 -LWPOLYLINE - 5 -4EB -102 -{ACAD_REACTORS -330 -BA6 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -1.060018004406812 - 20 -1.22781950439698 - 42 --0.056608990335621 - 10 -1.05478008384554 - 20 -1.297904456500116 - 42 -0.0588177228710549 - 10 -1.234398517271265 - 20 -1.224686922587824 - 42 -0.0753850106847673 - 10 -1.287966831577129 - 20 -1.11990052780729 - 42 --0.0655149355972575 - 0 -LWPOLYLINE - 5 -4EE -102 -{ACAD_REACTORS -330 -BB7 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 6 - 70 - 1 - 43 -0.0 - 10 -0.9337884234626875 - 20 -1.745337488462597 - 42 -0.1140426130224996 - 10 -1.069517024899449 - 20 -1.622065780002278 - 42 -0.1496103246747427 - 10 -1.435800351452426 - 20 -1.542762378894283 - 42 -0.098469544262505 - 10 -1.511203238184653 - 20 -1.236207952572697 - 42 --0.2469581287149142 - 10 -0.8391304022153184 - 20 -1.53029339160826 - 42 --0.0306677320577088 - 10 -0.8381414565311932 - 20 -1.570809270042459 - 42 --0.2364748902496887 - 0 -LWPOLYLINE - 5 -4F0 -102 -{ACAD_REACTORS -330 -BA5 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -0.8557672849696794 - 20 -1.451424859785045 - 42 -0.0630395648108045 - 10 -1.01685683292838 - 20 -1.320182987586002 - 42 -0.0445931465006306 - 10 -1.016312593127104 - 20 -1.257746897185134 - 42 --0.0210506403179615 - 10 -0.9525464006541762 - 20 -1.308257635280474 - 42 --0.1329522052869259 - 0 -LWPOLYLINE - 5 -4F3 -102 -{ACAD_REACTORS -330 -C01 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 17 - 70 - 1 - 43 -0.0 - 10 -1.84986913761158 - 20 -2.466300860817559 - 42 -0.0673153145939977 - 10 -1.833988541120499 - 20 -2.395045529905472 - 42 --0.0456048674756574 - 10 -1.889008320037764 - 20 -2.428232966136522 - 42 --0.3726487049030961 - 10 -2.004330972949735 - 20 -2.397332354419744 - 42 --0.1238858905685379 - 10 -2.049545393540757 - 20 -2.273106754812188 - 42 --0.1145587361047281 - 10 -2.017472341220017 - 20 -2.019036867118983 - 42 -0.0569571948585108 - 10 -1.983866015583199 - 20 -1.881652548807571 - 42 -0.1070963951594745 - 10 -2.030796508895675 - 20 -1.345234555651572 - 42 -0.1426114747077699 - 10 -2.165557450307532 - 20 -1.141311124747446 - 42 -0.019413333947305 - 10 -2.200668024179765 - 20 -1.167752668813839 - 42 --0.1534467262547569 - 10 -2.071265337820281 - 20 -1.820348906815302 - 42 --0.082508630093775 - 10 -2.198159065568731 - 20 -2.272836703011166 - 42 -0.000862340954801 - 10 -2.261556633001577 - 20 -2.408793225114376 - 42 -0.0606801155133229 - 10 -2.360970556998814 - 20 -2.715554284918385 - 42 --0.0817679966984111 - 10 -2.264381007104979 - 20 -2.599165134588315 - 42 --0.0709021530444379 - 10 -2.098061012224078 - 20 -2.49176993789379 - 42 --0.0768957533116813 - 10 -1.97588297445437 - 20 -2.456861927102445 - 42 --0.1001198017354382 - 0 -LWPOLYLINE - 5 -4F4 -102 -{ACAD_REACTORS -330 -BB3 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 11 - 70 - 1 - 43 -0.0 - 10 -1.985708655480637 - 20 -1.35859138415058 - 42 --0.3682846044885977 - 10 -1.514588534428652 - 20 -1.333441193996956 - 42 -0.0330251139842943 - 10 -1.553282361892708 - 20 -1.239505497320984 - 42 -0.0639008891509803 - 10 -1.603183045430495 - 20 -1.164065854453502 - 42 -0.1707629002601277 - 10 -1.933126177068946 - 20 -1.17342341770615 - 42 --1.000000000000009 - 10 -1.94723873380254 - 20 -1.136669658137267 - 42 --0.1354090889595181 - 10 -1.663131530982194 - 20 -1.10889954806288 - 42 -0.0869057462878126 - 10 -1.77321598022121 - 20 -1.054959279298051 - 42 -0.0977925466168199 - 10 -1.903598507249911 - 20 -1.043552286261177 - 42 -0.1070337225744706 - 10 -2.131038389154381 - 20 -1.11916439867858 - 42 --0.1361955436546222 - 10 -1.993192359207598 - 20 -1.333575609462363 - 42 --0.0049803061650251 - 0 -LWPOLYLINE - 5 -4F7 -102 -{ACAD_REACTORS -330 -BB4 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 36 - 70 - 1 - 43 -0.0 - 10 -1.800080314455621 - 20 -2.308917195085585 - 42 -0.0437118087611369 - 10 -1.769312650034374 - 20 -2.26365844280057 - 42 -0.0033308209162503 - 10 -1.750572816609542 - 20 -2.229600425683039 - 42 -0.1199820129190778 - 10 -1.797274715454282 - 20 -2.202801058466759 - 42 --0.9999999999999999 - 10 -1.786313668647142 - 20 -2.164987587945027 - 42 --0.1021140647943497 - 10 -1.731552642365071 - 20 -2.193892004093673 - 42 -0.0064323953109214 - 10 -1.697579856645681 - 20 -2.12695048324945 - 42 --0.0055509425268816 - 10 -1.677510563493305 - 20 -2.087231690238655 - 42 -0.2805803818424905 - 10 -1.907675826757856 - 20 -1.99296446245093 - 42 --1.000000000000002 - 10 -1.913884849386228 - 20 -1.954087076504771 - 42 --0.2626963580826674 - 10 -1.65730585773017 - 20 -2.04932297149283 - 42 --0.0197119133471879 - 10 -1.576111447954835 - 20 -1.913814831608159 - 42 -0.229407728918388 - 10 -1.834403866994767 - 20 -1.808686537659429 - 42 --1.000000000000006 - 10 -1.836940473046249 - 20 -1.76939826040341 - 42 --0.2218376429216039 - 10 -1.55389731810562 - 20 -1.879874561474816 - 42 -0.1027759246248995 - 10 -1.481321802657222 - 20 -1.68147851322532 - 42 -0.2567981434431833 - 10 -1.852312329231318 - 20 -1.563190377165427 - 42 --0.9999999999999999 - 10 -1.859905363677781 - 20 -1.524559444897346 - 42 --0.2372321476697851 - 10 -1.476143434862462 - 20 -1.631501691187762 - 42 -0.0739602798598165 - 10 -1.494131551859586 - 20 -1.40568894806263 - 42 -0.4420288920812132 - 10 -1.973843248718476 - 20 -1.402603074502723 - 42 --0.0932841665178725 - 10 -1.944808602665675 - 20 -1.886604477340606 - 42 --0.0569571948585108 - 10 -1.98053931039128 - 20 -2.032673374509431 - 42 -0.1145587361047281 - 10 -2.010382151607223 - 20 -2.269076422163175 - 42 -0.1238858905685379 - 10 -1.971739541202327 - 20 -2.375246121679411 - 42 -0.3726487049030961 - 10 -1.906190211506561 - 20 -2.392810011635793 - 42 -0.0692252662755674 - 10 -1.834372402647776 - 20 -2.344740013080819 - 42 -0.0476713025068407 - 10 -1.844432384008702 - 20 -2.293909862021855 - 42 -0.0769094708198934 - 10 -1.896548904341149 - 20 -2.184396525477287 - 42 --0.3080726058837938 - 10 -1.896548904341149 - 20 -2.019062825471532 - 42 --0.9999999999999999 - 10 -1.864004169282495 - 20 -2.041217809560179 - 42 -0.2582998793018828 - 10 -1.873587490264647 - 20 -2.144928461209456 - 42 --0.2026932661734018 - 10 -1.803462564620088 - 20 -2.048315057803096 - 42 --0.999999999999995 - 10 -1.783120572852258 - 20 -2.082022719705455 - 42 -0.3646986474062371 - 10 -1.830429247500239 - 20 -2.220863495048448 - 42 --0.0379960309145583 - 10 -1.806713675981244 - 20 -2.282627035924392 - 42 --0.0217555693507311 - 0 -LWPOLYLINE - 5 -505 -102 -{ACAD_REACTORS -330 -BB8 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 7 - 70 - 1 - 43 -0.0 - 10 -1.496545734250796 - 20 -1.858090362879029 - 42 -0.0874292139153708 - 10 -1.440409322525223 - 20 -1.672501008241135 - 42 --0.2810079005908725 - 10 -0.963992618224232 - 20 -1.973488406523313 - 42 --0.1221105918102025 - 10 -1.050391027094316 - 20 -2.051059942225276 - 42 --0.1855272393840248 - 10 -1.177801591011496 - 20 -2.066644978446405 - 42 -0.0452485050555582 - 10 -1.190231879786862 - 20 -2.04228626493346 - 42 -0.1120190572174949 - 10 -1.301893490907713 - 20 -1.930624653812608 - 42 -0.1031607726849441 - 0 -LWPOLYLINE - 5 -507 -102 -{ACAD_REACTORS -330 -BA9 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 5 - 70 - 1 - 43 -0.0 - 10 -1.232680305288136 - 20 -1.674823294981787 - 42 -0.0376631697644602 - 10 -1.24092624183496 - 20 -1.596731177563018 - 42 --0.0683286784235571 - 10 -1.088744678243557 - 20 -1.656421280972064 - 42 --0.0308076295927463 - 10 -1.050667583615558 - 20 -1.680925971586079 - 42 --0.0803202890882193 - 10 -1.061814443246697 - 20 -1.780967062069061 - 42 -0.0873178465018551 - 0 -LWPOLYLINE - 5 -509 -102 -{ACAD_REACTORS -330 -BA8 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 5 - 70 - 1 - 43 -0.0 - 10 -1.03011243645825 - 20 -1.811587717464269 - 42 -0.0701949736097343 - 10 -1.011360717734072 - 20 -1.714273589617648 - 42 --0.0772792890158624 - 10 -0.9436091507811217 - 20 -1.804731328846728 - 42 --0.2034041621669866 - 10 -0.9341754033724281 - 20 -1.912559555139139 - 42 --0.021365350595909 - 10 -0.9413736096183022 - 20 -1.931870968260919 - 42 -0.0646639173137995 - 0 -LWPOLYLINE - 5 -50B -102 -{ACAD_REACTORS -330 -BB9 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 6 - 70 - 1 - 43 -0.0 - 10 -1.517012100394491 - 20 -1.895029973752357 - 42 --0.1110664831625005 - 10 -1.322882669929097 - 20 -1.963933173203516 - 42 --0.1120190572174949 - 10 -1.22354039917777 - 20 -2.063275443954843 - 42 --0.6961980985337713 - 10 -1.351388497511153 - 20 -2.230045331397104 - 42 --0.1086664830114359 - 10 -1.62603521686569 - 20 -2.074220841935225 - 42 --0.0233827832969574 - 10 -1.531020271498053 - 20 -1.917025183406504 - 42 -0.0116709324309886 - 0 -LWPOLYLINE - 5 -510 -102 -{ACAD_REACTORS -330 -BB2 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -2.84997659259958 - 20 -1.669588479790926 - 42 -0.0790070326196522 - 10 -2.851886405500074 - 20 -1.80192109397708 - 42 -0.0465967056483061 - 10 -3.018962226551324 - 20 -1.933310565196752 - 42 --0.0825476832350667 - 10 -2.970238833200536 - 20 -1.747438830578402 - 42 --0.0352296221604151 - 0 -LWPOLYLINE - 5 -559 -102 -{ACAD_REACTORS -330 -BA7 -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 5 - 70 - 1 - 43 -0.0 - 10 -1.355385427777645 - 20 -1.100872595462885 - 42 --0.0964781721945481 - 10 -1.280659164315312 - 20 -1.213328327577104 - 42 -0.0761322456062632 - 10 -1.530692586565761 - 20 -1.198306536487731 - 42 -0.0982025130561956 - 10 -1.632063828471465 - 20 -1.082968026772228 - 42 --0.0801281899540377 - 10 -1.390840639583887 - 20 -1.092942724306655 - 42 --0.009398208639944 - 0 -LWPOLYLINE - 5 -620 -102 -{ACAD_REACTORS -330 -BAA -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 4 - 70 - 1 - 43 -0.0 - 10 -1.272750873165488 - 20 -1.660423889558836 - 42 -0.0720111964992741 - 10 -1.436797603060258 - 20 -1.633190144890045 - 42 -0.0157631540077514 - 10 -1.434991753420616 - 20 -1.582208383349729 - 42 --0.0636343006390252 - 10 -1.282776238934902 - 20 -1.588169636138475 - 42 --0.0378416081317004 - 0 -LWPOLYLINE - 5 -8B3 -102 -{ACAD_REACTORS -330 -C28 -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 48 - 70 - 1 - 43 -0.0 - 10 -3.027996198643118 - 20 -1.787090153383295 - 42 --0.2652120571486825 - 10 -3.174476318719514 - 20 -1.707209070482774 - 42 --0.1202060689774955 - 10 -3.237853374949089 - 20 -1.511907902779382 - 42 --0.1376749084255928 - 10 -3.182411796088231 - 20 -1.237144256235018 - 42 --0.1576175352251852 - 10 -3.102702782800273 - 20 -1.157435242947061 - 42 --0.091849210681774 - 10 -2.73047077837241 - 20 -1.046538482007744 - 42 --0.0506776859186796 - 10 -2.34388013009181 - 20 -1.044567731825123 - 42 --0.1678583337512084 - 10 -2.221067012551395 - 20 -1.133620430754517 - 42 --0.1427259380349648 - 10 -1.907830421421379 - 20 -1.004410313872811 - 42 --0.0977925466168198 - 10 -1.762251426159538 - 20 -1.017146825605717 - 42 --0.0554068829065345 - 10 -1.681692239060136 - 20 -1.050537537701288 - 42 --0.0944908669632265 - 10 -1.382971108354313 - 20 -1.054367167561056 - 42 --0.063211812705244 - 10 -1.14310982680291 - 20 -1.135855466777803 - 42 -0.1543252686721255 - 10 -0.7445258947417084 - 20 -1.078819797230121 - 42 --0.5434510775266247 - 10 -0.7163152163407374 - 20 -1.096008851948713 - 42 --0.3401781029993987 - 10 -0.8820862850200285 - 20 -1.324403005153777 - 42 --0.182531460234485 - 10 -0.79879819589101 - 20 -1.572262178231159 - 42 --0.2383486190805098 - 10 -0.9129246094229353 - 20 -1.778768451782942 - 42 --0.0052329189934023 - 10 -0.9088457259337407 - 20 -1.786251410208198 - 42 --0.2034041621669866 - 10 -0.8967311088664565 - 20 -1.92472211691519 - 42 --0.194428280448302 - 10 -1.031911108455786 - 20 -2.085823367072657 - 42 --0.1617232608950327 - 10 -1.167586754433075 - 20 -2.108823943952719 - 42 --0.5347302517393296 - 10 -1.363007830757451 - 20 -2.267661739983221 - 42 --0.105444424534756 - 10 -1.644986728674037 - 20 -2.110043533348865 - 42 -0.0048822169168032 - 10 -1.662245833920796 - 20 -2.144314524774496 - 42 --0.013230494041686 - 10 -1.734946547580834 - 20 -2.282867141407166 - 42 --0.0694197792179022 - 10 -1.793844951212572 - 20 -2.360618102610478 - 42 --0.097214664119097 - 10 -1.812670378378858 - 20 -2.479214960413685 - 42 --0.1500723642402677 - 10 -1.630088324202255 - 20 -2.628608870043696 - 42 --0.1451314237734207 - 10 -1.565341256716473 - 20 -2.838761681919137 - 42 --0.1056357518612903 - 10 -1.65419402894681 - 20 -3.277369477478751 - 42 --0.1962234048498945 - 10 -1.790739940431784 - 20 -3.410546342344788 - 42 --0.2655031168224304 - 10 -1.950118462130682 - 20 -3.742721892989442 - 42 --0.3964961476078332 - 10 -2.093699839480827 - 20 -3.720939635995741 - 42 --0.1405234862865436 - 10 -2.122456164203622 - 20 -3.650189734969364 - 42 --0.5343574555981587 - 10 -2.315679239916688 - 20 -3.609215116369852 - 42 --0.1773163153754776 - 10 -2.324179645939324 - 20 -3.319578756296038 - 42 --0.2178846001444296 - 10 -2.413405596162056 - 20 -3.176596374420452 - 42 --0.0419776577731284 - 10 -2.424375140175325 - 20 -2.932642516763373 - 42 --0.1021560486223639 - 10 -2.297266684995574 - 20 -2.392216274653201 - 42 --0.0008623409548011 - 10 -2.233811725316336 - 20 -2.256136674480434 - 42 -0.0354069305283612 - 10 -2.162996833972185 - 20 -2.072072274041452 - 42 --0.0586147259804529 - 10 -2.532253084928835 - 20 -2.296901989673256 - 42 --0.1122985838264234 - 10 -2.647978623445294 - 20 -2.321104029817356 - 42 --0.3057060432679023 - 10 -2.728683867382189 - 20 -2.264593609639688 - 42 --0.1508928720957283 - 10 -2.734821253334247 - 20 -2.173180071930798 - 42 --0.2505867392793861 - 10 -2.913757213367856 - 20 -2.182982903173984 - 42 --0.3152987888789875 - 10 -3.058411646163387 - 20 -1.932434076032064 - 42 --0.0595813595316129 - 0 -HATCH - 5 -BA5 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -1.454717916970981 - 20 -2.022108206218515 - 40 -0.8272976136018175 - 50 -223.615566083045 - 51 -238.0440774153107 - 73 - 1 - 72 - 2 - 10 -1.365920530767478 - 20 -1.285919869338796 - 40 -0.3507412528077177 - 50 -174.3939645983117 - 51 -184.6071947080589 - 73 - 1 - 72 - 2 - 10 -1.584035429735767 - 20 -2.039961850738251 - 40 -0.9665244191271588 - 50 -125.9717238731088 - 51 -130.7954628287447 - 73 - 0 - 72 - 2 - 10 -1.168606309785878 - 20 -1.558605525778289 - 40 -0.3306901126594289 - 50 -130.7954628287448 - 51 -161.0882096390424 - 73 - 0 - 97 - 1 -330 -4F0 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BA6 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -1.365920530767478 - 20 -1.285919869338796 - 40 -0.3113711740675595 - 50 -169.2458500319289 - 51 -182.205842988757 - 73 - 0 - 72 - 2 - 10 -1.454717916970979 - 20 -2.022108206218515 - 40 -0.827297613601817 - 50 -241.09054843511 - 51 -254.5550649161042 - 73 - 1 - 72 - 2 - 10 -1.606711922375474 - 20 -1.348933253591385 - 40 -0.3924976718251174 - 50 -198.4545948543501 - 51 -215.6989500329358 - 73 - 1 - 72 - 2 - 10 -1.584035429735761 - 20 -2.039961850738243 - 40 -0.9665244191271488 - 50 -107.8377726397921 - 51 -122.8312626374707 - 73 - 0 - 97 - 1 -330 -4EB - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BA7 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 5 - 72 - 2 - 10 -1.606711922375474 - 20 -1.348933253591385 - 40 -0.3531275930849602 - 50 -135.3746912145926 - 51 -157.4176362906217 - 73 - 0 - 72 - 2 - 10 -1.454717916970981 - 20 -2.022108206218514 - 40 -0.827297613601817 - 50 -257.8545362072944 - 51 -275.2691677284761 - 73 - 1 - 72 - 2 - 10 -1.872170704325741 - 20 -1.396215376152876 - 40 -0.3946836881941063 - 50 -210.0950891144055 - 51 -232.5295145799341 - 73 - 1 - 72 - 2 - 10 -1.542373482613905 - 20 -1.835739673019258 - 40 -0.75809597646572 - 50 -83.20542127045559 - 51 -101.5302981560868 - 73 - 0 - 72 - 2 - 10 -1.584035429735767 - 20 -2.039961850738253 - 40 -0.9665244191271609 - 50 -101.5302981560871 - 51 -103.684145503982 - 73 - 0 - 97 - 1 -330 -559 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BA8 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 5 - 72 - 2 - 10 -1.365613936631296 - 20 -1.696475315724716 - 40 -0.3547000446188475 - 50 -161.0626247765776 - 51 -177.1237827075663 - 73 - 1 - 72 - 2 - 10 -1.26836984905495 - 20 -1.977371145189359 - 40 -0.3677961627452389 - 50 -134.3293201388803 - 51 -152.0052969205894 - 73 - 0 - 72 - 2 - 10 -1.065938622495786 - 20 -1.869760556959495 - 40 -0.1385398865270621 - 50 -152.0052969205897 - 51 -197.9947030794107 - 73 - 0 - 72 - 2 - 10 -1.163637847655055 - 20 -1.838026139816656 - 40 -0.2412638458944715 - 50 -197.9947030794104 - 51 -202.8905358909278 - 73 - 0 - 72 - 2 - 10 -1.448830865211249 - 20 -2.213371853903019 - 40 -0.5803064835681331 - 50 -209.0183706588869 - 51 -223.8176444671686 - 73 - 1 - 97 - 1 -330 -509 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BA9 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 5 - 72 - 2 - 10 -1.75442661167109 - 20 -1.690434343062299 - 40 -0.5219798013778194 - 50 -181.7138221824677 - 51 -190.3415069086127 - 73 - 1 - 72 - 2 - 10 -1.382209127764958 - 20 -2.180776385554784 - 40 -0.6008907212088186 - 50 -103.5988396513469 - 51 -119.2343164314062 - 73 - 0 - 72 - 2 - 10 -1.26836984905495 - 20 -1.977371145189357 - 40 -0.3677961627452375 - 50 -119.2343164314065 - 51 -126.2926725539458 - 73 - 0 - 72 - 2 - 10 -1.365613936631298 - 20 -1.696475315724717 - 40 -0.3153299658786926 - 50 -177.17352188641 - 51 -195.5421431149888 - 73 - 0 - 72 - 2 - 10 -1.448830865211245 - 20 -2.213371853903018 - 40 -0.5803064835681301 - 50 -228.1704174204192 - 51 -248.1315658423051 - 73 - 1 - 97 - 1 -330 -507 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BAA -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -1.448830865211245 - 20 -2.213371853903018 - 40 -0.5803064835681306 - 50 -252.3365152710513 - 51 -268.8118268997819 - 73 - 1 - 72 - 2 - 10 -2.244252791706375 - 20 -1.579066020312691 - 40 -0.8092671391653076 - 50 -176.1651718242215 - 51 -179.7775214345853 - 73 - 1 - 72 - 2 - 10 -1.382209127764961 - 20 -2.180776385554781 - 40 -0.6008907212088166 - 50 -84.96060718028212 - 51 -99.52487731460255 - 73 - 0 - 72 - 2 - 10 -1.754426611671092 - 20 -1.690434343062297 - 40 -0.4826097226376628 - 50 -167.7663152513758 - 51 -176.4348368363554 - 73 - 0 - 97 - 1 -330 -620 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BAB -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.506661351932914 - 20 -2.343882490801417 - 40 -1.137317969685164 - 50 -254.5896536710559 - 51 -264.8320604814776 - 73 - 1 - 72 - 2 - 10 -2.053956362533489 - 20 -1.311094011306244 - 40 -0.3642304650017842 - 50 -15.91994768566973 - 51 -37.94378452603665 - 73 - 0 - 72 - 2 - 10 -2.41136725018985 - 20 -1.266852136052575 - 40 -0.1929333171495304 - 50 -111.3287610035634 - 51 -150.8157377309437 - 73 - 0 - 72 - 2 - 10 -3.174161319020494 - 20 -1.699913413586516 - 40 -1.070082152487879 - 50 -150.4873427015391 - 51 -154.9868167954895 - 73 - 0 - 97 - 1 -330 -4BC - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BAC -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.05395636253349 - 20 -1.311094011306242 - 40 -0.40360054374194 - 50 -325.1586938734879 - 51 -345.2415144983743 - 73 - 1 - 72 - 2 - 10 -2.506661351932912 - 20 -2.343882490801414 - 40 -1.137317969685161 - 50 -266.8538285473494 - 51 -278.3272010683704 - 73 - 1 - 72 - 2 - 10 -2.202541654133556 - 20 -1.362543685931675 - 40 -0.4904456831815359 - 50 -17.0728403884595 - 51 -35.67171941040231 - 73 - 0 - 72 - 2 - 10 -2.527478440588521 - 20 -2.947760106017855 - 40 -1.87265752378095 - 50 -87.75100742187989 - 51 -94.35714735717728 - 73 - 0 - 97 - 1 -330 -4BA - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BAD -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 5 - 72 - 2 - 10 -2.202541654133554 - 20 -1.362543685931673 - 40 -0.5298157619216942 - 50 -14.96903515149527 - 51 -32.33949759932654 - 73 - 0 - 72 - 2 - 10 -2.527478440588518 - 20 -2.947760106017868 - 40 -1.872657523780963 - 50 -273.7568474686516 - 51 -276.0943494215687 - 73 - 1 - 72 - 2 - 10 -2.617288604059703 - 20 -2.10660015529557 - 40 -1.026716669960875 - 50 -276.0943494215687 - 51 -282.0831632762506 - 73 - 1 - 72 - 2 - 10 -2.502316662315184 - 20 -1.425846770903515 - 40 -0.4618440522407246 - 50 -315.5859663701619 - 51 -343.4723636742463 - 73 - 1 - 72 - 2 - 10 -2.506661351932922 - 20 -2.3438824908014 - 40 -1.137317969685146 - 50 -67.32624731613089 - 51 -79.47656760874074 - 73 - 0 - 97 - 1 -330 -4B9 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BAE -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 5 - 72 - 2 - 10 -2.506661351932912 - 20 -2.343882490801413 - 40 -1.137317969685161 - 50 -295.2104838476032 - 51 -307.4903876208237 - 73 - 1 - 72 - 2 - 10 -2.72065401068705 - 20 -1.473292657067691 - 40 -0.4792688318657009 - 50 -3.806985506611603 - 51 -27.08574039713036 - 73 - 0 - 72 - 2 - 10 -3.019270278182163 - 20 -1.32057676085313 - 40 -0.1438678477148946 - 50 -27.08574039713062 - 51 -62.91425960287042 - 73 - 0 - 72 - 2 - 10 -2.617288604059699 - 20 -2.106600155295566 - 40 -1.026716669960872 - 50 -62.91425960286999 - 51 -74.08618998756283 - 73 - 0 - 72 - 2 - 10 -2.502316662315185 - 20 -1.425846770903515 - 40 -0.5012141309808816 - 50 -322.28430360547 - 51 -347.21072780023 - 73 - 1 - 97 - 1 -330 -4AD - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BAF -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.358343856922912 - 20 -2.56087150497244 - 40 -1.017884167165223 - 50 -255.9706947110459 - 51 -262.6477274601202 - 73 - 1 - 72 - 2 - 10 -1.875100795739507 - 20 -1.635718008880588 - 40 -0.3629259890852237 - 50 -346.5587102880505 - 51 -357.396057379031 - 73 - 1 - 72 - 2 - 10 -2.23202592329045 - 20 -2.762062415766459 - 40 -1.142846610535554 - 50 -89.71793740532951 - 51 -96.29947398788597 - 73 - 0 - 72 - 2 - 10 -3.174161319020505 - 20 -1.699913413586497 - 40 -1.070082152487882 - 50 -183.9544802865682 - 51 -186.7925864334441 - 73 - 1 - 97 - 1 -330 -4C0 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB0 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.35834385692291 - 20 -2.560871504972433 - 40 -1.017884167165215 - 50 -264.8798691909198 - 51 -277.0962125668474 - 73 - 1 - 72 - 2 - 10 -2.157099264484859 - 20 -1.761255447038774 - 40 -0.3888707645596128 - 50 -327.2321171951457 - 51 -344.8146293833702 - 73 - 1 - 72 - 2 - 10 -2.232025923290449 - 20 -2.762062415766465 - 40 -1.14284661053556 - 50 -74.76238100741742 - 51 -87.73997032522614 - 73 - 0 - 72 - 2 - 10 -1.875100795739506 - 20 -1.635718008880588 - 40 -0.4022960678253824 - 50 -2.224226079808037 - 51 -12.73296995122379 - 73 - 0 - 97 - 1 -330 -4C1 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB1 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.157099264484858 - 20 -1.761255447038777 - 40 -0.4282408432997721 - 50 -12.00230574940428 - 51 -28.29091643485702 - 73 - 0 - 72 - 2 - 10 -2.358343856922911 - 20 -2.560871504972434 - 40 -1.017884167165216 - 50 -279.9480036533407 - 51 -296.005896865796 - 73 - 1 - 72 - 2 - 10 -2.43480848147727 - 20 -1.74176023846554 - 40 -0.3820244196138822 - 50 -345.4907424301736 - 51 -365.6076870699981 - 73 - 1 - 72 - 2 - 10 -2.232025923290445 - 20 -2.762062415766465 - 40 -1.142846610535562 - 50 -59.32877074017064 - 51 -72.48465458233305 - 73 - 0 - 97 - 1 -330 -4C3 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB2 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.434808481477273 - 20 -1.741760238465535 - 40 -0.4213944983540373 - 50 -350.138398092684 - 51 -368.2079411900966 - 73 - 1 - 72 - 2 - 10 -2.232025923290449 - 20 -2.76206241576646 - 40 -1.142846610535555 - 50 -302.8460023643591 - 51 -313.5174616433824 - 73 - 1 - 72 - 2 - 10 -2.435514026542539 - 20 -1.986930556286178 - 40 -0.5859069085937808 - 50 -5.250840664227033 - 51 -24.12657987446927 - 73 - 0 - 72 - 2 - 10 -2.358343856922903 - 20 -2.560871504972432 - 40 -1.017884167165218 - 50 -53.04812421612736 - 51 -61.11882105703474 - 73 - 0 - 97 - 1 -330 -510 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB3 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 11 - 72 - 2 - 10 -1.735391678484751 - 20 -1.622446814297793 - 40 -0.3637008069698632 - 50 -46.50828210019076 - 51 -127.3801843342055 - 73 - 0 - 72 - 2 - 10 -2.244252791706377 - 20 -1.579066020312692 - 40 -0.7698970604251519 - 50 -198.604632170139 - 51 -206.170680909061 - 73 - 1 - 72 - 2 - 10 -1.87217070432574 - 20 -1.396215376152875 - 40 -0.3553136094539483 - 50 -206.170680909061 - 51 -220.7958011940912 - 73 - 1 - 72 - 2 - 10 -1.754854449164134 - 20 -1.637701886096329 - 40 -0.4973281664865742 - 50 -252.2434918237404 - 51 -291.0055844420299 - 73 - 1 - 72 - 2 - 10 -1.940182455435743 - 20 -1.155046537921708 - 40 -0.0196850393700786 - 50 -248.9944155579697 - 51 -428.9944155579707 - 73 - 0 - 72 - 2 - 10 -1.754854449164133 - 20 -1.637701886096329 - 40 -0.5366982452267322 - 50 -68.99441555797011 - 51 -99.84027979757452 - 73 - 0 - 72 - 2 - 10 -1.872170704325739 - 20 -1.396215376152874 - 40 -0.3553136094539469 - 50 -233.9619057741986 - 51 -253.8293190909382 - 73 - 1 - 72 - 2 - 10 -1.867289566555308 - 20 -1.379382243234548 - 40 -0.3377870618823355 - 50 -253.8293190909384 - 51 -276.1706809090611 - 73 - 1 - 72 - 2 - 10 -1.842733556184505 - 20 -1.606506575382589 - 40 -0.5662349988373994 - 50 -276.170680909061 - 51 -300.6079669543535 - 73 - 1 - 72 - 2 - 10 -2.448387279831183 - 20 -1.47470612641788 - 40 -0.4765713362946238 - 50 -131.7514141291648 - 51 -162.7742566190203 - 73 - 0 - 72 - 2 - 10 -3.245154141911026 - 20 -1.721739021653879 - 40 -1.31075517924367 - 50 -162.7742566190193 - 51 -163.9156492780123 - 73 - 0 - 97 - 1 -330 -4F4 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB4 -330 -1F -100 -AcDbEntity - 8 -HATCH-YELLOW -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 36 - 72 - 2 - 10 -2.043049297315998 - 20 -2.110655210550977 - 40 -0.3135948678531067 - 50 -140.7856547310828 - 51 -150.7972901196548 - 73 - 1 - 72 - 2 - 10 -4.316192387813921 - 20 -0.8400973818280717 - 40 -2.91772556849152 - 50 -150.7972901196538 - 51 -151.5606552199046 - 73 - 1 - 72 - 2 - 10 -1.82896029060598 - 20 -2.312110103765454 - 40 -0.1138088004365485 - 50 -226.4676036039469 - 51 -253.8346334294888 - 73 - 1 - 72 - 2 - 10 -1.791794192050712 - 20 -2.183894323205893 - 40 -0.0196850393700787 - 50 -286.1653665705111 - 51 -466.1653665705111 - 73 - 0 - 72 - 2 - 10 -1.82896029060598 - 20 -2.312110103765454 - 40 -0.153178879176706 - 50 -106.1653665705111 - 51 -129.487348884315 - 73 - 0 - 72 - 2 - 10 -4.31619238781396 - 20 -0.8400973818280881 - 40 -2.917725568491546 - 50 -152.3551430085055 - 51 -153.8293190909382 - 73 - 1 - 72 - 2 - 10 --0.1012307034243785 - 20 -3.010931950741638 - 40 -2.004281084551068 - 50 -26.17068090906094 - 51 -27.44285015917365 - 73 - 0 - 72 - 2 - 10 -1.869973878918131 - 20 -2.229032723885394 - 40 -0.2390599525801008 - 50 -216.3816426472188 - 51 -279.0739534633693 - 73 - 1 - 72 - 2 - 10 -1.910780338072042 - 20 -1.973525769477851 - 40 -0.0196850393700789 - 50 -260.9260465366305 - 51 -440.9260465366307 - 73 - 0 - 72 - 2 - 10 -1.869973878918132 - 20 -2.229032723885395 - 40 -0.278430031320259 - 50 -80.92604653663092 - 51 -139.8013610445865 - 73 - 0 - 72 - 2 - 10 --0.101230703424352 - 20 -3.01093195074165 - 40 -2.004281084551049 - 50 -28.67087156360686 - 51 -33.18792433993601 - 73 - 0 - 72 - 2 - 10 -1.813793246529746 - 20 -2.127914574971419 - 40 -0.3198926968250738 - 50 -222.0119914468626 - 51 -273.6941141002521 - 73 - 1 - 72 - 2 - 10 -1.835672170020508 - 20 -1.78904239903142 - 40 -0.0196850393700788 - 50 -266.3058858997472 - 51 -446.3058858997478 - 73 - 0 - 72 - 2 - 10 -1.813793246529746 - 20 -2.127914574971419 - 40 -0.3592627755652315 - 50 -86.30588589974785 - 51 -136.3371185375852 - 73 - 0 - 72 - 2 - 10 -1.995105659775399 - 20 -1.606003070595645 - 40 -0.5192979821599312 - 50 -148.1708625321174 - 51 -171.6429565217715 - 73 - 1 - 72 - 2 - 10 -1.774379750743404 - 20 -1.9596864265737 - 40 -0.4040824222682091 - 50 -223.5109336967462 - 51 -281.1199173397384 - 73 - 1 - 72 - 2 - 10 -1.85610884645455 - 20 -1.543874911031386 - 40 -0.0196850393700787 - 50 -258.8800826602615 - 51 -438.8800826602615 - 73 - 0 - 72 - 2 - 10 -1.774379750743404 - 20 -1.9596864265737 - 40 -0.4434525010083663 - 50 -78.88008266026162 - 51 -132.2628434475095 - 73 - 0 - 72 - 2 - 10 -2.244252791706375 - 20 -1.579066020312694 - 40 -0.7698970604251502 - 50 -176.0947114644605 - 51 -193.0143530481955 - 73 - 1 - 72 - 2 - 10 -1.735391678484751 - 20 -1.622446814297793 - 40 -0.3243307282297058 - 50 -221.9378076910892 - 51 -317.3250616801697 - 73 - 1 - 72 - 2 - 10 -3.245154141910992 - 20 -1.721739021653846 - 40 -1.310755179243628 - 50 -165.9082787983328 - 51 -187.2257433809798 - 73 - 0 - 72 - 2 - 10 -2.601728566753492 - 20 -1.803316300498068 - 40 -0.6621787973190414 - 50 -187.2257433809798 - 51 -200.265282453191 - 73 - 0 - 72 - 2 - 10 -1.486332025585369 - 20 -2.215145842661859 - 40 -0.5268178451693419 - 50 -339.734717546809 - 51 -365.875687911445 - 73 - 1 - 72 - 2 - 10 -1.780100104900293 - 20 -2.245377841414935 - 40 -0.231498258665186 - 50 -5.875687911445098 - 51 -34.12431208855465 - 73 - 1 - 72 - 2 - 10 -1.928818024879454 - 20 -2.346159501416084 - 40 -0.0518487033762426 - 50 -34.12431208855484 - 51 -115.8756879114452 - 73 - 1 - 72 - 2 - 10 -2.043049297315996 - 20 -2.110655210550977 - 40 -0.3135948678531048 - 50 -115.8756879114451 - 51 -131.7156800642676 - 73 - 1 - 72 - 2 - 10 -2.105362384851459 - 20 -2.371962053549119 - 40 -0.2723538322513749 - 50 -185.7363493931126 - 51 -196.6535421822968 - 73 - 1 - 72 - 2 - 10 -2.224366300494004 - 20 -2.407559786221583 - 40 -0.3965678834278744 - 50 -196.6535421822967 - 51 -214.2452636527788 - 73 - 1 - 72 - 2 - 10 -1.775114796299714 - 20 -2.101729675474409 - 40 -0.1469014999420266 - 50 -325.7547363472213 - 51 -394.2452636527789 - 73 - 0 - 72 - 2 - 10 -1.880276536811822 - 20 -2.030140317515856 - 40 -0.0196850393700786 - 50 -34.24526365277875 - 51 -214.2452636527787 - 73 - 0 - 72 - 2 - 10 -1.775114796299714 - 20 -2.101729675474409 - 40 -0.1075314212018693 - 50 -325.7547363472211 - 51 -383.6864830926802 - 73 - 1 - 72 - 2 - 10 -1.724258670730545 - 20 -2.179559731729328 - 40 -0.1532919477378671 - 50 -13.05681211459937 - 51 -58.88974415557702 - 73 - 0 - 72 - 2 - 10 -1.793291568736173 - 20 -2.065168888754275 - 40 -0.0196850393700787 - 50 -58.88974415557702 - 51 -238.8897441555765 - 73 - 0 - 72 - 2 - 10 -1.724258670730541 - 20 -2.179559731729329 - 40 -0.1139218689977123 - 50 -301.1102558444241 - 51 -381.2576330469557 - 73 - 1 - 72 - 2 - 10 -2.224366300494005 - 20 -2.407559786221586 - 40 -0.435937962168034 - 50 -154.6425959514791 - 51 -163.3464578177032 - 73 - 0 - 72 - 2 - 10 -2.105362384851463 - 20 -2.371962053549115 - 40 -0.3117239109915352 - 50 -163.3464578177044 - 51 -168.3316806257954 - 73 - 0 - 97 - 1 -330 -4F7 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB6 -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -1.034012571047431 - 20 -0.4770274671951757 - 40 -0.7071698573021327 - 50 -88.2250617963899 - 51 -113.037640194644 - 73 - 1 - 72 - 2 - 10 -0.9476260308821789 - 20 -1.102477175547732 - 40 -0.1920311575011529 - 50 -187.577294301379 - 51 -259.5173177193701 - 73 - 0 - 72 - 2 - 10 -1.168606309785881 - 20 -1.558605525778299 - 40 -0.3700601913995948 - 50 -226.2464306309096 - 51 -229.2045371712558 - 73 - 1 - 72 - 2 - 10 -1.584035429735768 - 20 -2.03996185073825 - 40 -1.005894497867316 - 50 -229.2045371712552 - 51 -238.3301051192357 - 73 - 1 - 97 - 1 -330 -4E7 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB7 -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 6 - 72 - 2 - 10 -1.268369849054951 - 20 -1.97737114518936 - 40 -0.4071662414853972 - 50 -214.7414744545867 - 51 -240.7656835685936 - 73 - 1 - 72 - 2 - 10 -1.382209127764962 - 20 -2.180776385554782 - 40 -0.6402607999489762 - 50 -240.7656835685933 - 51 -274.8013992041994 - 73 - 1 - 72 - 2 - 10 -2.244252791706376 - 20 -1.579066020312693 - 40 -0.8092671391653085 - 50 -182.5711456908801 - 51 -205.0661840751609 - 73 - 1 - 72 - 2 - 10 -1.454717916970982 - 20 -2.022108206218515 - 40 -0.78792753486166 - 50 -85.88902674875129 - 51 -141.3773954764613 - 73 - 0 - 72 - 2 - 10 -1.168606309785876 - 20 -1.558605525778289 - 40 -0.3306901126594269 - 50 -175.0885918849935 - 51 -182.1149161181871 - 73 - 0 - 72 - 2 - 10 -1.060157361703603 - 20 -1.562610439508386 - 40 -0.2221672409957212 - 50 -182.1149161181872 - 51 -235.3333452342021 - 73 - 0 - 97 - 1 -330 -4EE - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB8 -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 7 - 72 - 2 - 10 -1.995105659775398 - 20 -1.606003070595649 - 40 -0.5586680609000869 - 50 -153.1774302023765 - 51 -173.1639087815069 - 73 - 1 - 72 - 2 - 10 -1.448830865211247 - 20 -2.213371853903018 - 40 -0.5409364048279738 - 50 -90.89204265530425 - 51 -153.6751728635248 - 73 - 0 - 72 - 2 - 10 -1.163637847655053 - 20 -1.838026139816656 - 40 -0.2412638458944706 - 50 -214.15747754694 - 51 -242.0052969205898 - 73 - 0 - 72 - 2 - 10 -1.134374454956795 - 20 -1.893074853652674 - 40 -0.1789203855540918 - 50 -242.0052969205894 - 51 -284.046994134434 - 73 - 0 - 72 - 2 - 10 -1.318324160529892 - 20 -2.123002906229338 - 40 -0.1514028023784195 - 50 -201.853727881165 - 51 -212.2168526331622 - 73 - 1 - 72 - 2 - 10 -1.492137893232153 - 20 -2.232530667257897 - 40 -0.3568475494804613 - 50 -212.2168526331617 - 51 -237.7831473668378 - 73 - 1 - 72 - 2 - 10 -1.573128668857933 - 20 -2.361057982102735 - 40 -0.5087645544459671 - 50 -237.7831473668379 - 51 -261.3425166986952 - 73 - 1 - 97 - 1 -330 -505 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BB9 -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 6 - 72 - 2 - 10 -1.573128668857933 - 20 -2.361057982102735 - 40 -0.4693944757058101 - 50 -96.86618894004766 - 51 -122.2168526331621 - 73 - 0 - 72 - 2 - 10 -1.492137893232154 - 20 -2.232530667257898 - 40 -0.3174774707403054 - 50 -122.2168526331621 - 51 -147.7831473668382 - 73 - 0 - 72 - 2 - 10 -1.318324160529893 - 20 -2.123002906229338 - 40 -0.1120327236382623 - 50 -147.783147366838 - 51 -287.1653967341294 - 73 - 0 - 72 - 2 - 10 -1.134452552508394 - 20 -1.527737292608446 - 40 -0.7350495123332927 - 50 -287.1653967341295 - 51 -311.9725813008354 - 73 - 0 - 72 - 2 - 10 --0.1012307034243558 - 20 -3.010931950741639 - 40 -1.964911005810889 - 50 -28.47135626072658 - 51 -33.82931909093841 - 73 - 0 - 72 - 2 - 10 -1.9951056597754 - 20 -1.606003070595648 - 40 -0.5586680609000885 - 50 -146.1706809090616 - 51 -148.8453401595469 - 73 - 1 - 97 - 1 -330 -50B - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BBA -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 6 - 72 - 2 - 10 -2.506661351932914 - 20 -2.343882490801411 - 40 -1.097947890945 - 50 -252.9025993502986 - 51 -309.129589783908 - 73 - 1 - 72 - 2 - 10 -2.720654010687031 - 20 -1.473292657067699 - 40 -0.4792688318657188 - 50 -2.258737765182703 - 51 -4.269906958171121 - 73 - 1 - 72 - 2 - 10 -2.805854019540959 - 20 -1.479653877718507 - 40 -0.3938316816506187 - 50 -4.26990695817209 - 51 -31.68755658158391 - 73 - 1 - 72 - 2 - 10 -3.031233358735755 - 20 -1.618783385319762 - 40 -0.1289678177105734 - 50 -31.68755658158397 - 51 -88.75077942665364 - 73 - 1 - 72 - 2 - 10 -2.358343856922911 - 20 -2.560871504972435 - 40 -1.057254245905374 - 50 -50.27455552545634 - 51 -103.1717867618754 - 73 - 0 - 72 - 2 - 10 -3.174161319020478 - 20 -1.699913413586489 - 40 -1.070082152487853 - 50 -189.0587348045097 - 51 -202.2656996106713 - 73 - 1 - 97 - 1 -330 -4B5 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BBB -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 7 - 72 - 2 - 10 -3.174161319020492 - 20 -1.69991341358649 - 40 -1.070082152487867 - 50 -178.182030269148 - 51 -186.2319675330486 - 73 - 0 - 72 - 2 - 10 -3.496410384846752 - 20 -1.66472403412841 - 40 -1.394246852682911 - 50 -186.2319675330462 - 51 -188.4100158185151 - 73 - 0 - 72 - 2 - 10 -2.05576545700618 - 20 -2.861012413940887 - 40 -0.994268550367224 - 50 -273.5399568619239 - 51 -308.9576328012706 - 73 - 1 - 72 - 1 - 10 -2.680907394207461 - 20 -2.087858154687554 - 11 -2.747050780866419 - 21 -2.134172252628876 - 72 - 2 - 10 -2.833454996760046 - 20 -2.010774243926277 - 40 -0.1506411533278984 - 50 -235.0000000000002 - 51 -295.0 - 73 - 0 - 72 - 2 - 10 -2.807174025728471 - 20 -1.954414519671351 - 40 -0.2128272285895981 - 50 -294.9999999999998 - 51 -351.1901840561478 - 73 - 0 - 72 - 2 - 10 -2.232025923290446 - 20 -2.76206241576646 - 40 -1.1034765317954 - 50 -44.6177154324492 - 51 -96.63019658365178 - 73 - 0 - 97 - 1 -330 -4C7 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BBC -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 6 - 72 - 2 - 10 -2.05576545700618 - 20 -2.861012413940887 - 40 -0.9548984716270655 - 50 -274.0763809413058 - 51 -308.9974179950865 - 73 - 1 - 72 - 2 - 10 -2.583746606177169 - 20 -2.208949913643178 - 40 -0.1158814287879965 - 50 -308.9974179950865 - 51 -381.0025820049136 - 73 - 1 - 72 - 2 - 10 -2.64643710148901 - 20 -2.233017781588249 - 40 -0.0487296568838581 - 50 -21.00258200491355 - 51 -88.99741799508618 - 73 - 1 - 72 - 2 - 10 -2.643315164634613 - 20 -2.054622849494738 - 40 -0.2271519040571613 - 50 -88.99741799508604 - 51 -114.6269796357359 - 73 - 1 - 72 - 2 - 10 -3.303260542295614 - 20 -0.6149685670603082 - 40 -1.810860322430921 - 50 -114.6269796357358 - 51 -129.7728051417874 - 73 - 1 - 72 - 2 - 10 -3.496410384846758 - 20 -1.664724034128341 - 40 -1.394246852682927 - 50 -165.7987430109054 - 51 -169.9291703474848 - 73 - 1 - 97 - 1 -330 -4C8 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BFB -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 8 - 72 - 2 - 10 -2.10076671703864 - 20 -3.325655213407455 - 40 -0.0599397668605327 - 50 -267.8793336511986 - 51 -377.8793336511989 - 73 - 1 - 72 - 2 - 10 -2.052741812238583 - 20 -3.310162719091439 - 40 -0.1104017214519507 - 50 -17.87933365119892 - 51 -43.7673166448306 - 73 - 1 - 72 - 2 - 10 -2.103395451769339 - 20 -3.340116557206334 - 40 -0.0547683672910658 - 50 -57.93744139888317 - 51 -187.77563216475 - 73 - 1 - 72 - 2 - 10 -2.068634698539837 - 20 -3.335369986556996 - 40 -0.0196850393700788 - 50 -187.7756321647501 - 51 -367.7756321647502 - 73 - 1 - 72 - 2 - 10 -2.103395451769339 - 20 -3.340116557206334 - 40 -0.0153982885509082 - 50 -172.2243678352504 - 51 -287.334302618237 - 73 - 0 - 72 - 2 - 10 -2.052741812238584 - 20 -3.310162719091439 - 40 -0.0710316427117921 - 50 -321.0507208994834 - 51 -342.1206663488011 - 73 - 0 - 72 - 2 - 10 -2.100766717038639 - 20 -3.325655213407456 - 40 -0.0205696881203755 - 50 -342.1206663488009 - 51 -452.1206663488013 - 73 - 0 - 72 - 2 - 10 -2.099277124665835 - 20 -3.285428055915363 - 40 -0.0196850393700787 - 50 -87.8793336512005 - 51 -267.8793336511979 - 73 - 1 - 97 - 1 -330 -235 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BFC -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 8 - 72 - 2 - 10 -1.921485017130019 - 20 -3.343003198213819 - 40 -0.0771903814552135 - 50 -359.5978819190761 - 51 -374.2374903606301 - 73 - 1 - 72 - 2 - 10 -1.980044176928186 - 20 -3.357861720825169 - 40 -0.0167755580220592 - 50 -14.23749036062933 - 51 -155.7625096393687 - 73 - 1 - 72 - 2 - 10 -2.003282808101446 - 20 -3.34739958355454 - 40 -0.0422606574936387 - 50 -155.7625096393692 - 51 -241.4329313324614 - 73 - 1 - 72 - 2 - 10 -1.973661171909946 - 20 -3.292995281984995 - 40 -0.0196850393700789 - 50 -298.5670686675385 - 51 -478.5670686675385 - 73 - 0 - 72 - 2 - 10 -2.003282808101446 - 20 -3.34739958355454 - 40 -0.0816307362337962 - 50 -118.5670686675387 - 51 -204.2374903606309 - 73 - 0 - 72 - 2 - 10 -1.980044176928186 - 20 -3.357861720825169 - 40 -0.0561456367622165 - 50 -204.2374903606306 - 51 -345.7625096393699 - 73 - 0 - 72 - 2 - 10 -1.921485017130019 - 20 -3.34300319821382 - 40 -0.1165604601953712 - 50 -345.76250963937 - 51 -360.4021180809241 - 73 - 0 - 72 - 2 - 10 -2.018358052101874 - 20 -3.342323304531541 - 40 -0.0196850393700787 - 50 -0.4021180809244088 - 51 -180.4021180809231 - 73 - 0 - 97 - 1 -330 -267 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BFD -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.278537892029333 - 20 -3.728579428420916 - 40 -0.0853095785363673 - 50 -12.6821846844064 - 51 -72.68218468440622 - 73 - 1 - 72 - 2 - 10 -2.309791821489833 - 20 -3.828814460633206 - 40 -0.0196850393700787 - 50 -107.3178153155941 - 51 -287.3178153155944 - 73 - 0 - 72 - 2 - 10 -2.278537892029333 - 20 -3.728579428420916 - 40 -0.1246796572765245 - 50 -287.3178153155936 - 51 -347.3178153155935 - 73 - 0 - 72 - 2 - 10 -2.380970941004577 - 20 -3.751630247646181 - 40 -0.0196850393700789 - 50 -347.3178153155935 - 51 -527.3178153155935 - 73 - 0 - 97 - 1 -330 -451 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -BFE -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -2.07909456474772 - 20 -3.772298844618632 - 40 -0.1175982774997528 - 50 -111.5543469318192 - 51 -141.5543469318192 - 73 - 1 - 72 - 2 - 10 -1.971574507059384 - 20 -3.857657770838914 - 40 -0.0196850393700788 - 50 -38.44565306818044 - 51 -218.4456530681808 - 73 - 0 - 72 - 2 - 10 -2.079094564747719 - 20 -3.772298844618632 - 40 -0.1569683562399099 - 50 -218.4456530681809 - 51 -248.4456530681809 - 73 - 0 - 72 - 2 - 10 -2.028658926483394 - 20 -3.899981872009325 - 40 -0.0196850393700786 - 50 -248.4456530681804 - 51 -428.4456530681804 - 73 - 0 - 97 - 1 -330 -44F - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -C01 -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 17 - 72 - 2 - 10 -2.10536238485146 - 20 -2.371962053549118 - 40 -0.2723538322513761 - 50 -159.7337422418206 - 51 -175.1380365575864 - 73 - 1 - 72 - 2 - 10 -2.043049297315996 - 20 -2.110655210550977 - 40 -0.352964946593263 - 50 -233.6796832772765 - 51 -244.1243120885548 - 73 - 0 - 72 - 2 - 10 -1.928818024879453 - 20 -2.346159501416084 - 40 -0.0912187821164004 - 50 -244.1243120885551 - 51 -325.8756879114455 - 73 - 0 - 72 - 2 - 10 -1.780100104900293 - 20 -2.245377841414934 - 40 -0.2708683374053446 - 50 -325.8756879114452 - 51 -354.1243120885547 - 73 - 0 - 72 - 2 - 10 -1.486332025585371 - 20 -2.215145842661859 - 40 -0.5661879239094977 - 50 -354.124312088555 - 51 -380.265282453191 - 73 - 0 - 72 - 2 - 10 -2.601728566753494 - 20 -1.803316300498069 - 40 -0.622808718578886 - 50 -159.7347175468091 - 51 -172.7742566190203 - 73 - 1 - 72 - 2 - 10 -3.245154141910993 - 20 -1.721739021653846 - 40 -1.271385100503472 - 50 -172.7742566190202 - 51 -197.2257433809798 - 73 - 1 - 72 - 2 - 10 -2.448387279831183 - 20 -1.474706126417881 - 40 -0.4372012575544668 - 50 -197.2257433809797 - 51 -229.6909739682446 - 73 - 1 - 72 - 2 - 10 -1.84273355618451 - 20 -1.606506575382588 - 40 -0.5662349988373949 - 50 -304.7588400511317 - 51 -309.2074896477569 - 73 - 1 - 72 - 2 - 10 -3.174161319020478 - 20 -1.699913413586492 - 40 -1.109452231228011 - 50 -151.3367493281762 - 51 -186.2319675330486 - 73 - 0 - 72 - 2 - 10 -3.49641038484678 - 20 -1.664724034128332 - 40 -1.433616931423104 - 50 -186.2319675330492 - 51 -205.0988169699291 - 73 - 0 - 72 - 2 - 10 --37.1850685335689 - 20 -20.72029698200291 - 40 -43.48962412887072 - 50 -334.901183030072 - 51 -335.0988169699286 - 73 - 1 - 72 - 2 - 10 -1.05207209728287 - 20 -2.970247608757844 - 40 -1.33344811187206 - 50 -335.0988169699285 - 51 -348.9886439523909 - 73 - 1 - 72 - 2 - 10 -1.959203223948364 - 20 -2.950701101027533 - 40 -0.4655223034750759 - 50 -30.33963089325502 - 51 -49.03787718203768 - 73 - 0 - 72 - 2 - 10 -1.804450685812644 - 20 -3.128961400613438 - 40 -0.701583910831935 - 50 -49.03787718203728 - 51 -65.26030603284518 - 73 - 0 - 72 - 2 - 10 -1.924151714798596 - 20 -2.869186907390315 - 40 -0.4155574720721139 - 50 -65.26030603284511 - 51 -82.84890216530907 - 73 - 0 - 72 - 2 - 10 -1.936208898089171 - 20 -2.773084900679216 - 40 -0.318702057340656 - 50 -82.84890216530943 - 51 -105.7184590811235 - 73 - 0 - 97 - 1 -330 -4F3 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -C20 -330 -1F -100 -AcDbEntity - 8 -HATCH-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 3 - 92 - 1 - 93 - 17 - 72 - 2 - 10 -1.885608931176688 - 20 -3.176688874055116 - 40 -0.2129975912966591 - 50 -114.9006616575818 - 51 -156.4878117659684 - 73 - 1 - 72 - 2 - 10 -2.636203773812854 - 20 -2.850131072655588 - 40 -1.031552791296577 - 50 -156.4878117659688 - 51 -180.6082887577103 - 73 - 1 - 72 - 2 - 10 -1.952094170360633 - 20 -2.842867853274917 - 40 -0.3474046319836055 - 50 -180.6082887577101 - 51 -213.6393369978933 - 73 - 1 - 72 - 2 - 10 -1.964644164547905 - 20 -2.851218474936612 - 40 -0.3624789557242355 - 50 -213.6393369978933 - 51 -250.0019612921961 - 73 - 1 - 72 - 2 - 10 -1.936208898089171 - 20 -2.773084900679217 - 40 -0.2793319786004991 - 50 -250.001961292196 - 51 -277.1510978346906 - 73 - 1 - 72 - 2 - 10 -1.924151714798597 - 20 -2.869186907390317 - 40 -0.3761873933319576 - 50 -277.1510978346908 - 51 -294.7396939671547 - 73 - 1 - 72 - 2 - 10 -1.804450685812644 - 20 -3.128961400613437 - 40 -0.6622138320917775 - 50 -294.7396939671549 - 51 -310.9621228179628 - 73 - 1 - 72 - 2 - 10 -1.959203223948364 - 20 -2.950701101027533 - 40 -0.4261522247349184 - 50 -310.9621228179625 - 51 -357.7626023297964 - 73 - 1 - 72 - 2 - 10 -0.9685713550985386 - 20 -2.989404907072427 - 40 -1.417539880590719 - 50 -357.7626023297966 - 51 -367.3820705420636 - 73 - 1 - 72 - 2 - 10 -2.2125235694189 - 20 -3.150570273791624 - 40 -0.1631908912969642 - 50 -7.382070542063584 - 51 -53.5251061991567 - 73 - 1 - 72 - 2 - 10 -1.924407631021267 - 20 -3.452788946261674 - 40 -0.4213817967382122 - 50 -23.94086726929591 - 51 -38.56090658709021 - 73 - 0 - 72 - 2 - 10 -2.174464534980624 - 20 -3.253450334179865 - 40 -0.1015938396722196 - 50 -38.56090658709 - 51 -128.8844964337146 - 73 - 0 - 72 - 1 - 10 -2.110688753100606 - 20 -3.174368364648643 - 11 -2.049360338450518 - 21 -3.223826763560005 - 72 - 1 - 10 -2.049360338450518 - 20 -3.223826763560005 - 11 -2.020698206844207 - 21 -3.208114453397319 - 72 - 2 - 10 -1.961644849992286 - 20 -3.289054064709398 - 40 -0.1001924130602254 - 50 -53.88559445512062 - 51 -115.5479523260344 - 73 - 0 - 72 - 2 - 10 -2.0110372932182 - 20 -3.39238482801838 - 40 -0.2147212744613677 - 50 -115.5479523260344 - 51 -163.3991489022965 - 73 - 0 - 72 - 2 - 10 -2.161160122792123 - 20 -3.437140815427867 - 40 -0.371373635976537 - 50 -163.3991489022961 - 51 -169.5663152899231 - 73 - 0 - 97 - 1 -330 -4C9 - 92 - 16 - 93 - 4 - 72 - 2 - 10 -1.788320029910184 - 20 -2.673441487468005 - 40 -0.2481310319481923 - 50 -339.5601350117603 - 51 -365.5770490458945 - 73 - 1 - 72 - 2 - 10 -2.015684652568724 - 20 -2.695642836263502 - 40 -0.0196850393700789 - 50 -5.57704904589411 - 51 -185.5770490458954 - 73 - 1 - 72 - 2 - 10 -1.788320029910183 - 20 -2.673441487468005 - 40 -0.2087609532080352 - 50 -354.4229509541054 - 51 -380.4398649882396 - 73 - 0 - 72 - 2 - 10 -2.002382887993199 - 20 -2.593662641184479 - 40 -0.0196850393700787 - 50 -159.5601350117616 - 51 -339.5601350117602 - 73 - 1 - 97 - 1 -330 -138 - 92 - 16 - 93 - 4 - 72 - 2 - 10 -1.988631326711838 - 20 -2.675424154108706 - 40 -0.2917786076489145 - 50 -176.6618056290539 - 51 -192.1921376659049 - 73 - 0 - 72 - 2 - 10 -1.722674860472906 - 20 -2.732887777074972 - 40 -0.0196850393700788 - 50 -192.1921376659057 - 51 -372.1921376659045 - 73 - 0 - 72 - 2 - 10 -1.988631326711838 - 20 -2.675424154108705 - 40 -0.2524085289087564 - 50 -167.807862334095 - 51 -183.338194370946 - 73 - 1 - 72 - 2 - 10 -1.716999440920682 - 20 -2.659580274525414 - 40 -0.0196850393700787 - 50 -356.6618056290538 - 51 -536.6618056290539 - 73 - 0 - 97 - 1 -330 -14E - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -C24 -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -1.788320029910184 - 20 -2.673441487468005 - 40 -0.2481310319481923 - 50 -339.5601350117603 - 51 -365.5770490458945 - 73 - 1 - 72 - 2 - 10 -2.015684652568724 - 20 -2.695642836263502 - 40 -0.0196850393700789 - 50 -5.57704904589411 - 51 -185.5770490458954 - 73 - 1 - 72 - 2 - 10 -1.788320029910183 - 20 -2.673441487468005 - 40 -0.2087609532080352 - 50 -354.4229509541054 - 51 -380.4398649882396 - 73 - 0 - 72 - 2 - 10 -2.002382887993199 - 20 -2.593662641184479 - 40 -0.0196850393700787 - 50 -159.5601350117616 - 51 -339.5601350117602 - 73 - 1 - 97 - 1 -330 -138 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -C25 -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 4 - 72 - 2 - 10 -1.988631326711838 - 20 -2.675424154108706 - 40 -0.2917786076489145 - 50 -176.6618056290539 - 51 -192.1921376659049 - 73 - 0 - 72 - 2 - 10 -1.722674860472906 - 20 -2.732887777074972 - 40 -0.0196850393700788 - 50 -192.1921376659057 - 51 -372.1921376659045 - 73 - 0 - 72 - 2 - 10 -1.988631326711838 - 20 -2.675424154108705 - 40 -0.2524085289087564 - 50 -167.807862334095 - 51 -183.338194370946 - 73 - 1 - 72 - 2 - 10 -1.716999440920682 - 20 -2.659580274525414 - 40 -0.0196850393700787 - 50 -356.6618056290538 - 51 -536.6618056290539 - 73 - 0 - 97 - 1 -330 -14E - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -C28 -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 27 - 92 - 1 - 93 - 48 - 72 - 2 - 10 -3.031233358735754 - 20 -1.618783385319762 - 40 -0.1683378964507315 - 50 -268.8981266360797 - 51 -328.3124434184161 - 73 - 0 - 72 - 2 - 10 -2.805854019540958 - 20 -1.479653877718506 - 40 -0.4332017603907771 - 50 -328.312443418416 - 51 -355.7300930418278 - 73 - 0 - 72 - 2 - 10 -2.720654010687053 - 20 -1.47329265706769 - 40 -0.5186389106058562 - 50 -355.7300930418277 - 51 -387.0857403971304 - 73 - 0 - 72 - 2 - 10 -3.019270278182164 - 20 -1.320576760853129 - 40 -0.1832379264550515 - 50 -27.08574039713041 - 51 -62.91425960287025 - 73 - 0 - 72 - 2 - 10 -2.617288604059704 - 20 -2.106600155295556 - 40 -1.066086748701018 - 50 -62.91425960286999 - 51 -83.90565057843106 - 73 - 0 - 72 - 2 - 10 -2.527478440588518 - 20 -2.94776010601788 - 40 -1.912027602521132 - 50 -83.90565057843116 - 51 -95.51019307772863 - 73 - 0 - 72 - 2 - 10 -2.411367250189849 - 20 -1.266852136052576 - 40 -0.2323033958896882 - 50 -106.8886617051031 - 51 -145.0036277051946 - 73 - 0 - 72 - 2 - 10 -1.842733556184506 - 20 -1.606506575382589 - 40 -0.6056050775775568 - 50 -51.33837874710574 - 51 -83.82931909093898 - 73 - 0 - 72 - 2 - 10 -1.867289566555309 - 20 -1.379382243234547 - 40 -0.3771571406224918 - 50 -83.82931909093904 - 51 -106.1706809090618 - 73 - 0 - 72 - 2 - 10 -1.872170704325742 - 20 -1.396215376152872 - 40 -0.3946836881941034 - 50 -106.1706809090621 - 51 -118.8560326885956 - 73 - 0 - 72 - 2 - 10 -1.542373482613905 - 20 -1.83573967301926 - 40 -0.7974660552058795 - 50 -79.93869473201835 - 51 -101.5302981560868 - 73 - 0 - 72 - 2 - 10 -1.584035429735764 - 20 -2.039961850738246 - 40 -1.00589449786731 - 50 -101.530298156087 - 51 -115.9981291148674 - 73 - 0 - 72 - 2 - 10 -1.03401257104743 - 20 -0.477027467195177 - 40 -0.6677997785619737 - 50 -80.5975463145049 - 51 -115.6894538187781 - 73 - 1 - 72 - 2 - 10 -0.7359925636398887 - 20 -1.096559104863404 - 40 -0.0196850393700787 - 50 -64.3105461812228 - 51 -178.3982111381467 - 73 - 0 - 72 - 2 - 10 -0.9476260308821786 - 20 -1.102477175547731 - 40 -0.2314012362413102 - 50 -178.3982111381469 - 51 -253.5469306045596 - 73 - 0 - 72 - 2 - 10 -1.168606309785877 - 20 -1.558605525778289 - 40 -0.3700601913995847 - 50 -140.7373098431768 - 51 -182.1149161181871 - 73 - 0 - 72 - 2 - 10 -1.060157361703604 - 20 -1.562610439508386 - 40 -0.2615373197358793 - 50 -182.1149161181871 - 51 -235.7398592611448 - 73 - 0 - 72 - 2 - 10 -1.268369849054956 - 20 -1.977371145189359 - 40 -0.4071662414854006 - 50 -150.8060111759436 - 51 -152.0052969205898 - 73 - 0 - 72 - 2 - 10 -1.065938622495786 - 20 -1.869760556959495 - 40 -0.1779099652672192 - 50 -152.0052969205898 - 51 -197.9947030794108 - 73 - 0 - 72 - 2 - 10 -1.163637847655054 - 20 -1.838026139816656 - 40 -0.2806339246346285 - 50 -197.9947030794104 - 51 -242.0052969205895 - 73 - 0 - 72 - 2 - 10 -1.134374454956794 - 20 -1.893074853652674 - 40 -0.2182904642942491 - 50 -242.0052969205897 - 51 -278.7513848946688 - 73 - 0 - 72 - 2 - 10 -1.318324160529893 - 20 -2.123002906229338 - 40 -0.1514028023784197 - 50 -174.626341759492 - 51 -287.1653967341294 - 73 - 0 - 72 - 2 - 10 -1.134452552508395 - 20 -1.527737292608446 - 40 -0.7744195910734504 - 50 -287.1653967341294 - 51 -311.2425077735102 - 73 - 0 - 72 - 2 - 10 --0.1012307034243847 - 20 -3.010931950741654 - 40 -1.964911005810923 - 50 -332.7104062850323 - 51 -333.8293190909388 - 73 - 1 - 72 - 2 - 10 -4.316192387813981 - 20 -0.8400973818280608 - 40 -2.957095647231735 - 50 -206.1706809090621 - 51 -209.2027098803458 - 73 - 0 - 72 - 2 - 10 -2.043049297315993 - 20 -2.110655210550981 - 40 -0.3529649465932583 - 50 -209.2027098803451 - 51 -225.0870679104569 - 73 - 0 - 72 - 2 - 10 -2.105362384851456 - 20 -2.371962053549119 - 40 -0.3117239109915287 - 50 -177.914487685338 - 51 -200.1246558462194 - 73 - 0 - 72 - 2 - 10 -1.964644164547905 - 20 -2.851218474936612 - 40 -0.4018490344643929 - 50 -112.2213810159718 - 51 -146.3606630021067 - 73 - 0 - 72 - 2 - 10 -1.952094170360633 - 20 -2.842867853274918 - 40 -0.3867747107237632 - 50 -146.3606630021067 - 51 -179.3917112422899 - 73 - 0 - 72 - 2 - 10 -2.636203773812854 - 20 -2.850131072655586 - 40 -1.070922870036734 - 50 -179.3917112422899 - 51 -203.5121882340314 - 73 - 0 - 72 - 2 - 10 -1.885608931176689 - 20 -3.176688874055116 - 40 -0.2523676700368166 - 50 -203.5121882340314 - 51 -247.919074760323 - 73 - 0 - 72 - 2 - 10 -2.161160122792124 - 20 -3.437140815427865 - 40 -0.3713736359765378 - 50 -175.8934715069597 - 51 -235.3701061614485 - 73 - 0 - 72 - 2 - 10 -2.010334078755422 - 20 -3.655531747894149 - 40 -0.1059624550830902 - 50 -235.3701061614487 - 51 -321.8826468892163 - 73 - 0 - 72 - 2 - 10 -1.984695044370156 - 20 -3.635415634546031 - 40 -0.1385510742689834 - 50 -321.8826468892165 - 51 -353.8787479269093 - 73 - 0 - 72 - 2 - 10 -2.205371433700895 - 20 -3.565115244906948 - 40 -0.1187965099453075 - 50 -225.7363985376375 - 51 -338.2090024626373 - 73 - 0 - 72 - 2 - 10 -1.924407631021267 - 20 -3.452788946261673 - 40 -0.4213817967382119 - 50 -338.2090024626376 - 51 -378.4288669894065 - 73 - 0 - 72 - 2 - 10 -2.2125235694189 - 20 -3.150570273791623 - 40 -0.2025609700371219 - 50 -303.4508923017655 - 51 -352.6179294579363 - 73 - 0 - 72 - 2 - 10 -0.968571355098534 - 20 -2.989404907072428 - 40 -1.456909959330881 - 50 -352.6179294579365 - 51 -362.2328550433406 - 73 - 0 - 72 - 2 - 10 -1.052072097282865 - 20 -2.970247608757846 - 40 -1.372818190612224 - 50 -1.569678067828868 - 51 -24.90118303007151 - 73 - 0 - 72 - 2 - 10 --37.185068533585 - 20 -20.72029698201224 - 40 -43.52899420762941 - 50 -24.90118303007369 - 51 -25.09881696993027 - 73 - 0 - 72 - 2 - 10 -3.496410384846288 - 20 -1.664724034128535 - 40 -1.394246852682421 - 50 -154.9011830300731 - 51 -163.0124653299814 - 73 - 1 - 72 - 2 - 10 -3.303260542295614 - 20 -0.6149685670603104 - 40 -1.850230401171077 - 50 -231.9548675004806 - 51 -245.3730203642641 - 73 - 0 - 72 - 2 - 10 -2.643315164634613 - 20 -2.054622849494737 - 40 -0.2665219827973205 - 50 -245.373020364264 - 51 -271.0025820049138 - 73 - 0 - 72 - 2 - 10 -2.646437101489009 - 20 -2.233017781588249 - 40 -0.0880997356240162 - 50 -271.0025820049141 - 51 -338.9974179950867 - 73 - 0 - 72 - 2 - 10 -2.583746606177169 - 20 -2.208949913643178 - 40 -0.1552515075281532 - 50 -338.9974179950864 - 51 -373.3205824975591 - 73 - 0 - 72 - 2 - 10 -2.833454996760046 - 20 -2.010774243926277 - 40 -0.1900112320680552 - 50 -238.728482917094 - 51 -295.0 - 73 - 0 - 72 - 2 - 10 -2.807174025728471 - 20 -1.954414519671351 - 40 -0.2521973073297553 - 50 -294.9999999999998 - 51 -365.0000000000006 - 73 - 0 - 72 - 2 - 10 -2.435514026542535 - 20 -1.986930556286176 - 40 -0.6252769873339419 - 50 -5.000000000000452 - 51 -18.63891789885247 - 73 - 0 - 97 - 1 -330 -8B3 - 92 - 16 - 93 - 5 - 72 - 2 - 10 -2.506661351932912 - 20 -2.343882490801413 - 40 -1.137317969685161 - 50 -295.2104838476032 - 51 -307.4903876208237 - 73 - 1 - 72 - 2 - 10 -2.72065401068705 - 20 -1.473292657067691 - 40 -0.4792688318657009 - 50 -3.806985506611603 - 51 -27.08574039713036 - 73 - 0 - 72 - 2 - 10 -3.019270278182163 - 20 -1.32057676085313 - 40 -0.1438678477148946 - 50 -27.08574039713062 - 51 -62.91425960287042 - 73 - 0 - 72 - 2 - 10 -2.617288604059699 - 20 -2.106600155295566 - 40 -1.026716669960872 - 50 -62.91425960286999 - 51 -74.08618998756283 - 73 - 0 - 72 - 2 - 10 -2.502316662315185 - 20 -1.425846770903515 - 40 -0.5012141309808816 - 50 -322.28430360547 - 51 -347.21072780023 - 73 - 1 - 97 - 1 -330 -4AD - 92 - 0 - 93 - 4 - 72 - 2 - 10 -2.35834385692291 - 20 -2.560871504972433 - 40 -1.017884167165215 - 50 -264.8798691909198 - 51 -277.0962125668474 - 73 - 1 - 72 - 2 - 10 -2.157099264484859 - 20 -1.761255447038774 - 40 -0.3888707645596128 - 50 -327.2321171951457 - 51 -344.8146293833702 - 73 - 1 - 72 - 2 - 10 -2.232025923290449 - 20 -2.762062415766465 - 40 -1.14284661053556 - 50 -74.76238100741742 - 51 -87.73997032522614 - 73 - 0 - 72 - 2 - 10 -1.875100795739506 - 20 -1.635718008880588 - 40 -0.4022960678253824 - 50 -2.224226079808037 - 51 -12.73296995122379 - 73 - 0 - 97 - 1 -330 -4C1 - 92 - 16 - 93 - 6 - 72 - 2 - 10 -2.506661351932914 - 20 -2.343882490801411 - 40 -1.097947890945 - 50 -252.9025993502986 - 51 -309.129589783908 - 73 - 1 - 72 - 2 - 10 -2.720654010687031 - 20 -1.473292657067699 - 40 -0.4792688318657188 - 50 -2.258737765182703 - 51 -4.269906958171121 - 73 - 1 - 72 - 2 - 10 -2.805854019540959 - 20 -1.479653877718507 - 40 -0.3938316816506187 - 50 -4.26990695817209 - 51 -31.68755658158391 - 73 - 1 - 72 - 2 - 10 -3.031233358735755 - 20 -1.618783385319762 - 40 -0.1289678177105734 - 50 -31.68755658158397 - 51 -88.75077942665364 - 73 - 1 - 72 - 2 - 10 -2.358343856922911 - 20 -2.560871504972435 - 40 -1.057254245905374 - 50 -50.27455552545634 - 51 -103.1717867618754 - 73 - 0 - 72 - 2 - 10 -3.174161319020478 - 20 -1.699913413586489 - 40 -1.070082152487853 - 50 -189.0587348045097 - 51 -202.2656996106713 - 73 - 1 - 97 - 1 -330 -4B5 - 92 - 16 - 93 - 5 - 72 - 2 - 10 -2.202541654133554 - 20 -1.362543685931673 - 40 -0.5298157619216942 - 50 -14.96903515149527 - 51 -32.33949759932654 - 73 - 0 - 72 - 2 - 10 -2.527478440588518 - 20 -2.947760106017868 - 40 -1.872657523780963 - 50 -273.7568474686516 - 51 -276.0943494215687 - 73 - 1 - 72 - 2 - 10 -2.617288604059703 - 20 -2.10660015529557 - 40 -1.026716669960875 - 50 -276.0943494215687 - 51 -282.0831632762506 - 73 - 1 - 72 - 2 - 10 -2.502316662315184 - 20 -1.425846770903515 - 40 -0.4618440522407246 - 50 -315.5859663701619 - 51 -343.4723636742463 - 73 - 1 - 72 - 2 - 10 -2.506661351932922 - 20 -2.3438824908014 - 40 -1.137317969685146 - 50 -67.32624731613089 - 51 -79.47656760874074 - 73 - 0 - 97 - 1 -330 -4B9 - 92 - 16 - 93 - 4 - 72 - 2 - 10 -2.05395636253349 - 20 -1.311094011306242 - 40 -0.40360054374194 - 50 -325.1586938734879 - 51 -345.2415144983743 - 73 - 1 - 72 - 2 - 10 -2.506661351932912 - 20 -2.343882490801414 - 40 -1.137317969685161 - 50 -266.8538285473494 - 51 -278.3272010683704 - 73 - 1 - 72 - 2 - 10 -2.202541654133556 - 20 -1.362543685931675 - 40 -0.4904456831815359 - 50 -17.0728403884595 - 51 -35.67171941040231 - 73 - 0 - 72 - 2 - 10 -2.527478440588521 - 20 -2.947760106017855 - 40 -1.87265752378095 - 50 -87.75100742187989 - 51 -94.35714735717728 - 73 - 0 - 97 - 1 -330 -4BA - 92 - 16 - 93 - 4 - 72 - 2 - 10 -2.506661351932914 - 20 -2.343882490801417 - 40 -1.137317969685164 - 50 -254.5896536710559 - 51 -264.8320604814776 - 73 - 1 - 72 - 2 - 10 -2.053956362533489 - 20 -1.311094011306244 - 40 -0.3642304650017842 - 50 -15.91994768566973 - 51 -37.94378452603665 - 73 - 0 - 72 - 2 - 10 -2.41136725018985 - 20 -1.266852136052575 - 40 -0.1929333171495304 - 50 -111.3287610035634 - 51 -150.8157377309437 - 73 - 0 - 72 - 2 - 10 -3.174161319020494 - 20 -1.699913413586516 - 40 -1.070082152487879 - 50 -150.4873427015391 - 51 -154.9868167954895 - 73 - 0 - 97 - 1 -330 -4BC - 92 - 0 - 93 - 4 - 72 - 2 - 10 -2.358343856922912 - 20 -2.56087150497244 - 40 -1.017884167165223 - 50 -255.9706947110459 - 51 -262.6477274601202 - 73 - 1 - 72 - 2 - 10 -1.875100795739507 - 20 -1.635718008880588 - 40 -0.3629259890852237 - 50 -346.5587102880505 - 51 -357.396057379031 - 73 - 1 - 72 - 2 - 10 -2.23202592329045 - 20 -2.762062415766459 - 40 -1.142846610535554 - 50 -89.71793740532951 - 51 -96.29947398788597 - 73 - 0 - 72 - 2 - 10 -3.174161319020505 - 20 -1.699913413586497 - 40 -1.070082152487882 - 50 -183.9544802865682 - 51 -186.7925864334441 - 73 - 1 - 97 - 1 -330 -4C0 - 92 - 16 - 93 - 4 - 72 - 2 - 10 -2.157099264484858 - 20 -1.761255447038777 - 40 -0.4282408432997721 - 50 -12.00230574940428 - 51 -28.29091643485702 - 73 - 0 - 72 - 2 - 10 -2.358343856922911 - 20 -2.560871504972434 - 40 -1.017884167165216 - 50 -279.9480036533407 - 51 -296.005896865796 - 73 - 1 - 72 - 2 - 10 -2.43480848147727 - 20 -1.74176023846554 - 40 -0.3820244196138822 - 50 -345.4907424301736 - 51 -365.6076870699981 - 73 - 1 - 72 - 2 - 10 -2.232025923290445 - 20 -2.762062415766465 - 40 -1.142846610535562 - 50 -59.32877074017064 - 51 -72.48465458233305 - 73 - 0 - 97 - 1 -330 -4C3 - 92 - 16 - 93 - 7 - 72 - 2 - 10 -3.174161319020492 - 20 -1.69991341358649 - 40 -1.070082152487867 - 50 -178.182030269148 - 51 -186.2319675330486 - 73 - 0 - 72 - 2 - 10 -3.496410384846752 - 20 -1.66472403412841 - 40 -1.394246852682911 - 50 -186.2319675330462 - 51 -188.4100158185151 - 73 - 0 - 72 - 2 - 10 -2.05576545700618 - 20 -2.861012413940887 - 40 -0.994268550367224 - 50 -273.5399568619239 - 51 -308.9576328012706 - 73 - 1 - 72 - 1 - 10 -2.680907394207461 - 20 -2.087858154687554 - 11 -2.747050780866419 - 21 -2.134172252628876 - 72 - 2 - 10 -2.833454996760046 - 20 -2.010774243926277 - 40 -0.1506411533278984 - 50 -235.0000000000002 - 51 -295.0 - 73 - 0 - 72 - 2 - 10 -2.807174025728471 - 20 -1.954414519671351 - 40 -0.2128272285895981 - 50 -294.9999999999998 - 51 -351.1901840561478 - 73 - 0 - 72 - 2 - 10 -2.232025923290446 - 20 -2.76206241576646 - 40 -1.1034765317954 - 50 -44.6177154324492 - 51 -96.63019658365178 - 73 - 0 - 97 - 1 -330 -4C7 - 92 - 16 - 93 - 6 - 72 - 2 - 10 -2.05576545700618 - 20 -2.861012413940887 - 40 -0.9548984716270655 - 50 -274.0763809413058 - 51 -308.9974179950865 - 73 - 1 - 72 - 2 - 10 -2.583746606177169 - 20 -2.208949913643178 - 40 -0.1158814287879965 - 50 -308.9974179950865 - 51 -381.0025820049136 - 73 - 1 - 72 - 2 - 10 -2.64643710148901 - 20 -2.233017781588249 - 40 -0.0487296568838581 - 50 -21.00258200491355 - 51 -88.99741799508618 - 73 - 1 - 72 - 2 - 10 -2.643315164634613 - 20 -2.054622849494738 - 40 -0.2271519040571613 - 50 -88.99741799508604 - 51 -114.6269796357359 - 73 - 1 - 72 - 2 - 10 -3.303260542295614 - 20 -0.6149685670603082 - 40 -1.810860322430921 - 50 -114.6269796357358 - 51 -129.7728051417874 - 73 - 1 - 72 - 2 - 10 -3.496410384846758 - 20 -1.664724034128341 - 40 -1.394246852682927 - 50 -165.7987430109054 - 51 -169.9291703474848 - 73 - 1 - 97 - 1 -330 -4C8 - 92 - 16 - 93 - 4 - 72 - 2 - 10 -1.034012571047431 - 20 -0.4770274671951757 - 40 -0.7071698573021327 - 50 -88.2250617963899 - 51 -113.037640194644 - 73 - 1 - 72 - 2 - 10 -0.9476260308821789 - 20 -1.102477175547732 - 40 -0.1920311575011529 - 50 -187.577294301379 - 51 -259.5173177193701 - 73 - 0 - 72 - 2 - 10 -1.168606309785881 - 20 -1.558605525778299 - 40 -0.3700601913995948 - 50 -226.2464306309096 - 51 -229.2045371712558 - 73 - 1 - 72 - 2 - 10 -1.584035429735768 - 20 -2.03996185073825 - 40 -1.005894497867316 - 50 -229.2045371712552 - 51 -238.3301051192357 - 73 - 1 - 97 - 1 -330 -4E7 - 92 - 16 - 93 - 4 - 72 - 2 - 10 -1.365920530767478 - 20 -1.285919869338796 - 40 -0.3113711740675595 - 50 -169.2458500319289 - 51 -182.205842988757 - 73 - 0 - 72 - 2 - 10 -1.454717916970979 - 20 -2.022108206218515 - 40 -0.827297613601817 - 50 -241.09054843511 - 51 -254.5550649161042 - 73 - 1 - 72 - 2 - 10 -1.606711922375474 - 20 -1.348933253591385 - 40 -0.3924976718251174 - 50 -198.4545948543501 - 51 -215.6989500329358 - 73 - 1 - 72 - 2 - 10 -1.584035429735761 - 20 -2.039961850738243 - 40 -0.9665244191271488 - 50 -107.8377726397921 - 51 -122.8312626374707 - 73 - 0 - 97 - 1 -330 -4EB - 92 - 0 - 93 - 4 - 72 - 2 - 10 -1.454717916970981 - 20 -2.022108206218515 - 40 -0.8272976136018175 - 50 -223.615566083045 - 51 -238.0440774153107 - 73 - 1 - 72 - 2 - 10 -1.365920530767478 - 20 -1.285919869338796 - 40 -0.3507412528077177 - 50 -174.3939645983117 - 51 -184.6071947080589 - 73 - 1 - 72 - 2 - 10 -1.584035429735767 - 20 -2.039961850738251 - 40 -0.9665244191271588 - 50 -125.9717238731088 - 51 -130.7954628287447 - 73 - 0 - 72 - 2 - 10 -1.168606309785878 - 20 -1.558605525778289 - 40 -0.3306901126594289 - 50 -130.7954628287448 - 51 -161.0882096390424 - 73 - 0 - 97 - 1 -330 -4F0 - 92 - 0 - 93 - 4 - 72 - 2 - 10 -1.448830865211245 - 20 -2.213371853903018 - 40 -0.5803064835681306 - 50 -252.3365152710513 - 51 -268.8118268997819 - 73 - 1 - 72 - 2 - 10 -2.244252791706375 - 20 -1.579066020312691 - 40 -0.8092671391653076 - 50 -176.1651718242215 - 51 -179.7775214345853 - 73 - 1 - 72 - 2 - 10 -1.382209127764961 - 20 -2.180776385554781 - 40 -0.6008907212088166 - 50 -84.96060718028212 - 51 -99.52487731460255 - 73 - 0 - 72 - 2 - 10 -1.754426611671092 - 20 -1.690434343062297 - 40 -0.4826097226376628 - 50 -167.7663152513758 - 51 -176.4348368363554 - 73 - 0 - 97 - 1 -330 -620 - 92 - 16 - 93 - 6 - 72 - 2 - 10 -1.268369849054951 - 20 -1.97737114518936 - 40 -0.4071662414853972 - 50 -214.7414744545867 - 51 -240.7656835685936 - 73 - 1 - 72 - 2 - 10 -1.382209127764962 - 20 -2.180776385554782 - 40 -0.6402607999489762 - 50 -240.7656835685933 - 51 -274.8013992041994 - 73 - 1 - 72 - 2 - 10 -2.244252791706376 - 20 -1.579066020312693 - 40 -0.8092671391653085 - 50 -182.5711456908801 - 51 -205.0661840751609 - 73 - 1 - 72 - 2 - 10 -1.454717916970982 - 20 -2.022108206218515 - 40 -0.78792753486166 - 50 -85.88902674875129 - 51 -141.3773954764613 - 73 - 0 - 72 - 2 - 10 -1.168606309785876 - 20 -1.558605525778289 - 40 -0.3306901126594269 - 50 -175.0885918849935 - 51 -182.1149161181871 - 73 - 0 - 72 - 2 - 10 -1.060157361703603 - 20 -1.562610439508386 - 40 -0.2221672409957212 - 50 -182.1149161181872 - 51 -235.3333452342021 - 73 - 0 - 97 - 1 -330 -4EE - 92 - 16 - 93 - 11 - 72 - 2 - 10 -1.735391678484751 - 20 -1.622446814297793 - 40 -0.3637008069698632 - 50 -46.50828210019076 - 51 -127.3801843342055 - 73 - 0 - 72 - 2 - 10 -2.244252791706377 - 20 -1.579066020312692 - 40 -0.7698970604251519 - 50 -198.604632170139 - 51 -206.170680909061 - 73 - 1 - 72 - 2 - 10 -1.87217070432574 - 20 -1.396215376152875 - 40 -0.3553136094539483 - 50 -206.170680909061 - 51 -220.7958011940912 - 73 - 1 - 72 - 2 - 10 -1.754854449164134 - 20 -1.637701886096329 - 40 -0.4973281664865742 - 50 -252.2434918237404 - 51 -291.0055844420299 - 73 - 1 - 72 - 2 - 10 -1.940182455435743 - 20 -1.155046537921708 - 40 -0.0196850393700786 - 50 -248.9944155579697 - 51 -428.9944155579707 - 73 - 0 - 72 - 2 - 10 -1.754854449164133 - 20 -1.637701886096329 - 40 -0.5366982452267322 - 50 -68.99441555797011 - 51 -99.84027979757452 - 73 - 0 - 72 - 2 - 10 -1.872170704325739 - 20 -1.396215376152874 - 40 -0.3553136094539469 - 50 -233.9619057741986 - 51 -253.8293190909382 - 73 - 1 - 72 - 2 - 10 -1.867289566555308 - 20 -1.379382243234548 - 40 -0.3377870618823355 - 50 -253.8293190909384 - 51 -276.1706809090611 - 73 - 1 - 72 - 2 - 10 -1.842733556184505 - 20 -1.606506575382589 - 40 -0.5662349988373994 - 50 -276.170680909061 - 51 -300.6079669543535 - 73 - 1 - 72 - 2 - 10 -2.448387279831183 - 20 -1.47470612641788 - 40 -0.4765713362946238 - 50 -131.7514141291648 - 51 -162.7742566190203 - 73 - 0 - 72 - 2 - 10 -3.245154141911026 - 20 -1.721739021653879 - 40 -1.31075517924367 - 50 -162.7742566190193 - 51 -163.9156492780123 - 73 - 0 - 97 - 1 -330 -4F4 - 92 - 16 - 93 - 36 - 72 - 2 - 10 -2.043049297315998 - 20 -2.110655210550977 - 40 -0.3135948678531067 - 50 -140.7856547310828 - 51 -150.7972901196548 - 73 - 1 - 72 - 2 - 10 -4.316192387813921 - 20 -0.8400973818280717 - 40 -2.91772556849152 - 50 -150.7972901196538 - 51 -151.5606552199046 - 73 - 1 - 72 - 2 - 10 -1.82896029060598 - 20 -2.312110103765454 - 40 -0.1138088004365485 - 50 -226.4676036039469 - 51 -253.8346334294888 - 73 - 1 - 72 - 2 - 10 -1.791794192050712 - 20 -2.183894323205893 - 40 -0.0196850393700787 - 50 -286.1653665705111 - 51 -466.1653665705111 - 73 - 0 - 72 - 2 - 10 -1.82896029060598 - 20 -2.312110103765454 - 40 -0.153178879176706 - 50 -106.1653665705111 - 51 -129.487348884315 - 73 - 0 - 72 - 2 - 10 -4.31619238781396 - 20 -0.8400973818280881 - 40 -2.917725568491546 - 50 -152.3551430085055 - 51 -153.8293190909382 - 73 - 1 - 72 - 2 - 10 --0.1012307034243785 - 20 -3.010931950741638 - 40 -2.004281084551068 - 50 -26.17068090906094 - 51 -27.44285015917365 - 73 - 0 - 72 - 2 - 10 -1.869973878918131 - 20 -2.229032723885394 - 40 -0.2390599525801008 - 50 -216.3816426472188 - 51 -279.0739534633693 - 73 - 1 - 72 - 2 - 10 -1.910780338072042 - 20 -1.973525769477851 - 40 -0.0196850393700789 - 50 -260.9260465366305 - 51 -440.9260465366307 - 73 - 0 - 72 - 2 - 10 -1.869973878918132 - 20 -2.229032723885395 - 40 -0.278430031320259 - 50 -80.92604653663092 - 51 -139.8013610445865 - 73 - 0 - 72 - 2 - 10 --0.101230703424352 - 20 -3.01093195074165 - 40 -2.004281084551049 - 50 -28.67087156360686 - 51 -33.18792433993601 - 73 - 0 - 72 - 2 - 10 -1.813793246529746 - 20 -2.127914574971419 - 40 -0.3198926968250738 - 50 -222.0119914468626 - 51 -273.6941141002521 - 73 - 1 - 72 - 2 - 10 -1.835672170020508 - 20 -1.78904239903142 - 40 -0.0196850393700788 - 50 -266.3058858997472 - 51 -446.3058858997478 - 73 - 0 - 72 - 2 - 10 -1.813793246529746 - 20 -2.127914574971419 - 40 -0.3592627755652315 - 50 -86.30588589974785 - 51 -136.3371185375852 - 73 - 0 - 72 - 2 - 10 -1.995105659775399 - 20 -1.606003070595645 - 40 -0.5192979821599312 - 50 -148.1708625321174 - 51 -171.6429565217715 - 73 - 1 - 72 - 2 - 10 -1.774379750743404 - 20 -1.9596864265737 - 40 -0.4040824222682091 - 50 -223.5109336967462 - 51 -281.1199173397384 - 73 - 1 - 72 - 2 - 10 -1.85610884645455 - 20 -1.543874911031386 - 40 -0.0196850393700787 - 50 -258.8800826602615 - 51 -438.8800826602615 - 73 - 0 - 72 - 2 - 10 -1.774379750743404 - 20 -1.9596864265737 - 40 -0.4434525010083663 - 50 -78.88008266026162 - 51 -132.2628434475095 - 73 - 0 - 72 - 2 - 10 -2.244252791706375 - 20 -1.579066020312694 - 40 -0.7698970604251502 - 50 -176.0947114644605 - 51 -193.0143530481955 - 73 - 1 - 72 - 2 - 10 -1.735391678484751 - 20 -1.622446814297793 - 40 -0.3243307282297058 - 50 -221.9378076910892 - 51 -317.3250616801697 - 73 - 1 - 72 - 2 - 10 -3.245154141910992 - 20 -1.721739021653846 - 40 -1.310755179243628 - 50 -165.9082787983328 - 51 -187.2257433809798 - 73 - 0 - 72 - 2 - 10 -2.601728566753492 - 20 -1.803316300498068 - 40 -0.6621787973190414 - 50 -187.2257433809798 - 51 -200.265282453191 - 73 - 0 - 72 - 2 - 10 -1.486332025585369 - 20 -2.215145842661859 - 40 -0.5268178451693419 - 50 -339.734717546809 - 51 -365.875687911445 - 73 - 1 - 72 - 2 - 10 -1.780100104900293 - 20 -2.245377841414935 - 40 -0.231498258665186 - 50 -5.875687911445098 - 51 -34.12431208855465 - 73 - 1 - 72 - 2 - 10 -1.928818024879454 - 20 -2.346159501416084 - 40 -0.0518487033762426 - 50 -34.12431208855484 - 51 -115.8756879114452 - 73 - 1 - 72 - 2 - 10 -2.043049297315996 - 20 -2.110655210550977 - 40 -0.3135948678531048 - 50 -115.8756879114451 - 51 -131.7156800642676 - 73 - 1 - 72 - 2 - 10 -2.105362384851459 - 20 -2.371962053549119 - 40 -0.2723538322513749 - 50 -185.7363493931126 - 51 -196.6535421822968 - 73 - 1 - 72 - 2 - 10 -2.224366300494004 - 20 -2.407559786221583 - 40 -0.3965678834278744 - 50 -196.6535421822967 - 51 -214.2452636527788 - 73 - 1 - 72 - 2 - 10 -1.775114796299714 - 20 -2.101729675474409 - 40 -0.1469014999420266 - 50 -325.7547363472213 - 51 -394.2452636527789 - 73 - 0 - 72 - 2 - 10 -1.880276536811822 - 20 -2.030140317515856 - 40 -0.0196850393700786 - 50 -34.24526365277875 - 51 -214.2452636527787 - 73 - 0 - 72 - 2 - 10 -1.775114796299714 - 20 -2.101729675474409 - 40 -0.1075314212018693 - 50 -325.7547363472211 - 51 -383.6864830926802 - 73 - 1 - 72 - 2 - 10 -1.724258670730545 - 20 -2.179559731729328 - 40 -0.1532919477378671 - 50 -13.05681211459937 - 51 -58.88974415557702 - 73 - 0 - 72 - 2 - 10 -1.793291568736173 - 20 -2.065168888754275 - 40 -0.0196850393700787 - 50 -58.88974415557702 - 51 -238.8897441555765 - 73 - 0 - 72 - 2 - 10 -1.724258670730541 - 20 -2.179559731729329 - 40 -0.1139218689977123 - 50 -301.1102558444241 - 51 -381.2576330469557 - 73 - 1 - 72 - 2 - 10 -2.224366300494005 - 20 -2.407559786221586 - 40 -0.435937962168034 - 50 -154.6425959514791 - 51 -163.3464578177032 - 73 - 0 - 72 - 2 - 10 -2.105362384851463 - 20 -2.371962053549115 - 40 -0.3117239109915352 - 50 -163.3464578177044 - 51 -168.3316806257954 - 73 - 0 - 97 - 1 -330 -4F7 - 92 - 16 - 93 - 7 - 72 - 2 - 10 -1.995105659775398 - 20 -1.606003070595649 - 40 -0.5586680609000869 - 50 -153.1774302023765 - 51 -173.1639087815069 - 73 - 1 - 72 - 2 - 10 -1.448830865211247 - 20 -2.213371853903018 - 40 -0.5409364048279738 - 50 -90.89204265530425 - 51 -153.6751728635248 - 73 - 0 - 72 - 2 - 10 -1.163637847655053 - 20 -1.838026139816656 - 40 -0.2412638458944706 - 50 -214.15747754694 - 51 -242.0052969205898 - 73 - 0 - 72 - 2 - 10 -1.134374454956795 - 20 -1.893074853652674 - 40 -0.1789203855540918 - 50 -242.0052969205894 - 51 -284.046994134434 - 73 - 0 - 72 - 2 - 10 -1.318324160529892 - 20 -2.123002906229338 - 40 -0.1514028023784195 - 50 -201.853727881165 - 51 -212.2168526331622 - 73 - 1 - 72 - 2 - 10 -1.492137893232153 - 20 -2.232530667257897 - 40 -0.3568475494804613 - 50 -212.2168526331617 - 51 -237.7831473668378 - 73 - 1 - 72 - 2 - 10 -1.573128668857933 - 20 -2.361057982102735 - 40 -0.5087645544459671 - 50 -237.7831473668379 - 51 -261.3425166986952 - 73 - 1 - 97 - 1 -330 -505 - 92 - 16 - 93 - 5 - 72 - 2 - 10 -1.75442661167109 - 20 -1.690434343062299 - 40 -0.5219798013778194 - 50 -181.7138221824677 - 51 -190.3415069086127 - 73 - 1 - 72 - 2 - 10 -1.382209127764958 - 20 -2.180776385554784 - 40 -0.6008907212088186 - 50 -103.5988396513469 - 51 -119.2343164314062 - 73 - 0 - 72 - 2 - 10 -1.26836984905495 - 20 -1.977371145189357 - 40 -0.3677961627452375 - 50 -119.2343164314065 - 51 -126.2926725539458 - 73 - 0 - 72 - 2 - 10 -1.365613936631298 - 20 -1.696475315724717 - 40 -0.3153299658786926 - 50 -177.17352188641 - 51 -195.5421431149888 - 73 - 0 - 72 - 2 - 10 -1.448830865211245 - 20 -2.213371853903018 - 40 -0.5803064835681301 - 50 -228.1704174204192 - 51 -248.1315658423051 - 73 - 1 - 97 - 1 -330 -507 - 92 - 16 - 93 - 5 - 72 - 2 - 10 -1.365613936631296 - 20 -1.696475315724716 - 40 -0.3547000446188475 - 50 -161.0626247765776 - 51 -177.1237827075663 - 73 - 1 - 72 - 2 - 10 -1.26836984905495 - 20 -1.977371145189359 - 40 -0.3677961627452389 - 50 -134.3293201388803 - 51 -152.0052969205894 - 73 - 0 - 72 - 2 - 10 -1.065938622495786 - 20 -1.869760556959495 - 40 -0.1385398865270621 - 50 -152.0052969205897 - 51 -197.9947030794107 - 73 - 0 - 72 - 2 - 10 -1.163637847655055 - 20 -1.838026139816656 - 40 -0.2412638458944715 - 50 -197.9947030794104 - 51 -202.8905358909278 - 73 - 0 - 72 - 2 - 10 -1.448830865211249 - 20 -2.213371853903019 - 40 -0.5803064835681331 - 50 -209.0183706588869 - 51 -223.8176444671686 - 73 - 1 - 97 - 1 -330 -509 - 92 - 16 - 93 - 6 - 72 - 2 - 10 -1.573128668857933 - 20 -2.361057982102735 - 40 -0.4693944757058101 - 50 -96.86618894004766 - 51 -122.2168526331621 - 73 - 0 - 72 - 2 - 10 -1.492137893232154 - 20 -2.232530667257898 - 40 -0.3174774707403054 - 50 -122.2168526331621 - 51 -147.7831473668382 - 73 - 0 - 72 - 2 - 10 -1.318324160529893 - 20 -2.123002906229338 - 40 -0.1120327236382623 - 50 -147.783147366838 - 51 -287.1653967341294 - 73 - 0 - 72 - 2 - 10 -1.134452552508394 - 20 -1.527737292608446 - 40 -0.7350495123332927 - 50 -287.1653967341295 - 51 -311.9725813008354 - 73 - 0 - 72 - 2 - 10 --0.1012307034243558 - 20 -3.010931950741639 - 40 -1.964911005810889 - 50 -28.47135626072658 - 51 -33.82931909093841 - 73 - 0 - 72 - 2 - 10 -1.9951056597754 - 20 -1.606003070595648 - 40 -0.5586680609000885 - 50 -146.1706809090616 - 51 -148.8453401595469 - 73 - 1 - 97 - 1 -330 -50B - 92 - 16 - 93 - 4 - 72 - 2 - 10 -2.434808481477273 - 20 -1.741760238465535 - 40 -0.4213944983540373 - 50 -350.138398092684 - 51 -368.2079411900966 - 73 - 1 - 72 - 2 - 10 -2.232025923290449 - 20 -2.76206241576646 - 40 -1.142846610535555 - 50 -302.8460023643591 - 51 -313.5174616433824 - 73 - 1 - 72 - 2 - 10 -2.435514026542539 - 20 -1.986930556286178 - 40 -0.5859069085937808 - 50 -5.250840664227033 - 51 -24.12657987446927 - 73 - 0 - 72 - 2 - 10 -2.358343856922903 - 20 -2.560871504972432 - 40 -1.017884167165218 - 50 -53.04812421612736 - 51 -61.11882105703474 - 73 - 0 - 97 - 1 -330 -510 - 92 - 16 - 93 - 5 - 72 - 2 - 10 -1.606711922375474 - 20 -1.348933253591385 - 40 -0.3531275930849602 - 50 -135.3746912145926 - 51 -157.4176362906217 - 73 - 0 - 72 - 2 - 10 -1.454717916970981 - 20 -2.022108206218514 - 40 -0.827297613601817 - 50 -257.8545362072944 - 51 -275.2691677284761 - 73 - 1 - 72 - 2 - 10 -1.872170704325741 - 20 -1.396215376152876 - 40 -0.3946836881941063 - 50 -210.0950891144055 - 51 -232.5295145799341 - 73 - 1 - 72 - 2 - 10 -1.542373482613905 - 20 -1.835739673019258 - 40 -0.75809597646572 - 50 -83.20542127045559 - 51 -101.5302981560868 - 73 - 0 - 72 - 2 - 10 -1.584035429735767 - 20 -2.039961850738253 - 40 -0.9665244191271609 - 50 -101.5302981560871 - 51 -103.684145503982 - 73 - 0 - 97 - 1 -330 -559 - 92 - 16 - 93 - 17 - 72 - 2 - 10 -2.10536238485146 - 20 -2.371962053549118 - 40 -0.2723538322513761 - 50 -159.7337422418206 - 51 -175.1380365575864 - 73 - 1 - 72 - 2 - 10 -2.043049297315996 - 20 -2.110655210550977 - 40 -0.352964946593263 - 50 -233.6796832772765 - 51 -244.1243120885548 - 73 - 0 - 72 - 2 - 10 -1.928818024879453 - 20 -2.346159501416084 - 40 -0.0912187821164004 - 50 -244.1243120885551 - 51 -325.8756879114455 - 73 - 0 - 72 - 2 - 10 -1.780100104900293 - 20 -2.245377841414934 - 40 -0.2708683374053446 - 50 -325.8756879114452 - 51 -354.1243120885547 - 73 - 0 - 72 - 2 - 10 -1.486332025585371 - 20 -2.215145842661859 - 40 -0.5661879239094977 - 50 -354.124312088555 - 51 -380.265282453191 - 73 - 0 - 72 - 2 - 10 -2.601728566753494 - 20 -1.803316300498069 - 40 -0.622808718578886 - 50 -159.7347175468091 - 51 -172.7742566190203 - 73 - 1 - 72 - 2 - 10 -3.245154141910993 - 20 -1.721739021653846 - 40 -1.271385100503472 - 50 -172.7742566190202 - 51 -197.2257433809798 - 73 - 1 - 72 - 2 - 10 -2.448387279831183 - 20 -1.474706126417881 - 40 -0.4372012575544668 - 50 -197.2257433809797 - 51 -229.6909739682446 - 73 - 1 - 72 - 2 - 10 -1.84273355618451 - 20 -1.606506575382588 - 40 -0.5662349988373949 - 50 -304.7588400511317 - 51 -309.2074896477569 - 73 - 1 - 72 - 2 - 10 -3.174161319020478 - 20 -1.699913413586492 - 40 -1.109452231228011 - 50 -151.3367493281762 - 51 -186.2319675330486 - 73 - 0 - 72 - 2 - 10 -3.49641038484678 - 20 -1.664724034128332 - 40 -1.433616931423104 - 50 -186.2319675330492 - 51 -205.0988169699291 - 73 - 0 - 72 - 2 - 10 --37.1850685335689 - 20 -20.72029698200291 - 40 -43.48962412887072 - 50 -334.901183030072 - 51 -335.0988169699286 - 73 - 1 - 72 - 2 - 10 -1.05207209728287 - 20 -2.970247608757844 - 40 -1.33344811187206 - 50 -335.0988169699285 - 51 -348.9886439523909 - 73 - 1 - 72 - 2 - 10 -1.959203223948364 - 20 -2.950701101027533 - 40 -0.4655223034750759 - 50 -30.33963089325502 - 51 -49.03787718203768 - 73 - 0 - 72 - 2 - 10 -1.804450685812644 - 20 -3.128961400613438 - 40 -0.701583910831935 - 50 -49.03787718203728 - 51 -65.26030603284518 - 73 - 0 - 72 - 2 - 10 -1.924151714798596 - 20 -2.869186907390315 - 40 -0.4155574720721139 - 50 -65.26030603284511 - 51 -82.84890216530907 - 73 - 0 - 72 - 2 - 10 -1.936208898089171 - 20 -2.773084900679216 - 40 -0.318702057340656 - 50 -82.84890216530943 - 51 -105.7184590811235 - 73 - 0 - 97 - 1 -330 -4F3 - 92 - 16 - 93 - 17 - 72 - 2 - 10 -1.885608931176688 - 20 -3.176688874055116 - 40 -0.2129975912966591 - 50 -114.9006616575818 - 51 -156.4878117659684 - 73 - 1 - 72 - 2 - 10 -2.636203773812854 - 20 -2.850131072655588 - 40 -1.031552791296577 - 50 -156.4878117659688 - 51 -180.6082887577103 - 73 - 1 - 72 - 2 - 10 -1.952094170360633 - 20 -2.842867853274917 - 40 -0.3474046319836055 - 50 -180.6082887577101 - 51 -213.6393369978933 - 73 - 1 - 72 - 2 - 10 -1.964644164547905 - 20 -2.851218474936612 - 40 -0.3624789557242355 - 50 -213.6393369978933 - 51 -250.0019612921961 - 73 - 1 - 72 - 2 - 10 -1.936208898089171 - 20 -2.773084900679217 - 40 -0.2793319786004991 - 50 -250.001961292196 - 51 -277.1510978346906 - 73 - 1 - 72 - 2 - 10 -1.924151714798597 - 20 -2.869186907390317 - 40 -0.3761873933319576 - 50 -277.1510978346908 - 51 -294.7396939671547 - 73 - 1 - 72 - 2 - 10 -1.804450685812644 - 20 -3.128961400613437 - 40 -0.6622138320917775 - 50 -294.7396939671549 - 51 -310.9621228179628 - 73 - 1 - 72 - 2 - 10 -1.959203223948364 - 20 -2.950701101027533 - 40 -0.4261522247349184 - 50 -310.9621228179625 - 51 -357.7626023297964 - 73 - 1 - 72 - 2 - 10 -0.9685713550985386 - 20 -2.989404907072427 - 40 -1.417539880590719 - 50 -357.7626023297966 - 51 -367.3820705420636 - 73 - 1 - 72 - 2 - 10 -2.2125235694189 - 20 -3.150570273791624 - 40 -0.1631908912969642 - 50 -7.382070542063584 - 51 -53.5251061991567 - 73 - 1 - 72 - 2 - 10 -1.924407631021267 - 20 -3.452788946261674 - 40 -0.4213817967382122 - 50 -23.94086726929591 - 51 -38.56090658709021 - 73 - 0 - 72 - 2 - 10 -2.174464534980624 - 20 -3.253450334179865 - 40 -0.1015938396722196 - 50 -38.56090658709 - 51 -128.8844964337146 - 73 - 0 - 72 - 1 - 10 -2.110688753100606 - 20 -3.174368364648643 - 11 -2.049360338450518 - 21 -3.223826763560005 - 72 - 1 - 10 -2.049360338450518 - 20 -3.223826763560005 - 11 -2.020698206844207 - 21 -3.208114453397319 - 72 - 2 - 10 -1.961644849992286 - 20 -3.289054064709398 - 40 -0.1001924130602254 - 50 -53.88559445512062 - 51 -115.5479523260344 - 73 - 0 - 72 - 2 - 10 -2.0110372932182 - 20 -3.39238482801838 - 40 -0.2147212744613677 - 50 -115.5479523260344 - 51 -163.3991489022965 - 73 - 0 - 72 - 2 - 10 -2.161160122792123 - 20 -3.437140815427867 - 40 -0.371373635976537 - 50 -163.3991489022961 - 51 -169.5663152899231 - 73 - 0 - 97 - 1 -330 -4C9 - 92 - 16 - 93 - 13 - 72 - 1 - 10 -2.053553115266256 - 20 -3.271022854778554 - 11 -2.135403416533275 - 21 -3.205014547305152 - 72 - 2 - 10 -2.174464534980624 - 20 -3.253450334179865 - 40 -0.0622237609320623 - 50 -231.1155035662852 - 51 -321.4390934129098 - 73 - 1 - 72 - 2 - 10 -1.924407631021268 - 20 -3.452788946261673 - 40 -0.3820117179980535 - 50 -321.4390934129098 - 51 -381.7909975373624 - 73 - 1 - 72 - 2 - 10 -2.205371433700895 - 20 -3.565115244906947 - 40 -0.0794264312051501 - 50 -21.79099753736259 - 51 -138.4608414339663 - 73 - 1 - 72 - 2 - 10 -2.359201923855247 - 20 -3.432035664951207 - 40 -0.2828284405938025 - 50 -138.9469336075647 - 51 -155.609089205736 - 73 - 1 - 72 - 2 - 10 -2.083688019187524 - 20 -3.556961618598168 - 40 -0.0196850393700788 - 50 -24.39091079426373 - 51 -197.0763607466141 - 73 - 0 - 72 - 1 - 10 -2.064870809553132 - 20 -3.562742050811843 - 11 -2.082872800905891 - 21 -3.621344458486482 - 72 - 2 - 10 -1.984695044370157 - 20 -3.635415634546031 - 40 -0.099180995528825 - 50 -351.8437155425206 - 51 -398.1173531107838 - 73 - 1 - 72 - 2 - 10 -2.010334078755422 - 20 -3.655531747894149 - 40 -0.066592376342933 - 50 -38.11735311078365 - 51 -124.6298938385513 - 73 - 1 - 72 - 2 - 10 -2.161160122792124 - 20 -3.437140815427865 - 40 -0.3320035572363805 - 50 -124.6298938385515 - 51 -196.6008510977037 - 73 - 1 - 72 - 2 - 10 -2.011037293218199 - 20 -3.39238482801838 - 40 -0.1753511957212102 - 50 -196.6008510977036 - 51 -244.4520476739657 - 73 - 1 - 72 - 2 - 10 -1.961644849992285 - 20 -3.289054064709398 - 40 -0.0608223343200681 - 50 -244.4520476739658 - 51 -308.2116001220994 - 73 - 1 - 72 - 1 - 10 -1.999267568517967 - 20 -3.241264030153233 - 11 -2.053553115266256 - 21 -3.271022854778554 - 97 - 1 -330 -4CB - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -C40 -330 -1F -100 -AcDbEntity - 8 -HATCH-WHITE -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 3 - 92 - 1 - 93 - 13 - 72 - 1 - 10 -2.053553115266256 - 20 -3.271022854778554 - 11 -2.135403416533275 - 21 -3.205014547305152 - 72 - 2 - 10 -2.174464534980624 - 20 -3.253450334179865 - 40 -0.0622237609320623 - 50 -231.1155035662852 - 51 -321.4390934129098 - 73 - 1 - 72 - 2 - 10 -1.924407631021268 - 20 -3.452788946261673 - 40 -0.3820117179980535 - 50 -321.4390934129098 - 51 -381.7909975373624 - 73 - 1 - 72 - 2 - 10 -2.205371433700895 - 20 -3.565115244906947 - 40 -0.0794264312051501 - 50 -21.79099753736259 - 51 -138.4608414339663 - 73 - 1 - 72 - 2 - 10 -2.359201923855247 - 20 -3.432035664951207 - 40 -0.2828284405938025 - 50 -138.9469336075647 - 51 -155.609089205736 - 73 - 1 - 72 - 2 - 10 -2.083688019187524 - 20 -3.556961618598168 - 40 -0.0196850393700788 - 50 -24.39091079426373 - 51 -197.0763607466141 - 73 - 0 - 72 - 1 - 10 -2.064870809553132 - 20 -3.562742050811843 - 11 -2.082872800905891 - 21 -3.621344458486482 - 72 - 2 - 10 -1.984695044370157 - 20 -3.635415634546031 - 40 -0.099180995528825 - 50 -351.8437155425206 - 51 -398.1173531107838 - 73 - 1 - 72 - 2 - 10 -2.010334078755422 - 20 -3.655531747894149 - 40 -0.066592376342933 - 50 -38.11735311078365 - 51 -124.6298938385513 - 73 - 1 - 72 - 2 - 10 -2.161160122792124 - 20 -3.437140815427865 - 40 -0.3320035572363805 - 50 -124.6298938385515 - 51 -196.6008510977037 - 73 - 1 - 72 - 2 - 10 -2.011037293218199 - 20 -3.39238482801838 - 40 -0.1753511957212102 - 50 -196.6008510977036 - 51 -244.4520476739657 - 73 - 1 - 72 - 2 - 10 -1.961644849992285 - 20 -3.289054064709398 - 40 -0.0608223343200681 - 50 -244.4520476739658 - 51 -308.2116001220994 - 73 - 1 - 72 - 1 - 10 -1.999267568517967 - 20 -3.241264030153233 - 11 -2.053553115266256 - 21 -3.271022854778554 - 97 - 1 -330 -4CB - 92 - 16 - 93 - 8 - 72 - 2 - 10 -2.10076671703864 - 20 -3.325655213407455 - 40 -0.0599397668605327 - 50 -267.8793336511986 - 51 -377.8793336511989 - 73 - 1 - 72 - 2 - 10 -2.052741812238583 - 20 -3.310162719091439 - 40 -0.1104017214519507 - 50 -17.87933365119892 - 51 -43.7673166448306 - 73 - 1 - 72 - 2 - 10 -2.103395451769339 - 20 -3.340116557206334 - 40 -0.0547683672910658 - 50 -57.93744139888317 - 51 -187.77563216475 - 73 - 1 - 72 - 2 - 10 -2.068634698539837 - 20 -3.335369986556996 - 40 -0.0196850393700788 - 50 -187.7756321647501 - 51 -367.7756321647502 - 73 - 1 - 72 - 2 - 10 -2.103395451769339 - 20 -3.340116557206334 - 40 -0.0153982885509082 - 50 -172.2243678352504 - 51 -287.334302618237 - 73 - 0 - 72 - 2 - 10 -2.052741812238584 - 20 -3.310162719091439 - 40 -0.0710316427117921 - 50 -321.0507208994834 - 51 -342.1206663488011 - 73 - 0 - 72 - 2 - 10 -2.100766717038639 - 20 -3.325655213407456 - 40 -0.0205696881203755 - 50 -342.1206663488009 - 51 -452.1206663488013 - 73 - 0 - 72 - 2 - 10 -2.099277124665835 - 20 -3.285428055915363 - 40 -0.0196850393700787 - 50 -87.8793336512005 - 51 -267.8793336511979 - 73 - 1 - 97 - 1 -330 -235 - 92 - 16 - 93 - 8 - 72 - 2 - 10 -1.921485017130019 - 20 -3.343003198213819 - 40 -0.0771903814552135 - 50 -359.5978819190761 - 51 -374.2374903606301 - 73 - 1 - 72 - 2 - 10 -1.980044176928186 - 20 -3.357861720825169 - 40 -0.0167755580220592 - 50 -14.23749036062933 - 51 -155.7625096393687 - 73 - 1 - 72 - 2 - 10 -2.003282808101446 - 20 -3.34739958355454 - 40 -0.0422606574936387 - 50 -155.7625096393692 - 51 -241.4329313324614 - 73 - 1 - 72 - 2 - 10 -1.973661171909946 - 20 -3.292995281984995 - 40 -0.0196850393700789 - 50 -298.5670686675385 - 51 -478.5670686675385 - 73 - 0 - 72 - 2 - 10 -2.003282808101446 - 20 -3.34739958355454 - 40 -0.0816307362337962 - 50 -118.5670686675387 - 51 -204.2374903606309 - 73 - 0 - 72 - 2 - 10 -1.980044176928186 - 20 -3.357861720825169 - 40 -0.0561456367622165 - 50 -204.2374903606306 - 51 -345.7625096393699 - 73 - 0 - 72 - 2 - 10 -1.921485017130019 - 20 -3.34300319821382 - 40 -0.1165604601953712 - 50 -345.76250963937 - 51 -360.4021180809241 - 73 - 0 - 72 - 2 - 10 -2.018358052101874 - 20 -3.342323304531541 - 40 -0.0196850393700787 - 50 -0.4021180809244088 - 51 -180.4021180809231 - 73 - 0 - 97 - 1 -330 -267 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -LWPOLYLINE - 5 -CB7 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 2 - 70 - 0 - 43 -0.0 - 10 -1.999999999999999 - 20 -0.5021900451212454 - 10 -1.999999999999998 - 20 -0.2137188753069325 - 0 -LWPOLYLINE - 5 -129E -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.699999999999999 - 20 -0.4263456413348424 - 10 -1.590116389297469 - 20 -0.3629043091162095 - 10 -1.590116389297469 - 20 -0.2153520942475884 - 0 -LWPOLYLINE - 5 -12B7 -102 -{ACAD_REACTORS -330 -1B2B -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 68 - 70 - 1 - 43 -0.0 - 10 -0.211518030839291 - 20 -1.132195865069596 - 10 -0.2115180308392921 - 20 -0.8856214579511849 - 10 -0.3800563547419098 - 20 -0.8242785247175163 - 10 -0.4819904717841743 - 20 -0.8831302146314739 - 42 --0.9999999999999999 - 10 -0.501675511154253 - 20 -0.8490347262935038 - 10 -0.4283509058011884 - 20 -0.8067007456546893 - 10 -0.4606008219772955 - 20 -0.7949627361090064 - 10 -0.56253493901956 - 20 -0.8538144260229641 - 42 --0.9999999999999999 - 10 -0.5822199783896387 - 20 -0.8197189376849939 - 10 -0.5088953730365742 - 20 -0.7773849570461795 - 10 -0.5411452892126811 - 20 -0.7656469475004968 - 10 -0.6430794062549456 - 20 -0.8244986374144544 - 42 --0.9999999999999999 - 10 -0.6627644456250243 - 20 -0.7904031490764842 - 10 -0.5894398402719598 - 20 -0.7480691684376697 - 10 -0.6216897564480669 - 20 -0.736331158891987 - 10 -0.7236238734903314 - 20 -0.7951828488059446 - 42 --0.9999999999999999 - 10 -0.7433089128604101 - 20 -0.7610873604679744 - 10 -0.6699843075073457 - 20 -0.7187533798291599 - 10 -0.7022342236834526 - 20 -0.7070153702834772 - 10 -0.8041683407257171 - 20 -0.7658670601974349 - 42 --0.9999999999999999 - 10 -0.8238533800957958 - 20 -0.7317715718594647 - 10 -0.7505287747427313 - 20 -0.6894375912206502 - 10 -0.7827786909188382 - 20 -0.6776995816749674 - 10 -0.8847128079611027 - 20 -0.7365512715889251 - 42 --0.9999999999999999 - 10 -0.9043978473311814 - 20 -0.7024557832509549 - 10 -0.8310732419781172 - 20 -0.6601218026121404 - 10 -0.8633231581542239 - 20 -0.6483837930664577 - 10 -0.9652572751964884 - 20 -0.7072354829804153 - 42 --0.9999999999999999 - 10 -0.9849423145665671 - 20 -0.6731399946424452 - 10 -0.9116177092135024 - 20 -0.6308060140036307 - 10 -0.9438676253896097 - 20 -0.619068004457948 - 10 -1.045801742431874 - 20 -0.6779196943719056 - 42 --0.9999999999999999 - 10 -1.065486781801953 - 20 -0.6438242060339354 - 10 -0.992162176448888 - 20 -0.6014902253951211 - 10 -1.024412092624995 - 20 -0.5897522158494382 - 10 -1.12634620966726 - 20 -0.6486039057633959 - 42 --0.9999999999999999 - 10 -1.146031249037339 - 20 -0.6145084174254256 - 10 -1.072706643684274 - 20 -0.5721744367866111 - 10 -1.104956559860381 - 20 -0.5604364272409283 - 10 -1.206890676902646 - 20 -0.6192881171548861 - 42 --0.9999999999999999 - 10 -1.226575716272724 - 20 -0.5851926288169159 - 10 -1.15325111091966 - 20 -0.5428586481781015 - 10 -1.185501027095767 - 20 -0.5311206386324185 - 10 -1.287435144138031 - 20 -0.5899723285463763 - 42 --0.9999999999999999 - 10 -1.30712018350811 - 20 -0.5558768402084061 - 10 -1.233795578155045 - 20 -0.5135428595695918 - 10 -1.266045494331153 - 20 -0.5018048500239088 - 10 -1.367979611373417 - 20 -0.5606565399378665 - 42 --0.9999999999999999 - 10 -1.387664650743496 - 20 -0.5265610515998964 - 10 -1.314340045390431 - 20 -0.4842270709610819 - 10 -1.346589961566538 - 20 -0.4724890614153991 - 10 -1.448524078608803 - 20 -0.5313407513293568 - 42 --0.9999999999999999 - 10 -1.468209117978881 - 20 -0.4972452629913866 - 10 -1.394884512625817 - 20 -0.4549112823525721 - 10 -1.427134428801924 - 20 -0.4431732728068893 - 10 -1.529068545844188 - 20 -0.5020249627208471 - 42 --0.9999999999999999 - 10 -1.548753585214267 - 20 -0.4679294743828769 - 10 -1.475428979861203 - 20 -0.4255954937440624 - 10 -1.50767889603731 - 20 -0.4138574841983796 - 10 -1.609613013079574 - 20 -0.4727091741123373 - 42 --0.9999999999999999 - 10 -1.629298052449653 - 20 -0.4386136857743671 - 10 -1.555973447096588 - 20 -0.3962797051355528 - 10 -1.588223363272695 - 20 -0.3845416955898698 - 10 -1.69015748031496 - 20 -0.4433933855038275 - 42 --0.9999999999999999 - 10 -1.709842519685038 - 20 -0.4092978971658573 - 10 -1.636517914331974 - 20 -0.366963916527043 - 10 -1.980314960629922 - 20 -0.2418320250459505 - 10 -1.980314960629921 - 20 -0.4884064321643613 - 0 -LWPOLYLINE - 5 -12FB -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -0.4918329914692137 - 20 -0.8660824704624889 - 10 -0.3819493807666841 - 20 -0.802641138243856 - 10 -0.3819493807666836 - 20 -0.6550889233752348 - 0 -LWPOLYLINE - 5 -133B -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.619455532764613 - 20 -0.4556614299433522 - 10 -1.509571922062084 - 20 -0.3922200977247193 - 10 -1.509571922062083 - 20 -0.2446678828560982 - 0 -LWPOLYLINE - 5 -136A -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.538911065529228 - 20 -0.4849772185518619 - 10 -1.429027454826698 - 20 -0.421535886333229 - 10 -1.429027454826698 - 20 -0.2739836714646079 - 0 -LWPOLYLINE - 5 -1399 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.458366598293842 - 20 -0.5142930071603717 - 10 -1.348482987591312 - 20 -0.4508516749417388 - 10 -1.348482987591312 - 20 -0.3032994600731177 - 0 -LWPOLYLINE - 5 -13C8 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.377822131058456 - 20 -0.5436087957688814 - 10 -1.267938520355927 - 20 -0.4801674635502485 - 10 -1.267938520355926 - 20 -0.3326152486816275 - 0 -LWPOLYLINE - 5 -13F7 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.297277663823071 - 20 -0.5729245843773911 - 10 -1.187394053120541 - 20 -0.5094832521587582 - 10 -1.18739405312054 - 20 -0.3619310372901372 - 0 -LWPOLYLINE - 5 -1426 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.216733196587685 - 20 -0.6022403729859009 - 10 -1.106849585885155 - 20 -0.538799040767268 - 10 -1.106849585885155 - 20 -0.391246825898647 - 0 -LWPOLYLINE - 5 -1455 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.136188729352299 - 20 -0.6315561615944107 - 10 -1.02630511864977 - 20 -0.5681148293757778 - 10 -1.026305118649769 - 20 -0.4205626145071568 - 0 -LWPOLYLINE - 5 -1484 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -1.055644262116914 - 20 -0.6608719502029206 - 10 -0.9457606514143839 - 20 -0.5974306179842876 - 10 -0.9457606514143835 - 20 -0.4498784031156665 - 0 -LWPOLYLINE - 5 -14B3 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -0.9750997948815278 - 20 -0.6901877388114303 - 10 -0.8652161841789981 - 20 -0.6267464065927973 - 10 -0.8652161841789977 - 20 -0.4791941917241763 - 0 -LWPOLYLINE - 5 -14E2 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -0.8945553276461421 - 20 -0.71950352741994 - 10 -0.7846717169436125 - 20 -0.656062195201307 - 10 -0.784671716943612 - 20 -0.508509980332686 - 0 -LWPOLYLINE - 5 -1511 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -0.8140108604107564 - 20 -0.7488193160284498 - 10 -0.7041272497082268 - 20 -0.6853779838098168 - 10 -0.7041272497082264 - 20 -0.5378257689411958 - 0 -LWPOLYLINE - 5 -1540 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -0.7334663931753708 - 20 -0.7781351046369596 - 10 -0.6235827824728412 - 20 -0.7146937724183267 - 10 -0.6235827824728407 - 20 -0.5671415575497055 - 0 -LWPOLYLINE - 5 -156F -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -0.652921925939985 - 20 -0.8074508932454694 - 10 -0.5430383152374554 - 20 -0.7440095610268365 - 10 -0.5430383152374549 - 20 -0.5964573461582153 - 0 -LWPOLYLINE - 5 -159E -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -0.5723774587045993 - 20 -0.836766681853979 - 10 -0.4624938480020697 - 20 -0.773325349635346 - 10 -0.4624938480020693 - 20 -0.625773134766725 - 0 -LWPOLYLINE - 5 -19B1 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.300000000000002 - 20 -0.4263456413348424 - 10 -2.409883610702532 - 20 -0.3629043091162095 - 10 -2.409883610702533 - 20 -0.2153520942475884 - 0 -LWPOLYLINE - 5 -19B2 -102 -{ACAD_REACTORS -330 -1B2B -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 68 - 70 - 1 - 43 -0.0 - 10 -3.788481969160711 - 20 -1.132195865069596 - 10 -3.78848196916071 - 20 -0.8856214579511849 - 10 -3.619943645258092 - 20 -0.8242785247175163 - 10 -3.518009528215828 - 20 -0.8831302146314739 - 42 -0.9999999999999999 - 10 -3.498324488845749 - 20 -0.8490347262935038 - 10 -3.571649094198813 - 20 -0.8067007456546893 - 10 -3.539399178022706 - 20 -0.7949627361090064 - 10 -3.437465060980442 - 20 -0.8538144260229641 - 42 -0.9999999999999999 - 10 -3.417780021610363 - 20 -0.8197189376849939 - 10 -3.491104626963428 - 20 -0.7773849570461795 - 10 -3.458854710787321 - 20 -0.7656469475004968 - 10 -3.356920593745056 - 20 -0.8244986374144544 - 42 -0.9999999999999999 - 10 -3.337235554374978 - 20 -0.7904031490764842 - 10 -3.410560159728042 - 20 -0.7480691684376697 - 10 -3.378310243551935 - 20 -0.736331158891987 - 10 -3.27637612650967 - 20 -0.7951828488059446 - 42 -0.9999999999999999 - 10 -3.256691087139592 - 20 -0.7610873604679744 - 10 -3.330015692492656 - 20 -0.7187533798291599 - 10 -3.297765776316549 - 20 -0.7070153702834772 - 10 -3.195831659274285 - 20 -0.7658670601974349 - 42 -0.9999999999999999 - 10 -3.176146619904206 - 20 -0.7317715718594647 - 10 -3.24947122525727 - 20 -0.6894375912206502 - 10 -3.217221309081164 - 20 -0.6776995816749674 - 10 -3.115287192038899 - 20 -0.7365512715889251 - 42 -0.9999999999999999 - 10 -3.09560215266882 - 20 -0.7024557832509549 - 10 -3.168926758021885 - 20 -0.6601218026121404 - 10 -3.136676841845778 - 20 -0.6483837930664577 - 10 -3.034742724803513 - 20 -0.7072354829804153 - 42 -0.9999999999999999 - 10 -3.015057685433435 - 20 -0.6731399946424452 - 10 -3.0883822907865 - 20 -0.6308060140036307 - 10 -3.056132374610392 - 20 -0.619068004457948 - 10 -2.954198257568128 - 20 -0.6779196943719056 - 42 -0.9999999999999999 - 10 -2.934513218198049 - 20 -0.6438242060339354 - 10 -3.007837823551114 - 20 -0.6014902253951211 - 10 -2.975587907375006 - 20 -0.5897522158494382 - 10 -2.873653790332742 - 20 -0.6486039057633959 - 42 -0.9999999999999999 - 10 -2.853968750962663 - 20 -0.6145084174254256 - 10 -2.927293356315728 - 20 -0.5721744367866111 - 10 -2.895043440139621 - 20 -0.5604364272409283 - 10 -2.793109323097356 - 20 -0.6192881171548861 - 42 -0.9999999999999999 - 10 -2.773424283727278 - 20 -0.5851926288169159 - 10 -2.846748889080342 - 20 -0.5428586481781015 - 10 -2.814498972904235 - 20 -0.5311206386324185 - 10 -2.712564855861971 - 20 -0.5899723285463763 - 42 -0.9999999999999999 - 10 -2.692879816491892 - 20 -0.5558768402084061 - 10 -2.766204421844956 - 20 -0.5135428595695918 - 10 -2.733954505668849 - 20 -0.5018048500239088 - 10 -2.632020388626585 - 20 -0.5606565399378665 - 42 -0.9999999999999999 - 10 -2.612335349256506 - 20 -0.5265610515998964 - 10 -2.68565995460957 - 20 -0.4842270709610819 - 10 -2.653410038433464 - 20 -0.4724890614153991 - 10 -2.551475921391199 - 20 -0.5313407513293568 - 42 -0.9999999999999999 - 10 -2.53179088202112 - 20 -0.4972452629913866 - 10 -2.605115487374185 - 20 -0.4549112823525721 - 10 -2.572865571198078 - 20 -0.4431732728068893 - 10 -2.470931454155814 - 20 -0.5020249627208471 - 42 -0.9999999999999999 - 10 -2.451246414785735 - 20 -0.4679294743828769 - 10 -2.524571020138799 - 20 -0.4255954937440624 - 10 -2.492321103962692 - 20 -0.4138574841983796 - 10 -2.390386986920428 - 20 -0.4727091741123373 - 42 -0.9999999999999999 - 10 -2.370701947550349 - 20 -0.4386136857743671 - 10 -2.444026552903414 - 20 -0.3962797051355528 - 10 -2.411776636727307 - 20 -0.3845416955898698 - 10 -2.309842519685042 - 20 -0.4433933855038275 - 42 -0.9999999999999999 - 10 -2.290157480314964 - 20 -0.4092978971658573 - 10 -2.363482085668028 - 20 -0.366963916527043 - 10 -2.01968503937008 - 20 -0.2418320250459505 - 10 -2.019685039370081 - 20 -0.4884064321643613 - 0 -LWPOLYLINE - 5 -19B3 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.461088934470774 - 20 -0.4849772185518619 - 10 -2.570972545173304 - 20 -0.421535886333229 - 10 -2.570972545173304 - 20 -0.2739836714646079 - 0 -LWPOLYLINE - 5 -19B4 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.380544467235389 - 20 -0.4556614299433522 - 10 -2.490428077937918 - 20 -0.3922200977247193 - 10 -2.490428077937918 - 20 -0.2446678828560982 - 0 -LWPOLYLINE - 5 -19B5 -102 -{ACAD_REACTORS -330 -1B2B -102 -} -330 -1F -100 -AcDbEntity - 8 -OUTLINE -100 -AcDbPolyline - 90 - 145 - 70 - 1 - 43 -0.0 - 10 -0.1721479520991344 - 20 -0.8718378449943008 - 42 -0.3152987888789827 - 10 -0.1851003114824874 - 20 -0.8533399587583579 - 10 -0.3622643413966053 - 20 -0.7888575252869718 - 10 -0.3622643413966049 - 20 -0.6550889233752349 - 42 -0.9999999999999999 - 10 -0.4016344201367623 - 20 -0.6550889233752348 - 10 -0.4016344201367628 - 20 -0.7745279885048381 - 10 -0.442808808631991 - 20 -0.759541736678462 - 10 -0.4428088086319906 - 20 -0.625773134766725 - 42 -0.9999999999999999 - 10 -0.482178887372148 - 20 -0.625773134766725 - 10 -0.4821788873721484 - 20 -0.7452121998963283 - 10 -0.5233532758673767 - 20 -0.7302259480699523 - 10 -0.5233532758673762 - 20 -0.5964573461582154 - 42 -0.9999999999999999 - 10 -0.5627233546075336 - 20 -0.5964573461582152 - 10 -0.5627233546075341 - 20 -0.7158964112878186 - 10 -0.6038977431027625 - 20 -0.7009101594614425 - 10 -0.603897743102762 - 20 -0.5671415575497056 - 42 -0.9999999999999999 - 10 -0.6432678218429194 - 20 -0.5671415575497054 - 10 -0.6432678218429199 - 20 -0.6865806226793086 - 10 -0.6844422103381481 - 20 -0.6715943708529328 - 10 -0.6844422103381477 - 20 -0.5378257689411958 - 42 -0.9999999999999999 - 10 -0.7238122890783051 - 20 -0.5378257689411958 - 10 -0.7238122890783055 - 20 -0.6572648340707989 - 10 -0.7649866775735338 - 20 -0.642278582244423 - 10 -0.7649866775735333 - 20 -0.508509980332686 - 42 -0.9999999999999999 - 10 -0.8043567563136907 - 20 -0.508509980332686 - 10 -0.8043567563136912 - 20 -0.6279490454622892 - 10 -0.8455311448089194 - 20 -0.6129627936359132 - 10 -0.845531144808919 - 20 -0.4791941917241763 - 42 -0.9999999999999999 - 10 -0.8849012235490764 - 20 -0.4791941917241762 - 10 -0.8849012235490769 - 20 -0.5986332568537795 - 10 -0.9260756120443052 - 20 -0.5836470050274035 - 10 -0.9260756120443048 - 20 -0.4498784031156666 - 42 -0.9999999999999999 - 10 -0.9654456907844622 - 20 -0.4498784031156665 - 10 -0.9654456907844626 - 20 -0.5693174682452696 - 10 -1.006620079279691 - 20 -0.5543312164188938 - 10 -1.00662007927969 - 20 -0.4205626145071568 - 42 -0.9999999999999999 - 10 -1.045990158019848 - 20 -0.4205626145071567 - 10 -1.045990158019848 - 20 -0.5400016796367598 - 10 -1.087164546515077 - 20 -0.525015427810384 - 10 -1.087164546515076 - 20 -0.3912468258986471 - 42 -0.9999999999999999 - 10 -1.126534625255234 - 20 -0.391246825898647 - 10 -1.126534625255234 - 20 -0.5106858910282501 - 10 -1.167709013750462 - 20 -0.4956996392018742 - 10 -1.167709013750462 - 20 -0.3619310372901373 - 42 -0.9999999999999999 - 10 -1.207079092490619 - 20 -0.3619310372901371 - 10 -1.20707909249062 - 20 -0.4813701024197403 - 10 -1.248253480985848 - 20 -0.4663838505933645 - 10 -1.248253480985848 - 20 -0.3326152486816275 - 42 -0.9999999999999999 - 10 -1.287623559726005 - 20 -0.3326152486816274 - 10 -1.287623559726006 - 20 -0.4520543138112305 - 10 -1.328797948221234 - 20 -0.4370680619848547 - 10 -1.328797948221233 - 20 -0.3032994600731178 - 42 -0.9999999999999999 - 10 -1.368168026961391 - 20 -0.3032994600731176 - 10 -1.368168026961391 - 20 -0.4227385252027208 - 10 -1.409342415456619 - 20 -0.407752273376345 - 10 -1.409342415456619 - 20 -0.273983671464608 - 42 -0.9999999999999999 - 10 -1.448712494196776 - 20 -0.2739836714646079 - 10 -1.448712494196777 - 20 -0.393422736594211 - 10 -1.489886882692005 - 20 -0.3784364847678352 - 10 -1.489886882692005 - 20 -0.2446678828560983 - 42 -0.9999999999999999 - 10 -1.529256961432162 - 20 -0.2446678828560981 - 10 -1.529256961432162 - 20 -0.3641069479857013 - 10 -1.570431349927391 - 20 -0.3491206961593254 - 10 -1.57043134992739 - 20 -0.2153520942475885 - 42 -0.9999999999999999 - 10 -1.609801428667548 - 20 -0.2153520942475884 - 10 -1.609801428667548 - 20 -0.3347911593771915 - 10 -1.993267320013264 - 20 -0.1952209890709761 - 42 -0.1763269807087526 - 10 -2.006732679986736 - 20 -0.1952209890709762 - 10 -2.390198571332454 - 20 -0.3347911593771915 - 10 -2.390198571332454 - 20 -0.2153520942475884 - 42 -0.9999999999999999 - 10 -2.429568650072611 - 20 -0.2153520942475885 - 10 -2.429568650072611 - 20 -0.3491206961593254 - 10 -2.470743038567839 - 20 -0.3641069479857013 - 10 -2.47074303856784 - 20 -0.2446678828560981 - 42 -0.9999999999999999 - 10 -2.510113117307997 - 20 -0.2446678828560983 - 10 -2.510113117307997 - 20 -0.3784364847678352 - 10 -2.551287505803225 - 20 -0.393422736594211 - 10 -2.551287505803225 - 20 -0.2739836714646079 - 42 -0.9999999999999999 - 10 -2.590657584543383 - 20 -0.273983671464608 - 10 -2.590657584543382 - 20 -0.407752273376345 - 10 -2.631831973038611 - 20 -0.4227385252027208 - 10 -2.631831973038611 - 20 -0.3032994600731176 - 42 -0.9999999999999999 - 10 -2.671202051778768 - 20 -0.3032994600731178 - 10 -2.671202051778768 - 20 -0.4370680619848547 - 10 -2.712376440273996 - 20 -0.4520543138112305 - 10 -2.712376440273997 - 20 -0.3326152486816274 - 42 -0.9999999999999999 - 10 -2.751746519014154 - 20 -0.3326152486816275 - 10 -2.751746519014154 - 20 -0.4663838505933645 - 10 -2.792920907509382 - 20 -0.4813701024197403 - 10 -2.792920907509383 - 20 -0.3619310372901371 - 42 -0.9999999999999999 - 10 -2.83229098624954 - 20 -0.3619310372901373 - 10 -2.832290986249539 - 20 -0.4956996392018742 - 10 -2.873465374744768 - 20 -0.5106858910282501 - 10 -2.873465374744768 - 20 -0.391246825898647 - 42 -0.9999999999999999 - 10 -2.912835453484925 - 20 -0.3912468258986471 - 10 -2.912835453484925 - 20 -0.525015427810384 - 10 -2.954009841980153 - 20 -0.5400016796367598 - 10 -2.954009841980154 - 20 -0.4205626145071567 - 42 -0.9999999999999999 - 10 -2.993379920720312 - 20 -0.4205626145071568 - 10 -2.993379920720311 - 20 -0.5543312164188938 - 10 -3.034554309215539 - 20 -0.5693174682452696 - 10 -3.034554309215539 - 20 -0.4498784031156665 - 42 -0.9999999999999999 - 10 -3.073924387955697 - 20 -0.4498784031156666 - 10 -3.073924387955697 - 20 -0.5836470050274035 - 10 -3.115098776450925 - 20 -0.5986332568537795 - 10 -3.115098776450925 - 20 -0.4791941917241762 - 42 -0.9999999999999999 - 10 -3.154468855191083 - 20 -0.4791941917241763 - 10 -3.154468855191082 - 20 -0.6129627936359132 - 10 -3.195643243686311 - 20 -0.6279490454622892 - 10 -3.195643243686311 - 20 -0.508509980332686 - 42 -0.9999999999999999 - 10 -3.235013322426469 - 20 -0.508509980332686 - 10 -3.235013322426468 - 20 -0.642278582244423 - 10 -3.276187710921696 - 20 -0.6572648340707989 - 10 -3.276187710921697 - 20 -0.5378257689411958 - 42 -0.9999999999999999 - 10 -3.315557789661854 - 20 -0.5378257689411958 - 10 -3.315557789661854 - 20 -0.6715943708529328 - 10 -3.356732178157082 - 20 -0.6865806226793086 - 10 -3.356732178157082 - 20 -0.5671415575497054 - 42 -0.9999999999999999 - 10 -3.39610225689724 - 20 -0.5671415575497056 - 10 -3.396102256897239 - 20 -0.7009101594614425 - 10 -3.437276645392468 - 20 -0.7158964112878186 - 10 -3.437276645392468 - 20 -0.5964573461582152 - 42 -0.9999999999999999 - 10 -3.476646724132626 - 20 -0.5964573461582154 - 10 -3.476646724132625 - 20 -0.7302259480699523 - 10 -3.517821112627853 - 20 -0.7452121998963283 - 10 -3.517821112627854 - 20 -0.625773134766725 - 42 -0.9999999999999999 - 10 -3.557191191368011 - 20 -0.625773134766725 - 10 -3.557191191368011 - 20 -0.759541736678462 - 10 -3.598365579863239 - 20 -0.7745279885048381 - 10 -3.598365579863239 - 20 -0.6550889233752348 - 42 -0.9999999999999999 - 10 -3.637735658603397 - 20 -0.6550889233752349 - 10 -3.637735658603396 - 20 -0.7888575252869718 - 10 -3.814899688517512 - 20 -0.853339958758357 - 42 -0.3152987888789825 - 10 -3.827852047900865 - 20 -0.8718378449942998 - 10 -3.827852047900866 - 20 -1.160309014808614 - 42 -0.2914734195860939 - 10 -3.816486265651666 - 20 -1.17814971927784 - 10 -3.302025394556464 - 20 -1.418046763290625 - 42 -0.9999999999999994 - 10 -3.285386880314704 - 20 -1.382365354352174 - 10 -3.756776480718013 - 20 -1.162552773709486 - 10 -2.0 - 20 -0.5231384264691965 - 10 -0.2432235192819858 - 20 -1.162552773709486 - 10 -0.7689601562847856 - 20 -1.407707793716547 - 42 -1.000000000000008 - 10 -0.7523216420430257 - 20 -1.443389202654997 - 10 -0.1835137343483321 - 20 -1.178149719277839 - 42 -0.2914734195860883 - 10 -0.1721479520991333 - 20 -1.160309014808614 - 0 -LWPOLYLINE - 5 -19B6 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.702722336176931 - 20 -0.5729245843773911 - 10 -2.812605946879461 - 20 -0.5094832521587582 - 10 -2.812605946879462 - 20 -0.3619310372901372 - 0 -LWPOLYLINE - 5 -19B7 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.622177868941545 - 20 -0.5436087957688814 - 10 -2.732061479644075 - 20 -0.4801674635502485 - 10 -2.732061479644075 - 20 -0.3326152486816275 - 0 -LWPOLYLINE - 5 -19B8 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.54163340170616 - 20 -0.5142930071603717 - 10 -2.651517012408689 - 20 -0.4508516749417388 - 10 -2.65151701240869 - 20 -0.3032994600731177 - 0 -LWPOLYLINE - 5 -19B9 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.863811270647703 - 20 -0.6315561615944107 - 10 -2.973694881350232 - 20 -0.5681148293757778 - 10 -2.973694881350233 - 20 -0.4205626145071568 - 0 -LWPOLYLINE - 5 -19BA -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.783266803412317 - 20 -0.6022403729859009 - 10 -2.893150414114847 - 20 -0.538799040767268 - 10 -2.893150414114847 - 20 -0.391246825898647 - 0 -LWPOLYLINE - 5 -19BB -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -3.10544467235386 - 20 -0.71950352741994 - 10 -3.215328283056389 - 20 -0.656062195201307 - 10 -3.21532828305639 - 20 -0.508509980332686 - 0 -LWPOLYLINE - 5 -19BC -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -2.944355737883088 - 20 -0.6608719502029206 - 10 -3.054239348585618 - 20 -0.5974306179842876 - 10 -3.054239348585618 - 20 -0.4498784031156665 - 0 -LWPOLYLINE - 5 -19BD -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -3.024900205118474 - 20 -0.6901877388114303 - 10 -3.134783815821004 - 20 -0.6267464065927973 - 10 -3.134783815821004 - 20 -0.4791941917241763 - 0 -LWPOLYLINE - 5 -19BE -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -3.508167008530788 - 20 -0.8660824704624889 - 10 -3.618050619233318 - 20 -0.802641138243856 - 10 -3.618050619233318 - 20 -0.6550889233752348 - 0 -LWPOLYLINE - 5 -19BF -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -3.185989139589245 - 20 -0.7488193160284498 - 10 -3.295872750291775 - 20 -0.6853779838098168 - 10 -3.295872750291776 - 20 -0.5378257689411958 - 0 -LWPOLYLINE - 5 -19C0 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -3.266533606824631 - 20 -0.7781351046369596 - 10 -3.376417217527161 - 20 -0.7146937724183267 - 10 -3.376417217527161 - 20 -0.5671415575497055 - 0 -LWPOLYLINE - 5 -19C1 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -3.347078074060017 - 20 -0.8074508932454694 - 10 -3.456961684762546 - 20 -0.7440095610268365 - 10 -3.456961684762547 - 20 -0.5964573461582153 - 0 -LWPOLYLINE - 5 -19C2 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 3 - 70 - 0 - 43 -0.0 - 10 -3.427622541295403 - 20 -0.836766681853979 - 10 -3.537506151997932 - 20 -0.773325349635346 - 10 -3.537506151997933 - 20 -0.625773134766725 - 0 -LWPOLYLINE - 5 -1A86 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 5 - 70 - 0 - 43 -0.0 - 10 -3.808167008530787 - 20 -1.160309014808614 - 10 -3.808167008530789 - 20 -0.8718378449943008 - 10 -2.000000000000001 - 20 -0.2137188753069324 - 10 -0.1918329914692131 - 20 -0.8718378449943008 - 10 -0.1918329914692121 - 20 -1.160309014808614 - 0 -LWPOLYLINE - 5 -1A88 -330 -1F -100 -AcDbEntity - 8 -CENTERLINE -100 -AcDbPolyline - 90 - 5 - 70 - 0 - 43 -0.0 - 10 -0.7606408991639058 - 20 -1.425548498185772 - 10 -0.1918329914692121 - 20 -1.160309014808614 - 10 -1.999999999999999 - 20 -0.5021900451212454 - 10 -3.808167008530787 - 20 -1.160309014808614 - 10 -3.293706137435584 - 20 -1.4002060588214 - 0 -HATCH - 5 -1B2B -330 -1F -100 -AcDbEntity - 8 -HATCH-BLACK -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 3 - 92 - 1 - 93 - 145 - 72 - 2 - 10 -0.1918329914692131 - 20 -0.871837844994301 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -250.0 - 73 - 1 - 72 - 1 - 10 -0.1851003114824874 - 20 -0.8533399587583579 - 11 -0.3622643413966053 - 21 -0.7888575252869718 - 72 - 1 - 10 -0.3622643413966053 - 20 -0.7888575252869718 - 11 -0.3622643413966049 - 21 -0.6550889233752349 - 72 - 2 - 10 -0.3819493807666836 - 20 -0.6550889233752349 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -0.4016344201367623 - 20 -0.6550889233752348 - 11 -0.4016344201367628 - 21 -0.7745279885048381 - 72 - 1 - 10 -0.4016344201367628 - 20 -0.7745279885048381 - 11 -0.442808808631991 - 21 -0.759541736678462 - 72 - 1 - 10 -0.442808808631991 - 20 -0.759541736678462 - 11 -0.4428088086319906 - 21 -0.625773134766725 - 72 - 2 - 10 -0.4624938480020693 - 20 -0.625773134766725 - 40 -0.0196850393700787 - 50 -180.0 - 51 -360.0 - 73 - 1 - 72 - 1 - 10 -0.482178887372148 - 20 -0.625773134766725 - 11 -0.4821788873721484 - 21 -0.7452121998963283 - 72 - 1 - 10 -0.4821788873721484 - 20 -0.7452121998963283 - 11 -0.5233532758673767 - 21 -0.7302259480699523 - 72 - 1 - 10 -0.5233532758673767 - 20 -0.7302259480699523 - 11 -0.5233532758673762 - 21 -0.5964573461582154 - 72 - 2 - 10 -0.5430383152374549 - 20 -0.5964573461582153 - 40 -0.0196850393700787 - 50 -179.9999999999997 - 51 -359.9999999999997 - 73 - 1 - 72 - 1 - 10 -0.5627233546075336 - 20 -0.5964573461582152 - 11 -0.5627233546075341 - 21 -0.7158964112878186 - 72 - 1 - 10 -0.5627233546075341 - 20 -0.7158964112878186 - 11 -0.6038977431027625 - 21 -0.7009101594614425 - 72 - 1 - 10 -0.6038977431027625 - 20 -0.7009101594614425 - 11 -0.603897743102762 - 21 -0.5671415575497056 - 72 - 2 - 10 -0.6235827824728407 - 20 -0.5671415575497055 - 40 -0.0196850393700787 - 50 -179.9999999999997 - 51 -359.9999999999997 - 73 - 1 - 72 - 1 - 10 -0.6432678218429194 - 20 -0.5671415575497054 - 11 -0.6432678218429199 - 21 -0.6865806226793086 - 72 - 1 - 10 -0.6432678218429199 - 20 -0.6865806226793086 - 11 -0.6844422103381481 - 21 -0.6715943708529328 - 72 - 1 - 10 -0.6844422103381481 - 20 -0.6715943708529328 - 11 -0.6844422103381477 - 21 -0.5378257689411958 - 72 - 2 - 10 -0.7041272497082264 - 20 -0.5378257689411958 - 40 -0.0196850393700787 - 50 -180.0 - 51 -360.0 - 73 - 1 - 72 - 1 - 10 -0.7238122890783051 - 20 -0.5378257689411958 - 11 -0.7238122890783055 - 21 -0.6572648340707989 - 72 - 1 - 10 -0.7238122890783055 - 20 -0.6572648340707989 - 11 -0.7649866775735338 - 21 -0.642278582244423 - 72 - 1 - 10 -0.7649866775735338 - 20 -0.642278582244423 - 11 -0.7649866775735333 - 21 -0.508509980332686 - 72 - 2 - 10 -0.784671716943612 - 20 -0.508509980332686 - 40 -0.0196850393700787 - 50 -180.0 - 51 -360.0 - 73 - 1 - 72 - 1 - 10 -0.8043567563136907 - 20 -0.508509980332686 - 11 -0.8043567563136912 - 21 -0.6279490454622892 - 72 - 1 - 10 -0.8043567563136912 - 20 -0.6279490454622892 - 11 -0.8455311448089194 - 21 -0.6129627936359132 - 72 - 1 - 10 -0.8455311448089194 - 20 -0.6129627936359132 - 11 -0.845531144808919 - 21 -0.4791941917241763 - 72 - 2 - 10 -0.8652161841789977 - 20 -0.4791941917241763 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -0.8849012235490764 - 20 -0.4791941917241762 - 11 -0.8849012235490769 - 21 -0.5986332568537795 - 72 - 1 - 10 -0.8849012235490769 - 20 -0.5986332568537795 - 11 -0.9260756120443052 - 21 -0.5836470050274035 - 72 - 1 - 10 -0.9260756120443052 - 20 -0.5836470050274035 - 11 -0.9260756120443048 - 21 -0.4498784031156666 - 72 - 2 - 10 -0.9457606514143835 - 20 -0.4498784031156665 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -0.9654456907844622 - 20 -0.4498784031156665 - 11 -0.9654456907844626 - 21 -0.5693174682452696 - 72 - 1 - 10 -0.9654456907844626 - 20 -0.5693174682452696 - 11 -1.006620079279691 - 21 -0.5543312164188938 - 72 - 1 - 10 -1.006620079279691 - 20 -0.5543312164188938 - 11 -1.00662007927969 - 21 -0.4205626145071568 - 72 - 2 - 10 -1.026305118649769 - 20 -0.4205626145071568 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.045990158019848 - 20 -0.4205626145071567 - 11 -1.045990158019848 - 21 -0.5400016796367598 - 72 - 1 - 10 -1.045990158019848 - 20 -0.5400016796367598 - 11 -1.087164546515077 - 21 -0.525015427810384 - 72 - 1 - 10 -1.087164546515077 - 20 -0.525015427810384 - 11 -1.087164546515076 - 21 -0.3912468258986471 - 72 - 2 - 10 -1.106849585885155 - 20 -0.391246825898647 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.126534625255234 - 20 -0.391246825898647 - 11 -1.126534625255234 - 21 -0.5106858910282501 - 72 - 1 - 10 -1.126534625255234 - 20 -0.5106858910282501 - 11 -1.167709013750462 - 21 -0.4956996392018742 - 72 - 1 - 10 -1.167709013750462 - 20 -0.4956996392018742 - 11 -1.167709013750462 - 21 -0.3619310372901373 - 72 - 2 - 10 -1.18739405312054 - 20 -0.3619310372901372 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.207079092490619 - 20 -0.3619310372901371 - 11 -1.20707909249062 - 21 -0.4813701024197403 - 72 - 1 - 10 -1.20707909249062 - 20 -0.4813701024197403 - 11 -1.248253480985848 - 21 -0.4663838505933645 - 72 - 1 - 10 -1.248253480985848 - 20 -0.4663838505933645 - 11 -1.248253480985848 - 21 -0.3326152486816275 - 72 - 2 - 10 -1.267938520355926 - 20 -0.3326152486816275 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.287623559726005 - 20 -0.3326152486816274 - 11 -1.287623559726006 - 21 -0.4520543138112305 - 72 - 1 - 10 -1.287623559726006 - 20 -0.4520543138112305 - 11 -1.328797948221234 - 21 -0.4370680619848547 - 72 - 1 - 10 -1.328797948221234 - 20 -0.4370680619848547 - 11 -1.328797948221233 - 21 -0.3032994600731178 - 72 - 2 - 10 -1.348482987591312 - 20 -0.3032994600731177 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.368168026961391 - 20 -0.3032994600731176 - 11 -1.368168026961391 - 21 -0.4227385252027208 - 72 - 1 - 10 -1.368168026961391 - 20 -0.4227385252027208 - 11 -1.409342415456619 - 21 -0.407752273376345 - 72 - 1 - 10 -1.409342415456619 - 20 -0.407752273376345 - 11 -1.409342415456619 - 21 -0.273983671464608 - 72 - 2 - 10 -1.429027454826698 - 20 -0.2739836714646079 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.448712494196776 - 20 -0.2739836714646079 - 11 -1.448712494196777 - 21 -0.393422736594211 - 72 - 1 - 10 -1.448712494196777 - 20 -0.393422736594211 - 11 -1.489886882692005 - 21 -0.3784364847678352 - 72 - 1 - 10 -1.489886882692005 - 20 -0.3784364847678352 - 11 -1.489886882692005 - 21 -0.2446678828560983 - 72 - 2 - 10 -1.509571922062083 - 20 -0.2446678828560982 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.529256961432162 - 20 -0.2446678828560981 - 11 -1.529256961432162 - 21 -0.3641069479857013 - 72 - 1 - 10 -1.529256961432162 - 20 -0.3641069479857013 - 11 -1.570431349927391 - 21 -0.3491206961593254 - 72 - 1 - 10 -1.570431349927391 - 20 -0.3491206961593254 - 11 -1.57043134992739 - 21 -0.2153520942475885 - 72 - 2 - 10 -1.590116389297469 - 20 -0.2153520942475884 - 40 -0.0196850393700787 - 50 -179.9999999999998 - 51 -359.9999999999998 - 73 - 1 - 72 - 1 - 10 -1.609801428667548 - 20 -0.2153520942475884 - 11 -1.609801428667548 - 21 -0.3347911593771915 - 72 - 1 - 10 -1.609801428667548 - 20 -0.3347911593771915 - 11 -1.993267320013264 - 21 -0.1952209890709761 - 72 - 2 - 10 -2.0 - 20 -0.2137188753069149 - 40 -0.0196850393700781 - 50 -249.9999999999685 - 51 -290.0000000000325 - 73 - 1 - 72 - 1 - 10 -2.006732679986736 - 20 -0.1952209890709762 - 11 -2.390198571332454 - 21 -0.3347911593771915 - 72 - 1 - 10 -2.390198571332454 - 20 -0.3347911593771915 - 11 -2.390198571332454 - 21 -0.2153520942475884 - 72 - 2 - 10 -2.409883610702533 - 20 -0.2153520942475884 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.429568650072611 - 20 -0.2153520942475885 - 11 -2.429568650072611 - 21 -0.3491206961593254 - 72 - 1 - 10 -2.429568650072611 - 20 -0.3491206961593254 - 11 -2.470743038567839 - 21 -0.3641069479857013 - 72 - 1 - 10 -2.470743038567839 - 20 -0.3641069479857013 - 11 -2.47074303856784 - 21 -0.2446678828560981 - 72 - 2 - 10 -2.490428077937918 - 20 -0.2446678828560982 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.510113117307997 - 20 -0.2446678828560983 - 11 -2.510113117307997 - 21 -0.3784364847678352 - 72 - 1 - 10 -2.510113117307997 - 20 -0.3784364847678352 - 11 -2.551287505803225 - 21 -0.393422736594211 - 72 - 1 - 10 -2.551287505803225 - 20 -0.393422736594211 - 11 -2.551287505803225 - 21 -0.2739836714646079 - 72 - 2 - 10 -2.570972545173304 - 20 -0.2739836714646079 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.590657584543383 - 20 -0.273983671464608 - 11 -2.590657584543382 - 21 -0.407752273376345 - 72 - 1 - 10 -2.590657584543382 - 20 -0.407752273376345 - 11 -2.631831973038611 - 21 -0.4227385252027208 - 72 - 1 - 10 -2.631831973038611 - 20 -0.4227385252027208 - 11 -2.631831973038611 - 21 -0.3032994600731176 - 72 - 2 - 10 -2.65151701240869 - 20 -0.3032994600731177 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.671202051778768 - 20 -0.3032994600731178 - 11 -2.671202051778768 - 21 -0.4370680619848547 - 72 - 1 - 10 -2.671202051778768 - 20 -0.4370680619848547 - 11 -2.712376440273996 - 21 -0.4520543138112305 - 72 - 1 - 10 -2.712376440273996 - 20 -0.4520543138112305 - 11 -2.712376440273997 - 21 -0.3326152486816274 - 72 - 2 - 10 -2.732061479644075 - 20 -0.3326152486816275 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.751746519014154 - 20 -0.3326152486816275 - 11 -2.751746519014154 - 21 -0.4663838505933645 - 72 - 1 - 10 -2.751746519014154 - 20 -0.4663838505933645 - 11 -2.792920907509382 - 21 -0.4813701024197403 - 72 - 1 - 10 -2.792920907509382 - 20 -0.4813701024197403 - 11 -2.792920907509383 - 21 -0.3619310372901371 - 72 - 2 - 10 -2.812605946879462 - 20 -0.3619310372901372 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.83229098624954 - 20 -0.3619310372901373 - 11 -2.832290986249539 - 21 -0.4956996392018742 - 72 - 1 - 10 -2.832290986249539 - 20 -0.4956996392018742 - 11 -2.873465374744768 - 21 -0.5106858910282501 - 72 - 1 - 10 -2.873465374744768 - 20 -0.5106858910282501 - 11 -2.873465374744768 - 21 -0.391246825898647 - 72 - 2 - 10 -2.893150414114847 - 20 -0.391246825898647 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.912835453484925 - 20 -0.3912468258986471 - 11 -2.912835453484925 - 21 -0.525015427810384 - 72 - 1 - 10 -2.912835453484925 - 20 -0.525015427810384 - 11 -2.954009841980153 - 21 -0.5400016796367598 - 72 - 1 - 10 -2.954009841980153 - 20 -0.5400016796367598 - 11 -2.954009841980154 - 21 -0.4205626145071567 - 72 - 2 - 10 -2.973694881350233 - 20 -0.4205626145071568 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.993379920720312 - 20 -0.4205626145071568 - 11 -2.993379920720311 - 21 -0.5543312164188938 - 72 - 1 - 10 -2.993379920720311 - 20 -0.5543312164188938 - 11 -3.034554309215539 - 21 -0.5693174682452696 - 72 - 1 - 10 -3.034554309215539 - 20 -0.5693174682452696 - 11 -3.034554309215539 - 21 -0.4498784031156665 - 72 - 2 - 10 -3.054239348585618 - 20 -0.4498784031156665 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -3.073924387955697 - 20 -0.4498784031156666 - 11 -3.073924387955697 - 21 -0.5836470050274035 - 72 - 1 - 10 -3.073924387955697 - 20 -0.5836470050274035 - 11 -3.115098776450925 - 21 -0.5986332568537795 - 72 - 1 - 10 -3.115098776450925 - 20 -0.5986332568537795 - 11 -3.115098776450925 - 21 -0.4791941917241762 - 72 - 2 - 10 -3.134783815821004 - 20 -0.4791941917241763 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -3.154468855191083 - 20 -0.4791941917241763 - 11 -3.154468855191082 - 21 -0.6129627936359132 - 72 - 1 - 10 -3.154468855191082 - 20 -0.6129627936359132 - 11 -3.195643243686311 - 21 -0.6279490454622892 - 72 - 1 - 10 -3.195643243686311 - 20 -0.6279490454622892 - 11 -3.195643243686311 - 21 -0.508509980332686 - 72 - 2 - 10 -3.21532828305639 - 20 -0.508509980332686 - 40 -0.0196850393700787 - 50 -180.0 - 51 -360.0 - 73 - 1 - 72 - 1 - 10 -3.235013322426469 - 20 -0.508509980332686 - 11 -3.235013322426468 - 21 -0.642278582244423 - 72 - 1 - 10 -3.235013322426468 - 20 -0.642278582244423 - 11 -3.276187710921696 - 21 -0.6572648340707989 - 72 - 1 - 10 -3.276187710921696 - 20 -0.6572648340707989 - 11 -3.276187710921697 - 21 -0.5378257689411958 - 72 - 2 - 10 -3.295872750291776 - 20 -0.5378257689411958 - 40 -0.0196850393700787 - 50 -180.0 - 51 -360.0 - 73 - 1 - 72 - 1 - 10 -3.315557789661854 - 20 -0.5378257689411958 - 11 -3.315557789661854 - 21 -0.6715943708529328 - 72 - 1 - 10 -3.315557789661854 - 20 -0.6715943708529328 - 11 -3.356732178157082 - 21 -0.6865806226793086 - 72 - 1 - 10 -3.356732178157082 - 20 -0.6865806226793086 - 11 -3.356732178157082 - 21 -0.5671415575497054 - 72 - 2 - 10 -3.376417217527161 - 20 -0.5671415575497055 - 40 -0.0196850393700787 - 50 -180.0000000000003 - 51 -360.0000000000003 - 73 - 1 - 72 - 1 - 10 -3.39610225689724 - 20 -0.5671415575497056 - 11 -3.396102256897239 - 21 -0.7009101594614425 - 72 - 1 - 10 -3.396102256897239 - 20 -0.7009101594614425 - 11 -3.437276645392468 - 21 -0.7158964112878186 - 72 - 1 - 10 -3.437276645392468 - 20 -0.7158964112878186 - 11 -3.437276645392468 - 21 -0.5964573461582152 - 72 - 2 - 10 -3.456961684762547 - 20 -0.5964573461582153 - 40 -0.0196850393700787 - 50 -180.0000000000003 - 51 -360.0000000000003 - 73 - 1 - 72 - 1 - 10 -3.476646724132626 - 20 -0.5964573461582154 - 11 -3.476646724132625 - 21 -0.7302259480699523 - 72 - 1 - 10 -3.476646724132625 - 20 -0.7302259480699523 - 11 -3.517821112627853 - 21 -0.7452121998963283 - 72 - 1 - 10 -3.517821112627853 - 20 -0.7452121998963283 - 11 -3.517821112627854 - 21 -0.625773134766725 - 72 - 2 - 10 -3.537506151997933 - 20 -0.625773134766725 - 40 -0.0196850393700787 - 50 -180.0 - 51 -360.0 - 73 - 1 - 72 - 1 - 10 -3.557191191368011 - 20 -0.625773134766725 - 11 -3.557191191368011 - 21 -0.759541736678462 - 72 - 1 - 10 -3.557191191368011 - 20 -0.759541736678462 - 11 -3.598365579863239 - 21 -0.7745279885048381 - 72 - 1 - 10 -3.598365579863239 - 20 -0.7745279885048381 - 11 -3.598365579863239 - 21 -0.6550889233752348 - 72 - 2 - 10 -3.618050619233318 - 20 -0.6550889233752349 - 40 -0.0196850393700787 - 50 -180.0000000000002 - 51 -360.0000000000002 - 73 - 1 - 72 - 1 - 10 -3.637735658603397 - 20 -0.6550889233752349 - 11 -3.637735658603396 - 21 -0.7888575252869718 - 72 - 1 - 10 -3.637735658603396 - 20 -0.7888575252869718 - 11 -3.814899688517512 - 21 -0.853339958758357 - 72 - 2 - 10 -3.808167008530786 - 20 -0.8718378449942998 - 40 -0.0196850393700785 - 50 -290.0000000000003 - 51 -360.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.827852047900865 - 20 -0.8718378449942998 - 11 -3.827852047900866 - 21 -1.160309014808614 - 72 - 2 - 10 -3.808167008530787 - 20 -1.160309014808614 - 40 -0.0196850393700788 - 50 -359.9999999999999 - 51 -425.0000000000013 - 73 - 1 - 72 - 1 - 10 -3.816486265651666 - 20 -1.17814971927784 - 11 -3.302025394556464 - 21 -1.418046763290625 - 72 - 2 - 10 -3.293706137435584 - 20 -1.4002060588214 - 40 -0.0196850393700788 - 50 -65.00000000000018 - 51 -245.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.285386880314704 - 20 -1.382365354352174 - 11 -3.756776480718013 - 21 -1.162552773709486 - 72 - 1 - 10 -3.756776480718013 - 20 -1.162552773709486 - 11 -2.0 - 21 -0.5231384264691965 - 72 - 1 - 10 -2.0 - 20 -0.5231384264691965 - 11 -0.2432235192819858 - 21 -1.162552773709486 - 72 - 1 - 10 -0.2432235192819858 - 20 -1.162552773709486 - 11 -0.7689601562847856 - 21 -1.407707793716547 - 72 - 2 - 10 -0.7606408991639058 - 20 -1.425548498185772 - 40 -0.0196850393700788 - 50 -294.9999999999998 - 51 -475.0000000000007 - 73 - 1 - 72 - 1 - 10 -0.7523216420430257 - 20 -1.443389202654997 - 11 -0.1835137343483322 - 21 -1.178149719277839 - 72 - 2 - 10 -0.1918329914692121 - 20 -1.160309014808614 - 40 -0.0196850393700788 - 50 -115.0000000000001 - 51 -180.0000000000002 - 73 - 1 - 72 - 1 - 10 -0.1721479520991333 - 20 -1.160309014808614 - 11 -0.1721479520991344 - 21 -0.8718378449943008 - 97 - 1 -330 -19B5 - 92 - 16 - 93 - 68 - 72 - 1 - 10 -3.788481969160711 - 20 -1.132195865069596 - 11 -3.78848196916071 - 21 -0.8856214579511849 - 72 - 1 - 10 -3.78848196916071 - 20 -0.8856214579511849 - 11 -3.619943645258092 - 21 -0.8242785247175163 - 72 - 1 - 10 -3.619943645258092 - 20 -0.8242785247175163 - 11 -3.518009528215828 - 21 -0.8831302146314739 - 72 - 2 - 10 -3.508167008530788 - 20 -0.8660824704624889 - 40 -0.0196850393700787 - 50 -60.00000000000008 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.498324488845749 - 20 -0.8490347262935038 - 11 -3.571649094198813 - 21 -0.8067007456546893 - 72 - 1 - 10 -3.571649094198813 - 20 -0.8067007456546893 - 11 -3.539399178022706 - 21 -0.7949627361090064 - 72 - 1 - 10 -3.539399178022706 - 20 -0.7949627361090064 - 11 -3.437465060980442 - 21 -0.8538144260229641 - 72 - 2 - 10 -3.427622541295402 - 20 -0.836766681853979 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.417780021610363 - 20 -0.8197189376849939 - 11 -3.491104626963428 - 21 -0.7773849570461795 - 72 - 1 - 10 -3.491104626963428 - 20 -0.7773849570461795 - 11 -3.458854710787321 - 21 -0.7656469475004968 - 72 - 1 - 10 -3.458854710787321 - 20 -0.7656469475004968 - 11 -3.356920593745056 - 21 -0.8244986374144544 - 72 - 2 - 10 -3.347078074060017 - 20 -0.8074508932454694 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.337235554374978 - 20 -0.7904031490764842 - 11 -3.410560159728042 - 21 -0.7480691684376697 - 72 - 1 - 10 -3.410560159728042 - 20 -0.7480691684376697 - 11 -3.378310243551935 - 21 -0.736331158891987 - 72 - 1 - 10 -3.378310243551935 - 20 -0.736331158891987 - 11 -3.27637612650967 - 21 -0.7951828488059446 - 72 - 2 - 10 -3.266533606824631 - 20 -0.7781351046369596 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.256691087139592 - 20 -0.7610873604679744 - 11 -3.330015692492656 - 21 -0.7187533798291599 - 72 - 1 - 10 -3.330015692492656 - 20 -0.7187533798291599 - 11 -3.297765776316549 - 21 -0.7070153702834772 - 72 - 1 - 10 -3.297765776316549 - 20 -0.7070153702834772 - 11 -3.195831659274285 - 21 -0.7658670601974349 - 72 - 2 - 10 -3.185989139589245 - 20 -0.7488193160284498 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.176146619904206 - 20 -0.7317715718594647 - 11 -3.24947122525727 - 21 -0.6894375912206502 - 72 - 1 - 10 -3.24947122525727 - 20 -0.6894375912206502 - 11 -3.217221309081164 - 21 -0.6776995816749674 - 72 - 1 - 10 -3.217221309081164 - 20 -0.6776995816749674 - 11 -3.115287192038899 - 21 -0.7365512715889251 - 72 - 2 - 10 -3.10544467235386 - 20 -0.71950352741994 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.09560215266882 - 20 -0.7024557832509549 - 11 -3.168926758021885 - 21 -0.6601218026121404 - 72 - 1 - 10 -3.168926758021885 - 20 -0.6601218026121404 - 11 -3.136676841845778 - 21 -0.6483837930664577 - 72 - 1 - 10 -3.136676841845778 - 20 -0.6483837930664577 - 11 -3.034742724803513 - 21 -0.7072354829804153 - 72 - 2 - 10 -3.024900205118474 - 20 -0.6901877388114303 - 40 -0.0196850393700787 - 50 -60.00000000000008 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -3.015057685433435 - 20 -0.6731399946424452 - 11 -3.0883822907865 - 21 -0.6308060140036307 - 72 - 1 - 10 -3.0883822907865 - 20 -0.6308060140036307 - 11 -3.056132374610392 - 21 -0.619068004457948 - 72 - 1 - 10 -3.056132374610392 - 20 -0.619068004457948 - 11 -2.954198257568128 - 21 -0.6779196943719056 - 72 - 2 - 10 -2.944355737883088 - 20 -0.6608719502029206 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -2.934513218198049 - 20 -0.6438242060339354 - 11 -3.007837823551114 - 21 -0.6014902253951211 - 72 - 1 - 10 -3.007837823551114 - 20 -0.6014902253951211 - 11 -2.975587907375006 - 21 -0.5897522158494382 - 72 - 1 - 10 -2.975587907375006 - 20 -0.5897522158494382 - 11 -2.873653790332742 - 21 -0.6486039057633959 - 72 - 2 - 10 -2.863811270647703 - 20 -0.6315561615944107 - 40 -0.0196850393700788 - 50 -60.00000000000023 - 51 -240.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.853968750962663 - 20 -0.6145084174254256 - 11 -2.927293356315728 - 21 -0.5721744367866111 - 72 - 1 - 10 -2.927293356315728 - 20 -0.5721744367866111 - 11 -2.895043440139621 - 21 -0.5604364272409283 - 72 - 1 - 10 -2.895043440139621 - 20 -0.5604364272409283 - 11 -2.793109323097356 - 21 -0.6192881171548861 - 72 - 2 - 10 -2.783266803412317 - 20 -0.6022403729859009 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -2.773424283727278 - 20 -0.5851926288169159 - 11 -2.846748889080342 - 21 -0.5428586481781015 - 72 - 1 - 10 -2.846748889080342 - 20 -0.5428586481781015 - 11 -2.814498972904235 - 21 -0.5311206386324185 - 72 - 1 - 10 -2.814498972904235 - 20 -0.5311206386324185 - 11 -2.712564855861971 - 21 -0.5899723285463763 - 72 - 2 - 10 -2.702722336176931 - 20 -0.5729245843773911 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -2.692879816491892 - 20 -0.5558768402084061 - 11 -2.766204421844956 - 21 -0.5135428595695918 - 72 - 1 - 10 -2.766204421844956 - 20 -0.5135428595695918 - 11 -2.733954505668849 - 21 -0.5018048500239088 - 72 - 1 - 10 -2.733954505668849 - 20 -0.5018048500239088 - 11 -2.632020388626585 - 21 -0.5606565399378665 - 72 - 2 - 10 -2.622177868941546 - 20 -0.5436087957688814 - 40 -0.0196850393700787 - 50 -60.00000000000008 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -2.612335349256506 - 20 -0.5265610515998964 - 11 -2.68565995460957 - 21 -0.4842270709610819 - 72 - 1 - 10 -2.68565995460957 - 20 -0.4842270709610819 - 11 -2.653410038433464 - 21 -0.4724890614153991 - 72 - 1 - 10 -2.653410038433464 - 20 -0.4724890614153991 - 11 -2.551475921391199 - 21 -0.5313407513293568 - 72 - 2 - 10 -2.541633401706159 - 20 -0.5142930071603717 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -2.53179088202112 - 20 -0.4972452629913866 - 11 -2.605115487374185 - 21 -0.4549112823525721 - 72 - 1 - 10 -2.605115487374185 - 20 -0.4549112823525721 - 11 -2.572865571198078 - 21 -0.4431732728068893 - 72 - 1 - 10 -2.572865571198078 - 20 -0.4431732728068893 - 11 -2.470931454155814 - 21 -0.5020249627208471 - 72 - 2 - 10 -2.461088934470774 - 20 -0.4849772185518619 - 40 -0.0196850393700788 - 50 -60.00000000000018 - 51 -240.0000000000002 - 73 - 1 - 72 - 1 - 10 -2.451246414785735 - 20 -0.4679294743828769 - 11 -2.524571020138799 - 21 -0.4255954937440624 - 72 - 1 - 10 -2.524571020138799 - 20 -0.4255954937440624 - 11 -2.492321103962692 - 21 -0.4138574841983796 - 72 - 1 - 10 -2.492321103962692 - 20 -0.4138574841983796 - 11 -2.390386986920428 - 21 -0.4727091741123373 - 72 - 2 - 10 -2.380544467235388 - 20 -0.4556614299433522 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -2.370701947550349 - 20 -0.4386136857743671 - 11 -2.444026552903414 - 21 -0.3962797051355528 - 72 - 1 - 10 -2.444026552903414 - 20 -0.3962797051355528 - 11 -2.411776636727307 - 21 -0.3845416955898698 - 72 - 1 - 10 -2.411776636727307 - 20 -0.3845416955898698 - 11 -2.309842519685042 - 21 -0.4433933855038275 - 72 - 2 - 10 -2.300000000000003 - 20 -0.4263456413348424 - 40 -0.0196850393700788 - 50 -60.00000000000015 - 51 -240.0000000000001 - 73 - 1 - 72 - 1 - 10 -2.290157480314964 - 20 -0.4092978971658573 - 11 -2.363482085668028 - 21 -0.366963916527043 - 72 - 1 - 10 -2.363482085668028 - 20 -0.366963916527043 - 11 -2.01968503937008 - 21 -0.2418320250459505 - 72 - 1 - 10 -2.01968503937008 - 20 -0.2418320250459505 - 11 -2.019685039370081 - 21 -0.4884064321643613 - 72 - 1 - 10 -2.019685039370081 - 20 -0.4884064321643613 - 11 -3.788481969160711 - 21 -1.132195865069596 - 97 - 1 -330 -19B2 - 92 - 16 - 93 - 68 - 72 - 1 - 10 -0.211518030839291 - 20 -1.132195865069596 - 11 -0.2115180308392921 - 21 -0.8856214579511849 - 72 - 1 - 10 -0.2115180308392921 - 20 -0.8856214579511849 - 11 -0.3800563547419098 - 21 -0.8242785247175163 - 72 - 1 - 10 -0.3800563547419098 - 20 -0.8242785247175163 - 11 -0.4819904717841743 - 21 -0.8831302146314739 - 72 - 2 - 10 -0.4918329914692137 - 20 -0.8660824704624889 - 40 -0.0196850393700787 - 50 -240.0 - 51 -420.0 - 73 - 0 - 72 - 1 - 10 -0.501675511154253 - 20 -0.8490347262935038 - 11 -0.4283509058011884 - 21 -0.8067007456546893 - 72 - 1 - 10 -0.4283509058011884 - 20 -0.8067007456546893 - 11 -0.4606008219772955 - 21 -0.7949627361090064 - 72 - 1 - 10 -0.4606008219772955 - 20 -0.7949627361090064 - 11 -0.56253493901956 - 21 -0.8538144260229641 - 72 - 2 - 10 -0.5723774587045993 - 20 -0.836766681853979 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -0.5822199783896387 - 20 -0.8197189376849939 - 11 -0.5088953730365742 - 21 -0.7773849570461795 - 72 - 1 - 10 -0.5088953730365742 - 20 -0.7773849570461795 - 11 -0.5411452892126811 - 21 -0.7656469475004968 - 72 - 1 - 10 -0.5411452892126811 - 20 -0.7656469475004968 - 11 -0.6430794062549456 - 21 -0.8244986374144544 - 72 - 2 - 10 -0.652921925939985 - 20 -0.8074508932454694 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -0.6627644456250243 - 20 -0.7904031490764842 - 11 -0.5894398402719598 - 21 -0.7480691684376697 - 72 - 1 - 10 -0.5894398402719598 - 20 -0.7480691684376697 - 11 -0.6216897564480669 - 21 -0.736331158891987 - 72 - 1 - 10 -0.6216897564480669 - 20 -0.736331158891987 - 11 -0.7236238734903314 - 21 -0.7951828488059446 - 72 - 2 - 10 -0.7334663931753708 - 20 -0.7781351046369596 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -0.7433089128604101 - 20 -0.7610873604679744 - 11 -0.6699843075073457 - 21 -0.7187533798291599 - 72 - 1 - 10 -0.6699843075073457 - 20 -0.7187533798291599 - 11 -0.7022342236834526 - 21 -0.7070153702834772 - 72 - 1 - 10 -0.7022342236834526 - 20 -0.7070153702834772 - 11 -0.8041683407257171 - 21 -0.7658670601974349 - 72 - 2 - 10 -0.8140108604107564 - 20 -0.7488193160284498 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -0.8238533800957958 - 20 -0.7317715718594647 - 11 -0.7505287747427313 - 21 -0.6894375912206502 - 72 - 1 - 10 -0.7505287747427313 - 20 -0.6894375912206502 - 11 -0.7827786909188382 - 21 -0.6776995816749674 - 72 - 1 - 10 -0.7827786909188382 - 20 -0.6776995816749674 - 11 -0.8847128079611027 - 21 -0.7365512715889251 - 72 - 2 - 10 -0.8945553276461421 - 20 -0.71950352741994 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -0.9043978473311814 - 20 -0.7024557832509549 - 11 -0.8310732419781172 - 21 -0.6601218026121404 - 72 - 1 - 10 -0.8310732419781172 - 20 -0.6601218026121404 - 11 -0.8633231581542239 - 21 -0.6483837930664577 - 72 - 1 - 10 -0.8633231581542239 - 20 -0.6483837930664577 - 11 -0.9652572751964884 - 21 -0.7072354829804153 - 72 - 2 - 10 -0.9750997948815278 - 20 -0.6901877388114303 - 40 -0.0196850393700787 - 50 -240.0 - 51 -420.0 - 73 - 0 - 72 - 1 - 10 -0.9849423145665671 - 20 -0.6731399946424452 - 11 -0.9116177092135024 - 21 -0.6308060140036307 - 72 - 1 - 10 -0.9116177092135024 - 20 -0.6308060140036307 - 11 -0.9438676253896097 - 21 -0.619068004457948 - 72 - 1 - 10 -0.9438676253896097 - 20 -0.619068004457948 - 11 -1.045801742431874 - 21 -0.6779196943719056 - 72 - 2 - 10 -1.055644262116914 - 20 -0.6608719502029206 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -1.065486781801953 - 20 -0.6438242060339354 - 11 -0.992162176448888 - 21 -0.6014902253951211 - 72 - 1 - 10 -0.992162176448888 - 20 -0.6014902253951211 - 11 -1.024412092624995 - 21 -0.5897522158494382 - 72 - 1 - 10 -1.024412092624995 - 20 -0.5897522158494382 - 11 -1.12634620966726 - 21 -0.6486039057633959 - 72 - 2 - 10 -1.136188729352299 - 20 -0.6315561615944107 - 40 -0.0196850393700788 - 50 -240.0000000000002 - 51 -420.0000000000003 - 73 - 0 - 72 - 1 - 10 -1.146031249037339 - 20 -0.6145084174254256 - 11 -1.072706643684274 - 21 -0.5721744367866111 - 72 - 1 - 10 -1.072706643684274 - 20 -0.5721744367866111 - 11 -1.104956559860381 - 21 -0.5604364272409283 - 72 - 1 - 10 -1.104956559860381 - 20 -0.5604364272409283 - 11 -1.206890676902646 - 21 -0.6192881171548861 - 72 - 2 - 10 -1.216733196587685 - 20 -0.6022403729859009 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -1.226575716272724 - 20 -0.5851926288169159 - 11 -1.15325111091966 - 21 -0.5428586481781015 - 72 - 1 - 10 -1.15325111091966 - 20 -0.5428586481781015 - 11 -1.185501027095767 - 21 -0.5311206386324185 - 72 - 1 - 10 -1.185501027095767 - 20 -0.5311206386324185 - 11 -1.287435144138031 - 21 -0.5899723285463763 - 72 - 2 - 10 -1.297277663823071 - 20 -0.5729245843773911 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -1.30712018350811 - 20 -0.5558768402084061 - 11 -1.233795578155045 - 21 -0.5135428595695918 - 72 - 1 - 10 -1.233795578155045 - 20 -0.5135428595695918 - 11 -1.266045494331153 - 21 -0.5018048500239088 - 72 - 1 - 10 -1.266045494331153 - 20 -0.5018048500239088 - 11 -1.367979611373417 - 21 -0.5606565399378665 - 72 - 2 - 10 -1.377822131058456 - 20 -0.5436087957688814 - 40 -0.0196850393700787 - 50 -240.0 - 51 -420.0 - 73 - 0 - 72 - 1 - 10 -1.387664650743496 - 20 -0.5265610515998964 - 11 -1.314340045390431 - 21 -0.4842270709610819 - 72 - 1 - 10 -1.314340045390431 - 20 -0.4842270709610819 - 11 -1.346589961566538 - 21 -0.4724890614153991 - 72 - 1 - 10 -1.346589961566538 - 20 -0.4724890614153991 - 11 -1.448524078608803 - 21 -0.5313407513293568 - 72 - 2 - 10 -1.458366598293842 - 20 -0.5142930071603717 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -1.468209117978881 - 20 -0.4972452629913866 - 11 -1.394884512625817 - 21 -0.4549112823525721 - 72 - 1 - 10 -1.394884512625817 - 20 -0.4549112823525721 - 11 -1.427134428801924 - 21 -0.4431732728068893 - 72 - 1 - 10 -1.427134428801924 - 20 -0.4431732728068893 - 11 -1.529068545844188 - 21 -0.5020249627208471 - 72 - 2 - 10 -1.538911065529228 - 20 -0.4849772185518619 - 40 -0.0196850393700788 - 50 -240.0000000000002 - 51 -420.0000000000002 - 73 - 0 - 72 - 1 - 10 -1.548753585214267 - 20 -0.4679294743828769 - 11 -1.475428979861203 - 21 -0.4255954937440624 - 72 - 1 - 10 -1.475428979861203 - 20 -0.4255954937440624 - 11 -1.50767889603731 - 21 -0.4138574841983796 - 72 - 1 - 10 -1.50767889603731 - 20 -0.4138574841983796 - 11 -1.609613013079574 - 21 -0.4727091741123373 - 72 - 2 - 10 -1.619455532764613 - 20 -0.4556614299433522 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -1.629298052449653 - 20 -0.4386136857743671 - 11 -1.555973447096588 - 21 -0.3962797051355528 - 72 - 1 - 10 -1.555973447096588 - 20 -0.3962797051355528 - 11 -1.588223363272695 - 21 -0.3845416955898698 - 72 - 1 - 10 -1.588223363272695 - 20 -0.3845416955898698 - 11 -1.69015748031496 - 21 -0.4433933855038275 - 72 - 2 - 10 -1.699999999999999 - 20 -0.4263456413348424 - 40 -0.0196850393700788 - 50 -240.0000000000001 - 51 -420.0000000000001 - 73 - 0 - 72 - 1 - 10 -1.709842519685038 - 20 -0.4092978971658573 - 11 -1.636517914331974 - 21 -0.366963916527043 - 72 - 1 - 10 -1.636517914331974 - 20 -0.366963916527043 - 11 -1.980314960629922 - 21 -0.2418320250459505 - 72 - 1 - 10 -1.980314960629922 - 20 -0.2418320250459505 - 11 -1.980314960629921 - 21 -0.4884064321643613 - 72 - 1 - 10 -1.980314960629921 - 20 -0.4884064321643613 - 11 -0.211518030839291 - 21 -1.132195865069596 - 97 - 1 -330 -12B7 - 75 - 0 - 76 - 1 - 98 - 1 - 10 -0.0 - 20 -0.0 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -ENDSEC - 0 -SECTION - 2 -OBJECTS - 0 -DICTIONARY - 5 -C -330 -0 -100 -AcDbDictionary -281 - 1 - 3 -ACAD_DETAILVIEWSTYLE -350 -122 - 3 -ACAD_GROUP -350 -D - 3 -ACAD_IMAGE_DICT -350 -124 - 3 -ACAD_IMAGE_VARS -350 -DC - 3 -ACAD_LAYOUT -350 -1A - 3 -ACAD_MLINESTYLE -350 -17 - 3 -ACAD_PLOTSETTINGS -350 -19 - 3 -ACAD_PLOTSTYLENAME -350 -E - 3 -ACAD_SCALELIST -350 -B6 - 3 -ACAD_SECTIONVIEWSTYLE -350 -123 - 3 -AcDbVariableDictionary -350 -66 - 3 -APPDATA -350 -E1 - 3 -DWGPROPS -350 -1B44 - 0 -DICTIONARY - 5 -133 -330 -2 -100 -AcDbDictionary -280 - 1 -281 - 1 - 3 -ACAD_LAYERSTATES -360 -134 - 3 -ACLYDICTIONARY -360 -C6B - 0 -DICTIONARY - 5 -C3A -330 -1F -100 -AcDbDictionary -280 - 1 -281 - 1 - 3 -ACAD_SORTENTS -360 -C3B - 0 -DICTIONARY - 5 -122 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -DICTIONARY - 5 -D -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -DICTIONARY - 5 -124 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -RASTERVARIABLES - 5 -DC -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbRasterVariables - 90 - 0 - 70 - 1 - 71 - 1 - 72 - 5 - 0 -DICTIONARY - 5 -1A -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -Model -350 -22 - 3 -Sheet1 -350 -59 - 3 -Sheet2 -350 -5E - 0 -DICTIONARY - 5 -17 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -Standard -350 -18 - 0 -DICTIONARY - 5 -19 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -ACDBDICTIONARYWDFLT - 5 -E -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -Normal -350 -F -100 -AcDbDictionaryWithDefault -340 -F - 0 -DICTIONARY - 5 -B6 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -A0 -350 -B7 - 3 -A1 -350 -B8 - 3 -A2 -350 -B9 - 3 -A3 -350 -BA - 3 -A4 -350 -BB - 3 -A5 -350 -BC - 3 -A6 -350 -BD - 3 -A7 -350 -BE - 3 -A8 -350 -BF - 3 -A9 -350 -C0 - 3 -B0 -350 -C1 - 3 -B1 -350 -C2 - 3 -B2 -350 -C3 - 3 -B3 -350 -C4 - 3 -B4 -350 -C5 - 3 -B5 -350 -C6 - 3 -B6 -350 -C7 - 3 -B7 -350 -C8 - 3 -B8 -350 -C9 - 3 -B9 -350 -CA - 3 -C0 -350 -CB - 3 -C1 -350 -CC - 3 -C2 -350 -CD - 3 -C3 -350 -CE - 3 -C4 -350 -CF - 3 -C5 -350 -D0 - 3 -C6 -350 -D1 - 3 -C7 -350 -D2 - 3 -C8 -350 -D3 - 3 -C9 -350 -D4 - 3 -D0 -350 -D5 - 3 -D1 -350 -D6 - 3 -D2 -350 -D7 - 0 -DICTIONARY - 5 -123 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -DICTIONARY - 5 -66 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -DIMASSOC -350 -67 - 3 -HIDETEXT -350 -6B - 0 -DICTIONARY - 5 -E1 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -XRECORD - 5 -1B44 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbXrecord -280 - 1 - 1 -DWGPROPS COOKIE - 2 -vector-logo - 3 - - 4 -Jonathan Greig - 6 -Original Art by Damien George - 7 -micropython logo - 8 - - 9 - -300 -= -301 -= -302 -= -303 -= -304 -= -305 -= -306 -= -307 -= -308 -= -309 -= - 40 -0.0 - 41 -2452643.063384271 - 42 -2456661.002361111 - 1 - - 90 - 0 - 0 -DICTIONARY - 5 -134 -102 -{ACAD_REACTORS -330 -133 -102 -} -330 -133 -100 -AcDbDictionary -281 - 1 - 3 -ARGON_LAYERP_1 -350 -135 - 3 -ARGON_LAYERP_10 -350 -C21 - 3 -ARGON_LAYERP_11 -350 -C22 - 3 -ARGON_LAYERP_12 -350 -C23 - 3 -ARGON_LAYERP_13 -350 -C26 - 3 -ARGON_LAYERP_14 -350 -C29 - 3 -ARGON_LAYERP_15 -350 -C2A - 3 -ARGON_LAYERP_16 -350 -C2B - 3 -ARGON_LAYERP_17 -350 -C2D - 3 -ARGON_LAYERP_18 -350 -C30 - 3 -ARGON_LAYERP_19 -350 -C31 - 3 -ARGON_LAYERP_2 -350 -4B1 - 3 -ARGON_LAYERP_20 -350 -C33 - 3 -ARGON_LAYERP_21 -350 -C38 - 3 -ARGON_LAYERP_22 -350 -C3C - 3 -ARGON_LAYERP_23 -350 -C3D - 3 -ARGON_LAYERP_24 -350 -C3E - 3 -ARGON_LAYERP_25 -350 -C41 - 3 -ARGON_LAYERP_26 -350 -C42 - 3 -ARGON_LAYERP_27 -350 -C43 - 3 -ARGON_LAYERP_28 -350 -C44 - 3 -ARGON_LAYERP_29 -350 -C46 - 3 -ARGON_LAYERP_3 -350 -6CF - 3 -ARGON_LAYERP_30 -350 -C49 - 3 -ARGON_LAYERP_31 -350 -C4C - 3 -ARGON_LAYERP_32 -350 -C4F - 3 -ARGON_LAYERP_33 -350 -C52 - 3 -ARGON_LAYERP_34 -350 -C54 - 3 -ARGON_LAYERP_35 -350 -C55 - 3 -ARGON_LAYERP_36 -350 -C56 - 3 -ARGON_LAYERP_37 -350 -C57 - 3 -ARGON_LAYERP_38 -350 -C58 - 3 -ARGON_LAYERP_39 -350 -C59 - 3 -ARGON_LAYERP_4 -350 -B84 - 3 -ARGON_LAYERP_40 -350 -C5A - 3 -ARGON_LAYERP_41 -350 -C5B - 3 -ARGON_LAYERP_42 -350 -C5D - 3 -ARGON_LAYERP_43 -350 -C5F - 3 -ARGON_LAYERP_44 -350 -C60 - 3 -ARGON_LAYERP_45 -350 -C61 - 3 -ARGON_LAYERP_46 -350 -C62 - 3 -ARGON_LAYERP_47 -350 -C63 - 3 -ARGON_LAYERP_48 -350 -C64 - 3 -ARGON_LAYERP_49 -350 -C65 - 3 -ARGON_LAYERP_5 -350 -B89 - 3 -ARGON_LAYERP_50 -350 -C66 - 3 -ARGON_LAYERP_51 -350 -C67 - 3 -ARGON_LAYERP_52 -350 -C68 - 3 -ARGON_LAYERP_53 -350 -C6A - 3 -ARGON_LAYERP_54 -350 -C6F - 3 -ARGON_LAYERP_55 -350 -C70 - 3 -ARGON_LAYERP_56 -350 -C71 - 3 -ARGON_LAYERP_57 -350 -C72 - 3 -ARGON_LAYERP_58 -350 -C73 - 3 -ARGON_LAYERP_59 -350 -D92 - 3 -ARGON_LAYERP_6 -350 -BB5 - 3 -ARGON_LAYERP_60 -350 -D93 - 3 -ARGON_LAYERP_61 -350 -1244 - 3 -ARGON_LAYERP_62 -350 -1B1D - 3 -ARGON_LAYERP_63 -350 -1B1E - 3 -ARGON_LAYERP_64 -350 -1B1F - 3 -ARGON_LAYERP_65 -350 -1B20 - 3 -ARGON_LAYERP_66 -350 -1B21 - 3 -ARGON_LAYERP_67 -350 -1B22 - 3 -ARGON_LAYERP_68 -350 -1B23 - 3 -ARGON_LAYERP_69 -350 -1B24 - 3 -ARGON_LAYERP_7 -350 -BF7 - 3 -ARGON_LAYERP_70 -350 -1B25 - 3 -ARGON_LAYERP_71 -350 -1B26 - 3 -ARGON_LAYERP_72 -350 -1B27 - 3 -ARGON_LAYERP_73 -350 -1B28 - 3 -ARGON_LAYERP_74 -350 -1B29 - 3 -ARGON_LAYERP_75 -350 -1B2C - 3 -ARGON_LAYERP_76 -350 -1B2D - 3 -ARGON_LAYERP_77 -350 -1B2E - 3 -ARGON_LAYERP_78 -350 -1B2F - 3 -ARGON_LAYERP_79 -350 -1B30 - 3 -ARGON_LAYERP_8 -350 -BF9 - 3 -ARGON_LAYERP_80 -350 -1B31 - 3 -ARGON_LAYERP_81 -350 -1B32 - 3 -ARGON_LAYERP_82 -350 -1B33 - 3 -ARGON_LAYERP_83 -350 -1B34 - 3 -ARGON_LAYERP_84 -350 -1B35 - 3 -ARGON_LAYERP_85 -350 -1B36 - 3 -ARGON_LAYERP_86 -350 -1B37 - 3 -ARGON_LAYERP_87 -350 -1B38 - 3 -ARGON_LAYERP_88 -350 -1B39 - 3 -ARGON_LAYERP_89 -350 -1B3A - 3 -ARGON_LAYERP_9 -350 -BFF - 3 -ARGON_LAYERP_90 -350 -1B3B - 3 -ARGON_LAYERP_91 -350 -1B3C - 3 -ARGON_LAYERP_92 -350 -1B3D - 3 -ARGON_LAYERP_93 -350 -1B3E - 0 -DICTIONARY - 5 -C6B -102 -{ACAD_REACTORS -330 -133 -102 -} -330 -133 -100 -AcDbDictionary -281 - 1 -1001 -ACAD -1000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/logo/vector-logo.svg b/logo/vector-logo.svg deleted file mode 100644 index d5fb7347d1..0000000000 --- a/logo/vector-logo.svg +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/logo/vector-text-R2000.dxf b/logo/vector-text-R2000.dxf deleted file mode 100644 index a963203b3f..0000000000 --- a/logo/vector-text-R2000.dxf +++ /dev/null @@ -1,9888 +0,0 @@ - 0 -SECTION - 2 -HEADER - 9 -$ACADVER - 1 -AC1015 - 9 -$ACADMAINTVER - 70 - 6 - 9 -$DWGCODEPAGE - 3 -ANSI_1252 - 9 -$INSBASE - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$EXTMIN - 10 -0.0000000000000001 - 20 -0.0 - 30 -0.0 - 9 -$EXTMAX - 10 -3.692708053216686 - 20 -0.6839852852251591 - 30 -0.0 - 9 -$LIMMIN - 10 -0.0 - 20 -0.0 - 9 -$LIMMAX - 10 -12.0 - 20 -9.0 - 9 -$ORTHOMODE - 70 - 0 - 9 -$REGENMODE - 70 - 1 - 9 -$FILLMODE - 70 - 1 - 9 -$QTEXTMODE - 70 - 0 - 9 -$MIRRTEXT - 70 - 1 - 9 -$LTSCALE - 40 -1.0 - 9 -$ATTMODE - 70 - 1 - 9 -$TEXTSIZE - 40 -0.2 - 9 -$TRACEWID - 40 -0.05 - 9 -$TEXTSTYLE - 7 -Standard - 9 -$CLAYER - 8 -TEXT-RED - 9 -$CELTYPE - 6 -ByLayer - 9 -$CECOLOR - 62 - 256 - 9 -$CELTSCALE - 40 -1.0 - 9 -$DISPSILH - 70 - 0 - 9 -$DIMSCALE - 40 -1.0 - 9 -$DIMASZ - 40 -0.18 - 9 -$DIMEXO - 40 -0.0625 - 9 -$DIMDLI - 40 -0.38 - 9 -$DIMRND - 40 -0.0 - 9 -$DIMDLE - 40 -0.0 - 9 -$DIMEXE - 40 -0.18 - 9 -$DIMTP - 40 -0.0 - 9 -$DIMTM - 40 -0.0 - 9 -$DIMTXT - 40 -0.18 - 9 -$DIMCEN - 40 -0.09 - 9 -$DIMTSZ - 40 -0.0 - 9 -$DIMTOL - 70 - 0 - 9 -$DIMLIM - 70 - 0 - 9 -$DIMTIH - 70 - 1 - 9 -$DIMTOH - 70 - 1 - 9 -$DIMSE1 - 70 - 0 - 9 -$DIMSE2 - 70 - 0 - 9 -$DIMTAD - 70 - 0 - 9 -$DIMZIN - 70 - 0 - 9 -$DIMBLK - 1 - - 9 -$DIMASO - 70 - 1 - 9 -$DIMSHO - 70 - 1 - 9 -$DIMPOST - 1 - - 9 -$DIMAPOST - 1 - - 9 -$DIMALT - 70 - 0 - 9 -$DIMALTD - 70 - 2 - 9 -$DIMALTF - 40 -25.4 - 9 -$DIMLFAC - 40 -1.0 - 9 -$DIMTOFL - 70 - 0 - 9 -$DIMTVP - 40 -0.0 - 9 -$DIMTIX - 70 - 0 - 9 -$DIMSOXD - 70 - 0 - 9 -$DIMSAH - 70 - 0 - 9 -$DIMBLK1 - 1 - - 9 -$DIMBLK2 - 1 - - 9 -$DIMSTYLE - 2 -Standard - 9 -$DIMCLRD - 70 - 0 - 9 -$DIMCLRE - 70 - 0 - 9 -$DIMCLRT - 70 - 0 - 9 -$DIMTFAC - 40 -1.0 - 9 -$DIMGAP - 40 -0.09 - 9 -$DIMJUST - 70 - 0 - 9 -$DIMSD1 - 70 - 0 - 9 -$DIMSD2 - 70 - 0 - 9 -$DIMTOLJ - 70 - 1 - 9 -$DIMTZIN - 70 - 0 - 9 -$DIMALTZ - 70 - 0 - 9 -$DIMALTTZ - 70 - 0 - 9 -$DIMUPT - 70 - 0 - 9 -$DIMDEC - 70 - 3 - 9 -$DIMTDEC - 70 - 3 - 9 -$DIMALTU - 70 - 2 - 9 -$DIMALTTD - 70 - 2 - 9 -$DIMTXSTY - 7 -Standard - 9 -$DIMAUNIT - 70 - 0 - 9 -$DIMADEC - 70 - 0 - 9 -$DIMALTRND - 40 -0.0 - 9 -$DIMAZIN - 70 - 0 - 9 -$DIMDSEP - 70 - 46 - 9 -$DIMATFIT - 70 - 3 - 9 -$DIMFRAC - 70 - 0 - 9 -$DIMLDRBLK - 1 - - 9 -$DIMLUNIT - 70 - 2 - 9 -$DIMLWD - 70 - -2 - 9 -$DIMLWE - 70 - -2 - 9 -$DIMTMOVE - 70 - 2 - 9 -$LUNITS - 70 - 2 - 9 -$LUPREC - 70 - 3 - 9 -$SKETCHINC - 40 -0.1 - 9 -$FILLETRAD - 40 -0.5 - 9 -$AUNITS - 70 - 0 - 9 -$AUPREC - 70 - 0 - 9 -$MENU - 1 -. - 9 -$ELEVATION - 40 -0.0 - 9 -$PELEVATION - 40 -0.0 - 9 -$THICKNESS - 40 -0.0 - 9 -$LIMCHECK - 70 - 0 - 9 -$CHAMFERA - 40 -0.0 - 9 -$CHAMFERB - 40 -0.0 - 9 -$CHAMFERC - 40 -0.0 - 9 -$CHAMFERD - 40 -0.0 - 9 -$SKPOLY - 70 - 0 - 9 -$TDCREATE - 40 -2456662.269745891 - 9 -$TDUCREATE - 40 -2456662.519745903 - 9 -$TDUPDATE - 40 -2456662.282164352 - 9 -$TDUUPDATE - 40 -2456662.532164352 - 9 -$TDINDWG - 40 -0.0000000116 - 9 -$TDUSRTIMER - 40 -2456662.519895833 - 9 -$USRTIMER - 70 - 1 - 9 -$ANGBASE - 50 -0.0 - 9 -$ANGDIR - 70 - 0 - 9 -$PDMODE - 70 - 0 - 9 -$PDSIZE - 40 -0.0 - 9 -$PLINEWID - 40 -0.0 - 9 -$SPLFRAME - 70 - 0 - 9 -$SPLINETYPE - 70 - 6 - 9 -$SPLINESEGS - 70 - 8 - 9 -$HANDSEED - 5 -1D7 - 9 -$SURFTAB1 - 70 - 6 - 9 -$SURFTAB2 - 70 - 6 - 9 -$SURFTYPE - 70 - 6 - 9 -$SURFU - 70 - 6 - 9 -$SURFV - 70 - 6 - 9 -$UCSBASE - 2 - - 9 -$UCSNAME - 2 - - 9 -$UCSORG - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSXDIR - 10 -1.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSYDIR - 10 -0.0 - 20 -1.0 - 30 -0.0 - 9 -$UCSORTHOREF - 2 - - 9 -$UCSORTHOVIEW - 70 - 0 - 9 -$UCSORGTOP - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGBOTTOM - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGLEFT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGRIGHT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGFRONT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$UCSORGBACK - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSBASE - 2 - - 9 -$PUCSNAME - 2 - - 9 -$PUCSORG - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSXDIR - 10 -1.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSYDIR - 10 -0.0 - 20 -1.0 - 30 -0.0 - 9 -$PUCSORTHOREF - 2 - - 9 -$PUCSORTHOVIEW - 70 - 0 - 9 -$PUCSORGTOP - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGBOTTOM - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGLEFT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGRIGHT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGFRONT - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PUCSORGBACK - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$USERI1 - 70 - 0 - 9 -$USERI2 - 70 - 0 - 9 -$USERI3 - 70 - 0 - 9 -$USERI4 - 70 - 0 - 9 -$USERI5 - 70 - 0 - 9 -$USERR1 - 40 -0.0 - 9 -$USERR2 - 40 -0.0 - 9 -$USERR3 - 40 -0.0 - 9 -$USERR4 - 40 -0.0 - 9 -$USERR5 - 40 -0.0 - 9 -$WORLDVIEW - 70 - 1 - 9 -$SHADEDGE - 70 - 3 - 9 -$SHADEDIF - 70 - 70 - 9 -$TILEMODE - 70 - 1 - 9 -$MAXACTVP - 70 - 64 - 9 -$PINSBASE - 10 -0.0 - 20 -0.0 - 30 -0.0 - 9 -$PLIMCHECK - 70 - 0 - 9 -$PEXTMIN - 10 -1.000000000000000E+20 - 20 -1.000000000000000E+20 - 30 -1.000000000000000E+20 - 9 -$PEXTMAX - 10 --1.000000000000000E+20 - 20 --1.000000000000000E+20 - 30 --1.000000000000000E+20 - 9 -$PLIMMIN - 10 -0.0 - 20 -0.0 - 9 -$PLIMMAX - 10 -0.0 - 20 -0.0 - 9 -$UNITMODE - 70 - 0 - 9 -$VISRETAIN - 70 - 1 - 9 -$PLINEGEN - 70 - 0 - 9 -$PSLTSCALE - 70 - 1 - 9 -$TREEDEPTH - 70 - 3020 - 9 -$CMLSTYLE - 2 -Standard - 9 -$CMLJUST - 70 - 0 - 9 -$CMLSCALE - 40 -1.0 - 9 -$PROXYGRAPHICS - 70 - 1 - 9 -$MEASUREMENT - 70 - 0 - 9 -$CELWEIGHT -370 - -1 - 9 -$ENDCAPS -280 - 0 - 9 -$JOINSTYLE -280 - 0 - 9 -$LWDISPLAY -290 - 0 - 9 -$INSUNITS - 70 - 0 - 9 -$HYPERLINKBASE - 1 - - 9 -$STYLESHEET - 1 - - 9 -$XEDIT -290 - 1 - 9 -$CEPSNTYPE -380 - 0 - 9 -$PSTYLEMODE -290 - 1 - 9 -$FINGERPRINTGUID - 2 -{394BC0E0-D500-95D9-65ED-9BB4C8BE75F1} - 9 -$VERSIONGUID - 2 -{FAEB1C32-E019-11D5-929B-00C0DF256EC4} - 9 -$EXTNAMES -290 - 1 - 9 -$PSVPSCALE - 40 -0.0 - 9 -$OLESTARTUP -290 - 0 - 0 -ENDSEC - 0 -SECTION - 2 -CLASSES - 0 -CLASS - 1 -ACDBDICTIONARYWDFLT - 2 -AcDbDictionaryWithDefault - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -SCALE - 2 -AcDbScale - 3 -ObjectDBX Classes - 90 - 1153 -280 - 0 -281 - 0 - 0 -CLASS - 1 -VISUALSTYLE - 2 -AcDbVisualStyle - 3 -ObjectDBX Classes - 90 - 4095 -280 - 0 -281 - 0 - 0 -CLASS - 1 -MATERIAL - 2 -AcDbMaterial - 3 -ObjectDBX Classes - 90 - 1153 -280 - 0 -281 - 0 - 0 -CLASS - 1 -TABLESTYLE - 2 -AcDbTableStyle - 3 -ObjectDBX Classes - 90 - 4095 -280 - 0 -281 - 0 - 0 -CLASS - 1 -SUN - 2 -AcDbSun - 3 -SCENEOE - 90 - 1153 -280 - 0 -281 - 0 - 0 -CLASS - 1 -RASTERVARIABLES - 2 -AcDbRasterVariables - 3 -ISM - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -DICTIONARYVAR - 2 -AcDbDictionaryVar - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -ACDBPLACEHOLDER - 2 -AcDbPlaceHolder - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -CLASS - 1 -LAYOUT - 2 -AcDbLayout - 3 -ObjectDBX Classes - 90 - 0 -280 - 0 -281 - 0 - 0 -ENDSEC - 0 -SECTION - 2 -TABLES - 0 -TABLE - 2 -VPORT - 5 -8 -330 -0 -100 -AcDbSymbolTable - 70 - 1 - 0 -VPORT - 5 -22 -330 -8 -100 -AcDbSymbolTableRecord -100 -AcDbViewportTableRecord - 2 -*ACTIVE - 70 - 0 - 10 -0.0 - 20 -0.0 - 11 -1.0 - 21 -1.0 - 12 -1.846354026608343 - 22 -0.3419926426125796 - 13 -0.0 - 23 -0.0 - 14 -10.0 - 24 -10.0 - 15 -10.0 - 25 -10.0 - 16 -0.0 - 26 -0.0 - 36 -1.0 - 17 -0.0 - 27 -0.0 - 37 -0.0 - 40 -1.733730323509535 - 41 -2.172519083969465 - 42 -50.0 - 43 -0.0 - 44 -0.0 - 50 -0.0 - 51 -0.0 - 71 - 16 - 72 - 100 - 73 - 1 - 74 - 1 - 75 - 0 - 76 - 0 - 77 - 0 - 78 - 0 -281 - 0 - 65 - 0 -110 -0.0 -120 -0.0 -130 -0.0 -111 -1.0 -121 -0.0 -131 -0.0 -112 -0.0 -122 -1.0 -132 -0.0 - 79 - 0 -146 -0.0 - 0 -ENDTAB - 0 -TABLE - 2 -LTYPE - 5 -5 -330 -0 -100 -AcDbSymbolTable - 70 - 1 - 0 -LTYPE - 5 -14 -330 -5 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -ByBlock - 70 - 0 - 3 - - 72 - 65 - 73 - 0 - 40 -0.0 - 0 -LTYPE - 5 -15 -330 -5 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -ByLayer - 70 - 0 - 3 - - 72 - 65 - 73 - 0 - 40 -0.0 - 0 -LTYPE - 5 -16 -330 -5 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -CONTINUOUS - 70 - 0 - 3 -Solid line - 72 - 65 - 73 - 0 - 40 -0.0 - 0 -ENDTAB - 0 -TABLE - 2 -LAYER - 5 -2 -102 -{ACAD_XDICTIONARY -360 -1B3 -102 -} -330 -0 -100 -AcDbSymbolTable - 70 - 3 - 0 -LAYER - 5 -10 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -0 - 70 - 0 - 62 - 7 - 6 -CONTINUOUS -370 - -3 -390 -F - 0 -LAYER - 5 -21 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -TEXT-GRAY - 70 - 0 - 62 - 254 - 6 -CONTINUOUS -370 - -3 -390 -F - 0 -LAYER - 5 -1B9 -330 -2 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -TEXT-RED - 70 - 0 - 62 - 1 - 6 -CONTINUOUS -370 - -3 -390 -F -1001 -AcAecLayerStandard -1000 - -1000 - - 0 -ENDTAB - 0 -TABLE - 2 -STYLE - 5 -3 -330 -0 -100 -AcDbSymbolTable - 70 - 1 - 0 -STYLE - 5 -11 -330 -3 -100 -AcDbSymbolTableRecord -100 -AcDbTextStyleTableRecord - 2 -Standard - 70 - 0 - 40 -0.0 - 41 -1.0 - 50 -0.0 - 71 - 0 - 42 -0.2 - 3 -txt - 4 - - 0 -ENDTAB - 0 -TABLE - 2 -VIEW - 5 -6 -330 -0 -100 -AcDbSymbolTable - 70 - 0 - 0 -ENDTAB - 0 -TABLE - 2 -UCS - 5 -7 -330 -0 -100 -AcDbSymbolTable - 70 - 0 - 0 -ENDTAB - 0 -TABLE - 2 -APPID - 5 -9 -330 -0 -100 -AcDbSymbolTable - 70 - 2 - 0 -APPID - 5 -12 -330 -9 -100 -AcDbSymbolTableRecord -100 -AcDbRegAppTableRecord - 2 -ACAD - 70 - 0 - 0 -APPID - 5 -1BA -330 -9 -100 -AcDbSymbolTableRecord -100 -AcDbRegAppTableRecord - 2 -AcAecLayerStandard - 70 - 0 - 0 -ENDTAB - 0 -TABLE - 2 -DIMSTYLE - 5 -A -330 -0 -100 -AcDbSymbolTable - 70 - 1 -100 -AcDbDimStyleTable - 0 -DIMSTYLE -105 -23 -330 -A -100 -AcDbSymbolTableRecord -100 -AcDbDimStyleTableRecord - 2 -Standard - 70 - 0 -178 - 0 -340 -11 - 0 -ENDTAB - 0 -TABLE - 2 -BLOCK_RECORD - 5 -1 -330 -0 -100 -AcDbSymbolTable - 70 - 0 - 0 -BLOCK_RECORD - 5 -1D -330 -1 -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Model_Space -340 -1E - 0 -BLOCK_RECORD - 5 -1B -330 -1 -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Paper_Space -340 -1C - 0 -ENDTAB - 0 -ENDSEC - 0 -SECTION - 2 -BLOCKS - 0 -BLOCK - 5 -18D -330 -1D -100 -AcDbEntity - 8 -0 -100 -AcDbBlockBegin - 2 -*Model_Space - 70 - 0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Model_Space - 1 -*Model_Space - 0 -ENDBLK - 5 -18E -330 -1D -100 -AcDbEntity - 8 -0 -100 -AcDbBlockEnd - 0 -BLOCK - 5 -18F -330 -1B -100 -AcDbEntity - 67 - 1 - 8 -0 -100 -AcDbBlockBegin - 2 -*Paper_Space - 70 - 0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Paper_Space - 1 -*Paper_Space - 0 -ENDBLK - 5 -190 -330 -1B -100 -AcDbEntity - 67 - 1 - 8 -0 -100 -AcDbBlockEnd - 0 -ENDSEC - 0 -SECTION - 2 -ENTITIES - 0 -LWPOLYLINE - 5 -24 -102 -{ACAD_REACTORS -330 -1BD -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbPolyline - 90 - 14 - 70 - 1 - 43 -0.0 - 10 -0.0000000000000001 - 20 -0.1752767944487085 - 10 -0.0416193345059499 - 20 -0.6506897567371471 - 10 -0.1681431038010463 - 20 -0.6506897567371471 - 10 -0.247338516041492 - 20 -0.3260572124180542 - 10 -0.3260590389156172 - 20 -0.6506897567371471 - 10 -0.4521056357224397 - 20 -0.6506897567371471 - 10 -0.4963403625301471 - 20 -0.1752767944487085 - 10 -0.4066806413363264 - 20 -0.1752767944487085 - 10 -0.3752877144762009 - 20 -0.4930112663057366 - 10 -0.2987087599944248 - 20 -0.1752767944487085 - 10 -0.1973944622688229 - 20 -0.1752767944487085 - 10 -0.1174851938975943 - 20 -0.4930112663057366 - 10 -0.0896600256100814 - 20 -0.1752767944487085 - 10 -0.0000000000000001 - 20 -0.1752767944487085 - 0 -LWPOLYLINE - 5 -34 -102 -{ACAD_REACTORS -330 -1BE -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbPolyline - 90 - 5 - 70 - 1 - 43 -0.0 - 10 -0.5505660310062117 - 20 -0.1752767944487085 - 10 -0.5505660310062117 - 20 -0.5201225784624666 - 10 -0.6416519423802962 - 20 -0.5201225784624666 - 10 -0.6416519423802962 - 20 -0.1752767944487085 - 10 -0.5505660310062117 - 20 -0.1752767944487085 - 0 -LWPOLYLINE - 5 -3B -102 -{ACAD_REACTORS -330 -1BF -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbPolyline - 90 - 13 - 70 - 1 - 43 -0.0 - 10 -0.5474731617999196 - 20 -0.5714928224153991 - 10 -0.5474731617999196 - 20 -0.6288098380164536 - 42 --0.1883074803638932 - 10 -0.5513377262264826 - 20 -0.6414735544516654 - 42 --0.2159435161643535 - 10 -0.5629314195061711 - 20 -0.6456942859029685 - 10 -0.6311876334269211 - 20 -0.6456942859029685 - 42 --0.2288445935800111 - 10 -0.6418909091447587 - 20 -0.6414735544516654 - 42 --0.1763562374232752 - 10 -0.6454571456360689 - 20 -0.6288098380164536 - 10 -0.6454571456360689 - 20 -0.5714928224153991 - 42 --0.1943541296589125 - 10 -0.6418909091447587 - 20 -0.5602568182417533 - 42 --0.2096410684182619 - 10 -0.6311876334269211 - 20 -0.5565109761567706 - 10 -0.5629314195061711 - 20 -0.5565109761567706 - 42 --0.1965331617699563 - 10 -0.551636054161735 - 20 -0.5604349017541234 - 42 --0.2135460038275524 - 10 -0.5474731617999196 - 20 -0.5714928224153991 - 0 -LWPOLYLINE - 5 -4A -102 -{ACAD_REACTORS -330 -1C5 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 12 - 70 - 1 - 43 -0.0 - 10 -1.855753791898883 - 20 -0.5703040769182958 - 10 -1.749208100737245 - 20 -0.5703040769182958 - 10 -1.749208100737245 - 20 -0.4311767133994287 - 10 -1.855281946695168 - 20 -0.4311767133994287 - 42 -0.1378892503752188 - 10 -1.880487613061407 - 20 -0.4371219629662482 - 42 -0.1061516643405155 - 10 -1.890061504452931 - 20 -0.4460702789425233 - 42 -0.0752237691491799 - 10 -1.896895649500299 - 20 -0.460071904842465 - 42 -0.0778530288832081 - 10 -1.902359921375588 - 20 -0.5032381305759515 - 42 -0.0564276025149389 - 10 -1.899452746088178 - 20 -0.5325792918405643 - 42 -0.095076106856608 - 10 -1.890715999412924 - 20 -0.5535383513733607 - 42 -0.1319298941216669 - 10 -1.876149681349825 - 20 -0.5661122650117364 - 42 -0.1129501247093477 - 10 -1.855753791898883 - 20 -0.5703040769182958 - 0 -LWPOLYLINE - 5 -58 -102 -{ACAD_REACTORS -330 -1C7 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 23 - 70 - 1 - 43 -0.0 - 10 -2.401085080890193 - 20 -0.451391475175396 - 10 -2.401085080890193 - 20 -0.502049385078848 - 10 -2.456975906310984 - 20 -0.5208364345932495 - 10 -2.471953186325706 - 20 -0.6169178168015124 - 10 -2.547828939245814 - 20 -0.6169178168015124 - 10 -2.547828939245814 - 20 -0.5208364345932495 - 10 -2.625120227777072 - 20 -0.5208364345932495 - 10 -2.625120227777072 - 20 -0.451391475175396 - 10 -2.547828939245814 - 20 -0.451391475175396 - 10 -2.547828939245814 - 20 -0.312977967787312 - 42 -0.0356379455033458 - 10 -2.549609774369517 - 20 -0.2833386307955768 - 42 -0.0811642329835157 - 10 -2.554952279740622 - 20 -0.2643422951021078 - 42 -0.1858874482849488 - 10 -2.577068121063173 - 20 -0.244721753866562 - 42 -0.0076184446139192 - 10 -2.607448863857263 - 20 -0.2345547073915278 - 42 -0.0469611640188665 - 10 -2.620599646309214 - 20 -0.2311657933719365 - 10 -2.620599646309214 - 20 -0.1752767944487085 - 10 -2.541405756150071 - 20 -0.1752767944487085 - 42 --0.1146121843643247 - 10 -2.504464842943029 - 20 -0.1829913113213321 - 42 --0.132229815857891 - 10 -2.478071953160988 - 20 -0.2061345575229422 - 42 --0.0940182241125145 - 10 -2.462242307616974 - 20 -0.2447068374697993 - 42 --0.0555506677049525 - 10 -2.456975906310984 - 20 -0.2987081511619036 - 10 -2.456975906310984 - 20 -0.451391475175396 - 10 -2.401085080890193 - 20 -0.451391475175396 - 0 -LWPOLYLINE - 5 -71 -102 -{ACAD_REACTORS -330 -1CA -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 22 - 70 - 1 - 43 -0.0 - 10 -3.589495720107105 - 20 -0.5260693501105883 - 42 --0.0932412511784359 - 10 -3.634655872346617 - 20 -0.5185183047698327 - 42 --0.1254375778784052 - 10 -3.666908775142547 - 20 -0.4958651687475662 - 42 --0.1084619648488494 - 10 -3.686254428494896 - 20 -0.4581099420437885 - 42 --0.0689905889343237 - 10 -3.692708053216686 - 20 -0.4052541467398021 - 10 -3.692708053216686 - 20 -0.1752767944487085 - 10 -3.601870241094878 - 20 -0.1752767944487085 - 10 -3.601870241094878 - 20 -0.4064428922369056 - 42 -0.0660852200863579 - 10 -3.59946535263723 - 20 -0.4269407611351025 - 42 -0.1056585132217627 - 10 -3.592296349703354 - 20 -0.4415816611820138 - 42 -0.1272161701661909 - 10 -3.580317569854181 - 20 -0.4503655923776398 - 42 -0.0972102752618352 - 10 -3.56357467552878 - 20 -0.4532940768032824 - 42 -0.0885878555139059 - 10 -3.519221226379493 - 20 -0.4465162487641 - 42 -0.077710311269079 - 10 -3.480332049105495 - 20 -0.4233288622047228 - 10 -3.480332049105495 - 20 -0.1752767944487085 - 10 -3.389479016170664 - 20 -0.1752767944487085 - 10 -3.389479016170664 - 20 -0.5201225784624666 - 10 -3.462264944047086 - 20 -0.5201225784624666 - 10 -3.480332049105495 - 20 -0.4832608134831443 - 42 --0.0353892151285229 - 10 -3.522843779878989 - 20 -0.5102534032982943 - 42 --0.0728322192286089 - 10 -3.555720736008866 - 20 -0.5227390362211358 - 42 --0.0544633437581111 - 10 -3.589495720107105 - 20 -0.5260693501105883 - 0 -LWPOLYLINE - 5 -89 -102 -{ACAD_REACTORS -330 -1C6 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 17 - 70 - 1 - 43 -0.0 - 10 -2.026516093204943 - 20 -0.5201225784624666 - 10 -2.12187448679461 - 20 -0.5201225784624666 - 10 -2.181814048479542 - 20 -0.2784929327615455 - 42 -0.1680883445175794 - 10 -2.192925241986399 - 20 -0.2601209548182838 - 42 -0.1691212946679427 - 10 -2.213442897941526 - 20 -0.2539970129065732 - 42 -0.0518086164809523 - 10 -2.216060877781497 - 20 -0.2532834611920508 - 10 -2.285026381589124 - 20 -0.5201225784624666 - 10 -2.379912929975073 - 20 -0.5201225784624666 - 10 -2.2602925604266 - 20 -0.0661149499446615 - 10 -2.21297105273781 - 20 -0.0 - 10 -2.147795531372934 - 20 -0.0 - 10 -2.196547795485895 - 20 -0.1752767944487085 - 42 --0.0815316895695442 - 10 -2.160444026995122 - 20 -0.1807616144215795 - 42 --0.0970784439939463 - 10 -2.131326611681949 - 20 -0.1972162265483224 - 42 --0.0875143454723418 - 10 -2.109195549546374 - 20 -0.2246403264126769 - 42 --0.0638836232247607 - 10 -2.094050840588399 - 20 -0.2630342184309034 - 10 -2.026516093204943 - 20 -0.5201225784624666 - 0 -LWPOLYLINE - 5 -9C -102 -{ACAD_REACTORS -330 -1C8 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 22 - 70 - 1 - 43 -0.0 - 10 -2.66863653221009 - 20 -0.1752767944487085 - 10 -2.66863653221009 - 20 -0.683985285225159 - 10 -2.758774186932835 - 20 -0.683985285225159 - 10 -2.758774186932835 - 20 -0.4832608134831443 - 42 --0.0349812911378511 - 10 -2.80104238469796 - 20 -0.5100159586151339 - 42 --0.0697958386932639 - 10 -2.834162873836206 - 20 -0.5227390362211358 - 42 --0.0522006296457192 - 10 -2.868653236146531 - 20 -0.5260693501105883 - 42 --0.0932412511784358 - 10 -2.913798167573019 - 20 -0.5185183047698327 - 42 --0.1254375778784047 - 10 -2.946066291181972 - 20 -0.4958651687475662 - 42 --0.1084619648488494 - 10 -2.965411944534321 - 20 -0.4581099420437885 - 42 --0.0689905889343073 - 10 -2.971865569256112 - 20 -0.4052541467398021 - 10 -2.971865569256112 - 20 -0.1752767944487085 - 10 -2.881012536321281 - 20 -0.1752767944487085 - 10 -2.881012536321281 - 20 -0.4064428922369056 - 42 -0.0660852200863579 - 10 -2.878622868676655 - 20 -0.4269407611351025 - 42 -0.1056585132217627 - 10 -2.871438644929757 - 20 -0.4415816611820138 - 42 -0.1272161701661909 - 10 -2.859475085893608 - 20 -0.4503655923776398 - 42 -0.0972102752618352 - 10 -2.842716970755184 - 20 -0.4532940768032824 - 42 -0.088587855513906 - 10 -2.798363521605896 - 20 -0.4465162487641 - 42 -0.0777103112690791 - 10 -2.759489565144921 - 20 -0.4233288622047228 - 10 -2.759489565144921 - 20 -0.1752767944487085 - 10 -2.66863653221009 - 20 -0.1752767944487085 - 0 -LWPOLYLINE - 5 -B4 -102 -{ACAD_REACTORS -330 -1C0 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbPolyline - 90 - 34 - 70 - 1 - 43 -0.0 - 10 -0.6946873432779551 - 20 -0.3481760979032103 - 42 --0.0229891281782208 - 10 -0.6967086672474216 - 20 -0.3959192221127403 - 42 --0.0328228697904816 - 10 -0.7027741612371234 - 20 -0.4354583281028243 - 42 --0.0483316739793035 - 10 -0.7128214199136659 - 20 -0.4666716493692773 - 42 --0.0727828188712317 - 10 -0.7267941262688635 - 20 -0.489443507733124 - 42 --0.1227899169725496 - 10 -0.762229701067922 - 20 -0.5157237634987931 - 42 --0.0944303865644604 - 10 -0.8083670295035159 - 20 -0.5234528923519188 - 42 --0.0315898411800418 - 10 -0.8956492597031299 - 20 -0.5183995824282526 - 42 --0.0456865147865019 - 10 -0.9667593760657095 - 20 -0.5032381305759515 - 10 -0.9667593760657095 - 20 -0.448776539498029 - 42 -0.0070437593452633 - 10 -0.8389882611433709 - 20 -0.4484492920180325 - 42 -0.0290350112768282 - 10 -0.82418297631581 - 20 -0.4474675495780431 - 42 -0.0847606935358247 - 10 -0.8076546954540353 - 20 -0.4410458885636011 - 42 -0.1825489438203349 - 10 -0.7945739287419907 - 20 -0.4249924970681467 - 42 -0.0517789759014607 - 10 -0.7877961007028083 - 20 -0.3930348780448645 - 42 -0.0296456838705223 - 10 -0.7855358099688792 - 20 -0.3499599771895165 - 42 -0.0216618761660938 - 10 -0.7870822445720254 - 20 -0.3081910220915498 - 42 -0.0471796273319681 - 10 -0.7917200263001613 - 20 -0.280157633081881 - 42 -0.072662787539697 - 10 -0.7993608744377529 - 20 -0.262588400817457 - 42 -0.1214661602111968 - 10 -0.8099134641066621 - 20 -0.2522132858283972 - 42 -0.0832516876593145 - 10 -0.8254021634389597 - 20 -0.247129686486815 - 42 -0.0435906078463293 - 10 -0.8478467743228099 - 20 -0.2454353055810845 - 42 -0.021166726074658 - 10 -0.9539175761181276 - 20 -0.2499539083432495 - 10 -0.9712784354522652 - 20 -0.2513808595641643 - 10 -0.9712784354522652 - 20 -0.1940650616281518 - 42 --0.0978017422898016 - 10 -0.9130101190372676 - 20 -0.1759903461632311 - 42 --0.0233934475797722 - 10 -0.8395225116804813 - 20 -0.1719472415999074 - 10 -0.8357173084247086 - 20 -0.1719472415999074 - 42 --0.1019475670653864 - 10 -0.7625265069218723 - 20 -0.1805684623043164 - 42 --0.117873950403685 - 10 -0.7277454270828068 - 20 -0.2064319722094134 - 42 --0.0715503088956374 - 10 -0.7132826105482655 - 20 -0.2296496481867064 - 42 --0.0491245187935067 - 10 -0.7029522447494936 - 20 -0.2610127422533067 - 42 --0.0334830700706472 - 10 -0.6967528076051885 - 20 -0.3005215588254747 - 42 --0.023527584931374 - 10 -0.6946873432779551 - 20 -0.3481760979032103 - 0 -LWPOLYLINE - 5 -D8 -102 -{ACAD_REACTORS -330 -1C1 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbPolyline - 90 - 16 - 70 - 1 - 43 -0.0 - 10 -1.020746077777311 - 20 -0.1752767944487085 - 10 -1.020746077777311 - 20 -0.5201225784624666 - 10 -1.097325032259088 - 20 -0.5201225784624666 - 10 -1.111594544468236 - 20 -0.4766017077855419 - 42 --0.0805753976673698 - 10 -1.160646658597752 - 20 -0.5117404767306502 - 42 --0.1124747672601628 - 10 -1.210292384435168 - 20 -0.5234528923519188 - 42 --0.0241299749672376 - 10 -1.233896821271378 - 20 -0.5225015915379756 - 42 --0.060832138395251 - 10 -1.248581861676056 - 20 -0.519647689096146 - 10 -1.248581861676056 - 20 -0.4318905695302117 - 42 -0.0248536783236681 - 10 -1.199353186115472 - 20 -0.4337931711580981 - 42 -0.0387057739818888 - 10 -1.170873522867967 - 20 -0.4317718471886316 - 42 -0.0551847743452131 - 10 -1.147743975398077 - 20 -0.4257063531989297 - 42 -0.080499651857314 - 10 -1.128480514436053 - 20 -0.4141126599192412 - 42 -0.0645077730986141 - 10 -1.111594544468236 - 20 -0.39550369391721 - 10 -1.111594544468236 - 20 -0.1752767944487085 - 10 -1.020746077777311 - 20 -0.1752767944487085 - 0 -LWPOLYLINE - 5 -EA -102 -{ACAD_REACTORS -330 -1C9 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 30 - 70 - 1 - 43 -0.0 - 10 -3.020617833369073 - 20 -0.3410405807579851 - 42 --0.0409081205529831 - 10 -3.025732026544832 - 20 -0.4159559003763376 - 42 --0.0781599297384411 - 10 -3.041896529975355 - 20 -0.4673261443292702 - 42 --0.1364366144086533 - 10 -3.072459922525721 - 20 -0.5006216728172821 - 42 --0.0882009175036989 - 10 -3.116752488422916 - 20 -0.5177450874682596 - 42 --0.0529086836461284 - 10 -3.177818390271558 - 20 -0.5234528923519188 - 42 --0.0321103580647159 - 10 -3.218868922994835 - 20 -0.5210145181056196 - 42 --0.0444041287441238 - 10 -3.253054869044698 - 20 -0.5137024395293266 - 42 --0.0605636228964518 - 10 -3.280406670047193 - 20 -0.5015136124604352 - 42 --0.0762678881360705 - 10 -3.300893884376273 - 20 -0.4844495589802478 - 42 --0.0695139514449708 - 10 -3.315825501951926 - 20 -0.4611571488110112 - 42 --0.0499044136612151 - 10 -3.326495291881113 - 20 -0.4302847737562754 - 42 --0.0350340529330662 - 10 -3.332888033350811 - 20 -0.3918309117347381 - 42 --0.0250615206333876 - 10 -3.335018947174044 - 20 -0.3457970848277011 - 42 --0.0247570817049555 - 10 -3.332933695789881 - 20 -0.2998822846785048 - 42 --0.035093333100506 - 10 -3.326632279198321 - 20 -0.2617856551386192 - 42 --0.0509721690967282 - 10 -3.316160359838434 - 20 -0.2315076528324352 - 42 --0.0726634493786117 - 10 -3.301487496084174 - 20 -0.2090479733436921 - 42 --0.0773754337522631 - 10 -3.281182931511371 - 20 -0.1928163461277374 - 42 --0.0591962390389137 - 10 -3.253800688882829 - 20 -0.1812223484317884 - 42 --0.0423681953096553 - 10 -3.219355989011574 - 20 -0.174265980255845 - 42 --0.0302514249026995 - 10 -3.177818390271558 - 20 -0.1719472415999074 - 42 --0.0327640807112059 - 10 -3.136935286491535 - 20 -0.1744296039958433 - 42 --0.0448781589059774 - 10 -3.10273411962865 - 20 -0.1818763867673907 - 42 --0.060332284523739 - 10 -3.075214889682901 - 20 -0.1942878943308099 - 42 --0.0746618379907621 - 10 -3.054392817467312 - 20 -0.2116639744779708 - 42 --0.0666236365557017 - 10 -3.03961340802189 - 20 -0.2341087375699512 - 42 --0.0504061851560683 - 10 -3.029065384596889 - 20 -0.2631532451887439 - 42 --0.0367317311855017 - 10 -3.022733526379283 - 20 -0.2987971929180886 - 42 --0.0269050519350767 - 10 -3.020617833369073 - 20 -0.3410405807579851 - 0 -LWPOLYLINE - 5 -10A -102 -{ACAD_REACTORS -330 -1C2 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbPolyline - 90 - 21 - 70 - 1 - 43 -0.0 - 10 -1.390325682953593 - 20 -0.4318905695302117 - 42 -0.0242919032698246 - 10 -1.38033778544784 - 20 -0.3839084785562191 - 42 -0.0375411437912006 - 10 -1.377007471558388 - 20 -0.3446083393305977 - 42 -0.0398730504554166 - 10 -1.38033778544784 - 20 -0.2901464438364147 - 42 -0.0541422102818605 - 10 -1.38500448672072 - 20 -0.2730230291854372 - 42 -0.0823828350418203 - 10 -1.392347006923059 - 20 -0.2606561186041756 - 42 -0.1602559612730944 - 10 -1.412086879332706 - 20 -0.2480513067153631 - 42 -0.0555482263236158 - 10 -1.442053616012568 - 20 -0.2454353055810845 - 42 -0.0316904222703728 - 10 -1.470353673666401 - 20 -0.2467432300441587 - 42 -0.1007429782984575 - 10 -1.488551677716809 - 20 -0.2532834611920508 - 42 -0.1818370389300056 - 10 -1.501154510899928 - 20 -0.2694555750290851 - 42 -0.0526041808970857 - 10 -1.507395044239396 - 20 -0.2969244240837275 - 42 -0.0324432335036989 - 10 -1.50948029562356 - 20 -0.3327178401969589 - 42 -0.018652937942289 - 10 -1.507927772695204 - 20 -0.3912220792138144 - 42 -0.0530768467862457 - 10 -1.502463500819915 - 20 -0.4224962837323597 - 42 -0.1914595274942226 - 10 -1.48998243414098 - 20 -0.4402133100912379 - 42 -0.0889989641192241 - 10 -1.472167994578754 - 20 -0.4475269107488332 - 42 -0.0570509400215991 - 10 -1.448236310262548 - 20 -0.4499652849951324 - 42 -0.0204219730568417 - 10 -1.425137204418705 - 20 -0.4491616260675131 - 42 -0.045760246847436 - 10 -1.409828110680079 - 20 -0.4467536934472601 - 42 -0.1785155631256146 - 10 -1.390325682953593 - 20 -0.4318905695302117 - 0 -LWPOLYLINE - 5 -121 -102 -{ACAD_REACTORS -330 -1C9 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 21 - 70 - 1 - 43 -0.0 - 10 -3.124789077699108 - 20 -0.4318905695302117 - 42 -0.0242919032698246 - 10 -3.114804224355961 - 20 -0.3839084785562191 - 42 -0.0375411437912007 - 10 -3.111470866303904 - 20 -0.3446083393305977 - 42 -0.0398730504554166 - 10 -3.114804224355961 - 20 -0.2901464438364147 - 42 -0.0541422102818607 - 10 -3.119461793141027 - 20 -0.2730230291854372 - 42 -0.0823828350418199 - 10 -3.12681344583118 - 20 -0.2606561186041756 - 42 -0.1602559612730945 - 10 -3.146539619509106 - 20 -0.2480513067153631 - 42 -0.0555482263236158 - 10 -3.176509400351572 - 20 -0.2454353055810845 - 42 -0.0316904222703728 - 10 -3.204820112574522 - 20 -0.2467432300441587 - 42 -0.1007429782984576 - 10 -3.223008984137115 - 20 -0.2532834611920508 - 42 -0.1818370389300056 - 10 -3.235611817320236 - 20 -0.2694555750290851 - 42 -0.0526041808970857 - 10 -3.241852350659703 - 20 -0.2969244240837275 - 42 -0.0324432335036989 - 10 -3.243937602043866 - 20 -0.3327178401969589 - 42 -0.018652937942289 - 10 -3.242385079115511 - 20 -0.3912220792138144 - 42 -0.0530768467862456 - 10 -3.236920807240222 - 20 -0.4224962837323597 - 42 -0.1914595274942226 - 10 -3.224439740561286 - 20 -0.4402133100912379 - 42 -0.0889989641192241 - 10 -3.20663138932427 - 20 -0.4475269107488332 - 42 -0.0570509400215991 - 10 -3.182689050438947 - 20 -0.4499652849951324 - 42 -0.0204219730568417 - 10 -3.159599077082918 - 20 -0.4491616260675131 - 42 -0.045760246847436 - 10 -3.144286939181689 - 20 -0.4467536934472601 - 42 -0.178515563125615 - 10 -3.124789077699108 - 20 -0.4318905695302117 - 0 -LWPOLYLINE - 5 -138 -102 -{ACAD_REACTORS -330 -1C5 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbPolyline - 90 - 17 - 70 - 1 - 43 -0.0 - 10 -1.658111534794044 - 20 -0.1752767944487085 - 10 -1.658111534794044 - 20 -0.6506897567371471 - 10 -1.862892353206713 - 20 -0.6506897567371471 - 42 --0.0918352741933524 - 10 -1.923821267738147 - 20 -0.6408190594916725 - 42 --0.133922059302927 - 10 -1.965389308104209 - 20 -0.6112100119178533 - 42 --0.1060028202258852 - 10 -1.987322499670483 - 20 -0.566558234833313 - 42 --0.0661506729116568 - 10 -1.99464371073459 - 20 -0.5039519867067345 - 42 --0.0710178368558241 - 10 -1.985846080807243 - 20 -0.4324841812381122 - 42 --0.0374247138640044 - 10 -1.976089539659442 - 20 -0.4061156447569091 - 42 --0.057718769966508 - 10 -1.964430396883754 - 20 -0.3867030198272586 - 42 --0.1271250474471338 - 10 -1.932329702218055 - 20 -0.3624456101123582 - 42 --0.110827379232239 - 10 -1.875723498585179 - 20 -0.3505535888974171 - 42 --0.0258396192335467 - 10 -1.802480946318064 - 20 -0.3564988384642365 - 42 --0.0037744416271255 - 10 -1.763835302052436 - 20 -0.3612568646152548 - 42 --0.0304647996844293 - 10 -1.749208100737245 - 20 -0.3636343556094617 - 10 -1.749208100737245 - 20 -0.1752767944487085 - 10 -1.658111534794044 - 20 -0.1752767944487085 - 0 -LWPOLYLINE - 5 -14B -102 -{ACAD_REACTORS -330 -1C2 -102 -} -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbPolyline - 90 - 30 - 70 - 1 - 43 -0.0 - 10 -1.286159004867464 - 20 -0.3410405807579851 - 42 --0.040908120552983 - 10 -1.29127167596192 - 20 -0.4159559003763376 - 42 --0.0781599297384411 - 10 -1.307443789798954 - 20 -0.4673261443292702 - 42 --0.1364366144086534 - 10 -1.338004138186717 - 20 -0.5006216728172821 - 42 --0.088200917503699 - 10 -1.382299748246516 - 20 -0.5177450874682596 - 42 --0.0529086836461285 - 10 -1.443361083851251 - 20 -0.5234528923519188 - 42 --0.0321103580647177 - 10 -1.484408572411924 - 20 -0.5210145181056196 - 42 --0.0444041287441238 - 10 -1.518597562624391 - 20 -0.5137024395293266 - 42 --0.0605636228964518 - 10 -1.545949363626886 - 20 -0.5015136124604352 - 42 --0.0762678881361016 - 10 -1.566436577955966 - 20 -0.4844495589802478 - 42 --0.0695139514449315 - 10 -1.581368195531619 - 20 -0.4611571488110112 - 42 --0.0499044136612151 - 10 -1.592037985460806 - 20 -0.4302847737562754 - 42 --0.0350340529330662 - 10 -1.598430726930504 - 20 -0.3918309117347381 - 42 --0.0250615206333974 - 10 -1.600561640753737 - 20 -0.3457970848277011 - 42 --0.0247570817049556 - 10 -1.59846116855655 - 20 -0.2998822846785048 - 42 --0.035093333100506 - 10 -1.592174972778014 - 20 -0.2617856551386192 - 42 --0.0509721690967282 - 10 -1.581703053418127 - 20 -0.2315076528324352 - 42 --0.0726634493786118 - 10 -1.567030189663867 - 20 -0.2090479733436921 - 42 --0.0773754337522942 - 10 -1.546725625091063 - 20 -0.1928163461277374 - 42 --0.0591962390389137 - 10 -1.519343382462522 - 20 -0.1812223484317884 - 42 --0.0423681953096553 - 10 -1.484891072184755 - 20 -0.174265980255845 - 42 --0.0302514249026978 - 10 -1.443361083851251 - 20 -0.1719472415999074 - 42 --0.0327640807112059 - 10 -1.402470369664717 - 20 -0.1744296039958433 - 42 --0.0448781589059774 - 10 -1.368267680720529 - 20 -0.1818763867673907 - 42 --0.060332284523739 - 10 -1.340754539099989 - 20 -0.1942878943308099 - 42 --0.0746618379907621 - 10 -1.319929422721796 - 20 -0.2116639744779708 - 42 --0.0666236365556613 - 10 -1.305154579520281 - 20 -0.2341087375699512 - 42 --0.0504061851560684 - 10 -1.294601989851372 - 20 -0.2631532451887439 - 42 --0.0367317311855017 - 10 -1.288268609552464 - 20 -0.2987971929180886 - 42 --0.0269050519351071 - 10 -1.286159004867464 - 20 -0.3410405807579851 - 0 -HATCH - 5 -1BD -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 14 - 72 - 1 - 10 -0.0000000000000001 - 20 -0.1752767944487085 - 11 -0.0416193345059499 - 21 -0.6506897567371471 - 72 - 1 - 10 -0.0416193345059499 - 20 -0.6506897567371471 - 11 -0.1681431038010463 - 21 -0.6506897567371471 - 72 - 1 - 10 -0.1681431038010463 - 20 -0.6506897567371471 - 11 -0.247338516041492 - 21 -0.3260572124180542 - 72 - 1 - 10 -0.247338516041492 - 20 -0.3260572124180542 - 11 -0.3260590389156172 - 21 -0.6506897567371471 - 72 - 1 - 10 -0.3260590389156172 - 20 -0.6506897567371471 - 11 -0.4521056357224397 - 21 -0.6506897567371471 - 72 - 1 - 10 -0.4521056357224397 - 20 -0.6506897567371471 - 11 -0.4963403625301471 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.4963403625301471 - 20 -0.1752767944487085 - 11 -0.4066806413363264 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.4066806413363264 - 20 -0.1752767944487085 - 11 -0.3752877144762009 - 21 -0.4930112663057366 - 72 - 1 - 10 -0.3752877144762009 - 20 -0.4930112663057366 - 11 -0.2987087599944248 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.2987087599944248 - 20 -0.1752767944487085 - 11 -0.1973944622688229 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.1973944622688229 - 20 -0.1752767944487085 - 11 -0.1174851938975943 - 21 -0.4930112663057366 - 72 - 1 - 10 -0.1174851938975943 - 20 -0.4930112663057366 - 11 -0.0896600256100814 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.0896600256100814 - 20 -0.1752767944487085 - 11 -0.0000000000000001 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.0000000000000001 - 20 -0.1752767944487085 - 11 -0.0000000000000001 - 21 -0.1752767944487085 - 97 - 1 -330 -24 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1BE -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 5 - 72 - 1 - 10 -0.5505660310062117 - 20 -0.1752767944487085 - 11 -0.5505660310062117 - 21 -0.5201225784624666 - 72 - 1 - 10 -0.5505660310062117 - 20 -0.5201225784624666 - 11 -0.6416519423802962 - 21 -0.5201225784624666 - 72 - 1 - 10 -0.6416519423802962 - 20 -0.5201225784624666 - 11 -0.6416519423802962 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.6416519423802962 - 20 -0.1752767944487085 - 11 -0.5505660310062117 - 21 -0.1752767944487085 - 72 - 1 - 10 -0.5505660310062117 - 20 -0.1752767944487085 - 11 -0.5505660310062117 - 21 -0.1752767944487085 - 97 - 1 -330 -34 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1BF -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 13 - 72 - 1 - 10 -0.5474731617999196 - 20 -0.5714928224153991 - 11 -0.5474731617999196 - 21 -0.6288098380164536 - 72 - 2 - 10 -0.5656218268345913 - 20 -0.630192970755272 - 40 -0.0182012938747197 - 50 -175.6418407014946 - 51 -218.2992114073367 - 73 - 0 - 72 - 2 - 10 -0.5617930966007493 - 20 -0.6307876795407876 - 40 -0.0149500064305679 - 50 -225.6246753032742 - 51 -274.3668398711414 - 73 - 0 - 72 - 1 - 10 -0.5629314195061711 - 20 -0.6456942859029685 - 11 -0.6311876334269211 - 21 -0.6456942859029685 - 72 - 2 - 10 -0.6321698296440981 - 20 -0.6325035330064808 - 40 -0.0132272699898821 - 50 -265.7415594617891 - 51 -317.3010585925538 - 73 - 0 - 72 - 2 - 10 -0.6262804611730807 - 20 -0.6302434840168466 - 40 -0.0192301993709753 - 50 -324.2689673804306 - 51 -364.2754703081528 - 73 - 0 - 72 - 1 - 10 -0.6454571456360689 - 20 -0.6288098380164536 - 11 -0.6454571456360689 - 21 -0.5714928224153991 - 72 - 2 - 10 -0.6297669641888812 - 20 -0.5702888340215038 - 40 -0.0157363077593922 - 50 -355.611999000231 - 51 -399.6062175218991 - 73 - 0 - 72 - 2 - 10 -0.6322686211170757 - 20 -0.5705867464421508 - 40 -0.0141172179806454 - 50 -47.03124341518984 - 51 -94.39156764264102 - 73 - 0 - 72 - 1 - 10 -0.6311876334269211 - 20 -0.5565109761567706 - 11 -0.5629314195061711 - 21 -0.5565109761567706 - 72 - 2 - 10 -0.5620823708457157 - 20 -0.572286229491247 - 40 -0.0157980853711685 - 50 -86.91922452913958 - 51 -131.3944660406891 - 73 - 0 - 72 - 2 - 10 -0.5619098596911134 - 20 -0.570615150925454 - 40 -0.0144633520750158 - 50 -135.2620677004958 - 51 -183.4789850614727 - 73 - 0 - 72 - 1 - 10 -0.5474731617999196 - 20 -0.5714928224153991 - 11 -0.5474731617999196 - 21 -0.5714928224153991 - 97 - 1 -330 -3B - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C0 -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 34 - 72 - 2 - 10 -1.214616030315336 - 20 -0.350077974119305 - 40 -0.5199321655154222 - 50 -179.7904154992175 - 51 -185.0582076977404 - 73 - 0 - 72 - 2 - 10 -1.000572124284262 - 20 -0.3695398595471971 - 40 -0.3050063463138826 - 50 -184.961591177561 - 51 -192.4813391512255 - 73 - 0 - 72 - 2 - 10 -0.8688743989493632 - 20 -0.3992160253637114 - 40 -0.170008215907044 - 50 -192.3087569665484 - 51 -203.3769478223085 - 73 - 0 - 72 - 2 - 10 -0.7976119460679242 - 20 -0.4303172999651613 - 40 -0.0922554716323781 - 50 -203.2074684948184 - 51 -219.8587008780153 - 73 - 0 - 72 - 2 - 10 -0.7972117188097253 - 20 -0.4315246663413517 - 40 -0.0911769133466147 - 50 -219.4374770529955 - 51 -247.4386863416477 - 73 - 0 - 72 - 2 - 10 -0.8055784036639897 - 20 -0.398531115770543 - 40 -0.124952897918856 - 50 -249.7009350090099 - 51 -271.2787999327404 - 73 - 0 - 72 - 2 - 10 -0.8120564786102148 - 20 --0.1691304899318403 - 40 -0.6925932092147039 - 50 -269.6947835186498 - 51 -276.9322349981942 - 73 - 0 - 72 - 2 - 10 -0.8484128964611991 - 20 -0.1225112149529162 - 40 -0.3986964678983381 - 50 -276.8042143326444 - 51 -287.2675164228719 - 73 - 0 - 72 - 1 - 10 -0.9667593760657095 - 20 -0.5032381305759515 - 11 -0.9667593760657095 - 21 -0.448776539498029 - 72 - 2 - 10 -0.9144880443227094 - 20 --4.086066981505726 - 40 -4.535144766389704 - 50 -89.3396036583715 - 51 -90.9538876909594 - 73 - 1 - 72 - 2 - 10 -0.8400315841062043 - 20 -0.3205880251107224 - 40 -0.1278655234922502 - 50 -90.46751199340585 - 51 -97.1199774171112 - 73 - 1 - 72 - 2 - 10 -0.8347233227483223 - 20 -0.3958571165940125 - 40 -0.0526757600392865 - 50 -101.54272561012 - 51 -120.9221245987022 - 73 - 1 - 72 - 2 - 10 -0.8223667308685831 - 20 -0.4157021086294436 - 40 -0.029304456442492 - 50 -120.1351163505028 - 51 -161.5166003585789 - 73 - 1 - 72 - 2 - 10 -0.9450695696956614 - 20 -0.3763766174814469 - 40 -0.1581532222056973 - 50 -162.0975481756131 - 51 -173.9538270794763 - 73 - 1 - 72 - 2 - 10 -1.149594366372439 - 20 -0.3524533042818777 - 40 -0.3640670943255288 - 50 -173.6000944629489 - 51 -180.3923953532557 - 73 - 1 - 72 - 2 - 10 -1.268138893295446 - 20 -0.346914547227496 - 40 -0.4826126922076991 - 50 -179.638444150984 - 51 -184.6022041776311 - 73 - 1 - 72 - 2 - 10 -0.9376165336263994 - 20 -0.3186947544718952 - 40 -0.1509003001157511 - 50 -183.9914206989488 - 51 -194.7961827171795 - 73 - 1 - 72 - 2 - 10 -0.8556691262907683 - 20 -0.2975229405501065 - 40 -0.0662649326044679 - 50 -195.1922580686626 - 51 -211.8161260167849 - 73 - 1 - 72 - 2 - 10 -0.8256760335810848 - 20 -0.2787995943136916 - 40 -0.0309077724093995 - 50 -211.6347351863199 - 51 -239.3370203444206 - 73 - 1 - 72 - 2 - 10 -0.8328177638353177 - 20 -0.2958607887822569 - 40 -0.0492921034260791 - 50 -242.3114767787511 - 51 -261.3474606529535 - 73 - 1 - 72 - 2 - 10 -0.8463235842781011 - 20 -0.3747617950344397 - 40 -0.1293354591063143 - 50 -260.6908797927596 - 51 -270.6747908046021 - 73 - 1 - 72 - 2 - 10 -0.8475369120546362 - 20 -1.499934543466537 - 40 -1.25449927615356 - 50 -270.0141521009336 - 51 -274.864484102984 - 73 - 1 - 72 - 1 - 10 -0.9539175761181276 - 20 -0.2499539083432495 - 11 -0.9712784354522652 - 21 -0.2513808595641643 - 72 - 1 - 10 -0.9712784354522652 - 20 -0.2513808595641643 - 11 -0.9712784354522652 - 21 -0.1940650616281518 - 72 - 2 - 10 -0.8963837746081258 - 20 -0.3325480038481863 - 40 -0.1574380370459314 - 50 -61.59448955636654 - 51 -83.93793890179708 - 73 - 0 - 72 - 2 - 10 -0.8330823004026875 - 20 -0.9588829323823655 - 40 -0.7869620433976263 - 50 -84.17070136778845 - 51 -89.53110693540054 - 73 - 0 - 72 - 1 - 10 -0.8395225116804813 - 20 -0.1719472415999074 - 11 -0.8357173084247086 - 21 -0.1719472415999074 - 72 - 2 - 10 -0.8200434901136805 - 20 -0.3538739274501789 - 40 -0.1826006232325358 - 50 -85.075865127039 - 51 -108.3600821200968 - 73 - 0 - 72 - 2 - 10 -0.7992279764644755 - 20 -0.2662427996310877 - 40 -0.093204559668334 - 50 -113.1894915396505 - 51 -140.0801272454766 - 73 - 0 - 72 - 2 - 10 -0.8012223158134221 - 20 -0.2683158374418412 - 40 -0.0960649049009913 - 50 -139.8951733394063 - 51 -156.2653987660679 - 73 - 0 - 72 - 2 - 10 -0.867342438096846 - 20 -0.2977766777590661 - 40 -0.168450950198126 - 50 -156.1444339138709 - 51 -167.3939009796797 - 73 - 0 - 72 - 2 - 10 -0.99451280167804 - 20 -0.3270031053307328 - 40 -0.2989352544876143 - 50 -167.2468323736907 - 51 -174.9177209790342 - 73 - 0 - 72 - 2 - 10 -1.20180856877263 - 20 -0.3462839419889538 - 40 -0.5071247554608478 - 50 -174.8226486749857 - 51 -180.2137793480696 - 73 - 0 - 72 - 1 - 10 -0.6946873432779551 - 20 -0.3481760979032103 - 11 -0.6946873432779551 - 21 -0.3481760979032103 - 97 - 1 -330 -B4 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C1 -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 16 - 72 - 1 - 10 -1.020746077777311 - 20 -0.1752767944487085 - 11 -1.020746077777311 - 21 -0.5201225784624666 - 72 - 1 - 10 -1.020746077777311 - 20 -0.5201225784624666 - 11 -1.097325032259088 - 21 -0.5201225784624666 - 72 - 1 - 10 -1.097325032259088 - 20 -0.5201225784624666 - 11 -1.111594544468236 - 21 -0.4766017077855419 - 72 - 2 - 10 -1.244437268897258 - 20 -0.3429659792394641 - 40 -0.1884295554783436 - 50 -225.1705040479414 - 51 -243.5972159016927 - 73 - 0 - 72 - 2 - 10 -1.211173613045121 - 20 -0.4086440720149234 - 40 -0.114812202274129 - 50 -243.8907918763913 - 51 -269.5602281386679 - 73 - 0 - 72 - 2 - 10 -1.212244334515651 - 20 -0.2785645037372034 - 40 -0.2448961677679514 - 50 -269.5433179430547 - 51 -275.0724278925614 - 73 - 0 - 72 - 2 - 10 -1.229554147138809 - 20 -0.4609473043473566 - 40 -0.0617072855517635 - 50 -274.0355485122913 - 51 -287.9600884366593 - 73 - 0 - 72 - 1 - 10 -1.248581861676056 - 20 -0.519647689096146 - 11 -1.248581861676056 - 21 -0.4318905695302117 - 72 - 2 - 10 -1.204841316941958 - 20 --0.0620372588614032 - 40 -0.4958608019528185 - 50 -84.9392850010685 - 51 -90.63415610337293 - 73 - 1 - 72 - 2 - 10 -1.198149495755201 - 20 -0.2491083832840643 - 40 -0.1846887103819838 - 50 -89.62657779356016 - 51 -98.49286189291752 - 73 - 1 - 72 - 2 - 10 -1.186703181985212 - 20 -0.32427591283572 - 40 -0.1086552070090232 - 50 -98.37706810352306 - 51 -111.0116715202816 - 73 - 1 - 72 - 2 - 10 -1.173884337196004 - 20 -0.3604725103818166 - 40 -0.070276402608659 - 50 -111.8368548044861 - 51 -130.2463188715139 - 73 - 1 - 72 - 2 - 10 -1.191856507616234 - 20 -0.3396388865736808 - 40 -0.0977898738515406 - 50 -130.3972532514171 - 51 -145.1608900952568 - 73 - 1 - 72 - 1 - 10 -1.111594544468236 - 20 -0.39550369391721 - 11 -1.111594544468236 - 21 -0.1752767944487085 - 72 - 1 - 10 -1.111594544468236 - 20 -0.1752767944487085 - 11 -1.020746077777311 - 21 -0.1752767944487085 - 72 - 1 - 10 -1.020746077777311 - 20 -0.1752767944487085 - 11 -1.020746077777311 - 21 -0.1752767944487085 - 97 - 1 -330 -D8 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C2 -330 -1D -100 -AcDbEntity - 8 -TEXT-GRAY -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 2 - 92 - 1 - 93 - 30 - 72 - 2 - 10 -1.745775880860402 - 20 -0.3473056857538349 - 40 -0.4596595742917985 - 50 -179.219041199578 - 51 -188.5892672078823 - 73 - 0 - 72 - 2 - 10 -1.462665276168372 - 20 -0.3902293883547505 - 40 -0.1733136452000416 - 50 -188.5364777731353 - 51 -206.4130707393759 - 73 - 0 - 72 - 2 - 10 -1.382597433515457 - 20 -0.4290189590384098 - 40 -0.0843534860499277 - 50 -207.0087701028281 - 51 -238.085854021312 - 73 - 0 - 72 - 2 - 10 -1.408309618919584 - 20 -0.3846069642931946 - 40 -0.1356549785854117 - 50 -238.7839320009168 - 51 -258.9459185787553 - 73 - 0 - 72 - 2 - 10 -1.439724993974423 - 20 -0.2328843812063898 - 40 -0.29059126074079 - 50 -258.6024639297659 - 51 -270.7169453069864 - 73 - 0 - 72 - 2 - 10 -1.444920074652102 - 20 -0.2029818501508946 - 40 -0.3204748341784855 - 50 -269.7212762564572 - 51 -277.0779005236373 - 73 - 0 - 72 - 2 - 10 -1.460416453713881 - 20 -0.3252503357550985 - 40 -0.1972288945641309 - 50 -276.9871111277841 - 51 -287.1571071678799 - 73 - 0 - 72 - 2 - 10 -1.482143870267849 - 20 -0.3951169191449219 - 40 -0.1240620704779083 - 50 -287.0876504098538 - 51 -300.9508770078874 - 73 - 0 - 72 - 2 - 10 -1.500583736465673 - 20 -0.4262167749073336 - 40 -0.0879070752171196 - 50 -301.0685629566324 - 51 -318.5141019927507 - 73 - 0 - 72 - 2 - 10 -1.490538341293795 - 20 -0.4193627680062952 - 40 -0.0999841621843878 - 50 -319.38514811862 - 51 -335.2909851831375 - 73 - 0 - 72 - 2 - 10 -1.432430719209494 - 20 -0.3924029450769723 - 40 -0.1640411911207225 - 50 -335.220473520381 - 51 -346.6482421759119 - 73 - 0 - 72 - 2 - 10 -1.321167690210193 - 20 -0.3654957782609066 - 40 -0.2785109168173717 - 50 -346.5482508793782 - 51 -354.5741818072581 - 73 - 0 - 72 - 2 - 10 -1.140576365463508 - 20 -0.34757052037717 - 40 -0.459988693945271 - 50 -354.4784226911817 - 51 -360.2208980900735 - 73 - 0 - 72 - 2 - 10 -1.136142388530695 - 20 -0.3440375062016253 - 40 -0.4644225855321327 - 50 -359.7829203976418 - 51 -365.4556667991741 - 73 - 0 - 72 - 2 - 10 -1.324257241032597 - 20 -0.3255607991203732 - 40 -0.2754036673203588 - 50 -5.350003779949623 - 51 -13.38950403845408 - 73 - 0 - 72 - 2 - 10 -1.438822228558409 - 20 -0.2978741757969074 - 40 -0.1575418848528459 - 50 -13.24247481022855 - 51 -24.9143339913515 - 73 - 0 - 72 - 2 - 10 -1.49750166023149 - 20 -0.2704935387993822 - 40 -0.0927888674313809 - 50 -24.84449572776879 - 51 -41.46851456153187 - 73 - 0 - 72 - 2 - 10 -1.504747507691185 - 20 -0.2661434323058319 - 40 -0.0844927447051385 - 50 -42.51194694689715 - 51 -60.20982750498259 - 73 - 0 - 72 - 2 - 10 -1.484241834436404 - 20 -0.3022559330899828 - 40 -0.1260208208552944 - 50 -60.27608629427618 - 51 -73.82705129133484 - 73 - 0 - 72 - 2 - 10 -1.461143797848464 - 20 -0.3806703565348255 - 40 -0.2077659731176355 - 50 -73.73258141531123 - 51 -83.43685270361343 - 73 - 0 - 72 - 2 - 10 -1.444981387538941 - 20 -0.5159994031828512 - 40 -0.3440559769484268 - 50 -83.33882871764017 - 51 -90.26983081888446 - 73 - 0 - 72 - 2 - 10 -1.441836581268094 - 20 -0.4848621958152928 - 40 -0.3129186678351786 - 50 -89.72086066320244 - 51 -97.22714964633519 - 73 - 0 - 72 - 2 - 10 -1.426768810557204 - 20 -0.3683000729345016 - 40 -0.1953872384683834 - 50 -97.14382290172345 - 51 -107.4222425802834 - 73 - 0 - 72 - 2 - 10 -1.405753699036433 - 20 -0.3016738701941614 - 40 -0.1255254500273459 - 50 -107.3755052356472 - 51 -121.1859060075268 - 73 - 0 - 72 - 2 - 10 -1.388200250824436 - 20 -0.2723186857145772 - 40 -0.091323052757868 - 50 -121.3012045363258 - 51 -138.3807483919028 - 73 - 0 - 72 - 2 - 10 -1.396390386155313 - 20 -0.2780817143578742 - 40 -0.1012797862356359 - 50 -139.0208188923022 - 51 -154.2673000625914 - 73 - 0 - 72 - 2 - 10 -1.443564578953644 - 20 -0.3008357842563767 - 40 -0.153654894821596 - 50 -154.2614231301619 - 51 -165.8039007823683 - 73 - 0 - 72 - 2 - 10 -1.533704415876427 - 20 -0.3240227080426966 - 40 -0.2467287207424286 - 50 -165.7173228384291 - 51 -174.1318325417901 - 73 - 0 - 72 - 2 - 10 -1.679452490871063 - 20 -0.3395070071807061 - 40 -0.3932964759323175 - 50 -174.0587164483615 - 51 -180.2234129253398 - 73 - 0 - 72 - 1 - 10 -1.286159004867464 - 20 -0.3410405807579851 - 11 -1.286159004867464 - 21 -0.3410405807579851 - 97 - 1 -330 -14B - 92 - 16 - 93 - 21 - 72 - 2 - 10 -1.87884778741299 - 20 -0.3051697834906549 - 40 -0.5046900079850218 - 50 -165.4581922653545 - 51 -171.0243917073363 - 73 - 1 - 72 - 2 - 10 -1.640017569701684 - 20 -0.3421119050184488 - 40 -0.2630219456806235 - 50 -170.856419407449 - 51 -179.4561773269252 - 73 - 1 - 72 - 2 - 10 -1.719600323247084 - 20 -0.3382249259339413 - 40 -0.342652316488281 - 50 -178.9325511963493 - 51 -188.0659430044691 - 73 - 1 - 72 - 2 - 10 -1.461506204624639 - 20 -0.3030699205237911 - 40 -0.0821908055767169 - 50 -189.0465869719995 - 51 -201.4429641704123 - 73 - 1 - 72 - 2 - 10 -1.425949825821255 - 20 -0.2889700547677836 - 40 -0.0439411927350844 - 50 -201.2794750422889 - 51 -220.1176890207309 - 73 - 1 - 72 - 2 - 10 -1.421375505703486 - 20 -0.2843571418367111 - 40 -0.0374752217300239 - 50 -219.2307545260716 - 51 -255.6490576647813 - 73 - 1 - 72 - 2 - 10 -1.438807477461641 - 20 -0.3811952640733502 - 40 -0.1357987619432282 - 50 -258.6520849549118 - 51 -271.3697308658793 - 73 - 1 - 72 - 2 - 10 -1.445896027874007 - 20 -0.4691190853840432 - 40 -0.2237167796028082 - 50 -269.0158770897956 - 51 -276.276357003502 - 73 - 1 - 72 - 2 - 10 -1.463387403735492 - 20 -0.2947145002894463 - 40 -0.0484744436347309 - 50 -278.2625944015626 - 51 -301.2735466815289 - 73 - 1 - 72 - 2 - 10 -1.473353916121774 - 20 -0.2781237012056268 - 40 -0.0291206023535156 - 50 -301.4591386210279 - 51 -342.6827079184787 - 73 - 1 - 72 - 2 - 10 -1.374091031750538 - 20 -0.3127659022243659 - 40 -0.1342419911030445 - 50 -341.1780241039497 - 51 -353.2229122868627 - 73 - 1 - 72 - 2 - 10 -1.232912256678613 - 20 -0.3308726804904729 - 40 -0.2765741939881523 - 50 -352.9494162843384 - 51 -360.3822505868759 - 73 - 1 - 72 - 2 - 10 -0.7248612462910731 - 20 -0.3411691780724345 - 40 -0.7846645638024572 - 50 -359.3828759745637 - 51 -363.6573187603917 - 73 - 1 - 72 - 2 - 10 -1.358304373290006 - 20 -0.3811941386031548 - 40 -0.1499590652226746 - 50 -3.834298057692314 - 51 -15.98721166096502 - 73 - 1 - 72 - 2 - 10 -1.473936824340389 - 20 -0.4156549366241289 - 40 -0.0293355637618033 - 50 -13.48613242730697 - 51 -56.84075856181408 - 73 - 1 - 72 - 2 - 10 -1.460693878894012 - 20 -0.3942253340844751 - 40 -0.054522595367914 - 50 -57.50799133160251 - 51 -77.8514521481949 - 73 - 1 - 72 - 2 - 10 -1.449551855505779 - 20 -0.3442176219715277 - 40 -0.1057558456740848 - 50 -77.65179244717869 - 51 -90.71274674017063 - 73 - 1 - 72 - 2 - 10 -1.446520818841627 - 20 -0.1669086878434607 - 40 -0.2830617955533721 - 50 -89.65275773185921 - 51 -94.33247869604129 - 73 - 1 - 72 - 2 - 10 -1.430610265978255 - 20 -0.3644952794934767 - 40 -0.0848430589089613 - 50 -93.69860806412952 - 51 -104.1787730439532 - 73 - 1 - 72 - 2 - 10 -1.420228457430697 - 20 -0.4128805599428683 - 40 -0.0354338310931719 - 50 -107.0684876277999 - 51 -147.5547663680418 - 73 - 1 - 72 - 1 - 10 -1.390325682953593 - 20 -0.4318905695302117 - 11 -1.390325682953593 - 21 -0.4318905695302117 - 97 - 1 -330 -10A - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C5 -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 2 - 92 - 1 - 93 - 17 - 72 - 1 - 10 -1.658111534794044 - 20 -0.1752767944487085 - 11 -1.658111534794044 - 21 -0.6506897567371471 - 72 - 1 - 10 -1.658111534794044 - 20 -0.6506897567371471 - 11 -1.862892353206713 - 21 -0.6506897567371471 - 72 - 2 - 10 -1.866712771298765 - 20 -0.4812885811102773 - 40 -0.1694442501183315 - 50 -268.7080565864779 - 51 -289.696280270266 - 73 - 0 - 72 - 2 - 10 -1.890323704356795 - 20 -0.5498088066581733 - 40 -0.0969791362784035 - 50 -290.2068256429989 - 51 -320.7179581453081 - 73 - 0 - 72 - 2 - 10 -1.872231214265821 - 20 -0.5377375192902893 - 40 -0.1186450067238793 - 50 -321.7376468722154 - 51 -345.941318148983 - 73 - 0 - 72 - 2 - 10 -1.755413737650509 - 20 -0.5077074919349243 - 40 -0.239259448802611 - 50 -345.7608112632561 - 51 -360.8993727822122 - 73 - 0 - 72 - 2 - 10 -1.739929769421669 - 20 -0.4990316766439469 - 40 -0.2547614597035357 - 50 -358.8933548673149 - 51 -375.1421636632072 - 73 - 0 - 72 - 2 - 10 -1.805070643979139 - 20 -0.4843830829172414 - 40 -0.1880777885766737 - 50 -16.01826700445136 - 51 -24.59137858751017 - 73 - 0 - 72 - 2 - 10 -1.886457278838033 - 20 -0.4467408832612785 - 40 -0.098409106202089 - 50 -24.38210075542359 - 51 -37.59560803165674 - 73 - 0 - 72 - 2 - 10 -1.901447144532471 - 20 -0.4366823005906129 - 40 -0.0804040955571766 - 50 -38.43315571073376 - 51 -67.41262732859074 - 73 - 0 - 72 - 2 - 10 -1.877530541683213 - 20 -0.482621245957908 - 40 -0.1320800191028363 - 50 -65.48738102872184 - 51 -90.78391246376287 - 73 - 0 - 72 - 2 - 10 -1.89658449370416 - 20 -1.061679540017775 - 40 -0.711431865658397 - 50 -91.68029910103571 - 51 -97.60098612101147 - 73 - 0 - 72 - 2 - 10 -2.098301318614009 - 20 -2.918534187606983 - 40 -2.579056963876972 - 50 -96.58637858697409 - 51 -97.45141278012369 - 73 - 0 - 72 - 2 - 10 -1.776013741879782 - 20 -0.4823678310216308 - 40 -0.1217217342158525 - 50 -95.74213501202033 - 51 -102.7219939836472 - 73 - 0 - 72 - 1 - 10 -1.749208100737245 - 20 -0.3636343556094617 - 11 -1.749208100737245 - 21 -0.1752767944487085 - 72 - 1 - 10 -1.749208100737245 - 20 -0.1752767944487085 - 11 -1.658111534794044 - 21 -0.1752767944487085 - 72 - 1 - 10 -1.658111534794044 - 20 -0.1752767944487085 - 11 -1.658111534794044 - 21 -0.1752767944487085 - 97 - 1 -330 -138 - 92 - 16 - 93 - 12 - 72 - 1 - 10 -1.855753791898883 - 20 -0.5703040769182958 - 11 -1.749208100737245 - 21 -0.5703040769182958 - 72 - 1 - 10 -1.749208100737245 - 20 -0.5703040769182958 - 11 -1.749208100737245 - 21 -0.4311767133994287 - 72 - 1 - 10 -1.749208100737245 - 20 -0.4311767133994287 - 11 -1.855281946695168 - 21 -0.4311767133994287 - 72 - 2 - 10 -1.857310696196809 - 20 -0.4789795547126073 - 40 -0.0478458719447492 - 50 -267.5698291459668 - 51 -298.9736848744403 - 73 - 1 - 72 - 2 - 10 -1.864437662714773 - 20 -0.4638897212446849 - 40 -0.0312107960389064 - 50 -300.9469057674883 - 51 -325.1843100261158 - 73 - 1 - 72 - 2 - 10 -1.847208640489655 - 20 -0.4756552874383635 - 40 -0.0520734162270339 - 50 -325.3793523193102 - 51 -342.5869620344669 - 73 - 1 - 72 - 2 - 10 -1.761853469548879 - 20 -0.499095419473726 - 40 -0.1405675106851083 - 50 -343.8821453186945 - 51 -361.6888272002417 - 73 - 1 - 72 - 2 - 10 -1.771325527872711 - 20 -0.505069610767784 - 40 -0.1310471922643137 - 50 -359.1992235790916 - 51 -372.1177778779552 - 73 - 1 - 72 - 2 - 10 -1.840471280377904 - 20 -0.5202934512206887 - 40 -0.0602474495482526 - 50 -11.76645972748428 - 51 -33.49099599484823 - 73 - 1 - 72 - 2 - 10 -1.86002067419837 - 20 -0.5327033580204925 - 40 -0.0370985166555385 - 50 -34.16739135196509 - 51 -64.22988058382727 - 73 - 1 - 72 - 2 - 10 -1.856792087819456 - 20 -0.5236405260900577 - 40 -0.0466751007960158 - 50 -65.49764645855024 - 51 -91.27465994990668 - 73 - 1 - 72 - 1 - 10 -1.855753791898883 - 20 -0.5703040769182958 - 11 -1.855753791898883 - 21 -0.5703040769182958 - 97 - 1 -330 -4A - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C6 -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 17 - 72 - 1 - 10 -2.026516093204943 - 20 -0.5201225784624666 - 11 -2.12187448679461 - 21 -0.5201225784624666 - 72 - 1 - 10 -2.12187448679461 - 20 -0.5201225784624666 - 11 -2.181814048479542 - 21 -0.2784929327615455 - 72 - 2 - 10 -2.213922500215711 - 20 -0.2853658521330381 - 40 -0.0328357989636449 - 50 -192.0820235727047 - 51 -230.2482576268844 - 73 - 1 - 72 - 2 - 10 -2.211977736162895 - 20 -0.2865212844941371 - 40 -0.0325572563546005 - 50 -234.1829062182941 - 51 -272.5793312178134 - 73 - 1 - 72 - 2 - 10 -2.218185855487651 - 20 -0.2662392650291758 - 40 -0.0131289140189778 - 50 -248.8223744883709 - 51 -260.6854283382104 - 73 - 1 - 72 - 1 - 10 -2.216060877781497 - 20 -0.2532834611920508 - 11 -2.285026381589124 - 21 -0.5201225784624666 - 72 - 1 - 10 -2.285026381589124 - 20 -0.5201225784624666 - 11 -2.379912929975073 - 21 -0.5201225784624666 - 72 - 1 - 10 -2.379912929975073 - 20 -0.5201225784624666 - 11 -2.2602925604266 - 21 -0.0661149499446615 - 72 - 1 - 10 -2.2602925604266 - 20 -0.0661149499446615 - 11 -2.21297105273781 - 21 -0.0 - 72 - 1 - 10 -2.21297105273781 - 20 -0.0 - 11 -2.147795531372934 - 21 -0.0 - 72 - 1 - 10 -2.147795531372934 - 20 -0.0 - 11 -2.196547795485895 - 21 -0.1752767944487085 - 72 - 2 - 10 -2.195202176373045 - 20 -0.2879880150203464 - 40 -0.1127192527190687 - 50 -89.31599859402309 - 51 -107.9604459396842 - 73 - 0 - 72 - 2 - 10 -2.187860498124107 - 20 -0.2632664971382323 - 40 -0.0869408911919764 - 50 -108.3817089051841 - 51 -130.5609495896915 - 73 - 0 - 72 - 2 - 10 -2.198002807128255 - 20 -0.2736653212156158 - 40 -0.101440520082671 - 50 -131.0937856248721 - 51 -151.0996267706195 - 73 - 0 - 72 - 2 - 10 -2.251259362016389 - 20 -0.3028621870346081 - 40 -0.1621751716283119 - 50 -151.1623473832895 - 51 -165.7835266974244 - 73 - 0 - 72 - 1 - 10 -2.094050840588399 - 20 -0.2630342184309034 - 11 -2.026516093204943 - 21 -0.5201225784624666 - 72 - 1 - 10 -2.026516093204943 - 20 -0.5201225784624666 - 11 -2.026516093204943 - 21 -0.5201225784624666 - 97 - 1 -330 -89 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C7 -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 23 - 72 - 1 - 10 -2.401085080890193 - 20 -0.451391475175396 - 11 -2.401085080890193 - 21 -0.502049385078848 - 72 - 1 - 10 -2.401085080890193 - 20 -0.502049385078848 - 11 -2.456975906310984 - 21 -0.5208364345932495 - 72 - 1 - 10 -2.456975906310984 - 20 -0.5208364345932495 - 11 -2.471953186325706 - 21 -0.6169178168015124 - 72 - 1 - 10 -2.471953186325706 - 20 -0.6169178168015124 - 11 -2.547828939245814 - 21 -0.6169178168015124 - 72 - 1 - 10 -2.547828939245814 - 20 -0.6169178168015124 - 11 -2.547828939245814 - 21 -0.5208364345932495 - 72 - 1 - 10 -2.547828939245814 - 20 -0.5208364345932495 - 11 -2.625120227777072 - 21 -0.5208364345932495 - 72 - 1 - 10 -2.625120227777072 - 20 -0.5208364345932495 - 11 -2.625120227777072 - 21 -0.451391475175396 - 72 - 1 - 10 -2.625120227777072 - 20 -0.451391475175396 - 11 -2.547828939245814 - 21 -0.451391475175396 - 72 - 1 - 10 -2.547828939245814 - 20 -0.451391475175396 - 11 -2.547828939245814 - 21 -0.312977967787312 - 72 - 2 - 10 -2.756375078424425 - 20 -0.3106349819782397 - 40 -0.208559300317214 - 50 -179.3563172584847 - 51 -187.5204775666663 - 73 - 1 - 72 - 2 - 10 -2.610407599922477 - 20 -0.2901879066221412 - 40 -0.0611824171745163 - 50 -186.4276465021346 - 51 -204.9884326299174 - 73 - 1 - 72 - 2 - 10 -2.591486060141609 - 20 -0.2832478516776391 - 40 -0.0411355950463604 - 50 -207.3607300982318 - 51 -249.4822289731461 - 73 - 1 - 72 - 2 - 10 -2.925871745813213 - 20 -1.236527392855755 - 40 -1.05135264976578 - 50 -250.6239679589966 - 51 -252.369953071448 - 73 - 1 - 72 - 2 - 10 -2.632025513918952 - 20 -0.3027146749676596 - 40 -0.0724554546479011 - 50 -250.172060625216 - 51 -260.9268652271251 - 73 - 1 - 72 - 1 - 10 -2.620599646309214 - 20 -0.2311657933719365 - 11 -2.620599646309214 - 21 -0.1752767944487085 - 72 - 1 - 10 -2.620599646309214 - 20 -0.1752767944487085 - 11 -2.541405756150071 - 21 -0.1752767944487085 - 72 - 2 - 10 -2.539541691321775 - 20 -0.2586536504670411 - 40 -0.0833976909583584 - 50 -88.71924580725035 - 51 -114.8723068619946 - 73 - 0 - 72 - 2 - 10 -2.534259066943731 - 20 -0.2435901096002027 - 40 -0.0675271066805567 - 50 -116.1816665503854 - 51 -146.3117142175992 - 73 - 0 - 72 - 2 - 10 -2.571816472169667 - 20 -0.2671405893161746 - 40 -0.1118470865035182 - 50 -146.9451672649385 - 51 -168.4294027765594 - 73 - 0 - 72 - 2 - 10 -2.701886448180166 - 20 -0.2953352474010394 - 40 -0.2449337665542188 - 50 -168.070822892956 - 51 -180.7890266060776 - 73 - 0 - 72 - 1 - 10 -2.456975906310984 - 20 -0.2987081511619036 - 11 -2.456975906310984 - 21 -0.451391475175396 - 72 - 1 - 10 -2.456975906310984 - 20 -0.451391475175396 - 11 -2.401085080890193 - 21 -0.451391475175396 - 72 - 1 - 10 -2.401085080890193 - 20 -0.451391475175396 - 11 -2.401085080890193 - 21 -0.451391475175396 - 97 - 1 -330 -58 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C8 -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 22 - 72 - 1 - 10 -2.66863653221009 - 20 -0.1752767944487085 - 11 -2.66863653221009 - 21 -0.6839852852251591 - 72 - 1 - 10 -2.66863653221009 - 20 -0.683985285225159 - 11 -2.758774186932835 - 21 -0.683985285225159 - 72 - 1 - 10 -2.758774186932835 - 20 -0.683985285225159 - 11 -2.758774186932835 - 21 -0.4832608134831443 - 72 - 2 - 10 -2.970884692343786 - 20 -0.1949308647558484 - 40 -0.3579455626750722 - 50 -233.6598667174819 - 51 -241.6737203338166 - 73 - 0 - 72 - 2 - 10 -2.862953103918855 - 20 -0.398321949096261 - 40 -0.1277046941848677 - 50 -241.0008951743301 - 51 -256.9710241053807 - 73 - 0 - 72 - 2 - 10 -2.867314180648163 - 20 -0.3596725627348979 - 40 -0.1664021752218955 - 50 -258.5084157090225 - 51 -270.4610700343784 - 73 - 0 - 72 - 2 - 10 -2.871155730201377 - 20 -0.4023028257494028 - 40 -0.1237918213330042 - 50 -268.8416672957483 - 51 -290.1493812176847 - 73 - 0 - 72 - 2 - 10 -2.88549439287798 - 20 -0.4438925273392474 - 40 -0.0798129708700709 - 50 -290.7705399537808 - 51 -319.3693426350027 - 73 - 0 - 72 - 2 - 10 -2.86973875277353 - 20 -0.4329212526250472 - 40 -0.0989334609539707 - 50 -320.4891190671877 - 51 -345.2499775321184 - 73 - 0 - 72 - 2 - 10 -2.778017766714932 - 20 -0.4084074663129932 - 40 -0.1938734483480787 - 50 -345.1454837561613 - 51 -360.9319474711875 - 73 - 0 - 72 - 1 - 10 -2.971865569256112 - 20 -0.4052541467398021 - 11 -2.971865569256112 - 21 -0.1752767944487085 - 72 - 1 - 10 -2.971865569256112 - 20 -0.1752767944487085 - 11 -2.881012536321281 - 21 -0.1752767944487085 - 72 - 1 - 10 -2.881012536321281 - 20 -0.1752767944487085 - 11 -2.881012536321281 - 21 -0.4064428922369056 - 72 - 2 - 10 -2.802613036220481 - 20 -0.4076912084297279 - 40 -0.0784094376294883 - 50 -359.0877849241664 - 51 -374.2114110518409 - 73 - 1 - 72 - 2 - 10 -2.840775464266772 - 20 -0.4174522933113873 - 40 -0.0390186755568009 - 50 -14.07416101436572 - 51 -38.19979694511947 - 73 - 1 - 72 - 2 - 10 -2.848474408609313 - 20 -0.4228438207727886 - 40 -0.0296388733419943 - 50 -39.21298268016682 - 51 -68.21300572178883 - 73 - 1 - 72 - 2 - 10 -2.843635884024977 - 20 -0.4091395078042849 - 40 -0.0441641298463429 - 50 -68.98305490508943 - 51 -91.1922266305568 - 73 - 1 - 72 - 2 - 10 -2.839517556631515 - 20 -0.3257194842430624 - 40 -0.1276147049428117 - 50 -88.56339333889899 - 51 -108.8133720429226 - 73 - 1 - 72 - 2 - 10 -2.853071660183995 - 20 -0.3106172986056333 - 40 -0.146497457591775 - 50 -111.9279820567162 - 51 -129.7021521663467 - 73 - 1 - 72 - 1 - 10 -2.759489565144921 - 20 -0.4233288622047228 - 11 -2.759489565144921 - 21 -0.1752767944487085 - 72 - 1 - 10 -2.759489565144921 - 20 -0.1752767944487085 - 11 -2.66863653221009 - 21 -0.1752767944487085 - 72 - 1 - 10 -2.66863653221009 - 20 -0.1752767944487085 - 11 -2.66863653221009 - 21 -0.1752767944487085 - 97 - 1 -330 -9C - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1C9 -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 2 - 92 - 1 - 93 - 30 - 72 - 2 - 10 -3.480235470402663 - 20 -0.3472963994916086 - 40 -0.4596602087851077 - 50 -179.2201999001178 - 51 -188.5904259084221 - 73 - 0 - 72 - 2 - 10 -3.197121821548028 - 20 -0.3902535820648669 - 40 -0.1733062924357386 - 50 -188.5287545821982 - 51 -206.4053475484388 - 73 - 0 - 72 - 2 - 10 -3.11705169577316 - 20 -0.4290134848926255 - 40 -0.084357328189102 - 50 -207.0116131808711 - 51 -238.088697099355 - 73 - 0 - 72 - 2 - 10 -3.142763881177286 - 20 -0.3846155256577634 - 40 -0.1356468679361114 - 50 -238.7826076590414 - 51 -258.9445942368799 - 73 - 0 - 72 - 2 - 10 -3.174180017272777 - 20 -0.2328628655440478 - 40 -0.2906128032937941 - 50 -258.6028609455173 - 51 -270.7173423227377 - 73 - 0 - 72 - 2 - 10 -3.179378903153711 - 20 -0.2029581738044638 - 40 -0.3204985176522159 - 50 -269.7210247461867 - 51 -277.0776490133664 - 73 - 0 - 72 - 2 - 10 -3.19487528221549 - 20 -0.325267440923209 - 40 -0.1972121016147459 - 50 -276.9881545773719 - 51 -287.1581506174676 - 73 - 0 - 72 - 2 - 10 -3.216601176688156 - 20 -0.3951169191449229 - 40 -0.1240620704779073 - 50 -287.0876504098541 - 51 -300.9508770078876 - 73 - 0 - 72 - 2 - 10 -3.235041042885957 - 20 -0.4262167749073067 - 40 -0.0879070752171545 - 50 -301.0685629566362 - 51 -318.5141019927475 - 73 - 0 - 72 - 2 - 10 -3.22499564771415 - 20 -0.4193627680063226 - 40 -0.0999841621843335 - 50 -319.385148118614 - 51 -335.2909851831404 - 73 - 0 - 72 - 2 - 10 -3.166888025629801 - 20 -0.3924029450769745 - 40 -0.1640411911207218 - 50 -335.2204735203817 - 51 -346.6482421759127 - 73 - 0 - 72 - 2 - 10 -3.055624996630501 - 20 -0.3654957782609082 - 40 -0.2785109168173713 - 50 -346.5482508793785 - 51 -354.5741818072585 - 73 - 0 - 72 - 2 - 10 -2.875033671883636 - 20 -0.3475705203771616 - 40 -0.4599886939454501 - 50 -354.4784226911829 - 51 -360.2208980900725 - 73 - 0 - 72 - 2 - 10 -2.870607305357513 - 20 -0.3438838987998202 - 40 -0.4644155825717984 - 50 -359.7639661566379 - 51 -365.4367125581701 - 73 - 0 - 72 - 2 - 10 -3.058722157859415 - 20 -0.3256690965276672 - 40 -0.2754213630050057 - 50 -5.372287081245953 - 51 -13.41178733975041 - 73 - 0 - 72 - 2 - 10 -3.173279534978716 - 20 -0.2978741757969097 - 40 -0.1575418848528468 - 50 -13.24247481022931 - 51 -24.91433399135224 - 73 - 0 - 72 - 2 - 10 -3.231958966651797 - 20 -0.27049353879938 - 40 -0.0927888674313799 - 50 -24.84449572776762 - 51 -41.46851456153065 - 73 - 0 - 72 - 2 - 10 -3.239204814111471 - 20 -0.2661434323058576 - 40 -0.0844927447051714 - 50 -42.51194694690035 - 51 -60.20982750497873 - 73 - 0 - 72 - 2 - 10 -3.218699140856711 - 20 -0.3022559330899847 - 40 -0.1260208208552961 - 50 -60.27608629427653 - 51 -73.8270512913352 - 73 - 0 - 72 - 2 - 10 -3.195604909472027 - 20 -0.3806255307799783 - 40 -0.207721876247583 - 50 -73.73012549511914 - 51 -83.43439678342133 - 73 - 0 - 72 - 2 - 10 -3.179442499162505 - 20 -0.5160622385854792 - 40 -0.3441188295924385 - 50 -83.33941300651419 - 51 -90.27041510775888 - 73 - 0 - 72 - 2 - 10 -3.176297692891656 - 20 -0.4848041884129171 - 40 -0.3128606426025486 - 50 -89.72150576644664 - 51 -97.22779474957937 - 73 - 0 - 72 - 2 - 10 -3.161234488424673 - 20 -0.3682916110468403 - 40 -0.1953789369211231 - 50 -97.14435294680244 - 51 -107.4227726253624 - 73 - 0 - 72 - 2 - 10 -3.140217093781949 - 20 -0.301699006668967 - 40 -0.1255485308215694 - 50 -107.370753656409 - 51 -121.1811544282885 - 73 - 0 - 72 - 2 - 10 -3.12266212348865 - 20 -0.2723085493673603 - 40 -0.0913151827909786 - 50 -121.3053248468621 - 51 -138.3848687024391 - 73 - 0 - 72 - 2 - 10 -3.130851497778824 - 20 -0.2780987727770228 - 40 -0.1012892502687907 - 50 -139.0126872013657 - 51 -154.2591683716641 - 73 - 0 - 72 - 2 - 10 -3.178025690577206 - 20 -0.3008131945580285 - 40 -0.1536471429745666 - 50 -154.2693808990751 - 51 -165.8118585512815 - 73 - 0 - 72 - 2 - 10 -3.268168571662594 - 20 -0.3240123625755021 - 40 -0.2467269061818614 - 50 -165.7196946403268 - 51 -174.1342043436877 - 73 - 0 - 72 - 2 - 10 -3.413914363535721 - 20 -0.3395635385525735 - 40 -0.3932993037049538 - 50 -174.0504793005304 - 51 -180.2151757775018 - 73 - 0 - 72 - 1 - 10 -3.020617833369073 - 20 -0.3410405807579851 - 11 -3.020617833369073 - 21 -0.3410405807579851 - 97 - 1 -330 -EA - 92 - 16 - 93 - 21 - 72 - 2 - 10 -3.613312704239808 - 20 -0.3052010939876257 - 40 -0.5046836205998101 - 50 -165.4616764010741 - 51 -171.0278758430559 - 73 - 1 - 72 - 2 - 10 -3.374482486528501 - 20 -0.3420916614133984 - 40 -0.2630236606104225 - 50 -170.85201298578 - 51 -179.4517709052564 - 73 - 1 - 72 - 2 - 10 -3.454065240073902 - 20 -0.3382439821810626 - 40 -0.3426534838299237 - 50 -178.9357418182288 - 51 -188.0691336263486 - 73 - 1 - 72 - 2 - 10 -3.195968077288853 - 20 -0.3030278751539043 - 40 -0.0821796951545775 - 50 -189.0181381128171 - 51 -201.4145153112299 - 73 - 1 - 72 - 2 - 10 -3.160411698485469 - 20 -0.2889975802415061 - 40 -0.0439554436806379 - 50 -201.3107480863471 - 51 -220.1489620647889 - 73 - 1 - 72 - 2 - 10 -3.155835095245747 - 20 -0.2843363205812091 - 40 -0.037456749731058 - 50 -219.2127101386138 - 51 -255.6310132773234 - 73 - 1 - 72 - 2 - 10 -3.173261739719343 - 20 -0.3812089223380726 - 40 -0.1358124526943521 - 50 -258.6525891616267 - 51 -271.3702350725942 - 73 - 1 - 72 - 2 - 10 -3.180357139497569 - 20 -0.4692030529375931 - 40 -0.2238008263021876 - 50 -269.0148826539333 - 51 -276.2753625676396 - 73 - 1 - 72 - 2 - 10 -3.197849276399706 - 20 -0.2946920674583943 - 40 -0.0484529004947375 - 50 -278.2717501461559 - 51 -301.2827024261222 - 73 - 1 - 72 - 2 - 10 -3.207811222542081 - 20 -0.2781237012056277 - 40 -0.0291206023535162 - 50 -301.4591386210265 - 51 -342.6827079184772 - 73 - 1 - 72 - 2 - 10 -3.108548338170845 - 20 -0.3127659022243659 - 40 -0.1342419911030445 - 50 -341.1780241039497 - 51 -353.2229122868627 - 73 - 1 - 72 - 2 - 10 -2.967369563098919 - 20 -0.330872680490466 - 40 -0.2765741939881519 - 50 -352.9494162843399 - 51 -360.3822505868774 - 73 - 1 - 72 - 2 - 10 -2.459318552711379 - 20 -0.3411691780724464 - 40 -0.7846645638024574 - 50 -359.3828759745628 - 51 -363.6573187603909 - 73 - 1 - 72 - 2 - 10 -3.092761679710313 - 20 -0.3811941386031558 - 40 -0.1499590652226746 - 50 -3.834298057691928 - 51 -15.98721166096461 - 73 - 1 - 72 - 2 - 10 -3.208394130760695 - 20 -0.4156549366241278 - 40 -0.029335563761804 - 50 -13.48613242730889 - 51 -56.84075856181601 - 73 - 1 - 72 - 2 - 10 -3.195154229476923 - 20 -0.3942423008569769 - 40 -0.0545066495896497 - 50 -57.50110974384233 - 51 -77.84457056043473 - 73 - 1 - 72 - 2 - 10 -3.184009922966737 - 20 -0.344171085093621 - 40 -0.1058024453263516 - 50 -77.65436364628005 - 51 -90.71531793927198 - 73 - 1 - 72 - 2 - 10 -3.180978125261934 - 20 -0.1670204385423348 - 40 -0.2829500192598661 - 50 -89.65354521146901 - 51 -94.33326617565109 - 73 - 1 - 72 - 2 - 10 -3.165070616561166 - 20 -0.3644786832754941 - 40 -0.084859522413094 - 50 -93.69685967486203 - 51 -104.1770246546857 - 73 - 1 - 72 - 2 - 10 -3.15468956905426 - 20 -0.4128867508985087 - 40 -0.0354285831761041 - 50 -107.0749560136262 - 51 -147.5612347538681 - 73 - 1 - 72 - 1 - 10 -3.124789077699108 - 20 -0.4318905695302117 - 11 -3.124789077699108 - 21 -0.4318905695302117 - 97 - 1 -330 -121 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -HATCH - 5 -1CA -330 -1D -100 -AcDbEntity - 8 -TEXT-RED -100 -AcDbHatch - 10 -0.0 - 20 -0.0 - 30 -0.0 -210 -0.0 -220 -0.0 -230 -1.0 - 2 -SOLID - 70 - 1 - 71 - 1 - 91 - 1 - 92 - 1 - 93 - 22 - 72 - 2 - 10 -3.592005824568463 - 20 -0.4022623702532142 - 40 -0.1238324225952604 - 50 -268.8385251676425 - 51 -290.1462390895788 - 73 - 0 - 72 - 2 - 10 -3.606344487245067 - 20 -0.4439223854568978 - 40 -0.0797877541011788 - 50 -290.7832534290268 - 51 -319.3820561102488 - 73 - 0 - 72 - 2 - 10 -3.590581236734105 - 20 -0.4329212526250472 - 40 -0.0989334609539707 - 50 -320.4891190671877 - 51 -345.2499775321184 - 73 - 0 - 72 - 2 - 10 -3.498860250675552 - 20 -0.4084074663130021 - 40 -0.1938734483480326 - 50 -345.1454837561604 - 51 -360.9319474711903 - 73 - 0 - 72 - 1 - 10 -3.692708053216686 - 20 -0.4052541467398021 - 11 -3.692708053216686 - 21 -0.1752767944487085 - 72 - 1 - 10 -3.692708053216686 - 20 -0.1752767944487085 - 11 -3.601870241094878 - 21 -0.1752767944487085 - 72 - 1 - 10 -3.601870241094878 - 20 -0.1752767944487085 - 11 -3.601870241094878 - 21 -0.4064428922369056 - 72 - 2 - 10 -3.523463130587567 - 20 -0.4076338796510298 - 40 -0.0784161554089863 - 50 -359.1297561618085 - 51 -374.2533822894829 - 73 - 1 - 72 - 2 - 10 -3.561625558633858 - 20 -0.4174879054254667 - 40 -0.0390026472343202 - 50 -14.02613509500026 - 51 -38.15177102575402 - 73 - 1 - 72 - 2 - 10 -3.569324502976398 - 20 -0.4228143935386817 - 40 -0.029663379390137 - 50 -39.24772886833219 - 51 -68.2477519099542 - 73 - 1 - 72 - 2 - 10 -3.564485978392062 - 20 -0.4091782819430569 - 40 -0.0441252062777969 - 50 -68.97422263922098 - 51 -91.18339436468834 - 73 - 1 - 72 - 2 - 10 -3.560375261405112 - 20 -0.3257194842430623 - 40 -0.1276147049428117 - 50 -88.56339333889899 - 51 -108.8133720429226 - 73 - 1 - 72 - 2 - 10 -3.573921754551081 - 20 -0.3105686277924473 - 40 -0.1465397674015583 - 50 -111.9181151967782 - 51 -129.6922853064086 - 73 - 1 - 72 - 1 - 10 -3.480332049105495 - 20 -0.4233288622047228 - 11 -3.480332049105495 - 21 -0.1752767944487085 - 72 - 1 - 10 -3.480332049105495 - 20 -0.1752767944487085 - 11 -3.389479016170664 - 21 -0.1752767944487085 - 72 - 1 - 10 -3.389479016170664 - 20 -0.1752767944487085 - 11 -3.389479016170664 - 21 -0.5201225784624666 - 72 - 1 - 10 -3.389479016170664 - 20 -0.5201225784624666 - 11 -3.462264944047086 - 21 -0.5201225784624666 - 72 - 1 - 10 -3.462264944047086 - 20 -0.5201225784624666 - 11 -3.480332049105495 - 21 -0.4832608134831443 - 72 - 2 - 10 -3.692032830344103 - 20 -0.1968176418438357 - 40 -0.3561838168078713 - 50 -233.5331050519283 - 51 -241.6403323622616 - 73 - 0 - 72 - 2 - 10 -3.581912438010629 - 20 -0.4042431550954748 - 40 -0.1213560014894028 - 50 -240.8735520743203 - 51 -257.5360464861715 - 73 - 0 - 72 - 2 - 10 -3.587849834142919 - 20 -0.3698286725878678 - 40 -0.1562493464094038 - 50 -258.1337893490277 - 51 -270.603548530042 - 73 - 0 - 72 - 1 - 10 -3.589495720107105 - 20 -0.5260693501105883 - 11 -3.589495720107105 - 21 -0.5260693501105883 - 97 - 1 -330 -71 - 75 - 0 - 76 - 1 - 98 - 1 - 10 --0.0349603810164775 - 20 -0.1524455749140718 -1001 -ACAD -1010 -0.0 -1020 -0.0 -1030 -0.0 - 0 -ENDSEC - 0 -SECTION - 2 -OBJECTS - 0 -DICTIONARY - 5 -C -330 -0 -100 -AcDbDictionary -281 - 1 - 3 -ACAD_DETAILVIEWSTYLE -350 -1D4 - 3 -ACAD_GROUP -350 -D - 3 -ACAD_IMAGE_VARS -350 -1B2 - 3 -ACAD_LAYOUT -350 -1A - 3 -ACAD_MLINESTYLE -350 -17 - 3 -ACAD_PLOTSETTINGS -350 -19 - 3 -ACAD_PLOTSTYLENAME -350 -E - 3 -ACAD_SCALELIST -350 -16B - 3 -ACAD_SECTIONVIEWSTYLE -350 -1D5 - 3 -AcDbVariableDictionary -350 -1CF - 3 -APPDATA -350 -1B0 - 3 -DWGPROPS -350 -1D6 - 0 -DICTIONARY - 5 -1B3 -330 -2 -100 -AcDbDictionary -280 - 1 -281 - 1 - 3 -ACAD_LAYERSTATES -360 -1B4 - 3 -ACLYDICTIONARY -360 -1BB - 0 -DICTIONARY - 5 -1D4 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -DICTIONARY - 5 -D -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -RASTERVARIABLES - 5 -1B2 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbRasterVariables - 90 - 0 - 70 - 1 - 71 - 1 - 72 - 0 - 0 -DICTIONARY - 5 -1A -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -Model -350 -1E - 3 -Sheet 1 -350 -1C - 0 -DICTIONARY - 5 -17 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -Standard -350 -18 - 0 -DICTIONARY - 5 -19 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -ACDBDICTIONARYWDFLT - 5 -E -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -Normal -350 -F -100 -AcDbDictionaryWithDefault -340 -F - 0 -DICTIONARY - 5 -16B -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 3 -A0 -350 -16C - 3 -A1 -350 -16D - 3 -A2 -350 -16E - 3 -A3 -350 -16F - 3 -A4 -350 -170 - 3 -A5 -350 -171 - 3 -A6 -350 -172 - 3 -A7 -350 -173 - 3 -A8 -350 -174 - 3 -A9 -350 -175 - 3 -B0 -350 -176 - 3 -B1 -350 -177 - 3 -B2 -350 -178 - 3 -B3 -350 -179 - 3 -B4 -350 -17A - 3 -B5 -350 -17B - 3 -B6 -350 -17C - 3 -B7 -350 -17D - 3 -B8 -350 -17E - 3 -B9 -350 -17F - 3 -C0 -350 -180 - 3 -C1 -350 -181 - 3 -C2 -350 -182 - 3 -C3 -350 -183 - 3 -C4 -350 -184 - 3 -C5 -350 -185 - 3 -C6 -350 -186 - 3 -C7 -350 -187 - 3 -C8 -350 -188 - 3 -C9 -350 -189 - 3 -D0 -350 -18A - 3 -D1 -350 -18B - 3 -D2 -350 -18C - 0 -DICTIONARY - 5 -1D5 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -DICTIONARY - 5 -1CF -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -DICTIONARY - 5 -1B0 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbDictionary -281 - 1 - 0 -XRECORD - 5 -1D6 -102 -{ACAD_REACTORS -330 -C -102 -} -330 -C -100 -AcDbXrecord -280 - 1 - 1 -DWGPROPS COOKIE - 2 -vector-text - 3 - - 4 -Jonathan Greig - 6 -Generated outlines with CNCFontFab using the "Exo Bold" font. - 7 -MicroPython Text - 8 - - 9 - -300 -= -301 -= -302 -= -303 -= -304 -= -305 -= -306 -= -307 -= -308 -= -309 -= - 40 -0.0 - 41 -2456662.519745903 - 42 -2456662.532164352 - 1 - - 90 - 0 - 0 -DICTIONARY - 5 -1B4 -102 -{ACAD_REACTORS -330 -1B3 -102 -} -330 -1B3 -100 -AcDbDictionary -281 - 1 - 3 -ARGON_LAYERP_1 -350 -1B5 - 3 -ARGON_LAYERP_2 -350 -1B8 - 3 -ARGON_LAYERP_3 -350 -1C3 - 0 -DICTIONARY - 5 -1BB -102 -{ACAD_REACTORS -330 -1B3 -102 -} -330 -1B3 -100 -AcDbDictionary -281 - 1 -1001 -ACAD -1000 - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/main.c b/main.c index 62938acf11..bc37fa8711 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,7 @@ #include "extmod/vfs.h" #include "extmod/vfs_fat.h" +#include "genhdr/mpversion.h" #include "py/nlr.h" #include "py/compile.h" #include "py/frozenmod.h" @@ -99,19 +100,27 @@ void reset_mp(void) { } #define STRING_LIST(...) {__VA_ARGS__, ""} -bool maybe_run_list(const char ** filenames, pyexec_result_t* exec_result) { - +// Look for the first file that exists in the list of filenames, using mp_import_stat(). +// Return its index. If no file found, return -1. +const char* first_existing_file_in_list(const char ** filenames) { for (int i = 0; filenames[i] != (char*)""; i++) { mp_import_stat_t stat = mp_import_stat(filenames[i]); - if (stat != MP_IMPORT_STAT_FILE) { - continue; + if (stat == MP_IMPORT_STAT_FILE) { + return filenames[i]; } - serial_write(filenames[i]); - serial_write(MSG_OUTPUT_SUFFIX); - pyexec_file(filenames[i], exec_result); - return true; } - return false; + return NULL; +} + +bool maybe_run_list(const char ** filenames, pyexec_result_t* exec_result) { + const char* filename = first_existing_file_in_list(filenames); + if (filename == NULL) { + return false; + } + mp_hal_stdout_tx_str(filename); + mp_hal_stdout_tx_str(MSG_OUTPUT_SUFFIX); + pyexec_file(filename, exec_result); + return true; } bool start_mp(safe_mode_t safe_mode) { @@ -261,27 +270,67 @@ int __attribute__((used)) main(void) { // If not in safe mode, run boot before initing USB and capture output in a // file. if (filesystem_present() && safe_mode == NO_SAFE_MODE && MP_STATE_VM(vfs_mount_table) != NULL) { + static const char *boot_py_filenames[] = STRING_LIST("settings.txt", "settings.py", "boot.py", "boot.txt"); + new_status_color(BOOT_RUNNING); + #ifdef CIRCUITPY_BOOT_OUTPUT_FILE - // Since USB isn't up yet we can cheat and let ourselves write the boot - // output file. - filesystem_writable_by_python(true); FIL file_pointer; boot_output_file = &file_pointer; - f_open(&((fs_user_mount_t *) MP_STATE_VM(vfs_mount_table)->obj)->fatfs, - boot_output_file, CIRCUITPY_BOOT_OUTPUT_FILE, FA_WRITE | FA_CREATE_ALWAYS); - filesystem_writable_by_python(false); + + // Get the base filesystem. + FATFS *fs = &((fs_user_mount_t *) MP_STATE_VM(vfs_mount_table)->obj)->fatfs; + + bool have_boot_py = first_existing_file_in_list(boot_py_filenames) != NULL; + + bool skip_boot_output = false; + + // If there's no boot.py file that might write some changing output, + // read the existing copy of CIRCUITPY_BOOT_OUTPUT_FILE and see if its contents + // match the version info we would print anyway. If so, skip writing CIRCUITPY_BOOT_OUTPUT_FILE. + // This saves wear and tear on the flash and also prevents filesystem damage if power is lost + // during the write, which may happen due to bobbling the power connector or weak power. + + if (!have_boot_py && f_open(fs, boot_output_file, CIRCUITPY_BOOT_OUTPUT_FILE, FA_READ) == FR_OK) { + char file_contents[512]; + UINT chars_read = 0; + f_read(boot_output_file, file_contents, 512, &chars_read); + f_close(boot_output_file); + skip_boot_output = + // + 2 accounts for \r\n. + chars_read == strlen(MICROPY_FULL_VERSION_INFO) + 2 && + strncmp(file_contents, MICROPY_FULL_VERSION_INFO, strlen(MICROPY_FULL_VERSION_INFO)) == 0; + } + + if (!skip_boot_output) { + // Wait 1.5 seconds before opening CIRCUITPY_BOOT_OUTPUT_FILE for write, + // in case power is momentary or will fail shortly due to, say a low, battery. + mp_hal_delay_ms(1500); + + // USB isn't up, so we can write the file. + filesystem_writable_by_python(true); + f_open(fs, boot_output_file, CIRCUITPY_BOOT_OUTPUT_FILE, FA_WRITE | FA_CREATE_ALWAYS); + + // Switch the filesystem back to non-writable by Python now instead of later, + // since boot.py might change it back to writable. + filesystem_writable_by_python(false); + + // Write version info to boot_out.txt. + mp_hal_stdout_tx_str(MICROPY_FULL_VERSION_INFO); + mp_hal_stdout_tx_str("\r\n"); + } #endif // TODO(tannewt): Re-add support for flashing boot error output. - static const char *filenames[] = STRING_LIST("settings.txt", "settings.py", "boot.py", "boot.txt"); - bool found_boot = maybe_run_list(filenames, NULL); + bool found_boot = maybe_run_list(boot_py_filenames, NULL); (void) found_boot; #ifdef CIRCUITPY_BOOT_OUTPUT_FILE - f_close(boot_output_file); - filesystem_flush(); - boot_output_file = NULL; + if (!skip_boot_output) { + f_close(boot_output_file); + filesystem_flush(); + boot_output_file = NULL; + } #endif // Reset to remove any state that boot.py setup. It should only be used to diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 6b661cd849..e85a11b570 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -1,3 +1,7 @@ +# Set default python interpreters +PYTHON2 ?= $(which python2 || which python2.7) +PYTHON3 ?= python3 + # Select the board to build for: if not given on the command line, # then default to PYBV10. BOARD ?= metro_m0_express @@ -225,6 +229,7 @@ SRC_C = \ audio_dma.c \ background.c \ clocks.c \ + $(CHIP_FAMILY)_clocks.c \ events.c \ fatfs_port.c \ flash_api.c \ @@ -238,6 +243,8 @@ SRC_C = \ timers.c \ usb.c \ usb_mass_storage.c \ + bindings/samd/__init__.c \ + bindings/samd/Clock.c \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ lib/oofatfs/ff.c \ @@ -299,13 +306,13 @@ SRC_COMMON_HAL = \ usb_hid/Device.c \ audioio/__init__.c \ audioio/AudioOut.c \ -# audiobusio/PDMIn.c \ - touchio/__init__.c \ +# touchio/__init__.c \ touchio/TouchIn.c \ ifeq ($(INTERNAL_LIBM),1) SRC_LIBM = $(addprefix lib/,\ libm/math.c \ + libm/roundf.c \ libm/fmodf.c \ libm/nearbyintf.c \ libm/ef_sqrt.c \ @@ -363,16 +370,14 @@ SRC_SHARED_MODULE = \ uheap/__init__.c \ ustack/__init__.c -ifeq ($(CHIP_FAMILY),samd21) -SRC_COMMON_HAL += \ - audiobusio/__init__.c \ - audiobusio/I2SOut.c -endif +# The smallest SAMD51 packages don't have I2S. Everything else does. ifneq ($(CHIP_VARIANT),SAMD51G18A) ifneq ($(CHIP_VARIANT),SAMD51G19A) SRC_COMMON_HAL += \ audiobusio/__init__.c \ - audiobusio/I2SOut.c + audiobusio/I2SOut.c \ + audiobusio/PDMIn.c + SRC_C += i2s.c endif endif @@ -394,7 +399,7 @@ all: $(BUILD)/firmware.bin $(BUILD)/firmware.uf2 $(BUILD)/firmware.elf: $(OBJ) $(STEPECHO) "LINK $@" $(Q)$(CC) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(LIBS) -Wl,--end-group - $(Q)$(SIZE) $@ | python3 $(TOP)/tools/build_memory_info.py $(LD_FILE) + $(Q)$(SIZE) $@ | $(PYTHON3) $(TOP)/tools/build_memory_info.py $(LD_FILE) $(BUILD)/firmware.bin: $(BUILD)/firmware.elf $(ECHO) "Create $@" @@ -402,7 +407,7 @@ $(BUILD)/firmware.bin: $(BUILD)/firmware.elf $(BUILD)/firmware.uf2: $(BUILD)/firmware.bin $(ECHO) "Create $@" - python2 $(TOP)/tools/uf2/utils/uf2conv.py -b $(BOOTLOADER_SIZE) -c -o $@ $^ + $(PYTHON2) $(TOP)/tools/uf2/utils/uf2conv.py -b $(BOOTLOADER_SIZE) -c -o $@ $^ $(BUILD)/autogen_usb_descriptor.c $(BUILD)/genhdr/autogen_usb_descriptor.h: autogen_usb_descriptor.intermediate @@ -410,7 +415,7 @@ $(BUILD)/autogen_usb_descriptor.c $(BUILD)/genhdr/autogen_usb_descriptor.h: auto autogen_usb_descriptor.intermediate: tools/gen_usb_descriptor.py Makefile install -d $(BUILD)/genhdr - python3 tools/gen_usb_descriptor.py \ + $(PYTHON3) tools/gen_usb_descriptor.py \ --manufacturer $(USB_MANUFACTURER)\ --product $(USB_PRODUCT)\ --vid $(USB_VID)\ diff --git a/ports/atmel-samd/README.rst b/ports/atmel-samd/README.rst index d475e3816d..0c1026644d 100644 --- a/ports/atmel-samd/README.rst +++ b/ports/atmel-samd/README.rst @@ -231,3 +231,9 @@ Mass storage All boards will also show up as a mass storage device. Make sure to eject it before resetting or disconnecting the board. + +Port Specific modules +--------------------- + +.. toctree:: + bindings/samd/__init__ diff --git a/ports/atmel-samd/asf4_conf/samd21/hpl_sysctrl_config.h b/ports/atmel-samd/asf4_conf/samd21/hpl_sysctrl_config.h index 5b9ec6ed6c..74ec2bee95 100644 --- a/ports/atmel-samd/asf4_conf/samd21/hpl_sysctrl_config.h +++ b/ports/atmel-samd/asf4_conf/samd21/hpl_sysctrl_config.h @@ -109,7 +109,7 @@ // Indicates whether configuration for OSC32K is enabled or not // enable_osc32k #ifndef CONF_OSC32K_CONFIG -#define CONF_OSC32K_CONFIG 0 +#define CONF_OSC32K_CONFIG 1 #endif // 32kHz Internal Oscillator (OSC32K) Control @@ -117,7 +117,7 @@ // Indicates whether Internal 32K Oscillator is enabled or not // osc32k_arch_enable #ifndef CONF_OSC32K_ENABLE -#define CONF_OSC32K_ENABLE 0 +#define CONF_OSC32K_ENABLE 1 #endif // On Demand Control @@ -142,7 +142,7 @@ // Enable 32 Khz Output // osc32k_arch_en32k #ifndef CONF_OSC32K_EN32K -#define CONF_OSC32K_EN32K 0 +#define CONF_OSC32K_EN32K 1 #endif // Enable 1K diff --git a/ports/atmel-samd/asf4_conf/samd51/hpl_osc32kctrl_config.h b/ports/atmel-samd/asf4_conf/samd51/hpl_osc32kctrl_config.h index ccb2627480..d93cbf922e 100644 --- a/ports/atmel-samd/asf4_conf/samd51/hpl_osc32kctrl_config.h +++ b/ports/atmel-samd/asf4_conf/samd51/hpl_osc32kctrl_config.h @@ -17,7 +17,7 @@ // This defines the clock source for RTC // rtc_source_oscillator #ifndef CONF_RTCCTRL_SRC -#define CONF_RTCCTRL_SRC GCLK_GENCTRL_SRC_XOSC32K +#define CONF_RTCCTRL_SRC GCLK_GENCTRL_SRC_OSCULP32K #endif // Use 1 kHz output diff --git a/ports/atmel-samd/audio_dma.c b/ports/atmel-samd/audio_dma.c index 7030009d98..e8dbdc61d6 100644 --- a/ports/atmel-samd/audio_dma.c +++ b/ports/atmel-samd/audio_dma.c @@ -267,7 +267,6 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma, turn_on_event_system(); dma->event_channel = find_sync_event_channel(); init_event_channel_interrupt(dma->event_channel, CORE_GCLK, EVSYS_ID_GEN_DMAC_CH_0 + dma_channel); - find_sync_event_channel(); // We keep the audio_dma_t for internal use and the sample as a root pointer because it // contains the audiodma structure. @@ -275,11 +274,16 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma, MP_STATE_PORT(playing_audio)[dma->dma_channel] = dma->sample; } - dma->beat_size = 1; - dma->bytes_per_sample = 1; + if (audiosample_bits_per_sample(sample) == 16) { dma->beat_size = 2; dma->bytes_per_sample = 2; + } else { + dma->beat_size = 1; + dma->bytes_per_sample = 1; + if (single_channel) { + output_register_address += 1; + } } // Transfer both channels at once. if (!single_channel && audiosample_channel_count(sample) == 2) { @@ -319,6 +323,23 @@ void audio_dma_stop(audio_dma_t* dma) { dma->dma_channel = AUDIO_DMA_CHANNEL_COUNT; } +void audio_dma_pause(audio_dma_t* dma) { + dma_suspend_channel(dma->dma_channel); +} + +void audio_dma_resume(audio_dma_t* dma) { + dma_resume_channel(dma->dma_channel); +} + +bool audio_dma_get_paused(audio_dma_t* dma) { + if (dma->dma_channel >= AUDIO_DMA_CHANNEL_COUNT) { + return false; + } + uint32_t status = dma_transfer_status(dma->dma_channel); + + return (status & DMAC_CHINTFLAG_SUSP) != 0; +} + void audio_dma_init(audio_dma_t* dma) { dma->dma_channel = AUDIO_DMA_CHANNEL_COUNT; } @@ -337,11 +358,11 @@ bool audio_dma_get_playing(audio_dma_t* dma) { return false; } uint32_t status = dma_transfer_status(dma->dma_channel); - if ((status & DMAC_CHINTFLAG_TCMPL) != 0) { + if ((status & DMAC_CHINTFLAG_TCMPL) != 0 || (status & DMAC_CHINTFLAG_TERR) != 0) { audio_dma_stop(dma); } - return status == 0; + return (status & DMAC_CHINTFLAG_TERR) == 0; } // WARN(tannewt): DO NOT print from here. Printing calls background tasks such as this and causes a diff --git a/ports/atmel-samd/audio_dma.h b/ports/atmel-samd/audio_dma.h index deecd27f30..6734adb645 100644 --- a/ports/atmel-samd/audio_dma.h +++ b/ports/atmel-samd/audio_dma.h @@ -64,6 +64,8 @@ uint8_t audiosample_channel_count(mp_obj_t sample_obj); void audio_dma_init(audio_dma_t* dma); void audio_dma_reset(void); +uint8_t find_free_audio_dma_channel(void); + // This sets everything up but doesn't start the timer. // Sample is the python object for the sample to play. // loop is true if we should loop the sample. @@ -83,6 +85,9 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma, uint8_t dma_trigger_source); void audio_dma_stop(audio_dma_t* dma); bool audio_dma_get_playing(audio_dma_t* dma); +void audio_dma_pause(audio_dma_t* dma); +void audio_dma_resume(audio_dma_t* dma); +bool audio_dma_get_paused(audio_dma_t* dma); void audio_dma_background(void); diff --git a/ports/atmel-samd/bindings/samd/Clock.c b/ports/atmel-samd/bindings/samd/Clock.c new file mode 100644 index 0000000000..81e8fb1cec --- /dev/null +++ b/ports/atmel-samd/bindings/samd/Clock.c @@ -0,0 +1,174 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Noralf Trønnes + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "clocks.h" +#include "bindings/samd/Clock.h" + +#include "py/obj.h" +#include "py/objproperty.h" +#include "py/runtime.h" + +//| .. currentmodule:: samd +//| +//| :class:`Clock` --- Clock reference +//| ------------------------------------------ +//| +//| Identifies a clock on the microcontroller. +//| +//| .. class:: Clock +//| +//| Identifies a clock on the microcontroller. They are fixed by the +//| hardware so they cannot be constructed on demand. Instead, use +//| `samd.clock` to reference the desired clock. +//| + +STATIC void samd_clock_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { + samd_clock_obj_t *self = MP_OBJ_TO_PTR(self_in); + + mp_printf(print, "%q.%q.%s(", MP_QSTR_samd, MP_QSTR_clock, self->name); + if (clock_get_enabled(self->type, self->index)) { + mp_printf(print, "frequency=%u", clock_get_frequency(self->type, self->index)); + uint32_t calibration = clock_get_calibration(self->type, self->index); + if (calibration) { + mp_printf(print, ", calibration=%u", calibration); + } + } + mp_printf(print, ")"); +} + +//| .. attribute:: enabled +//| +//| Is the clock enabled? (read-only) +//| +STATIC mp_obj_t samd_clock_get_enabled(mp_obj_t self_in) { + samd_clock_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_bool(clock_get_enabled(self->type, self->index)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(samd_clock_get_enabled_obj, samd_clock_get_enabled); + +const mp_obj_property_t samd_clock_enabled_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&samd_clock_get_enabled_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj, + }, +}; + +//| .. attribute:: parent +//| +//| Clock parent. (read-only) +//| +STATIC mp_obj_t samd_clock_get_parent(mp_obj_t self_in) { + samd_clock_obj_t *self = MP_OBJ_TO_PTR(self_in); + uint8_t p_type, p_index; + if (!clock_get_parent(self->type, self->index, &p_type, &p_index)) + return mp_const_none; + + const mp_map_t* samd_map = &samd_clock_globals.map; + for (uint8_t i = 0; i < samd_map->alloc; i++) { + samd_clock_obj_t *iter = samd_map->table[i].value; + if (iter->type == p_type && iter->index == p_index) + return iter; + } + return mp_const_none; +} + +MP_DEFINE_CONST_FUN_OBJ_1(samd_clock_get_parent_obj, samd_clock_get_parent); + +const mp_obj_property_t samd_clock_parent_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&samd_clock_get_parent_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj, + }, +}; + +//| .. attribute:: frequency +//| +//| Clock frequency. (read-only) +//| +STATIC mp_obj_t samd_clock_get_frequency(mp_obj_t self_in) { + samd_clock_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_int_from_uint(clock_get_frequency(self->type, self->index)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(samd_clock_get_frequency_obj, samd_clock_get_frequency); + +const mp_obj_property_t samd_clock_frequency_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&samd_clock_get_frequency_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj, + }, +}; + +//| .. attribute:: calibration +//| +//| Clock calibration. Not all clocks can be calibrated. +//| +STATIC mp_obj_t samd_clock_get_calibration(mp_obj_t self_in) { + samd_clock_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_int_from_uint(clock_get_calibration(self->type, self->index)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(samd_clock_get_calibration_obj, samd_clock_get_calibration); + +STATIC mp_obj_t samd_clock_set_calibration(mp_obj_t self_in, mp_obj_t calibration) { + samd_clock_obj_t *self = MP_OBJ_TO_PTR(self_in); + int ret = clock_set_calibration(self->type, self->index, mp_obj_get_int(calibration)); + if (ret == -2) + mp_raise_AttributeError("calibration is read only"); + if (ret == -1) + mp_raise_ValueError("calibration is out of range"); + return mp_const_none; +} + +MP_DEFINE_CONST_FUN_OBJ_2(samd_clock_set_calibration_obj, samd_clock_set_calibration); + +const mp_obj_property_t samd_clock_calibration_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&samd_clock_get_calibration_obj, + (mp_obj_t)&samd_clock_set_calibration_obj, + (mp_obj_t)&mp_const_none_obj, + }, +}; + +STATIC const mp_rom_map_elem_t samd_clock_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_enabled), MP_ROM_PTR(&samd_clock_enabled_obj) }, + { MP_ROM_QSTR(MP_QSTR_parent), MP_ROM_PTR(&samd_clock_parent_obj) }, + { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&samd_clock_frequency_obj) }, + { MP_ROM_QSTR(MP_QSTR_calibration), MP_ROM_PTR(&samd_clock_calibration_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(samd_clock_locals_dict, samd_clock_locals_dict_table); + +const mp_obj_type_t samd_clock_type = { + { &mp_type_type }, + .name = MP_QSTR_Clock, + .print = samd_clock_print, + .locals_dict = (mp_obj_t)&samd_clock_locals_dict, +}; diff --git a/ports/atmel-samd/bindings/samd/Clock.h b/ports/atmel-samd/bindings/samd/Clock.h new file mode 100644 index 0000000000..0d13ae2533 --- /dev/null +++ b/ports/atmel-samd/bindings/samd/Clock.h @@ -0,0 +1,77 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Noralf Trønnes + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_ATMEL_SAMD_BINDINGS_SAMD_CLOCK_H +#define MICROPY_INCLUDED_ATMEL_SAMD_BINDINGS_SAMD_CLOCK_H + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + const char *name; + uint8_t type; + uint8_t index; +} samd_clock_obj_t; + +#define CLOCK(_name, _type, _index) \ +const samd_clock_obj_t clock_ ## _name = { \ + { &samd_clock_type }, \ + .name = #_name, \ + .type = _type, \ + .index = _index, \ +} + +#define CLOCK_SOURCE(_name) \ +const samd_clock_obj_t clock_ ## _name = { \ + { &samd_clock_type }, \ + .name = #_name, \ + .type = 0, \ + .index = GCLK_SOURCE_ ## _name, \ +} + +#define CLOCK_GCLK(_name) \ +const samd_clock_obj_t clock_ ## _name = { \ + { &samd_clock_type }, \ + .name = #_name, \ + .type = 1, \ + .index = _name ## _GCLK_ID, \ +} + +#define CLOCK_GCLK_(_name, _extra) \ +const samd_clock_obj_t clock_ ## _name ## _ ## _extra = { \ + { &samd_clock_type }, \ + .name = #_name "_" #_extra, \ + .type = 1, \ + .index = _name ## _GCLK_ID_ ## _extra, \ +} + +#define CLOCK_ENTRY(_name) { MP_ROM_QSTR(MP_QSTR_ ## _name), MP_ROM_PTR(&clock_ ## _name) } +#define CLOCK_ENTRY_(_name, _extra) { MP_ROM_QSTR(MP_QSTR_ ## _name ## _ ## _extra), MP_ROM_PTR(&clock_ ## _name ## _ ## _extra) } + +extern const mp_obj_type_t samd_clock_type; +extern const mp_obj_dict_t samd_clock_globals; + +#endif // MICROPY_INCLUDED_ATMEL_SAMD_BINDINGS_SAMD_CLOCK_H diff --git a/ports/atmel-samd/bindings/samd/__init__.c b/ports/atmel-samd/bindings/samd/__init__.c new file mode 100644 index 0000000000..55a10001d2 --- /dev/null +++ b/ports/atmel-samd/bindings/samd/__init__.c @@ -0,0 +1,72 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Noralf Trønnes + * Copyright (c) 2016 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/obj.h" +#include "py/runtime.h" + +#include "bindings/samd/Clock.h" + +//| :mod:`samd` --- SAMD implementation settings +//| ================================================= +//| +//| .. module:: samd +//| :synopsis: SAMD implementation settings +//| :platform: SAMD21 +//| +//| Libraries +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| Clock +//| + +//| :mod:`samd.clock` --- samd clock names +//| -------------------------------------------------------- +//| +//| .. module:: samd.clock +//| :synopsis: samd clock names +//| :platform: SAMD21 +//| +//| References to clocks as named by the microcontroller +//| +const mp_obj_module_t samd_clock_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&samd_clock_globals, +}; + +STATIC const mp_rom_map_elem_t samd_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_samd) }, + { MP_ROM_QSTR(MP_QSTR_clock), MP_ROM_PTR(&samd_clock_module) }, +}; + +STATIC MP_DEFINE_CONST_DICT(samd_module_globals, samd_module_globals_table); + +const mp_obj_module_t samd_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&samd_module_globals, +}; diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk index 43ff3521d2..4d6e32eb7b 100644 --- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk @@ -11,6 +11,8 @@ CHIP_FAMILY = samd21 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_CircuitPlayground +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HID FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LIS3DH FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Thermistor diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h index 56e9c8bb71..c85f553ba9 100644 --- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h @@ -46,3 +46,5 @@ GD25Q16C #include "external_flash/external_flash.h" + +#define BOARD_HAS_CRYSTAL 1 diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h index 63fbc8cb8b..95c542a43e 100644 --- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h @@ -7,10 +7,12 @@ #define MICROPY_HW_APA102_MOSI (&pin_PB03) #define MICROPY_HW_APA102_SCK (&pin_PB02) +#define CIRCUITPY_BITBANG_APA102 + // These are pins not to reset. -// QSPI Data pins and TX LED +// QSPI Data pins #define MICROPY_PORT_A (PORT_PA08 | PORT_PA09 | PORT_PA10 | PORT_PA11) -// RX LED, QSPI CS, QSPI SCK and NeoPixel pin +// DotStar pins, QSPI CS, and QSPI SCK #define MICROPY_PORT_B (PORT_PB02 | PORT_PB03 | PORT_PB10 | PORT_PB11) #define MICROPY_PORT_C (0) #define MICROPY_PORT_D (0) @@ -25,7 +27,7 @@ #include "external_flash/devices.h" -#define EXTERNAL_FLASH_DEVICE_COUNT 3 -#define EXTERNAL_FLASH_DEVICES S25FL116K, S25FL216K, GD25Q16C +#define EXTERNAL_FLASH_DEVICE_COUNT 1 +#define EXTERNAL_FLASH_DEVICES GD25Q16C #include "external_flash/external_flash.h" diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h index a433e99495..e635acd593 100644 --- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h @@ -47,3 +47,5 @@ GD25Q16C #include "external_flash/external_flash.h" + +#define BOARD_HAS_CRYSTAL 1 diff --git a/ports/atmel-samd/clocks.c b/ports/atmel-samd/clocks.c index be2fe0836b..a890210bf4 100644 --- a/ports/atmel-samd/clocks.c +++ b/ports/atmel-samd/clocks.c @@ -56,77 +56,6 @@ uint8_t find_free_gclk(uint16_t divisor) { return 0xff; } -bool gclk_enabled(uint8_t gclk) { - #ifdef SAMD51 - return GCLK->GENCTRL[gclk].bit.GENEN; - #endif - #ifdef SAMD21 - common_hal_mcu_disable_interrupts(); - // Explicitly do a byte write so the peripheral knows we're just wanting to read the channel - // rather than write to it. - *((uint8_t*) &GCLK->GENCTRL.reg) = gclk; - while (GCLK->STATUS.bit.SYNCBUSY == 1) {} - bool enabled = GCLK->GENCTRL.bit.GENEN; - common_hal_mcu_enable_interrupts(); - return enabled; - #endif -} - -void disable_gclk(uint8_t gclk) { - #ifdef SAMD51 - while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} - GCLK->GENCTRL[gclk].bit.GENEN = false; - while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} - #endif - #ifdef SAMD21 - while (GCLK->STATUS.bit.SYNCBUSY == 1) {} - GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(gclk); - while (GCLK->STATUS.bit.SYNCBUSY == 1) {} - #endif -} - -void connect_gclk_to_peripheral(uint8_t gclk, uint8_t peripheral) { - #ifdef SAMD21 - GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(peripheral) | GCLK_CLKCTRL_GEN(gclk) | GCLK_CLKCTRL_CLKEN; - #endif - #ifdef SAMD51 - GCLK->PCHCTRL[peripheral].reg = GCLK_PCHCTRL_CHEN | GCLK_PCHCTRL_GEN(gclk); - while(GCLK->SYNCBUSY.reg != 0) {} - #endif -} - -void disconnect_gclk_from_peripheral(uint8_t gclk, uint8_t peripheral) { - #ifdef SAMD21 - GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(peripheral) | GCLK_CLKCTRL_GEN(gclk); - #endif - #ifdef SAMD51 - GCLK->PCHCTRL[peripheral].reg = 0; - #endif -} - -void enable_clock_generator(uint8_t gclk, uint8_t source, uint16_t divisor) { - #ifdef SAMD21 - GCLK->GENDIV.reg = GCLK_GENDIV_ID(gclk) | GCLK_GENDIV_DIV(divisor); - GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(gclk) | GCLK_GENCTRL_SRC(source) | GCLK_GENCTRL_GENEN; - while (GCLK->STATUS.bit.SYNCBUSY != 0) {} - #endif - #ifdef SAMD51 - GCLK->GENCTRL[gclk].reg = GCLK_GENCTRL_SRC(source) | GCLK_GENCTRL_DIV(divisor) | GCLK_GENCTRL_GENEN; - while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} - #endif -} - -void disable_clock_generator(uint8_t gclk) { - #ifdef SAMD21 - GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(gclk); - while (GCLK->STATUS.bit.SYNCBUSY != 0) {} - #endif - #ifdef SAMD51 - GCLK->GENCTRL[gclk].reg = 0; - while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} - #endif -} - void reset_gclks(void) { // Never reset GCLK0 because its used for the core #if CONF_GCLK_GEN_1_GENEN == 0 diff --git a/ports/atmel-samd/clocks.h b/ports/atmel-samd/clocks.h index 99787d4ac2..6b7cfedce0 100644 --- a/ports/atmel-samd/clocks.h +++ b/ports/atmel-samd/clocks.h @@ -31,6 +31,7 @@ #include #include "include/sam.h" +#include "mpconfigboard.h" // for BOARD_HAS_CRYSTAL #ifdef SAMD51 #define CLOCK_48MHZ GCLK_GENCTRL_SRC_DFLL_Val @@ -44,12 +45,29 @@ uint8_t find_free_gclk(uint16_t divisor); bool gclk_enabled(uint8_t gclk); +void disable_gclk(uint8_t gclk); void reset_gclks(void); void connect_gclk_to_peripheral(uint8_t gclk, uint8_t peripheral); void disconnect_gclk_from_peripheral(uint8_t gclk, uint8_t peripheral); -void enable_clock_generator(uint8_t gclk, uint8_t source, uint16_t divisor); +void enable_clock_generator(uint8_t gclk, uint32_t source, uint16_t divisor); void disable_clock_generator(uint8_t gclk); +static inline bool board_has_crystal(void) { +#ifdef BOARD_HAS_CRYSTAL + return BOARD_HAS_CRYSTAL == 1; +#else + return false; +#endif +} + +void clock_init(void); + +bool clock_get_enabled(uint8_t type, uint8_t index); +bool clock_get_parent(uint8_t type, uint8_t index, uint8_t *p_type, uint8_t *p_index); +uint32_t clock_get_frequency(uint8_t type, uint8_t index); +uint32_t clock_get_calibration(uint8_t type, uint8_t index); +int clock_set_calibration(uint8_t type, uint8_t index, uint32_t val); + #endif // MICROPY_INCLUDED_ATMEL_SAMD_CLOCKS_H diff --git a/ports/atmel-samd/common-hal/analogio/AnalogIn.c b/ports/atmel-samd/common-hal/analogio/AnalogIn.c index 84e0ccde34..02613ae078 100644 --- a/ports/atmel-samd/common-hal/analogio/AnalogIn.c +++ b/ports/atmel-samd/common-hal/analogio/AnalogIn.c @@ -34,6 +34,7 @@ #include "py/binary.h" #include "py/mphal.h" +#include "peripherals.h" #include "shared-bindings/analogio/AnalogIn.h" #include "atmel_start_pins.h" @@ -89,57 +90,20 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { // Something else might have used the ADC in a different way, // so we completely re-initialize it. - // Turn the clocks on. - #ifdef SAMD51 - if (self->instance == ADC0) { - hri_mclk_set_APBDMASK_ADC0_bit(MCLK); - hri_gclk_write_PCHCTRL_reg(GCLK, ADC0_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | (1 << GCLK_PCHCTRL_CHEN_Pos)); - } else if (self->instance == ADC1) { - hri_mclk_set_APBDMASK_ADC1_bit(MCLK); - hri_gclk_write_PCHCTRL_reg(GCLK, ADC1_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | (1 << GCLK_PCHCTRL_CHEN_Pos)); - } - #endif - - #ifdef SAMD21 - _pm_enable_bus_clock(PM_BUS_APBC, ADC); - _gclk_enable_channel(ADC_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK0_Val); - #endif - struct adc_sync_descriptor adc; - adc_sync_init(&adc, self->instance, (void *)NULL); - adc_sync_set_reference(&adc, ADC_REFCTRL_REFSEL_INTVCC1_Val); - adc_sync_set_resolution(&adc, ADC_CTRLB_RESSEL_12BIT_Val); + samd_peripherals_adc_setup(&adc, self->instance); + + // Full scale is 3.3V (VDDANA) = 65535. + + // On SAMD21, INTVCC1 is 0.5*VDDANA. On SAMD51, INTVCC1 is 1*VDDANA. + // So on SAMD21 only, divide the input by 2, so full scale will match 0.5*VDDANA. + adc_sync_set_reference(&adc, ADC_REFCTRL_REFSEL_INTVCC1_Val); #ifdef SAMD21 adc_sync_set_channel_gain(&adc, self->channel, ADC_INPUTCTRL_GAIN_DIV2_Val); - - // Load the factory calibration - hri_adc_write_CALIB_BIAS_CAL_bf(ADC, (*((uint32_t*) ADC_FUSES_BIASCAL_ADDR) & ADC_FUSES_BIASCAL_Msk) >> ADC_FUSES_BIASCAL_Pos); - // Bits 7:5 - uint16_t linearity = ((*((uint32_t*) ADC_FUSES_LINEARITY_1_ADDR) & ADC_FUSES_LINEARITY_1_Msk) >> ADC_FUSES_LINEARITY_1_Pos) << 5; - // Bits 4:0 - linearity |= (*((uint32_t*) ADC_FUSES_LINEARITY_0_ADDR) & ADC_FUSES_LINEARITY_0_Msk) >> ADC_FUSES_LINEARITY_0_Pos; - hri_adc_write_CALIB_LINEARITY_CAL_bf(ADC, linearity); #endif - // SAMD51 has a CALIB register but doesn't have documented fuses for them. - #ifdef SAMD51 - uint8_t biasrefbuf; - uint8_t biasr2r; - uint8_t biascomp; - if (self->instance == ADC0) { - biasrefbuf = ((*(uint32_t*) ADC0_FUSES_BIASREFBUF_ADDR) & ADC0_FUSES_BIASREFBUF_Msk) >> ADC0_FUSES_BIASREFBUF_Pos; - biasr2r = ((*(uint32_t*) ADC0_FUSES_BIASR2R_ADDR) & ADC0_FUSES_BIASR2R_Msk) >> ADC0_FUSES_BIASR2R_Pos; - biascomp = ((*(uint32_t*) ADC0_FUSES_BIASCOMP_ADDR) & ADC0_FUSES_BIASCOMP_Msk) >> ADC0_FUSES_BIASCOMP_Pos; - } else { - biasrefbuf = ((*(uint32_t*) ADC1_FUSES_BIASREFBUF_ADDR) & ADC1_FUSES_BIASREFBUF_Msk) >> ADC1_FUSES_BIASREFBUF_Pos; - biasr2r = ((*(uint32_t*) ADC1_FUSES_BIASR2R_ADDR) & ADC1_FUSES_BIASR2R_Msk) >> ADC1_FUSES_BIASR2R_Pos; - biascomp = ((*(uint32_t*) ADC1_FUSES_BIASCOMP_ADDR) & ADC1_FUSES_BIASCOMP_Msk) >> ADC1_FUSES_BIASCOMP_Pos; - } - hri_adc_write_CALIB_BIASREFBUF_bf(self->instance, biasrefbuf); - hri_adc_write_CALIB_BIASR2R_bf(self->instance, biasr2r); - hri_adc_write_CALIB_BIASCOMP_bf(self->instance, biascomp); - #endif + adc_sync_set_resolution(&adc, ADC_CTRLB_RESSEL_12BIT_Val); adc_sync_enable_channel(&adc, self->channel); diff --git a/ports/atmel-samd/common-hal/audiobusio/I2SOut.c b/ports/atmel-samd/common-hal/audiobusio/I2SOut.c index ec21636d00..f4a8eb52e8 100644 --- a/ports/atmel-samd/common-hal/audiobusio/I2SOut.c +++ b/ports/atmel-samd/common-hal/audiobusio/I2SOut.c @@ -48,7 +48,8 @@ #include "audio_dma.h" #include "clocks.h" #include "events.h" -#include "samd21_pins.h" +#include "i2s.h" +#include "pins.h" #include "shared_dma.h" #include "timers.h" @@ -155,18 +156,7 @@ void common_hal_audiobusio_i2sout_construct(audiobusio_i2sout_obj_t* self, self->clock_unit = ws_clock_unit; self->serializer = serializer; - // Make sure the I2S peripheral is running so we can see if the resources we need are free. - #ifdef SAMD51 - hri_mclk_set_APBDMASK_I2S_bit(MCLK); - - // Connect the clock units to the 2mhz clock by default. They can't reset without it. - connect_gclk_to_peripheral(5, I2S_GCLK_ID_0); - connect_gclk_to_peripheral(5, I2S_GCLK_ID_1); - #endif - - #ifdef SAMD21 - _pm_enable_bus_clock(PM_BUS_APBC, I2S); - #endif + turn_on_i2s(); if (I2S->CTRLA.bit.ENABLE == 0) { I2S->CTRLA.bit.SWRST = 1; @@ -281,8 +271,7 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t* self, } // Configure the I2S peripheral - I2S->CTRLA.bit.ENABLE = 0; - while (I2S->SYNCBUSY.bit.ENABLE == 1) {} + i2s_set_enable(false); I2S->CLKCTRL[self->clock_unit].reg = clkctrl; #ifdef SAMD21 @@ -296,8 +285,7 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t* self, enable_clock_generator(self->gclk, CLOCK_48MHZ, divisor); connect_gclk_to_peripheral(self->gclk, I2S_GCLK_ID_0 + self->clock_unit); - I2S->CTRLA.bit.ENABLE = 1; - while (I2S->SYNCBUSY.bit.ENABLE == 1) {} + i2s_set_enable(true); #ifdef SAMD21 uint32_t tx_register = (uint32_t) &I2S->DATA[self->serializer].reg; @@ -336,6 +324,26 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t* self, self->playing = true; } +void common_hal_audiobusio_i2sout_pause(audiobusio_i2sout_obj_t* self) { + audio_dma_pause(&self->dma); +} + +void common_hal_audiobusio_i2sout_resume(audiobusio_i2sout_obj_t* self) { + // Clear any overrun/underrun errors + #ifdef SAMD21 + I2S->INTFLAG.reg = I2S_INTFLAG_TXUR0 << self->serializer; + #endif + #ifdef SAMD51 + I2S->INTFLAG.reg = I2S_INTFLAG_TXUR0 | I2S_INTFLAG_TXUR1; + #endif + + audio_dma_resume(&self->dma); +} + +bool common_hal_audiobusio_i2sout_get_paused(audiobusio_i2sout_obj_t* self) { + return audio_dma_get_paused(&self->dma); +} + void common_hal_audiobusio_i2sout_stop(audiobusio_i2sout_obj_t* self) { audio_dma_stop(&self->dma); diff --git a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c index e0ac3f9a3e..44129eed12 100644 --- a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c +++ b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c @@ -37,8 +37,15 @@ #include "shared-bindings/audiobusio/PDMIn.h" #include "shared-bindings/microcontroller/Pin.h" -#include "samd21_pins.h" +#include "atmel_start_pins.h" +#include "hal/include/hal_gpio.h" +#include "hal/utils/include/utils.h" +#include "audio_dma.h" +#include "clocks.h" +#include "events.h" +#include "i2s.h" +#include "pins.h" #include "shared_dma.h" #include "tick.h" @@ -48,6 +55,14 @@ // MEMS microphones must be clocked at at least 1MHz. #define MIN_MIC_CLOCK 1000000 +#ifdef SAMD21 +#define SERCTRL(name) I2S_SERCTRL_ ## name +#endif + +#ifdef SAMD51 +#define SERCTRL(name) I2S_RXCTRL_ ## name +#endif + void pdmin_reset(void) { while (I2S->SYNCBUSY.reg & I2S_SYNCBUSY_ENABLE) {} I2S->INTENCLR.reg = I2S_INTENCLR_MASK; @@ -60,20 +75,33 @@ void pdmin_reset(void) { void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t* self, const mcu_pin_obj_t* clock_pin, const mcu_pin_obj_t* data_pin, - uint32_t frequency, + uint32_t sample_rate, uint8_t bit_depth, bool mono, uint8_t oversample) { self->clock_pin = clock_pin; // PA10, PA20 -> SCK0, PB11 -> SCK1 - if (clock_pin == &pin_PA10 - #ifdef PIN_PA20 - || clock_pin == &pin_PA20 + #ifdef SAMD21 + if (clock_pin == &pin_PA10 + #ifdef PIN_PA20 + || clock_pin == &pin_PA20 + #endif + ) { + self->clock_unit = 0; + #ifdef PIN_PB11 + } else if (clock_pin == &pin_PB11) { + self->clock_unit = 1; + #endif #endif + #ifdef SAMD51 + if (clock_pin == &pin_PA10 || clock_pin == &pin_PB16) { + self->clock_unit = 0; + } else if (clock_pin == &pin_PB12 + #ifdef PIN_PB28 + || data_pin == &pin_PB28) { + #else ) { - self->clock_unit = 0; - #ifdef PIN_PB11 - } else if (clock_pin == &pin_PB11) { - self->clock_unit = 1; + #endif + self->clock_unit = 1; #endif } else { mp_raise_ValueError("Invalid clock pin"); @@ -81,80 +109,108 @@ void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t* self, self->data_pin = data_pin; // PA07, PA19 -> SD0, PA08, PB16 -> SD1 + #ifdef SAMD21 if (data_pin == &pin_PA07 || data_pin == &pin_PA19) { self->serializer = 0; } else if (data_pin == &pin_PA08 - #ifdef PB16 + #ifdef PIN_PB16 || data_pin == &pin_PB16) { #else ) { #endif self->serializer = 1; + #endif + #ifdef SAMD51 + if (data_pin == &pin_PB10 || data_pin == &pin_PA22) { + self->serializer = 1; + #endif } else { mp_raise_ValueError("Invalid data pin"); } - claim_pin(clock_pin); - claim_pin(data_pin); - - if (MP_STATE_VM(audiodma_block_counter) == NULL && - !allocate_block_counter()) { - mp_raise_RuntimeError("Unable to allocate audio DMA block counter."); - } - if (!(bit_depth == 16 || bit_depth == 8) || !mono || oversample != OVERSAMPLING) { mp_raise_NotImplementedError("Only 8 or 16 bit mono with " MP_STRINGIFY(OVERSAMPLING) "x oversampling is supported."); } - // TODO(tannewt): Use the DPLL to get a more precise sampling rate. - // DFLL -> GCLK (/600 for 8khz, /300 for 16khz and /150 for 32khz) -> DPLL (*(63 + 1)) -> GCLK ( / 10) -> 512khz + turn_on_i2s(); - i2s_init(&self->i2s_instance, I2S); - struct i2s_clock_unit_config config_clock_unit; - i2s_clock_unit_get_config_defaults(&config_clock_unit); - config_clock_unit.clock.gclk_src = GCLK_GENERATOR_3; - - config_clock_unit.clock.mck_src = I2S_MASTER_CLOCK_SOURCE_GCLK; - config_clock_unit.clock.mck_out_enable = false; - - config_clock_unit.clock.sck_src = I2S_SERIAL_CLOCK_SOURCE_MCKDIV; - uint32_t clock_divisor = (uint32_t) roundf( 8000000.0f / frequency / oversample); - config_clock_unit.clock.sck_div = clock_divisor; - float mic_clock_freq = 8000000.0f / clock_divisor; - self->frequency = mic_clock_freq / oversample; - if (mic_clock_freq < MIN_MIC_CLOCK || clock_divisor == 0 || clock_divisor > 255) { - mp_raise_ValueError("sampling frequency out of range"); + if (I2S->CTRLA.bit.ENABLE == 0) { + I2S->CTRLA.bit.SWRST = 1; + while (I2S->CTRLA.bit.SWRST == 1) {} + } else { + #ifdef SAMD21 + if ((I2S->CTRLA.vec.SEREN & (1 << self->serializer)) != 0) { + mp_raise_RuntimeError("Serializer in use"); + } + #endif + #ifdef SAMD51 + if (I2S->CTRLA.bit.RXEN == 1) { + mp_raise_RuntimeError("Serializer in use"); + } + #endif } + #ifdef SAMD51 + #define GPIO_I2S_FUNCTION GPIO_PIN_FUNCTION_J + #endif + #ifdef SAMD21 + #define GPIO_I2S_FUNCTION GPIO_PIN_FUNCTION_G + #endif + assert_pin_free(clock_pin); + assert_pin_free(data_pin); - config_clock_unit.frame.number_slots = 2; - config_clock_unit.frame.slot_size = I2S_SLOT_SIZE_16_BIT; - config_clock_unit.frame.data_delay = I2S_DATA_DELAY_0; + uint32_t clock_divisor = (uint32_t) roundf( 48000000.0f / sample_rate / oversample); + float mic_clock_freq = 48000000.0f / clock_divisor; + self->sample_rate = mic_clock_freq / oversample; + if (mic_clock_freq < MIN_MIC_CLOCK || clock_divisor == 0) { + mp_raise_ValueError("sampling rate out of range"); + } + // Find a free GCLK to generate the MCLK signal. + uint8_t gclk = find_free_gclk(clock_divisor); + if (gclk > GCLK_GEN_NUM) { + mp_raise_RuntimeError("Unable to find free GCLK"); + } + self->gclk = gclk; - config_clock_unit.frame.frame_sync.width = I2S_FRAME_SYNC_WIDTH_SLOT; + enable_clock_generator(self->gclk, CLOCK_48MHZ, clock_divisor); + connect_gclk_to_peripheral(self->gclk, I2S_GCLK_ID_0 + self->clock_unit); - config_clock_unit.mck_pin.enable = false; - config_clock_unit.sck_pin.enable = true; - config_clock_unit.sck_pin.gpio = self->clock_pin->pin; - // Mux is always the same. - config_clock_unit.sck_pin.mux = 6L; - config_clock_unit.fs_pin.enable = false; - i2s_clock_unit_set_config(&self->i2s_instance, self->clock_unit, &config_clock_unit); + // Clock unit configuration - struct i2s_serializer_config config_serializer; - i2s_serializer_get_config_defaults(&config_serializer); - config_serializer.clock_unit = self->clock_unit; - config_serializer.mode = I2S_SERIALIZER_PDM2; - config_serializer.data_size = I2S_DATA_SIZE_32BIT; - config_serializer.data_pin.gpio = self->data_pin->pin; - // Mux is always the same. - config_serializer.data_pin.mux = 6L; - config_serializer.data_pin.enable = true; - i2s_serializer_set_config(&self->i2s_instance, self->serializer, &config_serializer); - i2s_enable(&self->i2s_instance); + uint32_t clkctrl = I2S_CLKCTRL_MCKSEL_GCLK | + I2S_CLKCTRL_NBSLOTS(2) | + I2S_CLKCTRL_FSWIDTH_SLOT | + I2S_CLKCTRL_SLOTSIZE_16; + + // Serializer configuration + #ifdef SAMD21 + uint32_t serctrl = (self->clock_unit << I2S_SERCTRL_CLKSEL_Pos) | SERCTRL(SERMODE_PDM2) | SERCTRL(DATASIZE_32); + #endif + #ifdef SAMD51 + uint32_t serctrl = (self->clock_unit << I2S_RXCTRL_CLKSEL_Pos) | SERCTRL(SERMODE_PDM2) | SERCTRL(DATASIZE_32); + #endif + + // Configure the I2S peripheral + i2s_set_enable(false); + + I2S->CLKCTRL[self->clock_unit].reg = clkctrl; + #ifdef SAMD21 + I2S->SERCTRL[self->serializer].reg = serctrl; + #endif + #ifdef SAMD51 + I2S->RXCTRL.reg = serctrl; + #endif + + i2s_set_enable(true); // Run the serializer all the time. This eliminates startup delay for the microphone. - i2s_clock_unit_enable(&self->i2s_instance, self->clock_unit); - i2s_serializer_enable(&self->i2s_instance, self->serializer); + i2s_set_clock_unit_enable(self->clock_unit, true); + i2s_set_serializer_enable(self->serializer, true); + + claim_pin(clock_pin); + claim_pin(data_pin); + + gpio_set_pin_function(self->clock_pin->pin, GPIO_I2S_FUNCTION); + gpio_set_pin_function(self->data_pin->pin, GPIO_I2S_FUNCTION); self->bytes_per_sample = oversample >> 3; self->bit_depth = bit_depth; @@ -168,10 +224,15 @@ void common_hal_audiobusio_pdmin_deinit(audiobusio_pdmin_obj_t* self) { if (common_hal_audiobusio_pdmin_deinited(self)) { return; } - i2s_disable(&self->i2s_instance); - i2s_serializer_disable(&self->i2s_instance, self->serializer); - i2s_clock_unit_disable(&self->i2s_instance, self->clock_unit); - i2s_reset(&self->i2s_instance); + + i2s_set_serializer_enable(self->serializer, false); + i2s_set_clock_unit_enable(self->clock_unit, false); + + i2s_set_enable(false); + + disconnect_gclk_from_peripheral(self->gclk, I2S_GCLK_ID_0 + self->clock_unit); + disable_clock_generator(self->gclk); + reset_pin(self->clock_pin->pin); reset_pin(self->data_pin->pin); self->clock_pin = mp_const_none; @@ -182,65 +243,67 @@ uint8_t common_hal_audiobusio_pdmin_get_bit_depth(audiobusio_pdmin_obj_t* self) return self->bit_depth; } -uint32_t common_hal_audiobusio_pdmin_get_frequency(audiobusio_pdmin_obj_t* self) { - return self->frequency; +uint32_t common_hal_audiobusio_pdmin_get_sample_rate(audiobusio_pdmin_obj_t* self) { + return self->sample_rate; } static void setup_dma(audiobusio_pdmin_obj_t* self, uint32_t length, - DmacDescriptor* second_descriptor, - uint8_t words_per_buffer, uint8_t words_per_sample, - uint32_t* first_buffer, uint32_t* second_buffer) { - // Set up the DMA - struct dma_descriptor_config descriptor_config; - dma_descriptor_get_config_defaults(&descriptor_config); - descriptor_config.beat_size = DMA_BEAT_SIZE_WORD; - descriptor_config.step_selection = DMA_STEPSEL_SRC; - descriptor_config.source_address = (uint32_t)&I2S->DATA[self->serializer]; - descriptor_config.src_increment_enable = false; + DmacDescriptor* descriptor, + DmacDescriptor* second_descriptor, + uint32_t words_per_buffer, uint8_t words_per_sample, + uint32_t* first_buffer, uint32_t* second_buffer) { + descriptor->BTCTRL.reg = DMAC_BTCTRL_VALID | + DMAC_BTCTRL_BLOCKACT_NOACT | + DMAC_BTCTRL_EVOSEL_BLOCK | + DMAC_BTCTRL_DSTINC | + DMAC_BTCTRL_BEATSIZE_WORD; + // Block transfer count is the number of beats per block (aka descriptor). // In this case there are two bytes per beat so divide the length by two. uint16_t block_transfer_count = words_per_buffer; if (length * words_per_sample < words_per_buffer) { block_transfer_count = length * words_per_sample; } - descriptor_config.block_transfer_count = block_transfer_count; - descriptor_config.destination_address = ((uint32_t) first_buffer + sizeof(uint32_t) * block_transfer_count); - descriptor_config.event_output_selection = DMA_EVENT_OUTPUT_BLOCK; - descriptor_config.next_descriptor_address = 0; + + descriptor->BTCNT.reg = block_transfer_count; + descriptor->DSTADDR.reg = ((uint32_t) first_buffer + sizeof(uint32_t) * block_transfer_count); + descriptor->DESCADDR.reg = 0; if (length * words_per_sample > words_per_buffer) { - descriptor_config.next_descriptor_address = ((uint32_t)second_descriptor); + descriptor->DESCADDR.reg = ((uint32_t)second_descriptor); } - dma_descriptor_create(audio_dma.descriptor, &descriptor_config); + #ifdef SAMD21 + descriptor->SRCADDR.reg = (uint32_t)&I2S->DATA[self->serializer]; + #endif + #ifdef SAMD51 + descriptor->SRCADDR.reg = (uint32_t)&I2S->RXDATA; + #endif // Do we need more values than will fit in the first buffer? // If so, set up a second buffer chained to be filled after the first buffer. if (length * words_per_sample > words_per_buffer) { block_transfer_count = words_per_buffer; - descriptor_config.next_descriptor_address = ((uint32_t)audio_dma.descriptor); + second_descriptor->DESCADDR.reg = ((uint32_t)descriptor); if (length * words_per_sample < 2 * words_per_buffer) { // Length needed is more than one buffer but less than two. // Subtract off the size of the first buffer, and what remains is the count we need. block_transfer_count = length * words_per_sample - words_per_buffer; - descriptor_config.next_descriptor_address = 0; + second_descriptor->DESCADDR.reg = 0; } - descriptor_config.block_transfer_count = block_transfer_count; - descriptor_config.destination_address = ((uint32_t) second_buffer + sizeof(uint32_t) * block_transfer_count); - dma_descriptor_create(second_descriptor, &descriptor_config); + second_descriptor->DSTADDR.reg = ((uint32_t) second_buffer + sizeof(uint32_t) * block_transfer_count); + + second_descriptor->BTCNT.reg = block_transfer_count; + #ifdef SAMD21 + second_descriptor->SRCADDR.reg = (uint32_t)&I2S->DATA[self->serializer]; + #endif + #ifdef SAMD51 + second_descriptor->SRCADDR.reg = (uint32_t)&I2S->RXDATA; + #endif + second_descriptor->BTCTRL.reg = DMAC_BTCTRL_VALID | + DMAC_BTCTRL_BLOCKACT_NOACT | + DMAC_BTCTRL_EVOSEL_BLOCK | + DMAC_BTCTRL_DSTINC | + DMAC_BTCTRL_BEATSIZE_WORD; } - - switch_audiodma_trigger(I2S_DMAC_ID_RX_0 + self->serializer); -} - -void start_dma(audiobusio_pdmin_obj_t* self) { - dma_start_transfer_job(&audio_dma); - tc_start_counter(MP_STATE_VM(audiodma_block_counter)); - I2S->DATA[1].reg = I2S->DATA[1].reg; -} - -void stop_dma(audiobusio_pdmin_obj_t* self) { - // Shutdown the DMA: serializer keeps running. - tc_stop_counter(MP_STATE_VM(audiodma_block_counter)); - dma_abort_job(&audio_dma); } // a windowed sinc filter for 44 khz, 64 samples @@ -290,20 +353,32 @@ static uint16_t filter_sample(uint32_t pdm_samples[4]) { // output_buffer_length is the number of slots, not the number of bytes. uint32_t common_hal_audiobusio_pdmin_record_to_buffer(audiobusio_pdmin_obj_t* self, uint16_t* output_buffer, uint32_t output_buffer_length) { + uint8_t dma_channel = find_free_audio_dma_channel(); + uint8_t event_channel = find_sync_event_channel(); + // We allocate two buffers on the stack to use for double buffering. const uint8_t samples_per_buffer = SAMPLES_PER_BUFFER; // For every word we record, we throw away 2 bytes of a phantom second channel. - const uint8_t words_per_sample = self->bytes_per_sample / 2; - const uint8_t words_per_buffer = samples_per_buffer * words_per_sample; + uint8_t words_per_sample = self->bytes_per_sample / 2; + uint32_t words_per_buffer = samples_per_buffer * words_per_sample; uint32_t first_buffer[words_per_buffer]; uint32_t second_buffer[words_per_buffer]; + turn_on_event_system(); + COMPILER_ALIGNED(16) DmacDescriptor second_descriptor; - setup_dma(self, output_buffer_length, &second_descriptor, words_per_buffer, - words_per_sample, first_buffer, second_buffer); + setup_dma(self, output_buffer_length, dma_descriptor(dma_channel), &second_descriptor, + words_per_buffer, words_per_sample, first_buffer, second_buffer); - start_dma(self); + uint8_t trigger_source = I2S_DMAC_ID_RX_0; + #ifdef SAMD21 + trigger_source += self->serializer; + #endif + + dma_configure(dma_channel, trigger_source, true); + init_event_channel_interrupt(event_channel, CORE_GCLK, EVSYS_ID_GEN_DMAC_CH_0 + dma_channel); + dma_enable_channel(dma_channel); // Record uint32_t buffers_processed = 0; @@ -311,24 +386,23 @@ uint32_t common_hal_audiobusio_pdmin_record_to_buffer(audiobusio_pdmin_obj_t* se uint32_t remaining_samples_needed = output_buffer_length; while (values_output < output_buffer_length) { + if (event_interrupt_overflow(event_channel)) { + // Looks like we aren't keeping up. We shouldn't skip a buffer so stop early. + break; + } // Wait for the next buffer to fill - uint32_t block_counter; - while ((block_counter = tc_get_count_value(MP_STATE_VM(audiodma_block_counter))) == buffers_processed) { + while (!event_interrupt_active(event_channel)) { #ifdef MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_LOOP #endif } - if (block_counter != (buffers_processed + 1)) { - // Looks like we aren't keeping up. We shouldn't skip a buffer. - break; - } // The mic is running all the time, so we don't need to wait the usual 10msec or 100msec // for it to start up. // Flip back and forth between processing the first and second buffers. uint32_t *buffer = first_buffer; - DmacDescriptor* descriptor = audio_dma.descriptor; + DmacDescriptor* descriptor = dma_descriptor(dma_channel); if (buffers_processed % 2 == 1) { buffer = second_buffer; descriptor = &second_descriptor; @@ -375,7 +449,8 @@ uint32_t common_hal_audiobusio_pdmin_record_to_buffer(audiobusio_pdmin_obj_t* se } } - stop_dma(self); + disable_event_channel(event_channel); + dma_disable_channel(dma_channel); return values_output; } diff --git a/ports/atmel-samd/common-hal/audiobusio/PDMIn.h b/ports/atmel-samd/common-hal/audiobusio/PDMIn.h index 50dc602623..1156c64210 100644 --- a/ports/atmel-samd/common-hal/audiobusio/PDMIn.h +++ b/ports/atmel-samd/common-hal/audiobusio/PDMIn.h @@ -36,11 +36,12 @@ typedef struct { mp_obj_base_t base; const mcu_pin_obj_t *clock_pin; const mcu_pin_obj_t *data_pin; - uint32_t frequency; + uint32_t sample_rate; uint8_t serializer; uint8_t clock_unit; uint8_t bytes_per_sample; uint8_t bit_depth; + uint8_t gclk; } audiobusio_pdmin_obj_t; void pdmin_reset(void); diff --git a/ports/atmel-samd/common-hal/audioio/AudioOut.c b/ports/atmel-samd/common-hal/audioio/AudioOut.c index 3d03bfd67a..6971c020b4 100644 --- a/ports/atmel-samd/common-hal/audioio/AudioOut.c +++ b/ports/atmel-samd/common-hal/audioio/AudioOut.c @@ -327,6 +327,32 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t* self, self->playing = true; } +void common_hal_audioio_audioout_pause(audioio_audioout_obj_t* self) { + audio_dma_pause(&self->left_dma); + #ifdef SAMD51 + audio_dma_pause(&self->right_dma); + #endif +} + +void common_hal_audioio_audioout_resume(audioio_audioout_obj_t* self) { + // Clear any overrun/underrun errors + #ifdef SAMD21 + DAC->INTFLAG.reg = DAC_INTFLAG_UNDERRUN; + #endif + #ifdef SAMD51 + DAC->INTFLAG.reg = DAC_INTFLAG_UNDERRUN0 | DAC_INTFLAG_UNDERRUN1; + #endif + + audio_dma_resume(&self->left_dma); + #ifdef SAMD51 + audio_dma_resume(&self->right_dma); + #endif +} + +bool common_hal_audioio_audioout_get_paused(audioio_audioout_obj_t* self) { + return audio_dma_get_paused(&self->left_dma); +} + void common_hal_audioio_audioout_stop(audioio_audioout_obj_t* self) { Tc* timer = tc_insts[self->tc_index]; timer->COUNT16.CTRLBSET.reg = TC_CTRLBSET_CMD_STOP; diff --git a/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c b/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c index 109f14b04d..cd0e3f91e5 100644 --- a/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +++ b/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c @@ -72,7 +72,7 @@ void common_hal_digitalio_digitalinout_switch_to_output( gpio_set_pin_direction(pin, GPIO_DIRECTION_OUT); // Turn on "strong" pin driving (more current available). See DRVSTR doc in datasheet. - hri_port_set_PINCFG_DRVSTR_bit(PORT, (enum gpio_port)GPIO_PORT(pin), pin); + hri_port_set_PINCFG_DRVSTR_bit(PORT, (enum gpio_port)GPIO_PORT(pin), GPIO_PIN(pin)); self->output = true; self->open_drain = drive_mode == DRIVE_MODE_OPEN_DRAIN; @@ -158,7 +158,7 @@ digitalio_pull_t common_hal_digitalio_digitalinout_get_pull( mp_raise_AttributeError("Cannot get pull while in output mode"); return PULL_NONE; } else { - if (hri_port_get_PINCFG_PULLEN_bit(PORT, (enum gpio_port)GPIO_PORT(pin), pin) == 0) { + if (hri_port_get_PINCFG_PULLEN_bit(PORT, (enum gpio_port)GPIO_PORT(pin), GPIO_PIN(pin)) == 0) { return PULL_NONE; } if (hri_port_get_OUT_reg(PORT, (enum gpio_port)GPIO_PORT(pin), 1U << GPIO_PIN(pin)) > 0) { return PULL_UP; diff --git a/ports/atmel-samd/common-hal/microcontroller/Processor.c b/ports/atmel-samd/common-hal/microcontroller/Processor.c index 5c0d72c96a..e7f758cd10 100644 --- a/ports/atmel-samd/common-hal/microcontroller/Processor.c +++ b/ports/atmel-samd/common-hal/microcontroller/Processor.c @@ -63,166 +63,219 @@ #include "common-hal/microcontroller/Processor.h" +#include "peripherals.h" + #include "peripheral_clk_config.h" -// #define ADC_TEMP_SAMPLE_LENGTH 4 -// #define INT1V_VALUE_FLOAT 1.0 -// #define INT1V_DIVIDER_1000 1000.0 -// #define ADC_12BIT_FULL_SCALE_VALUE_FLOAT 4095.0 -// -// typedef struct nvm_calibration_data_t { -// float tempR; // Production Room temperature -// float tempH; // Production Hot temperature -// float INT1VR; // Room temp 2's complement of the internal 1V reference value -// float INT1VH; // Hot temp 2's complement of the internal 1V reference value -// uint16_t ADCR; // Production Room temperature ADC value -// uint16_t ADCH; // Production Hot temperature ADC value -// float VADCR; // Room temperature ADC voltage -// float VADCH; // Hot temperature ADC voltage -// } nvm_calibration_data_t; +#define ADC_TEMP_SAMPLE_LENGTH 4 +#define INT1V_VALUE_FLOAT 1.0 +#define INT1V_DIVIDER_1000 1000.0 +#define ADC_12BIT_FULL_SCALE_VALUE_FLOAT 4095.0 // Decimal to fraction conversion. (adapted from ASF sample). -// STATIC float convert_dec_to_frac(uint8_t val) { -// float float_val = (float)val; -// if (val < 10) { -// return (float_val/10.0); -// } else if (val < 100) { -// return (float_val/100.0); -// } else { -// return (float_val/1000.0); -// } -// } +STATIC float convert_dec_to_frac(uint8_t val) { + float float_val = (float)val; + if (val < 10) { + return (float_val/10.0); + } else if (val < 100) { + return (float_val/100.0); + } else { + return (float_val/1000.0); + } +} -// STATIC void configure_adc_temp(struct adc_module *adc_instance) { -// struct adc_config config_adc; -// adc_get_config_defaults(&config_adc); -// -// // The parameters chosen here are from the temperature example in: -// // http://www.atmel.com/images/Atmel-42645-ADC-Configurations-with-Examples_ApplicationNote_AT11481.pdf -// // That note also recommends in general: -// // "Discard the first conversion result whenever there is a change -// // in ADC configuration like voltage reference / ADC channel change." -// -// config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV16; -// config_adc.reference = ADC_REFERENCE_INT1V; -// config_adc.positive_input = ADC_POSITIVE_INPUT_TEMP; -// config_adc.negative_input = ADC_NEGATIVE_INPUT_GND; -// config_adc.sample_length = ADC_TEMP_SAMPLE_LENGTH; -// -// adc_init(adc_instance, ADC, &config_adc); -// -// // Oversample and decimate. A higher samplenum produces a more stable result. -// ADC->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(2) | ADC_AVGCTRL_SAMPLENUM_4; -// //ADC->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(4) | ADC_AVGCTRL_SAMPLENUM_16; -// } +// Extract the production calibration data information from NVM (adapted from ASF sample), +// then calculate the temperature +#ifdef SAMD21 +STATIC float calculate_temperature(uint16_t raw_value) { + volatile uint32_t val1; /* Temperature Log Row Content first 32 bits */ + volatile uint32_t val2; /* Temperature Log Row Content another 32 bits */ + uint8_t room_temp_val_int; /* Integer part of room temperature in °C */ + uint8_t room_temp_val_dec; /* Decimal part of room temperature in °C */ + uint8_t hot_temp_val_int; /* Integer part of hot temperature in °C */ + uint8_t hot_temp_val_dec; /* Decimal part of hot temperature in °C */ + int8_t room_int1v_val; /* internal 1V reference drift at room temperature */ + int8_t hot_int1v_val; /* internal 1V reference drift at hot temperature*/ -// Extract the production calibration data information from NVM (adapted from ASF sample). -// -// STATIC void load_calibration_data(nvm_calibration_data_t *cal) { -// volatile uint32_t val1; /* Temperature Log Row Content first 32 bits */ -// volatile uint32_t val2; /* Temperature Log Row Content another 32 bits */ -// uint8_t room_temp_val_int; /* Integer part of room temperature in °C */ -// uint8_t room_temp_val_dec; /* Decimal part of room temperature in °C */ -// uint8_t hot_temp_val_int; /* Integer part of hot temperature in °C */ -// uint8_t hot_temp_val_dec; /* Decimal part of hot temperature in °C */ -// int8_t room_int1v_val; /* internal 1V reference drift at room temperature */ -// int8_t hot_int1v_val; /* internal 1V reference drift at hot temperature*/ -// -// uint32_t *temp_log_row_ptr = (uint32_t *)NVMCTRL_TEMP_LOG; -// -// val1 = *temp_log_row_ptr; -// temp_log_row_ptr++; -// val2 = *temp_log_row_ptr; -// -// room_temp_val_int = (uint8_t)((val1 & NVMCTRL_FUSES_ROOM_TEMP_VAL_INT_Msk) >> NVMCTRL_FUSES_ROOM_TEMP_VAL_INT_Pos); -// room_temp_val_dec = (uint8_t)((val1 & NVMCTRL_FUSES_ROOM_TEMP_VAL_DEC_Msk) >> NVMCTRL_FUSES_ROOM_TEMP_VAL_DEC_Pos); -// -// hot_temp_val_int = (uint8_t)((val1 & NVMCTRL_FUSES_HOT_TEMP_VAL_INT_Msk) >> NVMCTRL_FUSES_HOT_TEMP_VAL_INT_Pos); -// hot_temp_val_dec = (uint8_t)((val1 & NVMCTRL_FUSES_HOT_TEMP_VAL_DEC_Msk) >> NVMCTRL_FUSES_HOT_TEMP_VAL_DEC_Pos); -// -// room_int1v_val = (int8_t)((val1 & NVMCTRL_FUSES_ROOM_INT1V_VAL_Msk) >> NVMCTRL_FUSES_ROOM_INT1V_VAL_Pos); -// hot_int1v_val = (int8_t)((val2 & NVMCTRL_FUSES_HOT_INT1V_VAL_Msk) >> NVMCTRL_FUSES_HOT_INT1V_VAL_Pos); -// -// cal->ADCR = (uint16_t)((val2 & NVMCTRL_FUSES_ROOM_ADC_VAL_Msk) >> NVMCTRL_FUSES_ROOM_ADC_VAL_Pos); -// -// cal->ADCH = (uint16_t)((val2 & NVMCTRL_FUSES_HOT_ADC_VAL_Msk) >> NVMCTRL_FUSES_HOT_ADC_VAL_Pos); -// -// cal->tempR = room_temp_val_int + convert_dec_to_frac(room_temp_val_dec); -// cal->tempH = hot_temp_val_int + convert_dec_to_frac(hot_temp_val_dec); -// -// cal->INT1VR = 1 - ((float)room_int1v_val/INT1V_DIVIDER_1000); -// cal->INT1VH = 1 - ((float)hot_int1v_val/INT1V_DIVIDER_1000); -// -// cal->VADCR = ((float)cal->ADCR * cal->INT1VR)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; -// cal->VADCH = ((float)cal->ADCH * cal->INT1VH)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; -// } + float tempR; // Production Room temperature + float tempH; // Production Hot temperature + float INT1VR; // Room temp 2's complement of the internal 1V reference value + float INT1VH; // Hot temp 2's complement of the internal 1V reference value + uint16_t ADCR; // Production Room temperature ADC value + uint16_t ADCH; // Production Hot temperature ADC value + float VADCR; // Room temperature ADC voltage + float VADCH; // Hot temperature ADC voltage -/* - * Calculate fine temperature using Equation1 and Equation - * 1b as mentioned in data sheet section "Temperature Sensor Characteristics" - * of Electrical Characteristics. (adapted from ASF sample code). - */ -// STATIC float calculate_temperature(uint16_t raw_code, nvm_calibration_data_t *cal) -// { -// float VADC; /* Voltage calculation using ADC result for Coarse Temp calculation */ -// float VADCM; /* Voltage calculation using ADC result for Fine Temp calculation. */ -// float INT1VM; /* Voltage calculation for reality INT1V value during the ADC conversion */ -// -// VADC = ((float)raw_code * INT1V_VALUE_FLOAT)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; -// -// // Hopefully compiler will remove common subepxressions here. -// -// /* Coarse Temp Calculation by assume INT1V=1V for this ADC conversion */ -// float coarse_temp = cal->tempR + (((cal->tempH - cal->tempR)/(cal->VADCH - cal->VADCR)) * (VADC - cal->VADCR)); -// -// /* Calculation to find the real INT1V value during the ADC conversion */ -// INT1VM = cal->INT1VR + (((cal->INT1VH - cal->INT1VR) * (coarse_temp - cal->tempR))/(cal->tempH - cal->tempR)); -// -// VADCM = ((float)raw_code * INT1VM)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; -// -// /* Fine Temp Calculation by replace INT1V=1V by INT1V = INT1Vm for ADC conversion */ -// float fine_temp = cal->tempR + (((cal->tempH - cal->tempR)/(cal->VADCH - cal->VADCR)) * (VADCM - cal->VADCR)); -// -// return fine_temp; -// } + uint32_t *temp_log_row_ptr = (uint32_t *)NVMCTRL_TEMP_LOG; + val1 = *temp_log_row_ptr; + temp_log_row_ptr++; + val2 = *temp_log_row_ptr; + + room_temp_val_int = (uint8_t)((val1 & FUSES_ROOM_TEMP_VAL_INT_Msk) >> FUSES_ROOM_TEMP_VAL_INT_Pos); + room_temp_val_dec = (uint8_t)((val1 & FUSES_ROOM_TEMP_VAL_DEC_Msk) >> FUSES_ROOM_TEMP_VAL_DEC_Pos); + + hot_temp_val_int = (uint8_t)((val1 & FUSES_HOT_TEMP_VAL_INT_Msk) >> FUSES_HOT_TEMP_VAL_INT_Pos); + hot_temp_val_dec = (uint8_t)((val1 & FUSES_HOT_TEMP_VAL_DEC_Msk) >> FUSES_HOT_TEMP_VAL_DEC_Pos); + + room_int1v_val = (int8_t)((val1 & FUSES_ROOM_INT1V_VAL_Msk) >> FUSES_ROOM_INT1V_VAL_Pos); + hot_int1v_val = (int8_t)((val2 & FUSES_HOT_INT1V_VAL_Msk) >> FUSES_HOT_INT1V_VAL_Pos); + + ADCR = (uint16_t)((val2 & FUSES_ROOM_ADC_VAL_Msk) >> FUSES_ROOM_ADC_VAL_Pos); + ADCH = (uint16_t)((val2 & FUSES_HOT_ADC_VAL_Msk) >> FUSES_HOT_ADC_VAL_Pos); + + tempR = room_temp_val_int + convert_dec_to_frac(room_temp_val_dec); + tempH = hot_temp_val_int + convert_dec_to_frac(hot_temp_val_dec); + + INT1VR = 1 - ((float)room_int1v_val/INT1V_DIVIDER_1000); + INT1VH = 1 - ((float)hot_int1v_val/INT1V_DIVIDER_1000); + + VADCR = ((float)ADCR * INT1VR)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; + VADCH = ((float)ADCH * INT1VH)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; + + float VADC; /* Voltage calculation using ADC result for Coarse Temp calculation */ + float VADCM; /* Voltage calculation using ADC result for Fine Temp calculation. */ + float INT1VM; /* Voltage calculation for reality INT1V value during the ADC conversion */ + + VADC = ((float)raw_value * INT1V_VALUE_FLOAT)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; + + // Hopefully compiler will remove common subepxressions here. + + // calculate fine temperature using Equation1 and Equation + // 1b as mentioned in data sheet section "Temperature Sensor Characteristics" + // of Electrical Characteristics. (adapted from ASF sample code). + // Coarse Temp Calculation by assume INT1V=1V for this ADC conversion + float coarse_temp = tempR + (((tempH - tempR)/(VADCH - VADCR)) * (VADC - VADCR)); + + // Calculation to find the real INT1V value during the ADC conversion + INT1VM = INT1VR + (((INT1VH - INT1VR) * (coarse_temp - tempR))/(tempH - tempR)); + + VADCM = ((float)raw_value * INT1VM)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; + + // Fine Temp Calculation by replace INT1V=1V by INT1V = INT1Vm for ADC conversion + float fine_temp = tempR + (((tempH - tempR)/(VADCH - VADCR)) * (VADCM - VADCR)); + + return fine_temp; +} +#endif // SAMD21 + +#ifdef SAMD51 +STATIC float calculate_temperature(uint16_t TP, uint16_t TC) { + uint32_t TLI = (*(uint32_t *)FUSES_ROOM_TEMP_VAL_INT_ADDR & FUSES_ROOM_TEMP_VAL_INT_Msk) >> FUSES_ROOM_TEMP_VAL_INT_Pos; + uint32_t TLD = (*(uint32_t *)FUSES_ROOM_TEMP_VAL_DEC_ADDR & FUSES_ROOM_TEMP_VAL_DEC_Msk) >> FUSES_ROOM_TEMP_VAL_DEC_Pos; + float TL = TLI + convert_dec_to_frac(TLD); + + uint32_t THI = (*(uint32_t *)FUSES_HOT_TEMP_VAL_INT_ADDR & FUSES_HOT_TEMP_VAL_INT_Msk) >> FUSES_HOT_TEMP_VAL_INT_Pos; + uint32_t THD = (*(uint32_t *)FUSES_HOT_TEMP_VAL_DEC_ADDR & FUSES_HOT_TEMP_VAL_DEC_Msk) >> FUSES_HOT_TEMP_VAL_DEC_Pos; + float TH = THI + convert_dec_to_frac(THD); + + uint16_t VPL = (*(uint32_t *)FUSES_ROOM_ADC_VAL_PTAT_ADDR & FUSES_ROOM_ADC_VAL_PTAT_Msk) >> FUSES_ROOM_ADC_VAL_PTAT_Pos; + uint16_t VPH = (*(uint32_t *)FUSES_HOT_ADC_VAL_PTAT_ADDR & FUSES_HOT_ADC_VAL_PTAT_Msk) >> FUSES_HOT_ADC_VAL_PTAT_Pos; + + uint16_t VCL = (*(uint32_t *)FUSES_ROOM_ADC_VAL_CTAT_ADDR & FUSES_ROOM_ADC_VAL_CTAT_Msk) >> FUSES_ROOM_ADC_VAL_CTAT_Pos; + uint16_t VCH = (*(uint32_t *)FUSES_HOT_ADC_VAL_CTAT_ADDR & FUSES_HOT_ADC_VAL_CTAT_Msk) >> FUSES_HOT_ADC_VAL_CTAT_Pos; + + // From SAMD51 datasheet: section 45.6.3.1 (page 1327). + return (TL*VPH*TC - VPL*TH*TC - TL*VCH*TP + TH*VCL*TP) / (VCL*TP - VCH*TP - VPL*TC + VPH*TC); +} +#endif // SAMD51 -// External interface. -// float common_hal_mcu_processor_get_temperature(void) { - // struct adc_module adc_instance_struct; - // - // system_voltage_reference_enable(SYSTEM_VOLTAGE_REFERENCE_TEMPSENSE); - // configure_adc_temp(&adc_instance_struct); - // nvm_calibration_data_t nvm_calibration_data; - // load_calibration_data(&nvm_calibration_data); - // - // adc_enable(&adc_instance_struct); - // - // uint16_t data; - // enum status_code status; - // - // // Read twice and discard first result, as recommended in section 14 of - // // http://www.atmel.com/images/Atmel-42645-ADC-Configurations-with-Examples_ApplicationNote_AT11481.pdf - // // "Discard the first conversion result whenever there is a change in ADC configuration - // // like voltage reference / ADC channel change" - // // Empirical observation shows the first reading is quite different than subsequent ones. - // - // adc_start_conversion(&adc_instance_struct); - // do { - // status = adc_read(&adc_instance_struct, &data); - // } while (status == STATUS_BUSY); - // - // adc_start_conversion(&adc_instance_struct); - // do { - // status = adc_read(&adc_instance_struct, &data); - // } while (status == STATUS_BUSY); - // - // // Disable so that someone else can use the adc with different settings. - // adc_disable(&adc_instance_struct); - // return calculate_temperature(data, &nvm_calibration_data); - return 0; + struct adc_sync_descriptor adc; + + static Adc* adc_insts[] = ADC_INSTS; + samd_peripherals_adc_setup(&adc, adc_insts[0]); + +#ifdef SAMD21 + // The parameters chosen here are from the temperature example in: + // http://www.atmel.com/images/Atmel-42645-ADC-Configurations-with-Examples_ApplicationNote_AT11481.pdf + // That note also recommends in general: + // "Discard the first conversion result whenever there is a change + // in ADC configuration like voltage reference / ADC channel change." + + adc_sync_set_resolution(&adc, ADC_CTRLB_RESSEL_12BIT_Val); + adc_sync_set_reference(&adc, ADC_REFCTRL_REFSEL_INT1V_Val); + // Channel passed in adc_sync_enable_channel is actually ignored (!). + adc_sync_enable_channel(&adc, ADC_INPUTCTRL_MUXPOS_TEMP_Val); + adc_sync_set_inputs(&adc, + ADC_INPUTCTRL_MUXPOS_TEMP_Val, // pos_input + ADC_INPUTCTRL_MUXNEG_GND_Val, // neg_input + ADC_INPUTCTRL_MUXPOS_TEMP_Val); // channel channel (this arg is ignored (!)) + + adc_sync_set_resolution(&adc, ADC_CTRLB_RESSEL_12BIT_Val); + + hri_adc_write_CTRLB_PRESCALER_bf(adc.device.hw, ADC_CTRLB_PRESCALER_DIV32_Val); + hri_adc_write_SAMPCTRL_SAMPLEN_bf(adc.device.hw, ADC_TEMP_SAMPLE_LENGTH); + + hri_sysctrl_set_VREF_TSEN_bit(SYSCTRL); + + // Oversample and decimate. A higher samplenum produces a more stable result. + hri_adc_write_AVGCTRL_SAMPLENUM_bf(adc.device.hw, ADC_AVGCTRL_SAMPLENUM_4_Val); + hri_adc_write_AVGCTRL_ADJRES_bf(adc.device.hw, 2); + + volatile uint16_t value; + + // Read twice and discard first result, as recommended in section 14 of + // http://www.atmel.com/images/Atmel-42645-ADC-Configurations-with-Examples_ApplicationNote_AT11481.pdf + // "Discard the first conversion result whenever there is a change in ADC configuration + // like voltage reference / ADC channel change" + // Empirical observation shows the first reading is quite different than subsequent ones. + + // The channel listed in adc_sync_read_channel is actually ignored(!). + // Must be set as above with adc_sync_set_inputs. + adc_sync_read_channel(&adc, ADC_INPUTCTRL_MUXPOS_TEMP_Val, ((uint8_t*) &value), 2); + adc_sync_read_channel(&adc, ADC_INPUTCTRL_MUXPOS_TEMP_Val, ((uint8_t*) &value), 2); + + adc_sync_deinit(&adc); + return calculate_temperature(value); +#endif // SAMD21 + +#ifdef SAMD51 + adc_sync_set_resolution(&adc, ADC_CTRLB_RESSEL_12BIT_Val); + // Reference voltage choice is a guess. It's not specified in the datasheet that I can see. + // INTVCC1 seems to read a little high. + // INTREF doesn't work: ADC hangs BUSY. + adc_sync_set_reference(&adc, ADC_REFCTRL_REFSEL_INTVCC0_Val); + + // If ONDEMAND=1, we don't need to use the VREF.TSSEL bit to choose PTAT and CTAT. + hri_supc_set_VREF_ONDEMAND_bit(SUPC); + hri_supc_set_VREF_TSEN_bit(SUPC); + + // Channel passed in adc_sync_enable_channel is actually ignored (!). + adc_sync_enable_channel(&adc, ADC_INPUTCTRL_MUXPOS_PTAT_Val); + adc_sync_set_inputs(&adc, + ADC_INPUTCTRL_MUXPOS_PTAT_Val, // pos_input + ADC_INPUTCTRL_MUXNEG_GND_Val, // neg_input + ADC_INPUTCTRL_MUXPOS_PTAT_Val); // channel (this arg is ignored (!)) + + // Read both temperature sensors. + volatile uint16_t ptat; + volatile uint16_t ctat; + + // The channel listed in adc_sync_read_channel is actually ignored(!). + // Must be set as above with adc_sync_set_inputs. + // Read twice for stability (necessary?) + adc_sync_read_channel(&adc, ADC_INPUTCTRL_MUXPOS_PTAT_Val, ((uint8_t*) &ptat), 2); + adc_sync_read_channel(&adc, ADC_INPUTCTRL_MUXPOS_PTAT_Val, ((uint8_t*) &ptat), 2); + + adc_sync_set_inputs(&adc, + ADC_INPUTCTRL_MUXPOS_CTAT_Val, // pos_input + ADC_INPUTCTRL_MUXNEG_GND_Val, // neg_input + ADC_INPUTCTRL_MUXPOS_CTAT_Val); // channel (this arg is ignored (!)) + + // Channel passed in adc_sync_enable_channel is actually ignored (!). + adc_sync_enable_channel(&adc, ADC_INPUTCTRL_MUXPOS_CTAT_Val); + // The channel listed in adc_sync_read_channel is actually ignored(!). + // Must be set as above with adc_sync_set_inputs. + // Read twice for stability (necessary?) + adc_sync_read_channel(&adc, ADC_INPUTCTRL_MUXPOS_CTAT_Val, ((uint8_t*) &ctat), 2); + adc_sync_read_channel(&adc, ADC_INPUTCTRL_MUXPOS_CTAT_Val, ((uint8_t*) &ctat), 2); + hri_supc_set_VREF_ONDEMAND_bit(SUPC); + + adc_sync_deinit(&adc); + return calculate_temperature(ptat, ctat); +#endif // SAMD51 } diff --git a/ports/atmel-samd/common-hal/pulseio/PWMOut.c b/ports/atmel-samd/common-hal/pulseio/PWMOut.c index f1464c4b4f..24cd154c2a 100644 --- a/ports/atmel-samd/common-hal/pulseio/PWMOut.c +++ b/ports/atmel-samd/common-hal/pulseio/PWMOut.c @@ -151,6 +151,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, // one output so we start with the TCs to see if they work. int8_t direction = -1; uint8_t start = NUM_TIMERS_PER_PIN - 1; + bool found = false; if (variable_frequency) { direction = 1; start = 0; @@ -162,6 +163,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, continue; } if (t->is_tc) { + found = true; Tc* tc = tc_insts[t->index]; if (tc->COUNT16.CTRLA.bit.ENABLE == 0 && t->wave_output == 1) { timer = t; @@ -177,7 +179,11 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, } if (timer == NULL) { - mp_raise_RuntimeError("All timers in use"); + if (found) { + mp_raise_ValueError("All timers for this pin are in use"); + } else { + mp_raise_RuntimeError("All timers in use"); + } return; } diff --git a/ports/atmel-samd/common-hal/pulseio/PulseIn.c b/ports/atmel-samd/common-hal/pulseio/PulseIn.c index 2dca52913a..6e3aa3abb3 100644 --- a/ports/atmel-samd/common-hal/pulseio/PulseIn.c +++ b/ports/atmel-samd/common-hal/pulseio/PulseIn.c @@ -283,12 +283,9 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, if (trigger_duration > 0) { gpio_set_pin_pull_mode(self->pin, GPIO_PULL_OFF); gpio_set_pin_direction(self->pin, GPIO_DIRECTION_OUT); - - common_hal_mcu_disable_interrupts(); gpio_set_pin_level(self->pin, !self->idle_state); - common_hal_mcu_delay_us(trigger_duration); + common_hal_mcu_delay_us((uint32_t)trigger_duration); gpio_set_pin_level(self->pin, self->idle_state); - common_hal_mcu_enable_interrupts(); } // Reconfigure the pin and make sure its set to detect the first edge. diff --git a/ports/atmel-samd/common-hal/rtc/RTC.c b/ports/atmel-samd/common-hal/rtc/RTC.c index d63e81305d..680a88deb5 100644 --- a/ports/atmel-samd/common-hal/rtc/RTC.c +++ b/ports/atmel-samd/common-hal/rtc/RTC.c @@ -64,6 +64,12 @@ void common_hal_rtc_get_time(timeutils_struct_time_t *tm) { } void common_hal_rtc_set_time(timeutils_struct_time_t *tm) { + // Reset prescaler to increase initial precision. Otherwise we can be up to 1 second off already. + uint32_t freqcorr = hri_rtcmode0_read_FREQCORR_reg(calendar.device.hw); + calendar_deinit(&calendar); + rtc_init(); + hri_rtcmode0_write_FREQCORR_reg(calendar.device.hw, freqcorr); + struct calendar_date date = { .year = tm->tm_year, .month = tm->tm_mon, diff --git a/ports/atmel-samd/common-hal/usb_hid/__init__.c b/ports/atmel-samd/common-hal/usb_hid/__init__.c index 8cbccbb4c4..c9157519fa 100644 --- a/ports/atmel-samd/common-hal/usb_hid/__init__.c +++ b/ports/atmel-samd/common-hal/usb_hid/__init__.c @@ -35,12 +35,27 @@ #include "genhdr/autogen_usb_descriptor.h" // Buffers are report size + 1 to include the Report ID prefix byte if needed. +#ifdef USB_HID_REPORT_LENGTH_KEYBOARD static uint8_t keyboard_report_buffer[USB_HID_REPORT_LENGTH_KEYBOARD + 1]; +#endif +#ifdef USB_HID_REPORT_ID_MOUSE static uint8_t mouse_report_buffer[USB_HID_REPORT_LENGTH_MOUSE + 1]; +#endif +#ifdef USB_HID_REPORT_ID_CONSUMER static uint8_t consumer_report_buffer[USB_HID_REPORT_LENGTH_CONSUMER + 1]; +#endif +#ifdef USB_HID_REPORT_ID_SYS_CONTROL static uint8_t sys_control_report_buffer[USB_HID_REPORT_LENGTH_SYS_CONTROL + 1]; +#endif +#ifdef USB_HID_REPORT_ID_GAMEPAD +static uint8_t gamepad_report_buffer[USB_HID_REPORT_LENGTH_GAMEPAD + 1]; +#endif +#ifdef USB_HID_REPORT_ID_DIGITIZER +static uint8_t digitizer_report_buffer[USB_HID_REPORT_LENGTH_DIGITIZER + 1]; +#endif usb_hid_device_obj_t usb_hid_devices[USB_HID_NUM_DEVICES] = { +#ifdef USB_HID_REPORT_LENGTH_KEYBOARD { .base = { .type = &usb_hid_device_type }, .report_buffer = keyboard_report_buffer, @@ -50,6 +65,8 @@ usb_hid_device_obj_t usb_hid_devices[USB_HID_NUM_DEVICES] = { .usage_page = 0x01, .usage = 0x06, }, +#endif +#ifdef USB_HID_REPORT_ID_MOUSE { .base = { .type = &usb_hid_device_type }, .report_buffer = mouse_report_buffer, @@ -59,6 +76,8 @@ usb_hid_device_obj_t usb_hid_devices[USB_HID_NUM_DEVICES] = { .usage_page = 0x01, .usage = 0x02, }, +#endif +#ifdef USB_HID_REPORT_ID_CONSUMER { .base = { .type = &usb_hid_device_type }, .report_buffer = consumer_report_buffer, @@ -68,6 +87,8 @@ usb_hid_device_obj_t usb_hid_devices[USB_HID_NUM_DEVICES] = { .usage_page = 0x0C, .usage = 0x01, }, +#endif +#ifdef USB_HID_REPORT_ID_SYS_CONTROL { .base = { .type = &usb_hid_device_type }, .report_buffer = sys_control_report_buffer, @@ -77,6 +98,29 @@ usb_hid_device_obj_t usb_hid_devices[USB_HID_NUM_DEVICES] = { .usage_page = 0x01, .usage = 0x80, }, +#endif +#ifdef USB_HID_REPORT_ID_GAMEPAD + { + .base = { .type = &usb_hid_device_type }, + .report_buffer = gamepad_report_buffer, + .endpoint = USB_HID_ENDPOINT_IN, + .report_id = USB_HID_REPORT_ID_GAMEPAD, + .report_length = USB_HID_REPORT_LENGTH_GAMEPAD, + .usage_page = 0x01, + .usage = 0x05, + }, +#endif +#ifdef USB_HID_REPORT_ID_DIGITIZER + { + .base = { .type = &usb_hid_device_type }, + .report_buffer = digitizer_report_buffer, + .endpoint = USB_HID_ENDPOINT_IN, + .report_id = USB_HID_REPORT_ID_DIGITIZER, + .report_length = USB_HID_REPORT_LENGTH_DIGITIZER, + .usage_page = 0x0D, + .usage = 0x02, + }, +#endif }; @@ -86,9 +130,23 @@ mp_obj_tuple_t common_hal_usb_hid_devices = { }, .len = USB_HID_NUM_DEVICES, .items = { +#if USB_HID_NUM_DEVICES >= 1 (mp_obj_t) &usb_hid_devices[0], +#endif +#if USB_HID_NUM_DEVICES >= 2 (mp_obj_t) &usb_hid_devices[1], +#endif +#if USB_HID_NUM_DEVICES >= 3 (mp_obj_t) &usb_hid_devices[2], +#endif +#if USB_HID_NUM_DEVICES >= 4 (mp_obj_t) &usb_hid_devices[3], +#endif +#if USB_HID_NUM_DEVICES >= 5 + (mp_obj_t) &usb_hid_devices[4], +#endif +#if USB_HID_NUM_DEVICES >= 6 + (mp_obj_t) &usb_hid_devices[5], +#endif } }; diff --git a/ports/atmel-samd/events.c b/ports/atmel-samd/events.c index 1854692ae6..05a2ae8a73 100644 --- a/ports/atmel-samd/events.c +++ b/ports/atmel-samd/events.c @@ -91,7 +91,7 @@ uint8_t find_async_event_channel(void) { #define EVSYS_SYNCH_NUM EVSYS_CHANNELS #endif uint8_t find_sync_event_channel(void) { - int8_t channel; + uint8_t channel; for (channel = 0; channel < EVSYS_SYNCH_NUM; channel++) { if (channel_free(channel)) { break; @@ -145,6 +145,8 @@ void init_event_channel_interrupt(uint8_t channel, uint8_t gclk, uint8_t generat EVSYS->Channel[channel].CHANNEL.reg = EVSYS_CHANNEL_EVGEN(generator) | EVSYS_CHANNEL_PATH_SYNCHRONOUS | EVSYS_CHANNEL_EDGSEL_RISING_EDGE; + EVSYS->Channel[channel].CHINTFLAG.reg = EVSYS_CHINTFLAG_EVD | EVSYS_CHINTFLAG_OVR; + EVSYS->Channel[channel].CHINTENSET.reg = EVSYS_CHINTENSET_EVD | EVSYS_CHINTENSET_OVR; #endif #ifdef SAMD21 EVSYS->CHANNEL.reg = EVSYS_CHANNEL_CHANNEL(channel) | @@ -187,8 +189,25 @@ bool event_interrupt_active(uint8_t channel) { // Only clear if we know its active, otherwise there is the possibility it becomes after we // check but before we clear. if (active) { - EVSYS->Channel[channel].CHINTFLAG.reg = EVSYS_CHINTFLAG_EVD; + EVSYS->Channel[channel].CHINTFLAG.reg = EVSYS_CHINTFLAG_EVD | EVSYS_CHINTFLAG_OVR; } #endif return active; } + +bool event_interrupt_overflow(uint8_t channel) { + bool overflow = false; + #ifdef SAMD21 + if (channel > 7) { + uint8_t value = 1 << (channel - 7); + overflow = (EVSYS->INTFLAG.reg & EVSYS_INTFLAG_OVRp8(value)) != 0; + } else { + uint8_t value = 1 << channel; + overflow = (EVSYS->INTFLAG.reg & EVSYS_INTFLAG_OVR(value)) != 0; + } + #endif + #ifdef SAMD51 + overflow = EVSYS->Channel[channel].CHINTFLAG.bit.OVR; + #endif + return overflow; +} diff --git a/ports/atmel-samd/events.h b/ports/atmel-samd/events.h index 69215c3e7d..64093c0ab3 100644 --- a/ports/atmel-samd/events.h +++ b/ports/atmel-samd/events.h @@ -42,5 +42,6 @@ void connect_event_user_to_channel(uint8_t user, uint8_t channel); void init_async_event_channel(uint8_t channel, uint8_t generator); void init_event_channel_interrupt(uint8_t channel, uint8_t gclk, uint8_t generator); bool event_interrupt_active(uint8_t channel); +bool event_interrupt_overflow(uint8_t channel); #endif // MICROPY_INCLUDED_ATMEL_SAMD_EVENTS_H diff --git a/ports/atmel-samd/external_flash/qspi_flash.c b/ports/atmel-samd/external_flash/qspi_flash.c index f4d5ec9041..3fc9d31be4 100644 --- a/ports/atmel-samd/external_flash/qspi_flash.c +++ b/ports/atmel-samd/external_flash/qspi_flash.c @@ -32,6 +32,7 @@ #include "mpconfigboard.h" // for EXTERNAL_FLASH_QSPI_DUAL #include "external_flash/common_commands.h" +#include "peripherals.h" #include "shared_dma.h" #include "atmel_start_pins.h" @@ -55,6 +56,8 @@ bool spi_flash_command(uint8_t command) { } bool spi_flash_read_command(uint8_t command, uint8_t* response, uint32_t length) { + samd_peripherals_disable_and_clear_cache(); + QSPI->INSTRCTRL.bit.INSTR = command; QSPI->INSTRFRAME.reg = QSPI_INSTRFRAME_WIDTH_SINGLE_BIT_SPI | @@ -63,6 +66,11 @@ bool spi_flash_read_command(uint8_t command, uint8_t* response, uint32_t length) QSPI_INSTRFRAME_INSTREN | QSPI_INSTRFRAME_DATAEN; + // Dummy read of INSTRFRAME needed to synchronize. + // See Instruction Transmission Flow Diagram, figure 37.9, page 995 + // and Example 4, page 998, section 37.6.8.5. + (volatile uint32_t) QSPI->INSTRFRAME.reg; + memcpy(response, (uint8_t *) QSPI_AHB, length); QSPI->CTRLA.reg = QSPI_CTRLA_ENABLE | QSPI_CTRLA_LASTXFER; @@ -71,20 +79,28 @@ bool spi_flash_read_command(uint8_t command, uint8_t* response, uint32_t length) QSPI->INTFLAG.reg = QSPI_INTFLAG_INSTREND; + samd_peripherals_enable_cache(); + return true; } bool spi_flash_write_command(uint8_t command, uint8_t* data, uint32_t length) { + samd_peripherals_disable_and_clear_cache(); + QSPI->INSTRCTRL.bit.INSTR = command; QSPI->INSTRFRAME.reg = QSPI_INSTRFRAME_WIDTH_SINGLE_BIT_SPI | QSPI_INSTRFRAME_ADDRLEN_24BITS | QSPI_INSTRFRAME_TFRTYPE_WRITE | - QSPI_INSTRFRAME_INSTREN; + QSPI_INSTRFRAME_INSTREN | + (data != NULL ? QSPI_INSTRFRAME_DATAEN : 0); + + // Dummy read of INSTRFRAME needed to synchronize. + // See Instruction Transmission Flow Diagram, figure 37.9, page 995 + // and Example 4, page 998, section 37.6.8.5. + (volatile uint32_t) QSPI->INSTRFRAME.reg; if (data != NULL) { - QSPI->INSTRFRAME.bit.DATAEN = true; - memcpy((uint8_t *) QSPI_AHB, data, length); } @@ -94,6 +110,8 @@ bool spi_flash_write_command(uint8_t command, uint8_t* data, uint32_t length) { QSPI->INTFLAG.reg = QSPI_INTFLAG_INSTREND; + samd_peripherals_enable_cache(); + return true; } @@ -117,6 +135,8 @@ bool spi_flash_sector_command(uint8_t command, uint32_t address) { } bool spi_flash_write_data(uint32_t address, uint8_t* data, uint32_t length) { + samd_peripherals_disable_and_clear_cache(); + QSPI->INSTRCTRL.bit.INSTR = CMD_PAGE_PROGRAM; uint32_t mode = QSPI_INSTRFRAME_WIDTH_SINGLE_BIT_SPI; @@ -137,10 +157,14 @@ bool spi_flash_write_data(uint32_t address, uint8_t* data, uint32_t length) { QSPI->INTFLAG.reg = QSPI_INTFLAG_INSTREND; + samd_peripherals_enable_cache(); + return true; } bool spi_flash_read_data(uint32_t address, uint8_t* data, uint32_t length) { + samd_peripherals_disable_and_clear_cache(); + #ifdef EXTERNAL_FLASH_QSPI_DUAL QSPI->INSTRCTRL.bit.INSTR = CMD_DUAL_READ; uint32_t mode = QSPI_INSTRFRAME_WIDTH_DUAL_OUTPUT; @@ -167,6 +191,8 @@ bool spi_flash_read_data(uint32_t address, uint8_t* data, uint32_t length) { QSPI->INTFLAG.reg = QSPI_INTFLAG_INSTREND; + samd_peripherals_enable_cache(); + return true; } @@ -183,7 +209,7 @@ void spi_flash_init(void) { // QSPI->BAUD.bit.BAUD = 32; // Super fast, may be unreliable when Saleae is connected to high speed lines. QSPI->BAUD.bit.BAUD = 2; - QSPI->CTRLB.reg = QSPI_CTRLB_MODE_MEMORY | + QSPI->CTRLB.reg = QSPI_CTRLB_MODE_MEMORY | // Serial memory mode (map to QSPI_AHB) QSPI_CTRLB_DATALEN_8BITS | QSPI_CTRLB_CSMODE_LASTXFER; diff --git a/ports/atmel-samd/i2s.c b/ports/atmel-samd/i2s.c new file mode 100644 index 0000000000..663ecdd1dc --- /dev/null +++ b/ports/atmel-samd/i2s.c @@ -0,0 +1,84 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "i2s.h" + +#include "clocks.h" + +#include "hpl/gclk/hpl_gclk_base.h" +#ifdef SAMD21 +#include "hpl/pm/hpl_pm_base.h" +#endif + +void turn_on_i2s(void) { + // Make sure the I2S peripheral is running so we can see if the resources we need are free. + #ifdef SAMD51 + hri_mclk_set_APBDMASK_I2S_bit(MCLK); + + // Connect the clock units to the 2mhz clock by default. They can't reset without it. + connect_gclk_to_peripheral(5, I2S_GCLK_ID_0); + connect_gclk_to_peripheral(5, I2S_GCLK_ID_1); + #endif + + #ifdef SAMD21 + _pm_enable_bus_clock(PM_BUS_APBC, I2S); + #endif +} + +void i2s_set_enable(bool enable) { + while (I2S->SYNCBUSY.bit.ENABLE == 1) {} + I2S->CTRLA.bit.ENABLE = enable; + while (I2S->SYNCBUSY.bit.ENABLE == 1) {} +} + +void i2s_set_clock_unit_enable(uint8_t clock_unit, bool enable) { + while ((I2S->SYNCBUSY.vec.CKEN & (1 << clock_unit)) != 0) {} + I2S->CTRLA.vec.CKEN = 1 << clock_unit; + while ((I2S->SYNCBUSY.vec.CKEN & (1 << clock_unit)) != 0) {} +} + +void i2s_set_serializer_enable(uint8_t serializer, bool enable) { + #ifdef SAMD21 + while ((I2S->SYNCBUSY.vec.SEREN & (1 << serializer)) != 0) {} + if (enable) { + I2S->CTRLA.vec.SEREN = 1 << serializer; + } else { + I2S->CTRLA.vec.SEREN &= ~(1 << serializer); + } + while ((I2S->SYNCBUSY.vec.SEREN & (1 << serializer)) != 0) {} + #endif + #ifdef SAMD51 + if (serializer == 0) { + while (I2S->SYNCBUSY.bit.TXEN == 1) {} + I2S->CTRLA.bit.TXEN = enable; + while (I2S->SYNCBUSY.bit.TXEN == 1) {} + } else { + while (I2S->SYNCBUSY.bit.RXEN == 1) {} + I2S->CTRLA.bit.RXEN = enable; + while (I2S->SYNCBUSY.bit.RXEN == 1) {} + } + #endif +} diff --git a/ports/atmel-samd/samd_peripherals.h b/ports/atmel-samd/i2s.h similarity index 72% rename from ports/atmel-samd/samd_peripherals.h rename to ports/atmel-samd/i2s.h index 7a44778916..7df667b2ae 100644 --- a/ports/atmel-samd/samd_peripherals.h +++ b/ports/atmel-samd/i2s.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2017 by Dan Halbert for Adafruit Industries + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,13 +24,18 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_ATMEL_SAMD_SAMD21_PERIPHERALS_H -#define MICROPY_INCLUDED_ATMEL_SAMD_SAMD21_PERIPHERALS_H +#ifndef MICROPY_INCLUDED_ATMEL_SAMD_I2S_H +#define MICROPY_INCLUDED_ATMEL_SAMD_I2S_H + +#include +#include #include "include/sam.h" -void samd_peripherals_sercom_clock_init(Sercom* sercom, uint8_t sercom_index); -uint8_t samd_peripherals_get_spi_dopo(uint8_t clock_pad, uint8_t mosi_pad); -bool samd_peripherals_valid_spi_clock_pad(uint8_t clock_pad); +void turn_on_i2s(void); -#endif // MICROPY_INCLUDED_ATMEL_SAMD_SAMD21_PERIPHERALS_H +void i2s_set_enable(bool enable); +void i2s_set_clock_unit_enable(uint8_t clock, bool enable); +void i2s_set_serializer_enable(uint8_t serializer, bool enable); + +#endif // MICROPY_INCLUDED_ATMEL_SAMD_I2S_H diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h index 5ac06944ad..e6c3a201fe 100644 --- a/ports/atmel-samd/mpconfigport.h +++ b/ports/atmel-samd/mpconfigport.h @@ -167,6 +167,7 @@ extern const struct _mp_obj_module_t math_module; extern const struct _mp_obj_module_t os_module; extern const struct _mp_obj_module_t random_module; extern const struct _mp_obj_module_t rtc_module; +extern const struct _mp_obj_module_t samd_module; extern const struct _mp_obj_module_t storage_module; extern const struct _mp_obj_module_t struct_module; extern const struct _mp_obj_module_t time_module; @@ -236,6 +237,7 @@ extern const struct _mp_obj_module_t usb_hid_module; { MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_rtc), (mp_obj_t)&rtc_module }, \ + { MP_OBJ_NEW_QSTR(MP_QSTR_samd),(mp_obj_t)&samd_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \ diff --git a/ports/atmel-samd/mphalport.c b/ports/atmel-samd/mphalport.c index 6ac66c9d14..cdf27fe028 100644 --- a/ports/atmel-samd/mphalport.c +++ b/ports/atmel-samd/mphalport.c @@ -45,6 +45,13 @@ void mp_hal_stdout_tx_strn(const char *str, size_t len) { gpio_toggle_pin_level(MICROPY_HW_LED_TX); #endif + #ifdef CIRCUITPY_BOOT_OUTPUT_FILE + if (boot_output_file != NULL) { + UINT bytes_written = 0; + f_write(boot_output_file, str, len, &bytes_written); + } + #endif + usb_write(str, len); } diff --git a/ports/atmel-samd/peripherals.c b/ports/atmel-samd/peripherals.c index 0c7f1dc63a..c75a1f43b5 100644 --- a/ports/atmel-samd/peripherals.c +++ b/ports/atmel-samd/peripherals.c @@ -42,4 +42,3 @@ uint8_t samd_peripherals_spi_baudrate_to_baud_reg_value(const uint32_t baudrate) uint32_t samd_peripherals_spi_baud_reg_value_to_baudrate(const uint8_t baud_reg_value) { return PROTOTYPE_SERCOM_SPI_M_SYNC_CLOCK_FREQUENCY / (2 * (baud_reg_value + 1)); } - diff --git a/ports/atmel-samd/peripherals.h b/ports/atmel-samd/peripherals.h index 18c7f44d5c..8a07c00457 100644 --- a/ports/atmel-samd/peripherals.h +++ b/ports/atmel-samd/peripherals.h @@ -44,4 +44,4 @@ Sercom* sercom_insts[SERCOM_INST_NUM]; #include "samd51_peripherals.h" #endif -#endif // MICROPY_INCLUDED_ATMEL_SAMD_PINS_H +#endif // MICROPY_INCLUDED_ATMEL_SAMD_PERIPHERALS_H diff --git a/ports/atmel-samd/samd21_clocks.c b/ports/atmel-samd/samd21_clocks.c new file mode 100644 index 0000000000..0fc4d63e50 --- /dev/null +++ b/ports/atmel-samd/samd21_clocks.c @@ -0,0 +1,425 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "clocks.h" + +#include "hpl_gclk_config.h" + +#include "bindings/samd/Clock.h" +#include "shared-bindings/microcontroller/__init__.h" + +#include "py/runtime.h" + +bool gclk_enabled(uint8_t gclk) { + common_hal_mcu_disable_interrupts(); + // Explicitly do a byte write so the peripheral knows we're just wanting to read the channel + // rather than write to it. + *((uint8_t*) &GCLK->GENCTRL.reg) = gclk; + while (GCLK->STATUS.bit.SYNCBUSY == 1) {} + bool enabled = GCLK->GENCTRL.bit.GENEN; + common_hal_mcu_enable_interrupts(); + return enabled; +} + +void disable_gclk(uint8_t gclk) { + while (GCLK->STATUS.bit.SYNCBUSY == 1) {} + GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(gclk); + while (GCLK->STATUS.bit.SYNCBUSY == 1) {} +} + +void connect_gclk_to_peripheral(uint8_t gclk, uint8_t peripheral) { + GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(peripheral) | GCLK_CLKCTRL_GEN(gclk) | GCLK_CLKCTRL_CLKEN; +} + +void disconnect_gclk_from_peripheral(uint8_t gclk, uint8_t peripheral) { + GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(peripheral) | GCLK_CLKCTRL_GEN(gclk); +} + +void enable_clock_generator(uint8_t gclk, uint32_t source, uint16_t divisor) { + uint32_t divsel = 0; + if (gclk == 2 && divisor > 31) { + divsel = GCLK_GENCTRL_DIVSEL; + for (int i = 15; i > 4; i++) { + if (divisor & (1 << i)) { + divisor = i - 1; + break; + } + } + } + GCLK->GENDIV.reg = GCLK_GENDIV_ID(gclk) | GCLK_GENDIV_DIV(divisor); + GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(gclk) | GCLK_GENCTRL_SRC(source) | divsel | GCLK_GENCTRL_OE | GCLK_GENCTRL_GENEN; + while (GCLK->STATUS.bit.SYNCBUSY != 0) {} +} + +void disable_clock_generator(uint8_t gclk) { + GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(gclk); + while (GCLK->STATUS.bit.SYNCBUSY != 0) {} +} + +static void init_clock_source_osc8m(void) { + // Preserve CALIB and FRANGE + SYSCTRL->OSC8M.bit.ONDEMAND = 0; + SYSCTRL->OSC8M.bit.PRESC = 3; + SYSCTRL->OSC8M.bit.ENABLE = 1; + while (!SYSCTRL->PCLKSR.bit.OSC8MRDY) {} +} + +static void init_clock_source_osc32k(void) { + uint32_t calib = (*((uint32_t *)FUSES_OSC32K_CAL_ADDR) & FUSES_OSC32K_CAL_Msk) >> FUSES_OSC32K_CAL_Pos; + SYSCTRL->OSC32K.reg = SYSCTRL_OSC32K_CALIB(calib) | + SYSCTRL_OSC32K_EN32K | + SYSCTRL_OSC32K_ENABLE; + while (!SYSCTRL->PCLKSR.bit.OSC32KRDY) {} +} + +static void init_clock_source_xosc32k(void) { + SYSCTRL->XOSC32K.reg = SYSCTRL_XOSC32K_EN32K | + SYSCTRL_XOSC32K_XTALEN | + SYSCTRL_XOSC32K_ENABLE; + while (!SYSCTRL->PCLKSR.bit.XOSC32KRDY) {} +} + +static void init_clock_source_dfll48m(void) { + SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE; + while (!SYSCTRL->PCLKSR.bit.DFLLRDY) {} + SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP(1) | + SYSCTRL_DFLLMUL_FSTEP(1) | + SYSCTRL_DFLLMUL_MUL(48000); + uint32_t coarse = (*((uint32_t *)FUSES_DFLL48M_COARSE_CAL_ADDR) & FUSES_DFLL48M_COARSE_CAL_Msk) >> FUSES_DFLL48M_COARSE_CAL_Pos; + if (coarse == 0x3f) + coarse = 0x1f; + SYSCTRL->DFLLVAL.reg = SYSCTRL_DFLLVAL_COARSE(coarse) | + SYSCTRL_DFLLVAL_FINE(512); + SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_CCDIS | + SYSCTRL_DFLLCTRL_USBCRM | + SYSCTRL_DFLLCTRL_MODE | + SYSCTRL_DFLLCTRL_ENABLE; + while (!SYSCTRL->PCLKSR.bit.DFLLRDY) {} + while (GCLK->STATUS.bit.SYNCBUSY) {} +} + +void clock_init(void) +{ + init_clock_source_osc8m(); + if (board_has_crystal()) + init_clock_source_xosc32k(); + else + init_clock_source_osc32k(); + enable_clock_generator(0, GCLK_GENCTRL_SRC_DFLL48M_Val, 1); + enable_clock_generator(1, GCLK_GENCTRL_SRC_DFLL48M_Val, 150); + init_clock_source_dfll48m(); + if (board_has_crystal()) + enable_clock_generator(2, GCLK_GENCTRL_SRC_XOSC32K_Val, 32); + else + enable_clock_generator(2, GCLK_GENCTRL_SRC_OSC32K_Val, 32); +} + +static bool clk_enabled(uint8_t clk) { + common_hal_mcu_disable_interrupts(); + *((uint8_t*) &GCLK->CLKCTRL.reg) = clk; + while (GCLK->STATUS.bit.SYNCBUSY == 1) {} + bool enabled = GCLK->CLKCTRL.bit.CLKEN; + common_hal_mcu_enable_interrupts(); + return enabled; +} + +static uint8_t clk_get_generator(uint8_t clk) { + common_hal_mcu_disable_interrupts(); + *((uint8_t*) &GCLK->CLKCTRL.reg) = clk; + while (GCLK->STATUS.bit.SYNCBUSY == 1) {} + uint8_t gen = GCLK->CLKCTRL.bit.GEN; + common_hal_mcu_enable_interrupts(); + return gen; +} + +static uint8_t generator_get_source(uint8_t gen) { + common_hal_mcu_disable_interrupts(); + *((uint8_t*) &GCLK->GENCTRL.reg) = gen; + while (GCLK->STATUS.bit.SYNCBUSY == 1) {} + uint8_t src = GCLK->GENCTRL.bit.SRC; + common_hal_mcu_enable_interrupts(); + return src; +} + +static bool osc_enabled(uint8_t index) { + switch (index) { + case GCLK_SOURCE_XOSC: + return SYSCTRL->XOSC.bit.ENABLE; + // TODO: GCLK_SOURCE_GCLKIN + // TODO: GCLK_SOURCE_GCLKGEN1 + case GCLK_SOURCE_OSCULP32K: + return true; + case GCLK_SOURCE_OSC32K: + return SYSCTRL->OSC32K.bit.ENABLE; + case GCLK_SOURCE_XOSC32K: + return SYSCTRL->XOSC32K.bit.ENABLE; + case GCLK_SOURCE_OSC8M: + return SYSCTRL->OSC8M.bit.ENABLE; + case GCLK_SOURCE_DFLL48M: + return SYSCTRL->DFLLCTRL.bit.ENABLE; + case GCLK_SOURCE_DPLL96M: + return SYSCTRL->DPLLCTRLA.bit.ENABLE; + }; + return false; +} + +static uint32_t osc_get_frequency(uint8_t index) { + switch (index) { + case GCLK_SOURCE_XOSC: + return 0; // unknown 0.4-32MHz + // TODO: GCLK_SOURCE_GCLKIN + // TODO: GCLK_SOURCE_GCLKGEN1 + case GCLK_SOURCE_OSCULP32K: + case GCLK_SOURCE_OSC32K: + case GCLK_SOURCE_XOSC32K: + return 32768; + case GCLK_SOURCE_OSC8M: + return 8000000; + case GCLK_SOURCE_DFLL48M: + return 48000000; + case GCLK_SOURCE_DPLL96M: + return 96000000; + } + return 0; +} + +bool clock_get_enabled(uint8_t type, uint8_t index) { + if (type == 0) + return osc_enabled(index); + if (type == 1) + return clk_enabled(index); + if (type == 2) + return SysTick->CTRL & SysTick_CTRL_ENABLE_Msk; + return false; +} + +bool clock_get_parent(uint8_t type, uint8_t index, uint8_t *p_type, uint8_t *p_index) { + if (type == 1 && index <= 0x24 && clk_enabled(index)) { + *p_type = 0; + *p_index = generator_get_source(clk_get_generator(index)); + return true; + } + if (type == 2 && index == 0) { + *p_type = 0; + *p_index = generator_get_source(0); + return true; + } + return false; +} + +uint32_t clock_get_frequency(uint8_t type, uint8_t index) { + if (type == 0) { + return osc_get_frequency(index); + } + if (type == 1) { + if (!clk_enabled(index)) + return 0; + + uint8_t gen = clk_get_generator(index); + + common_hal_mcu_disable_interrupts(); + *((uint8_t*) &GCLK->GENCTRL.reg) = gen; + *((uint8_t*) &GCLK->GENDIV.reg) = gen; + while (GCLK->STATUS.bit.SYNCBUSY == 1) {} + + uint8_t src = GCLK->GENCTRL.bit.SRC; + uint32_t div; + if (GCLK->GENCTRL.bit.DIVSEL) { + div = 1 << (GCLK->GENDIV.bit.DIV + 1); + } else { + div = GCLK->GENDIV.bit.DIV; + if (!div) + div = 1; + } + common_hal_mcu_enable_interrupts(); + + return osc_get_frequency(src) / div; + } + if (type == 2 && index == 0) { + return clock_get_frequency(0, generator_get_source(0)) / SysTick->LOAD; + } + return 0; +} + +uint32_t clock_get_calibration(uint8_t type, uint8_t index) { + if (type == 0) { + switch (index) { + case GCLK_SOURCE_OSCULP32K: + return SYSCTRL->OSCULP32K.bit.CALIB; + case GCLK_SOURCE_OSC32K: + return SYSCTRL->OSC32K.bit.CALIB; + case GCLK_SOURCE_OSC8M: + return SYSCTRL->OSC8M.bit.CALIB; + }; + } + if (type == 2 && index == 0) { + return SysTick->LOAD + 1; + } + return 0; +} + +int clock_set_calibration(uint8_t type, uint8_t index, uint32_t val) { + if (type == 0) { + switch (index) { + case GCLK_SOURCE_OSCULP32K: + if (val > 0x1f) + return -1; + SYSCTRL->OSCULP32K.bit.CALIB = val; + return 0; + case GCLK_SOURCE_OSC32K: + if (val > 0x7f) + return -1; + SYSCTRL->OSC32K.bit.CALIB = val; + return 0; + case GCLK_SOURCE_OSC8M: + if (val > 0xfff) + return -1; + SYSCTRL->OSC8M.bit.CALIB = val; + return 0; + }; + } + if (type == 2 && index == 0) { + if (val < 0x1000 || val > 0x1000000) + return -1; + SysTick->LOAD = val - 1; + return 0; + } + return -2; // calibration is read only +} + +#ifdef SAMD21_EXPOSE_ALL_CLOCKS +CLOCK_SOURCE(XOSC); +CLOCK_SOURCE(GCLKIN); +CLOCK_SOURCE(GCLKGEN1); +CLOCK_SOURCE(OSCULP32K); +#endif +CLOCK_SOURCE(OSC32K); +CLOCK_SOURCE(XOSC32K); +#ifdef SAMD21_EXPOSE_ALL_CLOCKS +CLOCK_SOURCE(OSC8M); +CLOCK_SOURCE(DFLL48M); +CLOCK_SOURCE(DPLL96M); + +CLOCK_GCLK_(SYSCTRL, DFLL48); +CLOCK_GCLK_(SYSCTRL, FDPLL); +CLOCK_GCLK_(SYSCTRL, FDPLL32K); +CLOCK_GCLK(WDT); +#endif +CLOCK_GCLK(RTC); +#ifdef SAMD21_EXPOSE_ALL_CLOCKS +CLOCK_GCLK(EIC); +CLOCK_GCLK(USB); +CLOCK_GCLK_(EVSYS, 0); +CLOCK_GCLK_(EVSYS, 1); +CLOCK_GCLK_(EVSYS, 2); +CLOCK_GCLK_(EVSYS, 3); +CLOCK_GCLK_(EVSYS, 4); +CLOCK_GCLK_(EVSYS, 5); +CLOCK_GCLK_(EVSYS, 6); +CLOCK_GCLK_(EVSYS, 7); +CLOCK_GCLK_(EVSYS, 8); +CLOCK_GCLK_(EVSYS, 9); +CLOCK_GCLK_(EVSYS, 10); +CLOCK_GCLK_(EVSYS, 11); +CLOCK(SERCOMx_SLOW, 1, 19); +CLOCK_GCLK_(SERCOM0, CORE); +CLOCK_GCLK_(SERCOM1, CORE); +CLOCK_GCLK_(SERCOM2, CORE); +CLOCK_GCLK_(SERCOM3, CORE); +CLOCK_GCLK_(SERCOM4, CORE); +CLOCK_GCLK_(SERCOM5, CORE); +CLOCK(TCC0_TCC1, 1, 26); +CLOCK(TCC2_TCC3, 1, 27); +CLOCK(TC4_TC5, 1, 28); +CLOCK(TC6_TC7, 1, 29); +CLOCK_GCLK(ADC); +CLOCK_GCLK_(AC, DIG); +CLOCK_GCLK_(AC, ANA); +CLOCK_GCLK(DAC); +CLOCK_GCLK(PTC); +CLOCK_GCLK_(I2S, 0); +CLOCK_GCLK_(I2S, 1); + +CLOCK(SYSTICK, 2, 0); +#endif + +STATIC const mp_rom_map_elem_t samd_clock_global_dict_table[] = { +#ifdef SAMD21_EXPOSE_ALL_CLOCKS + CLOCK_ENTRY(XOSC), + CLOCK_ENTRY(GCLKIN), + CLOCK_ENTRY(GCLKGEN1), + CLOCK_ENTRY(OSCULP32K), +#endif + CLOCK_ENTRY(OSC32K), + CLOCK_ENTRY(XOSC32K), +#ifdef SAMD21_EXPOSE_ALL_CLOCKS + CLOCK_ENTRY(OSC8M), + CLOCK_ENTRY(DFLL48M), + CLOCK_ENTRY(DPLL96M), + CLOCK_ENTRY_(SYSCTRL, DFLL48), + CLOCK_ENTRY_(SYSCTRL, FDPLL), + CLOCK_ENTRY_(SYSCTRL, FDPLL32K), + CLOCK_ENTRY(WDT), +#endif + CLOCK_ENTRY(RTC), +#ifdef SAMD21_EXPOSE_ALL_CLOCKS + CLOCK_ENTRY(EIC), + CLOCK_ENTRY(USB), + CLOCK_ENTRY_(EVSYS, 0), + CLOCK_ENTRY_(EVSYS, 1), + CLOCK_ENTRY_(EVSYS, 2), + CLOCK_ENTRY_(EVSYS, 3), + CLOCK_ENTRY_(EVSYS, 4), + CLOCK_ENTRY_(EVSYS, 5), + CLOCK_ENTRY_(EVSYS, 6), + CLOCK_ENTRY_(EVSYS, 7), + CLOCK_ENTRY_(EVSYS, 8), + CLOCK_ENTRY_(EVSYS, 9), + CLOCK_ENTRY_(EVSYS, 10), + CLOCK_ENTRY_(EVSYS, 11), + CLOCK_ENTRY(SERCOMx_SLOW), + CLOCK_ENTRY_(SERCOM0, CORE), + CLOCK_ENTRY_(SERCOM1, CORE), + CLOCK_ENTRY_(SERCOM2, CORE), + CLOCK_ENTRY_(SERCOM3, CORE), + CLOCK_ENTRY_(SERCOM4, CORE), + CLOCK_ENTRY_(SERCOM5, CORE), + CLOCK_ENTRY(TCC0_TCC1), + CLOCK_ENTRY(TCC2_TCC3), + CLOCK_ENTRY(TC4_TC5), + CLOCK_ENTRY(TC6_TC7), + CLOCK_ENTRY(ADC), + CLOCK_ENTRY_(AC, DIG), + CLOCK_ENTRY_(AC, ANA), + CLOCK_ENTRY(DAC), + CLOCK_ENTRY(PTC), + CLOCK_ENTRY_(I2S, 0), + CLOCK_ENTRY_(I2S, 1), + + CLOCK_ENTRY(SYSTICK), +#endif +}; +MP_DEFINE_CONST_DICT(samd_clock_globals, samd_clock_global_dict_table); diff --git a/ports/atmel-samd/samd21_peripherals.c b/ports/atmel-samd/samd21_peripherals.c index a27e49e0e5..5bbac29655 100644 --- a/ports/atmel-samd/samd21_peripherals.c +++ b/ports/atmel-samd/samd21_peripherals.c @@ -24,9 +24,11 @@ * THE SOFTWARE. */ +#include "hal/include/hal_adc_sync.h" #include "hpl/gclk/hpl_gclk_base.h" #include "hpl/pm/hpl_pm_base.h" + // The clock initializer values are rather random, so we need to put them in // tables for lookup. We can't compute them. @@ -91,3 +93,21 @@ uint8_t samd_peripherals_get_spi_dopo(uint8_t clock_pad, uint8_t mosi_pad) { bool samd_peripherals_valid_spi_clock_pad(uint8_t clock_pad) { return clock_pad == 1 || clock_pad == 3; } + +// Do initialization and calibration setup needed for any use of the ADC. +// The reference and resolution should be set by the caller. +void samd_peripherals_adc_setup(struct adc_sync_descriptor *adc, Adc *instance) { + // Turn the clocks on. + _pm_enable_bus_clock(PM_BUS_APBC, ADC); + _gclk_enable_channel(ADC_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK0_Val); + + adc_sync_init(adc, instance, (void *)NULL); + + // Load the factory calibration + hri_adc_write_CALIB_BIAS_CAL_bf(ADC, (*((uint32_t*) ADC_FUSES_BIASCAL_ADDR) & ADC_FUSES_BIASCAL_Msk) >> ADC_FUSES_BIASCAL_Pos); + // Bits 7:5 + uint16_t linearity = ((*((uint32_t*) ADC_FUSES_LINEARITY_1_ADDR) & ADC_FUSES_LINEARITY_1_Msk) >> ADC_FUSES_LINEARITY_1_Pos) << 5; + // Bits 4:0 + linearity |= (*((uint32_t*) ADC_FUSES_LINEARITY_0_ADDR) & ADC_FUSES_LINEARITY_0_Msk) >> ADC_FUSES_LINEARITY_0_Pos; + hri_adc_write_CALIB_LINEARITY_CAL_bf(ADC, linearity); +} diff --git a/ports/atmel-samd/samd21_peripherals.h b/ports/atmel-samd/samd21_peripherals.h index 7a44778916..805717695a 100644 --- a/ports/atmel-samd/samd21_peripherals.h +++ b/ports/atmel-samd/samd21_peripherals.h @@ -28,9 +28,11 @@ #define MICROPY_INCLUDED_ATMEL_SAMD_SAMD21_PERIPHERALS_H #include "include/sam.h" +#include "hal/include/hal_adc_sync.h" void samd_peripherals_sercom_clock_init(Sercom* sercom, uint8_t sercom_index); uint8_t samd_peripherals_get_spi_dopo(uint8_t clock_pad, uint8_t mosi_pad); bool samd_peripherals_valid_spi_clock_pad(uint8_t clock_pad); +void samd_peripherals_adc_setup(struct adc_sync_descriptor *adc, Adc *instance); #endif // MICROPY_INCLUDED_ATMEL_SAMD_SAMD21_PERIPHERALS_H diff --git a/ports/atmel-samd/samd51_clocks.c b/ports/atmel-samd/samd51_clocks.c new file mode 100644 index 0000000000..cc3dd7917a --- /dev/null +++ b/ports/atmel-samd/samd51_clocks.c @@ -0,0 +1,86 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "clocks.h" + +#include "hpl_gclk_config.h" + +#include "shared-bindings/microcontroller/__init__.h" + +#include "py/runtime.h" + +bool gclk_enabled(uint8_t gclk) { + return GCLK->GENCTRL[gclk].bit.GENEN; +} + +void disable_gclk(uint8_t gclk) { + while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} + GCLK->GENCTRL[gclk].bit.GENEN = false; + while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} +} + +void connect_gclk_to_peripheral(uint8_t gclk, uint8_t peripheral) { + GCLK->PCHCTRL[peripheral].reg = GCLK_PCHCTRL_CHEN | GCLK_PCHCTRL_GEN(gclk); + while(GCLK->SYNCBUSY.reg != 0) {} +} + +void disconnect_gclk_from_peripheral(uint8_t gclk, uint8_t peripheral) { + GCLK->PCHCTRL[peripheral].reg = 0; +} + +void enable_clock_generator(uint8_t gclk, uint32_t source, uint16_t divisor) { + GCLK->GENCTRL[gclk].reg = GCLK_GENCTRL_SRC(source) | GCLK_GENCTRL_DIV(divisor) | GCLK_GENCTRL_GENEN; + while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} +} + +void disable_clock_generator(uint8_t gclk) { + GCLK->GENCTRL[gclk].reg = 0; + while ((GCLK->SYNCBUSY.vec.GENCTRL & (1 << gclk)) != 0) {} +} + +bool clock_get_enabled(uint8_t type, uint8_t index) { + return false; +} + +bool clock_get_parent(uint8_t type, uint8_t index, uint8_t *p_type, uint8_t *p_index) { + return false; +} + +uint32_t clock_get_frequency(uint8_t type, uint8_t index) { + return 0; +} + +uint32_t clock_get_calibration(uint8_t type, uint8_t index) { + return 0; +} + +int clock_set_calibration(uint8_t type, uint8_t index, uint32_t val) { + return -2; +} + +STATIC const mp_rom_map_elem_t samd_clock_global_dict_table[] = { +}; +MP_DEFINE_CONST_DICT(samd_clock_globals, samd_clock_global_dict_table); diff --git a/ports/atmel-samd/samd51_peripherals.c b/ports/atmel-samd/samd51_peripherals.c index 8f37bdfd11..5772b8e0ab 100644 --- a/ports/atmel-samd/samd51_peripherals.c +++ b/ports/atmel-samd/samd51_peripherals.c @@ -24,6 +24,7 @@ * THE SOFTWARE. */ +#include "hal/include/hal_adc_sync.h" #include "hpl/gclk/hpl_gclk_base.h" #include "hri/hri_mclk_d51.h" @@ -130,3 +131,47 @@ uint8_t samd_peripherals_get_spi_dopo(uint8_t clock_pad, uint8_t mosi_pad) { bool samd_peripherals_valid_spi_clock_pad(uint8_t clock_pad) { return clock_pad == 1; } + +// Do initialization and calibration setup needed for any use of the ADC. +// The reference and resolution should be set by the caller. +void samd_peripherals_adc_setup(struct adc_sync_descriptor *adc, Adc *instance) { + // Turn the clocks on. + if (instance == ADC0) { + hri_mclk_set_APBDMASK_ADC0_bit(MCLK); + hri_gclk_write_PCHCTRL_reg(GCLK, ADC0_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | (1 << GCLK_PCHCTRL_CHEN_Pos)); + } else if (instance == ADC1) { + hri_mclk_set_APBDMASK_ADC1_bit(MCLK); + hri_gclk_write_PCHCTRL_reg(GCLK, ADC1_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | (1 << GCLK_PCHCTRL_CHEN_Pos)); + } + + adc_sync_init(adc, instance, (void *)NULL); + + // SAMD51 has a CALIB register but doesn't have documented fuses for them. + uint8_t biasrefbuf; + uint8_t biasr2r; + uint8_t biascomp; + if (instance == ADC0) { + biasrefbuf = ((*(uint32_t*) ADC0_FUSES_BIASREFBUF_ADDR) & ADC0_FUSES_BIASREFBUF_Msk) >> ADC0_FUSES_BIASREFBUF_Pos; + biasr2r = ((*(uint32_t*) ADC0_FUSES_BIASR2R_ADDR) & ADC0_FUSES_BIASR2R_Msk) >> ADC0_FUSES_BIASR2R_Pos; + biascomp = ((*(uint32_t*) ADC0_FUSES_BIASCOMP_ADDR) & ADC0_FUSES_BIASCOMP_Msk) >> ADC0_FUSES_BIASCOMP_Pos; + } else { + biasrefbuf = ((*(uint32_t*) ADC1_FUSES_BIASREFBUF_ADDR) & ADC1_FUSES_BIASREFBUF_Msk) >> ADC1_FUSES_BIASREFBUF_Pos; + biasr2r = ((*(uint32_t*) ADC1_FUSES_BIASR2R_ADDR) & ADC1_FUSES_BIASR2R_Msk) >> ADC1_FUSES_BIASR2R_Pos; + biascomp = ((*(uint32_t*) ADC1_FUSES_BIASCOMP_ADDR) & ADC1_FUSES_BIASCOMP_Msk) >> ADC1_FUSES_BIASCOMP_Pos; + } + hri_adc_write_CALIB_BIASREFBUF_bf(instance, biasrefbuf); + hri_adc_write_CALIB_BIASR2R_bf(instance, biasr2r); + hri_adc_write_CALIB_BIASCOMP_bf(instance, biascomp); +} + +// Turn off cache and invalidate all data in it. +void samd_peripherals_disable_and_clear_cache(void) { + CMCC->CTRL.bit.CEN = 0; + while (CMCC->SR.bit.CSTS) {} + CMCC->MAINT0.bit.INVALL = 1; +} + +// Enable cache +void samd_peripherals_enable_cache(void) { + CMCC->CTRL.bit.CEN = 1; +} diff --git a/ports/atmel-samd/samd51_peripherals.h b/ports/atmel-samd/samd51_peripherals.h index c47e3bee76..6643379a5c 100644 --- a/ports/atmel-samd/samd51_peripherals.h +++ b/ports/atmel-samd/samd51_peripherals.h @@ -28,10 +28,14 @@ #define MICROPY_INCLUDED_ATMEL_SAMD_SAMD51_PERIPHERALS_H #include "sam.h" +#include "hal/include/hal_adc_sync.h" void samd_peripherals_sercom_clock_init(Sercom* sercom, uint8_t sercom_index); uint8_t samd_peripherals_get_spi_dopo(uint8_t clock_pad, uint8_t mosi_pad); bool samd_peripherals_valid_spi_clock_pad(uint8_t clock_pad); +void samd_peripherals_adc_setup(struct adc_sync_descriptor *adc, Adc *instance); + +void samd_peripherals_disable_and_clear_cache(void); +void samd_peripherals_enable_cache(void); #endif // MICROPY_INCLUDED_ATMEL_SAMD_SAMD51_PERIPHERALS_H - diff --git a/ports/atmel-samd/shared_dma.c b/ports/atmel-samd/shared_dma.c index 88c89abeeb..edc2d0f1a0 100644 --- a/ports/atmel-samd/shared_dma.c +++ b/ports/atmel-samd/shared_dma.c @@ -99,6 +99,8 @@ void dma_enable_channel(uint8_t channel_number) { common_hal_mcu_disable_interrupts(); /** Select the DMA channel and clear software trigger */ DMAC->CHID.reg = DMAC_CHID_ID(channel_number); + // Clear any previous interrupts. + DMAC->CHINTFLAG.reg = DMAC_CHINTFLAG_MASK; DMAC->CHCTRLA.bit.ENABLE = true; common_hal_mcu_enable_interrupts(); #endif @@ -106,6 +108,8 @@ void dma_enable_channel(uint8_t channel_number) { #ifdef SAMD51 DmacChannel* channel = &DMAC->Channel[channel_number]; channel->CHCTRLA.bit.ENABLE = true; + // Clear any previous interrupts. + channel->CHINTFLAG.reg = DMAC_CHINTFLAG_MASK; #endif } @@ -124,6 +128,37 @@ void dma_disable_channel(uint8_t channel_number) { #endif } +void dma_suspend_channel(uint8_t channel_number) { + #ifdef SAMD21 + common_hal_mcu_disable_interrupts(); + /** Select the DMA channel and clear software trigger */ + DMAC->CHID.reg = DMAC_CHID_ID(channel_number); + DMAC->CHCTRLB.bit.CMD = DMAC_CHCTRLB_CMD_SUSPEND_Val; + common_hal_mcu_enable_interrupts(); + #endif + + #ifdef SAMD51 + DmacChannel* channel = &DMAC->Channel[channel_number]; + channel->CHCTRLB.reg = DMAC_CHCTRLB_CMD_SUSPEND; + #endif +} + +void dma_resume_channel(uint8_t channel_number) { + #ifdef SAMD21 + common_hal_mcu_disable_interrupts(); + /** Select the DMA channel and clear software trigger */ + DMAC->CHID.reg = DMAC_CHID_ID(channel_number); + DMAC->CHCTRLB.bit.CMD = DMAC_CHCTRLB_CMD_RESUME_Val; + DMAC->CHINTFLAG.reg = DMAC_CHINTFLAG_SUSP; + common_hal_mcu_enable_interrupts(); + #endif + + #ifdef SAMD51 + DmacChannel* channel = &DMAC->Channel[channel_number]; + channel->CHCTRLB.reg = DMAC_CHCTRLB_CMD_RESUME; + #endif +} + bool dma_channel_enabled(uint8_t channel_number) { #ifdef SAMD21 common_hal_mcu_disable_interrupts(); diff --git a/ports/atmel-samd/shared_dma.h b/ports/atmel-samd/shared_dma.h index 5f51d404fb..03e5b276c8 100644 --- a/ports/atmel-samd/shared_dma.h +++ b/ports/atmel-samd/shared_dma.h @@ -56,6 +56,8 @@ int32_t sercom_dma_transfer(Sercom* sercom, const uint8_t* buffer_out, uint8_t* void dma_configure(uint8_t channel_number, uint8_t trigsrc, bool output_event); void dma_enable_channel(uint8_t channel_number); void dma_disable_channel(uint8_t channel_number); +void dma_suspend_channel(uint8_t channel_number); +void dma_resume_channel(uint8_t channel_number); bool dma_channel_enabled(uint8_t channel_number); uint8_t dma_transfer_status(uint8_t channel_number); DmacDescriptor* dma_descriptor(uint8_t channel_number); diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c index 3ac9cbfc96..8e6f2b1857 100644 --- a/ports/atmel-samd/supervisor/port.c +++ b/ports/atmel-samd/supervisor/port.c @@ -57,6 +57,7 @@ #include "shared-bindings/rtc/__init__.h" #include "clocks.h" #include "events.h" +#include "peripherals.h" #include "shared_dma.h" #include "tick.h" @@ -79,6 +80,14 @@ __attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_ safe_mode_t port_init(void) { #if defined(SAMD21) + + // Set brownout detection to ~2.7V. Default from factory is 1.7V, + // which is too low for proper operation of external SPI flash chips (they are 2.7-3.6V). + // Disable while changing level. + SYSCTRL->BOD33.bit.ENABLE = 0; + SYSCTRL->BOD33.bit.LEVEL = 39; // 2.77V with hysteresis off. Table 37.20 in datasheet. + SYSCTRL->BOD33.bit.ENABLE = 1; + #ifdef ENABLE_MICRO_TRACE_BUFFER REG_MTB_POSITION = ((uint32_t) (mtb - REG_MTB_BASE)) & 0xFFFFFFF8; REG_MTB_FLOW = (((uint32_t) mtb - REG_MTB_BASE) + TRACE_BUFFER_SIZE_BYTES) & 0xFFFFFFF8; @@ -90,6 +99,54 @@ safe_mode_t port_init(void) { #endif #endif +#if defined(SAMD51) + // Set brownout detection to ~2.7V. Default from factory is 1.7V, + // which is too low for proper operation of external SPI flash chips (they are 2.7-3.6V). + // Disable while changing level. + SUPC->BOD33.bit.ENABLE = 0; + SUPC->BOD33.bit.LEVEL = 200; // 2.7V: 1.5V + LEVEL * 6mV. + SUPC->BOD33.bit.ENABLE = 1; + + // MPU (Memory Protection Unit) setup. + // We hoped we could make the QSPI region be non-cachable with the MPU, + // but the CMCC doesn't seem to pay attention to the MPU settings. + // Leaving this code here disabled, + // because it was hard enough to figure out, and maybe there's + // a mistake that could make it work in the future. +#if 0 + // Designate QSPI memory mapped region as not cachable. + + // Turn off MPU in case it is on. + MPU->CTRL = 0; + // Configure region 0. + MPU->RNR = 0; + // Region base: start of QSPI mapping area. + // QSPI region runs from 0x04000000 up to and not including 0x05000000: 16 megabytes + MPU->RBAR = QSPI_AHB; + MPU->RASR = + 0b011 << MPU_RASR_AP_Pos | // full read/write access for privileged and user mode + 0b000 << MPU_RASR_TEX_Pos | // caching not allowed, strongly ordered + 1 << MPU_RASR_S_Pos | // sharable + 0 << MPU_RASR_C_Pos | // not cachable + 0 << MPU_RASR_B_Pos | // not bufferable + 0b10111 << MPU_RASR_SIZE_Pos | // 16MB region size + 1 << MPU_RASR_ENABLE_Pos // enable this region + ; + // Turn off regions 1-7. + for (uint32_t i = 1; i < 8; i ++) { + MPU->RNR = i; + MPU->RBAR = 0; + MPU->RASR = 0; + } + + // Turn on MPU. Turn on PRIVDEFENA, which defines a default memory + // map for all privileged access, so we don't have to set up other regions + // besides QSPI. + MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk; +#endif + + samd_peripherals_enable_cache(); +#endif // On power on start or external reset, set _ezero to the canary word. If it // gets killed, we boot in safe mode. _ezero is the boundary between statically @@ -120,8 +177,14 @@ safe_mode_t port_init(void) { } #endif +#ifdef SAMD21 + hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2); + _pm_init(); + clock_init(); +#endif +#ifdef SAMD51 init_mcu(); - +#endif board_init(); // Configure millisecond timer initialization. diff --git a/ports/atmel-samd/tick.c b/ports/atmel-samd/tick.c index f5fd57f5d3..27b5f05b44 100644 --- a/ports/atmel-samd/tick.c +++ b/ports/atmel-samd/tick.c @@ -52,21 +52,21 @@ void SysTick_Handler(void) { void tick_init() { uint32_t ticks_per_ms = common_hal_mcu_processor_get_frequency() / 1000; - SysTick_Config(ticks_per_ms); + SysTick_Config(ticks_per_ms-1); NVIC_EnableIRQ(SysTick_IRQn); } void tick_delay(uint32_t us) { uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000; - uint32_t us_between_ticks = SysTick->VAL / ticks_per_us; - uint64_t start_ms = ticks_ms; - while (us > 1000) { - while (ticks_ms == start_ms) {} - us -= us_between_ticks; - start_ms = ticks_ms; - us_between_ticks = 1000; + uint32_t us_until_next_tick = SysTick->VAL / ticks_per_us; + uint32_t start_tick; + while (us >= us_until_next_tick) { + start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET + while (SysTick->VAL < start_tick) {} + us -= us_until_next_tick; + us_until_next_tick = 1000; } - while (SysTick->VAL > ((us_between_ticks - us) * ticks_per_us)) {} + while (SysTick->VAL > ((us_until_next_tick - us) * ticks_per_us)) {} } // us counts down! diff --git a/ports/atmel-samd/tools/gen_usb_descriptor.py b/ports/atmel-samd/tools/gen_usb_descriptor.py index 4669110fb7..efa8124bfa 100644 --- a/ports/atmel-samd/tools/gen_usb_descriptor.py +++ b/ports/atmel-samd/tools/gen_usb_descriptor.py @@ -7,6 +7,7 @@ import sys sys.path.append("../../tools/usb_descriptor") from adafruit_usb_descriptor import cdc, hid, msc, standard, util +import hid_report_descriptors parser = argparse.ArgumentParser(description='Generate USB descriptors.') parser.add_argument('--manufacturer', type=str, @@ -122,19 +123,29 @@ msc_interfaces = [ standard.EndpointDescriptor( description="MSC in", bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN, - bmAttributes=standard.EndpointDescriptor.TYPE_BULK), + bmAttributes=standard.EndpointDescriptor.TYPE_BULK, + bInterval=0), standard.EndpointDescriptor( description="MSC out", bEndpointAddress=0x1 | standard.EndpointDescriptor.DIRECTION_OUT, - bmAttributes=standard.EndpointDescriptor.TYPE_BULK) + bmAttributes=standard.EndpointDescriptor.TYPE_BULK, + bInterval=0) ] ) ] -hid_report_descriptor = hid.ReportDescriptor.MOUSE_KEYBOARD_CONSUMER_SYS_CONTROL_REPORT -hid_report_ids = hid.ReportDescriptor.REPORT_IDS -hid_report_lengths = hid.ReportDescriptor.REPORT_LENGTHS -hid_max_report_length = max(hid_report_lengths.values()) +# Include only these HID devices. +# DIGITIZER works on Linux but conflicts with MOUSE, so leave it out for now. +hid_devices = ("KEYBOARD", "MOUSE", "CONSUMER", "GAMEPAD") + +combined_hid_report_descriptor = hid.ReportDescriptor( + description="MULTIDEVICE", + report_descriptor=b''.join( + hid_report_descriptors.REPORT_DESCRIPTORS[name].report_descriptor for name in hid_devices )) + +hid_report_ids_dict = { name: hid_report_descriptors.REPORT_IDS[name] for name in hid_devices } +hid_report_lengths_dict = { name: hid_report_descriptors.REPORT_LENGTHS[name] for name in hid_devices } +hid_max_report_length = max(hid_report_lengths_dict.values()) # ASF4 expects keyboard and generic devices to have both in and out endpoints, # and will fail (possibly silently) if both are not supplied. @@ -142,12 +153,13 @@ hid_endpoint_in_descriptor = standard.EndpointDescriptor( description="HID in", bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN, bmAttributes=standard.EndpointDescriptor.TYPE_INTERRUPT, - bInterval=0x02) + bInterval=10) hid_endpoint_out_descriptor = standard.EndpointDescriptor( description="HID out", bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_OUT, - bmAttributes=standard.EndpointDescriptor.TYPE_INTERRUPT) + bmAttributes=standard.EndpointDescriptor.TYPE_INTERRUPT, + bInterval=10) hid_interfaces = [ standard.InterfaceDescriptor( @@ -159,7 +171,7 @@ hid_interfaces = [ subdescriptors=[ hid.HIDDescriptor( description="HID", - wDescriptorLength=len(bytes(hid_report_descriptor))), + wDescriptorLength=len(bytes(combined_hid_report_descriptor))), hid_endpoint_in_descriptor, hid_endpoint_out_descriptor, ] @@ -274,7 +286,7 @@ uint8_t hid_report_descriptor[{HID_REPORT_DESCRIPTOR_LENGTH}]; """ .format(SERIAL_NUMBER_OFFSET=serial_number_offset, SERIAL_NUMBER_LENGTH=args.serial_number_length, - HID_REPORT_DESCRIPTOR_LENGTH=len(bytes(hid_report_descriptor)), + HID_REPORT_DESCRIPTOR_LENGTH=len(bytes(combined_hid_report_descriptor)), HID_ENDPOINT_IN_ADDRESS=hex(hid_endpoint_in_descriptor.bEndpointAddress), HID_ENDPOINT_OUT_ADDRESS=hex(hid_endpoint_out_descriptor.bEndpointAddress))) @@ -294,7 +306,7 @@ for interface in interfaces: h_file.write("\n") # #define the report ID's used in the combined HID descriptor -for name, id in hid_report_ids.items(): +for name, id in hid_report_ids_dict.items(): h_file.write("""\ #define USB_HID_REPORT_ID_{NAME} {ID} """.format(NAME=name, @@ -303,7 +315,7 @@ for name, id in hid_report_ids.items(): h_file.write("\n") # #define the report sizes used in the combined HID descriptor -for name, length in hid_report_lengths.items(): +for name, length in hid_report_lengths_dict.items(): h_file.write("""\ #define USB_HID_REPORT_LENGTH_{NAME} {LENGTH} """.format(NAME=name, @@ -314,7 +326,7 @@ h_file.write("\n") h_file.write("""\ #define USB_HID_NUM_DEVICES {NUM_DEVICES} #define USB_HID_MAX_REPORT_LENGTH {MAX_LENGTH} -""".format(NUM_DEVICES=len(hid_report_lengths), +""".format(NUM_DEVICES=len(hid_report_lengths_dict), MAX_LENGTH=hid_max_report_length)) @@ -322,9 +334,9 @@ h_file.write("""\ # Write out the report descriptor and info c_file.write("""\ uint8_t hid_report_descriptor[{HID_DESCRIPTOR_LENGTH}] = {{ -""".format(HID_DESCRIPTOR_LENGTH=len(bytes(hid_report_descriptor)))) +""".format(HID_DESCRIPTOR_LENGTH=len(bytes(combined_hid_report_descriptor)))) -for b in bytes(hid_report_descriptor): +for b in bytes(combined_hid_report_descriptor): c_file.write("0x{:02x}, ".format(b)) c_file.write(""" }; diff --git a/ports/atmel-samd/tools/hid_report_descriptors.py b/ports/atmel-samd/tools/hid_report_descriptors.py new file mode 100644 index 0000000000..f3b28ebcf3 --- /dev/null +++ b/ports/atmel-samd/tools/hid_report_descriptors.py @@ -0,0 +1,239 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 Dan Halbert for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import struct + +""" +HID specific descriptors +======================== + +* Author(s): Dan Halbert +""" + +from adafruit_usb_descriptor import hid + +REPORT_IDS = { + "KEYBOARD" : 1, + "MOUSE" : 2, + "CONSUMER" : 3, + "SYS_CONTROL" : 4, + "GAMEPAD" : 5, + "DIGITIZER" : 6, + } + +# Byte count for each kind of report. Length does not include report ID in first byte. +REPORT_LENGTHS = { + "KEYBOARD" : 8, + "MOUSE" : 4, + "CONSUMER" : 2, + "SYS_CONTROL" : 1, + "GAMEPAD" : 6, + "DIGITIZER" : 5, + } + +KEYBOARD_WITH_ID = hid.ReportDescriptor( + description="KEYBOARD", + report_descriptor=bytes([ + # Regular keyboard + 0x05, 0x01, # Usage Page (Generic Desktop) + 0x09, 0x06, # Usage (Keyboard) + 0xA1, 0x01, # Collection (Application) + 0x85, REPORT_IDS["KEYBOARD"], # Report ID (1) + 0x05, 0x07, # Usage Page (Keyboard) + 0x19, 224, # Usage Minimum (224) + 0x29, 231, # Usage Maximum (231) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0x01, # Logical Maximum (1) + 0x75, 0x01, # Report Size (1) + 0x95, 0x08, # Report Count (8) + 0x81, 0x02, # Input (Data, Variable, Absolute) + 0x81, 0x01, # Input (Constant) + 0x19, 0x00, # Usage Minimum (0) + 0x29, 101, # Usage Maximum (101) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 101, # Logical Maximum (101) + 0x75, 0x08, # Report Size (8) + 0x95, 0x06, # Report Count (6) + 0x81, 0x00, # Input (Data, Array) + 0x05, 0x08, # Usage Page (LED) + 0x19, 0x01, # Usage Minimum (1) + 0x29, 0x05, # Usage Maximum (5) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0x01, # Logical Maximum (1) + 0x75, 0x01, # Report Size (1) + 0x95, 0x05, # Report Count (5) + 0x91, 0x02, # Output (Data, Variable, Absolute) + 0x95, 0x03, # Report Count (3) + 0x91, 0x01, # Output (Constant) + 0xC0, # End Collection + ])) + +MOUSE_WITH_ID = hid.ReportDescriptor( + description="MOUSE", + report_descriptor=bytes([ + # Regular mouse + 0x05, 0x01, # Usage Page (Generic Desktop) + 0x09, 0x02, # Usage (Mouse) + 0xA1, 0x01, # Collection (Application) + 0x09, 0x01, # Usage (Pointer) + 0xA1, 0x00, # Collection (Physical) + 0x85, REPORT_IDS["MOUSE"], # Report ID (n) + 0x05, 0x09, # Usage Page (Button) + 0x19, 0x01, # Usage Minimum (0x01) + 0x29, 0x05, # Usage Maximum (0x05) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0x01, # Logical Maximum (1) + 0x95, 0x05, # Report Count (5) + 0x75, 0x01, # Report Size (1) + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x95, 0x01, # Report Count (1) + 0x75, 0x03, # Report Size (3) + 0x81, 0x01, # Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x09, 0x30, # Usage (X) + 0x09, 0x31, # Usage (Y) + 0x15, 0x81, # Logical Minimum (-127) + 0x25, 0x7F, # Logical Maximum (127) + 0x75, 0x08, # Report Size (8) + 0x95, 0x02, # Report Count (2) + 0x81, 0x06, # Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position) + 0x09, 0x38, # Usage (Wheel) + 0x15, 0x81, # Logical Minimum (-127) + 0x25, 0x7F, # Logical Maximum (127) + 0x75, 0x08, # Report Size (8) + 0x95, 0x01, # Report Count (1) + 0x81, 0x06, # Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position) + 0xC0, # End Collection + 0xC0, # End Collection + ])) + +CONSUMER_WITH_ID = hid.ReportDescriptor( + description="CONSUMER", + report_descriptor=bytes([ + # Consumer ("multimedia") keys + 0x05, 0x0C, # Usage Page (Consumer) + 0x09, 0x01, # Usage (Consumer Control) + 0xA1, 0x01, # Collection (Application) + 0x85, REPORT_IDS["CONSUMER"], # Report ID (n) + 0x75, 0x10, # Report Size (16) + 0x95, 0x01, # Report Count (1) + 0x15, 0x01, # Logical Minimum (1) + 0x26, 0x8C, 0x02, # Logical Maximum (652) + 0x19, 0x01, # Usage Minimum (Consumer Control) + 0x2A, 0x8C, 0x02, # Usage Maximum (AC Send) + 0x81, 0x00, # Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0xC0, # End Collection + ])) + +SYS_CONTROL_WITH_ID = hid.ReportDescriptor( + description="SYS_CONTROL", + report_descriptor=bytes([ + # Power controls + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x09, 0x80, # Usage (Sys Control) + 0xA1, 0x01, # Collection (Application) + 0x85, REPORT_IDS["SYS_CONTROL"], # Report ID (n) + 0x75, 0x02, # Report Size (2) + 0x95, 0x01, # Report Count (1) + 0x15, 0x01, # Logical Minimum (1) + 0x25, 0x03, # Logical Maximum (3) + 0x09, 0x82, # Usage (Sys Sleep) + 0x09, 0x81, # Usage (Sys Power Down) + 0x09, 0x83, # Usage (Sys Wake Up) + 0x81, 0x60, # Input (Data,Array,Abs,No Wrap,Linear,No Preferred State,Null State) + 0x75, 0x06, # Report Size (6) + 0x81, 0x03, # Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0xC0, # End Collection + ])) + +GAMEPAD_WITH_ID = hid.ReportDescriptor( + description="GAMEPAD", + report_descriptor=bytes([ + # Gamepad with 16 buttons and two joysticks + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, # Usage (Game Pad) + 0xA1, 0x01, # Collection (Application) + 0x85, REPORT_IDS["GAMEPAD"], # Report ID (n) + 0x05, 0x09, # Usage Page (Button) + 0x19, 0x01, # Usage Minimum (Button 1) + 0x29, 0x10, # Usage Maximum (Button 16) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0x01, # Logical Maximum (1) + 0x75, 0x01, # Report Size (1) + 0x95, 0x10, # Report Count (16) + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x15, 0x81, # Logical Minimum (-127) + 0x25, 0x7F, # Logical Maximum (127) + 0x09, 0x30, # Usage (X) + 0x09, 0x31, # Usage (Y) + 0x09, 0x32, # Usage (Z) + 0x09, 0x35, # Usage (Rz) + 0x75, 0x08, # Report Size (8) + 0x95, 0x04, # Report Count (4) + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0xC0, # End Collection + ])) + +DIGITIZER_WITH_ID = hid.ReportDescriptor( + description="DIGITIZER", + report_descriptor=bytes([ + # Digitizer (used as an absolute pointer) + 0x05, 0x0D, # Usage Page (Digitizers) + 0x09, 0x02, # Usage (Pen) + 0xA1, 0x01, # Collection (Application) + 0x85, REPORT_IDS["DIGITIZER"], # Report ID (n) + 0x09, 0x01, # Usage (Stylus) + 0xA1, 0x00, # Collection (Physical) + 0x09, 0x32, # Usage (In-Range) + 0x09, 0x42, # Usage (Tip Switch) + 0x09, 0x44, # Usage (Barrel Switch) + 0x09, 0x45, # Usage (Eraser Switch) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0x01, # Logical Maximum (1) + 0x75, 0x01, # Report Size (1) + 0x95, 0x04, # Report Count (4) + 0x81, 0x02, # Input (Data,Var,Abs) + 0x75, 0x04, # Report Size (4) -- Filler + 0x95, 0x01, # Report Count (1) -- Filler + 0x81, 0x01, # Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x15, 0x00, # Logical Minimum (0) + 0x26, 0xff, 0x7f, # Logical Maximum (32767) + 0x09, 0x30, # Usage (X) + 0x09, 0x31, # Usage (Y) + 0x75, 0x10, # Report Size (16) + 0x95, 0x02, # Report Count (2) + 0x81, 0x02, # Input (Data,Var,Abs) + 0xC0, # End Collection + 0xC0, # End Collection + ])) + +# Byte count for each kind of report. Length does not include report ID in first byte. +REPORT_DESCRIPTORS = { + "KEYBOARD" : KEYBOARD_WITH_ID, + "MOUSE" : MOUSE_WITH_ID, + "CONSUMER" : CONSUMER_WITH_ID, + "SYS_CONTROL" : SYS_CONTROL_WITH_ID, + "GAMEPAD" : GAMEPAD_WITH_ID, + "DIGITIZER" : DIGITIZER_WITH_ID, + } diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile index 06439a19ea..8fabd3412a 100644 --- a/ports/esp8266/Makefile +++ b/ports/esp8266/Makefile @@ -32,6 +32,7 @@ FLASH_MODE ?= qio FLASH_SIZE ?= detect CROSS_COMPILE = xtensa-lx106-elf- ESP_SDK = $(shell $(CC) -print-sysroot)/usr +ESPTOOL = esptool.py INC += -I. INC += -I$(TOP) @@ -230,18 +231,18 @@ FROZEN_EXTRA_DEPS = $(CONFVARS_FILE) deploy: $(BUILD)/firmware-combined.bin $(ECHO) "Writing $< to the board" - $(Q)esptool.py --port $(PORT) --baud $(BAUD) write_flash --verify --flash_size=$(FLASH_SIZE) --flash_mode=$(FLASH_MODE) 0 $< + $(Q)$(ESPTOOL) --port $(PORT) --baud $(BAUD) write_flash --verify --flash_size=$(FLASH_SIZE) --flash_mode=$(FLASH_MODE) 0 $< erase: $(ECHO) "Erase flash" - $(Q)esptool.py --port $(PORT) --baud $(BAUD) erase_flash + $(Q)$(ESPTOOL) --port $(PORT) --baud $(BAUD) erase_flash reset: echo -e "\r\nimport machine; machine.reset()\r\n" >$(PORT) $(FWBIN): $(BUILD)/firmware.elf $(ECHO) "Create $@" - $(Q)python2 $(shell which esptool.py) elf2image $^ + $(Q)$(ESPTOOL) elf2image $^ $(Q)$(PYTHON) makeimg.py $(BUILD)/firmware.elf-0x00000.bin $(BUILD)/firmware.elf-0x[0-5][1-f]000.bin $@ diff --git a/ports/esp8266/common-hal/analogio/AnalogIn.c b/ports/esp8266/common-hal/analogio/AnalogIn.c index d3a81272ee..e01eceabd7 100644 --- a/ports/esp8266/common-hal/analogio/AnalogIn.c +++ b/ports/esp8266/common-hal/analogio/AnalogIn.c @@ -36,14 +36,12 @@ #include "user_interface.h" -volatile bool adc_in_use __attribute__((aligned(4))) = false; - void common_hal_analogio_analogin_construct(analogio_analogin_obj_t* self, const mcu_pin_obj_t *pin) { if (pin != &pin_TOUT) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Pin %q does not have ADC capabilities", pin->name)); } - adc_in_use = true; + claim_pin(pin); } bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t* self) { @@ -54,7 +52,7 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t* self) { if (common_hal_analogio_analogin_deinited(self)) { return; } - adc_in_use = false; + reset_pin(&pin_TOUT); self->deinited = true; } diff --git a/ports/esp8266/common-hal/digitalio/DigitalInOut.c b/ports/esp8266/common-hal/digitalio/DigitalInOut.c index 7101e64145..96945737b3 100644 --- a/ports/esp8266/common-hal/digitalio/DigitalInOut.c +++ b/ports/esp8266/common-hal/digitalio/DigitalInOut.c @@ -33,11 +33,21 @@ #include "py/mphal.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "common-hal/microcontroller/Pin.h" + +extern volatile bool gpio16_in_use; digitalinout_result_t common_hal_digitalio_digitalinout_construct( digitalio_digitalinout_obj_t* self, const mcu_pin_obj_t* pin) { self->pin = pin; - PIN_FUNC_SELECT(self->pin->peripheral, self->pin->gpio_function); + if (self->pin->gpio_number == 16) { + WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | 1); // mux configuration for XPD_DCDC and rtc_gpio0 connection + WRITE_PERI_REG(RTC_GPIO_CONF, READ_PERI_REG(RTC_GPIO_CONF) & ~1); //mux configuration for out enable + WRITE_PERI_REG(RTC_GPIO_ENABLE, READ_PERI_REG(RTC_GPIO_ENABLE) & ~1); //out disable + claim_pin(pin); + } else { + PIN_FUNC_SELECT(self->pin->peripheral, self->pin->gpio_function); + } return DIGITALINOUT_OK; } @@ -54,6 +64,8 @@ void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t* self gpio_output_set(0x0, 0x0, 0x0, pin_mask); PIN_FUNC_SELECT(self->pin->peripheral, 0); PIN_PULLUP_DIS(self->pin->peripheral); + } else { + reset_pin(self->pin); } self->pin = mp_const_none; } @@ -96,6 +108,23 @@ digitalio_direction_t common_hal_digitalio_digitalinout_get_direction( void common_hal_digitalio_digitalinout_set_value( digitalio_digitalinout_obj_t* self, bool value) { + if (self->pin->gpio_number == 16) { + if (self->open_drain && value) { + // configure GPIO16 as input with output register holding 0 + WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | 1); + WRITE_PERI_REG(RTC_GPIO_CONF, READ_PERI_REG(RTC_GPIO_CONF) & ~1); + WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & ~1)); // input + WRITE_PERI_REG(RTC_GPIO_OUT, (READ_PERI_REG(RTC_GPIO_OUT) & 1)); // out=1 + return; + } else { + int out_en = self->output; + WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | 1); + WRITE_PERI_REG(RTC_GPIO_CONF, READ_PERI_REG(RTC_GPIO_CONF) & ~1); + WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & ~1) | out_en); + WRITE_PERI_REG(RTC_GPIO_OUT, (READ_PERI_REG(RTC_GPIO_OUT) & ~1) | value); + return; + } + } if (value) { if (self->open_drain) { // Disable output. @@ -125,11 +154,19 @@ bool common_hal_digitalio_digitalinout_get_value( } return GPIO_INPUT_GET(self->pin->gpio_number); } else { - uint32_t pin_mask = 1 << self->pin->gpio_number; - if (self->open_drain && ((*PIN_DIR) & pin_mask) == 0) { - return true; + if (self->pin->gpio_number == 16) { + if (self->open_drain && READ_PERI_REG(RTC_GPIO_ENABLE) == 0) { + return true; + } else { + return READ_PERI_REG(RTC_GPIO_OUT) & 1; + } } else { - return ((*PIN_OUT) & pin_mask) != 0; + uint32_t pin_mask = 1 << self->pin->gpio_number; + if (self->open_drain && ((*PIN_DIR) & pin_mask) == 0) { + return true; + } else { + return ((*PIN_OUT) & pin_mask) != 0; + } } } } @@ -163,8 +200,14 @@ void common_hal_digitalio_digitalinout_set_pull( return; } if (self->pin->gpio_number == 16) { - nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, - "Pin does not support pull.")); + // PULL_DOWN is the only hardware pull direction available on GPIO16. + // since we don't support pull down, just return without attempting + // to set pull (which won't work anyway). If PULL_UP is requested, + // raise the exception so the user knows PULL_UP is not available + if (pull != PULL_NONE){ + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, + "GPIO16 does not support pull up.")); + } return; } if (pull == PULL_NONE) { diff --git a/ports/esp8266/common-hal/microcontroller/Pin.c b/ports/esp8266/common-hal/microcontroller/Pin.c index 5c90f4f1a0..6d2af2d2e8 100644 --- a/ports/esp8266/common-hal/microcontroller/Pin.c +++ b/ports/esp8266/common-hal/microcontroller/Pin.c @@ -32,23 +32,49 @@ #include "eagle_soc.h" -extern volatile bool adc_in_use; +bool adc_in_use; +bool gpio16_in_use; bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) { if (pin == &pin_TOUT) { return !adc_in_use; } - if (pin->gpio_number == NO_GPIO || pin->gpio_number == SPECIAL_CASE) { + if (pin == &pin_XPD_DCDC) { + return !gpio16_in_use; + } + if (pin->gpio_number == NO_GPIO) { return false; } return (READ_PERI_REG(pin->peripheral) & (PERIPHS_IO_MUX_FUNC<gpio_number)) == 0 && - (READ_PERI_REG(pin->peripheral) & PERIPHS_IO_MUX_PULLUP) == 0; + (READ_PERI_REG(pin->peripheral) & PERIPHS_IO_MUX_PULLUP) == 0; +} + +void claim_pin(const mcu_pin_obj_t* pin) { + if (pin == &pin_XPD_DCDC) { + gpio16_in_use = true; + } + if (pin == &pin_TOUT) { + adc_in_use = true; + } +} + +void reset_pin(const mcu_pin_obj_t* pin) { + if (pin == &pin_XPD_DCDC) { + // Set GPIO16 as input + WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | 1); // mux configuration for XPD_DCDC and rtc_gpio0 connection + WRITE_PERI_REG(RTC_GPIO_CONF, READ_PERI_REG(RTC_GPIO_CONF) & ~1); //mux configuration for out enable + WRITE_PERI_REG(RTC_GPIO_ENABLE, READ_PERI_REG(RTC_GPIO_ENABLE) & ~1); //out disable + gpio16_in_use = false; + } + if (pin == &pin_TOUT) { + adc_in_use = false; + } } void reset_pins(void) { - for (int i = 0; i < 17; i++) { + for (int i = 0; i < 16; i++) { // 5 is RXD, 6 is TXD if ((i > 4 && i < 13) || i == 12) { continue; @@ -59,4 +85,11 @@ void reset_pins(void) { // Disable the pin. gpio_output_set(0x0, 0x0, 0x0, 1 << i); } -} + // Set GPIO16 as input + WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | 1); // mux configuration for XPD_DCDC and rtc_gpio0 connection + WRITE_PERI_REG(RTC_GPIO_CONF, READ_PERI_REG(RTC_GPIO_CONF) & ~1); //mux configuration for out enable + WRITE_PERI_REG(RTC_GPIO_ENABLE, READ_PERI_REG(RTC_GPIO_ENABLE) & ~1); //out disable + + adc_in_use = false; + gpio16_in_use = false; +} \ No newline at end of file diff --git a/ports/esp8266/common-hal/microcontroller/Pin.h b/ports/esp8266/common-hal/microcontroller/Pin.h index 405557ddc9..3aa290bbd3 100644 --- a/ports/esp8266/common-hal/microcontroller/Pin.h +++ b/ports/esp8266/common-hal/microcontroller/Pin.h @@ -41,6 +41,8 @@ typedef struct { #define NO_GPIO 0xff #define SPECIAL_CASE 0xfe +void claim_pin(const mcu_pin_obj_t* pin); +void reset_pin(const mcu_pin_obj_t* pin); void reset_pins(void); #endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_MICROCONTROLLER_PIN_H diff --git a/ports/esp8266/modnetwork.c b/ports/esp8266/modnetwork.c index b41a11f596..ff2172d422 100644 --- a/ports/esp8266/modnetwork.c +++ b/ports/esp8266/modnetwork.c @@ -410,8 +410,11 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs return mp_obj_new_bytes(mac, sizeof(mac)); } case QS(MP_QSTR_essid): - req_if = SOFTAP_IF; - val = mp_obj_new_str((char*)cfg.ap.ssid, cfg.ap.ssid_len, false); + if (self->if_id == STATION_IF) { + val = mp_obj_new_str((char*)cfg.sta.ssid, strlen((char*)cfg.sta.ssid), false); + } else { + val = mp_obj_new_str((char*)cfg.ap.ssid, cfg.ap.ssid_len, false); + } break; case QS(MP_QSTR_hidden): req_if = SOFTAP_IF; diff --git a/ports/esp8266/modules/inisetup.py b/ports/esp8266/modules/inisetup.py index 192ff5ea84..46f0892484 100644 --- a/ports/esp8266/modules/inisetup.py +++ b/ports/esp8266/modules/inisetup.py @@ -3,9 +3,13 @@ import network import storage def wifi(): - import ubinascii + try: + import ubinascii as binascii + except ImportError: + import binascii + ap_if = network.WLAN(network.AP_IF) - essid = b"MicroPython-%s" % ubinascii.hexlify(ap_if.config("mac")[-3:]) + essid = b"MicroPython-%s" % binascii.hexlify(ap_if.config("mac")[-3:]) ap_if.config(essid=essid, authmode=network.AUTH_WPA_WPA2_PSK, password=b"micropythoN") def check_bootsec(): diff --git a/ports/esp8266/modutime.c b/ports/esp8266/modutime.c index ab9cb7dc23..64ecefb41f 100644 --- a/ports/esp8266/modutime.c +++ b/ports/esp8266/modutime.c @@ -75,7 +75,7 @@ STATIC mp_obj_t time_localtime(size_t n_args, const mp_obj_t *args) { }; return mp_obj_new_tuple(8, tuple); } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(time_localtime_obj, 0, 1, time_localtime); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(utime_localtime_obj, 0, 1, time_localtime); /// \function mktime() /// This is inverse function of localtime. It's argument is a full 8-tuple @@ -95,7 +95,7 @@ STATIC mp_obj_t time_mktime(mp_obj_t tuple) { mp_obj_get_int(elem[1]), mp_obj_get_int(elem[2]), mp_obj_get_int(elem[3]), mp_obj_get_int(elem[4]), mp_obj_get_int(elem[5]))); } -MP_DEFINE_CONST_FUN_OBJ_1(time_mktime_obj, time_mktime); +MP_DEFINE_CONST_FUN_OBJ_1(utime_mktime_obj, time_mktime); /// \function time() /// Returns the number of seconds, as an integer, since 1/1/2000. @@ -103,13 +103,13 @@ STATIC mp_obj_t time_time(void) { // get date and time return mp_obj_new_int(pyb_rtc_get_us_since_2000() / 1000 / 1000); } -MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time); +MP_DEFINE_CONST_FUN_OBJ_0(utime_time_obj, time_time); STATIC const mp_rom_map_elem_t time_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) }, - { MP_ROM_QSTR(MP_QSTR_localtime), MP_ROM_PTR(&time_localtime_obj) }, - { MP_ROM_QSTR(MP_QSTR_mktime), MP_ROM_PTR(&time_mktime_obj) }, + { MP_ROM_QSTR(MP_QSTR_localtime), MP_ROM_PTR(&utime_localtime_obj) }, + { MP_ROM_QSTR(MP_QSTR_mktime), MP_ROM_PTR(&utime_mktime_obj) }, { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) }, { MP_ROM_QSTR(MP_QSTR_sleep_ms), MP_ROM_PTR(&mp_utime_sleep_ms_obj) }, { MP_ROM_QSTR(MP_QSTR_sleep_us), MP_ROM_PTR(&mp_utime_sleep_us_obj) }, @@ -118,7 +118,7 @@ STATIC const mp_rom_map_elem_t time_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_ticks_cpu), MP_ROM_PTR(&mp_utime_ticks_cpu_obj) }, { MP_ROM_QSTR(MP_QSTR_ticks_add), MP_ROM_PTR(&mp_utime_ticks_add_obj) }, { MP_ROM_QSTR(MP_QSTR_ticks_diff), MP_ROM_PTR(&mp_utime_ticks_diff_obj) }, - { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&time_time_obj) }, + { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&utime_time_obj) }, }; STATIC MP_DEFINE_CONST_DICT(time_module_globals, time_module_globals_table); diff --git a/ports/nrf/mpconfigport.h b/ports/nrf/mpconfigport.h index 45c82439b3..a463108b87 100644 --- a/ports/nrf/mpconfigport.h +++ b/ports/nrf/mpconfigport.h @@ -112,7 +112,7 @@ #define MICROPY_PY_IO (0) #define MICROPY_PY_IO_FILEIO (0) #define MICROPY_PY_UERRNO (0) -#define MICROPY_PY_UBINASCII (0) +#define MICROPY_PY_UBINASCII (1) #define MICROPY_PY_URANDOM (0) #define MICROPY_PY_URANDOM_EXTRA_FUNCS (0) #define MICROPY_PY_UCTYPES (0) @@ -120,14 +120,14 @@ #define MICROPY_PY_UJSON (0) #define MICROPY_PY_URE (0) #define MICROPY_PY_UHEAPQ (0) -#define MICROPY_PY_UHASHLIB (0) +#define MICROPY_PY_UHASHLIB (1) #define MICROPY_PY_UTIME_MP_HAL (1) #define MICROPY_PY_STRUCT (0) #define MICROPY_PY_MACHINE (1) #define MICROPY_PY_MACHINE_PULSE (0) #define MICROPY_PY_MACHINE_I2C_MAKE_NEW machine_hard_i2c_make_new #define MICROPY_PY_MACHINE_SPI (0) -#define MICROPY_PY_FRAMEBUF (0) +#define MICROPY_PY_FRAMEBUF (1) #define MICROPY_KBD_EXCEPTION (1) @@ -330,6 +330,6 @@ extern const struct _mp_obj_module_t ble_module; #include #define MICROPY_PIN_DEFS_PORT_H "pin_defs_nrf5.h" -#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt" +//#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt" #endif diff --git a/py/makeversionhdr.py b/py/makeversionhdr.py index ebd887445b..1f82d59339 100644 --- a/py/makeversionhdr.py +++ b/py/makeversionhdr.py @@ -52,7 +52,7 @@ def get_version_info_from_git(): return git_tag, git_hash, ver def get_version_info_from_docs_conf(): - with open(os.path.join(os.path.dirname(sys.argv[0]), "..", "docs", "conf.py")) as f: + with open(os.path.join(os.path.dirname(sys.argv[0]), "..", "conf.py")) as f: for line in f: if line.startswith("version = release = '"): ver = line.strip().split(" = ")[2].strip("'") diff --git a/py/modcollections.c b/py/modcollections.c index 1a1560387a..837ec2f92d 100644 --- a/py/modcollections.c +++ b/py/modcollections.c @@ -29,7 +29,7 @@ #if MICROPY_PY_COLLECTIONS STATIC const mp_rom_map_elem_t mp_module_collections_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ucollections) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_collections) }, { MP_ROM_QSTR(MP_QSTR_namedtuple), MP_ROM_PTR(&mp_namedtuple_obj) }, #if MICROPY_PY_COLLECTIONS_ORDEREDDICT { MP_ROM_QSTR(MP_QSTR_OrderedDict), MP_ROM_PTR(&mp_type_ordereddict) }, diff --git a/py/objmodule.c b/py/objmodule.c index 86e37850ef..e3464ecfa8 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -151,7 +151,7 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { { MP_ROM_QSTR(MP_QSTR_uio), MP_ROM_PTR(&mp_module_io) }, #endif #if MICROPY_PY_COLLECTIONS - { MP_ROM_QSTR(MP_QSTR_ucollections), MP_ROM_PTR(&mp_module_collections) }, + { MP_ROM_QSTR(MP_QSTR_collections), MP_ROM_PTR(&mp_module_collections) }, #endif #if MICROPY_PY_STRUCT { MP_ROM_QSTR(MP_QSTR_ustruct), MP_ROM_PTR(&mp_module_ustruct) }, @@ -199,10 +199,10 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { { MP_ROM_QSTR(MP_QSTR_utimeq), MP_ROM_PTR(&mp_module_utimeq) }, #endif #if MICROPY_PY_UHASHLIB - { MP_ROM_QSTR(MP_QSTR_uhashlib), MP_ROM_PTR(&mp_module_uhashlib) }, + { MP_ROM_QSTR(MP_QSTR_hashlib), MP_ROM_PTR(&mp_module_uhashlib) }, #endif #if MICROPY_PY_UBINASCII - { MP_ROM_QSTR(MP_QSTR_ubinascii), MP_ROM_PTR(&mp_module_ubinascii) }, + { MP_ROM_QSTR(MP_QSTR_binascii), MP_ROM_PTR(&mp_module_ubinascii) }, #endif #if MICROPY_PY_URANDOM { MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&mp_module_urandom) }, diff --git a/shared-bindings/audiobusio/I2SOut.c b/shared-bindings/audiobusio/I2SOut.c index 6233bb51a2..4254c8ddbe 100644 --- a/shared-bindings/audiobusio/I2SOut.c +++ b/shared-bindings/audiobusio/I2SOut.c @@ -212,6 +212,56 @@ const mp_obj_property_t audiobusio_i2sout_playing_obj = { (mp_obj_t)&mp_const_none_obj}, }; +//| .. method:: pause() +//| +//| Stops playback temporarily while remembering the position. Use `resume` to resume playback. +//| +STATIC mp_obj_t audiobusio_i2sout_obj_pause(mp_obj_t self_in) { + audiobusio_i2sout_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_audiobusio_i2sout_deinited(self)); + + if (!common_hal_audiobusio_i2sout_get_playing(self)) { + mp_raise_RuntimeError("Not playing"); + } + common_hal_audiobusio_i2sout_pause(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiobusio_i2sout_pause_obj, audiobusio_i2sout_obj_pause); + +//| .. method:: resume() +//| +//| Resumes sample playback after :py:func:`pause`. +//| +STATIC mp_obj_t audiobusio_i2sout_obj_resume(mp_obj_t self_in) { + audiobusio_i2sout_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_audiobusio_i2sout_deinited(self)); + + if (common_hal_audiobusio_i2sout_get_paused(self)) { + common_hal_audiobusio_i2sout_resume(self); + } + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiobusio_i2sout_resume_obj, audiobusio_i2sout_obj_resume); + +//| .. attribute:: paused +//| +//| True when playback is paused. (read-only) +//| +STATIC mp_obj_t audiobusio_i2sout_obj_get_paused(mp_obj_t self_in) { + audiobusio_i2sout_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_audiobusio_i2sout_deinited(self)); + return mp_obj_new_bool(common_hal_audiobusio_i2sout_get_paused(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiobusio_i2sout_get_paused_obj, audiobusio_i2sout_obj_get_paused); + +const mp_obj_property_t audiobusio_i2sout_paused_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&audiobusio_i2sout_get_paused_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + STATIC const mp_rom_map_elem_t audiobusio_i2sout_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audiobusio_i2sout_deinit_obj) }, @@ -219,9 +269,12 @@ STATIC const mp_rom_map_elem_t audiobusio_i2sout_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&audiobusio_i2sout___exit___obj) }, { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiobusio_i2sout_play_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiobusio_i2sout_stop_obj) }, + { MP_ROM_QSTR(MP_QSTR_pause), MP_ROM_PTR(&audiobusio_i2sout_pause_obj) }, + { MP_ROM_QSTR(MP_QSTR_resume), MP_ROM_PTR(&audiobusio_i2sout_resume_obj) }, // Properties { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiobusio_i2sout_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_paused), MP_ROM_PTR(&audiobusio_i2sout_paused_obj) }, }; STATIC MP_DEFINE_CONST_DICT(audiobusio_i2sout_locals_dict, audiobusio_i2sout_locals_dict_table); diff --git a/shared-bindings/audiobusio/I2SOut.h b/shared-bindings/audiobusio/I2SOut.h index 930044054f..edf4ecfa0b 100644 --- a/shared-bindings/audiobusio/I2SOut.h +++ b/shared-bindings/audiobusio/I2SOut.h @@ -41,5 +41,8 @@ bool common_hal_audiobusio_i2sout_deinited(audiobusio_i2sout_obj_t* self); void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t* self, mp_obj_t sample, bool loop); void common_hal_audiobusio_i2sout_stop(audiobusio_i2sout_obj_t* self); bool common_hal_audiobusio_i2sout_get_playing(audiobusio_i2sout_obj_t* self); +void common_hal_audiobusio_i2sout_pause(audiobusio_i2sout_obj_t* self); +void common_hal_audiobusio_i2sout_resume(audiobusio_i2sout_obj_t* self); +bool common_hal_audiobusio_i2sout_get_paused(audiobusio_i2sout_obj_t* self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOBUSIO_I2SOUT_H diff --git a/shared-bindings/audiobusio/PDMIn.c b/shared-bindings/audiobusio/PDMIn.c index 6f0a130e83..3e0f3c1fcf 100644 --- a/shared-bindings/audiobusio/PDMIn.c +++ b/shared-bindings/audiobusio/PDMIn.c @@ -42,18 +42,18 @@ //| //| PDMIn can be used to record an input audio signal on a given set of pins. //| -//| .. class:: PDMIn(clock_pin, data_pin, \*, frequency=16000, bit_depth=8, mono=True, oversample=64, startup_delay=0.11) +//| .. class:: PDMIn(clock_pin, data_pin, \*, sample_rate=16000, bit_depth=8, mono=True, oversample=64, startup_delay=0.11) //| //| Create a PDMIn object associated with the given pins. This allows you to //| record audio signals from the given pins. Individual ports may put further -//| restrictions on the recording parameters. The overall frequency is -//| determined by `frequency` x ``oversample``, and the total must be 1MHz or -//| higher, so `frequency` must be a minimum of 16000. +//| restrictions on the recording parameters. The overall sample rate is +//| determined by `sample_rate` x ``oversample``, and the total must be 1MHz or +//| higher, so `sample_rate` must be a minimum of 16000. //| //| :param ~microcontroller.Pin clock_pin: The pin to output the clock to //| :param ~microcontroller.Pin data_pin: The pin to read the data from -//| :param int frequency: Target frequency of the resulting samples. Check `frequency` for actual value. -//| Minimum frequency is about 16000 Hz. +//| :param int sample_rate: Target sample_rate of the resulting samples. Check `sample_rate` for actual value. +//| Minimum sample_rate is about 16000 Hz. //| :param int bit_depth: Final number of bits per sample. Must be divisible by 8 //| :param bool mono: True when capturing a single channel of audio, captures two channels otherwise //| :param int oversample: Number of single bit samples to decimate into a final sample. Must be divisible by 8 @@ -69,7 +69,7 @@ //| //| # Prep a buffer to record into //| b = bytearray(200) -//| with audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, frequency=16000) as mic: +//| with audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, sample_rate=16000) as mic: //| mic.record(b, len(b)) //| //| Record 16-bit unsigned samples to buffer:: @@ -83,15 +83,15 @@ //| b = array.array("H") //| for i in range(200): //| b.append(0) -//| with audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, frequency=16000, bit_depth=16) as mic: +//| with audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, sample_rate=16000, bit_depth=16) as mic: //| mic.record(b, len(b)) //| STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - enum { ARG_frequency, ARG_bit_depth, ARG_mono, ARG_oversample, ARG_startup_delay }; + enum { ARG_sample_rate, ARG_bit_depth, ARG_mono, ARG_oversample, ARG_startup_delay }; mp_map_t kw_args; mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); static const mp_arg_t allowed_args[] = { - { MP_QSTR_frequency, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 16000} }, + { MP_QSTR_sample_rate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 16000} }, { MP_QSTR_bit_depth, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 8} }, { MP_QSTR_mono, MP_ARG_KW_ONLY | MP_ARG_BOOL,{.u_bool = true} }, { MP_QSTR_oversample, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 64} }, @@ -117,7 +117,7 @@ STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_ar audiobusio_pdmin_obj_t *self = m_new_obj(audiobusio_pdmin_obj_t); self->base.type = &audiobusio_pdmin_type; - uint32_t frequency = args[ARG_frequency].u_int; + uint32_t sample_rate = args[ARG_sample_rate].u_int; uint8_t bit_depth = args[ARG_bit_depth].u_int; if (bit_depth % 8 != 0) { mp_raise_ValueError("Bit depth must be multiple of 8."); @@ -135,7 +135,7 @@ STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_ar mp_raise_ValueError("Microphone startup delay must be in range 0.0 to 1.0"); } - common_hal_audiobusio_pdmin_construct(self, clock_pin, data_pin, frequency, + common_hal_audiobusio_pdmin_construct(self, clock_pin, data_pin, sample_rate, bit_depth, mono, oversample); // Wait for the microphone to start up. Some start in 10 msecs; some take as much as 100 msecs. @@ -215,21 +215,21 @@ STATIC mp_obj_t audiobusio_pdmin_obj_record(mp_obj_t self_obj, mp_obj_t destinat } MP_DEFINE_CONST_FUN_OBJ_3(audiobusio_pdmin_record_obj, audiobusio_pdmin_obj_record); -//| .. attribute:: frequency +//| .. attribute:: sample_rate //| -//| The actual frequency of the recording. This may not match the constructed -//| frequency due to internal clock limitations. +//| The actual sample_rate of the recording. This may not match the constructed +//| sample rate due to internal clock limitations. //| -STATIC mp_obj_t audiobusio_pdmin_obj_get_frequency(mp_obj_t self_in) { +STATIC mp_obj_t audiobusio_pdmin_obj_get_sample_rate(mp_obj_t self_in) { audiobusio_pdmin_obj_t *self = MP_OBJ_TO_PTR(self_in); raise_error_if_deinited(common_hal_audiobusio_pdmin_deinited(self)); - return MP_OBJ_NEW_SMALL_INT(common_hal_audiobusio_pdmin_get_frequency(self)); + return MP_OBJ_NEW_SMALL_INT(common_hal_audiobusio_pdmin_get_sample_rate(self)); } -MP_DEFINE_CONST_FUN_OBJ_1(audiobusio_pdmin_get_frequency_obj, audiobusio_pdmin_obj_get_frequency); +MP_DEFINE_CONST_FUN_OBJ_1(audiobusio_pdmin_get_sample_rate_obj, audiobusio_pdmin_obj_get_sample_rate); -const mp_obj_property_t audiobusio_pdmin_frequency_obj = { +const mp_obj_property_t audiobusio_pdmin_sample_rate_obj = { .base.type = &mp_type_property, - .proxy = {(mp_obj_t)&audiobusio_pdmin_get_frequency_obj, + .proxy = {(mp_obj_t)&audiobusio_pdmin_get_sample_rate_obj, (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj}, }; @@ -240,7 +240,7 @@ STATIC const mp_rom_map_elem_t audiobusio_pdmin_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&audiobusio_pdmin___exit___obj) }, { MP_ROM_QSTR(MP_QSTR_record), MP_ROM_PTR(&audiobusio_pdmin_record_obj) }, - { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&audiobusio_pdmin_frequency_obj) } + { MP_ROM_QSTR(MP_QSTR_sample_rate), MP_ROM_PTR(&audiobusio_pdmin_sample_rate_obj) } }; STATIC MP_DEFINE_CONST_DICT(audiobusio_pdmin_locals_dict, audiobusio_pdmin_locals_dict_table); diff --git a/shared-bindings/audiobusio/PDMIn.h b/shared-bindings/audiobusio/PDMIn.h index a0702c9788..eaed59830a 100644 --- a/shared-bindings/audiobusio/PDMIn.h +++ b/shared-bindings/audiobusio/PDMIn.h @@ -35,13 +35,13 @@ extern const mp_obj_type_t audiobusio_pdmin_type; void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t* self, const mcu_pin_obj_t* clock_pin, const mcu_pin_obj_t* data_pin, - uint32_t frequency, uint8_t bit_depth, bool mono, uint8_t oversample); + uint32_t sample_rate, uint8_t bit_depth, bool mono, uint8_t oversample); void common_hal_audiobusio_pdmin_deinit(audiobusio_pdmin_obj_t* self); bool common_hal_audiobusio_pdmin_deinited(audiobusio_pdmin_obj_t* self); uint32_t common_hal_audiobusio_pdmin_record_to_buffer(audiobusio_pdmin_obj_t* self, uint16_t* buffer, uint32_t length); uint8_t common_hal_audiobusio_pdmin_get_bit_depth(audiobusio_pdmin_obj_t* self); -uint32_t common_hal_audiobusio_pdmin_get_frequency(audiobusio_pdmin_obj_t* self); +uint32_t common_hal_audiobusio_pdmin_get_sample_rate(audiobusio_pdmin_obj_t* self); // TODO(tannewt): Add record to file #endif // MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOBUSIO_AUDIOOUT_H diff --git a/shared-bindings/audiobusio/__init__.c b/shared-bindings/audiobusio/__init__.c index 528a8fb31e..f7e3a07668 100644 --- a/shared-bindings/audiobusio/__init__.c +++ b/shared-bindings/audiobusio/__init__.c @@ -62,7 +62,7 @@ STATIC const mp_rom_map_elem_t audiobusio_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audiobusio) }, { MP_ROM_QSTR(MP_QSTR_I2SOut), MP_ROM_PTR(&audiobusio_i2sout_type) }, - //{ MP_ROM_QSTR(MP_QSTR_PDMIn), MP_ROM_PTR(&audiobusio_pdmin_type) }, + { MP_ROM_QSTR(MP_QSTR_PDMIn), MP_ROM_PTR(&audiobusio_pdmin_type) }, }; STATIC MP_DEFINE_CONST_DICT(audiobusio_module_globals, audiobusio_module_globals_table); diff --git a/shared-bindings/audioio/AudioOut.c b/shared-bindings/audioio/AudioOut.c index 189a217d49..3450b39712 100644 --- a/shared-bindings/audioio/AudioOut.c +++ b/shared-bindings/audioio/AudioOut.c @@ -181,7 +181,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(audioio_audioout_play_obj, 1, audioio_audioout_obj_pl //| .. method:: stop() //| -//| Stops playback. +//| Stops playback and resets to the start of the sample. //| STATIC mp_obj_t audioio_audioout_obj_stop(mp_obj_t self_in) { audioio_audioout_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -193,7 +193,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(audioio_audioout_stop_obj, audioio_audioout_obj_stop); //| .. attribute:: playing //| -//| True when an audio sample is being output. (read-only) +//| True when an audio sample is being output even if `paused`. (read-only) //| STATIC mp_obj_t audioio_audioout_obj_get_playing(mp_obj_t self_in) { audioio_audioout_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -209,6 +209,56 @@ const mp_obj_property_t audioio_audioout_playing_obj = { (mp_obj_t)&mp_const_none_obj}, }; +//| .. method:: pause() +//| +//| Stops playback temporarily while remembering the position. Use `resume` to resume playback. +//| +STATIC mp_obj_t audioio_audioout_obj_pause(mp_obj_t self_in) { + audioio_audioout_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_audioio_audioout_deinited(self)); + + if (!common_hal_audioio_audioout_get_playing(self)) { + mp_raise_RuntimeError("Not playing"); + } + common_hal_audioio_audioout_pause(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audioio_audioout_pause_obj, audioio_audioout_obj_pause); + +//| .. method:: resume() +//| +//| Resumes sample playback after :py:func:`pause`. +//| +STATIC mp_obj_t audioio_audioout_obj_resume(mp_obj_t self_in) { + audioio_audioout_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_audioio_audioout_deinited(self)); + + if (common_hal_audioio_audioout_get_paused(self)) { + common_hal_audioio_audioout_resume(self); + } + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audioio_audioout_resume_obj, audioio_audioout_obj_resume); + +//| .. attribute:: paused +//| +//| True when playback is paused. (read-only) +//| +STATIC mp_obj_t audioio_audioout_obj_get_paused(mp_obj_t self_in) { + audioio_audioout_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_audioio_audioout_deinited(self)); + return mp_obj_new_bool(common_hal_audioio_audioout_get_paused(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audioio_audioout_get_paused_obj, audioio_audioout_obj_get_paused); + +const mp_obj_property_t audioio_audioout_paused_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&audioio_audioout_get_paused_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + STATIC const mp_rom_map_elem_t audioio_audioout_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audioio_audioout_deinit_obj) }, @@ -216,9 +266,12 @@ STATIC const mp_rom_map_elem_t audioio_audioout_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&audioio_audioout___exit___obj) }, { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audioio_audioout_play_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audioio_audioout_stop_obj) }, + { MP_ROM_QSTR(MP_QSTR_pause), MP_ROM_PTR(&audioio_audioout_pause_obj) }, + { MP_ROM_QSTR(MP_QSTR_resume), MP_ROM_PTR(&audioio_audioout_resume_obj) }, // Properties { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audioio_audioout_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_paused), MP_ROM_PTR(&audioio_audioout_paused_obj) }, }; STATIC MP_DEFINE_CONST_DICT(audioio_audioout_locals_dict, audioio_audioout_locals_dict_table); diff --git a/shared-bindings/audioio/AudioOut.h b/shared-bindings/audioio/AudioOut.h index 55958af799..751473605d 100644 --- a/shared-bindings/audioio/AudioOut.h +++ b/shared-bindings/audioio/AudioOut.h @@ -42,5 +42,8 @@ bool common_hal_audioio_audioout_deinited(audioio_audioout_obj_t* self); void common_hal_audioio_audioout_play(audioio_audioout_obj_t* self, mp_obj_t sample, bool loop); void common_hal_audioio_audioout_stop(audioio_audioout_obj_t* self); bool common_hal_audioio_audioout_get_playing(audioio_audioout_obj_t* self); +void common_hal_audioio_audioout_pause(audioio_audioout_obj_t* self); +void common_hal_audioio_audioout_resume(audioio_audioout_obj_t* self); +bool common_hal_audioio_audioout_get_paused(audioio_audioout_obj_t* self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOIO_AUDIOOUT_H diff --git a/shared-bindings/bitbangio/SPI.c b/shared-bindings/bitbangio/SPI.c index 53d6fec057..3e1a62d8ed 100644 --- a/shared-bindings/bitbangio/SPI.c +++ b/shared-bindings/bitbangio/SPI.c @@ -33,6 +33,7 @@ #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/util.h" +#include "lib/utils/buffer_helper.h" #include "lib/utils/context_manager_helpers.h" #include "py/mperrno.h" #include "py/runtime.h" @@ -236,37 +237,66 @@ STATIC mp_obj_t bitbangio_spi_readinto(size_t n_args, const mp_obj_t *args) { } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bitbangio_spi_readinto_obj, 2, 2, bitbangio_spi_readinto); -//| .. method:: SPI.write_readinto(buffer_out, buffer_in) +//| .. method:: SPI.write_readinto(buffer_out, buffer_in, \*, out_start=0, out_end=len(buffer_out), in_start=0, in_end=len(buffer_in)) //| //| Write out the data in ``buffer_out`` while simultaneously reading data into ``buffer_in``. -STATIC mp_obj_t bitbangio_spi_write_readinto(size_t n_args, const mp_obj_t *args) { - bitbangio_spi_obj_t *self = MP_OBJ_TO_PTR(args[0]); +//| 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. +//| +//| :param bytearray buffer_out: Write out the data in this buffer +//| :param bytearray buffer_in: Read data into this buffer +//| :param int out_start: Start of the slice of buffer_out to write out: ``buffer_out[out_start:out_end]`` +//| :param int out_end: End of the slice; this index is not included +//| :param int in_start: Start of the slice of ``buffer_in`` to read into: ``buffer_in[in_start:in_end]`` +//| :param int in_end: End of the slice; this index is not included +//| +STATIC mp_obj_t bitbangio_spi_write_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_buffer_out, ARG_buffer_in, ARG_out_start, ARG_out_end, ARG_in_start, ARG_in_end }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_buffer_out, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_buffer_in, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_out_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, + { MP_QSTR_out_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} }, + { MP_QSTR_in_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, + { MP_QSTR_in_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} }, + }; + bitbangio_spi_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); raise_error_if_deinited(shared_module_bitbangio_spi_deinited(self)); - mp_buffer_info_t bufinfoin; - mp_get_buffer_raise(args[2], &bufinfoin, MP_BUFFER_WRITE); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - if (bufinfoin.len == 0) { + mp_buffer_info_t buf_out_info; + mp_get_buffer_raise(args[ARG_buffer_out].u_obj, &buf_out_info, MP_BUFFER_READ); + int32_t out_start = args[ARG_out_start].u_int; + uint32_t out_length = buf_out_info.len; + normalize_buffer_bounds(&out_start, args[ARG_out_end].u_int, &out_length); + + mp_buffer_info_t buf_in_info; + mp_get_buffer_raise(args[ARG_buffer_in].u_obj, &buf_in_info, MP_BUFFER_WRITE); + int32_t in_start = args[ARG_in_start].u_int; + uint32_t in_length = buf_in_info.len; + normalize_buffer_bounds(&in_start, args[ARG_in_end].u_int, &in_length); + + if (out_length != in_length) { + mp_raise_ValueError("buffer slices must be of equal length"); + } + + if (out_length == 0) { return mp_const_none; } - mp_buffer_info_t bufinfoout; - mp_get_buffer_raise(args[1], &bufinfoout, MP_BUFFER_READ); - - if (bufinfoout.len != bufinfoin.len) { - mp_raise_ValueError("buffers must be of equal length"); - } - bool ok = shared_module_bitbangio_spi_transfer(self, - ((uint8_t*)bufinfoout.buf), - ((uint8_t*)bufinfoin.buf), - bufinfoin.len); + ((uint8_t*)buf_out_info.buf) + out_start, + ((uint8_t*)buf_in_info.buf) + in_start, + out_length); if (!ok) { mp_raise_OSError(MP_EIO); } return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bitbangio_spi_write_readinto_obj, 3, 3, bitbangio_spi_write_readinto); +MP_DEFINE_CONST_FUN_OBJ_KW(bitbangio_spi_write_readinto_obj, 2, bitbangio_spi_write_readinto); STATIC const mp_rom_map_elem_t bitbangio_spi_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&bitbangio_spi_deinit_obj) }, diff --git a/shared-bindings/index.rst b/shared-bindings/index.rst index a43270e150..76b5e340b8 100644 --- a/shared-bindings/index.rst +++ b/shared-bindings/index.rst @@ -23,11 +23,13 @@ Module Supported Ports `analogio` **All Supported** `audiobusio` **SAMD/SAMD Express** `audioio` **SAMD Express** +`binascii` **ESP8266** `bitbangio` **SAMD Express, ESP8266** `board` **All Supported** `busio` **All Supported** `digitalio` **All Supported** `gamepad` **SAMD Express, nRF** +`hashlib` **ESP8266** `math` **All Supported** `microcontroller` **All Supported** `multiterminal` **ESP8266** diff --git a/tests/basics/class_store_class.py b/tests/basics/class_store_class.py index 8f3e542d11..504f460a7d 100644 --- a/tests/basics/class_store_class.py +++ b/tests/basics/class_store_class.py @@ -5,11 +5,8 @@ try: from collections import namedtuple except ImportError: - try: - from ucollections import namedtuple - except ImportError: - print("SKIP") - raise SystemExit + print("SKIP") + raise SystemExit import skip_if skip_if.no_cpython_compat() diff --git a/tests/basics/namedtuple1.py b/tests/basics/namedtuple1.py index 1b176b2321..63d9eddd4e 100644 --- a/tests/basics/namedtuple1.py +++ b/tests/basics/namedtuple1.py @@ -1,8 +1,5 @@ try: - try: - from collections import namedtuple - except ImportError: - from ucollections import namedtuple + from collections import namedtuple except ImportError: print("SKIP") raise SystemExit diff --git a/tests/basics/namedtuple1_cpython_compat.py b/tests/basics/namedtuple1_cpython_compat.py index a1b852d900..061ae94e58 100644 --- a/tests/basics/namedtuple1_cpython_compat.py +++ b/tests/basics/namedtuple1_cpython_compat.py @@ -2,10 +2,7 @@ import skip_if skip_if.no_cpython_compat() try: - try: - from collections import namedtuple - except ImportError: - from ucollections import namedtuple + from collections import namedtuple except ImportError: skip_if.skip() diff --git a/tests/basics/ordereddict1.py b/tests/basics/ordereddict1.py index d1633f0bb0..9c62b2d623 100644 --- a/tests/basics/ordereddict1.py +++ b/tests/basics/ordereddict1.py @@ -1,11 +1,8 @@ try: from collections import OrderedDict except ImportError: - try: - from ucollections import OrderedDict - except ImportError: - print("SKIP") - raise SystemExit + print("SKIP") + raise SystemExit d = OrderedDict([(10, 20), ("b", 100), (1, 2)]) print(len(d)) diff --git a/tests/basics/ordereddict_eq.py b/tests/basics/ordereddict_eq.py index c69daf8802..e103c867e2 100644 --- a/tests/basics/ordereddict_eq.py +++ b/tests/basics/ordereddict_eq.py @@ -1,11 +1,8 @@ try: from collections import OrderedDict except ImportError: - try: - from ucollections import OrderedDict - except ImportError: - print("SKIP") - raise SystemExit + print("SKIP") + raise SystemExit x = OrderedDict() y = OrderedDict() diff --git a/tests/bench/var-8-namedtuple-1st.py b/tests/bench/var-8-namedtuple-1st.py index d862480a51..90ae7209d8 100644 --- a/tests/bench/var-8-namedtuple-1st.py +++ b/tests/bench/var-8-namedtuple-1st.py @@ -1,5 +1,5 @@ import bench -from ucollections import namedtuple +from collections import namedtuple T = namedtuple("Tup", ["num", "bar"]) diff --git a/tests/bench/var-8.1-namedtuple-5th.py b/tests/bench/var-8.1-namedtuple-5th.py index 0bcf661803..0d5789d2ed 100644 --- a/tests/bench/var-8.1-namedtuple-5th.py +++ b/tests/bench/var-8.1-namedtuple-5th.py @@ -1,5 +1,5 @@ import bench -from ucollections import namedtuple +from collections import namedtuple T = namedtuple("Tup", ["foo1", "foo2", "foo3", "foo4", "num"]) diff --git a/tests/extmod/ubinascii_a2b_base64.py b/tests/extmod/ubinascii_a2b_base64.py index 05a3169f3a..5e642ec515 100644 --- a/tests/extmod/ubinascii_a2b_base64.py +++ b/tests/extmod/ubinascii_a2b_base64.py @@ -28,6 +28,9 @@ print(binascii.a2b_base64(b'Zm9v==')) print(binascii.a2b_base64(b'Zm9v===')) print(binascii.a2b_base64(b'Zm9v===YmFy')) +# Unicode strings can be decoded +print(binascii.a2b_base64(u'Zm9v===YmFy')) + try: print(binascii.a2b_base64(b'abc')) except ValueError: diff --git a/tests/extmod/ubinascii_b2a_base64.py b/tests/extmod/ubinascii_b2a_base64.py index f4bb69fe0c..283c3936d3 100644 --- a/tests/extmod/ubinascii_b2a_base64.py +++ b/tests/extmod/ubinascii_b2a_base64.py @@ -20,3 +20,7 @@ print(binascii.b2a_base64(b'\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f')) print(binascii.b2a_base64(b'\x7f\x80\xff')) print(binascii.b2a_base64(b'1234ABCDabcd')) print(binascii.b2a_base64(b'\x00\x00>')) # convert into '+' +try: + print(binascii.b2a_base64('')) +except TypeError: + print("TypeError") diff --git a/tests/extmod/ubinascii_crc32.py b/tests/extmod/ubinascii_crc32.py index 89664a9b36..a826662f11 100644 --- a/tests/extmod/ubinascii_crc32.py +++ b/tests/extmod/ubinascii_crc32.py @@ -22,3 +22,7 @@ print(hex(binascii.crc32(b' over the lazy dog', binascii.crc32(b'The quick brown print(hex(binascii.crc32(b'\x00' * 16, binascii.crc32(b'\x00' * 16)))) print(hex(binascii.crc32(b'\xff' * 16, binascii.crc32(b'\xff' * 16)))) print(hex(binascii.crc32(bytes(range(16, 32)), binascii.crc32(bytes(range(16)))))) +try: + binascii.crc32('') +except TypeError: + print("TypeError") diff --git a/tests/extmod/ubinascii_hexlify.py b/tests/extmod/ubinascii_hexlify.py index bc99287476..dabc3c7e4c 100644 --- a/tests/extmod/ubinascii_hexlify.py +++ b/tests/extmod/ubinascii_hexlify.py @@ -11,3 +11,7 @@ print(binascii.hexlify(b'\x00\x01\x02\x03\x04\x05\x06\x07')) print(binascii.hexlify(b'\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f')) print(binascii.hexlify(b'\x7f\x80\xff')) print(binascii.hexlify(b'1234ABCDabcd')) +try: + binascii.hexlify('') +except TypeError: + print("TypeError") diff --git a/tests/extmod/ubinascii_unhexlify.py b/tests/extmod/ubinascii_unhexlify.py index 865abfe3a8..41a1bd1b8f 100644 --- a/tests/extmod/ubinascii_unhexlify.py +++ b/tests/extmod/ubinascii_unhexlify.py @@ -12,6 +12,9 @@ print(binascii.unhexlify(b'08090a0b0c0d0e0f')) print(binascii.unhexlify(b'7f80ff')) print(binascii.unhexlify(b'313233344142434461626364')) +# Unicode strings can be decoded +print(binascii.unhexlify('313233344142434461626364')) + try: a = binascii.unhexlify(b'0') # odd buffer length except ValueError: diff --git a/tests/extmod/uhashlib_sha1.py b/tests/extmod/uhashlib_sha1.py index 4f7066899a..9d6427b33f 100644 --- a/tests/extmod/uhashlib_sha1.py +++ b/tests/extmod/uhashlib_sha1.py @@ -19,3 +19,10 @@ except AttributeError: sha1 = hashlib.sha1(b'hello') sha1.update(b'world') print(sha1.digest()) + +sha1 = hashlib.sha1(b'hello') +try: + sha1.update(u'world') +except TypeError as e: + print("TypeError") +print(sha1.digest()) diff --git a/tests/extmod/uhashlib_sha256.py b/tests/extmod/uhashlib_sha256.py index 3200e8f5cd..0322c20de4 100644 --- a/tests/extmod/uhashlib_sha256.py +++ b/tests/extmod/uhashlib_sha256.py @@ -23,6 +23,13 @@ print(h.digest()) print(hashlib.sha256(b"\xff" * 64).digest()) +sha256 = hashlib.sha256(b'hello') +try: + sha256.update(u'world') +except TypeError as e: + print("TypeError") +print(sha256.digest()) + # TODO: running .digest() several times in row is not supported() #h = hashlib.sha256(b'123') #print(h.digest()) diff --git a/tests/skip_if.py b/tests/skip_if.py index 8d0ed8f214..7d6c5b2075 100644 --- a/tests/skip_if.py +++ b/tests/skip_if.py @@ -68,10 +68,7 @@ def board_not_in(*board): def no_cpython_compat(): try: - try: - from collections import namedtuple - except ImportError: - from ucollections import namedtuple + from collections import namedtuple except ImportError: skip() try: diff --git a/tools/gen-cpydiff.py b/tools/gen-cpydiff.py deleted file mode 100644 index aff5b56e7b..0000000000 --- a/tools/gen-cpydiff.py +++ /dev/null @@ -1,226 +0,0 @@ -# This file is part of the MicroPython project, http://micropython.org/ -# -# The MIT License (MIT) -# -# Copyright (c) 2016 Rami Ali -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -""" gen-cpydiff generates documentation which outlines operations that differ between MicroPython - and CPython. This script is called by the docs Makefile for html and Latex and may be run - manually using the command make gen-cpydiff. """ - -import os -import errno -import subprocess -import time -import re -from collections import namedtuple - -# MicroPython supports syntax of CPython 3.4 with some features from 3.5, and -# such version should be used to test for differences. If your default python3 -# executable is of lower version, you can point MICROPY_CPYTHON3 environment var -# to the correct executable. -if os.name == 'nt': - CPYTHON3 = os.getenv('MICROPY_CPYTHON3', 'python3.exe') - MICROPYTHON = os.getenv('MICROPY_MICROPYTHON', '../windows/micropython.exe') -else: - CPYTHON3 = os.getenv('MICROPY_CPYTHON3', 'python3') - MICROPYTHON = os.getenv('MICROPY_MICROPYTHON', '../unix/micropython') - -TESTPATH = '../tests/cpydiff/' -DOCPATH = '../docs/genrst/' -INDEXTEMPLATE = '../docs/differences/index_template.txt' -INDEX = 'index.rst' - -HEADER = '.. This document was generated by tools/gen-cpydiff.py\n\n' -UIMPORTLIST = {'struct', 'collections', 'json'} -CLASSMAP = {'Core': 'Core Language', 'Types': 'Builtin Types'} -INDEXPRIORITY = ['syntax', 'core_language', 'builtin_types', 'modules'] -RSTCHARS = ['=', '-', '~', '`', ':'] -SPLIT = '"""\n|categories: |description: |cause: |workaround: ' -TAB = ' ' - -Output = namedtuple('output', ['name', 'class_', 'desc', 'cause', 'workaround', 'code', - 'output_cpy', 'output_upy', 'status']) - -def readfiles(): - """ Reads test files """ - tests = list(filter(lambda x: x.endswith('.py'), os.listdir(TESTPATH))) - tests.sort() - files = [] - - for test in tests: - text = open(TESTPATH + test, 'r').read() - - try: - class_, desc, cause, workaround, code = [x.rstrip() for x in \ - list(filter(None, re.split(SPLIT, text)))] - output = Output(test, class_, desc, cause, workaround, code, '', '', '') - files.append(output) - except IndexError: - print('Incorrect format in file ' + TESTPATH + test) - - return files - -def uimports(code): - """ converts CPython module names into MicroPython equivalents """ - for uimport in UIMPORTLIST: - uimport = bytes(uimport, 'utf8') - code = code.replace(uimport, b'u' + uimport) - return code - -def run_tests(tests): - """ executes all tests """ - results = [] - for test in tests: - with open(TESTPATH + test.name, 'rb') as f: - input_cpy = f.read() - input_upy = uimports(input_cpy) - - process = subprocess.Popen(CPYTHON3, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) - output_cpy = [com.decode('utf8') for com in process.communicate(input_cpy)] - - process = subprocess.Popen(MICROPYTHON, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) - output_upy = [com.decode('utf8') for com in process.communicate(input_upy)] - - if output_cpy[0] == output_upy[0] and output_cpy[1] == output_upy[1]: - status = 'Supported' - print('Supported operation!\nFile: ' + TESTPATH + test.name) - else: - status = 'Unsupported' - - output = Output(test.name, test.class_, test.desc, test.cause, - test.workaround, test.code, output_cpy, output_upy, status) - results.append(output) - - results.sort(key=lambda x: x.class_) - return results - -def indent(block, spaces): - """ indents paragraphs of text for rst formatting """ - new_block = '' - for line in block.split('\n'): - new_block += spaces + line + '\n' - return new_block - -def gen_table(contents): - """ creates a table given any set of columns """ - xlengths = [] - ylengths = [] - for column in contents: - col_len = 0 - for entry in column: - lines = entry.split('\n') - for line in lines: - col_len = max(len(line) + 2, col_len) - xlengths.append(col_len) - for i in range(len(contents[0])): - ymax = 0 - for j in range(len(contents)): - ymax = max(ymax, len(contents[j][i].split('\n'))) - ylengths.append(ymax) - - table_divider = '+' + ''.join(['-' * i + '+' for i in xlengths]) + '\n' - table = table_divider - for i in range(len(ylengths)): - row = [column[i] for column in contents] - row = [entry + '\n' * (ylengths[i]-len(entry.split('\n'))) for entry in row] - row = [entry.split('\n') for entry in row] - for j in range(ylengths[i]): - k = 0 - for entry in row: - width = xlengths[k] - table += ''.join(['| {:{}}'.format(entry[j], width - 1)]) - k += 1 - table += '|\n' - table += table_divider - return table + '\n' - -def gen_rst(results): - """ creates restructured text documents to display tests """ - - # make sure the destination directory exists - try: - os.mkdir(DOCPATH) - except OSError as e: - if e.args[0] != errno.EEXIST and e.args[0] != errno.EISDIR: - raise - - toctree = [] - class_ = [] - for output in results: - section = output.class_.split(',') - for i in range(len(section)): - section[i] = section[i].rstrip() - if section[i] in CLASSMAP: - section[i] = CLASSMAP[section[i]] - if i >= len(class_) or section[i] != class_[i]: - if i == 0: - filename = section[i].replace(' ', '_').lower() - rst = open(DOCPATH + filename + '.rst', 'w') - rst.write(HEADER) - rst.write(section[i] + '\n') - rst.write(RSTCHARS[0] * len(section[i])) - rst.write(time.strftime("\nGenerated %a %d %b %Y %X UTC\n\n", time.gmtime())) - toctree.append(filename) - else: - rst.write(section[i] + '\n') - rst.write(RSTCHARS[min(i, len(RSTCHARS)-1)] * len(section[i])) - rst.write('\n\n') - class_ = section - rst.write('.. _cpydiff_%s:\n\n' % output.name.rsplit('.', 1)[0]) - rst.write(output.desc + '\n') - rst.write('~' * len(output.desc) + '\n\n') - if output.cause != 'Unknown': - rst.write('**Cause:** ' + output.cause + '\n\n') - if output.workaround != 'Unknown': - rst.write('**Workaround:** ' + output.workaround + '\n\n') - - rst.write('Sample code::\n\n' + indent(output.code, TAB) + '\n') - output_cpy = indent(''.join(output.output_cpy[0:2]), TAB).rstrip() - output_cpy = ('::\n\n' if output_cpy != '' else '') + output_cpy - output_upy = indent(''.join(output.output_upy[0:2]), TAB).rstrip() - output_upy = ('::\n\n' if output_upy != '' else '') + output_upy - table = gen_table([['CPy output:', output_cpy], ['uPy output:', output_upy]]) - rst.write(table) - - template = open(INDEXTEMPLATE, 'r') - index = open(DOCPATH + INDEX, 'w') - index.write(HEADER) - index.write(template.read()) - for section in INDEXPRIORITY: - if section in toctree: - index.write(indent(section + '.rst', TAB)) - toctree.remove(section) - for section in toctree: - index.write(indent(section + '.rst', TAB)) - -def main(): - """ Main function """ - - # set search path so that test scripts find the test modules (and no other ones) - os.environ['PYTHONPATH'] = TESTPATH - os.environ['MICROPYPATH'] = TESTPATH - - files = readfiles() - results = run_tests(files) - gen_rst(results) - -main() diff --git a/tools/usb_descriptor b/tools/usb_descriptor index 0ccd1935d6..2507847031 160000 --- a/tools/usb_descriptor +++ b/tools/usb_descriptor @@ -1 +1 @@ -Subproject commit 0ccd1935d666bcffc3fd5941ba06bd9273d72e0c +Subproject commit 2507847031a0395465956539253cbfa27f87511e