diff --git a/.gitignore b/.gitignore
index 259148f..3f6ce35 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
+# PlatformIO Files
+.pio
+.vscode
+
# Prerequisites
*.d
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..7c486f1
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,67 @@
+# Continuous Integration (CI) is the practice, in software
+# engineering, of merging all developer working copies with a shared mainline
+# several times a day < https://docs.platformio.org/page/ci/index.html >
+#
+# Documentation:
+#
+# * Travis CI Embedded Builds with PlatformIO
+# < https://docs.travis-ci.com/user/integration/platformio/ >
+#
+# * PlatformIO integration with Travis CI
+# < https://docs.platformio.org/page/ci/travis.html >
+#
+# * User Guide for `platformio ci` command
+# < https://docs.platformio.org/page/userguide/cmd_ci.html >
+#
+#
+# Please choose one of the following templates (proposed below) and uncomment
+# it (remove "# " before each line) or use own configuration according to the
+# Travis CI documentation (see above).
+#
+
+
+#
+# Template #1: General project. Test it using existing `platformio.ini`.
+#
+
+# language: python
+# python:
+# - "2.7"
+#
+# sudo: false
+# cache:
+# directories:
+# - "~/.platformio"
+#
+# install:
+# - pip install -U platformio
+# - platformio update
+#
+# script:
+# - platformio run
+
+
+#
+# Template #2: The project is intended to be used as a library with examples.
+#
+
+# language: python
+# python:
+# - "2.7"
+#
+# sudo: false
+# cache:
+# directories:
+# - "~/.platformio"
+#
+# env:
+# - PLATFORMIO_CI_SRC=path/to/test/file.c
+# - PLATFORMIO_CI_SRC=examples/file.ino
+# - PLATFORMIO_CI_SRC=path/to/test/directory
+#
+# install:
+# - pip install -U platformio
+# - platformio update
+#
+# script:
+# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..052f1ca
--- /dev/null
+++ b/README.md
@@ -0,0 +1,87 @@
+# ![BrewPi Legacy Remix Logo](https://raw.githubusercontent.com/brewpi-remix/brewpi-www-rmx/master/images/brewpi_logo.png)
+
+# BrewPi Family Arduino Uno Test
+
+This firmware will allow you to test the setup of your BrewPi family Arduino Uno. The program will:
+
+1. Turn the onboard LED on
+1. Scan for an I2C device. If found, it will use A0 for sensor tests; otherwise, it will use the original A4 pin for sensors. If the program detects an I2C LCD, a test message will display
+1. Check the OneWire
+ 1. Display if parasitic sensors are present on the bus
+ 1. Display the number and type of sensors found
+ 1. Display the address and current temperature for each sensor
+1. Test the heat and cool relays (pins 5 and 6)
+1. Clear the EEPROM to avoid issues saving the sensors later on
+
+# ![Arduino Uno Pin Diagram](ttps://raw.githubusercontent.com/brewpi-remix/uno-test/master/images//Arduino-Uno-Pin-Diagram.png)
+
+It will automatically check for an I2C display, and if found, will show a test on the display. It will then scan the proper pin for the variant; A4 if no I2C is detected, and A0 if an I2C is present.
+
+Results using a standard or parallel LCD system:
+
+```
+BrewPi Family Arduino Uno Test beginning.
+
+Scanning I2C bus.
+No I2C devices found.
+I2C scan complete.
+
+Checking 18 for OneWire devices.
+Parasitic power is off for the OneWire bus on pin 18.
+Detected 2 devices on pin 18.
+Device 18:0 is a DS18B20 device.
+Device 18:1 is a DS18B20 device.
+Sensor: 18:0 Address: 28:EE:7E:28:2C:15:0:BB Temperature: 18.94°C
+Sensor: 18:1 Address: 28:EE:B1:35:23:15:0:C Temperature: 21.62°C
+
+Testing relay pin 5.
+Turning pin 5 on.
+Turning pin 5 off.
+Relay test on pin 5 complete.
+
+Testing relay pin 6.
+Turning pin 6 on.
+Turning pin 6 off.
+Relay test on pin 6 complete.
+
+Clearing EEPROM.
+EEPROM clear complete.
+
+BrewPi Family Arduino Uno Test complete.
+```
+
+Results using an I2C LCD system:
+
+```
+BrewPi Family Arduino Uno Test beginning.
+
+Scanning I2C bus.
+I2C device found at address 0x3F.
+Setting LCD display at 0x3F.
+I2C scan complete.
+
+Checking 14 for OneWire devices.
+Parasitic power is off for the OneWire bus on pin 14.
+Detected 2 devices on pin 14.
+Device 14:0 is a DS18B20 device.
+Device 14:1 is a DS18B20 device.
+Sensor: 14:0 Address: 28:EE:7E:28:2C:15:0:BB Temperature: 19.00°C
+Sensor: 14:1 Address: 28:EE:B1:35:23:15:0:C Temperature: 19.31°C
+
+Testing relay pin 5.
+Turning relay on pin 5 on.
+Turning relay on pin 5 off.
+Relay test on pin 5 complete.
+
+Testing relay pin 6.
+Turning relay on pin 6 on.
+Turning relay on pin 6 off.
+Relay test on pin 6 complete.
+
+Clearing EEPROM.
+EEPROM clear complete.
+
+BrewPi Family Arduino Uno Test complete.
+```
+
+# ![LCD Display](ttps://raw.githubusercontent.com/brewpi-remix/uno-test/master/images//i2c_test.jpg)
diff --git a/data/index.htm b/data/index.htm
new file mode 100644
index 0000000..b6baad5
--- /dev/null
+++ b/data/index.htm
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ Index
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/scripts.js b/data/scripts.js
new file mode 100644
index 0000000..e69de29
diff --git a/data/styles.css b/data/styles.css
new file mode 100644
index 0000000..e69de29
diff --git a/firmware/firmware.hex b/firmware/firmware.hex
new file mode 100644
index 0000000..7b69542
--- /dev/null
+++ b/firmware/firmware.hex
@@ -0,0 +1,770 @@
+:100000000C94B6010C94DE010C94DE010C94DE011C
+:100010000C94DE010C94DE010C94DE010C94DE01E4
+:100020000C94DE010C94DE010C94DE010C94DE01D4
+:100030000C94DE010C94DE010C94DE010C94DE01C4
+:100040000C94190F0C94DE010C94E00F0C94BA0F71
+:100050000C94DE010C94DE010C94DE010C94DE01A4
+:100060000C94E3030C94DE01000000002300260042
+:10007000290053656E736F723A0925643A25640945
+:10008000416464726573733A2025783A25783A257D
+:10009000783A25783A25783A25783A25783A2578B5
+:1000A0000954656D70657261747572653A202544F6
+:1000B000C2B0430A004465766963652025643A2529
+:1000C00064206973202573206465766963652E0A50
+:1000D00000446574656374656420256420646576F6
+:1000E00069636573206F6E2070696E2025642E0A27
+:1000F0000050617261736974696320706F77657213
+:1001000020697320257320666F7220746865204F04
+:100110006E655769726520627573206F6E20706915
+:100120006E2025642E0A000A436865636B696E675A
+:1001300020256420666F72204F6E655769726520B6
+:10014000646576696365732E0A0052656C61792077
+:1001500074657374206F6E2070696E20256420634F
+:100160006F6D706C6574652E0A005475726E696EE1
+:10017000672072656C6179206F6E2070696E202532
+:1001800064206F66662E0A005475726E696E672071
+:1001900072656C6179206F6E2070696E2025642015
+:1001A0006F6E2E0A000A54657374696E672072655B
+:1001B0006C61792070696E2025642E0A00005EBC97
+:1001C000E2613FDD83C29C7E20A3FD1F41009D2391
+:1001D000BE46DB65F88C11AF32CA57E974000000E7
+:1001E00000240027002A0000000000250028002B22
+:1001F00000040404040404040402020202020203D0
+:1002000003030303030102040810204080010204D9
+:10021000081020010204081020000000080002015C
+:100220000000030407000000000000000066616C8D
+:10023000736500747275650053657474696E672028
+:100240004C434420646973706C617920617420258B
+:10025000582E0A00493243207363616E20636F6D2C
+:10026000706C6574652E0A004E6F2049324320641D
+:1002700065766963657320666F756E642E0A005536
+:100280006E6B6E6F776E206572726F722066726F22
+:100290006D204932432064657669636520666F7519
+:1002A0006E642061742061646472657373202558E4
+:1002B0002E0A004932432064657669636520666FC3
+:1002C000756E6420617420616464726573732025A7
+:1002D000582E0A000A5363616E6E696E67204932B8
+:1002E00043206275732E0A00454550524F4D2063DE
+:1002F0006C65617220636F6D706C6574652E0A00A9
+:100300000A436C656172696E6720454550524F4DD6
+:100310002E0A000A4272657750692046616D696C49
+:10032000792041726475696E6F20556E6F20546537
+:10033000737420636F6D706C6574652E0A000A42D9
+:1003400072657750692046616D696C7920417264ED
+:1003500075696E6F20556E6F2054657374206265E9
+:1003600067696E6E696E672E0A00EB1211241FBE5C
+:10037000CFEFD8E0DEBFCDBF23E0AAEEB1E001C0F1
+:100380001D92A336B207E1F711E0A0E0B1E0EAE187
+:10039000FFE202C005900D92AA3EB107D9F711E025
+:1003A000C6EBD1E004C02197FE010E94E314C53BD7
+:1003B000D107C9F70E947F100C948B170C94000092
+:1003C000FC01538D448D252F30E0842F90E0821B5B
+:1003D000930B541710F0CF96089501970895FC01E0
+:1003E000918D828D981761F0828DDF01A80FB11D6C
+:1003F0005D968C91928D9F5F9F73928F90E0089590
+:100400008FEF9FEF0895FC01918D828D981731F049
+:10041000828DE80FF11D858D90E008958FEF9FEF9D
+:100420000895FC01918D228D892F90E0805C9F4F73
+:10043000821B91098F739927089580E090E0892BA2
+:1004400029F00E949D0E81110C94000008954091A6
+:100450002B02262F30E0240F311D21323105DCF430
+:10046000209174022430C9F4FC0180E090E08617EA
+:1004700058F430912B022191DC01A55FBD4FA30FF1
+:10048000B11D2C930196F3CF80912B02680F6093DE
+:100490002B0280E0089581E0089582E00895089598
+:1004A00008950895E091A3028091A202E81730F424
+:1004B000F0E0E651FE4F808190E008958FEF9FEFCE
+:1004C00008959091A3028091A202981750F4E92F09
+:1004D000F0E0E651FE4F208130E09F5F9093A30251
+:1004E00002C02FEF3FEFC90108958091A20290E072
+:1004F0002091A302821B91090895CF92DF92EF927F
+:10050000FF920F931F93CF93DF937C01CB018A015E
+:1005100020917A02222389F0EB016B01C40ED51ED3
+:10052000CC15DD0569F06991D701ED91FC91019041
+:10053000F081E02DC7010995F3CF642F0E942702B7
+:10054000C801DF91CF911F910F91FF90EF90DF9045
+:10055000CF900895CF93DF931F92CDB7DEB7698315
+:1005600020917A022223D1F020919D02203240F086
+:1005700021E030E0FC013383228380E090E015C06D
+:1005800080917B02E82FF0E0E458FD4F9981908341
+:100590008F5F80937B0280939D0205C061E0CE0156
+:1005A00001960E94270281E090E00F90DF91CF91A9
+:1005B0000895089580E090E00895FC01848DDF01A6
+:1005C000A80FB11DA35ABF4F2C91848D90E00196C6
+:1005D0008F739927848FA689B7892C93A089B189B5
+:1005E0008C91837080648C93938D848D981306C056
+:1005F0000288F389E02D80818F7D80830895CF93D9
+:10060000DF93EC01888D8823C9F0EA89FB8980811A
+:1006100085FD05C0A889B9898C9186FD0FC00FB6EC
+:1006200007FCF5CF808185FFF2CFA889B9898C912D
+:1006300085FFEDCFCE010E94DD02E7CFDF91CF91A4
+:100640000895FC01248131E030937A0220939C02CA
+:1006500010927B0210929D028385682B8AE493E0BE
+:100660000E94AA020C94AA0B0F931F93CF938C01A4
+:10067000C62F0E9421036C2F6460C8010E942103D1
+:100680006C2F6B7FC8010E94210383EC90E00197DF
+:10069000F1F7CF911F910F9108950F931F93CF936F
+:1006A000DF938C01C62FD42F607F642B0E9434030C
+:1006B00080E1C89FB00111246D2BC801DF91CF915B
+:1006C0001F910F910C94340341E00E944D0381E08F
+:1006D00090E00895ECEBF0E080818A7B808360E01D
+:1006E00082E10E94AE0D60E083E10C94AE0D1092A9
+:1006F000740281E08093730210924E0261E082E105
+:100700000E94AE0D61E083E10E94AE0DE9EBF0E0E6
+:1007100080818E7F808380818D7F808388E4809339
+:10072000B80085E48093BC000895CF93DF9391E0F7
+:1007300090930A02882361F0C091B800D091BA006A
+:100740000E946A030E947703D093BA00C093B80056
+:10075000DF91CF91089585ED8093BC008091760262
+:1007600090917702A0917802B09179020796A11D2D
+:10077000B11D23E0B695A795979587952A95D1F752
+:100780002091BC0024FF1CC040917602509177025A
+:100790006091780270917902452B462B472B81F3AB
+:1007A0000097A105B10541F025E32A95F1F7000076
+:1007B0000197A109B109E4CF809175020C949503CA
+:1007C0001092740208951F920F920FB60F92112487
+:1007D0002F933F934F935F936F937F938F939F9349
+:1007E000AF93BF93EF93FF938091B900887F8036DA
+:1007F00009F49CC068F5883209F45BC090F480313C
+:1008000009F454C038F4882309F4F6C0883009F498
+:100810004DC0F6C0883109F44CC0803209F45DC087
+:10082000EFC0803409F468C048F4803309F455C03F
+:10083000883309F0E5C080937202D8C0803509F48E
+:100840004FC0883509F45DC0883409F0D9C0D6C0DE
+:10085000883909F4C7C0A8F4883709F467C038F4A8
+:10086000883609F463C0803709F460C0C9C088388D
+:1008700009F4B8C0803909F45FC0803809F0C0C0FD
+:100880005BC0803B09F486C038F4803A09F466C046
+:10089000883A09F47FC0B4C0803C09F4A7C0883C02
+:1008A00009F4A4C0883B09F48AC0AAC080914F0211
+:1008B00010C09091710280917002981770F5E091CC
+:1008C000710281E08E0F80937102F0E0E05BFD4FDA
+:1008D00080818093BB0085EC86C0809372028EC0BD
+:1008E000E091710281E08E0F809371028091BB00D4
+:1008F000F0E0E05BFD4F8083909171028091700287
+:100900006EC0E091710281E08E0F80937102809140
+:10091000BB00F0E0E05BFD4F8083809173028111AA
+:100920006DC081E080934E0284EA61C083E08093D1
+:10093000740210924D02CFCF80914D02803208F0A8
+:1009400051C0E0914D0281E08E0F80934D02809165
+:10095000BB00F0E0E35DFD4F8083BDCF85EC80936D
+:10096000BC001092740280914D02803230F4E0910C
+:100970004D02F0E0E35DFD4F108260914D0270E0AA
+:10098000E0919E02F0919F028DE292E00995109213
+:100990004D0236C084E08093740210922C021092B3
+:1009A0002B02E091A002F091A102099580912B0207
+:1009B000811105C081E080932B0210920B02E0911F
+:1009C0002C0281E08E0F80932C02F0E0E55FFD4F5A
+:1009D00080818093BB0090912C0280912B0298170C
+:1009E00008F479CF85E88093BC000AC085EC809339
+:1009F000BC001092740204C0109272020E94AB03F9
+:100A0000FF91EF91BF91AF919F918F917F916F91E6
+:100A10005F914F913F912F910F900FBE0F901F90BC
+:100A20001895DC0180E0615098F02D91982F922765
+:100A3000E92FEF70F0E0E354FE4F249192959F7000
+:100A4000E92FF0E0E353FE4FE491822F8E27EBCFA6
+:100A50000895FC0190810180F281E02DF89481815C
+:100A6000892B81832281892F809528232283A7E0E7
+:100A7000B0E01197F1F7218182238183A3E2B0E0F6
+:100A80001197F1F780817894EFECF0E03197F1F76E
+:100A9000982381E009F480E00895FC0190810180B1
+:100AA000F281E02D892F809560FF12C0F894228199
+:100AB000822382838181892B8183A3E2B0E0119715
+:100AC000F1F78281982B9283789487ED90E011C0A2
+:100AD000F8942281822382838181892B8183AFEFE5
+:100AE000B0E01197F1F78281982B928378948FE090
+:100AF00090E00197F1F70895DF92EF92FF920F9344
+:100B00001F93CF93DF93EC01D62EE42E08E010E084
+:100B1000FF24F39461E08D2D8F2109F460E0CE0174
+:100B20000E944D05FF0C01501109A1F7E11010C002
+:100B3000F894E981FA819181888180958923818364
+:100B4000E981FA81928188818095892382837894D2
+:100B5000DF91CF911F910F91FF90EF90DF9008955B
+:100B6000EF92FF920F931F93CF93DF938C017B0142
+:100B700040E065E50E947C05E70188E0E80EF11C95
+:100B8000699140E0C8010E947C05CE15DF05C1F7E0
+:100B9000DF91CF911F910F91FF90EF900895DC01AD
+:100BA0002C911196ED91FC911297F8948181922FDE
+:100BB00090958923818378948DE743E050E08150BC
+:100BC00021F1DA011197F1F730813223C1F3F89462
+:100BD0008281892382838181822B81837894ABE710
+:100BE000B7E01197F1F7F89481819823918383E11D
+:100BF00091E00197F1F78081282381E009F080E0FE
+:100C00007894E3E6F6E03197F1F708954F925F921A
+:100C10006F927F928F929F92AF92BF92CF92DF920C
+:100C2000EF92FF920F931F93CF93DF938C017B0181
+:100C3000EA01FC01818592850E94CF05882309F491
+:100C400043C0B701F801818592850E94B00540E05C
+:100C50006EEBF801818592850E947C057E015E0124
+:100C6000F9E0AF0EB11C6E01F8016184728488E076
+:100C7000882E912C512C44244394C3010E942905B1
+:100C800081115428440CF1E08F1A9108B1F7F60154
+:100C900051926F01AE16BF0639F7F8018185928532
+:100CA0000E94CF05813081F4F70181917F0181118C
+:100CB00004C0EA15FB05C1F707C068E0CE010E9439
+:100CC000110591E02885281390E0892FDF91CF91BD
+:100CD0001F910F91FF90EF90DF90CF90BF90AF905A
+:100CE0009F908F907F906F905F904F900895FF92AC
+:100CF0000F931F93CF93DF93182FF92E9F938F930A
+:100D000085EA91E09F938F931F9204E00F93C6E5CD
+:100D1000D3E0DF93CF930E94920961E0812F0E947C
+:100D2000FB0D61E0812F0E94AE0D68EE73E080E064
+:100D300090E00E94370EFF921F9388E891E09F9306
+:100D40008F931F920F93DF93CF930E94920960E0DD
+:100D5000812F0E94AE0D68EE73E080E090E00E946B
+:100D6000370EFF921F938AE691E09F938F931F9215
+:100D70000F93DF93CF930E9492096AEF70E080E0B7
+:100D800090E00E94370E61E0812F0E94AE0DFF922D
+:100D90001F938AE491E09F938F931F920F93DF93A9
+:100DA000CF930E9492098DB79EB780960FB6F894A4
+:100DB0009EBF0FBE8DBFDF91CF911F910F91FF900E
+:100DC00008954F925F926F927F928F929F92AF920F
+:100DD000BF92CF92DF92EF92FF920F931F93CF9328
+:100DE000DF93CDB7DEB7EE970FB6F894DEBF0FBE38
+:100DF000CDBF8C011F938F9387E291E09F938F93D8
+:100E00001F9284E08F9386E593E09F938F930E94D7
+:100E1000920960E0802F0E94FB0DC8019927FC0118
+:100E2000EB5FFD4FE491E88FFC01EF50FE4FE49142
+:100E3000F0E0EE0FFF1FE859FF4F859194919A8FD4
+:100E4000898F1BA21DA21CA2FE01B3969E01255EE6
+:100E50003F4F0FB6F894DEBF0FBECDBFDF011E922D
+:100E6000A217B307E1F71F8A1E8A1A82CE0148969D
+:100E70009B878A8718861986198289E08C8381E08E
+:100E80008D838E838F831292E217F307E1F7FF249D
+:100E9000F394BE01615D7F4F8A859B850E94C50CDE
+:100EA0008823E1F067E0CE018F960E9411059EA98C
+:100EB0008913EFCF88858F5F88878FA5883209F4E3
+:100EC000CDC130F4803109F4C9C1823211F7C6C1F5
+:100ED0008B3309F4C3C18234E1F6C0C18981882310
+:100EE00019F080E591E002C083E591E01F930F9334
+:100EF0009F938F9381EF90E09F938F931F9294E045
+:100F0000D92EDF9226E5E22E23E0F22EFF92EF9219
+:100F10000E9492091F930F9388851F928F9381EDF2
+:100F200090E09F938F931F92DF92FF92EF920E9427
+:100F300092090FB6F894DEBF0FBECDBFE12CF12CA5
+:100F400035EBC32E30E0D32E44E0942E56E5A52E8B
+:100F500053E0B52E888590E0E816F9060CF05EC0E7
+:100F60004E2DBE01695C7F4FCE0101960E94470D58
+:100F70001FA21EA219A618A61BA61AA660E070E062
+:100F8000CE0186960E94630F811105C0CE01869620
+:100F90000E948A0F08C01BA61AA66AEA71E08EA1F9
+:100FA0009FA10E9484178FA9823281F028F480319A
+:100FB00081F467E571E00FC0883229F08B3349F482
+:100FC00064E771E008C061E671E005C06BE671E0BE
+:100FD00002C06DE771E0CE0186960E94820D8FA15E
+:100FE0008F938EA18F93FF92EF921F930F93DF92B7
+:100FF000CF921F929F92BF92AF920E9492098EA1B0
+:101000009FA10FB6F894DEBF0FBECDBF009711F0C1
+:101010000E9427163FEFE31AF30A9CCF68EE73E0B5
+:1010200080E090E00E94370E8A859B850E94CF0564
+:1010300040E06CEC8A859B850E947C05498164E4D4
+:101040008A859B850E947C058D81882309F450C088
+:10105000EC818E81882349F18981811126C08FB767
+:10106000F894C090A402D090A502E090A602F0905F
+:10107000A7028FBF8A859B850E9429058130C1F117
+:101080002FB7F8948091A4029091A502A091A60296
+:10109000B091A7022FBF8C199D09AE09BF098E3EE2
+:1010A0009240A105B10530F323C0E950E33040F48C
+:1010B000F0E0EE0FFF1FEA5FFE4F8081918102C0DA
+:1010C0008EEE92E06C01990FEE08FF088A8188236A
+:1010D00021F060E08B810E94AE0DC701B6010E9435
+:1010E000370E8A81882321F061E08B810E94AE0D4A
+:1010F0006EEE72E080E090E00E94370EE12CF12C61
+:10110000F2E7AF2EF0E0BF2EA4E09A2EB6E5CB2E8C
+:10111000B3E0DB2E888590E0E816F9060CF0EBC012
+:101120008E2C4E2DBE01615D7F4FCE0101960E9437
+:10113000470D811107C0712C612C7EEF572EE2EC18
+:101140004E2E53C0AE014A5D5F4FBE01615D7F4FC1
+:10115000CE0101960E940606882371F12FA130E08E
+:10116000C901982F8827990F990F990F6EA158E000
+:10117000659FB00111249C01262B372B8FA5803150
+:10118000F1F46DA56623D9F070E08CA5AB01481B86
+:101190005109CA019695982F8827979587950E949F
+:1011A000991460527109207F53E0220F331F5A9522
+:1011B000E1F7620F731F04C060E874EE01C0B9016B
+:1011C000613854EE75070CF4B6CF072E000C880B6F
+:1011D000990B0E94371320E030E040E05CE30E946E
+:1011E0009613762E672E582E492E482DBE016A5D25
+:1011F0007F4FCE0101960E94470D4F925F926F92F2
+:101200007F928DA51F928F938CA51F928F938BA594
+:101210001F928F938AA51F928F9389A51F928F93F8
+:1012200088A51F928F938FA11F928F938EA11F92DB
+:101230008F93FF92EF921F930F93BF92AF921F92E3
+:101240009F92DF92CF920E9492098FEFE81AF80ADC
+:101250000FB6F894DEBF0FBECDBF5CCF89858F5F20
+:101260008987898181111CC08A859B850E94CF0551
+:10127000BE01615D7F4F8A859B850E94B00540E07D
+:1012800064EB8A859B850E947C058A859B850E94EC
+:101290002905E82E8A859B850E94CF05EE2049F11D
+:1012A0008FA58031F9F0AE014A5D5F4FBE01615DEF
+:1012B0007F4FCE0101960E940606882379F08AA509
+:1012C0008F3351F020F48F3149F489E00CC08F3511
+:1012D00039F08F3739F002C08AE005C080E003C0E2
+:1012E0008BE001C08CE09C81981708F0D2CD8C83F4
+:1012F000D0CDF982D5CFEE960FB6F894DEBF0FBEF3
+:10130000CDBFDF91CF911F910F91FF90EF90DF90B4
+:10131000CF90BF90AF909F908F907F906F905F9095
+:101320004F9008954F925F926F927F928F929F920B
+:10133000AF92BF92CF92DF92EF92FF920F931F93E3
+:10134000CF93DF93CDB7DEB727970FB6F894DEBF04
+:101350000FBECDBF0C8D1D8DCE8CDF8C80915603C2
+:1013600090915703801791070CF4DDC1E0915B0366
+:10137000F0915C03309729F08091590390915A03C2
+:101380000995809158038823D9F087E0E1EAF1E0DC
+:10139000DE01119601900D928A95E1F7FE01E00FB2
+:1013A000F11F60818091590390915A030E949C0F14
+:1013B00068E871E08091590390915A030E94B80F38
+:1013C0008E01005E1F4F76018FEFE81AF80AF601D2
+:1013D0006491662309F49CC1653209F08DC16701EF
+:1013E000FFEFCF1ADF0AF7018491882309F48BC13C
+:1013F000853239F48091590390915A030E949C0FD1
+:1014000082C1833761F47801F2E0EF0EF11CF8013C
+:10141000608171818091590390915A0352C1833543
+:1014200061F47801F2E0EF0EF11CF8016081718146
+:101430008091590390915A035CC1843611F089362A
+:1014400081F47801F2E0EF0EF11CF80180809180C8
+:101450000091590310915A03092C000CAA08BB08EB
+:10146000F8C0982F9D7F943409F0ACC07801F4E067
+:10147000EF0EF11CF80180809180A280B380009172
+:10148000590310915A03A5019401C501B4010E94AA
+:101490008A15882339F06BE871E0C8010E94A30F18
+:1014A000870131C124013501E89477F82FEF3FEF30
+:1014B0004FE75FE7C301B2010E948A1581110DC099
+:1014C0002FEF3FEF4FE75FE7C301B2010E943013F8
+:1014D00018161CF46FE871E0E0CF2FEF3FEF4FE7F5
+:1014E0005FE4C501B4010E948515181654F02FEF72
+:1014F0003FEF4FE75FECC501B4010E94301387FF57
+:1015000003C063E971E0C9CF20E030E0A901C50163
+:10151000B4010E94301387FF08C06DE2C8010E9429
+:101520009C0FB7FAB094B7F8B0942AE037ED43EACD
+:101530005BE3C501B4010E94EA142B013C010E9447
+:1015400056154B015C010E9435139B01AC01C30190
+:10155000B2010E94E9142B013C012AE0B501A4016B
+:10156000C8010E9412106EE2C8010E949C0F20E088
+:1015700030E040E251E4C301B2010E9496132B0116
+:101580003C010E9456154B01A12CB12C2AE0B5015B
+:10159000A401C8010E941210C501B4010E943513B4
+:1015A0009B01AC01C301B2010E94E91420E030E0CC
+:1015B00040E251E40E9496130E945615AB0160E090
+:1015C00070E059C0883751F08835A9F467E971E0B7
+:1015D0008091590390915A030E94B80F7801F2E06C
+:1015E000EF0EF11CF80140815181052E000C660BB5
+:1015F000770B20E118C0823651F08234D9F46AE9C1
+:1016000071E08091590390915A030E94B80F7801BC
+:10161000F2E0EF0EF11CF80140815181052E000C23
+:10162000660B770B22E08091590390915A030E9438
+:10163000121036CF8C3609F57801F4E0EF0EF11C6C
+:10164000F80180809180A280B380009159031091AD
+:101650005A03B7FC05C02AE0B501A401C801E7CFD1
+:101660006DE2C8010E949C0F44275527BA01481912
+:1016700059096A097B092AE0F1CF833669F47801B8
+:10168000F2E0EF0EF11CF801608180915903909116
+:101690005A030E949C0F04CF8437B1F47801F2E022
+:1016A000EF0EF11CF8012081318180915903909156
+:1016B0005A032130310519F46DE971E002C06FE978
+:1016C00071E00E94B80FECCE8435E9F47801F2E0C5
+:1016D000EF0EF11CF8012081318180915903909126
+:1016E0005A032130310519F463E372E002C06DE260
+:1016F00072E00E945B10D4CE8091590390915A03FE
+:101700000E949C0F67017601FFEFEF1AFF0A5FCE80
+:10171000E0915D03F0915E03309729F080915903C9
+:1017200090915A03099527960FB6F894DEBF0FBE25
+:10173000CDBFDF91CF911F910F91FF90EF90DF9080
+:10174000CF90BF90AF909F908F907F906F905F9061
+:101750004F9008958F929F92AF92BF92CF92DF9257
+:10176000EF92FF920F931F93CF93DF9310919D02FF
+:10177000113208F0C2C0D0919C020E94F40E6B019D
+:101780007C01C0917402CC2311F18091760290917A
+:101790007702A0917802B0917902892B8A2B8B2B4A
+:1017A00081F30E94F40E8090760290907702A090D0
+:1017B0007802B0907902DC01CB018C199D09AE0949
+:1017C000BF0988169906AA06BB06D8F682C082E031
+:1017D0008093740281E0809373028FEF8093720292
+:1017E0001092710210937002ACE7B2E0E0E5F2E013
+:1017F00080E0181721F09D9191938F5FFACF10929E
+:101800004F0290914F028D2F880F892B80934F02AA
+:1018100080914E02813089F510924E020E94F40EA2
+:101820006B017C0180914F028093BB008091760216
+:1018300090917702A0917802B0917902892B8A2B3E
+:101840008B2BA9F00E94F40E009176021091770282
+:101850002091780230917902DC01CB018C199D092D
+:10186000AE09BF09081719072A073B0790F18091B5
+:10187000BC0083FDD7CF85EC01C085EE8093BC0012
+:101880000E94F40E6B017C0180917402823039F564
+:101890008091760290917702A0917802B0917902BE
+:1018A000892B8A2B8B2B81F30E94F40E00917602F8
+:1018B000109177022091780230917902DC01CB01FE
+:1018C0008C199D09AE09BF09081719072A073B079C
+:1018D000D8F6809175020E949503C5E013C08091EF
+:1018E00072028F3F79F080917202803241F08091D4
+:1018F0007202803331F0C4E005C0C1E003C0C2E031
+:1019000001C0C3E010927B0210929D0210927A02F5
+:101910008C2FDF91CF911F910F91FF90EF90DF906F
+:10192000CF90BF90AF909F908F900895CF93DF930B
+:10193000CDB7DEB728970FB6F894DEBF0FBECDBF88
+:101940009C0188E0ECE0F1E0DE01119601900D923F
+:101950008A95E1F7F9018085841710F44FEF480F5D
+:10196000FE013196E40FF11DE40FF11D9081690F26
+:10197000606840E0C90128960FB6F894DEBF0FBE3C
+:10198000CDBFDF91CF910C944D03BF92CF92DF92E8
+:10199000EF92FF920F931F93CF93DF93EC016B01B4
+:1019A0008D85811105C0CE010E94CF05811105C032
+:1019B0001B861D861C8680E060C040E060EFCE0183
+:1019C0000E947C0501E0E12CB12C11E0CE010E94C7
+:1019D0002905F82ECE010E94290591E0F91203C0D5
+:1019E0008130B1F434C02E2D30E0F8121BC08B854D
+:1019F000181738F4FE01E20FF31F8381802341F4AE
+:101A000002C0811729F0F12C193058F41C8709C045
+:101A1000FE01EE0DF11D8381802B8383FF24F3945F
+:101A200009C0B12EFE01E20FF31F9381802F809534
+:101A3000892383836F2DCE010E944D051F5F000F08
+:101A400011F4E39401E087E08E1508F0BFCF113464
+:101A500008F4AECFBB86B11002C081E08D878B81C8
+:101A6000882309F4A5CFDE011396F6012B968D91FC
+:101A70008193CA17DB07D9F781E0DF91CF911F91DE
+:101A80000F91FF90EF90DF90CF90BF900895DF927D
+:101A9000EF92FF920F931F93CF93DF937C018B0103
+:101AA000D42EDC011996ED91FC911A9713861586B8
+:101AB0001486DF011B9633961E92EA17FB07E1F7A7
+:101AC000C0E0B801F701818592850E94C50CD82F2E
+:101AD000882371F0DC1209C067E0C8010E9411057B
+:101AE000D80117969C91891721F0CF5FDC1648F733
+:101AF000D0E08D2FDF91CF911F910F91FF90EF904C
+:101B0000DF900895EF92FF920F931F93CF93DF938F
+:101B10008C017B016115710569F0FB0101900020CA
+:101B2000E9F73197EF01C61BD70BBE010E94630F87
+:101B3000811104C0C8010E948A0F08C0F801D58332
+:101B4000C483B701808191810E948417C801DF910D
+:101B5000CF911F910F91FF90EF90089590E0FC01BD
+:101B6000E75EFD4F2491FC01EB5FFD4F3491FC01DA
+:101B7000EF50FE4FE491EE2309F43CC0222339F1EB
+:101B8000233091F038F42130A9F0223001F584B5EA
+:101B90008F7D12C0273091F02830A1F02430B9F4A5
+:101BA000809180008F7D03C0809180008F7780932B
+:101BB00080000DC084B58F7784BD09C08091B000CE
+:101BC0008F7703C08091B0008F7D8093B000F0E0EC
+:101BD000EE0FFF1FE951FE4FA591B4919FB7F89406
+:101BE000611104C08C913095382302C0EC913E2BDA
+:101BF0003C939FBF0895CF93DF9390E0FC01EB5F90
+:101C0000FD4F2491FC01EF50FE4F8491882361F138
+:101C100090E0880F991FFC01E352FE4FC591D491CB
+:101C2000FC01E951FE4FA591B491611109C09FB724
+:101C3000F8948881209582238883EC912E230BC011
+:101C4000623061F49FB7F8948881322F30958323F6
+:101C50008883EC912E2B2C939FBF06C08FB7F894EE
+:101C6000E8812E2B28838FBFDF91CF9108958F922B
+:101C70009F92AF92BF92CF92DF92EF92FF926B0151
+:101C80007C010E94F40E4B015C01C114D104E104FB
+:101C9000F104F1F00E94F40EDC01CB0188199909DE
+:101CA000AA09BB09883E9340A105B10570F321E064
+:101CB000C21AD108E108F10888EE880E83E0981E68
+:101CC000A11CB11CC114D104E104F10419F7DDCF4A
+:101CD000FF90EF90DF90CF90BF90AF909F908F904C
+:101CE0000895CF92DF92EF92FF920F931F93CF93BD
+:101CF000DF936C017A018B01C0E0D0E0CE15DF05E7
+:101D000081F0D8016D918D01D601ED91FC9101908A
+:101D1000F081E02DC6010995892B11F02196EECFB7
+:101D20007E01C701DF91CF911F910F91FF90EF903E
+:101D3000DF90CF9008950E9476178DEA92E00E947E
+:101D4000110221E0892B09F420E0822F0895EF92FF
+:101D5000FF920F931F93CF93DF93EC0181E0888F65
+:101D60009B8D8C8D981305C0E889F989808185FD4C
+:101D700026C0F62E0B8D10E00F5F1F4F0F7311273B
+:101D8000E02E8C8DE8120CC00FB607FCFACFE88964
+:101D9000F989808185FFF5CFCE010E94DD02F1CF68
+:101DA0008B8DFE01E80FF11DE35AFF4FF0829FB7C4
+:101DB000F8940B8FEA89FB89808180620AC09FB703
+:101DC000F894EE89FF896083E889F98980818370BE
+:101DD000806480839FBF81E090E0DF91CF911F916D
+:101DE0000F91FF90EF9008953FB7F8948091A9026A
+:101DF0009091AA02A091AB02B091AC0226B5A89B2B
+:101E000005C02F3F19F00196A11DB11D3FBFBA2F8C
+:101E1000A92F982F8827820F911DA11DB11DBC01EC
+:101E2000CD0142E0660F771F881F991F4A95D1F7B1
+:101E300008951F920F920FB60F9211242F933F9384
+:101E40008F939F93AF93BF938091A4029091A5022B
+:101E5000A091A602B091A7023091A80223E0230F1F
+:101E60002D3720F40196A11DB11D05C026E8230FD2
+:101E70000296A11DB11D2093A8028093A402909305
+:101E8000A502A093A602B093A7028091A902909107
+:101E9000AA02A091AB02B091AC020196A11DB11DA6
+:101EA0008093A9029093AA02A093AB02B093AC02D4
+:101EB000BF91AF919F918F913F912F910F900FBE46
+:101EC0000F901F9018950F931F93CF93DF93EC0102
+:101ED00088819981009729F02A813B81261737074D
+:101EE00088F48B016F5F7F4F0E94B016009761F0FE
+:101EF000998388831B830A832C813D81232B11F4D2
+:101F0000FC01108281E001C080E0DF91CF911F9140
+:101F10000F910895CF93DF93EC0188819981009709
+:101F200011F00E942716198218821D821C821B82C2
+:101F30001A82DF91CF910895DC01ED91FC9101901F
+:101F4000F081E02D09946115710579F0FB01019094
+:101F50000020E9F73197AF01461B570BDC01ED91EB
+:101F6000FC910280F381E02D099480E090E00895D7
+:101F70000C94A30F1F920F920FB60F9211242F9360
+:101F80003F934F935F936F937F938F939F93AF9301
+:101F9000BF93EF93FF938DEA92E00E94DD02FF91E1
+:101FA000EF91BF91AF919F918F917F916F915F91D1
+:101FB0004F913F912F910F900FBE0F901F9018954A
+:101FC0001F920F920FB60F9211242F938F939F930E
+:101FD000EF93FF93E091BD02F091BE028081E0910A
+:101FE000C302F091C40282FD12C090818091C602AA
+:101FF0008F5F8F732091C702821751F0E091C60264
+:10200000F0E0E355FD4F958F8093C60201C08081BB
+:10201000FF91EF919F918F912F910F900FBE0F9095
+:102020001F9018958F929F92AF92BF92EF92FF925E
+:102030000F931F93CF93DF93CDB7DEB7A1970FB662
+:10204000F894DEBF0FBECDBF7C01FA01CB0119A20F
+:10205000223008F42AE08E010F5D1F4F822E912C52
+:10206000A12CB12CBF01A50194010E94AD14F9016E
+:10207000CA01015011096A3014F4605D01C0695C45
+:10208000D8016C93232B242B252B61F7B801C701B2
+:102090000E94A30FA1960FB6F894DEBF0FBECDBF6E
+:1020A000DF91CF911F910F91FF90EF90BF90AF9074
+:1020B0009F908F900895EF92FF920F931F93CF936D
+:1020C000DF938C017B01C0E0D0E0F701EC0FFD1F36
+:1020D0006491662361F0D801ED91FC910190F0814B
+:1020E000E02DC8010995892B11F02196EECFCE0184
+:1020F000DF91CF911F910F91FF90EF900895CF93B3
+:10210000DF93CDB7DEB72C970FB6F894DEBF0FBEC6
+:10211000CDBF789484B5826084BD84B5816084BD70
+:1021200085B5826085BD85B5816085BD80916E0075
+:10213000816080936E0010928100809181008260A6
+:1021400080938100809181008160809381008091E3
+:1021500080008160809380008091B10084608093D2
+:10216000B1008091B00081608093B00080917A00CE
+:10217000846080937A0080917A00826080937A00F4
+:1021800080917A00816080937A0080917A008068E3
+:1021900080937A001092C100E091BD02F091BE02DE
+:1021A00082E08083E091B902F091BA021082E0915E
+:1021B000BB02F091BC028FEC80831092C502E091CB
+:1021C000C102F091C20286E0F82EF082E091BF02D7
+:1021D000F091C002808180618083E091BF02F09124
+:1021E000C002808188608083E091BF02F091C002CC
+:1021F000808180688083E091BF02F091C00280817D
+:102200008F7D80838DEA92E00E94FF0206E513E055
+:1022100086E090E090935703809356031092580302
+:102220008DEA92E090935A038093590368EA71E033
+:102230000E94A30F61E08DE00E94FB0D61E08DE044
+:102240000E94AE0D8EE393E09F938F931F92FF92B7
+:102250001F930F930E9492091092A3021092A20260
+:1022600010927B0210929D020E9477038FE492E00D
+:102270009093A1028093A00280E592E090939F0248
+:1022800080939E0284ED92E09F938F931F9284E04F
+:102290008F931F930F930E9492090FB6F894DEBF9D
+:1022A0000FBECDBF01E010E0E12CF12C6624639459
+:1022B0009FE7A92E92E0B92E26E5C22E23E0D22E6A
+:1022C00033EB832E32E0932E44E0542E60927A0258
+:1022D00000939C0210927B0210929D020E94AA0B16
+:1022E000811114C01F930F939F928F921F925F9240
+:1022F000DF92CF920E9492093FEFE31AF30A0FB6E2
+:10230000F894DEBF0FBECDBF702E11C0843079F4BB
+:102310001F930F93BF92AF921F928F93DF92CF9232
+:102320000E9492090FB6F894DEBF0FBECDBF0F5FBB
+:102330001F4F0F37110551F60E946A03E114F10493
+:10234000A1F488E692E09F938F931F9284E08F938D
+:1023500086E593E09F938F930E9492090F900F90D0
+:102360000F900F900F900F90CFC01F927F9288E335
+:1023700092E09F938F931F9214E01F9386E593E062
+:102380009F938F930E9492091C821B8288E191E0A7
+:102390009A8389837D8284E18A871B871C861092B9
+:1023A000A3021092A20210927B0210929D020E9440
+:1023B00077038FE492E09093A1028093A00280E5DE
+:1023C00092E090939F0280939E021E828B850FB6AF
+:1023D000F894DEBF0FBECDBF823010F098E09E8330
+:1023E000898762E370E080E090E00E94370E6C85A0
+:1023F000CE0101960E94210368EE73E080E090E038
+:102400000E94370E60E3CE0101960E9434030BE474
+:1024100016E4C8010197F1F760E3CE0101960E942E
+:102420003403C8010197F1F760E3CE0101960E94E1
+:10243000340383E592E00197F1F760E2CE01019663
+:102440000E9434036E81606240E0CE0101960E94DA
+:102450004D0384E08F8340E06CE0CE0101960E9442
+:102460004D0340E061E0CE0101960E944D030BE375
+:102470001FE1C8010197F1F782E0888740E066E03C
+:10248000CE0101960E944D0340E062E0CE0101962C
+:102490000E944D03C8010197F1F788E08C8760E046
+:1024A000CE0101960E94210340E061E0CE01019639
+:1024B0000E94960C6BEA71E0CE0101960E94B80F63
+:1024C00041E060E0CE0101960E94960C6EEB71E057
+:1024D000CE0101960E94B80F42E067E0CE0101965E
+:1024E0000E94960C62ED71E0CE0101960E94B80F39
+:1024F00043E062E0CE0101960E94960C69ED71E026
+:10250000CE0101960E94B80F84E592E09F938F93CD
+:102510001F9284E08F9386E593E09F938F930E94B0
+:1025200092090F900F900F900F900F900F90EF283F
+:1025300019F08EE090E002C082E190E00E94E10696
+:1025400085E090E00E94770686E090E00E947706A2
+:1025500080E093E09F938F931F9284E08F9386E5B2
+:1025600093E09F938F930E9492090F900F900F908A
+:102570000F900F900F9000E010E060E0C8010E9403
+:1025800054140F5F1F4F011534E01307B1F788EEA5
+:1025900092E09F938F931F9284E08F9306E513E060
+:1025A0001F930F930E94920960E08DE00E94AE0D90
+:1025B00083E193E09F938F931F9286E08F931F9305
+:1025C0000F930E9492090FB6F894DEBF0FBECDBFE5
+:1025D0000E941D02FDCFEDEAF2E01382128288EE26
+:1025E00093E0A0E0B0E084839583A683B78324E2E0
+:1025F00031E03183208325EC30E03587248724ECDB
+:1026000030E03787268720EC30E0318B208B21ECBF
+:1026100030E0338B228B22EC30E0358B248B26ECA0
+:1026200030E0378B268B118E128E138E148EEAE4D7
+:10263000F3E01382128284839583A683B78382E4B6
+:1026400091E091838083E6E5F3E01182108281E0DE
+:10265000828314821382168215821086178208954F
+:102660000E94721308F481E00895E89409C097FB72
+:102670003EF490958095709561957F4F8F4F9F4F59
+:102680009923A9F0F92F96E9BB279395F69587959D
+:1026900077956795B795F111F8CFFAF4BB0F11F460
+:1026A00060FF1BC06F5F7F4F8F4F9F4F16C0882307
+:1026B00011F096E911C0772321F09EE8872F762F3D
+:1026C00005C0662371F096E8862F70E060E02AF07E
+:1026D0009A95660F771F881FDAF7880F969587956A
+:1026E00097F90895990F0008550FAA0BE0E8FEEF3F
+:1026F00016161706E807F907C0F012161306E407C6
+:10270000F50798F0621B730B840B950B39F40A26BE
+:1027100061F0232B242B252B21F408950A2609F49C
+:10272000A140A6958FEF811D811D08950E94A913D8
+:102730000C941A140E940C1438F00E94131420F008
+:10274000952311F00C9403140C94091411240C9487
+:102750004E140E942B1470F3959FC1F3950F50E017
+:10276000551F629FF001729FBB27F00DB11D639F43
+:10277000AA27F00DB11DAA1F649F6627B00DA11DE9
+:10278000661F829F2227B00DA11D621F739FB00D8F
+:10279000A11D621F839FA00D611D221F749F3327FF
+:1027A000A00D611D231F849F600D211D822F762F98
+:1027B0006A2F11249F5750409AF0F1F088234AF075
+:1027C000EE0FFF1FBB1F661F771F881F91505040E1
+:1027D000A9F79E3F510580F00C9403140C944E14FD
+:1027E0005F3FE4F3983ED4F3869577956795B79568
+:1027F000F795E7959F5FC1F7FE2B880F911D969582
+:10280000879597F9089597F99F6780E870E060E0F1
+:1028100008959FEF80EC089500240A941616170679
+:1028200018060906089500240A94121613061406C1
+:1028300005060895092E0394000C11F4882352F024
+:10284000BB0F40F4BF2B11F460FF04C06F5F7F4FDC
+:102850008F4F9F4F089557FD9058440F551F59F0C3
+:102860005F3F71F04795880F97FB991F61F09F3F7D
+:1028700079F087950895121613061406551FF2CFA6
+:102880004695F1DF08C0161617061806991FF1CFF6
+:1028900086957105610508940895E894BB2766271D
+:1028A0007727CB0197F90895262FF999FECF1FBA04
+:1028B00092BD81BD20BD0FB6F894FA9AF99A0FBE69
+:1028C000019608952F923F924F925F926F927F925E
+:1028D0008F929F92AF92BF92CF92DF92EF92FF9230
+:1028E0000F931F93CF93DF93CDB7DEB7CA1BDB0BDC
+:1028F0000FB6F894DEBF0FBECDBF09942A88398881
+:1029000048885F846E847D848C849B84AA84B98487
+:10291000C884DF80EE80FD800C811B81AA81B98193
+:10292000CE0FD11D0FB6F894DEBF0FBECDBFED01A7
+:10293000089597FB072E16F4009407D077FD09D071
+:102940000E94CF1407FC05D03EF4909581959F4FCF
+:102950000895709561957F4F0895A1E21A2EAA1BE4
+:10296000BB1BFD010DC0AA1FBB1FEE1FFF1FA2173F
+:10297000B307E407F50720F0A21BB30BE40BF50B3C
+:10298000661F771F881F991F1A9469F760957095C5
+:10299000809590959B01AC01BD01CF010895AA1BC4
+:1029A000BB1B51E107C0AA1FBB1FA617B70710F03A
+:1029B000A61BB70B881F991F5A95A9F7809590956C
+:1029C000BC01CD010895EE0FFF1F0590F491E02D9D
+:1029D00009945058BB27AA270E9401150C941A1479
+:1029E0000E940C1438F00E94131420F039F49F3F19
+:1029F00019F426F40C9409140EF4E095E7FB0C94FA
+:102A00000314E92F0E942B1458F3BA1762077307B7
+:102A10008407950720F079F4A6F50C944D140EF474
+:102A2000E0950B2EBA2FA02D0B01B90190010C01DE
+:102A3000CA01A0011124FF27591B99F0593F50F4F6
+:102A4000503E68F11A16F040A22F232F342F44274E
+:102A5000585FF3CF469537952795A795F040539546
+:102A6000C9F77EF41F16BA0B620B730B840BBAF016
+:102A70009150A1F0FF0FBB1F661F771F881FC2F781
+:102A80000EC0BA0F621F731F841F48F48795779595
+:102A90006795B795F7959E3F08F0B0CF9395880F4F
+:102AA00008F09927EE0F9795879508950E943314A3
+:102AB00088F09F5798F0B92F9927B751B0F0E1F0FF
+:102AC000660F771F881F991F1AF0BA95C9F714C0AF
+:102AD000B13091F00E944D14B1E008950C944D1462
+:102AE000672F782F8827B85F39F0B93FCCF38695E8
+:102AF00077956795B395D9F73EF490958095709545
+:102B000061957F4F8F4F9F4F08950E94721308F475
+:102B10008FEF08950E947213880B990B08950F93FD
+:102B20001F93CF93DF938230910510F482E090E001
+:102B3000E0916103F091620320E030E0A0E0B0E0BA
+:102B4000309719F14081518102811381481759074B
+:102B5000C8F08417950769F4109731F012960C931A
+:102B6000129713961C9327C000936103109362037E
+:102B700022C02115310519F04217530718F49A01A4
+:102B8000BD01EF01DF01F801DBCF21153105F9F0BF
+:102B9000281B390B2430310580F48A819B81611513
+:102BA000710521F0FB019383828304C0909362033B
+:102BB00080936103FE01329644C0FE01E20FF31FD1
+:102BC0008193919322503109398328833AC020910F
+:102BD0005F0330916003232B41F420910201309177
+:102BE00003013093600320935F0320910001309133
+:102BF00001012115310541F42DB73EB74091040183
+:102C000050910501241B350BE0915F03F0916003A7
+:102C1000E217F307A0F42E1B3F0B2817390778F0B3
+:102C2000AC014E5F5F4F2417350748F04E0F5F1F12
+:102C30005093600340935F038193919302C0E0E05F
+:102C4000F0E0CF01DF91CF911F910F910895CF93C5
+:102C5000DF93009709F481C0FC013297138212823E
+:102C6000A0916103B0916203109781F420813181BA
+:102C7000820F931F20915F0330916003281739075B
+:102C800051F5F0936003E0935F0367C0ED0120E02E
+:102C900030E0CE17DF0740F44A815B819E01411589
+:102CA0005105F1F0EA01F5CFD383C2834081518110
+:102CB000840F951FC817D90759F488819981840F0B
+:102CC000951F0296918380838A819B81938382835F
+:102CD0002115310529F4F0936203E09361033DC0AF
+:102CE000E901FB83EA8349915991C40FD51FEC1781
+:102CF000FD0761F480819181840F951F0296E9019F
+:102D000099838883828193819B838A83E0E0F0E0CA
+:102D100012968D919C911397009719F0FD01DC019B
+:102D2000F7CF8D919C9111979D012E5F3F4F820FA0
+:102D3000931F20915F03309160032817390769F4CE
+:102D4000309729F4109262031092610302C013823B
+:102D50001282B0936003A0935F03DF91CF91089537
+:102D6000A0E0B0E0E6EBF6E10C946614EC0100970D
+:102D700021F4CB010E948F15B4C0FC01E60FF71FB0
+:102D80009C0122503109E217F30708F4A8C0D901C9
+:102D90000D911C91119706171707B0F0053011051A
+:102DA00008F49BC0C80104978617970708F495C0DC
+:102DB00002501109061B170B019311936D937C931D
+:102DC000CF010E94271689C05B01A01AB10A4C01ED
+:102DD000800E911EA0916103B0916203612C712C51
+:102DE000E12CF12C109709F446C08D919C9111971C
+:102DF000A815B905B1F56C0142E0C40ED11CCA1486
+:102E0000DB0478F14C018A189B08640142E0C40E8F
+:102E1000D11C1296BC9012971396AC91B5E0CB16CC
+:102E2000D10440F0B282A38391828082D9016D9354
+:102E30007C9309C00E5F1F4F800F911FF901918392
+:102E40008083EB2DFA2FE114F10431F0D7011396B2
+:102E5000FC93EE93129741C0F0936203E0936103F9
+:102E60003CC06816790608F43C017D0112960D906D
+:102E7000BC91A02DB7CF80915F039091600388161D
+:102E80009906E1F466167706C8F4809100019091E6
+:102E90000101009741F48DB79EB740910401509114
+:102EA0000501841B950BE817F907C8F4F09360033C
+:102EB000E0935F03F901718360830FC0CB010E942F
+:102EC0008F157C01009759F0A801BE010E947B1765
+:102ED000CE010E942716C70104C0CE0102C080E0C7
+:102EE00090E0CDB7DEB7EEE00C94821481E090E084
+:102EF000F8940C948B17FB01DC0102C001900D9239
+:102F000041505040D8F70895FB01DC0101900D922B
+:0A2F10000020E1F70895F894FFCFC8
+:102F1A000000630320005E00BC007701000040004F
+:102F2A0014005400000000006403710EDA02D90292
+:102F3A0000000000A70E710EE001FF021102EF016E
+:102F4A000302000000009B0E710EDA02D902000093
+:102F5A000000AA027D02DA025102750261025202DF
+:102F6A006F6E006F66660061204453313853323009
+:102F7A0000612044533138423230006120445331D9
+:102F8A0038323200612044533138323500616E20C4
+:102F9A00756E6B6E6F776E003A20006E616E006917
+:102FAA006E66006F76660030780030620054004624
+:102FBA00004645574E5456000D0A0048656C6C6F22
+:102FCA002C20486F6D656272657765722100596FB2
+:102FDA0075722042726577506920446973706C611A
+:102FEA007900576F726B732100406C627573737945
+:0A2FFA0020736179732068692100DB
+:00000001FF
diff --git a/images/Arduino-Uno-Pin-Diagram.png b/images/Arduino-Uno-Pin-Diagram.png
new file mode 100644
index 0000000..74e2241
Binary files /dev/null and b/images/Arduino-Uno-Pin-Diagram.png differ
diff --git a/images/i2c_test.jpg b/images/i2c_test.jpg
new file mode 100644
index 0000000..46a2b56
Binary files /dev/null and b/images/i2c_test.jpg differ
diff --git a/include/README b/include/README
new file mode 100644
index 0000000..194dcd4
--- /dev/null
+++ b/include/README
@@ -0,0 +1,39 @@
+
+This directory is intended for project header files.
+
+A header file is a file containing C declarations and macro definitions
+to be shared between several project source files. You request the use of a
+header file in your project source file (C, C++, etc) located in `src` folder
+by including it, with the C preprocessing directive `#include'.
+
+```src/main.c
+
+#include "header.h"
+
+int main (void)
+{
+ ...
+}
+```
+
+Including a header file produces the same results as copying the header file
+into each source file that needs it. Such copying would be time-consuming
+and error-prone. With a header file, the related declarations appear
+in only one place. If they need to be changed, they can be changed in one
+place, and programs that include the header file will automatically use the
+new version when next recompiled. The header file eliminates the labor of
+finding and changing all the copies as well as the risk that a failure to
+find one copy will result in inconsistencies within a program.
+
+In C, the usual convention is to give header files names that end with `.h'.
+It is most portable to use only letters, digits, dashes, and underscores in
+header file names, and at most one dot.
+
+Read more about using header files in official GCC documentation:
+
+* Include Syntax
+* Include Operation
+* Once-Only Headers
+* Computed Includes
+
+https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
diff --git a/lib/README b/lib/README
new file mode 100644
index 0000000..6debab1
--- /dev/null
+++ b/lib/README
@@ -0,0 +1,46 @@
+
+This directory is intended for project specific (private) libraries.
+PlatformIO will compile them to static libraries and link into executable file.
+
+The source code of each library should be placed in a an own separate directory
+("lib/your_library_name/[here are source files]").
+
+For example, see a structure of the following two libraries `Foo` and `Bar`:
+
+|--lib
+| |
+| |--Bar
+| | |--docs
+| | |--examples
+| | |--src
+| | |- Bar.c
+| | |- Bar.h
+| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
+| |
+| |--Foo
+| | |- Foo.c
+| | |- Foo.h
+| |
+| |- README --> THIS FILE
+|
+|- platformio.ini
+|--src
+ |- main.c
+
+and a contents of `src/main.c`:
+```
+#include
+#include
+
+int main (void)
+{
+ ...
+}
+
+```
+
+PlatformIO Library Dependency Finder will find automatically dependent
+libraries scanning project source files.
+
+More information about PlatformIO Library Dependency Finder
+- https://docs.platformio.org/page/librarymanager/ldf.html
diff --git a/platformio.ini b/platformio.ini
new file mode 100644
index 0000000..2aac15a
--- /dev/null
+++ b/platformio.ini
@@ -0,0 +1,94 @@
+; PlatformIO Project Configuration File
+;
+; Build options: build flags, source filter
+; Upload options: custom upload port, speed and extra flags
+; Library options: dependencies, extra library storages
+; Advanced options: extra scripting
+;
+; Please visit documentation for the other options and examples
+; https://docs.platformio.org/page/projectconf.html
+
+[platformio]
+; default_envs = heltec_wifi_kit_32
+; default_envs = d1_mini
+; default_envs = lolin_d32
+default_envs = uno
+
+[common_env_data]
+upload_speed = 115200
+monitor_speed = 9600
+framework = arduino
+build_unflags =
+build_flags =
+ -DBAUD=${common_env_data.monitor_speed}
+ ; -DDEBUG_ESP_PORT=Serial
+ ; -DDEBUG_ESP_WIFI
+ ; -DDEBUG_ESP_CORE
+ ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY ; v2 Lower Memory (default)
+ ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH ; v2 Higher Bandwidth
+ ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH ; v2 Lower Memory (no features)
+ ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH ; v2 Higher Bandwidth (no features)
+ ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_LOW_MEMORY ; v2 IPv6 Lower Memory
+ ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_HIGHER_BANDWIDTH ; v2 IPv6 Higher Bandwidth
+ ; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH ; v1.4 Higher Bandwidth
+lib_deps =
+ ArduinoLog
+ OneWire
+ DallasTemperature
+ https://github.com/brewpi-remix/LiquidCrystal_I2C
+extra_scripts =
+build_type = release
+monitor_filters =
+ ; log2file
+
+[env:d1_mini]
+upload_speed = ${common_env_data.upload_speed}
+monitor_speed = ${common_env_data.monitor_speed}
+framework = ${common_env_data.framework}
+build_unflags = ${common_env_data.build_unflags}
+build_flags = ${common_env_data.build_flags}
+extra_scripts = ${common_env_data.extra_scripts}
+lib_deps = ${common_env_data.lib_deps}
+build_type = ${common_env_data.build_type}
+monitor_filters = ${common_env_data.monitor_filters}
+platform = espressif8266
+board = d1_mini
+
+[env:lolin_d32]
+upload_speed = ${common_env_data.upload_speed}
+monitor_speed = ${common_env_data.monitor_speed}
+framework = ${common_env_data.framework}
+build_unflags = ${common_env_data.build_unflags}
+build_flags = ${common_env_data.build_flags}
+extra_scripts = ${common_env_data.extra_scripts}
+lib_deps = ${common_env_data.lib_deps}
+build_type = ${common_env_data.build_type}
+monitor_filters = ${common_env_data.monitor_filters}
+platform = espressif32
+board = lolin_d32
+
+[env:heltec_wifi_kit_32]
+upload_speed = ${common_env_data.upload_speed}
+monitor_speed = ${common_env_data.monitor_speed}
+framework = ${common_env_data.framework}
+build_unflags = ${common_env_data.build_unflags}
+build_flags = ${common_env_data.build_flags}
+extra_scripts = ${common_env_data.extra_scripts}
+lib_deps = ${common_env_data.lib_deps}
+build_type = ${common_env_data.build_type}
+monitor_filters = ${common_env_data.monitor_filters}
+platform = espressif32
+board = heltec_wifi_kit_32
+
+[env:uno]
+upload_speed = ${common_env_data.upload_speed}
+monitor_speed = ${common_env_data.monitor_speed}
+framework = ${common_env_data.framework}
+build_unflags = ${common_env_data.build_unflags}
+build_flags = ${common_env_data.build_flags}
+extra_scripts = ${common_env_data.extra_scripts}
+lib_deps = ${common_env_data.lib_deps}
+build_type = ${common_env_data.build_type}
+monitor_filters = ${common_env_data.monitor_filters}
+platform = atmelavr
+board = uno
diff --git a/src/config.h b/src/config.h
new file mode 100644
index 0000000..cb0d707
--- /dev/null
+++ b/src/config.h
@@ -0,0 +1,13 @@
+#ifndef _CONFIG_H
+#define _CONFIG_H
+
+#define LEDON HIGH
+#define LEDOFF LOW
+#define RELAYON LOW
+#define RELAYOFF HIGH
+#define NORMAL_PIN A4
+#define I2C_PIN A0
+#define HEATRELAY 5
+#define COOLRELAY 6
+
+#endif // _CONFIG_H
diff --git a/src/erase.cpp b/src/erase.cpp
new file mode 100644
index 0000000..3131b3a
--- /dev/null
+++ b/src/erase.cpp
@@ -0,0 +1,14 @@
+#include "erase.h"
+
+void erase()
+{
+ // Iterate through each byte of the EEPROM storage and clear it
+ Log.notice(F(CR "Clearing EEPROM." CR));
+
+ for (uint16_t i = 0; i < EEPROM.length(); i++)
+ {
+ EEPROM.write(i, 0);
+ }
+
+ Log.notice(F("EEPROM clear complete." CR));
+}
diff --git a/src/erase.h b/src/erase.h
new file mode 100644
index 0000000..acb2749
--- /dev/null
+++ b/src/erase.h
@@ -0,0 +1,12 @@
+#ifndef _ERASE_H
+#define _ERASE_H
+
+#include
+#include
+#include
+
+#include "config.h" // Should be after Arduino.h
+
+void erase();
+
+#endif // _ERASE_H
diff --git a/src/i2c.cpp b/src/i2c.cpp
new file mode 100644
index 0000000..32419b5
--- /dev/null
+++ b/src/i2c.cpp
@@ -0,0 +1,56 @@
+#include "i2c.h"
+
+int iicScan()
+{
+ Wire.begin(); // Wire communication begin
+ byte error, address, lcdAddress; // Variable for error and I2C address
+ int nDevices = 0; // Keep count of number of devices
+
+ Log.notice(F(CR "Scanning I2C bus." CR));
+
+ for (address = 1; address < 127; address++)
+ {
+ // The i2c_scanner uses the return value of Write::endTransmission()
+ // to see if a device sent an ack on that address
+ Wire.beginTransmission(address);
+ error = Wire.endTransmission();
+
+ if (error == 0)
+ {
+ Log.notice(F("I2C device found at address %X." CR), address);
+ lcdAddress = address;
+ nDevices++;
+ }
+ else if (error == 4)
+ {
+ Log.notice(F("Unknown error from I2C device found at address %X." CR), address);
+ }
+ }
+ Wire.end();
+
+ if (nDevices == 0)
+ Log.notice(F("No I2C devices found." CR));
+ else
+ iicTest(lcdAddress);
+
+ Log.notice(F("I2C scan complete." CR));
+
+ return nDevices;
+}
+
+void iicTest(byte lcdAddress)
+{
+ Log.notice(F("Setting LCD display at %X." CR), lcdAddress);
+ LiquidCrystal_I2C lcd(lcdAddress, 20, 4);
+ lcd.init(); // initialize the lcd
+ // Print a message to the LCD.
+ lcd.backlight();
+ lcd.setCursor(1, 0);
+ lcd.print("Hello, Homebrewer!");
+ lcd.setCursor(0, 1);
+ lcd.print("Your BrewPi Display");
+ lcd.setCursor(7, 2);
+ lcd.print("Works!");
+ lcd.setCursor(2, 3);
+ lcd.print("@lbussy says hi!");
+}
diff --git a/src/i2c.h b/src/i2c.h
new file mode 100644
index 0000000..f64f80c
--- /dev/null
+++ b/src/i2c.h
@@ -0,0 +1,14 @@
+#ifndef _I2C_H
+#define _I2C_H
+
+#include
+#include
+#include
+#include
+
+#include "config.h" // Should be after Arduino.h
+
+int iicScan();
+void iicTest(byte lcdAddress);
+
+#endif // _I2C_H
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..ceaf2f5
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,28 @@
+#include "main.h"
+
+void setup()
+{
+ setSerial(); // Starts serial and ArduinoLog
+
+ // Initialize the LED pin as an output.
+ pinMode(LED_BUILTIN, OUTPUT);
+ digitalWrite(LED_BUILTIN, LEDON); // Turn LED on
+
+ Log.verbose(F(CR "BrewPi Family Arduino Uno Test beginning." CR));
+
+ // Check I2C bus, then test the correct OneWire pin
+ if (iicScan())
+ checkSensors(I2C_PIN);
+ else
+ checkSensors(NORMAL_PIN);
+
+ testRelay(HEATRELAY);
+ testRelay(COOLRELAY);
+
+ erase(); // Clear EEPROM
+
+ digitalWrite(LED_BUILTIN, LEDOFF); // Turn LED off
+ Log.verbose(F(CR "BrewPi Family Arduino Uno Test complete." CR));
+}
+
+void loop() {}
diff --git a/src/main.h b/src/main.h
new file mode 100644
index 0000000..d2ffcc2
--- /dev/null
+++ b/src/main.h
@@ -0,0 +1,18 @@
+#ifndef _MAIN_H
+#define _MAIN_H
+
+#include "serialhandler.h"
+#include "one_wire.h"
+#include "i2c.h"
+#include "erase.h"
+#include "relaytest.h"
+
+#include
+#include
+
+#include "config.h" // Should be after Arduino.h
+
+void setup();
+void loop();
+
+#endif // _MAIN_H
diff --git a/src/one_wire.cpp b/src/one_wire.cpp
new file mode 100644
index 0000000..10bc442
--- /dev/null
+++ b/src/one_wire.cpp
@@ -0,0 +1,66 @@
+#include "one_wire.h"
+
+void checkSensors(int pin)
+{
+ Log.notice(F(CR "Checking %d for OneWire devices." CR), pin);
+
+ // Create a OneWire bus on pin
+ OneWire oneWire(pin);
+ // Pass our oneWire reference to Dallas Temperature.
+ DallasTemperature sensors(&oneWire);
+
+ sensors.begin();
+
+ Log.notice(F("Parasitic power is %s for the OneWire bus on pin %d." CR), sensors.isParasitePowerMode() ? "on" : "off", pin);
+
+ Log.notice(F("Detected %d devices on pin %d." CR), sensors.getDeviceCount(), pin);
+
+ byte deviceAddress[8];
+
+ for (int i = 0; i < sensors.getDeviceCount(); i++)
+ {
+ sensors.getAddress(deviceAddress, i);
+ String device = "";
+ switch (deviceAddress[0])
+ {
+ case DS18S20MODEL:
+ device = "a DS18S20";
+ break;
+ case DS18B20MODEL:
+ device = "a DS18B20";
+ break;
+ case DS1822MODEL:
+ device = "a DS1822";
+ break;
+ case DS1825MODEL:
+ device = "a DS1825";
+ break;
+ default:
+ device = "an unknown";
+ }
+ Log.notice(F("Device %d:%d is %s device." CR), pin, i, device.c_str());
+ }
+ delay(1000);
+
+ sensors.requestTemperatures(); // Send the command to get temperatures
+ delay(750);
+
+ for (int i = 0; i < sensors.getDeviceCount(); i++)
+ {
+ float temp = sensors.getTempCByIndex(i);
+ DeviceAddress deviceAddress;
+ sensors.getAddress(deviceAddress, i);
+ Log.notice(F("Sensor:\t%d:%d\tAddress: %x:%x:%x:%x:%x:%x:%x:%x\tTemperature: %D°C" CR),
+ pin,
+ i,
+ deviceAddress[0],
+ deviceAddress[1],
+ deviceAddress[2],
+ deviceAddress[3],
+ deviceAddress[4],
+ deviceAddress[5],
+ deviceAddress[6],
+ deviceAddress[7],
+ temp);
+ }
+}
diff --git a/src/one_wire.h b/src/one_wire.h
new file mode 100644
index 0000000..c2df8cb
--- /dev/null
+++ b/src/one_wire.h
@@ -0,0 +1,13 @@
+#ifndef _ONE_WIRE_H
+#define _ONE_WIRE_H
+
+#include
+#include
+#include
+#include
+
+#include "config.h" // Should be after Arduino.h
+
+void checkSensors(int pin);
+
+#endif // _ONE_WIRE_H
diff --git a/src/relaytest.cpp b/src/relaytest.cpp
new file mode 100644
index 0000000..e9fb96c
--- /dev/null
+++ b/src/relaytest.cpp
@@ -0,0 +1,16 @@
+#include "relaytest.h"
+
+void testRelay(int pin)
+{
+ Log.notice(F(CR "Testing relay pin %d." CR), pin);
+ pinMode(pin, OUTPUT);
+ digitalWrite(pin, RELAYOFF);
+ delay(1000);
+ Log.notice(F("Turning relay on pin %d on." CR), pin);
+ digitalWrite(pin, RELAYON);
+ delay(1000);
+ Log.notice(F("Turning relay on pin %d off." CR), pin);
+ delay(250);
+ digitalWrite(pin, RELAYOFF);
+ Log.notice(F("Relay test on pin %d complete." CR), pin);
+}
diff --git a/src/relaytest.h b/src/relaytest.h
new file mode 100644
index 0000000..e37abd3
--- /dev/null
+++ b/src/relaytest.h
@@ -0,0 +1,11 @@
+#ifndef _RELAYTEST_H
+#define _RELAYTEST_H
+
+#include
+#include
+
+#include "config.h" // Should be after Arduino.h
+
+void testRelay(int pin);
+
+#endif // _RELAYTEST_H
diff --git a/src/serialhandler.cpp b/src/serialhandler.cpp
new file mode 100644
index 0000000..81d8aad
--- /dev/null
+++ b/src/serialhandler.cpp
@@ -0,0 +1,8 @@
+#include "serialhandler.h"
+
+void setSerial() {
+ Serial.begin(BAUD);
+ Serial.flush();
+ Log.begin(LOG_LEVEL_VERBOSE, &Serial, false);
+ Serial.println();
+}
diff --git a/src/serialhandler.h b/src/serialhandler.h
new file mode 100644
index 0000000..105582f
--- /dev/null
+++ b/src/serialhandler.h
@@ -0,0 +1,12 @@
+#ifndef _SUPPORT_H
+#define _SUPPORT_H
+
+#include
+#include
+
+#include "config.h" // Should be after Arduino.h
+
+void setSerial();
+void _delay(unsigned long);
+
+#endif // _SUPPORT_H
diff --git a/test/README b/test/README
new file mode 100644
index 0000000..df5066e
--- /dev/null
+++ b/test/README
@@ -0,0 +1,11 @@
+
+This directory is intended for PIO Unit Testing and project tests.
+
+Unit Testing is a software testing method by which individual units of
+source code, sets of one or more MCU program modules together with associated
+control data, usage procedures, and operating procedures, are tested to
+determine whether they are fit for use. Unit testing finds problems early
+in the development cycle.
+
+More information about PIO Unit Testing:
+- https://docs.platformio.org/page/plus/unit-testing.html