From 46e472bf3a3c5491bb6eba7c702097d5e1e64d80 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 08:38:12 -0800 Subject: [PATCH 01/58] Update README.md [ci-skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 04eb82295..c947514a8 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Download the version of FarmBot OS that corresponds to the FarmBot kit and compu | FarmBot Kit | Computer | Download Link | | --- | --- | --- | -| Genesis v1.2, Genesis v1.3, Genesis v1.4, Genesis XL v1.4 | Raspberry Pi 3 | [Download FBOS](https://github.com/FarmBot/farmbot_os/releases/download/v8.2.3/farmbot-rpi3-8.2.3.img) | +| Genesis v1.2, Genesis v1.3, Genesis v1.4, Genesis XL v1.4 | Raspberry Pi 3 | [Download FBOS](https://github.com/FarmBot/farmbot_os/releases/download/v8.2.4/farmbot-rpi3-8.2.4.img) | | Express v1.0, Express XL v1.0 | Raspberry Pi Zero W | Coming soon | --- From d45869311b49a3e7e0012ed75141906e8d3df32a Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 10:44:33 -0800 Subject: [PATCH 02/58] Update BUILDING.md to be more recent [ci-skip] --- docs/BUILDING.md | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 6cdd07ac2..779df7e1e 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -11,6 +11,7 @@ or ```bash git clone https://github.com/FarmBot/farmbot_os.git git submodule update --init --recursive +cd farmbot_os ``` To initialize the repository. @@ -26,9 +27,6 @@ If you have the above set up you will need some software dependencies: * Nerves Bootstrapper found [here](https://hexdocs.pm/nerves/installation.html#Linux) * GNU Make + GCC * git -* Arduino. You can do one of: - * Set the `ARDUINO_INSTALL_DIR` environment variable - * execute `.circleci/setup_arduino.sh` ## Optional dependencies * python @@ -60,25 +58,11 @@ to configure (at least) two different environment/target combos. where: * `host` - For development. * `rpi3` - Run on Farmbot's intended hardware. -### Note about setup -You will need to configure your Farmbot API, Frontend, and MQTT services for the -below commands to work. You _can_ however use the default `my.farmbot.io` servers. -see `config/host/auth_secret_template.exs` for more information. - -## Running unit tests -Tests should be ran while developing features. You should have a *local* Farmbot -stack up and running and configured for this to work. -`config/host/auth_secret_template.exs` will have more full instructions. - -```bash -MIX_ENV=test mix deps.get # Fetch test env specific deps. -mix test -``` - ## Feature development If you plan on developing features, you will probably want to develop them with the `dev` and `host` combo. These are both the default values, so you can simply do: ```bash +export FARMBOT_EMAIL="email@server.com" FARMBOT_PASSWORD="supersecret" FARMBOT_SERVER="https://my.farm.bot" CONFIGURATOR_PORT=4000 # you should only need to do this once mix deps.get # You should only need to do this once. iex -S mix # This will start an interactive shell. ``` @@ -89,7 +73,6 @@ This is accomplished with the `dev` and `rpi3` combo. It is *highly* recommended that you have an FTDI cable for this such as [this](https://www.digikey.com/product-detail/en/ftdi/TTL-232R-RPI/768-1204-ND) one - ```bash MIX_TARGET=rpi3 mix deps.get # Get deps for the rpi3 target. You should only need to do this once. MIX_TARGET=rpi3 mix firmware # Produce a firmware image. @@ -104,7 +87,8 @@ push updates over the network to your device. ```bash # make some changes to the code... MIX_TARGET=rpi3 mix firmware # Build a new fw. -MIX_TARGET=rpi3 mix firmware.push # Push the new fw to the device. +MIX_TARGET=rpi3 mix firmware.gen.script # this should onlye be ran once +MIX_TARGET=rpi3 ./upload.sh # Push the new fw to the device. ``` Your device should now reboot into that new code. As long as you don't cause a factory reset somehow, (bad init code, typo, etc) you should be able From 8d20d43e2f9c13863481e66c217c973276606587 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 14:00:18 -0600 Subject: [PATCH 03/58] Dep updates for farmbot_os --- farmbot_os/mix.exs | 10 +++++----- farmbot_os/mix.lock | 18 +++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index 77e187f4a..a350a80b2 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -88,7 +88,7 @@ defmodule FarmbotOS.MixProject do # Host/test only dependencies. {:excoveralls, "~> 0.10", only: [:test], targets: [:host]}, {:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false}, - {:ex_doc, "~> 0.19", only: [:dev], targets: [:host], runtime: false}, + {:ex_doc, "~> 0.21.2", only: [:dev], targets: [:host], runtime: false}, {:elixir_make, "~> 0.6", runtime: false}, # Data collection @@ -96,14 +96,14 @@ defmodule FarmbotOS.MixProject do # Target only deps {:nerves_runtime, "~> 0.10", targets: @all_targets}, - {:nerves_time, "~> 0.2", targets: @all_targets}, + {:nerves_time, "~> 0.3.2", targets: @all_targets}, {:nerves_hub, "~> 0.7", targets: @all_targets}, {:nerves_firmware_ssh, "~> 0.4", targets: @all_targets}, - {:circuits_gpio, "~> 0.4", targets: @all_targets}, + {:circuits_gpio, "~> 0.4.3", targets: @all_targets}, {:toolshed, "~> 0.2", targets: @all_targets}, {:vintage_net, "~> 0.6", targets: @all_targets}, - {:mdns_lite, "~> 0.4", targets: @all_targets}, - {:busybox, "~> 0.1", targets: @all_targets}, + {:mdns_lite, "~> 0.6.1", targets: @all_targets}, + {:busybox, "~> 0.1.4", targets: @all_targets}, {:nerves_system_br, "~> 1.9", override: true, runtime: false, targets: @all_targets}, {:farmbot_system_rpi3, "1.9.1-farmbot.4", runtime: false, targets: :rpi3}, {:farmbot_system_rpi, "1.9.0-farmbot.1", runtime: false, targets: :rpi} diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock index 01a770dea..d3ab6eb77 100644 --- a/farmbot_os/mix.lock +++ b/farmbot_os/mix.lock @@ -1,9 +1,9 @@ %{ "amqp": {:hex, :amqp, "1.3.0", "246e84fd6b051c5b7fed0c7871df9bc2338bc029085192f61438a1f69180d621", [:mix], [{:amqp_client, "~> 3.7.11", [hex: :amqp_client, repo: "hexpm", optional: false]}, {:goldrush, "~> 0.1.0", [hex: :goldrush, repo: "hexpm", optional: false]}, {:jsx, "~> 2.9", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "~> 3.6.5", [hex: :lager, repo: "hexpm", optional: false]}, {:rabbit_common, "~> 3.7.11", [hex: :rabbit_common, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "~> 2.3", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, "amqp_client": {:hex, :amqp_client, "3.7.11", "e692b3ba59e6df93c13cec5feefb62c956fcdbae341565101c7668375cc387fe", [:make, :rebar3], [{:rabbit_common, "3.7.11", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm"}, - "busybox": {:hex, :busybox, "0.1.3", "539dba9c63e4a9a43ad55ddc7985faec9cbad997c339cd1a3de2264ce3848d39", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "busybox": {:hex, :busybox, "0.1.4", "9b07860c0663e7d0ace3093100ede44860bd73c22b17c2941a4b17e25893cc36", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, - "circuits_gpio": {:hex, :circuits_gpio, "0.4.2", "becda6b468271a2dea0c8a500b23b2b5d425501a7d7664c55f96e292af8aef30", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "circuits_gpio": {:hex, :circuits_gpio, "0.4.3", "1a53dff1eaeefb9f67f4ebc2c1852b603683eedaa6053bed51c038dd64b978bb", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "circuits_uart": {:hex, :circuits_uart, "1.3.2", "206579d28fcd443881777fadf5ee6af1ea7835a7ccd352b54d73e98ea5266b4c", [:mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, @@ -14,12 +14,12 @@ "decimal": {:hex, :decimal, "1.8.0", "ca462e0d885f09a1c5a342dbd7c1dcf27ea63548c65a65e67334f4b61803822e", [:mix], [], "hexpm"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm"}, "dns": {:hex, :dns, "2.1.2", "81c46d39f7934f0e73368355126e4266762cf227ba61d5889635d83b2d64a493", [:mix], [{:socket, "~> 0.3.13", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm"}, - "earmark": {:hex, :earmark, "1.3.2", "b840562ea3d67795ffbb5bd88940b1bed0ed9fa32834915125ea7d02e35888a5", [:mix], [], "hexpm"}, + "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm"}, "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm"}, "erlex": {:hex, :erlex, "0.2.2", "cb0e6878fdf86dc63509eaf2233a71fa73fc383c8362c8ff8e8b6f0c2bb7017c", [:mix], [], "hexpm"}, "esqlite": {:hex, :esqlite, "0.2.5", "cab6d87aeb5f33d848b9bb8a21129e9512ea608f930d4c63576942d8f7d72218", [:rebar3], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.20.1", "88eaa16e67c505664fd6a66f42ddb962d424ad68df586b214b71443c69887123", [:mix], [{:earmark, "~> 1.3", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, + "ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, "excoveralls": {:hex, :excoveralls, "0.10.6", "e2b9718c9d8e3ef90bc22278c3f76c850a9f9116faf4ebe9678063310742edc2", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "farmbot_system_rpi": {:hex, :farmbot_system_rpi, "1.9.0-farmbot.1", "4e178645ab49e82d988558360447bf7a22c84a56c0284d61b64aaeef936ff2e8", [:mix], [{:nerves, "~> 1.5.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.9.2", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "1.2.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"}, "farmbot_system_rpi0": {:hex, :farmbot_system_rpi0, "1.8.0-farmbot.0", "017d5c50a462a30acee8de882c62c584131048b6efd7ea3367cbf56be50deebe", [:mix], [{:nerves, "~> 1.4", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.8.2", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "1.2.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"}, @@ -35,9 +35,9 @@ "lager": {:hex, :lager, "3.6.5", "831910109f3fcb503debf658ca0538836b348c58bfbf349a6d48228096ce9040", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm"}, "luer": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, "luerl": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, - "makeup": {:hex, :makeup, "0.8.0", "9cf32aea71c7fe0a4b2e9246c2c4978f9070257e5c9ce6d4a28ec450a839b55f", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.13.0", "be7a477997dcac2e48a9d695ec730b2d22418292675c75aa2d34ba0909dcdeda", [:mix], [{:makeup, "~> 0.8", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, - "mdns_lite": {:hex, :mdns_lite, "0.4.2", "3f220172c3e9e16e1f1131997245b8b17454232ef789b1645961fcb4fa1427bf", [:mix], [{:dns, "~> 2.1", [hex: :dns, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, + "mdns_lite": {:hex, :mdns_lite, "0.6.1", "6be652b99612d6790594b7e24ad04efd064028be4b9f199a8924fd4a89dd8881", [:mix], [{:dns, "~> 2.1", [hex: :dns, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.6", [hex: :vintage_net, repo: "hexpm", optional: true]}], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, @@ -51,12 +51,12 @@ "nerves_runtime": {:hex, :nerves_runtime, "0.10.3", "8671c805262a6b8819a92b16afb100060af55a807a30f62395136c133e72b4ab", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.8.0", [hex: :system_registry, repo: "hexpm", optional: false]}, {:uboot_env, "~> 0.1.1", [hex: :uboot_env, repo: "hexpm", optional: false]}], "hexpm"}, "nerves_system_br": {:hex, :nerves_system_br, "1.10.0", "29169ebad0415b916bf3b9890f821a91b70be9af93a7fd824aa661f17b193548", [:mix], [], "hexpm"}, "nerves_system_linter": {:hex, :nerves_system_linter, "0.3.0", "84e0f63c8ac196b16b77608bbe7df66dcf352845c4e4fb394bffd2b572025413", [:mix], [], "hexpm"}, - "nerves_time": {:hex, :nerves_time, "0.2.1", "7472fdc643c4dd93b841c710b84aa83ac6ef6879b50b7568b2ed8c862db673aa", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.4", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_time": {:hex, :nerves_time, "0.3.2", "cbd1048701a756695cda6ec5835419e47505a7fe437f97088c9475dc6f8ab625", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm"}, "nerves_toolchain_arm_unknown_linux_gnueabihf": {:hex, :nerves_toolchain_arm_unknown_linux_gnueabihf, "1.2.0", "ba48ce7c846ee12dfca8148dc7240988d96a3f2eb9c234bf08bffe4f0f7a3c62", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.6.0", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"}, "nerves_toolchain_armv6_rpi_linux_gnueabi": {:hex, :nerves_toolchain_armv6_rpi_linux_gnueabi, "1.2.0", "007668c7ad1f73bad8fd54ad1a27a3b0fb91bca51b4af6bb3bbdac968ccae0ba", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.6.0", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"}, "nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.6.0", "452f8589c1a58ac787477caab20a8cfc6671e345837ccc19beefe49ae35ba983", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}], "hexpm"}, "nimble_csv": {:hex, :nimble_csv, "0.6.0", "a3673f26d41f986774fe6060e309615343d3cb83a6d435754d8b1fdbd5764879", [:mix], [], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm"}, + "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"}, "one_dhcpd": {:hex, :one_dhcpd, "0.2.3", "753f1495a5f1b29d24b6e1f1e4e9c30c54242daae236bed6baff32027165559e", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "pbcs": {:hex, :pbcs, "0.1.1", "199c7fd4af3351758378355909145a2d187c565555ed16bde30b5055114652ed", [:mix], [], "hexpm"}, From e1cbfa26f5e26671d4c76014ae7b835cae231d12 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 14:03:56 -0600 Subject: [PATCH 04/58] Dep updates for farmbot_celery_script --- farmbot_celery_script/mix.exs | 2 +- farmbot_celery_script/mix.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/farmbot_celery_script/mix.exs b/farmbot_celery_script/mix.exs index 9441f4ac8..abfb133b5 100644 --- a/farmbot_celery_script/mix.exs +++ b/farmbot_celery_script/mix.exs @@ -52,7 +52,7 @@ defmodule FarmbotCeleryScript.MixProject do {:timex, "~> 3.4"}, {:excoveralls, "~> 0.10", only: [:test], targets: [:host]}, {:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false}, - {:ex_doc, "~> 0.19", only: [:dev], targets: [:host], runtime: false} + {:ex_doc, "~> 0.21.2", only: [:dev], targets: [:host], runtime: false} ] end end diff --git a/farmbot_celery_script/mix.lock b/farmbot_celery_script/mix.lock index 952872684..013241ea1 100644 --- a/farmbot_celery_script/mix.lock +++ b/farmbot_celery_script/mix.lock @@ -2,18 +2,18 @@ "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.3", "774306f84973fc3f1e2e8743eeaa5f5d29b117f3916e5de74c075c02f1b8ef55", [:mix], [], "hexpm"}, - "earmark": {:hex, :earmark, "1.2.6", "b6da42b3831458d3ecc57314dff3051b080b9b2be88c2e5aa41cd642a5b044ed", [:mix], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.19.1", "519bb9c19526ca51d326c060cb1778d4a9056b190086a8c6c115828eaccea6cf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.7", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, + "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm"}, + "ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, "excoveralls": {:hex, :excoveralls, "0.10.1", "407d50ac8fc63dfee9175ccb4548e6c5512b5052afa63eedb9cd452a32a91495", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "gettext": {:hex, :gettext, "0.17.1", "8baab33482df4907b3eae22f719da492cee3981a26e649b9c2be1c0192616962", [:mix], [], "hexpm"}, "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, - "makeup": {:hex, :makeup, "0.5.1", "966c5c2296da272d42f1de178c1d135e432662eca795d6dc12e5e8787514edf7", [:mix], [{:nimble_parsec, "~> 0.2.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.8.0", "1204a2f5b4f181775a0e456154830524cf2207cf4f9112215c05e0b76e4eca8b", [:mix], [{:makeup, "~> 0.5.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 0.2.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.2.2", "d526b23bdceb04c7ad15b33c57c4526bf5f50aaa70c7c141b4b4624555c68259", [:mix], [], "hexpm"}, + "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, From dc6ec05ecc4ffe275b1c8df4b1917634ac34195b Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 14:06:37 -0600 Subject: [PATCH 05/58] Dep updates for farmbot_core --- farmbot_core/mix.exs | 2 +- farmbot_core/mix.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/farmbot_core/mix.exs b/farmbot_core/mix.exs index 30ce803e7..b4666dd67 100644 --- a/farmbot_core/mix.exs +++ b/farmbot_core/mix.exs @@ -65,7 +65,7 @@ defmodule FarmbotCore.MixProject do {:muontrap, "~> 0.5"}, {:excoveralls, "~> 0.10", only: [:test], targets: [:host]}, {:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false}, - {:ex_doc, "~> 0.19", only: [:dev], targets: [:host], runtime: false} + {:ex_doc, "~> 0.21.2", only: [:dev], targets: [:host], runtime: false} ] end diff --git a/farmbot_core/mix.lock b/farmbot_core/mix.lock index 6bb8d1c8d..81da8a06a 100644 --- a/farmbot_core/mix.lock +++ b/farmbot_core/mix.lock @@ -8,25 +8,25 @@ "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "decimal": {:hex, :decimal, "1.8.0", "ca462e0d885f09a1c5a342dbd7c1dcf27ea63548c65a65e67334f4b61803822e", [:mix], [], "hexpm"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.3", "774306f84973fc3f1e2e8743eeaa5f5d29b117f3916e5de74c075c02f1b8ef55", [:mix], [], "hexpm"}, - "earmark": {:hex, :earmark, "1.2.6", "b6da42b3831458d3ecc57314dff3051b080b9b2be88c2e5aa41cd642a5b044ed", [:mix], [], "hexpm"}, + "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm"}, "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm"}, "esqlite": {:hex, :esqlite, "0.2.4", "3a8a352c190afe2d6b828b252a6fbff65b5cc1124647f38b15bdab3bf6fd4b3e", [:rebar3], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.19.1", "519bb9c19526ca51d326c060cb1778d4a9056b190086a8c6c115828eaccea6cf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.7", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, + "ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, "excoveralls": {:hex, :excoveralls, "0.10.1", "407d50ac8fc63dfee9175ccb4548e6c5512b5052afa63eedb9cd452a32a91495", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "gen_stage": {:hex, :gen_stage, "0.14.1", "9d46723fda072d4f4bb31a102560013f7960f5d80ea44dcb96fd6304ed61e7a4", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.17.1", "8baab33482df4907b3eae22f719da492cee3981a26e649b9c2be1c0192616962", [:mix], [], "hexpm"}, "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, - "makeup": {:hex, :makeup, "0.5.5", "9e08dfc45280c5684d771ad58159f718a7b5788596099bdfb0284597d368a882", [:mix], [{:nimble_parsec, "~> 0.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.10.0", "0f09c2ddf352887a956d84f8f7e702111122ca32fbbc84c2f0569b8b65cbf7fa", [:mix], [{:makeup, "~> 0.5.5", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, "mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, "muontrap": {:hex, :muontrap, "0.5.0", "0b885a4095e990000d519441bccb8f037a9c4c35908720e7814a516a606be278", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "nerves_uart": {:hex, :nerves_uart, "1.2.0", "195424116b925cd3bf9d666be036c2a80655e6ca0f8d447e277667a60005c50e", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.4.0", "ee261bb53214943679422be70f1658fff573c5d0b0a1ecd0f18738944f818efe", [:mix], [], "hexpm"}, + "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "plug": {:hex, :plug, "1.7.1", "8516d565fb84a6a8b2ca722e74e2cd25ca0fc9d64f364ec9dbec09d33eb78ccd", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}], "hexpm"}, "plug_cowboy": {:hex, :plug_cowboy, "2.0.0", "ab0c92728f2ba43c544cce85f0f220d8d30fc0c90eaa1e6203683ab039655062", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, From b55d94b86f119f74827c89205d4fa4a7080b78a6 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 14:09:34 -0600 Subject: [PATCH 06/58] Dep updates for farmbot_ext --- farmbot_ext/mix.exs | 6 +++--- farmbot_ext/mix.lock | 23 ++++++++++++----------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/farmbot_ext/mix.exs b/farmbot_ext/mix.exs index ff0868343..e25462304 100644 --- a/farmbot_ext/mix.exs +++ b/farmbot_ext/mix.exs @@ -38,11 +38,11 @@ defmodule FarmbotExt.MixProject do {:tesla, "~> 1.2"}, {:hackney, "~> 1.15"}, {:uuid, "~> 1.1"}, - {:amqp, "~> 1.3"}, - {:mox, "~> 0.5", only: :test}, + {:amqp, "~> 1.4.0"}, + {:mox, "~> 0.5.1", only: :test}, {:excoveralls, "~> 0.10", only: [:test], targets: [:host]}, {:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false}, - {:ex_doc, "~> 0.19", only: [:dev], targets: [:host], runtime: false} + {:ex_doc, "~> 0.21.2", only: [:dev], targets: [:host], runtime: false} ] end end diff --git a/farmbot_ext/mix.lock b/farmbot_ext/mix.lock index cc0d635cf..981ec9feb 100644 --- a/farmbot_ext/mix.lock +++ b/farmbot_ext/mix.lock @@ -1,19 +1,20 @@ %{ - "amqp": {:hex, :amqp, "1.3.0", "246e84fd6b051c5b7fed0c7871df9bc2338bc029085192f61438a1f69180d621", [:mix], [{:amqp_client, "~> 3.7.11", [hex: :amqp_client, repo: "hexpm", optional: false]}, {:goldrush, "~> 0.1.0", [hex: :goldrush, repo: "hexpm", optional: false]}, {:jsx, "~> 2.9", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "~> 3.6.5", [hex: :lager, repo: "hexpm", optional: false]}, {:rabbit_common, "~> 3.7.11", [hex: :rabbit_common, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "~> 2.3", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, - "amqp_client": {:hex, :amqp_client, "3.7.11", "e692b3ba59e6df93c13cec5feefb62c956fcdbae341565101c7668375cc387fe", [:make, :rebar3], [{:rabbit_common, "3.7.11", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm"}, + "amqp": {:hex, :amqp, "1.4.0", "4172595d467b9360850a8eca254c5946af9970684d335d555a9f3410a0e43995", [:mix], [{:amqp_client, "~> 3.8.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm"}, + "amqp_client": {:hex, :amqp_client, "3.8.2", "b50ac381c3c016a697d6ab8f08367043a08358cfeb8ee97832ccc7d101e59cef", [:make, :rebar3], [{:rabbit_common, "3.8.2", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm"}, "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "circuits_uart": {:hex, :circuits_uart, "1.3.1", "8c0a56f06828133a0b08363ecb994350a9529d388a912357d31829ae617cd801", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, + "credentials_obfuscation": {:hex, :credentials_obfuscation, "1.1.0", "513793cc20c18afc9e03e584b436192a751a8344890e03a8741c65c8d6866fab", [:rebar3], [], "hexpm"}, "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "decimal": {:hex, :decimal, "1.8.0", "ca462e0d885f09a1c5a342dbd7c1dcf27ea63548c65a65e67334f4b61803822e", [:mix], [], "hexpm"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm"}, - "earmark": {:hex, :earmark, "1.3.2", "b840562ea3d67795ffbb5bd88940b1bed0ed9fa32834915125ea7d02e35888a5", [:mix], [], "hexpm"}, + "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm"}, "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm"}, "erlex": {:hex, :erlex, "0.2.1", "cee02918660807cbba9a7229cae9b42d1c6143b768c781fa6cee1eaf03ad860b", [:mix], [], "hexpm"}, "esqlite": {:hex, :esqlite, "0.3.0", "f6c96fae1236fd8da73da904278b820c807aee4f41c7c837c33de1c2edb857fb", [:rebar3], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.20.1", "88eaa16e67c505664fd6a66f42ddb962d424ad68df586b214b71443c69887123", [:mix], [{:earmark, "~> 1.3", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, + "ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, "excoveralls": {:hex, :excoveralls, "0.10.6", "e2b9718c9d8e3ef90bc22278c3f76c850a9f9116faf4ebe9678063310742edc2", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "gettext": {:hex, :gettext, "0.16.1", "e2130b25eebcbe02bb343b119a07ae2c7e28bd4b146c4a154da2ffb2b3507af2", [:mix], [], "hexpm"}, "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm"}, @@ -21,20 +22,20 @@ "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, "jsx": {:hex, :jsx, "2.9.0", "d2f6e5f069c00266cad52fb15d87c428579ea4d7d73a33669e12679e203329dd", [:mix, :rebar3], [], "hexpm"}, - "lager": {:hex, :lager, "3.6.5", "831910109f3fcb503debf658ca0538836b348c58bfbf349a6d48228096ce9040", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup": {:hex, :makeup, "0.8.0", "9cf32aea71c7fe0a4b2e9246c2c4978f9070257e5c9ce6d4a28ec450a839b55f", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.13.0", "be7a477997dcac2e48a9d695ec730b2d22418292675c75aa2d34ba0909dcdeda", [:mix], [{:makeup, "~> 0.8", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, + "lager": {:hex, :lager, "3.8.0", "3402b9a7e473680ca179fc2f1d827cab88dd37dd1e6113090c6f45ef05228a1c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, - "mox": {:hex, :mox, "0.5.0", "c519b48407017a85f03407a9a4c4ceb7cc6dec5fe886b2241869fb2f08476f9e", [:mix], [], "hexpm"}, + "mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm"}, "muontrap": {:hex, :muontrap, "0.5.0", "0b885a4095e990000d519441bccb8f037a9c4c35908720e7814a516a606be278", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm"}, + "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm"}, - "rabbit_common": {:hex, :rabbit_common, "3.7.11", "dc107a55f6213875264c5ffe014a8d7b34004893d9bc9eb5e16d6c519fb96cf1", [:make, :rebar3], [{:jsx, "2.9.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.6.5", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.3.6", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, + "rabbit_common": {:hex, :rabbit_common, "3.8.2", "6f5653e7ba8bbf76447b126d1ac224e1be5ed853808542bd67cbcff87fbd2493", [:make, :rebar3], [{:credentials_obfuscation, "1.1.0", [hex: :credentials_obfuscation, repo: "hexpm", optional: false]}, {:jsx, "2.9.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.8.0", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.5.0", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"}, - "recon": {:hex, :recon, "2.3.6", "2bcad0cf621fb277cabbb6413159cd3aa30265c2dee42c968697988b30108604", [:rebar3], [], "hexpm"}, + "recon": {:hex, :recon, "2.5.0", "2f7fcbec2c35034bade2f9717f77059dc54eb4e929a3049ca7ba6775c0bd66cd", [:mix, :rebar3], [], "hexpm"}, "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm"}, "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm"}, "sqlitex": {:hex, :sqlitex, "1.5.1", "0242c9a7602180b4f974315e6776c48d4ba211e9f4c5774dc886f15dc1a2edb3", [:mix], [{:decimal, "~> 1.7", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.3.0", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"}, From edd251660befad6d9f925921b4648374a4158d95 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 14:12:35 -0600 Subject: [PATCH 07/58] Dep updates for farmbot_firmware --- farmbot_firmware/mix.exs | 4 ++-- farmbot_firmware/mix.lock | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/farmbot_firmware/mix.exs b/farmbot_firmware/mix.exs index b4eede2ae..b5cd7cfd1 100644 --- a/farmbot_firmware/mix.exs +++ b/farmbot_firmware/mix.exs @@ -43,10 +43,10 @@ defmodule FarmbotFirmware.MixProject do defp deps do [ {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, - {:circuits_uart, "~> 1.3"}, + {:circuits_uart, "~> 1.4.0"}, {:excoveralls, "~> 0.10", only: [:test], targets: [:host]}, {:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false}, - {:ex_doc, "~> 0.19", only: [:dev], targets: [:host], runtime: false} + {:ex_doc, "~> 0.21.2", only: [:dev], targets: [:host], runtime: false} ] end end diff --git a/farmbot_firmware/mix.lock b/farmbot_firmware/mix.lock index b93c52f90..39008a2d5 100644 --- a/farmbot_firmware/mix.lock +++ b/farmbot_firmware/mix.lock @@ -1,6 +1,6 @@ %{ "certifi": {:hex, :certifi, "2.4.2", "75424ff0f3baaccfd34b1214184b6ef616d89e420b258bb0a5ea7d7bc628f7f0", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, - "circuits_uart": {:hex, :circuits_uart, "1.3.2", "206579d28fcd443881777fadf5ee6af1ea7835a7ccd352b54d73e98ea5266b4c", [:mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "circuits_uart": {:hex, :circuits_uart, "1.4.0", "799abad2d5f355bd571c46de089e62c6341e6b08f9fdf51f4d53d50f5d5bbda9", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, "cowboy": {:hex, :cowboy, "2.5.0", "4ef3ae066ee10fe01ea3272edc8f024347a0d3eb95f6fbb9aed556dacbfc1337", [:rebar3], [{:cowlib, "~> 2.6.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.6.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, @@ -8,25 +8,25 @@ "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.4", "71b42f5ee1b7628f3e3a6565f4617dfb02d127a0499ab3e72750455e986df001", [:mix], [{:erlex, "~> 0.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm"}, - "earmark": {:hex, :earmark, "1.2.6", "b6da42b3831458d3ecc57314dff3051b080b9b2be88c2e5aa41cd642a5b044ed", [:mix], [], "hexpm"}, + "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm"}, "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm"}, "erlex": {:hex, :erlex, "0.1.6", "c01c889363168d3fdd23f4211647d8a34c0f9a21ec726762312e08e083f3d47e", [:mix], [], "hexpm"}, "esqlite": {:hex, :esqlite, "0.2.4", "3a8a352c190afe2d6b828b252a6fbff65b5cc1124647f38b15bdab3bf6fd4b3e", [:rebar3], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.19.1", "519bb9c19526ca51d326c060cb1778d4a9056b190086a8c6c115828eaccea6cf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.7", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, + "ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, "excoveralls": {:hex, :excoveralls, "0.10.2", "fb4abd5b8a1b9d52d35e1162e7e2ea8bfb84b47ae07c38d39aa8ce64be0b0794", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "gen_stage": {:hex, :gen_stage, "0.14.1", "9d46723fda072d4f4bb31a102560013f7960f5d80ea44dcb96fd6304ed61e7a4", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.16.0", "4a7e90408cef5f1bf57c5a39e2db8c372a906031cc9b1466e963101cb927dafc", [:mix], [], "hexpm"}, "hackney": {:hex, :hackney, "1.14.3", "b5f6f5dcc4f1fba340762738759209e21914516df6be440d85772542d4a5e412", [:rebar3], [{:certifi, "2.4.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, - "makeup": {:hex, :makeup, "0.5.5", "9e08dfc45280c5684d771ad58159f718a7b5788596099bdfb0284597d368a882", [:mix], [{:nimble_parsec, "~> 0.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.10.0", "0f09c2ddf352887a956d84f8f7e702111122ca32fbbc84c2f0569b8b65cbf7fa", [:mix], [{:makeup, "~> 0.5.5", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, "mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"}, "nerves_uart": {:hex, :nerves_uart, "1.2.0", "195424116b925cd3bf9d666be036c2a80655e6ca0f8d447e277667a60005c50e", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.4.0", "ee261bb53214943679422be70f1658fff573c5d0b0a1ecd0f18738944f818efe", [:mix], [], "hexpm"}, + "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "plug": {:hex, :plug, "1.7.1", "8516d565fb84a6a8b2ca722e74e2cd25ca0fc9d64f364ec9dbec09d33eb78ccd", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}], "hexpm"}, "plug_cowboy": {:hex, :plug_cowboy, "2.0.0", "ab0c92728f2ba43c544cce85f0f220d8d30fc0c90eaa1e6203683ab039655062", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, From 3b517ba21f56dc1f74a90fa47f3819536410a811 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 14:14:18 -0600 Subject: [PATCH 08/58] Dep updates for farmbot_telemetry --- farmbot_telemetry/mix.exs | 2 +- farmbot_telemetry/mix.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/farmbot_telemetry/mix.exs b/farmbot_telemetry/mix.exs index 17054b9e6..5b5dfccfe 100644 --- a/farmbot_telemetry/mix.exs +++ b/farmbot_telemetry/mix.exs @@ -35,7 +35,7 @@ defmodule FarmbotTelemetry.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ - {:telemetry, "~> 0.4.0"}, + {:telemetry, "~> 0.4.1"}, {:uuid, "~> 1.1"}, {:excoveralls, "~> 0.10", only: [:test], targets: [:host]}, {:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false}, diff --git a/farmbot_telemetry/mix.lock b/farmbot_telemetry/mix.lock index 0955d383a..9ca48d4b0 100644 --- a/farmbot_telemetry/mix.lock +++ b/farmbot_telemetry/mix.lock @@ -15,7 +15,7 @@ "nimble_parsec": {:hex, :nimble_parsec, "0.5.1", "c90796ecee0289dbb5ad16d3ad06f957b0cd1199769641c961cfe0b97db190e0", [:mix], [], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, - "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm"}, } From 43a8cb592018217ab6bcbb462864e73424e052fb Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 10:20:26 -0800 Subject: [PATCH 09/58] Update VintageNet to 0.7 --- farmbot_os/mix.exs | 5 ++- farmbot_os/mix.lock | 20 ++++++----- .../target/configurator/captive_portal.ex | 30 ++++++++-------- .../platform/target/configurator/validator.ex | 34 ++++++++++++------- farmbot_os/platform/target/network.ex | 2 +- 5 files changed, 54 insertions(+), 37 deletions(-) diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index a350a80b2..2e33c3828 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -101,7 +101,10 @@ defmodule FarmbotOS.MixProject do {:nerves_firmware_ssh, "~> 0.4", targets: @all_targets}, {:circuits_gpio, "~> 0.4.3", targets: @all_targets}, {:toolshed, "~> 0.2", targets: @all_targets}, - {:vintage_net, "~> 0.6", targets: @all_targets}, + {:vintage_net, "~> 0.7", targets: @all_targets}, + {:vintage_net_ethernet, "~> 0.7.0", targets: @all_targets}, + {:vintage_net_wifi, "~> 0.7.0", targets: @all_targets}, + {:vintage_net_direct, "~> 0.7.0", targets: @all_targets}, {:mdns_lite, "~> 0.6.1", targets: @all_targets}, {:busybox, "~> 0.1.4", targets: @all_targets}, {:nerves_system_br, "~> 1.9", override: true, runtime: false, targets: @all_targets}, diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock index d3ab6eb77..e573006c2 100644 --- a/farmbot_os/mix.lock +++ b/farmbot_os/mix.lock @@ -1,15 +1,16 @@ %{ - "amqp": {:hex, :amqp, "1.3.0", "246e84fd6b051c5b7fed0c7871df9bc2338bc029085192f61438a1f69180d621", [:mix], [{:amqp_client, "~> 3.7.11", [hex: :amqp_client, repo: "hexpm", optional: false]}, {:goldrush, "~> 0.1.0", [hex: :goldrush, repo: "hexpm", optional: false]}, {:jsx, "~> 2.9", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "~> 3.6.5", [hex: :lager, repo: "hexpm", optional: false]}, {:rabbit_common, "~> 3.7.11", [hex: :rabbit_common, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "~> 2.3", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, - "amqp_client": {:hex, :amqp_client, "3.7.11", "e692b3ba59e6df93c13cec5feefb62c956fcdbae341565101c7668375cc387fe", [:make, :rebar3], [{:rabbit_common, "3.7.11", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm"}, + "amqp": {:hex, :amqp, "1.4.0", "4172595d467b9360850a8eca254c5946af9970684d335d555a9f3410a0e43995", [:mix], [{:amqp_client, "~> 3.8.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm"}, + "amqp_client": {:hex, :amqp_client, "3.8.2", "b50ac381c3c016a697d6ab8f08367043a08358cfeb8ee97832ccc7d101e59cef", [:make, :rebar3], [{:rabbit_common, "3.8.2", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm"}, "busybox": {:hex, :busybox, "0.1.4", "9b07860c0663e7d0ace3093100ede44860bd73c22b17c2941a4b17e25893cc36", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "circuits_gpio": {:hex, :circuits_gpio, "0.4.3", "1a53dff1eaeefb9f67f4ebc2c1852b603683eedaa6053bed51c038dd64b978bb", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, - "circuits_uart": {:hex, :circuits_uart, "1.3.2", "206579d28fcd443881777fadf5ee6af1ea7835a7ccd352b54d73e98ea5266b4c", [:mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "circuits_uart": {:hex, :circuits_uart, "1.4.0", "799abad2d5f355bd571c46de089e62c6341e6b08f9fdf51f4d53d50f5d5bbda9", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, "cors_plug": {:hex, :cors_plug, "2.0.0", "238ddb479f92b38f6dc1ae44b8d81f0387f9519101a6da442d543ab70ee0e482", [:mix], [{:plug, "~> 1.3 or ~> 1.4 or ~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "cowboy": {:hex, :cowboy, "2.6.3", "99aa50e94e685557cad82e704457336a453d4abcb77839ad22dbe71f311fcc06", [:rebar3], [{:cowlib, "~> 2.7.3", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, "cowlib": {:hex, :cowlib, "2.7.3", "a7ffcd0917e6d50b4d5fb28e9e2085a0ceb3c97dea310505f7460ff5ed764ce9", [:rebar3], [], "hexpm"}, + "credentials_obfuscation": {:hex, :credentials_obfuscation, "1.1.0", "513793cc20c18afc9e03e584b436192a751a8344890e03a8741c65c8d6866fab", [:rebar3], [], "hexpm"}, "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "decimal": {:hex, :decimal, "1.8.0", "ca462e0d885f09a1c5a342dbd7c1dcf27ea63548c65a65e67334f4b61803822e", [:mix], [], "hexpm"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm"}, @@ -32,7 +33,7 @@ "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, "jsx": {:hex, :jsx, "2.9.0", "d2f6e5f069c00266cad52fb15d87c428579ea4d7d73a33669e12679e203329dd", [:mix, :rebar3], [], "hexpm"}, - "lager": {:hex, :lager, "3.6.5", "831910109f3fcb503debf658ca0538836b348c58bfbf349a6d48228096ce9040", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm"}, + "lager": {:hex, :lager, "3.8.0", "3402b9a7e473680ca179fc2f1d827cab88dd37dd1e6113090c6f45ef05228a1c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm"}, "luer": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, "luerl": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, @@ -66,9 +67,9 @@ "plug_cowboy": {:hex, :plug_cowboy, "2.1.0", "b75768153c3a8a9e8039d4b25bb9b14efbc58e9c4a6e6a270abff1cd30cbe320", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm"}, - "rabbit_common": {:hex, :rabbit_common, "3.7.11", "dc107a55f6213875264c5ffe014a8d7b34004893d9bc9eb5e16d6c519fb96cf1", [:make, :rebar3], [{:jsx, "2.9.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.6.5", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.3.6", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, + "rabbit_common": {:hex, :rabbit_common, "3.8.2", "6f5653e7ba8bbf76447b126d1ac224e1be5ed853808542bd67cbcff87fbd2493", [:make, :rebar3], [{:credentials_obfuscation, "1.1.0", [hex: :credentials_obfuscation, repo: "hexpm", optional: false]}, {:jsx, "2.9.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.8.0", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.5.0", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"}, - "recon": {:hex, :recon, "2.3.6", "2bcad0cf621fb277cabbb6413159cd3aa30265c2dee42c968697988b30108604", [:rebar3], [], "hexpm"}, + "recon": {:hex, :recon, "2.5.0", "2f7fcbec2c35034bade2f9717f77059dc54eb4e929a3049ca7ba6775c0bd66cd", [:mix, :rebar3], [], "hexpm"}, "ring_logger": {:hex, :ring_logger, "0.8.0", "b1baddc269099b2afe2ea3a87b8e2b71e57331c0000038ae55090068aac679db", [:mix], [], "hexpm"}, "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm"}, "shoehorn": {:hex, :shoehorn, "0.6.0", "f9a1b7d6212cf18ba91c4f71c26076059df33cea4db2eb3c098bfa6673349412", [:mix], [{:distillery, "~> 2.1", [hex: :distillery, repo: "hexpm", optional: true]}], "hexpm"}, @@ -78,7 +79,7 @@ "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, "system_registry": {:hex, :system_registry, "0.8.2", "df791dc276652fcfb53be4dab823e05f8269b96ac57c26f86a67838dbc0eefe7", [:mix], [], "hexpm"}, "table_rex": {:hex, :table_rex, "2.0.0", "712783cbc2decb4d644d2ab8ad9315294f960c41b2cf0539308164922e352084", [:mix], [], "hexpm"}, - "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm"}, "tesla": {:hex, :tesla, "1.3.0", "f35d72f029e608f9cdc6f6d6fcc7c66cf6d6512a70cfef9206b21b8bd0203a30", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 0.4", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"}, "timex": {:hex, :timex, "3.5.0", "b0a23167da02d0fe4f1a4e104d1f929a00d348502b52432c05de875d0b9cffa5", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"}, "toolshed": {:hex, :toolshed, "0.2.11", "0cd5312bd6a48f5b654b6ffa9239a63af9f3d200da414790fe25f066e14842a9", [:mix], [{:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: true]}], "hexpm"}, @@ -86,7 +87,10 @@ "uboot_env": {:hex, :uboot_env, "0.1.1", "b01e3ec0973e99473234f27839e29e63b5b81eba6a136a18a78d049d4813d6c5", [:mix], [], "hexpm"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm"}, - "vintage_net": {:hex, :vintage_net, "0.6.4", "131bea87c3052f989eda3d64e5288ffc5e280a8b95a98c6ac10699fd524f0ec3", [:make, :mix], [{:busybox, "~> 0.1", [hex: :busybox, repo: "hexpm", optional: true]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:gen_state_machine, "~> 2.0.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5.0", [hex: :muontrap, repo: "hexpm", optional: false]}, {:one_dhcpd, "~> 0.2.3", [hex: :one_dhcpd, repo: "hexpm", optional: false]}], "hexpm"}, + "vintage_net": {:hex, :vintage_net, "0.7.0", "31f5f9df881968572597aaab18ab0aaa13b0383805316d34a00f79fc16bbde0d", [:make, :mix], [{:busybox, "~> 0.1.4", [hex: :busybox, repo: "hexpm", optional: true]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:gen_state_machine, "~> 2.0.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5.0", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm"}, + "vintage_net_direct": {:hex, :vintage_net_direct, "0.7.0", "6a8d95432fc2fb9a9e0225bf1a6dbb7c1ba097bb509a989e947ad3f44d2b0f28", [:mix], [{:one_dhcpd, "~> 0.2.3", [hex: :one_dhcpd, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.7.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm"}, + "vintage_net_ethernet": {:hex, :vintage_net_ethernet, "0.7.0", "b66a4da0846b4a55a471d15d8ab2bedbbef9c75c18f4e511c43777f7cfeffa09", [:mix], [{:vintage_net, "~> 0.7.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm"}, + "vintage_net_wifi": {:hex, :vintage_net_wifi, "0.7.0", "be3d8275fa40ba357159033523606c74c8f612dbd60801840df60835453a6906", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.7.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm"}, "websocket_client": {:hex, :websocket_client, "1.3.0", "2275d7daaa1cdacebf2068891c9844b15f4fdc3de3ec2602420c2fb486db59b6", [:rebar3], [], "hexpm"}, "x509": {:hex, :x509, "0.7.0", "001b762cd99e1a33bc876bb090bd34d9cadc66eb7df3deb76d9f4d8a37b89612", [:mix], [], "hexpm"}, } diff --git a/farmbot_os/platform/target/configurator/captive_portal.ex b/farmbot_os/platform/target/configurator/captive_portal.ex index e24cd0057..56700f9c5 100644 --- a/farmbot_os/platform/target/configurator/captive_portal.ex +++ b/farmbot_os/platform/target/configurator/captive_portal.ex @@ -1,25 +1,25 @@ defmodule FarmbotOS.Platform.Target.Configurator.CaptivePortal do @moduledoc """ Handles turning Farmbot's internal network representation into - either a VintageNet.Technology.Ethernet or VintageNet.Technology.WiFi + either a VintageNetEthernet or VintageNetWiFi RawConfig. """ @behaviour VintageNet.Technology require FarmbotCore.Logger @impl VintageNet.Technology - def normalize(%{wifi: _} = config) do - %{config | type: VintageNet.Technology.WiFi} - |> VintageNet.Technology.WiFi.normalize() + def normalize(%{vintage_net_wifi: _} = config) do + %{config | type: VintageNetWiFi} + |> VintageNetWiFi.normalize() end def normalize(config) do - %{config | type: VintageNet.Technology.Ethernet} - |> VintageNet.Technology.Ethernet.normalize() + %{config | type: VintageNetEthernet} + |> VintageNetEthernet.normalize() end @impl VintageNet.Technology - def to_raw_config(ifname, %{wifi: _} = config, opts) do + def to_raw_config(ifname, %{vintage_net_wifi: _} = config, opts) do normalized = normalize(config) ifname @@ -37,12 +37,12 @@ defmodule FarmbotOS.Platform.Target.Configurator.CaptivePortal do @impl VintageNet.Technology def check_system(opts) do - VintageNet.Technology.WiFi.check_system(opts) + VintageNetWiFi.check_system(opts) end @impl true def ioctl(ifname, ioctl, args) do - VintageNet.Technology.WiFi.ioctl(ifname, ioctl, args) + VintageNetWiFi.ioctl(ifname, ioctl, args) end defp dnsmasq(%{ifname: ifname, source_config: %{dnsmasq: config}} = raw_config, opts) do @@ -105,14 +105,14 @@ defmodule FarmbotOS.Platform.Target.Configurator.CaptivePortal do end defp vintage_wifi(ifname, config, opts) do - config = VintageNet.Technology.WiFi.normalize(config) - raw_config = VintageNet.Technology.WiFi.to_raw_config(ifname, config, opts) - %{raw_config | type: VintageNet.Technology.WiFi} + config = VintageNetWiFi.normalize(config) + raw_config = VintageNetWiFi.to_raw_config(ifname, config, opts) + %{raw_config | type: VintageNetWiFi} end defp vintage_ethernet(ifname, config, opts) do - config = VintageNet.Technology.Ethernet.normalize(config) - raw_config = VintageNet.Technology.Ethernet.to_raw_config(ifname, config, opts) - %{raw_config | type: VintageNet.Technology.Ethernet} + config = VintageNetEthernet.normalize(config) + raw_config = VintageNetEthernet.to_raw_config(ifname, config, opts) + %{raw_config | type: VintageNetEthernet} end end diff --git a/farmbot_os/platform/target/configurator/validator.ex b/farmbot_os/platform/target/configurator/validator.ex index 5df0232c1..d1851f64f 100644 --- a/farmbot_os/platform/target/configurator/validator.ex +++ b/farmbot_os/platform/target/configurator/validator.ex @@ -1,7 +1,7 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do @moduledoc """ Handles turning Farmbot's internal network representation into - either a VintageNet.Technology.Ethernet or VintageNet.Technology.WiFi + either a VintageNetEthernet or VintageNetWiFi RawConfig. """ @behaviour VintageNet.Technology @@ -41,7 +41,7 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do def to_wired_raw_config(ifname, config, opts) do config = %{ - type: VintageNet.Technology.Ethernet, + type: VintageNetEthernet, ipv4: to_ipv4(config) } @@ -50,9 +50,9 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do def to_wireless_raw_config(ifname, config, opts) do config = %{ - type: VintageNet.Technology.WiFi, + type: VintageNetWiFi, ipv4: to_ipv4(config), - wifi: to_wifi(config) + vintage_net_wifi: to_vintage_net_wifi(config) } vintage_wifi(ifname, config, opts) @@ -89,7 +89,7 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do %{method: :dhcp} end - defp to_wifi(%{security: "NONE", ssid: ssid, regulatory_domain: reg_domain}) do + defp to_vintage_net_wifi(%{security: "NONE", ssid: ssid, regulatory_domain: reg_domain}) do %{ networks: [ %{ @@ -103,7 +103,12 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do } end - defp to_wifi(%{security: "WPA-PSK", ssid: ssid, psk: psk, regulatory_domain: reg_domain}) do + defp to_vintage_net_wifi(%{ + security: "WPA-PSK", + ssid: ssid, + psk: psk, + regulatory_domain: reg_domain + }) do %{ networks: [ %{ @@ -118,7 +123,12 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do } end - defp to_wifi(%{security: "WPA2-PSK", ssid: ssid, psk: psk, regulatory_domain: reg_domain}) do + defp to_vintage_net_wifi(%{ + security: "WPA2-PSK", + ssid: ssid, + psk: psk, + regulatory_domain: reg_domain + }) do %{ networks: [ %{ @@ -133,7 +143,7 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do } end - defp to_wifi(%{ + defp to_vintage_net_wifi(%{ security: "WPA-EAP", ssid: ssid, identity: id, @@ -161,12 +171,12 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do end defp vintage_ethernet(ifname, config, opts) do - config = VintageNet.Technology.Ethernet.normalize(config) - VintageNet.Technology.Ethernet.to_raw_config(ifname, config, opts) + config = VintageNetEthernet.normalize(config) + VintageNetEthernet.to_raw_config(ifname, config, opts) end defp vintage_wifi(ifname, config, opts) do - config = VintageNet.Technology.WiFi.normalize(config) - VintageNet.Technology.WiFi.to_raw_config(ifname, config, opts) + config = VintageNetWiFi.normalize(config) + VintageNetWiFi.to_raw_config(ifname, config, opts) end end diff --git a/farmbot_os/platform/target/network.ex b/farmbot_os/platform/target/network.ex index 202789977..7ac7b9564 100644 --- a/farmbot_os/platform/target/network.ex +++ b/farmbot_os/platform/target/network.ex @@ -21,7 +21,7 @@ defmodule FarmbotOS.Platform.Target.Network do def host do %{ type: CaptivePortal, - wifi: %{ + vintage_net_wifi: %{ networks: [ %{ ssid: build_hostap_ssid(), From 319548e0d35cd2d55fb9706b15f846fba51d2ae0 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 15:49:00 -0600 Subject: [PATCH 10/58] Update nerves system rpi3/rpi0. TODO: Beta release. --- farmbot_os/mix.exs | 5 ++--- farmbot_os/mix.lock | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index 2e33c3828..36c63abd9 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -107,9 +107,8 @@ defmodule FarmbotOS.MixProject do {:vintage_net_direct, "~> 0.7.0", targets: @all_targets}, {:mdns_lite, "~> 0.6.1", targets: @all_targets}, {:busybox, "~> 0.1.4", targets: @all_targets}, - {:nerves_system_br, "~> 1.9", override: true, runtime: false, targets: @all_targets}, - {:farmbot_system_rpi3, "1.9.1-farmbot.4", runtime: false, targets: :rpi3}, - {:farmbot_system_rpi, "1.9.0-farmbot.1", runtime: false, targets: :rpi} + {:farmbot_system_rpi3, "1.10.0-farmbot.1", runtime: false, targets: :rpi3}, + {:farmbot_system_rpi, "1.10.0-farmbot.1", runtime: false, targets: :rpi} ] end diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock index e573006c2..dbcd5a9e5 100644 --- a/farmbot_os/mix.lock +++ b/farmbot_os/mix.lock @@ -22,9 +22,9 @@ "esqlite": {:hex, :esqlite, "0.2.5", "cab6d87aeb5f33d848b9bb8a21129e9512ea608f930d4c63576942d8f7d72218", [:rebar3], [], "hexpm"}, "ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, "excoveralls": {:hex, :excoveralls, "0.10.6", "e2b9718c9d8e3ef90bc22278c3f76c850a9f9116faf4ebe9678063310742edc2", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, - "farmbot_system_rpi": {:hex, :farmbot_system_rpi, "1.9.0-farmbot.1", "4e178645ab49e82d988558360447bf7a22c84a56c0284d61b64aaeef936ff2e8", [:mix], [{:nerves, "~> 1.5.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.9.2", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "1.2.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"}, + "farmbot_system_rpi": {:hex, :farmbot_system_rpi, "1.10.0-farmbot.1", "baf3e08e53adfaa4f6af76f544713b7943b00295cf41be5f117f4f33b5d68cc6", [:mix], [{:nerves, "~> 1.5.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.10.0", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "1.2.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"}, "farmbot_system_rpi0": {:hex, :farmbot_system_rpi0, "1.8.0-farmbot.0", "017d5c50a462a30acee8de882c62c584131048b6efd7ea3367cbf56be50deebe", [:mix], [{:nerves, "~> 1.4", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.8.2", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "1.2.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"}, - "farmbot_system_rpi3": {:hex, :farmbot_system_rpi3, "1.9.1-farmbot.4", "f968b433e4bcc54f1f489e61926537b919a956a477d59cdc00527f7593374afa", [:mix], [{:nerves, "~> 1.5.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.9.4", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_arm_unknown_linux_gnueabihf, "1.2.0", [hex: :nerves_toolchain_arm_unknown_linux_gnueabihf, repo: "hexpm", optional: false]}], "hexpm"}, + "farmbot_system_rpi3": {:hex, :farmbot_system_rpi3, "1.10.0-farmbot.1", "8032728161829e80f526dd37d075864f5edf20738e3f0e24962d62664ac96937", [:mix], [{:nerves, "~> 1.5.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.10.0", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_arm_unknown_linux_gnueabihf, "1.2.0", [hex: :nerves_toolchain_arm_unknown_linux_gnueabihf, repo: "hexpm", optional: false]}], "hexpm"}, "fwup": {:hex, :fwup, "0.3.0", "2c360815565fcbc945ebbb34b58f156efacb7f8d64766f1cb3426919bb3f41ea", [:mix], [], "hexpm"}, "gen_state_machine": {:hex, :gen_state_machine, "2.0.5", "9ac15ec6e66acac994cc442dcc2c6f9796cf380ec4b08267223014be1c728a95", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.17.0", "abe21542c831887a2b16f4c94556db9c421ab301aee417b7c4fbde7fbdbe01ec", [:mix], [], "hexpm"}, From ec55ebe7974b404168e3d1377c598edab481c5af Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 15:52:01 -0600 Subject: [PATCH 11/58] Release v9.0.0-rc1 --- CHANGELOG.md | 3 +++ VERSION | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2af8f872..81e4565f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +# 9.0.0-rc1 + * Run updates on Nerves systems. + # 8.2.4 * Bug fixes * fix Farmware causing sequences to exit diff --git a/VERSION b/VERSION index 7e98f24e8..73b12b4d5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.2.4 \ No newline at end of file +9.0.0-rc1 From 5b0dfa02c2d5fd9d0970bb18a041d6354173a66e Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 14:01:59 -0800 Subject: [PATCH 12/58] Fix updated NervesTime dependency --- farmbot_os/platform/target/network.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/farmbot_os/platform/target/network.ex b/farmbot_os/platform/target/network.ex index 7ac7b9564..076dea06d 100644 --- a/farmbot_os/platform/target/network.ex +++ b/farmbot_os/platform/target/network.ex @@ -320,7 +320,7 @@ defmodule FarmbotOS.Platform.Target.Network do [ntp_server_1, ntp_server_2] |> Enum.reject(&is_nil/1) - |> Nerves.Time.set_ntp_servers() + |> NervesTime.set_ntp_servers() else Logger.info("Using default NTP servers") :ok From cf4112852e63f4b244b46ed197ab1c73c68bd5ed Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 14:03:53 -0800 Subject: [PATCH 13/58] Release v9.0.0-rc2 --- CHANGELOG.md | 2 +- VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81e4565f2..f96f68f6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -# 9.0.0-rc1 +# 9.0.0 * Run updates on Nerves systems. # 8.2.4 diff --git a/VERSION b/VERSION index 73b12b4d5..156c967b0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc1 +9.0.0-rc2 From d9916d474a3bd25140e79ff4b9d306aaccb1f46e Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 16:22:13 -0600 Subject: [PATCH 14/58] Release v9.0.0-rc3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 156c967b0..d12cf1686 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc2 +9.0.0-rc3 From 4dd9e0be88c1508204220ad189252a50966ac6cd Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 16 Dec 2019 16:29:01 -0600 Subject: [PATCH 15/58] Release v9.0.0-rc4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d12cf1686..5d648a16e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc3 +9.0.0-rc4 \ No newline at end of file From 41c9c3af2216240fd1826f49c0bcd87c7ffd3cba Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 16:29:44 -0800 Subject: [PATCH 16/58] Implement RTC --- farmbot_os/config/target/rpi.exs | 1 + farmbot_os/config/target/rpi0.exs | 1 + farmbot_os/config/target/rpi3.exs | 5 +- farmbot_os/mix.exs | 1 + farmbot_os/mix.lock | 1 + farmbot_os/platform/target/rtc_worker.ex | 200 +++++++++++++++++++++++ 6 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 farmbot_os/platform/target/rtc_worker.ex diff --git a/farmbot_os/config/target/rpi.exs b/farmbot_os/config/target/rpi.exs index 230316918..9844b280e 100644 --- a/farmbot_os/config/target/rpi.exs +++ b/farmbot_os/config/target/rpi.exs @@ -7,5 +7,6 @@ config :farmbot_firmware, FarmbotFirmware.UARTTransport, config :farmbot, FarmbotOS.Init.Supervisor, init_children: [ + FarmbotOS.Platform.Target.RTCWorker, FarmbotOS.Platform.Target.FirmwareReset.GPIO ] diff --git a/farmbot_os/config/target/rpi0.exs b/farmbot_os/config/target/rpi0.exs index daf68a8df..f2152405c 100644 --- a/farmbot_os/config/target/rpi0.exs +++ b/farmbot_os/config/target/rpi0.exs @@ -9,5 +9,6 @@ config :farmbot_firmware, FarmbotFirmware.UARTTransport, config :farmbot, FarmbotOS.Init.Supervisor, init_children: [ + FarmbotOS.Platform.Target.RTCWorker, FarmbotOS.Platform.Target.FirmwareReset.GPIO ] diff --git a/farmbot_os/config/target/rpi3.exs b/farmbot_os/config/target/rpi3.exs index ccfc7d761..a003a2cb7 100644 --- a/farmbot_os/config/target/rpi3.exs +++ b/farmbot_os/config/target/rpi3.exs @@ -5,4 +5,7 @@ config :farmbot_core, FarmbotCore.FirmwareTTYDetector, expected_names: ["ttyUSB0 config :farmbot_firmware, FarmbotFirmware.UARTTransport, reset: FarmbotOS.Platform.Target.FirmwareReset.NULL -config :farmbot, FarmbotOS.Init.Supervisor, init_children: [] +config :farmbot, FarmbotOS.Init.Supervisor, + init_children: [ + FarmbotOS.Platform.Target.RTCWorker + ] diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index 36c63abd9..f312c1c5a 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -100,6 +100,7 @@ defmodule FarmbotOS.MixProject do {:nerves_hub, "~> 0.7", targets: @all_targets}, {:nerves_firmware_ssh, "~> 0.4", targets: @all_targets}, {:circuits_gpio, "~> 0.4.3", targets: @all_targets}, + {:circuits_i2c, "~> 0.3.5", targets: @all_targets}, {:toolshed, "~> 0.2", targets: @all_targets}, {:vintage_net, "~> 0.7", targets: @all_targets}, {:vintage_net_ethernet, "~> 0.7.0", targets: @all_targets}, diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock index dbcd5a9e5..63300b207 100644 --- a/farmbot_os/mix.lock +++ b/farmbot_os/mix.lock @@ -4,6 +4,7 @@ "busybox": {:hex, :busybox, "0.1.4", "9b07860c0663e7d0ace3093100ede44860bd73c22b17c2941a4b17e25893cc36", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "circuits_gpio": {:hex, :circuits_gpio, "0.4.3", "1a53dff1eaeefb9f67f4ebc2c1852b603683eedaa6053bed51c038dd64b978bb", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "circuits_i2c": {:hex, :circuits_i2c, "0.3.5", "43e043d7efc3aead364061f8a7ed627f81ff7cef52bfa47cb629d8a68ca56a9f", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "circuits_uart": {:hex, :circuits_uart, "1.4.0", "799abad2d5f355bd571c46de089e62c6341e6b08f9fdf51f4d53d50f5d5bbda9", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, diff --git a/farmbot_os/platform/target/rtc_worker.ex b/farmbot_os/platform/target/rtc_worker.ex new file mode 100644 index 000000000..dc1945729 --- /dev/null +++ b/farmbot_os/platform/target/rtc_worker.ex @@ -0,0 +1,200 @@ +defmodule FarmbotOS.Platform.Target.RTCWorker do + @moduledoc """ + Handler for syncronizing time with an RTC and ntpd + """ + + use GenServer + require Logger + alias Circuits.I2C + @eleven_minutes 660_000 + + @doc "checks if an RTC is available on the I2C bus" + @spec rtc_available?(I2C.bus()) :: boolean() + def rtc_available?(i2c) do + case I2C.write_read(i2c, 0x51, <<0x00>>, 1) do + {:ok, ok} when byte_size(ok) == 1 -> + Logger.info("detected RTC") + true + + {:error, :i2c_nak} -> + false + end + end + + @doc "Checks the VL bit on the `seconds` register" + def get_vl_from_rtc(i2c) do + case I2C.write_read(i2c, 0x51, <<0x02>>, 1) do + # clock integrity is guaranteed + {:ok, <<0::integer-1, _::size(7)>>} -> + {:ok, true} + + # clock integrity NOT guaranteed + {:ok, <<1::integer-1, _::size(7)>>} -> + {:ok, false} + + {:error, error} -> + {:error, error} + end + end + + @doc "Saves a NaiveDateTime onto the RTC" + @spec set_time_to_rtc(I2C.bus(), NaiveDateTime.t()) :: :ok | {:error, term()} + def set_time_to_rtc(i2c, %NaiveDateTime{} = date_time) do + # discard top bit + <<_::bits-1, second::integer-7>> = int_to_bcd(date_time.second) + # discard top bit + <<_::bits-1, minute::integer-7>> = int_to_bcd(date_time.minute) + # discard 2 bits + <<_::bits-2, hour::integer-6>> = int_to_bcd(date_time.hour) + <<_::bits-2, day::integer-6>> = int_to_bcd(date_time.day) + <<_::bits-3, month::integer-5>> = int_to_bcd(date_time.month) + year = int_to_bcd(date_time.year - 2000) + + I2C.write(i2c, 0x51, [ + <<0x02>>, + # unset the VL bit. The clock is guaranteed after this. + <<0::integer-1, second::integer-7>>, + # drop first bit + <<0::integer-1, minute::integer-7>>, + # drop first two bits + <<0::integer-2, hour::integer-6>>, + <<0::integer-2, day::integer-6>>, + # weekday + <<0::size(8)>>, + # first bit is century. drop 2 bits. + <<1::integer-1, 0::integer-2, month::integer-5>>, + year + ]) + end + + @doc "Gets a NaiveDateTime from the rtc" + @spec get_time_from_rtc(I2C.bus()) :: {:ok, NaiveDateTime.t()} | {:error, term()} + def get_time_from_rtc(i2c) do + with {:ok, <<_vl::bits-1, second::bits-7>>} <- I2C.write_read(i2c, 0x51, <<0x02>>, 1), + {:ok, <<_::bits-1, minute::bits-7>>} <- I2C.write_read(i2c, 0x51, <<0x03>>, 1), + {:ok, <<_::bits-2, hour::bits-6>>} <- I2C.write_read(i2c, 0x51, <<0x04>>, 1), + {:ok, <<_::bits-2, day::bits-6>>} <- I2C.write_read(i2c, 0x51, <<0x05>>, 1), + {:ok, <<_c::bits-1, _::bits-2, month::bits-5>>} <- + I2C.write_read(i2c, 0x51, <<0x07>>, 1), + # implied 20XX + {:ok, <>} <- I2C.write_read(i2c, 0x51, <<0x08>>, 1) do + dt = %NaiveDateTime{ + day: bcd_to_int(day), + hour: bcd_to_int(hour), + minute: bcd_to_int(minute), + month: bcd_to_int(month), + second: bcd_to_int(second), + year: 2000 + bcd_to_int(year) + } + + {:ok, dt} + end + end + + @doc "Sets the system clock from a NaiveDateTime" + @spec set_system_clock(NaiveDateTime.t()) :: :ok | {:error, term()} + def set_system_clock(%NaiveDateTime{} = dt) do + str = format_date_time(dt) + + case System.cmd("date", ["-u", "-s", str], stderr_to_stdout: true) do + {_, 0} -> :ok + {error, _} -> {:error, String.trim(error)} + end + end + + def format_date_time(%NaiveDateTime{} = dt) do + str = + :io_lib.format( + '~4..0B-~2..0B-~2..0B ~2..0B:~2..0B:~2..0B', + [dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second] + ) + + to_string(str) + end + + @doc "Converts an integer to a 8bit BCD encoded binary" + def int_to_bcd(value) when value <= 9 do + <<0::integer-4, value::integer-4>> + end + + def int_to_bcd(value) when value <= 99 do + tens = div(value, 10) + units = rem(value, 10) + <> + end + + @doc "Converts an BCD encoded binary to an integer" + def bcd_to_int(value, power \\ 10) + + # 5 bit bcd + def bcd_to_int(<>, pow), + do: bcd_to_int(tens, units, pow) + + # 6 bit bcd + def bcd_to_int(<>, pow), + do: bcd_to_int(tens, units, pow) + + # 7 bit bcd + def bcd_to_int(<>, pow), + do: bcd_to_int(tens, units, pow) + + # 8 bit bcd + def bcd_to_int(<>, pow), + do: bcd_to_int(tens, units, pow) + + def bcd_to_int(tens, units, pow) when units >= pow, + do: bcd_to_int(tens, units, pow * 10) + + def bcd_to_int(tens, units, pow), + do: tens * pow + units + + @doc false + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + @impl GenServer + def init(_args) do + with {:ok, i2c} <- I2C.open("i2c-1"), + true <- rtc_available?(i2c) do + Logger.debug("beginning RTC sync") + send(self(), :set_system_time_from_rtc) + {:ok, %{i2c: i2c}} + else + _ -> + Logger.info("Could not detect RTC.") + {:ok, %{i2c: nil}} + end + end + + @impl GenServer + def handle_info(:set_system_time_from_rtc, %{i2c: i2c} = state) do + with {:ok, true} <- get_vl_from_rtc(i2c), + {:ok, %NaiveDateTime{} = dt} <- get_time_from_rtc(i2c), + :ok <- set_system_clock(dt) do + Logger.info("set system time from RTC: #{dt}") + else + {:ok, false} -> + Logger.error("Not setting system time from RTC. VL bit is unset") + + error -> + Logger.error("failed to get time from rtc or set system time: #{inspect(error)}") + end + + Process.send_after(self(), :set_rtc_from_ntp, @eleven_minutes) + {:noreply, state} + end + + def handle_info(:set_rtc_from_ntp, %{i2c: i2c} = state) do + dt = NaiveDateTime.utc_now() + + if NervesTime.synchronized?() do + set_time_to_rtc(i2c, dt) + Process.send_after(self(), :set_rtc_from_ntp, @eleven_minutes) + else + send(self(), :set_system_time_from_rtc) + end + + {:noreply, state} + end +end From bffd609d75f21ab61ba0ebe74e04ea773bdae47d Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 13:24:28 -0800 Subject: [PATCH 17/58] Release v9.0.0-rc5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5d648a16e..24a735c2d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc4 \ No newline at end of file +9.0.0-rc5 \ No newline at end of file From f78b146bca45b0cdb3267a3c02d9bd2850da6f47 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 13:35:39 -0800 Subject: [PATCH 18/58] Delete old file --- .../lib/farmbot_celery_script/compilers/firmware_compiler.ex | 1 - 1 file changed, 1 deletion(-) delete mode 100644 farmbot_celery_script/lib/farmbot_celery_script/compilers/firmware_compiler.ex diff --git a/farmbot_celery_script/lib/farmbot_celery_script/compilers/firmware_compiler.ex b/farmbot_celery_script/lib/farmbot_celery_script/compilers/firmware_compiler.ex deleted file mode 100644 index 8b1378917..000000000 --- a/farmbot_celery_script/lib/farmbot_celery_script/compilers/firmware_compiler.ex +++ /dev/null @@ -1 +0,0 @@ - From fa15763c85aebca0af9ecffe75f34470bb608c65 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 13:59:26 -0800 Subject: [PATCH 19/58] Update docs for farmbot_os OTP app --- .../configurator/config_data_layer.ex | 5 + .../lib/farmbot_os/configurator/data_layer.ex | 13 ++ .../configurator/dets_telemetry_layer.ex | 7 ++ .../configurator/fake_network_layer.ex | 4 + .../farmbot_os/configurator/logger_socket.ex | 10 ++ .../logger_socket/logger_backend.ex | 5 + .../farmbot_os/configurator/network_layer.ex | 7 ++ .../lib/farmbot_os/configurator/router.ex | 1 + .../configurator/scheduler_socket.ex | 11 ++ .../lib/farmbot_os/configurator/supervisor.ex | 6 + .../configurator/telemetry_layer.ex | 5 + farmbot_os/lib/farmbot_os/easter_eggs.ex | 5 +- farmbot_os/lib/farmbot_os/filesystem.ex | 3 + farmbot_os/lib/farmbot_os/init/fs_checkup.ex | 7 +- farmbot_os/lib/farmbot_os/init/supervisor.ex | 5 +- farmbot_os/lib/farmbot_os/lua.ex | 25 ++-- farmbot_os/lib/farmbot_os/lua/console.ex | 46 ------- .../lib/farmbot_os/lua/console/evaluater.ex | 62 ---------- .../lib/farmbot_os/lua/console/server.ex | 117 ------------------ .../lua/ext/{data.ex => data_manipulation.ex} | 3 +- farmbot_os/lib/farmbot_os/lua/ext/firmware.ex | 4 + farmbot_os/lib/farmbot_os/lua/ext/info.ex | 3 +- .../{platform => }/platform_supervisor.ex | 4 +- farmbot_os/lib/farmbot_os/sys_calls.ex | 4 + .../farmbot_os/sys_calls/change_ownership.ex | 1 + .../lib/farmbot_os/sys_calls/dump_info.ex | 1 + .../lib/farmbot_os/sys_calls/factory_reset.ex | 1 + .../lib/farmbot_os/sys_calls/farmware.ex | 2 + .../farmbot_os/sys_calls/flash_firmware.ex | 2 + .../lib/farmbot_os/sys_calls/movement.ex | 2 + .../lib/farmbot_os/sys_calls/pin_control.ex | 2 + .../lib/farmbot_os/sys_calls/point_lookup.ex | 2 + .../farmbot_os/sys_calls/resource_update.ex | 2 + .../lib/farmbot_os/sys_calls/send_message.ex | 2 + .../farmbot_os/sys_calls/set_pin_io_mode.ex | 2 + farmbot_os/lib/http_hcr.ex | 24 ---- 36 files changed, 138 insertions(+), 267 deletions(-) delete mode 100644 farmbot_os/lib/farmbot_os/lua/console.ex delete mode 100644 farmbot_os/lib/farmbot_os/lua/console/evaluater.ex delete mode 100644 farmbot_os/lib/farmbot_os/lua/console/server.ex rename farmbot_os/lib/farmbot_os/lua/ext/{data.ex => data_manipulation.ex} (97%) rename farmbot_os/lib/farmbot_os/{platform => }/platform_supervisor.ex (79%) delete mode 100644 farmbot_os/lib/http_hcr.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/config_data_layer.ex b/farmbot_os/lib/farmbot_os/configurator/config_data_layer.ex index 9bcf23674..9156f733e 100644 --- a/farmbot_os/lib/farmbot_os/configurator/config_data_layer.ex +++ b/farmbot_os/lib/farmbot_os/configurator/config_data_layer.ex @@ -1,4 +1,9 @@ defmodule FarmbotOS.Configurator.ConfigDataLayer do + @moduledoc """ + implementation of Configurator.DataLayer responsible for + gathering and storing data Via Ecto. + """ + @behaviour FarmbotOS.Configurator.DataLayer require FarmbotCore.Logger alias FarmbotCore.Config diff --git a/farmbot_os/lib/farmbot_os/configurator/data_layer.ex b/farmbot_os/lib/farmbot_os/configurator/data_layer.ex index f5899f8c9..4199d83c5 100644 --- a/farmbot_os/lib/farmbot_os/configurator/data_layer.ex +++ b/farmbot_os/lib/farmbot_os/configurator/data_layer.ex @@ -1,4 +1,8 @@ defmodule FarmbotOS.Configurator.DataLayer do + @moduledoc """ + intermediate layer for stubbing configuration data + """ + # "net_config_dns_name" => String.t() # "net_config_ntp1" => String.t() # "net_config_ntp2" => String.t() @@ -22,9 +26,18 @@ defmodule FarmbotOS.Configurator.DataLayer do required(String.t()) => nil | String.t() } + @doc "check if the most resent reboot was caused for an exceptional reason" @callback load_last_reset_reason() :: nil | String.t() + + @doc "load the email from the configuration store" @callback load_email() :: nil | String.t() + + @doc "load the password from the configuration store" @callback load_password() :: nil | String.t() + + @doc "load the server from the configuration store" @callback load_server() :: nil | String.t() + + @doc "save the configuration data to the configuration store" @callback save_config(conf) :: any() end diff --git a/farmbot_os/lib/farmbot_os/configurator/dets_telemetry_layer.ex b/farmbot_os/lib/farmbot_os/configurator/dets_telemetry_layer.ex index 23e026e22..c28c8c72a 100644 --- a/farmbot_os/lib/farmbot_os/configurator/dets_telemetry_layer.ex +++ b/farmbot_os/lib/farmbot_os/configurator/dets_telemetry_layer.ex @@ -1,4 +1,11 @@ defmodule FarmbotOS.Configurator.DetsTelemetryLayer do + @moduledoc """ + Telemetry layer implementation for fetching telemetry data from + `farmbot_telemetry` OTP application. + + Still a work in progress. + """ + @behaviour FarmbotOS.Configurator.TelemetryLayer @impl FarmbotOS.Configurator.TelemetryLayer diff --git a/farmbot_os/lib/farmbot_os/configurator/fake_network_layer.ex b/farmbot_os/lib/farmbot_os/configurator/fake_network_layer.ex index ac0ece38b..5eb069650 100644 --- a/farmbot_os/lib/farmbot_os/configurator/fake_network_layer.ex +++ b/farmbot_os/lib/farmbot_os/configurator/fake_network_layer.ex @@ -1,4 +1,8 @@ defmodule FarmbotOS.Configurator.FakeNetworkLayer do + @moduledoc """ + stub Configurator network layer + """ + @behaviour FarmbotOS.Configurator.NetworkLayer @impl FarmbotOS.Configurator.NetworkLayer diff --git a/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex b/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex index faea030dc..83d87aa4a 100644 --- a/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex +++ b/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex @@ -1,17 +1,25 @@ defmodule FarmbotOS.Configurator.LoggerSocket do + @moduledoc """ + WebSocket handler for streaming logs + """ + alias FarmbotOS.Configurator.LoggerSocket.LoggerBackend require Logger @behaviour :cowboy_websocket + + @impl :cowboy_websocket def init(req, state) do {:cowboy_websocket, req, state} end + @impl :cowboy_websocket def websocket_init(_state) do send(self(), :after_connect) {:ok, %{}} end + @impl :cowboy_websocket def websocket_handle({:text, message}, state) do case Jason.decode(message) do {:ok, json} -> @@ -23,6 +31,7 @@ defmodule FarmbotOS.Configurator.LoggerSocket do end end + @impl :cowboy_websocket def websocket_info(:after_connect, state) do Logger.add_backend(LoggerBackend) LoggerBackend.register() @@ -70,6 +79,7 @@ defmodule FarmbotOS.Configurator.LoggerSocket do {:ok, state} end + @impl :cowboy_websocket def terminate(_reason, _req, _state) do :ok end diff --git a/farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex b/farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex index adf20b1f0..8c31ff11a 100644 --- a/farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex +++ b/farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex @@ -1,6 +1,11 @@ defmodule FarmbotOS.Configurator.LoggerSocket.LoggerBackend do + @moduledoc """ + Logger backend for LoggerSockets to subscribe too + """ + @behaviour :gen_event + @doc "register self() for logger events to be delivered" def register() do {:ok, _} = Registry.register(__MODULE__, :dispatch, self()) :ok diff --git a/farmbot_os/lib/farmbot_os/configurator/network_layer.ex b/farmbot_os/lib/farmbot_os/configurator/network_layer.ex index 25ebbbf42..a1f0523de 100644 --- a/farmbot_os/lib/farmbot_os/configurator/network_layer.ex +++ b/farmbot_os/lib/farmbot_os/configurator/network_layer.ex @@ -1,4 +1,11 @@ defmodule FarmbotOS.Configurator.NetworkLayer do + @moduledoc """ + intermediate layer for stubbing Network interactions + """ + + @doc "list network interfaces that can be configured" @callback list_interfaces() :: [String.t()] + + @doc "scen for wifi networks" @callback scan(String.t()) :: [map()] end diff --git a/farmbot_os/lib/farmbot_os/configurator/router.ex b/farmbot_os/lib/farmbot_os/configurator/router.ex index 3a550682f..50e9e7a40 100644 --- a/farmbot_os/lib/farmbot_os/configurator/router.ex +++ b/farmbot_os/lib/farmbot_os/configurator/router.ex @@ -1,5 +1,6 @@ defmodule FarmbotOS.Configurator.Router do @moduledoc "Routes web connections for configuring farmbot os" + require FarmbotCore.Logger require FarmbotTelemetry diff --git a/farmbot_os/lib/farmbot_os/configurator/scheduler_socket.ex b/farmbot_os/lib/farmbot_os/configurator/scheduler_socket.ex index e51618772..a0b77448b 100644 --- a/farmbot_os/lib/farmbot_os/configurator/scheduler_socket.ex +++ b/farmbot_os/lib/farmbot_os/configurator/scheduler_socket.ex @@ -1,19 +1,28 @@ defmodule FarmbotOS.Configurator.SchedulerSocket do + @moduledoc """ + WebSocket handler responsible for dispatching information about + currently scheduled celery_script tasks + """ + require Logger alias FarmbotCore.{Asset, Asset.FarmEvent, Asset.Sequence} alias FarmbotCeleryScript.Scheduler @behaviour :cowboy_websocket + + @impl :cowboy_websocket def init(req, state) do {:cowboy_websocket, req, state} end + @impl :cowboy_websocket def websocket_init(_state) do send(self(), :after_connect) Scheduler.register() {:ok, %{}} end + @impl :cowboy_websocket def websocket_handle({:text, message}, state) do case Jason.decode(message) do {:ok, json} -> @@ -25,6 +34,7 @@ defmodule FarmbotOS.Configurator.SchedulerSocket do end end + @impl :cowboy_websocket def websocket_info({FarmbotCeleryScript, {:calendar, calendar}}, state) do data = Enum.map(calendar, fn @@ -59,6 +69,7 @@ defmodule FarmbotOS.Configurator.SchedulerSocket do {:ok, state} end + @impl :cowboy_websocket def terminate(_reason, _req, _state) do :ok end diff --git a/farmbot_os/lib/farmbot_os/configurator/supervisor.ex b/farmbot_os/lib/farmbot_os/configurator/supervisor.ex index 394f60b40..31a61369c 100644 --- a/farmbot_os/lib/farmbot_os/configurator/supervisor.ex +++ b/farmbot_os/lib/farmbot_os/configurator/supervisor.ex @@ -1,11 +1,17 @@ defmodule FarmbotOS.Configurator.Supervisor do + @moduledoc """ + Supervisor for the Configurator Web stack + """ + use Supervisor alias FarmbotOS.Configurator.{Router, LoggerSocket, SchedulerSocket} + @doc false def start_link(args) do Supervisor.start_link(__MODULE__, args, name: __MODULE__) end + @impl Supervisor def init(_args) do :ets.new(:configurator_session, [:named_table, :public, read_concurrency: true]) diff --git a/farmbot_os/lib/farmbot_os/configurator/telemetry_layer.ex b/farmbot_os/lib/farmbot_os/configurator/telemetry_layer.ex index 45150cec2..9af6cb351 100644 --- a/farmbot_os/lib/farmbot_os/configurator/telemetry_layer.ex +++ b/farmbot_os/lib/farmbot_os/configurator/telemetry_layer.ex @@ -1,3 +1,8 @@ defmodule FarmbotOS.Configurator.TelemetryLayer do + @moduledoc """ + intermediate layer for stubbing telemetry data + """ + + @doc "Returns current cpu usage" @callback cpu_usage :: [map()] end diff --git a/farmbot_os/lib/farmbot_os/easter_eggs.ex b/farmbot_os/lib/farmbot_os/easter_eggs.ex index 40a936900..e596cca38 100644 --- a/farmbot_os/lib/farmbot_os/easter_eggs.ex +++ b/farmbot_os/lib/farmbot_os/easter_eggs.ex @@ -1,5 +1,8 @@ defmodule FarmbotOS.EasterEggs do - @moduledoc false + @moduledoc """ + Process responsible for dispatching funny logs every once in a while + """ + use GenServer alias FarmbotCore.{Asset, JSON} require FarmbotCore.Logger diff --git a/farmbot_os/lib/farmbot_os/filesystem.ex b/farmbot_os/lib/farmbot_os/filesystem.ex index ea654a766..5ce25f7e1 100644 --- a/farmbot_os/lib/farmbot_os/filesystem.ex +++ b/farmbot_os/lib/farmbot_os/filesystem.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.FileSystem do + @moduledoc "Helper module for accessing the RW data partion" + @data_path Application.get_env(:farmbot, __MODULE__)[:data_path] @data_path || Mix.raise(""" @@ -6,5 +8,6 @@ defmodule FarmbotOS.FileSystem do data_path: "/path/to/folder" """) + @doc "helper that always returns #{@data_path}" def data_path, do: @data_path end diff --git a/farmbot_os/lib/farmbot_os/init/fs_checkup.ex b/farmbot_os/lib/farmbot_os/init/fs_checkup.ex index 6e8c66d70..2ad19070c 100644 --- a/farmbot_os/lib/farmbot_os/init/fs_checkup.ex +++ b/farmbot_os/lib/farmbot_os/init/fs_checkup.ex @@ -1,7 +1,8 @@ defmodule FarmbotOS.Init.FSCheckup do - @moduledoc false - # Performs a filesystem checkup and formats the - # volume on first boot. + @moduledoc """ + Performs a filesystem checkup and formats the + volume on first boot. + """ use Supervisor require Logger diff --git a/farmbot_os/lib/farmbot_os/init/supervisor.ex b/farmbot_os/lib/farmbot_os/init/supervisor.ex index b2f943af1..366f8f0d5 100644 --- a/farmbot_os/lib/farmbot_os/init/supervisor.ex +++ b/farmbot_os/lib/farmbot_os/init/supervisor.ex @@ -1,13 +1,14 @@ defmodule FarmbotOS.Init.Supervisor do @moduledoc """ - All the stuff that needs to start before - FarmBotOS gets supervised by this one. + Supervises processes that needs to start before + the rest of the FarmBotOS tree. Handles boot logic for FBOS (on host vs. RPi). """ use Supervisor + @doc false def start_link(args) do Supervisor.start_link(__MODULE__, args, name: __MODULE__) end diff --git a/farmbot_os/lib/farmbot_os/lua.ex b/farmbot_os/lib/farmbot_os/lua.ex index 4605a3eda..efe22431c 100644 --- a/farmbot_os/lib/farmbot_os/lua.ex +++ b/farmbot_os/lib/farmbot_os/lua.ex @@ -1,14 +1,21 @@ defmodule FarmbotOS.Lua do + @moduledoc """ + Embedded scripting language for testing, + assertion, and other debugging things. + """ + @type t() :: tuple() @type table() :: [{any, any}] require FarmbotCore.Logger alias FarmbotOS.Lua.Ext.{ - Data, + DataManipulation, Firmware, Info } + # this function is used by SysCalls, but isn't a direct requirement. + @doc false def log_assertion(passed?, type, message) do meta = [assertion_passed: passed?, assertion_type: type] FarmbotCore.Logger.dispatch_log(__ENV__, :assertion, 2, message, meta) @@ -77,14 +84,14 @@ defmodule FarmbotOS.Lua do |> set_table([:current_hour], &Info.current_hour/2) |> set_table([:current_minute], &Info.current_minute/2) |> set_table([:current_second], &Info.current_second/2) - |> set_table([:update_device], &Data.update_device/2) - |> set_table([:get_device], &Data.get_device/2) - |> set_table([:update_fbos_config], &Data.update_fbos_config/2) - |> set_table([:get_fbos_config], &Data.get_fbos_config/2) - |> set_table([:update_firmware_config], &Data.update_firmware_config/2) - |> set_table([:get_firmware_config], &Data.get_firmware_config/2) - |> set_table([:new_farmware_env], &Data.new_farmware_env/2) - |> set_table([:new_sensor_reading], &Data.new_sensor_reading/2) + |> set_table([:update_device], &DataManipulation.update_device/2) + |> set_table([:get_device], &DataManipulation.get_device/2) + |> set_table([:update_fbos_config], &DataManipulation.update_fbos_config/2) + |> set_table([:get_fbos_config], &DataManipulation.get_fbos_config/2) + |> set_table([:update_firmware_config], &DataManipulation.update_firmware_config/2) + |> set_table([:get_firmware_config], &DataManipulation.get_firmware_config/2) + |> set_table([:new_farmware_env], &DataManipulation.new_farmware_env/2) + |> set_table([:new_sensor_reading], &DataManipulation.new_sensor_reading/2) end @spec set_table(t(), Path.t(), any()) :: t() diff --git a/farmbot_os/lib/farmbot_os/lua/console.ex b/farmbot_os/lib/farmbot_os/lua/console.ex deleted file mode 100644 index 4c267cff0..000000000 --- a/farmbot_os/lib/farmbot_os/lua/console.ex +++ /dev/null @@ -1,46 +0,0 @@ -defmodule FarmbotOS.Lua.Console do - @moduledoc """ - Entry point for a lua console - ``` - iex> [Ctrl+G] - User switch command - --> s sh - --> j - 1 {erlang,apply,[#Fun,[]]} - 2* {'Elixir.FarmbotOS.Lua.Console',start,[]} - --> c - ``` - """ - - alias FarmbotOS.Lua.Console.Server - - @doc """ - This is the callback invoked by Erlang's shell when someone presses Ctrl+G - and types `s Elixir.FarmbotOS.Lua.Console` or `s lua`. - """ - def start(opts \\ [], mfa \\ {FarmbotOS.Lua.Console, :dont_display_result, []}) do - spawn(fn -> - # The shell should not start until the system is up and running. - case :init.notify_when_started(self()) do - :started -> :ok - _ -> :init.wait_until_started() - end - - :io.setopts(Process.group_leader(), binary: true, encoding: :unicode) - - Server.start(opts, mfa) - end) - end - - def dont_display_result, do: "don't display result" -end - -defmodule :lua do - @moduledoc """ - This is a shortcut for invoking `FarmbotOS.Lua.Console` in the Erlang job - control menu. The alternative is to type `:Elixir.FarmbotOS.Lua.Console` at - the `s [shell]` prompt. - """ - - defdelegate start, to: FarmbotOS.Lua.Console -end diff --git a/farmbot_os/lib/farmbot_os/lua/console/evaluater.ex b/farmbot_os/lib/farmbot_os/lua/console/evaluater.ex deleted file mode 100644 index 8cae5dea9..000000000 --- a/farmbot_os/lib/farmbot_os/lua/console/evaluater.ex +++ /dev/null @@ -1,62 +0,0 @@ -defmodule FarmbotOS.Lua.Console.Evaluator do - @moduledoc """ - The evaluator is responsible for managing the shell port and executing - commands against it. - """ - alias FarmbotOS.Lua - - def init(command, server, leader, _opts) do - old_leader = Process.group_leader() - Process.group_leader(self(), leader) - - command == :ack && :proc_lib.init_ack(self()) - lua = Lua.init() - state = %{lua: lua} - - try do - loop(server, state) - after - Process.group_leader(self(), old_leader) - end - end - - defp loop(server, state) do - receive do - {:eval, ^server, "quit" <> _, _shell_state} -> - :ok - - {:eval, ^server, command, shell_state} -> - lua = - case Lua.do(state.lua, command) do - {{:error, reason}, lua} -> - IO.puts("error evaluating: #{inspect(reason)}") - lua - - {[], lua} -> - lua - - {return, lua} -> - {_, lua} = :luerl.call_function([:print], return, lua) - lua - - error -> - IO.puts("error evaluating: #{inspect(error)}") - state.lua - end - - # If the command changes the shell's directory, there's - # a chance that this checks too early. In practice, it - # seems to work for "cd". - new_shell_state = %{shell_state | counter: shell_state.counter + 1} - send(server, {:evaled, self(), new_shell_state}) - loop(server, %{state | lua: lua}) - - {:done, ^server} -> - :ok - - other -> - IO.inspect(other, label: "Unknown message received by lua command evaluator") - loop(server, state) - end - end -end diff --git a/farmbot_os/lib/farmbot_os/lua/console/server.ex b/farmbot_os/lib/farmbot_os/lua/console/server.ex deleted file mode 100644 index 5f8463bdf..000000000 --- a/farmbot_os/lib/farmbot_os/lua/console/server.ex +++ /dev/null @@ -1,117 +0,0 @@ -defmodule FarmbotOS.Lua.Console.Server do - @moduledoc """ - The server is responsible for reading input and sending it to the evaluator. - """ - - def start(opts, {m, f, a}) do - Process.flag(:trap_exit, true) - {pid, ref} = spawn_monitor(m, f, a) - start_loop(opts, pid, ref) - end - - defp start_loop(opts, pid, ref) do - receive do - {:DOWN, ^ref, :process, ^pid, :normal} -> - run(opts) - - {:DOWN, ^ref, :process, ^pid, other} -> - IO.puts("#{__MODULE__} failed to start due to reason: #{inspect(other)}") - end - end - - defp run(opts) when is_list(opts) do - IO.puts(""" - FarmBot OS Interactive Lua - - Type Ctrl+G to exit the shell and return to Erlang job control. - This is not a normal shell, so try not to type Ctrl+C. - """) - - evaluator = start_evaluator(opts) - state = %{counter: 1, cwd: "", prefix: ""} - loop(state, evaluator, Process.monitor(evaluator)) - end - - defp loop(state, evaluator, evaluator_ref) do - self_pid = self() - counter = state.counter - prefix = state.cwd - - input = spawn(fn -> io_get(self_pid, prefix, counter) end) - wait_input(state, evaluator, evaluator_ref, input) - end - - defp exit_loop(evaluator, evaluator_ref, done? \\ true) do - Process.delete(:evaluator) - Process.demonitor(evaluator_ref, [:flush]) - - if done? do - send(evaluator, {:done, self()}) - end - - :ok - end - - defp io_get(pid, prefix, counter) do - prompt = "#{prefix}[#{counter}]> " - send(pid, {:input, self(), IO.gets(:stdio, prompt)}) - end - - defp wait_input(state, evaluator, evaluator_ref, input) do - receive do - {:input, ^input, command} when is_binary(command) -> - send(evaluator, {:eval, self(), command, state}) - wait_eval(state, evaluator, evaluator_ref) - - {:input, ^input, {:error, :interrupted}} -> - IO.puts("Interrupted") - loop(state, evaluator, evaluator_ref) - - {:input, ^input, :eof} -> - exit_loop(evaluator, evaluator_ref) - - {:input, ^input, {:error, :terminated}} -> - exit_loop(evaluator, evaluator_ref) - end - end - - defp wait_eval(state, evaluator, evaluator_ref) do - receive do - {:evaled, ^evaluator, new_state} -> - loop(new_state, evaluator, evaluator_ref) - - {:EXIT, _pid, :interrupt} -> - # User did ^G while the evaluator was busy or stuck - IO.puts("** (EXIT) interrupted") - Process.delete(:evaluator) - Process.exit(evaluator, :kill) - Process.demonitor(evaluator_ref, [:flush]) - evaluator = start_evaluator([]) - loop(state, evaluator, Process.monitor(evaluator)) - - {:DOWN, ^evaluator_ref, :process, ^evaluator, reason} -> - IO.puts("** (EXIT) #{inspect(reason)}") - Process.delete(:evaluator) - Process.exit(evaluator, :kill) - Process.demonitor(evaluator_ref, [:flush]) - evaluator = start_evaluator([]) - loop(state, evaluator, Process.monitor(evaluator)) - end - end - - def start_evaluator(opts) do - self_pid = self() - self_leader = Process.group_leader() - - evaluator = - opts[:evaluator] || - :proc_lib.start(FarmbotOS.Lua.Console.Evaluator, :init, [ - :ack, - self_pid, - self_leader, - opts - ]) - - evaluator - end -end diff --git a/farmbot_os/lib/farmbot_os/lua/ext/data.ex b/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex similarity index 97% rename from farmbot_os/lib/farmbot_os/lua/ext/data.ex rename to farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex index 480873c42..e0b19b9ef 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/data.ex +++ b/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex @@ -1,7 +1,8 @@ -defmodule FarmbotOS.Lua.Ext.Data do +defmodule FarmbotOS.Lua.Ext.DataManipulation do @moduledoc """ Extensions for manipulating data from Lua """ + import FarmbotOS.Lua.Util alias FarmbotCore.{ diff --git a/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex b/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex index 3417f9482..45fafa0c8 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex +++ b/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex @@ -1,4 +1,8 @@ defmodule FarmbotOS.Lua.Ext.Firmware do + @moduledoc """ + Lua extensions for interacting with the Firmware + """ + alias FarmbotCeleryScript.SysCalls def calibrate([axis], lua) when axis in ["x", "y", "z"] do diff --git a/farmbot_os/lib/farmbot_os/lua/ext/info.ex b/farmbot_os/lib/farmbot_os/lua/ext/info.ex index 706387e0f..c953c6ccd 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/info.ex +++ b/farmbot_os/lib/farmbot_os/lua/ext/info.ex @@ -1,7 +1,8 @@ defmodule FarmbotOS.Lua.Ext.Info do @moduledoc """ - Lua extensions for gathering information about Farmbot + Lua extensions for gathering information about a running Farmbot """ + alias FarmbotCeleryScript.SysCalls @doc """ diff --git a/farmbot_os/lib/farmbot_os/platform/platform_supervisor.ex b/farmbot_os/lib/farmbot_os/platform_supervisor.ex similarity index 79% rename from farmbot_os/lib/farmbot_os/platform/platform_supervisor.ex rename to farmbot_os/lib/farmbot_os/platform_supervisor.ex index 228d25701..ac553dc16 100644 --- a/farmbot_os/lib/farmbot_os/platform/platform_supervisor.ex +++ b/farmbot_os/lib/farmbot_os/platform_supervisor.ex @@ -1,5 +1,7 @@ defmodule FarmbotOS.Platform.Supervisor do - @moduledoc false + @moduledoc """ + Supervises Platform specific code as defined in `config.exs` + """ use Supervisor diff --git a/farmbot_os/lib/farmbot_os/sys_calls.ex b/farmbot_os/lib/farmbot_os/sys_calls.ex index ce0e8de2f..5be1821e5 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls.ex @@ -1,4 +1,8 @@ defmodule FarmbotOS.SysCalls do + @moduledoc """ + Implementation for FarmbotCeleryScript.SysCalls + """ + require FarmbotCore.Logger require FarmbotTelemetry require Logger diff --git a/farmbot_os/lib/farmbot_os/sys_calls/change_ownership.ex b/farmbot_os/lib/farmbot_os/sys_calls/change_ownership.ex index 1ce796bdd..b36e2ed8b 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/change_ownership.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/change_ownership.ex @@ -1,5 +1,6 @@ defmodule FarmbotOS.SysCalls.ChangeOwnership do @moduledoc false + require Logger require FarmbotCore.Logger import FarmbotCore.Config, only: [get_config_value: 3, update_config_value: 4] diff --git a/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex b/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex index e2ddcf248..de972c4f3 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex @@ -1,5 +1,6 @@ defmodule FarmbotOS.SysCalls.DumpInfo do @moduledoc false + require FarmbotCore.Logger require FarmbotTelemetry alias FarmbotCore.{Asset, Asset.DiagnosticDump, Asset.Private, Config, Project} diff --git a/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex b/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex index 5c42b4faa..6b70e59bb 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex @@ -1,4 +1,5 @@ defmodule FarmbotOS.SysCalls.FactoryReset do + @moduledoc false require FarmbotCore.Logger alias FarmbotCore.{Asset, BotState} alias FarmbotExt.API diff --git a/farmbot_os/lib/farmbot_os/sys_calls/farmware.ex b/farmbot_os/lib/farmbot_os/sys_calls/farmware.ex index 6df5f8b6c..ef0d952b8 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/farmware.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/farmware.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.Farmware do + @moduledoc false + require Logger # alias FarmbotCeleryScript.AST alias FarmbotCore.{Asset, AssetSupervisor, FarmwareRuntime} diff --git a/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex b/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex index 8c0831979..717030ab7 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.FlashFirmware do + @moduledoc false + alias FarmbotCore.{Asset, Asset.Private} alias FarmbotFirmware alias FarmbotCore.FirmwareTTYDetector diff --git a/farmbot_os/lib/farmbot_os/sys_calls/movement.ex b/farmbot_os/lib/farmbot_os/sys_calls/movement.ex index 104ceed4d..464fda071 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/movement.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/movement.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.Movement do + @moduledoc false + require FarmbotCore.Logger def get_current_x do diff --git a/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex b/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex index 9e61d2af3..5463df76a 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.PinControl do + @moduledoc false + alias FarmbotCore.{Asset, Leds} alias FarmbotCore.Asset.{ diff --git a/farmbot_os/lib/farmbot_os/sys_calls/point_lookup.ex b/farmbot_os/lib/farmbot_os/sys_calls/point_lookup.ex index 878b5b0c5..b33520581 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/point_lookup.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/point_lookup.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.PointLookup do + @moduledoc false + alias FarmbotCore.Asset require Logger diff --git a/farmbot_os/lib/farmbot_os/sys_calls/resource_update.ex b/farmbot_os/lib/farmbot_os/sys_calls/resource_update.ex index 2133f6169..d4db7bb77 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/resource_update.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/resource_update.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.ResourceUpdate do + @moduledoc false + require Logger alias FarmbotCore.{ diff --git a/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex b/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex index b27063d48..6b312452e 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.SendMessage do + @moduledoc false + alias FarmbotFirmware @root_regex ~r/{{\s*[\w\.]+\s*}}/ @extract_reg ~r/[\w\.]+/ diff --git a/farmbot_os/lib/farmbot_os/sys_calls/set_pin_io_mode.ex b/farmbot_os/lib/farmbot_os/sys_calls/set_pin_io_mode.ex index 313657561..ad1da93ac 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/set_pin_io_mode.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/set_pin_io_mode.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.SysCalls.SetPinIOMode do + @moduledoc false + alias FarmbotFirmware def set_pin_io_mode(pin_number, mode) do diff --git a/farmbot_os/lib/http_hcr.ex b/farmbot_os/lib/http_hcr.ex deleted file mode 100644 index 15a8f8d9d..000000000 --- a/farmbot_os/lib/http_hcr.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule HTTPHCR do - @moduledoc "Hot Code Reloading over HTTP" - - @doc "HTTP Reload" - def http_r(module, branch \\ "staging") do - {:ok, app} = :application.get_application(module) - source = module.module_info(:compile)[:source] - - branch - |> to_url(to_string(app), to_string(source)) - |> Tesla.get!() - |> Map.fetch!(:body) - |> Code.eval_string() - end - - def to_url(branch, "farmbot", source) do - to_url(branch, "farmbot_os", source) - end - - def to_url(branch, "farmbot_" <> _ = folder, source) do - [_ | path] = String.split(source, folder, parts: 2) - "https://raw.githubusercontent.com/FarmBot/farmbot_os/#{branch}/#{folder}/#{path}" - end -end From b6be227e27b99c744d603028c285588b65458b31 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:12:25 -0800 Subject: [PATCH 20/58] Update platform specific docs for farmbot_os otp app --- farmbot_os/platform/host/configurator.ex | 6 ++++- .../target/configurator/captive_portal.ex | 6 ++--- .../platform/target/configurator/validator.ex | 7 ++--- .../configurator/vintage_network_layer.ex | 5 ++++ .../platform/target/firmware_reset/null.ex | 2 +- .../target/gpio/circuits_gpio_handler.ex | 1 + .../target/gpio/circuits_leds_handler.ex | 3 ++- .../target/info_workers/disk_usage.ex | 9 ++++++- .../target/info_workers/memory_usage.ex | 9 ++++++- .../platform/target/info_workers/soc_temp.ex | 10 ++++++- .../target/info_workers/supervisor.ex | 7 ++++- .../platform/target/info_workers/throttle.ex | 8 +++++- .../platform/target/info_workers/uptime.ex | 9 ++++++- .../target/info_workers/wifi_level.ex | 8 ++++++ farmbot_os/platform/target/network.ex | 1 + .../platform/target/network/presetup.ex | 5 ++++ .../platform/target/network/supervisor.ex | 5 +++- farmbot_os/platform/target/network/utils.ex | 2 ++ .../platform/target/shoehorn_handler.ex | 7 +++++ farmbot_os/platform/target/tzdata_task.ex | 27 ------------------- farmbot_os/platform/target/uevent.ex | 15 +++++++++-- 21 files changed, 107 insertions(+), 45 deletions(-) delete mode 100644 farmbot_os/platform/target/tzdata_task.ex diff --git a/farmbot_os/platform/host/configurator.ex b/farmbot_os/platform/host/configurator.ex index 032ac25bd..94dad3455 100644 --- a/farmbot_os/platform/host/configurator.ex +++ b/farmbot_os/platform/host/configurator.ex @@ -1,5 +1,9 @@ defmodule FarmbotOS.Platform.Host.Configurator do - @moduledoc false + @moduledoc """ + Supervisor responsible for setting up epmd and ensuring + local environment variables are setup correctly + """ + use Supervisor @doc false diff --git a/farmbot_os/platform/target/configurator/captive_portal.ex b/farmbot_os/platform/target/configurator/captive_portal.ex index 56700f9c5..972ba1bd9 100644 --- a/farmbot_os/platform/target/configurator/captive_portal.ex +++ b/farmbot_os/platform/target/configurator/captive_portal.ex @@ -1,9 +1,9 @@ defmodule FarmbotOS.Platform.Target.Configurator.CaptivePortal do @moduledoc """ - Handles turning Farmbot's internal network representation into - either a VintageNetEthernet or VintageNetWiFi - RawConfig. + VintageNet Technology that handles redirecting + **all** traffic to Farmbot's configuration interface """ + @behaviour VintageNet.Technology require FarmbotCore.Logger diff --git a/farmbot_os/platform/target/configurator/validator.ex b/farmbot_os/platform/target/configurator/validator.ex index d1851f64f..c82f93674 100644 --- a/farmbot_os/platform/target/configurator/validator.ex +++ b/farmbot_os/platform/target/configurator/validator.ex @@ -1,9 +1,10 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do @moduledoc """ - Handles turning Farmbot's internal network representation into - either a VintageNetEthernet or VintageNetWiFi - RawConfig. + VintageNet.Technology that handles turning Farmbot's internal + network representation into either a VintageNetEthernet + or VintageNetWiFi RawConfig. """ + @behaviour VintageNet.Technology @impl VintageNet.Technology diff --git a/farmbot_os/platform/target/configurator/vintage_network_layer.ex b/farmbot_os/platform/target/configurator/vintage_network_layer.ex index 490766fad..25eb781cb 100644 --- a/farmbot_os/platform/target/configurator/vintage_network_layer.ex +++ b/farmbot_os/platform/target/configurator/vintage_network_layer.ex @@ -1,4 +1,9 @@ defmodule FarmbotOS.Platform.Target.Configurator.VintageNetworkLayer do + @moduledoc """ + Implementation of Network configuration layer using + VintageNet + """ + require FarmbotCore.Logger @behaviour FarmbotOS.Configurator.NetworkLayer diff --git a/farmbot_os/platform/target/firmware_reset/null.ex b/farmbot_os/platform/target/firmware_reset/null.ex index 4e059b555..7e9692596 100644 --- a/farmbot_os/platform/target/firmware_reset/null.ex +++ b/farmbot_os/platform/target/firmware_reset/null.ex @@ -1,6 +1,6 @@ defmodule FarmbotOS.Platform.Target.FirmwareReset.NULL do @moduledoc """ - Does nothing + Does nothing in reference to resetting the firmware port """ @behaviour FarmbotFirmware.UARTTransport.Reset diff --git a/farmbot_os/platform/target/gpio/circuits_gpio_handler.ex b/farmbot_os/platform/target/gpio/circuits_gpio_handler.ex index 1d5300b24..a6fb76a99 100644 --- a/farmbot_os/platform/target/gpio/circuits_gpio_handler.ex +++ b/farmbot_os/platform/target/gpio/circuits_gpio_handler.ex @@ -1,5 +1,6 @@ defmodule FarmbotOS.Platform.Target.PinBindingWorker.CircuitsGPIOHandler do @moduledoc "Circuits gpio handler for PinBindings" + @behaviour FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding require Logger use GenServer diff --git a/farmbot_os/platform/target/gpio/circuits_leds_handler.ex b/farmbot_os/platform/target/gpio/circuits_leds_handler.ex index 4e26f41d5..a8c0c28e1 100644 --- a/farmbot_os/platform/target/gpio/circuits_leds_handler.ex +++ b/farmbot_os/platform/target/gpio/circuits_leds_handler.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.Platform.Target.Leds.CircuitsHandler do + @moduledoc "Circuits gpio handler for LEDS" + alias Circuits.GPIO use GenServer @behaviour FarmbotCore.Leds.Handler @@ -8,7 +10,6 @@ defmodule FarmbotOS.Platform.Target.Leds.CircuitsHandler do @fast_blink_speed 250 @really_fast_blink_speed 100 - @moduledoc false def red(status) do _ = StubHandler.red(status) GenServer.call(__MODULE__, {:red, status}) diff --git a/farmbot_os/platform/target/info_workers/disk_usage.ex b/farmbot_os/platform/target/info_workers/disk_usage.ex index 6974d49a0..b25f72a2e 100644 --- a/farmbot_os/platform/target/info_workers/disk_usage.ex +++ b/farmbot_os/platform/target/info_workers/disk_usage.ex @@ -1,5 +1,8 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.DiskUsage do - @moduledoc false + @moduledoc """ + Worker responsible for reporting disk usage to the + bot_state server + """ use GenServer @data_path FarmbotOS.FileSystem.data_path() @@ -8,14 +11,17 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.DiskUsage do alias FarmbotCore.BotState + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args) end + @impl GenServer def init([]) do {:ok, nil, 0} end + @impl GenServer def handle_info(:timeout, state) do usage = collect_report() @@ -27,6 +33,7 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.DiskUsage do end end + @doc "Returns current disk usage as a percent" def collect_report do {usage_str, 0} = Nerves.Runtime.cmd("df", ["-h", @data_path], :return) diff --git a/farmbot_os/platform/target/info_workers/memory_usage.ex b/farmbot_os/platform/target/info_workers/memory_usage.ex index d6eb09a97..25a185700 100644 --- a/farmbot_os/platform/target/info_workers/memory_usage.ex +++ b/farmbot_os/platform/target/info_workers/memory_usage.ex @@ -1,19 +1,25 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.MemoryUsage do - @moduledoc false + @moduledoc """ + Worker responsible for reporting memory usage + to the bot_state server + """ use GenServer @default_timeout_ms 60_000 @error_timeout_ms 5_000 alias FarmbotCore.BotState + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args) end + @impl GenServer def init([]) do {:ok, nil, 0} end + @impl GenServer def handle_info(:timeout, state) do usage = collect_report() @@ -25,6 +31,7 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.MemoryUsage do end end + @doc "returns current VM memory usage expressed as a percent" def collect_report do round(:erlang.memory(:total) * 1.0e-6) end diff --git a/farmbot_os/platform/target/info_workers/soc_temp.ex b/farmbot_os/platform/target/info_workers/soc_temp.ex index 64312f136..c4659734a 100644 --- a/farmbot_os/platform/target/info_workers/soc_temp.ex +++ b/farmbot_os/platform/target/info_workers/soc_temp.ex @@ -1,5 +1,10 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.SocTemp do - @moduledoc false + @moduledoc """ + Worker responsible for reporting current system + on a chip package temperature. + + Specific to raspberry pi using the vcgencmd command + """ use GenServer @default_timeout_ms 60_000 @@ -7,14 +12,17 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.SocTemp do alias FarmbotCore.BotState + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args) end + @impl GenServer def init([]) do {:ok, nil, 0} end + @impl GenServer def handle_info(:timeout, state) do {temp_str, 0} = Nerves.Runtime.cmd("vcgencmd", ["measure_temp"], :return) diff --git a/farmbot_os/platform/target/info_workers/supervisor.ex b/farmbot_os/platform/target/info_workers/supervisor.ex index 86ebc3757..0eb3b829e 100644 --- a/farmbot_os/platform/target/info_workers/supervisor.ex +++ b/farmbot_os/platform/target/info_workers/supervisor.ex @@ -1,5 +1,8 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.Supervisor do - @moduledoc false + @moduledoc """ + Supervisor responsible for monitoring info workers + """ + use Supervisor alias FarmbotOS.Platform.Target.InfoWorker.{ @@ -11,10 +14,12 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.Supervisor do WifiLevel } + @doc false def start_link(args) do Supervisor.start_link(__MODULE__, args, name: __MODULE__) end + @impl Supervisor def init([]) do children = [ DiskUsage, diff --git a/farmbot_os/platform/target/info_workers/throttle.ex b/farmbot_os/platform/target/info_workers/throttle.ex index 988b98c02..02c7f389a 100644 --- a/farmbot_os/platform/target/info_workers/throttle.ex +++ b/farmbot_os/platform/target/info_workers/throttle.ex @@ -1,5 +1,8 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.Throttle do - @moduledoc false + @moduledoc """ + RPI specific worker responsible for checking the `throttled` flag + as reported by vcgencmd + """ use GenServer @default_timeout_ms 60_000 @@ -7,14 +10,17 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.Throttle do alias FarmbotCore.BotState + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args) end + @impl GenServer def init([]) do {:ok, nil, 0} end + @impl GenServer def handle_info(:timeout, state) do {throttled_str, 0} = Nerves.Runtime.cmd("vcgencmd", ["get_throttled"], :return) diff --git a/farmbot_os/platform/target/info_workers/uptime.ex b/farmbot_os/platform/target/info_workers/uptime.ex index 71f3b02e8..257ca2b68 100644 --- a/farmbot_os/platform/target/info_workers/uptime.ex +++ b/farmbot_os/platform/target/info_workers/uptime.ex @@ -1,5 +1,8 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.Uptime do - @moduledoc false + @moduledoc """ + Worker process responsible for reporting uptime to the + bot_state server + """ use GenServer @default_timeout_ms 60_000 @@ -7,14 +10,17 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.Uptime do alias FarmbotCore.BotState + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args) end + @impl GenServer def init([]) do {:ok, nil, 0} end + @impl GenServer def handle_info(:timeout, state) do usage = collect_report() @@ -26,6 +32,7 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.Uptime do end end + @doc "returns wall_clock time in seconds" def collect_report do {wall_clock_ms, _last_call} = :erlang.statistics(:wall_clock) round(wall_clock_ms * 0.001) diff --git a/farmbot_os/platform/target/info_workers/wifi_level.ex b/farmbot_os/platform/target/info_workers/wifi_level.ex index d2f7b4b93..72d1ab048 100644 --- a/farmbot_os/platform/target/info_workers/wifi_level.ex +++ b/farmbot_os/platform/target/info_workers/wifi_level.ex @@ -1,17 +1,25 @@ defmodule FarmbotOS.Platform.Target.InfoWorker.WifiLevel do + @moduledoc """ + Worker process responsible for reporting current wifi + power levels to the bot_state server + """ + use GenServer require FarmbotCore.Logger alias FarmbotCore.BotState + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args) end + @impl GenServer def init(_args) do send(self(), :load_network_config) {:ok, %{ssid: nil}} end + @impl GenServer def handle_info(:load_network_config, state) do if FarmbotCore.Config.get_network_config("eth0") do FarmbotCore.Logger.warn(3, """ diff --git a/farmbot_os/platform/target/network.ex b/farmbot_os/platform/target/network.ex index 076dea06d..e438546e3 100644 --- a/farmbot_os/platform/target/network.ex +++ b/farmbot_os/platform/target/network.ex @@ -1,5 +1,6 @@ defmodule FarmbotOS.Platform.Target.Network do @moduledoc "Manages Network Connections" + use GenServer, shutdown: 10_000 require Logger require FarmbotCore.Logger diff --git a/farmbot_os/platform/target/network/presetup.ex b/farmbot_os/platform/target/network/presetup.ex index 938386c57..280ce72cf 100644 --- a/farmbot_os/platform/target/network/presetup.ex +++ b/farmbot_os/platform/target/network/presetup.ex @@ -1,4 +1,9 @@ defmodule FarmbotOS.Platform.Target.Network.PreSetup do + @moduledoc """ + VintageNet technology responsible for doing nothing, + but isn't the NULL technology + """ + @behaviour VintageNet.Technology alias VintageNet.Interface.RawConfig diff --git a/farmbot_os/platform/target/network/supervisor.ex b/farmbot_os/platform/target/network/supervisor.ex index 870d38839..2d6844c45 100644 --- a/farmbot_os/platform/target/network/supervisor.ex +++ b/farmbot_os/platform/target/network/supervisor.ex @@ -1,5 +1,8 @@ defmodule FarmbotOS.Platform.Target.Network.Supervisor do - @moduledoc false + @moduledoc """ + Supervises the NetworkManager + """ + use Supervisor alias FarmbotOS.Platform.Target.Network diff --git a/farmbot_os/platform/target/network/utils.ex b/farmbot_os/platform/target/network/utils.ex index 2339c5a52..118f237af 100644 --- a/farmbot_os/platform/target/network/utils.ex +++ b/farmbot_os/platform/target/network/utils.ex @@ -1,4 +1,6 @@ defmodule FarmbotOS.Platform.Target.Network.Utils do + @moduledoc "common network related utilities" + import FarmbotCore.Config, only: [get_config_value: 3] require FarmbotCore.Logger diff --git a/farmbot_os/platform/target/shoehorn_handler.ex b/farmbot_os/platform/target/shoehorn_handler.ex index 1faabd806..2af193af6 100644 --- a/farmbot_os/platform/target/shoehorn_handler.ex +++ b/farmbot_os/platform/target/shoehorn_handler.ex @@ -1,13 +1,20 @@ defmodule FarmbotOS.Platform.Target.ShoehornHandler do + @moduledoc """ + Custom shoehorn handler responsible for restarting farmbot applications + in the correct order + """ + use Shoehorn.Handler require FarmbotTelemetry require FarmbotCore.Logger require Logger + @impl true def init(_opts) do {:ok, %{restart_counts: 0}} end + @impl true def application_exited(:nerves_runtime, _, state) do # https://github.com/nerves-project/nerves_runtime/issues/152 _ = System.cmd("killall", ["-9", "kmsg_tailer"], into: IO.stream(:stdio, :line)) diff --git a/farmbot_os/platform/target/tzdata_task.ex b/farmbot_os/platform/target/tzdata_task.ex deleted file mode 100644 index b5b013937..000000000 --- a/farmbot_os/platform/target/tzdata_task.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule FarmbotOS.Platform.Target.TzdataTask do - use GenServer - - @data_path FarmbotOS.FileSystem.data_path() - # 20 minutes - @default_timeout_ms round(1.2e+6) - - def start_link(args) do - GenServer.start_link(__MODULE__, args) - end - - def init([]) do - {:ok, nil, 0} - end - - def handle_info(:do_checkup, state) do - dir = Path.join(@data_path, "tmp_downloads") - - if File.exists?(dir) do - for obj <- File.ls!(dir) do - File.rm_rf!(Path.join(dir, obj)) - end - end - - {:noreply, state, @default_timeout_ms} - end -end diff --git a/farmbot_os/platform/target/uevent.ex b/farmbot_os/platform/target/uevent.ex index 8a6ae6887..d06ad1fbf 100644 --- a/farmbot_os/platform/target/uevent.ex +++ b/farmbot_os/platform/target/uevent.ex @@ -1,5 +1,8 @@ defmodule FarmbotOS.Platform.Target.Uevent.Supervisor do - @moduledoc false + @moduledoc """ + Supervisor responsible for monitoring the Uevent process + """ + use Supervisor def start_link(args) do @@ -13,7 +16,10 @@ defmodule FarmbotOS.Platform.Target.Uevent.Supervisor do end defmodule FarmbotOS.Platform.Target.Uevent do - @moduledoc false + @moduledoc """ + Process responsible for monitoring uevent linux subsystem for + events relating to serial devices being plugged and unplugged + """ use GenServer require Logger @@ -21,10 +27,12 @@ defmodule FarmbotOS.Platform.Target.Uevent do require FarmbotTelemetry alias FarmbotCore.{Config, FirmwareTTYDetector} + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end + @impl GenServer def init([]) do :ok = SystemRegistry.register() {:ok, nil} @@ -47,6 +55,7 @@ defmodule FarmbotOS.Platform.Target.Uevent do {:noreply, reg} end + @doc false def maybe_new_tty("ttyUSB" <> _ = tty), do: new_tty(tty) def maybe_new_tty("ttyACM" <> _ = tty), do: new_tty(tty) def maybe_new_tty("ttyS" <> _), do: :ok @@ -56,6 +65,8 @@ defmodule FarmbotOS.Platform.Target.Uevent do Logger.debug("Unknown tty: #{inspect(unknown)}") end + # called when a new TTY is detected + @doc false def new_tty(tty) do case FirmwareTTYDetector.tty() do nil -> From 63fffcfc5d1b89ddc536a91f4e823476a1bbcb08 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:19:53 -0800 Subject: [PATCH 21/58] Update docs for farmbot_ext otp app --- .../lib/farmbot_ext/amqp/channel_supervisor.ex | 4 +++- .../lib/farmbot_ext/amqp/ping_pong_channel.ex | 12 ++++++++---- farmbot_ext/lib/farmbot_ext/amqp/supervisor.ex | 4 +++- .../lib/farmbot_ext/amqp/telemetry_channel.ex | 3 +++ farmbot_ext/lib/farmbot_ext/api.ex | 7 ++++--- .../lib/farmbot_ext/api/dirty_worker/supervisor.ex | 7 +++++++ .../lib/farmbot_ext/api/eager_loader/supervisor.ex | 8 ++++++++ farmbot_ext/lib/farmbot_ext/bootstrap.ex | 12 ++++++++++-- .../lib/farmbot_ext/bootstrap/drop_password_task.ex | 3 +++ farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex | 7 ++++++- farmbot_ext/lib/farmbot_ext/protocols.ex | 4 +++- 11 files changed, 58 insertions(+), 13 deletions(-) diff --git a/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex b/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex index 9e13eec14..170ded98c 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex @@ -1,5 +1,7 @@ defmodule FarmbotExt.AMQP.ChannelSupervisor do - @moduledoc false + @moduledoc """ + Supervises AMQP channels + """ use Supervisor alias FarmbotExt.JWT diff --git a/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex index e66238735..2e33c5d1a 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex @@ -1,9 +1,13 @@ defmodule FarmbotExt.AMQP.PingPongChannel do @moduledoc """ - This module provides an AMQP channel for - auto-sync messages from the FarmBot API. - SEE: - https://developer.farm.bot/docs/realtime-updates-auto-sync#section-example-auto-sync-subscriptions + AMQP channel responsible for responding to `ping` messages. + Simply echos the exact data received on the `ping` channel + onto the `pong` channel. + + Also has a ~15-20 minute timer that will do an `HTTP` request + to `/api/device`. This refreshed the `last_seen_api` field which + is required for devices that have `auto_sync` enabled as with + that field enabled, the device would never do an HTTP request """ use GenServer use AMQP diff --git a/farmbot_ext/lib/farmbot_ext/amqp/supervisor.ex b/farmbot_ext/lib/farmbot_ext/amqp/supervisor.ex index ccd52aa50..edb58508a 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/supervisor.ex @@ -1,5 +1,7 @@ defmodule FarmbotExt.AMQP.Supervisor do - @moduledoc false + @moduledoc """ + Supervises AMQP connections + """ use Supervisor import FarmbotCore.Config, only: [get_config_value: 3] diff --git a/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex index c0fcf4255..fd74a63ff 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex @@ -1,6 +1,9 @@ defmodule FarmbotExt.AMQP.TelemetryChannel do @moduledoc """ + Channel that dispatches telemetry messgaes out of the + DETS database. """ + use GenServer use AMQP diff --git a/farmbot_ext/lib/farmbot_ext/api.ex b/farmbot_ext/lib/farmbot_ext/api.ex index 2f7c941af..33ae07797 100644 --- a/farmbot_ext/lib/farmbot_ext/api.ex +++ b/farmbot_ext/lib/farmbot_ext/api.ex @@ -1,6 +1,9 @@ defmodule FarmbotExt.API do - alias FarmbotExt.{API, JWT} + @moduledoc """ + Module where all Farmbot specific HTTP calls are done + """ + alias FarmbotExt.{API, JWT} alias FarmbotCore.JSON alias FarmbotCore.Asset.{ @@ -10,10 +13,8 @@ defmodule FarmbotExt.API do } alias FarmbotCore.{BotState, BotState.JobProgress.Percent, Project} - require FarmbotCore.Logger import FarmbotCore.Config, only: [get_config_value: 3] - use Tesla alias Tesla.Multipart diff --git a/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex b/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex index bc9af7250..a856b6202 100644 --- a/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex @@ -1,4 +1,9 @@ defmodule FarmbotExt.API.DirtyWorker.Supervisor do + @moduledoc """ + Responsible for supervising assets that will need to be + uploaded to the API via a `POST` or `PUT` request. + """ + use Supervisor alias FarmbotExt.API.DirtyWorker @@ -22,10 +27,12 @@ defmodule FarmbotExt.API.DirtyWorker.Supervisor do Tool } + @doc false def start_link(args) do Supervisor.start_link(__MODULE__, args, name: __MODULE__) end + @impl Supervisor def init(_args) do children = [ {DirtyWorker, Device}, diff --git a/farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex b/farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex index 6723f840d..f8221fea6 100644 --- a/farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex @@ -1,4 +1,9 @@ defmodule FarmbotExt.API.EagerLoader.Supervisor do + @moduledoc """ + Responsible for supervising all assets that need to be + eagerloaded + """ + use Supervisor alias FarmbotExt.API.EagerLoader @@ -22,15 +27,18 @@ defmodule FarmbotExt.API.EagerLoader.Supervisor do Tool } + @doc false def start_link(args) do Supervisor.start_link(__MODULE__, args, name: __MODULE__) end + @doc "Drop all cached assets" def drop_all_cache() do for {_, pid, _, _} <- Supervisor.which_children(FarmbotExt.API.EagerLoader.Supervisor), do: GenServer.cast(pid, :drop) end + @impl Supervisor def init(_args) do children = [ {EagerLoader, Device}, diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap.ex b/farmbot_ext/lib/farmbot_ext/bootstrap.ex index ef308ac44..8879c75d7 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap.ex +++ b/farmbot_ext/lib/farmbot_ext/bootstrap.ex @@ -1,18 +1,25 @@ defmodule FarmbotExt.Bootstrap do - use GenServer + @moduledoc """ + Task responsible for using + a token, secret, or password for logging into an account + """ + use GenServer require Logger alias FarmbotExt.{Bootstrap, Bootstrap.Authorization} import FarmbotCore.Config, only: [update_config_value: 4, get_config_value: 3] + @doc false def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end + @impl GenServer def init([]) do {:ok, nil, 0} end + @impl GenServer def handle_info(:timeout, nil) do email = get_config_value(:string, "authorization", "email") server = get_config_value(:string, "authorization", "server") @@ -21,6 +28,8 @@ defmodule FarmbotExt.Bootstrap do try_auth(email, server, password, secret) end + # state machine implementation + @doc false def try_auth(nil, _server, _password, _secret) do {:noreply, nil, 5000} end @@ -41,7 +50,6 @@ defmodule FarmbotExt.Bootstrap do end end - # TODO(Connor) - drop password and save secret here somehow. def try_auth(email, server, password, _secret) do Logger.debug("using password to auth") diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_task.ex b/farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_task.ex index f7ba04a48..ed4aa3d0d 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_task.ex +++ b/farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_task.ex @@ -9,15 +9,18 @@ defmodule FarmbotExt.Bootstrap.DropPasswordTask do use GenServer + @doc false def start_link(args, opts \\ [name: __MODULE__]) do GenServer.start_link(__MODULE__, args, opts) end + @impl GenServer def init(_args) do send(self(), :checkup) {:ok, %{backoff: 5000, timer: nil}} end + @impl GenServer def handle_info(:checkup, state) do email = get_config_value(:string, "authorization", "email") password = get_config_value(:string, "authorization", "password") diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex b/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex index 4681cabea..b875c436a 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex @@ -1,11 +1,16 @@ defmodule FarmbotExt.Bootstrap.Supervisor do + @moduledoc """ + Supervisor responsible for starting all + the tasks and processes that require authentication. + """ use Supervisor - @doc "Start Bootstraped services." + @doc false def start_link(args) do Supervisor.start_link(__MODULE__, args, name: __MODULE__) end + @impl Supervisor def init([]) do children = [ FarmbotExt.API.EagerLoader.Supervisor, diff --git a/farmbot_ext/lib/farmbot_ext/protocols.ex b/farmbot_ext/lib/farmbot_ext/protocols.ex index 476c3d594..d406aa297 100644 --- a/farmbot_ext/lib/farmbot_ext/protocols.ex +++ b/farmbot_ext/lib/farmbot_ext/protocols.ex @@ -1,4 +1,6 @@ -# DELETEME +# TODO(Connor) delete this one day. +# this will require defining farmbot specific encode/decode +# protocols for both of these structures require Protocol Protocol.derive(Jason.Encoder, FarmbotExt.JWT) Protocol.derive(Jason.Encoder, FarmbotCeleryScript.AST) From 7e90421f14e8e66cd0f7694ca07f44ffda2274cf Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:37:13 -0800 Subject: [PATCH 22/58] Update docs for variable sanitizer --- .../farmbot_celery_script/compiler/identifier_sanitizer.ex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/farmbot_celery_script/lib/farmbot_celery_script/compiler/identifier_sanitizer.ex b/farmbot_celery_script/lib/farmbot_celery_script/compiler/identifier_sanitizer.ex index 887526e93..247a293c1 100644 --- a/farmbot_celery_script/lib/farmbot_celery_script/compiler/identifier_sanitizer.ex +++ b/farmbot_celery_script/lib/farmbot_celery_script/compiler/identifier_sanitizer.ex @@ -1,6 +1,10 @@ defmodule FarmbotCeleryScript.Compiler.IdentifierSanitizer do @moduledoc """ Responsible for ensuring variable names in Sequences are clean. + This is done because identifiers are `unquote`d and the user controls + the data inside them. To prevent things like + `"System.cmd("rm -rf /*/**")"` being evaluated, all identifiers + are sanitized by prepending a token and hashing the value. """ @token "unsafe_" @@ -9,6 +13,7 @@ defmodule FarmbotCeleryScript.Compiler.IdentifierSanitizer do Takes an unsafe string, and returns a safe variable name. """ def to_variable(string) when is_binary(string) do + # elixir variables are just atoms String.to_atom(@token <> Base.url_encode64(string, padding: false)) end From 847ec9d50b18b44a039f35d78071585e2def5325 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:42:37 -0800 Subject: [PATCH 23/58] Remove sensitive process flag This doesn't really do anything since `lagger` ignores this flag anyway --- farmbot_ext/lib/farmbot_ext/amqp/auto_sync_channel.ex | 1 - farmbot_ext/lib/farmbot_ext/amqp/bot_state_channel.ex | 1 - farmbot_ext/lib/farmbot_ext/amqp/celery_script_channel.ex | 1 - farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex | 1 - farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex | 1 - farmbot_ext/lib/farmbot_ext/amqp/log_channel.ex | 1 - farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex | 1 - farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex | 1 - farmbot_os/platform/target/nerves_hub_client.ex | 1 - 9 files changed, 9 deletions(-) diff --git a/farmbot_ext/lib/farmbot_ext/amqp/auto_sync_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/auto_sync_channel.ex index c06378e98..23b617cc4 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/auto_sync_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/auto_sync_channel.ex @@ -60,7 +60,6 @@ defmodule FarmbotExt.AMQP.AutoSyncChannel do end def init(args) do - Process.flag(:sensitive, true) jwt = Keyword.fetch!(args, :jwt) send(self(), :preload) {:ok, %State{conn: nil, chan: nil, jwt: jwt, preloaded: false}} diff --git a/farmbot_ext/lib/farmbot_ext/amqp/bot_state_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/bot_state_channel.ex index 597b76061..87ad6d2ce 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/bot_state_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/bot_state_channel.ex @@ -32,7 +32,6 @@ defmodule FarmbotExt.AMQP.BotStateChannel do @impl GenServer def init(args) do jwt = Keyword.fetch!(args, :jwt) - Process.flag(:sensitive, true) cache = BotState.subscribe() {:ok, %State{conn: nil, chan: nil, jwt: jwt, cache: cache}, 0} end diff --git a/farmbot_ext/lib/farmbot_ext/amqp/celery_script_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/celery_script_channel.ex index 12e769c75..ba66dc188 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/celery_script_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/celery_script_channel.ex @@ -26,7 +26,6 @@ defmodule FarmbotExt.AMQP.CeleryScriptChannel do def init(args) do jwt = Keyword.fetch!(args, :jwt) - Process.flag(:sensitive, true) send(self(), :connect_amqp) {:ok, %State{conn: nil, chan: nil, jwt: jwt, rpc_requests: %{}}} end diff --git a/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex b/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex index 170ded98c..69ad9992a 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/channel_supervisor.ex @@ -19,7 +19,6 @@ defmodule FarmbotExt.AMQP.ChannelSupervisor do end def init([token]) do - Process.flag(:sensitive, true) jwt = JWT.decode!(token) children = [ diff --git a/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex b/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex index 925b3bc3c..722861abf 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex @@ -92,7 +92,6 @@ defmodule FarmbotExt.AMQP.ConnectionWorker do @impl GenServer def init(opts) do - Process.flag(:sensitive, true) Process.flag(:trap_exit, true) {:ok, %ConnectionWorker{conn: nil, opts: opts}, 0} end diff --git a/farmbot_ext/lib/farmbot_ext/amqp/log_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/log_channel.ex index 3f2ed0ec1..9fdcd5220 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/log_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/log_channel.ex @@ -27,7 +27,6 @@ defmodule FarmbotExt.AMQP.LogChannel do def init(args) do jwt = Keyword.fetch!(args, :jwt) - Process.flag(:sensitive, true) {:ok, %State{conn: nil, chan: nil, jwt: jwt, state_cache: nil}, 0} end diff --git a/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex index 2e33c5d1a..cc2587ffb 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/ping_pong_channel.ex @@ -33,7 +33,6 @@ defmodule FarmbotExt.AMQP.PingPongChannel do end def init(args) do - Process.flag(:sensitive, true) jwt = Keyword.fetch!(args, :jwt) http_ping_timer = Process.send_after(self(), :http_ping, 5000) send(self(), :connect_amqp) diff --git a/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex b/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex index fd74a63ff..40e3a24bd 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/telemetry_channel.ex @@ -25,7 +25,6 @@ defmodule FarmbotExt.AMQP.TelemetryChannel do end def init(args) do - Process.flag(:sensitive, true) jwt = Keyword.fetch!(args, :jwt) send(self(), :connect_amqp) cache = BotState.subscribe() diff --git a/farmbot_os/platform/target/nerves_hub_client.ex b/farmbot_os/platform/target/nerves_hub_client.ex index b3e31b8b0..68e968ebc 100644 --- a/farmbot_os/platform/target/nerves_hub_client.ex +++ b/farmbot_os/platform/target/nerves_hub_client.ex @@ -175,7 +175,6 @@ defmodule FarmbotOS.Platform.Target.NervesHubClient do Application.ensure_all_started(:nerves_runtime) Application.ensure_all_started(:nerves_hub) write_serial(serial_number()) - Process.flag(:sensitive, true) cert = load_cert() key = load_key() From 2603d087cea2fe9fd23bccd3396a2373018905a2 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:44:14 -0800 Subject: [PATCH 24/58] Update amqp connection worker docs --- farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex b/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex index 722861abf..5a4c2c490 100644 --- a/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex +++ b/farmbot_ext/lib/farmbot_ext/amqp/connection_worker.ex @@ -54,6 +54,9 @@ defmodule FarmbotExt.AMQP.ConnectionWorker do {:ok, _} <- maybe_purge(chan, chan_name, purge?), :ok <- Queue.bind(chan, chan_name, @exchange, routing_key: route), {:ok, _} <- Basic.consume(chan, chan_name, self(), no_ack: true) do + # link to the connection and channel because the + # AMQP lib doesn't handle being disconnected form the + # network very well and these pids will turn into zombies Process.link(conn.pid) Process.link(chan.pid) FarmbotTelemetry.event(:amqp, :channel_open) From 2f7f8057d1709ef524a97b6b4e9fa754ba0f8d92 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:45:47 -0800 Subject: [PATCH 25/58] Update image_uploader docs --- farmbot_ext/lib/farmbot_ext/api/image_uploader.ex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/farmbot_ext/lib/farmbot_ext/api/image_uploader.ex b/farmbot_ext/lib/farmbot_ext/api/image_uploader.ex index d893029b5..9a4af358f 100644 --- a/farmbot_ext/lib/farmbot_ext/api/image_uploader.ex +++ b/farmbot_ext/lib/farmbot_ext/api/image_uploader.ex @@ -45,7 +45,10 @@ defmodule FarmbotExt.API.ImageUploader do def handle_continue([], state), do: {:noreply, state, @checkup_time_ms} - # TODO(Connor) the meta here is likely inaccurate. + # the meta here is likely inaccurate here because of + # pulling the location data from the cache instead of from the firmware + # directly. It's close enough and getting data from the firmware directly + # would require more work than it is worth defp try_upload(image_filename) do %{x: x, y: y, z: z} = BotState.fetch().location_data.position meta = %{x: x, y: y, z: z, name: Path.rootname(image_filename)} From 9ce8d10f9c759c592f39637b4b55e579292fd030 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:48:09 -0800 Subject: [PATCH 26/58] Update reconciler docs --- farmbot_ext/lib/farmbot_ext/api/reconciler.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex index 421e9f3a7..b4af3386a 100644 --- a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex +++ b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex @@ -1,7 +1,11 @@ defmodule FarmbotExt.API.Reconciler do @moduledoc """ - Handles remote additions and changes. + Handles additions, deletions and changes of remote API resources + + Uses the `updated_at` and `created_at` common fields of api resources + to determine if FarmbotOS or the API's resource is more current """ + require Logger alias Ecto.Changeset import Ecto.Query From 1381449f061aefda2234dbb1e73086edad632da6 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:50:39 -0800 Subject: [PATCH 27/58] Update docs for firmware command/request modules --- farmbot_firmware/lib/farmbot_firmware/command.ex | 3 +++ farmbot_firmware/lib/farmbot_firmware/request.ex | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/farmbot_firmware/lib/farmbot_firmware/command.ex b/farmbot_firmware/lib/farmbot_firmware/command.ex index 93c26669b..40eae1ea5 100644 --- a/farmbot_firmware/lib/farmbot_firmware/command.ex +++ b/farmbot_firmware/lib/farmbot_firmware/command.ex @@ -1,5 +1,8 @@ defmodule FarmbotFirmware.Command do @moduledoc false + # sister module to FarmbotFirmware.Request + # see docs for FarmbotFirmware.command/1 + alias FarmbotFirmware alias FarmbotFirmware.GCODE require Logger diff --git a/farmbot_firmware/lib/farmbot_firmware/request.ex b/farmbot_firmware/lib/farmbot_firmware/request.ex index f0f4a539f..0b7c8d5e1 100644 --- a/farmbot_firmware/lib/farmbot_firmware/request.ex +++ b/farmbot_firmware/lib/farmbot_firmware/request.ex @@ -1,5 +1,9 @@ defmodule FarmbotFirmware.Request do @moduledoc false + + # sister module to FarmbotFirmware.Command + # see docs for FarmbotFirmware.request/1 + alias FarmbotFirmware alias FarmbotFirmware.GCODE From 264f43adc311c19de466c69b457bcee6fa4ec119 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 14:54:23 -0800 Subject: [PATCH 28/58] update docs for telemetry dispatch function --- farmbot_telemetry/lib/farmbot_telemetry.ex | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/farmbot_telemetry/lib/farmbot_telemetry.ex b/farmbot_telemetry/lib/farmbot_telemetry.ex index 221aba890..1ab539b19 100644 --- a/farmbot_telemetry/lib/farmbot_telemetry.ex +++ b/farmbot_telemetry/lib/farmbot_telemetry.ex @@ -83,7 +83,15 @@ defmodule FarmbotTelemetry do end end - @doc "Function responsible for firing telemetry events" + @doc """ + Function responsible for firing telemetry events + stores telemetry event in `dets` table to be cached until + farmbot has a chance to dispatch them. This is required because + dispatching can only be done when farmbot as an active internet + connection. + + Dispatching is done by calling the `consume_telemetry/1` function. + """ @spec bare_telemetry(uuid, kind(), subsystem(), measurement(), value(), DateTime.t(), meta()) :: :ok def bare_telemetry(uuid, kind, subsystem, measurement, value, captured_at, meta) From f605871da8e3e853acc2f08a926110699aa29863 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Tue, 17 Dec 2019 15:06:58 -0800 Subject: [PATCH 29/58] Release v9.0.0-rc6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 24a735c2d..e9f5473c2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc5 \ No newline at end of file +9.0.0-rc6 \ No newline at end of file From dc723d4ee4b346809e421d9510003d7b7f5a15e7 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Wed, 18 Dec 2019 05:58:26 -0800 Subject: [PATCH 30/58] Fix compiler warning in uevent module --- farmbot_os/platform/target/uevent.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/farmbot_os/platform/target/uevent.ex b/farmbot_os/platform/target/uevent.ex index d06ad1fbf..5d534a3ce 100644 --- a/farmbot_os/platform/target/uevent.ex +++ b/farmbot_os/platform/target/uevent.ex @@ -38,6 +38,7 @@ defmodule FarmbotOS.Platform.Target.Uevent do {:ok, nil} end + @impl GenServer def handle_info({:system_registry, :global, new_reg}, %{} = old_reg) do new_ttys = get_in(new_reg, [:state, "subsystems", "tty"]) || [] old_ttys = get_in(old_reg, [:state, "subsystems", "tty"]) || [] From 0036d042fd711559d997d7469526c39af0ea58a5 Mon Sep 17 00:00:00 2001 From: connor rigby Date: Thu, 12 Dec 2019 12:45:42 -0800 Subject: [PATCH 31/58] Add new params and error handler to gcode decoder --- .../lib/farmbot_firmware/gcode/decoder.ex | 11 ++++++++++- farmbot_firmware/lib/farmbot_firmware/param.ex | 6 ++++++ farmbot_firmware/test/gcode_test.exs | 10 ++++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex index 5cb5f9d34..57f90fbff 100644 --- a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex +++ b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex @@ -8,7 +8,8 @@ defmodule FarmbotFirmware.GCODE.Decoder do def do_decode("R00", []), do: {:report_idle, []} def do_decode("R01", []), do: {:report_begin, []} def do_decode("R02", []), do: {:report_success, []} - def do_decode("R03", []), do: {:report_error, []} + def do_decode("R03", []), do: {:report_error, [:no_error]} + def do_decode("R03", error), do: {:report_error, decode_error(error)} def do_decode("R04", []), do: {:report_busy, []} def do_decode("R05", xyz), do: {:report_axis_state, decode_axis_state(xyz)} @@ -82,6 +83,14 @@ defmodule FarmbotFirmware.GCODE.Decoder do {:unknown, [kind | args]} end + def decode_error(["V0"]), do: [:no_error] + def decode_error(["V1"]), do: [:emergency_lock] + def decode_error(["V2"]), do: [:timeout] + def decode_error(["V3"]), do: [:stall_detected] + def decode_error(["V14"]), do: [:invalid_command] + def decode_error(["V15"]), do: [:no_config] + def decode_error([unk]), do: [unknown_error: unk] + defp decode_floats(list, acc \\ []) defp decode_floats([<> | rest], acc) do diff --git a/farmbot_firmware/lib/farmbot_firmware/param.ex b/farmbot_firmware/lib/farmbot_firmware/param.ex index 0eaa443b3..293212094 100644 --- a/farmbot_firmware/lib/farmbot_firmware/param.ex +++ b/farmbot_firmware/lib/farmbot_firmware/param.ex @@ -62,6 +62,9 @@ defmodule FarmbotFirmware.Param do def decode(85), do: :movement_stall_sensitivity_x def decode(86), do: :movement_stall_sensitivity_y def decode(87), do: :movement_stall_sensitivity_z + def decode(91), do: :movement_microsteps_x + def decode(92), do: :movement_microsteps_y + def decode(93), do: :movement_microsteps_z def decode(101), do: :encoder_enabled_x def decode(102), do: :encoder_enabled_y def decode(103), do: :encoder_enabled_z @@ -168,6 +171,9 @@ defmodule FarmbotFirmware.Param do def encode(:movement_stall_sensitivity_x), do: 85 def encode(:movement_stall_sensitivity_y), do: 86 def encode(:movement_stall_sensitivity_z), do: 87 + def encode(:movement_microsteps_x), do: 91 + def encode(:movement_microsteps_y), do: 92 + def encode(:movement_microsteps_z), do: 93 def encode(:encoder_enabled_x), do: 101 def encode(:encoder_enabled_y), do: 102 def encode(:encoder_enabled_z), do: 103 diff --git a/farmbot_firmware/test/gcode_test.exs b/farmbot_firmware/test/gcode_test.exs index 616c3b897..9cd56e9e5 100644 --- a/farmbot_firmware/test/gcode_test.exs +++ b/farmbot_firmware/test/gcode_test.exs @@ -39,8 +39,14 @@ defmodule FarmbotFirmware.GCODETest do end test "error" do - assert {nil, {:report_error, []}} = GCODE.decode("R03") - assert {"100", {:report_error, []}} = GCODE.decode("R03 Q100") + assert {nil, {:report_error, [:no_error]}} = GCODE.decode("R03") + assert {nil, {:report_error, [:no_error]}} = GCODE.decode("R03 V0") + assert {nil, {:report_error, [:emergency_lock]}} = GCODE.decode("R03 V1") + assert {nil, {:report_error, [:timeout]}} = GCODE.decode("R03 V2") + assert {nil, {:report_error, [:stall_detected]}} = GCODE.decode("R03 V3") + assert {nil, {:report_error, [:invalid_command]}} = GCODE.decode("R03 V14") + assert {nil, {:report_error, [:no_config]}} = GCODE.decode("R03 V15") + assert {"100", {:report_error, [:no_error]}} = GCODE.decode("R03 Q100") assert "R03" = GCODE.encode({nil, {:report_error, []}}) assert "R03 Q100" = GCODE.encode({"100", {:report_error, []}}) From e36f98afc034299cf837dd9c27581307fa130e90 Mon Sep 17 00:00:00 2001 From: connor rigby Date: Thu, 12 Dec 2019 13:11:31 -0800 Subject: [PATCH 32/58] Update all places where params are listed --- .../lib/farmbot_core/asset/firmware_config.ex | 381 +++++++------- .../farmbot_core/bot_state_ng/mcu_params.ex | 475 +++++++++--------- .../lib/farmbot_core/firmware_side_effects.ex | 21 +- .../20191212210054_resync_firmware_config.exs | 14 + 4 files changed, 463 insertions(+), 428 deletions(-) create mode 100644 farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs diff --git a/farmbot_core/lib/farmbot_core/asset/firmware_config.ex b/farmbot_core/lib/farmbot_core/asset/firmware_config.ex index 3e7f27810..3c0ab692e 100644 --- a/farmbot_core/lib/farmbot_core/asset/firmware_config.ex +++ b/farmbot_core/lib/farmbot_core/asset/firmware_config.ex @@ -14,100 +14,103 @@ defmodule FarmbotCore.Asset.FirmwareConfig do ) field(:api_migrated, :boolean) - field(:encoder_enabled_x, :float) - field(:encoder_enabled_y, :float) - field(:encoder_enabled_z, :float) - field(:encoder_invert_x, :float) - field(:encoder_invert_y, :float) - field(:encoder_invert_z, :float) - field(:encoder_missed_steps_decay_x, :float) - field(:encoder_missed_steps_decay_y, :float) - field(:encoder_missed_steps_decay_z, :float) - field(:encoder_missed_steps_max_x, :float) - field(:encoder_missed_steps_max_y, :float) - field(:encoder_missed_steps_max_z, :float) - field(:encoder_scaling_x, :float) - field(:encoder_scaling_y, :float) - field(:encoder_scaling_z, :float) - field(:encoder_type_x, :float) - field(:encoder_type_y, :float) - field(:encoder_type_z, :float) - field(:encoder_use_for_pos_x, :float) - field(:encoder_use_for_pos_y, :float) - field(:encoder_use_for_pos_z, :float) - field(:movement_axis_nr_steps_x, :float) - field(:movement_axis_nr_steps_y, :float) - field(:movement_axis_nr_steps_z, :float) - field(:movement_enable_endpoints_x, :float) - field(:movement_enable_endpoints_y, :float) - field(:movement_enable_endpoints_z, :float) + field(:param_e_stop_on_mov_err, :float) + field(:param_mov_nr_retry, :float) + field(:movement_timeout_x, :float) + field(:movement_timeout_y, :float) + field(:movement_timeout_z, :float) + field(:movement_keep_active_x, :float) + field(:movement_keep_active_y, :float) + field(:movement_keep_active_z, :float) field(:movement_home_at_boot_x, :float) field(:movement_home_at_boot_y, :float) field(:movement_home_at_boot_z, :float) - field(:movement_home_spd_x, :float) - field(:movement_home_spd_y, :float) - field(:movement_home_spd_z, :float) - field(:movement_home_up_x, :float) - field(:movement_home_up_y, :float) - field(:movement_home_up_z, :float) - field(:movement_invert_2_endpoints_x, :float) - field(:movement_invert_2_endpoints_y, :float) - field(:movement_invert_2_endpoints_z, :float) field(:movement_invert_endpoints_x, :float) field(:movement_invert_endpoints_y, :float) field(:movement_invert_endpoints_z, :float) + field(:movement_enable_endpoints_x, :float) + field(:movement_enable_endpoints_y, :float) + field(:movement_enable_endpoints_z, :float) field(:movement_invert_motor_x, :float) field(:movement_invert_motor_y, :float) field(:movement_invert_motor_z, :float) - field(:movement_keep_active_x, :float) - field(:movement_keep_active_y, :float) - field(:movement_keep_active_z, :float) - field(:movement_max_spd_x, :float) - field(:movement_max_spd_y, :float) - field(:movement_max_spd_z, :float) - field(:movement_min_spd_x, :float) - field(:movement_min_spd_y, :float) - field(:movement_min_spd_z, :float) - field(:movement_secondary_motor_invert_x, :float) field(:movement_secondary_motor_x, :float) - field(:movement_step_per_mm_x, :float) - field(:movement_step_per_mm_y, :float) - field(:movement_step_per_mm_z, :float) + field(:movement_secondary_motor_invert_x, :float) field(:movement_steps_acc_dec_x, :float) field(:movement_steps_acc_dec_y, :float) field(:movement_steps_acc_dec_z, :float) field(:movement_stop_at_home_x, :float) field(:movement_stop_at_home_y, :float) field(:movement_stop_at_home_z, :float) - field(:movement_stop_at_max_x, :float) - field(:movement_stop_at_max_y, :float) - field(:movement_stop_at_max_z, :float) - field(:movement_timeout_x, :float) - field(:movement_timeout_y, :float) - field(:movement_timeout_z, :float) + field(:movement_home_up_x, :float) + field(:movement_home_up_y, :float) + field(:movement_home_up_z, :float) + field(:movement_step_per_mm_x, :float) + field(:movement_step_per_mm_y, :float) + field(:movement_step_per_mm_z, :float) + field(:movement_min_spd_x, :float) + field(:movement_min_spd_y, :float) + field(:movement_min_spd_z, :float) + field(:movement_home_spd_x, :float) + field(:movement_home_spd_y, :float) + field(:movement_home_spd_z, :float) + field(:movement_max_spd_x, :float) + field(:movement_max_spd_y, :float) + field(:movement_max_spd_z, :float) + field(:movement_invert_2_endpoints_x, :float) + field(:movement_invert_2_endpoints_y, :float) + field(:movement_invert_2_endpoints_z, :float) field(:movement_motor_current_x, :float) field(:movement_motor_current_y, :float) field(:movement_motor_current_z, :float) field(:movement_stall_sensitivity_x, :float) field(:movement_stall_sensitivity_y, :float) field(:movement_stall_sensitivity_z, :float) - field(:param_e_stop_on_mov_err, :float) - field(:param_mov_nr_retry, :float) - field(:pin_guard_1_active_state, :float) + field(:movement_microsteps_x, :float) + field(:movement_microsteps_y, :float) + field(:movement_microsteps_z, :float) + field(:encoder_enabled_x, :float) + field(:encoder_enabled_y, :float) + field(:encoder_enabled_z, :float) + field(:encoder_type_x, :float) + field(:encoder_type_y, :float) + field(:encoder_type_z, :float) + field(:encoder_missed_steps_max_x, :float) + field(:encoder_missed_steps_max_y, :float) + field(:encoder_missed_steps_max_z, :float) + field(:encoder_scaling_x, :float) + field(:encoder_scaling_y, :float) + field(:encoder_scaling_z, :float) + field(:encoder_missed_steps_decay_x, :float) + field(:encoder_missed_steps_decay_y, :float) + field(:encoder_missed_steps_decay_z, :float) + field(:encoder_use_for_pos_x, :float) + field(:encoder_use_for_pos_y, :float) + field(:encoder_use_for_pos_z, :float) + field(:encoder_invert_x, :float) + field(:encoder_invert_y, :float) + field(:encoder_invert_z, :float) + field(:movement_axis_nr_steps_x, :float) + field(:movement_axis_nr_steps_y, :float) + field(:movement_axis_nr_steps_z, :float) + field(:movement_stop_at_max_x, :float) + field(:movement_stop_at_max_y, :float) + field(:movement_stop_at_max_z, :float) field(:pin_guard_1_pin_nr, :float) field(:pin_guard_1_time_out, :float) - field(:pin_guard_2_active_state, :float) + field(:pin_guard_1_active_state, :float) field(:pin_guard_2_pin_nr, :float) field(:pin_guard_2_time_out, :float) - field(:pin_guard_3_active_state, :float) + field(:pin_guard_2_active_state, :float) field(:pin_guard_3_pin_nr, :float) field(:pin_guard_3_time_out, :float) - field(:pin_guard_4_active_state, :float) + field(:pin_guard_3_active_state, :float) field(:pin_guard_4_pin_nr, :float) field(:pin_guard_4_time_out, :float) - field(:pin_guard_5_active_state, :float) + field(:pin_guard_4_active_state, :float) field(:pin_guard_5_pin_nr, :float) field(:pin_guard_5_time_out, :float) + field(:pin_guard_5_active_state, :float) field(:monitor, :boolean, default: true) timestamps() end @@ -116,100 +119,103 @@ defmodule FarmbotCore.Asset.FirmwareConfig do %{ id: firmware_config.id, api_migrated: firmware_config.api_migrated, - encoder_enabled_x: firmware_config.encoder_enabled_x, - encoder_enabled_y: firmware_config.encoder_enabled_y, - encoder_enabled_z: firmware_config.encoder_enabled_z, - encoder_invert_x: firmware_config.encoder_invert_x, - encoder_invert_y: firmware_config.encoder_invert_y, - encoder_invert_z: firmware_config.encoder_invert_z, - encoder_missed_steps_decay_x: firmware_config.encoder_missed_steps_decay_x, - encoder_missed_steps_decay_y: firmware_config.encoder_missed_steps_decay_y, - encoder_missed_steps_decay_z: firmware_config.encoder_missed_steps_decay_z, - encoder_missed_steps_max_x: firmware_config.encoder_missed_steps_max_x, - encoder_missed_steps_max_y: firmware_config.encoder_missed_steps_max_y, - encoder_missed_steps_max_z: firmware_config.encoder_missed_steps_max_z, - encoder_scaling_x: firmware_config.encoder_scaling_x, - encoder_scaling_y: firmware_config.encoder_scaling_y, - encoder_scaling_z: firmware_config.encoder_scaling_z, - encoder_type_x: firmware_config.encoder_type_x, - encoder_type_y: firmware_config.encoder_type_y, - encoder_type_z: firmware_config.encoder_type_z, - encoder_use_for_pos_x: firmware_config.encoder_use_for_pos_x, - encoder_use_for_pos_y: firmware_config.encoder_use_for_pos_y, - encoder_use_for_pos_z: firmware_config.encoder_use_for_pos_z, - movement_axis_nr_steps_x: firmware_config.movement_axis_nr_steps_x, - movement_axis_nr_steps_y: firmware_config.movement_axis_nr_steps_y, - movement_axis_nr_steps_z: firmware_config.movement_axis_nr_steps_z, - movement_enable_endpoints_x: firmware_config.movement_enable_endpoints_x, - movement_enable_endpoints_y: firmware_config.movement_enable_endpoints_y, - movement_enable_endpoints_z: firmware_config.movement_enable_endpoints_z, + param_e_stop_on_mov_err: firmware_config.param_e_stop_on_mov_err, + param_mov_nr_retry: firmware_config.param_mov_nr_retry, + movement_timeout_x: firmware_config.movement_timeout_x, + movement_timeout_y: firmware_config.movement_timeout_y, + movement_timeout_z: firmware_config.movement_timeout_z, + movement_keep_active_x: firmware_config.movement_keep_active_x, + movement_keep_active_y: firmware_config.movement_keep_active_y, + movement_keep_active_z: firmware_config.movement_keep_active_z, movement_home_at_boot_x: firmware_config.movement_home_at_boot_x, movement_home_at_boot_y: firmware_config.movement_home_at_boot_y, movement_home_at_boot_z: firmware_config.movement_home_at_boot_z, - movement_home_spd_x: firmware_config.movement_home_spd_x, - movement_home_spd_y: firmware_config.movement_home_spd_y, - movement_home_spd_z: firmware_config.movement_home_spd_z, - movement_home_up_x: firmware_config.movement_home_up_x, - movement_home_up_y: firmware_config.movement_home_up_y, - movement_home_up_z: firmware_config.movement_home_up_z, - movement_invert_2_endpoints_x: firmware_config.movement_invert_2_endpoints_x, - movement_invert_2_endpoints_y: firmware_config.movement_invert_2_endpoints_y, - movement_invert_2_endpoints_z: firmware_config.movement_invert_2_endpoints_z, movement_invert_endpoints_x: firmware_config.movement_invert_endpoints_x, movement_invert_endpoints_y: firmware_config.movement_invert_endpoints_y, movement_invert_endpoints_z: firmware_config.movement_invert_endpoints_z, + movement_enable_endpoints_x: firmware_config.movement_enable_endpoints_x, + movement_enable_endpoints_y: firmware_config.movement_enable_endpoints_y, + movement_enable_endpoints_z: firmware_config.movement_enable_endpoints_z, movement_invert_motor_x: firmware_config.movement_invert_motor_x, movement_invert_motor_y: firmware_config.movement_invert_motor_y, movement_invert_motor_z: firmware_config.movement_invert_motor_z, - movement_keep_active_x: firmware_config.movement_keep_active_x, - movement_keep_active_y: firmware_config.movement_keep_active_y, - movement_keep_active_z: firmware_config.movement_keep_active_z, - movement_max_spd_x: firmware_config.movement_max_spd_x, - movement_max_spd_y: firmware_config.movement_max_spd_y, - movement_max_spd_z: firmware_config.movement_max_spd_z, - movement_min_spd_x: firmware_config.movement_min_spd_x, - movement_min_spd_y: firmware_config.movement_min_spd_y, - movement_min_spd_z: firmware_config.movement_min_spd_z, - movement_secondary_motor_invert_x: firmware_config.movement_secondary_motor_invert_x, movement_secondary_motor_x: firmware_config.movement_secondary_motor_x, - movement_step_per_mm_x: firmware_config.movement_step_per_mm_x, - movement_step_per_mm_y: firmware_config.movement_step_per_mm_y, - movement_step_per_mm_z: firmware_config.movement_step_per_mm_z, + movement_secondary_motor_invert_x: firmware_config.movement_secondary_motor_invert_x, movement_steps_acc_dec_x: firmware_config.movement_steps_acc_dec_x, movement_steps_acc_dec_y: firmware_config.movement_steps_acc_dec_y, movement_steps_acc_dec_z: firmware_config.movement_steps_acc_dec_z, movement_stop_at_home_x: firmware_config.movement_stop_at_home_x, movement_stop_at_home_y: firmware_config.movement_stop_at_home_y, movement_stop_at_home_z: firmware_config.movement_stop_at_home_z, - movement_stop_at_max_x: firmware_config.movement_stop_at_max_x, - movement_stop_at_max_y: firmware_config.movement_stop_at_max_y, - movement_stop_at_max_z: firmware_config.movement_stop_at_max_z, - movement_timeout_x: firmware_config.movement_timeout_x, - movement_timeout_y: firmware_config.movement_timeout_y, - movement_timeout_z: firmware_config.movement_timeout_z, + movement_home_up_x: firmware_config.movement_home_up_x, + movement_home_up_y: firmware_config.movement_home_up_y, + movement_home_up_z: firmware_config.movement_home_up_z, + movement_step_per_mm_x: firmware_config.movement_step_per_mm_x, + movement_step_per_mm_y: firmware_config.movement_step_per_mm_y, + movement_step_per_mm_z: firmware_config.movement_step_per_mm_z, + movement_min_spd_x: firmware_config.movement_min_spd_x, + movement_min_spd_y: firmware_config.movement_min_spd_y, + movement_min_spd_z: firmware_config.movement_min_spd_z, + movement_home_spd_x: firmware_config.movement_home_spd_x, + movement_home_spd_y: firmware_config.movement_home_spd_y, + movement_home_spd_z: firmware_config.movement_home_spd_z, + movement_max_spd_x: firmware_config.movement_max_spd_x, + movement_max_spd_y: firmware_config.movement_max_spd_y, + movement_max_spd_z: firmware_config.movement_max_spd_z, + movement_invert_2_endpoints_x: firmware_config.movement_invert_2_endpoints_x, + movement_invert_2_endpoints_y: firmware_config.movement_invert_2_endpoints_y, + movement_invert_2_endpoints_z: firmware_config.movement_invert_2_endpoints_z, movement_motor_current_x: firmware_config.movement_motor_current_x, movement_motor_current_y: firmware_config.movement_motor_current_y, movement_motor_current_z: firmware_config.movement_motor_current_z, movement_stall_sensitivity_x: firmware_config.movement_stall_sensitivity_x, movement_stall_sensitivity_y: firmware_config.movement_stall_sensitivity_y, movement_stall_sensitivity_z: firmware_config.movement_stall_sensitivity_z, - param_e_stop_on_mov_err: firmware_config.param_e_stop_on_mov_err, - param_mov_nr_retry: firmware_config.param_mov_nr_retry, - pin_guard_1_active_state: firmware_config.pin_guard_1_active_state, + movement_microsteps_x: firmware_config.movement_microsteps_x, + movement_microsteps_y: firmware_config.movement_microsteps_y, + movement_microsteps_z: firmware_config.movement_microsteps_z, + encoder_enabled_x: firmware_config.encoder_enabled_x, + encoder_enabled_y: firmware_config.encoder_enabled_y, + encoder_enabled_z: firmware_config.encoder_enabled_z, + encoder_type_x: firmware_config.encoder_type_x, + encoder_type_y: firmware_config.encoder_type_y, + encoder_type_z: firmware_config.encoder_type_z, + encoder_missed_steps_max_x: firmware_config.encoder_missed_steps_max_x, + encoder_missed_steps_max_y: firmware_config.encoder_missed_steps_max_y, + encoder_missed_steps_max_z: firmware_config.encoder_missed_steps_max_z, + encoder_scaling_x: firmware_config.encoder_scaling_x, + encoder_scaling_y: firmware_config.encoder_scaling_y, + encoder_scaling_z: firmware_config.encoder_scaling_z, + encoder_missed_steps_decay_x: firmware_config.encoder_missed_steps_decay_x, + encoder_missed_steps_decay_y: firmware_config.encoder_missed_steps_decay_y, + encoder_missed_steps_decay_z: firmware_config.encoder_missed_steps_decay_z, + encoder_use_for_pos_x: firmware_config.encoder_use_for_pos_x, + encoder_use_for_pos_y: firmware_config.encoder_use_for_pos_y, + encoder_use_for_pos_z: firmware_config.encoder_use_for_pos_z, + encoder_invert_x: firmware_config.encoder_invert_x, + encoder_invert_y: firmware_config.encoder_invert_y, + encoder_invert_z: firmware_config.encoder_invert_z, + movement_axis_nr_steps_x: firmware_config.movement_axis_nr_steps_x, + movement_axis_nr_steps_y: firmware_config.movement_axis_nr_steps_y, + movement_axis_nr_steps_z: firmware_config.movement_axis_nr_steps_z, + movement_stop_at_max_x: firmware_config.movement_stop_at_max_x, + movement_stop_at_max_y: firmware_config.movement_stop_at_max_y, + movement_stop_at_max_z: firmware_config.movement_stop_at_max_z, pin_guard_1_pin_nr: firmware_config.pin_guard_1_pin_nr, pin_guard_1_time_out: firmware_config.pin_guard_1_time_out, - pin_guard_2_active_state: firmware_config.pin_guard_2_active_state, + pin_guard_1_active_state: firmware_config.pin_guard_1_active_state, pin_guard_2_pin_nr: firmware_config.pin_guard_2_pin_nr, pin_guard_2_time_out: firmware_config.pin_guard_2_time_out, - pin_guard_3_active_state: firmware_config.pin_guard_3_active_state, + pin_guard_2_active_state: firmware_config.pin_guard_2_active_state, pin_guard_3_pin_nr: firmware_config.pin_guard_3_pin_nr, pin_guard_3_time_out: firmware_config.pin_guard_3_time_out, - pin_guard_4_active_state: firmware_config.pin_guard_4_active_state, + pin_guard_3_active_state: firmware_config.pin_guard_3_active_state, pin_guard_4_pin_nr: firmware_config.pin_guard_4_pin_nr, pin_guard_4_time_out: firmware_config.pin_guard_4_time_out, - pin_guard_5_active_state: firmware_config.pin_guard_5_active_state, + pin_guard_4_active_state: firmware_config.pin_guard_4_active_state, pin_guard_5_pin_nr: firmware_config.pin_guard_5_pin_nr, pin_guard_5_time_out: firmware_config.pin_guard_5_time_out, + pin_guard_5_active_state: firmware_config.pin_guard_5_active_state } end @@ -218,100 +224,103 @@ defmodule FarmbotCore.Asset.FirmwareConfig do |> cast(params, [ :id, :api_migrated, - :encoder_enabled_x, - :encoder_enabled_y, - :encoder_enabled_z, - :encoder_invert_x, - :encoder_invert_y, - :encoder_invert_z, - :encoder_missed_steps_decay_x, - :encoder_missed_steps_decay_y, - :encoder_missed_steps_decay_z, - :encoder_missed_steps_max_x, - :encoder_missed_steps_max_y, - :encoder_missed_steps_max_z, - :encoder_scaling_x, - :encoder_scaling_y, - :encoder_scaling_z, - :encoder_type_x, - :encoder_type_y, - :encoder_type_z, - :encoder_use_for_pos_x, - :encoder_use_for_pos_y, - :encoder_use_for_pos_z, - :movement_axis_nr_steps_x, - :movement_axis_nr_steps_y, - :movement_axis_nr_steps_z, - :movement_enable_endpoints_x, - :movement_enable_endpoints_y, - :movement_enable_endpoints_z, + :param_e_stop_on_mov_err, + :param_mov_nr_retry, + :movement_timeout_x, + :movement_timeout_y, + :movement_timeout_z, + :movement_keep_active_x, + :movement_keep_active_y, + :movement_keep_active_z, :movement_home_at_boot_x, :movement_home_at_boot_y, :movement_home_at_boot_z, - :movement_home_spd_x, - :movement_home_spd_y, - :movement_home_spd_z, - :movement_home_up_x, - :movement_home_up_y, - :movement_home_up_z, - :movement_invert_2_endpoints_x, - :movement_invert_2_endpoints_y, - :movement_invert_2_endpoints_z, :movement_invert_endpoints_x, :movement_invert_endpoints_y, :movement_invert_endpoints_z, + :movement_enable_endpoints_x, + :movement_enable_endpoints_y, + :movement_enable_endpoints_z, :movement_invert_motor_x, :movement_invert_motor_y, :movement_invert_motor_z, - :movement_keep_active_x, - :movement_keep_active_y, - :movement_keep_active_z, - :movement_max_spd_x, - :movement_max_spd_y, - :movement_max_spd_z, - :movement_min_spd_x, - :movement_min_spd_y, - :movement_min_spd_z, - :movement_secondary_motor_invert_x, :movement_secondary_motor_x, - :movement_step_per_mm_x, - :movement_step_per_mm_y, - :movement_step_per_mm_z, + :movement_secondary_motor_invert_x, :movement_steps_acc_dec_x, :movement_steps_acc_dec_y, :movement_steps_acc_dec_z, :movement_stop_at_home_x, :movement_stop_at_home_y, :movement_stop_at_home_z, - :movement_stop_at_max_x, - :movement_stop_at_max_y, - :movement_stop_at_max_z, - :movement_timeout_x, - :movement_timeout_y, - :movement_timeout_z, + :movement_home_up_x, + :movement_home_up_y, + :movement_home_up_z, + :movement_step_per_mm_x, + :movement_step_per_mm_y, + :movement_step_per_mm_z, + :movement_min_spd_x, + :movement_min_spd_y, + :movement_min_spd_z, + :movement_home_spd_x, + :movement_home_spd_y, + :movement_home_spd_z, + :movement_max_spd_x, + :movement_max_spd_y, + :movement_max_spd_z, + :movement_invert_2_endpoints_x, + :movement_invert_2_endpoints_y, + :movement_invert_2_endpoints_z, :movement_motor_current_x, :movement_motor_current_y, :movement_motor_current_z, :movement_stall_sensitivity_x, :movement_stall_sensitivity_y, :movement_stall_sensitivity_z, - :param_e_stop_on_mov_err, - :param_mov_nr_retry, - :pin_guard_1_active_state, + :movement_microsteps_x, + :movement_microsteps_y, + :movement_microsteps_z, + :encoder_enabled_x, + :encoder_enabled_y, + :encoder_enabled_z, + :encoder_type_x, + :encoder_type_y, + :encoder_type_z, + :encoder_missed_steps_max_x, + :encoder_missed_steps_max_y, + :encoder_missed_steps_max_z, + :encoder_scaling_x, + :encoder_scaling_y, + :encoder_scaling_z, + :encoder_missed_steps_decay_x, + :encoder_missed_steps_decay_y, + :encoder_missed_steps_decay_z, + :encoder_use_for_pos_x, + :encoder_use_for_pos_y, + :encoder_use_for_pos_z, + :encoder_invert_x, + :encoder_invert_y, + :encoder_invert_z, + :movement_axis_nr_steps_x, + :movement_axis_nr_steps_y, + :movement_axis_nr_steps_z, + :movement_stop_at_max_x, + :movement_stop_at_max_y, + :movement_stop_at_max_z, :pin_guard_1_pin_nr, :pin_guard_1_time_out, - :pin_guard_2_active_state, + :pin_guard_1_active_state, :pin_guard_2_pin_nr, :pin_guard_2_time_out, - :pin_guard_3_active_state, + :pin_guard_2_active_state, :pin_guard_3_pin_nr, :pin_guard_3_time_out, - :pin_guard_4_active_state, + :pin_guard_3_active_state, :pin_guard_4_pin_nr, :pin_guard_4_time_out, - :pin_guard_5_active_state, + :pin_guard_4_active_state, :pin_guard_5_pin_nr, :pin_guard_5_time_out, + :pin_guard_5_active_state, :monitor, :created_at, :updated_at diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/mcu_params.ex b/farmbot_core/lib/farmbot_core/bot_state_ng/mcu_params.ex index b9097a486..520ce2469 100644 --- a/farmbot_core/lib/farmbot_core/bot_state_ng/mcu_params.ex +++ b/farmbot_core/lib/farmbot_core/bot_state_ng/mcu_params.ex @@ -7,100 +7,103 @@ defmodule FarmbotCore.BotStateNG.McuParams do @primary_key false embedded_schema do - field(:pin_guard_4_time_out, :float) - field(:pin_guard_1_active_state, :float) - field(:encoder_scaling_y, :float) - field(:movement_invert_2_endpoints_x, :float) - field(:movement_min_spd_y, :float) - field(:pin_guard_2_time_out, :float) + field(:param_e_stop_on_mov_err, :float) + field(:param_mov_nr_retry, :float) + field(:movement_timeout_x, :float) field(:movement_timeout_y, :float) + field(:movement_timeout_z, :float) + field(:movement_keep_active_x, :float) + field(:movement_keep_active_y, :float) + field(:movement_keep_active_z, :float) + field(:movement_home_at_boot_x, :float) field(:movement_home_at_boot_y, :float) - field(:movement_home_spd_z, :float) - field(:movement_invert_endpoints_z, :float) - field(:pin_guard_1_pin_nr, :float) - field(:movement_invert_endpoints_y, :float) - field(:movement_max_spd_y, :float) - field(:movement_home_up_y, :float) - field(:encoder_missed_steps_decay_z, :float) - field(:movement_home_spd_y, :float) - field(:encoder_use_for_pos_x, :float) - field(:movement_step_per_mm_x, :float) field(:movement_home_at_boot_z, :float) - field(:movement_steps_acc_dec_z, :float) - field(:pin_guard_5_pin_nr, :float) - field(:movement_invert_motor_z, :float) - field(:movement_max_spd_x, :float) + field(:movement_invert_endpoints_x, :float) + field(:movement_invert_endpoints_y, :float) + field(:movement_invert_endpoints_z, :float) + field(:movement_enable_endpoints_x, :float) field(:movement_enable_endpoints_y, :float) field(:movement_enable_endpoints_z, :float) + field(:movement_invert_motor_x, :float) + field(:movement_invert_motor_y, :float) + field(:movement_invert_motor_z, :float) + field(:movement_secondary_motor_x, :float) + field(:movement_secondary_motor_invert_x, :float) + field(:movement_steps_acc_dec_x, :float) + field(:movement_steps_acc_dec_y, :float) + field(:movement_steps_acc_dec_z, :float) field(:movement_stop_at_home_x, :float) - field(:movement_axis_nr_steps_y, :float) - field(:pin_guard_1_time_out, :float) - field(:movement_home_at_boot_x, :float) - field(:pin_guard_2_pin_nr, :float) - field(:encoder_scaling_z, :float) - field(:param_e_stop_on_mov_err, :float) - field(:encoder_enabled_x, :float) - field(:pin_guard_2_active_state, :float) - field(:encoder_missed_steps_decay_y, :float) + field(:movement_stop_at_home_y, :float) + field(:movement_stop_at_home_z, :float) + field(:movement_home_up_x, :float) + field(:movement_home_up_y, :float) field(:movement_home_up_z, :float) - field(:movement_enable_endpoints_x, :float) + field(:movement_step_per_mm_x, :float) field(:movement_step_per_mm_y, :float) - field(:pin_guard_3_pin_nr, :float) - field(:param_mov_nr_retry, :float) - field(:movement_stop_at_home_z, :float) - field(:pin_guard_4_active_state, :float) - field(:movement_steps_acc_dec_y, :float) - field(:movement_home_spd_x, :float) - field(:movement_keep_active_x, :float) - field(:pin_guard_3_time_out, :float) - field(:movement_keep_active_y, :float) - field(:encoder_scaling_x, :float) - field(:movement_invert_2_endpoints_z, :float) - field(:encoder_missed_steps_decay_x, :float) - field(:movement_timeout_z, :float) - field(:encoder_missed_steps_max_z, :float) + field(:movement_step_per_mm_z, :float) + field(:movement_min_spd_x, :float) + field(:movement_min_spd_y, :float) field(:movement_min_spd_z, :float) - field(:encoder_enabled_y, :float) - field(:encoder_type_y, :float) - field(:movement_home_up_x, :float) - field(:pin_guard_3_active_state, :float) - field(:movement_invert_motor_x, :float) - field(:movement_keep_active_z, :float) + field(:movement_home_spd_x, :float) + field(:movement_home_spd_y, :float) + field(:movement_home_spd_z, :float) + field(:movement_max_spd_x, :float) + field(:movement_max_spd_y, :float) field(:movement_max_spd_z, :float) - field(:movement_secondary_motor_invert_x, :float) - field(:movement_stop_at_max_x, :float) - field(:movement_steps_acc_dec_x, :float) - field(:pin_guard_4_pin_nr, :float) - field(:encoder_type_x, :float) + field(:movement_invert_2_endpoints_x, :float) field(:movement_invert_2_endpoints_y, :float) - field(:encoder_invert_y, :float) - field(:movement_axis_nr_steps_x, :float) - field(:movement_stop_at_max_z, :float) - field(:movement_invert_endpoints_x, :float) - field(:encoder_invert_z, :float) - field(:encoder_use_for_pos_z, :float) - field(:pin_guard_5_active_state, :float) - field(:movement_step_per_mm_z, :float) - field(:encoder_enabled_z, :float) - field(:movement_secondary_motor_x, :float) - field(:pin_guard_5_time_out, :float) - field(:movement_min_spd_x, :float) - field(:encoder_type_z, :float) - field(:movement_stop_at_max_y, :float) - field(:encoder_use_for_pos_y, :float) - field(:encoder_missed_steps_max_y, :float) - field(:movement_timeout_x, :float) - field(:movement_stop_at_home_y, :float) - field(:movement_axis_nr_steps_z, :float) - field(:encoder_invert_x, :float) - field(:encoder_missed_steps_max_x, :float) - field(:movement_invert_motor_y, :float) + field(:movement_invert_2_endpoints_z, :float) field(:movement_motor_current_x, :float) field(:movement_motor_current_y, :float) field(:movement_motor_current_z, :float) field(:movement_stall_sensitivity_x, :float) field(:movement_stall_sensitivity_y, :float) field(:movement_stall_sensitivity_z, :float) + field(:movement_microsteps_x, :float) + field(:movement_microsteps_y, :float) + field(:movement_microsteps_z, :float) + field(:encoder_enabled_x, :float) + field(:encoder_enabled_y, :float) + field(:encoder_enabled_z, :float) + field(:encoder_type_x, :float) + field(:encoder_type_y, :float) + field(:encoder_type_z, :float) + field(:encoder_missed_steps_max_x, :float) + field(:encoder_missed_steps_max_y, :float) + field(:encoder_missed_steps_max_z, :float) + field(:encoder_scaling_x, :float) + field(:encoder_scaling_y, :float) + field(:encoder_scaling_z, :float) + field(:encoder_missed_steps_decay_x, :float) + field(:encoder_missed_steps_decay_y, :float) + field(:encoder_missed_steps_decay_z, :float) + field(:encoder_use_for_pos_x, :float) + field(:encoder_use_for_pos_y, :float) + field(:encoder_use_for_pos_z, :float) + field(:encoder_invert_x, :float) + field(:encoder_invert_y, :float) + field(:encoder_invert_z, :float) + field(:movement_axis_nr_steps_x, :float) + field(:movement_axis_nr_steps_y, :float) + field(:movement_axis_nr_steps_z, :float) + field(:movement_stop_at_max_x, :float) + field(:movement_stop_at_max_y, :float) + field(:movement_stop_at_max_z, :float) + field(:pin_guard_1_pin_nr, :float) + field(:pin_guard_1_time_out, :float) + field(:pin_guard_1_active_state, :float) + field(:pin_guard_2_pin_nr, :float) + field(:pin_guard_2_time_out, :float) + field(:pin_guard_2_active_state, :float) + field(:pin_guard_3_pin_nr, :float) + field(:pin_guard_3_time_out, :float) + field(:pin_guard_3_active_state, :float) + field(:pin_guard_4_pin_nr, :float) + field(:pin_guard_4_time_out, :float) + field(:pin_guard_4_active_state, :float) + field(:pin_guard_5_pin_nr, :float) + field(:pin_guard_5_time_out, :float) + field(:pin_guard_5_active_state, :float) end def new() do @@ -111,200 +114,206 @@ defmodule FarmbotCore.BotStateNG.McuParams do def view(mcu_params) do %{ - pin_guard_4_time_out: mcu_params.pin_guard_4_time_out, - pin_guard_1_active_state: mcu_params.pin_guard_1_active_state, - encoder_scaling_y: mcu_params.encoder_scaling_y, - movement_invert_2_endpoints_x: mcu_params.movement_invert_2_endpoints_x, - movement_min_spd_y: mcu_params.movement_min_spd_y, - pin_guard_2_time_out: mcu_params.pin_guard_2_time_out, + param_e_stop_on_mov_err: mcu_params.param_e_stop_on_mov_err, + param_mov_nr_retry: mcu_params.param_mov_nr_retry, + movement_timeout_x: mcu_params.movement_timeout_x, movement_timeout_y: mcu_params.movement_timeout_y, + movement_timeout_z: mcu_params.movement_timeout_z, + movement_keep_active_x: mcu_params.movement_keep_active_x, + movement_keep_active_y: mcu_params.movement_keep_active_y, + movement_keep_active_z: mcu_params.movement_keep_active_z, + movement_home_at_boot_x: mcu_params.movement_home_at_boot_x, movement_home_at_boot_y: mcu_params.movement_home_at_boot_y, - movement_home_spd_z: mcu_params.movement_home_spd_z, - movement_invert_endpoints_z: mcu_params.movement_invert_endpoints_z, - pin_guard_1_pin_nr: mcu_params.pin_guard_1_pin_nr, - movement_invert_endpoints_y: mcu_params.movement_invert_endpoints_y, - movement_max_spd_y: mcu_params.movement_max_spd_y, - movement_home_up_y: mcu_params.movement_home_up_y, - encoder_missed_steps_decay_z: mcu_params.encoder_missed_steps_decay_z, - movement_home_spd_y: mcu_params.movement_home_spd_y, - encoder_use_for_pos_x: mcu_params.encoder_use_for_pos_x, - movement_step_per_mm_x: mcu_params.movement_step_per_mm_x, movement_home_at_boot_z: mcu_params.movement_home_at_boot_z, - movement_steps_acc_dec_z: mcu_params.movement_steps_acc_dec_z, - pin_guard_5_pin_nr: mcu_params.pin_guard_5_pin_nr, - movement_invert_motor_z: mcu_params.movement_invert_motor_z, - movement_max_spd_x: mcu_params.movement_max_spd_x, + movement_invert_endpoints_x: mcu_params.movement_invert_endpoints_x, + movement_invert_endpoints_y: mcu_params.movement_invert_endpoints_y, + movement_invert_endpoints_z: mcu_params.movement_invert_endpoints_z, + movement_enable_endpoints_x: mcu_params.movement_enable_endpoints_x, movement_enable_endpoints_y: mcu_params.movement_enable_endpoints_y, movement_enable_endpoints_z: mcu_params.movement_enable_endpoints_z, + movement_invert_motor_x: mcu_params.movement_invert_motor_x, + movement_invert_motor_y: mcu_params.movement_invert_motor_y, + movement_invert_motor_z: mcu_params.movement_invert_motor_z, + movement_secondary_motor_x: mcu_params.movement_secondary_motor_x, + movement_secondary_motor_invert_x: mcu_params.movement_secondary_motor_invert_x, + movement_steps_acc_dec_x: mcu_params.movement_steps_acc_dec_x, + movement_steps_acc_dec_y: mcu_params.movement_steps_acc_dec_y, + movement_steps_acc_dec_z: mcu_params.movement_steps_acc_dec_z, movement_stop_at_home_x: mcu_params.movement_stop_at_home_x, - movement_axis_nr_steps_y: mcu_params.movement_axis_nr_steps_y, - pin_guard_1_time_out: mcu_params.pin_guard_1_time_out, - movement_home_at_boot_x: mcu_params.movement_home_at_boot_x, - pin_guard_2_pin_nr: mcu_params.pin_guard_2_pin_nr, - encoder_scaling_z: mcu_params.encoder_scaling_z, - param_e_stop_on_mov_err: mcu_params.param_e_stop_on_mov_err, - encoder_enabled_x: mcu_params.encoder_enabled_x, - pin_guard_2_active_state: mcu_params.pin_guard_2_active_state, - encoder_missed_steps_decay_y: mcu_params.encoder_missed_steps_decay_y, + movement_stop_at_home_y: mcu_params.movement_stop_at_home_y, + movement_stop_at_home_z: mcu_params.movement_stop_at_home_z, + movement_home_up_x: mcu_params.movement_home_up_x, + movement_home_up_y: mcu_params.movement_home_up_y, movement_home_up_z: mcu_params.movement_home_up_z, - movement_enable_endpoints_x: mcu_params.movement_enable_endpoints_x, + movement_step_per_mm_x: mcu_params.movement_step_per_mm_x, movement_step_per_mm_y: mcu_params.movement_step_per_mm_y, - pin_guard_3_pin_nr: mcu_params.pin_guard_3_pin_nr, - param_mov_nr_retry: mcu_params.param_mov_nr_retry, - movement_stop_at_home_z: mcu_params.movement_stop_at_home_z, - pin_guard_4_active_state: mcu_params.pin_guard_4_active_state, - movement_steps_acc_dec_y: mcu_params.movement_steps_acc_dec_y, - movement_home_spd_x: mcu_params.movement_home_spd_x, - movement_keep_active_x: mcu_params.movement_keep_active_x, - pin_guard_3_time_out: mcu_params.pin_guard_3_time_out, - movement_keep_active_y: mcu_params.movement_keep_active_y, - encoder_scaling_x: mcu_params.encoder_scaling_x, - movement_invert_2_endpoints_z: mcu_params.movement_invert_2_endpoints_z, - encoder_missed_steps_decay_x: mcu_params.encoder_missed_steps_decay_x, - movement_timeout_z: mcu_params.movement_timeout_z, - encoder_missed_steps_max_z: mcu_params.encoder_missed_steps_max_z, + movement_step_per_mm_z: mcu_params.movement_step_per_mm_z, + movement_min_spd_x: mcu_params.movement_min_spd_x, + movement_min_spd_y: mcu_params.movement_min_spd_y, movement_min_spd_z: mcu_params.movement_min_spd_z, - encoder_enabled_y: mcu_params.encoder_enabled_y, - encoder_type_y: mcu_params.encoder_type_y, - movement_home_up_x: mcu_params.movement_home_up_x, - pin_guard_3_active_state: mcu_params.pin_guard_3_active_state, - movement_invert_motor_x: mcu_params.movement_invert_motor_x, - movement_keep_active_z: mcu_params.movement_keep_active_z, + movement_home_spd_x: mcu_params.movement_home_spd_x, + movement_home_spd_y: mcu_params.movement_home_spd_y, + movement_home_spd_z: mcu_params.movement_home_spd_z, + movement_max_spd_x: mcu_params.movement_max_spd_x, + movement_max_spd_y: mcu_params.movement_max_spd_y, movement_max_spd_z: mcu_params.movement_max_spd_z, - movement_secondary_motor_invert_x: mcu_params.movement_secondary_motor_invert_x, - movement_stop_at_max_x: mcu_params.movement_stop_at_max_x, - movement_steps_acc_dec_x: mcu_params.movement_steps_acc_dec_x, - pin_guard_4_pin_nr: mcu_params.pin_guard_4_pin_nr, - encoder_type_x: mcu_params.encoder_type_x, + movement_invert_2_endpoints_x: mcu_params.movement_invert_2_endpoints_x, movement_invert_2_endpoints_y: mcu_params.movement_invert_2_endpoints_y, - encoder_invert_y: mcu_params.encoder_invert_y, - movement_axis_nr_steps_x: mcu_params.movement_axis_nr_steps_x, - movement_stop_at_max_z: mcu_params.movement_stop_at_max_z, - movement_invert_endpoints_x: mcu_params.movement_invert_endpoints_x, - encoder_invert_z: mcu_params.encoder_invert_z, - encoder_use_for_pos_z: mcu_params.encoder_use_for_pos_z, - pin_guard_5_active_state: mcu_params.pin_guard_5_active_state, - movement_step_per_mm_z: mcu_params.movement_step_per_mm_z, - encoder_enabled_z: mcu_params.encoder_enabled_z, - movement_secondary_motor_x: mcu_params.movement_secondary_motor_x, - pin_guard_5_time_out: mcu_params.pin_guard_5_time_out, - movement_min_spd_x: mcu_params.movement_min_spd_x, - encoder_type_z: mcu_params.encoder_type_z, - movement_stop_at_max_y: mcu_params.movement_stop_at_max_y, - encoder_use_for_pos_y: mcu_params.encoder_use_for_pos_y, - encoder_missed_steps_max_y: mcu_params.encoder_missed_steps_max_y, - movement_timeout_x: mcu_params.movement_timeout_x, - movement_stop_at_home_y: mcu_params.movement_stop_at_home_y, - movement_axis_nr_steps_z: mcu_params.movement_axis_nr_steps_z, - encoder_invert_x: mcu_params.encoder_invert_x, - encoder_missed_steps_max_x: mcu_params.encoder_missed_steps_max_x, - movement_invert_motor_y: mcu_params.movement_invert_motor_y, + movement_invert_2_endpoints_z: mcu_params.movement_invert_2_endpoints_z, movement_motor_current_x: mcu_params.movement_motor_current_x, movement_motor_current_y: mcu_params.movement_motor_current_y, movement_motor_current_z: mcu_params.movement_motor_current_z, movement_stall_sensitivity_x: mcu_params.movement_stall_sensitivity_x, movement_stall_sensitivity_y: mcu_params.movement_stall_sensitivity_y, - movement_stall_sensitivity_z: mcu_params.movement_stall_sensitivity_z + movement_stall_sensitivity_z: mcu_params.movement_stall_sensitivity_z, + movement_microsteps_x: mcu_params.movement_microsteps_x, + movement_microsteps_y: mcu_params.movement_microsteps_y, + movement_microsteps_z: mcu_params.movement_microsteps_z, + encoder_enabled_x: mcu_params.encoder_enabled_x, + encoder_enabled_y: mcu_params.encoder_enabled_y, + encoder_enabled_z: mcu_params.encoder_enabled_z, + encoder_type_x: mcu_params.encoder_type_x, + encoder_type_y: mcu_params.encoder_type_y, + encoder_type_z: mcu_params.encoder_type_z, + encoder_missed_steps_max_x: mcu_params.encoder_missed_steps_max_x, + encoder_missed_steps_max_y: mcu_params.encoder_missed_steps_max_y, + encoder_missed_steps_max_z: mcu_params.encoder_missed_steps_max_z, + encoder_scaling_x: mcu_params.encoder_scaling_x, + encoder_scaling_y: mcu_params.encoder_scaling_y, + encoder_scaling_z: mcu_params.encoder_scaling_z, + encoder_missed_steps_decay_x: mcu_params.encoder_missed_steps_decay_x, + encoder_missed_steps_decay_y: mcu_params.encoder_missed_steps_decay_y, + encoder_missed_steps_decay_z: mcu_params.encoder_missed_steps_decay_z, + encoder_use_for_pos_x: mcu_params.encoder_use_for_pos_x, + encoder_use_for_pos_y: mcu_params.encoder_use_for_pos_y, + encoder_use_for_pos_z: mcu_params.encoder_use_for_pos_z, + encoder_invert_x: mcu_params.encoder_invert_x, + encoder_invert_y: mcu_params.encoder_invert_y, + encoder_invert_z: mcu_params.encoder_invert_z, + movement_axis_nr_steps_x: mcu_params.movement_axis_nr_steps_x, + movement_axis_nr_steps_y: mcu_params.movement_axis_nr_steps_y, + movement_axis_nr_steps_z: mcu_params.movement_axis_nr_steps_z, + movement_stop_at_max_x: mcu_params.movement_stop_at_max_x, + movement_stop_at_max_y: mcu_params.movement_stop_at_max_y, + movement_stop_at_max_z: mcu_params.movement_stop_at_max_z, + pin_guard_1_pin_nr: mcu_params.pin_guard_1_pin_nr, + pin_guard_1_time_out: mcu_params.pin_guard_1_time_out, + pin_guard_1_active_state: mcu_params.pin_guard_1_active_state, + pin_guard_2_pin_nr: mcu_params.pin_guard_2_pin_nr, + pin_guard_2_time_out: mcu_params.pin_guard_2_time_out, + pin_guard_2_active_state: mcu_params.pin_guard_2_active_state, + pin_guard_3_pin_nr: mcu_params.pin_guard_3_pin_nr, + pin_guard_3_time_out: mcu_params.pin_guard_3_time_out, + pin_guard_3_active_state: mcu_params.pin_guard_3_active_state, + pin_guard_4_pin_nr: mcu_params.pin_guard_4_pin_nr, + pin_guard_4_time_out: mcu_params.pin_guard_4_time_out, + pin_guard_4_active_state: mcu_params.pin_guard_4_active_state, + pin_guard_5_pin_nr: mcu_params.pin_guard_5_pin_nr, + pin_guard_5_time_out: mcu_params.pin_guard_5_time_out, + pin_guard_5_active_state: :pin_guard_5_active_stat } end def changeset(mcu_params, params \\ %{}) do mcu_params |> cast(params, [ - :pin_guard_4_time_out, - :pin_guard_1_active_state, - :encoder_scaling_y, - :movement_invert_2_endpoints_x, - :movement_min_spd_y, - :pin_guard_2_time_out, + :param_e_stop_on_mov_err, + :param_mov_nr_retry, + :movement_timeout_x, :movement_timeout_y, + :movement_timeout_z, + :movement_keep_active_x, + :movement_keep_active_y, + :movement_keep_active_z, + :movement_home_at_boot_x, :movement_home_at_boot_y, - :movement_home_spd_z, - :movement_invert_endpoints_z, - :pin_guard_1_pin_nr, - :movement_invert_endpoints_y, - :movement_max_spd_y, - :movement_home_up_y, - :encoder_missed_steps_decay_z, - :movement_home_spd_y, - :encoder_use_for_pos_x, - :movement_step_per_mm_x, :movement_home_at_boot_z, - :movement_steps_acc_dec_z, - :pin_guard_5_pin_nr, - :movement_invert_motor_z, - :movement_max_spd_x, + :movement_invert_endpoints_x, + :movement_invert_endpoints_y, + :movement_invert_endpoints_z, + :movement_enable_endpoints_x, :movement_enable_endpoints_y, :movement_enable_endpoints_z, + :movement_invert_motor_x, + :movement_invert_motor_y, + :movement_invert_motor_z, + :movement_secondary_motor_x, + :movement_secondary_motor_invert_x, + :movement_steps_acc_dec_x, + :movement_steps_acc_dec_y, + :movement_steps_acc_dec_z, :movement_stop_at_home_x, - :movement_axis_nr_steps_y, - :pin_guard_1_time_out, - :movement_home_at_boot_x, - :pin_guard_2_pin_nr, - :encoder_scaling_z, - :param_e_stop_on_mov_err, - :encoder_enabled_x, - :pin_guard_2_active_state, - :encoder_missed_steps_decay_y, + :movement_stop_at_home_y, + :movement_stop_at_home_z, + :movement_home_up_x, + :movement_home_up_y, :movement_home_up_z, - :movement_enable_endpoints_x, + :movement_step_per_mm_x, :movement_step_per_mm_y, - :pin_guard_3_pin_nr, - :param_mov_nr_retry, - :movement_stop_at_home_z, - :pin_guard_4_active_state, - :movement_steps_acc_dec_y, - :movement_home_spd_x, - :movement_keep_active_x, - :pin_guard_3_time_out, - :movement_keep_active_y, - :encoder_scaling_x, - :movement_invert_2_endpoints_z, - :encoder_missed_steps_decay_x, - :movement_timeout_z, - :encoder_missed_steps_max_z, + :movement_step_per_mm_z, + :movement_min_spd_x, + :movement_min_spd_y, :movement_min_spd_z, - :encoder_enabled_y, - :encoder_type_y, - :movement_home_up_x, - :pin_guard_3_active_state, - :movement_invert_motor_x, - :movement_keep_active_z, + :movement_home_spd_x, + :movement_home_spd_y, + :movement_home_spd_z, + :movement_max_spd_x, + :movement_max_spd_y, :movement_max_spd_z, - :movement_secondary_motor_invert_x, - :movement_stop_at_max_x, - :movement_steps_acc_dec_x, - :pin_guard_4_pin_nr, - :encoder_type_x, + :movement_invert_2_endpoints_x, :movement_invert_2_endpoints_y, - :encoder_invert_y, - :movement_axis_nr_steps_x, - :movement_stop_at_max_z, - :movement_invert_endpoints_x, - :encoder_invert_z, - :encoder_use_for_pos_z, - :pin_guard_5_active_state, - :movement_step_per_mm_z, - :encoder_enabled_z, - :movement_secondary_motor_x, - :pin_guard_5_time_out, - :movement_min_spd_x, - :encoder_type_z, - :movement_stop_at_max_y, - :encoder_use_for_pos_y, - :encoder_missed_steps_max_y, - :movement_timeout_x, - :movement_stop_at_home_y, - :movement_axis_nr_steps_z, - :encoder_invert_x, - :encoder_missed_steps_max_x, - :movement_invert_motor_y, + :movement_invert_2_endpoints_z, :movement_motor_current_x, :movement_motor_current_y, :movement_motor_current_z, :movement_stall_sensitivity_x, :movement_stall_sensitivity_y, - :movement_stall_sensitivity_z + :movement_stall_sensitivity_z, + :movement_microsteps_x, + :movement_microsteps_y, + :movement_microsteps_z, + :encoder_enabled_x, + :encoder_enabled_y, + :encoder_enabled_z, + :encoder_type_x, + :encoder_type_y, + :encoder_type_z, + :encoder_missed_steps_max_x, + :encoder_missed_steps_max_y, + :encoder_missed_steps_max_z, + :encoder_scaling_x, + :encoder_scaling_y, + :encoder_scaling_z, + :encoder_missed_steps_decay_x, + :encoder_missed_steps_decay_y, + :encoder_missed_steps_decay_z, + :encoder_use_for_pos_x, + :encoder_use_for_pos_y, + :encoder_use_for_pos_z, + :encoder_invert_x, + :encoder_invert_y, + :encoder_invert_z, + :movement_axis_nr_steps_x, + :movement_axis_nr_steps_y, + :movement_axis_nr_steps_z, + :movement_stop_at_max_x, + :movement_stop_at_max_y, + :movement_stop_at_max_z, + :pin_guard_1_pin_nr, + :pin_guard_1_time_out, + :pin_guard_1_active_state, + :pin_guard_2_pin_nr, + :pin_guard_2_time_out, + :pin_guard_2_active_state, + :pin_guard_3_pin_nr, + :pin_guard_3_time_out, + :pin_guard_3_active_state, + :pin_guard_4_pin_nr, + :pin_guard_4_time_out, + :pin_guard_4_active_state, + :pin_guard_5_pin_nr, + :pin_guard_5_time_out, + :pin_guard_5_active_state ]) end end diff --git a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex index 8e7f50e83..afeb213a9 100644 --- a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex +++ b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex @@ -176,15 +176,6 @@ defmodule FarmbotCore.FirmwareSideEffects do :movement_invert_endpoints_x, :movement_invert_endpoints_y, :movement_invert_endpoints_z, - :movement_invert_2_endpoints_x, - :movement_invert_2_endpoints_y, - :movement_invert_2_endpoints_z, - :movement_motor_current_x, - :movement_motor_current_y, - :movement_motor_current_z, - :movement_stall_sensitivity_x, - :movement_stall_sensitivity_y, - :movement_stall_sensitivity_z, :movement_enable_endpoints_x, :movement_enable_endpoints_y, :movement_enable_endpoints_z, @@ -214,6 +205,18 @@ defmodule FarmbotCore.FirmwareSideEffects do :movement_max_spd_x, :movement_max_spd_y, :movement_max_spd_z, + :movement_invert_2_endpoints_x, + :movement_invert_2_endpoints_y, + :movement_invert_2_endpoints_z, + :movement_motor_current_x, + :movement_motor_current_y, + :movement_motor_current_z, + :movement_stall_sensitivity_x, + :movement_stall_sensitivity_y, + :movement_stall_sensitivity_z, + :movement_microsteps_x, + :movement_microsteps_y, + :movement_microsteps_z, :encoder_enabled_x, :encoder_enabled_y, :encoder_enabled_z, diff --git a/farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs b/farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs new file mode 100644 index 000000000..f6b762368 --- /dev/null +++ b/farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs @@ -0,0 +1,14 @@ +defmodule FarmbotCore.Asset.Repo.Migrations.ResyncFirmwareConfig do + use Ecto.Migration + + def change do + alter table("firmware_configs") do + add(:movement_microsteps_x, :float) + add(:movement_microsteps_y, :float) + add(:movement_microsteps_z, :float) + end + + # will resync the firmware params + execute("UPDATE firmware_configs SET updated_at = \"1970-11-07 16:52:31.618000\"") + end +end From 97e04406787b2443202165469eb4e911b448231c Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 09:19:54 -0800 Subject: [PATCH 33/58] Add human translator for microsteps params --- farmbot_firmware/lib/farmbot_firmware/param.ex | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/farmbot_firmware/lib/farmbot_firmware/param.ex b/farmbot_firmware/lib/farmbot_firmware/param.ex index 293212094..5c9461271 100644 --- a/farmbot_firmware/lib/farmbot_firmware/param.ex +++ b/farmbot_firmware/lib/farmbot_firmware/param.ex @@ -402,6 +402,15 @@ defmodule FarmbotFirmware.Param do def to_human(:movement_stall_sensitivity_z, value), do: {"stall sensitivity, z-axis", nil, format_float(value)} + def to_human(:movement_microsteps_x, value), + do: {"microsteps, x-axis", nil, format_float(value)} + + def to_human(:movement_microsteps_y, value), + do: {"microsteps, y-axis", nil, format_float(value)} + + def to_human(:movement_microsteps_z, value), + do: {"microsteps, z-axis", nil, format_float(value)} + def to_human(:encoder_enabled_x, value), do: {"enable encoders, x-axis", nil, format_bool(value)} From 8f29577394c594adf038678a1de79eb2c374ea26 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 16 Dec 2019 09:20:14 -0800 Subject: [PATCH 34/58] Add handler for axis load for express boards --- farmbot_core/lib/farmbot_core/bot_state.ex | 15 +++++++++++++++ .../farmbot_core/bot_state_ng/location_data.ex | 4 ++++ .../lib/farmbot_core/firmware_side_effects.ex | 5 +++++ farmbot_firmware/lib/farmbot_firmware.ex | 8 ++++++++ farmbot_firmware/lib/farmbot_firmware/gcode.ex | 1 + .../lib/farmbot_firmware/gcode/decoder.ex | 1 + .../lib/farmbot_firmware/gcode/encoder.ex | 1 + .../lib/farmbot_firmware/side_effects.ex | 1 + .../lib/farmbot_firmware/stub_side_effects.ex | 3 +++ 9 files changed, 39 insertions(+) diff --git a/farmbot_core/lib/farmbot_core/bot_state.ex b/farmbot_core/lib/farmbot_core/bot_state.ex index 02cf2c8e3..3be0803e7 100644 --- a/farmbot_core/lib/farmbot_core/bot_state.ex +++ b/farmbot_core/lib/farmbot_core/bot_state.ex @@ -28,6 +28,11 @@ defmodule FarmbotCore.BotState do def set_position(bot_state_server \\ __MODULE__, x, y, z) do GenServer.call(bot_state_server, {:set_position, x, y, z}) end + + @doc "Sets the location_data.load" + def set_load(bot_state_server \\ __MODULE__, x, y, z) do + GenServer.call(bot_state_server, {:set_load, x, y, z}) + end @doc "Sets the location_data.encoders_scaled" def set_encoders_scaled(bot_state_server \\ __MODULE__, x, y, z) do @@ -217,6 +222,16 @@ defmodule FarmbotCore.BotState do {:reply, reply, state} end + def handle_call({:set_load, x, y, z}, _from, state) do + change = %{location_data: %{load: %{x: x, y: y, z: z}}} + + {reply, state} = + BotStateNG.changeset(state.tree, change) + |> dispatch_and_apply(state) + + {:reply, reply, state} + end + def handle_call({:set_encoders_scaled, x, y, z}, _from, state) do change = %{location_data: %{scaled_encoders: %{x: x, y: y, z: z}}} diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/location_data.ex b/farmbot_core/lib/farmbot_core/bot_state_ng/location_data.ex index 501c060a7..ad2df65d2 100644 --- a/farmbot_core/lib/farmbot_core/bot_state_ng/location_data.ex +++ b/farmbot_core/lib/farmbot_core/bot_state_ng/location_data.ex @@ -11,6 +11,7 @@ defmodule FarmbotCore.BotStateNG.LocationData do embeds_one(:scaled_encoders, Vec3, on_replace: :update) embeds_one(:raw_encoders, Vec3, on_replace: :update) embeds_one(:position, Vec3, on_replace: :update) + embeds_one(:load, Vec3, on_replace: :update) embeds_one(:axis_states, Vec3String, on_replace: :update) end @@ -20,6 +21,7 @@ defmodule FarmbotCore.BotStateNG.LocationData do |> put_embed(:scaled_encoders, Vec3.new(), []) |> put_embed(:raw_encoders, Vec3.new(), []) |> put_embed(:position, Vec3.new(), []) + |> put_embed(:load, Vec3.new(), []) |> put_embed(:axis_states, Vec3String.new(), []) |> apply_changes() end @@ -29,6 +31,7 @@ defmodule FarmbotCore.BotStateNG.LocationData do scaled_encoders: Vec3.view(location_data.scaled_encoders), raw_encoders: Vec3.view(location_data.raw_encoders), position: Vec3.view(location_data.position), + load: Vec3.view(location_data.load), axis_states: Vec3String.view(location_data.axis_states) } end @@ -39,6 +42,7 @@ defmodule FarmbotCore.BotStateNG.LocationData do |> cast_embed(:scaled_encoders) |> cast_embed(:raw_encoders) |> cast_embed(:position) + |> cast_embed(:load) |> cast_embed(:axis_states) end end diff --git a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex index afeb213a9..318bbd8ee 100644 --- a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex +++ b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex @@ -10,6 +10,11 @@ defmodule FarmbotCore.FirmwareSideEffects do :ok = BotState.set_position(x, y, z) end + @impl FarmbotFirmware.SideEffects + def handle_load(x: x, y: y, z: z) do + :ok = BotState.set_load(x, y, z) + end + @impl FarmbotFirmware.SideEffects def handle_position_change([{_axis, _value}]) do :noop diff --git a/farmbot_firmware/lib/farmbot_firmware.ex b/farmbot_firmware/lib/farmbot_firmware.ex index e9973216a..f4e487ebb 100644 --- a/farmbot_firmware/lib/farmbot_firmware.ex +++ b/farmbot_firmware/lib/farmbot_firmware.ex @@ -675,6 +675,14 @@ defmodule FarmbotFirmware do {:noreply, state} end + def handle_report({:report_load, load} = code, state) do + if state.caller_pid, do: send(state.caller_pid, {state.tag, code}) + for {pid, _code} <- state.command_queue, do: send(pid, {state.tag, {:report_busy, []}}) + + side_effects(state, :handle_load, [load]) + {:noreply, state} + end + def handle_report({:report_axis_state, axis_state} = code, state) do if state.caller_pid, do: send(state.caller_pid, {state.tag, code}) for {pid, _code} <- state.command_queue, do: send(pid, {state.tag, {:report_busy, []}}) diff --git a/farmbot_firmware/lib/farmbot_firmware/gcode.ex b/farmbot_firmware/lib/farmbot_firmware/gcode.ex index 96b2c257c..cbb952644 100644 --- a/farmbot_firmware/lib/farmbot_firmware/gcode.ex +++ b/farmbot_firmware/lib/farmbot_firmware/gcode.ex @@ -23,6 +23,7 @@ defmodule FarmbotFirmware.GCODE do | :report_invalid | :report_home_complete | :report_position + | :report_load | :report_position_change | :report_parameters_complete | :report_parameter_value diff --git a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex index 57f90fbff..b0ba5c0a6 100644 --- a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex +++ b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex @@ -47,6 +47,7 @@ defmodule FarmbotFirmware.GCODE.Decoder do def do_decode("R87", []), do: {:report_emergency_lock, []} def do_decode("R88", []), do: {:report_no_config, []} + def do_decode("R89", xyz), do: {:report_load, decode_floats(xyz)} def do_decode("R99", debug), do: {:report_debug_message, [Enum.join(debug, " ")]} def do_decode("G00", xyzs), do: {:command_movement, decode_floats(xyzs)} diff --git a/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex b/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex index 831d758c0..88cd4c41c 100644 --- a/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex +++ b/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex @@ -46,6 +46,7 @@ defmodule FarmbotFirmware.GCODE.Encoder do def do_encode(:report_emergency_lock, []), do: "R87" def do_encode(:report_no_config, []), do: "R88" + def do_encode(:report_load, xyz), do: "R89 " <> encode_floats(xyz) def do_encode(:report_debug_message, [message]), do: "R99 " <> message def do_encode(:command_movement, xyzs), do: "G00 " <> encode_floats(xyzs) diff --git a/farmbot_firmware/lib/farmbot_firmware/side_effects.ex b/farmbot_firmware/lib/farmbot_firmware/side_effects.ex index 6d5899277..e3b3f9db4 100644 --- a/farmbot_firmware/lib/farmbot_firmware/side_effects.ex +++ b/farmbot_firmware/lib/farmbot_firmware/side_effects.ex @@ -11,6 +11,7 @@ defmodule FarmbotFirmware.SideEffects do @callback load_params :: [{Param.t(), float() | nil}] @callback handle_position(x: float(), y: float(), z: float()) :: any() + @callback handle_load(x: float(), y: float(), z: float()) :: any() @callback handle_position_change([{axis(), float()}]) :: any() @callback handle_encoders_scaled(x: float(), y: float(), z: float()) :: any() @callback handle_encoders_raw(x: float(), y: float(), z: float()) :: any() diff --git a/farmbot_firmware/lib/farmbot_firmware/stub_side_effects.ex b/farmbot_firmware/lib/farmbot_firmware/stub_side_effects.ex index 6e977096f..e03c0a140 100644 --- a/farmbot_firmware/lib/farmbot_firmware/stub_side_effects.ex +++ b/farmbot_firmware/lib/farmbot_firmware/stub_side_effects.ex @@ -105,6 +105,9 @@ defmodule FarmbotFirmware.StubSideEffects do @impl SideEffects def handle_position(_), do: :noop + @impl SideEffects + def handle_load(_), do: :noop + @impl SideEffects def handle_position_change(_), do: :noop From 9da8477008e144244a3a0de4b4a75b4f7cc8ffa2 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Wed, 18 Dec 2019 09:55:01 -0800 Subject: [PATCH 35/58] Update/Write some documentation describing the overall project --- CONTRIBUTING.md | 2 + README.md | 6 +- ...t expressions.md => assert_expressions.md} | 0 docs/celery_script/celery_script.md | 4 ++ docs/glossary.md | 48 +++++++++++++++ .../host_development.md} | 0 docs/index.md | 38 ++++++++++++ docs/project/farmbot_celery_script.md | 12 ++++ docs/project/farmbot_core.md | 58 +++++++++++++++++++ docs/project/farmbot_ext.md | 38 ++++++++++++ docs/project/farmbot_firmware.md | 23 ++++++++ docs/project/farmbot_os.md | 50 ++++++++++++++++ docs/project/farmbot_telemetry.md | 0 docs/project/structure.md | 33 +++++++++++ .../building_target_firmware.md} | 0 .../consoles/erlang_distribution.md | 26 +++++++++ .../consoles/ssh.md} | 35 +++-------- .../consoles/target_console.md | 42 ++++++++++++++ docs/target_development/consoles/uart.md | 31 ++++++++++ .../releasing_target_firmware.md} | 0 .../target_faq.md} | 0 21 files changed, 417 insertions(+), 29 deletions(-) rename docs/celery_script/{assert expressions.md => assert_expressions.md} (100%) create mode 100644 docs/glossary.md rename docs/{DEVELOPMENT.md => host_development/host_development.md} (100%) create mode 100644 docs/index.md create mode 100644 docs/project/farmbot_celery_script.md create mode 100644 docs/project/farmbot_core.md create mode 100644 docs/project/farmbot_ext.md create mode 100644 docs/project/farmbot_firmware.md create mode 100644 docs/project/farmbot_os.md create mode 100644 docs/project/farmbot_telemetry.md create mode 100644 docs/project/structure.md rename docs/{BUILDING.md => target_development/building_target_firmware.md} (100%) create mode 100644 docs/target_development/consoles/erlang_distribution.md rename docs/{SSH.md => target_development/consoles/ssh.md} (54%) create mode 100644 docs/target_development/consoles/target_console.md create mode 100644 docs/target_development/consoles/uart.md rename docs/{RELEASE.md => target_development/releasing_target_firmware.md} (100%) rename docs/{FAQ.md => target_development/target_faq.md} (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3e315c7da..b332ca09d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,2 +1,4 @@ # Contributing To get started, sign the Contributor License Agreement. + +After that, read through the [documentation](docs/index.md) \ No newline at end of file diff --git a/README.md b/README.md index c947514a8..7bc42c1f6 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,8 @@ _Refer to the [software documentation Configurator page](https://software.farm.b ## Problems? -See the [FAQ](docs/FAQ.md) -If your problem isn't solved there please file an issue on [Github](https://github.com/FarmBot-Labs/farmbot_os/issues/new) +See the [FAQ](docs/target_development/target_faq.md) +If your problem isn't solved there please file an issue on [Github](https://github.com/FarmBot/farmbot_os/issues/new) ## Security Concerns? @@ -58,5 +58,5 @@ We take security seriously and value the input of independent researchers. Pleas ## Want to Help? -[Low Hanging Fruit](https://github.com/FarmBot-Labs/farmbot_os/search?utf8=%E2%9C%93&q=TODO) +[Low Hanging Fruit](https://github.com/FarmBot/farmbot_os/search?utf8=%E2%9C%93&q=TODO) [Development](CONTRIBUTING.md) diff --git a/docs/celery_script/assert expressions.md b/docs/celery_script/assert_expressions.md similarity index 100% rename from docs/celery_script/assert expressions.md rename to docs/celery_script/assert_expressions.md diff --git a/docs/celery_script/celery_script.md b/docs/celery_script/celery_script.md index 541a2d8ae..a879547c6 100644 --- a/docs/celery_script/celery_script.md +++ b/docs/celery_script/celery_script.md @@ -1,4 +1,5 @@ # CeleryScript + CeleryScript is an AST definition of commands, rpcs, and functions that can all be executed by Farmbot. The basic syntax is as follows: @@ -16,6 +17,7 @@ optional, `body` should be supplied when working with any and all modules in this project. ## kind + `kind` is the identifier for a command. Examples include: * `move_absolute` * `sync` @@ -26,6 +28,7 @@ Each `kind` will have it's own set of rules for execution. These rules will define what is required inside of both `args` and `body`. ## args + `args` is arguments to be passed to `kind`. Each `kind` defines it's own set of optional and required `args`. Args can any of the following types: * `number` @@ -42,6 +45,7 @@ executing the parent AST. Examples of `args` include: * `milliseconds` ## body + `body` is the only way a `list` or `array` type is aloud in CeleryScript. It may only contain _more CeleryScript nodes_. This is useful for enumeration, scripting looping etc. Here's a syntacticly correct example: diff --git a/docs/glossary.md b/docs/glossary.md new file mode 100644 index 000000000..ecad47b15 --- /dev/null +++ b/docs/glossary.md @@ -0,0 +1,48 @@ +# FarmBot OS Source Glossary + +This file contains a basic glossary of commonly used terms + +## FarmBot Specific Terms + +* Asset - REST resource stored in Farmbot's database stored on the SD card +* Arduino Firmware - The code that runs on the Arduino. + * [Source](https://github.com/farmbot/farmbot-arduino-firmware) +* CelleryScript - FarmBot OS's scripting language +* FarmbBot API/Web App - The REST server FarmBot communicates with + +## General Terms + +* Elixir - Programming language FarmBot is developed in + * [More info](https://elixir-lang.org/) + * [Docs](https://hexdocs.pm/elixir/Kernel.html) +* Erlang - Programming language and VM that Elixir compiles down too + * [More info](https://elixir-lang.org/) + * [Even more info](#OTP-Terms) + * [Docs](https://www.erlang.org/docs) +* UART - **U**niversal **A**synchronous **R**eceiver/**T**ransmitter. hardware based transport mechanism +* SSH - **S**ecure **S**hell. +* MQTT/AMQP - network protocols for pub/sub data transport +* HTTP - network protocol for accessing REST resource + +## Nerves Specific Terms + +* Nerves - Framework that allows cross compilation of Elixir code + * [More info](https://nerves-project.org/) + * [Docs](https://hexdocs.pm/nerves/getting-started.html) +* NervesHub - Cloud based firmware management + * [More info](https://www.nerves-hub.org/) + * [Docs](https://github.com/nerves-hub/documentation) +* Firmware - Usually refers to the code that gets deployed onto the Raspberry Pi + +## OTP Terms + +* Beam - Virtual machine that runs compiled Erlang bytecode +* OTP - Open Telecom Platform. Erlang's runtime libraries + * [More info](https://erlang.org/doc/design_principles/des_princ.html) +* Supervisor - OTP `Process` responsible for supervising `Workers` +* Worker - OTP `Process` responsible for doing `work`. Usually `Supervised` +* Process - OTP concept responsible for sending/receiving messages. **everything** is a process in erlang +* Application - OTP concept responsible for containing many `Supervisor`s and `Worker`s +* Distribution - OTP concept of networking multiple Beam instances together +* ETS - **E**rlang **T**erm **S**torage. OTP application for storing data in memory +* DETS - **D**isk **E**rlang **T**erm **S**torage. OTP application for storing data on disk \ No newline at end of file diff --git a/docs/DEVELOPMENT.md b/docs/host_development/host_development.md similarity index 100% rename from docs/DEVELOPMENT.md rename to docs/host_development/host_development.md diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..50d1c7601 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,38 @@ +# FarmBot OS Documentation + +This document will act as an index to available documentation. + +## Glossary + +* [FarmBot Source Code common terms](/docs/glossary.md) + +## Hardware specifics + +Most FarmBot development/testing is done on a standard desktop PC. + +* [Developing on your local PC](/docs/host_development/host_development.md) +* [Deploying on Raspberry Pi](/docs/target_development/building_target_firmware.md) + * [Publishing Firmware (OTAs)](/docs/target_development/releasing_target_firmware.md) + * [Why doesn't my device boot after building firmware](docs/target_development/target_faq.md) + * [Inspecting a running devicve](/docs/target_development/consoles/target_console.md) + +## CeleryScript + +CeleryScript is FarmBot's native scripting language. See the below +documentation for information about it as it relates to FarmBot OS. + +* [CeleryScript intro](/docs/celery_script/celery_script.md) +* [A list of all supported commands](/docs/celery_script/all_nodes.md) +* [Lua (embedded scripting inside CeleryScript)](/docs/celery_script/assert_expressions.md) + +## Project structure + +The FarmBot OS application is broken into several sub applications. + +* [Project structure overview](/docs/project/structure.md) + * [farmbot_celery_script](/docs/project/farmbot_celery_script.md) + * [farmbot_core](/docs/project/farmbot_core.md) + * [farmbot_ext](/docs/project/farmbot_ext.md) + * [farmbot_firmware](/docs/project/farmbot_firmware.md) + * [farmbot_os](/docs/project/farmbot_os.md) + * [farmbot_telemetry](/docs/project/farmbot_telemetry.md) diff --git a/docs/project/farmbot_celery_script.md b/docs/project/farmbot_celery_script.md new file mode 100644 index 000000000..217b8d5af --- /dev/null +++ b/docs/project/farmbot_celery_script.md @@ -0,0 +1,12 @@ +# FarmBot CeleryScript OTP App + +`farmbot_celery_script` is responsible for implementing the +runtime that execute's [CeleryScript](/docs/celery_script/celery_script.md). +It contains a handful of helpers, and several subsystems for working with CeleryScript. +The most important being: +* AST - definition of the AST as it relates to FarmBot OS +* Compiler - Compiles CeleryScript to Elixir AST. + * See the [Elixir Macro Docs](https://hexdocs.pm/elixir/Macro.html) +* StepRunner - Process responsible for actually executing CeleryScript +* Scheduler - Process responsible for scheduling calls to the `StepRunner` +* SysCalls - module responsible for dispatching calls to the configured implementation diff --git a/docs/project/farmbot_core.md b/docs/project/farmbot_core.md new file mode 100644 index 000000000..23787e3ed --- /dev/null +++ b/docs/project/farmbot_core.md @@ -0,0 +1,58 @@ +# FarmBot Core OTP App + +`farmbot_core` is responsible for the core funcionality of the FarmBot application. +This contains things such as resource (asset) management, plugin (farmware) management, +central state, and schedule management. FarmBot specific network requests are not made +from the `farmbot_core` app. Below describes the important subsystems + +## Asset storage subsystem + +Sqlite database responsible for storing data needed for FarmBot to operate. +Most device specific REST resources are mirrored here. +* Device +* FarmEvent +* Regimen +* Sequence +* Peripheral + +## Asset Worker subsystem + +All assets that need to have a process assosiated with it will be found +in this subsystem. Examples of this include: +* FarmEvent scheduling +* Regimen scheduling +* PinBinding monitoring +* FbosConfig/FirmwareConfig + +## Farmware subsystem + +Farmbot's external plugin system. See the Farmware documentation for more details. + +## BotState subsystem + +Central in-memory state process/tracker. This process keeps a cache of +all the moving parts of FarmBot. Some examples of what is stored +in this cache: + +* Firmware reporting + * current axis position + * encoder data + * arduino pin data + * currently configured firmware paramaters +* Current configuration + * mirror of `fbos_config` asset +* System info + * version info + * (nerves) firmware info + * memory usage + * disk usage +* Network info + * WiFi signal quality + * private ip address + +## Logging subsystem + +This is where the `Messages` panel gets it's data from. Calls to this subsystem +push data into an sqlite database. This data is collected on a timer and dispatched +over AMQP/MQTT when/if that subsystem is available. See [farmbot_ext](/docs/project/farmbot_ext.md) +for information on how that works. diff --git a/docs/project/farmbot_ext.md b/docs/project/farmbot_ext.md new file mode 100644 index 000000000..d6e32632c --- /dev/null +++ b/docs/project/farmbot_ext.md @@ -0,0 +1,38 @@ +# FarmBot Ext OTP App + +the `farmbot_ext` OTP app contains extended FarmbotCore functionality. This includes +mostly network functionality that isn't possible to do in `farmbot_core`. + +## Bootstrap subsystem + +Subsystem responsible for bootstrapping a connection to the FarmBot network services. +This includes authenticating with the FarmBot API, connecting to AMQP/MQTT and syncing +the bare minimum resources to get up and running. + +## HTTP/Sync subsystem + +This is the subsystem that syncronizes FarmBot with the remote API. It uses HTTP to +download an index of all the data FarmBot cares about, and compares timestamps to +determine who has the most up to date data. The basic flow is whoever has the most +recent `updated_at` field will become the "most truthy". If FarmBot has a more recent +`updated_at` field, FarmBot will do an HTTP PUT of it's data. If the remote resource +does not exist, FarmBot will do an HTTP POST of it's data. If the remote data has a more +recent `updated_at` field, FarmBot will do an HTTP GET and replace it's own data. + +## AMQP/MQTT substem + +FarmBot maintains a connection to the API for real time communication. This real time communication +connection is multiplexed over multiple `channel`s. Below is a description of the channels + +* bot_state - pushes a JSON encoded version of the `bot_state` process (from `farmbot_core`) +* celery_script - receives/sends JSON encoded celery_script. Used for controling FarmBot externally +* log - sends log messages from `farmbot_core`'s logger +* ping/pong - echos everything received. used for detecting active conncetion +* auto_sync - the API dispatches every REST resource change on this channel. Used to speed up HTTP requests +* telemetry - similar to the log channel, but sends consumable events, rather than human readable messages + +## Image uploader subsystem + +This subsystem watches a local directory, and as matching files appear in that directory, +it uploads them using the FarmBot image upload protocol. Basically an HTTP request to fetch +credentials that are used to preform another HTTP request to upload the photo. \ No newline at end of file diff --git a/docs/project/farmbot_firmware.md b/docs/project/farmbot_firmware.md new file mode 100644 index 000000000..5c884a1da --- /dev/null +++ b/docs/project/farmbot_firmware.md @@ -0,0 +1,23 @@ +# FarmBot Firmware OTP App + +The `farmbot_firmware` OTP application is responsible for maintaining a connection to +the arduino-firmware. + +## GCODE encoder/decoder subsystem + +The official Farmbot-Arduino-Firmware communicates over UART using a ASCII based +protocol based on CNC GCODE. This subsystem is responsible for translating +the ASCII data into an intermediate representation that can be `transport`ed +proto agnostically. + +## Transport subsystem + +This subsystem is responsible for abstracting the details of transporting +FarmBot GCODEs to/from the firmware implementation. A `transport` will take +in the intermediate (farmbot specific) representation of a GCODE, and dispatch/handle +it in it's own specific manor. This keeps the usage of the overall application uniform +with or without a firmware plugged in. + +## UART subsystem + +Responsible for the official communication mechanism with the official arduino hardware. \ No newline at end of file diff --git a/docs/project/farmbot_os.md b/docs/project/farmbot_os.md new file mode 100644 index 000000000..c5933ef1c --- /dev/null +++ b/docs/project/farmbot_os.md @@ -0,0 +1,50 @@ +# FarmBot OTP App + +the `farmbot` OTP app is the container Nerves based application. It contains mostly +glue code between all the subsystems in the other applications along with it's own +platform specific subsystems. + +## CeleryScript System Calls + +The "official" implementation of all the CeleryScript syscalls. These calls are mostly +glue to other existing implementations from the other otp apps. + +## Lua Subsystem + +The implementation of the embedded scripting language inside CeleryScript. +Also contains glue code for glueing together the real implementation to the +Lua vm. + +## Configurator Subsystem + +HTTP server responsible for configuring the running FarmBot OS instance. Will +server a web page that allows a user to supply a username, password, network credentials +etc. + +# Platform specific subsystems + +the `farmbot_os` OTP app contains target/hardware specific systems. This code is +located in the `platform` directory. + +## Network subsystem + +Responsible for getting FarmBot connected to the (inter)net. If no network configuration is +available, FarmBot will create a captive portal access point to allow external devices to +configure it. + +## GPIO subsystem + +Responsible for implementing LED and Button support at the hardware level. + +## RTC subsystem + +Responsible for syncronizing network time to an attached hardware clock. + +## Info Worker subsystem + +Responsible for simple workers that handle things like + +* CPU temperature +* CPU usage +* memory usage +* disk usage diff --git a/docs/project/farmbot_telemetry.md b/docs/project/farmbot_telemetry.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/project/structure.md b/docs/project/structure.md new file mode 100644 index 000000000..407c28da2 --- /dev/null +++ b/docs/project/structure.md @@ -0,0 +1,33 @@ +## FarmBot Source Project structure + +The FarmBot OS application is broken into several sub OTP applications. + +* [farmbot_celery_script](/docs/project/farmbot_celery_script.md) +* [farmbot_core](/docs/project/farmbot_core.md) +* [farmbot_ext](/docs/project/farmbot_ext.md) +* [farmbot_firmware](/docs/project/farmbot_firmware.md) +* [farmbot_os](/docs/project/farmbot_os.md) +* [farmbot_telemetry](/docs/project/farmbot_telemetry.md) + +## Commonality + +All of these folders share a common structure. + + +├── lib/ +│ ├── application.ex +│ └── some_file.ex +| +├── test/ +| └── test_helper.exs +| +├── config/ +| └── config.exs +| +├─── mix.exs +└─── mix.lock + +* The `lib` folder contains Elixir source code +* the `test` folder contains Elixir scripts responsible for testing the `lib` code +* the `config` folder contains Elixir scripts responsible for configuring the **current** OTP app +* `mix.exs` and `mix.lock` files are responsible describing the OTP app, and managing external dependencies \ No newline at end of file diff --git a/docs/BUILDING.md b/docs/target_development/building_target_firmware.md similarity index 100% rename from docs/BUILDING.md rename to docs/target_development/building_target_firmware.md diff --git a/docs/target_development/consoles/erlang_distribution.md b/docs/target_development/consoles/erlang_distribution.md new file mode 100644 index 000000000..090d9fd75 --- /dev/null +++ b/docs/target_development/consoles/erlang_distribution.md @@ -0,0 +1,26 @@ +# Erlang Distribution Console + +Accessing an Erlang Distribution console + +## Setup + +No additional setup is required for setting up erlang distribution on the target. +On your `host` machine, you need to have Erlang Distribution running. This can +usually be accomplished by starting `epmd`: + +```bash +epmd --daemon +``` + +## Connecting + +From your `host` terminal, connecting to a running device can be done by using the +`remsh` feature of elixir's built in console. + +```bash +iex --name console --cookie democookie --remsh farmbot@farmbot-.local +``` + +## Disconnecting + +Issuing a `ctrl+c` to the `host` terminal should disconnect you from the session. \ No newline at end of file diff --git a/docs/SSH.md b/docs/target_development/consoles/ssh.md similarity index 54% rename from docs/SSH.md rename to docs/target_development/consoles/ssh.md index 33ada68f5..759a92386 100644 --- a/docs/SSH.md +++ b/docs/target_development/consoles/ssh.md @@ -1,42 +1,25 @@ -# SSH +# SSH console + +Accessing an SSH console. ## Setup + FarmBot can be configured to start an SSH server to aid in debugging and development. During configuration of Network, select `Advanced Settings` and paste your [ssh public key](https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key) into the optional input section labeled: `id_rsa.pub`. FarmBot requires a public key and -will not allow a username + password combination. FarmBot also only allows one -key to be configured for security reasons. +will not allow a username + password combination. If you followed the documentation +described in [building target firmware](/docs/target_development/building_target_firmware.md) +then your SSH key will be automatically added to the device. ## Connecting + From the same machine that owns the `id_rsa.pub` key and assosiated private key you can simply `ssh `. If your machine supports `mdns`, you can also do `ssh farmbot-` where `node_name` can be found in the `Device` panel on the FarmBot web app. -## Usage -The console a user will be presented with is _not_ a Linux console. There are -pretty much no Linux Utilities built-in. This includes but is not limited to: -* `bash` -* `apt-get` -* `make` -* `screen` -* `vi` -* `cp` -* `mkdir` -* `ln` -* `echo` -* etc - -What is available is a console to the FarmBot OS runtime. You will need to be -familiar with the FarmBotOS Source code for this to be helpful. - -If all you are looking for is Logs, you will probably want to do: -```elixir -RingLogger.attach() -``` - -After that command you will see logs come across the screen in real time. +## Disconnecting To exit the SSH session, type `~.`. This is an ssh escape sequence (See the ssh man page for other escape sequences). diff --git a/docs/target_development/consoles/target_console.md b/docs/target_development/consoles/target_console.md new file mode 100644 index 000000000..04bfef3e3 --- /dev/null +++ b/docs/target_development/consoles/target_console.md @@ -0,0 +1,42 @@ +# FarmBot target console + +The FarmBot OS target console is a repl for interacting with a running +farmbot instance. Depending on your development configuration, there are several +ways to access a console. + +If you are using `host` mode, your console will be presented on stdin of your +terminal. + +If you are on `target` mode (IE: deployed to the raspberry pi), there will +be a console available in 3 locations: +* UART (except on RPI0 since the on-board UART is used for the arduino-firmware) + * [Connect to a UART console](/docs/target_development/consoles/uart.md) +* SSH + * [Connect to an SSH console](/docs/target_development/consoles/ssh.md) +* Erlang Distribution + * [Connect to an Erlang Distribution console](/docs/target_development/consoles/erlang_distribution.md) + +## Console Usage + +The console a user will be presented with is _not_ a Linux console. There are +pretty much no Linux Utilities built-in. This includes but is not limited to: +* `bash` +* `apt-get` +* `make` +* `screen` +* `vi` +* `cp` +* `mkdir` +* `ln` +* `echo` +* etc + +What is available is a console to the FarmBot OS runtime. You will need to be +familiar with the FarmBotOS Source code for this to be helpful. + +If all you are looking for is Logs, you will probably want to do: +```elixir +RingLogger.tail() +``` + +After that command you will see logs come across the screen in real time. diff --git a/docs/target_development/consoles/uart.md b/docs/target_development/consoles/uart.md new file mode 100644 index 000000000..d0fb47b07 --- /dev/null +++ b/docs/target_development/consoles/uart.md @@ -0,0 +1,31 @@ +# UART Console + +Accessing an target UART console + +## Setup + +No additional setup is required for setting up the UART console on the target. + +On your `host` machine, you need to have a console cable, as well as a console client. +The console cable must be 3.3 volts, **not** 5 volts. a 5 volt cable will harm your +Raspberry Pi. Here are some known working cables: +* https://www.amazon.com/Converter-Terminated-Galileo-BeagleBone-Minnowboard/dp/B06ZYPLFNB +* https://www.amazon.com/DSD-TECH-Adapter-FT232RL-Compatible/dp/B07BBPX8B8 +* https://www.amazon.com/JANSANE-PL2303TA-Serial-Console-Raspberry/dp/B07D9R5JFK + +The most common client is probably `screen` on *Nix based systems or `putty` on windows. +See your distribution's package manager for installation and usage instructions. + +## Connecting + +Connecting to a console is dependent on your particular client. Here is an example +`screen` command: + +```bash +screen /dev/ttyUSB0 115200 +``` + +## Disconnecting + +Disconnecting is also dependent on your particular client. To exit screen, +issue a `ctrl+\+y` sequence to escape the console. \ No newline at end of file diff --git a/docs/RELEASE.md b/docs/target_development/releasing_target_firmware.md similarity index 100% rename from docs/RELEASE.md rename to docs/target_development/releasing_target_firmware.md diff --git a/docs/FAQ.md b/docs/target_development/target_faq.md similarity index 100% rename from docs/FAQ.md rename to docs/target_development/target_faq.md From 836c8b3841119e529b8b12430c5c09164e32bf3f Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Wed, 18 Dec 2019 12:01:55 -0800 Subject: [PATCH 36/58] Update docs to conform with mdl spec --- docs/celery_script/all_nodes.md | 145 ++++++++++-------- docs/celery_script/assert_expressions.md | 13 +- docs/celery_script/celery_script.md | 7 +- docs/glossary.md | 14 +- docs/host_development/host_development.md | 18 ++- docs/index.md | 6 +- docs/project/farmbot_celery_script.md | 9 +- docs/project/farmbot_core.md | 28 ++-- docs/project/farmbot_ext.md | 47 +++--- docs/project/farmbot_firmware.md | 12 +- docs/project/farmbot_os.md | 26 ++-- docs/project/farmbot_telemetry.md | 9 ++ docs/project/structure.md | 14 +- .../building_target_firmware.md | 53 +++++-- .../consoles/erlang_distribution.md | 2 +- docs/target_development/consoles/ssh.md | 11 +- .../consoles/target_console.md | 9 +- docs/target_development/consoles/uart.md | 16 +- .../releasing_target_firmware.md | 90 +++++++---- docs/target_development/target_faq.md | 20 ++- 20 files changed, 337 insertions(+), 212 deletions(-) diff --git a/docs/celery_script/all_nodes.md b/docs/celery_script/all_nodes.md index 587fa1d20..4dc85430a 100644 --- a/docs/celery_script/all_nodes.md +++ b/docs/celery_script/all_nodes.md @@ -1,73 +1,88 @@ # All CeleryScript Nodes + This list is split into three categories. -* RPC Nodes - Nodes that control Farmbot's state, but don't don't command -a real world side effect. This includes: - * updating configuration data. - * syncing. - * starting/stopping a process of some sort. - * rebooting -* Command Nodes - Nodes that physically do something. This includes: - * moving the gantry. - * writing or reading a GPIO. -* Data Nodes - Nodes that simply contain data. They are not to be executed. -This includes: - * explanation - * location data ## RPC Nodes -| Name | Args | Body | -|:-------------------------------|:-------------------------------------:|:-------------------------:| -| `check_updates` | `package` | --- | -| `config_update` | `package` | `pair` | -| `uninstall_farmware` | `package` | --- | -| `update_farmware` | `package` | --- | -| `rpc_request` | `label` | more command or rpc nodes | -| `rpc_ok` | `label` | --- | -| `rpc_error` | `label` | `explanation` | -| `install farmware` | `url` | --- | -| `read_status` | --- | --- | -| `sync` | --- | --- | -| `power_off` | --- | --- | -| `reboot` | --- | --- | -| `factory_reset` | --- | --- | -| `set_usr_env` | --- | `pair` | -| `install_first_party_farmware` | --- | --- | -| `change_ownership` | --- | `pair` | -| `dump_info` | --- | --- | + +Nodes that control Farmbot's state, but don't don't command +a real world side effect. This includes: + +* updating configuration data. +* syncing. +* starting/stopping a process of some sort. +* rebooting + +### RPC Node Table + +| Name | Args | Body | +|:-: | :--:|:--:| +| `check_updates`| `package`| ---| +| `config_update`| `package`| `pair`| +| `uninstall_farmware`| `package`| ---| +| `update_farmware`| `package`| ---| +| `rpc_request`| `label`| `command` or `rpc` nodes| +| `rpc_ok`| `label`| ---| +| `rpc_error`| `label`| `explanation`| +| `install farmware`| `url`| ---| +| `read_status`| --- | ---| +| `sync`| --- | ---| +| `power_off`| --- | ---| +| `reboot`| --- | ---| +| `factory_reset`| --- | ---| +| `set_usr_env`| --- | `pair`| +| `install_first_party_farmware`|---|---| +| `change_ownership`| --- | `pair`| +| `dump_info`| --- | ---| ## Command Nodes -| Name | Args | Body | -|:-------------------------------|:-------------------------------------:|:-------------------------:| -| `_if` | `lhs`, `op`, `rhs`, `_then`, `_else` | `pair` | -| `write_pin` | `pin_number`, `pin_value`, `pin_mode` | --- | -| `read_pin` | `pin_number`, `pin_value`, `pin_mode` | --- | -| `move_absolute` | `location`, `speed`, `offset` | --- | -| `set_servo_angle` | `pin_number`, `pin_value` | --- | -| `send_message` | `message`, `message_type` | `channel` | -| `move_relative` | `speed`, `x`, `y`, `z` | --- | -| `sequence` | `version`, `locals` | more command nodes | -| `home` | `speed`, `axis` | --- | -| `find_home` | `speed`, `axis` | --- | -| `wait` | `milliseconds` | --- | -| `execute` | `sequence_id` | --- | -| `toggle_pin` | `pin_number` | --- | -| `execute_script` | `package` | `pair` | -| `zero` | `axis` | --- | -| `calibrate` | `axis` | --- | -| `emergency_lock` | --- | --- | -| `emergency_unlock` | --- | --- | -| `take_photo` | --- | --- | + +Nodes that physically do something. This includes: + +* moving the gantry. +* writing or reading a GPIO. + +### Command Node Table + +| Name | Args | Body | +|:-: | :--:|:--:| +| `_if`| `lhs`, `op`, `rhs`, `_then`, `_else`| `pair`| +| `write_pin`| `pin_number`, `pin_value`, `pin_mode`| ---| +| `read_pin`| `pin_number`, `pin_value`, `pin_mode`| ---| +| `move_absolute`| `location`, `speed`, `offset`| ---| +| `set_servo_angle`| `pin_number`, `pin_value`| ---| +| `send_message`| `message`, `message_type`| `channel`| +| `move_relative`| `speed`, `x`, `y`, `z`| ---| +| `sequence`| `version`, `locals`| `any command node`| +| `home`| `speed`, `axis`| ---| +| `find_home`| `speed`, `axis`| ---| +| `wait`| `milliseconds`| ---| +| `execute`| `sequence_id`| ---| +| `toggle_pin`| `pin_number`| ---| +| `execute_script`| `package`| `pair`| +| `zero`| `axis`| ---| +| `calibrate`| `axis`| ---| +| `emergency_lock`| ---| ---| +| `emergency_unlock`| ---| ---| +| `take_photo`| ---| ---| ## Data Nodes -| Name | Args | Body | -|:-------------------------------|:-------------------------------------:|:-------------------------:| -| `point` | `pointer_type`, `pointer_id` | --- | -| `named_pin` | `pin_type`, `pin_id` | --- | -| `pair` | `label`, `value` | --- | -| `channel` | `channel_name` | --- | -| `coordinate` | `x`, `y`, `z` | --- | -| `tool` | `tool_id` | --- | -| `explanation` | `message` | --- | -| `identifier` | `label` | --- | -| `nothing` | --- | --- | -| `scope_declaration` | --- | `parameter_decleration`, `variable_decleration` | + +Nodes that simply contain data. They are not to be executed. This includes: + +* explanation +* location data + +### Data Node Table + +| Name | Args | Body | +|:-: | :--:|:--:| +| `point`| `pointer_type`, `pointer_id`| ---| +| `named_pin`| `pin_type`, `pin_id`| ---| +| `pair`| `label`, `value`| ---| +| `channel`| `channel_name`| ---| +| `coordinate`| `x`, `y`, `z`| ---| +| `tool`| `tool_id`| ---| +| `explanation`| `message`| ---| +| `identifier`| `label`| ---| +| `nothing`| ---| ---| +| `scope_declaration`| ---| `parameter_decleration` or `variable_decleration`| diff --git a/docs/celery_script/assert_expressions.md b/docs/celery_script/assert_expressions.md index 93348805e..93c60109d 100644 --- a/docs/celery_script/assert_expressions.md +++ b/docs/celery_script/assert_expressions.md @@ -1,12 +1,13 @@ -# CeleryScript Assert expressions. +# CeleryScript Assert expressions The CeleryScript `if` block takes a possible left hand side value of -`expression` which allows an arbitrary string to be evaluated. This -expression is evaluated against a lua 5.2 interpreter. +`expression` which allows an arbitrary string to be evaluated. This +expression is evaluated against a lua 5.2 interpreter. ## Lua API -The following functions are available for usage along with [Lua's -standard library](https://www.lua.org/manual/5.2/). + +The following functions are available for usage along with +[Lua's standard library](https://www.lua.org/manual/5.2/). ```lua -- Comments are ignored by the interpreter @@ -139,8 +140,10 @@ update_firmware_config({encoder_enabled_z = 1.0}); ``` ## Expression contract + Expressions are expected to be evaluated in a certain way. The evaluation will fail if this contract is not met. An expression should return one of the following values: + * `true` * `false` * `("error", "string reason signaling an error happened")` diff --git a/docs/celery_script/celery_script.md b/docs/celery_script/celery_script.md index a879547c6..d2e927eb4 100644 --- a/docs/celery_script/celery_script.md +++ b/docs/celery_script/celery_script.md @@ -19,6 +19,7 @@ in this project. ## kind `kind` is the identifier for a command. Examples include: + * `move_absolute` * `sync` * `read_status` @@ -31,6 +32,7 @@ define what is required inside of both `args` and `body`. `args` is arguments to be passed to `kind`. Each `kind` defines it's own set of optional and required `args`. Args can any of the following types: + * `number` * `string` (with possible enum types) * `boolean` @@ -38,6 +40,7 @@ set of optional and required `args`. Args can any of the following types: in the case of another AST, that AST will likely need to be evaluated before executing the parent AST. Examples of `args` include: + * `x` * `y` * `z` @@ -49,6 +52,7 @@ executing the parent AST. Examples of `args` include: `body` is the only way a `list` or `array` type is aloud in CeleryScript. It may only contain _more CeleryScript nodes_. This is useful for enumeration, scripting looping etc. Here's a syntacticly correct example: + ```elixir %{ kind: :script, @@ -63,6 +67,7 @@ enumeration, scripting looping etc. Here's a syntacticly correct example: Note there is nesting limit for CeleryScript body nodes, and nodes can even be self referential. Example: + ```elixir %{ kind: :self_referencing_script, @@ -71,4 +76,4 @@ even be self referential. Example: %{kind: :execute_self_referencing_script, args: %{id: 1}, body: []} ] } -``` +``` \ No newline at end of file diff --git a/docs/glossary.md b/docs/glossary.md index ecad47b15..452ef1571 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -19,8 +19,9 @@ This file contains a basic glossary of commonly used terms * [More info](https://elixir-lang.org/) * [Even more info](#OTP-Terms) * [Docs](https://www.erlang.org/docs) -* UART - **U**niversal **A**synchronous **R**eceiver/**T**ransmitter. hardware based transport mechanism -* SSH - **S**ecure **S**hell. +* UART - **U**niversal **A**synchronous **R**eceiver/**T**ransmitter. + hardware based transport mechanism +* SSH - **S**ecure **S**hell. * MQTT/AMQP - network protocols for pub/sub data transport * HTTP - network protocol for accessing REST resource @@ -41,8 +42,11 @@ This file contains a basic glossary of commonly used terms * [More info](https://erlang.org/doc/design_principles/des_princ.html) * Supervisor - OTP `Process` responsible for supervising `Workers` * Worker - OTP `Process` responsible for doing `work`. Usually `Supervised` -* Process - OTP concept responsible for sending/receiving messages. **everything** is a process in erlang +* Process - OTP concept responsible for sending/receiving messages. + **everything** is a process in erlang * Application - OTP concept responsible for containing many `Supervisor`s and `Worker`s * Distribution - OTP concept of networking multiple Beam instances together -* ETS - **E**rlang **T**erm **S**torage. OTP application for storing data in memory -* DETS - **D**isk **E**rlang **T**erm **S**torage. OTP application for storing data on disk \ No newline at end of file +* ETS - **E**rlang **T**erm **S**torage. OTP application for storing + data in memory +* DETS - **D**isk **E**rlang **T**erm **S**torage. OTP application for + storing data on disk \ No newline at end of file diff --git a/docs/host_development/host_development.md b/docs/host_development/host_development.md index 883f9ae09..17e9f8e0b 100644 --- a/docs/host_development/host_development.md +++ b/docs/host_development/host_development.md @@ -1,29 +1,31 @@ -# Starting FarmbotOS in `host` env. +# Starting FarmbotOS in `host` env Certain behaviour is slightly different when developing on `host` compared to deploying on target environments such as `rpi` or `rpi3`. ## Firmware + By default, an Arduino does _not_ need to be connected to your `host` pc when doing development. See the `FarmbotFirmware.Transport` module for more info on this topic. If you want to use a real Arduino in `host` mode, you can export a `FARMBOT_TTY` environment variable in your `host` environment. ```bash -$ cd farmbot_os -$ export FARMBOT_TTY=/dev/ttySomeDeviceFile -$ mix compile --force +cd farmbot_os +export FARMBOT_TTY=/dev/ttySomeDeviceFile +mix compile --force ``` If you're device moves ttys, you will have to redo this step. ## Configurator + Currently configurator does not run on the `host` enviornment. To connect to your FarmBot account, export the following variables: ```bash -$ cd farmbot_os -$ export FARMBOT_EMAIL=test@test.com -$ export FARMBOT_PASSWORD=password123 -$ export FARMBOT_SERVER=http://localhost:3000 +cd farmbot_os +export FARMBOT_EMAIL=test@test.com +export FARMBOT_PASSWORD=password123 +export FARMBOT_SERVER=http://localhost:3000 ``` diff --git a/docs/index.md b/docs/index.md index 50d1c7601..37c00b141 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,7 +8,7 @@ This document will act as an index to available documentation. ## Hardware specifics -Most FarmBot development/testing is done on a standard desktop PC. +Most FarmBot development/testing is done on a standard desktop PC. * [Developing on your local PC](/docs/host_development/host_development.md) * [Deploying on Raspberry Pi](/docs/target_development/building_target_firmware.md) @@ -18,7 +18,7 @@ Most FarmBot development/testing is done on a standard desktop PC. ## CeleryScript -CeleryScript is FarmBot's native scripting language. See the below +CeleryScript is FarmBot's native scripting language. See the below documentation for information about it as it relates to FarmBot OS. * [CeleryScript intro](/docs/celery_script/celery_script.md) @@ -27,7 +27,7 @@ documentation for information about it as it relates to FarmBot OS. ## Project structure -The FarmBot OS application is broken into several sub applications. +The FarmBot OS application is broken into several sub applications. * [Project structure overview](/docs/project/structure.md) * [farmbot_celery_script](/docs/project/farmbot_celery_script.md) diff --git a/docs/project/farmbot_celery_script.md b/docs/project/farmbot_celery_script.md index 217b8d5af..26c9501d2 100644 --- a/docs/project/farmbot_celery_script.md +++ b/docs/project/farmbot_celery_script.md @@ -1,11 +1,12 @@ # FarmBot CeleryScript OTP App -`farmbot_celery_script` is responsible for implementing the -runtime that execute's [CeleryScript](/docs/celery_script/celery_script.md). -It contains a handful of helpers, and several subsystems for working with CeleryScript. +`farmbot_celery_script` is responsible for implementing the +runtime that execute's [CeleryScript](/docs/celery_script/celery_script.md). +It contains a handful of helpers, and several subsystems for working with CeleryScript. The most important being: + * AST - definition of the AST as it relates to FarmBot OS -* Compiler - Compiles CeleryScript to Elixir AST. +* Compiler - Compiles CeleryScript to Elixir AST. * See the [Elixir Macro Docs](https://hexdocs.pm/elixir/Macro.html) * StepRunner - Process responsible for actually executing CeleryScript * Scheduler - Process responsible for scheduling calls to the `StepRunner` diff --git a/docs/project/farmbot_core.md b/docs/project/farmbot_core.md index 23787e3ed..afaf792fe 100644 --- a/docs/project/farmbot_core.md +++ b/docs/project/farmbot_core.md @@ -2,13 +2,14 @@ `farmbot_core` is responsible for the core funcionality of the FarmBot application. This contains things such as resource (asset) management, plugin (farmware) management, -central state, and schedule management. FarmBot specific network requests are not made -from the `farmbot_core` app. Below describes the important subsystems +central state, and schedule management. FarmBot specific network requests are not +made from the `farmbot_core` app. Below describes the important subsystems ## Asset storage subsystem Sqlite database responsible for storing data needed for FarmBot to operate. Most device specific REST resources are mirrored here. + * Device * FarmEvent * Regimen @@ -19,6 +20,7 @@ Most device specific REST resources are mirrored here. All assets that need to have a process assosiated with it will be found in this subsystem. Examples of this include: + * FarmEvent scheduling * Regimen scheduling * PinBinding monitoring @@ -35,20 +37,20 @@ all the moving parts of FarmBot. Some examples of what is stored in this cache: * Firmware reporting - * current axis position - * encoder data - * arduino pin data - * currently configured firmware paramaters + current axis position + encoder data + arduino pin data + currently configured firmware paramaters * Current configuration - * mirror of `fbos_config` asset + mirror of `fbos_config` asset * System info - * version info - * (nerves) firmware info - * memory usage - * disk usage + version info + (nerves) firmware info + memory usage + disk usage * Network info - * WiFi signal quality - * private ip address + WiFi signal quality + private ip address ## Logging subsystem diff --git a/docs/project/farmbot_ext.md b/docs/project/farmbot_ext.md index d6e32632c..1bab27c99 100644 --- a/docs/project/farmbot_ext.md +++ b/docs/project/farmbot_ext.md @@ -1,38 +1,47 @@ # FarmBot Ext OTP App -the `farmbot_ext` OTP app contains extended FarmbotCore functionality. This includes -mostly network functionality that isn't possible to do in `farmbot_core`. +the `farmbot_ext` OTP app contains extended FarmbotCore functionality. +This includes mostly network functionality that isn't +possible to do in `farmbot_core`. ## Bootstrap subsystem -Subsystem responsible for bootstrapping a connection to the FarmBot network services. -This includes authenticating with the FarmBot API, connecting to AMQP/MQTT and syncing +Subsystem responsible for bootstrapping a connection to the +FarmBot network services. This includes authenticating with +the FarmBot API, connecting to AMQP/MQTT and syncing the bare minimum resources to get up and running. ## HTTP/Sync subsystem -This is the subsystem that syncronizes FarmBot with the remote API. It uses HTTP to -download an index of all the data FarmBot cares about, and compares timestamps to -determine who has the most up to date data. The basic flow is whoever has the most -recent `updated_at` field will become the "most truthy". If FarmBot has a more recent -`updated_at` field, FarmBot will do an HTTP PUT of it's data. If the remote resource -does not exist, FarmBot will do an HTTP POST of it's data. If the remote data has a more +This is the subsystem that syncronizes FarmBot with the remote API. +It uses HTTP to download an index of all the data FarmBot cares about, +and compares timestamps to determine who has the most up to date data. +The basic flow is whoever has the most recent `updated_at` field will +become the "most truthy". If FarmBot has a more recent `updated_at` field, +FarmBot will do an HTTP PUT of it's data. If the remote resource does not +exist, FarmBot will do an HTTP POST of it's data. If the remote data has a more recent `updated_at` field, FarmBot will do an HTTP GET and replace it's own data. ## AMQP/MQTT substem -FarmBot maintains a connection to the API for real time communication. This real time communication -connection is multiplexed over multiple `channel`s. Below is a description of the channels +FarmBot maintains a connection to the API for real time communication. This +real time communication connection is multiplexed over multiple `channel`s. +Below is a description of the channels: -* bot_state - pushes a JSON encoded version of the `bot_state` process (from `farmbot_core`) -* celery_script - receives/sends JSON encoded celery_script. Used for controling FarmBot externally +* bot_state - pushes a JSON encoded version of the `bot_state` + process (from `farmbot_core`) +* celery_script - receives/sends JSON encoded celery_script. + Used for controling FarmBot externally * log - sends log messages from `farmbot_core`'s logger * ping/pong - echos everything received. used for detecting active conncetion -* auto_sync - the API dispatches every REST resource change on this channel. Used to speed up HTTP requests -* telemetry - similar to the log channel, but sends consumable events, rather than human readable messages +* auto_sync - the API dispatches every REST resource change on this channel. + Used to speed up HTTP requests +* telemetry - similar to the log channel, but sends consumable events, + rather than human readable messages ## Image uploader subsystem -This subsystem watches a local directory, and as matching files appear in that directory, -it uploads them using the FarmBot image upload protocol. Basically an HTTP request to fetch -credentials that are used to preform another HTTP request to upload the photo. \ No newline at end of file +This subsystem watches a local directory, and as matching files appear in that directory, +it uploads them using the FarmBot image upload protocol. Basically an HTTP request +to fetch credentials that are used to preform another HTTP request to upload +the photo. \ No newline at end of file diff --git a/docs/project/farmbot_firmware.md b/docs/project/farmbot_firmware.md index 5c884a1da..906629dd6 100644 --- a/docs/project/farmbot_firmware.md +++ b/docs/project/farmbot_firmware.md @@ -1,22 +1,22 @@ # FarmBot Firmware OTP App -The `farmbot_firmware` OTP application is responsible for maintaining a connection to -the arduino-firmware. +The `farmbot_firmware` OTP application is responsible for +maintaining a connection to the arduino-firmware. ## GCODE encoder/decoder subsystem The official Farmbot-Arduino-Firmware communicates over UART using a ASCII based protocol based on CNC GCODE. This subsystem is responsible for translating the ASCII data into an intermediate representation that can be `transport`ed -proto agnostically. +protocol agnostically. ## Transport subsystem -This subsystem is responsible for abstracting the details of transporting -FarmBot GCODEs to/from the firmware implementation. A `transport` will take +This subsystem is responsible for abstracting the details of transporting +FarmBot GCODEs to/from the firmware implementation. A `transport` will take in the intermediate (farmbot specific) representation of a GCODE, and dispatch/handle it in it's own specific manor. This keeps the usage of the overall application uniform -with or without a firmware plugged in. +with or without a firmware plugged in. ## UART subsystem diff --git a/docs/project/farmbot_os.md b/docs/project/farmbot_os.md index c5933ef1c..198ffb38e 100644 --- a/docs/project/farmbot_os.md +++ b/docs/project/farmbot_os.md @@ -1,46 +1,48 @@ # FarmBot OTP App +## Normal Subsystems + the `farmbot` OTP app is the container Nerves based application. It contains mostly -glue code between all the subsystems in the other applications along with it's own +glue code between all the subsystems in the other applications along with it's own platform specific subsystems. -## CeleryScript System Calls +### CeleryScript System Calls The "official" implementation of all the CeleryScript syscalls. These calls are mostly glue to other existing implementations from the other otp apps. -## Lua Subsystem +### Lua Subsystem The implementation of the embedded scripting language inside CeleryScript. Also contains glue code for glueing together the real implementation to the Lua vm. -## Configurator Subsystem +### Configurator Subsystem HTTP server responsible for configuring the running FarmBot OS instance. Will server a web page that allows a user to supply a username, password, network credentials etc. -# Platform specific subsystems +## Platform specific subsystems the `farmbot_os` OTP app contains target/hardware specific systems. This code is located in the `platform` directory. -## Network subsystem +### Network subsystem -Responsible for getting FarmBot connected to the (inter)net. If no network configuration is -available, FarmBot will create a captive portal access point to allow external devices to -configure it. +Responsible for getting FarmBot connected to the (inter)net. If no network +configuration is available, FarmBot will create a captive portal access +point to allow external devices to configure it. -## GPIO subsystem +### GPIO subsystem Responsible for implementing LED and Button support at the hardware level. -## RTC subsystem +### RTC subsystem Responsible for syncronizing network time to an attached hardware clock. -## Info Worker subsystem +### Info Worker subsystem Responsible for simple workers that handle things like diff --git a/docs/project/farmbot_telemetry.md b/docs/project/farmbot_telemetry.md index e69de29bb..9d9fdec10 100644 --- a/docs/project/farmbot_telemetry.md +++ b/docs/project/farmbot_telemetry.md @@ -0,0 +1,9 @@ +# FarmBot Telemetry OTP App + +The `farmbot_telemetry` OTP application is responsible for +storage of telemetry events. Every major OTP app in the project +uses this application as a dependency. Telemetry events are +stored in a `DETS` table, and are polled occasionally +by an AMQP/MQTT worker. When the events are successfully +dispatched over the network, they are removed from the +database \ No newline at end of file diff --git a/docs/project/structure.md b/docs/project/structure.md index 407c28da2..8dc245f38 100644 --- a/docs/project/structure.md +++ b/docs/project/structure.md @@ -1,6 +1,6 @@ -## FarmBot Source Project structure +# FarmBot Source Project structure -The FarmBot OS application is broken into several sub OTP applications. +The FarmBot OS application is broken into several sub OTP applications. * [farmbot_celery_script](/docs/project/farmbot_celery_script.md) * [farmbot_core](/docs/project/farmbot_core.md) @@ -13,7 +13,9 @@ The FarmBot OS application is broken into several sub OTP applications. All of these folders share a common structure. - +```bash +$ tree $OTP_APP_ROOT +$OTP_APP_ROOT ├── lib/ │ ├── application.ex │ └── some_file.ex @@ -29,5 +31,7 @@ All of these folders share a common structure. * The `lib` folder contains Elixir source code * the `test` folder contains Elixir scripts responsible for testing the `lib` code -* the `config` folder contains Elixir scripts responsible for configuring the **current** OTP app -* `mix.exs` and `mix.lock` files are responsible describing the OTP app, and managing external dependencies \ No newline at end of file +* the `config` folder contains Elixir scripts responsible for + configuring the **current** OTP app +* `mix.exs` and `mix.lock` files are responsible describing + the OTP app, and managing external dependencies \ No newline at end of file diff --git a/docs/target_development/building_target_firmware.md b/docs/target_development/building_target_firmware.md index 779df7e1e..f2bb2f940 100644 --- a/docs/target_development/building_target_firmware.md +++ b/docs/target_development/building_target_firmware.md @@ -1,27 +1,38 @@ -# Building FarmBot OS -# Building an Image from source +# Building FarmBot OS from source + This project is written in the programming language Elixir and built using the Nerves Project framework. ## Cloning + Farmbot OS now bundles and builds the [Arduino Firmware](https://github.com/farmbot/farmbot-arduino-firmware). This is bundled as a `git` submodule. You can choose to do one of: -`git clone https://github.com/FarmBot/farmbot_os.git --recursive` + +```bash +git clone https://github.com/FarmBot/farmbot_os.git --recursive +``` + or + ```bash git clone https://github.com/FarmBot/farmbot_os.git git submodule update --init --recursive cd farmbot_os ``` + To initialize the repository. ## Before you begin + You will need a number of things before we start: + * A x64 bit non windows machine * We suggest the latest OSX or Ubuntu LTS. ## Install dependencies + If you have the above set up you will need some software dependencies: + * Erlang * Elixir * Nerves Bootstrapper found [here](https://hexdocs.pm/nerves/installation.html#Linux) @@ -29,6 +40,7 @@ If you have the above set up you will need some software dependencies: * git ## Optional dependencies + * python * opencv-python @@ -36,12 +48,14 @@ Following [this](http://embedded-elixir.com/post/2017-05-23-using-asdf-vm/) guid will get you mostly setup. ## Development + Most development will be done in "host" environment. This means that rather than making a change on your computer, then pushing it to the device, we can rapidly develop things from the luxury of our own machine. See [The Nerves getting started guide](https://hexdocs.pm/nerves/getting-started.html) for more information about this. But as a side effect, we will need to be able to configure (at least) two different environment/target combos. where: + * `environment` - is one of: * `prod` - The production environment. * No developer features enabled (such as logs, local fw updates etc). @@ -59,37 +73,56 @@ to configure (at least) two different environment/target combos. where: * `rpi3` - Run on Farmbot's intended hardware. ## Feature development + If you plan on developing features, you will probably want to develop them with -the `dev` and `host` combo. These are both the default values, so you can simply do: +the `dev` and `host` combo. These are both the default values, +so you can simply do: + ```bash -export FARMBOT_EMAIL="email@server.com" FARMBOT_PASSWORD="supersecret" FARMBOT_SERVER="https://my.farm.bot" CONFIGURATOR_PORT=4000 # you should only need to do this once +export FARMBOT_EMAIL="email@server.com" +export FARMBOT_PASSWORD="supersecret" +export FARMBOT_SERVER="https://my.farm.bot" +export CONFIGURATOR_PORT=4000 # you should only need to do this once mix deps.get # You should only need to do this once. iex -S mix # This will start an interactive shell. ``` ## Development on device + Sometimes features will need to be developed and tested on the device itself. This is accomplished with the `dev` and `rpi3` combo. It is *highly* recommended that you have an FTDI cable for this such as [this](https://www.digikey.com/product-detail/en/ftdi/TTL-232R-RPI/768-1204-ND) one +Get deps for the rpi3 target. You should only need to do this once: + +```bash +MIX_TARGET=rpi3 mix deps.get +``` + +Produce a firmware image: + ```bash -MIX_TARGET=rpi3 mix deps.get # Get deps for the rpi3 target. You should only need to do this once. -MIX_TARGET=rpi3 mix firmware # Produce a firmware image. -# Make sure you SDCard is plugged in before the following command. -MIX_TARGET=rpi3 mix firmware.burn # Burn the sdcard. You may be asked for a password here. +MIX_TARGET=rpi3 mix firmware +``` + +Make sure you SDCard is plugged in before the following command: + +```bash +MIX_TARGET=rpi3 mix firmware.burn ``` ### Local firmware updates + If you're bot is connected to your local network, you should be able to push updates over the network to your device. ```bash -# make some changes to the code... MIX_TARGET=rpi3 mix firmware # Build a new fw. MIX_TARGET=rpi3 mix firmware.gen.script # this should onlye be ran once MIX_TARGET=rpi3 ./upload.sh # Push the new fw to the device. ``` + Your device should now reboot into that new code. As long as you don't cause a factory reset somehow, (bad init code, typo, etc) you should be able continuously push updates to your device. diff --git a/docs/target_development/consoles/erlang_distribution.md b/docs/target_development/consoles/erlang_distribution.md index 090d9fd75..f2c15dece 100644 --- a/docs/target_development/consoles/erlang_distribution.md +++ b/docs/target_development/consoles/erlang_distribution.md @@ -23,4 +23,4 @@ iex --name console --cookie democookie --remsh farmbot@farmbot-.l ## Disconnecting -Issuing a `ctrl+c` to the `host` terminal should disconnect you from the session. \ No newline at end of file +Issuing a `ctrl+c` to the `host` terminal should disconnect you from the session. \ No newline at end of file diff --git a/docs/target_development/consoles/ssh.md b/docs/target_development/consoles/ssh.md index 759a92386..1459b4ef3 100644 --- a/docs/target_development/consoles/ssh.md +++ b/docs/target_development/consoles/ssh.md @@ -5,11 +5,12 @@ Accessing an SSH console. ## Setup FarmBot can be configured to start an SSH server to aid in debugging and development. -During configuration of Network, select `Advanced Settings` and paste your [ssh -public key](https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key) into the -optional input section labeled: `id_rsa.pub`. FarmBot requires a public key and -will not allow a username + password combination. If you followed the documentation -described in [building target firmware](/docs/target_development/building_target_firmware.md) +During configuration of Network, select `Advanced Settings` and paste your +[ssh public key](https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key) +into the optional input section labeled: `id_rsa.pub`. +FarmBot requires a public key and will not allow a username + password combination. +If you followed the documentation described in +[building target firmware](/docs/target_development/building_target_firmware.md) then your SSH key will be automatically added to the device. ## Connecting diff --git a/docs/target_development/consoles/target_console.md b/docs/target_development/consoles/target_console.md index 04bfef3e3..b53a66cb7 100644 --- a/docs/target_development/consoles/target_console.md +++ b/docs/target_development/consoles/target_console.md @@ -9,17 +9,19 @@ terminal. If you are on `target` mode (IE: deployed to the raspberry pi), there will be a console available in 3 locations: + * UART (except on RPI0 since the on-board UART is used for the arduino-firmware) - * [Connect to a UART console](/docs/target_development/consoles/uart.md) + [Connect to a UART console](/docs/target_development/consoles/uart.md) * SSH - * [Connect to an SSH console](/docs/target_development/consoles/ssh.md) + [Connect to an SSH console](/docs/target_development/consoles/ssh.md) * Erlang Distribution - * [Connect to an Erlang Distribution console](/docs/target_development/consoles/erlang_distribution.md) + [Connect to an Erlang Distribution console](/docs/target_development/consoles/erlang_distribution.md) ## Console Usage The console a user will be presented with is _not_ a Linux console. There are pretty much no Linux Utilities built-in. This includes but is not limited to: + * `bash` * `apt-get` * `make` @@ -35,6 +37,7 @@ What is available is a console to the FarmBot OS runtime. You will need to be familiar with the FarmBotOS Source code for this to be helpful. If all you are looking for is Logs, you will probably want to do: + ```elixir RingLogger.tail() ``` diff --git a/docs/target_development/consoles/uart.md b/docs/target_development/consoles/uart.md index d0fb47b07..23fbe3e0d 100644 --- a/docs/target_development/consoles/uart.md +++ b/docs/target_development/consoles/uart.md @@ -9,16 +9,18 @@ No additional setup is required for setting up the UART console on the target. On your `host` machine, you need to have a console cable, as well as a console client. The console cable must be 3.3 volts, **not** 5 volts. a 5 volt cable will harm your Raspberry Pi. Here are some known working cables: -* https://www.amazon.com/Converter-Terminated-Galileo-BeagleBone-Minnowboard/dp/B06ZYPLFNB -* https://www.amazon.com/DSD-TECH-Adapter-FT232RL-Compatible/dp/B07BBPX8B8 -* https://www.amazon.com/JANSANE-PL2303TA-Serial-Console-Raspberry/dp/B07D9R5JFK -The most common client is probably `screen` on *Nix based systems or `putty` on windows. -See your distribution's package manager for installation and usage instructions. +* +* +* + +The most common client is probably `screen` on *Nix based +systems or `putty` on windows. See your distribution's package manager +for installation and usage instructions. ## Connecting -Connecting to a console is dependent on your particular client. Here is an example +Connecting to a console is dependent on your particular client. Here is an example `screen` command: ```bash @@ -27,5 +29,5 @@ screen /dev/ttyUSB0 115200 ## Disconnecting -Disconnecting is also dependent on your particular client. To exit screen, +Disconnecting is also dependent on your particular client. To exit screen, issue a `ctrl+\+y` sequence to escape the console. \ No newline at end of file diff --git a/docs/target_development/releasing_target_firmware.md b/docs/target_development/releasing_target_firmware.md index 5b053bb3e..d67b9ab7c 100644 --- a/docs/target_development/releasing_target_firmware.md +++ b/docs/target_development/releasing_target_firmware.md @@ -1,54 +1,67 @@ -## Provisioning the Release System +# Provisioning the Release System + Publishing a FarmBotOS release requires coordination of a few different systems. + * FarmBot Web App * FarmBot OS * NervesHub * CircleCI * GitHub branches and releases -## Legacy System +## Legacy Release System + The legacy system is somewhat simpiler. It goes as follows: -### Pull request into `master` branch. -``` +### Pull request into `master` branch + +```bash git checkout master git merge staging git push origin master ``` + Obviously this will not actually work because of testing and things, but that is what happens behind the scenes on GitHub. ### CircleCI builds release + Once merged into master CircleCI will create a `draft` release on GitHub. This must be QA'd and confirmed manually before publishing. Once published, FarmBot will check the `OS_AUTO_UPDATE_URL` in the JWT. ### Beta updates + Users may opt into beta updates by settings `os_beta_updates: true` on their device's `FbosConfig` endpoint. Beta releases are constructed by creating a tag off of the `staging` branch. 1) update `VERSION`. - * Should follow `X.Y.Z-rcN` + Should follow `X.Y.Z-rcN` + 2) update `CHANGELOG.md`. - * Topmost version should contain: `vX.Y.Z` + Topmost version should contain: `vX.Y.Z` + 3) Commit release. - * Message should follow format: `Release vX.Y.Z-rcN` + Message should follow format: `Release vX.Y.Z-rcN` + 4) push `staging` - * `git push origin staging` + `git push origin staging` + 5) tag - * `git tag v$(cat VERSION)` - * `git push origin v$(cat VERSION)` + `git tag v$(cat VERSION)` + `git push origin v$(cat VERSION)` ## NervesHub System + The NervesHub system is simpiler to use, but more complex to setup. ### User registration + Create a admin user. This should be the same `ADMIN_EMAIL` used in the WebApp configuration. -``` +```bash mix nerves_hub.user register Email address: admin@farmbot.io Name: farmbot @@ -56,41 +69,44 @@ NervesHub password: *super secret* Local password: *super duper secret* ``` -``` +```bash mix nerves_hub.product create name: farmbot Local password: *super duper secret* ``` - ### Signing keys + Now a choice will need to be made. If fwup signing keys existed beforehand (they did for FarmBot Inc) do: -``` + +```bash mix nerves_hub.key import Local password: *super duper secret* ``` If new keys are required (probably named "prod") do: -``` + +```bash mix nerves_hub.key create Local password: *super duper secret* ``` ### Exporting certs and keys + The API and CI need copies of these keys and certs. These certs need to be updated before they expire. By default they are good for 1 year -``` +```bash mix nerves_hub.user cert export Local password: *super duper secret* User certs exported to: tar -xf -C nerves-hub/ ``` -``` +```bash mix nerves_hub.key export prod Local password: *super duper secret* Fwup keys exported to: @@ -99,18 +115,24 @@ tar -xf -C nerves-hub/ You will also need the CA cert bundle for the WebApp: (this may only work for BASH) + ```bash -{ curl -s https://raw.githubusercontent.com/nerves-hub/nerves_hub_cli/master/priv/ca_certs/root-ca.pem | head -20 \ -&& curl -s https://raw.githubusercontent.com/nerves-hub/nerves_hub_cli/master/priv/ca_certs/intermediate-server-ca.pem | head -20 \ - && curl -s https://raw.githubusercontent.com/nerves-hub/nerves_hub_cli/master/priv/ca_certs/intermediate-user-ca.pem | head -20; +REPO_URL=https://raw.githubusercontent.com/nerves-hub/nerves_hub_cli/master/priv/master/priv/ca_certs +{ \ + curl -s $REPO_URL/root-ca.pem | head -20 \ +&& curl -s $REPO_URL/intermediate-server-ca.pem | head -20 \ +&& curl -s $REPO_URL/intermediate-user-ca.pem | head -20; \ } > nerves-hub/nerves-hub-ca-certs.pem ``` Now the FarmBot API needs the values of in it's environment: -* `NERVES_HUB_KEY` -> `heroku config:set NERVES_HUB_KEY="$(cat nerves-hub/key.pem)" --app $APP` -* `NERVES_HUB_CERT` -> `heroku config:set NERVES_HUB_CERT="$(cat nerves-hub/cert.pem)" --app $APP` -* `NERVES_HUB_CA` -> `heroku config:set NERVES_HUB_CA="$(cat nerves-hub/ca.pem)" --app $APP` +* `NERVES_HUB_KEY` -> + `heroku config:set NERVES_HUB_KEY="$(cat nerves-hub/key.pem)" --app $APP` +* `NERVES_HUB_CERT` -> + `heroku config:set NERVES_HUB_CERT="$(cat nerves-hub/cert.pem)" --app $APP` +* `NERVES_HUB_CA` -> + `heroku config:set NERVES_HUB_CA="$(cat nerves-hub/ca.pem)" --app $APP` CircleCI will need: @@ -134,10 +156,12 @@ NOTE: the tags **NOT** json objects, they are simple strings split by a `:` character. This is done _only_ for readability. where `MIX_ENV` will be one of: + * `dev` * `prod` and `CHANNEL` will be one of: + * `beta` * `stable` @@ -145,25 +169,25 @@ There should be at least one deployment matching the following tags: * `["application:dev", "channel:stable"]` - * a development FBOS release on the `stable` channel + a development FBOS release on the `stable` channel * `["application:prod", "channel:stable"]` - * a production FBOS release on the `stable` channel + a production FBOS release on the `stable` channel * `["application:dev", "channel:beta"]` - * a development FBOS release on the `beta` channel + a development FBOS release on the `beta` channel * `["application:prod", "channel:beta"]` - * a production FBOS release on the `beta` channel + a production FBOS release on the `beta` channel * `["application:dev", "channel:stable"]` - * a development FBOS release on the `stable` channel + a development FBOS release on the `stable` channel * `["application:prod", "channel:stable"]` - * a production FBOS release on the `stable` channel + a production FBOS release on the `stable` channel * `["application:dev", "channel:beta"]` - * a development FBOS release on the `beta` channel + a development FBOS release on the `beta` channel * `["application:prod", "channel:beta"]` - * a production FBOS release on the `beta` channel - + a production FBOS release on the `beta` channel ### First time setup -``` + +```bash heroku config:set NERVES_HUB_CERT="$NERVES_HUB_CERT" --app=$HEROKU_APPNAME heroku config:set NERVES_HUB_KEY="$NERVES_HUB_KEY" --app=$HEROKU_APPNAME heroku config:set NERVES_HUB_CA="$NERVES_HUB_CA" --app=$HEROKU_APPNAME diff --git a/docs/target_development/target_faq.md b/docs/target_development/target_faq.md index 829fb4b8a..050856cf7 100644 --- a/docs/target_development/target_faq.md +++ b/docs/target_development/target_faq.md @@ -1,15 +1,17 @@ # Frequently Asked Questions -## What ports oputbound does Farmbot OS use? +## What ports oputbound does Farmbot OS use + * AMQP: 5672 * HTTP(S): 80 + 443 (this is configurable) * NTP: UDP 123 -## My bot doesn't boot on a fresh SD card! +## My bot doesn't boot on a fresh SD card + This could be one of a few things. These things are in order of probability. * Your farmbot doesn't have enough power. You NEED a good power supply at -least 5 volts and 2.5 Amps for farmbot to boot reliably. + least 5 volts and 2.5 Amps for farmbot to boot reliably. * Is the power LED flashing? If yes you need more amps. * Is the Green LED flashing? If no you need more amps. * Your Arduino wasn't detected. @@ -20,17 +22,21 @@ least 5 volts and 2.5 Amps for farmbot to boot reliably. * You have a bad SD Card. * You aren't using a Raspberry Pi 3. -## Why can't I update my Arduino Firmware? +## Why can't I update my Arduino Firmware + As of version 3.8.0 we decided to bundle the arduino firmware into farmbot os. There was a couple reasons for this. + * There is no more version conflicts between the firmware and operating system. * Applying updates during farmbot os runtime can be dangerous and was leaving -peoples bot's unusable because of broken firmwares. + peoples bot's unusable because of broken firmwares. ## Can the shell run on HDMI + No. Farmbot is designed to operate without the use of a monitor. -## Why aren't [X] or [Y] packages included? +## Why aren't [X] or [Y] packages included + See the above answer. [Raise an issue](https://github.com/FarmBot/farmbot_os/issues/new) to request a package. Future versions of FarmBotOS may provide a plugin system. -It is not implemented yet. +It is not implemented yet. \ No newline at end of file From 4f5db38e71adcf49e43bddf11e28653d82f91119 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Wed, 18 Dec 2019 12:08:46 -0800 Subject: [PATCH 37/58] Update CircleCI config to check docs --- .circleci/config.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a3c6d8ba6..8405260f8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,6 +56,14 @@ install_libnl: &install_libnl apt-get update apt-get install pkg-config libnl-genl-3-dev -y +install_mdl: &install_mdl + run: + name: Install libnl + command: | + apt-get update + apt-get install ruby -y + gem install mdl + build_firmware_steps: &build_firmware_steps steps: - checkout @@ -376,6 +384,7 @@ jobs: - run: git submodule update --init --recursive - <<: *install_elixir - <<: *install_hex_archives + - <<: *install_mdl - restore_cache: keys: - v14-fbsupport-test-dependency-cache-{{ checksum "mix.lock" }} @@ -397,6 +406,10 @@ jobs: - restore_cache: keys: - v14-fbos-coverage-cache-{{ .Branch }}-{{ .Revision }} + - run: + name: Check documentation formatting + command: | + mdl docs/ - run: name: Report Coverage working_directory: /nerves/build/ From 6cb47d43aab16a9e9851517089671c81dc98d457 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Wed, 18 Dec 2019 12:51:05 -0800 Subject: [PATCH 38/58] Add docs for generating app specific docs --- Makefile | 10 ++++++++-- docs/project/structure.md | 19 +++++++++++++++++++ farmbot_celery_script/mix.exs | 6 ++++++ farmbot_celery_script/mix.lock | 2 +- farmbot_core/mix.exs | 6 +++++- farmbot_core/mix.lock | 4 ++-- farmbot_ext/mix.exs | 8 +++++++- farmbot_ext/mix.lock | 4 ++-- farmbot_firmware/lib/farmbot_firmware.ex | 2 +- farmbot_firmware/mix.exs | 8 +++++++- farmbot_firmware/mix.lock | 2 +- farmbot_os/lib/farmbot_os/lua.ex | 2 +- farmbot_os/lib/farmbot_os/sys_calls.ex | 1 + farmbot_os/mix.exs | 8 +++++++- farmbot_telemetry/mix.exs | 8 +++++++- 15 files changed, 75 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 26e1d83e7..7e408d2dc 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: all clean format +.PHONY: all clean format docs deps .DEFAULT_GOAL: all MIX_ENV := $(MIX_ENV) @@ -51,6 +51,12 @@ format: deps: @for project in $(PROJECTS) ; do \ - echo Fetching deps: $$project ; \ + echo Fetching deps for $$project ; \ cd $$project && mix deps.get && cd .. ; \ done + +docs: + @for project in $(PROJECTS) ; do \ + echo Building docs for $$project ; \ + cd $$project && mix docs && cd .. ; \ + done diff --git a/docs/project/structure.md b/docs/project/structure.md index 8dc245f38..5b0cb9e6b 100644 --- a/docs/project/structure.md +++ b/docs/project/structure.md @@ -9,6 +9,25 @@ The FarmBot OS application is broken into several sub OTP applications. * [farmbot_os](/docs/project/farmbot_os.md) * [farmbot_telemetry](/docs/project/farmbot_telemetry.md) +## Generating Specific documentation + +Each project has it's own inline documentation. Documentation can be +generated by changing directory into the application of interest and +using `exdoc` to generate docs. For example for `farmbot_core`: + +```bash +cd farmbot_core +mix deps.get +mix docs +``` + +Generating docs for all projects can be done with the root level Makefile: + +```bash +make deps +make docs +``` + ## Commonality All of these folders share a common structure. diff --git a/farmbot_celery_script/mix.exs b/farmbot_celery_script/mix.exs index abfb133b5..166360037 100644 --- a/farmbot_celery_script/mix.exs +++ b/farmbot_celery_script/mix.exs @@ -28,6 +28,12 @@ defmodule FarmbotCeleryScript.MixProject do "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test + ], + source_url: "https://github.com/Farmbot/farmbot_os", + homepage_url: "http://farmbot.io", + docs: [ + logo: "../farmbot_os/priv/static/farmbot_logo.png", + extras: Path.wildcard("../docs/**/*.md") ] ] end diff --git a/farmbot_celery_script/mix.lock b/farmbot_celery_script/mix.lock index 013241ea1..f4ac35041 100644 --- a/farmbot_celery_script/mix.lock +++ b/farmbot_celery_script/mix.lock @@ -16,7 +16,7 @@ "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, - "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm"}, "timex": {:hex, :timex, "3.6.1", "efdf56d0e67a6b956cc57774353b0329c8ab7726766a11547e529357ffdc1d56", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"}, "tzdata": {:hex, :tzdata, "1.0.2", "6c4242c93332b8590a7979eaf5e11e77d971e579805c44931207e32aa6ad3db1", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, diff --git a/farmbot_core/mix.exs b/farmbot_core/mix.exs index b4666dd67..b261db015 100644 --- a/farmbot_core/mix.exs +++ b/farmbot_core/mix.exs @@ -40,7 +40,11 @@ defmodule FarmbotCore.MixProject do "coveralls.html": :test ], source_url: "https://github.com/Farmbot/farmbot_os", - homepage_url: "http://farmbot.io" + homepage_url: "http://farmbot.io", + docs: [ + logo: "../farmbot_os/priv/static/farmbot_logo.png", + extras: Path.wildcard("../docs/**/*.md") + ] ] end diff --git a/farmbot_core/mix.lock b/farmbot_core/mix.lock index 81da8a06a..779400aa2 100644 --- a/farmbot_core/mix.lock +++ b/farmbot_core/mix.lock @@ -1,6 +1,6 @@ %{ "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, - "circuits_uart": {:hex, :circuits_uart, "1.3.0", "a489e648f358fb3c59e8dd146ead4295cec09d8abae3a0024be2fe3a0b6ddf8b", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "circuits_uart": {:hex, :circuits_uart, "1.4.0", "799abad2d5f355bd571c46de089e62c6341e6b08f9fdf51f4d53d50f5d5bbda9", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, "cowboy": {:hex, :cowboy, "2.5.0", "4ef3ae066ee10fe01ea3272edc8f024347a0d3eb95f6fbb9aed556dacbfc1337", [:rebar3], [{:cowlib, "~> 2.6.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.6.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, @@ -39,7 +39,7 @@ "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm"}, "sqlitex": {:hex, :sqlitex, "1.4.3", "a50f12d6aeb25f4ebb128453386c09bbba8f5abd3c7713dc5eaa92f359926ac5", [:mix], [{:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, - "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm"}, "timex": {:hex, :timex, "3.6.1", "efdf56d0e67a6b956cc57774353b0329c8ab7726766a11547e529357ffdc1d56", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"}, "tzdata": {:hex, :tzdata, "1.0.2", "6c4242c93332b8590a7979eaf5e11e77d971e579805c44931207e32aa6ad3db1", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, diff --git a/farmbot_ext/mix.exs b/farmbot_ext/mix.exs index e25462304..be69d828d 100644 --- a/farmbot_ext/mix.exs +++ b/farmbot_ext/mix.exs @@ -11,6 +11,7 @@ defmodule FarmbotExt.MixProject do elixirc_options: [warnings_as_errors: true, ignore_module_conflict: true], start_permanent: Mix.env() == :prod, elixirc_paths: ["lib", "vendor"], + deps: deps(), test_coverage: [tool: ExCoveralls], preferred_cli_env: [ coveralls: :test, @@ -18,7 +19,12 @@ defmodule FarmbotExt.MixProject do "coveralls.post": :test, "coveralls.html": :test ], - deps: deps() + source_url: "https://github.com/Farmbot/farmbot_os", + homepage_url: "http://farmbot.io", + docs: [ + logo: "../farmbot_os/priv/static/farmbot_logo.png", + extras: Path.wildcard("../docs/**/*.md") + ] ] end diff --git a/farmbot_ext/mix.lock b/farmbot_ext/mix.lock index 981ec9feb..2456fba93 100644 --- a/farmbot_ext/mix.lock +++ b/farmbot_ext/mix.lock @@ -2,7 +2,7 @@ "amqp": {:hex, :amqp, "1.4.0", "4172595d467b9360850a8eca254c5946af9970684d335d555a9f3410a0e43995", [:mix], [{:amqp_client, "~> 3.8.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm"}, "amqp_client": {:hex, :amqp_client, "3.8.2", "b50ac381c3c016a697d6ab8f08367043a08358cfeb8ee97832ccc7d101e59cef", [:make, :rebar3], [{:rabbit_common, "3.8.2", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm"}, "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, - "circuits_uart": {:hex, :circuits_uart, "1.3.1", "8c0a56f06828133a0b08363ecb994350a9529d388a912357d31829ae617cd801", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "circuits_uart": {:hex, :circuits_uart, "1.4.0", "799abad2d5f355bd571c46de089e62c6341e6b08f9fdf51f4d53d50f5d5bbda9", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, "credentials_obfuscation": {:hex, :credentials_obfuscation, "1.1.0", "513793cc20c18afc9e03e584b436192a751a8344890e03a8741c65c8d6866fab", [:rebar3], [], "hexpm"}, @@ -40,7 +40,7 @@ "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm"}, "sqlitex": {:hex, :sqlitex, "1.5.1", "0242c9a7602180b4f974315e6776c48d4ba211e9f4c5774dc886f15dc1a2edb3", [:mix], [{:decimal, "~> 1.7", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.3.0", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, - "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm"}, "tesla": {:hex, :tesla, "1.3.0", "f35d72f029e608f9cdc6f6d6fcc7c66cf6d6512a70cfef9206b21b8bd0203a30", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 0.4", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"}, "timex": {:hex, :timex, "3.5.0", "b0a23167da02d0fe4f1a4e104d1f929a00d348502b52432c05de875d0b9cffa5", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"}, "tzdata": {:hex, :tzdata, "0.5.20", "304b9e98a02840fb32a43ec111ffbe517863c8566eb04a061f1c4dbb90b4d84c", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, diff --git a/farmbot_firmware/lib/farmbot_firmware.ex b/farmbot_firmware/lib/farmbot_firmware.ex index f4e487ebb..421a5566e 100644 --- a/farmbot_firmware/lib/farmbot_firmware.ex +++ b/farmbot_firmware/lib/farmbot_firmware.ex @@ -158,7 +158,7 @@ defmodule FarmbotFirmware do * `{:report_success, []}` -> `:ok` * `{:report_invalid, []}` -> `{:error, :invalid_command}` * `{:report_error, []}` -> `{:error, :firmware_error}` - * `{:report_emergency_lock, []}` -> {:error, :emergency_lock}` + * `{:report_emergency_lock, []}` -> `{:error, :emergency_lock}` If the firmware is in any of the following states: * `:boot` diff --git a/farmbot_firmware/mix.exs b/farmbot_firmware/mix.exs index b5cd7cfd1..2b5ec863a 100644 --- a/farmbot_firmware/mix.exs +++ b/farmbot_firmware/mix.exs @@ -19,6 +19,7 @@ defmodule FarmbotFirmware.MixProject do elixirc_options: [warnings_as_errors: true, ignore_module_conflict: true], arduino_commit: arduino_commit(), start_permanent: Mix.env() == :prod, + deps: deps(), test_coverage: [tool: ExCoveralls], preferred_cli_env: [ test: :test, @@ -28,7 +29,12 @@ defmodule FarmbotFirmware.MixProject do "coveralls.post": :test, "coveralls.html": :test ], - deps: deps() + source_url: "https://github.com/Farmbot/farmbot_os", + homepage_url: "http://farmbot.io", + docs: [ + logo: "../farmbot_os/priv/static/farmbot_logo.png", + extras: Path.wildcard("../docs/**/*.md") + ] ] end diff --git a/farmbot_firmware/mix.lock b/farmbot_firmware/mix.lock index 39008a2d5..9de4f48c5 100644 --- a/farmbot_firmware/mix.lock +++ b/farmbot_firmware/mix.lock @@ -37,7 +37,7 @@ "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm"}, "sqlitex": {:hex, :sqlitex, "1.4.3", "a50f12d6aeb25f4ebb128453386c09bbba8f5abd3c7713dc5eaa92f359926ac5", [:mix], [{:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm"}, - "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm"}, "timex": {:hex, :timex, "3.4.2", "d74649c93ad0e12ce5b17cf5e11fbd1fb1b24a3d114643e86dba194b64439547", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"}, "tzdata": {:hex, :tzdata, "0.5.19", "7962a3997bf06303b7d1772988ede22260f3dae1bf897408ebdac2b4435f4e6a", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, diff --git a/farmbot_os/lib/farmbot_os/lua.ex b/farmbot_os/lib/farmbot_os/lua.ex index efe22431c..ce13d616f 100644 --- a/farmbot_os/lib/farmbot_os/lua.ex +++ b/farmbot_os/lib/farmbot_os/lua.ex @@ -15,7 +15,7 @@ defmodule FarmbotOS.Lua do } # this function is used by SysCalls, but isn't a direct requirement. - @doc false + @doc "Logs an assertion based on it's result" def log_assertion(passed?, type, message) do meta = [assertion_passed: passed?, assertion_type: type] FarmbotCore.Logger.dispatch_log(__ENV__, :assertion, 2, message, meta) diff --git a/farmbot_os/lib/farmbot_os/sys_calls.ex b/farmbot_os/lib/farmbot_os/sys_calls.ex index 5be1821e5..3874ac1e2 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls.ex @@ -69,6 +69,7 @@ defmodule FarmbotOS.SysCalls do @impl true defdelegate eval_assertion(comment, expression), to: Lua + defdelegate log_assertion(passed?, type, message), to: Lua @impl true diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index f312c1c5a..f84e32ec5 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -28,6 +28,7 @@ defmodule FarmbotOS.MixProject do elixirc_paths: elixirc_paths(Mix.env(), Mix.target()), deps_path: "deps/#{Mix.target()}", build_path: "_build/#{Mix.target()}", + deps: deps(), test_coverage: [tool: ExCoveralls], preferred_cli_target: [run: :host, test: :host], preferred_cli_env: [ @@ -36,7 +37,12 @@ defmodule FarmbotOS.MixProject do "coveralls.post": :test, "coveralls.html": :test ], - deps: deps() + source_url: "https://github.com/Farmbot/farmbot_os", + homepage_url: "http://farmbot.io", + docs: [ + logo: "../farmbot_os/priv/static/farmbot_logo.png", + extras: Path.wildcard("../docs/**/*.md") + ] ] end diff --git a/farmbot_telemetry/mix.exs b/farmbot_telemetry/mix.exs index 5b5dfccfe..2c38e1e63 100644 --- a/farmbot_telemetry/mix.exs +++ b/farmbot_telemetry/mix.exs @@ -12,6 +12,7 @@ defmodule FarmbotTelemetry.MixProject do version: "0.1.0", elixir: "~> 1.9", start_permanent: Mix.env() == :prod, + deps: deps(), preferred_cli_env: [ test: :test, coveralls: :test, @@ -20,7 +21,12 @@ defmodule FarmbotTelemetry.MixProject do "coveralls.post": :test, "coveralls.html": :test ], - deps: deps() + source_url: "https://github.com/Farmbot/farmbot_os", + homepage_url: "http://farmbot.io", + docs: [ + logo: "../farmbot_os/priv/static/farmbot_logo.png", + extras: Path.wildcard("../docs/**/*.md") + ] ] end From b9e65aa5032025838de737fd1b04236f6274285c Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 19 Dec 2019 13:28:45 -0600 Subject: [PATCH 39/58] Add `needs_reset` field (bool) to devices table. --- farmbot_core/lib/farmbot_core/asset/device.ex | 20 +++++++++++-------- ...191219192107_add_needs_reset_to_device.exs | 12 +++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs diff --git a/farmbot_core/lib/farmbot_core/asset/device.ex b/farmbot_core/lib/farmbot_core/asset/device.ex index 94b85b902..9b5ccd524 100644 --- a/farmbot_core/lib/farmbot_core/asset/device.ex +++ b/farmbot_core/lib/farmbot_core/asset/device.ex @@ -22,6 +22,7 @@ defmodule FarmbotCore.Asset.Device do field(:ota_hour, :integer) field(:mounted_tool_id, :integer) field(:monitor, :boolean, default: true) + field(:needs_reset, :boolean, default: false) timestamps() end @@ -33,22 +34,25 @@ defmodule FarmbotCore.Asset.Device do last_ota: device.last_ota, last_ota_checkup: device.last_ota_checkup, ota_hour: device.ota_hour, + needs_reset: device.needs_reset, mounted_tool_id: device.mounted_tool_id } end def changeset(device, params \\ %{}) do device - |> cast(params, [:id, - :name, - :timezone, - :last_ota, - :last_ota_checkup, + |> cast(params, [ + :id, + :name, + :timezone, + :last_ota, + :last_ota_checkup, :ota_hour, :mounted_tool_id, - :monitor, - :created_at, - :updated_at + :monitor, + :created_at, + :updated_at, + :needs_reset ]) |> validate_required([]) end diff --git a/farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs b/farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs new file mode 100644 index 000000000..febd16717 --- /dev/null +++ b/farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs @@ -0,0 +1,12 @@ +defmodule FarmbotCore.Asset.Repo.Migrations.AddNeedsResetToDevice do + use Ecto.Migration + + def change do + alter table("devices") do + add(:needs_reset, :boolean, default: false) + end + + # Invalidate cache of local device resource: + execute("UPDATE devices SET updated_at = \"1970-11-07 16:52:31.618000\"") + end +end From d9fddde3e70f57edcdd91d71c287be9a8456524f Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 19 Dec 2019 13:49:51 -0600 Subject: [PATCH 40/58] Add factory reset when device.needs_reset field changes --- .../lib/farmbot_celery_script/ast/factory.ex | 5 +++ .../asset_workers/device_worker.ex | 38 ++++++++++++++++--- .../lib/farmbot_os/sys_calls/factory_reset.ex | 1 + 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/farmbot_celery_script/lib/farmbot_celery_script/ast/factory.ex b/farmbot_celery_script/lib/farmbot_celery_script/ast/factory.ex index 028058ed6..74d4d0a19 100644 --- a/farmbot_celery_script/lib/farmbot_celery_script/ast/factory.ex +++ b/farmbot_celery_script/lib/farmbot_celery_script/ast/factory.ex @@ -75,4 +75,9 @@ defmodule FarmbotCeleryScript.AST.Factory do def add_body_node(%AST{body: body} = ast, %AST{} = body_node) do %{ast | body: body ++ [body_node]} end + + def factory_reset(%AST{} = ast, package) do + ast + |> add_body_node(new(:factory_reset, %{package: package})) + end end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex index 7f17bdbd5..3eb1e5c0c 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex @@ -1,5 +1,6 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do alias FarmbotCore.{Asset, Asset.Device} + alias FarmbotCeleryScript.AST use GenServer require FarmbotCore.Logger @@ -12,6 +13,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do end def init(%Device{} = device) do + send(self(), :check_factory_reset) {:ok, %Device{} = device, 0} end @@ -19,8 +21,30 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do {:noreply, device} end + def handle_info(:check_factory_reset, %Device{needs_reset: true} = state) do + ast = + AST.Factory.new() + |> AST.Factory.rpc_request("RESET_DEVICE_NOW") + |> AST.Factory.factory_reset("farmbot_os") + + case FarmbotCeleryScript.execute(ast, make_ref()) do + :ok -> + :ok + + {:error, reason} -> + FarmbotCore.Logger.error(1, "error executing #{state.pin_binding}: #{reason}") + end + + {:noreply, state} + end + + def handle_info(:check_factory_reset, state) do + {:noreply, state} + end + def handle_cast({:new_data, new_device}, old_device) do _ = log_changes(new_device, old_device) + send(self(), :check_factory_reset) {:noreply, new_device} end @@ -29,22 +53,24 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do :ota_hour, :mounted_tool_id ] + new_interesting_device = Map.take(new_device, interesting_params) |> MapSet.new() old_interesting_device = Map.take(old_device, interesting_params) |> MapSet.new() difference = MapSet.difference(new_interesting_device, old_interesting_device) + Enum.each(difference, fn {:ota_hour, nil} -> - FarmbotCore.Logger.success 1, "Farmbot will apply updates as soon as possible" + FarmbotCore.Logger.success(1, "Farmbot will apply updates as soon as possible") {:ota_hour, hour} -> - FarmbotCore.Logger.success 1, "Farmbot will apply updates during the hour of #{hour}:00" + FarmbotCore.Logger.success(1, "Farmbot will apply updates during the hour of #{hour}:00") {:mounted_tool_id, nil} -> if old_device.mounted_tool_id do if tool = Asset.get_tool(id: old_device.mounted_tool_id) do - FarmbotCore.Logger.info 2, "Farmbot dismounted #{tool.name}" + FarmbotCore.Logger.info(2, "Farmbot dismounted #{tool.name}") else - FarmbotCore.Logger.info 2, "Farmbot dismounted unknown tool" + FarmbotCore.Logger.info(2, "Farmbot dismounted unknown tool") end else # no previously mounted tool @@ -53,9 +79,9 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do {:mounted_tool_id, id} -> if tool = Asset.get_tool(id: id) do - FarmbotCore.Logger.info 2, "Farmbot mounted #{tool.name}" + FarmbotCore.Logger.info(2, "Farmbot mounted #{tool.name}") else - FarmbotCore.Logger.info 2, "Farmbot mounted unknown tool" + FarmbotCore.Logger.info(2, "Farmbot mounted unknown tool") end {_key, _value} -> diff --git a/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex b/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex index 6b70e59bb..5f02188f7 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex @@ -5,6 +5,7 @@ defmodule FarmbotOS.SysCalls.FactoryReset do alias FarmbotExt.API def factory_reset("farmbot_os") do + _ = API.put!(API.client(), "/api/device", %{needs_reset: false}) FarmbotOS.System.factory_reset("Factory reset requested by Sequence or frontend", true) :ok end From 27fb2d210cf6faacf967ecf1f8ce5de3ceabe57b Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 19 Dec 2019 14:13:52 -0600 Subject: [PATCH 41/58] Tests for needs_reset base case --- .../asset_workers/device_worker.ex | 12 ++++----- .../test/asset_workers/device_worker_test.exs | 26 +++++++++++++++++++ test/support/asset_fixtures.ex | 20 +++++++++++++- 3 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 farmbot_core/test/asset_workers/device_worker_test.exs diff --git a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex index 3eb1e5c0c..fe643794d 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex @@ -27,13 +27,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do |> AST.Factory.rpc_request("RESET_DEVICE_NOW") |> AST.Factory.factory_reset("farmbot_os") - case FarmbotCeleryScript.execute(ast, make_ref()) do - :ok -> - :ok - - {:error, reason} -> - FarmbotCore.Logger.error(1, "error executing #{state.pin_binding}: #{reason}") - end + :ok = FarmbotCeleryScript.execute(ast, make_ref()) {:noreply, state} end @@ -42,6 +36,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do {:noreply, state} end + def handle_info({:step_complete, _ref, _}, state) do + {:noreply, state} + end + def handle_cast({:new_data, new_device}, old_device) do _ = log_changes(new_device, old_device) send(self(), :check_factory_reset) diff --git a/farmbot_core/test/asset_workers/device_worker_test.exs b/farmbot_core/test/asset_workers/device_worker_test.exs new file mode 100644 index 000000000..3864399c6 --- /dev/null +++ b/farmbot_core/test/asset_workers/device_worker_test.exs @@ -0,0 +1,26 @@ +defmodule FarmbotCore.DeviceWorkerTest do + use ExUnit.Case, async: false + alias Farmbot.TestSupport.AssetFixtures + alias FarmbotCore.Asset.Device + alias FarmbotCore.AssetWorker + alias Farmbot.TestSupport.CeleryScript.TestSysCalls + + describe "devices" do + test "updates device triggering " do + {:ok, _} = TestSysCalls.checkout() + test_pid = self() + params = %{needs_reset: true} + assert %Device{} = dev = AssetFixtures.device(params) + + :ok = + TestSysCalls.handle(TestSysCalls, fn + kind, args -> + send(test_pid, {kind, args}) + :ok + end) + + {:ok, _pid} = AssetWorker.start_link(dev, []) + assert_receive {:factory_reset, ["farmbot_os"]} + end + end +end diff --git a/test/support/asset_fixtures.ex b/test/support/asset_fixtures.ex index 15c2ce5e3..09fc6aa07 100644 --- a/test/support/asset_fixtures.ex +++ b/test/support/asset_fixtures.ex @@ -1,6 +1,14 @@ defmodule Farmbot.TestSupport.AssetFixtures do alias FarmbotCore.Asset - alias FarmbotCore.Asset.{Repo, FarmEvent, FbosConfig, Regimen, Sequence} + + alias FarmbotCore.Asset.{ + Device, + FarmEvent, + FbosConfig, + Regimen, + Repo, + Sequence + } def regimen_instance(regimen_params, farm_event_params, params \\ %{}) do regimen = regimen(regimen_params) @@ -92,4 +100,14 @@ defmodule Farmbot.TestSupport.AssetFixtures do |> FarmEvent.changeset(params) |> Repo.insert!() end + + def device(params \\ %{}) do + defaults = %{id: :rand.uniform(1_000_000), monitor: false} + params = Map.merge(defaults, params) + + Device + |> struct() + |> Device.changeset(params) + |> Ecto.Changeset.apply_changes() + end end From 7664d2a9cc85cf7e8d9272a8048a3cc71331018a Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 19 Dec 2019 14:29:31 -0600 Subject: [PATCH 42/58] Tests for needs_reset update usecase --- .../test/asset_workers/device_worker_test.exs | 30 +++++++++++++++++-- test/support/asset_fixtures.ex | 5 +++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/farmbot_core/test/asset_workers/device_worker_test.exs b/farmbot_core/test/asset_workers/device_worker_test.exs index 3864399c6..ef1d7d731 100644 --- a/farmbot_core/test/asset_workers/device_worker_test.exs +++ b/farmbot_core/test/asset_workers/device_worker_test.exs @@ -5,12 +5,17 @@ defmodule FarmbotCore.DeviceWorkerTest do alias FarmbotCore.AssetWorker alias Farmbot.TestSupport.CeleryScript.TestSysCalls + def fresh_device(needs_reset \\ true) do + params = %{needs_reset: needs_reset} + assert %Device{} = dev = AssetFixtures.device_init(params) + dev + end + describe "devices" do - test "updates device triggering " do + test "triggering of factory reset during init" do {:ok, _} = TestSysCalls.checkout() test_pid = self() - params = %{needs_reset: true} - assert %Device{} = dev = AssetFixtures.device(params) + dev = fresh_device() :ok = TestSysCalls.handle(TestSysCalls, fn @@ -23,4 +28,23 @@ defmodule FarmbotCore.DeviceWorkerTest do assert_receive {:factory_reset, ["farmbot_os"]} end end + + test "triggering of factory reset during update" do + {:ok, _} = TestSysCalls.checkout() + test_pid = self() + dev = fresh_device(false) + + :ok = + TestSysCalls.handle(TestSysCalls, fn + kind, args -> + send(test_pid, {kind, args}) + :ok + end) + + {:ok, pid} = AssetWorker.start_link(dev, []) + refute_receive {:factory_reset, ["farmbot_os"]} + + GenServer.cast(pid, {:new_data, %{dev | needs_reset: true}}) + assert_receive {:factory_reset, ["farmbot_os"]} + end end diff --git a/test/support/asset_fixtures.ex b/test/support/asset_fixtures.ex index 09fc6aa07..9ad9e3865 100644 --- a/test/support/asset_fixtures.ex +++ b/test/support/asset_fixtures.ex @@ -101,7 +101,10 @@ defmodule Farmbot.TestSupport.AssetFixtures do |> Repo.insert!() end - def device(params \\ %{}) do + @doc """ + Instantiates, but does not create, a %Device{} + """ + def device_init(params \\ %{}) do defaults = %{id: :rand.uniform(1_000_000), monitor: false} params = Map.merge(defaults, params) From 2de6c11a6687c9dfc02550a08fd2483fd69b0af0 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 19 Dec 2019 17:58:44 -0600 Subject: [PATCH 43/58] Release v9.0.0-rc7 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e9f5473c2..02505d166 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc6 \ No newline at end of file +9.0.0-rc7 \ No newline at end of file From 0bc7001cbd0875f2bbde1edb299a2f663fdad51b Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Thu, 26 Dec 2019 09:31:40 -0800 Subject: [PATCH 44/58] Update host_development firmware docs --- docs/host_development/host_development.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/host_development/host_development.md b/docs/host_development/host_development.md index 17e9f8e0b..752dc8ff8 100644 --- a/docs/host_development/host_development.md +++ b/docs/host_development/host_development.md @@ -17,6 +17,25 @@ mix compile --force ``` If you're device moves ttys, you will have to redo this step. +Make sure the correct firmware is selected in the frontend. This +value is completely ignored when the `none` option is selected on +the Devices panel. + +To check the currently running firmware handler, from a running fbos instance +for the correct `transport` and correct `device` in it's args: + +```elixir +iex()> :sys.get_state(FarmbotFirmware) +%FarmbotFirmware{ + #... + transport: FarmbotFirmware.UARTTransport, + transport_args: [ + handle_gcode: #Function<1.52136448/1 in FarmbotFirmware.handle_call/3>, + device: "ttyUSB0" + ] + #... +} +``` ## Configurator From d65a54223c89dea308d46ec97d932ff819190f72 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Fri, 20 Dec 2019 08:48:27 -0800 Subject: [PATCH 45/58] Fix Firmware flashing on boot on express boards --- farmbot_core/config/config.exs | 2 + farmbot_ext/config/config.exs | 2 + farmbot_firmware/lib/farmbot_firmware.ex | 40 +++++++++++++++++-- .../lib/farmbot_firmware/null_reset.ex | 15 +++++++ .../{transports/uart_transport => }/reset.ex | 2 +- .../transports/uart_transport.ex | 13 +++--- farmbot_os/config/config.exs | 2 + farmbot_os/config/target/rpi.exs | 6 +-- farmbot_os/config/target/rpi0.exs | 6 +-- farmbot_os/config/target/rpi3.exs | 3 +- farmbot_os/lib/avrdude.ex | 20 +++++++++- .../farmbot_os/sys_calls/flash_firmware.ex | 7 +++- .../platform/target/firmware_reset/gpio.ex | 20 +++++----- .../platform/target/firmware_reset/null.ex | 9 ----- 14 files changed, 103 insertions(+), 44 deletions(-) create mode 100644 farmbot_firmware/lib/farmbot_firmware/null_reset.ex rename farmbot_firmware/lib/farmbot_firmware/{transports/uart_transport => }/reset.ex (76%) delete mode 100644 farmbot_os/platform/target/firmware_reset/null.ex diff --git a/farmbot_core/config/config.exs b/farmbot_core/config/config.exs index 3495e4349..9cc5a1968 100644 --- a/farmbot_core/config/config.exs +++ b/farmbot_core/config/config.exs @@ -42,6 +42,8 @@ config :farmbot_core, FarmbotCore.FirmwareTTYDetector, expected_names: [] config :farmbot_core, FarmbotCore.FirmwareOpenTask, attempt_threshold: 5 +config :farmbot_firmware, FarmbotFirmware, reset: FarmbotFirmware.NullReset + config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.FbosConfig, firmware_flash_attempt_threshold: 5 diff --git a/farmbot_ext/config/config.exs b/farmbot_ext/config/config.exs index 92db15d61..472d63e58 100644 --- a/farmbot_ext/config/config.exs +++ b/farmbot_ext/config/config.exs @@ -6,6 +6,8 @@ config :logger, handle_otp_reports: true, handle_sasl_reports: true config :farmbot_celery_script, FarmbotCeleryScript.SysCalls, sys_calls: FarmbotCeleryScript.SysCalls.Stubs +config :farmbot_firmware, FarmbotFirmware, reset: FarmbotFirmware.NullReset + import_config "ecto.exs" import_config "farmbot_core.exs" import_config "lagger.exs" diff --git a/farmbot_firmware/lib/farmbot_firmware.ex b/farmbot_firmware/lib/farmbot_firmware.ex index 421a5566e..6de95f76c 100644 --- a/farmbot_firmware/lib/farmbot_firmware.ex +++ b/farmbot_firmware/lib/farmbot_firmware.ex @@ -129,7 +129,9 @@ defmodule FarmbotFirmware do :command_queue, :caller_pid, :current, - :vcr_fd + :vcr_fd, + :reset, + :reset_pid ] @type state :: %State{ @@ -144,7 +146,9 @@ defmodule FarmbotFirmware do command_queue: [{pid(), GCODE.t()}], caller_pid: nil | pid, current: nil | GCODE.t(), - vcr_fd: nil | File.io_device() + vcr_fd: nil | File.io_device(), + reset: module(), + reset_pid: nil | pid() } @doc """ @@ -200,6 +204,10 @@ defmodule FarmbotFirmware do GenServer.call(server, {:open_transport, module, args}) end + def reset(server \\ __MODULE__) do + GenServer.call(server, :reset) + end + @doc """ Sets the Firmware server to record input and output GCODES to a pair of text files. @@ -233,6 +241,7 @@ defmodule FarmbotFirmware do args = Keyword.merge(args, global) transport = Keyword.fetch!(args, :transport) side_effects = Keyword.get(args, :side_effects) + reset = Keyword.fetch!(args, :reset) vcr_fd = case Keyword.get(args, :vcr_path) do @@ -256,6 +265,8 @@ defmodule FarmbotFirmware do transport_args: transport_args, side_effects: side_effects, status: :transport_boot, + reset: reset, + reset_pid: nil, command_queue: [], configuration_queue: [], vcr_fd: vcr_fd @@ -273,6 +284,19 @@ defmodule FarmbotFirmware do GenServer.stop(state.transport_pid) end + def handle_info(:timeout, %{status: :transport_boot, reset_pid: nil} = state) do + case GenServer.start_link(state.reset, state.transport_args, name: state.reset) do + {:ok, pid} -> + Logger.debug("Firmware reset #{state.reset} started. #{inspect(state.transport_args)}") + {:noreply, %{state | reset_pid: pid}} + + error -> + Logger.error("Error starting Firmware Reset: #{inspect(error)}") + Process.send_after(self(), :timeout, @transport_init_error_retry_ms) + {:noreply, state} + end + end + # This will be the first message received right after `init/1` # It should try to open a transport every `transport_init_error_retry_ms` # until success. @@ -357,6 +381,11 @@ defmodule FarmbotFirmware do {:noreply, state} end + def handle_call(:reset, _from, state) do + r = state.reset.reset() + {:reply, r, state} + end + # Closing the transport will purge the buffer of queued commands in both # the `configuration_queue` and in the `command_queue`. def handle_call(:close_transport, _from, %{status: s} = state) when s != :transport_boot do @@ -388,7 +417,12 @@ defmodule FarmbotFirmware do # Add an anon function that transport implementations should call. fw = self() fun = fn {_, _} = code -> GenServer.cast(fw, code) end - transport_args = Keyword.put(args, :handle_gcode, fun) + + transport_args = + state.transport_args + |> Keyword.merge(args) + |> Keyword.merge(handle_gcode: fun) + next_state = %{state | transport: module, transport_args: transport_args} send(self(), :timeout) diff --git a/farmbot_firmware/lib/farmbot_firmware/null_reset.ex b/farmbot_firmware/lib/farmbot_firmware/null_reset.ex new file mode 100644 index 000000000..47f75c479 --- /dev/null +++ b/farmbot_firmware/lib/farmbot_firmware/null_reset.ex @@ -0,0 +1,15 @@ +defmodule FarmbotFirmware.NullReset do + @moduledoc """ + Does nothing in reference to resetting the firmware port + """ + @behaviour FarmbotFirmware.Reset + use GenServer + + @impl FarmbotFirmware.Reset + def reset(), do: :ok + + @impl GenServer + def init(_args) do + {:ok, %{}} + end +end diff --git a/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport/reset.ex b/farmbot_firmware/lib/farmbot_firmware/reset.ex similarity index 76% rename from farmbot_firmware/lib/farmbot_firmware/transports/uart_transport/reset.ex rename to farmbot_firmware/lib/farmbot_firmware/reset.ex index 1a71a199e..db9b16aaf 100644 --- a/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport/reset.ex +++ b/farmbot_firmware/lib/farmbot_firmware/reset.ex @@ -1,4 +1,4 @@ -defmodule FarmbotFirmware.UARTTransport.Reset do +defmodule FarmbotFirmware.Reset do @moduledoc """ Behaviour to reset the UART connection into bootloader mode for firmware upgrades. diff --git a/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex b/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex index cff8d2b62..0c29c0795 100644 --- a/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex +++ b/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex @@ -14,8 +14,9 @@ defmodule FarmbotFirmware.UARTTransport do def init(args) do device = Keyword.fetch!(args, :device) handle_gcode = Keyword.fetch!(args, :handle_gcode) + reset = Keyword.fetch!(args, :reset) {:ok, uart} = UART.start_link() - {:ok, %{uart: uart, device: device, open: false, handle_gcode: handle_gcode}, 0} + {:ok, %{uart: uart, device: device, open: false, handle_gcode: handle_gcode, reset: reset}, 0} end def terminate(_, state) do @@ -26,7 +27,7 @@ defmodule FarmbotFirmware.UARTTransport do opts = [active: true, speed: 115_200, framing: {UART.Framing.Line, separator: "\r\n"}] with :ok <- open(state.uart, state.device, opts), - :ok <- reset(state.uart, state.device, opts) do + :ok <- reset(state) do {:noreply, %{state | open: true}} else {:error, reason} -> @@ -51,8 +52,8 @@ defmodule FarmbotFirmware.UARTTransport do {:reply, r, state} end - def reset(_uart_pid, _device_path, _opts) do - if module = config()[:reset] do + def reset(state) do + if module = state[:reset] do module.reset() else :ok @@ -62,8 +63,4 @@ defmodule FarmbotFirmware.UARTTransport do def open(uart_pid, device_path, opts) do UART.open(uart_pid, device_path, opts) end - - defp config do - Application.get_env(:farmbot_firmware, __MODULE__) - end end diff --git a/farmbot_os/config/config.exs b/farmbot_os/config/config.exs index 8d19e76d1..76bd847f7 100644 --- a/farmbot_os/config/config.exs +++ b/farmbot_os/config/config.exs @@ -66,6 +66,8 @@ config :farmbot, FarmbotOS.Platform.Supervisor, FarmbotOS.Platform.Host.Configurator ] +config :farmbot_firmware, FarmbotFirmware, reset: FarmbotFirmware.NullReset + import_config("lagger.exs") if Mix.target() == :host do diff --git a/farmbot_os/config/target/rpi.exs b/farmbot_os/config/target/rpi.exs index 9844b280e..be53c3c4c 100644 --- a/farmbot_os/config/target/rpi.exs +++ b/farmbot_os/config/target/rpi.exs @@ -2,11 +2,9 @@ use Mix.Config config :farmbot_core, FarmbotCore.FirmwareTTYDetector, expected_names: ["ttyUSB0", "ttyAMA0"] -config :farmbot_firmware, FarmbotFirmware.UARTTransport, - reset: FarmbotOS.Platform.Target.FirmwareReset.GPIO +config :farmbot_firmware, FarmbotFirmware, reset: FarmbotOS.Platform.Target.FirmwareReset.GPIO config :farmbot, FarmbotOS.Init.Supervisor, init_children: [ - FarmbotOS.Platform.Target.RTCWorker, - FarmbotOS.Platform.Target.FirmwareReset.GPIO + FarmbotOS.Platform.Target.RTCWorker ] diff --git a/farmbot_os/config/target/rpi0.exs b/farmbot_os/config/target/rpi0.exs index f2152405c..24bf09ddf 100644 --- a/farmbot_os/config/target/rpi0.exs +++ b/farmbot_os/config/target/rpi0.exs @@ -4,11 +4,9 @@ config :farmbot_core, FarmbotCore.FirmwareTTYDetector, expected_names: ["ttyUSB0 config :farmbot_core, FarmbotCore.FirmwareOpenTask, attempt_threshold: 50 -config :farmbot_firmware, FarmbotFirmware.UARTTransport, - reset: FarmbotOS.Platform.Target.FirmwareReset.GPIO +config :farmbot_firmware, FarmbotFirmware, reset: FarmbotOS.Platform.Target.FirmwareReset.GPIO config :farmbot, FarmbotOS.Init.Supervisor, init_children: [ - FarmbotOS.Platform.Target.RTCWorker, - FarmbotOS.Platform.Target.FirmwareReset.GPIO + FarmbotOS.Platform.Target.RTCWorker ] diff --git a/farmbot_os/config/target/rpi3.exs b/farmbot_os/config/target/rpi3.exs index a003a2cb7..228423c70 100644 --- a/farmbot_os/config/target/rpi3.exs +++ b/farmbot_os/config/target/rpi3.exs @@ -2,8 +2,7 @@ use Mix.Config config :farmbot_core, FarmbotCore.FirmwareTTYDetector, expected_names: ["ttyUSB0", "ttyACM0"] -config :farmbot_firmware, FarmbotFirmware.UARTTransport, - reset: FarmbotOS.Platform.Target.FirmwareReset.NULL +config :farmbot_firmware, FarmbotFirmware, reset: FarmbotOS.Platform.Target.FirmwareReset.NULL config :farmbot, FarmbotOS.Init.Supervisor, init_children: [ diff --git a/farmbot_os/lib/avrdude.ex b/farmbot_os/lib/avrdude.ex index 0149244ba..07eb0d2f0 100644 --- a/farmbot_os/lib/avrdude.ex +++ b/farmbot_os/lib/avrdude.ex @@ -4,6 +4,7 @@ defmodule Avrdude do """ @uart_speed 115_200 + require FarmbotCore.Logger @spec flash(Path.t(), Path.t(), (() -> :ok)) :: {number, any()} def flash(hex_path, tty_path, reset_fun) do @@ -28,7 +29,22 @@ defmodule Avrdude do ] # call the function for resetting the line before executing avrdude. - :ok = reset_fun.() - MuonTrap.cmd("avrdude", args, into: IO.stream(:stdio, :line)) + call_reset_fun(reset_fun) + MuonTrap.cmd("avrdude", args, into: IO.stream(:stdio, :line), stderr_to_stdout: true) end + + def call_reset_fun(reset_fun) do + try do + reset_fun.() + catch + error_type, error -> + FarmbotCore.Logger.error(1, """ + Error calling reset function: #{inspect(reset_fun)} + error type: #{error_type} + error: #{inspect(error)} + """) + end + end + + :ok end diff --git a/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex b/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex index 717030ab7..142828392 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex @@ -13,8 +13,11 @@ defmodule FarmbotOS.SysCalls.FlashFirmware do with {:ok, hex_file} <- find_hex_file(package), {:ok, tty} <- find_tty(), + _ <- FarmbotCore.Logger.debug(3, "found tty: #{tty} for firmware flash"), {:ok, fun} <- find_reset_fun(package), + _ <- FarmbotCore.Logger.debug(3, "closing firmware transport before flash"), :ok <- FarmbotFirmware.close_transport(), + _ <- FarmbotCore.Logger.debug(3, "starting firmware flash"), {_, 0} <- Avrdude.flash(hex_file, tty, fun) do FarmbotCore.Logger.success(2, "Firmware flashed successfully!") @@ -49,11 +52,13 @@ defmodule FarmbotOS.SysCalls.FlashFirmware do end defp find_reset_fun(_) do - config = Application.get_env(:farmbot_firmware, FarmbotFirmware.UARTTransport) + config = Application.get_env(:farmbot_firmware, FarmbotFirmware) if module = config[:reset] do + Logger.error("using reset function: #{inspect(config)}") {:ok, &module.reset/0} else + Logger.error("no reset function is going to be used #{inspect(config)}") {:ok, fn -> :ok end} end end diff --git a/farmbot_os/platform/target/firmware_reset/gpio.ex b/farmbot_os/platform/target/firmware_reset/gpio.ex index a44b62ea4..82657e5e7 100644 --- a/farmbot_os/platform/target/firmware_reset/gpio.ex +++ b/farmbot_os/platform/target/firmware_reset/gpio.ex @@ -2,28 +2,28 @@ defmodule FarmbotOS.Platform.Target.FirmwareReset.GPIO do @moduledoc """ Uses GPIO pin 19 to reset the firmware. """ - @behaviour FarmbotFirmware.UARTTransport.Reset + @behaviour FarmbotFirmware.Reset use GenServer + require Logger - @impl FarmbotFirmware.UARTTransport.Reset - def reset do - GenServer.call(__MODULE__, :reset) - end - - @doc false - def start_link(args) do - GenServer.start_link(__MODULE__, args, name: __MODULE__) + @impl FarmbotFirmware.Reset + def reset(server \\ __MODULE__) do + Logger.debug("calling gpio reset/0") + GenServer.call(server, :reset) end @impl GenServer - def init(_) do + def init(_args) do + Logger.debug("initializing gpio thing for firmware reset") {:ok, gpio} = Circuits.GPIO.open(19, :output) {:ok, %{gpio: gpio}} end @impl GenServer def handle_call(:reset, _from, state) do + Logger.warn("doing firmware gpio reset") + with :ok <- Circuits.GPIO.write(state.gpio, 1), :ok <- Circuits.GPIO.write(state.gpio, 0) do {:reply, :ok, state} diff --git a/farmbot_os/platform/target/firmware_reset/null.ex b/farmbot_os/platform/target/firmware_reset/null.ex deleted file mode 100644 index 7e9692596..000000000 --- a/farmbot_os/platform/target/firmware_reset/null.ex +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotOS.Platform.Target.FirmwareReset.NULL do - @moduledoc """ - Does nothing in reference to resetting the firmware port - """ - @behaviour FarmbotFirmware.UARTTransport.Reset - - @impl FarmbotFirmware.UARTTransport.Reset - def reset, do: :ok -end From 845e69ce7efa31c6c2c4b0f1d3950b96c948ea20 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Fri, 27 Dec 2019 11:45:26 -0600 Subject: [PATCH 46/58] Re-enable set_servo_angle * set_servo_angle works. * Tests for set_servo_angle in FarmbotCeleryScript.Syscalls --- .../lib/farmbot_celery_script/sys_calls.ex | 2 +- .../test/farmbot_celery_script/sys_calls_test.exs | 11 +++++++++++ farmbot_os/lib/farmbot_os/sys_calls.ex | 8 +++----- farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex | 10 ++++++++++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex b/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex index fcd8f05d3..19ea800a0 100644 --- a/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex +++ b/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex @@ -285,7 +285,7 @@ defmodule FarmbotCeleryScript.SysCalls do end def set_servo_angle(sys_calls \\ @sys_calls, pin_num, pin_value) do - number_or_error(sys_calls, :set_servo_angle, [pin_num, pin_value]) + ok_or_error(sys_calls, :set_servo_angle, [pin_num, pin_value]) end def set_pin_io_mode(sys_calls \\ @sys_calls, pin_number, pin_io_mode) do diff --git a/farmbot_celery_script/test/farmbot_celery_script/sys_calls_test.exs b/farmbot_celery_script/test/farmbot_celery_script/sys_calls_test.exs index d0164efba..ca22ba64c 100644 --- a/farmbot_celery_script/test/farmbot_celery_script/sys_calls_test.exs +++ b/farmbot_celery_script/test/farmbot_celery_script/sys_calls_test.exs @@ -133,6 +133,17 @@ defmodule FarmbotCeleryScript.SysCallsTest do assert {:error, "not installed"} == SysCalls.execute_script(TestSysCalls, "take-photo", %{}) end + test "set_servo_angle errors", %{shim: shim} do + :ok = shim_fun_ok(shim) + arg0 = [5, 40] + assert :ok = SysCalls.set_servo_angle(TestSysCalls, "set_servo_angle", arg0) + assert_receive {:set_servo_angle, arg0} + + arg1 = [40, -5] + :ok = shim_fun_error(shim, "boom") + assert {:error, "boom"} == SysCalls.set_servo_angle(TestSysCalls, "set_servo_angle", arg1) + end + test "get_sequence", %{shim: shim} do :ok = shim_fun_ok(shim, %AST{ diff --git a/farmbot_os/lib/farmbot_os/sys_calls.ex b/farmbot_os/lib/farmbot_os/sys_calls.ex index 3874ac1e2..25cd3ed71 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls.ex @@ -84,6 +84,9 @@ defmodule FarmbotOS.SysCalls do @impl true defdelegate toggle_pin(number), to: PinControl + @impl true + defdelegate set_servo_angle(pin, angle), to: PinControl + @impl true defdelegate resource_update(kind, id, params), to: ResourceUpdate @@ -282,11 +285,6 @@ defmodule FarmbotOS.SysCalls do %{x: x, y: y, z: z} end - @impl true - def set_servo_angle(_pin, _angle) do - {:error, "set_servo_angle not yet supported"} - end - @impl true def install_first_party_farmware() do {:error, "install_first_party_farmware not yet supported"} diff --git a/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex b/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex index 5463df76a..cb6e1ac84 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex @@ -42,6 +42,16 @@ defmodule FarmbotOS.SysCalls.PinControl do {:error, "Unknown pin data: #{inspect(pin_number)}"} end + def set_servo_angle(pin, angle) do + case FarmbotFirmware.command({:servo_write, [p: pin, v: angle]}) do + :ok -> + :ok + + {:error, reason} -> + {:error, "Firmware error: #{inspect(reason)}"} + end + end + defp do_toggle_pin(%Peripheral{pin: pin_number} = data, value) do with :ok <- FarmbotFirmware.command({:pin_write, [p: pin_number, v: value, m: 0]}), value when is_number(value) <- do_read_pin(data, 0) do From fe858e282f2568e449349490e0b9937847d133ff Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Fri, 27 Dec 2019 12:17:46 -0600 Subject: [PATCH 47/58] Release v9.0.0-rc8 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 02505d166..829d26543 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc7 \ No newline at end of file +9.0.0-rc8 \ No newline at end of file From 9eace5e87d7d98dc7628e88554b0eb598b468988 Mon Sep 17 00:00:00 2001 From: connor rigby Date: Fri, 27 Dec 2019 10:26:55 -0800 Subject: [PATCH 48/58] Add farmduino 1.5 package --- .../lib/farmbot_core/firmware_side_effects.ex | 4 + .../lib/farmbot_firmware/package_utils.ex | 7 + farmbot_firmware/priv/farmduino_k15.hex | 2857 +++++++++++++++++ .../lib/farmbot_os/sys_calls/dump_info.ex | 1 + 4 files changed, 2869 insertions(+) create mode 100644 farmbot_firmware/priv/farmduino_k15.hex diff --git a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex index 318bbd8ee..93374fc9f 100644 --- a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex +++ b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex @@ -88,6 +88,10 @@ defmodule FarmbotCore.FirmwareSideEffects do [_, _, _, "G"] -> _ = Leds.red(:solid) :ok = BotState.set_firmware_hardware("farmduino_k14") + # Farmduino V15 + [_, _, _, "H"] -> + _ = Leds.red(:solid) + :ok = BotState.set_firmware_hardware("farmduino_k15") # Express V10 [_, _, _, "E"] -> _ = Leds.red(:solid) diff --git a/farmbot_firmware/lib/farmbot_firmware/package_utils.ex b/farmbot_firmware/lib/farmbot_firmware/package_utils.ex index 7747997a2..073bb1552 100644 --- a/farmbot_firmware/lib/farmbot_firmware/package_utils.ex +++ b/farmbot_firmware/lib/farmbot_firmware/package_utils.ex @@ -14,6 +14,10 @@ defmodule FarmbotFirmware.PackageUtils do Application.app_dir(:farmbot_firmware, ["priv", "farmduino_k14.hex"]) |> assert_exists() end + def find_hex_file("farmduino_k15") do + Application.app_dir(:farmbot_firmware, ["priv", "farmduino_k15.hex"]) |> assert_exists() + end + def find_hex_file("express_k10") do Application.app_dir(:farmbot_firmware, ["priv", "express_k10.hex"]) |> assert_exists() end @@ -35,6 +39,9 @@ defmodule FarmbotFirmware.PackageUtils do def package_to_string("farmduino_k14"), do: "Farmduino (Genesis v1.4)" + def package_to_string("farmduino_k15"), + do: "Farmduino (Genesis v1.5)" + def package_to_string("express_k10"), do: "Farmduino (Express v1.0)" diff --git a/farmbot_firmware/priv/farmduino_k15.hex b/farmbot_firmware/priv/farmduino_k15.hex new file mode 100644 index 000000000..d5d2d5c69 --- /dev/null +++ b/farmbot_firmware/priv/farmduino_k15.hex @@ -0,0 +1,2857 @@ +:10000000A2C20000D1C20000CFC20000CDC20000D9 +:10001000CBC20000C9C20000C7C20000C5C20000B8 +:10002000C3C20000C1C20000BFC20000BDC20000C8 +:10003000BBC20000B9C20000B7C200000C94B429D2 +:10004000B3C200000C943E09AFC20000ADC2000074 +:100050000C941D2AA9C20000A7C2000034C70000EA +:10006000A3C2000053C5000028C500009DC20000C7 +:100070009BC2000099C2000097C2000095C2000018 +:100080000C94110991C200008FC200008DC20000C3 +:100090008BC2000089C2000087C2000085C2000038 +:1000A00083C2000081C200000C94E4087DC20000FD +:1000B0007BC2000079C2000077C200000C94B70830 +:1000C00073C2000071C200006FC200006DC2000068 +:1000D0006BC2000069C2000067C2000065C2000078 +:1000E00063C200002504280417041B0421045F04D4 +:1000F0002C04300436043A043E04440448044C04FE +:100100005F04520456045A048C1991199619A019C7 +:10011000AA19231AB419BC19C419CE19D819E2198D +:10012000F119FB19231A051A0F1A191A421B4F1B32 +:10013000581B611B6E1B771B611F611F611F611FB5 +:10014000611F841B911B9E1B611FAB1BB41BBD1B3E +:10015000CA1BD31BDC1BE51BEE1BF71B611F001C1E +:10016000091C121C611F611F611F1B1C241C2D1CFC +:10017000611F611F361C431C611F611F611F501CE2 +:100180005D1C6A1C611F771C801C891C611F611F1C +:10019000611F921C9B1CA41C611FB11CBE1CCB1CAC +:1001A000611F611F611FD81CE51CF21C611FFF1C31 +:1001B0000C1D191D611F611F611F261D331D401D70 +:1001C000611F4D1D561D5F1D611F611F611F831D36 +:1001D000901D9D1D611FAA1DB71DC41D611F611FBC +:1001E000611F611F611F611F611F611F611F611F0F +:1001F000611F611F611FD11DDA1DE31D611FEC1D11 +:10020000F51DFE1D611F611F611F071E141E211EAB +:10021000611F2E1E3B1E481E611F611F611F551E60 +:10022000621E6F1E611F7C1E851E8E1E611F611F58 +:10023000611F971EA01EA91E611F611F611F611F04 +:10024000611F611F611F611F611F611F611F681DA9 +:10025000711D7A1D611F611F611F611F611F611F79 +:10026000611F611F611F611F611F611F611F611F8E +:10027000611F611F611F611F611F611F611F611F7E +:10028000611F611F611F611F611F611F611F611F6E +:10029000611F611F611F611F611F611F611F611F5E +:1002A000611F611F611F611F611F611F611F611F4E +:1002B000611F611F611F611F611F611F611FB21EEE +:1002C000BB1EC81E611FD51EDE1EEB1E611F611FF7 +:1002D000611FF81E011F0E1F611F1B1F241F311FEE +:1002E000611F611F611F3E1F471F541F4E414E4932 +:1002F0004E495459494E46CDCCCC3D0AD7233C17E4 +:10030000B7D13877CC2B329595E6241FB14F0A0030 +:100310000020410000C84200401C4620BCBE4CCA20 +:100320001B0E5AAEC59D7400407A10F35A00A0729D +:100330004E18090010A5D4E80000E8764817000020 +:10034000E40B54020000CA9A3B000000E1F50500EE +:100350000080969800000040420F000000A0860137 +:10036000000000102700000000E803000000006407 +:1003700000000000000A0000000000010000000072 +:10038000002C76D888DC674F0823DFC1DFAE59E147 +:10039000B1B796E5E3E453C63AE651997696E8E6B6 +:1003A000C28426EB898C9B62ED407C6FFCEFBC9C89 +:1003B0009F40F2BAA56FA5F490055A2AF75C936B9B +:1003C0006CF9676DC11BFCE0E40D47FEF520E6B556 +:1003D00000D0ED902E0300943577050080841E0830 +:1003E0000000204E0A000000C80C333333330F984E +:1003F0006E12831141EF8D2114893BE65516CFFE15 +:10040000E6DB18D1844B381BF77C1D901DA4BBE4A0 +:1004100024203284725E228100C9F124ECA1E53DE2 +:100420002700000A0B02090C0D0E08070304010047 +:1004300000000000000000000000000000000000BC +:100440000000000000000000000000000012111079 +:10045000000000000000000000000000000000009C +:100460000000000000000000002100240027002AF6 +:10047000002D003000330001010000040107010AD3 +:100480000100002200250028002B002E003100343E +:100490000002010000050108010B010000200023FB +:1004A00000260029002C002F00320000010000036C +:1004B00001060109010505050507050808080802E8 +:1004C0000202020A0A0808040404040101010101ED +:1004D0000101010303030303030303040707070CDC +:1004E0000C0C0C0C0C0C0C02020202060606060692 +:1004F0000606060B0B0B0B0B0B0B0B01021020203F +:100500000808102040102040800201020108040267 +:1005100001010204081020408080402010080402DD +:100520000180040201804020100804020108040236 +:10053000010102040810204080010204081020403C +:100540008000584C534C11241FBECFEFD1E2DEBFC8 +:10055000CDBF00E00CBF17E0A0E0B2E0EAE2FDEAA8 +:1005600000E00BBF02C007900D92AE34B107D9F77F +:100570002EE0AEE4B7E001C01D92AD3EB207E1F758 +:1005800012E0C2EAD2E000E006C021970109802F04 +:10059000FE010E947755C13AD10780E00807A9F70C +:1005A0000E9458420C9484562BCDCF92DF92EF924A +:1005B000FF920F931F93CF93DF936C017A018B010E +:1005C000C0E0D0E0CE15DF0589F0D8016D918D0136 +:1005D000D601ED91FC910190F081E02DC6011995B5 +:1005E000892B11F47E0102C02196ECCFC701DF9167 +:1005F000CF911F910F91FF90EF90DF90CF900895D2 +:10060000089580E090E00895FC01538D448D252FDE +:1006100030E0842F90E0821B930B541710F0CF969C +:10062000089501970895FC01918D828D981761F0CE +:10063000828DDF01A80FB11D5D968C91928D9F5F19 +:100640009F73928F90E008958FEF9FEF0895FC01C4 +:10065000918D828D981731F0828DE80FF11D858D77 +:1006600090E008958FEF9FEF0895FC01918D228D0A +:10067000892F90E0805C9F4F821B91098F7399278F +:1006800008958FEB9BE0F1DF21E0892B09F420E056 +:10069000822F0895FC01848DDF01A80FB11DA35A9C +:1006A000BF4F2C91848D90E001968F739927848F92 +:1006B000A689B7892C93A089B1898C9180648C9389 +:1006C000938D848D981306C00288F389E02D808174 +:1006D0008F7D80830895EF92FF920F931F93CF93A6 +:1006E000DF93EC0181E0888F9B8D8C8D981305C082 +:1006F000E889F989808185FD23C0F62E0B8D10E0F5 +:100700000F5F1F4F0F731127E02E8C8DE8120BC067 +:100710000FB607FCFACFE889F989808185FFF5CF0C +:10072000CE01B8DFF2CF8B8DFE01E80FF11DE35A49 +:10073000FF4FF0820B8FEA89FB898081806207C0BE +:10074000EE89FF896083E889F989808180648083EC +:1007500081E090E0DF91CF911F910F91FF90EF909A +:100760000895CF93DF93EC01888D8823C1F0EA8947 +:10077000FB89808185FD05C0A889B9898C9186FD9A +:100780000EC00FB607FCF5CF808185FFF2CFA88998 +:10079000B9898C9185FFEDCFCE017CDFE8CFDF9169 +:1007A000CF91089580E090E0892B19F06ADF8111E4 +:1007B00025C080E090E0892B41F080E090E0892B1B +:1007C00021F00E94000081111CC080E090E0892B84 +:1007D00041F080E090E0892B21F00E94000081111F +:1007E00013C080E090E0892BA1F080E090E0892B9D +:1007F00081F00E94000081110AC008950E9400004B +:10080000D8CF0E940000E1CF0E940000EACF0C94F4 +:100810000000089590E0FC013197E231F10508F005 +:100820004EC08827EE58FF4F8F4F0C94775580911C +:1008300080008F7703C0809180008F7D809380003F +:10084000089580918000877FF9CF84B58F7702C0AB +:1008500084B58F7D84BD08958091B0008F7703C0EB +:100860008091B0008F7D8093B000089580919000BA +:100870008F7707C0809190008F7D03C0809190009A +:10088000877F8093900008958091A0008F7707C0A4 +:100890008091A0008F7D03C08091A000877F80930E +:1008A000A0000895809120018F7707C080912001DA +:1008B0008F7D03C080912001877F80932001089560 +:1008C0003FB7F8948091970B9091980BA091990B5A +:1008D000B0919A0B26B5A89B05C02F3F19F0019641 +:1008E000A11DB11D3FBFBA2FA92F982F8827820FB6 +:1008F000911DA11DB11DBC01CD0142E0660F771F06 +:10090000881F991F4A95D1F708950E9467560F9343 +:100910001F93CF93DF93EC0188819981009729F091 +:100920002A813B812617370788F48B016F5F7F4F41 +:100930000E947F55009761F0998388831B830A8307 +:100940002C813D81232B11F4FC01108281E001C038 +:1009500080E0DF91CF911F910F910895EF92FF9268 +:100960000F931F93CF93DF93FC0124813581611591 +:10097000710511F480E018C041155105A1F07B010B +:10098000EC018A01020F131FB801C1DF882391F324 +:10099000288139818C819D81B701820F931F0E942C +:1009A0007D561D830C8381E0DF91CF911F910F91C4 +:1009B000FF90EF900895EF92FF920F931F93CF93C4 +:1009C000DF93CDB7DEB764970FB6F894DEBF0FBEE6 +:1009D000CDBF7C01CB01BA018E010F5F1F4F22E01A +:1009E00044E00E94014DBC01FC0101900020E9F7A8 +:1009F0003197AF01481B590BC701B0DF64960FB6A2 +:100A0000F894DEBF0FBECDBFDF91CF911F910F9144 +:100A1000FF90EF9008956115710549F0FB01019079 +:100A20000020E9F73197AF01461B570B97CF80E0C5 +:100A30000895FB0144815581608171818FCFEF92D0 +:100A4000FF920F931F93CF93DF93EC017B018A01F9 +:100A5000BA015DDF2881398181110DC02115310571 +:100A600019F0C9010E94B54D198218821D821C829D +:100A70001B821A8206C01D830C83B701C9010E9424 +:100A80007D56CE01DF91CF911F910F91FF90EF9096 +:100A90000895FC0111821082138212821582148241 +:100AA0006115710549F0FB0101900020E9F73197CC +:100AB000AF01461B570BC3CF08951F920F920FB67D +:100AC0000F9211240BB60F922F933F934F935F9386 +:100AD0006F937F938F939F93AF93BF93EF93FF9306 +:100AE0008FEB9BE0D7DDFF91EF91BF91AF919F918D +:100AF0008F917F916F915F914F913F912F910F90C7 +:100B00000BBE0F900FBE0F901F9018951F920F9263 +:100B10000FB60F9211240BB60F922F938F939F93C2 +:100B2000EF93FF93E091CF0BF091D00B8081E09198 +:100B3000D50BF091D60B82FD12C090818091D80B1D +:100B40008F5F8F732091D90B821751F0E091D80BF2 +:100B5000F0E0E154F44F958F8093D80B01C0808171 +:100B6000FF91EF919F918F912F910F900BBE0F905E +:100B70000FBE0F901F901895CF93DF93282F30E072 +:100B8000F901EF5DFB4F8491F901E550FB4FD491E2 +:100B9000F901EB54FB4FC491CC2389F081113ADE6B +:100BA000EC2FF0E0EE0FFF1FE556FB4FA591B4913F +:100BB000EC91ED2381E090E021F480E002C080E040 +:100BC00090E0DF91CF9108951F93CF93DF93282F6B +:100BD00030E0F901EF5DFB4F8491F901E550FB4FE7 +:100BE000D491F901EB54FB4FC491CC23C1F0162FE3 +:100BF000811110DEEC2FF0E0EE0FFF1FEF57FB4FDF +:100C0000A591B4918FB7F894111105C09C91ED2F67 +:100C1000E095E92302C0EC91ED2BEC938FBFDF91BF +:100C2000CF911F910895CF92DF92EF92FF920F9391 +:100C30001F93CF93DF936C018B017A01EC01C257B4 +:100C4000D44F888187FF04C0FB011182108224C029 +:100C50008CE08C9D90018D9D300D11248881A9011F +:100C6000480F511D87FD5A958091D80E90E0481786 +:100C7000590794F48881A901480F511D87FD5A95A1 +:100C8000CA01FA01EE0FFF1F8E0F9F1FFC01E85BE8 +:100C9000F14F808186FD19C088818F5F88838CE049 +:100CA0008C9D90018D9D300D11248881A901480FE4 +:100CB000511D87FD5A958091D80E90E0481759072D +:100CC000B4F488818C303CF112C08881280F311D2A +:100CD00087FD3A95F901EE0FFF1F2E0F3F1FF90117 +:100CE000E85BF14F808160E08F736EDFD5CFF80154 +:100CF00080819181049680349C4918F480E49CE9B9 +:100D000004C0F801808191810496F701918380836A +:100D10008FEF888344C0F801408151818881B901F7 +:100D2000680F711D87FD7A95CB01FB01EE0FFF1F48 +:100D30008E0F9F1FFC01E85BF14F81819281840F30 +:100D4000951FF701918380838881A901480F511D68 +:100D500087FD5A95CA01FA01EE0FFF1F8E0F9F1FE4 +:100D6000FC01E85BF14F808186FF19C08881280F64 +:100D7000311D87FD3A95F901EE0FFF1F2E0F3F1F22 +:100D8000F901E85BF14F808161E08F73DF91CF91D2 +:100D90001F910F91FF90EF90DF90CF9015CFDF91D3 +:100DA000CF911F910F91FF90EF90DF90CF9008951A +:100DB000CF93DF9390E0FC01E550FB4F2491FC01C1 +:100DC000EB54FB4F8491882361F190E0880F991FC9 +:100DD000FC01E959FB4FC591D491FC01EF57FB4F42 +:100DE000A591B491611109C09FB7F89488812095AD +:100DF00082238883EC912E230BC0623061F49FB76D +:100E0000F8943881822F809583238883EC912E2B50 +:100E10002C939FBF06C08FB7F894E8812E2B2883B0 +:100E20008FBFDF91CF9108958230910538F0880F00 +:100E3000991F880F991F05970197F1F708958F92D1 +:100E40009F92AF92BF92CF92DF92EF92FF926B018F +:100E50007C0136DD4B015C01C114D104E104F104D5 +:100E6000E9F02EDDDC01CB0188199909AA09BB093B +:100E7000883E9340A105B10578F321E0C21AD1085C +:100E8000E108F10888EE880E83E0981EA11CB11CD1 +:100E9000C114D104E104F10421F7DECFFF90EF90FB +:100EA000DF90CF90BF90AF909F908F9008952FB715 +:100EB000F8946091930B7091940B8091950B9091A5 +:100EC000960B2FBF08951F920F920FB60F92112409 +:100ED0002F933F938F939F93AF93BF938091930BE7 +:100EE0009091940BA091950BB091960B3091920B31 +:100EF00023E0230F2D3720F40196A11DB11D05C05D +:100F000026E8230F0296A11DB11D2093920B80931A +:100F1000930B9093940BA093950BB093960B8091A9 +:100F2000970B9091980BA091990BB0919A0B019609 +:100F3000A11DB11D8093970B9093980BA093990BD3 +:100F4000B0939A0BBF91AF919F918F913F912F9149 +:100F50000F900FBE0F901F901895CF92DF92EF92D7 +:100F6000FF92CF93DF93EC01603282E078070CF0C0 +:100F70003DC077FD06C0653B71052CF064EB70E069 +:100F800002C060E070E0898128E830E06901C81A99 +:100F9000D10887FDD394CC0CDD1CCC0CDD1C0D2CB2 +:100FA000000CEE08FF088A8128E532E0281B310991 +:100FB00087FD3395220F331F220F331FC901330FD3 +:100FC000AA0BBB0B9C01AD012C193D094E095F0911 +:100FD000DB010E941F5424EB30E040E050E00E940F +:100FE000F953C20ED31EE41EF51EB601888180336C +:100FF00080F5998148E850E0491B510997FD5395C8 +:10100000440F551F440F551F6417750784F09A81CC +:1010100028E532E0291B310997FD3395220F331F54 +:10102000220F331FAB01261737070CF4A9014250DA +:101030005109440F551F2FB7F89490E0FC01EE0FB3 +:10104000FF1F8E0F9F1FFC01E85BF14F528341830E +:101050002FBFDF91CF91FF90EF90DF90CF90089559 +:101060001F93CF93DF93EC01162F8881803308F014 +:101070004DC061E0812F9CDE8881E82FF0E09F0168 +:10108000220F331FE20FF31FE85BF14F1F739081B4 +:10109000907C192B108319821A826CE00E946B5588 +:1010A0009CE0899FB001112440E050E09A01260F96 +:1010B000371FF901EE0FFF1F2E0F3F1FF901E85BED +:1010C000F14F908196FD16C04F5F5F4F4C30510538 +:1010D00069F7813001F51092800082E080938100F1 +:1010E0001092850010928400B19A80916F00826006 +:1010F00080936F00E881F0E0CF01880F991FE80F1F +:10110000F91FE85BF14F8081806480838881DF91E3 +:10111000CF911F910895823061F4109290008093D6 +:101120009100109295001092940088BB80937100FA +:10113000E1CF833069F41092A00082E08093A10097 +:101140001092A5001092A40089BB80937200D2CFA8 +:101150008111D0CF1092200182E080932101109262 +:101160002501109224018ABB80937300C3CF1F9284 +:101170000F920FB60F9211240BB60F922F933F933D +:101180004F935F936F937F938F939F93AF93BF938F +:10119000EF93FF9348E251E064E271E080E090E079 +:1011A00042DDFF91EF91BF91AF919F918F917F9120 +:1011B0006F915F914F913F912F910F900BBE0F90C8 +:1011C0000FBE0F901F9018951F920F920FB60F929F +:1011D00011240BB60F922F933F934F935F936F930E +:1011E0007F938F939F93AF93BF93EF93FF9348EABF +:1011F00050E064EA70E083E090E015DDFF91EF914C +:10120000BF91AF919F918F917F916F915F914F911E +:101210003F912F910F900BBE0F900FBE0F901F901C +:1012200018951F920F920FB60F9211240BB60F92C2 +:101230002F933F934F935F936F937F938F939F93DE +:10124000AF93BF93EF93FF9348E950E064E970E0F8 +:1012500082E090E0E8DCFF91EF91BF91AF919F9128 +:101260008F917F916F915F914F913F912F910F904F +:101270000BBE0F900FBE0F901F9018951F920F92EC +:101280000FB60F9211240BB60F922F933F934F93EB +:101290005F936F937F938F939F93AF93BF93EF93DE +:1012A000FF9348E850E064E870E081E090E0BBDC48 +:1012B000FF91EF91BF91AF919F918F917F916F912E +:1012C0005F914F913F912F910F900BBE0F900FBEEA +:1012D0000F901F901895CF92DF92EF92FF920F938D +:1012E0001F93CF93DF938C01D62EEA01FC01E858BF +:1012F000FF4F8081E62EF12C882309F45DC060E069 +:10130000F801828561DC8D2D0E942E41F8018483D5 +:10131000EE0CEF2CEE1CFF08EF2869F08B810E9489 +:101320002E418A810E942E4189810E942E4188810E +:101330000E942E41D9C00E9473410E94734161E016 +:10134000F801828541DC60E0F80182853DDC8D2D6D +:101350000E942E4180E00E942E4190E0A0E0B0E08B +:10136000BA2FA92F982F882788839983AA83BB83B4 +:1013700080E00E942E41488159816A817B81482BFF +:10138000762F652F542F4427488359836A837B83A4 +:1013900080E00E942E41488159816A817B81482BDF +:1013A000762F652F542F4427488359836A837B8384 +:1013B00080E00E942E418FC0CFB6F89480918D0BB3 +:1013C000811123C0EAEEF4E08491E0E3F5E094912A +:1013D000E82FF0E0EE0FFF1FE959FB4FA591B49104 +:1013E000EC91E92319F461E085E3EEDB61E085E34C +:1013F000DFDC8CB580618CBD8CB580648CBD61E018 +:1014000084E3D6DC61E083E3D3DC80918D0B8F5FD6 +:1014100080938D0BCFBE8DE58CBD81E08DBD60E0EE +:10142000F8018285D1DB8D2D0E94AD29F8018483DE +:10143000EE0CEF2CEE1CFF08EF2869F08B810E9468 +:10144000AD298A810E94AD2989810E94AD298881B8 +:101450000E94AD2949C00E9411410E94114161E0E2 +:10146000F8018285B1DB60E0F8018285ADDB8D2D6E +:101470000E94AD2980E00E94AD2990E0A0E0B0E09C +:10148000BA2FA92F982F882788839983AA83BB8393 +:1014900080E00E94AD29488159816A817B81482B77 +:1014A000762F652F542F4427488359836A837B8383 +:1014B00080E00E94AD29488159816A817B81482B57 +:1014C000762F652F542F4427488359836A837B8363 +:1014D00080E00E94AD29488159816A817B81482B37 +:1014E000488359836A837B8361E0F8018285DF91B9 +:1014F000CF911F910F91FF90EF90DF90CF9064CB31 +:101500000F931F93462F50E060E070E024E0440FFB +:10151000551F661F771F2A95D1F7407155276627FB +:101520007727FC0106851785208931890F7E402B9E +:10153000512B622B732B46875787608B718BAC01C5 +:10154000425F5F4F60E81F910F91C5CE2F923F928F +:101550004F925F926F927F928F929F92AF92BF92C3 +:10156000CF92DF92EF92FF920F931F93CF93DF936F +:10157000CDB7DEB7E8970FB6F894DEBF0FBECDBF8C +:101580001C012A013B010F83188729873A8760963F +:101590000EAD1FAD6097FC01ED58FD4F608171816C +:1015A000828193810E94CD529B01AC01C301B201A3 +:1015B0000E942C530E942355698B7A8B8B8B9C8BBA +:1015C000F101E958FD4F60817181828193810E9410 +:1015D000CD529B01AC016F81788589859A850E94E7 +:1015E0002C530E9423556F8B788F898F9A8FF1012E +:1015F000E558FD4F60817181828193810E94CD52B7 +:101600009B01AC01C701B6010E942C530E942355D7 +:101610006B8F7C8F8D8F9E8F4ADC6D877E878F8747 +:10162000988BF101EC50FE4F11821082329611829C +:1016300010823E96A114B10461F0C501A0E0B0E0B3 +:10164000408151816281738184179507A607B7078E +:1016500014F0A080B180F101E85FFD4F8114910486 +:1016600061F0C401A0E0B0E04081518162817381EA +:1016700084179507A607B70714F080809180F101C1 +:10168000E45FFD4F0115110561F0C801A0E0B0E075 +:10169000408151816281738184179507A607B7073E +:1016A00014F0008111819101205F3F4F3E8B2D8B03 +:1016B000C501A0E0B0E0F10186A797A7A0ABB1AB50 +:1016C0002101F0E94F0E511CA12CB12CD2015E96E4 +:1016D0008D929D92AD92BC9291973101B0EF6B1AB1 +:1016E000BEEF7B0A20E030E0F301068F178F20A3C6 +:1016F00031A30E94B2260E94B2260E94B2260E9406 +:10170000B226409154075091550760915607709149 +:1017100057074DAB5EAB6FAB78AF0E94B22680919E +:10172000580790915907A0915A07B0915B078F8392 +:101730009887A987BA870E94B22680905C0790900C +:101740005D07A0905E07B0905F07F101E158FD4F83 +:1017500010821182128213823496108211821282B8 +:10176000138234961082118212821382349611826F +:101770001082329611821082329611821082329635 +:101780004DA95EA96FA978AD4083518362837383AD +:1017900034968F819885A985BA8580839183A283A9 +:1017A000B383349680829182A282B3826196EFAC39 +:1017B000619709891A892B893C898D899E890E94A4 +:1017C0002C2B8823F9F085E393E00E94CA3F88EB35 +:1017D00095E00E94CA3FF101E85AFF4F6081718194 +:1017E00082819381E55EFD4F208131814281538169 +:1017F0000E94F953CA01B9010E9416400E94B22604 +:101800000E94BC256296EFAC62970F89188D298DD6 +:101810003A8D4F81588569857A85C2010E942C2BAB +:101820008823F9F081E393E00E94CA3F88EC95E0B9 +:101830000E94CA3FF101E852FF4F608171818281AD +:101840009381E156FE4F20813181428153810E9474 +:10185000F953CA01B9010E9416400E94B2260E94A3 +:10186000BC256396EFAC63970B8D1C8D2D8D3E8D43 +:10187000B501A401C3010E942C2B8823F9F08DE24D +:1018800093E00E94CA3F88ED95E00E94CA3FF101B3 +:10189000E85AFE4F6081718182819381ED5DFE4F38 +:1018A00020813181428153810E94F953CA01B901DB +:1018B0000E9416400E94B2260E94BC25D101559676 +:1018C0001C92F101EB56FF4F1082E058FF4F10823F +:1018D000C1010E947D38C1010E9481388D899E8995 +:1018E0000E948C2FC2010E948C2FC3010E948C2F5A +:1018F000F101E550FE4FFAA3E9A381E090E0918366 +:1019000080837101F3E0EF1AFEEFFF0AD7018D9398 +:101910009C93810101501E4FF8019183808341E027 +:1019200050E06D897E89C1010E940A17D7014D914F +:101930005C91B201C1010E940A17F80140815181F6 +:10194000B301C1010E940A1711E0F101E052FD4FFD +:1019500010838D899E890E94172BC2010E94172B2C +:10196000C3010E94172B64E670E080E090E067DA24 +:10197000C10188509E4FDC011C9311961C93A1015C +:1019800046505E4FFA0110836196FFAD6197F111E9 +:101990000FC062962FAD6297211105C063963FADCF +:1019A0006397332339F191012B583F4FF90110828E +:1019B0006296FFAD6297F11105C091012B503F4F28 +:1019C000F90110826396FFAD6397F11105C0910193 +:1019D0002B583E4FF901108261962FAD6197FC01A3 +:1019E000208362963FAD62973C936396EFAD639719 +:1019F000DA01EC938D899E890E94D82CC2010E9445 +:101A0000D82CC3010E94D82C8D899E890E942E2C2F +:101A1000C2010E942E2CC3010E942E2C0E94B226CD +:101A2000DC011C968C91898B18861F82F101E8508D +:101A3000FE4FF88FEF8B910127503E4F3C8F2B8F3D +:101A4000A10146505E4F58A34F8FC10185509E4F54 +:101A50009EA38DA3D101A350BE4FB8A7AFA33796C5 +:101A6000FAA7E9A7215831403CA32BA34F535F4F5E +:101A70005CA74BA78C549F4F9EA78DA7AD52BF4F1D +:101A8000B8ABAFA7E256FF4FFAABE9AB275E3D4FCD +:101A90003CAB2BABEF89F88D808181110BC0AB8DF6 +:101AA000BC8D8C91811106C0EF8DF8A180818823B7 +:101AB00009F45AC3F989F11157C3D10150968D9198 +:101AC0009C9151978C010E591F4FF8011082118281 +:101AD00012821382A80163E7FEDBD801CD90DD906E +:101AE000ED90FC90C114D10499F084E294E00E943E +:101AF000CA3F8DE994E00E94CA3FC701B60188271A +:101B000099274AE00E94CB3F8CE993E00E94CA3FAC +:101B10004DA15EA16D897E89C1010E9463174FA10D +:101B200058A5B201C1010E94631749A55AA5B30186 +:101B3000C1010E9463178D899E890E94982CC20161 +:101B40000E94982CC3010E94982CEBA1FCA18081DB +:101B50008823E1F08D899E890E94D82C8BA49CA4B7 +:101B6000ADA4BEA4CFA4D8A8E9A8FAA80BA91CA923 +:101B7000910121583D4FA10140575E4F6D897E89EB +:101B8000C1010E942B36ABA1BCA11C92F101E8500F +:101B9000FF4FFC87EB878081882339F1C2010E94C7 +:101BA000D82C4101F4E48F1AFDEF9F0A51012DE476 +:101BB000A21A2DEFB20A61013EE2C31A3DEFD30A29 +:101BC00071014FE5E41A4DEFF40A81010B561D4FE8 +:101BD00091012D573D4FA10142555E4FB201C10108 +:101BE0000E942B36AB85BC851C92F101E858FE4F54 +:101BF000FC87EB878081882339F1C3010E94D82CB0 +:101C00004101F3E48F1AFDEF9F0A510129E4A21A62 +:101C10002DEFB20A61013CE2C31A3DEFD30A710114 +:101C20004BE5E41A4DEFF40A810107561D4F91016F +:101C300029573D4FA10144535E4FB301C1010E949A +:101C40002B36AB85BC851C9281010B581F4FF801C8 +:101C500080818823C1F1EC5CFD4F60817181072E8A +:101C6000000C880B990B0E94CD529B01AC01F10135 +:101C7000E158FD4F60817181828193810E945455AA +:101C800018160CF5D8011C9264E274E0810106512B +:101C90001E4FC8010E940B0567EE74E0C8010E9448 +:101CA0000B056CE973E0C8010E940B056196BFAD9E +:101CB0006197BB2309F450C3F101EC5AFF4F108226 +:101CC00011821282138281010B501F4FD8018C9117 +:101CD0008823C9F1F101E555FD4F60817181072E1F +:101CE000000C880B990B0E94CD529B01AC01F101B5 +:101CF000ED57FD4F60817181828193810E9454551F +:101D000018160CF5D8011C9264E274E081010651AA +:101D10001E4FC8010E940B056FE075E0C8010E94CC +:101D20000B056CE973E0C8010E940B056296BFAD1C +:101D30006297BB2309F415C3F101EC52FF4F1082E7 +:101D400011821282138281010B581E4FF80180818B +:101D50008823C1F1E85CFE4F60817181072E000C81 +:101D6000880B990B0E94CD529B01AC01F101E95700 +:101D7000FD4F60817181828193810E9454551816B4 +:101D80000CF5D8011C9264E274E0810106511E4FEB +:101D9000C8010E940B0567E375E0C8010E940B05AE +:101DA0006CE973E0C8010E940B056396BFAD6397B1 +:101DB000BB2309F4DBC2F101EC5AFE4F1082118201 +:101DC0001282138260E08D899E890E94A72B88234E +:101DD00039F0F101EC5AFF4F108211821282138206 +:101DE00060E0C2010E94A72B882339F0F101EC5278 +:101DF000FF4F108211821282138260E0C3010E94A1 +:101E0000A72B882339F0F101EC5AFE4F1082118282 +:101E100012821382F101EB58FF4F8081AF89B88D98 +:101E20008C93E058FF4F8081EB8DFC8D8083F10116 +:101E3000EB58FE4F8081AF8DB8A18C93E152F140F9 +:101E40004081518162817381E058FF4F8080918091 +:101E5000A280B380E058FF4FC080D180E280F38041 +:101E60004DAB5EAB6FAB78AF0E94B2264DA95EA9B9 +:101E70006FA978AD40935407509355076093560768 +:101E8000709357070E94B226809258079092590784 +:101E9000A0925A07B0925B070E94B226C0925C07DC +:101EA000D0925D07E0925E07F0925F07C1010E9449 +:101EB0007D38EF89F88D8081882309F44AC00E941B +:101EC00057072D853E854F8558896217730784070C +:101ED000950760F40E9457072D853E854F855889E8 +:101EE0006217730784079507A0F51EC00E94570765 +:101EF0006B017C012D853E854F855889C21AD30A16 +:101F0000E40AF50AF101E959FD4F2081318142814E +:101F10005381A8EEB3E00E9415546C157D058E0523 +:101F20009F0508F428C2D6CF0E9457076B017C0199 +:101F3000F101E959FD4F2081318142815381A8EEA1 +:101F4000B3E00E9415546C157D058E059F0508F4BD +:101F500012C2AB8DBC8D8C91882309F44AC00E94BB +:101F600057072D853E854F8558896217730784076B +:101F7000950760F40E9457072D853E854F85588947 +:101F80006217730784079507A0F51EC00E945707C4 +:101F90006B017C012D853E854F855889C21AD30A75 +:101FA000E40AF50AF101E559FD4F208131814281B2 +:101FB0005381A8EEB3E00E9415546C157D058E0583 +:101FC0009F0508F4EFC1D6CF0E9457076B017C0133 +:101FD000F101E559FD4F2081318142815381A8EE05 +:101FE000B3E00E9415546C157D058E059F0508F41D +:101FF000D9C1AF8DB8A18C91882309F44AC00E9441 +:1020000057072D853E854F855889621773078407CA +:10201000950760F40E9457072D853E854F855889A6 +:102020006217730784079507A0F51EC00E94570723 +:102030006B017C012D853E854F855889C21AD30AD4 +:10204000E40AF50AF101E159FD4F20813181428115 +:102050005381A8EEB3E00E9415546C157D058E05E2 +:102060009F0508F4B6C1D6CF0E9457076B017C01CB +:10207000F101E159FD4F2081318142815381A8EE68 +:10208000B3E00E9415546C157D058E059F0508F47C +:10209000A0C18FEB9BE00E943503181619068CF542 +:1020A0008FEB9BE00E9413038F7D8534910549F5EA +:1020B00069EA74E0C10186519E4F0E940B0582E6D9 +:1020C00093E00E94CA3F0E94B2260E94BC25F10103 +:1020D000EB58FF4F1082E058FF4F1082E058FF4F3F +:1020E0001082AF89B88D1C92EB8DFC8D1082AF8D64 +:1020F000B8A11C92B1E0B98BE1E0F0E0F887EF8382 +:1021000004C02F813885232B81F06EEB74E0C10170 +:1021100086519E4F0E940B05AF89B88D1C92EB8DA6 +:10212000FC8D1082AF8DB8A11C92C1010E94803F2E +:10213000F101EA50FE4F8081918101969183808365 +:102140008D3291400CF4A6CCD101A251BE4F8D919D +:102150009C911197892B09F09DCC14968D919C919F +:10216000892B09F44DC196CC810102511E4FD80133 +:102170008D919C91892B21F0C1010E94803FF7CF66 +:102180008EEC94E00E94CA3F6196BFAD6197BB237D +:1021900011F1EF81F885EF2BF1F4F989F11142C0CB +:1021A0008DE193E00E94CA3F0E94B2260E94BC25A6 +:1021B00062962FAD6297222381F189E193E00E941C +:1021C000CA3F0E94B2260E94BC2563963FAD63972A +:1021D00031111AC027C062964FAD6297442341F077 +:1021E0008F819885892B21F4998991111BC0E5CFA6 +:1021F0006396AFAD6397AA23A9F0EF81F885EF2B23 +:1022000089F4F989F1110EC085E193E00E94CA3F7B +:102210000E94B2260E94BC2505C063969FAD6397BD +:102220009111F2CF85E090E0A9A1BAA18D939C9382 +:10223000910123503E4F3E872D87D9018D939C936A +:10224000810101501E4FF8019183808345E050E0E9 +:102250006D897E89C101DED5AD85BE854D915C91CC +:10226000B201C101D7D5F80140815181B301C1014B +:10227000D1D5C1010E948538F101EC5AFF4F408150 +:10228000518162817381E058FF4FC080D180E2802C +:10229000F380E058FF4F80809180A280B3804DABE7 +:1022A0005EAB6FAB78AF0E94B2264DA95EA96FA955 +:1022B00078AD409354075093550760935607709339 +:1022C00057070E94B226C0925807D0925907E09251 +:1022D0005A07F0925B070E94B22680925C079092A8 +:1022E0005D07A0925E07B0925F07C1010E947D3832 +:1022F000C1010E9481380E94B2260E940F26C101AE +:102300001AD6A9A1BAA11D921C92ED85FE85118253 +:102310001082D8011D921C9240E050E06D897E89A8 +:10232000C10178D5ED85FE8540815181B201C101A1 +:1023300071D5D8014D915C91B301C1016BD5C1013B +:102340000E948538B989BB2309F457C10E94B2267F +:1023500021E0FC01248751C1E1E0F0E0F887EF8340 +:10236000B2CCE1E0F0E0F887EF83EDCCE1E0F0E023 +:10237000F887EF8327CD69E273E0810106511E4F94 +:10238000C8010E940B056CE973E0C8010E940B05AF +:102390006FE575E0C8010E940B0522E030E0388748 +:1023A0002F83D7CD65E273E0810106511E4FC8012E +:1023B0000E940B056CE973E0C8010E940B0564E7FD +:1023C00075E0C8010E940B0542E050E058874F833A +:1023D00010CE61E273E0810106511E4FC8010E94D8 +:1023E0000B056CE973E0C8010E940B0569E875E014 +:1023F000C8010E940B0582E090E098878F8349CE48 +:1024000011821082F101EC50FE4F80819181009782 +:1024100049F46EE573E0810106511E4FC8010E9428 +:102420000B05C6C0019709F0D4C00E94B2268C01EA +:10243000FC0180819181A281B381181619061A06C8 +:102440001B0644F081E090E0A0E0B0E0808391833F +:10245000A283B383F80184819581A681B781181680 +:1024600019061A061B0644F081E090E0A0E0B0E0F7 +:1024700084839583A683B783F80180859185A2859F +:10248000B385181619061A061B0644F081E090E081 +:10249000A0E0B0E080879187A287B3876EE973E000 +:1024A000CE0101960E9449056AEC74E0CE010196C6 +:1024B0000E940B0568EB75E0CE0101960E940B05AA +:1024C0006091540770915507809156079091570776 +:1024D0000E94CD526B017C01D8016D917D918D914F +:1024E0009C910E94CD529B01AC01C701B6010E9494 +:1024F000BB54AB01BC01CE0101960E94DB0468EC29 +:1025000075E0CE0101960E940B056091580770910D +:10251000590780915A0790915B070E94CD526B0139 +:102520007C01F80164817581868197810E94CD527A +:102530009B01AC01C701B6010E94BB54AB01BC01B9 +:10254000CE0101960E94DB0468ED75E0CE01019694 +:102550000E940B0560915C0770915D0780915E079A +:1025600090915F070E94CD526B017C01D8011896B3 +:102570006D917D918D919C911B970E94CD529B01F5 +:10258000AC01C701B6010E94BB54AB01BC01CE0136 +:1025900001960E94DB04BE016F5F7F4F81010651EF +:1025A0001E4FC8010E94190589819A810E94B54D6C +:1025B0000E94B226BC01CE0101960E947625BE0182 +:1025C0006F5F7F4FC8010E94190589819A810E941F +:1025D000B54DF101EC50FE4F808191810196823022 +:1025E00091051CF49183808302C011821082F10155 +:1025F000EE50FE4F118210824DCA8CED94E00E9485 +:10260000CA3F8F8198850E940C418CE993E00E941B +:10261000CA3F0E94B2262F81388530934F072093FE +:102620004E07C901E8960FB6F894DEBF0FBECDBFC6 +:10263000DF91CF911F910F91FF90EF90DF90CF909E +:10264000BF90AF909F908F907F906F905F904F90D2 +:102650003F902F900895CF92DF92EF92FF920F93C9 +:102660001F93CF93DF937C016B018A01E9010E94E4 +:102670009A21F601EE0FFF1FEE0FFF1FE05AF84FF1 +:1026800080819181F701918380830E949A21000FBC +:10269000111F000F111FF801E05AF84F81E040812F +:1026A000518162817381413051056105710509F0E5 +:1026B00080E0F70182870E949A21CC0FDD1FCC0FAA +:1026C000DD1FC05AD84F88819981AA81BB81F7014B +:1026D00082839383A483B583168217821086118622 +:1026E000DF91CF911F910F91FF90EF90DF90CF90EE +:1026F0000895AF92BF92CF92DF92EF92FF920F9325 +:102700001F93CF93DF93EC018AE190E09C8F8B8F36 +:102710008BE190E09E8F8D8F89E190E098A38F8F61 +:102720008FE090E09AA389A38EE190E09CA38BA315 +:102730008EE090E09EA38DA385E490E098A78FA300 +:1027400084E490E09AA789A7FE01E057FF4F80E25A +:1027500090E09487838781E290E0968785878FE178 +:1027600090E0908B8787128A118A148A138A168ABE +:10277000158A83E490E0908F878B82E490E0928FBB +:10278000818FE058FF4F83E290E09487838784E253 +:1027900090E09687858782E290E0908B8787128A07 +:1027A000118A148A138A168A158A81E490E0908F20 +:1027B000878B80E490E0928F818FE551FF4F1182EB +:1027C0001082329611821082329611821082CE01CE +:1027D0000E94AE2FCE010E94B338CE0180579E4F8B +:1027E00041E050E0FC01558F448FDE01A255BE4F01 +:1027F00024E030E05D963C932E935C975E01F4E319 +:10280000AF1AFEEFBF0A28E030E0F501358F248FC4 +:1028100020E130E0FC013183208321E130E0358389 +:1028200024832FEF3FEF3383228337832683628510 +:1028300060876385618767E170E011967C936E9392 +:1028400068E170E015967C936E93149713963C9311 +:102850002E93129717963C932E9316971A966C9177 +:102860001A9718966C9318971B966C911B9719964C +:102870006C9319976DE170E0F501718360836CE1F1 +:1028800070E0758364833383228337832683628574 +:10289000608763856187BE016A527D4FFB0160815D +:1028A00071818E010C531D4FF801C080D180E280F0 +:1028B000F38006501109F80100811181FC01118F8C +:1028C000008FC48AD58AE68AF78A6130710519F4C7 +:1028D000338F228F03C0FC01538F428FCE01885269 +:1028E0009D4FFC01808191819E0128533D4FF9014C +:1028F000408151816281738128503109F901208121 +:10290000318159963C932E93589754964D935D93ED +:102910006D937C935797019719F48FEF9FEF02C047 +:1029200081E090E05B969C938E935A97DE01A652CD +:10293000BD4F8D919C9111971E974D915D916D9119 +:102940007C91CE53DD4F28813981F501318F208F65 +:10295000448B558B668B778B019719F48FEF9FEF24 +:1029600003C081E090E0F501938F828FDF91CF91DA +:102970001F910F91FF90EF90DF90CF90BF90AF909D +:1029800008952F923F924F925F926F927F928F9213 +:102990009F92AF92BF92CF92DF92EF92FF920F93EE +:1029A0001F93CF93DF93CDB7DEB7C058D1090FB6D1 +:1029B000F894DEBF0FBECDBF8C01FC0110821182E6 +:1029C0001282138214821582168217821086118653 +:1029D0001286138614861586168617862C01F0E15A +:1029E0004F0E511CC2010E941438380180E9680E54 +:1029F000711CC3010E9414384801E0EF8E1AEEEFFB +:102A00009E0AC4010E9414385801F0E7AF1AFEEF85 +:102A1000BF0AC5010E94702A680182E5C81A8EEFBC +:102A2000D80AC6010E94702A7801E4E3EE1AEEEF9C +:102A3000FE0AC7010E94702A6EE973E0C801865140 +:102A40009E4F0E944905F801E051FE4F118210820D +:102A50003296118210823296118210823296118241 +:102A60001082329610823196108231961082319601 +:102A70001182108232961182108232961182108257 +:102A800032961082319610823196108231961082E1 +:102A90001182128213823496108211821282138262 +:102AA000349610821182128213823496108211821F +:102AB000128213823496108211821282138234960B +:102AC0001082118212821382349610821182128235 +:102AD00013823496108211821282138234961082ED +:102AE0001182128213823496108211821282138212 +:102AF00034961082118212821382349610821182CF +:102B000012821382349610821182128213823496BA +:102B100010821182128213823496108211821282E4 +:102B2000138234961082319610823196108231963B +:102B300010821182128213823496108211821282C4 +:102B4000138234961082118212821382349610827C +:102B50003196108231961082319610823196108211 +:102B60003196108231961082319610823196108201 +:102B700031961082319610823196108231961082F1 +:102B800031961082319610823196108231961082E1 +:102B900031961082319610823196108231961082D1 +:102BA00031961082319610823196108231961082C1 +:102BB0001182128213823496108211821282138241 +:102BC00034961082118212821382D801AD58BD4F03 +:102BD0008CE0E9E3F3E001900D928A95E1F7F801CA +:102BE000E158FD4F108211821282138234961082B6 +:102BF0001182128213823496108211821282138201 +:102C0000349611821082329611821082329611828D +:102C100010823296108211821282138234961082B0 +:102C200011821282138234961082118212821382D0 +:102C3000349610821182128213823496108211828D +:102C40001282138234961082118212821382349679 +:102C50001182108232961182108232961182108275 +:102C6000329610821182128213823496108211825F +:102C70001282138234961082118212821382349649 +:102C80001082319610823196108231961182108214 +:102C90003296118210823296118210823296108200 +:102CA0001182128213823496108211821282138250 +:102CB000349610821182128213823496118210820D +:102CC00032961182108232961182108232961182CF +:102CD00010823296118210823296118210823296C0 +:102CE000118210823296118210821801F0E22F1A9E +:102CF000FDEF3F0AF1011082CE0101960E941438C7 +:102D000080E8FE013196D20101900D928A95E1F79B +:102D1000CE0101960E94143880E8FE013196D3015D +:102D200001900D928A95E1F7CE0101960E94143828 +:102D300080E8FE013196D40101900D928A95E1F769 +:102D400088E5F801848BEC56FF4F89E58083E058D5 +:102D5000FF4F8AE58083CE0101960E94702A8EE1A2 +:102D6000FE013196D50101900D928A95E1F7CE01D1 +:102D700001960E94702A8EE1FE013196D6010190E3 +:102D80000D928A95E1F7CE0101960E94702A8EE19C +:102D9000FE013196D70101900D928A95E1F7C801A5 +:102DA000A8DCF1011082C058DF4F0FB6F894DEBFE7 +:102DB0000FBECDBFDF91CF911F910F91FF90EF908C +:102DC000DF90CF90BF90AF909F908F907F906F904B +:102DD0005F904F903F902F9008950F931F93CF9344 +:102DE000DF938B01EA0181E593E00E94CA3F89EA03 +:102DF00095E00E94CA3FF80184810E940B40CE01F9 +:102E00000E940C410E94B226DF91CF911F910F9139 +:102E10000C94BC25CF92DF92EF92FF920F931F93F9 +:102E2000CF93DF93CDB7DEB728970FB6F894DEBF08 +:102E30000FBECDBF8B016A0186519E4F7C016DE4B0 +:102E400073E00E940B0569EA75E0C7010E940B055B +:102E5000F801848189831A8241E050E08E010F5F7E +:102E60001F4FB801C7010E94AE044AE0B801C60175 +:102E70000E947A4EF80101900020E9F73197AF01E6 +:102E8000401B510BB801C7010E94AE040E94B2263C +:102E9000BC01C8010E947625B801C7010E9419052E +:102EA00089819A810E94B54D28960FB6F894DEBFAD +:102EB0000FBECDBFDF91CF911F910F91FF90EF908B +:102EC000DF90CF900895FC01DB01A759BF4F8C9193 +:102ED000882319F022E030E002C020E030E0DB017E +:102EE000A559BF4F8C91882311F023E030E0DB011E +:102EF000A659BF4F8C91882311F024E030E0DB010C +:102F0000A459BF4F8C91882311F026E030E0DA01FC +:102F10008D919C918217930721F091E01216130670 +:102F20000CF090E0DA012D933C93992319F0A9015C +:102F3000CF0170CF08958F929F92AF92BF92CF92A0 +:102F4000DF92EF92FF920F931F93CF93DF93EC01E9 +:102F500089E493E00E94CA3F88EB95E00E94CA3F53 +:102F60006E0180E7C81A8EEFD80AC6010E94462A71 +:102F70000E94CD524B015C01FE01ED58FD4F608176 +:102F80007181828193810E94CD529B01AC01C50168 +:102F9000B4010E94BB5442E00E943D4088EC95E0A1 +:102FA0000E94CA3F7E01E2E5EE1AEEEFFE0AC7017B +:102FB0000E94462A0E94CD524B015C01FE01E95855 +:102FC000FD4F60817181828193810E94CD529B016E +:102FD000AC01C501B4010E94BB5442E00E943D40D7 +:102FE00088ED95E00E94CA3F8E0104531E4FC80130 +:102FF0000E94462A0E94CD524B015C01C558DD4F0C +:10300000688179818A819B810E94CD529B01AC01AC +:10301000C501B4010E94BB5442E00E943D400E94A1 +:10302000B2260E94BC2585E493E00E94CA3F88EB4B +:1030300095E00E94CA3FF601A28DB38D20893189A7 +:10304000428953890E941F540E94164088EC95E0E3 +:103050000E94CA3FF701A28DB38D20893189428930 +:1030600053890E941F540E94164088ED95E00E94EB +:10307000CA3FF801A28DB38D2089318942895389D5 +:103080000E941F540E9416400E94B226DF91CF91E9 +:103090001F910F91FF90EF90DF90CF90BF90AF9076 +:1030A0009F908F900C94BC25CF93DF938091A10BC0 +:1030B0009091A20B892B51F481EE92E00E94204D59 +:1030C000EC015FDCD093A20BC093A10B8091A10B0C +:1030D0009091A20BDF91CF91089580919F0B9091D9 +:1030E000A00B892B41F481E090E00E94204D909349 +:1030F000A00B80939F0B80919F0B9091A00B089544 +:10310000CF93DF93EC012AEC30E04BEC50E069EC1C +:1031100070E0A1DA2EEC30E04FEC50E06DEC70E0A6 +:10312000CE010C9698DA24ED30E045ED50E063EDE9 +:1031300070E0CE0148968FDA28ED30E049ED50E09E +:1031400067ED70E0CE01849686DA2EED30E04FED2B +:1031500050E06DED70E0CE01C096DF91CF917BCA5B +:10316000CF93DF9380919D0B90919E0B892BE9F477 +:103170008CE390E00E94204DEC01FC01CC96118282 +:1031800010823C96E817F907D1F7198218821D863C +:103190001C86198E188E1DA21CA219AA18AACE016F +:1031A000AFDFD0939E0BC0939D0B80919D0B9091B0 +:1031B0009E0BDF91CF910895EF92FF920F931F9393 +:1031C000CF93DF93162F072F7A014115510559F43C +:1031D000862F0E94BC0531E020E0019709F030E025 +:1031E000C32FD22F26C04130510509F5262F663353 +:1031F00010F02AEC260F80917B00922F9870877F29 +:10320000892B80937B002770206420937C00809121 +:103210007A00806480937A0080917A0086FDFCCFEA +:10322000C091780080917900D0E0D82B02C0C0E036 +:10323000D0E082E0E816F10410F58EE995E00E94F6 +:10324000CA3F89EA95E00E94CA3F82EA95E00E945F +:10325000CA3F812F902F0E940C4189EA95E00E947D +:10326000CA3F84EA95E00E94CA3FCE010E940C4109 +:103270000E94B2260E94BC2580E090E002C081E05E +:1032800090E0DF91CF911F910F91FF90EF90089503 +:103290000F931F93CF93DF938B01EA01AB01415052 +:1032A00051094433510508F0D4C02230310508F0EB +:1032B000D0C048E3429FF001439FF00D1124E60F78 +:1032C000F71FE80FF91F81E08083232B11F46C2F87 +:1032D00007C061E0802F0E94D806209739F460E093 +:1032E000802F0E94E40580E090E0B5C0CF3FD1057B +:1032F00009F4ADC0F801EF5DFB4FE4918E2F90E033 +:10330000FC013197E231F10508F09DC08827EC57A8 +:10331000FF4F8F4F0C94775584B5806884BDC7BD2F +:10332000E2CF84B5806284BDC8BDDDCF80918000CE +:10333000806880938000D0938900C0938800D3CFA9 +:1033400080918000806280938000D0938B00C09336 +:103350008A00C9CF80918000886080938000D093DC +:103360008D00C0938C00BFCF8091B00080688093A7 +:10337000B000C093B300B7CF8091B000806280935B +:10338000B000C093B400AFCF80919000806880936C +:103390009000D0939900C0939800A5CF80919000A1 +:1033A000806280939000D0939B00C0939A009BCF43 +:1033B00080919000886080939000D0939D00C0938E +:1033C0009C0091CF8091A00080688093A0008091A4 +:1033D000A0008F7B8093A000D093A900C093A80089 +:1033E00082CF8091A00080628093A000D093AB0038 +:1033F000C093AA0078CF8091A00088608093A0003D +:10340000D093AD00C093AC006ECF80912001806856 +:1034100080932001D0932901C093280164CF80912B +:103420002001806280932001D0932B01C0932A0158 +:103430005ACF80912001886080932001D0932D0184 +:10344000C0932C0150CFC038D1050CF448CF61E0B7 +:1034500047CF81E090E0DF91CF911F910F910895C8 +:1034600080919B0B90919C0B892BA1F480E790E0BD +:103470000E94204DFC01F9969C0123593F4FDF012A +:10348000D8971C921192E217F307C9F790939C0BFF +:1034900080939B0B80919B0B90919C0B08950F93B5 +:1034A0001F93CF93DF93FC012081318121153105DA +:1034B000D1F1EC01822F0E94BC0521E0892B09F497 +:1034C00020E02B876A85261729F01E821F82188626 +:1034D00019860BC08E819F81A885B9850196A11D93 +:1034E000B11D8E839F83A887B9870E811F81288590 +:1034F00039858A819B81AC81BD81081719072A070C +:103500003B078CF081E0682788810E94E4050990E0 +:10351000D881C02DA5DF40E050E0BE01DF91CF9102 +:103520001F910F9149CEDF91CF911F910F91089577 +:10353000643571050CF052C0613571050CF095C011 +:103540006C32710554F5693271050CF08EC068312A +:10355000710594F46F3071050CF087C06630710509 +:1035600044F4623071050CF080C0672B09F07BC019 +:103570007CC06B50710974C0623271053CF46F31CC +:1035800071050CF072C0695171096AC06452710909 +:103590006230710508F067C068C0603471058CF452 +:1035A0006D3371050CF061C0663371053CF4633313 +:1035B00071050CF05AC06D52710952C06753710900 +:1035C0004FC06A3471053CF4673471050CF04DC08E +:1035D0006154710945C06B54710942C06638710568 +:1035E00014F5633871050CF040C0623771057CF446 +:1035F0006F367105D4F56836710534F4653671059A +:10360000A4F5655571092CC06956710929C06C373C +:10361000710534F46937710544F56357710920C0A9 +:103620006D5771091DC0603D71057CF46D3C7105DD +:10363000E4F46439710534F461397105B4F46D58FA +:1036400071090EC0695C71090BC06A3D710534F4E3 +:10365000673D710554F4635D710902C06D5D7109C8 +:103660006330710510F080E0089581E00895603EB8 +:10367000710508F026C4FB018827EA56FF4F8F4FDB +:103680000C94775581E090E0A0E0B0E08093600773 +:1036900090936107A0936207B09363070895109217 +:1036A00064071092650710926607109267070895E5 +:1036B000109268071092690710926A0710926B07C0 +:1036C000089581E090E0A0E0B0E080936C079093D3 +:1036D0006D07A0936E07B0936F070895109270075F +:1036E000109271071092720710927307089583E089 +:1036F00090E0A0E0B0E08093740790937507A093EA +:103700007607B0937707089588E790E0A0E0B0E0EF +:1037100080938C0790938D07A0938E07B0938F07AB +:10372000089588E790E0A0E0B0E080939007909340 +:103730009107A0939207B0939307089588E790E0CC +:10374000A0E0B0E08093940790939507A09396072C +:10375000B0939707089510929C0710929D071092BE +:103760009E0710929F0708951092A0071092A1073C +:103770001092A2071092A307089581E090E0A0E0C4 +:10378000B0E08093A4079093A507A093A607B093F9 +:10379000A70708951092A8071092A9071092AA07E8 +:1037A0001092AB0708951092AC071092AD071092DB +:1037B000AE071092AF0708951092B0071092B107AC +:1037C0001092B2071092B30708951092B4071092A6 +:1037D000B5071092B6071092B70708951092B80770 +:1037E0001092B9071092BA071092BB070895109271 +:1037F000BC071092BD071092BE071092BF07089534 +:103800001092C4071092C5071092C6071092C707FE +:1038100008951092C8071092C9071092CA07109213 +:10382000CB0708951092CC071092CD071092CE07C7 +:103830001092CF0708951092DC071092DD071092C6 +:10384000DE071092DF0708951092E0071092E1075B +:103850001092E2071092E30708951092E407109285 +:10386000E5071092E6071092E707089581E090E0DF +:10387000A0E0B0E08093F0079093F107A093F207E7 +:10388000B093F307089581E090E0A0E0B0E080936A +:10389000F4079093F507A093F607B093F707089500 +:1038A0008CE291E0A0E0B0E08093040890930508DA +:1038B000A0930608B093070808958CE291E0A0E079 +:1038C000B0E08093080890930908A0930A08B09389 +:1038D0000B0808958CE291E0A0E0B0E080930C0822 +:1038E00090930D08A0930E08B0930F0808951092BE +:1038F00014081092150810921608109217080895CF +:10390000109218081092190810921A0810921B08A9 +:10391000089510921C0810921D0810921E08109213 +:103920001F08089510922C0810922D0810922E084E +:1039300010922F08089510923008109231081092BA +:10394000320810923308089581E090E0A0E0B0E0E2 +:103950008093340890933508A0933608B0933708C5 +:10396000089585E090E0A0E0B0E080933C0890935B +:103970003D08A0933E08B0933F08089585E090E08D +:10398000A0E0B0E08093400890934108A0934208E3 +:10399000B0934308089589E190E0A0E0B0E08093FF +:1039A000440890934508A0934608B09347080895AB +:1039B00082E390E0A0E0B0E0809354089093550833 +:1039C000A0935608B0935708089582E390E0A0E0D2 +:1039D000B0E08093580890935908A0935A08B09388 +:1039E0005B08089582E390E0A0E0B0E080935C087B +:1039F00090935D08A0935E08B0935F08089582E3FA +:103A000090E0A0E0B0E08093640890936508A093F4 +:103A10006608B0936708089582E390E0A0E0B0E004 +:103A20008093680890936908A0936A08B0936B0824 +:103A3000089582E390E0A0E0B0E080936C0890935A +:103A40006D08A0936E08B0936F08089580E991E027 +:103A5000A0E0B0E080937C0890937D08A0937E085E +:103A6000B0937F08089580E991E0A0E0B0E08093F2 +:103A7000800890938108A0938208B09383080895EA +:103A800080E991E0A0E0B0E08093840890938508FD +:103A9000A0938608B0938708089510928C0810921E +:103AA0008D0810928E0810928F0808951092900839 +:103AB0001092910810929208109293080895109213 +:103AC00094081092950810929608109297080895FD +:103AD0001092A4091092A5091092A6091092A709A4 +:103AE00008951092A8091092A9091092AA0910929B +:103AF000AB0908951092AC091092AD091092AE096D +:103B00001092AF09089588E592E0A0E0B0E08093BC +:103B1000A4089093A508A093A608B093A7080895B9 +:103B200088E592E0A0E0B0E08093A8089093A9080F +:103B3000A093AA08B093AB08089588E592E0A0E0AE +:103B4000B0E08093AC089093AD08A093AE08B0931A +:103B5000AF0808958EE190E0A0E0B0E08093B40853 +:103B60009093B508A093B608B093B70808958EE176 +:103B700090E0A0E0B0E08093B8089093B908A093DB +:103B8000BA08B093BB0808958EE190E0A0E0B0E0E1 +:103B90008093BC089093BD08A093BE08B093BF0863 +:103BA00008951092F4081092F5081092F6081092F9 +:103BB000F70808951092F8081092F9081092FA0880 +:103BC0001092FB0808951092FC081092FD081092C4 +:103BD000FE081092FF08089510920409109205093A +:103BE0001092060910920709089510920809109280 +:103BF000090910920A0910920B09089510920C09F4 +:103C000010920D0910920E0910920F09089585E087 +:103C100090E0A0E0B0E080931C0990931D09A09370 +:103C20001E09B0931F09089585E090E0A0E0B0E080 +:103C30008093200990932109A0932209B09323092E +:103C4000089585E090E0A0E0B0E08093240990938F +:103C50002509A0932609B0932709089584EB95E1DF +:103C6000A0E0B0E080932C0990932D09A0932E0939 +:103C7000B0932F09089584EB95E1A0E0B0E0809324 +:103C8000300990933109A0933209B0933309089514 +:103C900084EB95E1A0E0B0E080933409909335097E +:103CA000A0933609B0933709089585E090E0A0E02D +:103CB000B0E08093440990934509A0934609B093DE +:103CC0004709089585E090E0A0E0B0E080934809BE +:103CD00090934909A0934A09B0934B09089585E050 +:103CE00090E0A0E0B0E080934C0990934D09A09340 +:103CF0004E09B0934F090895109254091092550936 +:103D0000109256091092570908951092580910926E +:103D1000590910925A0910925B09089510925C0992 +:103D200010925D0910925E0910925F090895109239 +:103D30006C0910926D0910926E0910926F09089526 +:103D40001092700910927109109272091092730901 +:103D500008951092740910927509109276091092C4 +:103D6000770908951092840A1092850A1092860AA3 +:103D70001092870A08958CE390E0A0E0B0E0809371 +:103D8000880A9093890AA0938A0AB0938B0A0895AF +:103D900081E090E0A0E0B0E080938C0A90938D0ADF +:103DA000A0938E0AB0938F0A08951092940A1092ED +:103DB000950A1092960A1092970A08958CE390E063 +:103DC000A0E0B0E08093980A9093990AA0939A0A91 +:103DD000B0939B0A089581E090E0A0E0B0E080936A +:103DE0009C0A90939D0AA0939E0AB0939F0A0895FF +:103DF0001092AC0A1092AD0A1092AE0A1092AF0A5D +:103E000008958CE390E0A0E0B0E08093B00A909336 +:103E1000B10AA093B20AB093B30A089581E090E08A +:103E2000A0E0B0E08093B40A9093B50AA093B60ADC +:103E3000B093B70A08951092BC0A1092BD0A10926E +:103E4000BE0A1092BF0A08958CE390E0A0E0B0E0B3 +:103E50008093C00A9093C10AA093C20AB093C30A88 +:103E6000089581E090E0A0E0B0E08093C40A9093D0 +:103E7000C50AA093C60AB093C70A08951092D40A3F +:103E80001092D50A1092D60A1092D70A08958CE3A0 +:103E900090E0A0E0B0E08093D80A9093D90AA09374 +:103EA000DA0AB093DB0A089581E090E0A0E0B0E088 +:103EB0008093DC0A9093DD0AA093DE0AB093DF0AB8 +:103EC0000895660F771F660F771FFB01E05AF84FC2 +:103ED000108211821282138208958FEF9FEF08954E +:103EE0000F931F93CF93DF938C01C0E0D0E0BE010E +:103EF000C8011EDB882319F0BE01C801B8DB21967A +:103F0000C13ED105A1F7DF91CF911F910F91089587 +:103F10004F925F926F927F928F929F92AF92BF92D9 +:103F2000CF92DF92EF92FF92CF93DF935B01EB0191 +:103F3000CC0FDD1FCE010E94E353482E512C612C83 +:103F4000712CCE0101960E94E353C82ED12CE12C96 +:103F5000F12C8DE8A81AB10883E0A816B10488F501 +:103F6000CE0144960E94E353882E912CA12CB12CB3 +:103F7000CE0145960E94E353482F50E060E070E088 +:103F80008FEF88169104A104B104A9F44F3F5105A5 +:103F90006105710581F48FEF4816510461047104C5 +:103FA00081F48FEFC816D104E104F10451F46FEFEE +:103FB0007FEFCB012BC040385105610571056CF0D6 +:103FC000F6CF80E8C816D104E104F10484F740E09C +:103FD00050E0BA01812C912C5401FE2CED2CDC2CEC +:103FE000CC24C40CD51CE61CF71C5401992488244D +:103FF000C80CD91CEA1CFB1C742F662755274427C4 +:10400000CB01BA016C0D7D1D8E1D9F1DDF91CF91DF +:10401000FF90EF90DF90CF90BF90AF909F908F90E8 +:104020007F906F905F904F90089586EA95E00E9490 +:10403000CA3F85E593E00E94CA3F94D69DD580E0B3 +:1040400090E008950C94B54D0C94B54D0C94B54D7D +:104050000C94B54D0C94B54D0C94B54D0C94B54DD8 +:104060000C94B54D0C94B54D4F925F926F927F9228 +:104070008F929F92AF92BF92CF92DF92EF92FF9278 +:104080000F931F93CF93DF9300D01F92CDB7DEB76E +:10409000FB011689078982889388A684B784C28425 +:1040A000D384E484F584468057806084718442819F +:1040B00053816481758149835A836B837C830E9419 +:1040C00054181F921F921F920F931F939301820106 +:1040D00049815A816B817C810E94A60A0F900F90C2 +:1040E0000F900F900F9080E090E00F900F900F9046 +:1040F0000F90DF91CF911F910F91FF90EF90DF9084 +:10410000CF90BF90AF909F908F907F906F905F9077 +:104110004F900895CF93DF93EB0120E030E040E82B +:104120005FE36A817B818C819D810E94C7528111EE +:104130000DC08BEA95E00E94CA3F0E945418FC0112 +:10414000EC5AFF4F108211821282138220E030E07D +:1041500040E85FE36E817F81888599850E94C75220 +:1041600081110DC08BEB95E00E94CA3F0E9454184C +:10417000FC01EC52FF4F108211821282138220E068 +:1041800030E040E85FE36A857B858C859D850E94F1 +:10419000C75281110DC08BEC95E00E94CA3F0E946E +:1041A0005418FC01EC5AFE4F1082118212821382C5 +:1041B000D9D5E2D480E090E0DF91CF910895D2D5B7 +:1041C0002ED580E090E008958BED95E00E94CA3FE7 +:1041D000C9D52DD6C7D5E2D443D940E050E068E038 +:1041E00070E00E94DC183CD940E050E069E070E0EB +:1041F0000E94DC1835D940E050E06AE070E00E948F +:10420000DC182ED940E050E06DE070E00E94DC1830 +:1042100080E090E00895EF92FF920F931F93CF9369 +:10422000DF9300D01F92CDB7DEB78B017B01EE0C80 +:10423000FF1C622FC70129833A834B835C830E9452 +:10424000EB5329813A814B815C81992757FD9A95DF +:10425000852F742F632FC70101960E94EB530D58D1 +:10426000110929813A814B815C8103301105A8F441 +:10427000BA01992777FD9095892FC70144960E942E +:10428000EB5329813A814B815C81652F7727882701 +:104290009927C70145960E94EB5380E090E00F906C +:1042A0000F900F900F90DF91CF911F910F91FF9082 +:1042B000EF900895CF92DF92EF92FF92CF93DF932A +:1042C000EB0136D9882349F1FE01EE0FFF1FEE0FF7 +:1042D000FF1FE05AF84FC080D180E280F38082EE69 +:1042E00095E00E94CA3F89EA95E00E94CA3F82EAAF +:1042F00095E00E94CA3FCE010E940C4189EA95E0F8 +:104300000E94CA3F84EA95E00E94CA3FC701B601F5 +:104310000E94164027D530D404C086EE95E00E9456 +:10432000CA3F80E090E0DF91CF91FF90EF90DF9067 +:10433000CF900895EF92FF920F931F93CF93DF9347 +:104340008091A30B9091A40B892B09F064C084E0A9 +:1043500090E00E94204DEC0160E070E0D9DD16167F +:104360001706F4F0CE01BCDD90E6E92E97E0F92EB9 +:1043700000E010E0B801CE01DBD8882341F0F7015E +:104380002081318142815381B801CE0144DF0F5F2A +:104390001F4FF4E0EF0EF11C0639110559F737C035 +:1043A00063E070E0CE01B4DD6130710581059105F7 +:1043B00061F580E6E82E87E0F82E00E010E0B80115 +:1043C000CE01B6D88823C1F0B801CE01A1DDF70136 +:1043D00060837183828393836F3F7F4F8F4F9F4FA3 +:1043E00059F4B801CE0143D9F701208131814281CE +:1043F0005381B801CE010FDF0F5F1F4FF4E0EF0EC6 +:10440000F11C013E1105D9F602C0CE0169DDD09341 +:10441000A40BC093A30B8091A30B9091A40BDF91ED +:10442000CF911F910F91FF90EF9008954F925F925F +:104430006F927F928F929F92AF92BF92CF92DF92B4 +:10444000EF92FF920F931F93CF93DF9300D01F92B1 +:10445000CDB7DEB76FDF40903C0850903D086090CC +:104460003E0870903F0866DF8090400890904108B9 +:10447000A0904208B090430875D4C0905407D090E3 +:104480005507E0905607F09057076CD4C701B60166 +:104490000E94CD526B017C01C301B2010E94CD523A +:1044A0009B01AC01C701B6010E94BB542B013C012A +:1044B000609158077091590780915A0790915B0756 +:1044C0000E94CD526B017C01C501B4010E94CD5206 +:1044D0009B01AC01C701B6010E94BB54AB01BC01FA +:1044E00049835A836B837C830E9454181F921F92C6 +:1044F0001F921F921F92812C912CA12CB12CC12CA8 +:10450000D12C760149815A816B817C818A019B0182 +:10451000B301A2010E94A60A0E9454181F921F9282 +:104520001F921F921F9297018601B301A2010E9460 +:10453000A60A0E9454181F921F921F921F921F9248 +:1045400097018601B701A6010E94A60A0FB6F8944A +:10455000DEBF0FBECDBF80E090E00F900F900F90B8 +:104560000F90DF91CF911F910F91FF90EF90DF900F +:10457000CF90BF90AF909F908F907F906F905F9003 +:104580004F90089508950895089508950895089501 +:104590000895089508950F931F93CF93DF93FB0120 +:1045A00002A113A1C68DD78D0E946D18C530D1050B +:1045B000E1F064F4249771F564E070E089ED9EE029 +:1045C0000E943008B80189ED9EE022C0C630D105B6 +:1045D000B1F02B97F9F467E070E082EE9EE00E9464 +:1045E0003008B80182EE9EE013C065E070E08CED0B +:1045F0009EE00E943008B8018CED9EE009C066E0A4 +:1046000070E08FED9EE00E943008B8018FED9EE0D3 +:104610000E94AD0780E090E0DF91CF911F910F9154 +:1046200008950C94B54D0C94B54D0C94B54D0C9467 +:10463000B54D0C94B54D0C94B54D0C94B54D0C94F2 +:10464000B54D0C94B54D0C94B54D0C94B54D0C94E2 +:10465000B54D0C94B54D0C94B54DEF92FF920F9360 +:104660001F93CF93DF93FB01E2A8F3A802A113A14C +:10467000C68DD78D0E94301A9701A801BE010E94F5 +:10468000481980E090E0DF91CF911F910F91FF904A +:10469000EF9008956F927F928F929F92AF92BF9208 +:1046A000CF92DF92EF92FF920F931F93CF93DF93FE +:1046B000FB01E2A8F3A886A497A4A0A8B1A8C6A06D +:1046C000D7A062A073A0068D178D0E94301AEC014E +:1046D0009701A301B8010E944819C501B4010E94C5 +:1046E0001F079701A601B801CE010E94481980E07A +:1046F00090E0DF91CF911F910F91FF90EF90DF90AD +:10470000CF90BF90AF909F908F907F906F900895C3 +:104710001F93CF93DF931F92CDB7DEB7FB0162A942 +:10472000168D69830E94301A6981812F0E94D806F4 +:1047300080E090E00F90DF91CF911F9108950F934B +:104740001F93CF93DF93FB0102A913A9C68DD78DC9 +:104750000E94301AA801BE010E94DC1880E090E09F +:10476000DF91CF911F910F910895662319F08DEA83 +:1047700093E002C086EA93E00C94CA3FCF93DF93A4 +:10478000FB01C68DD78DD6DDBE0194DD80E090E0C3 +:10479000DF91CF910895EF92FF920F931F93CF93E4 +:1047A000DF9300D01F92CDB7DEB7FB0122A133A16A +:1047B00044A155A1068D178D29833A834B835C83D1 +:1047C000B9DD7C01FC018281938129813A814B8191 +:1047D0005C818F30F7E29F072CF40196F7019383F9 +:1047E000828303C0F70113821282B801C7012983B3 +:1047F0003A834B835C830E94981A29813A814B81CA +:104800005C81882391F0F801EE0FFF1FEE0FFF1F70 +:10481000E05AF84F2083318342835383B801C701A4 +:10482000FADCB801C70146DD04C086EE95E00E94BF +:10483000CA3F0E94B0180E94801880E090E00F905C +:104840000F900F900F90DF91CF911F910F91FF90DC +:10485000EF9008958F929F92AF92BF92CF92DF9286 +:10486000EF92FF920F931F930E94541862E070E042 +:104870000E94A03A892BD1F40E94541821E02F9372 +:104880001F921F921F921F92812C912CA12CB12C50 +:10489000C12CD12C760197018601B701A6010E9497 +:1048A000A60A0F900F900F900F900F9080E090E06D +:1048B0001F910F91FF90EF90DF90CF90BF90AF903E +:1048C0009F908F9008958F929F92AF92BF92CF92B8 +:1048D000DF92EF92FF920F931F930E94541861E0B2 +:1048E00070E00E94A03A892BD1F40E9454181F92C4 +:1048F00021E02F931F921F921F92812C912CA12CAB +:10490000B12CC12CD12C760197018601B701A601EB +:104910000E94A60A0F900F900F900F900F9080E0CA +:1049200090E01F910F91FF90EF90DF90CF90BF909C +:10493000AF909F908F9008958F929F92AF92BF9269 +:10494000CF92DF92EF92FF920F931F930E94541821 +:1049500060E070E00E94A03A892BD1F40E945418C4 +:104960001F921F9221E02F931F921F92812C912C56 +:10497000A12CB12CC12CD12C760197018601B70155 +:10498000A6010E94A60A0F900F900F900F900F9013 +:1049900080E090E01F910F91FF90EF90DF90CF901B +:1049A000BF90AF909F908F9008958F929F92AF92FB +:1049B000BF92CF92DF92EF92FF920F931F930E94CC +:1049C000541821E02F931F921F921F921F92812C47 +:1049D000912CA12CB12CC12CD12C760197018601F0 +:1049E000B701A6010E94A60A0F900F900F900F909A +:1049F0000F9080E090E01F910F91FF90EF90DF907B +:104A0000CF90BF90AF909F908F9008958F929F927C +:104A1000AF92BF92CF92DF92EF92FF920F931F93CC +:104A20000E9454181F9221E02F931F921F921F92F1 +:104A3000812C912CA12CB12CC12CD12C7601970169 +:104A40008601B701A6010E94A60A0F900F900F9051 +:104A50000F900F9080E090E01F910F91FF90EF90EA +:104A6000DF90CF90BF90AF909F908F9008958F92DE +:104A70009F92AF92BF92CF92DF92EF92FF920F93ED +:104A80001F930E9454181F921F9221E02F931F9290 +:104A90001F92812C912CA12CB12CC12CD12C7601F0 +:104AA00097018601B701A6010E94A60A0F900F90F8 +:104AB0000F900F900F9080E090E01F910F91FF906A +:104AC000EF90DF90CF90BF90AF909F908F90089520 +:104AD00008950895089508950895089508950895EE +:104AE000089508950895089508950895EF92FF9206 +:104AF0000F931F93CF93DF93CDB7DEB72E970FB6EB +:104B0000F894DEBF0FBECDBF8C016EE973E00E944A +:104B1000490568E076E0C8010E940B0560915007E6 +:104B20007091510780915207909153072AE0AE018E +:104B30004F5F5F4F7A010E94844EF7010190002081 +:104B4000E9F73197AF014E195F09B701C8010E941B +:104B5000AE046CE973E0C8010E940B05C8012E96F3 +:104B60000FB6F894DEBF0FBECDBFDF91CF911F917E +:104B70000F91FF90EF90089588E096E00E94CA3F61 +:104B8000609150077091510780915207909153079F +:104B90000E9416408CE993E00C94CA3F0F931F9338 +:104BA000CF93DF93EC018BE096E00E94CA3F8FE049 +:104BB00096E00E94CA3F09EA1BE0F8016081CE013D +:104BC000D4DD83E196E00E94CA3FF8016181CE0105 +:104BD000CCDD87E196E00E94CA3FF8016281CE01F8 +:104BE000C4DD8BE196E00E94CA3FF8016381CE01EB +:104BF000BCDD8FE196E00E94CA3FF8016481CE01DE +:104C0000B4DD83E296E00E94CA3FF8016581CE01DF +:104C1000ACDDCE01DF91CF911F910F91ADCFCF923F +:104C2000DF92EF92FF92CF93DF93EC01888199811D +:104C3000AA81BB81181619061A061B0644F081E0EA +:104C400090E0A0E0B0E088839983AA83BB838C8145 +:104C50009D81AE81BF81181619061A061B0644F005 +:104C600081E090E0A0E0B0E08C839D83AE83BF83C1 +:104C700088859985AA85BB85181619061A061B060C +:104C800044F081E090E0A0E0B0E088879987AA87AF +:104C9000BB878AEC94E00E94CA3F88EB95E00E94B3 +:104CA000CA3F6091540770915507809156079091C3 +:104CB00057070E94CD526B017C01688179818A81FE +:104CC0009B810E94CD529B01AC01C701B6010E949D +:104CD000BB5442E00E943D4088EC95E00E94CA3FF0 +:104CE000609158077091590780915A0790915B071E +:104CF0000E94CD526B017C016C817D818E819F81F0 +:104D00000E94CD529B01AC01C701B6010E94BB5469 +:104D100042E00E943D4088ED95E00E94CA3F6091CC +:104D20005C0770915D0780915E0790915F070E941C +:104D3000CD526B017C01688579858A859B850E94AF +:104D4000CD529B01AC01C701B6010E94BB5442E0A9 +:104D50000E943D40CE01DF91CF91FF90EF90DF9018 +:104D6000CF900ACF8091A70B9091A80B892B91F53A +:104D70008DE090E00E94204DFC01148610925407B3 +:104D80001092550710925607109257071092580725 +:104D90001092590710925A0710925B0710925C0705 +:104DA00010925D0710925E0710925F071092A60B9B +:104DB0001092A50B109250071092510710925207B3 +:104DC0001092530710924F0710924E079093A80B22 +:104DD0008093A70B8091A70B9091A80B08950F9338 +:104DE0001F93CF93DF93A6DA8C01C0E0D0E0BE0121 +:104DF000C8010E94981A882319F0BE01C8015ADA26 +:104E00002196C13ED10599F787E296E00E94CA3FFC +:104E1000A9DFB2DE80E090E0DF91CF911F910F918A +:104E20000895A0DFFC01148680E090E00895CF9300 +:104E3000DF9385E40E94BC05EC0194DF91E0CD2B6B +:104E400009F490E09093A90B84E40E94BC05EC0166 +:104E500089DF91E0CD2B09F490E09093AA0B83E4D5 +:104E60000E94BC05EC017EDF91E0CD2B09F490E0BF +:104E70009093AB0B82E40E94BC05EC0173DF91E0E0 +:104E8000CD2B09F490E09093AC0B81E40E94BC051B +:104E9000EC0168DF91E0CD2B09F490E09093AD0B2D +:104EA00080E40E94BC05EC015DDF91E0CD2B09F4AC +:104EB00090E09093AE0BDF91CF91089508950895FF +:104EC000EBE0F1E08081877F80830895EBE0F1E003 +:104ED00080818860808308958E9808958E9A0895C1 +:104EE00014980895149A089588980895889A0895B2 +:104EF000CF93DF93EC018F81882331F061E08989C2 +:104F00000E94E4051F8206C060E089890E94E405D2 +:104F100081E08F83DF91CF910895CF93DF93EC01F0 +:104F20008E81882331F061E08B850E94E4051E822A +:104F300006C060E08B850E94E40581E08E83DF91EE +:104F4000CF91089560E0FC0181890C94E40560E054 +:104F5000FC0183850C94E40561E0FC0181890C94DB +:104F6000E40561E0FC0183850C94E4050F931F9335 +:104F7000CF93DF93EC0168EC70E080E090E00E945A +:104F80001F078E819F818F3F2FEF920739F061E0DD +:104F90000E94D80661E08E810E94E4058C859D8583 +:104FA0008F3FEFEF9E0719F061E00E94D8068885D9 +:104FB00099858F3FFFEF9F0739F061E00E94D80687 +:104FC00060E088850E94E40561E08A850E94D80639 +:104FD00061E08A850E94E405FE01E858FF4F808168 +:104FE000882309F45AC061E08091B00B0E94D80672 +:104FF00061E08091B40B0E94D80662E08091B20B10 +:105000000E94D8064091B00B5091B10BFA01E550C7 +:10501000FB4FE491E093B60B2091B20B3091B30BB0 +:10502000F901E550FB4FE491E093B70B8091B40B8D +:105030009091B50BFC01E550FB4FE491E093B80B68 +:10504000FA01EB54FB4FE491F0E0EE0FFF1FEF5736 +:10505000FB4F459154915093BA0B4093B90BF90112 +:10506000EB54FB4FE491F0E0EE0FFF1FE556FB4FD2 +:10507000259134913093BC0B2093BB0BFC01EB5476 +:10508000FB4FE491F0E0EE0FFF1FEF57FB4F8591D0 +:1050900094919093BE0B8093BD0BAE01425F5F4F26 +:1050A00060E8CE010E946B09AE014E5E5F4F60E981 +:1050B000CE010E946B09AE014A595F4FFA0180810F +:1050C0009181A281B3819927AA27BB2780839183ED +:1050D000A283B38361E9CE010E946B09AE01465EF3 +:1050E0005F4F63E9CE010E946B09AE01425E5F4FE4 +:1050F00064E9CE010E946B09AE014E5D5F4F65E928 +:10510000CE010E946B09AE014A5D5F4F6DEACE0190 +:105110000E946B09AE01465D5F4F63EBCE010E94BA +:105120006B098E010E5A1F4FA8016CEECE010E9432 +:105130006B09AE014A5A5F4F6DEECE010E946B09BA +:10514000AE01425A5F4F60EFCE010E946B09AE0183 +:1051500046595F4FFA0180819181A281B3819927DD +:10516000AA27BB2780839183A283B38362EFCE01FA +:105170000E946B09F80180819181A281B381807FB7 +:10518000886080839183A283B383A8016CEECE01F3 +:105190000E946B09F80180819181A281B3819F7780 +:1051A000AE7F906880839183A283B383A8016CEE65 +:1051B000CE01DF91CF911F910F910C946B090F934A +:1051C0001F93FC018EEA97E4A1EEBDE380839183F7 +:1051D000A283B38315827783668331872087138701 +:1051E00002875587448716861786108A118A128A85 +:1051F000138A148A158A168A178A108E118E128EB7 +:10520000138E148E158E168E178E10A211A212A256 +:1052100013A214A215A216A217A210A611A612A6D6 +:1052200013A614A615A684E595EBAAEABAEA86A702 +:1052300097A7A0ABB1AB8AEA94E5A5E9BAE482AB43 +:1052400093ABA4ABB5AB89E299E2A9E4B4E286AB37 +:1052500097ABA0AFB1AF82E292E4A0E1B0E182AF40 +:1052600093AFA4AFB5AFDF01DE964FEF5FEF6FEF07 +:105270007BEF4D935D936D937C93139714964DE75D +:1052800057E76BEB75EB4D935D936D937C931397A1 +:10529000149646E555E569E279E44D935D936D9387 +:1052A0007C931397149642E252E460E470E04D93CD +:1052B0005D936D937C931397149646E550E86FEFDA +:1052C0007FEF4D935D936D937C93139714961D928E +:1052D0001D921D921C92139714961D921D921D9261 +:1052E0001C92139714961D921D921D921C92139757 +:1052F000149640E854E065E070E04D935D936D9343 +:105300007C93139714961D921D921D921C921397D5 +:1053100014961D921D921D921C92139714961D9225 +:105320001D921D921C92139714961D921D921D9210 +:105330001C921397149640E050E067EF70E04D9395 +:105340005D936D937C93139714961D921C92E8586D +:10535000FF4F10821F910F9108958EBD00000DB474 +:1053600007FEFDCF8EB508951F920F920FB60F92D4 +:1053700011240BB60F922F933F934F935F936F932C +:105380007F938F939F93AF93BF93EF93FF938091FE +:10539000AF0B81113FC081E08093AF0B0E94541886 +:1053A000FC01EB58FF4F2081222369F07097408168 +:1053B0005181628173814F5F5F4F6F4F7F4F408399 +:1053C000518362837383FC01EB50FF4F20812223C2 +:1053D00069F0709740815181628173814F5F5F4FA7 +:1053E0006F4F7F4F4083518362837383FC01EB587F +:1053F000FE4F2081222361F0709780819181A281EC +:10540000B3810196A11DB11D80839183A283B383D3 +:105410001092AF0BFF91EF91BF91AF919F918F9140 +:105420007F916F915F914F913F912F910F900BBEA4 +:105430000F900FBE0F901F9018951F920F920FB6EE +:105440000F9211240BB60F922F933F934F935F93BC +:105450006F937F938F939F93AF93BF93EF93FF933C +:10546000E0E0F0E01995FF91EF91BF91AF919F912E +:105470008F917F916F915F914F913F912F910F90FD +:105480000BBE0F900FBE0F901F901895CF93DF9318 +:10549000FC012489358946895789C28DD38D60895D +:1054A0007189828993892031E7E23E0741055105E0 +:1054B00029F0121613061406150624F0DE019B01CE +:1054C000AC0109C00E945C5520E137E240E050E0A9 +:1054D0000E94F953DE010E941F54DF91CF9108957D +:1054E000FC0181E090E0958F848F118210821582FB +:1054F0001482108A118A128A138A118E108E80E10A +:1055000097E2A0E0B0E0848B958BA68BB78B1286D8 +:10551000108614861586168617860895CF93DF9316 +:10552000EC01FC01E159FF4F1082379781E0808345 +:1055300060E08B850E94E4058D899E89892B31F07E +:1055400060E08989DF91CF910C94E405DF91CF91E0 +:105550000895CF93DF93EC01898D0E94BC052C8DBB +:1055600030E08217930711F48D8D01C080E0DF9148 +:10557000CF910895CF93DF93EC018F890E94BC05F2 +:105580002C8D30E08217930711F48D8D01C080E0DF +:10559000DF91CF910895CF93DF93EC012BA9888100 +:1055A0009981222311F061E001C060E00E94800A2D +:1055B0002CA98A819B81222329F02DA9222311F075 +:1055C00061E001C060E0DF91CF910C94800ACF933D +:1055D000DF93EC012BA988819981222311F060E0EF +:1055E00001C061E00E94800A2CA98A819B8122234C +:1055F00029F02DA9222311F060E001C061E0DF91C4 +:10560000CF910C94800ACF93DF93EC0161E08F85FA +:105610000E94E4058CA9882321F061E08D890E9415 +:10562000E405C359DF4F1882DF91CF910895CF93DE +:10563000DF93EC0160E08F850E94E4058CA988234C +:1056400021F060E08D890E94E405C359DF4F81E0BD +:105650008883DF91CF910895CF92DF92EF92FF92EE +:105660000F931F93CF93DF93FC01DC01A05CBF4F2E +:105670004D935D936D937C93139714964D935D9327 +:105680006D937C93139714960D931D932D933C93D8 +:105690001397EC01C45BDF4FE88282AD882389F069 +:1056A00082A9811109C037FF0CC01D921D921D9265 +:1056B0001C92139781E006C01016110612061306FD +:1056C000A4F380E043AD54AD65AD76AD1416150678 +:1056D000160617063CF597AD992321F10D911D9102 +:1056E0002D913C9113976801790137FF07C0CC24B5 +:1056F000DD247601C01AD10AE20AF30A4C155D05D1 +:105700006E057F057CF437FF07C070956095509556 +:1057100041955F4F6F4F7F4F4D935D936D937C939A +:10572000139781E0DF01AB5ABF4F1D921D921D926E +:105730001C921397EB59FF4F91E09083DF91CF912B +:105740001F910F91FF90EF90DF90CF9008950F93EE +:105750001F93CF93DF938C01D62FFC01838D811192 +:1057600009C0C80107DFC82FC801F3DED11108C086 +:105770008C2F06C0C801EDDEC82FC801FBDEF6CFB6 +:10578000DF91CF911F910F910895CF93DF93EC019B +:10579000FC01E159FF4F81E0808339978081B29706 +:1057A000882341F080819181A281B3810196A11D5E +:1057B000B11D07C080819181A281B3810197A109A8 +:1057C000B10980839183A283B383FE01EE58FF4F1A +:1057D00020813181DE01A059BF4FC9019595879580 +:1057E00020FD03C0ED91FC910DC0FE01E80FF91FF3 +:1057F0000190F081E02D2D913C91E20FF31F01907B +:10580000F081E02D8C0F9D1F19958D899E89892B24 +:1058100011F1FE01EA58FF4F20813181DE01AC58C1 +:10582000BF4FC9019595879520FD03C0ED91FC916F +:105830000DC0FE01E80FF91F0190F081E02D2D91C0 +:105840003C91E20FF31F0190F081E02D8C0F9D1F22 +:10585000DF91CF911994DF91CF9108958F929F920C +:10586000AF92BF92CF92DF92EF92FF920F931F936E +:10587000CF93DF93EC01FC01EB5AFF4F6081718104 +:10588000828193810E94CB526B017C016EA97FA91A +:1058900088AD99AD0E94CD529B01AC0160E074E2ED +:1058A00084E799E40E94BB544B015C01FE01EF596F +:1058B000FF4F60817181828193810E94CB529B0155 +:1058C000AC01C501B4010E94BB544B015C018E01C7 +:1058D000075A1F4F20E030E040E05FE30E942C5366 +:1058E0009B01AC01C701B6010E9457540E94285584 +:1058F000F8016083718382839383C35ADF4FA501CC +:105900009401C701B6010E9457540E94285568832C +:1059100079838A839B83DF91CF911F910F91FF90B1 +:10592000EF90DF90CF90BF90AF909F908F900895B1 +:105930000F931F93CF93DF93FC01E159FF4F208119 +:105940002223B9F07A970081118122813381389620 +:10595000408151816281738104171507260737073B +:1059600010F1EC01DBDDCE01DF91CF911F910F91A2 +:1059700075CFFC01EB59FF4F20812223A1F07097D6 +:10598000008111812281338134964081518162816D +:105990007381041715072607370728F0DF91CF9189 +:1059A0001F910F91F2CEDF91CF911F910F9108952A +:1059B0002F923F924F925F926F927F928F929F921F +:1059C000AF92BF92CF92DF92EF92FF920F931F930D +:1059D000CF93DF93CDB7DEB762970FB6F894DEBFF3 +:1059E0000FBECDBF1C016C012CE4C20ED11CD60130 +:1059F0008C91F101EA59FF4F7F01910129593F4FE5 +:105A00004901A1014C5B5F4F5E874D878101085BB7 +:105A10001F4F882341F0D101D2968C91808381E081 +:105A2000F90180832FC0AD85BE854D915D916D914B +:105A30007C91F80180819181A281B38121E0481796 +:105A400059076A077B070CF020E0F701208377FFF6 +:105A500007C070956095509541955F4F6F4F7F4F90 +:105A6000B7FF07C0B095A095909581959F4FAF4F18 +:105A7000BF4F21E0481759076A077B070CF420E065 +:105A8000D4012C93ED85FE85408151816281738123 +:105A9000411551056105710559F4F10182A193A1E8 +:105AA000A4A1B5A1EF59FF4F80839183A283B38353 +:105AB000F80180819181A281B3817101F0E4EF0E40 +:105AC000F11CF701408051806280738091012B5955 +:105AD0003F4F5901481659066A067B0634F44817A9 +:105AE00059076A077B077CF00AC084159505A6054F +:105AF000B7052CF484179507A607B70724F0D6013D +:105B00008C918823D9F0F50180818823B9F0D601E2 +:105B10008C91811105C0F601808181110FC006C0F2 +:105B200060E0C10114DE8111F6CF18C0D4016C9180 +:105B300081E06827C1010BDE882381F0D5011C922A +:105B400060E0C10104DE882309F4CDC1F101EC5B02 +:105B5000FF4F1082118212821382C5C1D1019A9621 +:105B60002D913D914D915C919D9729833A834B8373 +:105B70005C835E962D913D914D915C9191972D8323 +:105B80003E834F83588792962D913D914D915C9124 +:105B9000959729873A874B875C87F80180819181A7 +:105BA000A281B381ED85FE8500811181228133813F +:105BB000F7014081518162817381F101E759FF4F03 +:105BC0001082319610822101FBE64F0E511CF2012A +:105BD00010823101FCE66F0E711CF30110823296C7 +:105BE00010824C015D01841A950AA60AB70AB7FE15 +:105BF00008C0B094A09490948094811C911CA11C26 +:105C0000B11C481759076A077B073CF46801790102 +:105C1000C41AD50AE60AF70A06C068017901C81A4B +:105C2000D90AEA0AFB0AA5019401559547953795CB +:105C300027952D873E874F87588B810102591F4F2B +:105C4000F7FC05C08C149D04AE04BF0454F4D101CC +:105C500096960D90BC91A02DBA8BA98B81E0F30193 +:105C6000BAC02D853E854F8558892C153D054E05BA +:105C70005F0508F454C089819A81AB81BC818C1581 +:105C80009D05AE05BF0564F42D813E812F5F3F4F1A +:105C90003A8B298B81E0D2018C93F80180839EC0DE +:105CA000C701B6010E94CD522B013C0169817A8166 +:105CB0008B819C810E94CD529B01AC01C301B2013A +:105CC0000E94BB542B013C016D817E818F819885A0 +:105CD00029853A854B855C85621B730B840B950B7C +:105CE0000E94CD529B01AC01C301B2010E942C5312 +:105CF0002B013C0169857A858B859C850E94CD525C +:105D00009B01AC01C301B2010E9457540E9423556C +:105D10007A8B698B81E0F101E759FF4F5CC0D501B7 +:105D2000C40129813A814B815C81821B930BA40BB6 +:105D3000B50BC816D906EA06FB065CF42D813E8138 +:105D40002E5F3F4F3A8B298B81E0F101E559FF4FE0 +:105D500042C0C501B4016C197D098E099F090E94DA +:105D6000CD522B013C0169817A818B819C810E94FB +:105D7000CD529B01AC01C301B2010E94BB542B0167 +:105D80003C016D817E818F81988529853A854B857F +:105D90005C85621B730B840B950B0E94CD529B019B +:105DA000AC01C301B2010E942C532B013C01698557 +:105DB0007A858B859C850E94CD529B01AC01C301E5 +:105DC000B2010E9457540E9423557A8B698B81E05F +:105DD000F101E659FF4F8083D8018C93F101828550 +:105DE0008823B1F00E945707D10118960D911C919C +:105DF0001997012E000C220B330BDC01CB01801B09 +:105E0000910BA20BB30B893E9340A105B10568F439 +:105E1000F101EF59FF4F29893A89C901A0E0B0E0AB +:105E200080839183A283B3838BCE0E945707D101D5 +:105E300019967C936E93189784E294E00E94CA3F6F +:105E40008BE296E00E94CA3F60E070E0CB010E94C6 +:105E5000164081E396E00E94CA3FC701B6010E9446 +:105E6000164087E396E00E94CA3FC501B4010E9434 +:105E700016408DE396E00E94CA3F4AE06D857E851C +:105E80008F8598890E94CB3F84E496E00E94CA3FA8 +:105E900069817A818B819C810E9416408AE496E018 +:105EA0000E94CA3F69857A858B859C850E94164031 +:105EB00080E596E00E94CA3F6D817E818F81988542 +:105EC0000E94164086E596E00E94CA3F89EA95E066 +:105ED0000E94CA3F89899A890E940C418CE993E00B +:105EE0000E94CA3F95CF62960FB6F894DEBF0FBEF0 +:105EF000CDBFDF91CF911F910F91FF90EF90DF9079 +:105F0000CF90BF90AF909F908F907F906F905F9059 +:105F10004F903F902F9008950F931F93FC01E45BE7 +:105F2000FF4F2081211110C03897008111812281FB +:105F30003381349640815181628173810417150742 +:105F40002607370744F404C0FC0122A9222319F0D4 +:105F50001F910F913CCB1F910F911DCB2F923F9220 +:105F60004F925F926F927F928F929F92AF92BF9269 +:105F7000CF92DF92EF92FF920F931F93CF93DF9315 +:105F8000CDB7DEB763970FB6F894DEBF0FBECDBFB7 +:105F90008C010E949A21F801EF5FFD4F81E0409152 +:105FA0002C0850912D0860912E0870912F08452BD8 +:105FB000462B472B09F480E080830E949A21F80148 +:105FC000EE5FFD4F81E040913008509131086091C3 +:105FD000320870913308452B462B472B09F480E09B +:105FE00080830E949A21F801ED5FFD4F81E040918E +:105FF0003408509135086091360870913708452B68 +:10600000462B472B09F480E080830E949A218091DF +:106010007C0890917D08A0917E08B0917F08F801DE +:10602000EC5FFD4F80839183A283B3830E949A210A +:106030008091800890918108A0918208B091830896 +:10604000F801E85FFD4F80839183A283B3830E94B0 +:106050009A218091840890918508A0918608B0913A +:106060008708F801E45FFD4F80839183A283B383A7 +:106070000E949A218091540890915508A091560849 +:10608000B0915708F801E45EFD4F80839183A283AD +:10609000B3830E949A218091580890915908A09149 +:1060A0005A08B0915B08F801E05EFD4F8083918350 +:1060B000A283B3830E949A2180915C0890915D082D +:1060C000A0915E08B0915F08F801EC5DFD4F808300 +:1060D0009183A283B3830E949A2180916408909156 +:1060E0006508A0916608B0916708F801E85DFD4F6A +:1060F00080839183A283B3830E949A218091680850 +:1061000090916908A0916A08B0916B08F801E45D6C +:10611000FD4F80839183A283B3830E949A21809153 +:106120006C0890916D08A0916E08B0916F08F8010D +:10613000E05DFD4F80839183A283B3830E949A2107 +:106140008091040890910508A0910608B091070875 +:10615000F801EC5CFD4F80839183A283B3830E949E +:106160009A218091080890910908A0910A08B0919D +:106170000B08F801E85CFD4F80839183A283B38311 +:106180000E949A2180910C0890910D08A0910E0810 +:10619000B0910F08F801E45CFD4F80839183A283E6 +:1061A000B3830E949A21F801E05CFD4F81E02091C9 +:1061B000DC073091DD072130310509F080E0808374 +:1061C0000E949A21F801EF5BFD4F81E02091E007EA +:1061D0003091E1072130310509F080E080830E9491 +:1061E0009A21F801EE5BFD4F81E02091E4073091A8 +:1061F000E5072130310509F080E080830E949A2173 +:10620000F801E25AFD4F81E04091B4075091B50783 +:106210006091B6077091B707452B462B472B09F4C1 +:1062200080E080830E949A21F801E15AFD4F81E0CD +:106230004091B8075091B9076091BA077091BB07B8 +:10624000452B462B472B09F480E080830E949A213E +:10625000F801E05AFD4F81E04091BC075091BD0725 +:106260006091BE077091BF07452B462B472B09F461 +:1062700080E080830E949A21F801EF59FD4F81E070 +:1062800040918C0850918D0860918E0870918F0814 +:10629000452B462B472B09F480E080830E949A21EE +:1062A000F801EE59FD4F81E040919008509191081E +:1062B0006091920870919308452B462B472B09F467 +:1062C00080E080830E949A21F801ED59FD4F81E022 +:1062D00040919408509195086091960870919708A4 +:1062E000452B462B472B09F480E080830E949A219E +:1062F000F801EC59FD4F81E02091C4073091C507AA +:106300002130310509F080E080830E949A21F80154 +:10631000EB59FD4F81E02091C8073091C90721302A +:10632000310509F080E080830E949A21F801EA5942 +:10633000FD4F81E02091CC073091CD072130310510 +:1063400009F080E080830E949A2180918C079091CF +:106350008D07A0918E07B0918F07F801E959FD4F85 +:1063600080839183A283B3830E949A2180919007B6 +:1063700090919107A0919207B0919307F801E55988 +:10638000FD4F80839183A283B3830E949A218091E1 +:10639000940790919507A0919607B0919707F801FF +:1063A000E159FD4F80839183A283B3830E949A2198 +:1063B000F801EE5AFD4F81E040919C0750919D07F6 +:1063C00060919E0770919F07452B462B472B09F440 +:1063D00080E080830E949A21F801ED5AFD4F81E010 +:1063E0004091A0075091A1076091A2077091A30767 +:1063F000452B462B472B09F480E080830E949A218D +:10640000F801EC5AFD4F81E04091A4075091A50797 +:106410006091A6077091A707452B462B472B09F4DF +:1064200080E080830E949A2180919409909195093F +:10643000A0919609B0919709F801ED5BFD4F80831B +:106440009183A283B3830E949A21809198099091AD +:106450009909A0919A09B0919B09F801E95BFD4F58 +:1064600080839183A283B3830E949A2180919C09A7 +:1064700090919D09A0919E09B0919F09F801E55B5B +:10648000FD4F80839183A283B3830E949A21F801F8 +:10649000EB5AFD4F81E02091F4073091F507213050 +:1064A000310509F080E08083F801EA5AFD4F10823F +:1064B000319610820E949A21F801E85AFD4F81E03E +:1064C0002091F0073091F1072130310509F080E08B +:1064D0008083F801E75AFD4F1082319610820E94A6 +:1064E0009A21F801E55AFD4F81E02091140830917E +:1064F00015082130310509F080E080830E949A213F +:10650000F801E45AFD4F81E02091180830911908F4 +:106510002130310509F080E080830E949A21F80142 +:10652000E35AFD4F81E020911C0830911D08213075 +:10653000310509F080E080830E949A21F801E15B37 +:10654000FD4F81E02091A4093091A509213031054A +:1065500009F080E080830E949A21F801E05BFD4F02 +:1065600081E02091A8093091A9092130310509F075 +:1065700080E080830E949A21F801EF5AFD4F81E06C +:106580002091AC093091AD092130310509F080E04E +:1065900080830E949A2118012DE8221A2DEF320AD9 +:1065A00080913C0890913D08A0913E08B0913F0831 +:1065B000F10180839183A283B3830E949A215801C1 +:1065C000F9E8AF1AFDEFBF0A8091400890914108A9 +:1065D000A0914208B0914308F50180839183A28382 +:1065E000B3830E949A218091440890914508A0911C +:1065F0004608B0914708980125583D4FF90180831E +:106600009183A283B383F1014081518162817381BF +:10661000141615061606170644F041E050E060E037 +:1066200070E04083518362837383F501408151811F +:1066300062817381141615061606170644F041E0B0 +:1066400050E060E070E040835183628373831816EA +:1066500019061A061B064CF081E090E0A0E0B0E0BD +:10666000F90180839183A283B383D901CD90DD901A +:10667000ED90FC90F50180809180A280B380D101E3 +:106680004D905D906D907C900E94B226FC014082FE +:1066900051826282738284829582A682B782C0868A +:1066A000D186E286F386F801E15BFD4FB081B983C4 +:1066B0003C972081318142815381D1016D917D913F +:1066C0008D919C910E945C5560837183828393833A +:1066D0007896A081399630803F97B081339620809C +:1066E000399620812A8B3397308138877E97408175 +:1066F0004987FF9750815D87EA59FF4FC080D1805D +:10670000E280F380F39780809180A280B3803C97F1 +:1067100040805180628073803C972081318142812A +:1067200053812E873F87488B598B78972081318101 +:1067300042815381F80126A737A740AB51AB2E8584 +:106740003F854889598922AB33AB44AB55AB46AA48 +:1067500057AA60AE71AE82AE93AEA4AEB5AEFE9651 +:10676000C082D182E282F38234962D8520833196D5 +:10677000398530832885F80123A73A8934A735A6BF +:1067800040E4C42ED12CE12CF12CEA5BFF4FC082F7 +:10679000D182E282F382329720823196B08335969D +:1067A000A083319660837183828393833496498179 +:1067B0004083D8015B968D919C915C9786339105BF +:1067C00059F486E797E2F19691838083329611829D +:1067D000108284E797E21EC08C33910569F48EE63F +:1067E00097E2F801E058FF4F91838083329611823F +:1067F00010828CE697E20EC08E9791F486E697E2BF +:10680000F801E058FF4F9183808332961182108205 +:1068100080E697E2369691838083329611821082C9 +:10682000F80181A192A14A9789F482E797E2EC5797 +:10683000FF4F9183808332961182108280E797E226 +:10684000369691838083329611821082F801E05B44 +:10685000FD4F2081298339972081318142815381E5 +:10686000D801A958BD4F6D917D918D919C910E9449 +:106870005C556083718382839383759630813A83FC +:10688000399640814B833F9750815C833396A0813A +:10689000A88739962080339730807E97B081BE8755 +:1068A000FF9720812D87E759FF4F20813181428159 +:1068B000538129873A874B875C87F397C080D180C3 +:1068C000E280F3803C9780809180A280B3803C97E7 +:1068D0004080518062807380E059F140D801A85F08 +:1068E000BD4F2D913D914D915C91268F378F40A3E7 +:1068F00051A342A253A264A275A286A297A2A0A607 +:10690000B1A6C2A6D3A6E4A6F5A629853A854B85ED +:106910005C8526A737A740AB51AB3D8532AB4E8592 +:1069200043AB338E248E5B81558F30E4C32ED12C44 +:10693000E12CF12CC6AAD7AAE0AEF1AEA885A4AB93 +:10694000BC81B5AB2A8122AF63AF74AF85AF96AF80 +:10695000398137AF838594858633910571F486E755 +:1069600097E2D801B39511969C938E931296119647 +:106970001C921E9284E797E220C08C33910571F43B +:106980008EE697E2D801B39511969C938E9312965A +:1069900011961C921E928CE697E20FC08E97A1F47E +:1069A00086E697E2D801B39511969C938E93129642 +:1069B00011961C921E9280E697E2169611969C9371 +:1069C0008E9312961D921C92818992894A9791F416 +:1069D00082E797E2F801EC5FFE4F91838083329665 +:1069E0001182108280E797E23696918380833296F7 +:1069F00011821082F801EF5AFD4F4081498336978A +:106A00002081318142815381D801A558BD4F6D91BC +:106A10007D918D919C910E945C55608371838283EE +:106A200093837296A0813996B0813F9750815C83A1 +:106A300033962081288739962080339730807E973F +:106A400030813D87FF9740814E87E459FF4F208179 +:106A500031814281538129873A874B875C87F3973D +:106A6000C080D180E280F3803C9780809180A280BA +:106A7000B3803C974080518062807380A801405F62 +:106A80005E4F5B8B4A8B78972081318142815381A5 +:106A9000EA89FB89268F378F40A351A342A253A2D4 +:106AA00064A275A286A297A2A0A6B1A6C2A6D3A6EA +:106AB000E4A6F5A629853A854B855C8526A737A7E8 +:106AC00040AB51AB2E8522AB3D8533AB338E248E4C +:106AD000B58F20E4C22ED12CE12CF12CC6AAD7AA66 +:106AE000E0AEF1AE288524AB3C8135ABA2AFDF012F +:106AF00063AF74AF85AF96AFE981DF96EC93DF9714 +:106B00001B968D919C911C978633910569F486E7BD +:106B100097E2F801E058FE4F91838083329611820C +:106B2000108284E797E21EC08C33910569F48EE6EB +:106B300097E2F801E058FE4F9183808332961182EC +:106B400010828CE697E20EC08E9791F486E697E26B +:106B5000F801E058FE4F91838083329611821082B3 +:106B600080E697E236969183808332961182108276 +:106B7000AA89BB8951968D919C9152974A9791F41D +:106B800082E797E2F801EC57FE4F918380833296BB +:106B90001182108280E797E2369691838083329645 +:106BA00011821082F801EE5AFD4F2081C8014096F3 +:106BB000222319F00E94172B02C00E94032BF80118 +:106BC000ED5AFD4F2081C80180579F4F222319F0B5 +:106BD0000E94172B02C00E94032BF801EC5AFD4FB4 +:106BE00080818823E1F08A899B8963960FB6F894A7 +:106BF000DEBF0FBECDBFDF91CF911F910F91FF90F0 +:106C0000EF90DF90CF90BF90AF909F908F907F904C +:106C10006F905F904F903F902F900C94172B8A8924 +:106C20009B8963960FB6F894DEBF0FBECDBFDF9190 +:106C3000CF911F910F91FF90EF90DF90CF90BF9079 +:106C4000AF909F908F907F906F905F904F903F900C +:106C50002F900C94032B4F925F926F927F928F92A2 +:106C60009F92AF92BF92CF92DF92EF92FF920F93DB +:106C70001F93CF93DF93CDB7DEB77B016901FB0193 +:106C8000808191814C01F2E68F0E911CF4011082FB +:106C9000118212821382A4016FE60E946B09F40133 +:106CA00080819181A281B38197012C5B3F4F790153 +:106CB000B0FF17C020E030E040E85FE3F6016081FC +:106CC0007181828193810E945754F60160837183A0 +:106CD00082839383F80180819181A281B381F7013E +:106CE00022C0F601408051806280738020E030E055 +:106CF000A901C301B2010E945455181674F4F5019C +:106D00002081318142815381C301B2010E945654D6 +:106D1000F6016083718382839383F701808191817F +:106D2000A281B381F80180839183A283B383DF9131 +:106D3000CF911F910F91FF90EF90DF90CF90BF9078 +:106D4000AF909F908F907F906F905F904F9008953D +:106D50008F929F92AF92BF92CF92DF92EF92FF926B +:106D60000F931F93CF93DF93EC018B01C42E8C8183 +:106D7000883549F48FEC9DE09983888384E69CE014 +:106D80009B838A830BC0893519F486E59DE004C096 +:106D90008A3521F48DED9CE09983888388819981DF +:106DA0000E94B627B801888199810E94824188811A +:106DB0009981AC014E5A5F4FFA0180809180A28088 +:106DC000B380F0EFBF226894B3F8FA018082918219 +:106DD000A282B3826CEE0E946B0988819981AC011A +:106DE0004E5A5F4FFA0180809180A280B3806894F0 +:106DF00096F880829182A282B3826CEE0E946B0927 +:106E000088819981FC014685578560897189516027 +:106E100046875787608B718BAC01425F5F4F60E89C +:106E20000E946B09888199810C2C000CDD08EE080A +:106E3000FF087601DD24CC24CC24DD24E894E7F897 +:106E4000FF24AC014A5A5F4FFA0180809180A280F2 +:106E5000B380F0E8AF228C289D28AE28BF28FA0125 +:106E600080829182A282B3826DEE0E946B0960E003 +:106E7000888199810E94800A88819981FC014685D8 +:106E8000578560897189446046875787608B718B0D +:106E9000AC01425F5F4F60E80E946B098881998175 +:106EA000AC014E5A5F4FFA0180809180A280B3807E +:106EB0006894B4F880829182A282B3826CEE0E94C0 +:106EC0006B098C81883509F07FC08A819B810E9483 +:106ED000B627B8018A819B810E9482418A819B8169 +:106EE000AC014E5A5F4FFA0100811181228133813A +:106EF000307F386000831183228333836CEE0E94DD +:106F00006B098A819B81AC014E5A5F4FFA01008167 +:106F100011812281338110640083118322833383A2 +:106F20006CEE0E946B098A819B81FC014685578526 +:106F300060897189516046875787608B718BAC017E +:106F4000425F5F4F60E80E946B098A819B81AC01C0 +:106F50004A5A5F4FFA0100811181228133812078E2 +:106F6000C02AD12AE22AF32AC082D182E282F382A5 +:106F70006DEE0E946B0960E08A819B810E94800A0D +:106F80008A819B81FC0146855785608971894460AF +:106F900046875787608B718BAC01425F5F4F60E81B +:106FA0000E946B098A819B81AC014E5A5F4FFA01A6 +:106FB000008111812281338130610083118322831A +:106FC00033836CEE0E946B09FE01E059FF4F8DE8A0 +:106FD00097E291838083329611821082329688E7FD +:106FE00097E29183808332961182108232968FE5E8 +:106FF00097E29183808332961182108232968EE5D9 +:1070000097E291838083C258DF4F19821882DF9103 +:10701000CF911F910F91FF90EF90DF90CF90BF9095 +:10702000AF909F908F900895FC0181E086838783C5 +:107030001186108612861486138616861586108A87 +:107040001786128A118A148A138A168A158A108E54 +:10705000178A128E118EDF01AB59BF4F1C92959784 +:107060001D921D921D921C92139714961D921D92B3 +:107070001D921C92139714961D921D921D921C92A4 +:10708000139714961C925A961C9211961C92129663 +:107090001C9211961C9211961C9211961C9211969C +:1070A0001C9211961C9211961C92119681EB97E2FC +:1070B00011969C938E93129611961C921E92129684 +:1070C0008CEA97E211969C938E93129611961C92DD +:1070D0001E92129687EA97E211969C938E931296CF +:1070E00011961C921E92129682EA97E28D939C93BF +:1070F000E258FF4F1182108208950E94B2260C942C +:1071000017270E94B2260C94CE25CF93DF93EC0173 +:10711000FC01E052FD4F1082EE58F109808181118F +:1071200004C0CE0140960E94032BFE01ED5AFD4F94 +:107130008081811105C0CE0180579F4F0E94032B93 +:10714000FE01EC5AFD4F8081811105C0CE01805FA8 +:107150009E4F0E94032B64E670E080E090E0DF9198 +:10716000CF910C941F072F923F924F925F926F9294 +:107170007F928F929F92AF92BF92CF92DF92EF92C7 +:10718000FF920F931F93CF93DF93EC010E949A21FC +:10719000FE01E755FD4F80911C0990911D099183D7 +:1071A00080830E949A21FE01E555FD4F80912009C0 +:1071B00090912109918380830E949A21FE01E355D9 +:1071C000FD4F8091240990912509918380830E942D +:1071D0009A218E0101551D4F609144097091450916 +:1071E00080914609909147090E94CD52F801608331 +:1071F0007183828393830E949A211E01FDE42F1ADA +:10720000FDEF3F0A609148097091490980914A0950 +:1072100090914B090E94CD52F1016083718382836A +:1072200093830E949A2120E030E048EC52E4F80178 +:1072300060817181828193810E94BB542B013C014A +:1072400020E030E048EC52E4F101608171818281FC +:1072500093810E94BB544B015C0160914C09709179 +:107260004D0980914E0990914F090E94CD5220E026 +:1072700030E048EC52E40E94BB546B017C012AE0F0 +:1072800037ED43E25CE3C301B2010E945455181686 +:107290008CF420E030E046EC52E4C301B2010E94DD +:1072A000C75287FD0FC0412C512C46EC642E42E49E +:1072B000742E08C05AE0452E57ED552E53E2652E28 +:1072C0005CE3752EF80140825182628273822AE06B +:1072D00037ED43E25CE3C501B4010E945455181632 +:1072E0008CF420E030E046EC52E4C501B4010E9489 +:1072F000C75287FD0FC0812C912C26ECA22E22E4D0 +:10730000B22E08C03AE0832E37ED932E33E2A32E3F +:107310003CE3B32EF10180829182A282B3822AE003 +:1073200037ED43E25CE3C701B6010E9454551816DD +:107330008CF420E030E046EC52E4C701B6010E9434 +:10734000C75287FD0FC0C12CD12C86ECE82E82E4F9 +:10735000F82E08C09AE0C92E97EDD92E93E2E92EB7 +:107360009CE3F92EFE01E954FD4FC082D182E282F6 +:10737000F3820E949A218091040990910509FE01EF +:10738000E254FD4F918380830E949A2180910809E5 +:1073900090910909FE01E054FD4F918380830E9482 +:1073A0009A2180910C0990910D09FE01EE53FD4F39 +:1073B000918380830E949A2180912C0990912D09BC +:1073C000A0912E09B0912F09FE01EC53FD4F80834F +:1073D0009183A283B3830E949A2180913009909176 +:1073E0003109A0913209B0913309FE01E853FD4FF4 +:1073F00080839183A283B3830E949A218091340970 +:1074000090913509A0913609B0913709FE01E453F6 +:10741000FD4F80839183A283B3830E949A21809140 +:10742000540990915509FE01E053FD4F91838083EB +:107430000E949A218091580990915909FE01EE52BB +:10744000FD4F918380830E949A2180915C099091E5 +:107450005D09FE01EC52FD4F918380830E949A21C9 +:1074600080916C0990916D09FE01EA52FD4F918364 +:1074700080830E949A218091700990917109FE0188 +:10748000E852FD4F918380830E949A218091740974 +:1074900090917509FE01E652FD4F918380830E9411 +:1074A0009A218091F4089091F508A091F608B09186 +:1074B000F708FE01E554FD4F0197A105B10519F448 +:1074C00081E0808301C010820E949A218091F80897 +:1074D0009091F908A091FA08B091FB08FE01E454DC +:1074E000FD4F0197A105B10519F481E0808301C02A +:1074F00010820E949A218091FC089091FD08A09131 +:10750000FE08B091FF08C354DD4F0197A105B105F6 +:1075100019F481E0888301C01882DF91CF911F9117 +:107520000F91FF90EF90DF90CF90BF90AF909F9022 +:107530008F907F906F905F904F903F902F90089525 +:107540002F923F924F925F926F927F928F929F9273 +:10755000AF92BF92CF92DF92EF92FF920F931F9361 +:10756000CF93DF93CDB7DEB7A9970FB6F894DEBF00 +:107570000FBECDBF99A788A77C836B830E94AE2FD7 +:1075800088A599A5F0DD88A599A5B7DD88A599A559 +:10759000B8DD2B813C8121303105C9F12230310524 +:1075A00009F467C0232B09F097C068A479A430E1DF +:1075B000630E711C48A559A540575E4F5A874987ED +:1075C000E8A5F9A5E25AFD4F5081598B88A599A5E8 +:1075D00081589D4F9C878B87A8A5B9A5A755BD4FFE +:1075E000BD8BAC8BE8A5F9A5E554FD4FF98FE88F6D +:1075F00028A539A525503E4F388B2F874DE850E000 +:107600005F8B4E8B85E190E098878F8368C068A47C +:1076100079A490E9690E711CA8A5B9A5A255BE4F21 +:10762000BA87A987E8A5F9A5E15AFD4FB081B98BC2 +:10763000E8A5F9A5ED57FD4FFC87EB8728A539A5EF +:1076400025553D4F3D8B2C8B48A559A544545D4F86 +:10765000598F488F88A599A583509E4F988B8F8707 +:10766000AEE8B0E0BF8BAE8BE6E1F0E0F887EF83E9 +:1076700036C068A479A4F0EF6F1AFEEF7F0A28A540 +:1076800039A524533E4F3A872987E8A5F9A5E05A42 +:10769000FD4F3081398B48A559A549575D4F5C870F +:1076A0004B8788A599A583559D4F9D8B8C8BA8A54D +:1076B000B9A5A354BD4FB98FA88FE8A5F9A5E1508E +:1076C000FE4FF88BEF872FE830E03F8B2E8B47E1A2 +:1076D00050E058874F8303C08CE596E00CC0C3018F +:1076E0000E94BA2A811105C0C3010E94A92A8823D9 +:1076F00069F08DEE96E04ED40E94B22681E090E0D3 +:1077000090934F0780934E0790E0E1C384E294E0AA +:1077100041D48BE896E03ED4D30114968C917BD46F +:1077200083E297E037D48CE993E034D481E090E0B1 +:10773000EF85F8899183808341E050E0B30188A50B +:1077400099A50E940A17C3010E94172BD301D29654 +:107750008C9183010A591F4F882339F0C3010E947D +:10776000E72A81E0D8018C9305C0C3010E94CB2A8F +:10777000F801108289859A850E94462AF301EC5B04 +:10778000FF4F6083718382839383AB85BC851D9299 +:107790001D921D921C921397E8A5F9A5E158FD4F83 +:1077A0001082118212821382E8A5F9A5ED57FD4FD0 +:1077B0001082118212821382E8A5F9A5E957FD4FC4 +:1077C000108211821282138286E090E0EF85F889A0 +:1077D0009183808346E050E0B30188A599A50E947B +:1077E0000A1741E050E0B30188A599A50E94ED1663 +:1077F000212C312C210123948B819C8185549D4F18 +:1078000028A539A5280F391F3B8B2A8B4B815C811A +:10781000440F551F440F551F5E834D83CA01815588 +:107820009D4FA8A5B9A5A80FB91FBB8FAA8F8B81A3 +:107830009C8188599E4F880F991FE8A5F9A5E80FEC +:10784000F91FFF8FEE8FCA0183569D4F28A539A5DA +:10785000280F391F39A328A30C9748A559A5480F0D +:10786000591F5BA34AA38D819E8181589D4FA8A576 +:10787000B9A5A80FB91FBDA3ACA38D819E81E8A5B2 +:10788000F9A58E0F9F1F9C01285D3D4F3E872D87D8 +:107890008A889B88AA8CBB8CCE8CDF8CE8A0F9A050 +:1078A0000AA11BA12CA13DA149855A85B30188A538 +:1078B00099A5D1D98FEB9BE00E94350318161906C4 +:1078C00024F01A82198210E01DC08FEB9BE00E9409 +:1078D00013038F7D85349105A1F789EA94E05AD38B +:1078E0000E94B22621E0DC011C962C9382E693E0F4 +:1078F00051D30E94B2260E94BC25E1E0F0E0FA8359 +:10790000E98311E0C3010E94BA2A81111DC0C3019D +:107910000E94A92A811118C0111116C0AC89BD8915 +:107920006D917C91072E000C880B990B0E94CD5213 +:107930009B01AC01EB85FC85608171818281938123 +:107940000E94C75287FD70C28BEC96E023D3C3011F +:107950000E94A92A811165C242E050E0B30188A5C6 +:1079600099A50E94ED1684E294E014D38BE896E08A +:1079700011D3D30114968C914ED382E996E00AD3A9 +:107980008CE993E007D3E981FA81EF2BD1F485EA02 +:1079900096E000D389EA95E0FDD282EA95E0FAD23A +:1079A0008F81988539D489EA95E0F4D284EA95E00C +:1079B000F1D2F9898F2F90E02FD40E94B2260E9435 +:1079C000BC2588A599A599DB88A599A59ADB84E2B1 +:1079D00094E0E0D28BE896E0DDD2D30114968C914E +:1079E0001AD389EA96E0D6D28CE993E0D3D2EB851C +:1079F000FC851082118212821382D301D2968C915F +:107A000083010A591F4F882331F0C3010E94CB2AFA +:107A1000F801108206C0C3010E94E72A81E0D80164 +:107A20008C9389859A850E94462AF301EC5BFF4F6F +:107A30006083718382839383E8A5F9A5E158FD4FA4 +:107A40001082118212821382E8A5F9A5ED57FD4F2D +:107A50001082118212821382E8A5F9A5E957FD4F21 +:107A6000108211821282138289859A850E94462A89 +:107A70006A8F7B8F8C8F9D8F212C312C2101239439 +:107A80008B819C8185549D4FE8A5F9A5E80FF91FCE +:107A9000FF8FEE8F8D819E8181559D4F28A539A541 +:107AA000280F391F39A328A38B819C8188599E4FA9 +:107AB000880F991F48A559A5480F591F5BA34AA3D2 +:107AC0008D819E8183569D4FA8A5B9A5A80FB91F8A +:107AD000BDA3ACA3ED81FE81EF56FD4FFFA3EEA346 +:107AE0008D819E8128A539A5820F931FAC01485D29 +:107AF0005D4F5B8B4A8BF1013197FE87ED87F887ED +:107B0000EF8329813A81232B09F0C3C02D813E8167 +:107B100021583D4F88A599A5280F391F8E8C9F8C21 +:107B2000A8A0B9A0CAA0DBA0ECA0FDA00EA11FA137 +:107B3000080F191F49855A85B3018DD88FEB9BE03B +:107B40000E9435031816190614F010E01DC08FEBC3 +:107B50009BE00E9413038F7D85349105B1F789EA7C +:107B600094E018D20E94B22621E0DC011C962C93EE +:107B700082E693E00FD20E94B2260E94BC25E1E08B +:107B8000F0E0FA83E98311E02D853E852A30310546 +:107B900038F4AB85BC851D921D921D921C921397E3 +:107BA000B989C301B1118EC10E94A92A81116DC08A +:107BB000112329F0ED85FE85F887EF8366C0AC8937 +:107BC000BD896D917C91072E000C880B990B0E944A +:107BD000CD529B01AC01EB85FC8560817181828176 +:107BE00093810E94C75287FFE5CFC3010E94C52B36 +:107BF000AA89BB892D913D914D915C9160E573EC13 +:107C000080E090E00E94F953C9010E941407EA89BC +:107C1000FB892081318142815381A3E0B0E00E9441 +:107C200015549B01AC01C201B1010E94F953672BAD +:107C3000682B692B91F48EE593E0ACD10E94B226BB +:107C40000E94BC2584E294E0A5D18DEB96E0A2D100 +:107C5000C101E2D28CE993E09DD1C3010E948E2A3A +:107C6000AA89BB892D913D914D915C9160E573ECA2 +:107C700080E090E00E94F953C9010E941407BFEF11 +:107C80002B1A3B0A4B0A5B0A36CF8BEC96E082D16B +:107C900004C041E050E05A83498384E294E07AD101 +:107CA0008BE896E077D1D30114968C91B4D18FED07 +:107CB00096E070D18CE993E06DD189859A850E9418 +:107CC000462AE88DF98DEF2BA9F0DC01CB012A8D36 +:107CD0003B8D4C8D5D8D821B930BA40BB50BB7FFB9 +:107CE00007C0B095A095909581959F4FAF4FBF4F1E +:107CF00098878F8349815A81452B01F585EA96E063 +:107D000049D189EA95E046D182EA95E043D18E894E +:107D10009F8982D289EA95E03DD184EA95E03AD103 +:107D2000AF81B885BD01BB0F880B990B0E94CD5266 +:107D300042E0A3D10E94B2260E94BC2585E090E0DB +:107D4000EF85F8899183808345E050E0B30188A5F1 +:107D500099A50E940A17C3010E94032B88A599A523 +:107D6000CCD988A599A5CDD92B813C81213031056D +:107D7000B1F02230310521F1232B91F50E94B2267A +:107D80004F815885CA01550FAA0BBB0B809354072E +:107D900090935507A0935607B093570721C00E94B0 +:107DA000B226EF81F885CF01FF0FAA0BBB0B8093A2 +:107DB000580790935907A0935A07B0935B0710C0D8 +:107DC0000E94B2262F813885C901330FAA0BBB0B45 +:107DD00080935C0790935D07A0935E07B0935F0765 +:107DE0000E94B2260E940F26AF85B8891D921C9270 +:107DF00040E050E0B30188A599A50E940A1740E031 +:107E000050E0B30188A599A50E94ED160E94B22604 +:107E1000E981FA81F0934F07E0934E0789819A81B7 +:107E200056C0B1E0B98B98CDC3010E94C52BED853A +:107E3000FE85208131814281538160E573EC80E0D1 +:107E400090E00E94F953C9010E941407AD85BE85D8 +:107E50002D913D914D915C91A3E0B0E00E941554AD +:107E60009B01AC01C201B1010E94F953672B682B41 +:107E7000692B39F48EE593E08DD00E94B2260E94E2 +:107E8000BC25C3010E948E2AAD85BE852D913D91F2 +:107E90004D915C9160E573EC80E090E00E94F953B5 +:107EA000C9010E941407BFEF2B1A3B0A4B0A5B0A59 +:107EB000E981FA81EF2B09F4EBCC21E030E03A8341 +:107EC00029834ACD0E94BA2A811174CE71CEA99617 +:107ED0000FB6F894DEBF0FBECDBFDF91CF911F91DB +:107EE0000F91FF90EF90DF90CF90BF90AF909F9059 +:107EF0008F907F906F905F904F903F902F9008955C +:107F0000CF93DF93FC01E251FE4F40815181411537 +:107F1000510559F1EC01CE50DE4F2881398186514F +:107F20009E4F24173507C8F4FC018081918100978A +:107F300061F0FC01E20FF31F80818A3041F08D3047 +:107F400029F48CE993E026D002C080E064D08881D7 +:107F5000998101969983888308C040E050E06EE9DA +:107F600073E00E941F0519821882DF91CF91089556 +:107F7000009769F0FC0101900020E9F73197AF010B +:107F8000481B590BBC018FEB9BE00C94D50280E0A1 +:107F900090E00895EDCF8F929F92AF92BF920F9392 +:107FA0001F93CF93DF93CDB7DEB7A1970FB6F894A9 +:107FB000DEBF0FBECDBF19A2423008F44AE08E01E9 +:107FC0000F5D1F4F842E912CA12CB12CA501940183 +:107FD0000E942554E62FB901CA0101501109EA3067 +:107FE00014F4E05D01C0E95CD801EC93232B242B51 +:107FF000252B61F7C801BCDFA1960FB6F894DEBF50 +:108000000FBECDBFDF91CF911F910F91BF90AF9069 +:108010009F908F900895E091BF0BF091C00B01905D +:10802000F081E02D682F8FEB9BE01994CF92DF92C7 +:10803000EF92FF92CF93DF9397FF17C06B017C0104 +:108040008DE2E9DFEC0166277727CB016C197D090A +:108050008E099F094AE09FDF8C0F9D1FDF91CF9112 +:10806000FF90EF90DF90CF9008954AE0DF91CF919D +:10807000FF90EF90DF90CF908ECF4F925F926F92F4 +:108080007F928F929F92AF92BF92CF92DF92EF92A8 +:10809000FF926B017C01B42E9B01AC010E945855EC +:1080A000882319F082E497E027C026013701E8947D +:1080B00077F82FEF3FEF4FE75FE7C301B2010E9470 +:1080C000585581110DC02FEF3FEF4FE75FE7C30118 +:1080D000B2010E94C75218161CF486E497E00CC047 +:1080E0002FEF3FEF4FE75FE4C701B6010E94545501 +:1080F00018167CF48AE497E0FF90EF90DF90CF9021 +:10810000BF90AF909F908F907F906F905F904F90B7 +:108110002FCF2FEF3FEF4FE75FECC701B6010E9473 +:10812000C75287FDE7CF20E030E0A901C701B601C3 +:108130000E94C75287FF08C08DE26DDF4C01F7FA3D +:10814000F094F7F8F09402C0812C912CA12C60E0FF +:1081500070E080E09FE3AB1441F020E030E040E2CB +:1081600051E40E94BB54A394F6CF9B01AC01C7011C +:10817000B6010E9457542B013C010E9428556B0107 +:108180007C010E94CB529B01AC01C301B2010E9451 +:1081900056542B013C014AE0C701B601FCDE7C01CC +:1081A000E80CF91CBB2021F08EE235DFE80EF91E49 +:1081B000DB2CDD2019F120E030E040E251E4C30186 +:1081C000B2010E942C532B013C010E9428554B0107 +:1081D000A12CB12C4AE0C501B401DDDEE80EF91E88 +:1081E000C501B4010E94CB529B01AC01C301B20195 +:1081F0000E9456542B013C01DA94DBCFC701FF905B +:10820000EF90DF90CF90BF90AF909F908F907F9036 +:108210006F905F904F900895BC01990F880B990B58 +:1082200005CF0CB405FC0DC01EBC00000DB407FE4C +:10823000FDCF9EB51EBC00000DB407FEFDCF8EB570 +:1082400008951EBC00000DB407FEFDCF8EB51EBC08 +:1082500000000DB407FEFDCF9EB5089527E030E085 +:10826000A0E0682F70E0B22FE091B90BF091BA0B4B +:108270009091B60BAB01022E02C0559547950A941A +:10828000E2F7808140FF02C0982B02C090959823AE +:108290009083E091BD0BF091BE0B90818091B80B63 +:1082A000892B8083E091BB0BF091BC0B40818091C6 +:1082B000B70B482381E090E011F480E090E001C02A +:1082C000880FBA95EAF78A2BA82FE091BD0BF091A1 +:1082D000BE0B50814091B80B4095452340832150FF +:1082E000310908F60895CF9380E0B8DFC82F80E009 +:1082F000B5DF2C2F30E0322F2227A901482BCA01ED +:10830000CF9108958F929F92AF92BF92DF92EF929A +:10831000FF920F931F93CF93DF93EC017B018EEAC3 +:1083200097E4A1EEBDE388839983AA83BB8380E0B1 +:1083300090E00E94CB5225ED34E045E352E40E94E8 +:108340002C5320E030E04AE754E40E94BB544B0138 +:108350005C0128EB3EE145E05EE30E942C5326E6FB +:1083600036E646EA5EE30E94BB5420E030E040E897 +:108370005FE30E9456540E942855D62E8E010E5A55 +:108380001F4F8FE08D1578F1F80180819181A281D6 +:10839000B381A26080839183A283B383A8016CEE32 +:1083A000CE010E946B092AE037ED43EA5CE3688165 +:1083B00079818A819B810E9457549B01AC01C50140 +:1083C000B4010E942C532CEE31E548E35EE30E9499 +:1083D000BB5420E030E040E85FE30E9456540E9426 +:1083E0002855D62E16C0A8016CE6CE010E946B0956 +:1083F000F80180819181A281B381A1FF0AC0AD7F84 +:1084000080839183A283B383A8016CEECE010E9486 +:108410006B098D2D90E0A0E0B0E0BA2FA92F982F26 +:10842000882788279F71AA27BB274A895B896C897F +:108430007D89507E842B952BA62BB72B8A8B9B8B0B +:10844000AC8BBD8B8E010E5E1F4FA80160E9CE0183 +:108450000E946B096D2D70E080E090E00E94CD528B +:1084600020E030E040E05FE30E942C530E9428555A +:108470006F718A899B89AC89BD89807E862B8A8BA6 +:108480009B8BAC8BBD8BA80160E9CE010E946B0970 +:10849000CA58DF4FF982E882DF91CF911F910F9187 +:1084A000FF90EF90DF90BF90AF909F908F900895D6 +:1084B000789484B5826084BD84B5816084BD85B5BF +:1084C000826085BD85B5816085BD80916E008160CB +:1084D00080936E0010928100809181008260809371 +:1084E0008100809181008160809381008091800073 +:1084F0008160809380008091B10084608093B1009E +:108500008091B00081608093B00080919100826082 +:10851000809391008091910081608093910080917F +:1085200090008160809390008091A1008260809390 +:10853000A1008091A10081608093A1008091A000A2 +:1085400081608093A000809121018260809321014D +:1085500080912101816080932101809120018160BF +:108560008093200180917A00846080937A008091CA +:108570007A00826080937A0080917A008160809393 +:108580007A0080917A00806880937A001092C1000E +:1085900061E089E10E94E40561E08EE00E94E4056B +:1085A00061E08FE10E94E40561E082E20E94E4055F +:1085B000E091CF0BF091D00B82E08083E091CB0B68 +:1085C000F091CC0B1082E091CD0BF091CE0B80E1BD +:1085D00080831092D70BE091D30BF091D40B86E0FF +:1085E0008083E091D10BF091D20B808180618083F8 +:1085F000E091D10BF091D20B808188608083E09173 +:10860000D10BF091D20B808180688083E091D10BF7 +:10861000F091D20B80818F7D808364E670E080E0F2 +:1086200090E00E941F070E9454180E9479130E9434 +:10863000B0180E9480180E9457076093850B7093B2 +:10864000860B8093870B9093880B809170008160DC +:10865000809370008091B100887F81608093B10029 +:1086600084E08093B30061E08DE00E94D80661E071 +:1086700089E00E94D80661E088E00E94D80661E0A7 +:1086800087E00E94D80661E08AE00E94D80661E097 +:108690008CE00E94D80662E08FE30E94D80662E078 +:1086A0008BE30E94D80661E084E00E94D80661E076 +:1086B00085E00E94D80661E086E00E94D80661E06D +:1086C00087E00E94D8060E9457076093810B709341 +:1086D000820B8093830B9093840B0E9457076093C7 +:1086E000890B70938A0B80938B0B90938C0B0E9459 +:1086F00057076093850B7093860B8093870B90933D +:10870000880B0E949A218091680790916907A09137 +:108710006A07B0916B070197A105B10581F40E942A +:108720009A218091B0079091B107A091B207B091C2 +:10873000B3070197A105B10511F40C94DD4B0E941C +:108740009A218091680790916907A0916A07B0917A +:108750006B070197A105B10581F40E949A218091D0 +:10876000AC079091AD07A091AE07B091AF0701970C +:10877000A105B10511F40C94FD4B0E949A21809142 +:10878000680790916907A0916A07B0916B070197FC +:10879000A105B10581F40E949A218091A8079091CA +:1087A000A907A091AA07B091AB070197A105B10550 +:1087B00011F40C941D4C80E893E0ECDB0E945418FB +:1087C000EC010E949A210091A4081091A5080E9432 +:1087D0009A214091B4085091B508B801CE01409655 +:1087E0000E94A8360E949A210091A4081091A50821 +:1087F0000E949A214091B4085091B508B801CE0169 +:1088000080579F4F0E94A8360E949A210091A40889 +:108810001091A5080E949A214091B4085091B50882 +:10882000B801CE01805F9E4F0E94A836EFE72E2E42 +:10883000E2E03E2EF5E7AF2EF2E0BF2E0E94570792 +:108840006093890B70938A0B80938B0B90938C0BA6 +:108850000091850B1091860B2091870B3091880B2E +:10886000601771078207930748F46093850B709334 +:10887000860B8093870B9093880B2CC0DC01CB0177 +:10888000801B910BA20BB30B883E9340A105B10551 +:1088900008F108511C4F2F4F3F4F0093850B109349 +:1088A000860B2093870B3093880B0E94B018EC0145 +:1088B0000E944F1ACE010C960E944F1ACE01489684 +:1088C0000E944F1ACE0184960E944F1ACE01C09684 +:1088D0000E944F1A8FEB9BE00E943503892B09F40D +:1088E000BDC50E9457076093810B7093820B8093E4 +:1088F000830B9093840B8FEB9BE00E941303809378 +:10890000800B982F9F7D953479F020917E0B3091CC +:108910007F0BF901E45BF44F80832F5F3F4F30936F +:108920007F0B20937E0B06C00E94B22621E0DC0163 +:108930001C962C9380917E0B90917F0B8133910537 +:1089400064F02AE02093800BFC01E45BF44F208369 +:10895000019690937F0B80937E0B8091800B2091EA +:108960007E0B30917F0B8A3039F4C9010197A9E160 +:10897000BBE0ECE4FBE004C022333105B4F76EC584 +:10898000AF014C545B40481759071CF441914D937B +:10899000F7CFFC01E75EF44F1082223031050CF472 +:1089A00059C581E193E0F6DA89EA95E0F3DA8FE9D7 +:1089B00093E0F0DA89E19BE0EDDA8FE993E0EADA1F +:1089C0008CE993E0E7DA8AE390E00E94204DEC0125 +:1089D0001A821B821C821D821E821F8218861986A3 +:1089E0001A861B861C861D861E861F86188A198A73 +:1089F0001A8A1B8A1C8A1D8A1E8A1F8A188E198E43 +:108A00001A8E1B8E1C8E1D8E1E8E1F8E18A219A2F2 +:108A10001AA21BA21CA21DA21EA21FA218A619A662 +:108A20001AA61BA61CA61DA61EA61FA618AA19AA32 +:108A30001AAA1BAA1CAA1DAA1EAA1FAA18AE19AE02 +:108A400068E072E089E19BE00E94504E8C01FC01DD +:108A500080818654823008F027C161EA73E0C80142 +:108A60000E947456892B09F4D3C064EA73E0C801EC +:108A70000E947456892B09F4CBC068EA73E0C801E0 +:108A80000E947456892B09F4C6C06BEA73E0C801D2 +:108A90000E947456892B09F4BEC06FEA73E0C801C6 +:108AA0000E947456892B09F4B9C063EB73E0C801C6 +:108AB0000E947456892B09F4B4C067EB73E0C801B7 +:108AC0000E947456892B09F4ACC06AEB73E0C801AC +:108AD0000E947456892B09F4A7C06EEB73E0C8019D +:108AE0000E947456892B09F4A2C062EC73E0C8019D +:108AF0000E947456892B09F49DC066EC73E0C8018E +:108B00000E947456892B09F498C06AEC73E0C8017E +:108B10000E947456892B09F493C06EEC73E0C8016F +:108B20000E947456892B09F48EC062ED73E0C8016F +:108B30000E947456892B09F489C066ED73E0C80160 +:108B40000E947456892B09F484C06AED73E0C80151 +:108B50000E947456892B09F47FC06EED73E0C80142 +:108B60000E947456892B09F47AC062EE73E0C80142 +:108B70000E947456892B09F475C066EE73E0C80133 +:108B80000E947456892B09F470C06AEE73E0C80124 +:108B90000E947456892B09F46BC06EEE73E0C80115 +:108BA0000E947456892B09F466C062EF73E0C80115 +:108BB0000E947456892B09F461C066EF73E0C80106 +:108BC0000E947456892B09F45CC06AEF73E0C801F7 +:108BD0000E947456892B09F457C06EEF73E0C801E8 +:108BE0000E947456892B09F452C062E074E0C801F7 +:108BF0000E947456892B09F44DC066E074E0C801E8 +:108C00000E947456892B09F448C08FEF9FEF47C02C +:108C100080E090E044C081E090E041C08CE190E0D1 +:108C20003EC08DE690E03BC08FE690E038C080E724 +:108C300090E035C081E790E032C082E790E02FC03D +:108C400083E790E02CC084E790E029C088E790E0BB +:108C500026C089E790E023C08AE790E020C083E83F +:108C600090E01DC084E890E01AC08DE890E017C045 +:108C70008EE890E014C08FE890E011C080E990E0A9 +:108C80000EC081EA90E00BC085EB90E008C086EB57 +:108C900090E005C087EB90E002C088EB90E09093F5 +:108CA000010280930002BBC08FEF9FEF90930102FF +:108CB00080930002B8C0D8018C91883539F4C8017E +:108CC0000196EBD76A837B838C839D83F801808137 +:108CD000893539F4C8010196E0D76E837F83888790 +:108CE0009987D8018C918A3539F4C8010196D5D776 +:108CF0006A877B878C879D87F8018081813449F45E +:108D0000C8010196CAD70E9423556E877F87888B3A +:108D1000998BD8018C91823449F4C8010196BDD752 +:108D20000E9423556A8B7B8B8C8B9D8BF8018081F5 +:108D3000833449F4C8010196B0D70E9423556E8B45 +:108D40007F8B888F998FD8018C91833539F4C80136 +:108D50000196A3D76A8F7B8F8C8F9D8FF8018081BE +:108D6000803549F4C801019698D70E9423556E8F2B +:108D70007F8F88A399A3D8018C91863549F4C801C7 +:108D800001968BD70E9423556AA37BA38CA39DA336 +:108D9000F8018081873549F4C80101967ED70E9489 +:108DA00023556EA37FA388A799A7D8018C918534FA +:108DB00049F4C801019671D70E9423556AA77BA781 +:108DC0008CA79DA7F8018081843549F4C8010196DC +:108DD00064D70E9423556EA77FA788AB99ABD801B3 +:108DE0008C918D3449F4C801019657D70E942355C0 +:108DF0006AAB7BAB8CAB9DABF8018081813549F4CC +:108E0000C80101964AD70E9423556EAB7FAB88AF4D +:108E100099AF6AE074E080E090E042D78C010115E0 +:108E2000110509F048CF0E94B226DC011C961C9166 +:108E30000E949A21409074075090750760907607C1 +:108E400070907707CEA8DFA8E8ACF9AC0E94B226F4 +:108E5000C0925007D0925107E0925207F092530708 +:108E6000809100029091010299249394823091059F +:108E700038F09C012F5631092630310508F0912C2D +:108E8000112371F08D36910559F09C012857310955 +:108E90002330310528F0855B9109039708F0D0C293 +:108EA0000E949A218091680790916907A0916A07B2 +:108EB000B0916B070197A105B10529F0992019F030 +:108EC0008DEF92E0BFC2209719F489EF92E0BAC209 +:108ED000E0900002F0900102BFEFEB16FB06A9F351 +:108EE000E114F104B9F48091E40A9091E50A892B28 +:108EF00061F482E090E0A4D521E132E0FC0131830D +:108F000020839093E50A8093E40A0091E40A10918B +:108F1000E50A6EC0FCE1EF16F104B9F48091E60AAF +:108F20009091E70A892B61F482E090E089D52BE1EA +:108F300032E0DC012D933C939093E70A8093E60A9C +:108F40000091E60A1091E70A53C0BDE6EB16F10462 +:108F5000B9F48091E80A9091E90A892B61F482E0E2 +:108F600090E06ED525E232E0FC01318320839093BE +:108F7000E90A8093E80A0091E80A1091E90A53C0CF +:108F8000FFE6EF16F104B9F48091EA0A9091EB0A3A +:108F9000892B61F482E090E053D52FE232E0DC01CE +:108FA0002D933C939093EB0A8093EA0A0091EA0A8E +:108FB0001091EB0A53C000E010E0B0E7EB16F104AB +:108FC000B9F48091EC0A9091ED0A892B61F482E06A +:108FD00090E036D529E332E0FC0131832083909381 +:108FE000ED0A8093EC0A0091EC0A1091ED0A6CC036 +:108FF000F1E7EF16F104B9F48091EE0A9091EF0ACF +:10900000892B61F482E090E01BD523E432E0DC019F +:109010002D933C939093EF0A8093EE0A0091EE0A11 +:109020001091EF0A6CC0B2E7EB16F104B9F480912D +:10903000F00A9091F10A892B61F482E090E000D56A +:109040002DE432E0FC01318320839093F10A809378 +:10905000F00A0091F00A1091F10A6AC0F3E7EF16E6 +:10906000F104B9F48091F20A9091F30A892B61F42A +:1090700082E090E0E5D427E532E0DC012D933C93DB +:109080009093F30A8093F20A0091F20A1091F30A86 +:1090900068C0B4E7EB16F104B9F48091F40A90913A +:1090A000F50A892B61F482E090E0CAD421E632E02F +:1090B000FC01318320839093F50A8093F40A009198 +:1090C000F40A1091F50A68C0F8E7EF16F104B9F454 +:1090D0008091F60A9091F70A892B61F482E090E082 +:1090E000AFD42BE632E0DC012D933C939093F70A4A +:1090F0008093F60A0091F60A1091F70A68C0B9E762 +:10910000EB16F104A9F48091F80A9091F90A892BE1 +:1091100051F482E090E094D4FC01B182A08290935B +:10912000F90A8093F80A0091F80A1091F90A6AC0C6 +:10913000FAE7EF16F104A9F48091FA0A9091FB0A7C +:10914000892B51F482E090E07BD4DC012D923C929B +:109150009093FB0A8093FA0A0091FA0A1091FB0A95 +:109160006CC0BDE8EB16F104B9F48091FC0A909153 +:10917000FD0A892B61F482E090E062D429E832E0B4 +:10918000FC01318320839093FD0A8093FC0A0091B7 +:10919000FC0A1091FD0A6CC03EE8E316F104B9F434 +:1091A0008091FE0A9091FF0A892B61F482E090E0A1 +:1091B00047D4E3E9F2E0DC01ED93FC939093FF0ADE +:1091C0008093FE0A0091FE0A1091FF0A6CC0FFE82E +:1091D000EF16F104B9F48091000B9091010B892BEB +:1091E00061F482E090E02CD4EDE9F2E0DC01ED9353 +:1091F000FC939093010B8093000B0091000B109156 +:10920000010B6CC0F0E9EF16F104B9F48091020B88 +:109210009091030B892B61F482E090E011D4E7EA8E +:10922000F2E0DC01ED93FC939093030B8093020B2F +:109230000091020B1091030B6CC0F1EAEF16F104E0 +:10924000B9F48091040B9091050B892B61F482E0B5 +:1092500090E0F6D3E1EBF2E0DC01ED93FC93909328 +:10926000050B8093040B0091040B1091050B6BC050 +:10927000F5EBEF16F104B9F48091060B9091070B12 +:10928000892B61F482E090E0DBD3EBEBF2E0DC01D0 +:10929000ED93FC939093070B8093060B0091060BC4 +:1092A0001091070B50C0F6EBEF16F104B9F4809162 +:1092B000080B9091090B892B61F482E090E0C0D3F8 +:1092C000E5ECF2E0DC01ED93FC939093090B8093C5 +:1092D000080B0091080B1091090B35C0F7EBEF1646 +:1092E000F104B9F480910A0B90910B0B892B61F476 +:1092F00082E090E0A5D3EFECF2E0DC01ED93FC938B +:1093000090930B0B80930A0B00910A0B10910B0B9F +:109310001AC0F8EBEF16F104B1F480910C0B9091A8 +:109320000D0B892B61F482E090E08AD3E3EEF2E04A +:10933000DC01ED93FC9390930D0B80930C0B00914B +:109340000C0B10910D0B0115110589F489EF92E0BA +:109350000E94CA3F0E94B2260E94BC258EE094E083 +:109360000E94B83F8CE993E00E94B83F71C085EF3E +:1093700092E00E94CA3F0E94B2260E94BC250E9431 +:10938000B22610924F0710924E07E12CF12CFFEFFE +:10939000EF1AFF0A21E0E216F10441F081EF92E0BA +:1093A0000E94CA3F0E94B2260E94BC25D801ED91BE +:1093B000FC910480F581E02DBE01C80119950E9441 +:1093C000B226C0904E07D0904F070E94B226FC01F3 +:1093D0008485E114F104D9F281110AC0E414F50482 +:1093E0003CF4C114D10421F0F2E0CF16D10479F697 +:1093F0008FEB9BE00E943503181619062CF48FEBB7 +:109400009BE00E941303F4CFCD2809F439C29920C0 +:1094100009F433C20E949A218091700790917107DC +:10942000A0917207B09173070197A105B10509F0EA +:1094300024C20E94B22621E0DC011C962C931DC29E +:1094400081E093E00E94CA3F0E94B2260E94BC25A0 +:10945000CE018BD310927F0B10927E0B8091180B54 +:109460008111AAC00E94B226FC018485882309F4D8 +:10947000A3C00E945418EC01FC01E052FD4F108281 +:1094800040960E94032BCE0180579F4F0E94032BD2 +:10949000CE01805F9E4F0E94032B0E94301A7C01F8 +:1094A0008C01075C1F4FC1E0D0E06801F8E3CF1AE0 +:1094B000D108D6018C918823D9F084E294E00E94EF +:1094C000CA3F88E294E00E94CA3FCE010E940C414C +:1094D0008CE993E00E94CA3F60E08C2F0E94E40573 +:1094E00040E050E0BE01C7010E94DC18F601108286 +:1094F000D8018C918823F9F084E294E00E94CA3F5D +:109500008FE394E00E94CA3FCE010E940C418CE997 +:1095100093E00E94CA3F61E08C2F0E94D80660E071 +:109520008C2F0E94E40541E050E0BE01C7010E947B +:10953000DC18F801108221960F5F1F4FC533D1054B +:1095400009F0B3CF0E946D188091D90E90E09C0174 +:10955000220F331F820F931FFC01E85BF14F8081C4 +:109560008F7B80838091DC0E90E09C01220F331F63 +:10957000820F931FFC01E85BF14F80818F7B80831A +:109580008091DF0E90E09C01220F331F820F931F0A +:10959000FC01E85BF14F80818F7B80838091E20E3C +:1095A00090E09C01220F331F820F931FFC01E85BA8 +:1095B000F14F80818F7B80830E94B226DC011C9654 +:1095C0008C918093180BC091160BD091170B0E94B1 +:1095D0009A21FC0182819381C817D90799F00E94D2 +:1095E0009A21DC0112968D919C9113979093170B01 +:1095F0008093160B0E9454180E9479130E94B01891 +:109600000E9480180E9457076093120B7093130BEF +:109610008093140B9093150B0091810B1091820B8A +:109620002091830B3091840B601771078207930799 +:1096300008F4B6C0DC01CB01801B910BA20BB30B6D +:1096400089389341A105B10508F4B4C00E94B2263F +:10965000DC011C968C91882319F08DE093E002C008 +:1096600089E093E00E94CA3F0E94B2260E94BC2576 +:109670000E945418EC01FC01E554FD4F80818823C1 +:1096800041F0CE0180579E4F0E94462A6B017C011B +:1096900007C0FE01EC5AFF4FC080D180E280F3800A +:1096A0000E94B226C0925407D0925507E092560706 +:1096B000F0925707FE01E454FD4F8081882341F06A +:1096C000CE0182559E4F0E94462A6B017C0107C045 +:1096D000FE01EC52FF4FC080D180E280F3800E94F7 +:1096E000B226C0925807D0925907E0925A07F092DA +:1096F0005B07FE01E354FD4F8081882341F0CE01DA +:1097000084539E4F0E94462A6B017C0106C0CC5AAE +:10971000DE4FC880D980EA80FB800E94B226C092CA +:109720005C07D0925D07E0925E07F0925F070E94AF +:10973000B2260E940F260E9454180E949B170E9476 +:10974000B2260E9417270E94B2260E94CE250E94B0 +:109750009A218091680790916907A0916A07B0915A +:109760006B070197A105B10541F085E093E00E94E8 +:10977000CA3F0E94B2260E94BC2580910E0B909198 +:109780000F0BA091100BB091110B0196A11DB11DF3 +:1097900080930E0B90930F0BA093100BB093110BB3 +:1097A0000E9457076093810B7093820B8093830B09 +:1097B0009093840B0E94D20341C885E594E00E94F7 +:1097C000CA3F0E94541821E02F931F921F921F92AC +:1097D0001F92812C912CA12CB12CC12CD12C760163 +:1097E00097018601B701A6010E94A60A0F900F906B +:1097F0000F900F900F900C949F438DE694E00E9481 +:10980000CA3F0E9454181F9221E02F931F921F926B +:109810001F92812C912CA12CB12CC12CD12C760122 +:1098200097018601B701A6010E94A60A0F900F902A +:109830000F900F900F900C94BD4385E894E00E9428 +:10984000CA3F0E9454181F921F9221E02F931F922B +:109850001F92812C912CA12CB12CC12CD12C7601E2 +:1098600097018601B701A6010E94A60A0F900F90EA +:109870000F900F900F900C94DB4389EE92E002C0A2 +:109880008DEE92E00E94CA3F0E94B2260E94BC2543 +:109890000E94B22610925007109251071092520760 +:1098A00010925307D5CD80915C0C90915D0C5DC1F9 +:1098B0000F931F931092C20B1092C10B88EE93E08E +:1098C000A0E0B0E08093C30B9093C40BA093C50BB2 +:1098D000B093C60B8AE693E09093C00B8093BF0BC6 +:1098E00085EC90E09093CC0B8093CB0B84EC90E0D4 +:1098F0009093CE0B8093CD0B80EC90E09093D00BA7 +:109900008093CF0B81EC90E09093D20B8093D10B9E +:1099100082EC90E09093D40B8093D30B86EC90E094 +:109920009093D60B8093D50B1092D80B1092D90B35 +:109930001092DA0B1092DB0B82E090E081D02CE7E2 +:1099400033E0FC01318320839093630C8093620C9D +:109950006EE973E08CE59CE00E94490508E110E0A7 +:109960002AE130E04BE150E069E170E08FEC9DE0EE +:109970000E94DF280CE110E020E230E041E250E0FC +:109980006FE170E086E59DE00E94DF2807E110E0CE +:1099900023E230E044E250E062E270E08DED9CE0D2 +:1099A0000E94DF280DE110E02FE030E04EE150E0B2 +:1099B0006EE070E084E69CE00E94DF288091D80E83 +:1099C000A9EDBEE09FEF48EB5BE0803378F48C9329 +:1099D000282F30E0F901EE0FFF1F2E0F3F1FF90176 +:1099E000E85BF14F528341838F5F01C09C931396D4 +:1099F000FEE0A53EBF0749F78093D80E1F910F9157 +:109A00000895EF920F931F93CF93DF93E80147FDE3 +:109A100002C034E001C034E1E42F440FFF0BF7FF34 +:109A200003C0F195E195F109E32E022F2E2FAE012F +:109A3000B3D1CE01DF91CF911F910F91EF90089597 +:109A4000CF93DF938230910510F482E090E0E091B3 +:109A5000E90EF091EA0E20E030E0C0E0D0E030976F +:109A600011F14081518148175907C0F04817590733 +:109A700061F482819381209719F09B838A832BC0A4 +:109A80009093EA0E8093E90E26C02115310519F056 +:109A90004217530718F49A01BE01DF01EF0102805B +:109AA000F381E02DDCCF2115310509F1281B390B9D +:109AB0002430310590F412968D919C911397611585 +:109AC000710521F0FB019383828304C09093EA0E19 +:109AD0008093E90EFD01329644C0FD01E20FF31FB1 +:109AE00081939193225031092D933C933AC0209158 +:109AF000E70E3091E80E232B41F4209104023091BF +:109B000005023093E80E2093E70E20910202309177 +:109B100003022115310541F42DB73EB740910602ED +:109B200050910702241B350BE091E70EF091E80EEF +:109B3000E217F307A0F42E1B3F0B2817390778F024 +:109B4000AC014E5F5F4F2417350748F04E0F5F1F83 +:109B50005093E80E4093E70E8193919302C0E0E0AA +:109B6000F0E0CF01DF91CF9108950F931F93CF9332 +:109B7000DF93009709F48CC0FC01329713821282A4 +:109B80000091E90E1091EA0E0115110581F4208172 +:109B90003181820F931F2091E70E3091E80E281734 +:109BA000390779F5F093E80EE093E70E71C0D8011C +:109BB00040E050E0AE17BF0750F412962D913C9153 +:109BC0001397AD012115310509F1D901F3CF9D019D +:109BD000DA013383228360817181860F971F821798 +:109BE000930769F4EC0128813981260F371F2E5F16 +:109BF0003F4F318320838A819B8193838283452BCE +:109C000029F4F093EA0EE093E90E42C01396FC9318 +:109C1000EE931297ED01499159919E01240F351F42 +:109C2000E217F30771F480819181840F951F0296EA +:109C300011969C938E938281938113969C938E931D +:109C40001297E0E0F0E0D80112968D919C91139765 +:109C5000009719F0F8018C01F6CF8D919C91980135 +:109C60002E5F3F4F820F931F2091E70E3091E80E39 +:109C70002817390769F4309729F41092EA0E1092E8 +:109C8000E90E02C0138212821093E80E0093E70ED1 +:109C9000DF91CF911F910F9108956627772709C211 +:109CA00045EE5EE000C0FA01A191B081009719F481 +:109CB0001097E1F0CD01DC01CD010D90002011F4F1 +:109CC000C00113C0FB012191222319F02015D9F7FF +:109CD000F3CFFB012191201519F41E92119606C0B5 +:109CE0002223C1F70D900020A1F7D001FA01A19322 +:109CF000B0830895BB274A3031F4992322F4BDE2A2 +:109D0000909581959F4F30C0BB272A3051F49923FD +:109D100042F4BDE290958095709561957F4F8F4F8D +:109D20009F4F01C0BB27FA01A62F6217710581055D +:109D30009105330B30FB66F0AA27660F771F881F4B +:109D4000991FAA1FA21710F0A21B63953850A9F7FC +:109D5000A05DAA3308F0A95DA19336F7B111B193C4 +:109D60001082CA0104C4BB27FB015527AA27880F0C +:109D7000991FAA1FA41710F0A41B83955051B9F77F +:109D8000A05DAA3308F0A95DA193009779F7B111FE +:109D9000B1931192CB01EBC34F925F926F927F927E +:109DA0009F92AF92BF92CF92DF92EF92FF920F936A +:109DB0001F93CF93DF93CDB7DEB729970FB6F894F3 +:109DC000DEBF0FBECDBF6A01122FB02E2BE32017CE +:109DD00020F0FF24F394F00E02C0BCE3FB2E0F2D05 +:109DE00027E0AE014F5F5F4FCAD2AC018981982F47 +:109DF0009970913031F0E1FC06C0E0FE06C090E2BF +:109E000005C09DE203C09BE201C090E0EE2DE07131 +:109E100083FF3CC0911102C083E001C084E0811740 +:109E200018F4212F281B01C020E0E1110BC0F6011E +:109E3000822F30E2882319F031938150FBCFC20E7C +:109E4000D11C20E0992329F0D6019C93F60131968C +:109E50006F01C6010396E2FE0AC03EE4D6013C93C0 +:109E600041E411964C93119712963C9306C03EE63E +:109E7000F601308341E641833283FC01322F40E218 +:109E8000332309F442C041933150FACF82FF44C0DA +:109E9000911102C083E001C084E0811718F4212FE2 +:109EA000281B01C020E0E1110BC0F601822F30E237 +:109EB000882319F031938150FBCFC20ED11C20E0D2 +:109EC000992329F0D6019C93F60131966F01C601C2 +:109ED0000396E2FE0BC039E4D6013C933EE41196B2 +:109EE0003C93119736E412963C9307C039E6F6018D +:109EF00030833EE6318336E63283FC01322F40E286 +:109F0000332319F041933150FBCFFC01E20FF11DD7 +:109F100010828EEF9FEFB7C0F1E0911101C0F0E029 +:109F20006F2F70E01416150624F49A012F5F3F4F2F +:109F300002C021E030E0260F371FBB2029F06B2D37 +:109F400070E06F5F7F4F02C060E070E0260F371F48 +:109F5000612F70E0261737071CF4121B212F01C058 +:109F600020E03E2D387159F4D601322F60E23323C0 +:109F700019F06D933150FBCFC20ED11C20E0FF23AE +:109F800031F0D6019C93B6016F5F7F4F6B01E111F9 +:109F90000BC0F601922F30E3992319F031939150C1 +:109FA000FBCFC20ED11C20E09F2D940F3A81782F59 +:109FB0007071A72E84FF03C0313309F49150191634 +:109FC00024F4993018F098E001C091E0E42F852F37 +:109FD00057FF02C0E0E080E06E2F782FE0E0F0E075 +:109FE000AEE29A2E3A01691A71082A01461A570AF6 +:109FF0000B2D10E01195019511096F3F8FEF780738 +:10A0000029F4D6019C92C60101966C0146175707A8 +:10A0100084F0661677066CF47F01E40CF51CA1E071 +:10A02000B0E0AC0FBD1FEA0EFB1ED7011196BC902D +:10A0300002C090E3B92E615071093196C6010196B4 +:10A040007C016017710724F0D601BC926C01D5CF5A +:10A050006417750741F4363320F4353321F4A11029 +:10A0600002C081E3B82EF601B082F701822F90E2A0 +:10A07000882319F091938150FBCFF701E20FF11D76 +:10A08000108280E090E029960FB6F894DEBF0FBEF4 +:10A09000CDBFDF91CF911F910F91FF90EF90DF9097 +:10A0A000CF90BF90AF909F907F906F905F904F90B8 +:10A0B00008956F927F928F929F92AF92BF92CF92AC +:10A0C000DF92EF92FF920F931F93CF93DF93EC01F8 +:10A0D0007B016115710519F0DB018D939C938E0155 +:10A0E0000F5F1F4F7880872D90E021D2892B11F0D0 +:10A0F000E801F5CFBDE27B1205C00F5F1F4F7980ED +:10A10000C1E008C0EBE27E1204C08E010E5F1F4F5B +:10A110007980C0E06801F1E0CF1AD10843E050E057 +:10A1200064EF72E0C6010BD2892BE9F4680122E0EA +:10A13000C20ED11C45E050E06FEE72E0C601FFD1C7 +:10A14000892B21F4680187E0C80ED11CE114F104C9 +:10A1500019F0D701CD92DC92C111F9C060E070E036 +:10A1600080E89FE7FDC043E050E06CEE72E0C6017E +:10A17000E6D1892B51F4E114F10409F4EDC00E5F2E +:10A180001F4FF70111830083E7C0680160E070E0B2 +:10A19000CB0100E010E0F601D0EDD70DDA3050F53C +:10A1A0002C2F2260622E2C2F2870C2FF05C0211197 +:10A1B00027C00F5F1F4F24C0222311F00150110947 +:10A1C000A5E0B0E09B01AC0130D34B015C01880CF1 +:10A1D000991CAA1CBB1CC501B4016D0F711D811D0A +:10A1E000911D6839A9E97A078A07A9E19A0740F021 +:10A1F000C66005C0DE3F51F4C3FD44C0C8606C2E8C +:10A20000BFEFCB1ADB0A7080C62DC5CF2D2F2F7D57 +:10A210002531C1F540814D3211F4C06106C04B3289 +:10A2200021F0319621E030E006C03296D601119639 +:10A230004C9122E030E0A0EDA40FAA3018F0E21B10 +:10A24000F30B20C040E050E04038BCE05B075CF41A +:10A250009A01220F331F220F331F420F531F440F47 +:10A26000551F4A0F511D3196DF0111972C91A0ED1A +:10A27000A20FAA3048F3C4FF03C05195419551097C +:10A28000040F151FC1FF07C0E114F10421F031973D +:10A29000D701ED93FC937FD1C370C33019F06B01EC +:10A2A0007C0106C06B017C01F7FAF094F7F8F0949A +:10A2B00020E030E0A901C701B60169D1882309F483 +:10A2C00043C017FF06C0119501951109CBE0D3E0FB +:10A2D00002C0C3E2D3E05E01B8E1AB1AB1084601A7 +:10A2E000BE2DAF2D90E2E92EF12C0E151F057CF04E +:10A2F000FE012591359145915491B4018B2F9A2FF0 +:10A30000ABD14B01B82FA92F0E191F09EECF2497FF +:10A31000F594E794CA15DB0541F76401EB2EFA2E9C +:10A320008E2D880F8F2D881F8F3F41F020E030E069 +:10A33000A901C701B6012BD1811106C082E290E0CC +:10A340009093EC0E8093EB0EC701B60109C060E05C +:10A3500070E080E89FEF04C060E070E080EC9FE771 +:10A36000DF91CF911F910F91FF90EF90DF90CF90F1 +:10A37000BF90AF909F908F907F906F9008952830FE +:10A3800008F027E03327DA01990F311D87FD91602E +:10A3900000966105710539F432602E5F3D9330E31C +:10A3A0002A95E1F708959F3F30F0803871056105E7 +:10A3B00009F03C5F3C5F3D93913008F08068911D4F +:10A3C000DF93CF931F930F93FF92EF92192F987FF4 +:10A3D0009695E92F96959695E90FFF27EF57FC4F35 +:10A3E00099273327EE24FF24A701E701059008945D +:10A3F000079428F4360FE71EF81E491F511D660FFB +:10A40000771F881F991F0694A1F70590079428F4D9 +:10A41000E70EF81E491F561FC11D770F881F991F91 +:10A42000661F0694A1F70590079428F4F80E491FBB +:10A43000561FC71FD11D880F991F661F771F0694CF +:10A44000A1F70590079420F4490F561FC71FD81F86 +:10A45000990F661F771F881F0694A9F7849110959E +:10A46000177041F0D695C79557954795F794E7949F +:10A470001A95C1F7E7E2F3E06894159015913591CC +:10A480006591959105907FE27395E118F10A430B70 +:10A49000560BC90BD009C0F7E10CF11E431F561F24 +:10A4A000C91FD01D7EF4703311F48A95E6CFE8946D +:10A4B000015030F0080F0AF40027021708F4202F8B +:10A4C0002395022F7A3328F079E37D932A95E9F7D3 +:10A4D00010C07D932A9589F60694979567953795D0 +:10A4E00017951794E118F10A430B560BC90BD009C5 +:10A4F00098F023957E9173957A3308F070E37C93FE +:10A500002013B8F77E9170617D9330F0839571E3ED +:10A510007D9370E32A95E1F71124EF90FF900F915E +:10A520001F91CF91DF91992787FD90950895911103 +:10A53000F6C0803219F089508550D0F70895FB019C +:10A54000DC014150504088F08D9181341CF08B35F6 +:10A550000CF4805E659161341CF06B350CF4605E28 +:10A56000861B611171F3990B0895881BFCCFDC01E8 +:10A57000FC01672F71917723E1F7329704C07C913A +:10A580006D9370836291AE17BF07C8F3089540D0F2 +:10A5900008F481E00895E89409C097FB3EF4909593 +:10A5A0008095709561957F4F8F4F9F4F9923A9F0AC +:10A5B000F92F96E9BB279395F6958795779567953B +:10A5C000B795F111F8CFFAF4BB0F11F460FF1BC07F +:10A5D0006F5F7F4F8F4F9F4F16C0882311F096E912 +:10A5E00011C0772321F09EE8872F762F05C06623C0 +:10A5F00071F096E8862F70E060E02AF09A95660F79 +:10A60000771F881FDAF7880F9695879597F9089531 +:10A61000990F0008550FAA0BE0E8FEEF1616170673 +:10A62000E807F907C0F012161306E407F50798F0DB +:10A63000621B730B840B950B39F40A2661F0232BF4 +:10A64000242B252B21F408950A2609F4A140A69570 +:10A650008FEF811D811D08950BD07BC06CD028F039 +:10A6600071D018F0952309F05DC062C01124A5C017 +:10A6700081D0A0F3959FD1F3950F50E0551F629FB5 +:10A68000F001729FBB27F00DB11D639FAA27F00D4B +:10A69000B11DAA1F649F6627B00DA11D661F829F72 +:10A6A0002227B00DA11D621F739FB00DA11D621F57 +:10A6B000839FA00D611D221F749F3327A00D611D74 +:10A6C000231F849F600D211D822F762F6A2F112456 +:10A6D0009F5750408AF0E1F088234AF0EE0FFF1FA9 +:10A6E000BB1F661F771F881F91505040A9F79E3FE0 +:10A6F000510570F017C061C05F3FECF3983EDCF38A +:10A70000869577956795B795F795E7959F5FC1F71C +:10A71000FE2B880F911D9695879597F90895992797 +:10A720008827089597F99F6780E870E060E00895B2 +:10A730009FEF80EC089500240A9416161706180659 +:10A740000906089500240A94121613061406050635 +:10A750000895092E0394000C11F4882352F0BB0FC6 +:10A7600040F4BF2B11F460FF04C06F5F7F4F8F4F29 +:10A770009F4F089557FD9058440F551F59F05F3F64 +:10A7800071F04795880F97FB991F61F09F3F79F013 +:10A7900087950895121613061406551FF2CF469595 +:10A7A000F1DF08C0161617061806991FF1CF869517 +:10A7B0007105610508940895E894BB2766277727FB +:10A7C000CB0197F90895F999FECF92BD81BDF89A12 +:10A7D000992780B50895262FF999FECF1FBA92BD0B +:10A7E00081BD20BD0FB6F894FA9AF99A0FBE019672 +:10A7F0000895052E97FB16F400940FD057FD05D051 +:10A8000024D007FC02D046F408C0509540953095FE +:10A8100021953F4F4F4F5F4F0895909580957095CC +:10A8200061957F4F8F4F9F4F089531D0A59F900D19 +:10A83000B49F900DA49F800D911D11240895B7FF22 +:10A84000F4CFF3DF821B930B0895A1E21A2EAA1B0B +:10A85000BB1BFD010DC0AA1FBB1FEE1FFF1FA217D0 +:10A86000B307E407F50720F0A21BB30BE40BF50BCD +:10A87000661F771F881F991F1A9469F76095709556 +:10A88000809590959B01AC01BD01CF010895A29FD9 +:10A89000B001B39FC001A39F700D811D1124911DB4 +:10A8A000B29F700D811D1124911D08955058BB2732 +:10A8B000AA270ED04ECF3FDF30F044DF20F031F436 +:10A8C0009F3F11F41EF434CF0EF4E095E7FB2ACF3E +:10A8D000E92F50DF80F3BA176207730784079507E3 +:10A8E00018F071F49EF568CF0EF4E0950B2EBA2F98 +:10A8F000A02D0B01B90190010C01CA01A001112486 +:10A90000FF27591B99F0593F50F4503E68F11A1631 +:10A91000F040A22F232F342F4427585FF3CF4695C2 +:10A9200037952795A795F0405395C9F77EF41F16E4 +:10A93000BA0B620B730B840BBAF09150A1F0FF0FAE +:10A94000BB1F661F771F881FC2F70EC0BA0F621F9A +:10A95000731F841F48F4879577956795B795F7958A +:10A960009E3F08F0B3CF9395880F08F09927EE0F1C +:10A970009795879508950CD0ECCEE4DE40F0DBDEB1 +:10A9800030F021F45F3F19F0CDCE511116CFD0CE6B +:10A99000F1DE98F39923C9F35523B1F3951B550BB9 +:10A9A000BB27AA2762177307840738F09F5F5F4FA2 +:10A9B000220F331F441FAA1FA9F333D00E2E3AF0E3 +:10A9C000E0E830D091505040E695001CCAF729D0FD +:10A9D000FE2F27D0660F771F881FBB1F261737074C +:10A9E0004807AB07B0E809F0BB0B802DBF01FF277C +:10A9F00093585F4F2AF09E3F510568F093CEDDCE0D +:10AA00005F3FECF3983EDCF3869577956795B795B5 +:10AA1000F7959F5FC9F7880F911D9695879597F9D0 +:10AA20000895E1E0660F771F881FBB1F6217730749 +:10AA30008407BA0720F0621B730B840BBA0BEE1F5E +:10AA400088F7E095089504D06894B111B6CE0895C2 +:10AA500099DE88F09F5790F0B92F9927B751A0F051 +:10AA6000D1F0660F771F881F991F1AF0BA95C9F7A2 +:10AA700012C0B13081F0A0DEB1E008959DCE672F05 +:10AA8000782F8827B85F39F0B93FCCF38695779552 +:10AA90006795B395D9F73EF490958095709561953B +:10AAA0007F4F8F4F9F4F0895B3DD08F48FEF0895C8 +:10AAB000AFDD880B990B0895DB018F939F93B5DE73 +:10AAC000BF91AF91A29F800D911DA39F900DB29F4A +:10AAD000900D11240895991B79E004C0991F9617D1 +:10AAE00008F0961B881F7A95C9F780950895EE0F98 +:10AAF000FF1F881F8BBF0790F691E02D19946F926E +:10AB00007F928F929F92AF92BF92CF92DF92EF92FD +:10AB1000FF920F931F93CF93DF93EC01009789F47B +:10AB2000CB01DF91CF911F910F91FF90EF90DF90BC +:10AB3000CF90BF90AF909F908F907F906F900C942C +:10AB4000204DFC01E60FF71F9C0122503109E2174E +:10AB5000F30708F4ABC0D9010D911C9111970617AA +:10AB60001707B0F00530110508F49EC0C80104971E +:10AB70008617970708F498C002501109061B170B97 +:10AB8000019311936D937C93CF010E94B54D8CC0BE +:10AB90005B01A01AB10A4C01800E911EA091E90E32 +:10ABA000B091EA0E40E050E0E12CF12C109709F44E +:10ABB0004AC0A815B905D1F56D907C901197630135 +:10ABC00082E0C80ED11CCA14DB0480F1A3014A192B +:10ABD0005B096A0182E0C80ED11C1296BC901297E4 +:10ABE0001396AC91B5E0CB16D10440F0B282A383AA +:10ABF00051834083D9016D937C930AC00E5F1F4F30 +:10AC0000C301800F911FF90191838083EB2DFA2FEF +:10AC1000E114F10431F0D7011396FC93EE931297EF +:10AC200043C0F093EA0EE093E90E3EC08D919C91F3 +:10AC300011974817590708F4AC017D0112960D9041 +:10AC4000BC91A02DB3CF8091E70E9091E80E8815AE +:10AC50009905E1F446175707C8F4809102029091D4 +:10AC60000302009741F48DB79EB7409106025091C0 +:10AC70000702841B950BE817F907C0F4F093E80E60 +:10AC8000E093E70EF901718360830EC0CB010E944F +:10AC9000204D7C01009751F0A801BE011CD0CE01CF +:10ACA0000E94B54DC70104C0CE0102C080E090E013 +:10ACB000DF91CF911F910F91FF90EF90DF90CF9098 +:10ACC000BF90AF909F908F907F906F90089581E09C +:10ACD00090E0F89419C0FB01DC0102C001900D92D4 +:10ACE00041505040D8F70895FB01DC018D9101904F +:10ACF00080190110D9F3990B0895FB01DC01019033 +:10AD00000D920020E1F7089512E0C2EAD2E000E0DF +:10AD100005C0802FFE01EBDE2196011DC33AD1074D +:0AAD200080E00807B1F7F894FFCFB8 +:10AD2A00FFFF0000ED0E8000200A0D000000000069 +:10AD3A0000C5222820342000000000C42226201644 +:10AD4A00220000000075252B231127000000007443 +:10AD5A00252923372500000000732527230625000F +:10AD6A0000000072252523D5240000000071252348 +:10AD7A00239C240000000070252123632400000086 +:10AD8A00006F251F232A24000000006E251D23EFD3 +:10AD9A0026000000006D251B23BE23000000006C66 +:10ADAA00251923CB23000000006B2517232D230030 +:10ADBA000000006A2515239F23000000006925135F +:10ADCA0023882300000000682511234A230000007D +:10ADDA0000CA223220CB2200000000C9223020E41F +:10ADEA002000000000C8222E20DF2000000000C73B +:10ADFA00222C20152000000000C32224206D1F00F1 +:10AE0A00000000C6222A208A2052303300523032F3 +:10AE1A00005230370052303100523039005238383F +:10AE2A000052383700523838005230300052383722 +:10AE3A00005230380052313300523132005231312F +:10AE4A00005237330052373200523731005231370D +:10AE5A000052313600523135000100000001000075 +:10AE6A0000010000005238350052383400523035A3 +:10AE7A000052303600362E342E322E450000523023 +:10AE8A00340052383700000000006B03D502040377 +:10AE9A00B10335031303270300000000C222222056 +:10AEAA005239392041524455494E4F205354415248 +:10AEBA0054555020434F4D504C4554450D0A002AD5 +:10AECA0000473000473030004731004730310047F3 +:10AEDA0032380046303900463900463131004631B1 +:10AEEA0032004631330046313400463135004631AE +:10AEFA00360046323000463231004632320046339E +:10AF0A00310046333200463431004634320046348A +:10AF1A00330046343400463631004638310046386C +:10AF2A0032004638330046383400200A0D005239C0 +:10AF3A00392068616E646C6572203D3D204E554C27 +:10AF4A004C0D0A00523939002072657365747469B0 +:10AF5A006E67206469676974616C2070696E00208D +:10AF6A00726573657474696E6720616E616C6F6770 +:10AF7A002070696E0052393920484F4D45205A20B9 +:10AF8A004F4E20535441525455500D0A00523939EC +:10AF9A0020484F4D452059204F4E2053544152547A +:10AFAA0055500D0A0052393920484F4D4520582036 +:10AFBA004F4E20535441525455500D0A00206D698A +:10AFCA007320737470203D200052393920656D65F5 +:10AFDA007267656E63792073746F700D0A00523957 +:10AFEA0039206572726F720D0A0052383200523976 +:10AFFA00392073746F707065640D0A0052393920F4 +:10B00A006572726F7220002064656163746976618B +:10B01A007465206D6F746F72205820647565207492 +:10B02A006F206D6973736564207374657073002093 +:10B03A0064656163746976617465206D6F746F729B +:10B04A0020592064756520746F206D697373656477 +:10B05A002073746570730020646561637469766136 +:10B06A007465206D6F746F72205A20647565207440 +:10B07A006F206D6973736564207374657073005211 +:10B08A0039392074696D656F757420582061786943 +:10B09A00730D0A005239392074696D656F75742011 +:10B0AA005920617869730D0A005239392074696D23 +:10B0BA00656F7574205A20617869730D0A005234DD +:10B0CA003100500056005238332000523939205787 +:10B0DA00696C6C207A65726F205800523939205792 +:10B0EA00696C6C207A65726F205900523939205781 +:10B0FA00696C6C207A65726F205A00686F6D650DF5 +:10B10A000A0052323100523939204572726F723A4E +:10B11A0020696E76616C696420706172616D657414 +:10B12A0065722069640D0A002051005238310020EE +:10B13A00584100205842002059410020594200201D +:10B14A005A4100205A420052323000207374612062 +:10B15A000020637572200020656E642000206861FB +:10B16A006C662000206C656E2000206D696E2000E0 +:10B17A00206D6178200020737064200052393920D4 +:10B18A0043616C6962726174696F6E206572726F75 +:10B19A00723A20696E76616C6964206178697320FD +:10B1AA0073656C65637465640D0A00206178697360 +:10B1BA002000206174207374617274696E67207054 +:10B1CA006F696E7400523233002063616C69627277 +:10B1DA006174696E67206C656E67746800207374A9 +:10B1EA00657020636F756E743A2000523939206D8C +:10B1FA006F76656D656E7420646F6E650D0A00204A +:10B20A00617420656E6420706F696E7400523939FA +:10B21A002043616C6962726174696F6E2065727233 +:10B22A006F723A20656E642073746F702061637464 +:10B23A00697665206265666F7265207374617274DF +:10B24A000D0A00206D6F766520746F207374617229 +:10B25A007420666F722063616C6962726174696FCF +:0EB26A006E006E616E00696E66006F766600A3 +:00000001FF diff --git a/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex b/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex index de972c4f3..d5260df54 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/dump_info.ex @@ -69,6 +69,7 @@ defmodule FarmbotOS.SysCalls.DumpInfo do [_, _, _, "R"] -> "arduino" [_, _, _, "F"] -> "farmduino" [_, _, _, "G"] -> "farmduino_k14" + [_, _, _, "H"] -> "farmduino_k15" [_, _, _, "E"] -> "express_k10" _ -> nil end From 0ea73c00456eca6d4b373a814699c15326cebbda Mon Sep 17 00:00:00 2001 From: connor rigby Date: Fri, 27 Dec 2019 10:36:02 -0800 Subject: [PATCH 49/58] Release v9.0.0-rc9 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 829d26543..4d3445c4c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc8 \ No newline at end of file +9.0.0-rc9 \ No newline at end of file From ffce8a2c259bd683d56dc8e71635147cde9e217c Mon Sep 17 00:00:00 2001 From: Gabriel Burnworth Date: Fri, 27 Dec 2019 11:44:32 -0800 Subject: [PATCH 50/58] Update FEATURE_MIN_VERSIONS.json [skip ci] --- FEATURE_MIN_VERSIONS.json | 1 + 1 file changed, 1 insertion(+) diff --git a/FEATURE_MIN_VERSIONS.json b/FEATURE_MIN_VERSIONS.json index 96a827b36..54212e392 100644 --- a/FEATURE_MIN_VERSIONS.json +++ b/FEATURE_MIN_VERSIONS.json @@ -10,6 +10,7 @@ "endstop_invert": "6.4.1", "express_k10": "8.0.0", "farmduino_k14": "6.4.4", + "farmduino_k15": "9.0.0", "firmware_restart": "8.0.0", "flash_firmware": "8.0.0", "groups": "8.1.0", From 9e60d9199f9d3b106627c7ba184c15155a9c61cd Mon Sep 17 00:00:00 2001 From: gabrielburnworth Date: Mon, 30 Dec 2019 08:30:23 -0800 Subject: [PATCH 51/58] update farmduino_k15.hex --- farmbot_firmware/priv/farmduino_k15.hex | 5636 +++++++++++------------ 1 file changed, 2780 insertions(+), 2856 deletions(-) diff --git a/farmbot_firmware/priv/farmduino_k15.hex b/farmbot_firmware/priv/farmduino_k15.hex index d5d2d5c69..04264b308 100644 --- a/farmbot_firmware/priv/farmduino_k15.hex +++ b/farmbot_firmware/priv/farmduino_k15.hex @@ -1,2857 +1,2781 @@ -:10000000A2C20000D1C20000CFC20000CDC20000D9 -:10001000CBC20000C9C20000C7C20000C5C20000B8 -:10002000C3C20000C1C20000BFC20000BDC20000C8 -:10003000BBC20000B9C20000B7C200000C94B429D2 -:10004000B3C200000C943E09AFC20000ADC2000074 -:100050000C941D2AA9C20000A7C2000034C70000EA -:10006000A3C2000053C5000028C500009DC20000C7 -:100070009BC2000099C2000097C2000095C2000018 -:100080000C94110991C200008FC200008DC20000C3 -:100090008BC2000089C2000087C2000085C2000038 -:1000A00083C2000081C200000C94E4087DC20000FD -:1000B0007BC2000079C2000077C200000C94B70830 -:1000C00073C2000071C200006FC200006DC2000068 -:1000D0006BC2000069C2000067C2000065C2000078 -:1000E00063C200002504280417041B0421045F04D4 -:1000F0002C04300436043A043E04440448044C04FE -:100100005F04520456045A048C1991199619A019C7 -:10011000AA19231AB419BC19C419CE19D819E2198D -:10012000F119FB19231A051A0F1A191A421B4F1B32 -:10013000581B611B6E1B771B611F611F611F611FB5 -:10014000611F841B911B9E1B611FAB1BB41BBD1B3E -:10015000CA1BD31BDC1BE51BEE1BF71B611F001C1E -:10016000091C121C611F611F611F1B1C241C2D1CFC -:10017000611F611F361C431C611F611F611F501CE2 -:100180005D1C6A1C611F771C801C891C611F611F1C -:10019000611F921C9B1CA41C611FB11CBE1CCB1CAC -:1001A000611F611F611FD81CE51CF21C611FFF1C31 -:1001B0000C1D191D611F611F611F261D331D401D70 -:1001C000611F4D1D561D5F1D611F611F611F831D36 -:1001D000901D9D1D611FAA1DB71DC41D611F611FBC -:1001E000611F611F611F611F611F611F611F611F0F -:1001F000611F611F611FD11DDA1DE31D611FEC1D11 -:10020000F51DFE1D611F611F611F071E141E211EAB -:10021000611F2E1E3B1E481E611F611F611F551E60 -:10022000621E6F1E611F7C1E851E8E1E611F611F58 -:10023000611F971EA01EA91E611F611F611F611F04 -:10024000611F611F611F611F611F611F611F681DA9 -:10025000711D7A1D611F611F611F611F611F611F79 -:10026000611F611F611F611F611F611F611F611F8E -:10027000611F611F611F611F611F611F611F611F7E -:10028000611F611F611F611F611F611F611F611F6E -:10029000611F611F611F611F611F611F611F611F5E -:1002A000611F611F611F611F611F611F611F611F4E -:1002B000611F611F611F611F611F611F611FB21EEE -:1002C000BB1EC81E611FD51EDE1EEB1E611F611FF7 -:1002D000611FF81E011F0E1F611F1B1F241F311FEE -:1002E000611F611F611F3E1F471F541F4E414E4932 -:1002F0004E495459494E46CDCCCC3D0AD7233C17E4 -:10030000B7D13877CC2B329595E6241FB14F0A0030 -:100310000020410000C84200401C4620BCBE4CCA20 -:100320001B0E5AAEC59D7400407A10F35A00A0729D -:100330004E18090010A5D4E80000E8764817000020 -:10034000E40B54020000CA9A3B000000E1F50500EE -:100350000080969800000040420F000000A0860137 -:10036000000000102700000000E803000000006407 -:1003700000000000000A0000000000010000000072 -:10038000002C76D888DC674F0823DFC1DFAE59E147 -:10039000B1B796E5E3E453C63AE651997696E8E6B6 -:1003A000C28426EB898C9B62ED407C6FFCEFBC9C89 -:1003B0009F40F2BAA56FA5F490055A2AF75C936B9B -:1003C0006CF9676DC11BFCE0E40D47FEF520E6B556 -:1003D00000D0ED902E0300943577050080841E0830 -:1003E0000000204E0A000000C80C333333330F984E -:1003F0006E12831141EF8D2114893BE65516CFFE15 -:10040000E6DB18D1844B381BF77C1D901DA4BBE4A0 -:1004100024203284725E228100C9F124ECA1E53DE2 -:100420002700000A0B02090C0D0E08070304010047 -:1004300000000000000000000000000000000000BC -:100440000000000000000000000000000012111079 -:10045000000000000000000000000000000000009C -:100460000000000000000000002100240027002AF6 -:10047000002D003000330001010000040107010AD3 -:100480000100002200250028002B002E003100343E -:100490000002010000050108010B010000200023FB -:1004A00000260029002C002F00320000010000036C -:1004B00001060109010505050507050808080802E8 -:1004C0000202020A0A0808040404040101010101ED -:1004D0000101010303030303030303040707070CDC -:1004E0000C0C0C0C0C0C0C02020202060606060692 -:1004F0000606060B0B0B0B0B0B0B0B01021020203F -:100500000808102040102040800201020108040267 -:1005100001010204081020408080402010080402DD -:100520000180040201804020100804020108040236 -:10053000010102040810204080010204081020403C -:100540008000584C534C11241FBECFEFD1E2DEBFC8 -:10055000CDBF00E00CBF17E0A0E0B2E0EAE2FDEAA8 -:1005600000E00BBF02C007900D92AE34B107D9F77F -:100570002EE0AEE4B7E001C01D92AD3EB207E1F758 -:1005800012E0C2EAD2E000E006C021970109802F04 -:10059000FE010E947755C13AD10780E00807A9F70C -:1005A0000E9458420C9484562BCDCF92DF92EF924A -:1005B000FF920F931F93CF93DF936C017A018B010E -:1005C000C0E0D0E0CE15DF0589F0D8016D918D0136 -:1005D000D601ED91FC910190F081E02DC6011995B5 -:1005E000892B11F47E0102C02196ECCFC701DF9167 -:1005F000CF911F910F91FF90EF90DF90CF900895D2 -:10060000089580E090E00895FC01538D448D252FDE -:1006100030E0842F90E0821B930B541710F0CF969C -:10062000089501970895FC01918D828D981761F0CE -:10063000828DDF01A80FB11D5D968C91928D9F5F19 -:100640009F73928F90E008958FEF9FEF0895FC01C4 -:10065000918D828D981731F0828DE80FF11D858D77 -:1006600090E008958FEF9FEF0895FC01918D228D0A -:10067000892F90E0805C9F4F821B91098F7399278F -:1006800008958FEB9BE0F1DF21E0892B09F420E056 -:10069000822F0895FC01848DDF01A80FB11DA35A9C -:1006A000BF4F2C91848D90E001968F739927848F92 -:1006B000A689B7892C93A089B1898C9180648C9389 -:1006C000938D848D981306C00288F389E02D808174 -:1006D0008F7D80830895EF92FF920F931F93CF93A6 -:1006E000DF93EC0181E0888F9B8D8C8D981305C082 -:1006F000E889F989808185FD23C0F62E0B8D10E0F5 -:100700000F5F1F4F0F731127E02E8C8DE8120BC067 -:100710000FB607FCFACFE889F989808185FFF5CF0C -:10072000CE01B8DFF2CF8B8DFE01E80FF11DE35A49 -:10073000FF4FF0820B8FEA89FB898081806207C0BE -:10074000EE89FF896083E889F989808180648083EC -:1007500081E090E0DF91CF911F910F91FF90EF909A -:100760000895CF93DF93EC01888D8823C1F0EA8947 -:10077000FB89808185FD05C0A889B9898C9186FD9A -:100780000EC00FB607FCF5CF808185FFF2CFA88998 -:10079000B9898C9185FFEDCFCE017CDFE8CFDF9169 -:1007A000CF91089580E090E0892B19F06ADF8111E4 -:1007B00025C080E090E0892B41F080E090E0892B1B -:1007C00021F00E94000081111CC080E090E0892B84 -:1007D00041F080E090E0892B21F00E94000081111F -:1007E00013C080E090E0892BA1F080E090E0892B9D -:1007F00081F00E94000081110AC008950E9400004B -:10080000D8CF0E940000E1CF0E940000EACF0C94F4 -:100810000000089590E0FC013197E231F10508F005 -:100820004EC08827EE58FF4F8F4F0C94775580911C -:1008300080008F7703C0809180008F7D809380003F -:10084000089580918000877FF9CF84B58F7702C0AB -:1008500084B58F7D84BD08958091B0008F7703C0EB -:100860008091B0008F7D8093B000089580919000BA -:100870008F7707C0809190008F7D03C0809190009A -:10088000877F8093900008958091A0008F7707C0A4 -:100890008091A0008F7D03C08091A000877F80930E -:1008A000A0000895809120018F7707C080912001DA -:1008B0008F7D03C080912001877F80932001089560 -:1008C0003FB7F8948091970B9091980BA091990B5A -:1008D000B0919A0B26B5A89B05C02F3F19F0019641 -:1008E000A11DB11D3FBFBA2FA92F982F8827820FB6 -:1008F000911DA11DB11DBC01CD0142E0660F771F06 -:10090000881F991F4A95D1F708950E9467560F9343 -:100910001F93CF93DF93EC0188819981009729F091 -:100920002A813B812617370788F48B016F5F7F4F41 -:100930000E947F55009761F0998388831B830A8307 -:100940002C813D81232B11F4FC01108281E001C038 -:1009500080E0DF91CF911F910F910895EF92FF9268 -:100960000F931F93CF93DF93FC0124813581611591 -:10097000710511F480E018C041155105A1F07B010B -:10098000EC018A01020F131FB801C1DF882391F324 -:10099000288139818C819D81B701820F931F0E942C -:1009A0007D561D830C8381E0DF91CF911F910F91C4 -:1009B000FF90EF900895EF92FF920F931F93CF93C4 -:1009C000DF93CDB7DEB764970FB6F894DEBF0FBEE6 -:1009D000CDBF7C01CB01BA018E010F5F1F4F22E01A -:1009E00044E00E94014DBC01FC0101900020E9F7A8 -:1009F0003197AF01481B590BC701B0DF64960FB6A2 -:100A0000F894DEBF0FBECDBFDF91CF911F910F9144 -:100A1000FF90EF9008956115710549F0FB01019079 -:100A20000020E9F73197AF01461B570B97CF80E0C5 -:100A30000895FB0144815581608171818FCFEF92D0 -:100A4000FF920F931F93CF93DF93EC017B018A01F9 -:100A5000BA015DDF2881398181110DC02115310571 -:100A600019F0C9010E94B54D198218821D821C829D -:100A70001B821A8206C01D830C83B701C9010E9424 -:100A80007D56CE01DF91CF911F910F91FF90EF9096 -:100A90000895FC0111821082138212821582148241 -:100AA0006115710549F0FB0101900020E9F73197CC -:100AB000AF01461B570BC3CF08951F920F920FB67D -:100AC0000F9211240BB60F922F933F934F935F9386 -:100AD0006F937F938F939F93AF93BF93EF93FF9306 -:100AE0008FEB9BE0D7DDFF91EF91BF91AF919F918D -:100AF0008F917F916F915F914F913F912F910F90C7 -:100B00000BBE0F900FBE0F901F9018951F920F9263 -:100B10000FB60F9211240BB60F922F938F939F93C2 -:100B2000EF93FF93E091CF0BF091D00B8081E09198 -:100B3000D50BF091D60B82FD12C090818091D80B1D -:100B40008F5F8F732091D90B821751F0E091D80BF2 -:100B5000F0E0E154F44F958F8093D80B01C0808171 -:100B6000FF91EF919F918F912F910F900BBE0F905E -:100B70000FBE0F901F901895CF93DF93282F30E072 -:100B8000F901EF5DFB4F8491F901E550FB4FD491E2 -:100B9000F901EB54FB4FC491CC2389F081113ADE6B -:100BA000EC2FF0E0EE0FFF1FE556FB4FA591B4913F -:100BB000EC91ED2381E090E021F480E002C080E040 -:100BC00090E0DF91CF9108951F93CF93DF93282F6B -:100BD00030E0F901EF5DFB4F8491F901E550FB4FE7 -:100BE000D491F901EB54FB4FC491CC23C1F0162FE3 -:100BF000811110DEEC2FF0E0EE0FFF1FEF57FB4FDF -:100C0000A591B4918FB7F894111105C09C91ED2F67 -:100C1000E095E92302C0EC91ED2BEC938FBFDF91BF -:100C2000CF911F910895CF92DF92EF92FF920F9391 -:100C30001F93CF93DF936C018B017A01EC01C257B4 -:100C4000D44F888187FF04C0FB011182108224C029 -:100C50008CE08C9D90018D9D300D11248881A9011F -:100C6000480F511D87FD5A958091D80E90E0481786 -:100C7000590794F48881A901480F511D87FD5A95A1 -:100C8000CA01FA01EE0FFF1F8E0F9F1FFC01E85BE8 -:100C9000F14F808186FD19C088818F5F88838CE049 -:100CA0008C9D90018D9D300D11248881A901480FE4 -:100CB000511D87FD5A958091D80E90E0481759072D -:100CC000B4F488818C303CF112C08881280F311D2A -:100CD00087FD3A95F901EE0FFF1F2E0F3F1FF90117 -:100CE000E85BF14F808160E08F736EDFD5CFF80154 -:100CF00080819181049680349C4918F480E49CE9B9 -:100D000004C0F801808191810496F701918380836A -:100D10008FEF888344C0F801408151818881B901F7 -:100D2000680F711D87FD7A95CB01FB01EE0FFF1F48 -:100D30008E0F9F1FFC01E85BF14F81819281840F30 -:100D4000951FF701918380838881A901480F511D68 -:100D500087FD5A95CA01FA01EE0FFF1F8E0F9F1FE4 -:100D6000FC01E85BF14F808186FF19C08881280F64 -:100D7000311D87FD3A95F901EE0FFF1F2E0F3F1F22 -:100D8000F901E85BF14F808161E08F73DF91CF91D2 -:100D90001F910F91FF90EF90DF90CF9015CFDF91D3 -:100DA000CF911F910F91FF90EF90DF90CF9008951A -:100DB000CF93DF9390E0FC01E550FB4F2491FC01C1 -:100DC000EB54FB4F8491882361F190E0880F991FC9 -:100DD000FC01E959FB4FC591D491FC01EF57FB4F42 -:100DE000A591B491611109C09FB7F89488812095AD -:100DF00082238883EC912E230BC0623061F49FB76D -:100E0000F8943881822F809583238883EC912E2B50 -:100E10002C939FBF06C08FB7F894E8812E2B2883B0 -:100E20008FBFDF91CF9108958230910538F0880F00 -:100E3000991F880F991F05970197F1F708958F92D1 -:100E40009F92AF92BF92CF92DF92EF92FF926B018F -:100E50007C0136DD4B015C01C114D104E104F104D5 -:100E6000E9F02EDDDC01CB0188199909AA09BB093B -:100E7000883E9340A105B10578F321E0C21AD1085C -:100E8000E108F10888EE880E83E0981EA11CB11CD1 -:100E9000C114D104E104F10421F7DECFFF90EF90FB -:100EA000DF90CF90BF90AF909F908F9008952FB715 -:100EB000F8946091930B7091940B8091950B9091A5 -:100EC000960B2FBF08951F920F920FB60F92112409 -:100ED0002F933F938F939F93AF93BF938091930BE7 -:100EE0009091940BA091950BB091960B3091920B31 -:100EF00023E0230F2D3720F40196A11DB11D05C05D -:100F000026E8230F0296A11DB11D2093920B80931A -:100F1000930B9093940BA093950BB093960B8091A9 -:100F2000970B9091980BA091990BB0919A0B019609 -:100F3000A11DB11D8093970B9093980BA093990BD3 -:100F4000B0939A0BBF91AF919F918F913F912F9149 -:100F50000F900FBE0F901F901895CF92DF92EF92D7 -:100F6000FF92CF93DF93EC01603282E078070CF0C0 -:100F70003DC077FD06C0653B71052CF064EB70E069 -:100F800002C060E070E0898128E830E06901C81A99 -:100F9000D10887FDD394CC0CDD1CCC0CDD1C0D2CB2 -:100FA000000CEE08FF088A8128E532E0281B310991 -:100FB00087FD3395220F331F220F331FC901330FD3 -:100FC000AA0BBB0B9C01AD012C193D094E095F0911 -:100FD000DB010E941F5424EB30E040E050E00E940F -:100FE000F953C20ED31EE41EF51EB601888180336C -:100FF00080F5998148E850E0491B510997FD5395C8 -:10100000440F551F440F551F6417750784F09A81CC -:1010100028E532E0291B310997FD3395220F331F54 -:10102000220F331FAB01261737070CF4A9014250DA -:101030005109440F551F2FB7F89490E0FC01EE0FB3 -:10104000FF1F8E0F9F1FFC01E85BF14F528341830E -:101050002FBFDF91CF91FF90EF90DF90CF90089559 -:101060001F93CF93DF93EC01162F8881803308F014 -:101070004DC061E0812F9CDE8881E82FF0E09F0168 -:10108000220F331FE20FF31FE85BF14F1F739081B4 -:10109000907C192B108319821A826CE00E946B5588 -:1010A0009CE0899FB001112440E050E09A01260F96 -:1010B000371FF901EE0FFF1F2E0F3F1FF901E85BED -:1010C000F14F908196FD16C04F5F5F4F4C30510538 -:1010D00069F7813001F51092800082E080938100F1 -:1010E0001092850010928400B19A80916F00826006 -:1010F00080936F00E881F0E0CF01880F991FE80F1F -:10110000F91FE85BF14F8081806480838881DF91E3 -:10111000CF911F910895823061F4109290008093D6 -:101120009100109295001092940088BB80937100FA -:10113000E1CF833069F41092A00082E08093A10097 -:101140001092A5001092A40089BB80937200D2CFA8 -:101150008111D0CF1092200182E080932101109262 -:101160002501109224018ABB80937300C3CF1F9284 -:101170000F920FB60F9211240BB60F922F933F933D -:101180004F935F936F937F938F939F93AF93BF938F -:10119000EF93FF9348E251E064E271E080E090E079 -:1011A00042DDFF91EF91BF91AF919F918F917F9120 -:1011B0006F915F914F913F912F910F900BBE0F90C8 -:1011C0000FBE0F901F9018951F920F920FB60F929F -:1011D00011240BB60F922F933F934F935F936F930E -:1011E0007F938F939F93AF93BF93EF93FF9348EABF -:1011F00050E064EA70E083E090E015DDFF91EF914C -:10120000BF91AF919F918F917F916F915F914F911E -:101210003F912F910F900BBE0F900FBE0F901F901C -:1012200018951F920F920FB60F9211240BB60F92C2 -:101230002F933F934F935F936F937F938F939F93DE -:10124000AF93BF93EF93FF9348E950E064E970E0F8 -:1012500082E090E0E8DCFF91EF91BF91AF919F9128 -:101260008F917F916F915F914F913F912F910F904F -:101270000BBE0F900FBE0F901F9018951F920F92EC -:101280000FB60F9211240BB60F922F933F934F93EB -:101290005F936F937F938F939F93AF93BF93EF93DE -:1012A000FF9348E850E064E870E081E090E0BBDC48 -:1012B000FF91EF91BF91AF919F918F917F916F912E -:1012C0005F914F913F912F910F900BBE0F900FBEEA -:1012D0000F901F901895CF92DF92EF92FF920F938D -:1012E0001F93CF93DF938C01D62EEA01FC01E858BF -:1012F000FF4F8081E62EF12C882309F45DC060E069 -:10130000F801828561DC8D2D0E942E41F8018483D5 -:10131000EE0CEF2CEE1CFF08EF2869F08B810E9489 -:101320002E418A810E942E4189810E942E4188810E -:101330000E942E41D9C00E9473410E94734161E016 -:10134000F801828541DC60E0F80182853DDC8D2D6D -:101350000E942E4180E00E942E4190E0A0E0B0E08B -:10136000BA2FA92F982F882788839983AA83BB83B4 -:1013700080E00E942E41488159816A817B81482BFF -:10138000762F652F542F4427488359836A837B83A4 -:1013900080E00E942E41488159816A817B81482BDF -:1013A000762F652F542F4427488359836A837B8384 -:1013B00080E00E942E418FC0CFB6F89480918D0BB3 -:1013C000811123C0EAEEF4E08491E0E3F5E094912A -:1013D000E82FF0E0EE0FFF1FE959FB4FA591B49104 -:1013E000EC91E92319F461E085E3EEDB61E085E34C -:1013F000DFDC8CB580618CBD8CB580648CBD61E018 -:1014000084E3D6DC61E083E3D3DC80918D0B8F5FD6 -:1014100080938D0BCFBE8DE58CBD81E08DBD60E0EE -:10142000F8018285D1DB8D2D0E94AD29F8018483DE -:10143000EE0CEF2CEE1CFF08EF2869F08B810E9468 -:10144000AD298A810E94AD2989810E94AD298881B8 -:101450000E94AD2949C00E9411410E94114161E0E2 -:10146000F8018285B1DB60E0F8018285ADDB8D2D6E -:101470000E94AD2980E00E94AD2990E0A0E0B0E09C -:10148000BA2FA92F982F882788839983AA83BB8393 -:1014900080E00E94AD29488159816A817B81482B77 -:1014A000762F652F542F4427488359836A837B8383 -:1014B00080E00E94AD29488159816A817B81482B57 -:1014C000762F652F542F4427488359836A837B8363 -:1014D00080E00E94AD29488159816A817B81482B37 -:1014E000488359836A837B8361E0F8018285DF91B9 -:1014F000CF911F910F91FF90EF90DF90CF9064CB31 -:101500000F931F93462F50E060E070E024E0440FFB -:10151000551F661F771F2A95D1F7407155276627FB -:101520007727FC0106851785208931890F7E402B9E -:10153000512B622B732B46875787608B718BAC01C5 -:10154000425F5F4F60E81F910F91C5CE2F923F928F -:101550004F925F926F927F928F929F92AF92BF92C3 -:10156000CF92DF92EF92FF920F931F93CF93DF936F -:10157000CDB7DEB7E8970FB6F894DEBF0FBECDBF8C -:101580001C012A013B010F83188729873A8760963F -:101590000EAD1FAD6097FC01ED58FD4F608171816C -:1015A000828193810E94CD529B01AC01C301B201A3 -:1015B0000E942C530E942355698B7A8B8B8B9C8BBA -:1015C000F101E958FD4F60817181828193810E9410 -:1015D000CD529B01AC016F81788589859A850E94E7 -:1015E0002C530E9423556F8B788F898F9A8FF1012E -:1015F000E558FD4F60817181828193810E94CD52B7 -:101600009B01AC01C701B6010E942C530E942355D7 -:101610006B8F7C8F8D8F9E8F4ADC6D877E878F8747 -:10162000988BF101EC50FE4F11821082329611829C -:1016300010823E96A114B10461F0C501A0E0B0E0B3 -:10164000408151816281738184179507A607B7078E -:1016500014F0A080B180F101E85FFD4F8114910486 -:1016600061F0C401A0E0B0E04081518162817381EA -:1016700084179507A607B70714F080809180F101C1 -:10168000E45FFD4F0115110561F0C801A0E0B0E075 -:10169000408151816281738184179507A607B7073E -:1016A00014F0008111819101205F3F4F3E8B2D8B03 -:1016B000C501A0E0B0E0F10186A797A7A0ABB1AB50 -:1016C0002101F0E94F0E511CA12CB12CD2015E96E4 -:1016D0008D929D92AD92BC9291973101B0EF6B1AB1 -:1016E000BEEF7B0A20E030E0F301068F178F20A3C6 -:1016F00031A30E94B2260E94B2260E94B2260E9406 -:10170000B226409154075091550760915607709149 -:1017100057074DAB5EAB6FAB78AF0E94B22680919E -:10172000580790915907A0915A07B0915B078F8392 -:101730009887A987BA870E94B22680905C0790900C -:101740005D07A0905E07B0905F07F101E158FD4F83 -:1017500010821182128213823496108211821282B8 -:10176000138234961082118212821382349611826F -:101770001082329611821082329611821082329635 -:101780004DA95EA96FA978AD4083518362837383AD -:1017900034968F819885A985BA8580839183A283A9 -:1017A000B383349680829182A282B3826196EFAC39 -:1017B000619709891A892B893C898D899E890E94A4 -:1017C0002C2B8823F9F085E393E00E94CA3F88EB35 -:1017D00095E00E94CA3FF101E85AFF4F6081718194 -:1017E00082819381E55EFD4F208131814281538169 -:1017F0000E94F953CA01B9010E9416400E94B22604 -:101800000E94BC256296EFAC62970F89188D298DD6 -:101810003A8D4F81588569857A85C2010E942C2BAB -:101820008823F9F081E393E00E94CA3F88EC95E0B9 -:101830000E94CA3FF101E852FF4F608171818281AD -:101840009381E156FE4F20813181428153810E9474 -:10185000F953CA01B9010E9416400E94B2260E94A3 -:10186000BC256396EFAC63970B8D1C8D2D8D3E8D43 -:10187000B501A401C3010E942C2B8823F9F08DE24D -:1018800093E00E94CA3F88ED95E00E94CA3FF101B3 -:10189000E85AFE4F6081718182819381ED5DFE4F38 -:1018A00020813181428153810E94F953CA01B901DB -:1018B0000E9416400E94B2260E94BC25D101559676 -:1018C0001C92F101EB56FF4F1082E058FF4F10823F -:1018D000C1010E947D38C1010E9481388D899E8995 -:1018E0000E948C2FC2010E948C2FC3010E948C2F5A -:1018F000F101E550FE4FFAA3E9A381E090E0918366 -:1019000080837101F3E0EF1AFEEFFF0AD7018D9398 -:101910009C93810101501E4FF8019183808341E027 -:1019200050E06D897E89C1010E940A17D7014D914F -:101930005C91B201C1010E940A17F80140815181F6 -:10194000B301C1010E940A1711E0F101E052FD4FFD -:1019500010838D899E890E94172BC2010E94172B2C -:10196000C3010E94172B64E670E080E090E067DA24 -:10197000C10188509E4FDC011C9311961C93A1015C -:1019800046505E4FFA0110836196FFAD6197F111E9 -:101990000FC062962FAD6297211105C063963FADCF -:1019A0006397332339F191012B583F4FF90110828E -:1019B0006296FFAD6297F11105C091012B503F4F28 -:1019C000F90110826396FFAD6397F11105C0910193 -:1019D0002B583E4FF901108261962FAD6197FC01A3 -:1019E000208362963FAD62973C936396EFAD639719 -:1019F000DA01EC938D899E890E94D82CC2010E9445 -:101A0000D82CC3010E94D82C8D899E890E942E2C2F -:101A1000C2010E942E2CC3010E942E2C0E94B226CD -:101A2000DC011C968C91898B18861F82F101E8508D -:101A3000FE4FF88FEF8B910127503E4F3C8F2B8F3D -:101A4000A10146505E4F58A34F8FC10185509E4F54 -:101A50009EA38DA3D101A350BE4FB8A7AFA33796C5 -:101A6000FAA7E9A7215831403CA32BA34F535F4F5E -:101A70005CA74BA78C549F4F9EA78DA7AD52BF4F1D -:101A8000B8ABAFA7E256FF4FFAABE9AB275E3D4FCD -:101A90003CAB2BABEF89F88D808181110BC0AB8DF6 -:101AA000BC8D8C91811106C0EF8DF8A180818823B7 -:101AB00009F45AC3F989F11157C3D10150968D9198 -:101AC0009C9151978C010E591F4FF8011082118281 -:101AD00012821382A80163E7FEDBD801CD90DD906E -:101AE000ED90FC90C114D10499F084E294E00E943E -:101AF000CA3F8DE994E00E94CA3FC701B60188271A -:101B000099274AE00E94CB3F8CE993E00E94CA3FAC -:101B10004DA15EA16D897E89C1010E9463174FA10D -:101B200058A5B201C1010E94631749A55AA5B30186 -:101B3000C1010E9463178D899E890E94982CC20161 -:101B40000E94982CC3010E94982CEBA1FCA18081DB -:101B50008823E1F08D899E890E94D82C8BA49CA4B7 -:101B6000ADA4BEA4CFA4D8A8E9A8FAA80BA91CA923 -:101B7000910121583D4FA10140575E4F6D897E89EB -:101B8000C1010E942B36ABA1BCA11C92F101E8500F -:101B9000FF4FFC87EB878081882339F1C2010E94C7 -:101BA000D82C4101F4E48F1AFDEF9F0A51012DE476 -:101BB000A21A2DEFB20A61013EE2C31A3DEFD30A29 -:101BC00071014FE5E41A4DEFF40A81010B561D4FE8 -:101BD00091012D573D4FA10142555E4FB201C10108 -:101BE0000E942B36AB85BC851C92F101E858FE4F54 -:101BF000FC87EB878081882339F1C3010E94D82CB0 -:101C00004101F3E48F1AFDEF9F0A510129E4A21A62 -:101C10002DEFB20A61013CE2C31A3DEFD30A710114 -:101C20004BE5E41A4DEFF40A810107561D4F91016F -:101C300029573D4FA10144535E4FB301C1010E949A -:101C40002B36AB85BC851C9281010B581F4FF801C8 -:101C500080818823C1F1EC5CFD4F60817181072E8A -:101C6000000C880B990B0E94CD529B01AC01F10135 -:101C7000E158FD4F60817181828193810E945455AA -:101C800018160CF5D8011C9264E274E0810106512B -:101C90001E4FC8010E940B0567EE74E0C8010E9448 -:101CA0000B056CE973E0C8010E940B056196BFAD9E -:101CB0006197BB2309F450C3F101EC5AFF4F108226 -:101CC00011821282138281010B501F4FD8018C9117 -:101CD0008823C9F1F101E555FD4F60817181072E1F -:101CE000000C880B990B0E94CD529B01AC01F101B5 -:101CF000ED57FD4F60817181828193810E9454551F -:101D000018160CF5D8011C9264E274E081010651AA -:101D10001E4FC8010E940B056FE075E0C8010E94CC -:101D20000B056CE973E0C8010E940B056296BFAD1C -:101D30006297BB2309F415C3F101EC52FF4F1082E7 -:101D400011821282138281010B581E4FF80180818B -:101D50008823C1F1E85CFE4F60817181072E000C81 -:101D6000880B990B0E94CD529B01AC01F101E95700 -:101D7000FD4F60817181828193810E9454551816B4 -:101D80000CF5D8011C9264E274E0810106511E4FEB -:101D9000C8010E940B0567E375E0C8010E940B05AE -:101DA0006CE973E0C8010E940B056396BFAD6397B1 -:101DB000BB2309F4DBC2F101EC5AFE4F1082118201 -:101DC0001282138260E08D899E890E94A72B88234E -:101DD00039F0F101EC5AFF4F108211821282138206 -:101DE00060E0C2010E94A72B882339F0F101EC5278 -:101DF000FF4F108211821282138260E0C3010E94A1 -:101E0000A72B882339F0F101EC5AFE4F1082118282 -:101E100012821382F101EB58FF4F8081AF89B88D98 -:101E20008C93E058FF4F8081EB8DFC8D8083F10116 -:101E3000EB58FE4F8081AF8DB8A18C93E152F140F9 -:101E40004081518162817381E058FF4F8080918091 -:101E5000A280B380E058FF4FC080D180E280F38041 -:101E60004DAB5EAB6FAB78AF0E94B2264DA95EA9B9 -:101E70006FA978AD40935407509355076093560768 -:101E8000709357070E94B226809258079092590784 -:101E9000A0925A07B0925B070E94B226C0925C07DC -:101EA000D0925D07E0925E07F0925F07C1010E9449 -:101EB0007D38EF89F88D8081882309F44AC00E941B -:101EC00057072D853E854F8558896217730784070C -:101ED000950760F40E9457072D853E854F855889E8 -:101EE0006217730784079507A0F51EC00E94570765 -:101EF0006B017C012D853E854F855889C21AD30A16 -:101F0000E40AF50AF101E959FD4F2081318142814E -:101F10005381A8EEB3E00E9415546C157D058E0523 -:101F20009F0508F428C2D6CF0E9457076B017C0199 -:101F3000F101E959FD4F2081318142815381A8EEA1 -:101F4000B3E00E9415546C157D058E059F0508F4BD -:101F500012C2AB8DBC8D8C91882309F44AC00E94BB -:101F600057072D853E854F8558896217730784076B -:101F7000950760F40E9457072D853E854F85588947 -:101F80006217730784079507A0F51EC00E945707C4 -:101F90006B017C012D853E854F855889C21AD30A75 -:101FA000E40AF50AF101E559FD4F208131814281B2 -:101FB0005381A8EEB3E00E9415546C157D058E0583 -:101FC0009F0508F4EFC1D6CF0E9457076B017C0133 -:101FD000F101E559FD4F2081318142815381A8EE05 -:101FE000B3E00E9415546C157D058E059F0508F41D -:101FF000D9C1AF8DB8A18C91882309F44AC00E9441 -:1020000057072D853E854F855889621773078407CA -:10201000950760F40E9457072D853E854F855889A6 -:102020006217730784079507A0F51EC00E94570723 -:102030006B017C012D853E854F855889C21AD30AD4 -:10204000E40AF50AF101E159FD4F20813181428115 -:102050005381A8EEB3E00E9415546C157D058E05E2 -:102060009F0508F4B6C1D6CF0E9457076B017C01CB -:10207000F101E159FD4F2081318142815381A8EE68 -:10208000B3E00E9415546C157D058E059F0508F47C -:10209000A0C18FEB9BE00E943503181619068CF542 -:1020A0008FEB9BE00E9413038F7D8534910549F5EA -:1020B00069EA74E0C10186519E4F0E940B0582E6D9 -:1020C00093E00E94CA3F0E94B2260E94BC25F10103 -:1020D000EB58FF4F1082E058FF4F1082E058FF4F3F -:1020E0001082AF89B88D1C92EB8DFC8D1082AF8D64 -:1020F000B8A11C92B1E0B98BE1E0F0E0F887EF8382 -:1021000004C02F813885232B81F06EEB74E0C10170 -:1021100086519E4F0E940B05AF89B88D1C92EB8DA6 -:10212000FC8D1082AF8DB8A11C92C1010E94803F2E -:10213000F101EA50FE4F8081918101969183808365 -:102140008D3291400CF4A6CCD101A251BE4F8D919D -:102150009C911197892B09F09DCC14968D919C919F -:10216000892B09F44DC196CC810102511E4FD80133 -:102170008D919C91892B21F0C1010E94803FF7CF66 -:102180008EEC94E00E94CA3F6196BFAD6197BB237D -:1021900011F1EF81F885EF2BF1F4F989F11142C0CB -:1021A0008DE193E00E94CA3F0E94B2260E94BC25A6 -:1021B00062962FAD6297222381F189E193E00E941C -:1021C000CA3F0E94B2260E94BC2563963FAD63972A -:1021D00031111AC027C062964FAD6297442341F077 -:1021E0008F819885892B21F4998991111BC0E5CFA6 -:1021F0006396AFAD6397AA23A9F0EF81F885EF2B23 -:1022000089F4F989F1110EC085E193E00E94CA3F7B -:102210000E94B2260E94BC2505C063969FAD6397BD -:102220009111F2CF85E090E0A9A1BAA18D939C9382 -:10223000910123503E4F3E872D87D9018D939C936A -:10224000810101501E4FF8019183808345E050E0E9 -:102250006D897E89C101DED5AD85BE854D915C91CC -:10226000B201C101D7D5F80140815181B301C1014B -:10227000D1D5C1010E948538F101EC5AFF4F408150 -:10228000518162817381E058FF4FC080D180E2802C -:10229000F380E058FF4F80809180A280B3804DABE7 -:1022A0005EAB6FAB78AF0E94B2264DA95EA96FA955 -:1022B00078AD409354075093550760935607709339 -:1022C00057070E94B226C0925807D0925907E09251 -:1022D0005A07F0925B070E94B22680925C079092A8 -:1022E0005D07A0925E07B0925F07C1010E947D3832 -:1022F000C1010E9481380E94B2260E940F26C101AE -:102300001AD6A9A1BAA11D921C92ED85FE85118253 -:102310001082D8011D921C9240E050E06D897E89A8 -:10232000C10178D5ED85FE8540815181B201C101A1 -:1023300071D5D8014D915C91B301C1016BD5C1013B -:102340000E948538B989BB2309F457C10E94B2267F -:1023500021E0FC01248751C1E1E0F0E0F887EF8340 -:10236000B2CCE1E0F0E0F887EF83EDCCE1E0F0E023 -:10237000F887EF8327CD69E273E0810106511E4F94 -:10238000C8010E940B056CE973E0C8010E940B05AF -:102390006FE575E0C8010E940B0522E030E0388748 -:1023A0002F83D7CD65E273E0810106511E4FC8012E -:1023B0000E940B056CE973E0C8010E940B0564E7FD -:1023C00075E0C8010E940B0542E050E058874F833A -:1023D00010CE61E273E0810106511E4FC8010E94D8 -:1023E0000B056CE973E0C8010E940B0569E875E014 -:1023F000C8010E940B0582E090E098878F8349CE48 -:1024000011821082F101EC50FE4F80819181009782 -:1024100049F46EE573E0810106511E4FC8010E9428 -:102420000B05C6C0019709F0D4C00E94B2268C01EA -:10243000FC0180819181A281B381181619061A06C8 -:102440001B0644F081E090E0A0E0B0E0808391833F -:10245000A283B383F80184819581A681B781181680 -:1024600019061A061B0644F081E090E0A0E0B0E0F7 -:1024700084839583A683B783F80180859185A2859F -:10248000B385181619061A061B0644F081E090E081 -:10249000A0E0B0E080879187A287B3876EE973E000 -:1024A000CE0101960E9449056AEC74E0CE010196C6 -:1024B0000E940B0568EB75E0CE0101960E940B05AA -:1024C0006091540770915507809156079091570776 -:1024D0000E94CD526B017C01D8016D917D918D914F -:1024E0009C910E94CD529B01AC01C701B6010E9494 -:1024F000BB54AB01BC01CE0101960E94DB0468EC29 -:1025000075E0CE0101960E940B056091580770910D -:10251000590780915A0790915B070E94CD526B0139 -:102520007C01F80164817581868197810E94CD527A -:102530009B01AC01C701B6010E94BB54AB01BC01B9 -:10254000CE0101960E94DB0468ED75E0CE01019694 -:102550000E940B0560915C0770915D0780915E079A -:1025600090915F070E94CD526B017C01D8011896B3 -:102570006D917D918D919C911B970E94CD529B01F5 -:10258000AC01C701B6010E94BB54AB01BC01CE0136 -:1025900001960E94DB04BE016F5F7F4F81010651EF -:1025A0001E4FC8010E94190589819A810E94B54D6C -:1025B0000E94B226BC01CE0101960E947625BE0182 -:1025C0006F5F7F4FC8010E94190589819A810E941F -:1025D000B54DF101EC50FE4F808191810196823022 -:1025E00091051CF49183808302C011821082F10155 -:1025F000EE50FE4F118210824DCA8CED94E00E9485 -:10260000CA3F8F8198850E940C418CE993E00E941B -:10261000CA3F0E94B2262F81388530934F072093FE -:102620004E07C901E8960FB6F894DEBF0FBECDBFC6 -:10263000DF91CF911F910F91FF90EF90DF90CF909E -:10264000BF90AF909F908F907F906F905F904F90D2 -:102650003F902F900895CF92DF92EF92FF920F93C9 -:102660001F93CF93DF937C016B018A01E9010E94E4 -:102670009A21F601EE0FFF1FEE0FFF1FE05AF84FF1 -:1026800080819181F701918380830E949A21000FBC -:10269000111F000F111FF801E05AF84F81E040812F -:1026A000518162817381413051056105710509F0E5 -:1026B00080E0F70182870E949A21CC0FDD1FCC0FAA -:1026C000DD1FC05AD84F88819981AA81BB81F7014B -:1026D00082839383A483B583168217821086118622 -:1026E000DF91CF911F910F91FF90EF90DF90CF90EE -:1026F0000895AF92BF92CF92DF92EF92FF920F9325 -:102700001F93CF93DF93EC018AE190E09C8F8B8F36 -:102710008BE190E09E8F8D8F89E190E098A38F8F61 -:102720008FE090E09AA389A38EE190E09CA38BA315 -:102730008EE090E09EA38DA385E490E098A78FA300 -:1027400084E490E09AA789A7FE01E057FF4F80E25A -:1027500090E09487838781E290E0968785878FE178 -:1027600090E0908B8787128A118A148A138A168ABE -:10277000158A83E490E0908F878B82E490E0928FBB -:10278000818FE058FF4F83E290E09487838784E253 -:1027900090E09687858782E290E0908B8787128A07 -:1027A000118A148A138A168A158A81E490E0908F20 -:1027B000878B80E490E0928F818FE551FF4F1182EB -:1027C0001082329611821082329611821082CE01CE -:1027D0000E94AE2FCE010E94B338CE0180579E4F8B -:1027E00041E050E0FC01558F448FDE01A255BE4F01 -:1027F00024E030E05D963C932E935C975E01F4E319 -:10280000AF1AFEEFBF0A28E030E0F501358F248FC4 -:1028100020E130E0FC013183208321E130E0358389 -:1028200024832FEF3FEF3383228337832683628510 -:1028300060876385618767E170E011967C936E9392 -:1028400068E170E015967C936E93149713963C9311 -:102850002E93129717963C932E9316971A966C9177 -:102860001A9718966C9318971B966C911B9719964C -:102870006C9319976DE170E0F501718360836CE1F1 -:1028800070E0758364833383228337832683628574 -:10289000608763856187BE016A527D4FFB0160815D -:1028A00071818E010C531D4FF801C080D180E280F0 -:1028B000F38006501109F80100811181FC01118F8C -:1028C000008FC48AD58AE68AF78A6130710519F4C7 -:1028D000338F228F03C0FC01538F428FCE01885269 -:1028E0009D4FFC01808191819E0128533D4FF9014C -:1028F000408151816281738128503109F901208121 -:10290000318159963C932E93589754964D935D93ED -:102910006D937C935797019719F48FEF9FEF02C047 -:1029200081E090E05B969C938E935A97DE01A652CD -:10293000BD4F8D919C9111971E974D915D916D9119 -:102940007C91CE53DD4F28813981F501318F208F65 -:10295000448B558B668B778B019719F48FEF9FEF24 -:1029600003C081E090E0F501938F828FDF91CF91DA -:102970001F910F91FF90EF90DF90CF90BF90AF909D -:1029800008952F923F924F925F926F927F928F9213 -:102990009F92AF92BF92CF92DF92EF92FF920F93EE -:1029A0001F93CF93DF93CDB7DEB7C058D1090FB6D1 -:1029B000F894DEBF0FBECDBF8C01FC0110821182E6 -:1029C0001282138214821582168217821086118653 -:1029D0001286138614861586168617862C01F0E15A -:1029E0004F0E511CC2010E941438380180E9680E54 -:1029F000711CC3010E9414384801E0EF8E1AEEEFFB -:102A00009E0AC4010E9414385801F0E7AF1AFEEF85 -:102A1000BF0AC5010E94702A680182E5C81A8EEFBC -:102A2000D80AC6010E94702A7801E4E3EE1AEEEF9C -:102A3000FE0AC7010E94702A6EE973E0C801865140 -:102A40009E4F0E944905F801E051FE4F118210820D -:102A50003296118210823296118210823296118241 -:102A60001082329610823196108231961082319601 -:102A70001182108232961182108232961182108257 -:102A800032961082319610823196108231961082E1 -:102A90001182128213823496108211821282138262 -:102AA000349610821182128213823496108211821F -:102AB000128213823496108211821282138234960B -:102AC0001082118212821382349610821182128235 -:102AD00013823496108211821282138234961082ED -:102AE0001182128213823496108211821282138212 -:102AF00034961082118212821382349610821182CF -:102B000012821382349610821182128213823496BA -:102B100010821182128213823496108211821282E4 -:102B2000138234961082319610823196108231963B -:102B300010821182128213823496108211821282C4 -:102B4000138234961082118212821382349610827C -:102B50003196108231961082319610823196108211 -:102B60003196108231961082319610823196108201 -:102B700031961082319610823196108231961082F1 -:102B800031961082319610823196108231961082E1 -:102B900031961082319610823196108231961082D1 -:102BA00031961082319610823196108231961082C1 -:102BB0001182128213823496108211821282138241 -:102BC00034961082118212821382D801AD58BD4F03 -:102BD0008CE0E9E3F3E001900D928A95E1F7F801CA -:102BE000E158FD4F108211821282138234961082B6 -:102BF0001182128213823496108211821282138201 -:102C0000349611821082329611821082329611828D -:102C100010823296108211821282138234961082B0 -:102C200011821282138234961082118212821382D0 -:102C3000349610821182128213823496108211828D -:102C40001282138234961082118212821382349679 -:102C50001182108232961182108232961182108275 -:102C6000329610821182128213823496108211825F -:102C70001282138234961082118212821382349649 -:102C80001082319610823196108231961182108214 -:102C90003296118210823296118210823296108200 -:102CA0001182128213823496108211821282138250 -:102CB000349610821182128213823496118210820D -:102CC00032961182108232961182108232961182CF -:102CD00010823296118210823296118210823296C0 -:102CE000118210823296118210821801F0E22F1A9E -:102CF000FDEF3F0AF1011082CE0101960E941438C7 -:102D000080E8FE013196D20101900D928A95E1F79B -:102D1000CE0101960E94143880E8FE013196D3015D -:102D200001900D928A95E1F7CE0101960E94143828 -:102D300080E8FE013196D40101900D928A95E1F769 -:102D400088E5F801848BEC56FF4F89E58083E058D5 -:102D5000FF4F8AE58083CE0101960E94702A8EE1A2 -:102D6000FE013196D50101900D928A95E1F7CE01D1 -:102D700001960E94702A8EE1FE013196D6010190E3 -:102D80000D928A95E1F7CE0101960E94702A8EE19C -:102D9000FE013196D70101900D928A95E1F7C801A5 -:102DA000A8DCF1011082C058DF4F0FB6F894DEBFE7 -:102DB0000FBECDBFDF91CF911F910F91FF90EF908C -:102DC000DF90CF90BF90AF909F908F907F906F904B -:102DD0005F904F903F902F9008950F931F93CF9344 -:102DE000DF938B01EA0181E593E00E94CA3F89EA03 -:102DF00095E00E94CA3FF80184810E940B40CE01F9 -:102E00000E940C410E94B226DF91CF911F910F9139 -:102E10000C94BC25CF92DF92EF92FF920F931F93F9 -:102E2000CF93DF93CDB7DEB728970FB6F894DEBF08 -:102E30000FBECDBF8B016A0186519E4F7C016DE4B0 -:102E400073E00E940B0569EA75E0C7010E940B055B -:102E5000F801848189831A8241E050E08E010F5F7E -:102E60001F4FB801C7010E94AE044AE0B801C60175 -:102E70000E947A4EF80101900020E9F73197AF01E6 -:102E8000401B510BB801C7010E94AE040E94B2263C -:102E9000BC01C8010E947625B801C7010E9419052E -:102EA00089819A810E94B54D28960FB6F894DEBFAD -:102EB0000FBECDBFDF91CF911F910F91FF90EF908B -:102EC000DF90CF900895FC01DB01A759BF4F8C9193 -:102ED000882319F022E030E002C020E030E0DB017E -:102EE000A559BF4F8C91882311F023E030E0DB011E -:102EF000A659BF4F8C91882311F024E030E0DB010C -:102F0000A459BF4F8C91882311F026E030E0DA01FC -:102F10008D919C918217930721F091E01216130670 -:102F20000CF090E0DA012D933C93992319F0A9015C -:102F3000CF0170CF08958F929F92AF92BF92CF92A0 -:102F4000DF92EF92FF920F931F93CF93DF93EC01E9 -:102F500089E493E00E94CA3F88EB95E00E94CA3F53 -:102F60006E0180E7C81A8EEFD80AC6010E94462A71 -:102F70000E94CD524B015C01FE01ED58FD4F608176 -:102F80007181828193810E94CD529B01AC01C50168 -:102F9000B4010E94BB5442E00E943D4088EC95E0A1 -:102FA0000E94CA3F7E01E2E5EE1AEEEFFE0AC7017B -:102FB0000E94462A0E94CD524B015C01FE01E95855 -:102FC000FD4F60817181828193810E94CD529B016E -:102FD000AC01C501B4010E94BB5442E00E943D40D7 -:102FE00088ED95E00E94CA3F8E0104531E4FC80130 -:102FF0000E94462A0E94CD524B015C01C558DD4F0C -:10300000688179818A819B810E94CD529B01AC01AC -:10301000C501B4010E94BB5442E00E943D400E94A1 -:10302000B2260E94BC2585E493E00E94CA3F88EB4B -:1030300095E00E94CA3FF601A28DB38D20893189A7 -:10304000428953890E941F540E94164088EC95E0E3 -:103050000E94CA3FF701A28DB38D20893189428930 -:1030600053890E941F540E94164088ED95E00E94EB -:10307000CA3FF801A28DB38D2089318942895389D5 -:103080000E941F540E9416400E94B226DF91CF91E9 -:103090001F910F91FF90EF90DF90CF90BF90AF9076 -:1030A0009F908F900C94BC25CF93DF938091A10BC0 -:1030B0009091A20B892B51F481EE92E00E94204D59 -:1030C000EC015FDCD093A20BC093A10B8091A10B0C -:1030D0009091A20BDF91CF91089580919F0B9091D9 -:1030E000A00B892B41F481E090E00E94204D909349 -:1030F000A00B80939F0B80919F0B9091A00B089544 -:10310000CF93DF93EC012AEC30E04BEC50E069EC1C -:1031100070E0A1DA2EEC30E04FEC50E06DEC70E0A6 -:10312000CE010C9698DA24ED30E045ED50E063EDE9 -:1031300070E0CE0148968FDA28ED30E049ED50E09E -:1031400067ED70E0CE01849686DA2EED30E04FED2B -:1031500050E06DED70E0CE01C096DF91CF917BCA5B -:10316000CF93DF9380919D0B90919E0B892BE9F477 -:103170008CE390E00E94204DEC01FC01CC96118282 -:1031800010823C96E817F907D1F7198218821D863C -:103190001C86198E188E1DA21CA219AA18AACE016F -:1031A000AFDFD0939E0BC0939D0B80919D0B9091B0 -:1031B0009E0BDF91CF910895EF92FF920F931F9393 -:1031C000CF93DF93162F072F7A014115510559F43C -:1031D000862F0E94BC0531E020E0019709F030E025 -:1031E000C32FD22F26C04130510509F5262F663353 -:1031F00010F02AEC260F80917B00922F9870877F29 -:10320000892B80937B002770206420937C00809121 -:103210007A00806480937A0080917A0086FDFCCFEA -:10322000C091780080917900D0E0D82B02C0C0E036 -:10323000D0E082E0E816F10410F58EE995E00E94F6 -:10324000CA3F89EA95E00E94CA3F82EA95E00E945F -:10325000CA3F812F902F0E940C4189EA95E00E947D -:10326000CA3F84EA95E00E94CA3FCE010E940C4109 -:103270000E94B2260E94BC2580E090E002C081E05E -:1032800090E0DF91CF911F910F91FF90EF90089503 -:103290000F931F93CF93DF938B01EA01AB01415052 -:1032A00051094433510508F0D4C02230310508F0EB -:1032B000D0C048E3429FF001439FF00D1124E60F78 -:1032C000F71FE80FF91F81E08083232B11F46C2F87 -:1032D00007C061E0802F0E94D806209739F460E093 -:1032E000802F0E94E40580E090E0B5C0CF3FD1057B -:1032F00009F4ADC0F801EF5DFB4FE4918E2F90E033 -:10330000FC013197E231F10508F09DC08827EC57A8 -:10331000FF4F8F4F0C94775584B5806884BDC7BD2F -:10332000E2CF84B5806284BDC8BDDDCF80918000CE -:10333000806880938000D0938900C0938800D3CFA9 -:1033400080918000806280938000D0938B00C09336 -:103350008A00C9CF80918000886080938000D093DC -:103360008D00C0938C00BFCF8091B00080688093A7 -:10337000B000C093B300B7CF8091B000806280935B -:10338000B000C093B400AFCF80919000806880936C -:103390009000D0939900C0939800A5CF80919000A1 -:1033A000806280939000D0939B00C0939A009BCF43 -:1033B00080919000886080939000D0939D00C0938E -:1033C0009C0091CF8091A00080688093A0008091A4 -:1033D000A0008F7B8093A000D093A900C093A80089 -:1033E00082CF8091A00080628093A000D093AB0038 -:1033F000C093AA0078CF8091A00088608093A0003D -:10340000D093AD00C093AC006ECF80912001806856 -:1034100080932001D0932901C093280164CF80912B -:103420002001806280932001D0932B01C0932A0158 -:103430005ACF80912001886080932001D0932D0184 -:10344000C0932C0150CFC038D1050CF448CF61E0B7 -:1034500047CF81E090E0DF91CF911F910F910895C8 -:1034600080919B0B90919C0B892BA1F480E790E0BD -:103470000E94204DFC01F9969C0123593F4FDF012A -:10348000D8971C921192E217F307C9F790939C0BFF -:1034900080939B0B80919B0B90919C0B08950F93B5 -:1034A0001F93CF93DF93FC012081318121153105DA -:1034B000D1F1EC01822F0E94BC0521E0892B09F497 -:1034C00020E02B876A85261729F01E821F82188626 -:1034D00019860BC08E819F81A885B9850196A11D93 -:1034E000B11D8E839F83A887B9870E811F81288590 -:1034F00039858A819B81AC81BD81081719072A070C -:103500003B078CF081E0682788810E94E4050990E0 -:10351000D881C02DA5DF40E050E0BE01DF91CF9102 -:103520001F910F9149CEDF91CF911F910F91089577 -:10353000643571050CF052C0613571050CF095C011 -:103540006C32710554F5693271050CF08EC068312A -:10355000710594F46F3071050CF087C06630710509 -:1035600044F4623071050CF080C0672B09F07BC019 -:103570007CC06B50710974C0623271053CF46F31CC -:1035800071050CF072C0695171096AC06452710909 -:103590006230710508F067C068C0603471058CF452 -:1035A0006D3371050CF061C0663371053CF4633313 -:1035B00071050CF05AC06D52710952C06753710900 -:1035C0004FC06A3471053CF4673471050CF04DC08E -:1035D0006154710945C06B54710942C06638710568 -:1035E00014F5633871050CF040C0623771057CF446 -:1035F0006F367105D4F56836710534F4653671059A -:10360000A4F5655571092CC06956710929C06C373C -:10361000710534F46937710544F56357710920C0A9 -:103620006D5771091DC0603D71057CF46D3C7105DD -:10363000E4F46439710534F461397105B4F46D58FA -:1036400071090EC0695C71090BC06A3D710534F4E3 -:10365000673D710554F4635D710902C06D5D7109C8 -:103660006330710510F080E0089581E00895603EB8 -:10367000710508F026C4FB018827EA56FF4F8F4FDB -:103680000C94775581E090E0A0E0B0E08093600773 -:1036900090936107A0936207B09363070895109217 -:1036A00064071092650710926607109267070895E5 -:1036B000109268071092690710926A0710926B07C0 -:1036C000089581E090E0A0E0B0E080936C079093D3 -:1036D0006D07A0936E07B0936F070895109270075F -:1036E000109271071092720710927307089583E089 -:1036F00090E0A0E0B0E08093740790937507A093EA -:103700007607B0937707089588E790E0A0E0B0E0EF -:1037100080938C0790938D07A0938E07B0938F07AB -:10372000089588E790E0A0E0B0E080939007909340 -:103730009107A0939207B0939307089588E790E0CC -:10374000A0E0B0E08093940790939507A09396072C -:10375000B0939707089510929C0710929D071092BE -:103760009E0710929F0708951092A0071092A1073C -:103770001092A2071092A307089581E090E0A0E0C4 -:10378000B0E08093A4079093A507A093A607B093F9 -:10379000A70708951092A8071092A9071092AA07E8 -:1037A0001092AB0708951092AC071092AD071092DB -:1037B000AE071092AF0708951092B0071092B107AC -:1037C0001092B2071092B30708951092B4071092A6 -:1037D000B5071092B6071092B70708951092B80770 -:1037E0001092B9071092BA071092BB070895109271 -:1037F000BC071092BD071092BE071092BF07089534 -:103800001092C4071092C5071092C6071092C707FE -:1038100008951092C8071092C9071092CA07109213 -:10382000CB0708951092CC071092CD071092CE07C7 -:103830001092CF0708951092DC071092DD071092C6 -:10384000DE071092DF0708951092E0071092E1075B -:103850001092E2071092E30708951092E407109285 -:10386000E5071092E6071092E707089581E090E0DF -:10387000A0E0B0E08093F0079093F107A093F207E7 -:10388000B093F307089581E090E0A0E0B0E080936A -:10389000F4079093F507A093F607B093F707089500 -:1038A0008CE291E0A0E0B0E08093040890930508DA -:1038B000A0930608B093070808958CE291E0A0E079 -:1038C000B0E08093080890930908A0930A08B09389 -:1038D0000B0808958CE291E0A0E0B0E080930C0822 -:1038E00090930D08A0930E08B0930F0808951092BE -:1038F00014081092150810921608109217080895CF -:10390000109218081092190810921A0810921B08A9 -:10391000089510921C0810921D0810921E08109213 -:103920001F08089510922C0810922D0810922E084E -:1039300010922F08089510923008109231081092BA -:10394000320810923308089581E090E0A0E0B0E0E2 -:103950008093340890933508A0933608B0933708C5 -:10396000089585E090E0A0E0B0E080933C0890935B -:103970003D08A0933E08B0933F08089585E090E08D -:10398000A0E0B0E08093400890934108A0934208E3 -:10399000B0934308089589E190E0A0E0B0E08093FF -:1039A000440890934508A0934608B09347080895AB -:1039B00082E390E0A0E0B0E0809354089093550833 -:1039C000A0935608B0935708089582E390E0A0E0D2 -:1039D000B0E08093580890935908A0935A08B09388 -:1039E0005B08089582E390E0A0E0B0E080935C087B -:1039F00090935D08A0935E08B0935F08089582E3FA -:103A000090E0A0E0B0E08093640890936508A093F4 -:103A10006608B0936708089582E390E0A0E0B0E004 -:103A20008093680890936908A0936A08B0936B0824 -:103A3000089582E390E0A0E0B0E080936C0890935A -:103A40006D08A0936E08B0936F08089580E991E027 -:103A5000A0E0B0E080937C0890937D08A0937E085E -:103A6000B0937F08089580E991E0A0E0B0E08093F2 -:103A7000800890938108A0938208B09383080895EA -:103A800080E991E0A0E0B0E08093840890938508FD -:103A9000A0938608B0938708089510928C0810921E -:103AA0008D0810928E0810928F0808951092900839 -:103AB0001092910810929208109293080895109213 -:103AC00094081092950810929608109297080895FD -:103AD0001092A4091092A5091092A6091092A709A4 -:103AE00008951092A8091092A9091092AA0910929B -:103AF000AB0908951092AC091092AD091092AE096D -:103B00001092AF09089588E592E0A0E0B0E08093BC -:103B1000A4089093A508A093A608B093A7080895B9 -:103B200088E592E0A0E0B0E08093A8089093A9080F -:103B3000A093AA08B093AB08089588E592E0A0E0AE -:103B4000B0E08093AC089093AD08A093AE08B0931A -:103B5000AF0808958EE190E0A0E0B0E08093B40853 -:103B60009093B508A093B608B093B70808958EE176 -:103B700090E0A0E0B0E08093B8089093B908A093DB -:103B8000BA08B093BB0808958EE190E0A0E0B0E0E1 -:103B90008093BC089093BD08A093BE08B093BF0863 -:103BA00008951092F4081092F5081092F6081092F9 -:103BB000F70808951092F8081092F9081092FA0880 -:103BC0001092FB0808951092FC081092FD081092C4 -:103BD000FE081092FF08089510920409109205093A -:103BE0001092060910920709089510920809109280 -:103BF000090910920A0910920B09089510920C09F4 -:103C000010920D0910920E0910920F09089585E087 -:103C100090E0A0E0B0E080931C0990931D09A09370 -:103C20001E09B0931F09089585E090E0A0E0B0E080 -:103C30008093200990932109A0932209B09323092E -:103C4000089585E090E0A0E0B0E08093240990938F -:103C50002509A0932609B0932709089584EB95E1DF -:103C6000A0E0B0E080932C0990932D09A0932E0939 -:103C7000B0932F09089584EB95E1A0E0B0E0809324 -:103C8000300990933109A0933209B0933309089514 -:103C900084EB95E1A0E0B0E080933409909335097E -:103CA000A0933609B0933709089585E090E0A0E02D -:103CB000B0E08093440990934509A0934609B093DE -:103CC0004709089585E090E0A0E0B0E080934809BE -:103CD00090934909A0934A09B0934B09089585E050 -:103CE00090E0A0E0B0E080934C0990934D09A09340 -:103CF0004E09B0934F090895109254091092550936 -:103D0000109256091092570908951092580910926E -:103D1000590910925A0910925B09089510925C0992 -:103D200010925D0910925E0910925F090895109239 -:103D30006C0910926D0910926E0910926F09089526 -:103D40001092700910927109109272091092730901 -:103D500008951092740910927509109276091092C4 -:103D6000770908951092840A1092850A1092860AA3 -:103D70001092870A08958CE390E0A0E0B0E0809371 -:103D8000880A9093890AA0938A0AB0938B0A0895AF -:103D900081E090E0A0E0B0E080938C0A90938D0ADF -:103DA000A0938E0AB0938F0A08951092940A1092ED -:103DB000950A1092960A1092970A08958CE390E063 -:103DC000A0E0B0E08093980A9093990AA0939A0A91 -:103DD000B0939B0A089581E090E0A0E0B0E080936A -:103DE0009C0A90939D0AA0939E0AB0939F0A0895FF -:103DF0001092AC0A1092AD0A1092AE0A1092AF0A5D -:103E000008958CE390E0A0E0B0E08093B00A909336 -:103E1000B10AA093B20AB093B30A089581E090E08A -:103E2000A0E0B0E08093B40A9093B50AA093B60ADC -:103E3000B093B70A08951092BC0A1092BD0A10926E -:103E4000BE0A1092BF0A08958CE390E0A0E0B0E0B3 -:103E50008093C00A9093C10AA093C20AB093C30A88 -:103E6000089581E090E0A0E0B0E08093C40A9093D0 -:103E7000C50AA093C60AB093C70A08951092D40A3F -:103E80001092D50A1092D60A1092D70A08958CE3A0 -:103E900090E0A0E0B0E08093D80A9093D90AA09374 -:103EA000DA0AB093DB0A089581E090E0A0E0B0E088 -:103EB0008093DC0A9093DD0AA093DE0AB093DF0AB8 -:103EC0000895660F771F660F771FFB01E05AF84FC2 -:103ED000108211821282138208958FEF9FEF08954E -:103EE0000F931F93CF93DF938C01C0E0D0E0BE010E -:103EF000C8011EDB882319F0BE01C801B8DB21967A -:103F0000C13ED105A1F7DF91CF911F910F91089587 -:103F10004F925F926F927F928F929F92AF92BF92D9 -:103F2000CF92DF92EF92FF92CF93DF935B01EB0191 -:103F3000CC0FDD1FCE010E94E353482E512C612C83 -:103F4000712CCE0101960E94E353C82ED12CE12C96 -:103F5000F12C8DE8A81AB10883E0A816B10488F501 -:103F6000CE0144960E94E353882E912CA12CB12CB3 -:103F7000CE0145960E94E353482F50E060E070E088 -:103F80008FEF88169104A104B104A9F44F3F5105A5 -:103F90006105710581F48FEF4816510461047104C5 -:103FA00081F48FEFC816D104E104F10451F46FEFEE -:103FB0007FEFCB012BC040385105610571056CF0D6 -:103FC000F6CF80E8C816D104E104F10484F740E09C -:103FD00050E0BA01812C912C5401FE2CED2CDC2CEC -:103FE000CC24C40CD51CE61CF71C5401992488244D -:103FF000C80CD91CEA1CFB1C742F662755274427C4 -:10400000CB01BA016C0D7D1D8E1D9F1DDF91CF91DF -:10401000FF90EF90DF90CF90BF90AF909F908F90E8 -:104020007F906F905F904F90089586EA95E00E9490 -:10403000CA3F85E593E00E94CA3F94D69DD580E0B3 -:1040400090E008950C94B54D0C94B54D0C94B54D7D -:104050000C94B54D0C94B54D0C94B54D0C94B54DD8 -:104060000C94B54D0C94B54D4F925F926F927F9228 -:104070008F929F92AF92BF92CF92DF92EF92FF9278 -:104080000F931F93CF93DF9300D01F92CDB7DEB76E -:10409000FB011689078982889388A684B784C28425 -:1040A000D384E484F584468057806084718442819F -:1040B00053816481758149835A836B837C830E9419 -:1040C00054181F921F921F920F931F939301820106 -:1040D00049815A816B817C810E94A60A0F900F90C2 -:1040E0000F900F900F9080E090E00F900F900F9046 -:1040F0000F90DF91CF911F910F91FF90EF90DF9084 -:10410000CF90BF90AF909F908F907F906F905F9077 -:104110004F900895CF93DF93EB0120E030E040E82B -:104120005FE36A817B818C819D810E94C7528111EE -:104130000DC08BEA95E00E94CA3F0E945418FC0112 -:10414000EC5AFF4F108211821282138220E030E07D -:1041500040E85FE36E817F81888599850E94C75220 -:1041600081110DC08BEB95E00E94CA3F0E9454184C -:10417000FC01EC52FF4F108211821282138220E068 -:1041800030E040E85FE36A857B858C859D850E94F1 -:10419000C75281110DC08BEC95E00E94CA3F0E946E -:1041A0005418FC01EC5AFE4F1082118212821382C5 -:1041B000D9D5E2D480E090E0DF91CF910895D2D5B7 -:1041C0002ED580E090E008958BED95E00E94CA3FE7 -:1041D000C9D52DD6C7D5E2D443D940E050E068E038 -:1041E00070E00E94DC183CD940E050E069E070E0EB -:1041F0000E94DC1835D940E050E06AE070E00E948F -:10420000DC182ED940E050E06DE070E00E94DC1830 -:1042100080E090E00895EF92FF920F931F93CF9369 -:10422000DF9300D01F92CDB7DEB78B017B01EE0C80 -:10423000FF1C622FC70129833A834B835C830E9452 -:10424000EB5329813A814B815C81992757FD9A95DF -:10425000852F742F632FC70101960E94EB530D58D1 -:10426000110929813A814B815C8103301105A8F441 -:10427000BA01992777FD9095892FC70144960E942E -:10428000EB5329813A814B815C81652F7727882701 -:104290009927C70145960E94EB5380E090E00F906C -:1042A0000F900F900F90DF91CF911F910F91FF9082 -:1042B000EF900895CF92DF92EF92FF92CF93DF932A -:1042C000EB0136D9882349F1FE01EE0FFF1FEE0FF7 -:1042D000FF1FE05AF84FC080D180E280F38082EE69 -:1042E00095E00E94CA3F89EA95E00E94CA3F82EAAF -:1042F00095E00E94CA3FCE010E940C4189EA95E0F8 -:104300000E94CA3F84EA95E00E94CA3FC701B601F5 -:104310000E94164027D530D404C086EE95E00E9456 -:10432000CA3F80E090E0DF91CF91FF90EF90DF9067 -:10433000CF900895EF92FF920F931F93CF93DF9347 -:104340008091A30B9091A40B892B09F064C084E0A9 -:1043500090E00E94204DEC0160E070E0D9DD16167F -:104360001706F4F0CE01BCDD90E6E92E97E0F92EB9 -:1043700000E010E0B801CE01DBD8882341F0F7015E -:104380002081318142815381B801CE0144DF0F5F2A -:104390001F4FF4E0EF0EF11C0639110559F737C035 -:1043A00063E070E0CE01B4DD6130710581059105F7 -:1043B00061F580E6E82E87E0F82E00E010E0B80115 -:1043C000CE01B6D88823C1F0B801CE01A1DDF70136 -:1043D00060837183828393836F3F7F4F8F4F9F4FA3 -:1043E00059F4B801CE0143D9F701208131814281CE -:1043F0005381B801CE010FDF0F5F1F4FF4E0EF0EC6 -:10440000F11C013E1105D9F602C0CE0169DDD09341 -:10441000A40BC093A30B8091A30B9091A40BDF91ED -:10442000CF911F910F91FF90EF9008954F925F925F -:104430006F927F928F929F92AF92BF92CF92DF92B4 -:10444000EF92FF920F931F93CF93DF9300D01F92B1 -:10445000CDB7DEB76FDF40903C0850903D086090CC -:104460003E0870903F0866DF8090400890904108B9 -:10447000A0904208B090430875D4C0905407D090E3 -:104480005507E0905607F09057076CD4C701B60166 -:104490000E94CD526B017C01C301B2010E94CD523A -:1044A0009B01AC01C701B6010E94BB542B013C012A -:1044B000609158077091590780915A0790915B0756 -:1044C0000E94CD526B017C01C501B4010E94CD5206 -:1044D0009B01AC01C701B6010E94BB54AB01BC01FA -:1044E00049835A836B837C830E9454181F921F92C6 -:1044F0001F921F921F92812C912CA12CB12CC12CA8 -:10450000D12C760149815A816B817C818A019B0182 -:10451000B301A2010E94A60A0E9454181F921F9282 -:104520001F921F921F9297018601B301A2010E9460 -:10453000A60A0E9454181F921F921F921F921F9248 -:1045400097018601B701A6010E94A60A0FB6F8944A -:10455000DEBF0FBECDBF80E090E00F900F900F90B8 -:104560000F90DF91CF911F910F91FF90EF90DF900F -:10457000CF90BF90AF909F908F907F906F905F9003 -:104580004F90089508950895089508950895089501 -:104590000895089508950F931F93CF93DF93FB0120 -:1045A00002A113A1C68DD78D0E946D18C530D1050B -:1045B000E1F064F4249771F564E070E089ED9EE029 -:1045C0000E943008B80189ED9EE022C0C630D105B6 -:1045D000B1F02B97F9F467E070E082EE9EE00E9464 -:1045E0003008B80182EE9EE013C065E070E08CED0B -:1045F0009EE00E943008B8018CED9EE009C066E0A4 -:1046000070E08FED9EE00E943008B8018FED9EE0D3 -:104610000E94AD0780E090E0DF91CF911F910F9154 -:1046200008950C94B54D0C94B54D0C94B54D0C9467 -:10463000B54D0C94B54D0C94B54D0C94B54D0C94F2 -:10464000B54D0C94B54D0C94B54D0C94B54D0C94E2 -:10465000B54D0C94B54D0C94B54DEF92FF920F9360 -:104660001F93CF93DF93FB01E2A8F3A802A113A14C -:10467000C68DD78D0E94301A9701A801BE010E94F5 -:10468000481980E090E0DF91CF911F910F91FF904A -:10469000EF9008956F927F928F929F92AF92BF9208 -:1046A000CF92DF92EF92FF920F931F93CF93DF93FE -:1046B000FB01E2A8F3A886A497A4A0A8B1A8C6A06D -:1046C000D7A062A073A0068D178D0E94301AEC014E -:1046D0009701A301B8010E944819C501B4010E94C5 -:1046E0001F079701A601B801CE010E94481980E07A -:1046F00090E0DF91CF911F910F91FF90EF90DF90AD -:10470000CF90BF90AF909F908F907F906F900895C3 -:104710001F93CF93DF931F92CDB7DEB7FB0162A942 -:10472000168D69830E94301A6981812F0E94D806F4 -:1047300080E090E00F90DF91CF911F9108950F934B -:104740001F93CF93DF93FB0102A913A9C68DD78DC9 -:104750000E94301AA801BE010E94DC1880E090E09F -:10476000DF91CF911F910F910895662319F08DEA83 -:1047700093E002C086EA93E00C94CA3FCF93DF93A4 -:10478000FB01C68DD78DD6DDBE0194DD80E090E0C3 -:10479000DF91CF910895EF92FF920F931F93CF93E4 -:1047A000DF9300D01F92CDB7DEB7FB0122A133A16A -:1047B00044A155A1068D178D29833A834B835C83D1 -:1047C000B9DD7C01FC018281938129813A814B8191 -:1047D0005C818F30F7E29F072CF40196F7019383F9 -:1047E000828303C0F70113821282B801C7012983B3 -:1047F0003A834B835C830E94981A29813A814B81CA -:104800005C81882391F0F801EE0FFF1FEE0FFF1F70 -:10481000E05AF84F2083318342835383B801C701A4 -:10482000FADCB801C70146DD04C086EE95E00E94BF -:10483000CA3F0E94B0180E94801880E090E00F905C -:104840000F900F900F90DF91CF911F910F91FF90DC -:10485000EF9008958F929F92AF92BF92CF92DF9286 -:10486000EF92FF920F931F930E94541862E070E042 -:104870000E94A03A892BD1F40E94541821E02F9372 -:104880001F921F921F921F92812C912CA12CB12C50 -:10489000C12CD12C760197018601B701A6010E9497 -:1048A000A60A0F900F900F900F900F9080E090E06D -:1048B0001F910F91FF90EF90DF90CF90BF90AF903E -:1048C0009F908F9008958F929F92AF92BF92CF92B8 -:1048D000DF92EF92FF920F931F930E94541861E0B2 -:1048E00070E00E94A03A892BD1F40E9454181F92C4 -:1048F00021E02F931F921F921F92812C912CA12CAB -:10490000B12CC12CD12C760197018601B701A601EB -:104910000E94A60A0F900F900F900F900F9080E0CA -:1049200090E01F910F91FF90EF90DF90CF90BF909C -:10493000AF909F908F9008958F929F92AF92BF9269 -:10494000CF92DF92EF92FF920F931F930E94541821 -:1049500060E070E00E94A03A892BD1F40E945418C4 -:104960001F921F9221E02F931F921F92812C912C56 -:10497000A12CB12CC12CD12C760197018601B70155 -:10498000A6010E94A60A0F900F900F900F900F9013 -:1049900080E090E01F910F91FF90EF90DF90CF901B -:1049A000BF90AF909F908F9008958F929F92AF92FB -:1049B000BF92CF92DF92EF92FF920F931F930E94CC -:1049C000541821E02F931F921F921F921F92812C47 -:1049D000912CA12CB12CC12CD12C760197018601F0 -:1049E000B701A6010E94A60A0F900F900F900F909A -:1049F0000F9080E090E01F910F91FF90EF90DF907B -:104A0000CF90BF90AF909F908F9008958F929F927C -:104A1000AF92BF92CF92DF92EF92FF920F931F93CC -:104A20000E9454181F9221E02F931F921F921F92F1 -:104A3000812C912CA12CB12CC12CD12C7601970169 -:104A40008601B701A6010E94A60A0F900F900F9051 -:104A50000F900F9080E090E01F910F91FF90EF90EA -:104A6000DF90CF90BF90AF909F908F9008958F92DE -:104A70009F92AF92BF92CF92DF92EF92FF920F93ED -:104A80001F930E9454181F921F9221E02F931F9290 -:104A90001F92812C912CA12CB12CC12CD12C7601F0 -:104AA00097018601B701A6010E94A60A0F900F90F8 -:104AB0000F900F900F9080E090E01F910F91FF906A -:104AC000EF90DF90CF90BF90AF909F908F90089520 -:104AD00008950895089508950895089508950895EE -:104AE000089508950895089508950895EF92FF9206 -:104AF0000F931F93CF93DF93CDB7DEB72E970FB6EB -:104B0000F894DEBF0FBECDBF8C016EE973E00E944A -:104B1000490568E076E0C8010E940B0560915007E6 -:104B20007091510780915207909153072AE0AE018E -:104B30004F5F5F4F7A010E94844EF7010190002081 -:104B4000E9F73197AF014E195F09B701C8010E941B -:104B5000AE046CE973E0C8010E940B05C8012E96F3 -:104B60000FB6F894DEBF0FBECDBFDF91CF911F917E -:104B70000F91FF90EF90089588E096E00E94CA3F61 -:104B8000609150077091510780915207909153079F -:104B90000E9416408CE993E00C94CA3F0F931F9338 -:104BA000CF93DF93EC018BE096E00E94CA3F8FE049 -:104BB00096E00E94CA3F09EA1BE0F8016081CE013D -:104BC000D4DD83E196E00E94CA3FF8016181CE0105 -:104BD000CCDD87E196E00E94CA3FF8016281CE01F8 -:104BE000C4DD8BE196E00E94CA3FF8016381CE01EB -:104BF000BCDD8FE196E00E94CA3FF8016481CE01DE -:104C0000B4DD83E296E00E94CA3FF8016581CE01DF -:104C1000ACDDCE01DF91CF911F910F91ADCFCF923F -:104C2000DF92EF92FF92CF93DF93EC01888199811D -:104C3000AA81BB81181619061A061B0644F081E0EA -:104C400090E0A0E0B0E088839983AA83BB838C8145 -:104C50009D81AE81BF81181619061A061B0644F005 -:104C600081E090E0A0E0B0E08C839D83AE83BF83C1 -:104C700088859985AA85BB85181619061A061B060C -:104C800044F081E090E0A0E0B0E088879987AA87AF -:104C9000BB878AEC94E00E94CA3F88EB95E00E94B3 -:104CA000CA3F6091540770915507809156079091C3 -:104CB00057070E94CD526B017C01688179818A81FE -:104CC0009B810E94CD529B01AC01C701B6010E949D -:104CD000BB5442E00E943D4088EC95E00E94CA3FF0 -:104CE000609158077091590780915A0790915B071E -:104CF0000E94CD526B017C016C817D818E819F81F0 -:104D00000E94CD529B01AC01C701B6010E94BB5469 -:104D100042E00E943D4088ED95E00E94CA3F6091CC -:104D20005C0770915D0780915E0790915F070E941C -:104D3000CD526B017C01688579858A859B850E94AF -:104D4000CD529B01AC01C701B6010E94BB5442E0A9 -:104D50000E943D40CE01DF91CF91FF90EF90DF9018 -:104D6000CF900ACF8091A70B9091A80B892B91F53A -:104D70008DE090E00E94204DFC01148610925407B3 -:104D80001092550710925607109257071092580725 -:104D90001092590710925A0710925B0710925C0705 -:104DA00010925D0710925E0710925F071092A60B9B -:104DB0001092A50B109250071092510710925207B3 -:104DC0001092530710924F0710924E079093A80B22 -:104DD0008093A70B8091A70B9091A80B08950F9338 -:104DE0001F93CF93DF93A6DA8C01C0E0D0E0BE0121 -:104DF000C8010E94981A882319F0BE01C8015ADA26 -:104E00002196C13ED10599F787E296E00E94CA3FFC -:104E1000A9DFB2DE80E090E0DF91CF911F910F918A -:104E20000895A0DFFC01148680E090E00895CF9300 -:104E3000DF9385E40E94BC05EC0194DF91E0CD2B6B -:104E400009F490E09093A90B84E40E94BC05EC0166 -:104E500089DF91E0CD2B09F490E09093AA0B83E4D5 -:104E60000E94BC05EC017EDF91E0CD2B09F490E0BF -:104E70009093AB0B82E40E94BC05EC0173DF91E0E0 -:104E8000CD2B09F490E09093AC0B81E40E94BC051B -:104E9000EC0168DF91E0CD2B09F490E09093AD0B2D -:104EA00080E40E94BC05EC015DDF91E0CD2B09F4AC -:104EB00090E09093AE0BDF91CF91089508950895FF -:104EC000EBE0F1E08081877F80830895EBE0F1E003 -:104ED00080818860808308958E9808958E9A0895C1 -:104EE00014980895149A089588980895889A0895B2 -:104EF000CF93DF93EC018F81882331F061E08989C2 -:104F00000E94E4051F8206C060E089890E94E405D2 -:104F100081E08F83DF91CF910895CF93DF93EC01F0 -:104F20008E81882331F061E08B850E94E4051E822A -:104F300006C060E08B850E94E40581E08E83DF91EE -:104F4000CF91089560E0FC0181890C94E40560E054 -:104F5000FC0183850C94E40561E0FC0181890C94DB -:104F6000E40561E0FC0183850C94E4050F931F9335 -:104F7000CF93DF93EC0168EC70E080E090E00E945A -:104F80001F078E819F818F3F2FEF920739F061E0DD -:104F90000E94D80661E08E810E94E4058C859D8583 -:104FA0008F3FEFEF9E0719F061E00E94D8068885D9 -:104FB00099858F3FFFEF9F0739F061E00E94D80687 -:104FC00060E088850E94E40561E08A850E94D80639 -:104FD00061E08A850E94E405FE01E858FF4F808168 -:104FE000882309F45AC061E08091B00B0E94D80672 -:104FF00061E08091B40B0E94D80662E08091B20B10 -:105000000E94D8064091B00B5091B10BFA01E550C7 -:10501000FB4FE491E093B60B2091B20B3091B30BB0 -:10502000F901E550FB4FE491E093B70B8091B40B8D -:105030009091B50BFC01E550FB4FE491E093B80B68 -:10504000FA01EB54FB4FE491F0E0EE0FFF1FEF5736 -:10505000FB4F459154915093BA0B4093B90BF90112 -:10506000EB54FB4FE491F0E0EE0FFF1FE556FB4FD2 -:10507000259134913093BC0B2093BB0BFC01EB5476 -:10508000FB4FE491F0E0EE0FFF1FEF57FB4F8591D0 -:1050900094919093BE0B8093BD0BAE01425F5F4F26 -:1050A00060E8CE010E946B09AE014E5E5F4F60E981 -:1050B000CE010E946B09AE014A595F4FFA0180810F -:1050C0009181A281B3819927AA27BB2780839183ED -:1050D000A283B38361E9CE010E946B09AE01465EF3 -:1050E0005F4F63E9CE010E946B09AE01425E5F4FE4 -:1050F00064E9CE010E946B09AE014E5D5F4F65E928 -:10510000CE010E946B09AE014A5D5F4F6DEACE0190 -:105110000E946B09AE01465D5F4F63EBCE010E94BA -:105120006B098E010E5A1F4FA8016CEECE010E9432 -:105130006B09AE014A5A5F4F6DEECE010E946B09BA -:10514000AE01425A5F4F60EFCE010E946B09AE0183 -:1051500046595F4FFA0180819181A281B3819927DD -:10516000AA27BB2780839183A283B38362EFCE01FA -:105170000E946B09F80180819181A281B381807FB7 -:10518000886080839183A283B383A8016CEECE01F3 -:105190000E946B09F80180819181A281B3819F7780 -:1051A000AE7F906880839183A283B383A8016CEE65 -:1051B000CE01DF91CF911F910F910C946B090F934A -:1051C0001F93FC018EEA97E4A1EEBDE380839183F7 -:1051D000A283B38315827783668331872087138701 -:1051E00002875587448716861786108A118A128A85 -:1051F000138A148A158A168A178A108E118E128EB7 -:10520000138E148E158E168E178E10A211A212A256 -:1052100013A214A215A216A217A210A611A612A6D6 -:1052200013A614A615A684E595EBAAEABAEA86A702 -:1052300097A7A0ABB1AB8AEA94E5A5E9BAE482AB43 -:1052400093ABA4ABB5AB89E299E2A9E4B4E286AB37 -:1052500097ABA0AFB1AF82E292E4A0E1B0E182AF40 -:1052600093AFA4AFB5AFDF01DE964FEF5FEF6FEF07 -:105270007BEF4D935D936D937C93139714964DE75D -:1052800057E76BEB75EB4D935D936D937C931397A1 -:10529000149646E555E569E279E44D935D936D9387 -:1052A0007C931397149642E252E460E470E04D93CD -:1052B0005D936D937C931397149646E550E86FEFDA -:1052C0007FEF4D935D936D937C93139714961D928E -:1052D0001D921D921C92139714961D921D921D9261 -:1052E0001C92139714961D921D921D921C92139757 -:1052F000149640E854E065E070E04D935D936D9343 -:105300007C93139714961D921D921D921C921397D5 -:1053100014961D921D921D921C92139714961D9225 -:105320001D921D921C92139714961D921D921D9210 -:105330001C921397149640E050E067EF70E04D9395 -:105340005D936D937C93139714961D921C92E8586D -:10535000FF4F10821F910F9108958EBD00000DB474 -:1053600007FEFDCF8EB508951F920F920FB60F92D4 -:1053700011240BB60F922F933F934F935F936F932C -:105380007F938F939F93AF93BF93EF93FF938091FE -:10539000AF0B81113FC081E08093AF0B0E94541886 -:1053A000FC01EB58FF4F2081222369F07097408168 -:1053B0005181628173814F5F5F4F6F4F7F4F408399 -:1053C000518362837383FC01EB50FF4F20812223C2 -:1053D00069F0709740815181628173814F5F5F4FA7 -:1053E0006F4F7F4F4083518362837383FC01EB587F -:1053F000FE4F2081222361F0709780819181A281EC -:10540000B3810196A11DB11D80839183A283B383D3 -:105410001092AF0BFF91EF91BF91AF919F918F9140 -:105420007F916F915F914F913F912F910F900BBEA4 -:105430000F900FBE0F901F9018951F920F920FB6EE -:105440000F9211240BB60F922F933F934F935F93BC -:105450006F937F938F939F93AF93BF93EF93FF933C -:10546000E0E0F0E01995FF91EF91BF91AF919F912E -:105470008F917F916F915F914F913F912F910F90FD -:105480000BBE0F900FBE0F901F901895CF93DF9318 -:10549000FC012489358946895789C28DD38D60895D -:1054A0007189828993892031E7E23E0741055105E0 -:1054B00029F0121613061406150624F0DE019B01CE -:1054C000AC0109C00E945C5520E137E240E050E0A9 -:1054D0000E94F953DE010E941F54DF91CF9108957D -:1054E000FC0181E090E0958F848F118210821582FB -:1054F0001482108A118A128A138A118E108E80E10A -:1055000097E2A0E0B0E0848B958BA68BB78B1286D8 -:10551000108614861586168617860895CF93DF9316 -:10552000EC01FC01E159FF4F1082379781E0808345 -:1055300060E08B850E94E4058D899E89892B31F07E -:1055400060E08989DF91CF910C94E405DF91CF91E0 -:105550000895CF93DF93EC01898D0E94BC052C8DBB -:1055600030E08217930711F48D8D01C080E0DF9148 -:10557000CF910895CF93DF93EC018F890E94BC05F2 -:105580002C8D30E08217930711F48D8D01C080E0DF -:10559000DF91CF910895CF93DF93EC012BA9888100 -:1055A0009981222311F061E001C060E00E94800A2D -:1055B0002CA98A819B81222329F02DA9222311F075 -:1055C00061E001C060E0DF91CF910C94800ACF933D -:1055D000DF93EC012BA988819981222311F060E0EF -:1055E00001C061E00E94800A2CA98A819B8122234C -:1055F00029F02DA9222311F060E001C061E0DF91C4 -:10560000CF910C94800ACF93DF93EC0161E08F85FA -:105610000E94E4058CA9882321F061E08D890E9415 -:10562000E405C359DF4F1882DF91CF910895CF93DE -:10563000DF93EC0160E08F850E94E4058CA988234C -:1056400021F060E08D890E94E405C359DF4F81E0BD -:105650008883DF91CF910895CF92DF92EF92FF92EE -:105660000F931F93CF93DF93FC01DC01A05CBF4F2E -:105670004D935D936D937C93139714964D935D9327 -:105680006D937C93139714960D931D932D933C93D8 -:105690001397EC01C45BDF4FE88282AD882389F069 -:1056A00082A9811109C037FF0CC01D921D921D9265 -:1056B0001C92139781E006C01016110612061306FD -:1056C000A4F380E043AD54AD65AD76AD1416150678 -:1056D000160617063CF597AD992321F10D911D9102 -:1056E0002D913C9113976801790137FF07C0CC24B5 -:1056F000DD247601C01AD10AE20AF30A4C155D05D1 -:105700006E057F057CF437FF07C070956095509556 -:1057100041955F4F6F4F7F4F4D935D936D937C939A -:10572000139781E0DF01AB5ABF4F1D921D921D926E -:105730001C921397EB59FF4F91E09083DF91CF912B -:105740001F910F91FF90EF90DF90CF9008950F93EE -:105750001F93CF93DF938C01D62FFC01838D811192 -:1057600009C0C80107DFC82FC801F3DED11108C086 -:105770008C2F06C0C801EDDEC82FC801FBDEF6CFB6 -:10578000DF91CF911F910F910895CF93DF93EC019B -:10579000FC01E159FF4F81E0808339978081B29706 -:1057A000882341F080819181A281B3810196A11D5E -:1057B000B11D07C080819181A281B3810197A109A8 -:1057C000B10980839183A283B383FE01EE58FF4F1A -:1057D00020813181DE01A059BF4FC9019595879580 -:1057E00020FD03C0ED91FC910DC0FE01E80FF91FF3 -:1057F0000190F081E02D2D913C91E20FF31F01907B -:10580000F081E02D8C0F9D1F19958D899E89892B24 -:1058100011F1FE01EA58FF4F20813181DE01AC58C1 -:10582000BF4FC9019595879520FD03C0ED91FC916F -:105830000DC0FE01E80FF91F0190F081E02D2D91C0 -:105840003C91E20FF31F0190F081E02D8C0F9D1F22 -:10585000DF91CF911994DF91CF9108958F929F920C -:10586000AF92BF92CF92DF92EF92FF920F931F936E -:10587000CF93DF93EC01FC01EB5AFF4F6081718104 -:10588000828193810E94CB526B017C016EA97FA91A -:1058900088AD99AD0E94CD529B01AC0160E074E2ED -:1058A00084E799E40E94BB544B015C01FE01EF596F -:1058B000FF4F60817181828193810E94CB529B0155 -:1058C000AC01C501B4010E94BB544B015C018E01C7 -:1058D000075A1F4F20E030E040E05FE30E942C5366 -:1058E0009B01AC01C701B6010E9457540E94285584 -:1058F000F8016083718382839383C35ADF4FA501CC -:105900009401C701B6010E9457540E94285568832C -:1059100079838A839B83DF91CF911F910F91FF90B1 -:10592000EF90DF90CF90BF90AF909F908F900895B1 -:105930000F931F93CF93DF93FC01E159FF4F208119 -:105940002223B9F07A970081118122813381389620 -:10595000408151816281738104171507260737073B -:1059600010F1EC01DBDDCE01DF91CF911F910F91A2 -:1059700075CFFC01EB59FF4F20812223A1F07097D6 -:10598000008111812281338134964081518162816D -:105990007381041715072607370728F0DF91CF9189 -:1059A0001F910F91F2CEDF91CF911F910F9108952A -:1059B0002F923F924F925F926F927F928F929F921F -:1059C000AF92BF92CF92DF92EF92FF920F931F930D -:1059D000CF93DF93CDB7DEB762970FB6F894DEBFF3 -:1059E0000FBECDBF1C016C012CE4C20ED11CD60130 -:1059F0008C91F101EA59FF4F7F01910129593F4FE5 -:105A00004901A1014C5B5F4F5E874D878101085BB7 -:105A10001F4F882341F0D101D2968C91808381E081 -:105A2000F90180832FC0AD85BE854D915D916D914B -:105A30007C91F80180819181A281B38121E0481796 -:105A400059076A077B070CF020E0F701208377FFF6 -:105A500007C070956095509541955F4F6F4F7F4F90 -:105A6000B7FF07C0B095A095909581959F4FAF4F18 -:105A7000BF4F21E0481759076A077B070CF420E065 -:105A8000D4012C93ED85FE85408151816281738123 -:105A9000411551056105710559F4F10182A193A1E8 -:105AA000A4A1B5A1EF59FF4F80839183A283B38353 -:105AB000F80180819181A281B3817101F0E4EF0E40 -:105AC000F11CF701408051806280738091012B5955 -:105AD0003F4F5901481659066A067B0634F44817A9 -:105AE00059076A077B077CF00AC084159505A6054F -:105AF000B7052CF484179507A607B70724F0D6013D -:105B00008C918823D9F0F50180818823B9F0D601E2 -:105B10008C91811105C0F601808181110FC006C0F2 -:105B200060E0C10114DE8111F6CF18C0D4016C9180 -:105B300081E06827C1010BDE882381F0D5011C922A -:105B400060E0C10104DE882309F4CDC1F101EC5B02 -:105B5000FF4F1082118212821382C5C1D1019A9621 -:105B60002D913D914D915C919D9729833A834B8373 -:105B70005C835E962D913D914D915C9191972D8323 -:105B80003E834F83588792962D913D914D915C9124 -:105B9000959729873A874B875C87F80180819181A7 -:105BA000A281B381ED85FE8500811181228133813F -:105BB000F7014081518162817381F101E759FF4F03 -:105BC0001082319610822101FBE64F0E511CF2012A -:105BD00010823101FCE66F0E711CF30110823296C7 -:105BE00010824C015D01841A950AA60AB70AB7FE15 -:105BF00008C0B094A09490948094811C911CA11C26 -:105C0000B11C481759076A077B073CF46801790102 -:105C1000C41AD50AE60AF70A06C068017901C81A4B -:105C2000D90AEA0AFB0AA5019401559547953795CB -:105C300027952D873E874F87588B810102591F4F2B -:105C4000F7FC05C08C149D04AE04BF0454F4D101CC -:105C500096960D90BC91A02DBA8BA98B81E0F30193 -:105C6000BAC02D853E854F8558892C153D054E05BA -:105C70005F0508F454C089819A81AB81BC818C1581 -:105C80009D05AE05BF0564F42D813E812F5F3F4F1A -:105C90003A8B298B81E0D2018C93F80180839EC0DE -:105CA000C701B6010E94CD522B013C0169817A8166 -:105CB0008B819C810E94CD529B01AC01C301B2013A -:105CC0000E94BB542B013C016D817E818F819885A0 -:105CD00029853A854B855C85621B730B840B950B7C -:105CE0000E94CD529B01AC01C301B2010E942C5312 -:105CF0002B013C0169857A858B859C850E94CD525C -:105D00009B01AC01C301B2010E9457540E9423556C -:105D10007A8B698B81E0F101E759FF4F5CC0D501B7 -:105D2000C40129813A814B815C81821B930BA40BB6 -:105D3000B50BC816D906EA06FB065CF42D813E8138 -:105D40002E5F3F4F3A8B298B81E0F101E559FF4FE0 -:105D500042C0C501B4016C197D098E099F090E94DA -:105D6000CD522B013C0169817A818B819C810E94FB -:105D7000CD529B01AC01C301B2010E94BB542B0167 -:105D80003C016D817E818F81988529853A854B857F -:105D90005C85621B730B840B950B0E94CD529B019B -:105DA000AC01C301B2010E942C532B013C01698557 -:105DB0007A858B859C850E94CD529B01AC01C301E5 -:105DC000B2010E9457540E9423557A8B698B81E05F -:105DD000F101E659FF4F8083D8018C93F101828550 -:105DE0008823B1F00E945707D10118960D911C919C -:105DF0001997012E000C220B330BDC01CB01801B09 -:105E0000910BA20BB30B893E9340A105B10568F439 -:105E1000F101EF59FF4F29893A89C901A0E0B0E0AB -:105E200080839183A283B3838BCE0E945707D101D5 -:105E300019967C936E93189784E294E00E94CA3F6F -:105E40008BE296E00E94CA3F60E070E0CB010E94C6 -:105E5000164081E396E00E94CA3FC701B6010E9446 -:105E6000164087E396E00E94CA3FC501B4010E9434 -:105E700016408DE396E00E94CA3F4AE06D857E851C -:105E80008F8598890E94CB3F84E496E00E94CA3FA8 -:105E900069817A818B819C810E9416408AE496E018 -:105EA0000E94CA3F69857A858B859C850E94164031 -:105EB00080E596E00E94CA3F6D817E818F81988542 -:105EC0000E94164086E596E00E94CA3F89EA95E066 -:105ED0000E94CA3F89899A890E940C418CE993E00B -:105EE0000E94CA3F95CF62960FB6F894DEBF0FBEF0 -:105EF000CDBFDF91CF911F910F91FF90EF90DF9079 -:105F0000CF90BF90AF909F908F907F906F905F9059 -:105F10004F903F902F9008950F931F93FC01E45BE7 -:105F2000FF4F2081211110C03897008111812281FB -:105F30003381349640815181628173810417150742 -:105F40002607370744F404C0FC0122A9222319F0D4 -:105F50001F910F913CCB1F910F911DCB2F923F9220 -:105F60004F925F926F927F928F929F92AF92BF9269 -:105F7000CF92DF92EF92FF920F931F93CF93DF9315 -:105F8000CDB7DEB763970FB6F894DEBF0FBECDBFB7 -:105F90008C010E949A21F801EF5FFD4F81E0409152 -:105FA0002C0850912D0860912E0870912F08452BD8 -:105FB000462B472B09F480E080830E949A21F80148 -:105FC000EE5FFD4F81E040913008509131086091C3 -:105FD000320870913308452B462B472B09F480E09B -:105FE00080830E949A21F801ED5FFD4F81E040918E -:105FF0003408509135086091360870913708452B68 -:10600000462B472B09F480E080830E949A218091DF -:106010007C0890917D08A0917E08B0917F08F801DE -:10602000EC5FFD4F80839183A283B3830E949A210A -:106030008091800890918108A0918208B091830896 -:10604000F801E85FFD4F80839183A283B3830E94B0 -:106050009A218091840890918508A0918608B0913A -:106060008708F801E45FFD4F80839183A283B383A7 -:106070000E949A218091540890915508A091560849 -:10608000B0915708F801E45EFD4F80839183A283AD -:10609000B3830E949A218091580890915908A09149 -:1060A0005A08B0915B08F801E05EFD4F8083918350 -:1060B000A283B3830E949A2180915C0890915D082D -:1060C000A0915E08B0915F08F801EC5DFD4F808300 -:1060D0009183A283B3830E949A2180916408909156 -:1060E0006508A0916608B0916708F801E85DFD4F6A -:1060F00080839183A283B3830E949A218091680850 -:1061000090916908A0916A08B0916B08F801E45D6C -:10611000FD4F80839183A283B3830E949A21809153 -:106120006C0890916D08A0916E08B0916F08F8010D -:10613000E05DFD4F80839183A283B3830E949A2107 -:106140008091040890910508A0910608B091070875 -:10615000F801EC5CFD4F80839183A283B3830E949E -:106160009A218091080890910908A0910A08B0919D -:106170000B08F801E85CFD4F80839183A283B38311 -:106180000E949A2180910C0890910D08A0910E0810 -:10619000B0910F08F801E45CFD4F80839183A283E6 -:1061A000B3830E949A21F801E05CFD4F81E02091C9 -:1061B000DC073091DD072130310509F080E0808374 -:1061C0000E949A21F801EF5BFD4F81E02091E007EA -:1061D0003091E1072130310509F080E080830E9491 -:1061E0009A21F801EE5BFD4F81E02091E4073091A8 -:1061F000E5072130310509F080E080830E949A2173 -:10620000F801E25AFD4F81E04091B4075091B50783 -:106210006091B6077091B707452B462B472B09F4C1 -:1062200080E080830E949A21F801E15AFD4F81E0CD -:106230004091B8075091B9076091BA077091BB07B8 -:10624000452B462B472B09F480E080830E949A213E -:10625000F801E05AFD4F81E04091BC075091BD0725 -:106260006091BE077091BF07452B462B472B09F461 -:1062700080E080830E949A21F801EF59FD4F81E070 -:1062800040918C0850918D0860918E0870918F0814 -:10629000452B462B472B09F480E080830E949A21EE -:1062A000F801EE59FD4F81E040919008509191081E -:1062B0006091920870919308452B462B472B09F467 -:1062C00080E080830E949A21F801ED59FD4F81E022 -:1062D00040919408509195086091960870919708A4 -:1062E000452B462B472B09F480E080830E949A219E -:1062F000F801EC59FD4F81E02091C4073091C507AA -:106300002130310509F080E080830E949A21F80154 -:10631000EB59FD4F81E02091C8073091C90721302A -:10632000310509F080E080830E949A21F801EA5942 -:10633000FD4F81E02091CC073091CD072130310510 -:1063400009F080E080830E949A2180918C079091CF -:106350008D07A0918E07B0918F07F801E959FD4F85 -:1063600080839183A283B3830E949A2180919007B6 -:1063700090919107A0919207B0919307F801E55988 -:10638000FD4F80839183A283B3830E949A218091E1 -:10639000940790919507A0919607B0919707F801FF -:1063A000E159FD4F80839183A283B3830E949A2198 -:1063B000F801EE5AFD4F81E040919C0750919D07F6 -:1063C00060919E0770919F07452B462B472B09F440 -:1063D00080E080830E949A21F801ED5AFD4F81E010 -:1063E0004091A0075091A1076091A2077091A30767 -:1063F000452B462B472B09F480E080830E949A218D -:10640000F801EC5AFD4F81E04091A4075091A50797 -:106410006091A6077091A707452B462B472B09F4DF -:1064200080E080830E949A2180919409909195093F -:10643000A0919609B0919709F801ED5BFD4F80831B -:106440009183A283B3830E949A21809198099091AD -:106450009909A0919A09B0919B09F801E95BFD4F58 -:1064600080839183A283B3830E949A2180919C09A7 -:1064700090919D09A0919E09B0919F09F801E55B5B -:10648000FD4F80839183A283B3830E949A21F801F8 -:10649000EB5AFD4F81E02091F4073091F507213050 -:1064A000310509F080E08083F801EA5AFD4F10823F -:1064B000319610820E949A21F801E85AFD4F81E03E -:1064C0002091F0073091F1072130310509F080E08B -:1064D0008083F801E75AFD4F1082319610820E94A6 -:1064E0009A21F801E55AFD4F81E02091140830917E -:1064F00015082130310509F080E080830E949A213F -:10650000F801E45AFD4F81E02091180830911908F4 -:106510002130310509F080E080830E949A21F80142 -:10652000E35AFD4F81E020911C0830911D08213075 -:10653000310509F080E080830E949A21F801E15B37 -:10654000FD4F81E02091A4093091A509213031054A -:1065500009F080E080830E949A21F801E05BFD4F02 -:1065600081E02091A8093091A9092130310509F075 -:1065700080E080830E949A21F801EF5AFD4F81E06C -:106580002091AC093091AD092130310509F080E04E -:1065900080830E949A2118012DE8221A2DEF320AD9 -:1065A00080913C0890913D08A0913E08B0913F0831 -:1065B000F10180839183A283B3830E949A215801C1 -:1065C000F9E8AF1AFDEFBF0A8091400890914108A9 -:1065D000A0914208B0914308F50180839183A28382 -:1065E000B3830E949A218091440890914508A0911C -:1065F0004608B0914708980125583D4FF90180831E -:106600009183A283B383F1014081518162817381BF -:10661000141615061606170644F041E050E060E037 -:1066200070E04083518362837383F501408151811F -:1066300062817381141615061606170644F041E0B0 -:1066400050E060E070E040835183628373831816EA -:1066500019061A061B064CF081E090E0A0E0B0E0BD -:10666000F90180839183A283B383D901CD90DD901A -:10667000ED90FC90F50180809180A280B380D101E3 -:106680004D905D906D907C900E94B226FC014082FE -:1066900051826282738284829582A682B782C0868A -:1066A000D186E286F386F801E15BFD4FB081B983C4 -:1066B0003C972081318142815381D1016D917D913F -:1066C0008D919C910E945C5560837183828393833A -:1066D0007896A081399630803F97B081339620809C -:1066E000399620812A8B3397308138877E97408175 -:1066F0004987FF9750815D87EA59FF4FC080D1805D -:10670000E280F380F39780809180A280B3803C97F1 -:1067100040805180628073803C972081318142812A -:1067200053812E873F87488B598B78972081318101 -:1067300042815381F80126A737A740AB51AB2E8584 -:106740003F854889598922AB33AB44AB55AB46AA48 -:1067500057AA60AE71AE82AE93AEA4AEB5AEFE9651 -:10676000C082D182E282F38234962D8520833196D5 -:10677000398530832885F80123A73A8934A735A6BF -:1067800040E4C42ED12CE12CF12CEA5BFF4FC082F7 -:10679000D182E282F382329720823196B08335969D -:1067A000A083319660837183828393833496498179 -:1067B0004083D8015B968D919C915C9786339105BF -:1067C00059F486E797E2F19691838083329611829D -:1067D000108284E797E21EC08C33910569F48EE63F -:1067E00097E2F801E058FF4F91838083329611823F -:1067F00010828CE697E20EC08E9791F486E697E2BF -:10680000F801E058FF4F9183808332961182108205 -:1068100080E697E2369691838083329611821082C9 -:10682000F80181A192A14A9789F482E797E2EC5797 -:10683000FF4F9183808332961182108280E797E226 -:10684000369691838083329611821082F801E05B44 -:10685000FD4F2081298339972081318142815381E5 -:10686000D801A958BD4F6D917D918D919C910E9449 -:106870005C556083718382839383759630813A83FC -:10688000399640814B833F9750815C833396A0813A -:10689000A88739962080339730807E97B081BE8755 -:1068A000FF9720812D87E759FF4F20813181428159 -:1068B000538129873A874B875C87F397C080D180C3 -:1068C000E280F3803C9780809180A280B3803C97E7 -:1068D0004080518062807380E059F140D801A85F08 -:1068E000BD4F2D913D914D915C91268F378F40A3E7 -:1068F00051A342A253A264A275A286A297A2A0A607 -:10690000B1A6C2A6D3A6E4A6F5A629853A854B85ED -:106910005C8526A737A740AB51AB3D8532AB4E8592 -:1069200043AB338E248E5B81558F30E4C32ED12C44 -:10693000E12CF12CC6AAD7AAE0AEF1AEA885A4AB93 -:10694000BC81B5AB2A8122AF63AF74AF85AF96AF80 -:10695000398137AF838594858633910571F486E755 -:1069600097E2D801B39511969C938E931296119647 -:106970001C921E9284E797E220C08C33910571F43B -:106980008EE697E2D801B39511969C938E9312965A -:1069900011961C921E928CE697E20FC08E97A1F47E -:1069A00086E697E2D801B39511969C938E93129642 -:1069B00011961C921E9280E697E2169611969C9371 -:1069C0008E9312961D921C92818992894A9791F416 -:1069D00082E797E2F801EC5FFE4F91838083329665 -:1069E0001182108280E797E23696918380833296F7 -:1069F00011821082F801EF5AFD4F4081498336978A -:106A00002081318142815381D801A558BD4F6D91BC -:106A10007D918D919C910E945C55608371838283EE -:106A200093837296A0813996B0813F9750815C83A1 -:106A300033962081288739962080339730807E973F -:106A400030813D87FF9740814E87E459FF4F208179 -:106A500031814281538129873A874B875C87F3973D -:106A6000C080D180E280F3803C9780809180A280BA -:106A7000B3803C974080518062807380A801405F62 -:106A80005E4F5B8B4A8B78972081318142815381A5 -:106A9000EA89FB89268F378F40A351A342A253A2D4 -:106AA00064A275A286A297A2A0A6B1A6C2A6D3A6EA -:106AB000E4A6F5A629853A854B855C8526A737A7E8 -:106AC00040AB51AB2E8522AB3D8533AB338E248E4C -:106AD000B58F20E4C22ED12CE12CF12CC6AAD7AA66 -:106AE000E0AEF1AE288524AB3C8135ABA2AFDF012F -:106AF00063AF74AF85AF96AFE981DF96EC93DF9714 -:106B00001B968D919C911C978633910569F486E7BD -:106B100097E2F801E058FE4F91838083329611820C -:106B2000108284E797E21EC08C33910569F48EE6EB -:106B300097E2F801E058FE4F9183808332961182EC -:106B400010828CE697E20EC08E9791F486E697E26B -:106B5000F801E058FE4F91838083329611821082B3 -:106B600080E697E236969183808332961182108276 -:106B7000AA89BB8951968D919C9152974A9791F41D -:106B800082E797E2F801EC57FE4F918380833296BB -:106B90001182108280E797E2369691838083329645 -:106BA00011821082F801EE5AFD4F2081C8014096F3 -:106BB000222319F00E94172B02C00E94032BF80118 -:106BC000ED5AFD4F2081C80180579F4F222319F0B5 -:106BD0000E94172B02C00E94032BF801EC5AFD4FB4 -:106BE00080818823E1F08A899B8963960FB6F894A7 -:106BF000DEBF0FBECDBFDF91CF911F910F91FF90F0 -:106C0000EF90DF90CF90BF90AF909F908F907F904C -:106C10006F905F904F903F902F900C94172B8A8924 -:106C20009B8963960FB6F894DEBF0FBECDBFDF9190 -:106C3000CF911F910F91FF90EF90DF90CF90BF9079 -:106C4000AF909F908F907F906F905F904F903F900C -:106C50002F900C94032B4F925F926F927F928F92A2 -:106C60009F92AF92BF92CF92DF92EF92FF920F93DB -:106C70001F93CF93DF93CDB7DEB77B016901FB0193 -:106C8000808191814C01F2E68F0E911CF4011082FB -:106C9000118212821382A4016FE60E946B09F40133 -:106CA00080819181A281B38197012C5B3F4F790153 -:106CB000B0FF17C020E030E040E85FE3F6016081FC -:106CC0007181828193810E945754F60160837183A0 -:106CD00082839383F80180819181A281B381F7013E -:106CE00022C0F601408051806280738020E030E055 -:106CF000A901C301B2010E945455181674F4F5019C -:106D00002081318142815381C301B2010E945654D6 -:106D1000F6016083718382839383F701808191817F -:106D2000A281B381F80180839183A283B383DF9131 -:106D3000CF911F910F91FF90EF90DF90CF90BF9078 -:106D4000AF909F908F907F906F905F904F9008953D -:106D50008F929F92AF92BF92CF92DF92EF92FF926B -:106D60000F931F93CF93DF93EC018B01C42E8C8183 -:106D7000883549F48FEC9DE09983888384E69CE014 -:106D80009B838A830BC0893519F486E59DE004C096 -:106D90008A3521F48DED9CE09983888388819981DF -:106DA0000E94B627B801888199810E94824188811A -:106DB0009981AC014E5A5F4FFA0180809180A28088 -:106DC000B380F0EFBF226894B3F8FA018082918219 -:106DD000A282B3826CEE0E946B0988819981AC011A -:106DE0004E5A5F4FFA0180809180A280B3806894F0 -:106DF00096F880829182A282B3826CEE0E946B0927 -:106E000088819981FC014685578560897189516027 -:106E100046875787608B718BAC01425F5F4F60E89C -:106E20000E946B09888199810C2C000CDD08EE080A -:106E3000FF087601DD24CC24CC24DD24E894E7F897 -:106E4000FF24AC014A5A5F4FFA0180809180A280F2 -:106E5000B380F0E8AF228C289D28AE28BF28FA0125 -:106E600080829182A282B3826DEE0E946B0960E003 -:106E7000888199810E94800A88819981FC014685D8 -:106E8000578560897189446046875787608B718B0D -:106E9000AC01425F5F4F60E80E946B098881998175 -:106EA000AC014E5A5F4FFA0180809180A280B3807E -:106EB0006894B4F880829182A282B3826CEE0E94C0 -:106EC0006B098C81883509F07FC08A819B810E9483 -:106ED000B627B8018A819B810E9482418A819B8169 -:106EE000AC014E5A5F4FFA0100811181228133813A -:106EF000307F386000831183228333836CEE0E94DD -:106F00006B098A819B81AC014E5A5F4FFA01008167 -:106F100011812281338110640083118322833383A2 -:106F20006CEE0E946B098A819B81FC014685578526 -:106F300060897189516046875787608B718BAC017E -:106F4000425F5F4F60E80E946B098A819B81AC01C0 -:106F50004A5A5F4FFA0100811181228133812078E2 -:106F6000C02AD12AE22AF32AC082D182E282F382A5 -:106F70006DEE0E946B0960E08A819B810E94800A0D -:106F80008A819B81FC0146855785608971894460AF -:106F900046875787608B718BAC01425F5F4F60E81B -:106FA0000E946B098A819B81AC014E5A5F4FFA01A6 -:106FB000008111812281338130610083118322831A -:106FC00033836CEE0E946B09FE01E059FF4F8DE8A0 -:106FD00097E291838083329611821082329688E7FD -:106FE00097E29183808332961182108232968FE5E8 -:106FF00097E29183808332961182108232968EE5D9 -:1070000097E291838083C258DF4F19821882DF9103 -:10701000CF911F910F91FF90EF90DF90CF90BF9095 -:10702000AF909F908F900895FC0181E086838783C5 -:107030001186108612861486138616861586108A87 -:107040001786128A118A148A138A168A158A108E54 -:10705000178A128E118EDF01AB59BF4F1C92959784 -:107060001D921D921D921C92139714961D921D92B3 -:107070001D921C92139714961D921D921D921C92A4 -:10708000139714961C925A961C9211961C92129663 -:107090001C9211961C9211961C9211961C9211969C -:1070A0001C9211961C9211961C92119681EB97E2FC -:1070B00011969C938E93129611961C921E92129684 -:1070C0008CEA97E211969C938E93129611961C92DD -:1070D0001E92129687EA97E211969C938E931296CF -:1070E00011961C921E92129682EA97E28D939C93BF -:1070F000E258FF4F1182108208950E94B2260C942C -:1071000017270E94B2260C94CE25CF93DF93EC0173 -:10711000FC01E052FD4F1082EE58F109808181118F -:1071200004C0CE0140960E94032BFE01ED5AFD4F94 -:107130008081811105C0CE0180579F4F0E94032B93 -:10714000FE01EC5AFD4F8081811105C0CE01805FA8 -:107150009E4F0E94032B64E670E080E090E0DF9198 -:10716000CF910C941F072F923F924F925F926F9294 -:107170007F928F929F92AF92BF92CF92DF92EF92C7 -:10718000FF920F931F93CF93DF93EC010E949A21FC -:10719000FE01E755FD4F80911C0990911D099183D7 -:1071A00080830E949A21FE01E555FD4F80912009C0 -:1071B00090912109918380830E949A21FE01E355D9 -:1071C000FD4F8091240990912509918380830E942D -:1071D0009A218E0101551D4F609144097091450916 -:1071E00080914609909147090E94CD52F801608331 -:1071F0007183828393830E949A211E01FDE42F1ADA -:10720000FDEF3F0A609148097091490980914A0950 -:1072100090914B090E94CD52F1016083718382836A -:1072200093830E949A2120E030E048EC52E4F80178 -:1072300060817181828193810E94BB542B013C014A -:1072400020E030E048EC52E4F101608171818281FC -:1072500093810E94BB544B015C0160914C09709179 -:107260004D0980914E0990914F090E94CD5220E026 -:1072700030E048EC52E40E94BB546B017C012AE0F0 -:1072800037ED43E25CE3C301B2010E945455181686 -:107290008CF420E030E046EC52E4C301B2010E94DD -:1072A000C75287FD0FC0412C512C46EC642E42E49E -:1072B000742E08C05AE0452E57ED552E53E2652E28 -:1072C0005CE3752EF80140825182628273822AE06B -:1072D00037ED43E25CE3C501B4010E945455181632 -:1072E0008CF420E030E046EC52E4C501B4010E9489 -:1072F000C75287FD0FC0812C912C26ECA22E22E4D0 -:10730000B22E08C03AE0832E37ED932E33E2A32E3F -:107310003CE3B32EF10180829182A282B3822AE003 -:1073200037ED43E25CE3C701B6010E9454551816DD -:107330008CF420E030E046EC52E4C701B6010E9434 -:10734000C75287FD0FC0C12CD12C86ECE82E82E4F9 -:10735000F82E08C09AE0C92E97EDD92E93E2E92EB7 -:107360009CE3F92EFE01E954FD4FC082D182E282F6 -:10737000F3820E949A218091040990910509FE01EF -:10738000E254FD4F918380830E949A2180910809E5 -:1073900090910909FE01E054FD4F918380830E9482 -:1073A0009A2180910C0990910D09FE01EE53FD4F39 -:1073B000918380830E949A2180912C0990912D09BC -:1073C000A0912E09B0912F09FE01EC53FD4F80834F -:1073D0009183A283B3830E949A2180913009909176 -:1073E0003109A0913209B0913309FE01E853FD4FF4 -:1073F00080839183A283B3830E949A218091340970 -:1074000090913509A0913609B0913709FE01E453F6 -:10741000FD4F80839183A283B3830E949A21809140 -:10742000540990915509FE01E053FD4F91838083EB -:107430000E949A218091580990915909FE01EE52BB -:10744000FD4F918380830E949A2180915C099091E5 -:107450005D09FE01EC52FD4F918380830E949A21C9 -:1074600080916C0990916D09FE01EA52FD4F918364 -:1074700080830E949A218091700990917109FE0188 -:10748000E852FD4F918380830E949A218091740974 -:1074900090917509FE01E652FD4F918380830E9411 -:1074A0009A218091F4089091F508A091F608B09186 -:1074B000F708FE01E554FD4F0197A105B10519F448 -:1074C00081E0808301C010820E949A218091F80897 -:1074D0009091F908A091FA08B091FB08FE01E454DC -:1074E000FD4F0197A105B10519F481E0808301C02A -:1074F00010820E949A218091FC089091FD08A09131 -:10750000FE08B091FF08C354DD4F0197A105B105F6 -:1075100019F481E0888301C01882DF91CF911F9117 -:107520000F91FF90EF90DF90CF90BF90AF909F9022 -:107530008F907F906F905F904F903F902F90089525 -:107540002F923F924F925F926F927F928F929F9273 -:10755000AF92BF92CF92DF92EF92FF920F931F9361 -:10756000CF93DF93CDB7DEB7A9970FB6F894DEBF00 -:107570000FBECDBF99A788A77C836B830E94AE2FD7 -:1075800088A599A5F0DD88A599A5B7DD88A599A559 -:10759000B8DD2B813C8121303105C9F12230310524 -:1075A00009F467C0232B09F097C068A479A430E1DF -:1075B000630E711C48A559A540575E4F5A874987ED -:1075C000E8A5F9A5E25AFD4F5081598B88A599A5E8 -:1075D00081589D4F9C878B87A8A5B9A5A755BD4FFE -:1075E000BD8BAC8BE8A5F9A5E554FD4FF98FE88F6D -:1075F00028A539A525503E4F388B2F874DE850E000 -:107600005F8B4E8B85E190E098878F8368C068A47C -:1076100079A490E9690E711CA8A5B9A5A255BE4F21 -:10762000BA87A987E8A5F9A5E15AFD4FB081B98BC2 -:10763000E8A5F9A5ED57FD4FFC87EB8728A539A5EF -:1076400025553D4F3D8B2C8B48A559A544545D4F86 -:10765000598F488F88A599A583509E4F988B8F8707 -:10766000AEE8B0E0BF8BAE8BE6E1F0E0F887EF83E9 -:1076700036C068A479A4F0EF6F1AFEEF7F0A28A540 -:1076800039A524533E4F3A872987E8A5F9A5E05A42 -:10769000FD4F3081398B48A559A549575D4F5C870F -:1076A0004B8788A599A583559D4F9D8B8C8BA8A54D -:1076B000B9A5A354BD4FB98FA88FE8A5F9A5E1508E -:1076C000FE4FF88BEF872FE830E03F8B2E8B47E1A2 -:1076D00050E058874F8303C08CE596E00CC0C3018F -:1076E0000E94BA2A811105C0C3010E94A92A8823D9 -:1076F00069F08DEE96E04ED40E94B22681E090E0D3 -:1077000090934F0780934E0790E0E1C384E294E0AA -:1077100041D48BE896E03ED4D30114968C917BD46F -:1077200083E297E037D48CE993E034D481E090E0B1 -:10773000EF85F8899183808341E050E0B30188A50B -:1077400099A50E940A17C3010E94172BD301D29654 -:107750008C9183010A591F4F882339F0C3010E947D -:10776000E72A81E0D8018C9305C0C3010E94CB2A8F -:10777000F801108289859A850E94462AF301EC5B04 -:10778000FF4F6083718382839383AB85BC851D9299 -:107790001D921D921C921397E8A5F9A5E158FD4F83 -:1077A0001082118212821382E8A5F9A5ED57FD4FD0 -:1077B0001082118212821382E8A5F9A5E957FD4FC4 -:1077C000108211821282138286E090E0EF85F889A0 -:1077D0009183808346E050E0B30188A599A50E947B -:1077E0000A1741E050E0B30188A599A50E94ED1663 -:1077F000212C312C210123948B819C8185549D4F18 -:1078000028A539A5280F391F3B8B2A8B4B815C811A -:10781000440F551F440F551F5E834D83CA01815588 -:107820009D4FA8A5B9A5A80FB91FBB8FAA8F8B81A3 -:107830009C8188599E4F880F991FE8A5F9A5E80FEC -:10784000F91FFF8FEE8FCA0183569D4F28A539A5DA -:10785000280F391F39A328A30C9748A559A5480F0D -:10786000591F5BA34AA38D819E8181589D4FA8A576 -:10787000B9A5A80FB91FBDA3ACA38D819E81E8A5B2 -:10788000F9A58E0F9F1F9C01285D3D4F3E872D87D8 -:107890008A889B88AA8CBB8CCE8CDF8CE8A0F9A050 -:1078A0000AA11BA12CA13DA149855A85B30188A538 -:1078B00099A5D1D98FEB9BE00E94350318161906C4 -:1078C00024F01A82198210E01DC08FEB9BE00E9409 -:1078D00013038F7D85349105A1F789EA94E05AD38B -:1078E0000E94B22621E0DC011C962C9382E693E0F4 -:1078F00051D30E94B2260E94BC25E1E0F0E0FA8359 -:10790000E98311E0C3010E94BA2A81111DC0C3019D -:107910000E94A92A811118C0111116C0AC89BD8915 -:107920006D917C91072E000C880B990B0E94CD5213 -:107930009B01AC01EB85FC85608171818281938123 -:107940000E94C75287FD70C28BEC96E023D3C3011F -:107950000E94A92A811165C242E050E0B30188A5C6 -:1079600099A50E94ED1684E294E014D38BE896E08A -:1079700011D3D30114968C914ED382E996E00AD3A9 -:107980008CE993E007D3E981FA81EF2BD1F485EA02 -:1079900096E000D389EA95E0FDD282EA95E0FAD23A -:1079A0008F81988539D489EA95E0F4D284EA95E00C -:1079B000F1D2F9898F2F90E02FD40E94B2260E9435 -:1079C000BC2588A599A599DB88A599A59ADB84E2B1 -:1079D00094E0E0D28BE896E0DDD2D30114968C914E -:1079E0001AD389EA96E0D6D28CE993E0D3D2EB851C -:1079F000FC851082118212821382D301D2968C915F -:107A000083010A591F4F882331F0C3010E94CB2AFA -:107A1000F801108206C0C3010E94E72A81E0D80164 -:107A20008C9389859A850E94462AF301EC5BFF4F6F -:107A30006083718382839383E8A5F9A5E158FD4FA4 -:107A40001082118212821382E8A5F9A5ED57FD4F2D -:107A50001082118212821382E8A5F9A5E957FD4F21 -:107A6000108211821282138289859A850E94462A89 -:107A70006A8F7B8F8C8F9D8F212C312C2101239439 -:107A80008B819C8185549D4FE8A5F9A5E80FF91FCE -:107A9000FF8FEE8F8D819E8181559D4F28A539A541 -:107AA000280F391F39A328A38B819C8188599E4FA9 -:107AB000880F991F48A559A5480F591F5BA34AA3D2 -:107AC0008D819E8183569D4FA8A5B9A5A80FB91F8A -:107AD000BDA3ACA3ED81FE81EF56FD4FFFA3EEA346 -:107AE0008D819E8128A539A5820F931FAC01485D29 -:107AF0005D4F5B8B4A8BF1013197FE87ED87F887ED -:107B0000EF8329813A81232B09F0C3C02D813E8167 -:107B100021583D4F88A599A5280F391F8E8C9F8C21 -:107B2000A8A0B9A0CAA0DBA0ECA0FDA00EA11FA137 -:107B3000080F191F49855A85B3018DD88FEB9BE03B -:107B40000E9435031816190614F010E01DC08FEBC3 -:107B50009BE00E9413038F7D85349105B1F789EA7C -:107B600094E018D20E94B22621E0DC011C962C93EE -:107B700082E693E00FD20E94B2260E94BC25E1E08B -:107B8000F0E0FA83E98311E02D853E852A30310546 -:107B900038F4AB85BC851D921D921D921C921397E3 -:107BA000B989C301B1118EC10E94A92A81116DC08A -:107BB000112329F0ED85FE85F887EF8366C0AC8937 -:107BC000BD896D917C91072E000C880B990B0E944A -:107BD000CD529B01AC01EB85FC8560817181828176 -:107BE00093810E94C75287FFE5CFC3010E94C52B36 -:107BF000AA89BB892D913D914D915C9160E573EC13 -:107C000080E090E00E94F953C9010E941407EA89BC -:107C1000FB892081318142815381A3E0B0E00E9441 -:107C200015549B01AC01C201B1010E94F953672BAD -:107C3000682B692B91F48EE593E0ACD10E94B226BB -:107C40000E94BC2584E294E0A5D18DEB96E0A2D100 -:107C5000C101E2D28CE993E09DD1C3010E948E2A3A -:107C6000AA89BB892D913D914D915C9160E573ECA2 -:107C700080E090E00E94F953C9010E941407BFEF11 -:107C80002B1A3B0A4B0A5B0A36CF8BEC96E082D16B -:107C900004C041E050E05A83498384E294E07AD101 -:107CA0008BE896E077D1D30114968C91B4D18FED07 -:107CB00096E070D18CE993E06DD189859A850E9418 -:107CC000462AE88DF98DEF2BA9F0DC01CB012A8D36 -:107CD0003B8D4C8D5D8D821B930BA40BB50BB7FFB9 -:107CE00007C0B095A095909581959F4FAF4FBF4F1E -:107CF00098878F8349815A81452B01F585EA96E063 -:107D000049D189EA95E046D182EA95E043D18E894E -:107D10009F8982D289EA95E03DD184EA95E03AD103 -:107D2000AF81B885BD01BB0F880B990B0E94CD5266 -:107D300042E0A3D10E94B2260E94BC2585E090E0DB -:107D4000EF85F8899183808345E050E0B30188A5F1 -:107D500099A50E940A17C3010E94032B88A599A523 -:107D6000CCD988A599A5CDD92B813C81213031056D -:107D7000B1F02230310521F1232B91F50E94B2267A -:107D80004F815885CA01550FAA0BBB0B809354072E -:107D900090935507A0935607B093570721C00E94B0 -:107DA000B226EF81F885CF01FF0FAA0BBB0B8093A2 -:107DB000580790935907A0935A07B0935B0710C0D8 -:107DC0000E94B2262F813885C901330FAA0BBB0B45 -:107DD00080935C0790935D07A0935E07B0935F0765 -:107DE0000E94B2260E940F26AF85B8891D921C9270 -:107DF00040E050E0B30188A599A50E940A1740E031 -:107E000050E0B30188A599A50E94ED160E94B22604 -:107E1000E981FA81F0934F07E0934E0789819A81B7 -:107E200056C0B1E0B98B98CDC3010E94C52BED853A -:107E3000FE85208131814281538160E573EC80E0D1 -:107E400090E00E94F953C9010E941407AD85BE85D8 -:107E50002D913D914D915C91A3E0B0E00E941554AD -:107E60009B01AC01C201B1010E94F953672B682B41 -:107E7000692B39F48EE593E08DD00E94B2260E94E2 -:107E8000BC25C3010E948E2AAD85BE852D913D91F2 -:107E90004D915C9160E573EC80E090E00E94F953B5 -:107EA000C9010E941407BFEF2B1A3B0A4B0A5B0A59 -:107EB000E981FA81EF2B09F4EBCC21E030E03A8341 -:107EC00029834ACD0E94BA2A811174CE71CEA99617 -:107ED0000FB6F894DEBF0FBECDBFDF91CF911F91DB -:107EE0000F91FF90EF90DF90CF90BF90AF909F9059 -:107EF0008F907F906F905F904F903F902F9008955C -:107F0000CF93DF93FC01E251FE4F40815181411537 -:107F1000510559F1EC01CE50DE4F2881398186514F -:107F20009E4F24173507C8F4FC018081918100978A -:107F300061F0FC01E20FF31F80818A3041F08D3047 -:107F400029F48CE993E026D002C080E064D08881D7 -:107F5000998101969983888308C040E050E06EE9DA -:107F600073E00E941F0519821882DF91CF91089556 -:107F7000009769F0FC0101900020E9F73197AF010B -:107F8000481B590BBC018FEB9BE00C94D50280E0A1 -:107F900090E00895EDCF8F929F92AF92BF920F9392 -:107FA0001F93CF93DF93CDB7DEB7A1970FB6F894A9 -:107FB000DEBF0FBECDBF19A2423008F44AE08E01E9 -:107FC0000F5D1F4F842E912CA12CB12CA501940183 -:107FD0000E942554E62FB901CA0101501109EA3067 -:107FE00014F4E05D01C0E95CD801EC93232B242B51 -:107FF000252B61F7C801BCDFA1960FB6F894DEBF50 -:108000000FBECDBFDF91CF911F910F91BF90AF9069 -:108010009F908F900895E091BF0BF091C00B01905D -:10802000F081E02D682F8FEB9BE01994CF92DF92C7 -:10803000EF92FF92CF93DF9397FF17C06B017C0104 -:108040008DE2E9DFEC0166277727CB016C197D090A -:108050008E099F094AE09FDF8C0F9D1FDF91CF9112 -:10806000FF90EF90DF90CF9008954AE0DF91CF919D -:10807000FF90EF90DF90CF908ECF4F925F926F92F4 -:108080007F928F929F92AF92BF92CF92DF92EF92A8 -:10809000FF926B017C01B42E9B01AC010E945855EC -:1080A000882319F082E497E027C026013701E8947D -:1080B00077F82FEF3FEF4FE75FE7C301B2010E9470 -:1080C000585581110DC02FEF3FEF4FE75FE7C30118 -:1080D000B2010E94C75218161CF486E497E00CC047 -:1080E0002FEF3FEF4FE75FE4C701B6010E94545501 -:1080F00018167CF48AE497E0FF90EF90DF90CF9021 -:10810000BF90AF909F908F907F906F905F904F90B7 -:108110002FCF2FEF3FEF4FE75FECC701B6010E9473 -:10812000C75287FDE7CF20E030E0A901C701B601C3 -:108130000E94C75287FF08C08DE26DDF4C01F7FA3D -:10814000F094F7F8F09402C0812C912CA12C60E0FF -:1081500070E080E09FE3AB1441F020E030E040E2CB -:1081600051E40E94BB54A394F6CF9B01AC01C7011C -:10817000B6010E9457542B013C010E9428556B0107 -:108180007C010E94CB529B01AC01C301B2010E9451 -:1081900056542B013C014AE0C701B601FCDE7C01CC -:1081A000E80CF91CBB2021F08EE235DFE80EF91E49 -:1081B000DB2CDD2019F120E030E040E251E4C30186 -:1081C000B2010E942C532B013C010E9428554B0107 -:1081D000A12CB12C4AE0C501B401DDDEE80EF91E88 -:1081E000C501B4010E94CB529B01AC01C301B20195 -:1081F0000E9456542B013C01DA94DBCFC701FF905B -:10820000EF90DF90CF90BF90AF909F908F907F9036 -:108210006F905F904F900895BC01990F880B990B58 -:1082200005CF0CB405FC0DC01EBC00000DB407FE4C -:10823000FDCF9EB51EBC00000DB407FEFDCF8EB570 -:1082400008951EBC00000DB407FEFDCF8EB51EBC08 -:1082500000000DB407FEFDCF9EB5089527E030E085 -:10826000A0E0682F70E0B22FE091B90BF091BA0B4B -:108270009091B60BAB01022E02C0559547950A941A -:10828000E2F7808140FF02C0982B02C090959823AE -:108290009083E091BD0BF091BE0B90818091B80B63 -:1082A000892B8083E091BB0BF091BC0B40818091C6 -:1082B000B70B482381E090E011F480E090E001C02A -:1082C000880FBA95EAF78A2BA82FE091BD0BF091A1 -:1082D000BE0B50814091B80B4095452340832150FF -:1082E000310908F60895CF9380E0B8DFC82F80E009 -:1082F000B5DF2C2F30E0322F2227A901482BCA01ED -:10830000CF9108958F929F92AF92BF92DF92EF929A -:10831000FF920F931F93CF93DF93EC017B018EEAC3 -:1083200097E4A1EEBDE388839983AA83BB8380E0B1 -:1083300090E00E94CB5225ED34E045E352E40E94E8 -:108340002C5320E030E04AE754E40E94BB544B0138 -:108350005C0128EB3EE145E05EE30E942C5326E6FB -:1083600036E646EA5EE30E94BB5420E030E040E897 -:108370005FE30E9456540E942855D62E8E010E5A55 -:108380001F4F8FE08D1578F1F80180819181A281D6 -:10839000B381A26080839183A283B383A8016CEE32 -:1083A000CE010E946B092AE037ED43EA5CE3688165 -:1083B00079818A819B810E9457549B01AC01C50140 -:1083C000B4010E942C532CEE31E548E35EE30E9499 -:1083D000BB5420E030E040E85FE30E9456540E9426 -:1083E0002855D62E16C0A8016CE6CE010E946B0956 -:1083F000F80180819181A281B381A1FF0AC0AD7F84 -:1084000080839183A283B383A8016CEECE010E9486 -:108410006B098D2D90E0A0E0B0E0BA2FA92F982F26 -:10842000882788279F71AA27BB274A895B896C897F -:108430007D89507E842B952BA62BB72B8A8B9B8B0B -:10844000AC8BBD8B8E010E5E1F4FA80160E9CE0183 -:108450000E946B096D2D70E080E090E00E94CD528B -:1084600020E030E040E05FE30E942C530E9428555A -:108470006F718A899B89AC89BD89807E862B8A8BA6 -:108480009B8BAC8BBD8BA80160E9CE010E946B0970 -:10849000CA58DF4FF982E882DF91CF911F910F9187 -:1084A000FF90EF90DF90BF90AF909F908F900895D6 -:1084B000789484B5826084BD84B5816084BD85B5BF -:1084C000826085BD85B5816085BD80916E008160CB -:1084D00080936E0010928100809181008260809371 -:1084E0008100809181008160809381008091800073 -:1084F0008160809380008091B10084608093B1009E -:108500008091B00081608093B00080919100826082 -:10851000809391008091910081608093910080917F -:1085200090008160809390008091A1008260809390 -:10853000A1008091A10081608093A1008091A000A2 -:1085400081608093A000809121018260809321014D -:1085500080912101816080932101809120018160BF -:108560008093200180917A00846080937A008091CA -:108570007A00826080937A0080917A008160809393 -:108580007A0080917A00806880937A001092C1000E -:1085900061E089E10E94E40561E08EE00E94E4056B -:1085A00061E08FE10E94E40561E082E20E94E4055F -:1085B000E091CF0BF091D00B82E08083E091CB0B68 -:1085C000F091CC0B1082E091CD0BF091CE0B80E1BD -:1085D00080831092D70BE091D30BF091D40B86E0FF -:1085E0008083E091D10BF091D20B808180618083F8 -:1085F000E091D10BF091D20B808188608083E09173 -:10860000D10BF091D20B808180688083E091D10BF7 -:10861000F091D20B80818F7D808364E670E080E0F2 -:1086200090E00E941F070E9454180E9479130E9434 -:10863000B0180E9480180E9457076093850B7093B2 -:10864000860B8093870B9093880B809170008160DC -:10865000809370008091B100887F81608093B10029 -:1086600084E08093B30061E08DE00E94D80661E071 -:1086700089E00E94D80661E088E00E94D80661E0A7 -:1086800087E00E94D80661E08AE00E94D80661E097 -:108690008CE00E94D80662E08FE30E94D80662E078 -:1086A0008BE30E94D80661E084E00E94D80661E076 -:1086B00085E00E94D80661E086E00E94D80661E06D -:1086C00087E00E94D8060E9457076093810B709341 -:1086D000820B8093830B9093840B0E9457076093C7 -:1086E000890B70938A0B80938B0B90938C0B0E9459 -:1086F00057076093850B7093860B8093870B90933D -:10870000880B0E949A218091680790916907A09137 -:108710006A07B0916B070197A105B10581F40E942A -:108720009A218091B0079091B107A091B207B091C2 -:10873000B3070197A105B10511F40C94DD4B0E941C -:108740009A218091680790916907A0916A07B0917A -:108750006B070197A105B10581F40E949A218091D0 -:10876000AC079091AD07A091AE07B091AF0701970C -:10877000A105B10511F40C94FD4B0E949A21809142 -:10878000680790916907A0916A07B0916B070197FC -:10879000A105B10581F40E949A218091A8079091CA -:1087A000A907A091AA07B091AB070197A105B10550 -:1087B00011F40C941D4C80E893E0ECDB0E945418FB -:1087C000EC010E949A210091A4081091A5080E9432 -:1087D0009A214091B4085091B508B801CE01409655 -:1087E0000E94A8360E949A210091A4081091A50821 -:1087F0000E949A214091B4085091B508B801CE0169 -:1088000080579F4F0E94A8360E949A210091A40889 -:108810001091A5080E949A214091B4085091B50882 -:10882000B801CE01805F9E4F0E94A836EFE72E2E42 -:10883000E2E03E2EF5E7AF2EF2E0BF2E0E94570792 -:108840006093890B70938A0B80938B0B90938C0BA6 -:108850000091850B1091860B2091870B3091880B2E -:10886000601771078207930748F46093850B709334 -:10887000860B8093870B9093880B2CC0DC01CB0177 -:10888000801B910BA20BB30B883E9340A105B10551 -:1088900008F108511C4F2F4F3F4F0093850B109349 -:1088A000860B2093870B3093880B0E94B018EC0145 -:1088B0000E944F1ACE010C960E944F1ACE01489684 -:1088C0000E944F1ACE0184960E944F1ACE01C09684 -:1088D0000E944F1A8FEB9BE00E943503892B09F40D -:1088E000BDC50E9457076093810B7093820B8093E4 -:1088F000830B9093840B8FEB9BE00E941303809378 -:10890000800B982F9F7D953479F020917E0B3091CC -:108910007F0BF901E45BF44F80832F5F3F4F30936F -:108920007F0B20937E0B06C00E94B22621E0DC0163 -:108930001C962C9380917E0B90917F0B8133910537 -:1089400064F02AE02093800BFC01E45BF44F208369 -:10895000019690937F0B80937E0B8091800B2091EA -:108960007E0B30917F0B8A3039F4C9010197A9E160 -:10897000BBE0ECE4FBE004C022333105B4F76EC584 -:10898000AF014C545B40481759071CF441914D937B -:10899000F7CFFC01E75EF44F1082223031050CF472 -:1089A00059C581E193E0F6DA89EA95E0F3DA8FE9D7 -:1089B00093E0F0DA89E19BE0EDDA8FE993E0EADA1F -:1089C0008CE993E0E7DA8AE390E00E94204DEC0125 -:1089D0001A821B821C821D821E821F8218861986A3 -:1089E0001A861B861C861D861E861F86188A198A73 -:1089F0001A8A1B8A1C8A1D8A1E8A1F8A188E198E43 -:108A00001A8E1B8E1C8E1D8E1E8E1F8E18A219A2F2 -:108A10001AA21BA21CA21DA21EA21FA218A619A662 -:108A20001AA61BA61CA61DA61EA61FA618AA19AA32 -:108A30001AAA1BAA1CAA1DAA1EAA1FAA18AE19AE02 -:108A400068E072E089E19BE00E94504E8C01FC01DD -:108A500080818654823008F027C161EA73E0C80142 -:108A60000E947456892B09F4D3C064EA73E0C801EC -:108A70000E947456892B09F4CBC068EA73E0C801E0 -:108A80000E947456892B09F4C6C06BEA73E0C801D2 -:108A90000E947456892B09F4BEC06FEA73E0C801C6 -:108AA0000E947456892B09F4B9C063EB73E0C801C6 -:108AB0000E947456892B09F4B4C067EB73E0C801B7 -:108AC0000E947456892B09F4ACC06AEB73E0C801AC -:108AD0000E947456892B09F4A7C06EEB73E0C8019D -:108AE0000E947456892B09F4A2C062EC73E0C8019D -:108AF0000E947456892B09F49DC066EC73E0C8018E -:108B00000E947456892B09F498C06AEC73E0C8017E -:108B10000E947456892B09F493C06EEC73E0C8016F -:108B20000E947456892B09F48EC062ED73E0C8016F -:108B30000E947456892B09F489C066ED73E0C80160 -:108B40000E947456892B09F484C06AED73E0C80151 -:108B50000E947456892B09F47FC06EED73E0C80142 -:108B60000E947456892B09F47AC062EE73E0C80142 -:108B70000E947456892B09F475C066EE73E0C80133 -:108B80000E947456892B09F470C06AEE73E0C80124 -:108B90000E947456892B09F46BC06EEE73E0C80115 -:108BA0000E947456892B09F466C062EF73E0C80115 -:108BB0000E947456892B09F461C066EF73E0C80106 -:108BC0000E947456892B09F45CC06AEF73E0C801F7 -:108BD0000E947456892B09F457C06EEF73E0C801E8 -:108BE0000E947456892B09F452C062E074E0C801F7 -:108BF0000E947456892B09F44DC066E074E0C801E8 -:108C00000E947456892B09F448C08FEF9FEF47C02C -:108C100080E090E044C081E090E041C08CE190E0D1 -:108C20003EC08DE690E03BC08FE690E038C080E724 -:108C300090E035C081E790E032C082E790E02FC03D -:108C400083E790E02CC084E790E029C088E790E0BB -:108C500026C089E790E023C08AE790E020C083E83F -:108C600090E01DC084E890E01AC08DE890E017C045 -:108C70008EE890E014C08FE890E011C080E990E0A9 -:108C80000EC081EA90E00BC085EB90E008C086EB57 -:108C900090E005C087EB90E002C088EB90E09093F5 -:108CA000010280930002BBC08FEF9FEF90930102FF -:108CB00080930002B8C0D8018C91883539F4C8017E -:108CC0000196EBD76A837B838C839D83F801808137 -:108CD000893539F4C8010196E0D76E837F83888790 -:108CE0009987D8018C918A3539F4C8010196D5D776 -:108CF0006A877B878C879D87F8018081813449F45E -:108D0000C8010196CAD70E9423556E877F87888B3A -:108D1000998BD8018C91823449F4C8010196BDD752 -:108D20000E9423556A8B7B8B8C8B9D8BF8018081F5 -:108D3000833449F4C8010196B0D70E9423556E8B45 -:108D40007F8B888F998FD8018C91833539F4C80136 -:108D50000196A3D76A8F7B8F8C8F9D8FF8018081BE -:108D6000803549F4C801019698D70E9423556E8F2B -:108D70007F8F88A399A3D8018C91863549F4C801C7 -:108D800001968BD70E9423556AA37BA38CA39DA336 -:108D9000F8018081873549F4C80101967ED70E9489 -:108DA00023556EA37FA388A799A7D8018C918534FA -:108DB00049F4C801019671D70E9423556AA77BA781 -:108DC0008CA79DA7F8018081843549F4C8010196DC -:108DD00064D70E9423556EA77FA788AB99ABD801B3 -:108DE0008C918D3449F4C801019657D70E942355C0 -:108DF0006AAB7BAB8CAB9DABF8018081813549F4CC -:108E0000C80101964AD70E9423556EAB7FAB88AF4D -:108E100099AF6AE074E080E090E042D78C010115E0 -:108E2000110509F048CF0E94B226DC011C961C9166 -:108E30000E949A21409074075090750760907607C1 -:108E400070907707CEA8DFA8E8ACF9AC0E94B226F4 -:108E5000C0925007D0925107E0925207F092530708 -:108E6000809100029091010299249394823091059F -:108E700038F09C012F5631092630310508F0912C2D -:108E8000112371F08D36910559F09C012857310955 -:108E90002330310528F0855B9109039708F0D0C293 -:108EA0000E949A218091680790916907A0916A07B2 -:108EB000B0916B070197A105B10529F0992019F030 -:108EC0008DEF92E0BFC2209719F489EF92E0BAC209 -:108ED000E0900002F0900102BFEFEB16FB06A9F351 -:108EE000E114F104B9F48091E40A9091E50A892B28 -:108EF00061F482E090E0A4D521E132E0FC0131830D -:108F000020839093E50A8093E40A0091E40A10918B -:108F1000E50A6EC0FCE1EF16F104B9F48091E60AAF -:108F20009091E70A892B61F482E090E089D52BE1EA -:108F300032E0DC012D933C939093E70A8093E60A9C -:108F40000091E60A1091E70A53C0BDE6EB16F10462 -:108F5000B9F48091E80A9091E90A892B61F482E0E2 -:108F600090E06ED525E232E0FC01318320839093BE -:108F7000E90A8093E80A0091E80A1091E90A53C0CF -:108F8000FFE6EF16F104B9F48091EA0A9091EB0A3A -:108F9000892B61F482E090E053D52FE232E0DC01CE -:108FA0002D933C939093EB0A8093EA0A0091EA0A8E -:108FB0001091EB0A53C000E010E0B0E7EB16F104AB -:108FC000B9F48091EC0A9091ED0A892B61F482E06A -:108FD00090E036D529E332E0FC0131832083909381 -:108FE000ED0A8093EC0A0091EC0A1091ED0A6CC036 -:108FF000F1E7EF16F104B9F48091EE0A9091EF0ACF -:10900000892B61F482E090E01BD523E432E0DC019F -:109010002D933C939093EF0A8093EE0A0091EE0A11 -:109020001091EF0A6CC0B2E7EB16F104B9F480912D -:10903000F00A9091F10A892B61F482E090E000D56A -:109040002DE432E0FC01318320839093F10A809378 -:10905000F00A0091F00A1091F10A6AC0F3E7EF16E6 -:10906000F104B9F48091F20A9091F30A892B61F42A -:1090700082E090E0E5D427E532E0DC012D933C93DB -:109080009093F30A8093F20A0091F20A1091F30A86 -:1090900068C0B4E7EB16F104B9F48091F40A90913A -:1090A000F50A892B61F482E090E0CAD421E632E02F -:1090B000FC01318320839093F50A8093F40A009198 -:1090C000F40A1091F50A68C0F8E7EF16F104B9F454 -:1090D0008091F60A9091F70A892B61F482E090E082 -:1090E000AFD42BE632E0DC012D933C939093F70A4A -:1090F0008093F60A0091F60A1091F70A68C0B9E762 -:10910000EB16F104A9F48091F80A9091F90A892BE1 -:1091100051F482E090E094D4FC01B182A08290935B -:10912000F90A8093F80A0091F80A1091F90A6AC0C6 -:10913000FAE7EF16F104A9F48091FA0A9091FB0A7C -:10914000892B51F482E090E07BD4DC012D923C929B -:109150009093FB0A8093FA0A0091FA0A1091FB0A95 -:109160006CC0BDE8EB16F104B9F48091FC0A909153 -:10917000FD0A892B61F482E090E062D429E832E0B4 -:10918000FC01318320839093FD0A8093FC0A0091B7 -:10919000FC0A1091FD0A6CC03EE8E316F104B9F434 -:1091A0008091FE0A9091FF0A892B61F482E090E0A1 -:1091B00047D4E3E9F2E0DC01ED93FC939093FF0ADE -:1091C0008093FE0A0091FE0A1091FF0A6CC0FFE82E -:1091D000EF16F104B9F48091000B9091010B892BEB -:1091E00061F482E090E02CD4EDE9F2E0DC01ED9353 -:1091F000FC939093010B8093000B0091000B109156 -:10920000010B6CC0F0E9EF16F104B9F48091020B88 -:109210009091030B892B61F482E090E011D4E7EA8E -:10922000F2E0DC01ED93FC939093030B8093020B2F -:109230000091020B1091030B6CC0F1EAEF16F104E0 -:10924000B9F48091040B9091050B892B61F482E0B5 -:1092500090E0F6D3E1EBF2E0DC01ED93FC93909328 -:10926000050B8093040B0091040B1091050B6BC050 -:10927000F5EBEF16F104B9F48091060B9091070B12 -:10928000892B61F482E090E0DBD3EBEBF2E0DC01D0 -:10929000ED93FC939093070B8093060B0091060BC4 -:1092A0001091070B50C0F6EBEF16F104B9F4809162 -:1092B000080B9091090B892B61F482E090E0C0D3F8 -:1092C000E5ECF2E0DC01ED93FC939093090B8093C5 -:1092D000080B0091080B1091090B35C0F7EBEF1646 -:1092E000F104B9F480910A0B90910B0B892B61F476 -:1092F00082E090E0A5D3EFECF2E0DC01ED93FC938B -:1093000090930B0B80930A0B00910A0B10910B0B9F -:109310001AC0F8EBEF16F104B1F480910C0B9091A8 -:109320000D0B892B61F482E090E08AD3E3EEF2E04A -:10933000DC01ED93FC9390930D0B80930C0B00914B -:109340000C0B10910D0B0115110589F489EF92E0BA -:109350000E94CA3F0E94B2260E94BC258EE094E083 -:109360000E94B83F8CE993E00E94B83F71C085EF3E -:1093700092E00E94CA3F0E94B2260E94BC250E9431 -:10938000B22610924F0710924E07E12CF12CFFEFFE -:10939000EF1AFF0A21E0E216F10441F081EF92E0BA -:1093A0000E94CA3F0E94B2260E94BC25D801ED91BE -:1093B000FC910480F581E02DBE01C80119950E9441 -:1093C000B226C0904E07D0904F070E94B226FC01F3 -:1093D0008485E114F104D9F281110AC0E414F50482 -:1093E0003CF4C114D10421F0F2E0CF16D10479F697 -:1093F0008FEB9BE00E943503181619062CF48FEBB7 -:109400009BE00E941303F4CFCD2809F439C29920C0 -:1094100009F433C20E949A218091700790917107DC -:10942000A0917207B09173070197A105B10509F0EA -:1094300024C20E94B22621E0DC011C962C931DC29E -:1094400081E093E00E94CA3F0E94B2260E94BC25A0 -:10945000CE018BD310927F0B10927E0B8091180B54 -:109460008111AAC00E94B226FC018485882309F4D8 -:10947000A3C00E945418EC01FC01E052FD4F108281 -:1094800040960E94032BCE0180579F4F0E94032BD2 -:10949000CE01805F9E4F0E94032B0E94301A7C01F8 -:1094A0008C01075C1F4FC1E0D0E06801F8E3CF1AE0 -:1094B000D108D6018C918823D9F084E294E00E94EF -:1094C000CA3F88E294E00E94CA3FCE010E940C414C -:1094D0008CE993E00E94CA3F60E08C2F0E94E40573 -:1094E00040E050E0BE01C7010E94DC18F601108286 -:1094F000D8018C918823F9F084E294E00E94CA3F5D -:109500008FE394E00E94CA3FCE010E940C418CE997 -:1095100093E00E94CA3F61E08C2F0E94D80660E071 -:109520008C2F0E94E40541E050E0BE01C7010E947B -:10953000DC18F801108221960F5F1F4FC533D1054B -:1095400009F0B3CF0E946D188091D90E90E09C0174 -:10955000220F331F820F931FFC01E85BF14F8081C4 -:109560008F7B80838091DC0E90E09C01220F331F63 -:10957000820F931FFC01E85BF14F80818F7B80831A -:109580008091DF0E90E09C01220F331F820F931F0A -:10959000FC01E85BF14F80818F7B80838091E20E3C -:1095A00090E09C01220F331F820F931FFC01E85BA8 -:1095B000F14F80818F7B80830E94B226DC011C9654 -:1095C0008C918093180BC091160BD091170B0E94B1 -:1095D0009A21FC0182819381C817D90799F00E94D2 -:1095E0009A21DC0112968D919C9113979093170B01 -:1095F0008093160B0E9454180E9479130E94B01891 -:109600000E9480180E9457076093120B7093130BEF -:109610008093140B9093150B0091810B1091820B8A -:109620002091830B3091840B601771078207930799 -:1096300008F4B6C0DC01CB01801B910BA20BB30B6D -:1096400089389341A105B10508F4B4C00E94B2263F -:10965000DC011C968C91882319F08DE093E002C008 -:1096600089E093E00E94CA3F0E94B2260E94BC2576 -:109670000E945418EC01FC01E554FD4F80818823C1 -:1096800041F0CE0180579E4F0E94462A6B017C011B -:1096900007C0FE01EC5AFF4FC080D180E280F3800A -:1096A0000E94B226C0925407D0925507E092560706 -:1096B000F0925707FE01E454FD4F8081882341F06A -:1096C000CE0182559E4F0E94462A6B017C0107C045 -:1096D000FE01EC52FF4FC080D180E280F3800E94F7 -:1096E000B226C0925807D0925907E0925A07F092DA -:1096F0005B07FE01E354FD4F8081882341F0CE01DA -:1097000084539E4F0E94462A6B017C0106C0CC5AAE -:10971000DE4FC880D980EA80FB800E94B226C092CA -:109720005C07D0925D07E0925E07F0925F070E94AF -:10973000B2260E940F260E9454180E949B170E9476 -:10974000B2260E9417270E94B2260E94CE250E94B0 -:109750009A218091680790916907A0916A07B0915A -:109760006B070197A105B10541F085E093E00E94E8 -:10977000CA3F0E94B2260E94BC2580910E0B909198 -:109780000F0BA091100BB091110B0196A11DB11DF3 -:1097900080930E0B90930F0BA093100BB093110BB3 -:1097A0000E9457076093810B7093820B8093830B09 -:1097B0009093840B0E94D20341C885E594E00E94F7 -:1097C000CA3F0E94541821E02F931F921F921F92AC -:1097D0001F92812C912CA12CB12CC12CD12C760163 -:1097E00097018601B701A6010E94A60A0F900F906B -:1097F0000F900F900F900C949F438DE694E00E9481 -:10980000CA3F0E9454181F9221E02F931F921F926B -:109810001F92812C912CA12CB12CC12CD12C760122 -:1098200097018601B701A6010E94A60A0F900F902A -:109830000F900F900F900C94BD4385E894E00E9428 -:10984000CA3F0E9454181F921F9221E02F931F922B -:109850001F92812C912CA12CB12CC12CD12C7601E2 -:1098600097018601B701A6010E94A60A0F900F90EA -:109870000F900F900F900C94DB4389EE92E002C0A2 -:109880008DEE92E00E94CA3F0E94B2260E94BC2543 -:109890000E94B22610925007109251071092520760 -:1098A00010925307D5CD80915C0C90915D0C5DC1F9 -:1098B0000F931F931092C20B1092C10B88EE93E08E -:1098C000A0E0B0E08093C30B9093C40BA093C50BB2 -:1098D000B093C60B8AE693E09093C00B8093BF0BC6 -:1098E00085EC90E09093CC0B8093CB0B84EC90E0D4 -:1098F0009093CE0B8093CD0B80EC90E09093D00BA7 -:109900008093CF0B81EC90E09093D20B8093D10B9E -:1099100082EC90E09093D40B8093D30B86EC90E094 -:109920009093D60B8093D50B1092D80B1092D90B35 -:109930001092DA0B1092DB0B82E090E081D02CE7E2 -:1099400033E0FC01318320839093630C8093620C9D -:109950006EE973E08CE59CE00E94490508E110E0A7 -:109960002AE130E04BE150E069E170E08FEC9DE0EE -:109970000E94DF280CE110E020E230E041E250E0FC -:109980006FE170E086E59DE00E94DF2807E110E0CE -:1099900023E230E044E250E062E270E08DED9CE0D2 -:1099A0000E94DF280DE110E02FE030E04EE150E0B2 -:1099B0006EE070E084E69CE00E94DF288091D80E83 -:1099C000A9EDBEE09FEF48EB5BE0803378F48C9329 -:1099D000282F30E0F901EE0FFF1F2E0F3F1FF90176 -:1099E000E85BF14F528341838F5F01C09C931396D4 -:1099F000FEE0A53EBF0749F78093D80E1F910F9157 -:109A00000895EF920F931F93CF93DF93E80147FDE3 -:109A100002C034E001C034E1E42F440FFF0BF7FF34 -:109A200003C0F195E195F109E32E022F2E2FAE012F -:109A3000B3D1CE01DF91CF911F910F91EF90089597 -:109A4000CF93DF938230910510F482E090E0E091B3 -:109A5000E90EF091EA0E20E030E0C0E0D0E030976F -:109A600011F14081518148175907C0F04817590733 -:109A700061F482819381209719F09B838A832BC0A4 -:109A80009093EA0E8093E90E26C02115310519F056 -:109A90004217530718F49A01BE01DF01EF0102805B -:109AA000F381E02DDCCF2115310509F1281B390B9D -:109AB0002430310590F412968D919C911397611585 -:109AC000710521F0FB019383828304C09093EA0E19 -:109AD0008093E90EFD01329644C0FD01E20FF31FB1 -:109AE00081939193225031092D933C933AC0209158 -:109AF000E70E3091E80E232B41F4209104023091BF -:109B000005023093E80E2093E70E20910202309177 -:109B100003022115310541F42DB73EB740910602ED -:109B200050910702241B350BE091E70EF091E80EEF -:109B3000E217F307A0F42E1B3F0B2817390778F024 -:109B4000AC014E5F5F4F2417350748F04E0F5F1F83 -:109B50005093E80E4093E70E8193919302C0E0E0AA -:109B6000F0E0CF01DF91CF9108950F931F93CF9332 -:109B7000DF93009709F48CC0FC01329713821282A4 -:109B80000091E90E1091EA0E0115110581F4208172 -:109B90003181820F931F2091E70E3091E80E281734 -:109BA000390779F5F093E80EE093E70E71C0D8011C -:109BB00040E050E0AE17BF0750F412962D913C9153 -:109BC0001397AD012115310509F1D901F3CF9D019D -:109BD000DA013383228360817181860F971F821798 -:109BE000930769F4EC0128813981260F371F2E5F16 -:109BF0003F4F318320838A819B8193838283452BCE -:109C000029F4F093EA0EE093E90E42C01396FC9318 -:109C1000EE931297ED01499159919E01240F351F42 -:109C2000E217F30771F480819181840F951F0296EA -:109C300011969C938E938281938113969C938E931D -:109C40001297E0E0F0E0D80112968D919C91139765 -:109C5000009719F0F8018C01F6CF8D919C91980135 -:109C60002E5F3F4F820F931F2091E70E3091E80E39 -:109C70002817390769F4309729F41092EA0E1092E8 -:109C8000E90E02C0138212821093E80E0093E70ED1 -:109C9000DF91CF911F910F9108956627772709C211 -:109CA00045EE5EE000C0FA01A191B081009719F481 -:109CB0001097E1F0CD01DC01CD010D90002011F4F1 -:109CC000C00113C0FB012191222319F02015D9F7FF -:109CD000F3CFFB012191201519F41E92119606C0B5 -:109CE0002223C1F70D900020A1F7D001FA01A19322 -:109CF000B0830895BB274A3031F4992322F4BDE2A2 -:109D0000909581959F4F30C0BB272A3051F49923FD -:109D100042F4BDE290958095709561957F4F8F4F8D -:109D20009F4F01C0BB27FA01A62F6217710581055D -:109D30009105330B30FB66F0AA27660F771F881F4B -:109D4000991FAA1FA21710F0A21B63953850A9F7FC -:109D5000A05DAA3308F0A95DA19336F7B111B193C4 -:109D60001082CA0104C4BB27FB015527AA27880F0C -:109D7000991FAA1FA41710F0A41B83955051B9F77F -:109D8000A05DAA3308F0A95DA193009779F7B111FE -:109D9000B1931192CB01EBC34F925F926F927F927E -:109DA0009F92AF92BF92CF92DF92EF92FF920F936A -:109DB0001F93CF93DF93CDB7DEB729970FB6F894F3 -:109DC000DEBF0FBECDBF6A01122FB02E2BE32017CE -:109DD00020F0FF24F394F00E02C0BCE3FB2E0F2D05 -:109DE00027E0AE014F5F5F4FCAD2AC018981982F47 -:109DF0009970913031F0E1FC06C0E0FE06C090E2BF -:109E000005C09DE203C09BE201C090E0EE2DE07131 -:109E100083FF3CC0911102C083E001C084E0811740 -:109E200018F4212F281B01C020E0E1110BC0F6011E -:109E3000822F30E2882319F031938150FBCFC20E7C -:109E4000D11C20E0992329F0D6019C93F60131968C -:109E50006F01C6010396E2FE0AC03EE4D6013C93C0 -:109E600041E411964C93119712963C9306C03EE63E -:109E7000F601308341E641833283FC01322F40E218 -:109E8000332309F442C041933150FACF82FF44C0DA -:109E9000911102C083E001C084E0811718F4212FE2 -:109EA000281B01C020E0E1110BC0F601822F30E237 -:109EB000882319F031938150FBCFC20ED11C20E0D2 -:109EC000992329F0D6019C93F60131966F01C601C2 -:109ED0000396E2FE0BC039E4D6013C933EE41196B2 -:109EE0003C93119736E412963C9307C039E6F6018D -:109EF00030833EE6318336E63283FC01322F40E286 -:109F0000332319F041933150FBCFFC01E20FF11DD7 -:109F100010828EEF9FEFB7C0F1E0911101C0F0E029 -:109F20006F2F70E01416150624F49A012F5F3F4F2F -:109F300002C021E030E0260F371FBB2029F06B2D37 -:109F400070E06F5F7F4F02C060E070E0260F371F48 -:109F5000612F70E0261737071CF4121B212F01C058 -:109F600020E03E2D387159F4D601322F60E23323C0 -:109F700019F06D933150FBCFC20ED11C20E0FF23AE -:109F800031F0D6019C93B6016F5F7F4F6B01E111F9 -:109F90000BC0F601922F30E3992319F031939150C1 -:109FA000FBCFC20ED11C20E09F2D940F3A81782F59 -:109FB0007071A72E84FF03C0313309F49150191634 -:109FC00024F4993018F098E001C091E0E42F852F37 -:109FD00057FF02C0E0E080E06E2F782FE0E0F0E075 -:109FE000AEE29A2E3A01691A71082A01461A570AF6 -:109FF0000B2D10E01195019511096F3F8FEF780738 -:10A0000029F4D6019C92C60101966C0146175707A8 -:10A0100084F0661677066CF47F01E40CF51CA1E071 -:10A02000B0E0AC0FBD1FEA0EFB1ED7011196BC902D -:10A0300002C090E3B92E615071093196C6010196B4 -:10A040007C016017710724F0D601BC926C01D5CF5A -:10A050006417750741F4363320F4353321F4A11029 -:10A0600002C081E3B82EF601B082F701822F90E2A0 -:10A07000882319F091938150FBCFF701E20FF11D76 -:10A08000108280E090E029960FB6F894DEBF0FBEF4 -:10A09000CDBFDF91CF911F910F91FF90EF90DF9097 -:10A0A000CF90BF90AF909F907F906F905F904F90B8 -:10A0B00008956F927F928F929F92AF92BF92CF92AC -:10A0C000DF92EF92FF920F931F93CF93DF93EC01F8 -:10A0D0007B016115710519F0DB018D939C938E0155 -:10A0E0000F5F1F4F7880872D90E021D2892B11F0D0 -:10A0F000E801F5CFBDE27B1205C00F5F1F4F7980ED -:10A10000C1E008C0EBE27E1204C08E010E5F1F4F5B -:10A110007980C0E06801F1E0CF1AD10843E050E057 -:10A1200064EF72E0C6010BD2892BE9F4680122E0EA -:10A13000C20ED11C45E050E06FEE72E0C601FFD1C7 -:10A14000892B21F4680187E0C80ED11CE114F104C9 -:10A1500019F0D701CD92DC92C111F9C060E070E036 -:10A1600080E89FE7FDC043E050E06CEE72E0C6017E -:10A17000E6D1892B51F4E114F10409F4EDC00E5F2E -:10A180001F4FF70111830083E7C0680160E070E0B2 -:10A19000CB0100E010E0F601D0EDD70DDA3050F53C -:10A1A0002C2F2260622E2C2F2870C2FF05C0211197 -:10A1B00027C00F5F1F4F24C0222311F00150110947 -:10A1C000A5E0B0E09B01AC0130D34B015C01880CF1 -:10A1D000991CAA1CBB1CC501B4016D0F711D811D0A -:10A1E000911D6839A9E97A078A07A9E19A0740F021 -:10A1F000C66005C0DE3F51F4C3FD44C0C8606C2E8C -:10A20000BFEFCB1ADB0A7080C62DC5CF2D2F2F7D57 -:10A210002531C1F540814D3211F4C06106C04B3289 -:10A2200021F0319621E030E006C03296D601119639 -:10A230004C9122E030E0A0EDA40FAA3018F0E21B10 -:10A24000F30B20C040E050E04038BCE05B075CF41A -:10A250009A01220F331F220F331F420F531F440F47 -:10A26000551F4A0F511D3196DF0111972C91A0ED1A -:10A27000A20FAA3048F3C4FF03C05195419551097C -:10A28000040F151FC1FF07C0E114F10421F031973D -:10A29000D701ED93FC937FD1C370C33019F06B01EC -:10A2A0007C0106C06B017C01F7FAF094F7F8F0949A -:10A2B00020E030E0A901C701B60169D1882309F483 -:10A2C00043C017FF06C0119501951109CBE0D3E0FB -:10A2D00002C0C3E2D3E05E01B8E1AB1AB1084601A7 -:10A2E000BE2DAF2D90E2E92EF12C0E151F057CF04E -:10A2F000FE012591359145915491B4018B2F9A2FF0 -:10A30000ABD14B01B82FA92F0E191F09EECF2497FF -:10A31000F594E794CA15DB0541F76401EB2EFA2E9C -:10A320008E2D880F8F2D881F8F3F41F020E030E069 -:10A33000A901C701B6012BD1811106C082E290E0CC -:10A340009093EC0E8093EB0EC701B60109C060E05C -:10A3500070E080E89FEF04C060E070E080EC9FE771 -:10A36000DF91CF911F910F91FF90EF90DF90CF90F1 -:10A37000BF90AF909F908F907F906F9008952830FE -:10A3800008F027E03327DA01990F311D87FD91602E -:10A3900000966105710539F432602E5F3D9330E31C -:10A3A0002A95E1F708959F3F30F0803871056105E7 -:10A3B00009F03C5F3C5F3D93913008F08068911D4F -:10A3C000DF93CF931F930F93FF92EF92192F987FF4 -:10A3D0009695E92F96959695E90FFF27EF57FC4F35 -:10A3E00099273327EE24FF24A701E701059008945D -:10A3F000079428F4360FE71EF81E491F511D660FFB -:10A40000771F881F991F0694A1F70590079428F4D9 -:10A41000E70EF81E491F561FC11D770F881F991F91 -:10A42000661F0694A1F70590079428F4F80E491FBB -:10A43000561FC71FD11D880F991F661F771F0694CF -:10A44000A1F70590079420F4490F561FC71FD81F86 -:10A45000990F661F771F881F0694A9F7849110959E -:10A46000177041F0D695C79557954795F794E7949F -:10A470001A95C1F7E7E2F3E06894159015913591CC -:10A480006591959105907FE27395E118F10A430B70 -:10A49000560BC90BD009C0F7E10CF11E431F561F24 -:10A4A000C91FD01D7EF4703311F48A95E6CFE8946D -:10A4B000015030F0080F0AF40027021708F4202F8B -:10A4C0002395022F7A3328F079E37D932A95E9F7D3 -:10A4D00010C07D932A9589F60694979567953795D0 -:10A4E00017951794E118F10A430B560BC90BD009C5 -:10A4F00098F023957E9173957A3308F070E37C93FE -:10A500002013B8F77E9170617D9330F0839571E3ED -:10A510007D9370E32A95E1F71124EF90FF900F915E -:10A520001F91CF91DF91992787FD90950895911103 -:10A53000F6C0803219F089508550D0F70895FB019C -:10A54000DC014150504088F08D9181341CF08B35F6 -:10A550000CF4805E659161341CF06B350CF4605E28 -:10A56000861B611171F3990B0895881BFCCFDC01E8 -:10A57000FC01672F71917723E1F7329704C07C913A -:10A580006D9370836291AE17BF07C8F3089540D0F2 -:10A5900008F481E00895E89409C097FB3EF4909593 -:10A5A0008095709561957F4F8F4F9F4F9923A9F0AC -:10A5B000F92F96E9BB279395F6958795779567953B -:10A5C000B795F111F8CFFAF4BB0F11F460FF1BC07F -:10A5D0006F5F7F4F8F4F9F4F16C0882311F096E912 -:10A5E00011C0772321F09EE8872F762F05C06623C0 -:10A5F00071F096E8862F70E060E02AF09A95660F79 -:10A60000771F881FDAF7880F9695879597F9089531 -:10A61000990F0008550FAA0BE0E8FEEF1616170673 -:10A62000E807F907C0F012161306E407F50798F0DB -:10A63000621B730B840B950B39F40A2661F0232BF4 -:10A64000242B252B21F408950A2609F4A140A69570 -:10A650008FEF811D811D08950BD07BC06CD028F039 -:10A6600071D018F0952309F05DC062C01124A5C017 -:10A6700081D0A0F3959FD1F3950F50E0551F629FB5 -:10A68000F001729FBB27F00DB11D639FAA27F00D4B -:10A69000B11DAA1F649F6627B00DA11D661F829F72 -:10A6A0002227B00DA11D621F739FB00DA11D621F57 -:10A6B000839FA00D611D221F749F3327A00D611D74 -:10A6C000231F849F600D211D822F762F6A2F112456 -:10A6D0009F5750408AF0E1F088234AF0EE0FFF1FA9 -:10A6E000BB1F661F771F881F91505040A9F79E3FE0 -:10A6F000510570F017C061C05F3FECF3983EDCF38A -:10A70000869577956795B795F795E7959F5FC1F71C -:10A71000FE2B880F911D9695879597F90895992797 -:10A720008827089597F99F6780E870E060E00895B2 -:10A730009FEF80EC089500240A9416161706180659 -:10A740000906089500240A94121613061406050635 -:10A750000895092E0394000C11F4882352F0BB0FC6 -:10A7600040F4BF2B11F460FF04C06F5F7F4F8F4F29 -:10A770009F4F089557FD9058440F551F59F05F3F64 -:10A7800071F04795880F97FB991F61F09F3F79F013 -:10A7900087950895121613061406551FF2CF469595 -:10A7A000F1DF08C0161617061806991FF1CF869517 -:10A7B0007105610508940895E894BB2766277727FB -:10A7C000CB0197F90895F999FECF92BD81BDF89A12 -:10A7D000992780B50895262FF999FECF1FBA92BD0B -:10A7E00081BD20BD0FB6F894FA9AF99A0FBE019672 -:10A7F0000895052E97FB16F400940FD057FD05D051 -:10A8000024D007FC02D046F408C0509540953095FE -:10A8100021953F4F4F4F5F4F0895909580957095CC -:10A8200061957F4F8F4F9F4F089531D0A59F900D19 -:10A83000B49F900DA49F800D911D11240895B7FF22 -:10A84000F4CFF3DF821B930B0895A1E21A2EAA1B0B -:10A85000BB1BFD010DC0AA1FBB1FEE1FFF1FA217D0 -:10A86000B307E407F50720F0A21BB30BE40BF50BCD -:10A87000661F771F881F991F1A9469F76095709556 -:10A88000809590959B01AC01BD01CF010895A29FD9 -:10A89000B001B39FC001A39F700D811D1124911DB4 -:10A8A000B29F700D811D1124911D08955058BB2732 -:10A8B000AA270ED04ECF3FDF30F044DF20F031F436 -:10A8C0009F3F11F41EF434CF0EF4E095E7FB2ACF3E -:10A8D000E92F50DF80F3BA176207730784079507E3 -:10A8E00018F071F49EF568CF0EF4E0950B2EBA2F98 -:10A8F000A02D0B01B90190010C01CA01A001112486 -:10A90000FF27591B99F0593F50F4503E68F11A1631 -:10A91000F040A22F232F342F4427585FF3CF4695C2 -:10A9200037952795A795F0405395C9F77EF41F16E4 -:10A93000BA0B620B730B840BBAF09150A1F0FF0FAE -:10A94000BB1F661F771F881FC2F70EC0BA0F621F9A -:10A95000731F841F48F4879577956795B795F7958A -:10A960009E3F08F0B3CF9395880F08F09927EE0F1C -:10A970009795879508950CD0ECCEE4DE40F0DBDEB1 -:10A9800030F021F45F3F19F0CDCE511116CFD0CE6B -:10A99000F1DE98F39923C9F35523B1F3951B550BB9 -:10A9A000BB27AA2762177307840738F09F5F5F4FA2 -:10A9B000220F331F441FAA1FA9F333D00E2E3AF0E3 -:10A9C000E0E830D091505040E695001CCAF729D0FD -:10A9D000FE2F27D0660F771F881FBB1F261737074C -:10A9E0004807AB07B0E809F0BB0B802DBF01FF277C -:10A9F00093585F4F2AF09E3F510568F093CEDDCE0D -:10AA00005F3FECF3983EDCF3869577956795B795B5 -:10AA1000F7959F5FC9F7880F911D9695879597F9D0 -:10AA20000895E1E0660F771F881FBB1F6217730749 -:10AA30008407BA0720F0621B730B840BBA0BEE1F5E -:10AA400088F7E095089504D06894B111B6CE0895C2 -:10AA500099DE88F09F5790F0B92F9927B751A0F051 -:10AA6000D1F0660F771F881F991F1AF0BA95C9F7A2 -:10AA700012C0B13081F0A0DEB1E008959DCE672F05 -:10AA8000782F8827B85F39F0B93FCCF38695779552 -:10AA90006795B395D9F73EF490958095709561953B -:10AAA0007F4F8F4F9F4F0895B3DD08F48FEF0895C8 -:10AAB000AFDD880B990B0895DB018F939F93B5DE73 -:10AAC000BF91AF91A29F800D911DA39F900DB29F4A -:10AAD000900D11240895991B79E004C0991F9617D1 -:10AAE00008F0961B881F7A95C9F780950895EE0F98 -:10AAF000FF1F881F8BBF0790F691E02D19946F926E -:10AB00007F928F929F92AF92BF92CF92DF92EF92FD -:10AB1000FF920F931F93CF93DF93EC01009789F47B -:10AB2000CB01DF91CF911F910F91FF90EF90DF90BC -:10AB3000CF90BF90AF909F908F907F906F900C942C -:10AB4000204DFC01E60FF71F9C0122503109E2174E -:10AB5000F30708F4ABC0D9010D911C9111970617AA -:10AB60001707B0F00530110508F49EC0C80104971E -:10AB70008617970708F498C002501109061B170B97 -:10AB8000019311936D937C93CF010E94B54D8CC0BE -:10AB90005B01A01AB10A4C01800E911EA091E90E32 -:10ABA000B091EA0E40E050E0E12CF12C109709F44E -:10ABB0004AC0A815B905D1F56D907C901197630135 -:10ABC00082E0C80ED11CCA14DB0480F1A3014A192B -:10ABD0005B096A0182E0C80ED11C1296BC901297E4 -:10ABE0001396AC91B5E0CB16D10440F0B282A383AA -:10ABF00051834083D9016D937C930AC00E5F1F4F30 -:10AC0000C301800F911FF90191838083EB2DFA2FEF -:10AC1000E114F10431F0D7011396FC93EE931297EF -:10AC200043C0F093EA0EE093E90E3EC08D919C91F3 -:10AC300011974817590708F4AC017D0112960D9041 -:10AC4000BC91A02DB3CF8091E70E9091E80E8815AE -:10AC50009905E1F446175707C8F4809102029091D4 -:10AC60000302009741F48DB79EB7409106025091C0 -:10AC70000702841B950BE817F907C0F4F093E80E60 -:10AC8000E093E70EF901718360830EC0CB010E944F -:10AC9000204D7C01009751F0A801BE011CD0CE01CF -:10ACA0000E94B54DC70104C0CE0102C080E090E013 -:10ACB000DF91CF911F910F91FF90EF90DF90CF9098 -:10ACC000BF90AF909F908F907F906F90089581E09C -:10ACD00090E0F89419C0FB01DC0102C001900D92D4 -:10ACE00041505040D8F70895FB01DC018D9101904F -:10ACF00080190110D9F3990B0895FB01DC01019033 -:10AD00000D920020E1F7089512E0C2EAD2E000E0DF -:10AD100005C0802FFE01EBDE2196011DC33AD1074D -:0AAD200080E00807B1F7F894FFCFB8 -:10AD2A00FFFF0000ED0E8000200A0D000000000069 -:10AD3A0000C5222820342000000000C42226201644 -:10AD4A00220000000075252B231127000000007443 -:10AD5A00252923372500000000732527230625000F -:10AD6A0000000072252523D5240000000071252348 -:10AD7A00239C240000000070252123632400000086 -:10AD8A00006F251F232A24000000006E251D23EFD3 -:10AD9A0026000000006D251B23BE23000000006C66 -:10ADAA00251923CB23000000006B2517232D230030 -:10ADBA000000006A2515239F23000000006925135F -:10ADCA0023882300000000682511234A230000007D -:10ADDA0000CA223220CB2200000000C9223020E41F -:10ADEA002000000000C8222E20DF2000000000C73B -:10ADFA00222C20152000000000C32224206D1F00F1 -:10AE0A00000000C6222A208A2052303300523032F3 -:10AE1A00005230370052303100523039005238383F -:10AE2A000052383700523838005230300052383722 -:10AE3A00005230380052313300523132005231312F -:10AE4A00005237330052373200523731005231370D -:10AE5A000052313600523135000100000001000075 -:10AE6A0000010000005238350052383400523035A3 -:10AE7A000052303600362E342E322E450000523023 -:10AE8A00340052383700000000006B03D502040377 -:10AE9A00B10335031303270300000000C222222056 -:10AEAA005239392041524455494E4F205354415248 -:10AEBA0054555020434F4D504C4554450D0A002AD5 -:10AECA0000473000473030004731004730310047F3 -:10AEDA0032380046303900463900463131004631B1 -:10AEEA0032004631330046313400463135004631AE -:10AEFA00360046323000463231004632320046339E -:10AF0A00310046333200463431004634320046348A -:10AF1A00330046343400463631004638310046386C -:10AF2A0032004638330046383400200A0D005239C0 -:10AF3A00392068616E646C6572203D3D204E554C27 -:10AF4A004C0D0A00523939002072657365747469B0 -:10AF5A006E67206469676974616C2070696E00208D -:10AF6A00726573657474696E6720616E616C6F6770 -:10AF7A002070696E0052393920484F4D45205A20B9 -:10AF8A004F4E20535441525455500D0A00523939EC -:10AF9A0020484F4D452059204F4E2053544152547A -:10AFAA0055500D0A0052393920484F4D4520582036 -:10AFBA004F4E20535441525455500D0A00206D698A -:10AFCA007320737470203D200052393920656D65F5 -:10AFDA007267656E63792073746F700D0A00523957 -:10AFEA0039206572726F720D0A0052383200523976 -:10AFFA00392073746F707065640D0A0052393920F4 -:10B00A006572726F7220002064656163746976618B -:10B01A007465206D6F746F72205820647565207492 -:10B02A006F206D6973736564207374657073002093 -:10B03A0064656163746976617465206D6F746F729B -:10B04A0020592064756520746F206D697373656477 -:10B05A002073746570730020646561637469766136 -:10B06A007465206D6F746F72205A20647565207440 -:10B07A006F206D6973736564207374657073005211 -:10B08A0039392074696D656F757420582061786943 -:10B09A00730D0A005239392074696D656F75742011 -:10B0AA005920617869730D0A005239392074696D23 -:10B0BA00656F7574205A20617869730D0A005234DD -:10B0CA003100500056005238332000523939205787 -:10B0DA00696C6C207A65726F205800523939205792 -:10B0EA00696C6C207A65726F205900523939205781 -:10B0FA00696C6C207A65726F205A00686F6D650DF5 -:10B10A000A0052323100523939204572726F723A4E -:10B11A0020696E76616C696420706172616D657414 -:10B12A0065722069640D0A002051005238310020EE -:10B13A00584100205842002059410020594200201D -:10B14A005A4100205A420052323000207374612062 -:10B15A000020637572200020656E642000206861FB -:10B16A006C662000206C656E2000206D696E2000E0 -:10B17A00206D6178200020737064200052393920D4 -:10B18A0043616C6962726174696F6E206572726F75 -:10B19A00723A20696E76616C6964206178697320FD -:10B1AA0073656C65637465640D0A00206178697360 -:10B1BA002000206174207374617274696E67207054 -:10B1CA006F696E7400523233002063616C69627277 -:10B1DA006174696E67206C656E67746800207374A9 -:10B1EA00657020636F756E743A2000523939206D8C -:10B1FA006F76656D656E7420646F6E650D0A00204A -:10B20A00617420656E6420706F696E7400523939FA -:10B21A002043616C6962726174696F6E2065727233 -:10B22A006F723A20656E642073746F702061637464 -:10B23A00697665206265666F7265207374617274DF -:10B24A000D0A00206D6F766520746F207374617229 -:10B25A007420666F722063616C6962726174696FCF -:0EB26A006E006E616E00696E66006F766600A3 +:100000009EC10000CDC10000CBC10000C9C10000ED +:10001000C7C10000C5C10000C3C10000C1C10000CC +:10002000BFC10000BDC10000BBC10000B9C10000DC +:10003000B7C10000B5C10000B3C100000C94123F6D +:10004000AFC100000C94E43EABC10000A9C10000A8 +:100050000C94553FA5C10000A3C100000C94103EB4 +:100060009FC100000C94DA3D0C94B03D99C1000092 +:1000700097C1000095C1000093C1000091C100002C +:100080000C94B63E8DC100008BC1000089C10000F8 +:1000900087C1000085C1000083C1000081C100004C +:1000A0007FC100007DC100000C94883E79C1000032 +:1000B00077C1000075C1000073C100000C945A3E66 +:1000C0006FC100006DC100006BC1000069C100007C +:1000D00067C1000065C1000063C1000061C100008C +:1000E0005FC100004E414E494E495459494E46CDDC +:1000F000CCCC3D0AD7233C17B7D13877CC2B3295DF +:1001000095E6241FB14F0A000020410000C84200BC +:10011000401C4620BCBE4CCA1B0E5AAEC59D740086 +:10012000407A10F35A00A0724E18090010A5D4E8C6 +:100130000000E87648170000E40B54020000CA9A59 +:100140003B000000E1F505000080969800000040AB +:10015000420F000000A086010000001027000000F0 +:1001600000E803000000006400000000000A000036 +:100170000000000100000000002C76D888DC674FEA +:100180000823DFC1DFAE59E1B1B796E5E3E453C61A +:100190003AE651997696E8E6C28426EB898C9B6212 +:1001A000ED407C6FFCEFBC9C9F40F2BAA56FA5F4BC +:1001B00090055A2AF75C936B6CF9676DC11BFCE0E4 +:1001C000E40D47FEF520E6B500D0ED902E03009437 +:1001D0003577050080841E080000204E0A000000CC +:1001E000C80C333333330F986E12831141EF8D21D6 +:1001F00014893BE65516CFFEE6DB18D1844B381B3D +:10020000F77C1D901DA4BBE424203284725E228101 +:1002100000C9F124ECA1E53D2700002100240027BE +:10022000002A002D00300033000101000004010706 +:10023000010A0100002200250028002B002E0031B9 +:1002400000340002010000050108010B010000203C +:10025000002300260029002C002F0032000001009E +:100260000003010601090105050505070508080841 +:1002700008020202020A0A08080404040401010137 +:10028000010101010103030303030303030407073F +:10029000070C0C0C0C0C0C0C0C02020202060606DD +:1002A00006060606060B0B0B0B0B0B0B0B010210C5 +:1002B0002020080810204010204080020102010880 +:1002C0000402010102040810204080804020100830 +:1002D0000402018004020180402010080402010889 +:1002E00004020101020408102040800102040810E9 +:1002F00020408000000A0B02090C0D0E08070304C1 +:1003000001000000000000000000000000000000EC +:1003100000000000000000000000000000000012CB +:1003200011100000000000000000000000000000AC +:10033000000000000000000000004C40ED4A1124C5 +:100340001FBECFEFD1E2DEBFCDBF00E00CBF17E094 +:10035000A0E0B2E0E2E9F8EA00E00BBF02C00790DB +:100360000D92A631B107D9F72EE0A6E1B7E001C0A2 +:100370001D92AB3AB207E1F711E0CEE9D1E000E01F +:1003800006C021970109802FFE010E943853CD3904 +:10039000D10780E00807A9F70E94F1400C94385477 +:1003A0002FCE0CB405FC0DC01EBC00000DB407FE22 +:1003B000FDCF9EB51EBC00000DB407FEFDCF8EB56F +:1003C00008951EBC00000DB407FEFDCF8EB51EBC07 +:1003D00000000DB407FEFDCF9EB5089527E030E084 +:1003E00060E0A82FB0E0722FE0916D0BF0916E0BE2 +:1003F00090916A0BAD01022E02C0559547950A9463 +:10040000E2F7808140FF2BC0982B9083E091710B25 +:10041000F091720B808190916C0B892B8083E0911D +:100420006F0BF091700B808190916B0B892341E0F1 +:1004300050E009F440E001C0440F7A95EAF7642BDC +:10044000E091710BF091720B808190916C0B909503 +:10045000982390832150310930F6862F0895909586 +:100460009823D3CFCF9380E0B9DFC82F80E0B6DFE9 +:100470009C2FCF9108959C01803E910508F006C500 +:10048000FC018827E95BFD4F8F4F0C9438532703FD +:1004900034033D03460353035C0346074607460700 +:1004A00046074607690376038303460790039903CB +:1004B000A203AF03B803C103CA03D303DC03460797 +:1004C000E503EE03F7034607460746070004090461 +:1004D0001204460746071B0428044607460746073A +:1004E000350442044F0446075C0465046E04460765 +:1004F0004607460777048004890446079604A30448 +:10050000B004460746074607BD04CA04D704460799 +:10051000E404F104FE044607460746070B051805E8 +:100520002505460732053B054405460746074607AD +:1005300068057505820546078F059C05A9054607D0 +:100540004607460746074607460746074607460743 +:100550004607460746074607B605BF05C8054607CE +:10056000D105DA05E305460746074607EC05F90518 +:1005700006064607130620062D06460746074607C9 +:100580003A0647065406460761066A06730646079A +:10059000460746077C0685068E0646074607460739 +:1005A00046074607460746074607460746074607E3 +:1005B0004D0556055F0546074607460746074607A9 +:1005C00046074607460746074607460746074607C3 +:1005D00046074607460746074607460746074607B3 +:1005E00046074607460746074607460746074607A3 +:1005F0004607460746074607460746074607460793 +:100600004607460746074607460746074607460782 +:100610004607460746074607460746074607460772 +:100620009706A006AD064607BA06C306D0064607DB +:1006300046074607DD06E606F306460700070907F4 +:10064000160746074607460723072C07390781E0A8 +:1006500090E0A0E0B0E08093E0079093E107A093E2 +:10066000E207B093E30708951092E4071092E507BC +:100670001092E6071092E70708951092E80710928B +:10068000E9071092EA071092EB07089581E090E0E5 +:10069000A0E0B0E08093EC079093ED07A093EE0705 +:1006A000B093EF0708951092F0071092F10710929F +:1006B000F2071092F307089583E090E0A0E0B0E025 +:1006C0008093F4079093F507A093F607B093F7078C +:1006D000089588E790E0A0E0B0E080930C08909344 +:1006E0000D08A0930E08B0930F08089588E790E0D6 +:1006F000A0E0B0E08093100890931108A093120836 +:10070000B0931308089588E790E0A0E0B0E08093EC +:10071000140890931508A0931608B093170808952D +:1007200010921C0810921D0810921E0810921F08AB +:100730000895109220081092210810922208109219 +:100740002308089581E090E0A0E0B0E080932408C1 +:1007500090932508A0932608B09327080895109237 +:1007600028081092290810922A0810922B08089540 +:1007700010922C0810922D0810922E0810922F081B +:100780000895109230081092310810923208109299 +:1007900033080895109234081092350810923608E4 +:1007A0001092370808951092380810923908109264 +:1007B0003A0810923B08089510923C0810923D08A8 +:1007C00010923E0810923F0808951092440810922B +:1007D000450810924608109247080895109248085C +:1007E0001092490810924A0810924B0808951092EE +:1007F0004C0810924D0810924E0810924F08089520 +:1008000010925C0810925D0810925E0810925F08CA +:100810000895109260081092610810926208109278 +:100820006308089510926408109265081092660893 +:1008300010926708089581E090E0A0E0B0E0809316 +:10084000700890937108A0937208B093730808958C +:1008500081E090E0A0E0B0E0809374089093750888 +:10086000A0937608B093770808958CE291E0A0E019 +:10087000B0E08093840890938508A0938608B09395 +:10088000870808958CE291E0A0E0B0E080938808AA +:1008900090938908A0938A08B0938B0808958CE2FE +:1008A00091E0A0E0B0E080938C0890938D08A09335 +:1008B0008E08B0938F0808951092940810929508AE +:1008C0001092960810929708089510929808109226 +:1008D000990810929A0810929B08089510929C080B +:1008E00010929D0810929E0810929F0808951092F1 +:1008F000AC081092AD081092AE081092AF0808959F +:100900001092B0081092B1081092B2081092B30879 +:10091000089581E090E0A0E0B0E08093B408909367 +:10092000B508A093B608B093B708089585E090E0A5 +:10093000A0E0B0E08093BC089093BD08A093BE08EF +:10094000B093BF08089585E090E0A0E0B0E0809308 +:10095000C0089093C108A093C208B093C30808953B +:1009600089E190E0A0E0B0E08093C4089093C508CE +:10097000A093C608B093C708089582E390E0A0E072 +:10098000B0E08093D4089093D508A093D608B09394 +:10099000D708089582E390E0A0E0B0E08093D80803 +:1009A0009093D908A093DA08B093DB08089582E306 +:1009B00090E0A0E0B0E08093DC089093DD08A09385 +:1009C000DE08B093DF08089582E390E0A0E0B0E095 +:1009D0008093E4089093E508A093E608B093E708B5 +:1009E000089582E390E0A0E0B0E08093E80890935F +:1009F000E908A093EA08B093EB08089582E390E039 +:100A0000A0E0B0E08093EC089093ED08A093EE088E +:100A1000B093EF08089580E991E0A0E0B0E0809302 +:100A2000FC089093FD08A093FE08B093FF0808957A +:100A300080E991E0A0E0B0E0809300099093010983 +:100A4000A0930209B0930309089580E991E0A0E022 +:100A5000B0E08093040990930509A0930609B09330 +:100A60000709089510920C0910920D0910920E09B1 +:100A700010920F0908951092100910921109109206 +:100A80001209109213090895109214091092150971 +:100A9000109216091092170908951092240A1092C4 +:100AA000250A1092260A1092270A08951092280A01 +:100AB0001092290A10922A0A10922B0A0895109275 +:100AC0002C0A10922D0A10922E0A10922F0A0895C5 +:100AD00088E592E0A0E0B0E0809324099093250996 +:100AE000A0932609B0932709089588E592E0A0E035 +:100AF000B0E08093280990932909A0932A09B09324 +:100B00002B09089588E592E0A0E0B0E080932C09DD +:100B100090932D09A0932E09B0932F0908958EE18B +:100B200090E0A0E0B0E08093340990933509A09361 +:100B30003609B093370908958EE190E0A0E0B0E067 +:100B40008093380990933909A0933A09B0933B09EF +:100B500008958EE190E0A0E0B0E080933C0990938E +:100B60003D09A0933E09B0933F090895109274097E +:100B700010927509109276091092770908951092D3 +:100B800078091092790910927A0910927B090895D8 +:100B900010927C0910927D0910927E0910927F09B3 +:100BA0000895109284091092850910928609109276 +:100BB00087090895109288091092890910928A096C +:100BC00010928B09089510928C0910928D09109241 +:100BD0008E0910928F09089585E090E0A0E0B0E0C2 +:100BE00080939C0990939D09A0939E09B0939F09BF +:100BF000089585E090E0A0E0B0E08093A009909394 +:100C0000A109A093A209B093A309089585E090E0FB +:100C1000A0E0B0E08093A4099093A509A093A60951 +:100C2000B093A709089584EB95E1A0E0B0E080932C +:100C3000AC099093AD09A093AE09B093AF090895A4 +:100C400084EB95E1A0E0B0E08093B0099093B10906 +:100C5000A093B209B093B309089584EB95E1A0E0A5 +:100C6000B0E08093B4099093B509A093B609B0930E +:100C7000B709089585E090E0A0E0B0E08093C40952 +:100C80009093C509A093C609B093C709089585E05C +:100C900090E0A0E0B0E08093C8099093C909A093C8 +:100CA000CA09B093CB09089585E090E0A0E0B0E0D8 +:100CB0008093CC099093CD09A093CE09B093CF092E +:100CC00008951092D4091092D5091092D609109265 +:100CD000D70908951092D8091092D9091092DA090B +:100CE0001092DB0908951092DC091092DD09109230 +:100CF000DE091092DF0908951092EC091092ED09B7 +:100D00001092EE091092EF0908951092F0091092D6 +:100D1000F1091092F2091092F30908951092F40962 +:100D20001092F5091092F6091092F70908951092A1 +:100D3000040B1092050B1092060B1092070B0895EE +:100D40008CE390E0A0E0B0E08093080B9093090B57 +:100D5000A0930A0BB0930B0B089581E090E0A0E004 +:100D6000B0E080930C0B90930D0BA0930E0BB093FF +:100D70000F0B08951092140B1092150B1092160B76 +:100D80001092170B08958CE390E0A0E0B0E0809300 +:100D9000180B9093190BA0931A0BB0931B0B08958B +:100DA00081E090E0A0E0B0E080931C0B90931D0BDD +:100DB000A0931E0BB0931F0B089510922C0B109252 +:100DC0002D0B10922E0B10922F0B08958CE390E0B8 +:100DD000A0E0B0E08093300B9093310BA093320BE6 +:100DE000B093330B089581E090E0A0E0B0E08093F1 +:100DF000340B9093350BA093360BB093370B0895BB +:100E000010923C0B10923D0B10923E0B10923F0B38 +:100E100008958CE390E0A0E0B0E08093400B9093C5 +:100E2000410BA093420BB093430B089581E090E0F7 +:100E3000A0E0B0E08093440B9093450BA093460B49 +:100E4000B093470B08951092540B1092550B1092CB +:100E5000560B1092570B08958CE390E0A0E0B0E0A1 +:100E60008093580B9093590BA0935A0BB0935B0B44 +:100E7000089581E090E0A0E0B0E080935C0B909357 +:100E80005D0BA0935E0BB0935F0B0895220F331F91 +:100E9000220F331FF901E052F84F108211821282A3 +:100EA00013820895843591050CF046C08135910573 +:100EB000A4F48C32910524F58932910574F48831BB +:100EC00091058CF48F30910544F4863091053CF403 +:100ED0008230910514F4892B89F481E008950B97F1 +:100EE000039760F4FACF823291052CF48F3191058B +:100EF000A4F74997F5CF8497029778F380E0089597 +:100F0000803491056CF48D3391053CF7863391055F +:100F10002CF4833391050CF78D97E2CFC797E0CF80 +:100F20008A34910534F487349105BCF681549109D3 +:100F3000D7CF8B549109D4CF863891051CF58338CF +:100F400091055CF68237910584F48F3691052CF675 +:100F5000883691053CF4853691050CF0BECF855559 +:100F60009109BECF89569109BBCF8C3791053CF4CE +:100F7000893791050CF0B1CF83579109B1CF8D57C7 +:100F80009109AECF803D91058CF48D3C91050CF01C +:100F9000A4CF843991053CF4813991050CF09DCFA3 +:100FA0008D5891099DCF895C91099ACF8A3D910511 +:100FB0003CF4873D91050CF090CF835D910990CF73 +:100FC0008D5D91098DCFAF92BF92CF92DF92EF925C +:100FD000FF920F931F93CF93DF936C017B018B01E3 +:100FE000040F151FEB015E01AE18BF08C017D10733 +:100FF00059F06991D601ED91FC910190F081E02DBD +:10100000C6011995892B79F7C501DF91CF911F9101 +:101010000F91FF90EF90DF90CF90BF90AF90089529 +:10102000FC01538D448D252F30E0842F90E0821BEE +:10103000930B541710F0CF96089501970895FC0173 +:10104000918D828D981761F0A28DAE0FBF2FB11DCB +:101050005D968C91928D9F5F9F73928F90E0089523 +:101060008FEF9FEF0895FC01918D828D981731F0DD +:10107000828DE80FF11D858D90E008958FEF9FEF31 +:101080000895FC01918D228D892F90E0805C9F4F07 +:10109000821B91098F73992708958DE79BE0F1DFFB +:1010A00021E0892B09F420E0822F0895FC01A48D12 +:1010B000A80FB92FB11DA35ABF4F2C91848D90E07A +:1010C00001968F739927848FA689B7892C93A0895D +:1010D000B1898C91837080648C93938D848D9813E7 +:1010E00006C00288F389E02D80818F7D808308957A +:1010F000EF92FF920F931F93CF93DF93EC0181E068 +:10110000888F9B8D8C8D98131AC0E889F98980810E +:1011100085FF15C09FB7F894EE89FF896083E88941 +:10112000F98980818370806480839FBF81E090E033 +:10113000DF91CF911F910F91FF90EF900895F62EC0 +:101140000B8D10E00F5F1F4F0F731127E02E8C8D5A +:101150008E110BC00FB607FCFACFE889F9898081A0 +:1011600085FFF5CFCE01A2DFF2CFEB8DEC0FFD2F87 +:10117000F11DE35AFF4FF0829FB7F8940B8FEA8975 +:10118000FB8980818062D0CF682F8DE79BE0B0CF54 +:10119000CF93DF93EC01888D8823B1F0AA89BB89B6 +:1011A000E889F9898C9185FD03C0808186FD0CC09A +:1011B0000FB607FCF7CF8C9185FFF2CF808185FFBA +:1011C000EDCFCE0173DFEACFDF91CF91089580E0BC +:1011D00090E0892B21F061DF81110E94000080E006 +:1011E00090E0892B49F080E090E0892B29F00E9463 +:1011F000000081110E94000080E090E0892B49F0FE +:1012000080E090E0892B29F00E94000081110E946B +:10121000000080E090E0892B49F080E090E0892B8D +:1012200029F00E94000081110C9400000895815063 +:10123000823108F05AC0E82FF0E08827ED5DF64FC4 +:101240008F4F0C9438534309470935093B093F092F +:1012500075094A09500954095A095E096209680961 +:101260006C097509700976097A09809180008F7779 +:10127000809380000895809180008F7DF9CF8091C8 +:101280008000877FF5CF84B58F7784BD089584B5BE +:101290008F7DFBCF8091B0008F778093B000089551 +:1012A0008091B0008F7DF9CF809190008F778093EF +:1012B00090000895809190008F7DF9CF80919000EB +:1012C000877FF5CF8091A0008F778093A00008954D +:1012D0008091A0008F7DF9CF8091A000877FF5CF0E +:1012E000809120018F7780932001089580912001C3 +:1012F0008F7DF9CF80912001877FF5CFCF93DF934A +:10130000282F30E0F901ED50FD4F8491F901E355AC +:10131000FD4FD491F901E959FD4FC491CC2399F0C7 +:10132000811185DFEC2FF0E0EE0FFF1FE35BFD4F37 +:10133000A591B491EC91ED2381E090E009F480E077 +:10134000DF91CF91089580E090E0FACF1F93CF9383 +:10135000DF93282F30E0F901ED50FD4F8491F90122 +:10136000E355FD4FD491F901E959FD4FC491CC23C8 +:10137000A1F0162F81115BDFEC2FF0E0EE0FFF1FC5 +:10138000ED5CFD4FA591B4918FB7F894EC911111DC +:1013900008C0D095DE23DC938FBFDF91CF911F91E2 +:1013A0000895DE2BF8CFCF93DF9390E0FC01E35557 +:1013B000FD4F249189599D4FFC0184918823C9F0E8 +:1013C00090E0880F991FFC01E75EFD4FA591B49155 +:1013D000FC01ED5CFD4FC591D49161110DC09FB72B +:1013E000F8948C91209582238C93888128232883DC +:1013F0009FBFDF91CF910895623051F49FB7F89469 +:101400003C91822F809583238C93E8812E2BEFCF04 +:101410008FB7F894EC912E2B2C938FBFEACF8230AC +:10142000910538F0880F991F880F991F059701972C +:10143000F1F708953FB7F89480912D0790912E070A +:10144000A0912F07B091300726B5A89B05C02F3F6C +:1014500019F00196A11DB11D3FBFBA2FA92F982FDA +:101460008827BC01CD01620F711D811D911D42E0D5 +:10147000660F771F881F991F4A95D1F708958F929D +:101480009F92AF92BF92CF92DF92EF92FF926B0149 +:101490007C01D0DF4B015C01C114D104E104F104F3 +:1014A000B1F0C8DF681979098A099B09683E734061 +:1014B0008105910588F321E0C21AD108E108F108FD +:1014C00088EE880E83E0981EA11CB11CE5CFFF902A +:1014D000EF90DF90CF90BF90AF909F908F90089546 +:1014E0002FB7F8946091290770912A0780912B07F4 +:1014F00090912C072FBF0895CF92DF92EF92FF9229 +:10150000CF93DF93EC01603282E07807CCF5653B46 +:10151000710514F064EB70E0898128E830E0281B45 +:10152000310987FD3395220F331F220F331F6901C5 +:10153000330FEE08FF088A8128E532E0281B3109C5 +:1015400087FD3395220F331F220F331F032E000C0C +:10155000440B550B2C193D094E095F09DB0177FF40 +:1015600002C0B0E0A0E00E94E05124EB30E040E097 +:1015700050E00E94BA51C20ED31EE41EF51EB60101 +:10158000E881E03370F5298188E890E0821B9109B9 +:1015900027FD9395880F991F880F991F6817790762 +:1015A0007CF02A8188E592E0821B910927FD9395C2 +:1015B000880F991F880F991F681779070CF4CB01C2 +:1015C0000297880F991F4FB7F8942E2F30E0F9013A +:1015D000EE0FFF1FE20FF31FEA5FF14F928381834B +:1015E0004FBFDF91CF91FF90EF90DF90CF900895A4 +:1015F0001F93CF93DF93EC01162F8881803308F07F +:101600004DC061E0812FCFDE8881282F30E0F901C5 +:10161000EE0FFF1FE20FF31FEA5FF14F1F736081B0 +:10162000607C612B608319821A822CE0622F0E94F9 +:101630002C53829FB001112430E020E0AB01420F17 +:10164000531FFA01EE0FFF1FE40FF51FEA5FF14F82 +:10165000908196FD16C02F5F3F4F2C30310571F7FA +:10166000813009F51092800082E080938100109211 +:10167000850010928400B19A80916F0082608093FF +:101680006F00E8818E2F90E0FC01EE0FFF1FE80F46 +:10169000F91FEA5FF14F8081806480838881DF9148 +:1016A000CF911F910895823061F410929000809341 +:1016B0009100109295001092940088BB8093710065 +:1016C000E0CF833069F41092A00082E08093A10003 +:1016D0001092A5001092A40089BB80937200D1CF14 +:1016E0008111CFCF1092200182E0809321011092CE +:1016F0002501109224018ABB80937300C2CFAF9260 +:10170000BF92CF92DF92EF92FF920F931F93CF93EE +:10171000DF936B017A01EC01CC5DD84F28813CE06E +:10172000389F8001399F100D1124A090960EB12C86 +:1017300027FF1FC0FB011182108288818F5F888381 +:1017400088819801280F311D87FD3A95F6012A15E9 +:101750003B051CF488818C30BCF18081918104961A +:1017600080349C4908F471C0F6018081918104960F +:101770006EC088819801280F311D87FD3A952A1582 +:101780003B05DCF68881A801480F511D87FD5A955D +:10179000FA01EE0FFF1FE40FF51FEA5FF14F8081A2 +:1017A00086FFCBCF8881F801E80FF11D87FDFA9500 +:1017B000CF01EE0FFF1FE80FF91FEA5FF14F8081A5 +:1017C00060E08F73C3DDB9CF808191812881A8014A +:1017D000420F511D27FD5A959A01FA01EE0FFF1F86 +:1017E000E20FF31FEA5FF14F21813281820F931FD5 +:1017F000F7019183808388819801280F311D87FD2F +:101800003A95F901EE0FFF1FE20FF31FEA5FF14F68 +:10181000808186FF21C08881080F111D87FD1A95E0 +:10182000F801EE0FFF1FE00FF11FEA5FF14F80811B +:1018300061E08F73DF91CF911F910F91FF90EF9037 +:10184000DF90CF90BF90AF9081CD80E49CE9F7010D +:10185000918380838FEF8883DF91CF911F910F91C8 +:10186000FF90EF90DF90CF90BF90AF9008958EBD26 +:1018700000000DB407FEFDCF8EB50895CF92DF9224 +:10188000EF92FF920F931F93CF93DF938C01D62E8D +:10189000EA01E62EF12CEE0CEF2CEE1CFF08FC0109 +:1018A000E858FF4F8081882309F46DC060E0F8019B +:1018B00082854CDD8D2D0E94EE01F8018483EF2896 +:1018C000C1F08B810E94EE018A810E94EE01898124 +:1018D0000E94EE0188810E94EE0161E0F80182859C +:1018E000DF91CF911F910F91FF90EF90DF90CF90FC +:1018F0002DCD0E9432020E94320261E0F801828501 +:1019000025DD60E0F801828521DD8D2D0E94EE014C +:1019100080E00E94EE0190E0B0E0A0E0BA2FA92F95 +:10192000982F882788839983AA83BB8380E00E94AD +:10193000EE01488159816A817B81482B762F652F82 +:10194000542F4427488359836A837B8380E00E9415 +:10195000EE01488159816A817B81482B762F652F62 +:10196000542F4427488359836A837B8380E00E94F5 +:10197000EE01488159816A817B81482B48835983D4 +:101980006A837B83AACFCFB6F89480912307811115 +:1019900023C0ECE9F2E08491E2EEF2E09491E82FCA +:1019A000F0E0EE0FFF1FE75EFD4FA591B491EC91C3 +:1019B000E92319F461E085E3C9DC61E085E3F3DC48 +:1019C0008CB580618CBD8CB580648CBD61E084E396 +:1019D000EADC61E083E3E7DC809123078F5F80939B +:1019E0002307CFBE8DE58CBD81E08DBD60E0F801A1 +:1019F0008285ACDC8D2D3BDFF8018483EF2849F034 +:101A00008B8135DF8A8133DF898131DF88812FDF68 +:101A100064CF0E94D1010E94D10161E0F80182856A +:101A200095DC60E0F801828591DC8D2D20DF80E07F +:101A30001EDF90E0B0E0A0E0BA2FA92F982F8827F2 +:101A400088839983AA83BB8380E011DF4881598111 +:101A50006A817B81482B762F652F542F442748833A +:101A600059836A837B8380E002DF488159816A81E0 +:101A70007B81482B762F652F542F44274883598329 +:101A80006A837B8380E0F3DE74CF8F929F92AF9264 +:101A9000BF92CF92DF92EF92FF920F931F93CF935B +:101AA000DF935C018B017A016901FC0180819181E6 +:101AB000EC01CE59DF4F188219821A821B82AE01C7 +:101AC0006FE6DCDE88819981AA81BB81E501CC5B70 +:101AD000DF4FB0FF26C020E030E040E85FE3F801D0 +:101AE00060817181828193810E941852F801608324 +:101AF000718382839383F70180819181A281B38175 +:101B000088839983AA83BB83DF91CF911F910F9123 +:101B1000FF90EF90DF90CF90BF90AF909F908F900D +:101B20000895F80180809180A280B38020E030E0A9 +:101B3000A901C501B4010E941553181674F4F601E9 +:101B40002081318142815381C501B4010E94175225 +:101B5000F801608371838283938388819981AA814C +:101B6000BB81F70180839183A283B383CDCF8F9212 +:101B70009F92AF92BF92DF92EF92FF920F931F93CB +:101B8000CF93DF93EC017B018EEA97E4A1EEBDE3F6 +:101B900088839983AA83BB8390E080E00E948C5065 +:101BA00025ED34E045E352E40E94ED5020E030E0C2 +:101BB0004AE754E40E947C524B015C0128EB3EE171 +:101BC00045E05EE30E94ED5026E636E646EA5EE337 +:101BD0000E947C5220E030E040E85FE30E94175210 +:101BE0000E94E952D62E8E010E5A1F4F8FE08D159E +:101BF00008F478C0F80180819181A281B381A2604C +:101C000080839183A283B383A8016CEECE0136DE7C +:101C10002AE037ED43EA5CE3688179818A819B8120 +:101C20000E941852A50194010E94ED502CEE31E55E +:101C300048E35EE30E947C5220E030E040E85FE34E +:101C40000E9417520E94E952D62E8A899B89AC893C +:101C5000BD89907E4D2D50E070E060E0762F652FBD +:101C6000542F442744275F7166277727842B952BB1 +:101C7000A62BB72B8A8B9B8BAC8BBD8B8E010E5EFC +:101C80001F4FA80160E9CE01F9DD6D2D70E090E0F5 +:101C900080E00E948E5020E030E040E05FE30E9450 +:101CA000ED500E94E9526F718A899B89AC89BD8988 +:101CB000807E862B8A8B9B8BAC8BBD8BA80160E9C9 +:101CC000CE01DCDDCA58DF4FF982E882DF91CF9187 +:101CD0001F910F91FF90EF90DF90BF90AF909F907A +:101CE0008F900895A8016CE6CE01C8DDF8018081CF +:101CF0009181A281B381A1FFA8CFAD7F8083918321 +:101D0000A283B383A8016CEECE01B8DD9ECF0F9302 +:101D10001F93062FFC0146855785608971894F7E88 +:101D200010E030E020E0A4E0000F111F221F331F5D +:101D3000AA95D1F7402B512B622B732B46875787DF +:101D4000608B718BAC01425F5F4F60E81F910F9118 +:101D500095CD0F931F93CF93DF93EC0168EC70E068 +:101D600080E090E08CDB8E819F818F3F980729F087 +:101D700061E019DB61E08E81E9DA8C859D858F3F1A +:101D8000980711F061E00FDB888599858F3F9807F0 +:101D900029F061E008DB60E08885D8DA61E08A85B7 +:101DA00002DB61E08A85D2DAFE01E858FF4F8081CC +:101DB000882309F457C061E08091640BF4DA61E094 +:101DC0008091680BF0DA62E08091660BECDA40916A +:101DD000640B5091650BFA01E355FD4FE491E093DC +:101DE0006A0B2091660B3091670BF901E355FD4FAB +:101DF000E491E0936B0B8091680B9091690BFC016F +:101E0000E355FD4FE491E0936C0BFA01E959FD4F66 +:101E1000E491F0E0EE0FFF1FED5CFD4F4591549112 +:101E200050936E0B40936D0BF901E959FD4FE4910E +:101E3000F0E0EE0FFF1FE35BFD4F259134913093EF +:101E4000700B20936F0BFC01E959FD4FE491F0E01A +:101E5000EE0FFF1FED5CFD4F859194919093720BF7 +:101E60008093710BAE01425F5F4F60E8CE0106DDEB +:101E7000AE014E5E5F4F60E9CE0100DDAE014A5912 +:101E80005F4FFA0180819181A281B3819927AA27AE +:101E9000BB2780839183A283B38361E9CE01EEDC0B +:101EA000AE01465E5F4F63E9CE01E8DCAE01425E03 +:101EB0005F4F64E9CE01E2DCAE014E5D5F4F65E944 +:101EC000CE01DCDCAE014A5D5F4F6DEACE01D6DCAF +:101ED000AE01465D5F4F63EBCE01D0DC8E010E5A42 +:101EE0001F4FA8016CEECE01C9DCAE014A5A5F4F0C +:101EF0006DEECE01C3DCAE01425A5F4F60EFCE0102 +:101F0000BDDCAE0146595F4FFA0180819181A2810B +:101F1000B3819927AA27BB2780839183A283B383A8 +:101F200062EFCE01ABDCF80180819181A281B381A7 +:101F3000807F886080839183A283B383A8016CEE45 +:101F4000CE019CDCF80180819181A281B3819F77D1 +:101F5000AE7F906880839183A283B383A8016CEEE7 +:101F6000CE01DF91CF911F910F9188CCCF92DF925C +:101F7000EF92FF92FC01248935894689578960894F +:101F8000718982899389C28CD38C0D2C000CEE0848 +:101F9000FF082031E7E23E074105510529F01216FE +:101FA0001306140615065CF09B01AC01C701B601CF +:101FB0000E941D53FF90EF90DF90CF9008950E94F4 +:101FC0001D5320E137E240E050E00E94BA51EECFCD +:101FD000FC0181E090E0958F848F11821082158240 +:101FE0001482108A118A128A138A118E108E80E14F +:101FF00097E2A0E0B0E0848B958BA68BB78B12861E +:1020000010861486158616861786089508950895F5 +:10201000CF93DF93EC0189899F81992331F061E0AF +:1020200095D91F82DF91CF91089560E08FD981E02B +:102030008F83F8CFCF93DF93EC018B859E8199231B +:1020400031F061E083D91E82DF91CF91089560E085 +:102050007DD981E08E83F8CFEBE0F1E08081877F4E +:1020600080830895EBE0F1E08081886080830895AB +:102070008E9808958E9A089514980895149A089544 +:1020800088980895889A089560E0FC0181895EC966 +:1020900060E0FC0183855AC961E0FC01818956C971 +:1020A00061E0FC01838552C9CF93DF93EC01FC0111 +:1020B000E159FF4F1082379781E0808360E08B8584 +:1020C00045D98D899E89892B29F060E08989DF9126 +:1020D000CF913CC9DF91CF910895CF93DF93EC016D +:1020E000898D0CD92C8D2817190621F48D8DDF913F +:1020F000CF91089580E0FBCFCF93DF93EC018F89E0 +:10210000FDD82C8D2817190621F48D8DDF91CF91E4 +:10211000089580E0FBCFCF93DF93EC018881998114 +:102120002BA961E0211101C060E0F1DD8A819B8172 +:102130002CA9222321F02DA961E0211101C060E02A +:10214000DF91CF91E4CDCF93DF93EC01888199812A +:102150002BA960E0211101C061E0D9DD8A819B815A +:102160002CA9222321F02DA960E0211101C061E0FA +:10217000DF91CF91CCCDCF93DF93EC0161E08F85E0 +:10218000E5D88CA9882319F061E08D89DFD8C3597F +:10219000DF4F1882DF91CF910895CF93DF93EC0149 +:1021A00060E08F85D3D88CA9882319F060E08D89F1 +:1021B000CDD8C359DF4F81E08883DF91CF91089557 +:1021C000CF92DF92EF92FF920F931F93CF93DF9303 +:1021D000FC01DC01A05CBF4F4D935D936D937C933C +:1021E000139714964D935D936D937C931397149668 +:1021F0000D931D932D933C931397EC01C45BDF4F1C +:10220000E88282AD882351F092A991114CC037FF2A +:1022100050C01D921D921D921C92139743AD54AD58 +:1022200065AD76AD14161506160617063CF597AD86 +:10223000992321F10D911D912D913C9113976801E6 +:10224000790137FF07C0CC24DD247601C01AD10AFA +:10225000E20AF30A4C155D056E057F057CF437FF35 +:1022600007C070956095509541955F4F6F4F7F4FB8 +:102270004D935D936D937C931397892FDF01AB5A38 +:10228000BF4F1D921D921D921C921397EB59FF4F49 +:1022900091E09083DF91CF911F910F91FF90EF908C +:1022A000DF90CF90089510161106120613060CF455 +:1022B000B0CF80E0B3CF0F931F93CF93DF93EC01A8 +:1022C000062F8B8D81110DC0CE0116DF182FCE0188 +:1022D00004DF0111182F812FDF91CF911F910F91F2 +:1022E0000895CE01FADE182FCE0106DFF2CFCF938C +:1022F000DF93EC01FC01E159FF4F81E08083AE01E7 +:102300004C5B5F4FFA0180819181A281B3819E0174 +:102310002A593F4FF9012081222309F440C0019638 +:10232000A11DB11DFA0180839183A283B383FE01B5 +:10233000EE58FF4F20813181C901959587958C0F0B +:102340009D1F32970190F081E02D20FF08C0DC0135 +:102350002D913C91E20FF31F0190F081E02D199532 +:102360008D899E89892BF9F0FE01EA58FF4F208163 +:102370003181C901959587958C0F9D1FCC58DF4FF2 +:10238000E881F98120FF08C0DC012D913C91E20F2A +:10239000F31F0190F081E02DDF91CF911994019707 +:1023A000A109B109BFCFDF91CF9108958F929F927C +:1023B000AF92BF92CF92DF92EF92FF920F931F9353 +:1023C000CF93DF93EC01FC01EB5AFF4F60817181E9 +:1023D000828193810E948C506B017C016EA97FA940 +:1023E00088AD99AD0E948E509B01AC0160E074E213 +:1023F00084E799E40E947C524B015C01FE01EF5995 +:10240000FF4F60817181828193810E948C509B017A +:10241000AC01C501B4010E947C524B015C018E01EC +:10242000075A1F4F20E030E040E05FE30E94ED508C +:10243000A70196010E9418520E94E952F801608398 +:10244000718382839383C35ADF4FA5019401C7012F +:10245000B6010E9418520E94E952688379838A83E8 +:102460009B83DF91CF911F910F91FF90EF90DF90B1 +:10247000CF90BF90AF909F908F9008950F931F9330 +:10248000CF93DF93FC01E159FF4F20812223B9F064 +:102490007A97008111812281338138964081518160 +:1024A00062817381041715072607370710F1EC01C5 +:1024B000FBDDCE01DF91CF911F910F9177CFFC0112 +:1024C000EB59FF4F20812223A1F0709700811181E9 +:1024D0002281338134964081518162817381041756 +:1024E00015072607370728F0DF91CF911F910F912D +:1024F000FECEDF91CF911F910F910895FC01EB5912 +:10250000FF4F2081222361F0709780819181A28109 +:10251000B3810196A11DB11D80839183A283B383F2 +:1025200008950F931F93FC01E45BFF4F208121115D +:1025300012C0389700811181228133813496408105 +:1025400051816281738104171507260737073CF410 +:102550001F910F91F8CDFC0122A92111F9CF1F91F4 +:102560000F91D9CDFC0181E0868387831186108687 +:1025700012861486138616861586108A1786128A86 +:10258000118A148A138A168A158A108E178A128E57 +:10259000118EDF01AB59BF4F1C9295971D921D9272 +:1025A0001D921C92139714961D921D921D921C92BF +:1025B000139714961D921D921D921C9213971496B8 +:1025C0001C925A961C9211961C9212961C9211966D +:1025D0001C9211961C9211961C9211961C921196A7 +:1025E0001C9211961C92119680E590E111969C9395 +:1025F0008E93129611961C921E9212968CE490E184 +:1026000011969C938E93129611961C921E9212967E +:1026100088E490E111969C938E93129611961C92E9 +:102620001E92129684E490E18D939C93E258FF4FA2 +:10263000118210820895CF93DF93EC01FC01E052E8 +:10264000FD4F1082EE58F1098081811103C0CE0147 +:10265000409691DDFE01ED5AFD4F8081811104C04D +:10266000CE0180579F4F87DDFE01EC5AFD4F8081E0 +:10267000811104C0CE01805F9E4F7DDD64E670E075 +:1026800080E090E0DF91CF910C943F0A0F931F936D +:10269000CF93DF938B01EA01AB01415051094433E1 +:1026A000510508F0ECC02230310508F0E8C048E3DD +:1026B000429FF001439FF00D1124E80FF91FE60F30 +:1026C000F71F81E080836C2F232B09F4D4C061E0D5 +:1026D000802F0E94D309209751F460E0802F0E9440 +:1026E000A609CE01DF91CF911F910F910895CF3FA1 +:1026F000D10511F461E0BFC0F801ED50FD4FE49148 +:10270000E150E23108F0B2C0F0E08827E557FC4E16 +:102710008F4F0C9438539D13A413A913B313BD13F7 +:102720003614C713CF13D713E113EB13F5130414A7 +:102730000E143614181422142C1484B5806884BD29 +:10274000C7BDD0E0C0E0CDCF84B5806284BDC8BD38 +:10275000F8CF80918000806880938000D0938900BA +:10276000C0938800EECF80918000806280938000CB +:10277000D0938B00C0938A00E4CF80918000886062 +:1027800080938000D0938D00C0938C00DACF80912D +:10279000B00080688093B000C093B300D2CF809126 +:1027A000B00080628093B000C093B400CACF809123 +:1027B0009000806880939000D0939900C093980017 +:1027C000C0CF80919000806280939000D0939B0056 +:1027D000C0939A00B6CF809190008860809390005B +:1027E000D0939D00C0939C00ACCF8091A0008068E6 +:1027F0008093A0008091A0008F7B8093A000D09355 +:10280000A900C093A8009DCF8091A0008062809312 +:10281000A000D093AB00C093AA0093CF8091A000FA +:1028200088608093A000D093AD00C093AC0089CFA6 +:1028300080912001806880932001D0932901C0936A +:1028400028017FCF80912001806280932001D09366 +:102850002B01C0932A0175CF80912001886080935D +:102860002001D0932D01C0932C016BCF60E0C038C4 +:10287000D1050CF03FCF802F0E94A60962CFC1E0A6 +:10288000D0E02FCFCF93DF93D0E0C0E0CE010E9405 +:102890005207882319F0CE010E943B022196C13EC7 +:1028A000D105A1F7DF91CF91089508958FEF9FEFA4 +:1028B0000895089508950895089508950895089530 +:1028C0000895089508950895089508950895089520 +:1028D0000895089508950895089508958F929F92F8 +:1028E000AF92BF92CF92DF92EF92FF920F931F931E +:1028F000CF93DF93EC018B01C42E8C81883509F0D6 +:102900002DC18DE89DE09983888382E29CE09B83C2 +:102910008A83888199811DDAB8018881998127D9B4 +:1029200088819981AC014E5A5F4FFA018080918075 +:10293000A280B380F0EFBF226894B3F8FA018082DE +:102940009182A282B3826CEE0E943E0C88819981B2 +:10295000FC01468557856089718951604687578794 +:10296000608B718BAC01425F5F4F60E80E943E0C50 +:10297000888199810C2C000CDD08EE08FF08760197 +:10298000DD24CC24CC24DD24E894E7F8FF24AC013A +:102990004A5A5F4FFA0180809180A280B380F0E8AC +:1029A000AF228C289D28AE28BF28FA018082918210 +:1029B000A282B3826DEE0E943E0C60E08881998114 +:1029C000A6D960EB74E088819981D1D888819981FA +:1029D000FC01468557856089718944604687578721 +:1029E000608B718BAC01425F5F4F60E80E943E0CD0 +:1029F00088819981AC014E5A5F4FFA0180809180A5 +:102A0000A280B3806894B4F880829182A282B3825B +:102A10006CEE0E943E0C8C81883509F06FC08A8173 +:102A20009B8197D9B8018A819B81A1D88A819B819A +:102A3000AC014E5A5F4FFA0100811181228133812E +:102A4000307F386000831183228333836CEE0E94D1 +:102A50003E0C8A819B81FC0146855785608971897E +:102A6000516046875787608B718BAC01425F5F4F27 +:102A700060E80E943E0C8A819B81AC014A5A5F4FFC +:102A8000FA0100811181228133812078C02AD12A64 +:102A9000E22AF32AC082D182E282F3826DEE0E94A2 +:102AA0003E0C60E08A819B8132D960EB74E08A81C0 +:102AB0009B815DD88A819B81FC0146855785608911 +:102AC0007189446046875787608B718BAC01425F88 +:102AD0005F4F60E80E943E0C8A819B81AC014E5A98 +:102AE0005F4FFA01008111812281338130610083BF +:102AF0001183228333836CEE0E943E0CFE01E05969 +:102B0000FF4F8AE190E19183808332961182108297 +:102B1000329688E090E19183808332961182108210 +:102B2000329686E090E19183808332961182108202 +:102B3000329687E090E191838083C258DF4F1982FB +:102B40001882DF91CF911F910F91FF90EF90DF904E +:102B5000CF90BF90AF909F908F900895893529F4C2 +:102B600084E19DE099838883D4CE8A3509F0D1CE63 +:102B70008BE99CE0F7CF80911E0790911F07892B6E +:102B800041F481E090E00E940F4B90931F078093E7 +:102B90001E0780911E0790911F0708950F931F93A2 +:102BA000CF93DF938B01E7DFF801C2A1D3A1868D1C +:102BB000978D8530910529F14CF40497B1F090E0A0 +:102BC00080E0DF91CF911F910F910895863091059C +:102BD00011F10B97A1F767E070E080EA9EE00E9498 +:102BE000F80ABE0180EA9EE009C064E070E087E96F +:102BF0009EE00E94F80ABE0187E99EE00E947C0ADE +:102C0000DECF65E070E08AE99EE00E94F80ABE012E +:102C10008AE99EE0F3CF66E070E08DE99EE00E94D5 +:102C2000F80ABE018DE99EE0E9CF80911A079091E4 +:102C30001B07892B91F480E790E00E940F4BFC0169 +:102C400031969C012B5C3F4F119217AAE217F307B4 +:102C5000D9F790931B0780931A0780911A079091D8 +:102C60001B0708954F925F926F927F92AF92BF922F +:102C7000CF92DF92EF92FF920F931F93CF93DF9348 +:102C8000EB01D3DF8C01CAA8DBA84EA45FA468A81F +:102C900079A8AEA0BFA0EE8CFF8C4AA15BA19601E3 +:102CA000B701F4DCC301B2010E943F0A9601A501FD +:102CB000B701C801EBDC90E080E0DF91CF911F917C +:102CC0000F91FF90EF90DF90CF90BF90AF907F90EB +:102CD0006F905F904F900895CF93DF93EB01A5DF46 +:102CE0006AA98E8D0E94D30990E080E0DF91CF9198 +:102CF0000895CF93DF93EB0198DF2AA93BA94AA15E +:102D00005BA16E8D7F8DC2DC90E080E0DF91CF9182 +:102D100008958091160790911707892B71F58DE022 +:102D200090E00E940F4BFC01148610925D071092F8 +:102D30005E0710925F071092600710926107109271 +:102D40006207109263071092640710926507109251 +:102D5000660710926707109268071092730B109223 +:102D6000740B1092750B1092760B10925C071092F8 +:102D70005B07909317078093160780911607909131 +:102D800017070895C6DF85E40E947E0921E0892B9C +:102D900009F420E02093770BBCDF84E40E947E09D5 +:102DA00021E0892B09F420E02093780BB2DF83E443 +:102DB0000E947E0921E0892B09F420E02093790B01 +:102DC000A8DF82E40E947E0921E0892B09F420E03B +:102DD00020937A0B9EDF81E40E947E0921E0892BFB +:102DE00009F420E020937B0B94DF80E40E947E09AD +:102DF00021E0892B09F420E020937C0B089589DFE2 +:102E0000C1CF87DFFC01148690E080E00895FC01CB +:102E100001900020E9F73197AF01481B590BBC0125 +:102E20008DE79BE00C94E3078F929F92AF92BF9245 +:102E30000F931F93CF93DF93CDB7DEB7A1970FB654 +:102E4000F894DEBF0FBECDBF19A2423008F44AE0AD +:102E50008E010F5D1F4F842E912CB12CA12CA5014A +:102E600094010E94E651E62FB901CA01EA30ECF460 +:102E7000E05DD801EE938D01232B242B252B79F7D0 +:102E800090E080E0109711F0CD01C1DFA1960FB660 +:102E9000F894DEBF0FBECDBFDF91CF911F910F9190 +:102EA000BF90AF909F908F900895E95CE2CFCF9252 +:102EB000DF92EF92FF92CF93DF9397FF18C06B01E1 +:102EC0007C018DE20E94C408EC0166277727CB01C4 +:102ED0006C197D098E099F094AE0A6DF8C0F9D1FA2 +:102EE000DF91CF91FF90EF90DF90CF9008954AE06F +:102EF000DF91CF91FF90EF90DF90CF9095CFBC0105 +:102F0000990F880B990BD3CF82CF882319F081E7D3 +:102F100096E0FACF8AE696E0FCCF86E793E0F4DF0E +:102F20006091730B7091740B8091750B9091760B7F +:102F3000BEDF80E696E0E8CF0F931F93CF93DF9339 +:102F40008C01EB0188E593E0DFDF8FED93E0DCDFC0 +:102F5000F80184810E94C408CE01D1DFDADEDF915E +:102F6000CF911F910F91D9CFEF92FF920F931F93A3 +:102F7000CF93DF93182F092F7B016115710569F538 +:102F80000E947E0931E020E0019709F030E0C32F74 +:102F9000D22F82E0E816F10408F045C089E793E0FB +:102FA000B3DF8FED93E0B0DF8DE793E0ADDF812FEE +:102FB000902FA5DF8FED93E0A7DF8FE793E0A4DFED +:102FC000CE019DDFA6DEA9DF90E080E0DF91CF910A +:102FD0001F910F91FF90EF900895D0E0C0E0613015 +:102FE0007105B9F6812F163310F08AEC810F20910C +:102FF0007B00982F9870277F922B90937B0087708F +:10300000806480937C0080917A00806480937A0051 +:1030100080917A0086FDFCCF80917800C091790084 +:10302000DC2FC82FB6CF81E090E0D0CF0F931F9355 +:10303000CF93DF93FC012081318121153105C1F14E +:10304000EC01822F0E947E0921E0892B09F420E007 +:103050002B876A85261701F11E821F821886198622 +:103060000E811F81288539858A819B81AC81BD8134 +:10307000081719072A073B07DCF081E068278881D9 +:103080000E94A609D2DD70E060E088819981DF911D +:10309000CF911F910F9168CF8E819F81A885B985AF +:1030A0000196A11DB11D8E839F83A887B987D8CFB4 +:1030B000DF91CF911F910F910895CF93DF93EB0193 +:1030C000B4DD6AA97BA98E8D9F8D4EDF90E080E0F4 +:1030D000DF91CF9108952F923F924F925F926F921E +:1030E0007F928F929F92AF92BF92CF92DF92EF9298 +:1030F000FF920F931F93CF93DF93CDB7DEB7629705 +:103100000FB6F894DEBF0FBECDBF1C018C010C5B67 +:103110001F4F1E870D87D8014D915D916D917C9158 +:103120007C01B8E4EB0EF11CF70180819181A28152 +:10313000B3816101FCE4CF0ED11CF60120810E5D4C +:103140001F4F58017B964F012223A1F1F10122A9C3 +:10315000F801208321E0F401208341155105610528 +:10316000710559F4F10102A113A124A135A1EF5970 +:10317000FF4F00831183228333838101005C1F4F43 +:10318000F801408051806280738091012B593F4F3C +:103190005901481659066A067B06B4F548175907BF +:1031A0006A077B07DCF1D6018C91811137C0D5010C +:1031B0001C923AC121E0481759076A077B070CF0B7 +:1031C00020E0F50120832A013B0177FF07C044245A +:1031D00055243201441A550A660A770A8C019D016A +:1031E000B7FF07C0002711279801081B190B2A0BEE +:1031F0003B0BBB24B39440165106620673060CF4D5 +:10320000B12CF401B082A9CF84159505A605B705A8 +:1032100054F684179507A607B7072CF6F5018081A9 +:10322000882329F2D6018C9181110DC0F60180818D +:103230008111BDCFD4016C9181E06827C1013BD8D9 +:103240008111B5CF05C060E0C10135D88111EECF45 +:10325000D1019A962D913D914D915C919D97298335 +:103260003A834B835C835E962D913D914D915C91A9 +:1032700091972D833E834F83588792962D913D9150 +:103280004D915C91959729873A874B875C87F70129 +:1032900080819181A281B381ED85FE85C080D1803E +:1032A000E280F380F8014081518162817381F101F4 +:1032B000E759FF4F1082319610823101FBE66F0E05 +:1032C000711CF3011082910124593F4FF9011082C2 +:1032D000329610824C015D01841A950AA60AB70A3B +:1032E000B7FE08C0B094A09490948094811C911C67 +:1032F000A11CB11C481759076A077B072CF0C81A94 +:10330000D90AEA0AFB0A04C0C41AD50AE60AF70A6F +:10331000D501C401B595A795979587958D879E870B +:10332000AF87B88B810102591F4F8C149D04AE04E6 +:10333000BF0408F09FC0D10196960D90BC91A02DBE +:10334000BA8BA98B81E0F9018083D8018C93F101BC +:103350008285882309F45CC00E94700AD101189606 +:103360000D911C91012E000C220B330B601B710B75 +:10337000820B930B693E73408105910508F448C0A8 +:103380000E94700AF1017187608781E893E0BCDDDB +:1033900085E893E0B9DD60E070E0CB0188DD8BE883 +:1033A00093E0B2DDC701B60182DD81E993E0ACDDD7 +:1033B000C501B4017CDD87E993E0A6DD4AE06D85B7 +:1033C0007E858F85988930DD8EE993E09DDD69816A +:1033D0007A818B819C816BDD84EA93E095DD698540 +:1033E0007A858B859C8563DD8AEA93E08DDD6D812E +:1033F0007E818F8198855BDD80EB93E085DD8FEDAD +:1034000093E082DD89899A897ADD80E696E07CDD29 +:10341000F101EF59FF4F09891A89C801B0E0A0E016 +:1034200080839183A283B38360E0C1010E945B111A +:10343000882339F0F101EC5BFF4F10821182128278 +:10344000138262960FB6F894DEBF0FBECDBFDF9138 +:10345000CF911F910F91FF90EF90DF90CF90BF9091 +:10346000AF909F908F907F906F905F904F903F9024 +:103470002F9008952D853E854F8558892C153D0543 +:103480004E055F0508F450C089819A81AB81BC81EB +:103490008C159D05AE05BF0544F4AD81BE81119626 +:1034A000BA8BA98B81E0F3014FCFC701B6010E940F +:1034B0008E502B013C0169817A818B819C810E9415 +:1034C0008E509B01AC01C301B2010E947C522B01C2 +:1034D0003C016D817E818F81988529853A854B8558 +:1034E0005C85621B730B840B950B0E948E509B01B5 +:1034F000AC01C301B2010E94ED502B013C01698572 +:103500007A858B859C850E948E509B01AC01C301FE +:10351000B2010E9418520E94E4527A8B698B81E0BA +:10352000F101E759FF4F10CFD501C40129813A813C +:103530004B815C81821B930BA40BB50BC816D9067B +:10354000EA06FB065CF44D815E814E5F5F4F5A8B4D +:10355000498B81E0F101E559FF4FF6CEC501B40179 +:103560006C197D098E099F090E948E502B013C0128 +:1035700069817A818B819C810E948E509B01AC0174 +:10358000C301B2010E947C522B013C016D817E81FE +:103590008F81988529853A854B855C85621B730BE5 +:1035A000840B950B0E948E509B01AC01C301B201AC +:1035B0000E94ED502B013C0169857A858B859C85A5 +:1035C0000E948E509B01AC01C301B2010E941852AF +:1035D0000E94E4527A8B698B81E0F101E659FF4F3A +:1035E000B3CECF92DF92EF92FF92CF93DF93EB01B6 +:1035F000CB010E945207882351F1FE01EE0FFF1FFD +:10360000EE0FFF1FE052F84FC080D180E280F380C0 +:1036100086EB93E079DC8FED93E076DC8DE793E049 +:1036200073DCCE016CDC8FED93E06EDC8FE793E012 +:103630006BDCC701B6013BDC6CDB6FDC90E080E04B +:10364000DF91CF91FF90EF90DF90CF9008958AEBBC +:1036500093E05ADCF3CF8CED93E056DC88E092E007 +:1036600053DC57DB5ADC90E080E00895CF93DF9382 +:1036700081EE93E049DC85EE93E046DCC7E7DBE0D2 +:10368000888143DC89EE93E03FDC89813EDC8DEE6E +:1036900093E03ADC8A8139DC81EF93E035DC8B8181 +:1036A00034DC85EF93E030DC8C812FDC89EF93E014 +:1036B0002BDC8D812ADCDF91CF912FCC2ADBD6CF7A +:1036C0008DEF93E021DC25DB5DDB23DBCFDFADDAA3 +:1036D00070E060E088E090E047DCA7DA70E060E04E +:1036E00089E090E041DCA1DA70E060E08AE090E0FF +:1036F0003BDC9BDA70E060E08DE090E035DC90E050 +:1037000080E008954F925F926F927F928F929F9286 +:10371000AF92BF92CF92DF92EF92FF920F931F93DF +:10372000CF936B017C01742EAC019B010E94195355 +:10373000882391F084E094E0CF911F910F91FF9046 +:10374000EF90DF90CF90BF90AF909F908F907F9041 +:103750006F905F904F905BCB46015701E894B7F8AC +:103760002FEF3FEF4FE75FE7C501B4010E94195308 +:1037700081110DC02FEF3FEF4FE75FE7C501B401A7 +:103780000E94885018161CF488E094E0D5CF2FEFE3 +:103790003FEF4FE75FE4C701B6010E9415531816CB +:1037A0001CF48CE094E0C8CF2FEF3FEF4FE75FECC5 +:1037B000C701B6010E94885087FDF3CF20E030E0BA +:1037C000A901C701B6010E94885010E000E087FF00 +:1037D00008C08DE20E94C4088C01F7FAF094F7F853 +:1037E000F094C0E060E070E080E09FE37C1641F080 +:1037F00020E030E040E251E40E947C52CF5FF6CFFF +:10380000A70196010E9418522B013C010E94E95227 +:103810004B015C014AE008DB7C01E00EF11ECC2389 +:10382000A9F1C501B4010E948C509B01AC01C301F8 +:10383000B2010E9417524B015C018EE20E94C40843 +:10384000E80EF91EC15010F120E030E040E251E4F2 +:10385000C501B4010E94ED502B013C010E94E952C8 +:103860004B01B12CA12C4AE0C501B401DDDAE80E10 +:10387000F91EC501B4010E948C509B01AC01C3012B +:10388000B2010E9417524B015C01DCCFC701CF91FE +:103890001F910F91FF90EF90DF90CF90BF90AF906E +:1038A0009F908F907F906F905F904F9008958F9230 +:1038B0009F92AF92BF92CF92DF92EF92FF920F93BF +:1038C0001F93CF93DF93EC0186E292E01DDB85E24C +:1038D00094E01ADB6E0180E7C81A8EEFD80AC601A1 +:1038E0000E94B60F0E948E504B015C01FE01ED5804 +:1038F000FD4F60817181828193810E948E509B0176 +:10390000AC01C501B4010E947C5242E0FBDE85E3BC +:1039100094E0FADA7E01E2E5EE1AEEEFFE0AC70164 +:103920000E94B60F0E948E504B015C01FE01E958C7 +:10393000FD4F60817181828193810E948E509B0135 +:10394000AC01C501B4010E947C5242E0DBDE85E49B +:1039500094E0DADA8E0104531E4FC8010E94B60FBC +:103960000E948E504B015C01C558DD4F6881798102 +:103970008A819B810E948E509B01AC01C501B401DC +:103980000E947C5242E0BEDEC4D9C7DA82E292E0F5 +:10399000BBDA85E294E0B8DAF601A28DB38D208916 +:1039A0003189428953890E94E05181DA85E394E0AC +:1039B000ABDAF701A28DB38D208931894289538911 +:1039C0000E94E05174DA85E494E09EDAF801A28D59 +:1039D000B38D20893189428953890E94E05167DA89 +:1039E00098D9DF91CF911F910F91FF90EF90DF90C9 +:1039F000CF90BF90AF909F908F908FCACF92DF9261 +:103A0000EF92FF92CF93DF93EC0188819981AA8195 +:103A1000BB81181619061A061B0644F081E090E0D7 +:103A2000A0E0B0E088839983AA83BB838C819D81C9 +:103A3000AE81BF81181619061A061B0644F081E0F4 +:103A400090E0A0E0B0E08C839D83AE83BF83888547 +:103A50009985AA85BB85181619061A061B0644F017 +:103A600081E090E0A0E0B0E088879987AA87BB87D3 +:103A700080E194E049DA85E294E046DA60915D07FE +:103A800070915E0780915F07909160070E948E5051 +:103A90006B017C01688179818A819B810E948E50B3 +:103AA0009B01AC01C701B6010E947C5242E02ADEB4 +:103AB00085E394E029DA6091610770916207809153 +:103AC0006307909164070E948E506B017C016C81AA +:103AD0007D818E819F810E948E509B01AC01C70128 +:103AE000B6010E947C5242E00DDE85E494E00CDADF +:103AF00060916507709166078091670790916807EC +:103B00000E948E506B017C01688579858A859B8532 +:103B10000E948E509B01AC01C701B6010E947C52ED +:103B200042E0F0DDDF91CF91FF90EF90DF90CF90FA +:103B3000F4C9EFD863DF90E080E008950C94AB4BBC +:103B40000C94AB4B0C94AB4B0C94AB4B0C94AB4B1D +:103B50000C94AB4B0C94AB4B0C94AB4B0C94AB4B0D +:103B60000C94AB4B0C94AB4B0C94AB4B0C94AB4BFD +:103B70000C94AB4B0C94AB4B0C94AB4B0C94AB4BED +:103B80000C94AB4B0C94AB4B0C94AB4B0C94AB4BDD +:103B90000C94AB4B0C94AB4BCF92DF92EF92FF9215 +:103BA0000F931F93CF93DF938C016A017B01EC018C +:103BB000CC0FDD1F642FCE010E94AC519927F7FC7A +:103BC0009A958F2D7E2D6D2DCE0101960E94AC51C0 +:103BD0000D5811090330110588F4B701992777FDB5 +:103BE0009095892FCE0144960E94AC516F2D772776 +:103BF00088279927CE0145960E94AC5190E080E03D +:103C0000DF91CF911F910F91FF90EF90DF90CF90B8 +:103C100008954F925F926F927F928F929F92AF9290 +:103C2000BF92CF92DF92EF92FF920F931F93CF93A9 +:103C3000DF938C01EC01CC0FDD1FCE010E94A4515B +:103C4000882E912CB12CA12CCE0101960E94A4515A +:103C5000C82ED12CF12CE12C0D581109033011057F +:103C600008F05AC0CE0144960E94A451482E512C0F +:103C7000712C612CCE0145960E94A451082F10E0B2 +:103C800030E020E08FEF481651046104710429F5FB +:103C90000F3F11052105310501F58FEF88169104BD +:103CA000A104B104C9F58FEFC816D104E104F104F1 +:103CB00099F56FEF7FEFCB01DF91CF911F910F91BE +:103CC000FF90EF90DF90CF90BF90AF909F908F903C +:103CD0007F906F905F904F900895003811052105F7 +:103CE00031053CF7FE2CED2CDC2CCC24C701B601B1 +:103CF000680D791D8A1D9B1D320155244424640DD5 +:103D0000751D861D971D302F222711270027600F54 +:103D1000711F821F931FD0CF00E010E09801412C4B +:103D2000512C320180E8C816D104E104F104D4F228 +:103D3000C0CFEF92FF920F931F93CF93DF938091A9 +:103D4000180790911907892B51F584E090E00E94A3 +:103D50000F4B7C0190E080E05CDF1616170654F1F3 +:103D6000C7010E944214D0E0C0E0CE010E94520779 +:103D7000882369F0FE01EE0FFF1FEE0FFF1FE052D8 +:103D8000F84F4081518162817381CE0105DF219618 +:103D9000C639D10551F7F0921907E09218078091C2 +:103DA000180790911907DF91CF911F910F91FF9004 +:103DB000EF90089583E090E02CDF6130710581057C +:103DC000910531F500EE17E0D0E0C0E0CE010E9491 +:103DD00052078823B1F0CE011CDFF80160837183A4 +:103DE000828393836F3F7F4F8F4F9F4F51F4CE015C +:103DF0000E943B02F8014081518162817381CE01B2 +:103E0000CBDE21960C5F1F4FC13ED105F9F6C3CF23 +:103E1000C7010E944214BFCF2F923F924F925F92F0 +:103E20006F927F928F929F92AF92BF92CF92DF92CA +:103E3000EF92FF920F931F93CF93DF93EC0179DF03 +:103E4000FE01E755FD4F80919C0990919D0991835A +:103E500080836FDFFE01E555FD4F8091A0099091B1 +:103E6000A1099183808365DFFE01E355FD4F8091B9 +:103E7000A4099091A509918380835BDF8E01015590 +:103E80001D4F6091C4097091C5098091C609909138 +:103E9000C7090E948E50F8016083718382839383E7 +:103EA00048DF1E01FDE42F1AFDEF3F0A6091C809AB +:103EB0007091C9098091CA099091CB090E948E50D6 +:103EC000F101608371838283938333DF20E030E0EC +:103ED00048EC52E4F80160817181828193810E94F3 +:103EE0007C522B013C0120E030E048EC52E4F1012F +:103EF00060817181828193810E947C524B015C01BF +:103F00006091CC097091CD098091CE099091CF0933 +:103F10000E948E5020E030E048EC52E40E947C5237 +:103F20006B017C012AE037ED43E25CE3C301B2019F +:103F30000E94155318160CF02BC120E030E046EC1F +:103F400052E4C301B2010E94885087FD06C0412C93 +:103F5000512C56EC652E52E4752EF80140825182A8 +:103F6000628273822AE037ED43E25CE3C501B4016B +:103F70000E94155318160CF014C120E030E046ECF6 +:103F800052E4C501B4010E94885087FD06C0812C0F +:103F9000912C36ECA32E32E4B32EF1018082918273 +:103FA000A282B3822AE037ED43E25CE3C701B601A7 +:103FB0000E94155318160CF0FDC020E030E046ECCE +:103FC00052E4C701B6010E94885087FD06C0C12C8B +:103FD000D12C96ECE92E92E4F92EFE01E954FD4F26 +:103FE000C082D182E282F382A4DE80918409909122 +:103FF0008509FE01E254FD4F918380839ADE809112 +:10400000880990918909FE01E054FD4F91838083D6 +:1040100090DE80918C0990918D09FE01EE53FD4F49 +:104020009183808386DE8091AC099091AD09A09147 +:10403000AE09B091AF09FE01EC53FD4F808391832F +:10404000A283B38376DE8091B0099091B109A091EB +:10405000B209B091B309FE01E853FD4F808391830B +:10406000A283B38366DE8091B4099091B509A091D3 +:10407000B609B091B709FE01E453FD4F80839183E7 +:10408000A283B38356DE8091D4099091D509FE01B5 +:10409000E053FD4F918380834CDE8091D80990914D +:1040A000D909FE01EE52FD4F9183808342DE80915B +:1040B000DC099091DD09FE01EC52FD4F9183808374 +:1040C00038DE8091EC099091ED09FE01EA52FD4F36 +:1040D000918380832EDE8091F0099091F109FE0199 +:1040E000E852FD4F9183808324DE8091F409909102 +:1040F000F509FE01E652FD4F918380831ADE80911F +:10410000740990917509A0917609B0917709FE0123 +:10411000E554FD4F0197A105B10509F054C081E0B8 +:10412000808307DE8091780990917909A0917A09BE +:10413000B0917B09FE01E454FD4F0197A105B10543 +:1041400009F043C081E08083F4DD80917C09909187 +:104150007D09A0917E09B0917F09C354DD4F01977D +:10416000A105B105A1F581E08883DF91CF911F9171 +:104170000F91FF90EF90DF90CF90BF90AF909F9006 +:104180008F907F906F905F904F903F902F90089509 +:104190004AE0442E47ED542E43E2642E4CE3742E45 +:1041A000DCCE2AE0822E27ED922E23E2A22E2CE3F3 +:1041B000B22EF3CE8AE0C82E87EDD82E83E2E82E09 +:1041C0008CE3F82E0ACF1082ACCF1082BDCF1882BC +:1041D000CCCF2F923F924F925F926F927F928F92AD +:1041E0009F92AF92BF92CF92DF92EF92FF920F9386 +:1041F0001F93CF93DF93CDB7DEB767970FB6F894D1 +:10420000DEBF0FBECDBF9F8B8E8B93DDEE89FF8906 +:10421000EF5FFD4F81E04091AC085091AD08609197 +:10422000AE087091AF08452B462B472B09F480E070 +:1042300080837FDDEE89FF89EE5FFD4F81E0409155 +:10424000B0085091B1086091B2087091B308452B45 +:10425000462B472B09F480E080836BDDEE89FF89D4 +:10426000ED5FFD4F81E04091B4085091B508609139 +:10427000B6087091B708452B462B472B09F480E010 +:10428000808357DD8091FC089091FD08A091FE0885 +:10429000B091FF08EE89FF89EC5FFD4F8083918329 +:1042A000A283B38346DD8091000990910109A0911A +:1042B0000209B0910309EE89FF89E85FFD4F808311 +:1042C0009183A283B38335DD809104099091050920 +:1042D000A0910609B0910709EE89FF89E45FFD4FBF +:1042E00080839183A283B38324DD8091D40890914D +:1042F000D508A091D608B091D708EE89FF89E45E71 +:10430000FD4F80839183A283B38313DD8091D8080E +:104310009091D908A091DA08B091DB08EE89FF8965 +:10432000E05EFD4F80839183A283B38302DD8091A1 +:10433000DC089091DD08A091DE08B091DF08EE89DD +:10434000FF89EC5DFD4F80839183A283B383F1DC11 +:104350008091E4089091E508A091E608B091E70803 +:10436000EE89FF89E85DFD4F80839183A283B3834B +:10437000E0DC8091E8089091E908A091EA08B0910A +:10438000EB08EE89FF89E45DFD4F80839183A28372 +:10439000B383CFDC8091EC089091ED08A091EE08FA +:1043A000B091EF08EE89FF89E05DFD4F8083918336 +:1043B000A283B383BEDC8091840890918508A0918C +:1043C0008608B0918708EE89FF89EC5CFD4F8083F9 +:1043D0009183A283B383ADDC809188089091890892 +:1043E000A0918A08B0918B08EE89FF89E85CFD4FA7 +:1043F00080839183A283B3839CDC80918C0890910D +:104400008D08A0918E08B0918F08EE89FF89E45C39 +:10441000FD4F80839183A283B3838BDCEE89FF8978 +:10442000E05CFD4F81E020915C0830915D08213017 +:10443000310509F080E080837CDCEE89FF89EF5B49 +:10444000FD4F81E0209160083091610821303105F5 +:1044500009F080E080836DDCEE89FF89EE5BFD4F23 +:1044600081E020916408309165082130310509F020 +:1044700080E080835EDCEE89FF89E25AFD4F81E0B7 +:104480004091340850913508609136087091370892 +:10449000452B462B472B09F480E080834ADCEE89CC +:1044A000FF89E15AFD4F81E0409138085091390869 +:1044B00060913A0870913B08452B462B472B09F435 +:1044C00080E0808336DCEE89FF89E05AFD4F81E091 +:1044D00040913C0850913D0860913E0870913F0822 +:1044E000452B462B472B09F480E0808322DCEE89A4 +:1044F000FF89EF59FD4F81E040910C0950910D0962 +:1045000060910E0970910F09452B462B472B09F43A +:1045100080E080830EDCEE89FF89EE59FD4F81E05B +:10452000409110095091110960911209709113097D +:10453000452B462B472B09F480E08083FADBEE897C +:10454000FF89ED59FD4F81E0409114095091150903 +:104550006091160970911709452B462B472B09F4DA +:1045600080E08083E6DBEE89FF89EC59FD4F81E036 +:1045700020914408309145082130310509F080E050 +:104580008083D7DBEE89FF89EB59FD4F81E02091D5 +:104590004808309149082130310509F080E08083D6 +:1045A000C8DBEE89FF89EA59FD4F81E020914C0874 +:1045B00030914D082130310509F080E08083B9DB6E +:1045C00080910C0890910D08A0910E08B0910F08F1 +:1045D000EE89FF89E959FD4F80839183A283B383DC +:1045E000A8DB8091100890911108A0911208B09159 +:1045F0001308EE89FF89E559FD4F80839183A283DB +:10460000B38397DB8091140890911508A091160848 +:10461000B0911708EE89FF89E159FD4F808391839E +:10462000A283B38386DBEE89FF89EE5AFD4F81E0DA +:1046300040911C0850911D0860911E0870911F0840 +:10464000452B462B472B09F480E0808372DBEE89F3 +:10465000FF89ED5AFD4F81E04091200850912108DB +:104660006091220870912308452B462B472B09F4B3 +:1046700080E080835EDBEE89FF89EC5AFD4F81E0AC +:1046800040912408509125086091260870912708D0 +:10469000452B462B472B09F480E080834ADB809131 +:1046A000140A9091150AA091160AB091170AEE8982 +:1046B000FF89ED5BFD4F80839183A283B38339DB58 +:1046C0008091180A9091190AA0911A0AB0911B0AB8 +:1046D000EE89FF89E95BFD4F80839183A283B383D9 +:1046E00028DB80911C0A90911D0AA0911E0AB091AE +:1046F0001F0AEE89FF89E55BFD4F80839183A283CA +:10470000B38317DBEE89FF89EB5AFD4F81E02091DF +:104710007408309175082130310509F080E08083FC +:10472000EE89FF89EA5AFD4F1082EE89FF89E95A26 +:10473000FD4F1082FEDAEE89FF89E85AFD4F81E0D5 +:1047400020917008309171082130310509F080E026 +:104750008083EE89FF89E75AFD4F1082EE89FF8939 +:10476000E65AFD4F1082E5DAEE89FF89E55AFD4FE2 +:1047700081E020919408309195082130310509F0AD +:1047800080E08083D6DAEE89FF89E45AFD4F81E02C +:1047900020919808309199082130310509F080E086 +:1047A0008083C7DAEE89FF89E35AFD4F81E02091CB +:1047B0009C0830919D082130310509F080E080830C +:1047C000B8DAEE89FF89E15BFD4F81E02091240A90 +:1047D0003091250A2130310509F080E08083A9DA83 +:1047E000EE89FF89E05BFD4F81E02091280A30913E +:1047F000290A2130310509F080E080839ADAEE89B8 +:10480000FF89EF5AFD4F81E020912C0A30912D0A4B +:104810002130310509F080E080838BDA0E891F8911 +:104820000D581D4F8091BC089091BD08A091BE0805 +:10483000B091BF08F80180839183A283B38379DAB2 +:10484000EE88FF88F9E8EF1AFDEFFF0A8091C008B3 +:104850009091C108A091C208B091C308F70180836C +:104860009183A283B38365DA8091C4089091C508CF +:10487000A091C608B091C708CE88DF88F5E8CF1AA6 +:10488000FDEFDF0AF60180839183A283B383F801F1 +:104890004081518162817381141615061606170630 +:1048A00044F041E050E060E070E040835183628377 +:1048B0007383F7014081518162817381141615065B +:1048C0001606170644F041E050E060E070E04083D7 +:1048D000518362837383181619061A061B064CF05F +:1048E00081E090E0A0E0B0E0F60180839183A283B4 +:1048F000B3830E948916FC01D6018D909D90AD90E6 +:10490000BC90D701CD90DD90ED90FC90D8012D9119 +:104910003D914D915C912083318342835383C482C6 +:10492000D582E682F78280869186A286B3860E893A +:104930001F89005F1F4F1B830A83EE89FF89E15B9C +:10494000FD4F10811983EE89FF89ED5BFD4F60817A +:104950007181828193810E941D5360837183828360 +:104960009383EE89FF89E55AFD4F20812887EE89E0 +:10497000FF89EC59FD4F3080EE89FF89EB5AFD4FDE +:1049800030813987EE89FF89E85AFD4F2080EE8912 +:10499000FF89EF59FD4FB081EE89FF89E25AFD4F43 +:1049A000A081EE89FF89E05CFD4F5081EE89FF898F +:1049B000EF5FFD4F4081EE89FF89E959FD4F00818E +:1049C0001181228133810C831D832E833F83EE89E5 +:1049D000FF89EC5CFD4F00811181228133810A87C0 +:1049E0001B872C873D87EE89FF89E85DFD4F00819D +:1049F0001181228133810A8B1B8B2C8B3D8BEE899D +:104A0000FF89E45EFD4F4080518062807380EE89B3 +:104A1000FF89EC5FFD4F0081118122813381EE8996 +:104A2000FF8906A717A720AB31AB42AA53AA64AAF5 +:104A300075AA0A891B892C893D8906AB17AB20AF63 +:104A400031AF0A851B852C853D8502AF13AF24AF9E +:104A500035AFFE960C811D812E813F81008311832D +:104A600022833383EE89FF89EE5BFF4F4083EE891B +:104A7000FF89ED5BFF4F5083EE89FF89A3A7B4A7A1 +:104A800035A600E410E020E030E0EA5BFF4F008351 +:104A9000118322833383EE89FF89EC5BFF4F2082F1 +:104AA000EE89FF89EB5BFF4F09850083EE89FF8963 +:104AB000E65BFF4F18851083EE89FF89E55BFF4FAA +:104AC0006083718382839383EE89FF89E15BFF4F6B +:104AD00009810083AE89BF895B968D919C915C971B +:104AE0008633910509F064C282E490E1FD01E0584B +:104AF000FF4F9183808332961182108280E490E18F +:104B0000369691838083329611821082EE89FF89D6 +:104B100081A192A14A97D1F48EE390E1EC57FF4F27 +:104B200091838083EE89FF89EA57FF4F11821082BB +:104B30008CE390E1EE89FF89E457FF4F91838083F6 +:104B4000EE89FF89E257FF4F118210820E891F897B +:104B500000571F4FEE89FF89E05BFD4F20812983BD +:104B6000EE89FF89E95BFD4F6081718182819381CC +:104B7000A70196010E941D536083718382839383F2 +:104B8000EE89FF89E45AFD4F30813887EE89FF892D +:104B9000EB59FD4F40814987EE89FF89EA5AFD4F65 +:104BA00050815C83EE89FF89E75AFD4FA081AA8777 +:104BB000EE89FF89EE59FD4F2080EE89FF89E15A89 +:104BC000FD4F3080EE89FF89EF5BFD4FB081EE89AC +:104BD000FF89EE5FFD4FA081EE89FF89E559FD4F0A +:104BE00020813181428153812E873F87488B598BA9 +:104BF000EE89FF89E85CFD4F20813181428153813C +:104C00002A8B3B8B4C8B5D8BEE89FF89E45DFD4FDE +:104C1000C080D180E280F380EE89FF89E05EFD4FA5 +:104C20004080518062807380EE89FF89E85FFD4F8C +:104C30002081318142815381F801268F378F40A333 +:104C400051A342A253A264A275A2C6A2D7A2E0A613 +:104C5000F1A62A893B894C895D8922A733A744A7FD +:104C600055A72E853F854889598926A737A740AB88 +:104C700051ABA2ABB3AB338E248E2985258F30E4A4 +:104C8000C32ED12CE12CF12CD801C6AAD7AAE0AEB4 +:104C9000F1AEEA85D496EC93D497FC81D596FC933B +:104CA000D5972885DA962C93DA97DB966D937D93CA +:104CB0008D939C93DE97E981DF96EC93DF971B96AB +:104CC0008D919C918633910509F0A4C182E490E115 +:104CD000EE89FF89F39591838083EE89FF89EE5FEA +:104CE000FE4F1182108280E490E1EE89FF89E85F37 +:104CF000FE4F91838083EE89FF89E65FFE4F11822C +:104D00001082D80151968D919C914A97E1F48EE3DF +:104D100090E1EE89FF89EC5FFE4F91838083EE89FD +:104D2000FF89EA5FFE4F118210828CE390E1EE89E9 +:104D3000FF89E45FFE4F91838083EE89FF89E25F04 +:104D4000FE4F11821082EE88FF88B0EFEB1ABEEFA3 +:104D5000FB0AEE89FF89EF5AFD4F20812983EE89F6 +:104D6000FF89E55BFD4F6081718182819381A5019F +:104D700094010E941D536083718382839383EE8923 +:104D8000FF89E35AFD4F30813887EE89FF89EA5960 +:104D9000FD4F3080EE89FF89E95AFD4F40814987F8 +:104DA000EE89FF89E65AFD4F2080EE89FF89ED5993 +:104DB000FD4FC080EE89FF89E05AFD4FD080EE891B +:104DC000FF89EE5BFD4FB081EE89FF89ED5FFD4FFE +:104DD000A081EE89FF89E159FD4F80809180A280FA +:104DE000B3808C829D82AE82BF82EE89FF89E45CB3 +:104DF000FD4F20813181428153812E873F87488B2F +:104E0000598BEE89FF89E05DFD4F408051806280C3 +:104E10007380EE89FF89EC5DFD4F208131814281F5 +:104E20005381EE89FF89E45FFD4F80809180A280ED +:104E3000B380F701868E978EA0A2B1A222A333A3DE +:104E400044A355A346A257A260A671A68E849F8450 +:104E5000A888B98882A693A6A4A6B5A68C809D80B2 +:104E6000AE80BF8086A697A6A0AAB1AAA2ABB3AB1C +:104E7000D38EC48E358E20E4822E912CA12CB12CA1 +:104E8000D70186AA97AAA0AEB1AE24AAE985D59685 +:104E9000EC93D597F885DA96FC93DA97DB966D93C9 +:104EA0007D938D939C93DE97E981DF96EC93DF975A +:104EB0001B968D919C918633910509F0D1C082E4B7 +:104EC00090E1EE89FF89E058FE4F91838083EE895F +:104ED000FF89EE57FE4F1182108280E490E1EE8947 +:104EE000FF89E857FE4F91838083EE89FF89E6575B +:104EF000FE4F11821082D70151968D919C914A9755 +:104F0000E1F48EE390E1EE89FF89EC57FE4F918347 +:104F10008083EE89FF89EA57FE4F118210828CE36D +:104F200090E1EE89FF89E457FE4F91838083EE89FB +:104F3000FF89E257FE4F11821082EE89FF89EE5AF7 +:104F4000FD4F8081882309F4B3C08A819B810E9430 +:104F5000CD10EE89FF89ED5AFD4F8081882309F439 +:104F6000ACC0C8010E94CD100E891F890C5A1D4F7C +:104F7000D8018C91882309F4A4C0C70167960FB6A5 +:104F8000F894DEBF0FBECDBFDF91CF911F910F917F +:104F9000FF90EF90DF90CF90BF90AF909F908F9059 +:104FA0007F906F905F904F903F902F900C94CD101A +:104FB0008C339105D9F48AE390E1EE89FF89E058BA +:104FC000FF4F91838083EE89FF89EE57FF4F118257 +:104FD000108288E390E1EE89FF89E857FF4F9183C3 +:104FE0008083EE89FF89E657FF4F8ECD8E9709F0BB +:104FF0008DCD82E390E1EE89FF89E058FF4F9183E8 +:105000008083EE89FF89EE57FF4F118210828CE278 +:1050100090E1E1CF8C33910581F48AE390E1EE8950 +:10502000FF89F39591838083EE89FF89EE5FFE4FC0 +:105030001182108288E390E158CE8E9709F061CEFC +:1050400082E390E1EE89FF89F39591838083EE8975 +:10505000FF89EE5FFE4F118210828CE290E145CE17 +:105060008C33910589F48AE390E1EE89FF89E05859 +:10507000FE4F91838083EE89FF89EE57FE4F1182A8 +:10508000108288E390E12BCF8E9709F034CF82E332 +:1050900090E1EE89FF89E058FE4F91838083EE898D +:1050A000FF89EE57FE4F118210828CE290E117CFFC +:1050B0008A819B810E94BB104CCFC8010E94BB100B +:1050C00053CFC70167960FB6F894DEBF0FBECDBFB2 +:1050D000DF91CF911F910F91FF90EF90DF90CF90D4 +:1050E000BF90AF909F908F907F906F905F904F9008 +:1050F0003F902F900C94BB10AF92BF92CF92DF9253 +:10510000EF92FF920F931F93CF93DF93EC018AE10D +:1051100090E09C8F8B8F8BE190E09E8F8D8F89E14B +:1051200090E098A38F8F8FE090E09AA389A38EE1FF +:1051300090E09CA38BA38EE090E09EA38DA385E4DA +:1051400090E098A78FA384E490E09AA789A7FE0136 +:10515000E057FF4F80E290E09487838781E290E000 +:10516000968785878FE190E0908B8787128A118AD6 +:10517000148A138A168A158A83E490E0908F878BAD +:1051800082E490E0928F818FE058FF4F83E290E0BD +:105190009487838784E290E09687858782E290E017 +:1051A000908B8787128A118A148A138A168A158A25 +:1051B00081E490E0908F878B80E490E0928F818FE4 +:1051C000E551FF4F11821082329611821082329681 +:1051D00011821082CE010E94E920CE010E940C1F94 +:1051E000CE0180579E4F41E050E0FC01558F448F27 +:1051F000DE01A255BE4F24E030E05D963C932E9335 +:105200005C975E01F4E3AF1AFEEFBF0A28E030E0DE +:10521000F501358F248F20E130E0FC0131832083BC +:1052200021E130E0358324832FEF3FEF3383228366 +:1052300037832683628560876385618767E170E0D5 +:1052400011967C936E9368E170E015967C936E9353 +:10525000149713963C932E93129717963C932E9384 +:1052600016971A966C911A9718966C9318971B9626 +:105270006C911B9719966C9319976DE170E0F5018D +:10528000718360836CE170E0758364833383228370 +:10529000378326836285608763856187BE016A5292 +:1052A0007D4FFB01608171818E010C531D4FF80110 +:1052B000C080D180E280F38006501109F80100819E +:1052C0001181FC01118F008FC48AD58AE68AF78A82 +:1052D0006130710509F04EC0338F228FCE018852A4 +:1052E0009D4FFC01808191819E0128533D4FF90122 +:1052F000408151816281738128503109F9012081F7 +:10530000318159963C932E93589754964D935D93C3 +:105310006D937C935797019781F58FEF9FEF5B9685 +:105320009C938E935A97DE01A652BD4F8D919C910E +:1053300011971E974D915D916D917C91CE53DD4FEC +:1053400028813981F501318F208F448B558B668BF5 +:10535000778B0197A9F48FEF9FEF938F828FDF9167 +:10536000CF911F910F91FF90EF90DF90CF90BF9062 +:10537000AF900895538F428FB1CF81E090E0CFCFAF +:1053800081E090E0EACFCF92DF92EF92FF920F930D +:105390001F93CF93DF937C016B018A01E9010E9487 +:1053A000991EF601EE0FFF1FEE0FFF1FE052F84FA0 +:1053B00080819181F701918380830E94991E000F63 +:1053C000111F000F111FF801E052F84F81E04081DA +:1053D000518162817381413051056105710509F088 +:1053E00080E0F70182870E94991ECC0FDD1FCC0F51 +:1053F000DD1FC052D84F88819981AA81BB81F701F6 +:1054000082839383A483B5831682178210861186C4 +:10541000DF91CF911F910F91FF90EF90DF90CF9090 +:105420000895CF93DF93EC012AEC30E04BEC50E091 +:1054300069EC70E0A8DF2EEC30E04FEC50E06DEC52 +:1054400070E0CE010C969FDF24ED30E045ED50E09A +:1054500063ED70E0CE01489696DF28ED30E049ED2F +:1054600050E067ED70E0CE0184968DDF2EED30E0E8 +:105470004FED50E06DED70E0CE01C096DF91CF9121 +:1054800082CFCF93DF9380911C0790911D07892BCA +:10549000A1F48CE390E00E940F4BEC01198218827A +:1054A0001D861C86198E188E1DA21CA219AA18AA68 +:1054B000B8DFD0931D07C0931C0780911C07909103 +:1054C0001D07DF91CF910895CF92DF92EF92FF9267 +:1054D0000F931F93CF93DF938B010E94991EEC01D2 +:1054E000F801C2A0D3A0E4A0F5A0068D178D8A8193 +:1054F0009B818F30F7E29F074CF501969B838A834F +:10550000C8010E945207882321F1F801EE0FFF1F06 +:10551000EE0FFF1FE052F84FC082D182E282F38289 +:10552000B701A601C8010E94CC1DB801CE010E949E +:10553000F11AA7DF76DF90E080E0DF91CF911F9135 +:105540000F91FF90EF90DF90CF9008951B821A8209 +:10555000D7CF8AEB93E00E948417EBCFCF93DF93F2 +:10556000EB010E94991E6E8D7F8D0E94F11A90E0D2 +:1055700080E0DF91CF9108950F931F93CF93DF9336 +:105580000E94991E8C01D0E0C0E0CE010E9452071B +:10559000882321F0BE01C8010E94F11A2196C13E64 +:1055A000D10599F784E194E00E9484170E9489163E +:1055B0000E948D1790E080E0DF91CF911F910F91B5 +:1055C00008950F931F93CF93DF93EC018881998106 +:1055D000009759F02A813B812617370730F081E088 +:1055E000DF91CF911F910F9108958B016F5F7F4FD6 +:1055F0000E944053009759F0998388831B830A8344 +:105600002C813D81232B59F7FC011082E8CF80E0EB +:10561000E7CF0F931F93CF93DF93EC018B01D1DF83 +:1056200028813981811112C02115310519F0C90174 +:105630000E94AB4B198218821D821C821B821A8227 +:10564000CE01DF91CF911F910F9108951D830C839F +:1056500062E676E0C9010E943154F2CFFC0111826A +:105660001082138212821582148270E060E0D1CF22 +:105670002F923F924F925F926F927F928F929F9262 +:10568000AF92BF92CF92DF92EF92FF920F931F9350 +:10569000CF93DF93CDB7DEB7C058D1090FB6F894DA +:1056A000DEBF0FBECDBF8C01FC01108211821282C1 +:1056B0001382148215821682178210861186128632 +:1056C000138614861586168617864C01F0E18F0E18 +:1056D000911CC4010E94B212580180E9A80EB11CAD +:1056E000C5010E94B2126801E0EFCE1AEEEFDE0AA9 +:1056F000C6010E94B2127801F0E7EF1AFEEFFF0A2E +:10570000C7010E94E80F380182E5681A8EEF780A17 +:10571000C3010E94E80F2801E4E34E1AEEEF5E0A8F +:10572000C2010E94E80FC80186519E4F97DFF80121 +:10573000E051FE4F11821082329611821082329611 +:105740001182108232961182108232961082319626 +:105750001082319610823196118210823296118217 +:105760001082329611821082329610823196108207 +:1057700031961082319610821182128213823496F1 +:105780001082118212821382349610821182128248 +:105790001382349610821182128213823496108200 +:1057A0001182128213823496108211821282138225 +:1057B00034961082118212821382349610821182E2 +:1057C00012821382349610821182128213823496CE +:1057D00010821182128213823496108211821282F8 +:1057E00013823496108211821282138234961082B0 +:1057F00011821282138234961082118212821382D5 +:10580000349610821182128213823496108231965D +:105810001082319610823196108211821282138288 +:105820003496108211821282138234961082118271 +:105830001282138234961082319610823196108231 +:1058400031961082319610823196108231961082F4 +:1058500031961082319610823196108231961082E4 +:1058600031961082319610823196108231961082D4 +:1058700031961082319610823196108231961082C4 +:1058800031961082319610823196108231961082B4 +:1058900031961082319610821182128213823496D0 +:1058A0001082118212821382349610821182128227 +:1058B0001382D801AD58BD4F8CE0E1E1F2E00190D8 +:1058C0000D928A95E1F7F801E158FD4F108211829F +:1058D00012821382349610821182128213823496BD +:1058E00010821182128213823496118210823296B3 +:1058F00011821082329611821082329610821182A9 +:10590000128213823496108211821282138234968C +:1059100010821182128213823496108211821282B6 +:10592000138234961082118212821382349610826E +:105930001182128213823496118210823296118261 +:105940001082329611821082329610821182128257 +:10595000138234961082118212821382349610823E +:1059600011821282138234961082319610823196FF +:1059700010823196118210823296118210823296F4 +:105980001182108232961082118212821382349612 +:105990001082118212821382349610821182128236 +:1059A00013823496118210823296118210823296BE +:1059B00011821082329611821082329611821082E8 +:1059C00032961182108232961182108232961182A2 +:1059D00010821801F0E22F1AFDEF3F0AF101108248 +:1059E000CE0101960E94B21280E8FE013196D401E8 +:1059F00001900D928A95E1F7CE0101960E94B212B4 +:105A000080E8FE013196D50101900D928A95E1F76B +:105A1000CE0101960E94B21280E8FE013196D601B5 +:105A200001900D928A95E1F788E5F801848BEC5698 +:105A3000FF4F89E58083E058FF4F8AE58083CE01E0 +:105A400001960E94E80F8EE1FE013196D701019088 +:105A50000D928A95E1F7CE0101960E94E80F8EE142 +:105A6000FE013196D30101900D928A95E1F7CE01A6 +:105A700001960E94E80F8EE1FE013196D20101905D +:105A80000D928A95E1F7C80137DBF1011082C05809 +:105A9000DF4F0FB6F894DEBF0FBECDBFDF91CF91C1 +:105AA0001F910F91FF90EF90DF90CF90BF90AF903C +:105AB0009F908F907F906F905F904F903F902F902E +:105AC0000895CF93DF938091200790912107892B30 +:105AD00051F481EE92E00E940F4BEC01C9DDD093AE +:105AE0002107C09320078091200790912107DF9123 +:105AF000CF910895CF93DF93EB0120E030E040E8B1 +:105B00005FE36A817B818C819D810E948850811135 +:105B10000CC088E194E00E948417D3DF8C5A9F4F19 +:105B2000FC01108211821282138220E030E040E8F2 +:105B30005FE36E817F81888599850E9488508111FD +:105B40000CC088E294E00E948417BBDF8C529F4F08 +:105B5000FC01108211821282138220E030E040E8C2 +:105B60005FE36A857B858C859D850E9488508111C5 +:105B70000CC088E394E00E948417A3DF8C5A9E4FE8 +:105B8000FC0110821182128213820E9489160E94E7 +:105B90008D1790E080E0DF91CF910895CF93DF9350 +:105BA000FC01E251FE4F408151814115510501F147 +:105BB000EC01CE50DE4F2881398186519E4F24174B +:105BC0003507E8F4FC01808191810097A1F0820FF4 +:105BD000931FFC0180818A3031F08D3069F480E6BA +:105BE00096E00E9484178881998101969983888321 +:105BF000DF91CF91089580E00E94C408F4CF70E057 +:105C000060E007DD19821882F3CFEF92FF920F93C5 +:105C10001F93CF93DF936115710541F480E0DF910D +:105C2000CF911F910F91FF90EF900895411551056D +:105C3000A9F07B01EC010C811D81040F151FB80137 +:105C4000C0DC882359F3288139818C819D81B7017B +:105C5000820F931F0E9431541D830C8381E0DFCF9C +:105C6000EF92FF920F931F93CF93DF93CDB7DEB7E1 +:105C700064970FB6F894DEBF0FBECDBF7C01CB0199 +:105C8000BA018E010F5F1F4F22E044E00E94F24AEA +:105C9000FC0101900020E9F73197AF01481B590B37 +:105CA000BC01C701B2DF64960FB6F894DEBF0FBE29 +:105CB000CDBFDF91CF911F910F91FF90EF9008958D +:105CC000FB0101900020E9F73197AF01461B570B0C +:105CD0009CCFEF92FF920F931F93CF93DF93CDB79B +:105CE000DEB72E970FB6F894DEBF0FBECDBF8C0186 +:105CF000FC0111821082138212821582148270E0DC +:105D000060E087DC66E773E0C801DADF6091730B5F +:105D10007091740B8091750B9091760B2AE0AE0117 +:105D20004F5F5F4F7A010E946B4CF701019000209A +:105D3000E9F73197AF014E195F09B701C80165DF77 +:105D400060E676E0C801BCDFC8012E960FB6F89475 +:105D5000DEBF0FBECDBFDF91CF911F910F91FF909E +:105D6000EF900895FB0144815581608171814DCF91 +:105D7000CF92DF92EF92FF920F931F93CF93DF9317 +:105D800000D000D01F921F92CDB7DEB78B016A0101 +:105D900086519E4F7C016AE272E092DF6FED73E004 +:105DA000C7018EDFF801848189831A8241E050E0C7 +:105DB0008E010F5F1F4FB801C70127DF4AE0B8010E +:105DC000C6010E94614CF80101900020E9F731976B +:105DD000AF01401B510BB801C70117DF0E948916A4 +:105DE000C80177DFB801C701BDDF89819A810E94B0 +:105DF000AB4B28960FB6F894DEBF0FBECDBFDF9138 +:105E0000CF911F910F91FF90EF90DF90CF90089569 +:105E10002F923F924F925F926F927F928F929F92BA +:105E2000AF92BF92CF92DF92EF92FF920F931F93A8 +:105E3000CF93DF93CDB7DEB76D970FB6F894DEBF83 +:105E40000FBECDBF8C017B876A870E94E920C80105 +:105E50000E940C1F0E94FF160E945E1B2A853B8534 +:105E6000A8012130310509F45BC02230310509F465 +:105E70007DC0405F5F4F5D8F4C8FC80180579E4F44 +:105E80009F838E83F801E25AFD4F90819B83B196E8 +:105E9000FA83E983980127553D4F3D872C87455567 +:105EA0005D4F5D8B4C8BC80185509E4F9D838C83CD +:105EB000EDE8F0E0FB8BEA8B25E130E039872887BD +:105EC0008C8D9D8D0E947C10882309F475C088E418 +:105ED00094E00E9484170E94891681E090E09093DC +:105EE0005C0780935B0722242394312CC1016D96BB +:105EF0000FB6F894DEBF0FBECDBFDF91CF911F91DB +:105F00000F91FF90EF90DF90CF90BF90AF909F9058 +:105F10008F907F906F905F904F903F902F9008955B +:105F200040575F4F5D8F4C8FC80182559E4F9F83B6 +:105F30008E83F801E15AFD4F90819B83B496FA83DA +:105F4000E983980125553D4F3D872C87445D5D4F82 +:105F50005D8B4C8BC80183509E4F9D838C83EEE8F4 +:105F6000F0E0FB8BEA8B26E130E0A8CF405F5E4F8C +:105F70005D8F4C8FC80184539E4F9F838E83F801A1 +:105F8000E05AFD4F90819B83B796FA83E98398018D +:105F900023553D4F3D872C8743555E4F5D8B4C8B82 +:105FA000C80181509E4F9D838C83EFE8F0E0FB8B0E +:105FB000EA8B27E130E082CF8C8D9D8D0E946D10A1 +:105FC000811185CF81E893E00E9484178EE794E0E9 +:105FD0000E948417EC8DFD8D84810E94C40885E8A1 +:105FE00094E00E94841780E696E00E94841781E086 +:105FF00090E0EC81FD819183808341E050E06C8DE5 +:106000007D8DC801B5DE8C8D9D8D0E94CD10EC8DEF +:10601000FD8D82A9EA59FF4F7F01882309F48EC0C4 +:106020008C8D9D8D0E94A31081E0F70180838E816D +:106030009F810E94B60FEC8DFD8DEC5BFF4F60835E +:10604000718382839383E981FA81108211821282A3 +:106050001382F801E158FD4F1082118212821382DF +:106060003496108211821282138234961082118229 +:106070001282138286E090E0EC81FD81918380831F +:1060800046E050E06C8D7D8DC80172DE61E070E00D +:106090008C8D9D8D0E949C178A849B84880C991CF2 +:1060A000880C991CC40181559D4F9801280F391FF8 +:1060B0003F8B2E8B4E97A801480F591F598F488F41 +:1060C0004297F801E80FF91FFB8FEA8FC12CD12C02 +:1060D0007601C3945801A80CB91CF8EDAF1AFDEF76 +:1060E000BF0A50E5452E53EC552E612C712C2E899C +:1060F0003F89488D598D6A8D7B8D8C8D9D8D0E9439 +:10610000450D8DE79BE00E94410818161906ECF03A +:106110001E86312C212C8C8D9D8D0E947C10882315 +:1061200099F189EB94E00E9484178C8D9D8D0E94DB +:106130006D10811101C08B818B8389C08C8D9D8DE9 +:106140000E948B10F701108272CF8DE79BE00E94B6 +:106150001F088F7D85349105D9F684EA94E00E946A +:1061600084170E94891621E0FC01248786E592E0CD +:106170000E9484170E9489160E948D17222423945E +:10618000312C31E03E87C7CF8C8D9D8D0E946D10E4 +:106190008111C7CF4E854111C4CFEC85FD8560814B +:1061A0007181072E000C880B990B0E948E509B0169 +:1061B000AC01E981FA8160817181828193810E94C1 +:1061C000885087FFAECF8C8D9D8D0E947711F50191 +:1061D0002081318142815381C301B2010E94BA51B1 +:1061E000C9010E940F0AF50120813181428153814A +:1061F000A3E0B0E00E94D6519B01AC01C701B601FB +:106200000E94BA51672B682B692B41F482E592E01A +:106210000E9484170E9489160E948D178C8D9D8D77 +:106220000E945410F5012081318142815381C301C4 +:10623000B2010E94BA51C9010E940F0AFFEFCF1AA2 +:10624000DF0AEF0AFF0A2114310409F450CF62E09B +:1062500070E08C8D9D8D0E949C1781E893E00E94D8 +:1062600084178EE794E00E948417EC8DFD8D848165 +:106270000E94C4088DEC94E00E94841780E696E0AA +:106280000E9484172114310409F580EE94E00E94E5 +:1062900084178FED93E00E9484178DE793E00E94AE +:1062A0008417888599850E947F178FED93E00E945F +:1062B00084178FE793E00E948417FB818F2F90E073 +:1062C0000E947F170E9489160E948D170E94FF1658 +:1062D0000E945E1B81E893E00E9484178EE794E0A1 +:1062E0000E948417EC8DFD8D84810E94C40884EE89 +:1062F00094E00E94841780E696E00E948417E9816A +:10630000FA811082118212821382EC8DFD8D82A996 +:10631000EA59FF4F7F01882309F407C18C8D9D8DB9 +:106320000E948B10F70110828E819F810E94B60F10 +:10633000EC8DFD8DEC5BFF4F6083718382839383D3 +:10634000F801E158FD4F10821182128213823496B7 +:10635000108211821282138234961082118212826C +:1063600013828E819F810E94B60F6E877F87888BF4 +:10637000998BC12CD12C7601800E911EF8ED8F1ACD +:10638000FDEF9F0A90E5492E93EC592E612C712C5C +:1063900056012114310459F52E893F89488D598DB4 +:1063A0006A8D7B8D8C8D9D8D0E94450D8DE79BE0C8 +:1063B0000E944108181619060CF4BFC018864AE05E +:1063C000A416B10434F4E981FA8110821182128298 +:1063D0001382FB818C8D9D8DF11152C10E946D1035 +:1063E000882309F4CAC089EB94E00E94841781E8ED +:1063F00093E00E9484178EE794E00E948417EC8D4E +:10640000FD8D84810E94C40886E095E00E94841777 +:1064100080E696E00E9484178E819F810E94B60FCD +:106420002C893D89232BA1F0DC01CB012E853F85F2 +:1064300048895989821B930BA40BB50BB7FF07C082 +:10644000B095A095909581959F4FAF4FBF4F5C0140 +:106450006501BB0CEE08FF082114310419F580EE2C +:1064600094E00E9484178FED93E00E9484178DE7DB +:1064700093E00E9484178A899B890E947F178FED81 +:1064800093E00E9484178FE793E00E948417C7016E +:10649000B6010E948E5042E00E94821B0E94891623 +:1064A0000E948D1785E090E0EC81FD8191838083CF +:1064B00045E050E06C8D7D8DC8015ADC8C8D9D8D42 +:1064C0000E94BB100E94FF160E945E1B2A853B851E +:1064D0002130310509F4BEC02230310509F4C5C0B0 +:1064E0000E948916C0925D07D0925E07E0925F0716 +:1064F000F09260070E9489160E94FE1CEC81FD81CB +:106500001182108250E040E06C8D7D8DC80130DC3E +:1065100070E060E08C8D9D8D0E949C170E94891612 +:1065200030925C0720925B07E1CC8C8D9D8D0E94A0 +:10653000A31081E0F7018083F7CE8DE79BE00E94F6 +:106540001F088F7D8534910509F038CF84EA94E0E7 +:106550000E9484170E94891621E0FC01248786E5A9 +:1065600092E00E9484170E9489160E948D172224AF +:106570002394312C31E0388722CF2885211133CF65 +:10658000EC85FD8560817181072E000C880B990BCD +:106590000E948E509B01AC01E981FA81608171817A +:1065A000828193810E94885087FF1DCF8C8D9D8DA5 +:1065B0000E9477115601FFEFAF1ABF0AF401208144 +:1065C000318142815381C301B2010E94BA51C90194 +:1065D0000E940F0AFFEFCF1ADF0AEF0AFF0AF40149 +:1065E0002081318142815381A3E0B0E00E94D651E5 +:1065F0009B01AC01C701B6010E94BA51672B682B01 +:10660000692BB9F482E592E00E9484170E948916F2 +:106610000E948D1781E893E00E94841788EF94E030 +:106620000E948417C5010E947F1780E696E00E94B1 +:1066300084178C8D9D8D0E945410F401208131812E +:1066400042815381C301B2010E94BA51C9010E9423 +:106650000F0A9ECE0E948916C0926107D0926207EF +:10666000E0926307F092640745CF0E948916C092BA +:106670006507D0926607E0926707F09268073ACF05 +:106680000E947C10ADCEFA01DB01A759BF4F2C91BF +:10669000222331F122E030E0DB01A559BF4F4C91BC +:1066A000442311F023E030E0DB01A659BF4F4C91A9 +:1066B000442311F024E030E0DB01A459BF4F4C919A +:1066C000442311F026E030E0408151814217530706 +:1066D00061F0121613063CF431832083A90148CBE4 +:1066E00030E020E0D9CF1182108208952F923F929E +:1066F0004F925F926F927F928F929F92AF92BF92D2 +:10670000CF92DF92EF92FF920F931F93CF93DF937D +:10671000CDB7DEB7EC970FB6F894DEBF0FBECDBF96 +:106720001C012A013B010B871C872D873E8764963D +:106730000EAD1FAD6497FC01ED58FD4F6081718176 +:10674000828193810E948E50A30192010E94ED509C +:106750000E94E4526B8F7C8F8D8F9E8FF101E958E0 +:10676000FD4F60817181828193810E948E502B85C3 +:106770003C854D855E850E94ED500E94E4526BA3DE +:106780007CA38DA39EA3F101E558FD4F608171812B +:10679000828193810E948E50A70196010E94ED5044 +:1067A0000E94E4526FA378A789A79AA70E94700A53 +:1067B0006B877C878D879E87F101EC50FE4F11829D +:1067C00010823296118210823E96A114B10461F0BB +:1067D000C501B0E0A0E040815181628173818417DE +:1067E0009507A607B70714F0A080B180F101E85F14 +:1067F000FD4F80819181A281B3818114910441F088 +:10680000A40170E060E0481759076A077B070CF0A5 +:106810004C01F101E45FFD4F80819181A281B38140 +:106820000115110541F0A80170E060E04817590713 +:106830006A077B070CF08C01210120E1420E511CFC +:10684000C501B0E0A0E0F10186A797A7A0ABB1AB6E +:106850003101F0E96F0E711CB12CA12CD3015E96B1 +:106860008D929D92AD92BC9291974101B0EF8B1A9F +:10687000BEEF9B0A30E020E0F401068F178F20A3C3 +:1068800031A30E9489160E9489160E9489160E94CF +:10689000891620915D0730915E0740915F07509106 +:1068A00060072B8B3C8B4D8B5E8B0E9489168091F1 +:1068B000610790916207A0916307B09164078F8789 +:1068C000988BA98BBA8B0E948916A0906507B0900F +:1068D0006607C0906707D0906807F101E158FD4F47 +:1068E00010821182128213823496108211821282D7 +:1068F000138234961082118212821382349611828E +:106900001082329611821082329611821082329653 +:106910002B893C894D895E8920833183428353834F +:1069200034968F859889A989BA8980839183A283B7 +:10693000B3833496A082B182C282D3826596EFACD3 +:1069400065970B8D1C8D2D8D3E8D4B895C896D89D6 +:106950007E89C2010E94E0108823F9F08EE492E063 +:106960000E94841785E294E00E948417F101E85A9E +:10697000FF4F6081718182819381E55EFD4F2081AF +:106980003181428153810E94BA51CA01B9010E94EA +:1069900057170E9489160E948D176696EFAC66976E +:1069A0000BA11CA12DA13EA14F85588969897A8927 +:1069B000C3010E94E0108823F9F08AE492E00E946B +:1069C000841785E394E00E948417F101E852FF4F99 +:1069D0006081718182819381E156FE4F20813181F6 +:1069E000428153810E94BA51CA01B9010E945717CE +:1069F0000E9489160E948D176796EFAC67970FA1CA +:106A000018A529A53AA5B601A501C4010E94E01068 +:106A10008823F9F086E492E00E94841785E494E0EC +:106A20000E948417F101E85AFE4F608171818281D2 +:106A30009381ED5DFE4F20813181428153810E941F +:106A4000BA51CA01B9010E9457170E9489160E94C3 +:106A50008D17D10155961C92F101EB56FF4F108214 +:106A6000E058FF4F10820E94FF160E945E1BC20179 +:106A70000E949112C3010E949112C4010E949112BE +:106A8000F101E550FE4FF8A7EFA381E090E091837C +:106A900080837101F3E0EF1AFEEFFF0AD7018D93B7 +:106AA0009C93810101501E4FF8019183808341E046 +:106AB00050E0B201C1015CD9D7014D915C91B301A5 +:106AC000C10156D9F80140815181B401C10150D9A9 +:106AD00011E0F101E052FD4F1083C2010E94CD1080 +:106AE000C3010E94CD10C4010E94CD1064E670E085 +:106AF00080E090E00E943F0AC10188509E4FDC0177 +:106B00001C9311961C93A10146505E4FFA0110830D +:106B10006596FFAD6597F1110FC066962FAD66972C +:106B2000211105C067963FAD6797332339F1910175 +:106B30002B583F4FF90110826696FFAD6697F11111 +:106B400005C091012B503F4FF90110826796FFADB0 +:106B50006797F11105C091012B583E4FF901108242 +:106B600065962FAD6597FC01208366963FAD6697CD +:106B70003C936796EFAD6797DA01EC93C2010E94F0 +:106B80006B18C3010E946B18C4010E946B18C201EC +:106B90000E94D611C3010E94D611C4010E94D611D1 +:106BA0000E948916DC011C968C918F87B12CA12C38 +:106BB000F101E850FE4FFC8BEB8B910127503E4FCB +:106BC0003C8F2B8FA10146505E4F5CA34BA3C101AC +:106BD00085509E4F9CAB8BABD101A350BE4FBEAB3B +:106BE000ADAB3796F8AFEFAB2158314038AB2FA79C +:106BF0004B545F4F5AAF49AF8A569F4F9CAF8BAFF4 +:106C0000AE57BF4FBAABA9ABEB89FC89808181112C +:106C10000AC0AB8DBC8D8C91811105C0EBA1FCA18C +:106C20008081882319F0FF85FF2369F081010251DB +:106C30001E4FF80180819181892B09F45BC4C10149 +:106C40000E94CE2DF6CFD10150968D919C918C0152 +:106C50000E591F4FF8011082118212821382A8016F +:106C600063E70E943E0CD801CD90DD90ED90FC9042 +:106C7000C114D10499F081E893E00E94841784E163 +:106C800095E00E948417C701B601882799274AE03A +:106C90000E94141780E696E00E9484174BA95CA915 +:106CA000B201C101F0DC4DA95EA9B301C101EBDC69 +:106CB0004FA958ADB401C101E6DCC2010E943E12E9 +:106CC000C3010E943E12C4010E943E12EFA5F8A922 +:106CD0008081882379F0C2010E946B1829AD3AADFA +:106CE0004BAD5CAD69A97AA9C2010E94450DAFA563 +:106CF000B8A91C92810108501F4FF8018081882398 +:106D000089F0C3010E946B1891012D543D4FA101E0 +:106D10004B565D4FB1016D577D4FC3010E94450D2C +:106D2000D8011C92810108581E4FF80180818823E8 +:106D300089F0C4010E946B18910129543D4FA101B3 +:106D400047565D4FB10169577D4FC4010E94450D03 +:106D5000D8011C9281010B581F4FF80180818823B4 +:106D6000B1F1EC5CFD4F60817181072E000C880B46 +:106D7000990B0E948E509B01AC01A9A9BAA96D91F3 +:106D80007D918D919C910E941553181604F5F80180 +:106D9000108261E873E00B581E4FC8010E94602EFC +:106DA00060E275E0C8010E94602E60E676E0C801EE +:106DB0000E94602E6596FFAD6597FF2309F434C1EC +:106DC000F101EC5AFF4F108211821282138281016D +:106DD0000B501F4FD8018C918823C1F1F101E5556B +:106DE000FD4F60817181072E000C880B990B0E946A +:106DF0008E509B01AC01F101ED57FD4F6081718117 +:106E0000828193810E941553181604F5F8011082AF +:106E100061E873E00B501F4FC8010E94602E68E4C8 +:106E200075E0C8010E94602E60E676E0C8010E940D +:106E3000602E6696FFAD6697FF2309F4F9C0F10155 +:106E4000EC52FF4F108211821282138281010B5883 +:106E50001E4FD8018C918823C1F1F101E355FD4FFC +:106E600060817181072E000C880B990B0E948E5057 +:106E70009B01AC01F101E957FD4F60817181828175 +:106E800093810E941553181604F5F801108261E8E9 +:106E900073E00B581F4FC8010E94602E60E775E039 +:106EA000C8010E94602E60E676E0C8010E94602E54 +:106EB0006796FFAD6797FF2309F4BEC0F101EC5A56 +:106EC000FE4F108211821282138260E0C2010E9482 +:106ED0005B11882339F0F101EC5AFF4F10821182C7 +:106EE0001282138260E0C3010E945B11882339F093 +:106EF000F101EC52FF4F108211821282138260E086 +:106F0000C4010E945B11882339F0F101EC5AFE4F55 +:106F10001082118212821382F101EB58FF4F80819F +:106F2000AB89BC898C93E058FF4F8081EB8DFC8D41 +:106F30008083F101EB58FE4F8081ABA1BCA18C9303 +:106F4000E152F14020813181428153812BA73CA73E +:106F50004DA75EA7E058FF4F80819181A281B38148 +:106F60008F839887A987BA87E058FF4FC080D18068 +:106F7000E280F3800E9489162BA53CA54DA55EA555 +:106F800020935D0730935E0740935F07509360073F +:106F90000E9489168F819885A985BA85809361079B +:106FA00090936207A0936307B09364070E948916C9 +:106FB000C0926507D0926607E0926707F092680773 +:106FC0000E94FF16AB89BC898C91882309F46AC0A2 +:106FD0000E94700A2B853C854D855E85621773077C +:106FE0008407950768F50E94700A2B853C854D85BE +:106FF0005E85621773078407950708F053C00E94E7 +:10700000700A6B017C01F101E959FD4F208131814A +:1070100042815381A8EEB3E00E94D6516C157D05E4 +:107020008E059F0550F13EC0AA24A394B12CCFCE6B +:10703000AA24A394B12C0ACFAA24A394B12C45CF9F +:107040000E94700A6B017C012B853C854D855E8515 +:10705000C21AD30AE40AF50AF101E959FD4F208169 +:10706000318142815381A8EEB3E00E94D6516C1564 +:107070007D058E059F0508F0B6CF62E472E08101C0 +:1070800006511E4FC8010E94602E60E676E0C801DE +:107090000E94602E68E975E0C8010E94602E32E00F +:1070A000A32EB12CAB8DBC8D8C91882309F45DC0CF +:1070B0000E94700A2B853C854D855E85621773079B +:1070C0008407950708F50E94700A2B853C854D853D +:1070D0005E85621773078407950708F046C00E9413 +:1070E000700A6B017C01F101E559FD4F208131816E +:1070F00042815381A8EEB3E00E94D6516C157D0504 +:107100008E059F05E8F031C00E94700A6B017C017A +:107110002B853C854D855E85C21AD30AE40AF50AA3 +:10712000F101E559FD4F2081318142815381A8EE63 +:10713000B3E00E94D6516C157D058E059F0518F6AB +:107140006EE372E0810106511E4FC8010E94602E5D +:1071500060E676E0C8010E94602E6DEA75E0C80125 +:107160000E94602E22E0A22EB12CABA1BCA18C917A +:10717000882309F45DC00E94700A2B853C854D85EB +:107180005E85621773078407950708F50E94700AE9 +:107190002B853C854D855E856217730784079507AF +:1071A00008F046C00E94700A6B017C01F101E159B0 +:1071B000FD4F2081318142815381A8EEB3E00E94CE +:1071C000D6516C157D058E059F05E8F031C00E94F3 +:1071D000700A6B017C012B853C854D855E85C21A4A +:1071E000D30AE40AF50AF101E159FD4F208131810A +:1071F00042815381A8EEB3E00E94D6516C157D0503 +:107200008E059F0518F66AE372E0810106511E4F54 +:10721000C8010E94602E60E676E0C8010E94602EE0 +:1072200062EC75E0C8010E94602E92E0A92EB12C9C +:107230008DE79BE00E944108181619060CF040C02B +:107240008DE79BE00E941F088F7D85349105C1F575 +:1072500064EA74E0C10186519E4F0E94602E86E56B +:1072600092E00E9484170E9489160E948D17F101F6 +:10727000EB58FF4F1082E058FF4F1082E058FF4F4D +:107280001082AB89BC891C92EB8DFC8D1082ABA166 +:10729000BCA11C92B1E0BF87AA24A394B12C67EDD6 +:1072A00075E0C10186519E4F0E94602EEB89FC89DA +:1072B0001082AB8DBC8D1C92EBA1FCA1108203C08F +:1072C000A114B10461F7C1010E94CE2DF101EA5071 +:1072D000FE4F808191810196918380838D32914010 +:1072E0000CF492CCD101A251BE4F8D919C9111977B +:1072F000892B09F089CC14968D919C91892B09F0EA +:1073000083CC118210823297808191810097A1F005 +:10731000019759F1F101EC50FE4F80819181019666 +:10732000823091050CF0E3C091838083F101EE502F +:10733000FE4F1182108268CC62E572E08101065135 +:107340001E4FC8010E94602E0E948916CE01019630 +:107350000E94692EBE016F5F7F4FC8010E94B22E4E +:1073600089819A810E94AB4BD5CF0E9489168C01EE +:10737000FC0180819181A281B381181619061A0639 +:107380001B0644F081E090E0A0E0B0E080839183B0 +:10739000A283B383F80184819581A681B7811816F1 +:1073A00019061A061B0644F081E090E0A0E0B0E068 +:1073B00084839583A683B783F80180859185A28510 +:1073C000B385181619061A061B0644F081E090E0F2 +:1073D000A0E0B0E080879187A287B387CE010196B5 +:1073E0000E942E2B60E174E0CE0101960E94602E77 +:1073F00065E274E0CE0101960E94602E60915D0707 +:1074000070915E0780915F07909160070E948E5097 +:107410006B017C01D8016D917D918D919C910E94B1 +:107420008E509B01AC01C701B6010E947C52AB019A +:10743000BC01CE0101960E94302E65E374E0CE01BE +:1074400001960E94602E60916107709162078091A1 +:107450006307909164070E948E506B017C01F801D4 +:1074600064817581868197810E948E509B01AC0159 +:10747000C701B6010E947C52AB01BC01CE0101964E +:107480000E94302E65E474E0CE0101960E94602EC9 +:107490006091650770916607809167079091680712 +:1074A0000E948E506B017C01D80118966D917D91E0 +:1074B0008D919C911B970E948E509B01AC01C7013E +:1074C000B6010E947C52AB01BC01CE0101960E9424 +:1074D000302EBE016F5F7F4F810106511E4FC801E4 +:1074E0000E94B22E89819A810E94AB4B2DCF1182CE +:1074F00010821CCF83EE95E00E9484176596FFAD45 +:107500006597FF2379F1A114B104B9F52F852111F5 +:1075100034C086E392E00E9484170E9489160E947C +:107520008D1766963FAD6697332341F082E392E074 +:107530000E9484170E9489160E948D1767968FAD4E +:1075400067978823D1F0A114B104B9F49F859111F4 +:1075500014C08EE292E00E9484170E9489160E9455 +:107560008D170BC066965FAD6697552339F3A1144E +:10757000B10419F44F854423C9F285E090E0AFA12E +:10758000B8A58D939C93810103501E4FF801918300 +:107590008083910121503E4F3C872B87D9018D93E9 +:1075A0009C9345E050E0B201C1010E94B82EF80161 +:1075B00040815181B301C1010E94B82EAB85BC85C9 +:1075C0004D915C91B401C1010E94B82EC1010E948D +:1075D0001B13F101EC5AFF4F20813181428153810D +:1075E0002F8F38A349A35AA3E058FF4F8081918180 +:1075F000A281B3818F8B988FA98FBA8FE058FF4FEC +:10760000C080D180E280F3800E9489162F8D38A13E +:1076100049A15AA120935D0730935E0740935F070D +:10762000509360070E9489168F89988DA98DBA8D15 +:107630008093610790936207A0936307B0936407F8 +:107640000E948916C0926507D0926607E09267078C +:10765000F09268070E94FF160E945E1B0E94891626 +:107660000E94FE1CC1010E94571CAFA1B8A51D922B +:107670001C92F80111821082AB85BC851D921C9270 +:1076800050E040E0B201C1010E94B82EF8014081F3 +:107690005181B301C1010E94B82EAB85BC854D91CB +:1076A0005C91B401C1010E94B82EC1010E941B135C +:1076B000BF85BB2329F00E94891621E0FC012487A5 +:1076C00081EF95E00E948417C5010E947F1780E634 +:1076D00096E00E9484170E948916B0925C07A092DF +:1076E0005B07C501EC960FB6F894DEBF0FBECDBFA9 +:1076F000DF91CF911F910F91FF90EF90DF90CF908E +:10770000BF90AF909F908F907F906F905F904F90C1 +:107710003F902F9008954F925F926F927F928F9239 +:107720009F92AF92BF92CF92DF92EF92FF920F9310 +:107730001F93CF93DF9300D01F92CDB7DEB70E9487 +:10774000991E4090BC085090BD086090BE08709093 +:10775000BF080E94991E8090C0089090C108A09018 +:10776000C208B090C3080E948916C0905D07D090EF +:107770005E07E0905F07F09060070E948916C701DE +:10778000B6010E948E506B017C01C301B2010E94C0 +:107790008E509B01AC01C701B6010E947C522B01A7 +:1077A0003C0160916107709162078091630790913D +:1077B00064070E948E506B017C01C501B4010E94D8 +:1077C0008E509B01AC01C701B6010E947C526983B7 +:1077D0007A838B839C830E94612D1F921F921F923C +:1077E0001F921F92912C812CB12CA12CC12CD12C39 +:1077F000760109811A812B813C81B301A2010E948B +:1078000076330E94612D1F921F921F921F921F922A +:1078100097018601B301A2010E9476330E94612D77 +:107820001F921F921F921F921F929701B701A601EC +:107830000E9476330FB6F894DEBF0FBECDBF90E046 +:1078400080E00F900F900F900F90DF91CF911F91DC +:107850000F91FF90EF90DF90CF90BF90AF909F90EF +:107860008F907F906F905F904F9008958F929F922E +:10787000AF92BF92CF92DF92EF92FF920F931F933E +:10788000CF93DF93EB010E94612D8A889B88AE84A1 +:10789000BF84CA84DB84EC84FD840E811F8128852B +:1078A00039854A815B816C817D811F921F921F9275 +:1078B000EF89EF93EE89EF930E9476330F900F904C +:1078C0000F900F900F9090E080E0DF91CF911F918B +:1078D0000F91FF90EF90DF90CF90BF90AF909F906F +:1078E0008F9008958F929F92AF92BF92CF92DF9226 +:1078F000EF92FF920F931F930E94612D62E070E060 +:107900000E94082F892BD1F40E94612D21E02F9332 +:107910001F921F921F921F92912C812CB12CA12C8F +:10792000C12CD12C760197018601B701A6010E94D6 +:1079300076330F900F900F900F900F9090E080E0B3 +:107940001F910F91FF90EF90DF90CF90BF90AF907D +:107950009F908F9008958F929F92AF92BF92CF92F7 +:10796000DF92EF92FF920F931F930E94612D61E0CF +:1079700070E00E94082F892BD1F40E94612D1F9284 +:1079800021E02F931F921F921F92912C812CB12CDA +:10799000A12CC12CD12C760197018601B701A6013B +:1079A0000E9476330F900F900F900F900F9090E001 +:1079B00080E01F910F91FF90EF90DF90CF90BF90EC +:1079C000AF909F908F9008958F929F92AF92BF92A9 +:1079D000CF92DF92EF92FF920F931F930E94612D3F +:1079E00070E060E00E94082F892BD1F40E94612D85 +:1079F0001F921F9221E02F931F921F92912C812C96 +:107A0000B12CA12CC12CD12C760197018601B70194 +:107A1000A6010E9476330F900F900F900F900F9059 +:107A200090E080E01F910F91FF90EF90DF90CF905A +:107A3000BF90AF909F908F9008958F929F92AF923A +:107A4000BF92CF92DF92EF92FF920F931F930E940B +:107A5000612D21E02F931F921F921F921F92912C54 +:107A6000812CB12CA12CC12CD12C7601970186013F +:107A7000B701A6010E9476330F900F900F900F90E0 +:107A80000F9090E080E01F910F91FF90EF90DF90BA +:107A9000CF90BF90AF909F908F9008958F929F92BC +:107AA000AF92BF92CF92DF92EF92FF920F931F930C +:107AB0000E94612D1F9221E02F931F921F921F920F +:107AC000912C812CB12CA12CC12CD12C76019701A9 +:107AD0008601B701A6010E9476330F900F900F9098 +:107AE0000F900F9090E080E01F910F91FF90EF902A +:107AF000DF90CF90BF90AF909F908F9008958F921E +:107B00009F92AF92BF92CF92DF92EF92FF920F932C +:107B10001F930E94612D1F921F9221E02F931F92AD +:107B20001F92912C812CB12CA12CC12CD12C76012F +:107B300097018601B701A6010E9476330F900F903E +:107B40000F900F900F9090E080E01F910F91FF90A9 +:107B5000EF90DF90CF90BF90AF909F908F9008955F +:107B60001F920F920FB60F9211240BB60F922F9304 +:107B70003F934F935F936F937F938F939F93AF93B5 +:107B8000BF93EF93FF938DE79BE00E945608FF9110 +:107B9000EF91BF91AF919F918F917F916F915F9185 +:107BA0004F913F912F910F900BBE0F900FBE0F90F2 +:107BB0001F9018951F920F920FB60F9211240BB6BB +:107BC0000F922F938F939F93EF93FF93E0918D0BE1 +:107BD000F0918E0B8081E091930BF091940B82FDDC +:107BE0001DC090818091960B8F5F8F732091970BB2 +:107BF000821741F0E091960BF0E0E358F44F958F37 +:107C00008093960BFF91EF919F918F912F910F9001 +:107C10000BBE0F900FBE0F901F9018958081F2CF72 +:107C20001F920F920FB60F9211242F933F938F93B1 +:107C30009F93AF93BF938091290790912A07A091BA +:107C40002B07B0912C073091280723E0230F2D3705 +:107C500058F50196A11DB11D20932807809329078F +:107C600090932A07A0932B07B0932C0780912D07A0 +:107C700090912E07A0912F07B09130070196A11D7A +:107C8000B11D80932D0790932E07A0932F07B093DB +:107C90003007BF91AF919F918F913F912F910F909E +:107CA0000FBE0F901F90189526E8230F0296A11D76 +:107CB000B11DD2CF1F920F920FB60F9211240BB6A7 +:107CC0000F922F933F934F935F936F937F938F9375 +:107CD0009F93AF93BF93EF93FF9348E251E064E229 +:107CE00071E090E080E00E947F0BFF91EF91BF91E7 +:107CF000AF919F918F917F916F915F914F913F9144 +:107D00002F910F900BBE0F900FBE0F901F901895E4 +:107D10001F920F920FB60F9211240BB60F922F9352 +:107D20003F934F935F936F937F938F939F93AF9303 +:107D3000BF93EF93FF9348EA50E064EA70E083E07A +:107D400090E00E947F0BFF91EF91BF91AF919F91C7 +:107D50008F917F916F915F914F913F912F910F90F4 +:107D60000BBE0F900FBE0F901F9018951F920F9291 +:107D70000FB60F9211240BB60F922F933F934F9390 +:107D80005F936F937F938F939F93AF93BF93EF9383 +:107D9000FF9348E950E064E970E082E090E00E94DF +:107DA0007F0BFF91EF91BF91AF919F918F917F9149 +:107DB0006F915F914F913F912F910F900BBE0F905C +:107DC0000FBE0F901F9018951F920F920FB60F9233 +:107DD00011240BB60F922F933F934F935F936F93A2 +:107DE0007F938F939F93AF93BF93EF93FF9348E855 +:107DF00050E064E870E081E090E00E947F0BFF912A +:107E0000EF91BF91AF919F918F917F916F915F9112 +:107E10004F913F912F910F900BBE0F900FBE0F907F +:107E20001F9018951F920F920FB60F9211240BB648 +:107E30000F922F933F934F935F936F937F938F9303 +:107E40009F93AF93BF93CF93DF93EF93FF93809173 +:107E50002207811115C081E0809322070E94612DC5 +:107E6000EC0140960E947E12CE0180579F4F0E94E7 +:107E70007E12CE01805F9E4F0E947E1210922207DA +:107E8000FF91EF91DF91CF91BF91AF919F918F9132 +:107E90007F916F915F914F913F912F910F900BBE0A +:107EA0000F900FBE0F901F9018951F920F920FB654 +:107EB0000F9211240BB60F922F933F934F935F9322 +:107EC0006F937F938F939F93AF93BF93EF93FF93A2 +:107ED000F0E0E0E01995FF91EF91BF91AF919F9194 +:107EE0008F917F916F915F914F913F912F910F9063 +:107EF0000BBE0F900FBE0F901F9018950F931F93FE +:107F0000FC018EEA97E4A1EEBDE380839183A28316 +:107F1000B38315827783668331872087138702872F +:107F20005587448716861786108A118A128A138A03 +:107F3000148A158A168A178A108E118E128E138E45 +:107F4000148E158E168E178E10A211A212A213A2D5 +:107F500014A215A216A217A210A611A612A613A665 +:107F600014A615A684E595EBAAEABAEA86A797A710 +:107F7000A0ABB1AB8AEA94E5A5E9BAE482AB93ABD6 +:107F8000A4ABB5AB89E299E2A9E4B4E286AB97ABC6 +:107F9000A0AFB1AF82E292E4A0E1B0E182AF93AFD3 +:107FA000A4AFB5AFDF01DE964FEF5FEF6FEF7BEF72 +:107FB0004D935D936D937C93139714964DE757E71C +:107FC0006BEB75EB4D935D936D937C9313971496C8 +:107FD00046E555E569E279E44D935D936D937C93B5 +:107FE0001397149642E252E460E470E04D935D937F +:107FF0006D937C931397149646E550E86FEF7FEFEF +:108000004D935D936D937C93139714961D921D92DF +:108010001D921C92139714961D921D921D921C92F4 +:10802000139714961D921D921D921C9213971496ED +:1080300040E854E065E070E04D935D936D937C9370 +:10804000139714961D921D921D921C9213971496CD +:108050001D921D921D921C92139714961D921D92B3 +:108060001D921C92139714961D921D921D921C92A4 +:108070001397149640E050E067EF70E04D935D93E6 +:108080006D937C93139714961D921C92E858FF4FA2 +:1080900010821F910F9108950F931F931092800BE0 +:1080A00010927F0B88EE93E0A0E0B0E08093810B0C +:1080B0009093820BA093830BB093840B80E693E0A4 +:1080C00090937E0B80937D0B85EC90E090938A0BD0 +:1080D0008093890B84EC90E090938C0B80938B0BB6 +:1080E00080EC90E090938E0B80938D0B81EC90E070 +:1080F0009093900B80938F0B82EC90E09093920B77 +:108100008093910B86EC90E09093940B8093930B6B +:108110001092960B1092970B1092980B1092990B4D +:1081200082E090E00E940F4B22E733E0FC013183B4 +:1081300020839093210C8093200C8AE19CE00E9484 +:108140002E2B08E110E02AE130E04BE150E069E13C +:1081500070E08DE89DE0D2DE0CE110E020E230E03E +:1081600041E250E06FE170E084E19DE0C7DE07E1AD +:1081700010E023E230E044E250E062E270E08BE99C +:108180009CE0BCDE0DE110E02FE030E04EE150E07D +:108190006EE070E082E29CE0B1DEE7E9FEE02FEF06 +:1081A00048EB5BE08091960E8033C8F491E0980F25 +:1081B0009093960E808390E0DC01AA0FBB1FA80F5E +:1081C000B91FAA5FB14F12965C934E9311973396E5 +:1081D0008EE0E33AF80731F71F910F91089520835D +:1081E000F6CF789484B5826084BD84B5816084BD07 +:1081F00085B5826085BD85B5816085BD80916E0045 +:10820000816080936E001092810080918100826075 +:1082100080938100809181008160809381008091B2 +:1082200080008160809380008091B10084608093A1 +:10823000B1008091B00081608093B0008091910086 +:108240008260809391008091910081608093910081 +:10825000809190008160809390008091A100826065 +:108260008093A1008091A10081608093A100809102 +:10827000A00081608093A0008091210182608093A2 +:108280002101809121018160809321018091200151 +:1082900081608093200180917A00846080937A00CD +:1082A00080917A00826080937A0080917A00816068 +:1082B00080937A0080917A00806880937A0010928F +:1082C000C10061E089E10E94A60961E08EE00E94A0 +:1082D000A60961E08FE10E94A60961E082E20E94A6 +:1082E000A609E0918D0BF0918E0B82E08083E091E6 +:1082F000890BF0918A0B1082E0918B0BF0918C0B23 +:1083000080E180831092950BE091910BF091920B9C +:1083100086E08083E0918F0BF091900B80818061EB +:108320008083E0918F0BF091900B80818860808337 +:10833000E0918F0BF091900B808180688083E091B9 +:108340008F0BF091900B80818F7D808364E670E0CD +:1083500080E090E00E943F0A0E94612D0E947C28EC +:108360000E94412A0E94112A0E94700A6093DC0731 +:108370007093DD078093DE079093DF078091700094 +:108380008160809370008091B100887F81608093CC +:10839000B10084E08093B30061E08DE00E94D309D6 +:1083A00061E089E00E94D30961E088E00E94D3097E +:1083B00061E087E00E94D30961E08AE00E94D3096E +:1083C00061E08CE00E94D30962E08FE30E94D30950 +:1083D00062E08BE30E94D30961E084E00E94D3094C +:1083E00061E085E00E94D30961E086E00E94D30944 +:1083F00061E087E00E94D3090E94700A6093D80769 +:108400007093D9078093DA079093DB070E94700A74 +:108410000E94700A6093DC077093DD078093DE078B +:108420009093DF070E94991E8091E8079091E907D9 +:10843000A091EA07B091EB070197A105B10561F59D +:108440000E94991E8091300890913108A0913208C5 +:10845000B09133080197A105B105F1F48CEF95E0D7 +:108460000E9484170E94612D21E02F931F921F927A +:108470001F921F92912C812CB12CA12CC12CD12C9C +:10848000760197018601B701A6010E9476330F900D +:108490000F900F900F900F900E94991E8091E80707 +:1084A0009091E907A091EA07B091EB070197A10528 +:1084B000B10561F50E94991E80912C0890912D08BC +:1084C000A0912E08B0912F080197A105B105F1F4F4 +:1084D00084E196E00E9484170E94612D1F9221E0A2 +:1084E0002F931F921F921F92912C812CB12CA12CA3 +:1084F000C12CD12C760197018601B701A6010E94FB +:1085000076330F900F900F900F900F900E94991E4E +:108510008091E8079091E907A091EA07B091EB07F5 +:108520000197A105B10561F50E94991E8091280867 +:1085300090912908A0912A08B0912B080197A105D4 +:10854000B105F1F48CE296E00E9484170E94612D3F +:108550001F921F9221E02F931F921F92912C812C2A +:10856000B12CA12CC12CD12C760197018601B70129 +:10857000A6010E9476330F900F900F900F900F90EE +:1085800084E496E00E9484170E94612DEC010E9411 +:10859000991E00912409109125090E94991E40916D +:1085A000340950913509B801CE0140960E946E14ED +:1085B0000E94991E00912809109129090E94991E74 +:1085C0004091380950913909B801CE0180579F4F29 +:1085D0000E946E140E94991E00912C0910912D0981 +:1085E0000E94991E40913C0950913D09B801CE016D +:1085F000805F9E4F0E946E14ECEC2E2EE2E03E2E29 +:10860000F6ED6F2EF2E07F2E0E94700AAB01BC01E6 +:108610008091DC079091DD07A091DE07B091DF0724 +:10862000481759076A077B0708F060C04093DC07CA +:108630005093DD076093DE077093DF078DE79BE0C3 +:108640000E944108892B09F424C30E94700A609398 +:10865000D8077093D9078093DA079093DB078DE7EB +:108660009BE00E941F088093D707982F9F7D953429 +:1086700009F468C02091D5073091D607F901ED556E +:10868000F84F80832F5F3F4F3093D6072093D50755 +:108690008091D5079091D6078133910564F02AE047 +:1086A0002093D707FC01ED55F84F20830196909356 +:1086B000D6078093D5072091D5073091D6078091B2 +:1086C000D7078A3021F0223331050CF4E2C2C90108 +:1086D0000197A0E7B7E0E3EAF7E0AF01435A57405C +:1086E00048175907B4F541914D93F7CF481B590BE3 +:1086F0006A0B7B0B483E53406105710508F49ECF21 +:1087000088519C4FAF4FBF4F8093DC079093DD079C +:10871000A093DE07B093DF070E94412AEC010E947C +:108720001618CE010C960E941618CE0148960E948B +:108730001618CE0184960E941618CE01C0960E948B +:1087400016187CCF0E94891621E0DC011C962C9320 +:108750009FCF8059984FFC011082223031050CF4D4 +:1087600094C284E593E00E9484178FED93E00E9409 +:10877000841783E696E00E94841780E797E00E94C2 +:10878000841783E696E00E94841780E696E00E94B4 +:1087900084178AE390E043D7EC011A821B821C8283 +:1087A0001D821E821F82188619861A861B861C86C9 +:1087B0001D861E861F86188A198A1A8A1B8A1C8A99 +:1087C0001D8A1E8A1F8A188E198E1A8E1B8E1C8E69 +:1087D0001D8E1E8E1F8E18A219A21AA21BA21CA2E9 +:1087E0001DA21EA21FA218A619A61AA61BA61CA689 +:1087F0001DA61EA61FA618AA19AA1AAA1BAA1CAA59 +:108800001DAA1EAA1FAA18AE19AE6DE172E080E77C +:1088100097E00E94374C8C01DC018C9186548230A9 +:1088200008F0DFC165E676E0C8010E942854892B74 +:1088300009F48FC168E676E0C8010E942854892BAC +:1088400009F487C16CE676E0C8010E942854892BA0 +:1088500009F482C16FE676E0C8010E942854892B92 +:1088600009F47AC163E776E0C8010E942854892B95 +:1088700009F475C167E776E0C8010E942854892B86 +:1088800009F470C16BE776E0C8010E942854892B77 +:1088900009F468C16EE776E0C8010E942854892B6C +:1088A00009F463C162E876E0C8010E942854892B6C +:1088B00009F45EC166E876E0C8010E942854892B5D +:1088C00009F459C16AE876E0C8010E942854892B4E +:1088D00009F454C16EE876E0C8010E942854892B3F +:1088E00009F44FC162E976E0C8010E942854892B3F +:1088F00009F44AC166E976E0C8010E942854892B30 +:1089000009F445C16AE976E0C8010E942854892B20 +:1089100009F440C16EE976E0C8010E942854892B11 +:1089200009F43BC162EA76E0C8010E942854892B11 +:1089300009F436C166EA76E0C8010E942854892B02 +:1089400009F431C16AEA76E0C8010E942854892BF3 +:1089500009F42CC16EEA76E0C8010E942854892BE4 +:1089600009F427C162EB76E0C8010E942854892BE4 +:1089700009F422C166EB76E0C8010E942854892BD5 +:1089800009F41DC16AEB76E0C8010E942854892BC6 +:1089900009F418C16EEB76E0C8010E942854892BB7 +:1089A00009F413C162EC76E0C8010E942854892BB7 +:1089B00009F40EC166EC76E0C8010E942854892BA8 +:1089C00009F409C16AEC76E0C8010E942854892B99 +:1089D00009F004C188EB90E09093010280930002BB +:1089E0000115110509F403C1F8018081883539F4B6 +:1089F000C801019639D76A837B838C839D83D80114 +:108A00008C91893539F4C80101962ED76E837F8306 +:108A100088879987F80180818A3539F4C8010196E1 +:108A200023D76A877B878C879D87D8018C91813477 +:108A300049F4C801019618D70E94E4526E877F87D7 +:108A4000888B998BF8018081823449F4C8010196A2 +:108A50000BD70E94E4526A8B7B8B8C8B9D8BD80149 +:108A60008C91833449F4C8010196FED60E94E452E9 +:108A70006E8B7F8B888F998FF8018081833539F4D5 +:108A8000C8010196F1D66A8F7B8F8C8F9D8FD8019C +:108A90008C91803549F4C8010196E6D60E94E452D3 +:108AA0006E8F7F8F88A399A3F8018081863549F462 +:108AB000C8010196D9D60E94E4526AA37BA38CA375 +:108AC0009DA3D8018C91873549F4C8010196CCD675 +:108AD0000E94E4526EA37FA388A799A7F801808122 +:108AE000853449F4C8010196BFD60E94E4526AA7B2 +:108AF0007BA78CA79DA7D8018C91843549F4C80128 +:108B00000196B2D60E94E4526EA77FA788AB99ABBC +:108B1000F80180818D3449F4C8010196A5D60E94E0 +:108B2000E4526AAB7BAB8CAB9DABD8018C918135A9 +:108B300049F4C801019698D60E94E4526EAB7FAB0F +:108B400088AF99AF6EEC76E090E080E090D68C0133 +:108B500047CF90E080E040CF81E090E03DCF8CE1D6 +:108B600090E03ACF8DE690E037CF8FE690E034CFBB +:108B700080E790E031CF81E790E02ECF82E790E070 +:108B80002BCF83E790E028CF84E790E025CF88E7DC +:108B900090E022CF89E790E01FCF8AE790E01CCFDA +:108BA00083E890E019CF84E890E016CF8DE890E05C +:108BB00013CF8EE890E010CF8FE890E00DCF80E9E2 +:108BC00090E00ACF81EA90E007CF85EB90E004CFF8 +:108BD00086EB90E001CF87EB90E0FECE8FEF9FEF2A +:108BE000FBCE8FEF9FEF90930102809300020E94D3 +:108BF0008916FC0114850E94991E8090F4079090BC +:108C0000F507A090F607B090F707CEA8DFA8E8AC6C +:108C1000F9AC0E948916C092730BD092740BE0924B +:108C2000750BF092760B80910002909101028230D8 +:108C3000910508F4B6C49C012F5631092530310541 +:108C400008F4AFC4552453948437910509F0512C8E +:108C5000112309F4AAC48D36910509F4A6C49C0118 +:108C6000285731092330310508F49FC4855B9109E9 +:108C7000039708F49AC484E493E00E9484170E9446 +:108C800089160E948D17CE0166D51092D6071092D4 +:108C9000D50780916F078111A4C00E948916FC013D +:108CA0008485882309F49DC00E94612DEC01FC019C +:108CB000E052FD4F108240960E94BB10CE018057BB +:108CC0009F4F0E94BB10CE01805F9E4F0E94BB1041 +:108CD0000E9415168C010F5F1F4FC1E0D0E0D80134 +:108CE0008D918D018823D9F081E893E00E9484174B +:108CF00088EE96E00E948417CE010E947F1780E6DE +:108D000096E00E94841760E08C2F0E94A60970E014 +:108D100060E0CE010E94B417F80131971082F8018B +:108D200087A98823F9F081E893E00E9484178FEFE8 +:108D300096E00E948417CE010E947F1780E696E09D +:108D40000E94841761E08C2F0E94D30960E08C2F71 +:108D50000E94A60961E070E0CE010E94B417D8011C +:108D6000D7961C922196C533D10509F0B8CF0E9441 +:108D7000BB152091970E30E0C901880F991F820F13 +:108D8000931FFC01EA5FF14F80818F7B80832091EC +:108D90009A0E30E0C901880F991F820F931FFC01C2 +:108DA000EA5FF14F80818F7B808320919D0E30E0C0 +:108DB000C901880F991F820F931FFC01EA5FF14FD1 +:108DC00080818F7B80832091A00E30E0C901880FC5 +:108DD000991F820F931FFC01EA5FF14F80818F7B07 +:108DE00080830E948916FC01848580936F070E940E +:108DF000991E20916D0730916E07DC0112968D91BE +:108E00009C912817390789F00E94991EFC018281E4 +:108E1000938190936E0780936D070E94612D0E944D +:108E20007C280E94412A0E94112A0E94700A009107 +:108E3000D8071091D9072091DA073091DB07601726 +:108E400071078207930708F0DBC20E94700A6093E3 +:108E5000D8077093D9078093DA079093DB070E94B5 +:108E6000E708D2CBE0900002F0900102FFEFEF168E +:108E7000FF0609F4AFC3E114F10409F083C0809147 +:108E8000590790915A07892B61F482E090E0C7D38B +:108E900026E233E0DC012D933C9390935A078093B4 +:108EA00059070091590710915A07B1E7EB16F104E1 +:108EB00009F09EC080914F0790915007892B61F473 +:108EC00082E090E0ACD324EF32E0FC0131832083D8 +:108ED0009093500780934F0700914F0710915007D0 +:108EE000F9E7EF16F10409F09EC0809145079091D3 +:108EF0004607892B61F482E090E091D3E2ECF2E046 +:108F0000DC01ED93FC939093460780934507009115 +:108F1000450710914607F0E9EF16F10409F09EC0ED +:108F200080913B0790913C07892B61F482E090E0AF +:108F300076D3E0E9F2E0DC01ED93FC9390933C07FB +:108F400080933B0700913B0710913C07F8EBEF162D +:108F5000F10409F09EC08091310790913207892B6E +:108F600061F482E090E05BD3EEE5F2E0DC01ED93AA +:108F7000FC93909332078093310700913107109151 +:108F8000320787C0BCE1EB16F104B9F480915707B2 +:108F900090915807892B61F482E090E040D32CE156 +:108FA00033E0FC0131832083909358078093570767 +:108FB000009157071091580778CFFDE6EF16F1049E +:108FC00009F07CC08091550790915607892B61F478 +:108FD00082E090E024D322E133E0DC012D933C9346 +:108FE00090935607809355070091550710915607A7 +:108FF000F2E7EF16F10409F07CC080914D079091E3 +:109000004E07892B61F482E090E009D32AEE32E02A +:10901000DC012D933C9390934E0780934D07009174 +:109020004D0710914E07FAE7EF16F10409F07CC0E6 +:109030008091430790914407892B61F482E090E08E +:10904000EED2E8EBF2E0DC01ED93FC939093440761 +:10905000809343070091430710914407F1EAEF160C +:10906000F10409F07CC08091390790913A07892B6F +:1090700061F482E090E0D3D2E6E8F2E0DC01ED9327 +:10908000FC9390933A078093390700913907109128 +:109090003A070115110509F03CC18CE393E00E94E9 +:1090A00084170E9489160E948D1782ED96E00E9417 +:1090B000071780E696E00E940717E5CDBFE6EB169E +:1090C000F10409F068C08091530790915407892BEF +:1090D00061F482E090E0A3D228E033E0FC01318328 +:1090E0002083909354078093530700915307109166 +:1090F0005407B3E7EB16F10409F0BBC080914B07AE +:1091000090914C07892B61F482E090E088D220EEA8 +:1091100032E0FC013183208390934C0780934B070E +:1091200000914B0710914C07FDE8EF16F10409F090 +:10913000B9C08091410790914207892B61F482E088 +:1091400090E06DD2EEEAF2E0DC01ED93FC939093B7 +:109150004207809341070091410710914207F5EBC8 +:10916000EF16F10409F0B9C08091370790913807E4 +:10917000892B61F482E090E052D2ECE7F2E0DC016E +:10918000ED93FC939093380780933707009137074E +:10919000109138077ECFF0E7EF16F10409F066C0B2 +:1091A0008091510790915207892B61F482E090E001 +:1091B00036D22EEF32E0DC012D933C939093520790 +:1091C000809351070091510710915207B8E7EB16B1 +:1091D000F10409F085CE8091470790914807892BCB +:1091E00051F482E090E01BD2FC0131822082909306 +:1091F0004807809347070091470710914807FFE809 +:10920000EF16F10409F087CE80913D0790913E075B +:10921000892B61F482E090E002D2EAE9F2E0DC011D +:10922000ED93FC9390933E0780933D0700913D079B +:1092300010913E07F7EBEF16F10409F087CE80910D +:10924000330790913407892B61F482E090E0E7D1F5 +:10925000E8E6F2E0DC01ED93FC9390933407809311 +:109260003307009133071091340713CF10E000E06B +:109270001CCEF4E7EF16F10409F0A8CF809149075E +:1092800090914A07892B51F482E090E0C8D1DC012B +:109290006D927C9290934A07809349070091490709 +:1092A00010914A07FEE8EF16F10409F0A8CF80916B +:1092B0003F0790914007892B61F482E090E0AFD1A5 +:1092C000E4EAF2E0DC01ED93FC9390934007809395 +:1092D0003F0700913F0710914007F6EBEF16F104AE +:1092E00009F0A8CF8091350790913607892B61F45A +:1092F00082E090E094D1E2E7F2E0DC01ED93FC93B0 +:109300009093360780933507009135071091360703 +:10931000C0CE88E393E00E9484170E9489160E94C1 +:109320008D170E94891610925C0710925B07F12C32 +:10933000E12C2FEFE21AF20A31E0E316F10441F0DA +:1093400084E393E00E9484170E9489160E948D177F +:10935000D801ED91FC910480F581E02DBE01C8019A +:1093600019950E948916C0905B07D0905C070E94F7 +:109370008916FC01848581110AC0E814F9043CF4C3 +:10938000C114D10421F0F2E0CF16D10491F68DE79B +:109390009BE00E944108181619062CF48DE79BE00B +:1093A0000E941F08F4CF80E393E0CD28C1F0552040 +:1093B000A1F00E94991E8091F0079091F107A09171 +:1093C000F207B091F3070197A105B10531F40E94AE +:1093D000891621E0DC011C962C938CE293E00E941C +:1093E00084170E9489160E948D170E948916109278 +:1093F000730B1092740B1092750B1092760B43CC7A +:10940000601B710B820B930B6938734181059105C9 +:1094100008F425CD0E948916DC011C968C918823C6 +:1094200009F487C080E593E00E9484170E948916A2 +:109430000E948D170E94612DEC01FC01E554FD4F47 +:109440008081882309F478C00E948916CE01805754 +:109450009E4F0E94B60F60935D0770935E078093E6 +:109460005F0790936007FE01E454FD4F80818823DD +:1094700009F474C00E948916CE0182559E4F0E9445 +:10948000B60F6093610770936207809363079093B0 +:109490006407FE01E354FD4F8081882309F470C006 +:1094A0000E948916CE0184539E4F0E94B60F60938E +:1094B00065077093660780936707909368070E941B +:1094C00089160E94FE1C0E94612D0E94571C0E945A +:1094D00089160E94C2160E9489160E94361B0E949D +:1094E000991E8091E8079091E907A091EA07B09151 +:1094F000EB070197A105B10541F088E493E00E94D4 +:1095000084170E9489160E948D1780916907909197 +:109510006A07A0916B07B0916C070196A11DB11D60 +:109520008093690790936A07A0936B07B0936C07C9 +:109530008CCC8CE493E078CF0E948916FE01EC5A23 +:10954000FF4F80819181A281B38180935D079093C9 +:109550005E07A0935F07B093600785CF0E948916CE +:10956000FE01EC52FF4F80819181A281B3818093F3 +:10957000610790936207A0936307B093640789CF54 +:109580000E948916CC5ADE4F88819981AA81BB81BD +:109590008093650790936607A0936707B093680769 +:1095A0008ECF55245394111166CB0E94991E809141 +:1095B000E8079091E907A091EA07B091EB070197BE +:1095C000A105B10521F080E493E0511056CB20971E +:1095D00009F048CC8CE393E050CB80911A0C909129 +:1095E0001B0CB9C0EF920F931F93CF93DF93E80149 +:1095F00034E047FD34E1042E000C550B57FF03C047 +:10960000519541955109E32E022F242FAE01ABD184 +:10961000CE01DF91CF911F910F91EF9008950F939D +:109620001F93CF93DF938230910510F482E090E096 +:10963000E091A70EF091A80E30E020E0B0E0A0E0AD +:10964000309799F42115310509F44AC0281B390BCC +:1096500024303105D8F58A819B816115710589F126 +:10966000FB0193838283FE0111C0408151810281FD +:10967000138148175907E0F04817590799F41097D4 +:1096800061F012960C93129713961C933296CF01A9 +:10969000DF91CF911F910F9108950093A70E109322 +:1096A000A80EF4CF2115310551F04217530738F0B9 +:1096B000A901DB019A01BD01DF01F801C1CFEF0172 +:1096C000F9CF9093A80E8093A70ECDCFFE01E20FA5 +:1096D000F31F819391932250310939832883D7CF87 +:1096E0002091A50E3091A60E232B41F42091040267 +:1096F000309105023093A60E2093A50E2091020210 +:10970000309103022115310541F42DB73EB7409148 +:10971000060250910702241B350BE091A50EF09133 +:10972000A60EE217F307A0F42E1B3F0B28173907EC +:1097300078F0AC014E5F5F4F2417350748F04E0FAD +:109740005F1F5093A60E4093A50E819391939FCFD8 +:10975000F0E0E0E09CCFCF93DF930097E9F0FC01CD +:10976000329713821282A091A70EB091A80EED013C +:1097700030E020E01097A1F420813181820F931F07 +:109780002091A50E3091A60E2817390709F061C067 +:10979000F093A60EE093A50EDF91CF910895EA0114 +:1097A000CE17DF07E8F54A815B819E01411551051F +:1097B000B1F7E901FB83EA8349915991C40FD51FA1 +:1097C000EC17FD0761F4808191810296840F951F4B +:1097D000E90199838883828193819B838A83F0E066 +:1097E000E0E012968D919C9113970097B9F52D9119 +:1097F0003C911197CD010296820F931F2091A50EE7 +:109800003091A60E2817390739F6309751F5109286 +:10981000A80E1092A70EB093A60EA093A50EBCCFD3 +:10982000D383C28340815181840F951FC817D90704 +:1098300061F44E5F5F4F88819981480F591F5183B2 +:1098400040838A819B81938382832115310509F0AE +:10985000B0CFF093A80EE093A70E9ECFFD01DC01E0 +:10986000C0CF13821282D7CF66277727F4C143EA8D +:109870005EE000C0FA01A191B081009719F4109741 +:10988000E1F0CD01DC01CD010D90002011F4C0010B +:1098900013C0FB012191222319F02015D9F7F3CF32 +:1098A000FB012191201519F41E92119606C0222366 +:1098B000C1F70D900020A1F7D001FA01A193B08368 +:1098C0000895BB274A3031F4992322F4BDE29095E4 +:1098D00081959F4F30C0BB272A3051F4992342F421 +:1098E000BDE290958095709561957F4F8F4F9F4F0A +:1098F00001C0BB27FA01A62F6217710581059105EA +:10990000330B30FB66F0AA27660F771F881F991F5D +:10991000AA1FA21710F0A21B63953850A9F7A05DEB +:10992000AA3308F0A95DA19336F7B111B193108263 +:10993000CA01DEC3BB27FB015527AA27880F991F41 +:10994000AA1FA41710F0A41B83955051B9F7A05D6E +:10995000AA3308F0A95DA193009779F7B111B193EB +:109960001192CB01C5C38F929F92AF92BF92CF92BB +:10997000DF92EF92FF920F931F93CF93DF9300D06C +:1099800000D000D0CDB7DEB76A01F22EB02E102F76 +:10999000FBE3AF2EA01608F41BE31F5F012F27E0A7 +:1099A000AE014F5F5F4FACD2BC018981982F997097 +:1099B000913009F44EC09BE2E1FC04C09E2D9170F1 +:1099C000E0FC49C05E2D5071E82FE87083FF55C060 +:1099D00084E0911101C083E0EF2DE81B8F1508F0A2 +:1099E000E0E0D6018E2F20E25523C9F1992329F01A +:1099F000D6019C93C60101966C0196012D5F3F4FE5 +:109A0000E2FE33C08EE4D6018C9391E411969C93D0 +:109A1000119712968C93D9018E2F90E281112AC052 +:109A2000E20FF32FF11D10828EEF9FEF29960FB6F4 +:109A3000F894DEBF0FBECDBFDF91CF911F910F9184 +:109A4000FF90EF90DF90CF90BF90AF909F908F905E +:109A500008959DE2B7CF90E2B5CF2D93815081114B +:109A6000FCCFCE0ED11CE0E0C1CF8EE6D6018C93A8 +:109A700091E6CCCF9D938150D1CF482F447082FF87 +:109A80003DC084E0911101C083E08F1510F4EF2DEB +:109A9000E81BD6018E2F20E2552309F1992329F0E6 +:109AA000D6019C93C60101966C0196012D5F3F4F34 +:109AB000E2FE1BC089E4D6018C938EE411968C9350 +:109AC000119786E412968C93D9018E2F90E2882309 +:109AD00009F4A6CF9D938150FACF2D938150811127 +:109AE000FCCFCE0ED11CE0E0D9CF89E6D6018C9315 +:109AF0008EE611968C93119786E6E4CF9B0177FF53 +:109B000002C030E020E0A1E0B0E0911102C0B0E07E +:109B1000A0E0F9013196AE0FBF1F8B2C912CBB201A +:109B200009F461C05401EFEFAE1ABE0AAA0DBB1DC5 +:109B3000FA161B0619F014F04F2D4A1B511188C05C +:109B4000E3FC59C07601A42FB0E2A1114FC0C40EAE +:109B5000D11C992309F45BC040E0D6011196F601AF +:109B600090836D01552309F448C0012F060F9A8197 +:109B7000582F507184FF03C0913309F4015010161F +:109B80000CF047C0093008F008E0EEE2FE2E5B0161 +:109B9000A01AB10885019194819491082F3F320752 +:109BA00029F4D601FC92F60131966F016217730712 +:109BB00094F1021713077CF5DB01A21BB30BAA2457 +:109BC000A394B12CAC0EBD1EAA0DBB1D11968C9199 +:109BD00021503109D601119628153905F4F0F60106 +:109BE00080836D01DBCFB12CA12CA0CFF701B19305 +:109BF0007F01A150AACF9111B0CFD601942F50E38D +:109C000002C05D9391509111FCCFC40ED11C40E075 +:109C1000ACCF01E0BACF80E3DBCF6217730731F43A +:109C2000963388F4953311F4552369F0F601808357 +:109C3000FD01842F90E2811108C0A40FB11D1C9278 +:109C400090E080E0F3CE81E3F1CF91938150F3CFA8 +:109C5000911183CF8ACF8F929F92AF92BF92CF9272 +:109C6000DF92EF92FF920F931F93CF93DF935C01EC +:109C70007B016115710519F0DB018D939C938501C2 +:109C80000F5F1F4FF501D0818D2F90E011D26C0135 +:109C9000892BA9F5DD32A9F50F5F1F4FD50111966C +:109CA000DC91C1E05801F1E0AF1AB10843E050E0A7 +:109CB0006CEE70E0C50104D2892B61F5680182E089 +:109CC000C80ED11C45E050E067EE70E0C601F8D147 +:109CD000892B21F4680197E0C90ED11CE114F1042D +:109CE00019F0D701CD92DC9260E070E080E89FEF40 +:109CF000C111F9C060E070E080E89FE7F4C058014E +:109D0000BECFDB3229F485010E5F1F4FF501D181F3 +:109D1000C0E0C8CF43E050E064EE70E0C501D0D1B0 +:109D2000892BE9F0F80110E000E020E030E0A90123 +:109D30005F01B0ED8B2E8D0E89E08815C0F19C2E51 +:109D4000689491F88C2F8870C2FF16C0811102C0F0 +:109D50000F5F1F4F3196D501DC91C92DE9CFE1147A +:109D6000F10429F00E5F1F4FF7011183008360E0BB +:109D700070E080EC9FE7B7C0882311F00150110913 +:109D8000A5E0B0E013D39B01AC01220F331F441FA9 +:109D9000551F280D311D411D511D283999E93907DD +:109DA000490799E15907B0F2C6609C2ED3CFAEEFB8 +:109DB0008A1206C0C3FD3CC09C2E689493F8CACF9B +:109DC000DF7DD534A9F580818D3239F4C061DF01A2 +:109DD0001296818162E070E006C0DF018B32C1F330 +:109DE000119661E070E080535D01A61AB70A8A30CF +:109DF000F8F4E0E8CE16ECE0DE065CF4B601660F9F +:109E0000771F660F771FC60ED71ECC0CDD1CC80E41 +:109E1000D11C5D01FFEFAF1ABF0A8C9180538A30CD +:109E200098F1C4FF03C0D194C194D1080C0D1D1D3D +:109E3000C1FF09C0E114F10431F081E0A81AB108B2 +:109E4000D701AD92BC92CA01B90166D1C370C330CB +:109E500009F490584B015C0120E030E0A90158D191 +:109E6000882309F43EC0CBE1D1E017FF05C011956E +:109E700001951109C3E0D1E06E01B8E1CB1AD10818 +:109E800080E2E82EF12C0EC0D501B3CFFE01259162 +:109E90003591459154910E191F09C501B4019DD109 +:109EA0004B015C01D501C4010E151F057CF72497F9 +:109EB000F594E794CC16DD06A9F78A2F880F8B2F2F +:109EC000881F8F3F41F020E030E0A901C501B401B7 +:109ED0001FD1811106C082E290E09093AA0E809378 +:109EE000A90EC501B401DF91CF911F910F91FF9091 +:109EF000EF90DF90CF90BF90AF909F908F9008959C +:109F0000283008F027E03327DA01990F311D87FD4B +:109F1000916000966105710539F432602E5F3D93C2 +:109F200030E32A95E1F708959F3F30F080387105BE +:109F3000610509F03C5F3C5F3D93913008F080681B +:109F4000911DDF93CF931F930F93FF92EF92192FE1 +:109F5000987F9695E92F96959695E90FFF27E758F4 +:109F6000FE4F99273327EE24FF24A701E701059030 +:109F70000894079428F4360FE71EF81E491F511D58 +:109F8000660F771F881F991F0694A1F70590079405 +:109F900028F4E70EF81E491F561FC11D770F881FB2 +:109FA000991F661F0694A1F70590079428F4F80EF0 +:109FB000491F561FC71FD11D880F991F661F771F86 +:109FC0000694A1F70590079420F4490F561FC71F68 +:109FD000D81F990F661F771F881F0694A9F78491D1 +:109FE0001095177041F0D695C79557954795F794FA +:109FF000E7941A95C1F7EFE1F1E068941590159197 +:10A0000035916591959105907FE27395E118F10A7C +:10A01000430B560BC90BD009C0F7E10CF11E431FCF +:10A02000561FC91FD01D7EF4703311F48A95E6CFF8 +:10A03000E894015030F0080F0AF40027021708F4E2 +:10A04000202F2395022F7A3328F079E37D932A95E8 +:10A05000E9F710C07D932A9589F606949795679540 +:10A06000379517951794E118F10A430B560BC90B56 +:10A07000D00998F023957E9173957A3308F070E3B8 +:10A080007C932013B8F77E9170617D9330F08395B7 +:10A0900071E37D9370E32A95E1F71124EF90FF902F +:10A0A0000F911F91CF91DF91992787FD909508958A +:10A0B0009111F6C0803219F089508550D0F708957B +:10A0C000FB01DC014150504088F08D9181341CF03F +:10A0D0008B350CF4805E659161341CF06B350CF4AB +:10A0E000605E861B611171F3990B0895881BFCCF8C +:10A0F000DC01FC01672F71917723E1F7329704C0EF +:10A100007C916D9370836291AE17BF07C8F3089579 +:10A1100040D008F481E00895E89409C097FB3EF42C +:10A1200090958095709561957F4F8F4F9F4F9923A4 +:10A13000A9F0F92F96E9BB279395F6958795779522 +:10A140006795B795F111F8CFFAF4BB0F11F460FFE2 +:10A150001BC06F5F7F4F8F4F9F4F16C0882311F03A +:10A1600096E911C0772321F09EE8872F762F05C04E +:10A17000662371F096E8862F70E060E02AF09A95E9 +:10A18000660F771F881FDAF7880F9695879597F9DE +:10A190000895990F0008550FAA0BE0E8FEEF161678 +:10A1A0001706E807F907C0F012161306E407F507CB +:10A1B00098F0621B730B840B950B39F40A2661F03F +:10A1C000232B242B252B21F408950A2609F4A140E2 +:10A1D000A6958FEF811D811D08950BD07BC06CD09B +:10A1E00028F071D018F0952309F05DC062C01124E9 +:10A1F000A5C081D0A0F3959FD1F3950F50E0551FD6 +:10A20000629FF001729FBB27F00DB11D639FAA27CB +:10A21000F00DB11DAA1F649F6627B00DA11D661F1A +:10A22000829F2227B00DA11D621F739FB00DA11D3B +:10A23000621F839FA00D611D221F749F3327A00DF5 +:10A24000611D231F849F600D211D822F762F6A2F91 +:10A2500011249F5750408AF0E1F088234AF0EE0F16 +:10A26000FF1FBB1F661F771F881F91505040A9F723 +:10A270009E3F510570F017C061C05F3FECF3983E00 +:10A28000DCF3869577956795B795F795E7959F5F8A +:10A29000C1F7FE2B880F911D9695879597F9089524 +:10A2A00099278827089597F99F6780E870E060E014 +:10A2B00008959FEF80EC089500240A94161617065F +:10A2C00018060906089500240A94121613061406A7 +:10A2D00005060895092E0394000C11F4882352F00A +:10A2E000BB0F40F4BF2B11F460FF04C06F5F7F4FC2 +:10A2F0008F4F9F4F089557FD9058440F551F59F0A9 +:10A300005F3F71F04795880F97FB991F61F09F3F62 +:10A3100079F087950895121613061406551FF2CF8B +:10A320004695F1DF08C0161617061806991FF1CFDB +:10A3300086957105610508940895E894BB27662702 +:10A340007727CB0197F90895F999FECF92BD81BD8A +:10A35000F89A992780B50895262FF999FECF1FBA4C +:10A3600092BD81BD20BD0FB6F894FA9AF99A0FBE3E +:10A3700001960895052E97FB16F400940FD057FD13 +:10A3800005D024D007FC02D046F408C05095409573 +:10A39000309521953F4F4F4F5F4F08959095809591 +:10A3A000709561957F4F8F4F9F4F089531D0A59F36 +:10A3B000900DB49F900DA49F800D911D11240895C0 +:10A3C000B7FFF4CFF3DF821B930B0895A1E21A2E9F +:10A3D000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F49 +:10A3E000A217B307E407F50720F0A21BB30BE40B99 +:10A3F000F50B661F771F881F991F1A9469F76095E0 +:10A400007095809590959B01AC01BD01CF01089599 +:10A41000A29FB001B39FC001A39F700D811D1124A5 +:10A42000911DB29F700D811D1124911D08955058EA +:10A43000BB27AA270ED04ECF3FDF30F044DF20F0FD +:10A4400031F49F3F11F41EF434CF0EF4E095E7FB96 +:10A450002ACFE92F50DF80F3BA176207730784070A +:10A46000950718F071F49EF568CF0EF4E0950B2E69 +:10A47000BA2FA02D0B01B90190010C01CA01A00156 +:10A480001124FF27591B99F0593F50F4503E68F1B1 +:10A490001A16F040A22F232F342F4427585FF3CFF2 +:10A4A000469537952795A795F0405395C9F77EF4C3 +:10A4B0001F16BA0B620B730B840BBAF09150A1F00C +:10A4C000FF0FBB1F661F771F881FC2F70EC0BA0F92 +:10A4D000621F731F841F48F4879577956795B7951A +:10A4E000F7959E3F08F0B3CF9395880F08F0992712 +:10A4F000EE0F9795879508950CD0ECCEE4DE40F0F2 +:10A50000DBDE30F021F45F3F19F0CDCE511116CFD4 +:10A51000D0CEF1DE98F39923C9F35523B1F3951BFF +:10A52000550BBB27AA2762177307840738F09F5F74 +:10A530005F4F220F331F441FAA1FA9F333D00E2EE3 +:10A540003AF0E0E830D091505040E695001CCAF750 +:10A5500029D0FE2F27D0660F771F881FBB1F261715 +:10A5600037074807AB07B0E809F0BB0B802DBF01E8 +:10A57000FF2793585F4F2AF09E3F510568F093CE16 +:10A58000DDCE5F3FECF3983EDCF3869577956795DB +:10A59000B795F7959F5FC9F7880F911D9695879599 +:10A5A00097F90895E1E0660F771F881FBB1F6217B8 +:10A5B00073078407BA0720F0621B730B840BBA0B76 +:10A5C000EE1F88F7E095089504D06894B111B6CED7 +:10A5D000089599DE88F09F5790F0B92F9927B751C9 +:10A5E000A0F0D1F0660F771F881F991F1AF0BA9557 +:10A5F000C9F712C0B13081F0A0DEB1E008959DCE60 +:10A60000672F782F8827B85F39F0B93FCCF386954C +:10A6100077956795B395D9F73EF4909580957095A9 +:10A6200061957F4F8F4F9F4F0895B3DD08F48FEFF3 +:10A630000895AFDD880B990B0895DB018F939F93ED +:10A64000B5DEBF91AF91A29F800D911DA39F900D8C +:10A65000B29F900D11240895991B79E004C0991FB1 +:10A66000961708F0961B881F7A95C9F7809508956C +:10A67000EE0FFF1F881F8BBF0790F691E02D1994F6 +:10A680004F925F926F927F928F929F92AF92BF9202 +:10A69000CF92DF92EF92FF920F931F93CF93DF93AE +:10A6A0008C01009799F4CB01DF91CF911F910F910D +:10A6B000FF90EF90DF90CF90BF90AF909F908F90E2 +:10A6C0007F906F905F904F900C940F4BFC01E60FC2 +:10A6D000F71F9C0122503109E217F30708F4ACC0C0 +:10A6E000D901CD91DC911197C617D70718F1C53064 +:10A6F000D10570F0CE0104978617970748F0C61B66 +:10A70000D70B2297C193D1936D937C93CF0123D81C +:10A71000C801DF91CF911F910F91FF90EF90DF90D3 +:10A72000CF90BF90AF909F908F907F906F905F90F1 +:10A730004F9008955B01AC1ABD0A4C018C0E9D1E12 +:10A74000A091A70EB091A80E512C412CF12CE12C18 +:10A75000109731F58091A50E9091A60E8815990558 +:10A7600009F05CC04616570608F058C080910202F6 +:10A7700090910302009741F48DB79EB74091060275 +:10A7800050910702841B950BE817F90708F054C095 +:10A79000F093A60EE093A50EF90171836083B8CF04 +:10A7A0008D919C91119712966C90129713967C90B4 +:10A7B0001397A815B90559F56C0142E0C40ED11CD8 +:10A7C000CA14DB0420F1AC014A195B09DA011296C4 +:10A7D000159780F06282738251834083D9016D9313 +:10A7E0007C93E114F10471F0D7011396FC93EE937E +:10A7F00012978ECF22968C0F9D1FF9019183808333 +:10A80000F301EFCFF093A80EE093A70E81CF481687 +:10A81000590608F42C017D01D3019ACFCB010E9487 +:10A820000F4B7C01009741F0AE01B80108D0C80180 +:10A830000E94AB4B87016CCF10E000E069CFFB01B9 +:10A84000DC0102C001900D9241505040D8F70895AC +:10A85000FB01DC018D91019080190110D9F3990B56 +:10A860000895FB01DC0101900D920020E1F70895AD +:10A8700011E0CEE9D1E000E005C0802FFE01F8DE56 +:10A880002196011DCF39D10780E00807B1F7F89470 +:02A89000FFCFF8 +:10A89200FFFF0000AB0E8000362E342E322E480011 +:10A8A20000010000000100000001000000200A0D6C +:10A8B20000005238350052383400523035005231DF +:10A8C20033005231320052313100523733005237A5 +:10A8D2003200523731005231370052313600523194 +:10A8E20035005230340052383700000000005B144B +:10A8F200A81D7A2D000000005C14AA1D2B1B00006D +:10A9020000005D14AC1D991D000000005E14AE1D18 +:10A91200601B000000005F14B01DCE150000000097 +:10A922006014B21D3216000000006114B41D6C16D2 +:10A93200000000006214B61D5D18000000006314E0 +:10A94200B81D7916000000006414BA1D642A0000C4 +:10A9520000006514BC1DAE2A000000006614BE1D76 +:10A96200BC2A000000006714C01D723C00000000F9 +:10A972006814C21DAB3C0000000069149E1DE43C3B +:10A98200000000006A14C41D1D3D000000006B148D +:10A99200C61D4E3D000000006C14C81D7F3D000026 +:10A9A20000006D14CA1D0117000000005914A41DF7 +:10A9B2008B3B000000005A14A61D363C5230330077 +:10A9C20052303200523037005230310052303900AA +:10A9D200523838005238370052383800523030007E +:10A9E2005238370052303800523036000000000032 +:10A9F2007808E3071008C80841081F083308000058 +:10AA020000005514A01D2051005234310050005650 +:10AA1200005239390020737461200020637572205E +:10AA22000020656E6420002068616C662000206C46 +:10AA3200656E2000206D696E2000206D6178200017 +:10AA4200207370642000523231005239392045722D +:10AA5200726F723A20696E76616C696420706172FD +:10AA6200616D657465722069640D0A005238332085 +:10AA720000523831002058410020584200205941EC +:10AA82000020594200205A4100205A4200686F6D4E +:10AA9200650D0A006E616E00696E66006F76660073 +:10AAA20052383200523230005239392057696C6CB8 +:10AAB200207A65726F2058005239392057696C6CC0 +:10AAC200207A65726F2059005239392057696C6CAF +:10AAD200207A65726F205A005239392043616C69BD +:10AAE20062726174696F6E206572726F723A20656C +:10AAF2006E642073746F702061637469766520627E +:10AB020065666F72652073746172740D0A0020614C +:10AB12007869732000206D6F766520746F207374DE +:10AB220061727420666F722063616C696272617413 +:10AB3200696F6E0052393920656D657267656E63A3 +:10AB4200792073746F700D0A00523939206D6F7657 +:10AB5200656D656E7420646F6E650D0A0020617408 +:10AB6200207374617274696E6720706F696E74000D +:10AB7200523233002063616C6962726174696E677C +:10AB8200206C656E67746800207374657020636F53 +:10AB9200756E743A200020617420656E6420706FB7 +:10ABA200696E7400206D697320737470203D2000FB +:10ABB2002064656163746976617465206D6F746F7A +:10ABC2007220582064756520746F206D69737365F7 +:10ABD20064207374657073002064656163746976C0 +:10ABE200617465206D6F746F7220592064756520E1 +:10ABF200746F206D6973736564207374657073007C +:10AC02002064656163746976617465206D6F746F29 +:10AC120072205A2064756520746F206D69737365A4 +:10AC220064207374657073005239392074696D65DC +:10AC32006F7574205820617869730D0A0052393992 +:10AC42002074696D656F7574205920617869730D80 +:10AC52000A005239392074696D656F7574205A2063 +:10AC6200617869730D0A00523939206572726F7208 +:10AC72000D0A005239392073746F707065640D0AC1 +:10AC820000523939206572726F72200052393920B0 +:10AC9200484F4D45205A204F4E205354415254554F +:10ACA200500D0A0052393920484F4D452059204F46 +:10ACB2004E20535441525455500D0A0052393920F6 +:10ACC200484F4D452058204F4E2053544152545521 +:10ACD200500D0A005239392041524455494E4F20F5 +:10ACE2005354415254555020434F4D504C455445B6 +:10ACF2000D0A002A00473000473030004731004734 +:10AD0200303100473238004630390046390046318A +:10AD1200310046313200463133004631340046318B +:10AD22003500463136004632300046323100463276 +:10AD32003200463331004633320046343100463465 +:10AD42003200463433004634340046363100463849 +:10AD52003100463832004638330046383400200A83 +:10AD62000D005239392068616E646C6572203D3D78 +:10AD7200204E554C4C0D0A0020726573657474693F +:10AD82006E67206469676974616C2070696E002067 +:10AD9200726573657474696E6720616E616C6F674A +:06ADA2002070696E000044 :00000001FF From 2c27e00884d5948d2d0ccce4e9f4a9a7b77063ae Mon Sep 17 00:00:00 2001 From: connor rigby Date: Mon, 30 Dec 2019 08:24:03 -0800 Subject: [PATCH 52/58] Disable some logs that come from asset syncing --- .../lib/farmbot_ext/api/dirty_worker.ex | 28 +++++++++---------- farmbot_ext/lib/farmbot_ext/api/reconciler.ex | 24 ++++++++-------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex b/farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex index 3cf0b3394..4a160bb4e 100644 --- a/farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex +++ b/farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex @@ -53,22 +53,22 @@ defmodule FarmbotExt.API.DirtyWorker do end def handle_continue([dirty | rest], %{module: module} = state) do - Logger.info("[#{module} #{dirty.local_id} #{inspect(self())}] Handling dirty data") + # Logger.info("[#{module} #{dirty.local_id} #{inspect(self())}] Handling dirty data") case http_request(dirty, state) do # Valid data {:ok, %{status: s, body: body}} when s > 199 and s < 300 -> - Logger.debug( - "[#{module} #{dirty.local_id} #{inspect(self())}] HTTP request complete: #{s} ok" - ) + # Logger.debug( + # "[#{module} #{dirty.local_id} #{inspect(self())}] HTTP request complete: #{s} ok" + # ) dirty |> module.changeset(body) |> handle_changeset(rest, state) # Invalid data {:ok, %{status: s, body: %{} = body}} when s > 399 and s < 500 -> - Logger.debug( - "[#{module} #{dirty.local_id} #{inspect(self())}] HTTP request complete: #{s} error+body" - ) + # Logger.debug( + # "[#{module} #{dirty.local_id} #{inspect(self())}] HTTP request complete: #{s} error+body" + # ) changeset = module.changeset(dirty) @@ -79,9 +79,9 @@ defmodule FarmbotExt.API.DirtyWorker do # Invalid data, but the API didn't say why {:ok, %{status: s, body: _body}} when s > 399 and s < 500 -> - Logger.debug( - "[#{module} #{dirty.local_id} #{inspect(self())}] HTTP request complete: #{s} error" - ) + # Logger.debug( + # "[#{module} #{dirty.local_id} #{inspect(self())}] HTTP request complete: #{s} error" + # ) module.changeset(dirty) |> Map.put(:valid?, false) @@ -101,7 +101,7 @@ defmodule FarmbotExt.API.DirtyWorker do # If the changeset was valid, update the record. def handle_changeset(%{valid?: true} = changeset, rest, state) do - Logger.info("Successfully synced: #{state.module}") + # Logger.info("Successfully synced: #{state.module}") Repo.update!(changeset) |> Private.mark_clean!() @@ -125,21 +125,21 @@ defmodule FarmbotExt.API.DirtyWorker do end defp http_request(%{id: nil} = dirty, state) do - Logger.debug("#{state.module} clean request (post)") + # Logger.debug("#{state.module} clean request (post)") path = state.module.path() data = render(state.module, dirty) API.post(API.client(), path, data) end defp http_request(dirty, %{module: module} = state) when module in @singular do - Logger.debug("#{state.module} dirty request (patch)") + # Logger.debug("#{state.module} dirty request (patch)") path = path = state.module.path() data = render(state.module, dirty) API.patch(API.client(), path, data) end defp http_request(dirty, state) do - Logger.debug("#{state.module} dirty request (patch)") + # Logger.debug("#{state.module} dirty request (patch)") path = Path.join(state.module.path(), to_string(dirty.id)) data = render(state.module, dirty) API.patch(API.client(), path, data) diff --git a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex index b4af3386a..9e49377b0 100644 --- a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex +++ b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex @@ -83,7 +83,7 @@ defmodule FarmbotExt.API.Reconciler do sync_changeset = Enum.reduce(ids_that_were_deleted, sync_changeset, fn id, sync_changeset -> - Logger.info("delete: #{module} #{inspect(id)}") + # Logger.info("delete: #{module} #{inspect(id)}") Command.update(module, id, nil) sync_changeset end) @@ -99,19 +99,19 @@ defmodule FarmbotExt.API.Reconciler do case get_changeset(local_item || module, item, cached_cs) do {:insert, %Changeset{} = cs} -> - Logger.info("insert: #{inspect(cs)}") + # Logger.info("insert: #{inspect(cs)}") item = module.render(Changeset.apply_changes(cs)) :ok = Command.update(module, item.id, item) sync_changeset {:update, %Changeset{} = cs} -> - Logger.info("update: #{inspect(cs)}") + # Logger.info("update: #{inspect(cs)}") item = module.render(Changeset.apply_changes(cs)) :ok = Command.update(module, item.id, item) sync_changeset nil -> - Logger.info("Local data: #{local_item.__struct__} is current.") + # Logger.info("Local data: #{local_item.__struct__} is current.") sync_changeset end end @@ -132,7 +132,7 @@ defmodule FarmbotExt.API.Reconciler do if compare_datetimes(sync_item_updated_at, cached_updated_at) == :eq do {:insert, cached} else - Logger.info("Cached item is out of date") + # Logger.info("Cached item is out of date") get_changeset(module, sync_item, nil) end end @@ -146,9 +146,9 @@ defmodule FarmbotExt.API.Reconciler do # Check if remote data is newer if compare_datetimes(sync_item_updated_at, local_item.updated_at) == :gt do - Logger.info( - "Local data: #{local_item.__struct__} is out of date. Using HTTP to get newer data." - ) + # Logger.info( + # "Local data: #{local_item.__struct__} is out of date. Using HTTP to get newer data." + # ) {:ok, changeset} = API.get_changeset(local_item, "#{sync_item_id}") {:update, changeset} @@ -166,13 +166,13 @@ defmodule FarmbotExt.API.Reconciler do cache_compare = compare_datetimes(sync_item_updated_at, cached_updated_at) if cache_compare == :eq || cache_compare == :gt do - Logger.info( - "Local data: #{local_item.__struct__} is out of date. Using cache do get newer data." - ) + # Logger.info( + # "Local data: #{local_item.__struct__} is out of date. Using cache do get newer data." + # ) {:update, cached} else - Logger.info("Cached item is out of date") + # Logger.info("Cached item is out of date") get_changeset(local_item, sync_item, nil) end end From e15074c140be9b7c42fa50d6b4459ddb1b41d804 Mon Sep 17 00:00:00 2001 From: connor rigby Date: Mon, 30 Dec 2019 08:24:24 -0800 Subject: [PATCH 53/58] Disable firmware bootup logs --- farmbot_firmware/lib/farmbot_firmware.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/farmbot_firmware/lib/farmbot_firmware.ex b/farmbot_firmware/lib/farmbot_firmware.ex index 6de95f76c..516241d94 100644 --- a/farmbot_firmware/lib/farmbot_firmware.ex +++ b/farmbot_firmware/lib/farmbot_firmware.ex @@ -339,7 +339,7 @@ defmodule FarmbotFirmware do end def handle_info(:timeout, %{configuration_queue: [code | rest]} = state) do - Logger.debug("Starting next configuration code: #{inspect(code)}") + # Logger.debug("Starting next configuration code: #{inspect(code)}") case GenServer.call(state.transport_pid, {state.tag, code}) do :ok -> From b11faf93a4ec5ac57d67c4b1f208124afe0c4d67 Mon Sep 17 00:00:00 2001 From: connor rigby Date: Mon, 30 Dec 2019 08:59:23 -0800 Subject: [PATCH 54/58] Cleanup more syncing and firmware logs --- farmbot_core/lib/farmbot_core/asset/command.ex | 2 +- farmbot_ext/lib/farmbot_ext/api/reconciler.ex | 2 +- farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex | 2 ++ farmbot_os/config/config.exs | 9 +++++++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/farmbot_core/lib/farmbot_core/asset/command.ex b/farmbot_core/lib/farmbot_core/asset/command.ex index ffd2de804..e007f477d 100644 --- a/farmbot_core/lib/farmbot_core/asset/command.ex +++ b/farmbot_core/lib/farmbot_core/asset/command.ex @@ -181,7 +181,7 @@ defmodule FarmbotCore.Asset.Command do # Catch-all use case: def update(asset_kind, id, params) do - Logger.warn "Implement me: #{asset_kind}" + Logger.warn "AssetCommand needs implementation: #{asset_kind}" mod = as_module!(asset_kind) case Repo.get_by(mod, id: id) do nil -> diff --git a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex index 9e49377b0..127e51883 100644 --- a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex +++ b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex @@ -120,7 +120,7 @@ defmodule FarmbotExt.API.Reconciler do # A module is passed in if there is no local copy of the data. defp get_changeset(module, %Item{} = sync_item, nil) when is_atom(module) do - Logger.info("Local data: #{module} does not exist. Using HTTP to get data.") + # Logger.info("Local data: #{module} does not exist. Using HTTP to get data.") {:ok, changeset} = API.get_changeset(module, "#{sync_item.id}") {:insert, changeset} end diff --git a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex index b0ba5c0a6..6ad605b86 100644 --- a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex +++ b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex @@ -165,6 +165,8 @@ defmodule FarmbotFirmware.GCODE.Decoder do defp decode_end_stops([], acc), do: acc + defp decode_end_stops(error, _acc), do: [parse_error: error] + defp decode_pv(["P" <> param_id, "V" <> value]) do param = Param.decode(String.to_integer(param_id)) {value, ""} = Float.parse(value) diff --git a/farmbot_os/config/config.exs b/farmbot_os/config/config.exs index 76bd847f7..402b5c42e 100644 --- a/farmbot_os/config/config.exs +++ b/farmbot_os/config/config.exs @@ -68,6 +68,15 @@ config :farmbot, FarmbotOS.Platform.Supervisor, config :farmbot_firmware, FarmbotFirmware, reset: FarmbotFirmware.NullReset +config :logger, + handle_sasl_reports: false, + handle_otp_reports: false, + compile_time_purge_matching: [ + [application: :amqp], + [application: :amqp_client], + [application: :rabbit_common] + ] + import_config("lagger.exs") if Mix.target() == :host do From cb39795ce61afe542ebacb2e8990e0ac22be5480 Mon Sep 17 00:00:00 2001 From: connor rigby Date: Mon, 30 Dec 2019 09:21:34 -0800 Subject: [PATCH 55/58] Fix rpi3 configuration error --- farmbot_os/config/target/rpi3.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/farmbot_os/config/target/rpi3.exs b/farmbot_os/config/target/rpi3.exs index 228423c70..0a76c2aff 100644 --- a/farmbot_os/config/target/rpi3.exs +++ b/farmbot_os/config/target/rpi3.exs @@ -2,7 +2,7 @@ use Mix.Config config :farmbot_core, FarmbotCore.FirmwareTTYDetector, expected_names: ["ttyUSB0", "ttyACM0"] -config :farmbot_firmware, FarmbotFirmware, reset: FarmbotOS.Platform.Target.FirmwareReset.NULL +config :farmbot_firmware, FarmbotFirmware, reset: FarmbotFirmware.NullReset config :farmbot, FarmbotOS.Init.Supervisor, init_children: [ From 9f6958462d61951b3111c90464540d99707cad7f Mon Sep 17 00:00:00 2001 From: connor rigby Date: Mon, 30 Dec 2019 09:24:07 -0800 Subject: [PATCH 56/58] Release v9.0.0-rc10 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4d3445c4c..87dbb2b8a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc9 \ No newline at end of file +9.0.0-rc10 \ No newline at end of file From d536b155bd9f941e1e202081d793ebbeb1a5eddd Mon Sep 17 00:00:00 2001 From: connor rigby Date: Mon, 30 Dec 2019 10:44:40 -0800 Subject: [PATCH 57/58] Update docs for releasing --- docs/index.md | 1 + .../provisioning_ota_system.md | 195 +++++++++++++++++ .../releasing_target_firmware.md | 202 ++---------------- 3 files changed, 217 insertions(+), 181 deletions(-) create mode 100644 docs/target_development/provisioning_ota_system.md diff --git a/docs/index.md b/docs/index.md index 37c00b141..8a3e308fd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,6 +12,7 @@ Most FarmBot development/testing is done on a standard desktop PC. * [Developing on your local PC](/docs/host_development/host_development.md) * [Deploying on Raspberry Pi](/docs/target_development/building_target_firmware.md) + * [Provisioning OTA system](/docs/target_development/provisioning_ota_system.md) * [Publishing Firmware (OTAs)](/docs/target_development/releasing_target_firmware.md) * [Why doesn't my device boot after building firmware](docs/target_development/target_faq.md) * [Inspecting a running devicve](/docs/target_development/consoles/target_console.md) diff --git a/docs/target_development/provisioning_ota_system.md b/docs/target_development/provisioning_ota_system.md new file mode 100644 index 000000000..d67b9ab7c --- /dev/null +++ b/docs/target_development/provisioning_ota_system.md @@ -0,0 +1,195 @@ +# Provisioning the Release System + +Publishing a FarmBotOS release requires coordination of a few different systems. + +* FarmBot Web App +* FarmBot OS +* NervesHub +* CircleCI +* GitHub branches and releases + +## Legacy Release System + +The legacy system is somewhat simpiler. It goes as follows: + +### Pull request into `master` branch + +```bash +git checkout master +git merge staging +git push origin master +``` + +Obviously this will not actually work because of testing and things, but that +is what happens behind the scenes on GitHub. + +### CircleCI builds release + +Once merged into master CircleCI will create a `draft` release on GitHub. This +must be QA'd and confirmed manually before publishing. Once published, FarmBot +will check the `OS_AUTO_UPDATE_URL` in the JWT. + +### Beta updates + +Users may opt into beta updates by settings `os_beta_updates: true` on their +device's `FbosConfig` endpoint. + +Beta releases are constructed by creating a tag off of the `staging` branch. + +1) update `VERSION`. + Should follow `X.Y.Z-rcN` + +2) update `CHANGELOG.md`. + Topmost version should contain: `vX.Y.Z` + +3) Commit release. + Message should follow format: `Release vX.Y.Z-rcN` + +4) push `staging` + `git push origin staging` + +5) tag + `git tag v$(cat VERSION)` + `git push origin v$(cat VERSION)` + +## NervesHub System + +The NervesHub system is simpiler to use, but more complex to setup. + +### User registration + +Create a admin user. This should be the same `ADMIN_EMAIL` used in +the WebApp configuration. + +```bash +mix nerves_hub.user register +Email address: admin@farmbot.io +Name: farmbot +NervesHub password: *super secret* +Local password: *super duper secret* +``` + +```bash +mix nerves_hub.product create +name: farmbot +Local password: *super duper secret* +``` + +### Signing keys + +Now a choice will need to be made. + +If fwup signing keys existed beforehand (they did for FarmBot Inc) do: + +```bash +mix nerves_hub.key import +Local password: *super duper secret* +``` + +If new keys are required (probably named "prod") do: + +```bash +mix nerves_hub.key create +Local password: *super duper secret* +``` + +### Exporting certs and keys + +The API and CI need copies of these keys and certs. +These certs need to be updated before they expire. By default they are good for +1 year + +```bash +mix nerves_hub.user cert export +Local password: *super duper secret* +User certs exported to: +tar -xf -C nerves-hub/ +``` + +```bash +mix nerves_hub.key export prod +Local password: *super duper secret* +Fwup keys exported to: +tar -xf -C nerves-hub/ +``` + +You will also need the CA cert bundle for the WebApp: +(this may only work for BASH) + +```bash +REPO_URL=https://raw.githubusercontent.com/nerves-hub/nerves_hub_cli/master/priv/master/priv/ca_certs +{ \ + curl -s $REPO_URL/root-ca.pem | head -20 \ +&& curl -s $REPO_URL/intermediate-server-ca.pem | head -20 \ +&& curl -s $REPO_URL/intermediate-user-ca.pem | head -20; \ +} > nerves-hub/nerves-hub-ca-certs.pem +``` + +Now the FarmBot API needs the values of in it's environment: + +* `NERVES_HUB_KEY` -> + `heroku config:set NERVES_HUB_KEY="$(cat nerves-hub/key.pem)" --app $APP` +* `NERVES_HUB_CERT` -> + `heroku config:set NERVES_HUB_CERT="$(cat nerves-hub/cert.pem)" --app $APP` +* `NERVES_HUB_CA` -> + `heroku config:set NERVES_HUB_CA="$(cat nerves-hub/ca.pem)" --app $APP` + +CircleCI will need: + +* `NERVES_HUB_KEY` -> `base64 $(cat nerves-hub/key.pem)` +* `NERVES_HUB_CERT` -> `base64 $(cat nerves-hub/cert.pem)` +* `NERVES_HUB_FW_PRIVATE_KEY` -> `base64 $(cat nerves-hub/.priv)` +* `NERVES_HUB_FW_PUBLIC_KEY` -> `base64 $(cat nerves-hub/.pub)` + +### Provisioning and Tags + +Tags/Deployments follow this structure: + +```json +[ + "application:", + "channel:" +] +``` + +NOTE: the tags **NOT** json objects, they are simple strings +split by a `:` character. This is done _only_ for readability. + +where `MIX_ENV` will be one of: + +* `dev` +* `prod` + +and `CHANNEL` will be one of: + +* `beta` +* `stable` + +There should be at least one deployment matching the following +tags: + +* `["application:dev", "channel:stable"]` + a development FBOS release on the `stable` channel +* `["application:prod", "channel:stable"]` + a production FBOS release on the `stable` channel +* `["application:dev", "channel:beta"]` + a development FBOS release on the `beta` channel +* `["application:prod", "channel:beta"]` + a production FBOS release on the `beta` channel +* `["application:dev", "channel:stable"]` + a development FBOS release on the `stable` channel +* `["application:prod", "channel:stable"]` + a production FBOS release on the `stable` channel +* `["application:dev", "channel:beta"]` + a development FBOS release on the `beta` channel +* `["application:prod", "channel:beta"]` + a production FBOS release on the `beta` channel + +### First time setup + +```bash +heroku config:set NERVES_HUB_CERT="$NERVES_HUB_CERT" --app=$HEROKU_APPNAME +heroku config:set NERVES_HUB_KEY="$NERVES_HUB_KEY" --app=$HEROKU_APPNAME +heroku config:set NERVES_HUB_CA="$NERVES_HUB_CA" --app=$HEROKU_APPNAME +heroku config:set NERVES_HUB_ORG="$NERVES_HUB_ORG" --app=$HEROKU_APPNAME +``` diff --git a/docs/target_development/releasing_target_firmware.md b/docs/target_development/releasing_target_firmware.md index d67b9ab7c..63360ab07 100644 --- a/docs/target_development/releasing_target_firmware.md +++ b/docs/target_development/releasing_target_firmware.md @@ -1,195 +1,35 @@ -# Provisioning the Release System +# Publishing OTAs -Publishing a FarmBotOS release requires coordination of a few different systems. +## Beta -* FarmBot Web App -* FarmBot OS -* NervesHub -* CircleCI -* GitHub branches and releases - -## Legacy Release System - -The legacy system is somewhat simpiler. It goes as follows: - -### Pull request into `master` branch - -```bash -git checkout master -git merge staging -git push origin master -``` - -Obviously this will not actually work because of testing and things, but that -is what happens behind the scenes on GitHub. - -### CircleCI builds release - -Once merged into master CircleCI will create a `draft` release on GitHub. This -must be QA'd and confirmed manually before publishing. Once published, FarmBot -will check the `OS_AUTO_UPDATE_URL` in the JWT. - -### Beta updates - -Users may opt into beta updates by settings `os_beta_updates: true` on their -device's `FbosConfig` endpoint. - -Beta releases are constructed by creating a tag off of the `staging` branch. - -1) update `VERSION`. - Should follow `X.Y.Z-rcN` - -2) update `CHANGELOG.md`. - Topmost version should contain: `vX.Y.Z` - -3) Commit release. - Message should follow format: `Release vX.Y.Z-rcN` - -4) push `staging` - `git push origin staging` - -5) tag - `git tag v$(cat VERSION)` - `git push origin v$(cat VERSION)` - -## NervesHub System - -The NervesHub system is simpiler to use, but more complex to setup. - -### User registration - -Create a admin user. This should be the same `ADMIN_EMAIL` used in -the WebApp configuration. - -```bash -mix nerves_hub.user register -Email address: admin@farmbot.io -Name: farmbot -NervesHub password: *super secret* -Local password: *super duper secret* -``` - -```bash -mix nerves_hub.product create -name: farmbot -Local password: *super duper secret* -``` - -### Signing keys - -Now a choice will need to be made. - -If fwup signing keys existed beforehand (they did for FarmBot Inc) do: - -```bash -mix nerves_hub.key import -Local password: *super duper secret* -``` - -If new keys are required (probably named "prod") do: - -```bash -mix nerves_hub.key create -Local password: *super duper secret* -``` - -### Exporting certs and keys - -The API and CI need copies of these keys and certs. -These certs need to be updated before they expire. By default they are good for -1 year +Publish an OTA to the `beta` channel can be done by: ```bash -mix nerves_hub.user cert export -Local password: *super duper secret* -User certs exported to: -tar -xf -C nerves-hub/ +./scripts/release_candidate.sh ``` -```bash -mix nerves_hub.key export prod -Local password: *super duper secret* -Fwup keys exported to: -tar -xf -C nerves-hub/ -``` +## QA -You will also need the CA cert bundle for the WebApp: -(this may only work for BASH) +Publish an OTA to the `qa` channel can be done by pushing a new branch +to github with `qa/` prefix. ```bash -REPO_URL=https://raw.githubusercontent.com/nerves-hub/nerves_hub_cli/master/priv/master/priv/ca_certs -{ \ - curl -s $REPO_URL/root-ca.pem | head -20 \ -&& curl -s $REPO_URL/intermediate-server-ca.pem | head -20 \ -&& curl -s $REPO_URL/intermediate-user-ca.pem | head -20; \ -} > nerves-hub/nerves-hub-ca-certs.pem -``` - -Now the FarmBot API needs the values of in it's environment: - -* `NERVES_HUB_KEY` -> - `heroku config:set NERVES_HUB_KEY="$(cat nerves-hub/key.pem)" --app $APP` -* `NERVES_HUB_CERT` -> - `heroku config:set NERVES_HUB_CERT="$(cat nerves-hub/cert.pem)" --app $APP` -* `NERVES_HUB_CA` -> - `heroku config:set NERVES_HUB_CA="$(cat nerves-hub/ca.pem)" --app $APP` - -CircleCI will need: - -* `NERVES_HUB_KEY` -> `base64 $(cat nerves-hub/key.pem)` -* `NERVES_HUB_CERT` -> `base64 $(cat nerves-hub/cert.pem)` -* `NERVES_HUB_FW_PRIVATE_KEY` -> `base64 $(cat nerves-hub/.priv)` -* `NERVES_HUB_FW_PUBLIC_KEY` -> `base64 $(cat nerves-hub/.pub)` - -### Provisioning and Tags - -Tags/Deployments follow this structure: - -```json -[ - "application:", - "channel:" -] +git checkout -b qa/ +git push origin qa/ ``` -NOTE: the tags **NOT** json objects, they are simple strings -split by a `:` character. This is done _only_ for readability. +## Production -where `MIX_ENV` will be one of: - -* `dev` -* `prod` - -and `CHANNEL` will be one of: - -* `beta` -* `stable` - -There should be at least one deployment matching the following -tags: - -* `["application:dev", "channel:stable"]` - a development FBOS release on the `stable` channel -* `["application:prod", "channel:stable"]` - a production FBOS release on the `stable` channel -* `["application:dev", "channel:beta"]` - a development FBOS release on the `beta` channel -* `["application:prod", "channel:beta"]` - a production FBOS release on the `beta` channel -* `["application:dev", "channel:stable"]` - a development FBOS release on the `stable` channel -* `["application:prod", "channel:stable"]` - a production FBOS release on the `stable` channel -* `["application:dev", "channel:beta"]` - a development FBOS release on the `beta` channel -* `["application:prod", "channel:beta"]` - a production FBOS release on the `beta` channel - -### First time setup +Publish an OTA to the `stable` channel can be done by: ```bash -heroku config:set NERVES_HUB_CERT="$NERVES_HUB_CERT" --app=$HEROKU_APPNAME -heroku config:set NERVES_HUB_KEY="$NERVES_HUB_KEY" --app=$HEROKU_APPNAME -heroku config:set NERVES_HUB_CA="$NERVES_HUB_CA" --app=$HEROKU_APPNAME -heroku config:set NERVES_HUB_ORG="$NERVES_HUB_ORG" --app=$HEROKU_APPNAME -``` +git checkout -b rel- +# update VERSION +# update CHANGELOG.md +# update README.md +git commit -am "Release v" +git push origin rel- +# open pull request +# merge pull request +# publish release once CI has completed +``` \ No newline at end of file From be4241a2b63b7145bb3dd6dcdbe8e677a2fe00a1 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Mon, 30 Dec 2019 12:53:06 -0600 Subject: [PATCH 58/58] Release v9.0.0 --- CHANGELOG.md | 2 ++ README.md | 2 +- VERSION | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f96f68f6d..4c227c1df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ # 9.0.0 * Run updates on Nerves systems. + * Updates to the way `set_servo_angle` is handled. + * Fixes rip0 firmware flash issues. # 8.2.4 * Bug fixes diff --git a/README.md b/README.md index 7bc42c1f6..09f99fb1d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Download the version of FarmBot OS that corresponds to the FarmBot kit and compu | FarmBot Kit | Computer | Download Link | | --- | --- | --- | -| Genesis v1.2, Genesis v1.3, Genesis v1.4, Genesis XL v1.4 | Raspberry Pi 3 | [Download FBOS](https://github.com/FarmBot/farmbot_os/releases/download/v8.2.4/farmbot-rpi3-8.2.4.img) | +| Genesis v1.2, Genesis v1.3, Genesis v1.4, Genesis XL v1.4 | Raspberry Pi 3 | [Download FBOS](https://github.com/FarmBot/farmbot_os/releases/download/v9.0.0/farmbot-rpi3-9.0.0.img) | | Express v1.0, Express XL v1.0 | Raspberry Pi Zero W | Coming soon | --- diff --git a/VERSION b/VERSION index 87dbb2b8a..f7ee06693 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.0-rc10 \ No newline at end of file +9.0.0