From 674c42d620de89bfd85a23367616a31e85a59dcc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 2 Jan 2023 23:03:50 +0000 Subject: [PATCH] Deployed 5e61cd1 with MkDocs version: 1.4.2 --- 404.html | 64 +- AI-on-the-edge/index.html | 216 ------- Addditional-Information/index.html | 209 ------ Best-Practice/index.html | 224 ------- Build-Instructions/index.html | 230 ------- Choosing-the-Model/index.html | 266 -------- Configuration-Parameter-Details/index.html | 603 ------------------ Configuration/index.html | 271 -------- Correction Algorithm/index.html | 258 -------- Demo-Mode/index.html | 258 -------- Error-Codes/index.html | 232 ------- Error-Debugging/index.html | 262 -------- External-LED/index.html | 238 ------- FAQs/index.html | 262 -------- Frequent Reboots/index.html | 317 --------- Gasmeter-Log-Downloader/index.html | 212 ------ Graphical-configuration/index.html | 290 --------- Hardware-Compatibility/index.html | 364 ----------- Home/index.html | 246 ------- .../index.html | 214 ------- Installation/index.html | 350 ---------- Integrated Functions/index.html | 222 ------- Integration-Home-Assistant/index.html | 388 ----------- Learn-models-with-your-own-images/index.html | 249 -------- MQTT-API/index.html | 298 --------- Migrate-Old-Config-To-New-Config/index.html | 334 ---------- Neural-Network-Types/index.html | 448 ------------- .../index.html | 238 ------- REST-API/index.html | 363 ----------- ROI-Configuration/index.html | 317 --------- Release-creation/index.html | 218 ------- Testing/index.html | 219 ------- .../index.html | 219 ------- img/0_arbitrary.jpg | Bin 1563 -> 0 bytes img/3_arbitrary.jpg | Bin 1788 -> 0 bytes img/ROI_drawing.jpg | Bin 42837 -> 0 bytes img/ROI_example_settings.jpg | Bin 11437 -> 0 bytes img/alignment_not_okay.jpg | Bin 13928 -> 0 bytes img/alignment_okay.jpg | Bin 11299 -> 0 bytes img/ana-cont/examp-ana1.jpg | Bin 1200 -> 0 bytes img/ana-cont/examp-ana2.jpg | Bin 1196 -> 0 bytes img/ana-cont/examp-ana3.jpg | Bin 1320 -> 0 bytes img/ana-cont/examp-ana4.jpg | Bin 1248 -> 0 bytes img/ana-cont/examp-ana5.jpg | Bin 1222 -> 0 bytes img/ana-cont/examp-ana6.jpg | Bin 1322 -> 0 bytes img/ana-cont/examp-ana7.jpg | Bin 1439 -> 0 bytes img/ana-examp.jpg | Bin 1604 -> 0 bytes img/bw_not_okay_big.jpg | Bin 12658 -> 0 bytes img/bw_not_okay_small.jpg | Bin 8412 -> 0 bytes img/bw_okay.jpg | Bin 7681 -> 0 bytes img/correct_algo_1.jpg | Bin 71006 -> 0 bytes img/correct_algo_2.jpg | Bin 50010 -> 0 bytes img/correct_algo_3.jpg | Bin 40724 -> 0 bytes img/correct_algo_zero_crossing.jpg | Bin 71285 -> 0 bytes img/dig-class11/examp-dig1.jpg | Bin 687 -> 0 bytes img/dig-class11/examp-dig10.jpg | Bin 803 -> 0 bytes img/dig-class11/examp-dig11.jpg | Bin 1003 -> 0 bytes img/dig-class11/examp-dig12.jpg | Bin 794 -> 0 bytes img/dig-class11/examp-dig13.jpg | Bin 727 -> 0 bytes img/dig-class11/examp-dig2.jpg | Bin 871 -> 0 bytes img/dig-class11/examp-dig3.jpg | Bin 656 -> 0 bytes img/dig-class11/examp-dig4.jpg | Bin 832 -> 0 bytes img/dig-class11/examp-dig5.jpg | Bin 718 -> 0 bytes img/dig-class11/examp-dig6.jpg | Bin 643 -> 0 bytes img/dig-class11/examp-dig7.jpg | Bin 20996 -> 0 bytes img/dig-class11/examp-dig8.jpg | Bin 820 -> 0 bytes img/dig-class11/examp-dig9.jpg | Bin 649 -> 0 bytes img/dig-cont/dig-cont_1.jpg | Bin 668 -> 0 bytes img/dig-cont/dig-cont_2a.jpg | Bin 660 -> 0 bytes img/dig-cont/dig-cont_2b.jpg | Bin 649 -> 0 bytes img/dig-cont/dig-cont_3a.jpg | Bin 894 -> 0 bytes img/dig-cont/dig-cont_3b.jpg | Bin 883 -> 0 bytes img/dig-cont/dig-cont_3c.jpg | Bin 819 -> 0 bytes img/enable_log_image.jpg | Bin 46887 -> 0 bytes img/progammer_manual.jpg | Bin 85793 -> 0 bytes img/wb_not_okay_big.jpg | Bin 6396 -> 0 bytes img/wb_not_okay_small.jpg | Bin 4101 -> 0 bytes img/wb_okay.jpg | Bin 4244 -> 0 bytes index.html | 135 ++++ nav.yml | 2 +- search.html | 64 +- search/search_index.json | 2 +- sitemap.xml | 157 +---- sitemap.xml.gz | Bin 651 -> 223 bytes 84 files changed, 140 insertions(+), 9319 deletions(-) delete mode 100644 AI-on-the-edge/index.html delete mode 100644 Addditional-Information/index.html delete mode 100644 Best-Practice/index.html delete mode 100644 Build-Instructions/index.html delete mode 100644 Choosing-the-Model/index.html delete mode 100644 Configuration-Parameter-Details/index.html delete mode 100644 Configuration/index.html delete mode 100644 Correction Algorithm/index.html delete mode 100644 Demo-Mode/index.html delete mode 100644 Error-Codes/index.html delete mode 100644 Error-Debugging/index.html delete mode 100644 External-LED/index.html delete mode 100644 FAQs/index.html delete mode 100644 Frequent Reboots/index.html delete mode 100644 Gasmeter-Log-Downloader/index.html delete mode 100644 Graphical-configuration/index.html delete mode 100644 Hardware-Compatibility/index.html delete mode 100644 Home/index.html delete mode 100644 Install-a-rolling-(unstable)-release/index.html delete mode 100644 Installation/index.html delete mode 100644 Integrated Functions/index.html delete mode 100644 Integration-Home-Assistant/index.html delete mode 100644 Learn-models-with-your-own-images/index.html delete mode 100644 MQTT-API/index.html delete mode 100644 Migrate-Old-Config-To-New-Config/index.html delete mode 100644 Neural-Network-Types/index.html delete mode 100644 OTA---Update-Firmware-and-Web-Interface/index.html delete mode 100644 REST-API/index.html delete mode 100644 ROI-Configuration/index.html delete mode 100644 Release-creation/index.html delete mode 100644 Testing/index.html delete mode 100644 Watermeter-specific-analog---digital-transition/index.html delete mode 100644 img/0_arbitrary.jpg delete mode 100644 img/3_arbitrary.jpg delete mode 100644 img/ROI_drawing.jpg delete mode 100644 img/ROI_example_settings.jpg delete mode 100644 img/alignment_not_okay.jpg delete mode 100644 img/alignment_okay.jpg delete mode 100644 img/ana-cont/examp-ana1.jpg delete mode 100644 img/ana-cont/examp-ana2.jpg delete mode 100644 img/ana-cont/examp-ana3.jpg delete mode 100644 img/ana-cont/examp-ana4.jpg delete mode 100644 img/ana-cont/examp-ana5.jpg delete mode 100644 img/ana-cont/examp-ana6.jpg delete mode 100644 img/ana-cont/examp-ana7.jpg delete mode 100644 img/ana-examp.jpg delete mode 100644 img/bw_not_okay_big.jpg delete mode 100644 img/bw_not_okay_small.jpg delete mode 100644 img/bw_okay.jpg delete mode 100644 img/correct_algo_1.jpg delete mode 100644 img/correct_algo_2.jpg delete mode 100644 img/correct_algo_3.jpg delete mode 100644 img/correct_algo_zero_crossing.jpg delete mode 100644 img/dig-class11/examp-dig1.jpg delete mode 100644 img/dig-class11/examp-dig10.jpg delete mode 100644 img/dig-class11/examp-dig11.jpg delete mode 100644 img/dig-class11/examp-dig12.jpg delete mode 100644 img/dig-class11/examp-dig13.jpg delete mode 100644 img/dig-class11/examp-dig2.jpg delete mode 100644 img/dig-class11/examp-dig3.jpg delete mode 100644 img/dig-class11/examp-dig4.jpg delete mode 100644 img/dig-class11/examp-dig5.jpg delete mode 100644 img/dig-class11/examp-dig6.jpg delete mode 100644 img/dig-class11/examp-dig7.jpg delete mode 100644 img/dig-class11/examp-dig8.jpg delete mode 100644 img/dig-class11/examp-dig9.jpg delete mode 100644 img/dig-cont/dig-cont_1.jpg delete mode 100644 img/dig-cont/dig-cont_2a.jpg delete mode 100644 img/dig-cont/dig-cont_2b.jpg delete mode 100644 img/dig-cont/dig-cont_3a.jpg delete mode 100644 img/dig-cont/dig-cont_3b.jpg delete mode 100644 img/dig-cont/dig-cont_3c.jpg delete mode 100644 img/enable_log_image.jpg delete mode 100644 img/progammer_manual.jpg delete mode 100644 img/wb_not_okay_big.jpg delete mode 100644 img/wb_not_okay_small.jpg delete mode 100644 img/wb_okay.jpg create mode 100644 index.html diff --git a/404.html b/404.html index 6f2ea0a..b2a7976 100644 --- a/404.html +++ b/404.html @@ -34,7 +34,7 @@ diff --git a/AI-on-the-edge/index.html b/AI-on-the-edge/index.html deleted file mode 100644 index 9a6a307..0000000 --- a/AI-on-the-edge/index.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - Welcome to the AI-on-the-edge-device wiki! - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Welcome to the AI-on-the-edge-device wiki!
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Welcome to the AI-on-the-edge-device wiki!

-

Artifical inteligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerfull processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usally called edge compution. -Here this edge computing is brough into a practical example, where a AI network is implemented on a ESP32 device so: AI on the edge.

-

Have fun in studying the new posibilities and ideas

-

This is about image recognition and digitalization, done totally on a cheap ESP32 board using artifical intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI idenficiation) all the way down to the image recognition (CNN structure) and result plausiblisation is done on a cheap 10 EUR device.

-

This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options.

-

The task to be demonstrated here is an automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading.

-

There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitize the analog pointers for the sub digit readings.

-

This project is a evolution of the water-meter-system-complete, which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 4MB of SDRAM and a SD-Card as data storage.

-

This systems implements several functions:

-
    -
  • (water) meter readout - it can handle also dual meters with two or even more readings
  • -
  • picture provider
  • -
  • fileserver
  • -
  • OTA functionality
  • -
  • web server
  • -
-

The details can be found here: [[Integrated Functions]]

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Addditional-Information/index.html b/Addditional-Information/index.html deleted file mode 100644 index 5ec953f..0000000 --- a/Addditional-Information/index.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - Addditional Information - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

The following links point to additional information in other repos:

-

Digits

- -

Analog

- - -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Best-Practice/index.html b/Best-Practice/index.html deleted file mode 100644 index b4e14e2..0000000 --- a/Best-Practice/index.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - Best Practice - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

This page shows some best practices.

-

Camera Placement

-
    -
  • Move the Camera as close as possible(~4cm), this will help get rid of reflections. - -> focus can be adjusted by turning the outer black ring of the camera.
  • -
  • If the LED reflections are too strong, put tape over the LED to defuse the light
  • -
  • Change the ImageSize to QVGA under "Expert mode" configuration when close enough, this will be faster and is often good enough for digital recognition.
  • -
-

Reflections

-
    -
  • Try to get ride of the reflections by rotating the camera, so that the reflections are at positions, where no number is.
  • -
  • By using the external LED option, you can place WS2812 LEDs freely away from the main axis.
  • -
  • Users report, that a handy cover foil could also help
  • -
-

Post-processing

-
    -
  • Filter out the Number "9", as "3" will often be misread for a "9" and void every number between 3 and 9 due to it being negative flow.
  • -
  • Split the readings into two, while the decimal numbers might move to fast to be recognized, at least the slower moving part will produce a correct reading. --> keep in mind that the offset needs to be adjusted, a.e if you have a comma reading of "3", it needs to become "0.3". This can be done wherever the data ends up being sent, like home assistant using sensor templates.
  • -
  • If you are using a low resolution and only digital mode, processing can often be done in <1 minute. Check the logs to confirm how fast it is and then set the interval accordingly under "Expert mode" in configuration, as the normal mode will lock you to 3+ minutes.
  • -
-
-
    -
  • [ ] Todo condense from various discussions, eg. ~~https://github.com/jomjol/AI-on-the-edge-device/issues/765~~ and https://github.com/jomjol/AI-on-the-edge-device/discussions/984
  • -
  • [ ] Todo add images and more in-depth explanation
  • -
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Build-Instructions/index.html b/Build-Instructions/index.html deleted file mode 100644 index e96703d..0000000 --- a/Build-Instructions/index.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - New - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

New

-

See README.md

-

Old

-

Build the project yourself

-
    -
  • Download and install VS Code
  • -
  • https://code.visualstudio.com/Download
  • -
  • Install the VS Code platform io plugin
  • -
  • -
  • Check for error messages, maybe you need to manually add some python libraries
      -
    • e.g. in my Ubuntu a python3-env was missing: sudo apt-get install python3-venv
    • -
    -
  • -
  • git clone this project
  • -
  • in Linux: git clone https://github.com/jomjol/AI-on-the-edge-device.git
  • -
  • in VS code, open the AI-on-the-edge-device/code
      -
    • from terminal: cd AI-on-the-edge-device/code && code .
    • -
    -
  • -
  • open a pio terminal (click on the terminal sign in the bottom menu bar)
  • -
  • make sure you are in the code directory
  • -
  • To build, type platformio run --environment esp32cam
  • -
  • or use the graphical interface: -
  • -
  • the build artifacts are stored in code/.pio/build/esp32cam/
  • -
  • Connect the device and type pio device monitor. There you will see your device and can copy the name to the next instruction
  • -
  • Add upload_port = you_device_port to the platformio.ini file
  • -
  • make sure an sd card with the contents of the sd_card folder is inserted and you have changed the wifi details
  • -
  • pio run --target erase to erase the flash
  • -
  • pio run --target upload this will upload the bootloader.bin, partitions.bin,firmware.bin from the code/.pio/build/esp32cam/ folder.
  • -
  • pio device monitor to observe the logs via uart
  • -
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Choosing-the-Model/index.html b/Choosing-the-Model/index.html deleted file mode 100644 index 3a426f0..0000000 --- a/Choosing-the-Model/index.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - Which model should I use? - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Which model should I use?
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Which model should I use?

-

In the Graphical Configuration Page, you can choose different models depending on your needs.

-

This wiki page tries to help you on which model to select. -For more technical/deeper explanations have a look on Neural-Network-Types.

-

Digit Models

-

For digits on water meters, gas-meters or power meters you can select between two main types of models.

-

dig-class11

-

This model can recognize full digits. All intermediate states shown a "N" for not a number. But in post process it uses older values to fill up the "N" values if possible.

-

image

-

Main features

-
    -
  • well suited for LCD digits
  • -
  • with the ExtendedResolution option is not supported. (Only in conjunction with ana-class100 / ana-cont)
  • -
-

dig-class100 / dig-cont

-

These models are used to get a continuous reading with intermediate states. To see what the models are doing, you can go to the Recognition page.

-

image

-

Main features

-
    -
  • suitable for all digit displays.
  • -
  • Advantage over dig-class11 that results continue to be calculated in the transition between digits.
  • -
  • With the ExtendedResolution option, higher accuracy is possible by adding another digit.
  • -
-

Look here for a list of digit images used for the training

-

dig-class100 vs. dig-cont

-

The difference is in the internal processing. Take the one that gives you the best results.

-

Analog pointer models

-

ana-class100 / ana-cont

-

For pointers on water meters use the analog models. You can only choose between ana-class100 and ana-cont. Both do mainly the same.

-

image

-

Main features

-
    -
  • for all analogue pointers, especially for water meters.
  • -
  • With the ExtendedResolution option, higher accuracy is possible by adding another digit.
  • -
-

Look here for a list of pointer images used for the training

-

ana-class100 vs. ana-cont

-

The difference is in the internal processing. Take the one that gives you the best results. Both models learn from the same data.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Configuration-Parameter-Details/index.html b/Configuration-Parameter-Details/index.html deleted file mode 100644 index 7c1aebd..0000000 --- a/Configuration-Parameter-Details/index.html +++ /dev/null @@ -1,603 +0,0 @@ - - - - - - - - Configuration Parameter Details - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Configuration Parameter Details
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Configuration Parameter Details

-

[MakeImage]

-
[MakeImage]
-LogImageLocation = /log/source
-WaitBeforeTakingPicture = 5
-LogfileRetentionInDays = 15
-Brightness = -2
-;Contrast = 0
-;Saturation = 0
-ImageQuality = 5
-ImageSize = VGA
-FixedExposure = true
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
LogImageLocationlocation for storing a copy of the image
WaitBeforeTakingPicturewaiting time between switch on the flash-light and taking the image in seconds
LogfileRetentionInDaysNumber of days, for which the log files should be stored0 = keep forever
BrightnessAdjustment of the camera brightness (-2 ... 2)
ContrastNOT IMPLEMENTED
SaturationNOT IMPLEMENTED
ImageQualityInput image jpg-compression quality 0 (best) to 100 (lowest)5 = default
ImageSizeInput Image Size from Cameraonly VGA, QVGA
FixedExposureIf enabled, the exposure settings are fixed at the beginning and the waiting time after switching on the illumination will be skipped
-

[Alignment]

-
[Alignment]
-InitialRotate = 179
-InitialMirror = false
-SearchFieldX = 20
-SearchFieldY = 20
-AlignmentAlgo = Default
-FlipImageSize = false
-/config/ref0.jpg 104 271
-/config/ref1.jpg 442 142
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
InitialMirrorOption for initially mirroring the image on the original x-axis
InitialRotateInitial rotation of image before alignment in degree (1...359)
FlipImageSizeChanges the aspect ratio after the image rotation to avoid cropping of the rotated imaged
/config/refx.jpg 98, 257Link to reference image and corresponding target coordinatesfile link is relative to sd-card root
SearchFieldX/YSearch field size in X/Y for finding the reference images [pixel]
-

Here two reference images are needed. Therefore rotation and shifting can be compensated. As the alignment is one of the most computing time using part, the search field needs to be limited. The calculation time goes quadratic with the search field size.

-

[Digits]

-
[Digits]
-Model=/config/digits.tfl
-ModelInputSize 20, 32
-LogImageLocation = /log/digit
-LogfileRetentionInDays = 2
-number1.digit1 292 120 37 67
-number1.digit2 340 120 37 67
-number1.digit3 389 120 37 67
-number2.digit1 292 180 37 67
-number2.digit2 340 180 37 67
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
ModelLink to the CNN-tflite file used for AI-image recognition
ModelInputSizeImage input size for the CNN-Network [pixel]needed to resize the ROI to the input size
LogImageLocationstorage location for the recognized images, including the CNN-results in the file name/location
numberX.digitYROI for the corresponding digit in the aligned image.
More than one number can be specified. Therefore the name consists of a naming of the number (numberX) and the region of interest (digitY) - separated by .
LogfileRetentionInDaysNumber of days, for which the log files should be stored0 = keep forever
LogImageLocationlocation for storing a copy of the image
-

[Analog]

-
[Analog]
-Model=/config/analog.tfl
-ModelInputSize 32, 32
-LogImageLocation = /log/analog
-LogfileRetentionInDays = 2
-number1.analog1, 433, 207, 99, 99
-number1.analog2, 378, 313, 99, 99
-number1.analog3, 280, 356, 99, 99
-number1.analog4, 149, 313, 99, 99
-number2.analog1, 280, 456, 99, 99
-number2.analog2, 149, 413, 99, 99
-
-

Same as for [digit], here only for the analog pointers

-

[PostProcessing]

-
[PostProcessing]
-number1.DecimalShift = 0
-number2.DecimalShift = -1
-PreValueUse = true
-PreValueAgeStartup = 720
-AllowNegativeRates = false
-number1.MaxRateValue = 0.1
-number2.MaxRateValue = 0.1
-ErrorMessage = true
-CheckDigitIncreaseConsistency = false
-
-

Here the post processing and consistency check for the readout can be adjusted

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
PreValueUseUse the previous value for consistency check and substitution for NaN (True / False)
PreValueAgeStartupMax age of PreValue after a reboot (downtime)
AllowNegativeRatesAllow decrease of the readout value
numberX.MaxRateValueMaximum chance rate from one to the next readout.
This can be specified for each number individual.
ErrorMessageShow error messages
numberX.DecimalShiftShifting of the decimal separator from the default position between digital and analog.
This can be specified for each number individual.
DecimalShift = 2: 123.456 --> 12345.6
DecimalShift = -1: 123.456 --> 12.3456
CheckDigitIncreaseConsistencyThis parameter controls, if the digits are checked for a consistent change in comparison to the previous value. This only makes sense, if the last digit is changing very slowly and every single digit is visible (e.g. 4.7 --> 4.8 --> 4.9 --> 5.0 --> 5.1). If single digits are skipped, for example because the digits changes to fast, this should be disabled (e.g. 4.7 --> 5.0 --> 5.1).
-

[MQTT]

-
[MQTT]
-Uri = mqtt://IP-ADRESS:1883
-MainTopic = wasserzaehler
-ClientID = wasser
-user = USERNAME
-password = PASSWORD
-
-

Here the post processing and consistency check for the readout can be adjusted

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
UriURI to the MQTT broker including port e.g.: mqtt://IP-Address:Port
MainTopicMQTT main topic, under which the counters are published.
The single value will be published with the following key: MainTopic/number/PARAMETER where parameters are: value, rate, timestamp, error and json
The general connection status can be found in MainTopic/connection
ClientIDClientID to connect to the MQTT broker
useruser for MQTT authentication(optional)
passwordpassword for MQTT authentication(optional)
-

[AutoTimer]

-
[AutoTimer]
-AutoStart= true
-Intervall = 4.85
-
-

This paragraph is used to automatically trigger the periodic automated readout.

- - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
AutoStartAutomatically trigger the readout after startup
IntervallReadout interval in minutesValues smaller than 2 minutes do not make sense, as this is the time for one detection
-

[Debug]

-
[Debug]
-Logfile = true
-LogfileRetentionInDays = 2
-
-

This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. -Attention: in case of extended logging the size of the log file (/log.txt, /alignment.txt) might increase rapidly, therefore manually deletion from time to time is recommended

- - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
LogfileTurn on (true) or off (false) the extended loggingparameter and section optional
LogfileRetentionInDaysNumber of days, for which the log files should be stored0 = keep forever
-

[System]

-
[System]
-TimeZone = CET-1CEST,M3.5.0,M10.5.0/3
-;TimeServer = TIMESERVER
-;Hostname = undefined
-SetupMode = false
-
-

This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. -Attention: in case of extended logging the size of the log file (/log.txt, /alignment.txt) might increase rapidly, therefore manually deletion from time to time is recommended

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterMeaningOptions/Examples
TimeZoneTimeZone of the system can be specifiedCentral european, with summertime adjustement: CET-1CEST,M3.5.0,M10.5.0/3
TimeServerAn dedicated time server can be specified.default = pool.ntp.org
HostnameAdditionally to the wlan.ini the hostname can be specified. It will be transferred to the wlan.ini and initiate a reboot
SetupModeIf enabled, the server starts in an initial setup mode. This is automatically disabled at the end of the setup
-

[Ende]

-

No function, just to mark, that the config is done!

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Configuration/index.html b/Configuration/index.html deleted file mode 100644 index 46fc39a..0000000 --- a/Configuration/index.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - Configuration - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Most of the settings can be modified with the help of a web based graphical user interface. This is hosted through the web server on the ESP32.

-

More configuration parameters can be edited by hand in the config.ini and corresponding files in the /config directory on the SD-card.

-

If you where using the Version 1 of the watermeter you can easily transfer the configuration to the new system by following the steps in this migration description

-

Processing / Config.ini principle

-

The principle is very simple and can most easily be described as a flow of processing steps. Each step has a dedicated parameter description in the config.ini, which is indicated by brackets [name_of_step]. The steps are processed in the order written in the config file. That means, that you first have to describe the image taking, then the aligning and cutting and only after that you can start to config a neural network. The last step is the post processing.

-

Processing steps - Overview

-

In the following you get a short overview over the available steps. This order is also the suggested order for the processing flow. Single steps can be left out, if not needed (e.g. omit the analog part, if only digits are present)

-

1. [MakeImage]

-
    -
  • This steps parametrises the taking of the image by the ESP32-CAM. Size, quality and storage for logging and debugging can be set.
  • -
-

2. [Alignment]

-
    -
  • Image preprocessing, including image alignment with reference images
  • -
-

3. [Digits]

-
    -
  • Neural network evaluation of an image for digits. The neural network is defined by a tflite formatted file and the output is a number between 0 .. 9 or NaN (if image is not unique enough)
  • -
-

4. [Analog]

-
    -
  • Neural network evaluation of analog counter. The neural network is defined by a tflite formatted file and the output is a number between 0.0 .. 9.9, representing the position of the pointer.
  • -
-

5. [PostProcessing]

-
    -
  • Summarized the individually converted pictures to the overall result. It also implements some error corrections and consistency checks to filter wrong reading.
  • -
-

6. [MQTT]

-
    -
  • Transfer of the readings to a MQTT server.
  • -
-

7. [AutoTimer]

-
    -
  • Configuration of the automated flow start at the start up of the ESP32.
  • -
-

8. [Debug]

-
    -
  • Configuration for debugging details
  • -
-

9. [Ende]

-
    -
  • No meaning, just an additional indication, that the configuration is finished.
  • -
-

A detailed parameter description can be found here: [[Configuration Parameter Details]].

-

Graphical configuration interface

-

It is recommended to do the configuration of the alignment structures and ROIs through the graphical user interface. A step by step instruction can be found here: [[Graphical Configuration]]

-

Background for Image Alignment

-

Details on the image recognition flow can be found in the other project here: https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdf

-

The config.ini here has the same functionality and options, but a slightly different syntax due to a own written ini-parser is used. Migration see here.

-

Integration into Home Assistant

-

Thanks to the help of the user @deadly667 here are some hints for the integration into the home assistant: [[Integration-Home-Assistant]]

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Correction Algorithm/index.html b/Correction Algorithm/index.html deleted file mode 100644 index 4ea6459..0000000 --- a/Correction Algorithm/index.html +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - Correction Algorithm - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Correction Algorithm

-

After the digitization of the images and the composition to a number a checking and correction algorithm is applied. This is explained here.

-

There are several reasons, that a check might be necessary:

-
    -
  1. In case of digits there is the output of "N" (=NaN = Not-a-Number) in case the digit cannot be detected correctly. This happens for example if the image shows a digit between to states
  2. -
  3. The replacement of the "N" with a previous value could be not sufficient, due to the fact, that it might have changed.
  4. -
  5. There is a misreading of one one of the numbers. This can always happen in case of neural network processing.
  6. -
-

Terms and definitions

-
PreValue
-

The last correct read value. Either from a previous correctly identified value or manual setting by the user.

-

This is used to replace "N"s and make a check for the absolute change.

-
Digits
-

Value that are digitized from a digital number. There are 11 allowed values for this:

-
    -
  1. Digits: 0, 1, 2, ... 9
  2. -
  3. N = Not-a-Number - representing a not unique state between two numbers
  4. -
-
Analogs
-

This are value derived from a pointer like meter. This never has the state "N".

-
CheckDigitIncreaseConsistency
-

If this is enabled an "inteligent" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the subdigit has gone through zero.

-

For example: 16.6 --> 16.7 --> 1N.8 --> 17.9 corrected to 16.9 --> 17.0 --> 17.1

-

As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the subdigit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9

-

A detailed description of the algorithm can be found below (not yet ready!)

-
Negative Rate allowed
-

Most of the meters only have increasing numbers and do not count backwards. Therefore a negative rate (= negative change compared to the PreValue) is surely a false value. This can be checked an flagged as false reading

-
MaxRateValue / MaxRateType
-

Here the maximum change from one to the next reading can be limited. If a false reading of the neural network results in a change larger than this, the reading is flagged as false. There a two types of comparisons possible

-

1) AbsolutChange: Here the difference between the PreValue and the current reading is compared directly, independent how much time has passed since the last reading. -2) RelativeRate: in this case a change rate in the unit of change/minute is calculated, taking the time between the last and the current reading into account. Be careful, that with increasing time, the absolute allowed change increases. - Example: relative rate of 0.05 m³/minute --> after 20 minutes a maximum change of 20 minutes * 0.05 m³/minute = 1 m³ is possible. That means that a false reading of 1 m³ cannot be detected false after about 20 minutes in this case - Assume, that there might me no change in the meter for hours (e.g. during the night) a much bigger change could also be accepted.

-

Flow Chart

-

-

-

-

CheckDigitIncreaseConsistency Algorithm

-

The check digit increase consistency algorithm is functional for the digits only. Due to the fact, that the rotation might be a little bit earlier or later compared to the zero crossing of the digit before, errors during the reading before and after a zero crossing can be wrong. Therefore a simple algorithm can be applied, checking the consistency of zero crossing and changes in the following digit. This is applied to one after the other digit, starting with the lowest priority digits.

-

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Demo-Mode/index.html b/Demo-Mode/index.html deleted file mode 100644 index fdd670c..0000000 --- a/Demo-Mode/index.html +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - Demo Mode - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

For Demo and Testing Purpose, the device can use pre-recorded images.

-

You need to enable it in the configuration (TakeImage > Demo) and also provide the needed files on the SD-Card.

-

One image per round gets used, starting with the first image for the first round.

-

For the reference image and the alignment also the first image gets used.

-

Once the last image got reached, it starts again with the first one.

-

Example Demo

-

You can use the following demo or create your own one. -Just install it using the OTA Update functionality.

-
    -
  • demo.zip (this is just a zip of this folder in the repo)
  • -
-

SD-Card Structure

-
demo/
-├── 520.8983.jpg
-├── 520.9086.jpg
-├── 520.9351.jpg
-├── ...
-└── files.txt
-
-
    -
  • The jpg files can have any name
  • -
  • The jpg files must be smaller than 30'000 bytes
  • -
  • The files.txt must contains a list of those files, eg: - 520.8983.jpg - 520.9086.jpg - 520.9351.jpg
  • -
-

Recoding

-

To record real images of a meter, you have to periodically fetch http://<IP>/img_tmp/raw.jpg.

-

To automate this, you can use the following shell script (Linux only):

-
#!/bin/bash
-
-while [[ true ]]; do
-    echo "fetching value..."
-    wget -q http://192.168.1.151/value -O value.txt
-
-    value=`cat value.txt`
-    echo "Value: $value"
-
-    diff=`diff value.txt value_previous.txt`
-    changed=$?
-    #echo "Diff: $diff"
-
-    if [[ $changed -ne 0 ]]; then
-        echo "Value changed:"
-        echo $diff
-        echo "fetching image..."
-        wget -q http://192.168.1.151/img_tmp/raw.jpg -O $value.jpg
-    else
-        echo "Value did not change, skipping image fetching!"
-    fi
-
-    cp value.txt value_previous.txt
-
-    echo "waiting 60s..."
-    sleep 60
-done
-
-

How does it work

-

The Demo Mode tries to interfere as less as possible with the normal behavior. Whenever a Cam Framebuffer gets taken (esp_camera_fb_get()), it replaces the framebuffer with the image from the SD-Card.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Error-Codes/index.html b/Error-Codes/index.html deleted file mode 100644 index 6357362..0000000 --- a/Error-Codes/index.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - Error Codes - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

This page lists the possible error codes, their meaning and possible solutions.

-

The effective error codes can be found here.

-

Critical Errors

-

Those Errors make the normal operation of the device impossible. -Most likely they are caused by a hardware issue!

-

0x00000001 PSRAM bad

-

Your device most likely has no PSRAM at all or it is too small (needs to have at least 4 MBytes)! -See https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility -Usually the log shows something like this:

-
psram: PSRAM ID read error: 0xffffffff
-cpu_start: Failed to init external RAM!
-
-

0x00000002 Heap too small

-

The firmware failed to allocate enough memory. This most likely is a consequential error of a bad PSRAM!

-

0x00000004 Cam bad

-

The attached camera can not be initialized. -This usually is because on of the following reasons: - - The camera is not supported, see https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility - - The camera is not attached properly -> Try to remove and attach it again. Make sure you move the black part enough into the socket! - - The camera or the camera cable is damaged

-

Non-Critical Errors

-

Those Errors can be caused by an error during initialization. It is possible that the error has no impact at all or that a reboot solves it.

-

0x00000100 Cam Framebuffer bad

-

The firmware was unable to initialize the Camera Framebuffer. -The firmware will continue to work, but other consequential error might arise. -A reboot of the device might help.

-

0x00000200 NTP failed

-

The firmware failed to get the world time from an NTP server. The firmware will continue to work, but has a wrong time.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Error-Debugging/index.html b/Error-Debugging/index.html deleted file mode 100644 index f89555f..0000000 --- a/Error-Debugging/index.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - Error Debugging - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Error Debugging

-

Rebooting

-
General Remark
-
    -
  1. -

    Due to the rather complex code with a lot of external libraries and the limited availability of memory a reboot of the device from time to time is "normal". Background are memory leakages and therefore running out of free memory.

    -
  2. -
  3. -

    The hardware of the ESP32CAM has a varying quality. I have one and the same hardware with a reboot range from every 5 detection runs to up to 250 detection runs.

    -
  4. -
-
Getting deeper inside
-

Have a look into the log file (/log/message/...).

-
    -
  • If the log file is very short you need to enable a enhanced logging in the config.ini (Debug --> logfile = true) .
  • -
-

Analyze the debugging output of the serial interface

-
    -
  • Connect a serial to USB interface (like for flashing) and make a logging of the serial communication
  • -
  • There are a lot more intermediate information and the lines before the reboot tell you, where the firmware fails
  • -
-

If you make an issue about this, please post these two information additionally

-

Don't forget to remove your WLAN password in the serial log

-

Often observed problems

-

Hardware failure

-
    -
  • Camera not working --> check the interface, test another module
  • -
  • Low cost module with only 2MB of PSRAM instead of 4MB --> image taking will fail first. This will never work due to too low memory
  • -
-

ROI misaligned

-

-

This typically happens if you have suboptimal "Alignement Marks". A very simple and working solution is to put put higly contrasted stickers on your meter and put "Alignement Marks" on it (see picture below)

-

-

If after those adjustement you still have some issues, you can try to adjust your aligmenet settings in expert mode: -

-

My Analog Meter are recognized as Digital Counter or vice versa

-

-
    -
  1. First, check that your ROI are correctly defined (yey!)
  2. -
  3. Second, verify that the name of your ROI analog and digital ROIs are different
  4. -
-

Recognition is working well, but number aren't sorted correctly

-

You have to sort your ROI correctly (Bigger to smaller). Select your ROI and click either "move next" or "move previous". Repeat until your ROI are correctly sorted

-

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/External-LED/index.html b/External-LED/index.html deleted file mode 100644 index e6a83b0..0000000 --- a/External-LED/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - External LED - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

External LED

-

The internal flash LED is very close to the camera axis. This results in reflection, especially in case of flat glass surfaces such as for power meters. -To circumvent this problem, it is now possible to control external LEDs, which than can be places somewhere else in the setup. As not simples LEDs are used, but RGB leds with a digital interface like WS2812 not only the position, but also the color and intensity of the illumination can now be adjusted. The following image shows a direct comparision of the "old" internal flash LED and two off axis LEDs.

-

-

There is also a new meter adapter available. This has two features: designed for small clearings in front of the meter and prepared for WS2812 LEDs.

-

-

1. Hardware installation of the LED stripe

-

The control line of the LED stripe is connected with a 470 Ohm resistor to the GPIO12. -For power supply stabilization a capacitor between 5V and ground is recommended. Here a 470µF polymer capacitor is used. As a power supply a 5V from the ESP32 is used like in the following wiring.

-

-

2. Software configuration

-

The handling of the WS2812 LED controller needs some other libraries, therefore it is controlled within a dedicated section called GPIO Settings. The external LED stripe is connected to GPIO12. After activating the "GPIO Settings" section, the internal flash is per default disabled. In order to activate the external LED, you need to activate GPIO 12 state and select "extern flash light ws281x ...".

-

- - - - - - - - - - - - - - - - - - - - - -
ParameterMeaning
LED-TypeThere are several types of controller implemented: WS2812(B), WS2813, SK6812
Numbers of LEDNumber of LEDs on the LED stripe
LED ColorThe color and intensity can be controlled directly by a red/green/blue value, each within the range from 0 (off) to 255 (full)
-

Enabling the GPIO settings automatically disables the flash LED. Therefore you can enable it here manually by checking GPIO4 and choose "build-in led flash light". It is not recommended to use both illumination parallel.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/FAQs/index.html b/FAQs/index.html deleted file mode 100644 index 9071329..0000000 --- a/FAQs/index.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - Frequently Asked Questions - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Frequently Asked Questions
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Frequently Asked Questions

-

My device is reboot frequently. What can I do?

-

There are several reasons for the reboot:

-
    -
  • Frequent HTML requests
  • -
  • Wrong configuration, missing configuration files
  • -
  • Unstable hardware - see [[Hardware Compatibility]]
  • -
-

There is a dedicated Wiki page about this: [[Frequent Reboots]]

-

How accurate are the detections?

-

It is hard to give a specific accuracy number. It depends on many factors, e.g.

-
    -
  • How in-focus is your camera?
  • -
  • How sturdy is the camera mount? Does it slightly move over extended periods of time?
  • -
  • What type of meter are you reading? Is the meter already in the training data set?
  • -
  • Are you trying to read digits, an analog dial, or both?
  • -
  • etc.
  • -
-

Anecdotally, the authors of this wiki have great success with the meter. While the AI algorithm itself is not perfect and sometimes returns NaN or incorrect values, other post-processing / prevalue / sanity checks help ensure such invalid values are filtered out. With the correct settings, one author has been running this device for 1 month without any incorrect values reported.

-

See the FAQs below for more details and configuration hints.

-

My numbers are not corrected detected. What can I do?

-
    -
  • There is a dedicated Wiki page about the correct setting [[ROI Configuration]]
  • -
  • This page also includes the instructions for gathering new images for the training.
  • -
-

How can I ensure invalid numbers are never reported?

-

As mentioned above, the AI algorithm is not perfect. Sometimes it may read an incorrect value.

-

We can tune the software to almost never report an incorrect value. There is a tradeoff though: the software may report stale values - i.e. it will drop incorrect values for a potentially long period of time, resulting in the meter reading being outdated by hours. If never receiving an incorrect value is important to you, consider tolerating this tradeoff.

-

You can change the following settings to reduce incorrect readings (but potentially increase staleness of data): -* Set a prevalue via the UI, then change PostProcessing configuration option PreValueAgeStartup to a much larger number (e.g. 43200 = 30 days). -* Change PostProcessing configuration option MaxRateType to be time based instead of absolute. Set MaxRateValue to something realistic (e.g. 5 gal/min). You can often find the max flow rate your meter supports directly on the cover. -* Reduce AutoTimer configuration option Intervall to the lowest it can be (e.g. 3 min). The more often you take readings, the less likely for data staleness to occur.

-

Even after I have setup everything perfect there is a false reading - especially around the zero crossing (roll over to next number)

-
    -
  • The roll over behavior is different for the different meters. E.g.:
  • -
  • Rolling over start with different previous position (e.g. at 7, 8 or 9)
  • -
  • -

    The neutral position (no rolling) is not perfectly at zero, but rather at something like 7.9 or 8.1, even if it should be exactly 8

    -
  • -
  • -

    The "PostProcessingAlgo" is trying to judge out of the individual readings, what number it should be.

    -
  • -
  • -

    For example if the previous number is a "1", but the next number seems to be a "8.9", mos probably there was a "zero crossing" and the number is a "9" and not still an "8"

    -
  • -
  • -

    Currently the setting of the algorithm is set to fit most of the meters and cases. But the parameters do not fit perfectly for all situations. Therefore there might be intermediate states, where the reading is false. - This is especially the case, at the positions, where the roll over (zero crossing) is just starting.

    -
  • -
  • To prevent a sending of false parameters, there is the possibility to limit the maximum allowed change (MaxRateChange). - Usually after some time and movement of the counters a bit further, the reading is getting back to a stable reading.
  • -
  • To handle this, a parametrized setting would be needed. This is rather complicated to implement as subtle changes make a relevant difference. Currently this is not implemented. - So please be a bit patient with your meter :-)
  • -
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Frequent Reboots/index.html b/Frequent Reboots/index.html deleted file mode 100644 index 0985827..0000000 --- a/Frequent Reboots/index.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - - Frequent reboots - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Frequent reboots

-

There are several types of reboots. To get a deeper insight turn on the logging:

-
    -
  1. Internal logging (config.ini)
  2. -
  3. Serial log of the UART interface (same as for flashing the firmware)
  4. -
-

There are two principle types of reboots

-
    -
  1. Random reboots (always different timing and situation)
  2. -
  3. Permanent Reboots always at the same time
  4. -
-
-

Random reboots

-

Random reboots have two reasons: overload during HTML access and unstable system

-

In general: there are several mechanisms in the firmware (like saving previous values), to have a "smooth" reboot without too many notable disturbance.

-
Overload during HTML access
-

If you frequently access the web server over HTML requests, the firmware tends to reboot. This especially happens during the first run and when the ESP32 is busy with the digitization flow.

-

The reason for this are running out of memory during a flow, minor memory leakage in combination with missing error handling.

-

There is noting you can do about this kind of reboot, beside two thing:

-
    -
  1. Support the firmware development with improved and tested part of code
  2. -
  3. Be patient :-)
  4. -
-
Unstable system
-

If your system is sometimes running smoothly over several runs and sometimes reboots obviously randomly, you have an partially unstable device.

-

You can check this in the standard log file on the SD card:

-
2021-12-26T06:34:09: task_autodoFlow - round done
-2021-12-26T06:34:09: CPU Temperature: 56.1
-2021-12-26T06:38:00: task_autodoFlow - next round - Round #23
-
-

Here you see, that the round #23 is starting, so obviously there were no reboots in the last 22 rounds. There is hardware (ESP32CAM), where only 2-3 stable rounds are possible and others, where way more than 100 rounds without any reboots is possible. -There is noting you can do about it, beside testing different hardware.

-
-

Permanent reboots

-

Permanent reboots at the same situation during the flow has a systematic problem either in the hardware or the configuration. It usually happens during the first run as there all needed parts of the firmware have been loaded for the first time.

-

To find the reason mostly the serial log of the UART interface from the startup until the reboots is very helpful. It can be stored using the USB / UART interface - the same as for flashing the firmware - and logging the serial output of the ESP32.

-

Possible problems:

-
    -
  • -

    SD card

    -
  • -
  • -

    PSRAM too low

    -
  • -
  • Configuration missing
  • -
-
SD card problems
-

The ESP32CAM is a little bit "picky" with the supported SD cards. Due to the limited availability of GPIOs the SD card can only be accessed via 1-wire mode. Therefore not all SD cards are supported. Several error cases can happen:

-
No SD card
-

Easy to detect: fast blinking red LED directly after startup, no reaction of the web server etc. at all

-
SD card not supported at all
-

Error message of no detectable SC card in the log file. Normal looking log for a 16GB SD card is like this:

-

```09:38:25.037 -> I (4789) main: Using SDMMC peripheral -09:38:25.037 -> I (4789) main: Using SDMMC peripheral -09:38:25.138 -> Name: SC16G -09:38:25.138 -> Type: SDHC/SDXC -09:38:25.138 -> Speed: 20 MHz -09:38:25.138 -> Size: 15193MB

-

-Otherwise there is some error message.
-
-###### SD card recognized but not supported
-
-This is the most annoying error. The SD card is detected, but the files cannot be read. Most probably this results in a problem with the WLAN connection, as the first file needed is the `wlan.ini` in the root directory.
-
-
-
-##### PSRAM too low
-
-In order to work, there are 4 MB of PSRAM necessary. Normaly the ESP32CAM is equiped with 8 MB, whereof only 4 MB can be used effectively. 
-Sometimes, there is hardware, where only 2 MB of PSRAM is present - **even if you have bought a 8 MB module**
-
-You can identify the amount of PSRAM in the serial log file:
-
-
-

09:38:21.224 -> I (881) psram: This chip is ESP32-D0WD -09:38:21.224 -> I (885) spiram: Found 64MBit SPI RAM device -09:38:21.224 -> I (890) spiram: SPI RAM mode: flash 40m sram 40m -09:38:21.224 -> I (895) spiram: PSRAM initialized, cache is in low/high (2-core) mode. -```

-

Here you see 64MBit (= 8MByte) - which is okay. False reading would be: 16MBit

-

The error in the SD log file is typically related with the taking of the image (tbd) as the first time, the system is running out of memory is usually, when it tries to transfer an image from the camera to the PSRAM.

-

There is nothing to do, than to buy a new ESP32CAM with really 64MBit of PSRAM.

-
Configuration missing
-

There are several files needed during on run cycle. If one of this is missing, the firmware is missing information and tends to reboot due to missing error management:

-
    -
  • -

    /wlan.ini

    -
  • -
  • -

    /config/config.ini

    -
  • -
  • -

    /config/XXXXX.tflite (1 time for analog and 1 time for digital)

    -
  • -
-

where XXXXX is the file name, that is written in the config.ini

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Gasmeter-Log-Downloader/index.html b/Gasmeter-Log-Downloader/index.html deleted file mode 100644 index b7cfa45..0000000 --- a/Gasmeter-Log-Downloader/index.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - Gasmeter Log Downloader - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Gasmeter Log-Downloader

-

This small tool downloads the logfiles from your ESP32 and stores the last value of the day in an *.csv file.

-

To use this tool you need to activate the debug logfile in your configuration (Configuration / Debug / Logfile). I go with 30 days of retention in days.

-

It downloads only the past logfiles (yesterday and older).

-

You can define the max. number of Logfiles to download (beginning from newest [yesterday]).

-

I wrote this tool to get a chart of the daily gas consumption to optimize my gas powered heating.

-

Variables to define by yourself:

-
    -
  • URL to Logfile-Path on Device: "http://ESP32-IP-Address/fileserver/log/message/"
  • -
  • Download Logfiles to: enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\Log-Downloads\"
  • -
  • Output CSV-File: enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\DailyValues.csv"
  • -
  • Download Logfiles from past # days: enter the max. number of logfiles you want to download (<= your logfile retention value in your device configuration)
  • -
-

Feel free to optimize and modify it.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Graphical-configuration/index.html b/Graphical-configuration/index.html deleted file mode 100644 index 3d7a95d..0000000 --- a/Graphical-configuration/index.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - - - Graphical configuration - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Graphical configuration

-

General remark:

-
    -
  • -

    to activate the changes, currently the device needs a restart after saving the changes.

    -
  • -
  • -

    partially the commands needs processing on the ESP32 device. This is not very fast - so please be patient.

    -
  • -
  • -

    too frequent http-request could result in a reboot of the ESP32 - normally this is not a problem as the server react about 30s later normally.

    -
  • -
-

Access to the graphical user interface

-

The graphical configuration mode can be reached via the "Edit Configuration" button in the main menue (/index.html):

-
    -
  • -
-

Overview function

-
    -
  • -

    -
  • -
  • -

    Direct edit config.ini in text editor

    -
  • -
  • Configuration of image alignment - a. Create of reference image - b. Define alignment structures
  • -
  • Definition of ROIs for digits and analog pointers
  • -
  • Test the settings
  • -
  • Back to main menue ("index.html")
  • -
-

1. Edit Config.ini

-

This is a text editor for the config.ini. Changes commited with the button on the lower left.

-
    -
  • -
-

2a. Create Reference Image

-

The reference image is the basis for the coordination of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated.

-

Attention: Updating the reference image, also means, that all alignment images and ROIs needs to be teached again. Therefore do this step only with caution.

-
    -
  • -
-

At first the current image is shown and no adjustment is possible. To reload the actual image push the button "Show actual Reference" (1). To define a new reference image push the button "Create new Reference" (2). -Then the last taken raw image from the camera is loaded. If you want to update this, you can push the button "Make new raw image (raw.jpg)". If you need to mirror your image (e.g. mirror before camera) you can do this by selecting "mirror image". After loading the mirroring (in case checked) and the prerotation angle from the config.ini are applied. Then use the rough and fine adjustment to get the image straight aligned (3). -If everything is done, you can save the result with "Update Reference Image" (4).

-

If you have problems with reflections, you can turn the camera in a positions, where the reflection is at a position, where no important information is. To reduce the intensity of the reflection you can also a peace of felt ("Filz") as diffusior at the LED.

-

2b. Define Alignment References

-

The alignment references are used to realign every taken image to the reference coordinates. Therefore two alignment structures are identified and the image is shifted and rotated according to their position with the target to be in exactly the same position as the reference image.

-
    -
  • -
-

The alignment structures needs to be unique and have a good contrast. As this is the most calculation intensive process, only a field of view of 40x40 pixels around the original coordinates are scanned. This can be adjusted manually in the config.ini(Parameter: SearchFieldX / SearchFieldY).

-

In the upper part of the settings you can control the position and size of the selected reference image. You can define the ROI in the image directly via drag and drop with the mouse. Go to the starting point, push the left mouse button and drag your ROI. You will a red rectangle with the newly selected position. To make this active, you need to push "Update Reference" (2). -You can change between the two reference images with the drop down box ("Reference 0", "Reference 1").

-

In some cases it might be useful to use a reference with a higher contrast. This can be achieved by pushing "Enhance Contrast" (3). The result will be calculated on the ESP32 - so be a bit patient, before you see it active.

-

To save the modified reference to the config.inipush finally "Save to config.ini".

-

3a./3b. Define ROIs for image recognition

-

Here the regions of interest for the digital and analog pointers are defined. As both are done identically, here as an example the digital images are shown.

-
    -
  • -
-

First of all you can define more than one number, for example in a dual meter counter. This can be done with defining a "Number" (1). Analog and digital ROIs belonging to the same "Number" are considered to be part of the same counter.

-

As for the reference images you can change position, size and name of the ROI in the text fields or define them via drag and drop through the mouse button. You can iterate through the defined ROIs through the drop down box in the left upper area (2). To define new or delete ROIs use the corresponding button. Be careful: if you delete all ROIs, the tool will ask you to define minimum one manually in the config.ini. -The order of the ROIs correspond to the position of the digit / analog pointer in the final readout number. The order can be changed with the button "move Next" / "move Previous" (3).

-

In order to have a good recognition, the active ROI has two rectangles for alignment:

-

-
    -
  • The outer rectangle is the final size of the ROI
  • -
  • More important is the inner smaller rectangle. This should tightly fit around the number itself in x- and in y-dimension. Maybe you need to unlock the aspect ratio to change x- and y-size independendly
  • -
  • The line in the middle should go through the middle of the number (in case it is not moving in or out)
  • -
-

To save the result push "Save all to config.ini" (4).

-

Attention: Currently you have to reboot the ESP32 to take the changes in the config.ini to take place.

-

This steps are running on the ESP32 directly. So be patient with the results.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Hardware-Compatibility/index.html b/Hardware-Compatibility/index.html deleted file mode 100644 index d2e1e21..0000000 --- a/Hardware-Compatibility/index.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - - - - Hardware Compatibility - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Hardware Compatibility

-

See also https://github.com/jomjol/AI-on-the-edge-device/discussions/1732

-

General Remark: similar "looking" Board can have major differences:

-
    -
  • Processor
  • -
  • Ram (Size! & Type) -> this Project needs at least 4MB RAM!
  • -
  • Flashrom
  • -
  • Camera Modules
  • -
  • Onboard/External Antenna
  • -
  • Quality of Components
  • -
  • Manufacture Quality of the PCB and soldering
  • -
  • Different Components
  • -
  • "Clone" Components -> ESPxx
  • -
  • etc.
  • -
-

This can cause different Power Consumption, Power Requirements, compatibility issues, etc.

-

Most manufacturers and sellers buy what's cheap today on the Asian markets. In the end, it looks like it is sometimes a trial and error approach which ESP32-CAM Module works reliable.

-

Below you find some remarks and experiences from the community:

-

ESP32 core itself

- - - - - - - - - - - - - - - -
Chip VersionImageStatus
ESP32-D0WDQ6 (revision 1)okay
-

PSRAM

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Labeling on PSRAM moduleImageStatus
IPUS
IPS640LS0
1815XBGN
okay
AP MEMORY
6404L-3SOR
1040H
110089G
okay
AP MEMORY
6404L-3SQR
12205
150047G
okay
8MB
AP MEMORY
6404L-350R
1120A
130027G
NOT OK
PSRAM not accessible
AP MEMORY
6404L-35QR
11208
130025G
NOT OK
PSRAM not accessible
AP MEMORY
6404L-3SQR
13100
180026G
NOT OK
PSRAM not accessible
AP MEMORY
6404L-3SQR
11207
130024G
NOT OK
PSRAM not accessible
AP MEMORY
1604M-3SQR
0280A
070036G
NOT OK
2MB only!
ESP PSRAM64H 462021
1B00286
okay
ESP PSRAM16M 302020
NOT OK
2MB only!
ESP PSRAM16H 202020
050022G
NOT OK
2MB only!
-

OV2640 - Camera

-

The experience with the camera only is based on single modules. It is well possible, that this module had a damage overall and other modules of the same type will work. Give it a try and report to me!

- - - - - - - - - - - - - - - - - - - - - - - - - -
Labeling on Flex-ConnectorImageStatus
TY-OV2
640-V2.0
okay
DCX-OV2
640-V2
okay
DC-26
40-V3
okay: 3x
NOT OKAY: 1x
-

ESP32 Modules

- - - - - - - - - - - - - - - - - - - - -
ModuleImageStatus
ESP32CAM
Different versions on the market! Especially the PSRAM is sometimes labeled wrong (Label: 4MB, Real: only 2 MB --> will not work!)
okay
with >=4 MB PSRAM!
ESP32-S3-EYE
No Flash LED, pins different used (e.g. LCD diskplay)
NOT OKAY
-

SD-Cards

-

Due to the limited free available gpios (due to all the extensions needed like: camera, sd-card, LED-flash, ...) the sd card is connected in 1-wire mode. There are some cards, that are compatible with the esp32cam module for unknown reasons. -It is observed, that smaller cards (up to 4 GB) tend to be more stable and larger cards have more problems. But quite some exceptions in the forums (4 GB cards not working, 16 G cards working like a charm).

-

Devices known to work

-

Please add links to stores of which you know they work: - - https://arduino-projekte.info/produkt/esp32-cam-v2-integriertem-ch340-mit-ov2640-kamera-modul/ ? See https://github.com/jomjol/AI-on-the-edge-device/discussions/1041 -- https://www.amazon.de/-/en/gp/product/B0B51CQ13R -- https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE (27.12.2022) - - ... - Sandisk 2GB Micro SD Class 2 Sandisk 2GB -AITRIP ESP32 and CAM ESP-32/CAM -- Amazon US - Aideepen ESP32-CAM W BT Board ESP32-CAM-MB Micro USB to Serial Port CH-340G with OV2640 2MP Camera Module Dual Mode with Amazon US - Cloudisk 5Pack 4GB Micro SD Card 4 GB MicroSD Memory Card Class6

-

Weak Wifi

-

The ESP32-CAM supports an external antenna. It requires some soldering skills but can improve the connection quality. See https://randomnerdtutorials.com/esp32-cam-connect-external-antenna/

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Home/index.html b/Home/index.html deleted file mode 100644 index b88238f..0000000 --- a/Home/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - Welcome to the AI-on-the-edge-device! - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Welcome to the AI-on-the-edge-device!

-

Artificial intelligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called edge computing. -Here this edge computing is brought into a practical oriented example, where a AI network is implemented on a ESP32 device so: AI on the edge.

-

Key features

-
    -
  • Tensorflow Lite (TFlite) integration - including easy to use wrapper
  • -
  • Inline Image processing (feature detection, alignment, ROI extraction)
  • -
  • Small and cheap device (3x4.5x2 cm³, < 10 EUR)
  • -
  • camera and illumination integrated
  • -
  • Web surface to administrate and control
  • -
  • OTA-Interface to update directly through the web interface
  • -
  • API for easy integration
  • -
-

Idea

-

-

Hardware

-

-

Web interface

-

-

Configuration Interface

-

-

Have fun in studying the new possibilities and ideas

-

This is about image recognition and digitalization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device.

-

This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options.

-

The task to be demonstrated here is a automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading.

-

There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings.

-

This project is a evolution of the water-meter-system-complete, which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD-Card as data storage.

-

Functionality

-

This systems implements several functions:

-
    -
  • water meter readout
  • -
  • picture provider
  • -
  • file server
  • -
  • OTA functionality
  • -
  • graphical configuration manager
  • -
  • web server
  • -
-

The details can be found here: [[Integrated Functions]]

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - - Next » - - -
- - - - - - - - diff --git a/Install-a-rolling-(unstable)-release/index.html b/Install-a-rolling-(unstable)-release/index.html deleted file mode 100644 index 6060d9b..0000000 --- a/Install-a-rolling-(unstable)-release/index.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - :bangbang: Living on the edge :bangbang: - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • :bangbang: Living on the edge :bangbang:
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

:bangbang: Living on the edge :bangbang:

-

:bangbang: The branch rolling contains the latest version of the Firmware and the Web Interface. It is work in progress, don't expect it to work stable or be an improvement for your AI-on-the-edge-device! Also it might break the OTA Update and then require manual flashing over USB! :bangbang:

-

Still here?

-

Grab the latest build from https://github.com/jomjol/AI-on-the-edge-device/actions and proceed as following: -1. Pick the most top successful (green) build. -2. Download the firmware__extract_before_upload__only_needed_for_migration_from_11.2.0 and extract it (its a zip file). -3. Flash that binary as new firmware. -4. Download the html__only_needed_for_migration_from_11.2.0__2022-09-15_19-13-37__rolling_(042ff18). It is also a zip file but you should not extract it! -5. Flash the zip file als html part.

-

The filenames have changed, e.g. right now it is: -* AI-on-the-edge-device__manual-setup__rolling_(4b23e0c) -* AI-on-the-edge-device__remote-setup__rolling_(4b23e0c)   -* AI-on-the-edge-device__update__rolling_(4b23e0c)

-

Github bot-reply Rolling Build has the following info at the moment:

-

You can use the latest Automatic Build of the the rolling branch. It might already contain a fix for your issue. -Pick the most top passing entry (it has a green circle with a tick in it), then scroll down to the Artifacts and download the file named update_*. So I do not know what the manual-setup and remote-setup are used for.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Installation/index.html b/Installation/index.html deleted file mode 100644 index df40c0e..0000000 --- a/Installation/index.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - Installation - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Installation

-

The installation requires multiple steps: -1. Get the right hardware and wire it up -1. Flash the firmware onto the ESP32 -1. Write the data to the SD-Card -1. Insert the SD-Card into the ESP32 board -1. Power/restart it.

-

Hardware

-

ESP32-CAM

-
    -
  • OV2640 camera module
  • -
  • SD-Card slot
  • -
  • 4 MB PSRAM.
  • -
-

It can be easily found on the typical internet stores, searching for ESP32-CAM for less than 10 EUR.

-

USB->UART interface

-

For first time flashing the firmware a USB -> UART connector is needed. Later firmware upgrades than can be flashed via OTA.

-

Power supply

-

For power supply a 5V source is needed. Most easily this can be done via an USB power supply. The power supply should support minimum 500mA. For buffering current peaks some users reported to use a large elco condensator like a 2200uF between ground and VCC.

-

Attention: in several internet forums there are problems reported, in case the ESP32-CAM is only supplied with 3.3V.

-

Housing

-

A small 3D-printable example for a very small case can be found in Thingiverse here: https://www.thingiverse.com/thing:4571627

-

-

Attention: the focus of the OV2640 needs to be adjusted, as it is normally set from ~40cm to infinity. In order to get an image that is big enough, it needs to be changed to about 10cm. Therefore the sealing glue on the objective ring needs to be removed with a scalpel or sharp knife. Afterwards the objective can be rotated clockwise until the image is sharp again. -

-

Wiring

-

Beside the 5V power supply, only for the first flashing a connection to the USB-UART connector, including a short cut of GPIO0 to GND for bootloader start.

-

A example for wiring can be found here:

-

-

-

It is also possible to use external LEDs for the illumination instead of the internal flash LED. This is described here: [[External-LED]]

-

Firmware flashing

-

Files

-

Grab the firmware from the - - Releases page (Stable, tested versions), or the - - Automatically build development branch (experimental, untested versions). Please have a look on https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release first!

-

You need: -* partitions.bin -* bootloader.bin -* firmware.bin -* html.zip

-

Flashing

-

There are several options to flash the firmware. Here three are described:

-

1. Web Installer

-

There is a Web Installer available which will work right out of the web browser Edge and Chrome. -You can access it with the following link: https://jomjol.github.io/AI-on-the-edge-device

-

This is the preferred way for beginners as it also allows access to the USB Log:

-

-

2. Using the Flash Tool from Espressif

-

The flashing of the firmware can be done with the "Flash Download Tool" from espressif, that can found here

-

Download and extract the Flash tool, after starting choose "Developer Mode", then "ESP32-DownloadTool" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port.

-

:bangbang: Attention :bangbang: if you reflashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash.

-

But your ESP32 in bootloader mode and push start, then it will identify the board and you can configure the bin-configuration according to the following table:

- - - - - - - - - - - - - - - - - - - - - -
FilenameOffset
bootloader.bin0x1000
partitions.bin0x8000
firmware.bin0x10000
-

-

Alternatively it can be directly flashed from the development environment - here PlatformIO. But this is rather for experienced users, as the whole development chain needs to be installed for compilation.

-

3. Using esptool in python directly

-

For this you need a python environment (e.g. Anaconda in Win10). -Here you need to install the esptool:

-
pip install esptool
-
-

Then connect the ESP32 with the USB-UART connector to the system, put it in bootmode and with the following command you can erase the flash and flash bootloader, partitions and firmware in two steps:

-
esptool erase_flash
-esptool write_flash 0x01000 bootloader.bin 0x08000 partitions.bin 0x10000 firmware.bin
-
-
    -
  • Maybe you need to specify the COM-port if it is not detected by default.
  • -
  • If the erase command throws the error A fatal error occurred: ESP32 ROM does not support function erase_flash., your esptool might be too old, see https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/
  • -
-

With some Python installations this may not work and you’ll receive an error, try python -m pip install esptool or pip3 install esptool

-

Further recommendations can be found on the espressif webpage

-

SD-Card

-

The program expects a SD-Card installed with certain directory and file structure in order to work properly. -For the first setup take the initial_esp32_setup_*.zip from the Release page and extract the content of the contained sd-card.zip onto your SD-Card.

-

This must only be done once as further updates of the SD-Card are possible with the OTA Update.

-

:bangbang: Attention :bangbang:

-
    -
  • Due to the limited availability of GPIOs (OV2640, Flash-Light, PSRAM & SD-Card) the communication mode to the SD card is limited to 1-line SD-Mode. It showed up, that this results in problems with very large SD-Cards (64GB, sometimes 32 GB) and some no name low cost SD-cards.
  • -
  • There must be no partition table on the SD-card (no GPT, but only MBR for the single partition)
  • -
  • Following setting are necessary for formating the SD-card: SINGLE PARTITION, MBR, FAT32 - 32K. NOT exFAT
  • -
  • Some ESP32 devices share their SD-card and/or camera GPIOs with the pins for TX and RX. If you see errors like “Failed to connect” then your chip is probably not entering the bootloader properly. Remove the respective modules temporarily to free the GPIOs for flashing. You may find more information about troubleshooting on the homepage of Espressif.
  • -
-

The ESP32 indicates problems with the SD card during startup with a fast not ending blinking. -In this case, please try another SD card.

-

WLAN

-

The access to the WLAN is configured in the "wlan.ini" directly on the root directory of the sd-card. Just write the corresponding SSID and password before the startup of the ESP32. This file is hidden from external access (e.g. via Filemanager) to protect the password.

-

After power on the connection status is indicated by 3x blinking of the red on board LED.

-

WLAN-Status indication:

-
    -
  • 5 x fast blinking (< 1 second): connection still pending
  • -
  • 3 x slow blinking (1 second on/off): WLAN connection established
  • -
-

It is normal that at first one or two times a pending connection is indicated.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Integrated Functions/index.html b/Integrated Functions/index.html deleted file mode 100644 index 063c7c2..0000000 --- a/Integrated Functions/index.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - Integrated Functions - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

wasserzaehler

-

http://IP-ESP32/wasserzaehler.html

-

This is the main purpose of this device. It returns the converted image as a number with different option. The output can be modified either by the configuration parameters or by HTML parameters.

-

Details can be found here: tbd

-

Picture Server

-

http://IP-ESP32/capture

-

http://IP-ESP32/capture_with_flashlight

-

This is a implementation of the camera interface of https://github.com/jomjol/water-meter-picture-provider

-

It is fully compatible including the parameters (quality=..., size=... ) . This allows to use this ESP32 system in parallel to the corresponding docker system: https://github.com/jomjol/water-meter-system-complete, from which this project is basically the successor.

-

File server

-

Access: http://IP-ESP32/fileserver/

-

Simple file server, that allows viewing, upload, download and deleting of single files of the SD-card content.

-

The usage is self explaining. The file path or file can directly be accessed by the URL after file server.

-

Example for config.ini : http://IP-ESP/fileserver/config/config.ini

-

OTA-Update

-

http://IP-ESP32/ota?file=firmware.bin

-

Here an over the air update can be triggered. The firmware file is expected to be located in the sub directory /firmware/ and can be uploaded with the file server. By the parameter file the name of the firmware file needs to be given.

-

Reboot

-

http://IP-ESP32/reboot

-

A reboot with a delay of 5 seconds is initiated, e.g. after firmware update.

-

ATTENTION: currently this is not working properly - hardware power off is needed instead. Work in progress!

-

Simple Web Server

-

If none of the above URLs are fitting, a very simple web server checks, if there is a fitting file from the sub directory /html -This can be used for a very simple web server for information or simple web pages.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Integration-Home-Assistant/index.html b/Integration-Home-Assistant/index.html deleted file mode 100644 index 7f2e703..0000000 --- a/Integration-Home-Assistant/index.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - - - - Integration into Home Assistant - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Integration into Home Assistant
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Integration into Home Assistant

-

There are 3 ways to get the data into your Home Assistant: -1. Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery) -1. Using MQTT (Manually Setup Entities) -2. Using REST calls

-

The first one is the easier way if you already have MQTT in use.

-

Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery)

-

:bangbang: This feature will be available with the next release!

-

Starting with Version >12.0.1, AI-on-the-edge-devices support Homeassistant Discovery. - 1. Check here to learn more about it and how to enable it in Homeassistant. - 1. You also have to enable it in the MQTT settings of your device:

-
![grafik](https://user-images.githubusercontent.com/1783586/199350781-e2a59eeb-b5bb-407b-9c0d-2aafab50daab.png)
-
-Make sure to select the right Meter Type to get the right units!
-
-

On the next start of the device, it will send discovery topics and Homeassistant should pick them up and show them under Settings > Integrations > MQTT:

-

grafik -grafik -grafik

-

Using MQTT (Manually Setup Entities)

-

First make sure with an MQTT client (for example MQTT Explorer) that MQTT works as expected and to get a list of the available topics!

-

Then add a sensor for each property:

-
mqtt:
-  sensor:
-    - state_topic: "wasserzaehler/main/value"
-      name: "Watermeter Value"
-      unique_id: watermeter_value
-      unit_of_measurement: 'm³'
-      state_class: total_increasing
-      device_class: water # Needs Homeassistant 2022.11!
-      icon: 'mdi:water-pump'
-      availability_topic: wasserzaehler/connection
-      payload_available: connected
-      payload_not_available: connection lost
-
-    - state_topic: "wasserzaehler/main/rate"
-      name: "Watermeter Rate"
-      unique_id: watermeter_rate
-      unit_of_measurement: 'm³/min'
-      state_class: measurement
-      device_class: water # Needs Homeassistant 2022.11!
-      icon: 'mdi:water-pump'
-      availability_topic: wasserzaehler/connection
-      payload_available: connected
-      payload_not_available: connection lost
-
-    - state_topic: "wasserzaehler/main/error"
-      name: "Watermeter Error"
-      unique_id: watermeter_error
-      icon: "mdi:water-alert"
-      availability_topic: wasserzaehler/connection
-      payload_available: connected
-      payload_not_available: connection lost    
-
-    - state_topic: "wasserzaehler/uptime"
-      name: "Watermeter Uptime"
-      unique_id: watermeter_uptime
-      unit_of_measurement: 's'
-      state_class: measurement
-      device_class: duration
-      entity_category: diagnostic
-      icon: "mdi:timer-outline"
-      availability_topic: wasserzaehler/connection
-      payload_available: connected
-      payload_not_available: connection lost
-
-

If you run the discovery once, you can also extract the information from there (MQTT Info, untested):

-
mqtt: # Extracted form the Discovery but untested!
-  sensor:
-      - name: Value
-        unique_id: wasserzaehler-main_value
-        icon: mdi:gauge
-        state_topic: wasserzaehler/main/value
-        unit_of_measurement: m³
-        device_class: water
-        state_class: total_increasing
-        availability_topic: wasserzaehler/connection
-        payload_available: connected
-        payload_not_available: connection lost
-
-

If you want to convert the to l, use a template sensor:

-
template:
-  - sensor:
-    - name: "Watermeter in l"
-      unique_id: watermeter_in_l
-      icon: "mdi:gauge"
-      state: "{{ states('sensor.watermeter_value')|float(default=0) * 1000 }}" # Convert 1 m3 => 1000 l
-      unit_of_measurement: l
-      availability: "{{ states('sensor.watermeter_value') not in ['unknown', 'unavailable', 'none'] }}"
-
-

If you you want to have the consumption per day, you can use an Utility Meter. -it is a helper and can be used to reset the total increasing values once a day

-
utility_meter:
-  utility_meter_gas_per_day:
-    source: sensor.gasmeter_value
-    cycle: daily
-
-  utility_meter_water_per_day:
-    source: sensor.watermeter_value
-    cycle: daily
-
-

Note that you also can add it using the UI.

-

Examples

-

grafik

-

grafik

-

Statistics Graph

-

Creating Statistics Graphs (eg. usage per day) is easy using the Energy Dashboard: -grafik

-

Note that there seems to be a bug in the graph, see https://github.com/home-assistant/frontend/issues/13995!

-

InfluxDb Graphs

-

If you have setup InfluxDB already, it is also possible to fetch statistics from there, eg. daily usage:

-
from(bucket: "HomeAssistant")
-|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
-  |> filter(fn: (r) => r["entity_id"] == "wasserverbrauch_tag")
-  |> filter(fn: (r) => r["_field"] == "value")
-  |> timeShift(duration: -1d)
-  |> aggregateWindow(every: 1d, fn: max, createEmpty: false)
-  |> yield(name: "mean")
-
-

grafik

-

Using REST

-

When using REST, Home Assistant has to periodically call an URL on the ESP32 which in return provides the requested data.

-

See REST API for a list of available URLs.

-

The most practical one is the json entrypoint which provides the most relevant data JSON formated: -http://<IP>/json -This would return:

-
{
-"main":
-  {
-    "value": "512.3020",
-    "raw": "0512.3020",
-    "error": "no error",
-    "rate": 0.000000,
-    "timestamp": "2022-10-02T20:32:06"
-   [..]
-  }
-}
-
-

To do such a REST call, you need to create a REST sensor:

-
sensor:
-- platform: rest
-  name: "Gasmeter JSON" 
-  resource: http://<IP>/json
-  json_attributes:
-    - main
-  value_template: '{{ value_json.value }}'
-  headers:
-    Content-Type: application/json
-  scan_interval: 60
-
-template:
-  sensor:
-  - name: "Gasmeter Value from JSON"
-    unique_id: gas_meter_value_from_json
-    state: "{{ state_attr('sensor.gasmeter_json','main')['value'] }}"
-    unit_of_measurement: 'm³'
-
-  - name: "Watermeter Value from JSON"
-    unique_id: water_meter_value_from_json
-     state: >-
-            {{ state_attr('sensor.watermeter_json','main')['value'] | float }}
-     unit_of_measurement: 'm³'
-     device_class: water
-     state_class: total_increasing
-     icon: mdi:gauge
-
-
-

See also https://community.home-assistant.io/t/rest-sensor-nested-json/243420/9

-

Photo

-

REST can also be used to show the photo of the last round:

-

grafik

-

To access it, use http://<IP>/img_tmp/alg_roi.jpg resp http://<IP>/img_tmp/raw.jpg.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Learn-models-with-your-own-images/index.html b/Learn-models-with-your-own-images/index.html deleted file mode 100644 index 598df93..0000000 --- a/Learn-models-with-your-own-images/index.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - Learn models with your own images - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Learn models with your own images
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

If your device has new, different digits and the existing models don't recognize them well, you can collect your own images and train the model.

-

But before you do this, please check if your type really is not contained yet in the training data, see digits resp. pointers for an overview of images used for the training

-

The neural network is trained on base of a set of images, that have been collected over time. If your digits are included or at least very similar to included images, the chance is very high that the neural network is working fine for you as well.

-

The neural network configuration is stored in the TensorFlow Lite format as filename.tfl or filename.tflite in the /config directory. It can be updated by uploading the new file and activating it on the configuration page or in the config file /config/config.ini.

-

In order to incorporate new digits a training set of images is required. The training images needs to be collected in the final setup with the help of the Digits or Analog log settings (not to be confused with the Data or Debug log). Enable the logging of the images on the configuration page or in the config file /config/config.ini:

-

-

Now wait, until you have an image of each digit of every type on the SD card. Ideally remove the SD card from the camera and search for two to three images of each digit (not more! :-)). The format can be jpg.

-

Collecting images for dig-class100/dig-cont/ana-class100

-

Collectmeterdigits and collectmeteranalog helps you to collect the images easily. Read the project readme for detailed instructions.

-

Train the model

-

For training the model you will need a python and Jupyter installation.

-

All current labeled images you can find under ziffer_sortiert_raw

-

dig-class11 models (digits)

-

Fork and checkout neural-network-digital-counter-readout.

-

Install all requirements for running the notebooks.

-
pip install -r requirements.txt
-
-

Put your labeled images into /ziffer_sortiert_raw folder and run

-
    -
  1. Image_Preparation.ipynb
  2. -
  3. Train_CNN_Digital-Readout-Small-v2.ipynb
  4. -
-

It creates a dig-class11_xxxx_s2.tflite model, you can upload to the config folder on your device and test it.

-

dig-class100 / dig-cont models (digits)

-

Fork and checkout neural-network-analog-needle-readout.

-

All labeled images you can find under Images

-

Install all requirements for running the notebooks.

-
pip install -r requirements.txt
-
-

Put your labeled images into images/collected/<typeofdevice>/<your_short>/

-

Run dig-class100-s2.ipynb. The model to upload to your device you can find under '/output'.

-

ana-class100/ana-cont models (analog pointers)

-

Fork and checkout neural-network-analog-needle-readout.

-

All labeled images you can find under data_raw_all

-

Install all requirements for running the notebooks.

-
pip install -r requirements.txt
-
-

Put your labeled images into images/collected/<typeofdevice>/<your_short>/

-

After every adding of images you need to run Image_Preparation.ipynb before you train the models.

-

Run Train_CNN_Analog-Readout_100-Small1_Dropout.ipynb and/or Train_CNN_Analog-Readout_Version-Small2.ipynb. The model to upload to your device you can find in the project folder.

-

Share your images

-

If the results are good you can share the images as pull-request. Please images only!

-

If you not able to create a pull request or don't know what it is, open an issue and put the zipped images in it.

-

Images can be rejected if

-
    -
  • As same as dig-class11 collected, more than 1000 images of your device are really to much.
  • -
  • images are not good configured (ROIs) will be rejected. It reduces the accuracy of the networks.
  • -
  • Images with too little focus will be rejected.
  • -
  • Images with too much blur are rejected.
  • -
-

Our models are to small to recognize everything in any quality. So we use only images of medium or good quality.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/MQTT-API/index.html b/MQTT-API/index.html deleted file mode 100644 index 5521308..0000000 --- a/MQTT-API/index.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - General Information - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

General Information

-

The device is capable to register to a MQTT broker to publish data and subscribe to specific topics.

-

The MQTT service has to be enabled and configured properly in the device configuration via web interface (Settings -> Configuration -> section MQTT)

-

The following parameters have to be defined: -* URI -* MainTopic (optional, if not set, the hostname is used) -* ClientID (optional, if not set, AIOTED- + the MAC address gets used to make sure the ID is unique) -* User (optional) -* Password (optional) -* RetainFlag (optional)

-

Published topics

-

Status

-

MainTopic/{status topic}, e.g. watermeter/status -* ### Connection

-
    -
  • -

    Interval

    -
  • -
  • -

    MAC

    -
  • -
  • -

    IP

    -
  • -
  • -

    Hostname

    -
  • -
  • -

    Uptime

    -
  • -
  • -

    FreeMem

    -
  • -
  • -

    WifiRSSI

    -
  • -
  • -

    CPUTemp

    -
  • -
  • -

    Status

    -
  • -
-

Result

-

MainTopic/{NumberName}/{result topic}, e.g. watermeter/main/value

-
    -
  • -

    Value

    -
  • -
  • -

    Raw

    -
  • -
  • -

    Error

    -
  • -
  • -

    JSON

    -
  • -
  • -

    Rate

    -
  • -
  • -

    Rate_per_time_unit

    -

    The time Unit gets set with the Homeassistant Discovery, eg. h or m (minutes)

    -
  • -
  • -

    Rate_per_digitalization_round

    -

    The interval defines when the next round gets triggered

    -
  • -
  • -

    Changeabsolut

    -
  • -
  • -

    Timestamp

    -
  • -
  • -

    JSON

    -

    All relevant results in JSON syntax

    -
  • -
-

GPIO

-

MainTopic/{GPIO topic}, e.g. watermeter/GPIO/GPIO12

-
    -
  • -

    GPIO/GPIO{PinNumber}

    - Depending on device configuration (Settings --> Configuration --> Chapter GPIO)
  • -
-

Subscibed topics

-

MainTopic/{subscribed topic}, e.g. watermeter/ctrl/flow_start

-

Control

-
    -
  • -

    Ctrl/flow_start

    -

    Trigger a flow start by publishing to this topic (any character, length > 0)

    -
  • -
  • -

    GPIO/GPIO{PinNumber}

    -

    Depending on device configuration (Settings --> Configuration --> Chapter GPIO)

    -
  • -
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Migrate-Old-Config-To-New-Config/index.html b/Migrate-Old-Config-To-New-Config/index.html deleted file mode 100644 index f5a7867..0000000 --- a/Migrate-Old-Config-To-New-Config/index.html +++ /dev/null @@ -1,334 +0,0 @@ - - - - - - - - Migration from water-meter „old“ to water-meter “AI-on-the-edge-device” - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Migration from water-meter „old“ to water-meter “AI-on-the-edge-device”
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Migration from water-meter „old“ to water-meter “AI-on-the-edge-device”

-

There are only some few steps necessary to migrate your old system to the new one.

-

Please follow the following steps:

-

1. Follow the installation guide to flash the ESP32CAM and prepare a SD-Card with the content of the master

-

2. Save the following files from the old Docker system on your PC:

-
    -
  • Reference Points 1-3 (only 2 needed)
  • -
  • Config.ini
  • -
-

3. Copy Reference Points 1-3 onto the new water-meter system (Directory /config)

-

Please note only two Reference Points are supported in the new system.

-

4. Open new config.ini File:

-

Insert from the old Config.ini file [alignment] and [alignment.ref0] and [alignment.ref1] section the two Ref x and y position and the initial_rotation_angle= 123into the new Config.ini File, e.g.:

-
Old:
-
[alignment.ref0]
-image=./config/RB01_65x65.jpg
-pos_x=28
-pos_y=63
-
-[alignment.ref1]
-image=./config/RB02_50x35.jpg
-pos_x=497
-pos_y=127
-
-[alignment]
-initial_rotation_angle=180
-
-
New:
-
[Alignment]
-InitalRotate=180
-/config/RB01_65x65.jpg 28, 63
-/config/RB02_50x35.jpg 497, 127
-SearchFieldX = 20
-SearchFieldY = 20
-
-

5. Insert the old Digit Values into the new Config.ini File, e.g.:

-
Old:
-
[Digital_Digit.ziffer1]
-pos_x=265
-pos_y=117
-dx=28
-dy=51
-
-[Digital_Digit.ziffer2]
-pos_x=310
-pos_y=117
-dx=28
-dy=51
-
-[Digital_Digit.ziffer3]
-pos_x=354
-pos_y=117
-dx=28
-dy=51
-
-[Digital_Digit.ziffer4]
-pos_x=399
-pos_y=117
-dx=28
-dy=51
-
-[Digital_Digit.ziffer5]
-pos_x=445
-pos_y=115
-dx=28
-dy=51
-
-
New:
-
[Digits]
-Model=/config/dig0630s3.tflite
-;LogImageLocation = /log/digit
-ModelInputSize 20, 32
-digit1, 265, 117, 28, 51
-digit2, 310, 117, 28, 51
-digit3, 354, 117, 28, 51
-digit4, 399, 117, 28, 51
-digit5, 445, 115, 28, 51
-
-

6. Make sure that you have the same quality and size settings as in your old Config.ini

-

In the old configuration this was coded in the html-string for the image source:

-
Old:
-
URLImageSource=http://IP-ADRESS/capture_with_flashlight?quality=5&size=VGA
-
-

Default was Quality=5 and VGA.

-
New:
-
ImageQuality = 5
-ImageSize = VGA
-
-

7. Repeat the same for the analog section

-

8. Insert your SSID and Password into the new wlan.ini File

-

9. Compare and edit [ConsistencyCheck] Section with new [PostProcessing] Section

-

10. Save new config.ini File in the new System.

-

11. Restart the system.

-

12. After the first start set manually the PreValue in the new system

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Neural-Network-Types/index.html b/Neural-Network-Types/index.html deleted file mode 100644 index 6b74089..0000000 --- a/Neural-Network-Types/index.html +++ /dev/null @@ -1,448 +0,0 @@ - - - - - - - - Neural Network Types - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

This section is describing the different types of neural networks, that are used with the AI-on-the-edge approach and gives an introduction on how and where to use them.

-

Content

-

1) Overview neural network type -2) Naming convention -3) Overview of trained types and details

-
-

1. Overview neural network type

-

There are two types of input:

-
    -
  • -

    digits with rolling number (top town)

    -
  • -
  • -

    analog pointers (clockwise rotating pointer)

    -
  • -
-

There are two types of neural networks:

-
    -
  • classification networks with discrete output neurons for each result class:
  • -
  • 11 classes for digits (0, 1, ... 8, 9 + "Not-A-Number")
  • -
  • 100 classes for digits or analog pointers (0.1, 0.2, 0.3, ... , 9.7, 9.8, 9.9)
  • -
  • continuous output networks with a continuous output in the interval [0, 10[
  • -
-

No setting of the type in the firmware is necessary. The type can detect by the output structure automatically.

-

Attention:

-
    -
  • It is very important to choose the right network type (digits or analog pointers). - Technically a wrong network will work and create output, but that would be totally arbitrary
  • -
  • Not all type of pointers are trained in all networks.
  • -
  • For the 11 classes digits network there many different types of digits trained. The reason is, that you 1) only need 20-30 training images and 2) the data collection is ongoing much longer
  • -
  • For the continious and 100 classes network especially for the digits, there are only a view types of digits trained up to now
  • -
  • Therefore sometimes for the digits it is more effective to choose the simpler 11 classes network type (= default).
  • -
-
-

2. Naming convention

- - - - - - - - - - - - - - - - - - - - - - - -
Classification
11 classes
0, 1, ... 9 + "N"
Classification
100 classes
0.0, 0.1, ... 9.9
Continuous
Interval
[0, 10[
Digits
dig-class11_XXX.tflitedig-class100_XXX.tflitedig-cont_XXX.tflite
Analog Pointers
ana-class100_XXX.tfliteana-cont_XXX.tflite
-

XXX contains the versioning and a parameter for different sizes with the following naming:

-

XXX = versioning_sY

-
    -
  • -

    versioning = version or in newer networks the training data

    -
  • -
  • -

    Y = Neural network size (typically s1, s2, ..., s4). Whereas s1 is the maximum sized neural network and s4 is the smallest.

    -
  • -
-

Optional the naming ends with an "_q" to signal, that the tflite file has been quantized (size reduction with minimum accuracy loss).

-

Example: dig-class11_1410_s2_q.tflite

-
    -
  • Classification network for digits with 11 classes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, N)
  • -
  • Version 1410 = 14.1.0
  • -
  • s2 = Size 2 (Medium)
  • -
  • q = Quantized Version
  • -
-
-

3. Overview of trained types and details

-

3a. Analog Pointer ("ana-cont_XXX.tflite" & "ana-class100_XXX.tflite")

-

This is to transfer the direction of a pointer into a continuous number between 0 and 1, whereas 0 (=1) is the upwards position (12 o'clock), 0.25 corresponds to the 3 o'clock positions and so on. This network is a envolop for all different types of pointers. Currently there are no dedicated network trainings for specific types of pointers.

-

There are two types of network structure, currently both are supported. The "class100" is a pure classification network, that might need a bit more accuracy in the labeling. "cont" is a no classic approach with a continuous output off only 2 neurons (details see below).

-
Types of counters trained:
- - - - - - - - - - - - - - - - - - - - - - - -
-
Training data needs
-
    -
  • Quadratic images, minimum size: 32x32 pixel
  • -
  • Typically 100 - 200 images with a resultion of 1/100 of the full rotation (every 0.1 value or 3.6°)
  • -
  • Naming: x.y_ARBITRARY.jpg, where x.y = value 0.0 ... 9.9
  • -
-
CNN Technical details:
-
Input
-
    -
  • 32 x 32 RGB images
  • -
-
Output
-
    -
  • ana-cont_XXX.tflite:
  • -
  • 2 neurons with output in range [-1, 1] - representing a sinus / cosinus encoding of the angle
  • -
  • -

    needs to be converted to angle with arctan-hyperbolicus function

    -
  • -
  • -

    ana-class100_XXX.tflite

    -
  • -
  • 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9
  • -
-

3b. Digits with 11 classes ("dig-class11_XXX.tflite")

-

The digit type is a classical classification network, with 11 classes representing the numbers 0, 1, ... 9 and the special class "N". It is trained for the rolling ring of gas and electric meters. As there is sometime a status between two images, the special class "N" is representing Not-A-Number for the case, that the image cannot be unique classified to one number e.g. because it is between two digits. For this type the lowest amount of training data per type is needed, resulting in a large variety of type being already part of the training set.

-
Types of counters trained:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
Training data needs
-
    -
  • RGB images, with minimum size: 20x32 pixel
  • -
  • -

    Typically 10 - 20 images (1-2 for each digit and an arbitrary number for the "N" class

    -
  • -
  • -

    Naming: x_ARBITRARY.jpg, where x = value 0 ... 9 + N

    -
  • -
-
CNN Technical details:
-
Input
-
    -
  • 20 x 32 RGB images
  • -
-
Output
-
    -
  • 11 neurons for image classification (last layer normalized to 1)
  • -
  • Neuron 0 to 9 represent the corresponding numbers "0" to "9"
  • -
  • Neron 10 represent the "Not-A-Number" class, telling, that the image is not uniquely classified
  • -
-

3c. Digits with rolling results ("dig-class100_XXX.tflite" & "dig-cont_XXX.tflite")

-

This type of network tries to overcome the problem, that there are intermediate values, when a rolling digit is between two numbers. Previous this was the "N" class. In this network type, there are also subdigit values trained, so that the intermediate state can be used as additional information for the algorithms.

-
Types of counters trained:
- - - - - - - - - - - - - - - - - - - - - - - -
[[images/dig-cont/dig-cont_1.jpg)[[images/dig-cont/dig-cont_2a.jpg) [[images/dig-cont/dig-cont_2b.jpg)[[images/dig-cont/dig-cont_3a.jpg) [[images/dig-cont/dig-cont_3b.jpg) [[images/dig-cont/dig-cont_3c.jpg)
-
Training data needs
-
    -
  • RGB images, with minimum size: 20x32 pixel
  • -
  • -

    Typically 100 - 200 images (1-2 for each possible position)

    -
  • -
  • -

    Naming: x.y_ARBITRARY.jpg, where x.y = 0.0, 0.1, ... 9.9 representing the intermediate state

    -
  • -
-
CNN Technical details:
-
Input
-
    -
  • 20 x 32 RGB images
  • -
-
Output
-
    -
  • dig-cont_XXX.tflite:
  • -
  • 10 neurons representing the digits 0, 1, ... 9. The intermediate values are represented by weighted normalized values of two neighboring output neurons
  • -
  • -

    needs to be converted to angle with arctan-hyperbolicus function

    -
  • -
  • -

    dig-class100_XXX.tflite

    -
  • -
  • 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9
  • -
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/OTA---Update-Firmware-and-Web-Interface/index.html b/OTA---Update-Firmware-and-Web-Interface/index.html deleted file mode 100644 index d2b8c14..0000000 --- a/OTA---Update-Firmware-and-Web-Interface/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - Over-The-Air (OTA) Update - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Over-The-Air (OTA) Update
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Over-The-Air (OTA) Update

-

You can do an OTA (over-the-air) update via the graphical user interface. -Grab the firmware from the

- -

You need: -* firmware.bin -* html.zip

-

General remark:

-
    -
  • It is always recommended to upload both files, as they are coupled to each other
  • -
  • If you make a major update, it might be needed to modify the config.ini as it's syntax or context has changed
  • -
  • It is recommended to make a backup of the /config directory, minimum of the config.ini.
  • -
-

Access to the update page:

-

The graphical OTA update can be accessed in the menue "System":

-
    -
  • -
-

Update

-
    -
  • -
-

Just follow the steps 1 to 5 to perform the update:

-
    -
  1. Select (a) and upload (b) the file firmware.bin
  2. -
  3. Flash the firmware
  4. -
  5. Select (a) and upload (b) the file html.zip
  6. -
  7. Update the html-files
  8. -
  9. Reboot
  10. -
-

After the reboot with a major change it is recommended to check the configuration settings and save them again

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/REST-API/index.html b/REST-API/index.html deleted file mode 100644 index 3f3839a..0000000 --- a/REST-API/index.html +++ /dev/null @@ -1,363 +0,0 @@ - - - - - - - - REST API - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Various information is directly accessible over specific REST calls.

-

For an up-to-date list search the Github repository for registered handlers

-

Often used APIs

-

Just append them to the IP, separated with a /, eg. http://192.168.1.1/json

-

Control

-
    -
  • -

    flow_start

    -
  • -
  • -

    gpio

    -

    The gpio entrypoint also support parameters:

    -
  • -
  • -

    /GPIO?GPIO=12&Status=high

    -
  • -
  • -

    ota

    -
  • -
  • -

    ota_page.html

    -
  • -
  • -

    reboot

    -
  • -
-

Results

-
    -
  • -

    json

    -
  • -
  • -

    value

    -

    The value entrypoint also support parameters:

    -
  • -
  • http://<IP>/value?all=true&type=value
  • -
  • http://<IP>/value?all=true&type=raw
  • -
  • http://<IP>/value?all=true&type=error
  • -
  • -

    http://<IP>/value?all=true&type=prevalue

    -
  • -
  • -

    img_tmp/alg_roi.jpg

    -

    Last captured picture

    -
  • -
-

Status

-
    -
  • -

    statusflow

    -
  • -
  • -

    rssi

    -
  • -
  • -

    cpu_temperature

    -
  • -
  • -

    sysinfo

    -
  • -
  • -

    starttime

    -
  • -
  • -

    uptime

    -
  • -
-

Camera

-
    -
  • -

    lighton

    -
  • -
  • -

    lightoff

    -
  • -
  • -

    capture

    -
  • -
  • -

    capture_with_flashlight

    -
  • -
  • -

    save

    -

    The save entrypoint also support parameters:

    -
  • -
  • http://<IP>/save?filename=test.jpg&delay=3
  • -
-

Logs

-
    -
  • -

    log

    -

    Last part of todays log

    -
  • -
  • -

    logfileact

    -

    Full log of today

    -
  • -
  • -

    log.html

    -
  • -
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/ROI-Configuration/index.html b/ROI-Configuration/index.html deleted file mode 100644 index 02d7008..0000000 --- a/ROI-Configuration/index.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - - ROI (Region of Interest) Configuration - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • ROI (Region of Interest) Configuration
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

ROI (Region of Interest) Configuration

-

General remark:

-
-

You are using a neural network approach which is trained to fit as many different type of meters as possible. The accuracy will never be 100%. It is normal to see a missing reading once in a while. There there are several precautions to detect this. For details see the section PostProcessing on the configuration page.

-
-

The most critical settings for accurate detection are:

-
    -
  1. Correct setting of the Regions Of Interest (ROIs) for detection of the image.
    -

    This must be done manually for each meter!

    -
    -
  2. -
  3. Number type is part of the training set.
    -

    Have a look on the Digital Counters resp. Analog Needles to check if your types are contained. If your number types are not contained, you should take the effort to record them so we can add them to the training data. See: Learn models with your own images on how to create new input.

    -
    -
  4. -
-
-

1. Correct Setup of ROI

-

Please proceed in the following order!

-

Don't forget to save after each step!

-

1. Image Sharpness

-

Ensure a sharp image of the camera by adjusting the focal length of the ESP OV2640 camera. -Adjust the focus for the clearest possible image See these instructions for help.

-

2. Horizontal Alignment

-

Ensure an exact horizontal alignment of the number via the alignment / reference setup:

- - - - - - - - - - - - - -
:heavy_check_mark: Okay:x: Not Okay
-

3. Correct Size for ROI

-

Choose the right size of the ROI:

-
-

The configuration of ROIs differs a bit on the model you choose. Below you find the differences between the different AI models. Pick the one you think fits best your purpose. If you don't get to good result, try another model.

-
-

4. Model Selection

-

dig-class11 Configuration

-

dig-class11 - Models recognize the complete digit only. Here it is not relevant if the ROI fits the Border of the digit window.

-

For this model, there should be a border of 20% of the image size around the number itself. This border is shown in the ROI setup image by the inner thinner rectangle. This rectangle should fit perfectly around the number when the number has not started to rotate to the next position:

-

- - - - - - - - - - - - - - - - - - - - - - - - - -
Example 1Example 2
:heavy_check_mark: Okay
:x: Not Okay
:x: Not Okay
-

If you have perfect alignment you and are not getting satisfying results, most probably your numbers are not part of the training data yet. Read on Learn models with your own images how to add your meter's type of numbers to the training set.

-

dig-class100 / dig-cont Configuration

-

These models recognize the tenths (fractions) between the numbers. This model requires a different ROI setup; the height must be set differently and more accurately.

-

First, the width can be set as for dig-class11, i.e. 20% margin left and right.

-

ROI-setup

-

The height of the outer rectangle should be set to the upper and lower edge of the number window. To achieve this setting, you need to unlock the aspect ratio:

-

unlockAspectRatio

-

Here an example:

- - - - - - - - - - - - - - - - - -
Example 1
:heavy_check_mark: Okaydig-class100_OK
:x: Not Okaydig-class100_NOK
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Release-creation/index.html b/Release-creation/index.html deleted file mode 100644 index 5afd442..0000000 --- a/Release-creation/index.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - Release creation - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Preparing for release

-
    -
  1. Changelog is merged back from master branch to rolling branch (should be the last step of the previous release creation)
  2. -
  3. All changes are documented in the Changelog in rolling branch
  4. -
-

Release creation steps

-
    -
  1. Mergerolling into master branch
  2. -
  3. Best to wait for the GitHub action to run successfully
  4. -
  5. On master branch tag the version like v11.3.1 and don't forget to push it.
  6. -
  7. Wait for the GitHub-Action of release creation. After all is done:
      -
    • the release should be created
    • -
    • the artifacts are downloadable from release
    • -
    • The documented changes were applied to the release
    • -
    -
  8. -
  9. Merge master back in rolling
  10. -
  11. In rolling create a folder rolling/docs/releases/download/<VERSION> and add the firmware.bin from one of the release artifacts.
  12. -
  13. Update rolling/docs/manifest.json with the new version (update the version and the last path fields)
  14. -
- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Testing/index.html b/Testing/index.html deleted file mode 100644 index b32343c..0000000 --- a/Testing/index.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - Testing - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
-
-
- -

Testing Option for VSCode

-

You can test your functions directly on the device.

-

Structure

-

All tests are under directory "test" in the project and not compiled with default build option of platformio. The main function is in file test_suite_controlflow.cpp. In method app_main() you can add your own tests.

-

image

-

Include my my own test

-

In method app_main() of test_suite_controlflow.cpp you can add your own tests. Include your test-file in the top like

-

#include "components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp"

-

components is a subfolder of tests here. Not the components directory of root source.

-

In the bottom add your test function.

-

RUN_TEST(testNegative);

-

Your test function should have a TEST_ASSERT_EQUAL_*. For more information look at unity-testing.

-

Run tests

-

You will need a testing device. best with usb adapter. Before you upload your tests you will need to setup the device with initial setup procedure described in [[Installation]]

-

image

-

Now you can use Visual Studio Code or a standard console to upload the test code. In VS Code (tab platformio) open Advanced and select Test.

-

image

-

Alternativ you can run it in console/terminal with platformio test --environment esp32cam.

-

In my environment the serial terminal not opens. I have to do it for myself. You will see much logging. If any test fails it logs it out. Else it logs all test passed in the end.

-

Troubleshooting

-

If you test very much cases in one function, the device runs in stackoverflow and an endless boot. Reduce the count of test cases or split the test function in multiple functions.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - Next » - - -
- - - - - - - - diff --git a/Watermeter-specific-analog---digital-transition/index.html b/Watermeter-specific-analog---digital-transition/index.html deleted file mode 100644 index f1c5b3a..0000000 --- a/Watermeter-specific-analog---digital-transition/index.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - Understanding the problem - AI on the Edge Device - - - - - - - - - - - - - - -
- - -
- -
-
-
    -
  • »
  • -
  • Asorted Pages »
  • -
  • Understanding the problem
  • -
  • - Edit on GitHub -
  • -
-
-
-
-
- -

Understanding the problem

-

At first, for the most watermeters the default configuration should be work. But the digit, especially the last digit differs in some devices.

-

"Normal" transition

-

In most cases, the transition of the last digit starts when the analogue pointer is > 9.

-

Often the last digit "hangs" a bit on this devices and comes not over zero. So it is not easy to see which digit is correct. In the first example 4 or still 3? (3 is correct).

-

image -image

-

Early transition

-

Some units start the transition very early or run with the analogue pointer. In the third example, is it a 3 or a 2?

-

image -image -image

-

Inaccuracies in image recognition

-

The models for image recognition are good, but have inaccuracies in the range +/- 0.2. In order to obtain as many correct results as possible, a treatment is carried out in the post process in the range of 9.8-0.2 for the analogue pointer, which must start differently depending on the type of counter.

-

How to configure for my meter type

-

If you have a devices with "normal" transition you should not have any issues. On devices with "early" transition, you can set the option AnalogDigitalTransitionStart to a value between 6 and 8.

- -
-
- -
-
- -
- -
- -
- - - - GitHub - - - - « Previous - - - -
- - - - - - - - diff --git a/img/0_arbitrary.jpg b/img/0_arbitrary.jpg deleted file mode 100644 index 1d778513d04e78dd6bcf7538283710da4354e046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1563 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 F>R)TF9XtR4 diff --git a/img/ROI_drawing.jpg b/img/ROI_drawing.jpg deleted file mode 100644 index ea224759a5f0d51be5da4fb2a3b4670bf9e34973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42837 zcmb@tcU+Utw=Nn)Km|mUj(`e+bdg@8C|yA59T5Q`2Be3UCPfGVf&8%$l{H^{n-tPo6ITuIXy(XacCH zr~nYk3vfOIcnqMvaN(af<+@0D(_EsVxp0Es0|2OKD6{=%!vB6zU7*a7mhRH!EA*5OsB3@=RMgZLE>iz9YfA4B z%I|=S%rw_;OFg2!@!Wy#jwj25_wm`6_|+>~S&e=Z1f*YjgTk?(~QZ zgop2=**2h;QqOWMePg*VY~8*tsv9o_7 zoIYMOyy-gKT+QSwQFga=^t38XRD#g^Xo33RYSaB54PC|5s&9y`Z4GMn zXtTc-Ecjy7c??)1A*58Qu3?$9{K_jf(bjwzvwy%OS1nw+!KbQV&z1q z)m%35g5gC-mpuc?%6jVQaa@JW$B4PkbcuCm^Ou}IthwQYVY;a#vc&L?icY{HKE%Z^ ztAp)r{=i@&&nVdUqQToQDi60!-TO5egY_5SM>@{vbASim@e|YzU!~#CS;Iy9557QV z(%`F6s4!_{3B)Tjs1XRP%$j z;Dr8HkuNU+11G-)_rA96wu~*|*1PhG=5(xF@e@4(S>Fkn56Z8{IT!yR4GL_>Azk&7S@o-~@YbCr5N?*ReWjO{!s6TB{AS zOn8p!Y`WU{B0hs~>FEopm6njR^mBk?7Cm_!NVmTe4dX7Cg|U(LIt#$MbK9y`*f~|+ z8~m3XtK;M^y%RwITHgtAVBY~Bt|13t0P^p7<`!o1ulef8$ZcN)@)`-VC{cMVm{M*B zC3}O!+gce0Z8Ey<-~H@9$a3%2R_p$j5cxXaJ7Bf^Pw@xsSo5eRP;T&J%)#A>(%|O^ zx$kLZTWpIS;J*wH<)!{y`!EflF8iZ)S&zW*BYbB7^EmPtkXeoM z6gYCKb`H4SBrF*PE-y%YGa{*z9MW`_ocJU2|X$7;WD!0Ez zm6yIJ4oB>^J&k?8b{c8|w>Tx81V){bh>`8Kz{AUDh0rTDr_yz!KJZ9h)iJ{e6p~)Q zNZp3tY^bga%Vbmb;!wD;|z<&Vi)zmv8J%owqY9QyNPRQb!i{ZqZ+?1`%RsDuItZd>{ z-Uq+5845$2AK~pe@aSrfSh6^I2z^O~YBAsx8Dq~PqacVLy=|1Mg^8kR9Q`99=gzs? z&FOL!@Qi7E{xXzpjgJO;b4~3EVE{QL1LmCqFB-@0@*?>&w>K@n{S|vnUH*UWkN&4V zj9R`UQ(&Zt@4Fk>6KBgXK zdFBOQAcQQ|6S@*YICX;c0t+u3o2cG0QZse`&U|Wg<=FA?BZ>Mu6vM|Lsd5<$Ix{!; zy}cTN)u|51jq-Z=c0>A(67JS3R#j#5u&HxEtMsXIp=GP9D-n%zDl26!eg23kn*T{G zi-W0&^$QACy87)q10U(0TkGO{9A70o)|Zp9B{mN-P+DHjO?Btw@yvs&8^cuYODDAZ z$mi#P&}c}qAz^6Kktk=Y?s=){hxH|PQeLX%bLNLTJw5w?%&|2)fwPR@+c;#XTo!$> zT{8JT;h;H>tpIP)=qj22`rT#a!A8Th_%H38JshofnrhpC1VdotG1JF=TVp$-Azbaw z^qRMLS3(X6V=sT~`yo0bLgB)_Bk!N!_V=9tHxk{UEx|qp=$!R|myZ;?xZE@vEVYQ| zNd~&54sNu;sRP7FAIsQc!k; zH*Hl(Oxa+C^mVIeuP(^MN6WE(W2IPYG(3y`z%XW>0VPSh-XfCKO4#WC?4}f+|06X( zEE-C_)Z@!s{psu8)vauJZ_t}_KwBB%2k9l0HdaWbfTYxj``H**WP$CUfD*i;$|TlkY8D1 zpb2Rw!A^!q!djo`z09{1&H+C)_EpI@>+8{A@yb;bnMpbi?c-;(Bw7!TVhU}x}dr>av z-x{oVzAPFjn4)1)Fz0hXI8=mWkCP#0y_b=^L7IO=RNam)8bDf#|B0&jAbe7Kj{vBW*4dNphNJdKIxtfO}gN<=J09UU5Eze?-M;r7G zNLAusX6NYhSNBUew;zDF0Kg0CA+!UKer^7S8b5TrU zE@SK2NLQNXSsCMkmO$gEmtYt-HNy>7Trb-OGgqo6vB-~q zr|r9}Vc~NU7%~@0a^YtPyB6V3pm;NOL);a#^2B_2E1m^U+T=>G15jwRLG`c?N$oN9#~j7WbdPJqLkOtBfxz#EYEwqX*A zSw$xg5@c!}B>qC=(m5bFmixh%EK!ar`3v6ZsfRm^B=4sLSY-78y+&oU!HCSv>&?y0 zMGkF;SoIvqAAl=>5sHbX#`2Mb@k}JG;0w(IV-#!Gedip&bxeC`z&U_!vq=y8 zX?Aj^9bCBX7Zx&?@AK?U=*5lxZUVKy!j<;367=h6L&}YYgw4Ou>ye#0C3-Rrf(_RK z)GQvyf6G#w-5RMvzc!qlXyZdUqZW2p@N@h`j|h}1?QC3zP=xO#aEzvUxxFO)=Y^8R zuSmoE00oG##q@3rQmD@tT#d1-1wI<6;AlvfP8>!&PWo!=Zn-Bk6d>W@3*t2|XxxtT zKC~dwW1ID`g0;kR0QU4UT?d@mIvOnb$hclbzTiOb1#GpLW6m=^X?t7r6DjZq1W3Mu zAsWyhG29?kwI=yDyiEY;FN>ENAU0sXmppQS`F><}ik%K#=Vc|z#g}OjkvO?*!L$HI z?6f_pOrSQsYq3o?hpL{N!y*2&;hkn7+|DLq0X{7P=Au9xrJ7i*K1;>Osm|ieO6BOA zTCXQwfJdC1M_(6KIeLaD&=VrLMM1($F=QoZpWS7YUz$Z7F~@DlgIz4iZ;M<1_5zN+ zE+&R2b`3Og4shcO%c82bW$&10SGxw6>RFQk<#!)gTFNoJ#uUsR`){ zC3w*#2%?anGNBK_!pd&0iyA0i+wDAs&=ptz-5;Tyj#Gc*^q6;t>3Rae$sJ5#$A)1| zkMChlWrjE;G}gq{C}$DE;OFg&b0e+88k~| zJE*0>t|AKDrd5Zgc6?5LRV@!Oe7kj@q5ZR#s*)M3b$$v@85aSGvtPUp|*j*#u zV@z|RzN(2y=%#I%LZ&wHoajN)I`~kT^@N6%b{&1%?xEfCmr>7s{4`7Dr9Kxg z9X_`cRFhd&Qu{qKZ?+c#|E*wDE|Nypv-U%@ zI{dljnsMBUz2B;vpNoqhmS2jQw*KY4;ol>)2-jWTSf$gSI)aKUb?NG^-OGsz4UM|@ zohgRm6Y}g>$D0hZNi46ARmr6<>KY$JbGxMV(Y$O0f5$1PhKS;~7`as04YiC)Ylxwx z_a99wAgRtO(65KCLx+?+!pl{Z9rNdEie)>zV~vDu?!{U+vq!^&ot~ESU2@{(9{4WQ&edEMQ65m&t}3_>~PyM zCu&8OiTRJ!sm}1etmvWMfW-0kL-UorJ4sWg8kPuoHNnmqpY~235u{CSuj7nj-j_KNAVcx*<#+9J89?zc(Evj>fBs%4AVO+ z#+?I>*@ERMZlAUL9B^wwYixCVKJXkME$PY!tWQUGiLTTVyW3|Amr*SzHt0=+AsCcE znk7dxJ2!3Y{S54mVYh3TAa@qn+qvQkC%X%6ntQFb{1OJ|h+TS|Dpj#{7w+N*T)T^d zADKKO-z4>_-~Ryf#PugINg_d^DH3nL2$D9QYEQo-e7go$6T~HSiP!Z ztb892mNyw&trAHVFSOz`Vt2aAoW{R0-8;GOfPV&S`*jW|w(rOyNuC2X5fdgNvO#>A zC))nXT%vK5<&HlG7@roCC*h`l=^Xx}Y90sKI0r1g zf{h}vhNl$Ib7(pdRj^^Ql3(&WWEvVFY@@tzG_le`ZuccHcCsQxsHWIOUV!V#X{LVU3`_Lr5`SjyJ88MuiD? z`|_h8BsVF@rg~^FJ~{QUX4;y}^y`dXp*Z#&VCI$lap{n~Y;$X1h*%B{T1U6{VL}YB zO|>0dk;x~IA!auTGHD+T$BhPaiEQvAt~JXxEeF;Xgz`_tD3Gy0NnbIQvpXPSRt`O!nK+M*pKnRqj&N$iU-` z7Dx^!j`_^QR{Hfa04ezWPRo2j9MU6)cWO_6o#6 zS*QMO-cT0k?)q?V$lvd8$f(JQ{EuXrGfUz>vwoNpCHg z|K*15*hhoup6&H?USz4HP4q>agj6txSnu7$e16Y+OTR#LrILfpqQqW7O`(Dl=pj>)Xa z#>#ECt?SL$suOg-pE#GGA5m>BC9`f#s#p|9)|jH=y)xLYU9`_xE1Ru1fqVjeo% zFK8&C>~?SqBlBUj(WnD8#%Ui9A8F*8Va|8WpZ$+5ec|^17uB#125Z-4PAtwxIioW5 zK;QNeg;B3BE9XOAGKaI*Rsj#tZx}26n1&-@9tZVpMLk&cjw3MTqWVUylqPQ zaEyMBvaq8oz!TZPD-_5=wh-!QsKAk7`4lXUScNl?>QLCl#)*PCVs;&FwUoKFby;+cT~6c=FnxE9rHtA8{v2 zoaAwRW0gF=Oc}W(e6<6~a!nnQWnsJpyGOC*h$tfa$EHu*j5f&AyLOK8EtQVSK$3ow zbzwVA89d4tp{(pflwOukL3X+@H(_n|NWPO#L;w8u#fJHm zK~OGX@Owf(l`Lb+cV8eO0kTYXz;40#4sT?g1ELW3A-P>cyIE|Y`g6dKuk)v-KF8v* z%^iRmCf0!JK8rX_X}xEPoGSV_i|*6dz*RB>#Zh7r{XX_Iqy$Y;HVntnqyed&uybC| zO?r~G+U0%gO=ebX5XNGrXM%Ol<-NG0$8=W5+jBsl)FFHcwS+5Cm(D5Vp3|M49zthj zA2ZQA5Pb>t=|9HKQo}DRN|;JOX6@uXX3=}%h9JTm3L7iYHQqblq142dL@d4EmOS!- zLRgtF{s913C#^_`j%bcqEaS7RpeZ1!#y_VgPOm^ZI7w#7 z({2>-lp%p4asjLjjOA&aT>}K*u?sLfBmA##{mg%z#nIy18RFHGA`Y!bF`BC%dr8HqZ21KF3!~w<9&eA z9p384Hea+O_I!W#y;)DfZ9`=@evs1aB3R%j-p{#NB-y?E_^ghs51X_4QG^1f+uIEx zcaV8y?l_P|<@`_O6Z2&C%1jZIOa`uR3{|pLV=q3`H1NYBN<}&GWr?X#xFNWY_epwy zb3)U2RpXfb;uKdFAqD@tR%tE|wzX|YL@<+ZmJa8D+Zm6~0T=Qp!S~OUT$L4s%vv*k zxKWK|!@hHR#!I&O32bIG3ujW^Ww60 zW>v9O$B2%Uw)@ia=0AOM+o&!#~D0|t73D&s@mRhOb5jQP< zKMd@I-xLcYi%MRDEsVg(5)JxH*yI?&X}(UYnR7sMQ9ta^ZBK_KpsfMP)KzaY;;4GX z@Ds1dv=r9%1#IRNeQIi!jFpcLgx|p5f=#M>kVPuXFS_NXzT0#d{}x*W<%ggeNV!(P zzt_?z3RujCWseSmPebGWC`Gw}HCwCIaeM^?N@jt4Hj>m#(ogarq zeKI}9elhb98~u|TN__dNWGi)Xe_i0qQs^wclsL9j@kme=-@9Mt<<#un>}p}I`aprl zK}fcE5mXb0=Wd+fl3j-mLK8u44SALJP?>u5)e)|%MMjt%zd{}Col54q3B~XIJI-of z%iIT~Z|JsqhcxNeHV2G{<&pdiN!dlD2#ocKCQ3eK)#B)P&A{aBF8rG#b(znQODa*4 zw!INIUYD5(+q2r0!o-L?Gm702XjT~-t}~~%zVTr|NVBmZTU|ddVb$CY-_mpB7Q%N9 zxD5E}TT->r_Ufq4jYnQY=$;z$B#PVL3Ng(+uv z>3-kb!NBOa&cpQMQ9Do7jhYpiwAfn}ft-FdI*3mYR18mAl;+9Y_9r|>v=zZ=PB5WKn z@0OOUAgk3U=2nwSU#dloVxvwVvLTjxy+D~6i)=New=@$pzBj)FXoWx!~yn9@I6Mw;af38hJ%MV@xaH=iTk=6ou{CX~~-dh>rE_mgjW8+9)xHyDSP zqpBw(`!5YxpyI(_iMk6AWSknG{@wIQ4~2asXB7#iG!N{H3lZHgB%d%k#or&^0Y8bv9zc@{Du1DeH zXXp+^`{n@q@Zg8zFt&r}(>!gndX)``fF4QTgMq}D=i;5LSYRB2EUKXbI!Iqu3V*2 z-7nZL+K-+{)YM{aDy#D;e0$&AP^v~7n+cB02Y*z-#2BNiI`2#6qV`$k6W))YpuI(+ zYKKmd&8F}6vZ9j6j0q?AAq_4coDD0t_5w~C$qT^E1EhLrw^yi=AM(Oke)$Jn`_G%7 z-GPURLCX=yD_z;?S4Df;O;)?G!n^r>eMocP2~74eoA-MNl&eaZ@yGlOf#128xQ*P9H{z0@I%G=Q|mjkh(KV4;yJ(q z<;PJ9Th001OQ*_~fw>c%AtU1wwf^da%O~C~e5|u&g!)Pv)w11PjH6DRStVGbN$f#R zBaqp;+w*qofOn*pnOpBe7hAnI+xK&K%R<-fr54v< zFAIL}8c9Snwru(O*W6*uWm$VOmY|ULVUW&p#4%3#D^h9f_Ivk_P8KpW%G zFDPJ91NCNHGB(X4%on%r@D{eq{fw?JNBs_dz{N&iZktg_dEk%nE+3U^w)JdMnnL7!;PqWXt{bhlaHVp0Ui3^|Un1JP zQ8wiWR?3w&<$DfhPBGr7sN<`AETasoY1UWlre?r7l$r5dD(e;zMoJf!e*J!jJ` z{ovWr7#IHCGRDVdjkQ2gt`*qppy%$>)J(V&t@Y)JYCF zBaq(vH}R7B5sOV(oR@WaYik?4+(nae^b*0`2Q@p!{S%$+QFU|k8BgX!T6hFJ2AgjM z-w%)Q);kAWsbO%G-OAm=3?z3={5Xh5D zPwJ966VXb);ay*P#)ekSUyuyq9aF31+dJRW$uekgoIYCJ9Y`I=Aam4a3+6h{2>yPed8T+_k-ERG11fTRo{ukIstmURMc6;TPV1%mv+Nib z%n(h%Aub&{a`5~3x7lyJt6giJFdSd#huy$ikHk0)2){`@2e6=x6?+i(4%o?TxsJ|xr4ZtDVhz8JcxBs7>!v(Stn{nrQLM84){@%oC>@4H zlW|z4)#qQ{j|7EczGq^`^;7s+aRWK?vY0J1{JPyaz=sWFbZNkG{aC>0X-84f%X$hh zhX)%XAckg9J!UE@7wqSRhs4?|_-4!P$!uz6=~$+dWi+W|8|DU*tssRJc7*}fJ!{Dt zsV!AC1RKV|PGrIdPe{KlM7=RI%vQ4bbi(miu7y9c4is5gY9=ZYai`$Ub#T2xV`ukC zW%E%}nd71_DWmjW*9`1m1IM-qxDAX^GSWMg90eA!Lki{wzmpT!KL=bgtq$I_+9D5h zodbrgDS33*LY6YQ@onwdjbRENN1g)`v$7nq2BpA=dGZkj$$vvL%gTPPiyBqjnBfK< zvqHma!@;3h@t~FY$V}$u$iq0|(_}7izZ~NsQUa^Z>F6;halhlmN}VT%jV~t#K5o6@ zH{+o?RNPaw&Du{OP4C#=%QhYYv~lclap*m+!%!KozmTE4MK@ zp$j*!R>NEzVQb?)Q$Lp2U@BJ2eGYi!aSouO(A9kST6)-TRi;y}bHI`1 zZv0tElVuFdc`cVbN!iD4H@34P6{CTK!q?}3zbp1+WqZ@|BDRPzYA)DR-Oj(Q(Y14c zZJj;&(;94H;vCRBl*E5l++@n9FRcNz5IhIqP?WZ@c~y!n74-1KoX%C?=g z4-z$t+zT5ocKUxCDvkRvlz1_QA=NKlP>C*-67!-&`m?GFqh8@%^Wk|$Fk){lF}E!+ z%+{55d=N{JO7>5>-l`Wt(9YVZ)PJk_1foV8CA_L0KGJKGsG6P^frHY3qE^kcCP@m3bh z{hc6wN`bE_VvqNdx-2x^B#FXEQd0oayZ>lNI?@)AA7_?<)04b(dW+;+fS2wmWK`ej zw7b^;k%=}MQ4*tayuF;6xm)H9}{d&ndx0~teBjl}I|U2KtsxI7*{b@eWk zE6a5wb7Y!hWG&2<$7R$0M*S3sTv0rmd3BZEh-kirDPH%RQzU9dlG*Gb$&0X1UrU)- zP{(@dV-L@jw%%GMu=B5{J)90n4+I0_A_07szwOvhbf6>5!Qv#n{Ef`(;VK$9Ne&q$ zSXgx)r~F^zBB@_md<_~7{5Rgeqq_A2sYkNSC8f2W1DJg1nK<#3)bUqHIkzcSCMCoA zvzDDMStLG3UOAMzlMlRrNEo#fL{p|&qVhJwpLK?=(rSc0j04V_S8(d z!We0gn9=FUYU(;^{9M^Y|8~rt!P1}LLB9p#{e|9+QN5Evx2=-REsgS5+rbqlW>Ov> zQ=zamb`HvrRpyg5f88s>Qb{|9<+f;M8A?J!M4IA;3y?p``A<|^LJ&Xu_=Ei<$AQHs zF5Ivl@%H%z#1V#D5G7zlm70k9`0(9gueq7PyF6G!TFD5vUaY zcx)h{vv4-#d#9q)?ON?TAH_9B2x&Ue(I~1gND<^d=Q2l_WoRg;lTK1j&XhqKrsN%M zxA6G-tru?{*A(8~vB-K8KT~#hV6AT5^eOgcf?a-jFiqcpO!PC<5`H+{RB-$m(LgD* z(lg3Hjw`;{B}B69x*a-gypn(H;;YdIZmoHFrh{MYwN1RWrs;i4Ee@PSL==60MzYxC z`WAKvCMn8GfW9e>Z`6YjOcEuyigNc0HPX74ul|z4nmqa@%H8Ku5!F_)12~ zbIBiqn=^hk?FA2^_~qm_yX1b5iO9EAQ-Vt7gM2(Hq6kun{^jaM`6f29e+ud=cy<|A z%p19jbg3oMO%bH+?09`MC7N8IrhR=gVDO&Wo?>>g@#1MgId}3*-%OA-Fi5A|z$rv^ zwmk9o8gt3Tt*1`BW0Z_{n+^Zdm25QyyA-50$+((18y|JVx40_`9cOog?i|(>p98)d z+N)DKzTi%u=qJ;SsvxIzu{)~1;*Zd>X{Vr7Zx5UUtP3pz9a~&IjjozMp~)gA@Z)EG zU8AnP(if-FGg8IZ={E9az#i3b!=V|pF6l@#HoYy%YgW0vGTkkR%5C7aF5F)v()SdNpB_CNlLhqLbMLWIFW<>?LX}B~& zj6~8nBW3OyUO?;N_aZF({gA&mqQCyeDZN>j24}&WJKN!Bow2o)V$z-hjZ!6 zBcZQpFTo{s%AaQIgdbi8I?W3HJxo0-4K_c~>vNLJSO^lOUd*Bsrx?TuVsS?;L}jz* zE0etp(qixpw4>56;KT_!nap1C-Y0b~`HD2twO-A1(gj)WMe3WO{7KYTvQ5n8aXVo!wiY^y$rK=U6N1_U{X2O0 zyX2l(lOo&X19Mz!`Cf;s=MnU8?fz^F^?$XzbQD1I@B!LwER~6Lk8d+qHQmiU1NC~g z;RgHH#`+;A7htS8(R{O($hUY7Xh%k8(qdGs7Y2kDR-)XZ2{&&bBu zm!`X~OrPAg&9iy+MTu%Mn4cs`l*amR-E}1n;do;UNpiSHBY7iDQVVBlXC8C?y*Kqe zRn~W<6XPeA7a};jS{s87KNIFZodaGoeVnFiodHXlV$`_b=(}{;-P+CMkSzOs4)D!y zmAJpfU*zhSUP3jbaEq6TkldYmH5qGvCD@q=jV*U8d>%$-whwEe#gwUGC<^P;%3%PXo>O{dG8)ShNmC)^9j?yRe)KA3}InIKzptuYy8OyR~cZ=>s>^_E&lcBpoW zQ!Cx=#1umXA=;*)!*G&577vW(qa_Oks}PpapVEHjKErGWi}U=EGgQqOYv|yb)A8hz z33@cGyUoFQa|}J@vIvY0md7EZ(btZ-TS(CKD!hEEyPD8_qWt<8JlTZt<@`bn&>DSHCi(6h@Lq>0SfSJ(iIe^!#Kw{5m^@glj0e`)}{%Rlww=p@ImD_ z*pgg1b>0!(W?}!jaY%Ym8N4!fR+v)wqPu!)b^1nQ{$tg8_p!QhG*DNda>y;uxgTK- z4J|LLw;S`D>*l}~Ce6ExYA3zf)}t zaFdyx9GBYCObn@+VN)B!F5B-+4q1>3x6&yQfB>2a7K&VbdgOwYs~g_vUfD6-x4+hN z=R0HSFH%{(Zv^#tF5v?se|PG!VpbGyVcsA8x4C7Wc1%Plsx;VeLI#wEmTQ|B+FjiJ z44%1Dw8W6fkpl9k^QtqY~ZiHk;dwrPd`8DYHe}oYKby zl|{db^;7Idy;22DS5YE6c4N-mu(Wt9X3J0P`E2x=%EX|q>51@dA0Lc|T5m0{%Quzk zkV#>9(^aL+#C7KFgfcHab~TQTxd-(l0vPBZ+eH7K%Bl$T<+pCSlY(Y89-xQY-hE=( zLCLoN^51|Ua9K-GmVbsxpVMb2skYr9A4HJ#-2q~`fq&y)DEIzkf2zD_R54FX%v5W6 z#v6aXGG(5-mJw#n#*5E;Br@*7w^J!KJZ({Z#1UWeZCD_XI0f3Y-+Z;(vWEQ9Bua_1 zIC+BDl-vT}ohG>*{h23C+7pojd?-=?h4tI~OKzpGe|f(Si2UNi#}nW@T`Sp@dgWg# zjX$O48k*Uz|3d9w2eQbU#G*8b4dY*CGEll3fA%b5dj9wumw38)k7OOH2bpHGCO2zJ zHqE1PYm1y&L4QlkU; zO=qwzjAjFR(8CxuxOO6O1V=l~B(nX?4O1=SmRk@hEddwqijK%a1x0FP>Vq77K{~rN z()d?0(@K0-X@d_}>DZBN0_rI6XpM64SrwC-JQjgl%zT}ata5Rw^sb%YIou$qLTFY* zDmLt74i$}sPh)4=p#o#oVT&p5Ty5Ld#`l}A+{{g!jg92&gdnBcMBJ*f8fI%?OF{7q z68y!nnYIk#cy$p2mEjTbDdjzDV*QRNuT}o*5JW$j{`5^G_F$!uAy6gNp+fslmCfbH z+hS6GHPyBP@X+a`pdTtia?%r9xN|@(CduW)2Yw^t5%U^&!P%wkpTSyDofAKQx6PID z+W8JJDq=h*QU}+4Jo=B#I3lJah!5B8zzg$ZF_tT)_3r& zs^~ZhK69ttq*e+U;qLgWOMg1+EUD=Yty6eAmMAM?(CaS#`e44V|19!TowDkH0!*;& z1!2(io@SnNeNMgYLRsmTz|O6ZI6iFcX@uc;#zNBB(#uLUetb^|$PsagOQuQVv!?Z3 ze+Hav#GVQxd}0TcT4M+CDBl1{cZmdz9|Y);=O*8&DZO_za;YIi5s(HuLdp-LMA->Ied z;K8xor+c~7jY0}tN(?9F@Nc+#-K?6a8R<^tCo&;uIzo$sJ%4}2mv(RUGQncB@7(jm z4AjVYVB?z*7p|78G|!vD^AzsX^F;x9swwq?N(U_o-g!eXu|tH9K$ONaDt{X+;3l;+J74WWlMjc47fU+aWEN^!yt z%fv)|6m5=>eBo}h^+-&`dUTdl2hzq9Kv*#=UmG8!MI{|2!)4I>Sv~lofFLa=HIe zd~=PG`&(~IO#ctll9MaGk`mMVN3_zRbzzb}oBD2qd**xzo`@Uld7W|4uoj|Qqx2Fv zXO-*iQFxTDG|{I|JYGjH&)J`B8kdpf^&T|E@o+x6P45LMEp~>8J*gKq(chUU{58Y# z^Hd}8w<+zpzZ+WySW=fMNX)y-LAHJ%5yXhaSuHQf^n`VkB=1g#9SOUv5n0@ zTw)H%z!tpaB+Lnz+2$S^WM7|`%~0v1u}+&BHR!2r>GLy_4^@bkI5cGa;CYx3!(Zx~ z-ol!@5%{#h)%dgU@Jz!Y@*e!K?Dt#wwdC%#9W+AdH$Zh&_pm{%#y+!1;{f%;&0Ee(=n3mQRCo7Jn z`8o=hmKnw|b3D-!tV1d*IF$+0PCe|}SaZ|e;%coGt-h_;a}Ia|HC=M>91Up^Y|N_P zo;oc%$_nVXDfz9mkiR!O9K=GdfJ_OVE#EC4{5|3Cls(q%(&cHEZOrbrtIvLzLm-zG zPfZHKiv?@2OO=Eoe|k33 zKr!k1Ghb7U-ddNo(S?>!{VpZj{Kon0b)B~}Quh3i$17(AJLpZ(V%VDW z1d=3q81-Al1q))lKJj$)c3tDkPXalrh;Z>iZdDqH4p9Rg+MilCg-~lR`kBGY_ zpV4K)(L;^6Lf8{?x-!IMm5$^XusycSDtl{q)p^QS1t-}#>{({cC}GiPyXUQ8ZHIik z*7%Eho~g_)Q2aAKPvPrdoT{hQ$ZOFZ9>$1}ROlqqo$$f*Bq$rWU^4N@=bOM93?Xn_QTV^LtEQ&?f$C-c+J z=wBxkw_E;L(Mr8xIGS@G9#!RbZN0{S9Qo?wE_eRJtJsHK<7$aN2Tp7uW>4SegZTb# zOOh2W`|h`OF&C|riOww76%jnHy_Ayu;q&8*udvr%nIx|hWZtfrx0UBxv09g^Xfy%d z#mL_|$2{Kj80;FvnEAC*rRRa*;bp#Wev2Pf0^@Dqr?TB2Dk#P7%^>nAh0*GEn{x;+ z$i0y)BllXOss-37k3pahP_M4vBUp+KE>(~Hq z3$tZcYWb=oBb)}sd>sxVD2rlH?hu|g>hfHu-a>+DXzz-9Is0YdPI~`o0x#vhJOLyp8hCU2t;d1TBx9nq zE~#}vRlc)9Oy2JpeDqa=XIDg5rQS;J59_y(C50to)Ows?tZsRXQ-JvI73_njee~}O zQ_R2P)N`v}9fD`q{{rjqMLALHDwLw!|LOC(fP!j}p!_|Lq5-8S0DO}O8=??*EgAt^ zS>gNV0A5IK=N7VCu-K!(?YX7Z)PVF^3cs8g=4Qtwt(SX1vCCb6&Oq7!0blw)ONdI( z&8^*tDG3@B{(Ht*Tu5SSSJIsSLGstBoWX1!N@>A+TvdzM z|6jDdcU05ywkL`eE7*`Gpn@P>I?^H{UAho@6r@Iahd@LHq((qMLKEpVQbG-cUInE0 z7J5%8AwY=p^V~Ui&OLYL&0BA+_lFA!B8w#ZyZ8RIZ)YBd4$^+Px-jzIBKoEKlh$*$ z@2Rr-ZfSErDn;`m$`txeMeeL$)hiWVL3&jwTb_N^@ultatPkBY>UExEq(&N460|b_ z^jh<4F3J~!?!2XG$v1pzo9!p!*SmM8dCUW5?E*vN?2IZNPxJL}+?sM#xrSnD!f$8pL^;F_bP|4WkxZ z3TUw4m%Sl4+RqsIZ0|_1>yDeISLyt0K>g- z{(q>hEf3+JI@&!ih+EfPij1|BgKjuH#EkcoHgrpZj8(UamZQP8c9sT``<<)@dub6E z9|s%v5zSyeRI23J_iJ8zY}g4(lxHd2V?^ zNwK(drYf7_@v93!C6DZR%;g>yXFq`8$OaGqi>oJD8+>Vr+1Y51 zdms7Q*P%w_P)RCX|6pMyPZrj1`jo!zKVr9n15nJiznpRO;mnT3<@fW>0EKTi!XdrZ%as~@lETk4;vCS zx&G>fp!wT>&qBBXXMTOZFs23xpWyNiH zX+OF%EUD_f7>rTrceUB;O6@DhR;AI)a&eN-mXY-b+NoE8+#{!3YCnyD4 zy7lgr?gNyC=seUlV=kaNbXm{C%41}ESwAF5R6`CY9d5>~RZ$hO^eA}v=4gcTvkuf( zjI^awUckUa9C{i9)|M;Ca}0Y+Qxqt~Nd2*c8jmVXM=a410In5G5so3lhfMSUO4|l? zPVAHZOJQ|Qk7G7KlNO57JD2(@c`~M{x2Mu0v%&_23U;3c8Qe0q8>v7Ix&$l!-M-ru5bhM@4j*$n6+a_82JV?h`>Nui^p)>k0IZS~9=ms{pZsP2;58 z{O-iH02_Gya(3)|B)hzDePWi8UEkxgO68R*;S1TGfvMhk zx6M|$@OG_f#Ko9Kl5A?l-Bup!S8wCxfI=xyYXLb2Z){ww9J0nujHb?VRt8VseR_uB z!Pjf|qMmN)!{?1i>TJ7!cb+5|0(gy!Mi#PUO``1U;>6KmCn49G88y1Ji#TS8v7@7A zFHt1LeUAYXH75Pf17nNhSKsbx_0(=#I+^==Ea$?T(D-lx+Mse>+5J^G3At*XTwUZJ zCjo8sZ`69yri(2rdgSG0C+0Q1fld6iF~c+CYw7Hr$&Q|unq$3V?b zl8GhX*J_$tDkuDlaIMh{RY4GIm*lrDzuough+An5h~NqTDSCr?Dtr%mh^DkvRO;m= zLQQf3@A;1V@8#(Tv3aQ9zOs=|Kbs;wmtxJJ>KYm6b62A5RE{;iTS3R+ZnAZ)GApdHj>}U#zGmR2Ho24 zJ2|iThbki*l@F*QNQb~)jyiemLJ)ij;Gr)dfAP?q76^ZtKkrIu-{B_YZyQP#2l|vr z2(}TtmknDYT(Z$+pGjyk2zb|tv_Y6ip%zS7FINbweA|HN-zMB1g$ZVVLSNs42(Eeo zb`2~8*0!9$9_5Rv)TDo)Z>z|2^Q1x-mfPolrgk#2z`5xTL=THWPQx1zb z)D@r{tmH{dq;U*8(amaBI?0P`eNIrWMD^YE7?QF?Zh*X^66E1!ZH^7Tqo%{ zkZqZpraJsHKi_s-EJG5;3v&A9?%7KfSXo-8*{^1h*z#*>rz)2Wd4l6*h%-we#sifY znR8}^f2htM7~bZ*OD^DaqJr3Mopg*@PN2Ri`Bp6T@;nV3Q=yYxsx=Z|ut}S|^BkfKQTPAj%zW4Tum$S<~L<>TNRJsT1 z#x?`o+m*2VFpoK4a$?jA0Il-_90#x*jq9MgAqx@_FVBD#Qz)b5TA z^7I_4ulL}X`h^m}xEcPp__2Tbo&Wjqzs;1MV*gG)^sCS1tpRosc5brH!71a|2qX-& zXf*tXYNOZblxif)ij+Z7Oo31^%Rs}p?uJa03F?v6jTg)F#Ff1$WhtNjmS>z4Z4lA* zD@{!J1+HkTGuQDVulgOB)yW%p=ga>Dz6uCxTjfB3<^9)(3ki0As1$(5M@%TE;RlHI zfWfxeU3KR}5)Z|_FOlp#KK%KxxOsjGgh4#4+F^oC^pUUBQO~z12)zXlzaYOLs^~e! zw6irs(q;sb+ZVJLL2e!%Kuz}qgquwA+7`Qz#qjXf9?NG#Vs!!6B{ZSx9b9n&k8Fou zL~uO#d_Q@qdKok2AUT8ziH$Lc?<-EB{at0l2)-U~U7q**>#&-tc#*Au!_v~A!g9}Z z1+j%R--$s6KFhF<#4ppJk&1U+N0xLO6#+1&pgGekLwJX8Lt>Xk89R%ez+AuRrpVl% zRPzb_H#-U_ zJf?WD&a5|@h$0}NL{}@Os!j*)4Xqji4I^7fbU*d+p)HEC1*0Z>Y%3wf8WJwVtaV$D=&3V)Rbl9?cwXJs zA91i_ZY_Ri2|}|XEyhoW@)zF)J)1Ao6o>*RDbR)xzr=Cm2)wPP7bp65?Wpr>edBuM z#Fl#S+ivmb{wT-=fJR4Z_+{b!t-ia;E2~-gswa(R?M;(KHJKnCQ+=}ZH?YQ>^rx~R zc5BJT!bhwYivfW!zSiMn1+O<|2SlWD4-yXvqR3U0e0VYt*sx=sIeUwb)7)B*G!V(* zRxLc;hCJkdKUTzRCfaV@U(!d{tGv+j)I`pn;sGM_$%+adFOfI&&xh(-LHnrMbAPoq zJQceGx#p1WbYKs^;xXEy4mq;qi9IOrg+$(33SLRic*{e&GW?465u7IwbNOBA$0flf zv!MEd>n)acjM*xsDy|>HnpDQw1SvyI?|k8*n47n9ue9z`pSnlYm)BIiF#8UUBpZ{e zu-83`u5_))YZ$Iy2Sns6gCyXi5b?i~-ef4{xyV5ePYS1XN%EWTNYz zr3SHSlQSl@0~GYGC-6QbG7N+EnZu6AlccKu9RYZ3vCA^(Sfs&Sb0yCiizz_blZW?} zalsSq)%KSc8VYp$C&E^?e_w>sBC{jCb0>FR^$*m&SNZ|MaQAYToURv4UGjKzI$q3d zAo+FFBM)9sOmE1B5fv5w)txFu<93LBR zI;5w+{p3}csP3;#t!GpmY4%6TFHb9E-~_3s9%&x|qu)#&;aua*ZVnd`LVJ|oUBC8H z3nPDein?0zJysf}OVszN{9P1%ydto+*O}*?8r%q=_IUdGJLSP`yh%k57kOtCM892q zM9o1M&gYg$KKox` z?60gWHoK_a7z5#1GTv?r*&+F}wj;;!v3?m4xugQyi6zuHs(j-sRk<6dq5J({11nhs zH5F^5qBm$0kg9H&pMIC|SxC`S`8kLq$!BVv#{Ph^ng;I}VIoW1T$p#piB_P8^Or4q zx33_)|HC=;|6wo}0YIEx{`J{|wZDV8W|<5iEOYt+d7?+aF=!u|KP_ z(|o-%t%?NbnQJnl%e1VH>;=kATS$XMfR~L)%K{Eb;E-aI^;g9;QzB;7j@*ddz!%d0 z*B2CV=}Df);GQMy&KUNuAYtmSAffVq3KB-!&QUmLBYmlxl};D+o4lI@Nl2TST6hSE zFZ%D?pqM5<>GlJAf<9_oI2G9KYc&^&!Hw9m$E+_!XGMN}B68~zhg)kvlwrjdOUQ{B z9@MgP&z|+k2u9jjlwFTTTwrEibUE8AeFw@ygjaNDQJZcSw%K zQmOh$eEedMrCjtJ##`NN2iA9fA2~V-vTd00N6G!-O~oR*v9YJ?lVwi(Z_K-aQ!HMQ z7MVx$eFRMPF|4#uMJ!Fme%H+iIk94uLsm=B&^{j_v}4SMujSH|Stf7vrfC^T4}r#V zdko&M)s*i*{c^fa z!V%ln02r=AW4ia=k2bkp?=tx?9=j19dv0rcXX8h;G4*f3^`vKn{s(@lU ztZ)7=;Lxh^B{$VakhRAmtn8%&cZWZRbZbx1e*JyXk`|d0mGNfpRX>XEK1aAlWW9a# zo;GSWJ6Q4WQN;{U@rJ`w>yY)0Ps7*|WW@yrEwRJX0C?+R!T#CoN5H&p@HZUvpMR)< zFa|xu9WxS`$Vm$2{~CGiFwZV0@y5c<9#DzPVrOYype}=ZHl$J%4^ei@v;?5T>{P`v8kC6r#DXwVT?({52q<)mpNu5-K$&1 z9n2DOVL1~P(OjQ|SnhP*I_rOV10uExDsOLdke&-dHH)0ckdC#&h&3v|2XZ65{- z&DEyG)||i1J$)uLzwL zbI#Y^HZI)1*e>HAdGgwBB$YXD_?9|qMD@n00#8~~y%nKylN&cp zOT3Av4uo;LT|aE;JG<`Uojv+4(6YMzmO95z-V&-aD>pK?&bK7C;p}Hy(-42C?!xV8 zKh-2O^<9OXC(M45d4q#$Z5Ek;39?_x``uTqnoKcXFP1&V%#`lj6MtqQ{)GlI=M)(5 zU>$N5ZUu@+y@g*Pb4tkF#-9=q@cC-7OPkxA=&zze8s}r_5Inh;uPK3T&mY_oGh=T* zOuHfDk3W(@TqJEQh<~q{4SiUKiCUoCWV>e4x+oL#3tM~ga>4a_HRM}Lb1=~389<1(|)Vx(ow8+0O4+*NZ~Ru%Ofy0<6aPc|X=4iZi9`U%ZicS$^e z$)h+cXPx!o5IXWv;XD3}vWnfz;LDStEt^kdN@uw*lney~{ywX3hgO%?emUy=g4%5N zF~vGk{bkw6JDZXr{s;A?DW2+1ZVWL`>HEJ%+&m~&(h8iVefx(hQBXnac*&9pzIxwa zXqbzvH2MR(9MK-TZ29%B*0;KCEUXj z>ISvTU+;Fa6_~eu>mA=U!m`A0QQMrp;Wf<@mmWpx##x%R?X~aQZrI>W zogi@>&pNz&xRvZiPyqh#pQ4asIp1TimS3=n9@z3fXYT2LnYpP6uJD#_0rXG>Dss28JIttx)*SnxiDj>(7Sis9|W8zKzHu&18BDX7-3t>8%7C{6V zHlL{Pxk($3)YSkkCtwcm+q&>|dG^&JF`!p&Fexc1AxTr+&TpqD3z6V4EijMDv@KeS z_F~n!%wj)WRM>BV5avRhE}kC}`Q`>h7ra*~(wu@+?r zjob#ETOEqi`CRgYUOsNW4@i9U>W9r0nLk9<$3^g3o)+Z~hK0Bv?25O&t}US}U1cdFG1)OoSj^5ee{IU8 z%2=o4M9@yGHimED{Mh6ls@f=fOaNb9z)yhdg;kPLx zF)Xe=LSGShYO?*1M2L&UMU9s{*0&;3)Lb+tptZd8f%8%xwuPL+g+G>dDmAzmCOxKS z(*r#+`m#?&^ zpnLid?#nBhJjNzwCsU(01Lsw6xzB@z3o?)DGMrW0x~G@S9QXaB_qjfoM=Il#^5zp^ zawQw*wAi;m)~Vu8mWCpmJ(ZqUE<(4I;8S@r1jsqtnwfMwR(Bw&85uFM@XDQDU0C`4 z>!SA;^$_*5DFL4hjrd#hOZJPe(Vz>S7HDoHx=*UZDrGf=b9js#jjo9f;lspaBMOI= zsuMuvT8cYn$_bl0d7pX`d92nnFo@2Y38`247;t?Bh>J;?j(~U{42MGd|4`{f0){dj!86+fDc_dkAY0Apa07s^si>2fBE}=1Hm_;QFsY*1i*F!CyX>b zC5aFEBcV}m5Qt+^(j#ST90P*k*?&2?ig^|(^fIh4`s6KAb$LWOl4?9W-(|_7gWawKJqympeA$VX;%v3%o zR&O=6r`|AwG^2o;I?he|T(&AJ!S(-G zy&=@%#UL+F(xEL6*(QKcTYln9M3C8u@hk6bhL|5+rkR>^+eg1kj&0ZytLdc_EzD5J;zcz_PZ^yb(J2_278HT zrttx~vej#|*NR$f4uO9|-TH@$#v+)JL3whZ_Pg5@DQrPLR;%}*jVCQ}?{B=T<`+Oo z@Z>@pZwF>}maWLaBHDM4&E_!k_ak0ER$AZSrAh^*FcQ<_xT-@=6tjc4ig#oN2|G}xc>X3{SpVRicj~(f)m|ubQ9vdHf0-{#o zm=Y}@n~-f>M&IN7Q8DV!&T{`AB~|L_U0s4mc;NN+6)l#MJz$&y1Bcl)NzZk z#p4mau6yQrM;+icEX^OP#T^s~n7#qboSu$oJwa-oKd~g%)PW8dhT(sKgU$a04!r-1 za`^c8og*&hcC5BKSC5`?#q!_E%l-=TOmdbpj;A}amrkp(y_v{0lV_Qmc{0r5Fpx=I zt9OC-Ak*0PQgL;}=+$Bu5wM3FrKsT3C}@<)QlzlgaCFuK&ysi)>3{S>?f)(n{_hsD z|2JHebW7T3RD_-si)$*I<4)hI>PkrfcuKzbAB%mvIUS2oN*&2CAV$D?8k7yeLbf{a(|@5u=a zZb0;a@c{@NMIAF7gF7jFB#^{=5BP1U@Vd)Paqd7>=$pruvz%lbF3B~Bu^sQS5h4pl z|D9XzDd`hvt*D*ym1&O?E>n+AVC7|my$rbqup-NkJlJS%HtvA|Lc{o! z4_^lVE;vx{Mys1#A~s}cjjXLd4xnB&I=yDbhv3dL$I3oc%Hi1P5R4UGdvMZ_%@@FKaV`-;zw*%Jl9-LHVPYHHEW7MTZW=48vMhDmf zem<>)IUx!R%s<8{>P(+DU9xKwRSncEdO;FwX8U@-HGsHGyxdr{ssq zE8fw6|9=ZN0RKA%ZfWWjh+VWH0VMsKG3@@hrP-bOE2(KGuEJ@pY>@txNNZ98MX?7= zseAO7f3h=h3WYD44gJHY%GqW?e(YFFUfat^J+Yu=shlQO5fXQdDNQ? zq!#GQN`!k9AwuJ=Cv^chsbj!}LruiIS-DY>2FWHA1h_okJ>Sr-0DT5O6+YtdD$Z!A zTyx58TMYbY*mWJr<_BYk>`R9HM7^j-?=fe2r!_(7l^0vG+T~~J;$@AQgRW!rl@h;x z>u~?gkZhnF+7R3(zh%;$_dGwq#grO>QM@Bw`hFq3xT>Y;*AZml*9Vp5v-MW`Ej;ve_jo$iL$~Fw z;d{ezS5NP+*OadH-OdX&ex>zfo0?6+T-pAV3P0rcPVaPrJX#GAG{m=`dT5<8ppT8_ zea^@8_SqjH=`8s)-ey=MN9#jYt0}kY?!|H!>DDIOFhvR38Q)Do8Vt{Rxt%kh-s*Yb zehOWxcPbLUFm1kQ9f$!Hey8xE#8m zpGSY3E-+b^AZ)QhC@geNT44`)vYV_Q_WxHSlW4&LjSPFR_P3F#mBE0G_2G5_(8yx` z(a3tVs3EnQZFaZOsv5VH12v5=Wo;PW0b3uf4fs!33hr?4`u7|Cl;b@u$1djC{paim zCMCjM0r*yd2yDhNe{1mWKN_4R4smdOAC>&iMmA2G{MSY%3|fmkD54F?Od4u0vL^LW zK&<8UOv&q44^Vl^IO^ZW^mo_N)Q$*+6lU=foZH;^VuBHHK$PozBIzx&jO|ge`JJHm zX^>+L3DfC-VEVYzOo z?}K9Kw+_rOGmC)&C%44{_gsK4F*7Sy!K6u_N2EmrKuknwwumzi7}F|? zU{*G{>K5J>yy}!&YyCpY5-S=iJsBH`a>BGpw<+ib(jYD!6a0*`j}^T)Pq1ocJBU0Q za#Fq7?9{L%CcfNdJ6-cBKw{RH+@rTU491@2bmdxJ^;s;c;ZreoM6@|hOG;zdVhmhOmwr@U z$!Sk2YXI$f(a!?Z(%%X3M56%LM+FFErXcV!OMT$fcjRsEfrkeH@WCnVf8%@A-QhmQ z#)7|ar8}Szrh(sk81Nuab-IGxI;Mi%dJm2i72E@ipILXv*~9#Ko-!}zu)F8JzIEoM z$C2HD|N5mPd+mNT`CTOLU|~kCqfsZ!ag?o?A9w@v4aNGO; zC;9JxJl;r9MgZZOmawI4vi)S&if_hOT^&og;O(d(N;EXcFd+wmnpw?rZ4oN?Y=AHVp_pbYgei2~+IY z{$#Mv#n_bbu|6%I_vXiz{ya@OJ2n2g+ZqxXWBbQF|5z0N34k^A2RtENZShTJa*SPo z)7T>;8+os1#TPk=mfpDhK*uz;fh%w#&wCHo9!QpUD70fjMPNYL_WhGmb&<uz^=lJfc>s}{ zaA|zU{STK!{p>xLmkkasBv_hGKTU7@?fKr~cPf#CTO7n11i;G{7;apPLJ zrPsaIGrdjkswD zw7@PPL=C*0nG|SL1CJ18G100SdgoCmb*P2D<|weWy%6*GdGWHq+`Ka;IW>9Ysu^|9z1M}AHtOA7(6^A~mH8&TOZ@&xI|vgb{pyQ{kQ z;51p6|0V&i2(OnfM7CCP6fXexe#J)ol&qN&`SLu4TeXeO@v8~c*l#W8*RB&2ynR7` zHpHRg$YsMwPGW?Q&azgbqT5bfrutVw$*!xGyStzdn|8H9;N_*W*e(Qcfw+Gss z#mVw&k+K%(YljNAGU~0>tX(xNM8E`x-gGPL?s{W8u8OVYfVFWikHcPcXQRXLE+1v-iS5E8MeW{gXC679LDj?j{pU~U#V4}M zve!lhQZ1UjJnm_}iaB?|f=2jKUkM6H_W8a#(b}99T#z%Pb~F)x$j#37{bC)$Nkb0& z2(CA8nXvFkYf>p9Spv(8uALbv*}DxvW5zgZ)R}Xa(dSd`0aAp=#IIeE-8c0WtMa`5 zyZzd5@8@xENIC~$UQ5g11O6patNNsr@FIGrYs>KvU1%61IhKqBd;=1`dO3ZkZJ;2D zO%a;hW_+Gum@6z_jgmRkP57F3V*K@O#&qlC4mw2H=8_{i%jx`;Iz^js#y?b5vvINx zHf!i0wU)v7=oq+=ez!}xWsh#e4-9T})g7s894cqQYrGD%0-TYO#o||un!VVJhtPx8 zu{1lMPfBD0JQ7B@yY0C4?(I%FF#D+qgFV6FV5hg`(?k)$@@kLEpCeT}QN|>NIX|ov zr!7KfB5AIOOU3BR^t$JhD2hXq;GWn4{YQ5I&LG(+qlb15WaYZGzU78(oOj zHP4^%1ECHzwDV z?Ua#YvgvuctTaVDc-k^tV7)!+o9)@i@;Z%++Bs2i*0X3=10ZIA-9yw_0atX_Zt->K zJ>LkvUoCS~=Ui2{jFBOcGP3gpSrx+vTO#UJ?zi|PDx;g0RDoMt8W!$HoG=|^=%%24 z6|D#O^VKplg(YPO*px1L!FgHE(eUC>|JLp{OxQlB(v1i{EE^xhz8x5ELDhNRU&GrdOGOP33a#~G z6^NQtjX2x6vMzn@PBlZLanV69U1R>4oZ-r}jqCQ_@Z~SyN6-a+YIBVEv2|sRy#%xR zkwK+P*QByu5XVCF(QpqtPB2LHr1L(8pcH8*qiGrQ^x#r-bYP?IRcHAvi0W3}WKyEZ z5ZTUZY*a#3CqZ~*s+hO~Wlb(2|0tLi?AG6>rMG2$yayzczP>>62IZ8l7-sYqCb0Q+f- z7_M{^qo2M$;oqBXS-5r>e>Xki(BM#~^Nzd{&aAO%&ehdd|2!#gt`Oca{~bQpOH1MT zTA-&Y@d))zL7;8uYsM8}N9hScEi+Lm?mNqf`9dPWI)wA{M8}BxUM6?r(1jtm4YlX& zLE_|Ll+*#P6h3d~Ey%Vju?ixI0Ni?598E3piy zHJMu={slQh82ul1$1j-TMoMxf?M68+IdRs!2-cNnhsJ*Va(Qn5B4)vy6f|#_g2CQe z-G$e}Zvv-y{Coywj@aTP8URZ&gzl`9cVkPO2+^Y{hr+7Bb6IO?En#~hEa$8Sa)QWiZW_4R3ERPR&q)S)Ho zfkR9;Z;8}3bXp`O?6Uo1Vz9T}LD5Z)law;Ib75B5632Ge)|YNGIy7chZz#PoI)mf= zyjdWR+Rwh1dHY2US6i4MVWL$Yvdp?=!~5fvKHzwfOnm(a&!m|u_4ymlz8`poRjOTc z@;>3wYXkZ@8o9DbntlD7wt#BR=E?sFAOOdZeNT}vp_3PIfb?ooh8GyYEsrS5MALrd z+MeA*r&;C|R^0`LbzkB^J}*ysIuLiM=-#Jr=9@(+=B3Lwo+vtYKe3t`JIeKpr9K*X zqcr87w`Gfzc?q=0`-ggw+&XVn47AoFf>7mg?Lw7g2V>)%*@!eMKvzCt({^`;vtsa| z;{rN|_)aQ>h`D>WjKj5Ka#*fUCI_&;8{U`prO8=0UZ@Aa_fF{n_*Nw)%JZfhOsK%r<&h$?lPK?Z& zOsurCUHf~@-gUrm&J6X{AQri}{}!w79{=%nqE%JWaA;+TWrMZ_0*IYI!ZdK#wG3;9 z4#u`UuI4!|8QOfh?{lyA!o`O!F)lICX(M}ax+QhNrYassAUmwp#Ww<4=i|`-ZypK%;B-`ufw3KbQZ1w!C#>T;aTA^dEkV^H6PakrDJz3gPcu7q1ts?2IXR4^4|HWzW5Xa!;l619E#iu0|>{!8*l>h z_~tjqACOuwANI1YP{dkxM&*~EG0D2|`@g8ocb!P4Fv!(xi zRqE}i$arH$LBVus`6qNw^SwBI7OgBl@v;*Zl88n`xo>I>e5MM(ts+KKDHDM1NnaFo za<&za9_=(&rr+Va;f@$aY65)&>K%Ah~m^OiRC`a67t+edMzE zC-7Hdv!teH0uV9id`mZH=6B!G{#V`jxHK^}ySn-XLLoha&5?(M`sMJi4<}>QCM!LO z>%DvJX%|F6VMHlWWAsS6V~w%O&(kQCp`Xt0x2Gc04lJ{!08!)z>~-K4PC+(%alCxd zn8tU_vdkF!C%?*s)dS=1ZUn}$oQ#fE!1;Iq6#5U9btJuRKZV14!f#7zyO*)j$JO*% ze*xtPaX!j>A0@&PoW*B#*_G?p^!{eK+(uB@l!qL154XRy4p9hEW;#-qJS&@EGCgxR zwGR)4l&yqNc%a($6Gh8ePHxvrC-RNDnbNg;8@}|H^qL;-7vG&FLVnBe=PST1ee$*V z&c~^TTE2aH-tBYa&IUvwt3kB$VU+ogI-}Rlr3G6lVm*GdzesAPMydUca2vf=Rh=c5 zrM0eor~_I~mEhH&BF3VNJM5`ZeZ>Aa$TNaU^2on{W^(Q^I@a56X@U7|BinZ%bZy`J zky90S$?Dx&_;8q9Mv%ULX?8Wr?9*_1xSIcF40vlaw{{VJU%I7Ws8j{fS<n7`ze5$FMxE7U-K@mUW zDFu0C1H4&Jc8Zsm)6MW-$V-gl1a`ISwv=-{9lwOxeG;|M><-saR0oVFzcIlKEb*Em*4_ilwn$;MxW!9> zt6IKCHEfrRy!VJ-M)vui8_k#1jEJ%9yz45xo^8XxadTMNG42qdj|zib0xj^PLQa*$ zv`#PLFnryYpMU+ipMK}Za&i4)0J`y>JaYL?S#kjHP41DL-~_%@;HE0I8HC=b3_V^@ zp5%fO&jIANBE1&2p3~~g0t50~SHj#HcC;%uQS%^rXu?F~a(ZE_>{d&{Exy|=cSK4o zE?UUEJs!=SR^Gcef(YK_qT6R1CxJEe+(&sv+83i2u2E8X3|DcB`JIoe?L6bV9fR0D zVb7M+evDn$v#mtN4ccF3QWIQ?Y`A0?S*rub_%37CoyL+H2oaIs7PiP1HnMen#Aho- zgE|I1HKTyL+L00(#uBAl{!Iu58xl;z)QrzGP7Q{Kmj`o$y>?caFdBK_S${i}X9j)FfkrQT;AmxMa zA>};KtAJjZEt!iA4z(f~SFB{G#3g+HiFuPY=btlN;)*DbO)heHyX7M*;i;VBoiSGd z1ndB@7q@F_hHh&NOh^P9zLgibqap8m07C1+fvo91MYA4z#aygr>@W892EbIJl&i9eH;LV6@-XZEE{2r(~svbGhie9%gyx!@gO34ccPOXfFD9dI8^aBgyO^n2e_NW)C`cmRB8Ftg{dzdm`=M@yPN zc>r8Eav07pqkv;kH!Z8HC{;g?c$s=9qODYA?hE1RbfQW96Kc9u$Ylzn9h@3=A)BPG zl)Ag2@l*I)R=v9qB9T{RGAuu;*yX)stH+Q5zF8+neAd0{ui0FV>tnM=C&~^kZvX!sh+YKC(2F?TY!Iw zG31sEwIxBJ0lD(&Ks{+vL&6XZl}>bDBPX^vG+%(-d;6AE>NezBz%0B}uwnKSq?Gov zSP^yOu~X2&^zF@$D#Lu;k0yIZZ+-{IKFa3H+QUjVI*Kn+1q6v)&{b`?7XuCJ4*+04 z0$V6;NO>9?3G!-mIE;m-+o%G$`ea=u%XOShjWkKjB?T@R!YvSia@XsJ9Yy=-VX8^b z@kDfhVOE#2=#^29)b#NRUgA-*yVyv;2wMq#lNK$dlfs|WWPWu3CW!J@P)aZw6x$M? zelv7eUFFw!%p9$-Za4E;(^M1o^Jl5#27h2B$$A873VlWR31cIHOIruO&~|sU50{PH zoSd+iimUr(;=RqH!T^2WqNK@C!f<2{jP0{gQlL#h177aVdPfjNI`@)rF)14c>UVHt zTIMaXSRYG@lpET1inbn8OK*y7xt6R=Jqg@Df#J@DX=6!V(1NRJ40gx9_6bOs!S2t> zO3y2i9OB7#I~0+%5{v+&7`)!^>W z2S6r^cHY=`m&4EJJb9;VseY8nDC0Dwn~cTUiV95qW3?(LmwQUm9G9<1YO5~2pYtld zvO+|Xpf-#?7}XMGJtA`~Iiont+xH-DO}^8I^H+{RiiBOKpn-3Y%j_lWVyYd82sC45 zSt}q+n%RApft&T#zz$id#mXEcF!5l!4Qz03HS+|l4kTL2*8;Kr?sej)^L}HNoNkV) z5z<1|S5(fwH(|VQ!*T&C<(8qTom;qFzEQUN!iFhUH#omrb^qTxpCI;<0#aYA%gT~vZ4x;uM>9WQ`-uIhAn z>67djTtVyuqBpHc^oT_IkT{{0&zTL29HHfbR<_wn#Z zvWZWjU5t^5IXpKyg#oliAbPa#jT&DV+ODp<#VhWrKV|CZ?zWiHTeR- z(vvmuo_U#TG3H}qM{wIj7AnN;?WgBI4yIo4YY8*QZ1UxI)p_WW^9uZ@Y3urOmxgvD zioN9^(8pR6M%g<(Il}c(ljajQS3Kl|V%5tZx1L*CGf%`TzIR3w!0!Qh&9>lQaXUcC z0qS-?)!orn%GniSMIAsJwB-RhuPJb^^=w-cAdw8PJuPVNJEFJ260d?zIhBXO%CW|* zEPtp>c_Le^%D`k0BS2d+9kUY@DnqvQp*vOfzd+9V(D|>TXM)&a!xpS@=88w_Qy|ax z530CCTTjq@8?i4}(JE8|s}q>L*6<2tlp^BP1e{80KD8X=XHOiMJZ!^0gYIpp9%a9Q zd`CZi2T0x0|J9_*D91;zM$AF3+nYZiT+Fx_`(y2=SkLrUw?ow9p|`*idZttI9Fl}+ z`rUaF08{O!+$RmFkY({A%@V;2O%(e2L|ym|)Aaigvo@{n8!Hy9-=h!J=})9_63r-D zm@!_nV4jU`ZFXXYb(sC8xzW*p!gB8GIj6|Dgk^1S_AJ;Q08dt(e#5RN0_pYeSHRPW zq*?&YUf?xk zTU&oQchKlBgc&i3zJ7K;KjLQF<1@2m;6^hpg;PWT3yHUVhGo#>D%9*QbEJa$D8FS@ zFn2OzvPw*_X@*KeYRf$f3|o^Yp8SkejC3-;Lt`{XmLS<>*q6Y7aXl+W-pAH7|7RFm1Z$BK#=ktRhLML`WkkzxsC5U~S7q?ZgJ zC2#@hA(U7KP(Y(}L5WI<0U@Gv4N#g%Xx+wIvPax*K;{Nv(|#kOFbm#&yZeCF2*tni2IEyNAK9E;zUdF**WV`ya8L$uTqoTbC) zsp?FXXUyK2o>F&{kDq#yJL7bx3M_`^?$2Y+M{ewfRYui_PWkcy@6v|5IcP{l>VZ+? z<|*Z&3Hg}b;12DqZyt!5ZR&VN>cGGxeI~j~^Mp-9UcOUMgo<34|1}Go;!S>qSQ|gE zz+;D=jsIBS{d_K8m-KX^$UEG~l7A0xo^pd%%Fb_Sr%cieL1=WCGwUwz*VBpIpi656 z%V7rb%4Wm(wM&fI>7ws^hs?kgZxq+) z;A}aYBKEm+L1s0wg%i`PoWBmp->KWTF4d|L~`M!4xdwqI!0#+nT;)9@GWsMoz}1SFq4>KCgw(L2qecvQ+B*rh?N1S{LH z(+^T;`2`T0N&|&z-YrLyO>|%zx=HsO zGb|80oSv6JaPKh<&T>1euWbC-yd-npwYg}CXu4tiQuNBgpmQa44@+|Z_q*>i1tYdH z9y`Q+xoNZKhzA}u9QU|JTF7=a^MlVI{8LC!4R#LsTLVW0j;a2sU`nz z4LQiHJE$#;HbKoL`{vSOC9gsL&G#`U9SmR zv5zbg#ky!O9ba==*vJS#7o=jR#IUPZaXC%+V&Cji8(gfsm!*9>#w5kc>-}xyxzNMG=iD6 z^Ni2FGZ)Z@x!S65{6+3~&m{7>A45E%OH&XT+J4S^jXZMee?G-N%$KW4-y8{CaBAe& zQm7{ekhAi^cV}(ly^|Bcz9Kkb8ArR97i-v_c_@S2I^*~@`K(vWtiTbUkL>QIExw4j zQ_>24L0alGo?A&=TuIzZKR^5cWQA`6$(&XI)RI)7S_i0ETcIhH3H99m0zJ)1MFXs* zZ>m&Ti!a&I4JYEd+OF@YD&V$Qu#Mmma93no_g=XKx!CHPXXEy}5qS>A@yz=pWsXu= zg@c!0yCqlW#7^^*4-Y(dR!gDghzU81d{8pAfaJ*7F*E9%sF83FIee6)A@?>=4O^B) z7v*>zNC7LJ6OKdZ#m;4EAK_7Dq*x^b0wE6OWgSYnzZF>NSxGpYJDfYST~JDTn2NnT zh^61>2mpN!2^_%dHei|6M0dEXuxYN$aaVWG;RPFNKTx+$YM%N$Keg4zGXJPu+97s+ zPN3zohbpB!$Ib6FNHF4x3!^NmVTZLR*FqR>aEWE&$3Vz8{yX21WhBS7M3x0Sm)K@t z%Cdy`f##9!`6caReVfS~{|^H(GypETGiXwatq^62^X~M4PCq8WS&a&uU7w^RUK*Xm-C|!hhMj*0VqnA5Sx7()h4Tff%n>p<-Y})E`)|_6e=x@lR*5fcDt4<{<&P&rXML_|+Y50FvuC zOQZcM3+dJKrAwMZxLO zFd_WPKf5L_J)zF)0(1H}_sSY#E4k~46`G4$y7jI@`w-f6p*&TwU0A1Ro{}%to%>7l zz&{GdKHGffQ^*^PTxww>f|X?#{yDLUld^dR@$v*0n%O;%Z*AfI`Fd#L!N!H)9to4P z9I`3_Usni35DohoSH)vBCke*s?Q*l)IX%O~#ZwOqcO6fH$;+5W)*44$NjPpC5U|`s zaAI4%01-SDh+svK{r%6UGL=$bSPm?f6F(;I=HQab+C0H@!12P`JRw>30AoL3E4=pH z=JunW0?fl@7qkN=LVp%104gaA{}WKb*09yjN)-9L(06Sm-b*{}_6%xMm67k@Zu>r!e%mnm z-pXrGnW$yyWe2kpo~o~qq;483YJN2Y_4ew;m*o;(4_)u7G$JlH_?UdQcX@LkF`WK% z7?qWC^>OiNjK^x& zZZ&es<0Q$EuHm(^RrTQYePW7qQ!4)DRCcf?Rj9Cl0D;aXEWkm99 zzPtLAHERP8mDZ%zm>Cllc0agc^70|*wU*9j3Ay0Z*6n3lXue&PG0N(7xACP?(E<4GgN!X*IN$BC3u^ZV4$hZ-6mR-enV#wY zfP&S+#$(X!pm1|JVu)l5@`oFj&p-ei@!T_OT{8TIc6tqqwngs2GOsi;*Fp6dJ zDK0Vvw>+s17nUCHo9rrKh-vbgwNUG=esYugyk-!Sb@MbNA7UxkY&rTc{Q}0MU6ZM1 zeI9IDiJiFV4d&;kLr~gZ@O{rg)6%U>P{ky&ob8QilVpaVw)LHk8OY|ox!CI_MB>lU zkYX+zv&=o9k*j=MA{T1S9eQA+)JRhcmK-kFu6sE!%khBV0j(I})-nbuOwmFl)orG< zRt&62SqA|w`To-jDqAh|T(^g$x7&^Z-G`WJ_v&_ zO*`8(`Fl^sf$CvT$PnMu0DqIQn9i$6Z0;fyMyAHgE*)Jpx(Tai??UPtS-W_LeUoHD zrc4&o-M2`G(3JUsCSgaNMZ!Ys#Z-~#yHz9FXICsZwuTH+5rw`_hoe3S{4AVH40erV z;=MG6bA(g#j5~}{nBSSFJ2F&k{SW`99YxlDB&hHfMU(BPEOOn?j5l-n<*H3yRIHG< z8O0468GVQ^u|pM>l(KuEek!?9s?4o;E=~y(z>ymtzsmb)L?c__@iH#H7C0UK)3CHW zk^!&c8pe3v76_w5UM=u`OU9yFb&LF>IuL*Wmj-_$-ulEJmXUvoJ5JES_mQ1>LhZb1 zSq83V{8#gNr#oVefepmI^fpo>dUt31@J%FK9A6Apku{_|Hjp(nq zhXrK!1p61bgleDd@S8Q1!bZVr`-e!&-eWgHUcYmPlZ{&wG zP4j>TBh@K-xU}#`@Z{;!eW#!R-9{wa%a?jd3C|3hPvXSQgyJ2q6V6||K3*$7jUqt% zv~AR3ZBw~tuDiP{WMFhzCfN7-GQzf#AQoahdlx$&&$zF$>>@NO z>*zmiM1Fnm#9iA&fDtfN{_!7v$))(;mbvk!u7WJ+tofT;8{*R|N`-;v_Lo5U+*mS< zx5M}0-ZqeZY*T|(WS2qugF#RF^VoXYDY2}a*NyV$^)OFUcjN@mpk3vyr zR4{3N8FiIUrMq5VpeJ#UAj`dq7#&~p14YYHREu4iY|=PEUE`{D-rsg1Hs*{2Ogz!1U*w!W?4np; zI^a$|T3mc6yJHxxUGlt6GR}SWS~)$!^5G@_B1_apM^XYVfwHX^7z=kv0e7_Z=N?~UkexA**JUAx~3MHKXjYoY8b9~8Zz~r zkE@JfZ*kJKm6+2V3@f@FdK8T;_hETx88JQI#kWg-+h4Sx;1a&O+9%qBT|x3Fm>Or2 z6!^EDCkJe|DatCOg({4}F5Is&t($*ke>mu5_0zaR4fxX|ef8#(8L62#{B9)1llD?3 zKJj39_Ql37^$C2cbuat6ZTrg+IqTKWA+CleBe(dt=YqdTkndqkPh7Noso40dRQbHz zRkz>OAMceTUwYqnTbwhL!9M3^k*PCz(O_nAkBj=y^%#8#>&SZFGsLMcIEj~o^6ax7 zM9%R1q!LJefSw;K(NUX#_GXWcCu&WONfxhF0=xDv8~C5cYkz+??gZ{v0W1hGna7UF z=XNNeWb|cLge-cWKRWuVRsr>K<1N@DVdD&KEpddxv(sbPo~>&|flHNGvU7AFkgmmw zb7VfY0pSt9=~AOh;p10}V&cfzCFaH0ZI?@Muxs2NF?XpINpEfYXLJx%xk za3yHQ<}u-`{5IJBaL}ole5JM>GjoN|nIkA}3}1i%>xQDl6T#X|z!&JiJOlSSnj2SXiIoQKWDcz+mx+BGgA7Mx)0P@NDI7{TCLLF+BLOQXNQP?n`nXV>12pL+=5SMY* zaw%iUl+PhE;^z%`{c5qoqx&Y+6$%XCWl6K+H{ zwpn!nY$pAjBf>;+`~^HhC4zZ=^3RJ9D&YlUlXkxFX>hkQTQkH{0(6Z6qsfzIJfUYg zr^LiB@V*qWjIrgKuZnE`kf-sm{8WSZh0b(~sDNxwdWasz+(wpd-%mFgYG$H&Gl}T_ zD_{n9nC|PIubCF2bIpvnY1%SK+IV83>9vrk#**;fzLRt4seog9_ew9&%3iQ9*)j*< zqC8bJ;Uiq~gY37@YT3xQZpa%8+TETiGxX;7)kS$$N%{AmP*F4pm7A)^m?xz2!}E|%@<6!qf9hk)D}vpiAN zTcW|eAKHzPVY6lj8GUd27j~2ZFNiakkO-d8KKt{dSIT6UW`N*~>Wns%fd29!P%FqKpf4{@PD_z{BPSt=VhlL49{xp_E{LFPpLVx#q1hey!&eF z`96;dulG{si+$t}x5>Jd6HCIZ@j+~Kk?m<*wPe>)={Vkjt+0Ai9fp@w>5ItvQHx|D%y_C|t3*z6~ijukE3j21yt6Fw)aa45fjU}U_I(CKTW z2OghKKjm`T@Z&T8XKa4rCyE3J>3+>}9C#*v78r`Zwl*cJs5rzNd$SVIdU0jTZTdFY zE+%t0_z7Dt*msTsTr;l7@V?#6OcKcOW6qND;{9wwP{SpP|x z{lEMUrSe2M{0y^CD0K_i{tWFT8X!1OG+6*lhcR)`eeorSH@-GY_ zeVNRNu53v|KrW|6AGJz8lAlpGQ-q^xzkt{~Z7V`724?_=@j*!exqRhZ!Rsz1)Z*~^xqCmMaY{AtEv=qXp~1<@q?yf~s!<#q1| hhw4Q+*+Bq!P=}`fn0(`3D)|1Cl;i)o9sa%hzX1BhAPoQj diff --git a/img/ROI_example_settings.jpg b/img/ROI_example_settings.jpg deleted file mode 100644 index b7c30e814579a4e10525ab4ecebcb17fdd5f98e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11437 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 aE&1HK_Y!cAtE=2-Kt9z)Oy(|g;(q}5?0nb& diff --git a/img/alignment_not_okay.jpg b/img/alignment_not_okay.jpg deleted file mode 100644 index 813968c76776925ac7fa9644ee902c01f12f830e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13928 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 diff --git a/img/alignment_okay.jpg b/img/alignment_okay.jpg deleted file mode 100644 index 80d9ae489cb1fc4db252d68c9f799837a1c2c70d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11299 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 WXJ>S7@0ipuDWEFQRdiAE|C<1KgVXr{ diff --git a/img/ana-cont/examp-ana2.jpg b/img/ana-cont/examp-ana2.jpg deleted file mode 100644 index defce2b1f8fd28311abd808bce8887192e31274c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1196 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tR|W=16jCP7AKLB{__7-Se2n3$MB&V>V@YnhnY899Kmx&jPL zjLb}|%*-sz5P3!>W(F2PRv|WFMaMwH#6l4zBT=WuiAe`P0F_HIGB5)X+$3NaFab5P zvH|7f1%VbZF|wja3No`O3JDuJ2L8Xrzys9EB*-ktV9)St(Wd&{&FRrs$E-09xJMGjL<%P#GmN2ni>rFRNtA4q352LqOrQi97 zjz`rqw%syYSXs(+>mcqv0RyD4&z%7E8q7o ze@$I;F*T=w1UFn9sJx1njvb_l|MTPbzsn@)n`24~b_axMtN_Q;mGtc$9)AWMrj@JB>HWRG- z9mQtnYCsMf2AI1Q?itdv9{y9b40$#)!_lRrJU!wJA#tZAwO5Y zm3q_bAFyp6w?!1wj*97-1$T>zw06X5Tlp@T7Pd&$v$Ql*Ihu26BBx=Ke{kRYS6$av z#ca+hPYsxAY{^n_Cu6z#;vKJf6nC^eS#d~qP2rE``~Nysvv8Fy!- zsoq|Be5v6%p^(%9Nr{BMW0NYn=ck>_uX?k~AoqTtg!Lokk1XF9zAs`fzjSbIX4ds3 zCmt)#Sa*#@?(tcjmooOtvaFZ&#LjTz5b9mH`OzGchgq{SV(mib8F6!(zq{ujGx>9f zjXu}fw^t@a){5?0ueykb!$@0ZV*jgFZIiytqe1D@q~@r1s9nsts@%j;uc~bQyYYjT z+SZKRoOjZ}^Q>Q{_c%(;X!>&Asb=DwXPX{nn*25Ta6fYC#;e~R1_p@L%-eZ<`N+it+sQJLB+866wCO^B$$J!>L+?l8v=+xXF!xQM2oiDT^Q0f6sRiN92 zX<-GrN6uE33eIvC+Q8M?$L@D%?sLXP35RX1FS=@+c^Ffv{BloFuwU60r=l?C)9lN) zhL|m`(amGO7W3fLlfLXy%b$z7loh+%1tWF4wI)4(r&9IxeXQEm&}2pjhAIY)Mg0p^ OpPcK`SaYEM|4jf5PST_R diff --git a/img/ana-cont/examp-ana3.jpg b/img/ana-cont/examp-ana3.jpg deleted file mode 100644 index 39a35582fac6cea8c468081a6c0571022a084c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1320 zcmb8ne>~H99Ki9{jVUVlmW8)`NJYpA@;u{D_KbkzXxwE{O+~ z$FS16R5qLRm}xYY45?wi++v#zC^!L5qf4<-Er(w{b1Ezs~0e%320D$HP z7={1`;4oMm7K6iKad8Ad$%w8%JBp4-VF3vYm^agVPd* zGsDVund>sTt0SF3|As(#JRT;%W-x35XT~Vst2{m}cAwi17)E`s53UH8?PkT%)YO2T33R*2{Y$#m zCS{4M$+Pl~=i%lCaPn=%ZfiO&T~Jz;(z7+K*9(Tz|ANBn zGGu*vb$_YvkB^Le#LW6>j{f9m7}NF?&tw=0VYm0KbGEJd)_2YdM|Y()O!5IaO2FFMbYxd`P+T*f?s_^kDL*Hy^yu+x(Ko zNitO&XS)w9O(`AUA}ry(YBxSh<7IL3V`WMyt~UO+nc~}*gJKd3olggtr^go7%J1~L z##UJth!VSxR=y*5ih0Q%yL5Ye7nD6ZdZKUW>L+o(%Rat9=gVr25pBN9ZJ0!VoqNl# z)Lmc&h_&6U8xj87^F0NhtA;&qb||ABjA%2??WY@`viA_wANwLz4#n~G)Az=jEuO3# zcl&#wB+|?yNR>$+yl!(z7e~JqRyTv`fvEYGqVx~GNqRmdaf%b;d1JcbP~#aZn!|;{ z=(ac7gxRNSB|<$b=LC`eayWuf6ypA(*yPo%X6)8#URQD@_rS*)!I`bW$4|5Oj#MT2 zDsL;vntQ)@?#k)N&B$6Ja-ULTUkk9(y2gJlrWS^`+}Ch}TJ=rYHccKqQuHSIOxVo{ zpNI`a{5CUMx=44eMsiLWuD^}YB2ycHN<14*)ec8Ij^B6bd`3(3x>bcLQl3QK?wdV2 zOh^=!_}nZ{R`jhTR298k6PdS~#^7a@7QZSFR0C$jfz>W7Rrr1IY3>K%Ydt0#W0x;sqPDTrAWOI#Z7b855HT%{F# zskoBWo3v(h(%d6-&^o^%4@)gZTXlJrk%BoIW{=(MxsZ`mRRz^Az+3KB8K`Dua`_Ir m`~KRa6}e*%whgMS<5pzmDy-Ok^x~=L3ZYeAE?r`8c=j*KaUrh& diff --git a/img/ana-cont/examp-ana4.jpg b/img/ana-cont/examp-ana4.jpg deleted file mode 100644 index e8b16dc718e0161dfc95f75baeb92558a617b6f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1248 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tR|W=16jCP7AKLB{__7^E2(n3x$s&V>V3W)?PfCXl3o00R>v zGczO5@yrkvj7-c7EP|{;iiW}>j)94VY)VFr6WNuW7CIlicnGLNk`ZJa+$bP}k%@ts zg%v2JAPACUU|>hc0!#!@KLhdJ0@VojRE8xN~M7 zgIww4$pNz?C#Cj2-PEMqG~Z_v^TnONLO#EK<0xu+_0avhCno8=(7oyTylwJ2!$<6= zYX7dZKT;lh&9FG9;ch|qF~38H%OxcbJf9U-btpM8nfbkU#F=?U7I&WC?N|RC87sak z%gU$UbdONmjyW4rSa?nysgGE;eudXBiCw$;H_hH)w5#M+*^}R4;$QAP;Ffi>Jzk!t zV)H|k`9Fi&>eMtHp%V5;)YW-2NyMLw~DXzmQa2BXp-h<@@z4Ayvfurx zUMcI2>?NT$4(DC$VX`W<`BnN^wA^n8yT>Mb|2GSiPdq3L@%?iWaq&nvH*-g9iHt>;ji#G^ z{Pvz5dC|vg4a>!SUxNyFH*uW5w{!cUc&=AwyRHcPifnLanY-9zj&MKY^I2!J&ad1a z%;)9ay3O|c{=Uhp@0#wNGHLay97&xA8<=fASY5i~Tb-J(GM!i0h*_asLjC@n+WjVn zz7>n`ykbneV4NWQ-dpL)!&&#lCtgyYZXGzAWkP|w>B6%q?@VrA*)cWud1-4zOYD({ z#RvWb2H$;s(Y4eheU-Jozp|^W+Fhr697ro%LO@)kKp9)Eu(?RTpS z@4R`pPO-ygRqMAt?gKuJL#7O$oU0cKht5y8C<8dX}tM*S>1Q36nryS#93s zF+Qf;9W9qQE^b)4;{m^8NU8SBhnJ>rniul-`mdP&XBmrT*?H71Io6phyhv;J3Y`N9 W8$a8XCV6Qro!6tZs7pin|4jfbX#AA` diff --git a/img/ana-cont/examp-ana5.jpg b/img/ana-cont/examp-ana5.jpg deleted file mode 100644 index 010939b3619a675ab7061bcd97b0f782acf5a93b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1222 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 diff --git a/img/ana-examp.jpg b/img/ana-examp.jpg deleted file mode 100644 index 6f67d1a899e9d452c37f88d0bb8bfafb0d7102e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1604 zcmb7;Ydn(+9LJw$k8OL0E2-r83+kM@P9c7gJduO9HC4yQ*orL>TL3hI-5bRdb8cTSxwK$ zpDmR%K&b@%rw;&RKsXFSAf=Fm0YDj;l>hh!e6NIKlu0UPn;h8^9-ts~VHgMlH~{2h z{3SvY;lWIj1elr6!Up6q8P$Wv+*)7T2l46HvLib=;jQQ7EAGCYBbqF)vk=P9hFJ>s zzcCg(c)q1CA>(g_mDKyZMMJ+5O5;To|m5-&Aoa=8TB5P2XD+FxK!f5oX1iQ07) z3zC9Q7xV~Ysw2!>ZI#p#b#>wnCz3P!z1Uy+Rp$qUw1%zXHMM9$nDbkswG?rZ=pnDn z{@oWIx_?-=Y?|pw<5b3(Q$zF54^8zJlrwhPh9=#blmLEwa*a#P?^)I1S>mW$=SJDs zEI-n^&v_a`>xDMt@WD?Fhb=YKeHvZIQVV~&aLCgqJVH+^iJwYJ?Kd{(;9Yxp*{frm zz^2tldacQ^^Wjf^V|rI_$f1a%ogH?9s{-HESVXEOown4!kHinS^73*_FwJx~hIPj# zgT3W?z;MBWY8HS9y+S?5y|HX9ThRnV2OVO+|6vG{n6u>Kd=O2bc&NnPDouw zVXkcHX_Hzm&FE3N%^W8@t6S5f-PcjGd{AhYJl!j{v#UN{EvKdTSY`d3j0C_x9-1ic zNlOvmTMljSLZq-!s_64j z;O^j;2DdRZoznKLVa-<`4hB`Nq8f^)Vzu7f_lRM+kGsuM`%;PMZv?g4p`-6bs7oaN z`vPy%)3(qjg5Un~{Ewcv&hdbJ%L^M9&7KABPhOxO8q3KT2S;L-{XEMy6MFShBf0Es zH1l?Sdj1~$p}_9!kenBTdnXtJri#?i0=Y(~bx#(ibx#PHTGXaj^p&ZW(cB%jHqqTL z`tP{9)jQv)uqg*jsl$xEVP)B)X>n0%*QkxGvrTL4>4F1$OKJv6Kbdrhuk9+a4w!>F zUANqP+F!qCF}C9Tec3DnV{(G%)ECP{9HHfR|StO zd3X)K?qdM@OeVKBy#Dop&7!J(N3bF39Ca6HTXS zBT6fo$;Gq7+v39<&@NSOcS?Bl1~c_M`@>;TwQZl%@?)-VVg=b3lGsLcMqsiJ&i%xi RejBj7F3e=r0#hs*`Uhkzw=4hv diff --git a/img/bw_not_okay_big.jpg b/img/bw_not_okay_big.jpg deleted file mode 100644 index 3e94ac31baae8359f801187640f9bf6737888f26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12658 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 A`v3p{ diff --git a/img/bw_okay.jpg b/img/bw_okay.jpg deleted file mode 100644 index 322618ed8c0d84a094dfbb391e0ac1cb5bb11449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7681 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 diff --git a/img/correct_algo_1.jpg b/img/correct_algo_1.jpg deleted file mode 100644 index 9c9edb7adeb73ba3b0b5fc46ea4c31b714b55063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71006 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 eMjDHz>{`LVs;{eivS@l z0TC?$z6Ia{00I(F+Mfdd`XL|$Wh5mdKSMzY{-Ep}KuADDL`Y2ZQ)=+nfnYsAOiOb9 z!quCkbUF{oF1pcQdm8_Voaa_iBZF=~l2`nZ`?E6?j7-cdtbF_emo5uRNJ>dxzagV^ zTUkX_P5qAEeSHH%BV!Y*$JREscJ>Y)o?hNQP+z~0=b>TY5icSW5?{SeN`CV;<#Sqk zMrKy_mz?5~(z5c3%Bt$7=9bpB_KwbP1A{}uBco$K#^>f27MGS+R@c^1yL%Us|n|9HH?II*5CL$*L*)9S?AFvS75|doGN_zgL4%tIDx{KGIlGERc z|5Vg?hDTf%$?(X%pMsHBVvY~>vuS^8*#W1*;imDxeu2X>9!TEk$JrhE;(-nv*TJ&ou^G*S&yhmu$H9N{>_3z3kLrm& zV7&6DpviN1Ak52uAm1OBX=<*eFrnvOEPy+l4{!fYm5#|LR5THiA!!@HVkF5p;LoNPxhUUM{2toLR zIh3XOqf-Dc`pJ}Qb_7Fu?slCY$#gV3)Bbf8O#;>l5AdWm;DLvfai`3~n=>Ud*cXR0 z2e_GIQ5h7R4c4)QfQ_EEv$+~efOf*Q6%}3!VYVL9Puh#2QOnd#3k0b z;eldR?7Nvz$kq-XxU*c)yugJ`;9`f3QJmlb_327H@Ph}ZxzhwkAL4-w4?}5egGJn) zYF8gl6^REB*FZI#^#`A7E->_G&;DPjXZLBGIpR||&zWLfiG4}2=@^TV2ZusM)51X0 zg(E6MD|6r;g}w z7Uyu{u(6;nJaE^~+V(qvGX1@OSI9b3rSL#}mj(ESPX4AE4JA9+NT!(s?B7%a@kgrh zZ@V!Fh6frI8y1W0X3#)5*ju8G`-BY;JTUvwa@SbGp}AS~%;u{xyfRU0y>gGoL1!BmVJo`_JP#$Nu-KK>#?o z5+g8RhySVuA5!`;;4l=RMJ4}gNQ7j9srpkceI$~w0nK+0%jZZyT*dD5?@k_xwYB4f zMEr3L+mL-L!(v=t7Vh%jtpRj2reV>2v|$6cfCp40{lzxHp?5L#@DwJEi;4}Fhy2OS z#Vr9?qax&=^ILLT;Mi{8 zw|z?AnKPgx|fQkF>S|BU=3B`lc;#m+o4bN-X zZ_hMv0%Rp@-YNg3?|=^rE=TNTJI8ncG`IaR7F{O_;Qah45D!>_Ht6#Lf)$m8jWq!k zViLC6hOjz?gJVty^Z*dc;P2hOlV#gP588bs`;+f_P#>NJ!#W@LH*6Bn;9i-H&b&r4 zZJqvIOQ^tk#0{KB{)*xJ|4&N{AdzxbpP&NTC*BRYKkU$Nzb2u*BCg`r7qRVQk5lY# z$nx?J7}~Tl>>kE7xX@7B%Wh%$(x;%Y3mFtB{U}xf*d@eY$VUGhQD>`O?bGq;gjbvOBq(YXkL@5$MLoeTO`U?Oymn zqrM%!twAv049c+$Lba$j*FbBrh9pX~>02@7bccB!DQaf}C!+%jz-c{4K#dD4 z#)s$Akc7%%+uie=WbR6-7?bsOSKPJtOS&m5nlqZX1$HU>TRQiWtFe7Wb_L>JEm`DP zP*R`)CtrzpazGhVlhR$0>>g5OXL**)!Yx*2)Yeky`knVxHhI`ShikfqQPrSd_3`6> z-~$rvoy@CZ->bG+p3oS>*5dBwjSpbr|2{lMetKI%;unJ%Bkx9DyF_4@-jVj_2Skf_ zfc2l9C&&*xfKz7s)q8@@#E|2G=l?Xj!b^_0kP$Pm(LLB|pUK$+%>qG0--xDSZ4-EYzjXwav|3 zrK+KF%5yUjGA;9aig90kM!jVY$_rl5kF-q@hnWc#+NECOU}wJ~AHfay1v2yo+(4CD zo(~}Vh{>6`JLKu;WYa6V`ozm_KsGxq-bdg~_I6II+Vx4dR9APQw2y?5mwr>`0|HTL zjh0mU$t@P#rNz|~l}2eS&PJTiZwJ@Y6kP2yIVx$Nsc6|fO2SbfS3~_MPoFFvG`3u= zm_Gx%i*VR4ta27&!7@wLY}W53l#9mD%&VQS8talzt8-Yz5ZHKMry$eSerO@Kurq!# z*Y~vhrRloUyyL;b<}o+jC3yvVb=qjo%10_R47(ShiRPHbbWCCk{9J%$u0slG*vq7W z%_TLtqh)U+S~{24%p~ge6ym^}MuCeo6d36yg{$8K96hq$N<1Ij?=p>WmfZNyTh}3gCM@Ng7P~?z3zNPeFhD=@7BE^TBLNc|L5O`sU7o=|;ZpX&dW0 z+9pL;Uizv4=kSC&(n`N#SZuCxSRyx2@LLnLmZsa{s~>OpDHn^kqB}H_#+ht3L)u8~ zc`@QSCT0$r{yFyEGV(F`WebkFwLOl)hRnNE4=>sqHT1M6x3x`08;;G{TVs?R&WQD8 zneXHb25OU*qV#8W*kGdvU%u*CR5>BNg}|_Ece>dlGovT0%GU)pPvpJxC@FqoqL|~` zStYqQ_p;5SLffDW5_lklsKtcqdFDVFv&fF52DJ)qH}H;&=*aag8!tY!yV+xJWowQN zZAb0Kw+3kGf55gmVbV1HR6^{BrAQ6*1vi zN9}waoXa};WGACSU~FjX)Y9IQf>jWvP*et5Nvp30#5D$=KTb3xcuNLuL*zrNHV&C<57w;})8V9%ES$Q`*k}XjrUu@9Y`iDn9Cj2LqCNokDG86iM$~&1rcv zdBQ_yDH8e3?Tx&HlGcX)sbA_ayB7r>peoz!GX*`ccG+jYGa|n=D*rg9>Fax8x$6dD zfo;lL+W(k&zWwUY6_rAmS8=@N`gvjomYX$Sgm-R7^fU7*Qj(q} zXd{=cKIeXho}fh88e`cq?h{=~DdMR1p}=#ZWsm#q95kvxt#|a^S9Z7fjz)IYq2E}! zOCM2QR?`*huMLV?SVj z{NJG%7&NjS!Ck}BMjQ=%31w%fu{=3Wn>HKv(5DnW^3vdG` zHldwU0Y5OXcpP^m-9Q1Gn8Cg7F%SO}6u{*usE%tnE*XxEo5KSZ;0w?A`V)hx*3SM< z02m4k9G#9);;cB)54h3qB!+98+lhKRh_%j24{*4;y6WGeCY8LQ5@hKTgM}nQvXPtmWd`RrUy{`41{<&4M=+ z%XU%)F$A*>OqiUNmI|rr@??a0Ge_O@r@1NEz5a|^wY{YmJ?~Mz6GZ1SHCu0TKXB85 zCZj!&G?5~kB1;1Zi70=L8=euLk<&%~X_t%5Hp^cc_nb@M>vB?^Wb)r4@_$U^F~{|y zw1Fi+1esd#d4nmHdjL^d4*4$nbt=}ZO+hM1=N7|UH$SoO^M zkP0&>Jh0V2iw9^x&w-_=2Bkl~c&51Hpv=mLmi27e;s@~eOH^H=&PwszcOv3%GA z`>pn|eMP5T@oBTSXWGfA2v#C@WrQ{hs~9OMZM(Wp>R{Ayq~+ET`5BwFA(*#u!Yw6N z*VS+ErmjfnDEqJReU_{1MKoGSM>Tu1_9kYpHH;shEn?+c%F$fB%X!V@^2KCFV(UkK zxrCI2H#*AYd@}5-nO=AXa@|Vl?K3K_D4X$st#rq5eCvJeO`B6B>kZ@t16hd)lbTPU zwoNh>(PDh%15QETzqbtb2`8jqX=IH~PB0XVM?5JZNFdWCaUV)kme%!qGMz6XVp~_u zV>grk17}E*5Y`2b)ha~{g;v=c&zx?taC<*~TxCbGb+kxw*PQJcd5#WG$eI8eIT|hvj9ayNd(O0EbdRv+A zQh@N^b3oKhfiT>ekuTP;u8cgt{FQdoI_*ZZiQFzG_M5-Fh-WFQb_DBq+kIuh7?GkE z6&xA*!Cq8MhOd-%dKtgU&G}Yr@88nwHYE z@nS1eJgr#*0J);nHp!_sPu3!U$}`ZR?4vVNb?)s>15&qhhhF)be!tA3L`56FqoM50%+V06AO)S7i+jx#j#cta8!nl z<-y6KYu*c==X3eSvZng z=nJBKl`mmro$U=TRP><}N}G;8LF&MOJ!D&Gyq*g;#ziYfyL8hB#ue##@b$_DP}-coLUi@9@-53RdQ z&Wd#(ULMIZws>D)0=hS^eg<%V2ryx>m{+ici$NfUKIZoetZcoV4|xIKb+i13n^U|> z;GEg#zaP?t#9V(FI>THU2}WZnBjql zS_Z3mCy(ap{GkfkNjslw=BC2JpEy#bqQgnld8qtodjMa}_E^#F0QGrIBF$m1K8m$e zwySF?o}66B#gs@{a@vZ!^WzWbo%LzIsC?y3RpB45zX+{&Ig1f67;*AKkgpjg>1h<0 z+f^G?Ruxq#liZHiV9#eK7LKXudUW=y5uy4{8BJJG=e*FCquOYh3$?{M#k0c`>CGLE zF7ENzPPuD9qifBp%iL5egjvJ2WFn_^c?K4jM)x057nOOJRmOVAc#EMUmX6vXGIO!p z>P@pmR!!9j4%2J{J3K?5Mi~9=W=?MXkWzJf%~h-4IZk8tcp<~VIj?~V73u)_wT*-Yem4BlOR~< zqkcTFN%RwYGn~;!ifw^86}~7{Fd6fA?Ctgc!w4;VR%=vOjP#ssbitMYI0k1_YLi&z z+~e5t&g#Do=YB>&?AfY>2Pm?@^a*_CJZw(q3m({2=3;?>z{kq3z{l9=qc1X^k7mbf z{QY>yn7^eh8}?Se%8;-M+qq(U%d! z;xLKewK3YD<9rDZgzA091ARL$Ajs??&?&!I!+Pns)nx_dPh+ipWH{+I^P8LM{QkM# z5<0&;hVvVI7g4#;Fn52o0R*|Uv4WBioLU-=K`RPWg?e5*(3GYJf;y3#c4-?74IfT7 zg%QL|F92TPQsa z3Pq+zGtlqgP+Dt?CW?(voZ(MW^ZD#DQD!y}}L@{~7hrK&Ze zYjs}Ip|1lQ;F4r~@qw<H3B6No_D}fzGd2zDf@~u z>e{(kf1*ebNCHQUkl0&~Svc)UjI5biY}GupO>vVzX?qx5X~ExYQ0kaPc9^!ZVa@Pm zLvv58<%l$LBfuA#+-6CY?t)PdkoClk7jf=1XY%Dk1CB}NnE5u_O+SU{Cr+W1VY-9 z&l#)R`a0&cGIl)AvkjA->N;OV%6Ng7J6kA0>C#47-wT6d{kT{$3B;}=#|VAKw;`}#-kzuN{$)pj3vQg2C?>RNvAVAJQV6*dj}&sN>KM@ zc8IZ-|czsFd@ zM*RAL<0qEgq+684BGJwljGm4H$M<2jP4b=-qpBQUo5x0oeD!@?0eo#_rQd0O;~gaz zr`@r1i|mgB|1D|F+NTFxw4dy3&kKw{Fr8YX&&yVveC~YjK2hnQWFM=&)!g{RYJY3? zsvgu@_?_mvRz~mdCX>&*6F`G4_sHObjUKmaw!FXLv7p{$APx=Ijc zqT=J%UX)L4nakOpOh-;8ltGFd8yI} zh?L6T*&Pvj7pSoAZ|_W!?x9L~O>Xh=ZE|K&Raw6w95*tvV(!L#xM}|ZHLJa0fZIAF zf=FhCh2U#P5AE0f=dXMdcfCg)YkUS>llapUy^rvKxm=v#=|?72WbE4vsBLor+udPX z7=4vK!7VfD@**0=c+v%~-9aR$fJqP!ia%|>=aIRd{(G~TJ4I<~Md?-!7u$jbgFlk! zv!5M)YmPAy4P`hZTaV~o&eysBF2TSY1bGWeKw`%rvM;m@!Me`%0EvtD&!1W(jcsF0 z?CQI_^S7^}H&~NwDC*Pa>r;?qn*#IsF5fCqHo1;- zxmM3cyx&w;^He91bt!FAo(ipLhc}eaG&h7()1yt!JNUhV^5_hARKK~h+Ew{PX*;rP zkGX)Sac=vI|4x@n12*nate!_vz$2!(jG71g?CNWI4_GtFTA&@6PT@t63b`QJl~~u z;+Ev$#@A)$>v;aP{>ma`3hSZBxuz`b#g+}SUO;E_Cllu19as|LW?;KUrLYqK?12m> zhQqdX3>zAh2L!G_NA_>X)km6Dt-pZnorU}f+2kQA4yR5N3)v(I!~^L&X0Xk8JivcA zr+wlN=4PsL-{C9~sz+%{D(KWr*P*E31&mMuvHKzc$Fpyl4YC?~9Y9VA@MlG`|FMedy>HDVMvrON zEF@7xXjP2cLR*68fOfbfBS^lgqlyYht+Fe$dXk!6pq=k8&rrvD;JUkvNE;hmdxxnIlj*>sT8pT~oWvdq_* z)~`9a%-TI}&o%(!x35bc?-*O~A~T~FsBh#+PVs|ygn)wbKBZvDIuTLG_6eO>IQHskIC0$&S{&z5!jzpz-k1Qk!S3-Czx*A5_a2$99??jB7iH>$B9qIz^?lkHvJg|z z7M@orp=sJN4?;ihfWuq&Jz!(Y?_FD;1QC0_T4u<=BWy~S%>(T!O`~s zBF9YZ?a}=YGBkAd$F^w4HDsUs{E`{foLyeXKBa*G`+1Gf0g2|1 zrXM69gd5k@UA=wi$~%2aB&T#&y;J{@cW{=g`%P90!SDMG;q{c5xGbf)gVFsS@mBO2 zN!?^gME+3Yb;Fk}-xh%hvfc*q%e?yvJXQ-kbZb7~8xG;)eJ?w& zvAFR*K(I7s5V=2*`z{wk=g3$gea&~UhXk9wTYt4K;z`Ma_{3gnk6O-)njTtf zrn$qpffMopJwZk47X4*A{ay`NqA9tX$Q`wka2;e|QEIbFH3}W~L_eLHFGt({vgf4g z{XG`8Z0L+XHkzd#Q zJq5BR#zUvJqViebt#zoVsKTg(``zy1o-j^FLf-)KfOhzsYluwKE#!gMP%aIv6ARrd5uIBBEC3T$J(Xfu@DzgE=t-?|V`p*tOdi zh=+R^k7wrl=2@uwf3eW^_ncFjG`}+-OG02M+%5nB^1%#)s^n{Bm+Rj7SL99vZXy~y z1YaK|>g-yM&Ki8Kp&UBvRiL~lDbYH|Fa@pNO(lrvHtjYzL0I3diY zHN#A_*r=?JdxzEN-B`7Cs|wF1&zdf3wZX`7z83KL;n0=#6k%!9uC<9dAV{*Ci!o8p zco5$bTvEdsOwb9rgVqLuIw7=JpCxV4SM@A|GsKe{k6Zc0d%1y5xDAE;#tsbumIs^~ zh1|HpY9Y3n3RC&+*^evTRtIm0Hm|o;A7eHR>Gk0?Vc~+?2OtEJdcdAaJ5q{R4Op4w z8uMx7WZ5l{Q*!f~-&krCat-QpAeX;=$vr4`Q$BZQKafrfxeaFsd;QQc)2QVtNB(;u zdi8yMfTBh@AdH8>l0npA&|QA~zJ0$z78^*eGs|rJ1B%=~Q|HK5`dW65t|Ouw(4571 zV36~zv3@Q}7N;fj4?>Op9~xg@)wp^pJn+OJetI=i$Vx8QtZDM%N?z2d>XP}+bF6^X z?5T)wUZOx=$(5rF7d;$DuEW2_W`t&86B}UG1tj_WN(;aso`SSD#F4NGYg1dt- zJrUr-0}7UtZh`*PU=&Nczr?V|g_R@vI17>9w9J#APuM%m(sKR%vO`4C`wNyrCQb#$dm>dm4_DVAkcBF~Ar^<W(30|ma- z7X?9b_JPhu_V4d>nh5q7{Mt###+b_yCe9Jl`8TpO3?r1O#e@$L z9-vJA zX7->1@<(K8=jC&kK~&-EaVY$)+bn`sHIRAH{&?&MzkFu&!?=%^>bIur2R_%yiCRZB z;sH|UsR|HzF+HP1i)z=~g|*F4WA%~KFrk)XlI>_pV$&CCQ_h=yByZiL14C@8zIt>l z8g3l4mKrAQ-gG;!O&qDe5U(V3d7WHd85-9@Gd43f6C?Ly^T}gm=Eru0py;OSFE*)& znNhg)FA8Po>lT-z4&Clmq=0T`V}7D!K1;ycqZva_5gI*|R=UI%lVL^lH#|*u?N4TBl z#YYd+WKXFp|1Vb{oZW~4tY7^l9VCPbcHt_saL)v%V2Y}9s>|o6zppv|Q!SAJ#O*-85`CXa(1U(CLYV#>%FlWxzOhWnmxrXLtJ9_Lk&@il;$903pUH zABqQBXfZw-L&Ba@Qq#*ue6LOBwv=+>S+DApOY==oT&`G7WVeH5yV* z$MFm?-5D5ulyK9-y}vf+t?~u;_#2aB7BY*`*bgT+p+4HE@FsB00p#ZJR??pOu$*#+ z(X?s9R1%A4)T?-!A_E>&0c(59cxK2v{24gzYYqMRcB1Opu^MH?vAgaX>n68Toc7iZ zeR-Do#ikU*%jO^WO7=(KBu*`ttu-)i`>Ly6411~}UU3nYrFY@92R&r-@;kv#_RW3n zA$vnI?NgjWdulpudRVIKq_3z8r#^1MZ3~3cUIcs+4%Qk!l}K zE}F6P%hOax>Q}yXmhip|eH}rZKma887I^3lWd8;K;9up4u!k6MW)xuh$uj?iK*?Vg zbP3kk7VsFvJ-3o^Z}z_}PPC?6T&t*lG2)5J8teEzWzLqqo4=?Rrp|TUfH?Rjcl3AC zItE>=xpr2!#7V@1n#ZTzqqHn(2AjqVLxpH6g|g+8iby%PkC?+I1z&Bi5ZT z-=#?wT@?N}8{F|tW#K(4_-u9LY&}!J{R&K|i;u0BBY)IS!HzDGc0Y@r6;>bhz$7ZQw^L`yG@Mk3DzQ$yGJrE__{vd+AG_9tkK^^ z^5BhGd6`IOyB^x5^GvI7gpXBaRL?(O{h7jGShHSzw$ti4y%x`rOmGD{Xh^|B>kJZaS zNj#4vPP(?3tUD`eYSiW6I(34h~?W%e8 z&26U9WQp{lGC}A(ml5Osu?q^`G(;6XoJHzo>EEH)x~dDQsVN zTt3yFmu}^+2-M<=hEWe#v$e%I!W{H#HqWlTM=zmvEZ`?MaQ#VercxcpJngKtdcjCN znz6JG_ouSWryuK-FmeMwh^~)oYXxⓈ(UNPUc-Au*zJ|1E_6MMB#kZ8vgUSN!+(t z-Z0NIpUjHscOHdLo(ylYq=5vTtWDLdt~5-^d@o#nGI@90(p2$Kcg3^2*!;3bg75V{ zJxhbpu9;#c>?=f!C7Ka5RjTHrgGWCxvmTaz^=;S)sc6S0QFGzGUI7=rDYpi$rC@~6 zAlR4C_!EVq_{pCFQ7D5yfPn~qt^2=#LeaEy2;goSSRS-O_G!&Wo3x4AQ9Sbsp>tIQ ztRvIM?)-1BR$1xW239S24|Cf_$D4_QNiFVNvEzC8F?m7XTzJeP#sx*BgyMBQO*>JT zm3w&z?GU;cGWN;_Kwn2pJDg}g6thMdPmGLnr3@~ibK#B~tBxBp^xSa$hKj)e@wqXq zghsRDL;lxHZwhDgo{Vx+h6t#NEH9RO?0zU)h0`i?IooIlFc&(msZ8DU(X< zGW{?S5K7A%$AfHnt_$d@6S33?G>XyE&>OF!gyhqhsW1i-JX7Hk%!RsN5+_eu? z%LP%WM;*|VJq;Aoi@Bjv|2}FnXrQE~w5qA8lU%ocV=TSewAxTk$SZ>z514@S^+hp< z8C|<2o8^Os{%bHHv!E`T&kgf6$G8v$0Q!iUXuH3sM{4+zc_jDm~5-6_bDW#?$c90^YJ3lZIs2?y9c=;{v$D+rJDXA^BvAATBq;&!y zemsD0s8$?VF`pGK85PH9y3UAF^>cR46A`^_aFU-M%T3uuoK8>=VvDQBL&agF zZKNlM;apJetY*+bse#jNM^@*Yez`)vuMuti-Px3()&Qyg6S{;eLP~Sx6?58Q3If)( zC^Ga^YDwmly-DbFqW!gYEB0oGjxZhe*xBepazJmlgzMG)jO+f!?iIQ_U^**5qdEYQ zyZ7kMwZ)h%&gud@Fj5z5Wq`4Cv!CahHX-{OcT(YlqGe)d?Z=0=tJ3Tk{XVoLRm0Hf1DC5kxo?p0cqx;-VtV;Gde^PT zMQPR?)~Y~&q>c$o{0QHQxwSt1ZGBpt^OJZkbZs?b-7 z1&)jwPD7CXL8P|NgJ|siDq5&1mFiHjF+R5b0Z*0#MK$8C%M=r_=1x3g3BeW^cFCG9 zceLs?VB|(YaCyIn$#iggKcB-k^-%9!pIY9;*gO&CNjd?k2fIH}#0>Nd5`MPDoK zl8+%X9dh2EIR`ChHkBT)ulTgqXIDJo8$37sIjSf5%T%H3)%OXS=1lF=oXDLQ3K!S9 z5cU;*K9R!(PLke(kE<%m-imS>rBzm>5~?{z8{Cje(yiit-8J#(AVJ$HKdaRST|b^r z7Z`>1l&YR-NQw$NR+#D)oS986%63R)su(Pzmewsq@%Fhq%r&iTn&?pxT%B7mrVSH+ z_Wl`pN2Vj3)JvXAeN>ElxHQJbiDbdtpi47Fov-BVoiM(%`>xDRE+TMyp6e_;<)HJ^ zda2Zs4Rc=Ju(jGE?W4V4{E&b--7QA%r1Y4YV55uilhNCp7Qn=_mX}qj^eFVxEF8h3cAgYMYH)e~<+^L`ulgDOzjGT*%XJ+F(5?N2ZP`Faqt#I@4e&bQlQh z@^}lMqh5w*jcMdKj&sIjJ1`39lno$OUJE2}BI3MvJM*7G3O%`jH#mBLKj zrk~hIsZ@MgxjvMhoq6-(k=vClmWgRUiQ&BI@dNd>QB74=32On)DAO6wihXY|cwZ4Z z(Xk5jcv8~rS=iD4Vyp9N=QEWhUc&neJlw91(gr_6u$@yk*eUUF^_N^&hu|TuvH|zZ zaVoi~?}l?wJD3>4;)34)Sz734J+wX?8K;U#L-x(apmRL}U8JA4y+w@WzmLe}YchV* z)K$fH`Gx5P@Apsp^7|rYN@zk91OjZ3Os&*v7UR&8#*EhYXfam4p~neDX3i?Mw?%j^ z>87)AC8n(7KwPZz0*Lbk=fU^j@qoCXWpmtTIZLC{*m`F&-7?9p7z=BG|HJATwjoHQE ztDX%kcH^TFUgl@N?Q7@Q+fyaG<~b8P3T{Vl^Eg_o1nIiXFo2oDGpGePC$y%0n`pcg zJ|-iVTK-bXIzBKRw6-S<8~5*#ibV&orC~tG@lb}d&K7+tI{PV!Msi_NKSZqi`ISZh z>2DYopn_pT3eClapMJ`PK1{XOPPWgQSeJJ3@D)|0ZAtYuT8w*`>bN?7iD+f##}3-P z45@+;i$0LQZa3aDvS9mpeCiv@{(JF4m$wbSAvboS_~S0{wcY7N@tsf~@Zq8wU-gKW zMz&L_ofEw4jioa+eGUlW@(9(vE6%kopvmZ08#{<=V|gf>-g4x%(iz1LbNL zi?bl8!T2v&o^77j@RiIgsVZiSVt*?R7}|I*?6|$3uiLGXZFrtaIwYD|U5&I2FL1W; zPB6|K_-Gs7*=fUfO`SJE6M!afmZ1=hGBiz=XE0XxMrX@MYkzz?p;Nu!v}>+*@3H8O zvvnsUOj~b}K?7`cka>=<=;N@i*SMJ%)`^G6oVKE(=Af-xZTDUg?GO#w)JK+KRA(L8 zvYnl3ndUb9-884|nAH52Y^#1h2!u|9>ZI9ZiN8_cVl=-Vaw# zS>F3LnPODgVBGztx9RRXRXOM084q*YO@E~5j7A}+%&3G-@d#g~uf%g-K0O!b{$jeq za`Fe8q)07*r@(Pl$TBSTT=9^~Czm<%^OQ&*%Iwlr1GD38%9OQBL>)nAg1(pI0hWUq z+O;CPgf&$)>j|D-KDrAw_q6DrK*a8*)h{FWgB+8?<{3(84$4Im zL2Y+jH~ul&%yLXw?kNGU=(4U`0`w3J#e6nLQBjT4l&H~G*)12du%=Oip|q4X)!1A7 zH$^&mA8K9q+=wkh^GD_VfJUj84DGLttT*lQrJQ+nj)VCzZK|K4G{~8=ox=mCryH2m)x;J&~vb+v)We24_5B}5N=;|z ze<<3*o6Gm^I5+B3^E$L$rR<1Qf2_`ojU`oUeW+U|W1=~6JTus5r8f8qNAKIpuupOt zjBMDf`Ph>VuF<@cXjEIBbm}y|Ej0x3rrXRj5avh|)Q^ZxP!oBd>Nras`f3D5D@pl5 zp$)g9i5zYn&YIZbsZz^0`^Ggv=rYfw4^LHrWQ^9U_1!fl7jvhHhA$1nr%>(i86v?9ZIXc(<&Nq=Y3~Gr-5W4O;p&>F*R(P}LY+df?W{LJDCH zkRAoe#4!rvrrOkY>SSS`Mg%Gc77{3po-`${+$Bu5*IJ@3GDHYP}J|FQho# zjBgWv0h_zGdW>iWdAiWFd#JPTKCh!w=1Lr)X_bryKWw|L&riJ*V9|V@txNP^kzgS^ zYbi^$#>uIEW1qEI69F>om_OH;!b6iyT*5acMO4lDOS@ujwH^q`Ut6~)X+f_uhY_n- z=}xdYlze$~g;b3!vY_LBsK&1B``zbhC=lW{dC5=)i7tzRpBcy4XwTv>kwTL(8oX#h8I zAqCMuhB#behPPyU02>H>D9yT@5Ey|2O6Gs-Mi|L>pv*AxfQAa|hRJYAmvD199*vgB zzc?`ec>1M8HGhhUZq-rwXIX+l5W5%^u*!3^puuEhU~F|qoCB0H9g~=t7%P|xZ?dEJ zzUuicGcOpZ7!xeHlds=g@JHA8d$H}rTGEy|T^n#xft|(7sE_a#mERjQyOqM3nvnhg z{uZs)&Gbd+X@X*bu7-cZ3kcnQokbgmq3VEyrsyvD0b4Fp>Dz*WyN(g_mC@&Ed8Vpf z7O1iB1)oiu509}yLc(;Hzmacy`EOK8Ov$k9EtPfmp1+1!vEwZwA`ay~r)7T(3B@X9 zPK}$HVS4ur+L^p7lBBwbo@FWAdqKM(TlB1toARa7d1enT+8_?hvy&z_1$e$C25vHN zpdoMZZAMS3kj##EvY#}PdB|C}SuFm&JE^AUxIl}e%Q-V+)A7~R3z74#RGoooeRkz( z_Pm|EIYs4XnP^KAv=jv?0b=A%s|zKx$U5=PQ0n#wef)AQV~I#9o5FFYICl*D**oH- zjbzN+19lAzwc-c|Mk#}e2>yg`))zYbR_y!^q-ehGJ=;RnH3z+H0XnyXh-YVedNPB>1D- zsrJCUhh|*LSLNn23YST89u{JqhbW%r@yx2z*N(ozqYC~L!c7AYpX_n-&1*bM)w@pd zL*HFxWMS$0UKIHOHRU|XXQ%>%c6`D?rn`8eBaZ%#- z)0Z@7+q3Ny1(|2ErMid-6BvacFE7McJx)ieWX?>xWFz1r2ME1 zY;E$^4{mQeXT*5$4qPi?w7DUW;Ckk3AM;1*hNnRa4VVu|#BG$+7wWRQgG2bTs$E_Y zbz&#;ILn*;n?tD{Ml(#cN+?^^;XEsh|6GiK`QS9+sJO%VoMMei>_?V`1!j3_z0-Jb zDG3hB&;Q0q{tEIJKBnfP36F- zIF+i{GHirbWc@dvX~mK>Xd3?CeJ0A^x?2C@`2YOQ zPydrX69Hn5+7)Wqnj%{K{q&RP#;R!djW#?WsvKB#*d{dQ*~bJGZ-OyNTD~wyfTIf=J@@Z0K5dO%1hB!dy^Qsi?M&XFp z_5G*$c64j#QSnyc_%m-432M{5iCAuo`*A%v3S|&GLw4tW!R7=^YUe0!qU(d!gisKp zyq-2nGz8iHHHdc*L~S7Fp;0aOM4~ICymwn2tsQHwQFTY`@XVy*115n+f8PkJ+5`) z+&9hGI(71*4=E=bf3R=pmRgH-gfw4qIgg_Gxf{6!Pe`gDT6q! zzM7#!M|lsevLOX#=#r$Gh#XPcx=Ut8q`kXIU39Q-u~eVbT*fp-5$tL#^y`g+JELu! z?4to>3wVHf((&c$p-gOTb$-n7QtcKMD(r#bp-zp^gOG2B2q~0wY#D+{$=c7<2vOb1W_htxzKBY26(WuF^($M~uoUu4OjyeuHFOH}Ix}BZY5+%y z%xufIH*rcKPvIeu60F|51`WNP>l$4~QixB6nir)|Cn2^_%Swoq^q$X|LPK!zHPnmV z(2HHp?%V%h@4dsC%KEk8U_(SeRGO490*X}Wo!Dq1U5d1bNS6-M0#Q*=s(^r^5NRSH zAW}k2q$@>wFQNC6Py-2>Z!u?{=gc#6=9&4KMXP{3CKp5o4nICbBNKV1P*xxp;GCJx5LjTl6y z8t(9#=Rf@Zck4W})12$!pw=J}Ja5u1W;k;RW4ejC5N^=jMABV7#db$$YZ_8t>I?J5 zI}KM^rHvBfYAZ_Ptv@DTSlk|5>Dsm4IH?dqdvv6n`%ILYB-IA|(J+Mt@V+&2e6xRs zASX~X{7=44@vmR9VyABsoz+OG;tPZ)ZQ!23k3RsITuJ+f{qP}~)7m>MGL2CF);S2G z@-2j4FCyjXPCn(4#3t&D{T{jBZ6T>7DqZUBu8-J|c}5xs2!=zFA1iKX4 zMC(~zVGLWHnE3sh?_PfOqHq;c&B1=Z=nodWmV^${HdwM$^|%yAhgXCodw%@JSDAp* zy6-T+{L{PeC~XVuS~~m&5q`6>gDm%9VP_~JsbMCs;<^;MrDT-@LK_qJL`O-d?~zoI zs>3VY!yA9x{@!XZ?L0$pl0Y&0yCtYJFCRT%C+bpfivA7oCN=ag0Q#T*O0cx;XNYKj zI=OQl++#6h*itKYvy2PiMvXPL{(%sso{IWSH8j_ID;Y~ZQ@Y+a#&0~Sc+^_=5ju2O z_Aqo~OCMQRwT7KfHv^OpWgIyXa08x;PseVffAH?I(s);0?$(>ncoJShB(o5+zIu zOF6RwrpxPh$5Y#@OGLJ}1321Cq|GEi`xD@^h!~YX*PkKu8$hisEfW0iDG9l50mZK= ztnKml0VO#dFa*9%%I6u}#s(fa4IT8w&XA3FQM`I^a3249LTbN1{wFyfGMNnBrQWs_ z-9<7{?7p8h?xu+CKXXO!OmKQyC@Z5Y&sjw5d>FCUg1((;Y%lT|iW*sIbaPJ$DTPgp z`QSG7@_vTkQLYrt915;w_jdJ%lxT8Q!~UDF>T=}Szc>1xpCSJk2m?u!g^UdY$>-@X z!6oFs&g%RhW_>GE1YjW#t`9e*1wfKSC$X)&=fn1J6wW!o_)s~A1L@jrz_G0O-C)!A zty-{ibHHi+2Kz!lw*1ZO3Pxb!v9`NQgsn3ySHagQg5>sCfe&B`xN~uP;F9gp6nw`1 z>%4qig^eep6OGnuag5`%=U?$5lm}~A!LW1QxF0j`w(JI1O)7qJ4S(=s#Q@JkeoA`( zHx~WF|BFpZ%VZY$o$G&^6vsg#STrxP|C&O--z~^~9;oXc=(GI~Z;1-q;OUO7PX7lm zqoB$|a2z+>LbOrjL8)L3lLO45ztmyJR-pZv4G z|IPmY{{x=?@**~qjS9eCDzF9qC5?WWdGGTaSI#wML&;!L67q{;n zJ>am@46jinEFzgY&&5pZCRHczly0vFM!d6WYhwnq^?&`E8d+Fag7P?s7nrYyB=AV| zTdQ#NAmjJJT7IZkp`emN16b%?-LQEUz+1oQiY2!F@knPq^(e+WpsYlDdlj=rya*WO zw3@emhP;OZ`g}65S5uO|`wc*iZ&TZagGCu4Y*0bMj=%Hy{Xl>R@w*?90&I6F=nN7` zhLmV8tpc*b|2>`mdv*RhH=A9JAG2#Ph5Ei6bl{;T@%brekFlM(=+}Z>9%UMk3s*r? z!cAARCyNX8{IIRJk-rLoA8?WW?c()kpF>liOaQX(^Pe`;qPK`({VyveA4CCYi4^M| z1~MQAa=(A^hPuU4(v|p0s(p|0_Gid-sUBy!rVAGWmZx_`1i zp9~WGG1@y6EcmKQ(-p2n0E-{uryBk^s+IPL^WVI|Fzi>srVAWEn}A<{?SiX|M73>z z5{a$O0K)FSVk3cK^`BB?5B;yhM*iba|C9gHvy2;)V^Bwc!*PBXOkSRkVJ#U*55`K2 zqew^0kn<(^ixq|NH6|tathE|ZZ}Y%@UIOan|2=EHi~Idu;fyeW5n^y`uw^+=D*T`& z{&`3D@W&5;(EtGuzQ`&m*i7TTZCh<`Rj}*tRlF+?>;}QBlOA4>{dz?9eVFgK4mpVJO?9b0~gkwA;?z|ND*3qIBv(9v*13A3!yKFx)F6BE^ z@(e6ptWOc@M6hSQ-S;sn>RhgAN)C{(&)5T%_+>dM{8~N3aBw4rZ$p?Y=j1e@AU%Gw ztfE43YiyCxL*WRoUC3nBVbi`6=xImMkB)oK#_|v&>~9x_9K_yDd7i$q&2eI{>f*^s zN76v(H_Q%2?S+|aCfy|wJ0kP}5SU%XW1=y*T7QfF7cSI?77;_HQG@J{V+t2OA0Dji zZwpf1|Db#xp>q0qK!HZ43CxU+UAmC;83QQ8_iJo3bL`vn1FZ-||XN#pCUtnTbE!4^750Bd4b*;>ZDy19h(?8>_y# zhJxLL5C*l)@oO5-4=g#VDr|piOSO)RgiX7Fw85_y0zv(&g)lp?5SA)a*I*NufBP{H zh4CN81>&!D_P$;Wu!R41i?~SgL4LRBf-O`3B2zW`hUwP@!SlBZ!s!303&LH*6+&ic z9g>O|*HDqBbK%YV1+;u#m+40bQ`Yki=G?r8hIPkJA9Mefx3^v})I`y;17XpNq;|^7 zwku~5XGphw6`F8>tVjsHh3+-J()nO*b&F1X@_4sisgu;hBxCmk^vSu@aW4 z6Va#4h(&e&+GzXOCWma(>j5WjLA*6i$%jB*(zDtf*>~DVoV3La0#G2OJdXOYvM5>5 zS%Byj)>Q9qA0ceB^hhMtfboR5O{4})hHGvjfP@3}Zww1r7}K{E$x@qytfSRA+v5Cw z(fFKAW0u!CUrz4GaK)|j&#qdZlMiv25-k%5gX}Ga;Y9~4EqWgW@gZ!9e##{ueWS17 zqY7-j!dFZe)>Fv?{ROqwf?Qf^-$1@rNT;9#BD;d~zRWDyqi)O3XkK7nuw>05cs~iY&8E{5o$m(`yJ2`mD^+M0dX@*Oe^P-K8kos96mXNQx@_})S z#@l@{Om{^1OkQEHm^_kLY4ZW=)R{?9T4J36er0;ducEMPu9wnzwzZ?}2>&vPeq^=P z<@H@<8>RAs%;?_F37PC_d8GsE(2|0+%Ay}1^StpvRbx(RW`?P$n{IZ8+2GP!4xVfPjjNmB#eI1bQXoQ zQIx4LfBuBg#v^Ee%kzYy(D~uQ*N9IuhrP_vEkF&;cxKiZl!skg3v3iDn^;urk+li{ zkC+Ace_uBC52=K#?E`Gkmf z%lAg?&s=G7;M9ymUwG8BI9&=8dOgn>v=nW7#IVIRgd$SaD=ImR zq;)b_l(wR4d*_d6lcZ|YtvK2|?IAA5^h1yDW`*0sSW=B=H==odFBm}IR&bL_(3Vm{ zP_*kLt@|U_2V%}1)DQWQ59bE_?qL#$ek64SjF`|-leyGsx~P8_AibfsWh2OE*WG{m z8RGW2pf%}1%%>c~9{H5xRxxm?@QEtEfab(9aw!S>ZEJqEcVPkM7j$u1m}xf{xb52^ z#K-vl=4cJVk$!1LyyU2Xj1lqhGpeX*u5T^yn?P86v!etG#5PT(8lTCiVn4U_qP6e5 zWDrw+1na}du+$MpqzlcLTF7XnMY#`LrIG7c*oJa;+UF|1DHMb6h7QRmwB)Vuy@9(D zL$^3mmEO_cCS5*;cADd3VQ~znI23Fa)~ z7^*%qfvjDj7!`g}S;ud0=gaRYFiZ>fN^xFjF+LSOY_fVooW^>C zMZv@;H{jn29vQzTn-E)5XsQbFv(N1ItEZfGpML3P#F&80R6-GS;_8z?ygx*Jfap2y z)PAx_IlEvnb}8i&){x{pCC13j@!TppO*JFs(P=;BM~6$(-hzk?vPd-81`-Rg`_B+C&41ohqLSg?ih!Hr*7yBk zZBS9zF0_tP1zZ%($IIY%y->Obzy7yh#wosbjg~S5@AdXl<|t~` zD(<+U6xh#@RJ%GPQO_K?P6z$nd!5fHZvf{|BR8$^%!W@C~xGCd=^)LWYlUwmvn zR}ULv{|Y;4YA+QT#3sd0ly{EaQ~9yB`bBi);{KQPv8s(JwOV92mdTK(n|#%7BA2JW z0wF(L;Cg=Q2vnp|jy{lcFfey|4NCc;tVo2ltSP6Q>XCo{OqGQI?UvG~r$Lw)b$dArUl9DN)fyv=NE7CJw@ znl{MYM2MI@t;y|tf(^utA(9{1fC#8Q@f)byY-wLk0}S`;bvt?{OGD1BD_>Y$?!^or znYjK$o4O>R2X+o2m2Hl=S<)*qZJ%879U+DIEJu%iV(8={7Ej;C@#r(_PwT2qbEbmf zj8C&(IQ-Z{!tqM%@|TR`h0h1{;u?g{>Ci4Dn%*Dd48D!Vmv!Xd?M>@xo4O|xbtB@2 zR-y5aEzt-Go6o9F*~F;Q9aEhbUg10p+iCNAx03eXp<~~^&J)%@-N;(?_>ekns%+WI zyBs33QtLBbUwqRW&&`Eg_#9|v-lM2s#c|Eds60ti)9WNNcT4PZiAUv4vWLp-5>+K4 zQiV~*vq_{pbWqkUcddqO(Mpi8HC764037Nw))T`6#oih2zfDH;*G5SWY? z`m_ZC6X3#LRdo_=wDNdTl+|9^17Q}YLpUPS1YbgTWXS9To1@&9%iZ-d{4zT0Jq&EF^+Cch%&>l>~EN|)CwUdvh9t5sD zHoFviSs`pqm~zoqu+Arlio~~?(&-Sy_g1$eS|eQ7cN`sKZ9&RkU&dXsrG2D6;rSg; z3!_`y3ms5y$s8Nm$Eb$1e@FX}H1lPIe4z?-Eic7YCzdqweSHk^4Lbu{$>JLtRRg>v zrLD@k3*GOe`yk`v8!LBuYIJjU&2d9rOSwMeLB0ChPp|?Dd6lNPm?aDYK?i6&jaQ;h zV)EXPjooo-$u(V+f90QMdh5ecLwibVHh&D8&gl!dcPq-6J5ySYI;VZHroA@O&cZX( zMU@ML3bR5x-eSk`%LY9zY;!42%wbEJA(59VUX=dTAM1t_f^ zkxh$h3j5OQQ(D+?WsA{wZ6~u)YWm0L75b}u4{!Go)}B6fb8>Q;Br$>NXzH{D)c}p| z-TgbPC{z3inkKNKu)d>bXU(&up&b=yk!=Z+HEUa7|(_DW1W%G$2pUh!O4Tc9Lpc z`1={(YkKp1ba?ladRT5MGtdvuvTaJh*1dgQAjR;U#gq>-xt3;sL+kJy>Rsyx#ckPW zCAa;hjfif+8Y__n<06W2!OR}YIJohiAlYkk4LuvEqH;ch|H$-S%4W&BTG?Nj!ys=2 zkll{^7bnLI%YvPrKIo%3-~m=KkO8=RzXPNJr#s`WaO~7apEf5dd{zFbUuY`KtXjFz z>~*Z$O=d&hV~{7RfyeV1)QIibj!@AZG579qIG| zF)4x>#CaX^CG0umfB-OiSEQzJ9Gk-h)Sv<2={D)n%rAY4%1I*Vv&fYjNAsF2b5=g1 zG^jHnfmEJTbb>cJ9!LrM-2U8|R&k>qjixzbt7`@>D3j+m!_L(^#c;8_QIX6PZ8P`LI_J!hNrL z>3X!Rqj{njGA%yC@F;|LWi?N07lQr4gK?L(kJ?o6q50oR3$$rd><{-|h)I7oYVC06 zcFZ|z&w!IJ#RI=F&7tVYev@!U->Lcvnde?_IoTcvKUmFMah{cEV|}erZWH&^_84rO zm95b%&)bdIqV^WvvuTLY%Xaw8*EXUZk;XrA`jdHN#$B$^2v19^aV*r=mNbP99~!Rr z*Q&)0EPOVVH151y7K7OT&c!}wRd)Ymidr7TAN8WjBHdT~2W_>dUg)jjB=1tq@ZeII z*kf)9FTI+X&q_<$L$iV{zWKs48sqUtVp`ab8S9I)GS(dN$@iRO&XZ1@D34{J)0rG} zWf)|+`NE(j(Ld#a-LAgK<<_f*d4kQ6wWyGare|Ak^X|<&KuFkl@mfs;GT*shqU!Nf z@!4?8X^}2$d6d{{T^MAE^3&4L_T%@Ou+ZY?QVOH7VzKMvDy|Q5*=62b5MLFC3~NA^TL4P3`qrY(kLXh^o%#0?s5~MF$eUL!Ufdt7%_q=EB|sw6v-BSHF&Wf;!=4 zWI5DP8N|0y_J;?nWEjGe?DM6DM>)A;Xr)os)}n7{xx%+Y-h~c#pf34%*Y+h;yXKjj zHAAPks-D zk^KYk^p8lQ3NdISDwo`vjigt84$Su-dAf?-lhEb4afTO>l6(2VbePNw8a>5R+fI>9 z#5akdu(c4b-VHUNga)gZ*LmwczHf`OM6;c5(QBywp#YiMaS3cs5L^`y?5mx9T?NHw zW!dG(=H8vZr!2cPLViWC3-(^4!i9@6&i7aFwVY;j{fYmJb$$~mU#Ta?WNVL*vmh`6{1oh-=pkZOTUm!CNZqf*QJy1~^qb0`wI3d2 zI~o{uChSskXT!BIC&L|NUCPl1Nt&kO*f`}QY1ODn>g8zA><#k(?+`v2DCeQl7MC`%NR9%6iC$iFf4)^fn>% zY4IAhuj^!Be*B@K!IAkS&UtiX=KU8LDa_v2FQ0ZEjg@)ymE#lx)A$hdc?tX^Jg`W$ zXHD{LTL`S!WJFQiS+;pqpPrtYt5-U8a>d8UsVFedQ6_|NS|QHehd0GPbtG&Tc3Gba zvdI&+zGRit`zfn^b>Tzxxd5P?F#FIT@3_ItOh3FqYA#@mqZNlrZ^q9U`>GWw@}rLCq=miTb_N}kirLeA4y{j4369W&o<0QF`Hc} zBj4Srk9eNR9~~Io@bE1-RY-h1nJl4S+4F#`kvrtbVx`hB!m^%GMAe}X(qdhzWjE|J zl>Dy0+iX$BO*8OJoe!_)my&vyt6ndIH*!zWP;*Zu&4nDR;(niF`dtJ&x=@;c^!rqJ zHdDlo4ws19EhyVNtV0x?xTI(ZQu5MWv`9v$*wKY9HN{|g{lUE28**}E8@vIZ;bQN+ z=NMG*(T}RECZlPG?ntA&5vE&fn<)Cy_uLgx>o_eo*X zMJ;8G5{2&>-JRA&4kDb9U$UD&-ABDV{EarkaK)gB!rw0{B(f#SxVZPM4|Vaaol@`S zm+GP!?fJpiujCBnSV`$!xr@G0B^Jwl``&${J{CqflY0%K)1dN_NaiA?#7zm`7(s{< zEqp#KL{1cX2j(`O@8*4%o6BzhuKvEA2dj&|jI{Pd#|lS(BLkz^2z-EOtX)|7rIReu z&n%snEg>~h^TAe>|NgZ%Q;f^({v1g&QqinVW87sSfd*zhC6^{%wwwh$TyK7x<`>F* zQB%wPjWW4+A{F`3!Vz6GW;xR4=cDk3udM84Rjk-_k=S(HqSJ>cmcg>}&DntJVb{6) zLp_a|E>0goV@B*a(|lUkrnYWc(z=l2odJQU%&4RO7eQ@r5Ul4vL(V8>d$}^`Fg<&yqQk7r?YE!yo1E7?2ZAn3loJ$K0?Ti z(=rqieN?`5j?0b-Tb<~#u0)S{uGS~*3c=5GWcf}^wUU;xt=sd{TQ+&duB}A)S7@PK zG#NhA{)yK0_`=F}r|vlm#)0R$xkx+4HO0{QjHuw-P}4B7{5dXSaqZo81aC!n<&9r? z9^64?1lmID9l%9Yq{ATI2r-fu^1InTi+dv_`1X}{Q0#Zo_)W2Y>;ItI-v2Na)`LqC zNC^B4d66&+J53B~HwdgWnt9da7TjrjjZ>}jnfIn)t;dJm_sid3-Hy-5kB$!F4*EL2 zi&mx~FkbKVT6y4NSy%r}x zvw4r9Bq*obg89aMZ~BPKh9OtE;x`Ah&o^3ae%$R(0el9s+_X{iN5eklrF8&cClF7K z1jncZMIo;2$51$kgp6d#^oceV?9AGY^AH{LViU1a9RsxcT+(iC6RwaU3L!eHGeHW6 zv)mE=>HPV=d4|2&mEv)KWgVLpxXsf^4lW)IjM^M}%$Mm)m5T7a^2C^p1|}z?E>|+_ zqcSSj#KOUNp~Vz;rK6cTzYj8n%QP&=j7XPiWAXB%ldY6It9NZ?I!fy3Ow5xs{uVJs z2({&RG8G+y>_)QS?ha#9J zP#31^jae*3Fy^O=Y{$CYR?lCL+w{2`C^%Q>w@pi%B_pw1LVlcGbVf#<3bn^Usltp^;$Z`+dw31Uq@}qMS z+7m)Y*p%b9`=Zl;f7w0xx$Bd#R|{)dRNoJ#Fy1|ZM@KCRA{z)I0wq&dJw&Th_Bqlb zl^m7rh+G!p(&RP!UIKBL7^}ZQqM-WqJJfSBjSRbTq7le#j>2C!KIRlBybX{+F|9p#cBc8`KQ0GmN0K=HukpJ;(R z1T6p)++3qzQU3uqi~bu&;7lSqZO;J*y98(?{94c`TbjTQzop#l1EAKs>d4K&22jt~ z{C!2ic)GnInkdlT1Ums}<-z08Cw)b0<=YBEy+^NW0ZzmV!_6IGS62^w?)RBdh&GeQ zwa0NCc1(|fEVJc)7SJ+{_XT-xno$FA@Lc=OY$@M{lKJb|$1A0SYCGZ4aQxQV5R&r3 z7}Nss$-S@xO>6(16;M^UkqfE{+KVW1yy2EV?i*!RrzDHqvIeuVFK8&-;oUcy-5HuXQpwJH`@gl!h6AdV1pc;_xNd86;B{Ln~P9zwI zN?9f@O=?5E@s&u8(k^)`#H-`f9} zhULQk@qGP}%i%vmjtUd8gu3nbcvPJz8_~FSh%Y328(Xp;tzCt#3UB$6G$A%S@|jI6 z%TP|=z2{uHezumSyVG<);X9iQi}r3u{Z;`znwnhLW!P(oTeH9xE)UxsVB^ z)&h@^dim)5xAH-hv4GOjY&4WI2GF6i!$gG}p*PSj%%t1(JF-oB=aQeRmA^F3eb!9y zZJ)TVy>`Rhs8P3$?9pGi{UI}ZaK2B%a*@T&WU#g}v#dPEI+8k9jGJn!;3$9}IQufx zrrbXV9a4k`l|xLTMFwQ5eq2_ope_ihvY2u`<-13;ASRkt_stoUD-ViHN5lkw5qqkW z_DJrNDM{!etwCgFSTZ>Qha`)Q_x-rPna=K4wCeg8Thjli8}zWlkCiL6hpcT5vj;FJ zQxu19Sw|YU#fzWiEZ?6U@lV>*(drf2%4K!+B9)1LnziUOH&g#-SHkskr3juWom0NY zh-1D^rqvyD_t+>+mu|m&{1_wg3YmULps-5p+!yc58%2R!U;uKmh)La>Qr6znK_zsV4H4zH?sa1ywa%sV8{S(ppaS(?@ z-29G0H4{5KVewgLHNsL*uwi^Fmrfy1Z}Y7CD>3Mil4XCDvwD_#L;u!|GJZr>C06Dk znD)~o87K3ssB4kT4xXmNT8d)l?e|K)C{9bJUKiIn^!-u8b6<7y!(pvNInp(AGqO@4 zXu?o!y3JMeMPfuuGolZaWNNKKti=m^+ zIg6bRss5!;Xd{MhnU>#Rf9Bh+PFW4pMnN=Ky#Vvoam=RasgzRzy*Zaka-YjeP_X-H zkwBlzT=7dde1|2(m8u}Zxcho0d^dlSqMI`z@HnYVAhaeomh6tz1%eEE@gAB z$oazN!Vc?%TaSIM2xDIjz{0-t`7>18U+ss!L$LzT^lwd8fVbBH9^h98*aZX_x00Ma ziyXO0?f(kGm9z1;m!XVT z-yyJ}NiDzNjeAlq>shGu*S4QCSy;!7_+Gbs(#YT1W!~~ZyO8(p{qlQdC#dBX!e*9a zd!Fe$9?4eKBgQ`oMiOfP}%`b2ycKbcY+^lrI{^aU|6lGmU z8~z4M?K+K?8xj8eX&_nc}E(n1gf%%UVLaC%vq#<+|h>0JUzzIU*;caQ!Q+0#<12b%D8Y4%sNwz8AVL>Jc3lc1+FE{ zzWt(GsB}`i*?=wuknmcIU_Xf0s^NtXsEKZY~2JR;jU7K*FJ5dO|*{kobI!&-& z7?+d4Ki3@cP9#nvxUFA(FjTxYd~`Yn0%njDI(N3I1iQd}<}2#-BVUkJ9Zq9}ceyz0xa{ z$L$~=NlEyGxrH`*%(IR{CIyS#uwaC?uzwkA0bnECaj=A6FH&l27=%T(mJIZB;-e`y z6h!ydyn$Yuc)zs;YxI;(FU9sY_E+Lf61cPed&HY}aL_Y$nj(fA_=mN4Bh^X157H{H zh@d86Re1m+EBT>I1ycQI|JIhe)l&Q-<@A5rkM^%!$cZzRfKV|99B}vkSmN)@3vTx; zAge6_49cdt7uEb5$@`ru5Vn86mBR0=fbsEJAEZ-wVSCDxn2CZ=tc&Qb;5nWB$3KB1 z?EqoBQ=R`xG@&9&fmr6^C}EgVSFuA$797ZJat58!%7X92}I+yKOFCGbNFCyXsK59-KuQCKN3C*$O z$;2q90V|*_sUms*bqdSSgf#xL;o}oj3vd}7P->7jFD#0`l-WPAG z|7vyhZ3Rw?3v?UDOgX6$uTHEn%RKT96bRJrzuI4dTs9*qWKYG;_T9bO>hZkS;?8j% zu?WT=o^_%WW}>lCAu*Ub^nRapPt|#hds)wi7ZcTyyq7LBW>}^1iTzE_9?ab3|!}>1_8>k~vlJzE~Etk{)B=mr8T&8lSdASOY!*{i2l0@{BCBOX0^DgjMNOpTOp*!6fQ4Ip~pD6ePpo6B&6 zEEN6p3D`l?#cqyX!iWK7hJhg3tX3U|tkUe>Qd`M8s|Qa&-9PZ_5pRIx74vi0cvh$p zv-OJF#J4{6k%#OA-v`h7#!_4dH9~!M=mqN}Y2~~bf?b?(OhF*SE*`zox&DSc-BQ74IHoU!36)jw)!>h{1 zcGdp-kyM_Tn3|>%4MQm{)28d66G-~i=6 zCS0X)S2a;A@O-sB?sezu^o@2L(O$+(8^-kvLvxcdQB?!nJ^gj(Jnz#6o@JdG9`>3} zY_B*AES8nHqKiPATD*@xvPQ9aFp4YcU4M|;C`OT34)Tp54`+2w6Q8te1y=SAzW(ku z)oXRdBDB+Kw*5I2{dIo@{RAOzzGw7~bM+ZPEtMIj+MM5e**R-2* zZXrch)Y&~9ce7*p+29BCPt#Yr@<#-UZj7JOx#gyPsRCV#JhMQ#+*>7OmpQUDl<@ki zInsK##pC^{<1S}pr%%2Vd~=V#a!6B?at>B8-`kb6FiaSjn$K%v`HJBs@b0`^Q0D6O z*7!8Q*ZR;%zqLb*7cy~sg*Vrmvap#3JLH?-q;+!kIHGSCXEKzXst&&XLIZ)S8Dv5s1W<)deW2RoH>-E%~LpQYN zzS`VAdFPHgwQRnJ>+vPA#qB*uhs3ziQJcJbQGFIW>THP!``Z$i_(!o%qu%#4R$n5E z>rjqOdChTlMyogh`wJ~V)+&3iEo-Tf7-T8kBwm#5kCoRO?&vi{wLigBnE}s%5$X1> zRw;3YsdjJrPR1@y>25qfq;bUltO`ej_9V6T=8O?zc$~kma$xn1)C()tiD?z1))TJJ zy>MqPgxcNT+aKvG92+hTXCKLHsQhRX53v|lSL$ILF-&F{Zx64!nnn!PEADhtJ1I&RY)aq8Yfn&&nmcbdP| zxGiv9v1MzdyICzew3b)7RFYiUyLCG2(u1lW^dL%Ut>*@+Lrnd?43qs4L9E}f_(~0V@-BRi3Y_7 zojPZzqd;Tvboyr|9t>R=1C}~j$FVKyZCbPd50Ca9Mc9h+ zG)}mT_$7K5kk8=KUr#JK1i&Qb!vsDg=9(-eFv18jv2V$HEkxaJxjS-wZseW|u*W?%Wa=2{pJPaCfVu9lXB z?R|QXyaxx)_bk%q&A25u9`>Ak@vQh#3ba?!e)e7=0GjYpeVcwJl74Z)XcORD#QP+P z1dMz z=75NxU@jE&nc54MahlM2<_fL->PJbm#v3XPKfWv07E0sz#fFP%cyGm0OBy%*c$zF{ zx|Elk*E}{VT}rXip*t7;CJ-lyHJIKL%qC_PG)$tNQ+Rt*yE8!18kswE} zASWlJaM~%M!1mp{@r>TLW?YEah$QU^bG7Ay2Nfvt*{Q4Dd=BTI;LQbFTzRg`J9lQf z&on<(ydMu);o*MiLBllM&rSkp`{vt-i@!*1S|?$2UQAB~2ZtBU!e2$ZUc6~IjdJaU zen#PQz1sIq_=1Yf3Bfgrk{VfHRD$v(g%_B&FcN5UWo)eyo3# zRI`BQ7Skk@4QZ`_IxUYUE2#BuR#HBVS* z8!~3R?|Z_g&AQ!e3Dag408YUhhNzQ0C!DYKH!!F30l&O&ZBTV;rj**_`(^=3QDtJ( ztX4jzduvpDLk%-`3Vy9q0^%P3Z8x;+TR~y%tgQLH{nqZliv6ZwGg>nSvicj~pZlwE z1A9TWV#!I&OkJQb;dMg2X~vdRk{Wlk2y|(UKSRnjT!z#?m`6x7K2*>2P(3~#XCYlp zFsK>h#Sli5Mi!izC}{dDJHI@Yk9^gw4h)IK`!7E=HwW2_ogg3-&Zf@lKYTWFmn%X{KdJ%*_?0jENs&rKh09-a=V-8NwyX8nHr>zT(9eVm?vFWBkf zC|b0TQ#xe7wYt@9Z5-jRAy|T&p{N!5A{)lI&}gDufO5&n(?mPn!+J&b7sWH|bREdO z=fxvZ8MvjFH;)x>V#7`83WB9HW-45XH@*C%*pUnZ_2Y^%KPsnj(eY`m%ZIJ^ZROV$ z1;UmS4!s(k9@`-eJ3ALuT1M2|v*V1V!~)@`eI4H(48MIp*O?-eW*L5~Gy`)M&M;D! zqmuo0Sx8lm`6o8%3^Df3x2(1;cb_@S9=M``Q)3A>~lKweF+Yp~EP{Cj!WpVTG#|p%IEKlkl^?;kPS# zjph3i?S%Y;axbLrC%byEDU$94wUg#<519&MD|N3-*)v%;!cQp*PPUm%M&^}P9!)N- zbj_4{w$f1YEkw1{gj~x{XXJ zpb{$`(El8B$-W{g)E$}LGSMQ~(oV0I)^76=oaubbJ(D5+Qs&|s`?_>1|0iFiClO0P z7$J6N0`*jqwWPiHs%^i1dq&gA!n~>wBmUKfu$v7QpPS!*2f}^s;+XSbXCSX8dgctErK$w)g;) ze@B*S6IuuI^6&-<_j*3U;G-$gv}e5J(+vxYt!d7z7W1eH)PkjppjhpA|JsMRmHt)v z`3a|cu+THJrFX*dT!fMCfltF+*i2aJ-IxlvZCc zMw8tBMwvRO35}!kmMw|YY#e&ZQW-zpO;+MDGySH9Z*7Yc-#1h+?)K7ypLt&2+n_UK zFlhEidUoZkg)UKA!+$Z?}WKSTVoTz@#w zJ^Yt8mj{9-|9$zf-D*NQMcZJCWj|yY2?W9Vr7T1ngFy!iK|(mC?jdaNez((`(JQnn z7XS_OP^ZQLv$0s;1*n?{pMCrBzx)8v@>ecl9YwY6pXHsVuNwz~CIGsC{YB7(K1{2} z<^9pLIB)ikRQ4I5oC7hvB%@dHi21i4I8BNU2T*QefE~N5j@?9TZO<+e!?!_UJT@=m zpnM~`4^@I7Z@l`QD;z{;25id?;vq=et%6j17U+XQ7)I_YuSMauIs37j3ziM=JU1Na z$(CKcEpAP;^XNm=aS9K^Gt6Zz_u{n`bxNC5(J&1;*64=dOOn|UJ0&`IFXOJ;S?4;u zX7f|#;%J)Ry-Kf8U`L+uwZ73;>}+tOqr@p7Pnp7wHruxpd>YS)K1(HREue9D_Ir~e z*YKWkOWkt9#J_ zt|OgB?;ZvP@D%k0@oHuJDtz4&F3B|+@iiY+^!YArYLtYOy=;+gr7zYqSHLOwsRsjV z$oB27m;Z!eMaQWSgo`gbnF^tKGwWYOXmLEIda*g#zA|aYP?SqN@=`p1}Ou-w9 zeEz7Alx5oBHkk=4thkrFN7m>@C`?qFY2c%t{Xf-RXIPWjw$2C&jwPT1N{fn$ZHy?0 zC=km*jxvf$b7;{)K&6Q=5P{@F9RU%D!XQc&5y7E}5A=wXKLcYEC+UtGSyVlwgwkmUuIc?B9oY8Kj@o=rr^&87C+3YeN zw-;w;v^(Y;NcCz` z(~~LOx+i*(%Ke&(!){?=Z5Lgs_p!W0NK<6J1}LMIaz9;@r8kB8Etzd7(o2+S_(Uv% zV{O?fT~p(u-A5DWDPSDe5ns+-kxZXR})JK${lVu(F@HvIle9VaLI z9+J-bz$d<1Yxmt7mE5|N3mJ`*s$CMrXmOtdF9plSC({}_7t7U(&3jsA*d9N32Xh7a z6ep<+*0l~lolBlcxQMk;491x&tSIyO@$z|Z)IkWAfD~atr-L^oLWSETl!FD%Cu-f3-QTTvrz`^dg+jCF%|8w6*@+CS|w zrmb%POe=GDTGjOSx004dEnBs-EReLqa&dv$P3xhpPQlu0BRPARC!-{jnzJ3&hM%k@ zYwTT7P#LuH5Tn>C`jy6QLq$I# zl+8h6gEKI8V|W8FO+gPL6;}hVS!<+pS*Orl(4Eizq=9i{{mMQn^=r3OJnCOD_u!cDQ|=b+ymIf8Rb;w zX6uY`eSw|<^$lO7LemUV5Uds2{Z*nuR@7oy@O2J@3Jsu~u;|&P4~hZ&{R_Obpq0un z$;#l)fCx-NUq*J0+2gqEK3=%fI>Dn%I5PXi-mDaP6#p*DEjEsH<@^yBLXzgE=wblKZ<)ezQ_tYWh2TFZSH>#t^=5}Wn??Tss>h=bTHQXNEvb_r3*uYPy& z1zBbZyEi`Rj34f=KdDIBnB`y)>6(w5Ra7eycg?0l;7L9ab3!Cr`&Cryao%C-*%RsH zksyR8u)`lLL6(2{&l9*d7ywV#iM!|V0(kOVeUX|?^>G~gpQnB!CWusO3js*2(AdX+ zb?fbWADf)3$xs=07{Lg|Xi{+tkj`blA7YU~8W&&)$n8qQy4TkNaoK89s0ogL{YKhT zaarbRyNoP@K?RipWo4& z$0#&w0*Ueb8JZpba@UQsMssq9tu3w{l{mPL6%tr2O@8w8t$6c<(3h{*980eCsqeOf zEp=LH*=Kf$xS8oannk&b>s(K%e*%6n2@h>Fz!mlRN1oFNhlik(LrPtK#;B(4Mq- zx%Hj|Y5YUf{4}w++9lN#g6(9?vk2l3;geY`&3n;%9e!D;x8An1Kqk%6m<+UD{zDhZ3QKG4c-nmy1Uv>_jq2Pf4c6Y z8>)w3-|x+C!3E@o8YmNk`+OpI1AqZu8U^)AOXF1>%H>E|-W^ z{++FH_jGYxHYD9DCs<@sp0CRIZu3M6-}CPIxV3$ydCZp70@*rdYU?8%lSEvB>uAwW z33AaLB0-^OncYE0-~i5AMb7wC)qi z5!Be{y0L4CrrQz8f$H+GgZz>5!`o6N3A)do5>rOwX7RR>alDzT*& z#juI@Q4uZR$3?UeimNb~50904!a#uRFgM;sb@a^w7q=BZhpG7V)vIArb9 zX6fgv=oT<*A!f`^rLnN0u~9*RFftM!(k@xQR&T*YlS4JAtuu;n5Bc#Fmq2TIel#WD zB8oQ8K`vHT9v$fJU=eY-BLDm|x^rr;iOQMTHfG@Po@W=j#k|b0p}@oeXmN2u zPML?b%n!0TzZ0D2Y{_|$YrJW%<1O#&w{s)aTmHN@ux4h1md{O&d~;y)B{$QsunC60>{VQQw`#JyMd|Qj$*` zzlrPlP1u*!6K>}>4`o;odmrx)8?Btp^8Eja6PYzKoW2YycwZ@Os38U zg5+V>M2dhEks_e77ZM#b)$P9OQTGJhpBEh2#3$_+siTqeIL2Bl_%cJFF3ugQ&^`vL zd%Fi9A`3(M?FubAB6xv0$mAPP`fk{UVs2aW5V+~V&p)ywSTBX(BN1tq6=Dx!W+Xd` z)dE8)(?bA9>OX=bpL7HMPZWD`rOg7??h0E$@W>SR=0JFJQ#3*UACURaTXU=5wXCx; zfLXcP@tR$1hn#e2^5Wp=g*h5&y}TVz5Wr;~_*{B0cM9o)^_;;@G7Nqj_Lth(k)`6<;Q$z z0hoyq&}2*I0{7^CmMVqoYXxDqwCfbAbO`hF6zT@CH@2>vUsi>a#o6H%^tnd~=+dG& z6a%XNn~*}6F7%=oH{h-1FH%w)D?R1&)BjQP?Drx02eQ7Kf01cmFVtt>;NteuRdzln zDYp?AN^XzM{V%EiaHi5IGl#OL@apZ2_)EPZ$JNSXs^_{n2m8(HFfGieVxOBr>9#9C z;gZW_fu?>GT}(hMfZcIU4#RUMi~g<75$(8_HUiipv-_ZlD7M&IJg<;^D8Gi;lbxIQ ztF&Th=uZ{)G5OceU73%1Dl?!__TjhdpCBzos&o86*uK1b3Kd*CjGw?3=p==4LrMd? z3qE&a`dL^|kShys3sl)@cX^EFut0h)Zi&$Iv_HJiTMk6==#xEy?#x@cW13wOJT3u5 zDl<0V*lo%mT&QzdVEfuXi-EW{*IIgh^o>8d5L~lO+>(~FxZL3r>D#~hZh5GiDSf<( z5T9K7nXkUV7dj<)VZ^ypD6ds6Rn1K{ zmiEQK7L2F*==9E9K#b~bt=k^rI${;`Rta^?fbA+$dj1cHmXB1;OGR`1x0%ai6@|PZg$VLBY+C@(rHxTGq z{NO+sDPv+&B5&&(VLg@T`uF3#|IKq= z6T1WHUZo3@HGK-6X-!FHgIl1gM)wz#fK9foa|pjF0aP61`*{p%3McJLFE|;nEg4%J zaFZONdb)u$JC2>`O#N$Zyt3W^@Gaxr+PFJz1Zx9AyF&Pe@{;|!&+r)hcu^2j@G_(p z8pA|=8nWF)_X9qAM|jToo9FX!-56ddMiDAm1B~C>4hO&s6~X?oKjMTOPokUIu`e{G zi4s6(7*4{gJ~-dmNYf2u;Iz(p=+_iB_;(-qEym|>2j`0yhMA8vfyV@u{-@W8BWuek z{qD$b+CR#y`zlo2yUqq~{Fu-+8lY5+rYChnQ>n6240kT<&Vh*i>4!gCMf^XCjf?ft z_sfT8U3nNq{T$~=FMPTi2o$^I#nx=#UY zX9WFb0?XeZaSyny=foXA)_m#{zr`51)kj~OuzA_^^1+>_GS*okB7a-DMgsXNF)va}K zbP+Mqd+$A=1_;Sr?tR*>XP@_;@BRL{ftCE`nk#FT%sI+4p0UUSezH^j{hKh=YiJp$0=|6svKY|o;_Bw^;pyca^dvYWH0)`3?2DIi@d>XI zlhQLXv$At?^WJ^OzVf*^$W8NNdX zkwIm>+lR;iGKh+j3`(RUjgvt;LlyY6PYLatP~iwNXy$qt8B~tisz`%(Dl-rG=ISal zf&MoR1McaxJ$4cgYQP`Xne6PmMoY0NFCjk8UtVa&d%HhLjFd8JeCLuRxoTuPK=Z+mS0>X*9zN^Aj*?L?^iJUkL!xUA)H$Yq}Z?TkT9vejNB|0lEle^8HrSiy6VK`l3sR=|oqOd!45 z`tohm7;+jmGX)hVg9f|-(RI_?>fv|Fa^0$AWssa3XI_cUUo22#(|CZL?;c93$p9ol z>iaroKy4{@VwUq!3-l%!9?Va5)4#1#gy`C5xLpYcxi3lIe)NX=-xq+@B~3KK0CRZc zhbg2!Q`GV=YmoCN#pw^N$Ey+}s>%<2JIJ87NrJyDQI6CA+VouC3qX`U2Sn+Sl4Xeo zGH64@2DZHjCix5B`qRzykIlA6Nus4DgTz@6F=WtcsV@qC22~G8uQ?^a`T{yqRwQqY z3_;r>0=5|)Vwuz7 zd%>+FFy^xICMmb&HnP~@zMZn!Yi_5pt7K42+T{FUD6mGlt+tV55b%o)4{Lthv?H>< z>3G-v+3dRh`7w}F<3-EeD23#9sZDe^<`Fh*>{8!KsV0We)TqPqa>d7>Tgri)9zvhh zbZ8vnM*W;eu5#1+LaEQT^ddK+g+7jVNEJ^{NnDgy=viAU+lJj*KnD{k58MeE${U45 zqs$>f)WAKd*;Enx(0u0lNbGxtL&TzXD5hk*5&M*$iA8qB+dk_&sJrx@NX|uXp*6V& z(9a#__QDrh?rrDM%N6SOt8yw~>P38b@&NPlxd#=KuHygA0ZAMG%{J*vXo}vGiH^YR z@chl(tOR7FgvujOdPHXuNH9b4A+Uxz*nj^dI1Q?R`n(E0^lAl`r-B7im<);y$Uybq z1$GEWIaC2cD11u>p=AJ@PoMx6Z2e0;ANZFV`llEMv?yRYu56lGx1jfUQ-A0zdNPRg zqD>KUkB~u9F*706%>gZUFnRu>M6qTL*a0yJb)YM1s4WU(x5P=*9!p8u{#GbpkTB=` zwQ2per&5POKZi}cL2aHz4Fla6HsFyUoZj=ZZgxr|hB-lY)=3GB%lm@q)!@>9Y_)%* z-~LC}31gvWktiIbktLSfp^0T$=N9baW9*RV$0&+O@!L>ziBErrIrOmB&G-7(GTg%e zmN<$@hizy6l%Nr%(EAK)-xTtD8fIVBSmWNTjxI#W4t!yPUbXej@bPuX9%^^b_{#AWQe2kgh!J>cHq!4u=wzz0i$Qxp(jli$gaMX{q_4NKG|eY7E)wdER5$o z;i=b78Y7~-swbfQqQ~j`Y}j`}2AJT~BSp3EN;6$D$x9`C{- zeuJn}HP&q*iBI#Z5;wy4uff zTi;iQ-PY}dTZGhG;KF;(B+T!oGMg$JuWj=?0_ID_Jgtg;jGEO6h2tF}O#bV25TYl3 zzEMn60o-H&xp$KydpxaV*bdT=OMF8H6=FH7{A9ro;2Ox8^BccT|f4g=>) zs?J|qsk1;o%SE#?zqnVN;1ZnXmZ88QLsX{c6)yUE2*<&j98Mr_d^j)&*&gP;e~D6d zSmQ*@{2N!8IOHLyUmgCO#pCwkZj8Cnh?cb%%_wt6NhDKon!ekape?C29*V;cb!Q1; zUxM^f!7Pi50kgK2R-bfaX}()S*NPC+PNrh!X|*8<;wxLI**%_ZuBnugcLjc-o#xaN z;9=Ft-DfrVzQ$7yH1KjNH$~{TTjEZ##5Z7r!7a2~aa~!@>ba_q72#`rR^wdXWnA61 zPss2t!ujF!CiJ4l-<|xdD{qy`e%YFJ_7+U9j8ys~OX*L}gR$7B@C_#zJ8DG%kiFRo z;va>zrwoWG+CR)bqo17DFaH)J*xQ`$|JhMZ`PotZr#G7K@rPA_qxz@2XWCB^)y9n< zKlJ~b7|D+$bdo`Q9<8Vy3PA65c?nXkz?e{<+w)QVBjfw*>CyjM@K`CCCUMQa!EEmW>QOUs5h&7YrXVYwZEcaO{4uOuGE4%(>!t8ZudPK>%GOI zORkpqqO_mscF&%TaDKpS(HR#)`@U`Fl$TVbtzTbqs7vFwjrnA&UPmW)XJhZ|q`G}G z#0(E3K0A22P{fU!@=jT=2xtDMJt1FqZ6V)RlqPN);Aa>s2n+IZFF1_Ev|O%z(b{8x zFGkO?);&Z<-QX~ul5`ZIJ-NI3S~MXSWr5V{%;_vWuARV7yd=KrU~~^AerNz&3otBD z6`n09AcH8IGnyRebS*ZM%v&669B!G%E-vgWVc#tj9D?E9NUiMVTpQ_~{kVvX3r>hL zuFyg5!>aJ_MIAfPF7b$|ELPVBU^%_{D--tz*H8lXo{hs%&z#nADxz|ZCj{OjFFh@I zpLIxKE!lNvrC;ZL%vtB0xhSnV6JaYyVo>;A*Yr+E9}Gc7;GDo7T}lcKk%F8OAoA5o zCu>y14$W(P_>k}=wc9(+^J~BD_n>}S=PTtfyZ#o`ht|f!tA3aK`h_!x8nc!XNW53n zJ^e!>)E`?-fA{)Wo#G}iaF4RC2V;+=9LQSBcbLR**p3~2UyYE%@YoEAC8sNWp1TU^ z7~}JdslOX9Ge|-G!px&7ddNi)2M#a6(k+hh;KibAv~q2NjH5MhkuN>;RPURnk5squ zIlYqz%$RTE4S-W4`QH;z8A$49lc**#C=$+8LqBC=qWPNDfZ$}uCGeFh^RA|vN*XVg z>79o#FAV&;cO3>{otST|z20yU!|aBB0%MYwn?(4^srIrAj!kW9gTm~J?1mV*zmFB% z)SwK7HO44HEC>col+EUx-BQ8b+w_8PldRSOHxm~Jw_}s9V_UpbxsR_P?$-40*x^H; zA$@TI_2y^sV{wPirbe%8tFNyRU(guv1zWPu(g_*}dE2+LHGAuWm~KCaIUAW76UVD# zlo$n~%sXFW(mGzc+n7d~cqZtM10x&_dDsbheQj}5Gls2xiSqQ-sqze^qI0Gt=`+NL zr8~j=9nuec%q%@KT8vo(UDwN(_nYG*ZBl3)tPO)8Yem{$eM8jIAxNJCd(ZV|o(CK! zuGBGnu%}d_>geRIkLiE(nY467PTCu1W};u$zfFzlbto#;+?^~!XWL{s*nL%RE%klK z8giN0cjd-Q)-eFz#0y(9z0KnP3as>16vS_ghocMGjyk?5ZO&VZ<5L3KZ zdX2P=9GqSsGMEx*au63j^wW~i_N(%Xpf507qdW4z(U<-64*GI>T{~Uuz4uAEF3@#2 zfjYqCQq$eeFYTWnI~5?F=wuANR%TvHeWYtlI@vjiXMI+pAT*~EGPb`@XT+yODO3}l z8F&rk?-Ra-3QuD~s=q-h;aP$*&FY>_c3hd8zFGGDp5nzDwBJH~t0_4X+MK^;#y_49 zh_a2#d?%!1;9gfWo^d5oa$;V1%jD_^@6Upq8nB%~S8PU#9rm^Z=I$!fP1aysd4#=QA z)Ja@`9bOX?8Ff+38t2f9Mpw>!YL(lYt__`BOPoRl zKtQVI7hAC+T1lGPeixUD|fJs&b8v(bfF7kzj*!Vr=6 zI>?$rvHi&9^91I}IeciS>zxWrIaIK7Xj;=1Q(mj-GhyoG+)is3e@+LvSQ0t1C6yu} zgnZg_*Uo%+Xn1c0U98ujotSG|H(kF_)IEg`+FB1Kor`WPTX%!zTOLKc>yQBRjf#g@ z1-pj~RMJ&G9l6F!$v(B*m7}X4nBs2DH#I51T17jCbBM0d#BFS@LfQKrT#e}LAC$e= z73XsEOco@AaQsq1%FGuUO1x~9rREq?-t48XVBghH9(W@-P;m~^BF99GDH`F6eAi__ zZkI0)%p8b=ZTAf(*H*`k;TrN7BW1Yb&h=!??o|PHe-0S1;fhC$R}EY3Q~*o5gPJK8mVP zZvXqpCdy7zpe5~3u=41TZ3ofu=6&V@c(dv(=h?*UAQYlMH$h{u3O#{1Y6TkOXpL z8UZ{rw>y0zMQF+7VISd^?sfj)F1k`>7rMB!rou;ZsHu;ha=PoH@`&=&G-1AQn8;j- z2MQp^tO{Z<7C!6-%JLbAj*}0>_i$&#Z~vO+F43( zUVpT4YFK6QfuW@^?TgQ&CHMLn1cF@`QIDGw)8#$Q++Ogk#}xIs*nWsxFuc)3Y1-O| zT^)uoBGro>!Z^f&OTh#+`}wNk-jb43BMZCi3qd7|ufmx@mXy?e{t5?85Jq{iN#A3w zMm=s}yxr*VXICxguU1|ZPv?)2fU3d-rFbw7LqJ1#7zvR9lADS61` z)Z&9e(emhwCO@Ol@Ag~V%kK%62R1gwg$*`P*&0ix zac#YALK}snS4Zpj6{ZhuV@3wXhi&7X%#22qJrF``QJ!3~GJxlEE(iUr6dVj=K|Sd~_(?JE=|=c!sdAS|e2l&@PMF7vfJ z@SZleCW&1O?;?Yqa2k_A>7i5FMCxwX-pQ)h%$zP-B8luUBNq%C)WMWV%{0k6b*p%ZCj`~f9q6ybZ z(ffjad}PokUkNhk`NED48I<;n3_4E+otaPAz%&xSwS-S&etq{}H?Qy#Ha`WRvzX6U zXNhPW86;7hUa|h`yDxt9q&7?yh$Nl$jEU*V2Y*~l392W95@dh#^~-foLdOI;L`XG^ zc-_XrrQCT?nBCrx=ZTVkB@dxh0WpV#_>D`b&zTSe8taU=I6^ACw&d z0xNWr&+-w8uG*(<`;0TY*l!L6HoGuh=1WPx_~1e68~h?%!Si6pkPr>@^=rHq)AEq_ z=1#|nWPj=d-Fs>>Gp{pGdZ7#3FICD9?UY{48a&9~-%C9&UM4F%5}XiUFimv9-v*@g z=^2qJhf`y=&*#s5e;+mI=zKgFbTe8{qSbg-k@nIts&f?&t*Gbp^b;!1Oa#htg&QC8 zL<-%pY}dFT#yc~AwZ|j58t{|LCI0R#Lr!2FgftmToOzEKTo252KCTeyG1S^3m&Ra9 z20dD;k zkXwdC?2n~QgJ}t|a%S@5p3V*2vRzjqi8)bx4{o0sj~#GHIVI~TL@zg$)dc14DzUqL zt+PfIky%|Ev=q}ZXOjQ^Vf1B9o~_XrrHv=m7Mq=z7i1yz!;$doxUn3kDKoID_9-lX zSsE3-YMeJS@XCl~K<}|Rb0h!y{pt8Zc`3e>-YSvxtZ^-OhglcTTP4G~sJ=8DZ56B; z(asGy5Z3E-MKRcPj&rLF_3H&HYZ@i5?`gVJkP4}Cf4V(+9njsJx+b4H? zx-%6Qrd)QeI%=^IdjcQGkS^!QtnVm$&tH`j{m6sF-iLO5eQU5#ita)Z&E$O=)!TvM zG)H{`uPw>sm5@PnOWsAH`3RP>G5h4qJ=o*que!5d1$wZTDP@KX8$nTo{J0a636ilN z4@$dlC5_KJ>ucll5w#FHhc@W|Yi1&3wPkqWxZ~$LUtAl%4pra<7==K`D)!jl}Sm zH#5{KLX9vT+d{E-7PAjC4pDIb!&?2UZ_zF0vUT`w8y8zg6V3z98y^vb#-~Lw#~8Bt z!>lPIKOIq#NTHn%-SxnybGTH4Kq0ME$$usk!&D*(WBqkjELm# zjp#U$zh!l1dZ>2!6Rd1JiYPo=U(}44TIOHs2bq{r4A3yRr-0Yb3RHWb(`aaE)X{WOXC!@h*ON$lxrY!*?--ABeq&%S>zB--dWw;_rTXMD7#-zF%FXy;j%rt9D zzYp;wQ18?cT&9D#SUHkCt#$07*untX7u~b37}?tv4?S#oCM zc>>WObbms<7a9GoPDD)cmql#29x`}b=638>tKfNZQ~@`-yaW$L0p=PGeT~$L>wRW8 zkRUEzvY}ywy~{ta;rm`8f1{uw{zyt;P;x@MHb(pN!Oe?!@#yubgzbT)N9p1CDBK^w zDgTOJQEskJSrbzX{)ydH^$-B{Ai(@1WZU;s$X4_p5vB`dkfjX}W`PWiTa=M{H=yl1 z>-<3IMZkSs%uo99=(mw+`CfXDPb4n9a+3iEHgv1j+*5@&e*eqW#H(1UmobF9qf8W$ zg`Q%KV|=CMWxZP>5_ihVr`Q}GPbZ#R+`WE*^3CFcu&Q?Vs%x@L;l;wYA4|jRqUbyu z&Vd!*+|&Op_C`5B9u3)$Z3LoYPCpS1P;{sn)Zc@7X*{qQHz3gWb1;v@0;oMQ=|M%y`pLsWewS$0pvLJuS(#TCnzvAWsX5K!kJ8v+Ru_`&WZ?u2 zd9ECnclnw}(9UhIagd#ttBbMT2Bk!S!+at)UbyW;bux*e*3KVdiE%s^Q_Gv+KU!f| z;POcUF|^#|chRq{4orxd8yjelmntmN9xAXra>1let%5pbqgoxy*DvrPPnB?M`Qsrt zn$-67gM*J?9#)&=t3?JaiZ9NjzFzZjW5(Y!=Oxr12;D5(FRa9?K4C7)jOe&XTRFj3 zF-k)QS%r*MP#5}A<8pSM<2;&!qsG2%9!MD3pG@#mQfnn8mXE$59dTKrLTEFvLyaCC zNOXU4Vqs;yy;RzrVX`NXv8RwVYX`UN0k{{7(9D0wtC+3cR7bF3hu zaMC|m6sO3b6**Q?@t!x)34!)g=|ULFy2 z3-uwhPTy&CLOyK?@bqrNqfz$|`6%(}dUIZrmrEC=>Pu@qlcegmKyOy#*WnL!&Er|c zo9~f9L01y&`bV7aHt05?P7BOJqM&Sq^2vf~dF{!A(X-N2tm0>U-1%@U5BO=IiC6{U zS4S@$br#+^^2o9xcq)#?@U=#j%$N7_r&OKH1*X>rb|?EIYuZ*N7v;rrrD2ac)t=Jq zJ_+KH=%=OGMt^9)Yxu1RL8M5kK_=&YIuqK`Ub`B6=YbwRCHhRl#C;i7k?{MN%_Zg9 z@7!%qzjXsPp|f_DCp0g6Y{C0UJjd&}Z;2?#cu8&W+c>}6PaFp)uE^0x7-UG2L9hxO z!XjS>RTCKwgp@r}>Xn&vDBw31cm%!^FXMJ6Uhb2g+T;!VFh)doZ>x*9KV(^gjh!(# zKEQX`h@tUuE4$QYDRb-7#sZD-7awlzdrR#ncfMOF>l!C^AA)o3kOEVMU>$rkMh}rkGRC9z{FXzNsK)ID|XAOkP%I@$DQaq?q@Y50+<)Ebq_8y@Z?B zcAM1zh~d&GSihzdDLui7rXhHk4hK!>kUMI#B>Mi!A>1;DqA(Ovznb zdk<3_Nf_>{ziz$mX6(9!xPJA1N|O6ftaj!3 zx9Q>AWu07Sm6>h>!v1kApN7$Z(0+0A8E$27ZGV)tSQzTGe4Zp0+-{lE)~(n35pnGJ zWQfWxbuV+UufPOkK%#NqA;D#u{^2}4E#GkPVPF5KCgq%TkGQXJW3#p4#q+VR$F0yr z%C3xrDdD9It2v}WwoQN1*jw(9WNVi^c-yYX#Yq5eO&8?bMtkDGE4tI;EM6|lc8Ez% zKnka2>^w`CV>r#7vG6U^+hCN35vLkTq{}%BZ5)z{kF<3(mXo=wFoR-bXotAGFmc0I z6bUrl*>%Lvn(d-ye0rR{b^7w>h|ypi^@;~>xgKh|n}kfg(8Dyp%F%hc1)Sahie_J| zG>kUh8L)^NVhU&L6U@-b;}E2M;|e+%n5K+;{aD%bMrFQw+g|FZtWIVj)xAI5&A%r* zi2HxLO zCEyN61Hy>;pD;ryW(xCnjRya7jh6Q3H~&?uPU9S$q>Jl-1Ghp65ZW@=&4T|1O)UQm zP2Ad|*ij9K%~Muj^uK!~mZ`)hVu+$5>4&yROpIYDyRQBKl(d6%q3G z3bZkS(9%tZruBj9n?3fo&=bOQxW3%buO_N79hLT#D(s$7zT&d?XlG~hRVR?`A4m2a z^5)skS6n!}AAWG!JqbRV09Rdz+3ID+*99D?B9#c7?*u|g0*?}mv(jUE>tt9@V8+y; zGmT5v=Hpl4T0|%zZxR*G;Z==W%V%CxJW)1(K^}@_pK)pN=5o}syHz9fsKhrKA%cDH z_42h~okqT=rn*=HJf;s|Sbz6D^#@=jMXM(#Nd*;#+TjLVb**@*fqw1@2Y@0CFeV4w z#SX6+_FI}UlcW|Qhy3if34RWn7XOwKeODly$oR%{`PKnA%+*KaVGmb<$Mb?@@b1f) zIOz1TvV|OWnd;`jrYOupH*wn_A@jX+xr+T;f5eB@I7UPW~D8{uXqC7 zaVJ73ZoK1#9*$VPkMwopK9ih#IZ7Smpr~NRWU$!5yyXeFw45Pbdh_O}`O4Y5?U%Mo zHRJXm(Yl{wi)QY%FXc!s9m*4e4-`D9r(86lAKxe@y-azn(R#=;?~yNS>8Aj3+(9SR zpbn^(y&aOBCPv-4AC5Se$>yFKvE)Ab?#fl@QqUL>;%R!Nv7=wxO7NWzFu8!%HuP!7 zLk-i*#pjFWqDQ6yUtt>o;^uDw(&zbb!vj|R+q|*;P!`cp#el?{1My`0db?Y z|NQOJ$V{&&i3tA9VIt)irOu~eGAIe3u!i#9^)Pl?C$4`lUxwhrJz0Tp6 zhR7VeZf$8t|2k9ngRqZhlT-S>P=G%)4o@h$@WglIq8Px%X(zGmKAP$B?u)C5!5jFa z?sd4_*(j2?ENV<2PBm`TJmM3<@cm2UeTEf2<}Gw1c5wa^?1b@!E#D(FQi6LNal8A< z-`3ZK%iOIyk3`#Ug$qv?8)b{JXBkzy8}p831icL<@S+`oY5F3k^e4oGpXczm^iME0 z?bmWS|MnE%Ekyh)=pOecROde=M+0#2A0fiMmH26rsv2tf8|;u~89eDgj2`+s+kSEB z&#BeFXbO?>sf;*44Lp6|V@S{(2ZGA4Hl1;U`ri2lo;6D@MuU~w|s?gc3q zpOM<9qq6eTc6(4Y7zjb&8xUjZQze6R?-+bZhrh%~&-i*MBeMX|Z|6&8ryIo^q)z9W zWT6rZLtE~3`_BerhL2)c=>{;J>+78b{% zMSIaK!|7{FUzlWhj_G0=c^+y-Uprf0@4`sY% zubS;aTnN9`6EoNlqVJRg^-|YTl0cZ7$Q6?H=J_Pyc&Lx}mjaD8VCs+61rtyQo`g_! zfH!H8KD=Bu4H~zpD6edFwiIZ0SvhgP_M*edsmb-OlHT~?h1jc?_6liyKJI!Du@#Td zk_4Xv6(o%C>U(__0yn&*caL6L7xJ)T1Qo1b;X<0UST|3A3+TmZh|lJ+q$RGlIOSHp zSqlsoEO_>J4D^pbbBpXPK9KQA1_n0yA<@;gpEC*PKP?33H=b47EuG6 zUOg>h-N><)Jf(2%;e%+MF8k@Ka`)RIN7UN%t{vs#Ii81vO+|7x_lcV?7}rLXT61-o zD72(Gzi9c;()=Le!)Z$4BedH`@AYe)(0VLcncLC4$JUc^>qDv92!Xnl3@XMpX;XQ9 zT-nHjCMNmx&4{?E0EgC089sLdvF4BdWyBuT*z3#-CH=7 zg;y{Of7_j?jdcJK>GAzdSRpOy#&SKwwxGidPbd}vprNNcTJWR^%T>5K5q21`B2rVG z#z6=)Q@R%DddS6QfpzS9KL%{*54=*_rOb0v6``DAUEmlmhg~3w#O>-_qagC2GA(V7 z3mfRiPB55kPAtdu1zBYZ3mU{8Cxd(hxuriluaiMX&R5wAqLW@`Np}didoKwIwE?jf zJwTcMeSiGNpOl;9Qz&8z{GU)*QXe4=0Jm8G35A{i2Nd@E%juo$T*j5S>~=S*(R{v$ zDzql3nrPD#qFVLh&nJqE6yJ~$nC0F7PTgB_7Z!}XCiYaa(|aFT#sJ$dO$@N+soCFB+NYgWj@XKU$hI4LE#J>BF7p0I7nRp!APEWdY#GBKr6Z7ZojzE zLQ+RZir9skn%ig9Mz7t^4RV(VrhJd?*B}C|2lfI1pKebRQd2wpP_*t17+~u^d9m~H zN5l(H383vpsJ-*i1a%k!wl9b}1;dpl00TiRcnfcfZJSULHxBv%zC6-l=Ns>y!8FMl z3&F+u^`W+ONM}%!2r+;S*hvP_2&`I@LCWAMY7z^;iQdri1uH|A%INlHchRI9urepe z7Yt+*3K*P!scB%U^xwm=Vzofh&*8@~l0E^*b=+(v@}-rg0U@_A2*DWOv9w8|8q^Pr z$e_;a1R!T9xBx?Z0l(g3N_6!d@J(k12J z!=%E!fjeD4ux23U17DPw|INfc`kg7L3r&yy=Tt+6Wuj-{(R*q9p4HRytBey`8gle5 zQ>{&OoR#Mo3sAWD(YBWtzns)_md*FU!#kT%GMLg<;>$>BQvGFMh>Q9AvS{pOg6E`@ zzTovobvZqg@4l3>^~A3Lp7(^T((jmjCvUfo(;>z1a@q$1VI^S>Wf7`QU$j{dVnx|p zzDWd)aO_1lK|aEpV1eG5`|Ayd?#ntQ5Q)JDbb)VXgj;t7ApX#2aLZ29Z9%1MwCc#- zNc-9PhkE)CQ-lh0xcTZ3sMpw6Bo4o!B)jcTUGly;n2>F?;V(X)r(KTW9IwA^Z*n2w zmScq%73B0v`Yu}3zOM?|`DQiF+*}i=HUrnc=cw9M0kC9`BG2N@2NTS?Sy!vwTl0*k zeBZI0*F0)4gj)FPyDuv%9a=gg%rk=L?yRY{R1Bi|6uH zr%l_dM(}>+DG!n?&u)hcuQnUopu81)4f3srm<+z5=rMNMw1g-MhpF7OhW#Y5j?;(hkg%E%wqx%D9mI?T*@N(azAp=u5;wPBnATRrXI? zmx?{xT3*wemcSF&bf-?B8IJd4nL+JNFZ-_A^?%(js_CABtg=slL+m6u$}lJPUwTn% zb+-=Ldw?gc%mI|N?v77?{rD-^qqH#C>6(FU_$e(L3ju1aE*FGD;MLnD>rN{xy>p!{ z&vWnSD{~)-pgs61K&O5%kT=|hN{oCwDANd)IT+00Z`9t%$5cN}m z1z@G)OF|lW@QvStzJ8n&P9S6fg0#JPe1{qUK|96FlU6GF`*zTDDJrhbbS z0&LOqME$D6=QXhGWfl&8f!W&@4Ki7NXH@#4U%dLF1N(n1E_D=jo< z9Kq$Dm^4npDOC4rC!hnahHj&e;lUww7fD@XQUnL^Gd~D8*pC4hg+WXuFN&77o2ks} z)|8FdtxlLYf4ae4F7f%!^J7d5*cw7LNfmtr$nEa^aU&z)^w5?=egL-nD3k{7@O!lK zC_Q{$>i6xEKhL=Q^><(jBmtm>W+I?w-f#buf7jMwOVj~)Y7qp$n70`IiKiB$c(Q{% zyYoMI=edp7oP2~aa`WZ6XzFk5^8m7}V5EvJ_x?;U!IdoW+$zp*y4$~g&3^irwu;3f zae4UB8!8=UrCiWS5L4w}Zpvw#9WxV6_yJ;$@88<)@8`xRlhnu{z+a~F{eg2TLLUAy zd+3*?|1g)xPZ(8i3#ie>8WA$+z7?9305@3G`kk{n)LH;ww#B~Zd8g0agClr`rR=@B zisa1BmL_>`y+;x_17kGp`DW*Qw<=*8J6cX@A`bq%aO0UE)Av%Yg|$ z-{Tfswvp8Td1IC1-dkkLg@kslNyUbkHmS^y9GAPk?JwHt7y1yB9$dUQu5Tv`_zEFV zr}SEM10YV8P_~|9a0X}|GHh4U8#!lHF3qG&Tq+n3$I!T9=n2AV zcz6G*(bQxQ_kHBPN7!4#wTV|39Ixq9#JuEjYEi(6%Iu%c&1)VbgWQH{>!!>((u0!W zeXVJpFB)XapP&F!v9u7{c9>(yl4Wzygc2XSxq^C`Vr?@q5#cP%Q|q!57L%$C1o_}c zZ4^=CqNqYIZinD}p&m;;laI3B@61gBE@@E)<4p9>G)Y4R$Wy=f3dnbJ?LFi+*nD8NenCcDTL8MSW1Ba3ow1&9+Xv2_CxLGA2Pl;1EqbA~?|m ziz0+E9|9$sn5)W5m#j7*)u1~2Ax7XO_e)}<(6R2Mt$jrL=ZL7cKk`aG^LF_|-3iGD zx+9uzh&-W_u2(q5pF#!36o>R|ovIrha*i^Zn`wkCj8}zCKeE`AM&8@sB7<0KXb{tE zM1JW=q#SE_=GogyFZ2T(UZwgg!o36*;Y@yCVYJu)zcYSa-XTGf`@!q}EC-EsG~Ew$ zEW0LNY38z}bGK^=2`ac}O9TZpATJQ;@RZZiEAT9nM`LUR=*8`JmL6=xHofr{;xe37 zbob-Ui^FyeYMkzTGD8M(k0`gSTQE%WoVY$=8>HFPD7c|`q-+3U-1GM1>Gw-apW7=A zh5cIghwl`Z*M0z!pT12=C2@vv$vbC&^m{|8)XoIToat{HXRD(j^fzKo6+ka7RtW@? zE?{jY1xw6a8dG^K7^@mOghvcbB_D^a8I=p?9z9tL+FcJwmH7_kBXZ+Bp4NzD1Dl)R zq1!bP->9{r$6#|@G5`3Dy*p<(70oYYaOqIH{p5HtHz5@Xy%T96v<6M)XG%X*eX_X! zq}}<`);T_^_r7YawWb%oWmeuRB0hbY!R#f+Tb`{Y>5i-U@VQu-Bi@V4{~a}7tT!!T zxOKd|qqjBDVFGY(iHF0SEVyvN-KTs?@gv;cisZ zEBk^#z%2i!S~UA|>8ogsJ#_2%4>QAL?pk^w`pIL?oI&a|S5-$Vr-1D{dJ2e7piiIJ zm<$FjWKdKgeTdfpdKWWsx8pLi>$6#N_?%HqkLb4MVA1-zs94dQ-NuNSMpqjz&&pTz z^XW3Yg{sO2NNl{ssbV4f(;H=nhf3kXom*)kRbb*7 zSy;Fmz=j)J)Uoy07~pgF))+lrQ=9pD=36M6eRwARdw;LSySK*=4BWQ{msSVi#algj z-!z6xN*BDEnTH6;laR0ySQrQP$;HQ_$ZL5vk%`CR?D%F{gU@NbqoF*Rh*cWs(3(sO zG{1y@m^{T<&CRjy7oucpTw5^a^TqH&@Ts$3pFMBBb)2hfzn7UxTFTm?)uE<)pl5D& z7RX*Z9X{Ue2l31?j#|@#H5xZ>xjRcri`iLR3}k0r=Z(8v8tUl9oSeR}YksCzq-6Ol zquI!n&+#^0%nw(jD`{yK#JyxFUzqr)A>MVPc%eo%*|S1IbA=h>3mi}SII<$YCHtO~ zZ#SthzHs{tL#5#n@#FG4=c*xeM1?LlvCyjMXKt_UH*b}c^jLNW*G8oz=*h`jH6pv4 zKznNIw`ITQFke;RuGt;FpK(hMneP&qUX9@(^7bO7r-gkf)fow|(T}HlF2c1-T`uly zh|XG`YQF&DigJnqa+HXyc+@i~Ef=lwPPB-_me2W`sJuCkGU)lGEv$CHEdVX!i#k_I?Jd`m71E@x#g4^iTLxAbY zQ$hcU@-WevkIV7c6g8JY%M`&p(|1L3eP#=VB3@qC{bnH|tTGn5sLZ@+;19EprX~cn zm*W*8$Ad+&#~yR$E4lbfzZru~sDZF!=(my(1{-ssZp$85JB{wU?_aE$4&MCG;#+=! zS89VTf*&b7TSyIAu3YOvYka7^YT5~eM4pfQo{bJX0>qjaok|U)y6&R(Z*BvDyeae^ zgm_BMs~i|PKbFw1436B_1RhE7P#+3OB6bb{k-=~Ol|+9(ALMTgMS!l%1e=+LiUZGD z0)Pgl1Bk6vwU(zKoRWT(uPr0D7d9yMj~Yva%?@}Ksj z0boA@F>veuRt(%=s+`DzCf!PI7~eS$%*vwMwqH;GZ%=|;dvuji*U}P#UDN2Lo@s-L zD!8INlvs?VWxlcLh-OLI=dK42AA{6CQTt1njxsZb=dn`vjZdRqC7rQ_ zUdG^Ov0)azN?PiY!rUy6%@P+~tum>RD#s z9NqGxn^P@n$2a2QROa>Gg*zRNT~3LnO0U7LEJ&?)loh;iullHE+$PdBDmSpa--BLj z=I=!mZuP?@2He&eJYkI`|F-Yh)n&$)zu`ttgzaIO`c2TmC?1W z{-pNu2eHLsjOPntHMIfDZ_ZcB0pG1ugJ*3TJ&V-MB_K5L$KI6hTZe58JOtC_v5&pG zt5x(a17uy~-JeL*?-y~9L~zQ~2_Vu=*+aiuxz=btDG5-TI3;kuc~3qd!WzHHA@pc= zD_83l{nl!yi4QzS<@wV696k9D@HC&@@(B+zh)t@H*SH2((YZZb>rJO{r0bhOO~8GG z4Ws8JL56I7m66LMx3s_Zega5NdfB=4*IcjWNbB9Y32f4Vpx?Fn-X7>(w}dr|Ty~?& zD_F&R;Qbnpqe+Ik4sdFsH__wkt7$+|$oKqo)C5VJbOYV;(bhQ?`tj~~6+9VwKqbW` z$+$ZB6WjkWkWUh9#z+QHZ=g2#A;VBP;BgHGH^`uRVjA(Ox%T@sK$Qll62FbxKwy=C z)*k3I_1M7z zq;R*Z7Na(1*^}J-h;> zR!&AIH$B|8pS~quSDji8a9n?=rzWsCYaiyl)Eo)VU(99Y7M}(M7)bLGA_S<~sN-=n%YYK2-E(={wZ5ziSwy$K}y<_4u zns#G}0}_HMsqxv-^3lM%_4Z{ToUH87o-u`m=gZuzPgg(v-XU+2BroajZ&VyhF@z7P zed`(8jAE8tl{4+USv3}r{Y*2Y=d_&7T-dc*78^ss#~0Y#sd-af;G(+bs2%%vw=&$z zC%+s*zYLAuLKiMtL6+g0(5P;rx{W}HA6MI(`bqXu$jO4|rmr20eWc%48SN&<++E^N zga{317}43CnWsQBp>u+o>*VSxdrE~x#OamxZRYDjXp+V*efw&}OZ#9L`z6ylCdFA* zLD{XdK}b|fVSS_8p>V%$to%}*QIEP*Iq~wMxey^O2RmU{!LX@A06ZZrLvthynGD5iz}MK7G%802qiiM;*6ahz?%g z9%VJCh~Mwl?}vVll?=FPaH)fN;BJahju=vjnu)=JgmU6(IM zKP-@}2hHM`X(BLRuMPKXU*!!Hewkh^IH}JOm9_3e5?x257GK>dSW;FQ#n1!vB<2y9 ze`HQQ^7LskMn7>ooBPQ7^<1RyCutUmlAE8nCd<-Z`EZ3})6*RzmD{CU?>v}VXSMwK zxgM|xdDyIpXL>__^OX#WqKqS5>uA1J9+P|SLm1=z+d%rME^c{>J>o?WSH@h zp_{4U1?rJ)TdLyimVfo ztdlH53@J;5iLndWHTJP@nXwLLrvGnF&w0+N&icIPdH?VG|39D4$#LH^?(MpN*Ydr- z*L6uBer1n$8+P#N6B#?^E$3HhdXZW)TG;EkC~35q7hO`)+-)SXkU0pYh*9uh&6d&H zX}J2~brsl0FUh6>xe(7)xRlT85U7nr48igNs)$~fTz7U@Q(1<`EZ+cW+cEF%wXSh@ z3bfs-ZkAtMC8zPWVkS%ATBS#k(ULR(^5(-n{4$l9EmyUda)t;nEL#wck1!*Q0701~ zLwT&d8PNlh^R*iPwq}*9lOzqAmgKM?HQ)wzu`W$t(axL@O^LUv)?Q}?y(%NmXL&+E zGoj~qm^*!66BI;nx#a?w7ndh(9EI+2l)OG6o(mk%GjK5uR zpT^+a7W^dE{?%)ZJ{8@LO62A@PG=pn9HT5io4071kE4F&A6^L zlOXZ{ju;RmXS3&W|7tkL-N%JOOw30Gkw&v6Fc*xeyO{>6Qva5rU4(I_sZo#g#BelB zBBQt0S8&Sn!DHeLu2cU0jlN!dDLY{&-{u8xLve)&i zJj5$Ad3=10>qvn36_#%_YajGPR*H}Y_okqNMxle{G_3Fw#jb7wb?cj11j?63SYd(F750&GNK2L0z49+m| ziOCmfZ<~d?Hjily1)=L%C3Y5_*z1D1($!2mNFq?wiP06J?nYF9n-VK~w&k9chohl4 zFTA_D;(zgx&(@41L!=^Vs`pvob8Uuw)PLXak}^((&hDDI5U4VDr^)!!Vnq;S<$X)+ zyu(928Pd4FdB>8RwYMnRCf2j=2!~PX`%t%Zl|2VvMOhd&KwL9eJ+0VFWr9mIa;$wf zcY2E^_gv|=lQ8PF)$kC4+E^XA`Z03Mq)9>n(Ko)2;cer!s$m3cGo~Pv51Xczb-28( zb6)Zmd^T}*Ak~~=N!r}}z?Y4jbLn;X^S6an;9a5&rQ` zodvq5XR6pVh84|<<`%vZoWjJfIcDxkaI;DzKZ7Q{zKrh*JdR?)F&CF*TBRxb{FXPWW zgx|ZY*s-U$2u9p@K(B3Uf8K_rurIHWq_Pu=O`M{a<_^;>BHD)*B;}lo@#jg~XHE`E zUvCZzQr)yNb4s?PYcnZ&m^GZ}P~kLH?6+<1di`aaDRRV^_UVb_la@0IY7jDdW_sN~ zJIBVCzmR+vvEyy)p#2%S=EK({Dp>gxUOl=M#rW+qKcZ+o$or6ib-ZYwIm~hLV z_njw0JhnGBqFf?L_|QXZ!r5pM4*9m z`rk%G2pS+7VOM1xm=N7DcA#%nSI4@Z*>^kJH?#q(L*3$Q%03O>x`<#F$6-NtD-vhG z?#c*j3|cflFFMkA!??x)__3GG%JSprQV%Jwns>ZrrXOg#D3?l!@14{z=hjponCBU% z?Q1-G<6QkaO3Lyu#-r$d>Rx#9%p4!a;b5Ura?bY1%p9v$DoiP|bxxk2#6VEFcf1r{ z9u8_Khc6Z8m-&mT6NYCm)E&1yE%xy|3r_g-YUu+{t-!(N0PHS#1OdCjkStmv<%Px! z=6BAzXap|jv0mije-wr99!Fj6;ty(ZLGE!69!B9BRjQ>6cbFuYR`)Zaw2Y6|7OHn| zPrv)}%E+)h(sn5URs$vRRKwVOd8)3ay1QL!*PQY6O-=4Ol(OQa%pb}83EsJljkhLS zW{os_ZB%!glQf2>PfJtW%YZuVvG`%`S(135sM&m~kMuk?d{mL8jRJe-&EmjeSGE&b zxfYVh?<4BncZSe@@XW_Uu&Hi_g_~273oe9wc@v__c@pfQFSpG7AL7mylJc>!x7Rbc z5icL(um8~Ke;cpCJnxFq*+heqZi6D@&k)PV+qX3Z_2X!}Pww|Jajm>kegAT`+SYFT zyKKp>O+lYr#CKiBk!pqvst(Wb%8O?kt!{sP!us~d`wq;H7(xz+)It?j5_>h(J0?5g z2M2lzFlp_#kzx(ldR(Zi(|vOhpSVfO>?JpfqE(_DexMw+h5W<;Dt=d-qHJY;IKQat zVCSJAkIPzJw*zn8-^eN%vaatRO_af{!DshBbGICgGb4uOm`!?;+Qmyee$emny z0)Vc3H(cZP>Q4%%OC*PyXEXvM$CQpsyB!Khsvd+U)lRXsiD>O}F-1r=-9|vkFhcVkioHjQyE29M1=*?6_E@j+lwKcBHniut z<6${9rgFxd4}L?J7Q+IDx0OkGbC7ZZjx5f~;9{GeWMpAb0kit8yyyC$bGuZ#VqagWiweAO9rt z=U9PT-FCe#KS7!fht2hvzI#>OKWex$c6Ff!Xb`Ml$?35x?$-dtBig?9{%#j*EhjY< zxf;smcYINcsq9?=Rb3Sgu_3*P>}qyv-7Ji*3|xwWSQnwFkP&0&*Tk1;i6zw6N&>?S z@G6c?eqmZ{cc)Fy?cuO!exH&l?((I$ntDH*pTJmdwuz#x+kXIf!Lyyx!6RElq8Og- zN@BS?p{0;HO^m;wtN2NPbHNDymbQnOdHutaJPQZC`KF+?ftrDrQXSYB$HAPPmKii8lA(8brsn!7V4Q#F1E2g=Mk)NI*dQZMMA;?ybE$+nadT@{CU8Wc)%apqj@4 z08=lqG%pd7ssbS$Z~L8`d4lqZFyb zF_gRhvB%qv+qs(QSoi8B2x!V6h%4mVNp`(0S71=o<||-?SDj4As$&i^w2I$*-HV$b zFG{l0ZY>c^nux^)jCUBEZAa<7va?skSGP*H72KZhc@If1-)y+?6u+Q!{y-S2M@a|P zov4kc7$yR}jV$evP8JVe+2XtGw(f%`is)5!rni~SF7_m^FPSVW$T}ry9UkakjYF}^ zZ?Nzh)_!Puq$@x0b^^EfPHpt50@rJw2!z3e(KB59mvjOgEgicd&W5sc?*?W{#ZAic zyOP^=o7MBWZt!bdLwcDX_m_T@aiiK?&Q1LN$?2)$n(AOEyI^1zcylzJQ*7}K(~p!b z(jSV6itVxAr`{r4{CLoB&l2HD*Klq?O=ods>?R3!-vKrI4YxPky0yHSOJ6W1D)0xx zWA-KCA6SLZdtFWlWd}RBHq}`d_kqGf;x_r?DLvEEookdr(Z+T8D@N|g%569Eqx>tT zRpTzUOTk{>EA~2*W%V%Usm$a3oF};!7#U*QS`ijLW;*MeLtfc_u;VO%-%#6qHbPTO z;JVnOI*$^2r)L|_-bi}NoM^XkZn(5+;6cgdw1TKmr7LA`i!@bc55}q9Oz~G6yeLv@ zzHuSEZ>1Y9|!+T#<9OyR`dp{GkLFfe6 zfnZBf+u4cdR6dLiCb6)sX~_G)N3*$gZ1%VkabTz^Y6w8H6q&NF5+$*?EIUruwa_Oh z_5jqL`&yd>Y|h?EdYr_R58KO8bE31wMVniu+JVhzf_tbXPgJI|kUK1G-mJ#vMz|Ed zdQNf7OzP+hY2H3nriJ)9iF!i)>5zDa!qHn>F7DNhVpdjD zzXWVbj))njvP)YT_L1=8=MjDdh0{Gb&AH(uj)imW@*V`H9M+0`AI8dJW`-|zKR+;j zv*R89&BU8Mdw4Swo(HX580WQzTVF>@qDQ4(p=q;E=^(V*tegg$|0J*N<3@O!KZ1+2 zvu1T-t(0q~Y^y!7p1&yIH`FImQGCPGH8c%xBfXQ_U?;>OR8!Ugu`E;JtYS-YA4+<^ zUdp*jQ+cZ*7@v<3@r3R0hEx6JuM(ib<5ir?WgPh@MD4gZ-F!S4ZRWf9%f{9WT2WAh z1tP$V^}S^I^H4ioRbkxKQ;g@?>_(tm{EgsYeT*WQf=nHk(Q!(7*SX4 zeVxvVh^ECHudl%%f&yp~zX(pHr$FzdKG4dZ(SU&@S+RzC=&dx!6UXGB$Rcjc8SOA8 zyz02s!le7)?gpWEbz^TE!B?RutTiC@c&>yA^55oY%E zZqfGe-bbf+MKZfe@KSVqB^eP=Wct4!^KL268dqs@$ zU74UgG{nQ|zPu!%M{aJfJDyh2IZ#<#mFH-Khv7Gczk7MEUsp}&-H}g~xqF$3K5_$$ zeRc+koUP*|_IM8Nktb7KPYN1~PmI>Qf8izr3tUUg#}tRQL#7VDP47F!3QEEAQ_0W8 zADS|d!~?vg`wt;ikr%?o@N(VuL92DUlHP|%t{A6z8oZ!ihdV`)lZ32-al3mNkX(^= zL-q`~l`U&Msv1>q!3-3Jopt=rx?jW`gs3$+Cw6nfwv7Y&Iz`WEfO!$|(9^OoT@k&x zx6!&#|CK6Z%x>y4r?~Q~dGXgt5sq`~;A;3(a@?W%SmFxq=?!nGvbgg2eArT&GUa)Z`*tJmh>k*XjimH4 z>$y_#t!DH`p)HoLrguhynyK!aW!H!-1#uk2R#c%U99J%XLEiCD6AY=av zU}12;>fT{H!23zGL@+gP*^|I>s#Z}|^l5=We;=e*#xr3MqUqyDEF7YuaL|pDioCD! z6`lLX&oiz~A|>F2%Ha<`xMrj2Lm=AqK%(9e64A)?AXD4#Qg1k4uF_R z09Lm~PUdpjuk1}{NCUcRjhRv+VveIpbW!-n0ZGj+_DS$^XqnrxPwyj-IOjsw3dztK zuE|Kl#f$aFVn-v2xo?V1^ml-eD%5GdVosODmy>Q{Gw)I0+-IgC(xZ6sQ)o<}Qj}ge zvRFa*LE%Fw4N<#w(*fNQKm7%6hr$}Uto0r_)O$wP;mFAN_}C<6b@bLup-h%~&AwOE zX7Kd}t|Qq}B6Tw(MRr|<5pLG_A%AY&l)<9C9MfTok#_imYUGwkv1B)aXovkzcsLV6 zb`~{V){{GZQvPm#dW&|1f?v#vtg%C2;?dV_2HJ%r)1uAyvdiuGk|ioR)1>{Y6*4*1 zI>i@x$a8rOJ)yG8N6W?R4_T*Z)?a#Af0}EP-;C;u$GR7Xcv9K3hn*wy`>SSQrtK8D z+bgpA$!=*^$C2pY?uS#b$`^%NtE^S@qUj_n>2nVE>ZUH!z zR|=tWi9(=t!RB?353Fwj-gk0Z&cqa!y$L>Y)wrF?xPdkcJq4st{k_GYTacLJ$9m6@ zG`Jhsf-Vi;+74P0oSr(osKXdQIYkYl@w)fCPi)qXtiby@FNd-{OcrcO+E){@gnyxp z@$LeR3(z%XyA}jnjJm2inc8LoYKs|)j-4!D6UkMKTHB`V<$h(H=YFeX@ywF^R5!DN zj|Gq71jVmC57LQt&=zby6Cq1nVlqqVlJi+F5=ST<#+&_%UsGWYwRf0VmCw``>`6;;yxjWU3BkR z4>Ok+fH_}|iEIzcO8~zS)J0lo`+S=Q=*;3*wq-Cnvsf!Nh0ZK?s+7&& zsjZ*#WIxHil;_Cicx){B(4i4`m%|rRW>0jxuw5__IQ>=Pn_V#u-8XG?U!U7Pp*j^I z=KWUVgprLI-@|8-s~79lh38$B)apL&(9znWy|ENz?BKcDNNHNq(#gEOrB9l-E?cItS zpGi%q_t}EF_HJu)XU{u7ceR;$N-xOw|GFSQB`37Xkx!!RacR{kw%=>fDVA*sRni0l zR-zofiE?avKQD;868fd%CO5>6zHaBb@}zum6V&#T(DO1=7eU=CZEn6+xqGU&x9EeX zc9D(F^!~Mf>^1HIsK7)hY;iVSW^yYnpH7T`t{(0O{Pi47P-!s{G?7HYsv#zi)T40= zX0dXh>aM8q%(p(!zpxE$77s$rgThTPl?CKe(ljM?$xD8(?$$WCk^j{F!V{oX6osJNfjR7U3c)PmLXSqzPCIHLni^co5f>?u5Zft{2-aT5A1*mdt*Eo1nfy;1*N@p2*TjiS<(xDbjWnfx>)Qz-IO`G)` zB7A>(4z_HcZ)Mpgl0l4PQXF!tS%K>Mwgr0)nBm^R4U=4_zqA@SO%5JJNPB5)rRbrv zRZ%L3(zeUqy!&!hF%Ua#W^upyr6Fc-k(m|Ei*NId!ksD?vrCX{&kIXr24TC&IQ{7J zE#3+lQ!>P|x}>0w(RB`LTz3pVLk6!Kd_Vz6^M|<|Q~j4}LZmW%w)YOk@yc*=p7_Lk z-^1GH-6I265y^_HoO8A!%SNwb!&plZ_XHc9R39a|St##)Vt&^&k_e2G8`+N}QXi>K zq;x*nC)AYDM__uuTl!Z(32bEha!<7qI8q_tIR-qxE^Ld0{a>8QNko3P5P-u<5; zw}h5+G;)wtj^|NtA3P`-pidfz5w+78K}MBqSl>J$>lWoa%xgPr^3Brgbr-Ul+c!^=@EO2fVpz-7K1r5!MaJ??t^ zg0ge$Pe|TBGvB{cZ~t50fhC%;Ln+sPVN*;xUITrrCHHgwRum#OC8K-c6cdOp9_wrb z@xviD2#6`wlz;mJcW90HD(`MuDL)`1#peFlNsXF<=sHKA0aKuO5>Y#WTABncb32ef zmbUWKie>0saTm+}%BeDuI%zSbntH>LqxCd7n#43!1-B_}#o%4P>ama?>qTt>}iR=xqH_h6FOg@83 z=;|tQfX2{^Al1)iY;Cty*RTLXa3mZxPm~UfxgIy*9rXrY3JS#n6o~?`YI~FG>7}G_ zMUYT`=Y^!5yzIqJnZVjmJKb@YmC_OAXY(`dp6U}i9qvDA(O?TM;x#rX+N`Q@nu}0o zM%4DBC=nfK+qV(rhBlALaGLHWV!8sC%$RI-IS}M1Gn@Ci-MLdgJmJ!bq%KVyGkZq+ z>I&s^9>NwDhOiVy;4Tb5rk_~>y>fZpVP=8UR*rp@fUb1d;H`&6RnUZktMJ*G4$E;| z3Hj4rf!?(@?bZ1`Mjt=GZ@YDB)Apr-ZjJKd=KH=IYQ&0?HHR7!oQ>M^yKmb?^+-jP zHa65TJBbquDpGPTyk%tE=a~~lVxakY1ABjG1x9f~iVzqn6tV;8NA?L$9_6b-$U?yr z_%n}7CD*LU507x6Gw3|bcEHES0SOK22;2an`Lcb8=4PPAh=YsR6lVsYA6mjOU%%aBf@LJ$=xT?}r!j!D)MvAn;+UX# zaz{GM(pAuF@B9nKVdIw6Iq8(dFKSY4B0F(%e=3^Ofi8N!y@`XOwcEsBj`Nn#%^>Nuw1}wOfV?xH+Dlel1Bml z@f^{W0*2b?!z%_>VR^{4iGei+eQXU-o$Nn<)CRVe!@;;ruyRk?Le@4K3WX=>0g_&=-LY`?B&`+DmyR=52NR_Lz?;=Au!lA}!vi8%pM zCbqK&Bf2#6p3Gmozi}o!$#wfSNc`by)wRwjut4_!8q_25Fzp?kqP-;H8f+ykoRXoF zp(~d%(2Lv$;sPQOO5G^029!kSX9&d?32H4Nz+CZHqR1>jSJX@oF55qk8{-}juYY~M zKA`jHlzd@9b`LD@2Xb)WvG&q@P9{(OIq`4*Y~uSvm$59c@LkQ(pc*%=tIWwE^539K z6i0l(yTCFu2wU6a9tl(v0L92u7_pyk0~oEW0y=DS4}f%8S9#ghO5HxJK2i(noIoVzyCg2WYVkhVozNHXo=_R7W zQ|kp5*i^q89`25?bJTYCsaZYVmW0pJFLuFno!os99T0w#a=2F&8J|xKAqmX5T*ImhZ*j%`?U=k5gGIOjt(t!|=U&{V*rR`R@h$EAPy}(Uvi8ct^=x zo-dKsNk}BFhyU4IY@uPseUeuKmJ8Wd0(y}p*zfMhj_fwv2q#$i0ouc^$y>eU=00N{ zj{U+}$=5@hKl29;%r6}rC}?#Q44VfP5kKP=A`XNa zO1#_8xP|)f;ugYTuQQdCCg)AH_qHm*#7ENR8M76Hm-vM&gmL?br=LONdlveOd0RQw7X{bGL5lQbP>jGv$A6GpyWtZeMsWPFjS~3eO>@(0=%(f@!@N` zhUS~eRI^N|!{}u*7GLf|;pF zIW)$$-F2B{bm|d~yNb=+_IU_ILHM`t0sthy*8%{^PhRL3fCK>m5}=8G0!WPiE`a2Z zg6+Ti^FMQYfs`YJ8bomisKmkw_!`u$*gRfUoRz?84Gyfbi<49-8vfW3(^5lVpg|YW z@09wl7!fG4)c29^S1&PEW_Zpl1@=mX5;yPwK0EgrqCS>WvCzEAM^FIPGo^B#>`YVl z)~0%WhKyRhq&ow?wZDe*{nkETHwp;BBg1|wVwbRq3N$w3Kzwlooam)Vu@+ayeq}Jo z_oG6<9;sw#Kt9*duGH5zs-51m(av_V=d#_Jlx@49{Z?b)fL@5A;I#*Ay`AxjJnh;0 z)yxZf!x#?tC-0*j&%7oy)asJ<9OW84wk!T>Rze7YVdK`?G$m$N(!mP{s<>HRJcMjl zfM5`0Wf!y6Wso%qq)F+ntG#X8$n&)1B}M!_bY3b{-gQ^rhKbp zYf3({UPR&!Wi_)U-*|YdA%3uPXXS+q8Liz~ z8ZIs_QxEk*P{N*p^pPlqNB%K?=KEnL-&x)+OW^#6n9Zw}(3gVT7p&0yKTF}erNBN1 zB?M~+z&9!GHN(4Wq5$mOSpCXP0 za0I>(NTnh(ZH%0D-kg8TviD`u$t$DhS`v-BBga&D=ESUx!~mt{g}ohq*4kBGF;;!{ z;Os~%B7=};@KSIFM>zM^aVW&eJYU(wU3eZpXt*vUZ#BdQlm{b*AbhCI8n$Un7oGg=It zaKWTGve-VxjtctVBmJ(3b>%_tdB@Te)3x8?3gNO4XX)nF|8wp zk!~n5QY@n)-?P}IRfVj0`JY0te58m}Ppe-7+2b>vqpnLW@bqfL(YR2Flj zYI9BzyC}i85TIIXZMVUA`~^R>R&13?k-D1gqI&b$G6VT5K0+xkTSP(UFaY{v|# zCKur!ZcOh+Lwwm|!c|Ne1s*g8hpV)#69{ zf??HVu*1n3TrnNhy7xj)*zg>TS}sd8SZ^5_O6HCl)fcX_emJe7WG7YD=i|3MY2OZ2 z(e7)nUkTOb6y<32v_*;J`-l~;^5rEra`JR9+H)G1To$k%o_`*CFI_>Ky>fbBo(puL z$@VW62i;L>5}K*EVf96g?#S7==Cuhsf|Dm3v8YTS6y!#+O7*zYdX-JbK8nu^T{x%A z#lC`m$#x<996ew3?N9bv?`r_aQyxaHZ=m-`>oN-m^yLHap$qi5!|h9HX!GAy8u}Ye zdH>}W%71h`0~iVU%cv3be*QM9+D*P(1?mG`GHG1C=P5anpV|)3``|5n6Uwpk!e)eU zax@E~w$zhO6#4{x@e^-T(H}JgXcI!d&7fHuc4$wl@x^uK*h0K?<6d9W_4_>uGo`LF z+UjNaCox1=ISoqm&rCNOu+t>O*?Sq^YdS4!h}(JotommN*LF1EW%g{MbSS%jhUh$| z)<>3{jL(Wn=y5P`%U|cmP9H;-?pg2D@U0WYboMo;e=1`kCt$5DNex$epj$peZiG71 zcAYB?o*}fWjc-U;9YVN;xYFjNf-~&&`wx)iNU!yCE$u{=s*d)Zsbm+Bd1H0OukGH6 zoP_j@%ibuF__>A#I}saB9~V#T+gb;<{L!$L=|1DarQS8S3jAzJRQa%N+Ofw>qOcs` z(E$NHd;fn`9lj=XQQ`xt!F+`;>QK0s48l>t{oozMJ%Q8JA=3dm&JrXc1Rxf=R{ZS^ zF+&>}&u7l|(5Jh3!Ukojnr^YY@tvM~^%n%{9v>BXQ zYnu`tpd2bjQ>XwpI1cLBR+)#z-%E=3oi5kYl=8i4kI4>ov5E^yHo_KT91?29Z;Q;z z!lVgMG5KNFC3)JGEV6+X?L)_fr~+g(5P~h5&kqsKUKb>VEgSc!i&<~2KgvV->h>|bza7ax6W{5UU--kRIFb_3VuAm zi^{0owQ9hl+i#|cI2r4~9Kk2EGbrFdj_|vzw@lnTr30C?EO`akRZXRgPDBMSGq*s+-`t9HwI%<#g&YR5+>D7J{%>A75L^eoGW{l`M<^*7a$A?+MS z_wl#;?Mo7`JgvS3g@u|wNP60WHo&**Mf%RpSxi4iI36E1Jr;dD(ucLD!qdJf#!mK1 z&FE{zQ@zkV%Tjl9CJYAbOWw}ITUIy+N!JY4_^MephT&L7Yul!sQ07umkKSW^N`cl0S;NtbIxOdE|kR zAONvR2-VWjwO?#xD-Cl}BH#cf>t_7|c+CWjC?4AhWQeQ=X)uO=aE}W9r{@KJ8CHMy zJKc%?DxRGAE-C}<{hE%rtz*oH4f9r`-YC}?ZJ?1w7C(VxK)5alijkFX>}bl<9S_(p znBDTx`6B~B|D3$uHOV*=4hFNW3~8@}u&T8vbHP_}Y3=m-K}20CS&!Ba`V(c_QpDxK zNj~wn!q?7giwD3*(3PMM8J4E+1wy?mj5Bw?;;Q^c6ViWthjHAXs(JM!Gz77{H}?zB zDpg8yqiHD(!>9pA5cC?uEy@s4wiveSIvZQm=w|ufx#0xcgBS@X4}3A{OI_Cu_(}JX z_7>)s_xp(bug|JFOl7C1cczm~MqpA^Hiw zN=5mt5cTig&t5|@2TqI<-HD;sS9M)AR8;(MQ~nZYQ$JCF-0NoaB+l7t_j^@kj|10r zD>t5MU><~}p3e_f5fGEe2*}u)S;)Bxi)?O<$pchk1hJf^2=GgKdY33L3|`s`01QsaHAhF)*~bQ(ej-P^8{Ln?J2Fxs zug4nEt)b}FG5{TaduP9L^H*{Q7MaVI`Pv@BCpM#`?G+!}D@HA%zPqz;Z+&eP_;=4N zR$ea0p9W9s$m(mG#blesoD|Sq;Jdr~_Wrw$xKSCzO9S!<(6tR#e?_tveiE$0e_gIl zZaJ;ckNh;vxeC-WutTZN22H>6E_EUpycyHICCSFm-R&;M;=QI}@b?joG0)}3BTnC| zM<<6pbB{yeXxnmx$l#p@#O29sGyCm{_S7;#O{ksqkooZ;ejI9w=xy~k4%3Xybk#h3NSEA0dl!ve+Yi>M_J3shdoo21!@icOYq2;WwK^fbk?Frr-F`W;NCX*R zjtAqavCEslFD+1$o61gb&WE4_y!No!`bIz&n+SLYE&5*_zxf65@a5gS z2N6*^p@dMRLqZ9G6wdQMXTR?mXYYH)-uJv`k8wZTB)V1*RPXr00#p#E$tH; zs&fD}2Newm)kzls0RSpG@M-^g;J>}7sKIAEMbE&<#0(x#cN(CkqM@OtrTOcr!K1^$ z-vL?E4qlMkZc9et|O*=Ov{sNGq#c zR#m&Au6tci-@wqw_||PJYa3fTdzbsJ58NKQd-y%|4+snj4vBsq6C3v;J|R8hRc2Q9 z>o++c3X6(AmXv<_TwPOJSKsipv8ki8tGlPSumAh-$mrPk#N-qTv#_|d{AXo#Z5_9} zw|{^?Bpe<8MHdx7^FPS?Ps;v|E)I|`a5-pb>HngOiaHP+G#s>aXBAFy>R8a<_2oLJ z7|FnWE$w|(JENGAC6?#jliy6d;>s8a++U>qcgp@X!lM3-q`0=vW2~cc4F^H^zZJN%*li>7EVZ5I9h!=AH zf)iiu&VBhBc~-=6i2vI|+kK1tkUy=Dw0WO@*=`M1MtJcYJ1&&je<<5r>(;s$o_GQ< z?_jdY+%U!yV19Sv1bAujk5e|!Pk_!kiU9mqV0QsQ!1Dy?+lT+%#DVjG{0UHyPK;ma zhMyx21)Kmehu8s1f;@OKHW)mo_kzu0Z>Q>=G8|XOqpo?XifK+b?iiaw2tanqAF~l^ zP5>G?_>oAP54i&B#?BfsWRH&efL+Fyg*4UN9613zOu1vi>R()(P5THP7h2Jx^UbiaV(`Y6-Ezg*cV6pOwr`2rqjMRq~nh_?c56}LsV_9V<(U~4w|LJ0GMbJ>^v3}v{ zTM~JcPqbX;uiky-MtlFXfiSDT|Irw(5Hp^ObHh_|J3?9xtx*9*Uu3JN)XN8IZgR2~ zXFgk|HxC*N;g{7^P)aY|{E$n0>8NLCnc!>VHA(cO@S(xgk!s^Q0os=lCxB4lKg=M& zy^HfCDV_lDb`qgjMQ|6>R{wEoqj1Xg1lZe!`DSa&9P!PCHvBz{8T|c(Gk90F2?BVU z4w@G}?+V^uY*ZDFH64l#z}FZztt2v^Q(~E&c8M%FI{c5zKlWQdriHJJIP>Aqu`S*W za+smhYxc*}JY0Df@iJ+=n_IJ0FK6Z#wH|v0v-OJ=lh6!mvFtXDcs(I8z?yQA7FI{C2=Gzje(*WSbZj@S@prL+@sO- z!yB!M(#k)5-vTW$7BB?7CS}tGi^RKQXNx~ZV~D0E&bHs0aU#Xu>2otiDX(KikBrT( z-vAWe<{Q%g*-kzI=&A?}biceD+MStO>vx3Tss`-r?5T7`p8&#$8n`Q*AkEjAf>Ls* z!S+4Z{nm%2j3OsY%+nrC3T}gS`_!P~#s_yeb z`RH~bYCRxrMqg*EuAPU_3*JqE99z3HRbW4&89pzOKGLo}hMp=goBQ#!d9ZlQqF=lR zBUE|w_IrVLa{%fsgMkucdb`>ANb&?8j0}Q4sK6RqvApuadM>o$%&v)1zJia^qdl>+ z_1or;+0}Sfp;%KS>e?Ybnf&&VxBoPvj)3TFpf?!(k@o#2W)o^ubQT9i}m@}Z8)8RvaidGFTmd`9ZN z!g}LHO>_EX^rk2AI>`cOK;nKf(y2bwCC|A|5o{i-8wh?Hx@GBJq4~9LoPmojWK9;ETrhcyUZ5XVkQL)&a81Kc)eOT+GAc{3In!X&~M;cRw<&kw9p zbia;O3?B`!l-e@yh`-dQSDE-lrN?dle>`AZ5ff1CZ5Ska!A&GpunkO} z`%2Wxd;T^o-J~v2ZAj|b;(J$3n{hZ7$;5YlD7H-wNB5y@)?Hn1mSjB3+|Aq+y_LyB zC_DjZ5d^>YByVzMWhKdrdSj<}P1RY{unv%L$o=h0dv}TTuurMw?Fqmcje4eK>_d=2 zY%%+Kk{jHyHJxRcHgTfKntD?F@(S(I!sCLMGwiy~M?@J=$vL(t;NrUN1E05vt||~9 zcBA5_?LAT*kD9`U-_jY(&|I^9%aY}|C@Zti!QrBJ-TZSQ)$Kb}Yp@q+tj$n#8!zE5 z@#@1IMC_xA+AQ4VtO-<1%;)E3wX)^0j|*e=PANU3y6@6|{u$JJV;P1TqA*>+Zs2c? z=5|h)I|U(nKB#2YYN=$>HC1ox`YQQ~V4?t)$vXk_(azmO6+-kaoXsW<+iN%8kmq2I z{h90kbojE}Qs~2}x5O%qFTn!s2!U}>GrTQe4f7=$2Nf=?B;S~m^|ISqs>g1j9#z+; ztGUGI+z=WnkUd=yBltpk<}?+ytrZl)8bXEdCymwoQ`mrly9HUy`^`E!4)z<5vSpen0uJD5CytUwa%OG?%4fOIaM#L`% z7{jWyIz67JKCxtaH6NBq&gCih^r`{8cE3$0QT1rpV0K76x_Dpg#5YKay8qB~*}~zc z5U#ZqbIOlr_hcMm($cNs;jxOBFF8M}p?U@Ykf!zaSErw_izam7dS5D=#Zvg%aO^L9 zGHwo+Pdu$r6W@Kzb9MQ3IzW?d8Z@yFtLGXj}niuq8R|8HH6rg(l%bQA{kLEK*=Qa&@p;PRVUjHhs|W$ z;=aGAM1TBqJg%2b;`UoOAN}ciz7$qJ^^Q1iEPti!vJCo^0epyOAGQg_9$v#1e1o&E z<9U7I9vkL$gIhRr*VODgT!BuXxq((i#&y$>l5SX>I(xS~&3X>s3%QCvH97QCn%^Ew zVFSKbkR)!h>1;)}t1OIkK2RzBd;-|k<}_Jb?^Du_AIPiEZ#F3A-`@3?zLfF&{_tg_LiOHp=o1p-lJZ%pK8*NA9qGa|B9k7o><-? zarIiaR*~P|tF4#y@~Itoz5NQ3?eT2AD^#)c1c-!$kgp+3q$Bw#dwXpy1f`~e{+5CNO@~~9O>5u_cA-W3g3b@@TDZhRz%LU$Qm>v1?e5SA9a{`g>1UT1Afs$)UWt4j- zz!rLR3GOLRkS>Wrx}mw83A!C9ji9~mtc!Qsrv31tf)@;IQKseh{kK0~VyBCyrvIS? zZ+C(|^r=qvhQ{OznX#Uh;FB-%kj;nrtsG$#Ci1=>PZWUn7pL$A1um>?T`60SxLB9s zlznaZ{#b?A&a=$>%}QNSZmfCB*OT<&FUtI>k&go|4(96raPd~_Ee=}o#X>j1E70A? zB6`_*-RIbFJ+W=4aJ=tDqrT%c3e-E+T{?Q~o;`e%!o)UjCKxFyh{jqD9r3sE!>4yB zaXv6Mc)Pte2f+;k*-~}&!5Ubs=Hm7F9ydz=>X&^%#OKCTaciWOL3H~J8d zo>0koDct+^#E|no)$inpf*^;E9Mwn?)b%|9Zc_KVHdJa{FjPkBxyAK&cYqIVw4jdY z4->}L7h|Djgrr9m<~ zqwK(8DY`5baTbb?Yc(|WORDN?P9 zXHIJ=uKb#)ju?Yf@x>rLVf+MoE1WYT+_O07&Mf18vncmEqoq8Ca<_eX5BODJ&)7^&C?f14f}K1HvXwFyI;zQPJCU~O|Pu&bM3mSB=$LDnLvTO zZ^J<2Fa3k<@mGM%LkP#wbe;g*B!MCVq678HzAgImHOac>I8pU{2GM6$k+eLbr*&wl zWg?6?`B6p!7TmlKT%G~zMuBmjcO9x6Ol(yxBn~lA2IpjQ+EEvFcm=u6)id?Vey$FG5|d4#v$gqLYME(+zXkVQ zU$$lZ^YxgYK|{SJ$!GdaF+6Pv&Ig|_%rS`b_so<3)^si?`Mp=1RZC`J{R82!S{lDf zc%n@H6u-*KEqJ?bgq(Y*x4%5y!^e{fnEak?q398|5sqW)2@;nLW;>?LbfJI;X4f5D z?!Kq%^=@zxHjb{ygo2a zTf>9--RzWVoTj;pyztxf_;XDt#kpJaLeCgc`o6#33WamQ(vjRP8a`MbeACwvk_7SV z(?Rc_q5O9v#4eu8?x)Rv)_BwG(HXKwT5c3ef0q;B(Fw3W?z#P)U}gvUr+Ky~z%-Psl0$sd z5Q3i1UX4%!qn&K{f1Ip}L^J?id(K zhQj3c>7lki2Wt4EI4qpPd`moEH0}nWV&3p+vvsPT_9x6?#^u4cocQ6a zdsG{7GYa2ax+8Mj=gy62I$`+zTX~OJ%?w9nDI@N|9+<@($s1*#gmq3KHR1EM5c(Eb zG$Tm^cV0ur0m9o}u3OX}eCByNe$Ma#Tn?AKd_(8e+f-G&$|@XdBn-bjj=VQfKT2Eh zVE7>K+Ryg9nkMS1@4l(@UR*_l@H{P1l76_`e829RRWEH&o;a%cJG2;*|scKLtd1Q(ei13HE z^NU z6@NeYDfVXc1X#r!+iY|LJbPv&?&yw7giicLLN;ybjVxZ=yu-pxVff)!|ZJc-( z0AkSK1Tc|64510K0S&&NDC2nild4_i9X7jmrj=)BjEW^iiu&MZx2_78Y^s1n){aor zNmptJaX3|*G37xqE4lNTMQb9DgiV z_c7z6gKam{>1(nU(ttuQRj7^bRY)WnYwC1wr3;2N_o4D=C`SZ``{LsxQ>wCU#f$q9ajJYi084$ojEV&AKj;>YR48=`!LF#>y zC5Bs=7c@!_Qg~+8&jh}Z+bquNQIlwNKbuzRyZr9DOy&c@fW={Cz{CGqs!p`6D*9H{ z*P5nyx4N&%AF?C`Z1iar3+^%U5Ug;~^E+KTg!4XI5YI(3W<6PofJvjE{Db6f6RX*fWyPlvzTcacb0Gvkqh`tj5 zbqkNh?QFeSlu3yypsGDpaCJ<0bGbQZR%GQ?QuvyZ=(HEG+#sZV$wX4-Dnuv9lful0 z1=TU;21RuIQJt535AQlh%LVT95AyF7MYHzMMpzrj5^dp+aRq4+0wg{{F36nM$RCyo znTs-vPa$#f%DzKEJXy3g@of&w`f7?-2E2VcvIEs5%nv6Z*y{xxh)&w3xCOTS6X3MM zpSB!)d6WB*{#`CI`P<52?xi3>gE@pcfsgo*hEE zNt{OtJOpppB2g5S+j&^Eu70t?Q+T;})GaP~^mKTNn&>Wr=&p>%GbR!!kWpVrw)KPp z;w@cFg)n7`{`scZFsz?0aZaN)y|mX-wdXaYD@kVGfx<*Z^mIp87j(XneVY5iyG?B4 zakV?IBXsIE>EpK5X4%hQ20s^tX*j^t3nv<{II1ljG^MQ;M45B1mDAp;eEMSNRn2-f zra|zd+<<}L{cXwx4N?*V{aWDWdu-drJaTgpd)VHv&Sf#8TpF_=fA*sIj~c0iu9u70 zN(cNPxnR3ZJ?u(DxPTSO^nKqUuYv+_GYQBN%8!ZqL_Y>BUV&VlNCTy>);XT2MX=VG zo;(3+{mW+iOWYq~>>to%`;inX^=~pR0a|KRRfV#e<7ZL46UU^K5=_pUJfTI_Taqc4 z&zj6S5lfcFj_T}Tx5I7`l_=vV#O8)F7>ZP81YVA$>tvU|YtnjI|H@;Iszyff%=suI z`l@{&lmmXQ7WXkuHA5*2jnv{PDY2g2O*ZD!3h99OQt--i3J2*1 zxv}LoMFA%~SRaR3(!K^uG%u?axfi7nn*o^%=(YHomXNYAv>AtE#`}yKB$3$59M@6a z`C-3H-RHYQAACJZN=w?lai7;QN~!TGA}-mngWu+i&C?K#(3v)4BHYH{KrW1(enDx~ zx>w!zM@8_hTizLEBRP)se~_jZ50gM{)Q{+bSCeyei#Qeblc(j>=ME1mgHrykUNX+N z=}fcR<6*eYaH3hFt7U>b8I9ybEC3kGRk1l0a;%{%7uU#*p18vN~W$Ytjf8{ z1+z1ybZtyU9cTOKmW%Vu~_BCH*cm=0Dw^v)m8=Xt2zNvP5>_`sK{R>_mqr2^eTe3r_hh#&XD>Pj<4@^{-rf=E^-k(k$NYxefpQnKZtRbk-pP4!Ae^jAIxt zK@c;p%{OY&DLcWt>g~^9vtue_cp259CW<`)0%e&WRj|5H7%~@3;IRr$Ysk}&grii?VR`8!%?kDCJoGaU7@GsPyO9dH_%dG;I1H zHR!G1xKO+ht_#W%ad9mqs~F>@l7(`Tv=C?=x%-pX#LlQIjq3Y*34yB&->)Fbq4V$Z z&kvIxBI*6NIPr1@hNBhR-dh*vz4~QudcCoQJk|>pFd!~z!!y);(ciKM_6*Sb7J5M| zk1h1Lf&c2TS%Q;zH1LYJn{haijm45@<=cp-1Bi<&_9# zK2T%r-H3?@q0B+Cw-~kA2nmOnl#XUY{}kbiay$NZ=eRmczE4u~e^@eA8xl?aY)Gpx z^NxlcZv!erWRRIXw%Q$XCJfCU6x##pkS_essg=6X0D0?|m+UX(3IkF%4KJkD?M-a4 z;%XM;Nj#8+pK0@Eu_6L34Os0o-xXc_`#P)KCDn#X#VVjU>YezrAE)q-Y#gvD6h`{R zg2Wt=l7*dwd|43|9NQO>b+lMRIz79TmQ08J>N6_n6mcv%c78NWVu68V@VQ-tSjKpdsMO5nN8>Ge z0yK3!{TbXH#>4a)b?K8(({AzaIs~~Hy?q23Kl;cQ>&IfvSt6ij(OcVC$f#{yQBvn_ z4<+!T{FEKZX<&XEtQ3%p2}uRKVQ`k;Q*zTDmw(TFlo-8e!fSWAp!rNazsQo5&;z8- z#@;mkF}a?kH;?3WAjmA_4*A}zPK0i0EMEvN>0_HQYtA+gl4x^XT3X~eK3y)Ld!bJ= zN@lg%Cib}bwxBoV;1F4`MhS%S;}ivc_yr9pC%KqqjW(*pouk-%Y$8q=ZI#GN)nW6& z@Zf?vsMqV^$DS&Ou3?hpC&2fcb)qMgCAaP=U5QGaWoBj*v zxD$Zao1z{>J-)rD*P5ecVwrK1cCZL`mUiZDFh`YD_zBQKta)amJxEmgD~m?rS&(NW zM=x?3Vc=Z0(^=|y$z?-spS&DNrO#?D>$TSe8CN^c>LR_t8)Tw8kvz_%3j{59k(x!7 zR9m#?DGop3@~s$NJnl~X$9_~G^=I_O@kcSZp%^IE04hK-#P$>~z~b{SrL{~pZ+%9`dZg-ZRMDbZch1V@Z*woi{IA;iYm#HkPSMYR)qfIAREj|>~`%A^=b_l zRdZj$ zgjT|8Qnn;82vqL;j|gS#dR?JnzgMZdpP`6@V5Vd34FiiP0SB5VU(|%2jn9XX|IN|# z0Lc<7hwR#k&6mN(Ow-m+)Rt8!EQx8*{#FicD-1CBTKORXAW@N@Q{*61V))K_Gk$rz zX-2;vCOqi7FWz(*uuD0#3@Vg`Hwka-@(6Y)p}U=)pVSd^!Y7(>^&ZQ7K`#~g&q z--^>60Zsg=yhY)2b`|sHzAxOqH)K!JrGC`jmZCYlhrA4(uZGk{y!k-7GD2Zn3rw5w zY#QuRJ#JB`H?1f#Z4-y+vIKR;r-%_aU-|Oy7Re9p>fxJ(1A8r! z?;RbTSXQ><@4u!FzqayH!AX9z5nT9oLL#oLSAnpx*o%)%dp`(8ZI}C-#CpN3y_@eZ z)k>SOIL7q?EU^H@6y$S}Hl`Vp2033vo`2nX%L~3}vfLQs#8g%NO!4Z?P$kW64IY27 z3O^7k;s8BT1(6`|$)Ct$Bdv%S_Z+W}i62q!c;4T3lc?*d4$~d)Ev3e;eU=geF=^}` z1V0KB4vPfkkXxHB$atcCj(@DhD%fp-=WG6ieogxJ{iNw1&7`mGUd^vrB75`ze>Bz@ za-;~Qhfn+g>zKvq6YVgpT?&)q>IqPHKBK(W2QTN+S-&Gxvi;^88+I^`W6J#Wdy0W^9K7 zSHzzwnu778Fo>Rc$WD+1lXziVpMrb~e`jGPA4bSjy*8jN${X^Mu70Z^aAcRd`|W;u zxSbaq%x)8;&$pJiqsVWt@*Nw&J}Nlq z_4Vlt2;Ug0)Mk$WH4D}f7M~MPx3G0?Nt=hz=J3pg)UBJ@+r@bfO^N;At8}GxXHSm2{^kzJk?6bq6 z0^?oxSo^Sg_luiAUkhd{HZ&R!Y8d!uLK@8j5nNNq^Ra`qG@nQPz#A7P2ho&aP^!!Bf<|5pEI{ zgQdU!jMqvGyQM1juaqX=OMG&1@`YDP_TBtTm!V!hQwA1<0X&p9$n;!B*Z5`7wfb6> z2G)C@a}Ly{Q0vK}gP!U1=>KAm&cm!PJbtO1iE^KAJRXV_=%JTb;2-bp*XK%lSAu6{G~eUQfWk$naJ-xZthUk(lMTfY!RpYF}lCN=@=ptAZ-0n6m zR zsm+FRy0}7Zy5a{Z*&n?C)o2EcBccacwcU*I;nBg-_kzfcd#w#D#{t<&-fxY+MJvx< z73GTgx%u|(9h&{#t+N;>w_a$?PFD&W!Qbv+_EzV_cz{LOb46pU`sY*PRA2KNC56V8 zUWdGLzgcX!yVqPiB{V0w!mrs2iS4+v{uycW@%@F0;Nl7A)}7g!?;xHLmN-XCh$O0$ zbVpj`7h!CK4D*`UnHiM(nQ}hM_QbC`b7_q-Lqad>_UL;M93FpF-=ho-o1UhygXQRM zKk?wcm;*^!rOC^`N=6lgHx}8Wp*4_hG_9w|SsdSsFb>eOe5igi?;P66^US0ADznyM z@%S@(f+s*wANqX6pAeh%lyA`I>Z-kn$&2z-p2Q5(@ei$$ACsuDhVtS;#pXdX>C$RL z{)lGSt}J{JG$>{r$UpLwS+W^5_#|gn)lXyjx+*-B<4HGAd981U#tpY<9TsVRDZPm( zra#n+$eF;nB0CCDp%lhe90*Ue$Ihh$m%1yaoOd$0SrbZ@w2ZuIGh`)@l=Rkna()~2 z*hssWkHlNJ5cWk_D?)$}U>f=-W!bZ$?T(~a|7>&86V;WMb&Gku@8Rt}VJh#~nMg`F z8gT`}ySbT3vCom><9BJkNPfDV`caEzaKv{giEwknqKTY_bnA@xfiv){GB6wbL@qVQP^4uP)EUq5jxhR@4n8WXUJ%x7rPElm!y60bUe}PCYjvc>_-7a2O1D!d` zH;99WtUuWcN*U(N3ESUxQbV}u>mv3h7HzgbM~n7|P>khUotq5xYQlW_|qu>RQ2T>hF!fmN+$_ z#YJI=^e;tp`NZRK8RT@7RZ+%E-xbE!dRvF~K6^Q2Lqa3YtrJQ^fvi)Ma1rm6x7bZn z!m3^T`noV;$?*887v@@KcQc$7h^Huhrzw4K#+4Cy?{}jucPqYUhm37~(KdIr6pK>4 zdS0#bGNXX(_G2m_EDbdO&j^0F#D&1F6k7K=E^Kyui`9IhllTlnt+4vSuJ|a+uxy2N zS2+zsOJ4CaOaY|(Dg+vo=uG$vZQ@KWuGmzb4zBfKbYJ14O6y#@|{@`ntTAPUMu*q49WR}C_K(%jzApG?dJuR`ina6Tk%v<;X|f=2C6&Sv#&nCH8Xy0PGT-YXFd!CIP4Dy0i52z}%u zK>2liJ_F}sfKv}*^Ykn%HLVQN*Sg4W+%d={JK)7J=gLtz+j}9T&ztu4Vq<7 z?dX+W*U!`6FYa&jQ%wtfXXu>gs>*z!c0f=6kmt`IWw#d{w~NgJkcbxIP39k88lk7} zDohSxI_%pfOktE+ZxCnvm+gyKQ@2XlT>0oU$uM}ZwKbX(Ep^l~mYK#~@NiraI(LXD zD%nd&k&ke$rU zcg@FdSnASs53}5pIwvOm^&35vRmlA$n>Ce+TI+z{4((?;X${3*D)U>JUjjs)Sx=d& zXDaYiz0|DA@29vGESyqhj`^-QCtTuWT@h!NZxLu>B2{wioo-X#D-(=M{HE@cxQNX| zCzGytF1!)2P`*;<`Ly+cPZKTOVS1?VV3-w7{#N5}`22etR80C#OYN8R1)k~Vi#ZzA zNr6jjG7FF-Xw^_}xEsC$XH*3`_vb0YIIr%5lK8t{(oHzH8%)ImPc4erKPysT`IdAi z2?q<=FczdR`QB&fJ4;1RY1ct_-kxwm)tTI>gDUnc(pGC&3wh|dH00#33czouL=!iml2WfgxW1Tc?} zKAn2Xtpt0xdGm%mK$owOW!`RQ{Ftz!amIkeYqm%qEth=*m(n@Qc4!rURmp^>r$A;t z)oxKdDINM;Y90rw=WwumODBXKk6bXDoLIPmqt;zs!<)cel@nBTgVLp*zu){ZxQrV$ z>`XO;a>Ls>x9cDcVXpQ1E=7rgjN-T6%1$*h7~CbV@YZSk5N2$*-5>||^^4ZMwB#Mz(zhX%f=Iaqs zqXRHc`bYD>orWAatbxeha<&Ap!Su9s%~E%oi8zDui7Er_p4#xwg%JocnuF-u8E}p~Ua2 z6qxM!caDFG$H6PkZos2p?>j-7{(|GozWVQ_4=XPdiq0YIpdXo5rs4n^{?zaZ@)MsW z_lj?XjDNtEV9_KlW{M7)1G-TWxBC^*C^J5YM03;zB6e?F-`119*pmS--|2$*#QVpbiknguacb_{C{|~@DB+x zy&6$}_1Q#a!TY+gofI^DUn7KA{SQ-k#gxOoFt8Wv@gg!(KKoBfGe`}{UH|TGJH+#Y zf+M4`6mkt1RNEn%|DItc|E5^k{-#$0EcAF5^V+TIY2~gJlt~klheb)VfRB-R78QdS5j4@(d9Q6Ir>-_e*X0B z(N{Vs>4e3L2oqZ8ogh6T+@mgIPg(6D+NfnJ0fDobuXfAJnX2=3EZL1I5&kL9LrQwh zrUe(+qxN<4?h);AJl#b>{W%W)&5ed}EwQJc;pK9U8z>BW#G9(m!@NF)@#9#3Cz?(O z?>vQReL34^Mcx$J-{W{fe^~fUAOs-85d}~W#I)ZxST)O>a9oe|8GNyCrR@%eX8R`>`HGAtXm!+z`Kv-^T=tH zwwM)eorJubi;SuAq?>ODr=fZ`*B038uX)r2rTWLgR4;vWg zpA6?%K@9}gy7`YK_`@HP371~#^qC$qb+Iv+wz2}@SNuR5{JqLa*A>~`9RDbgYQ<t47sR9#}kvu*T#nP`aSLS(Nj>f`D0Iju3}#KTtd6; z;xkY5Spq9|7_ECo7S66I-E`GVeiJfTKc|nrmV3zn151KoZy~0JI!}NaNbex%Zhtd8 z7D+>Z2uKedSD&-6FHQy*Y<3NoxyTMuL*GrPo^b>0vk5pTN(|paa3IQ~x-`8In`0$r zisP3=Ac-r=EN^?D4E17m(aTaf0(UokKhx#sj4r&X6z2#+hb6*{s#= ztNXG>BJUE8Ocqp0T=b@37RffKbHS$z%4rme5!R`2?$sH|Tl|{Z>%)B`wsY$2Vr6-W{Ur{P;MQb0z&LKx-m3D{V2#NBdkk`YESD{!XXB<%#-fpSQ9TtJ3 zD~UxEwqPaW5kh+Ip5=-vb)#{SLV?UZyFpYP_vcwM5)L+ClLhk<`H|!lNC$*Lr6ha# zD1A-A$S;Yip!SmDN=hqI`+zVDZVNX#>*>&x!6N7Z$B5@cnLV>yZjanczcy_5B`w{M zCL@c<%FcE#4oKG#r#amHo7%dUNd2sxf|0Y-XA z&ZGzjHCts?s+hE@P0#*BhqzZPhX#vlZ~n^C{?lSYVRBs@*n)OaII)?v)p~B9j8wMf zZ$*kG-ibFW9jM_LkuGTvQk$`C$1FRQO;h-f^ZELgyWX_2R4Oj7c<)pj^&=hRGzSqv z@OEQO!S`q*FARchU0cGoAL5Z?RTD!Vk=`^IGZ?N?h7d0NN%0FlQ@h= zC+iw{6+*$s51QF08}R;E=K^e;F3!35!{kN|rApATZv4G>4Fgv&Ls}U%AMgasrw8}Y zg}{5*r!u~wc{IgJ-M28asyD}yddyE@4ZUP$uK(2q4@D*!Rfa$RDtW>4>N>TX~9 z&Q5e2N8Xef9Z*0B$64Jk$Gdg<_Oj~6_`SJv!Ss8sv4u~l#wuyVGbJzcq-Fm&R(*@CvT~l?LB)|4MaHiw2 z|7;Q&_>U$LiZ;CcRvSwg*Vx5<6Xx6@5l?*Oy`1T*R-O;<3tMdqJy%-|Yb9t3o%WqS z11Ir`nPlAF-DzW=onD)MLDWOOu(qpTiC)fi73lQ>O?t@w&J>sn5yS3aV)MK{kxXqP z&JxPvLLXdgvZ|u2>py<5vuD)4xMYtXN`zp|(2;N+O-Sg6l(;7Ln98LW74;REL3J6y zTz7@tJ{IHmSa?i3eJcno{zVyt)~$eTmu0&7d+i}biJ$DHJh#}*by&AbwFFW*1r)E& z#bj%`Y1#}S|JSCGH(*UOzHVpA4L|y;!g{GTe?`ZE% zb-BId^LKuusF@zRP4fkySvvthAFAC~6Y3e(k3m02<$rR^h_5sC(73>`86d920&3c_ zuLLNlQC<;Xi+T4ZZs4-x>dXM6$5wQEKN`j@s=gh~S_$i$&F%Jm>+cSC!7k#R2o~7F z&iZ5dI8C~DsOjqo$;#s#gT7a21dB6ATaveX+Q7?3)kgF=Q(;RwrlASW?7tp`$(5lz zPEUDUMmaM3cm=Y&f9A&te6V_qyhL+0H^9&lh$yggo?f?p?1VDo87uDclvV1$3}3&S z>3X-F_Oy<$pJPFHN>T(12(c0%nJ(r)6H~&bv-DZI|ji~jyqSWu$*byI7IuAiufofvg znHoZ|CKQtgfJqt;eU759X|B7*N6g8&DX+fU4Si=&d&KjOor3^oLg?zS+KHt`^wDi1 zp4w6k`qTId<6|uqSpMht=O4jaxQR?-1hC9X_m1GRuyt>)vuBQLER3P1erSuK@>H=W zhh%w-g*eTui%&_&u_^|+$%tjffzgYVIrjDFs zA{bDZ3W=-)Neq}G0#klacI8si6)I$k*;sApjYLPoa+iD+$;11K&!v$U=8CAIQ`yJ0 zxEx1FCWTWTDAR+s;*ZW94ZIUs)r{wIE`yL5j=MXk4W+V>Jg|^}auv=3JYfA2% z>BKk?&Q~jP-Y|EPE%^@Fj2F#B&by)7o|9X(Wt>T>1bMu$bU^)Ri;f>T|9ldrF#4{$ zp;kQAt<^t`RVs_Ih0-HaVyONnpQrw~=w5ucC7o_eZbqgzixTRHVI(NQ_p@oSyTwcp z(jqe9#?!;w^~rHodoKeahcxUVdswT%0D zw>om{JJ0bLZOOUB2C=CkHG;`}6v{CkImk<7NfCwV>*O!o0Rn&wy0d zo%MSXrn^5&G?ELPZ9itzqo%FA0woB#xaJPHkn*W9P5B77-4_nI8Zo=ua<5mYulM&n zeyk%pKacfnMSO?FH1&KUN>j$74Zb$}R5`4}rqm;aP=31IpF43MKq zdVV|wB<>E>LLf&cr|iqE-?!bbr^A_uEPrbdx%Ib*bhw~ab;|;jR~VM0Uhwju-CgUK zi)*pHWL{{H4I=xr7X7tND=JZ5+600d3>4VKhxp^@kMY=8qIvbuz~%R#8xyx4?;`~{ z{Ef)alyNHu1fJVNv#sfA%DigHh*JF zFo&@pem#|sYZIy+;Z)$#KYnW2(#ij$T0JZC#rjVp?Y~L~L&zE*5|1jzt#^kL735}K z--?xdu_Ju1HrhH(1huZOW;^Wvjm->DuQUSgzqOgn$tFc_BR4YOVz3kl)(Sm2(Fvt> z1EG~&Lx8()5d8WW*nCiPAbhbuz+rm!k^8xHZXtbP%d5BV>gYUEJwrs}830ZSwZlx5c)4Cf4# z9+So6119K*&~<2y+1A+-(oJk|hRJV|Q7{?d>gS<=XSGyimwtIkaoW}KU}m00;(o*r z_-Ygl!#jKtn3K+#x` z-<$yMtOl5rq`-k(Rdj!31vvo1xtk8ag=y_Qas4Mr9u5+ro_jDsGsEgaHXsD zBei3;4sy%EjGB?*Y)4BFi>o3vL}ieNFSVEvErOn)7Yaa_ijYS=^MVA?tM&pVqja{5 zRK7cS;VccCRX~-r&QZv1Se+_~bHbjS8z$_F)4-S|tC*T7G4d1Sl`o4NQnz;R1nQ9&ECrO#+0!@6Iz=Syvln-2Gk@ftB(P)4R%4`0Ne@#Ex_uge$=KCt2%rw%_=aet`Q8 zCOf`Av^3OSXyX8PV>HYX&PFA=kK|FH%H36bs zXd?-wVg5vLLpxM`FA~uV>wdO$lCoaQ+F>`s8;t%NbMGAu=l|x7k082<=yfCrqD4;- zBSnh@kszW>MDHyaj2R_}9ug!32@%~y^g6mAqW3z3=rKdW$du3T{yh8a@9cM|gL;bNv`0Sq76^|LjtKSs2p z72Nw9hPH>1z`p6!qe_EgpnvzQs@8G_G1GFfF|O)fvNQTauNWq8I{Og8YdVl@NOeVM z);`cwrx%9_F1B^g-zc+#mj%fN-|!KH)ad8`j0=MkD2oXc7YZ7Kz4#X>*8Xp`31j{O z1}jSKZXzihdmq$p`V4REpEh_cCAa#aBnJ63`UlK;U@$(=d@RVcRe_k=s&JUjMSXAJ0dNB!|^ECdm+#7 zheI23V(dR|MEr9@;$MC@ovAf~a=M15q?PDy&bsrAKeoAzO1Z{Wu7G1gcMidk01vfO z{x6V+Q(NN%%(VLXFsp*RL$uBKQf!c66nEoIzua_Dx^vek1ZU=tuOhCA&usASACTa1 z)LQKkf{O@S%~6Qw%~IDJ^{}+?dZs%9tdjFvGe4AQUtZdd@Z~!oT>f>qQxXP4&Pm6WowX5kX|A7$`ShXas{wu0 z1#=Pjc4OL)HAy8QX%Hn2zZtiuC5hcvxHZ1Y)9n1#gFB;w*&h%xFeVZ&M-nZPAC3oF zUk^5_nXKJ?gMLQ(YKEKtah6S}x;a+gOe2a>^p8M;4n6YkRM!b8pouNV>0@M7hl_U+ z3Weglo)zp1@$UvrDPmXh%OQ6ts+2Dn4>p$Ldqk5!w4I82-lcZShSAy}sOnT7!?zCq zi>Vjh5&F1$k>Reqp;GGiH$zaMV!`Q@#x`-Wgi zPi`A~K#pt(^bUlU$dZ)TQ~}@sZ&1sQX@A|IuC@+(njP#BcPj;3Bua|5f$eYO6-|Z|0Fa*lkx?$)bW~KN*>D>8=q7x z+g834Q?@lqdVYgEuo`?_CQ;Bh!&3`uJFhl%teqe0*GO);+Wpl3YrwSGi33LUm)|e9 zT9P*cMiN2Jh5B^ovM+SlX&lKtYYE}^RCO}zT2wy&^lfMi>mz_<yB};Z&#_VI$r$ z!he4UaT@;R`n16=UuE3kxM%K5Qej^b2te#6s zYfX|E6aE1Pr49jH%K9{tj4Lt^@0w=8C+6;64e z1i+i3_y^{Q_b-q)wHPyHYx%Ht^jFKUk!fSf_pa}}jg5^N^&jsSWV$%af|#Ip>R@m3 z@fJP{kJ%u4EyN3}LsoAW zFloT!yZUmU}0g4TRKW3Wgp6~r7@Mf~|Rq(NM zNsQrnzr(m^R@|xdZ?hVpwdMqu{axS;I)gXaJNmRELL063g|L~dP#Lu7npGy!H7(7X zTK5+y%>Ui#t#rlo$k#6!kN_PD{{T3TpaQM3FX1zm)x_{M8BGU?{r1wUvEMhJZfrEX zO<5Faw?4P_Qa!S{U7gYj^{@sgDLMUiA^>O5<4*fbEuR8;Bb)Cn%%Yk3zKwKe3ggtf zpNMeWH!dmFF0vSKRNIrEQVLYAoAez$+QP6`1cFXNo%2h@Gl9fZK3Ft`+rrhp^MciB z2cHFls{ZOop9x^6b{CqE^+z&+%;4@7c)l{sC4|mHZc#KfZ~Bx*BGfNSCm@6El@1_; zssTeY|sY5D695k|ybr z)hAlLR(JcG#;XQW3|vfK&3}9E6KhVlANY04Ks1Vpj&n-|WVty)<_X4`rvib}rH!_; z{i#|dPR>d4Q7~KA@{(09flBJa;KjCKe&pN4I3RzB(Po+=TjO%| zH)W9hW?&AOdC?4@yK|j)`(gNpsSBX0eAZ^<%XM+1OLlUc2FXpq{q*1W(#U28AW;Vp z#1(k*TtKh|SSFZcghQaWePT~&MbLCbhw~$^`>}-mANMX(?qeV~fLojEHZg>S(89`o z%(Lvi5pLsO)4PAFw~_(0Z)UJR;_*2h8sO;GYwohYYBDp~g)QGP?8T%9YoU)p1l3PV$woZaA8aSelq(kzY#KS5I4^@AK zBVmuo+>{R}XDFAgE!@O-(%Z}=t*TZk=6Bot8NX&B&fVm%j03$v(Kw&|Kmv{4TetT+ ze-vNu0cm5kS;t!HsfSWB#`Fdn%#^Kloo}>K4?(aP^Ktksa$)sxNS_N#btpgxI<;%~ z{jk(U#3cl#Kh@q|D#T0XI^XLFbz|9H>uQ_MchlsS)QsX9IOzh9WA3%elxkOFlf_J5 zzLJ=Fr(7+1#z@qmV-4d@4km8k4|-Nu$-d84_;#dAi3zxQ&4p5njVgYl%&ykt0Z)+0 zOeuO6diK%4Cph$G%^U9Qy<(?FAvro|{doKxIFdk2hbsC}(smM#$)i zWZ6Cm4g3}s|J5Oc3#QO6;nS^(h2eGYxor~F2@ecqmu;)c*+w5EzaR2`n6?6Kg1kg$ zL*3BPn7ZKPc6JXG7gA$)e0EDfy1^qHe7`k8J=?HKEat97(Atomh`o5D<$Q5v_yr(! zxj()E=*@a7Z*LAXPRdozY+PLuI#tz=i?_}3{?7EftbNzT-&7yv+=sR zk#7@y(+kdG&M;3`ogIx!nh%xkOxXE!AJ~j)t zLcdVdpF+OI*&}Ocu95LpGwDu0^|6@K%kwlVqC2{vaN3X5Zz!6&rAtF*)x=x);~#y8 zbd6Dt_}+Lcu|U=eaK>m98*ntm8WVv9a@z+8$<*`5P_jGbGSnGLl*Xh&o$j57#9}zK zAOSdG8C|GzL+p;;m&sp~!WS+~#_4XAb>4|io&|xu2QH0j& zBuW4&I8TNV4cEZ*wlRlw!}7RZ+dukZA26by(;HJbd!mRH1;uOg(R6ov?(r$}qGi@^_d_U<9dFqPFWfNJw+D<@&0 z11RTe+m4GLe?AoW!4Z{}>CN19J!dFW)`c1(^sEH4S_Y||LIX{jn3XfNxoUxmy8<`i zEvAvih$e~Dfp~TeZu_85?O%btRe=!A!Da2`l))ZZ4TO{v?T*==GGcFztAr@t1qna* zugU+jxet2{skZF4H93x;6e9)T-oF4F485#pS-gUWgoW9Kmc?4fzd+12-uDj_gk5P* zAjkSdV{Jz2@CukLLSXcft!>*Z@B#EX{Qa%cX)Uf5l4j+H@k zJTg3+<@}w-!@yB5L^zxUYZ+W{MTiqt0QiV>wt(juRxt?xn^!qJQ`miCFaXrjbspPZR6tc&Co$PHi)>OeyIWU3%JKE)#}hEF26ewu%w zEn40m#BdOUv`2M%B6;B9T7s*n7irerUbui#)KinotkJ%&iiZU#gW}^|oaB(PKlg zpO@%gg{D3!n$y|i3hE8>*_R_3!EXVP%Mb9=PB9bhCS3;5qSY%9T*|n0NTX zSF^(4x&GC>e3B-a8{g1PQL_&eN%N`?YimJH`0hDo+c>VOr1Y@9V`ZNr`T&=5o>+?e zn{rv_lCnp>ulg;hU3f}fC0Ek;)kPT(gT?31Y}lPlzhv$#^o!GXFccy#5+4u%Yo@oP zTkc3XLLlXPE|x`FryY}Q7~8jUEv4%lN5ePK-`ABK5$UwZDTFo=^&TOMw@bsCuxwYm zX|QLUS(u;ies?)#J*Hrgn=AUo zu=D-pnhgs|Kl>%#92!=ksSry7h8p7oWWPlDc7T{X2%?mtzk!KT!3pRkK1pdePi?ZYT@-HIby9vJu$l(MDE^)>fo_A66GL1i3d8OhHW74b){6T%l2mRNyX6~(} z0s`UQAE~Mh&s#-3RryWJVD6R|?=y)eRorQOdR0s=<=WYTyugTumTew#71W>oddl7M za(ND#W}81=At&9XGk*^Tn4;$QtZ-CPCE?%4e~g&azdfi#E*7~=%D+jMm`6T|NGH8GO<8nw zf!I@l{NW|4TZ?=L(6l|+hvL&wU79FL{;@2j@cSXeC!-->85%6~v+r8T*OKqK{FCV$ zX2C{7f5<7R+%-aKGK$^yZV%1fO+OWyc~}pXVFFwB7OWS4VE%n0OU!wwGlqB<)@vv0 zp^SWn-rF{L5qz4%d|FyFypI_e zzUbz88a6NljbNfX7ZOMt|1W`o<$n_xHleEpfRrl{I(MSiif4#aaA+pJ4P&4CS#Wu~ z;CA;xy+7+7_-k$?`=S>cE+2m{pD4LU6>poMUPV|%g*9EuA>Fz?_8T-T(G%0avYSh; zxBj6Eg=0tf7>)o+BbQIDLi{Lv(`rKHK-j%BXlCLDE=_f~ZE-zw<%%K4$J3NOo=&ls zdb;7682n>&^5EaH7%0dWG=avPDgm@rO4}zfr#+I`tS6F?b|OiRwi0v8TPn8%p=DE;%-n*IsCM6s;H^44IuorjeN@rmJ+yq zQ?RW3I;n`wU{s>Tqr=cNbVtxGZdEJ6TCEBnWl`pW=1?z_AORfT*f0lFLYhWM0 zGrWTASC?s$Qm`an{egBMqmNqI_WIb-QJJt!&m)Pk$(nTJDS_w%QiLS-Lf{UbO0#T5tWi zl*3|UyJD+7i@P!T>d!x^f)Pc)yG>G30~O{xu---CxW=`_ei5m3>4VC`C%8Vw?hv(& zNYO_5yYzu zuMpS6KM`d*^Ozf3CdH2wRFfYM{`A<50Dn!|_D|pl=qigGkQ7f3|F=(z0*o>M+W`!( z;$FzS(Q(|E7CjEe0)HweXjCwhM{zJMl$+R|M&#^Hrh{yCz#}D1jYLfNw2Vxq| z=lNeCrYf=#)=0{yPSE%uMWI3|j#8a4vmRzGjsxdp$6--%PO( z)ghoJM*X9@xx$U|M881Q-j?iK<`|V2tN6{@E0LKw5*YFZF3PvDp>?l7FQbv0zQkKkT^-Z}uxRL_7$HHVh0h^V(i-oxk=Mh{HC2KJj?)e(}$y zaX=IHK6%oSMbMY_>-8kRnxm!i-)8MFN)pP+ipuQPAR<9f(nG*XdN)`CFZ3qSMLqCc zZ8@jT(a}NM1T{6^;B$ZN_Ps99Z8F$J{l(iKEQ)>hhkIXaW)b4tSKE`fgIX%jW2|jm zyZ(_yfKh8#M|F*(7W#Y2nWmvwE#L@fwlDHNLUcmrbM~lq*A9cc`c|@BjAedhS^b+P zl#2hm;jr}Daw8b{d9@14fn+8-5{jR8iew$JoZ0(>K7WQ}`!%2wZ7 zuyWs`eHk)*pU_X{p&oDQW`h|K@(JA!11|u}=-~*Lz7XWn)lm$3#V+qR&_)OYwtfL| z!RZ584nNaH(k$|FuxYck_(S*PZjkR!rq-YpMS2s;mC)aSryRH|4A{-pDX*^oZn1V3 zk<46!WvcIpWtfXX^;ym;0P}Ho9RnX=N~oECZo&K(_9VpQH#A?iY4Z^%{xpPbUhlb>4UH$gbC**5_|19N6GgDlIW&YX1zPe;tw8Cg(>-f6Z6e=8&?=xt5|`JOK?uH zt3~}mzRkxcGvWU=eD7akegFJ3w~^)8Gr(!?QCnuIy;rH#z{&o>1uF-ivd^MZ^HQ|m zvW{UywT2Z>2or)?LEVR>gI~&e+cFcJ@s2d}e*5wD*k}jg%p515VynI@na9<#_e+k= zLCj76_yGg*M2S9F1)e)jGg@*5yGnWJ5;y#J6WmTX{jCpV8N6l8PqQ^Wd~Ec`MKNzH z&u3pR1Zw#+mt0##noo{dk*>mWGGL?okMacK9L{GX>%wP3(Oo0-?!jKuVIyFxZ<|!Qu~)XRm{t}nnsz}I6HC5c1V=74cNfj+ zddA^(&oumFQ;i+^kf^yT?7v+Vs6b2fF>QQmn7wP*kTGyQ#PL#nEtqKw$@RRuz;zy( z$^v2y4X^N(?l(TiJY7)p5X<|mpepELAFgcT*!=Q9e~lOVZ{f`78gQfkA&C81>(A$J z<;8a$PS5l{rnJYaj`NH1O062aU)_K5@jSbda$4Gs3~pbtPe45tx?1?yxB*MKDfi$` zqo{5mdr*_DYDV=-jdS`~yC2rZZss|OHP7p|LS{>Q8+EUTq@AcIYSCa*A&*&LoNyll zf^a?asYYFrrD61>SDHa*1(=OGvcl5Jk5E8B@e5rV+^eFA$?7-j8eWNgSWJuV^JxEH zi=(m>^;LV9+N6G{>Rj#)I|KtbbJaa^vT7sb{J$nAVKkvnz=_N3L~Dn&X9PQpM}g{I zrt_kWH)ZvP+TIh9oU9{sTPyEcG8o76qPagVkZww)FDO~QK#y^+Rc*Y(k+x5tpDyrh zTgCFbY54%Zpb5Jiv5}7N+I@=c%~a=oKrek^>;HP${AZTdfAKYtcR(J>u(!qwI5O!I zz`7IZYh8bm2Xl=~Ql;uo=++Ng%Zx_E3eRhnpg&`rNcjx52<}nqjsn+OR)enTA3kax zZf}Q%I2%fWpr$v3IPBtaChXhG@}oY#Z0)8sm(>37MB$ciyxi($*b0lDJjaNRXceq< z2SgaC{@r}GU9;gZfP-f13{n7npm3z0 zCDqSjJ#W2~NrmCTqkk^Tc)UT&;Tjtal*O&F=w>9|sM4yghxd@$iT?d_lS}mAa zW~#%tCp7oAW~V0cJEa;nq^uTL_iZ5N*6&Xu61YT)XH~;h2_`s;G<<4Db8&)dsoK1i zenyM|SS#*%yzy^u%o*(IYRZ369bV7U2 z^^=BYpx48$g+rZ}v@Zkx*A@E!DMTwQ!k! zjlged+gZ-56?Q>=`Y|&<>wi7HA7^tiIJ2#aC?)wIzo!$AZo(jNJN3lgW-g@TkUL}M zPdd#nMIlFGq`}a%v`M+J5Twjf=J}76{CgzmVYrDVx4yX@^G|5}Z(Huw{4bLGyuAIe zGnD-MX<`KLmxQtU2YZ@tCnfHO(q+Z_B(T1n`JMr zm^5epbZV$Gc>5_^kGUk`{5Qi@kdnXqFu-ziM|e-RI^kqsQF-*>u+o)bp~oLHD~FVY zDnE<87gBkS2Z4UsTig2{_L`ffB$n^Bq&+SxWOs)1Mrku`L2G&YTXMl2JeH45B7PmS z1(w*{8UOmkqVtv9*!nfbwm5O$sXxhB3atsgD$b#BTP-N%@BHoZ$RIH*SMq}~ALb2tS$^YtfWC&8M8TgfY> zDZJo4hoH7i%qj3h?F{GtIi>jj<9BYLvruc&v81^+)7_HGzFJgY%A_vfbtHe6GqU6Q zvHFtz_K2y>q*SH!WQKHU=Ujmk_tnNBXM{P4lk7ic^ya2YhLZ2kv>Q_zp)QH3+-}w6JNS40 zy|^|u3!|bszH}Vl_uGjnh_BUYizWT|5;O-fhGY*fTx;k8n&}A5(O+|M3BNOWLVGg1 zA@1FvcpeQV?W13`bm8M3D|sBw>{k;6V7S9@SfSR}8TiBPhtmrorvmNTGj*ti^0kfP z7#04aTKw7Ay%BiC{$XeL;!8Ndf)Bb9N}H!Nbutq}R{lg(?`{r?E1WONd~46#Nym}G ztwS-~F)=fgtPD8;jC^HG0M~@W6}{(0edvJ1WV2KKKikzO`Xr{4hv6m`sylU?YknLh zQvwCs@AdK zb42}q`C0hlYsb`|4R`H5_Dy189JQzfD$|6PNx{7zR(Ac3eFiJ6(Q(QB&JSLq6g#;A z#yscU6HTHGD*z7Kef`}3w5s;MLb z-)m?bH?#sGt%3dj&8V{froTPwlAvYuiKx)6(eOgGyr_EYSB@e2!27M$^DDPw*8RE8 z`<5AlBol~vyHpklJkN?XkK!D>YiF{4W&dhzqi&-}qg&6Lzd#W#c^N0{rA2cd*|tA& zO05=l1OnF;d;(ko&kwN@G&0~zeCGxS4Mda98K~l6WbW=hK!RklhvAJ_9=Vs=lU=#g zvXvcPYk+nVGAkeQEoq#M;V$@oP069UgJA*1PQ5@3!(pO+p?TmB9>!UXsv016t-mVA z@{2}+FAsK8cr(B>E;8_~|W&m?P?9GgXn%t^j%_4}+9 zJ6D^b71bl68w%bR2KeSI$5!~<_Lj9o(hJ?SR>055l)p+r+?+m*f%yvKkmlv2ln^eO z-Dj4YYX}ocIn;CeE)-k~A(}$jHlT-!9tp@9mif3yM0Neq z&I&0RuCTMR>h@AA^aa0twiWrYv5es`=XQ9pj03&8rc@>>-SFR3GzD(f8Xahq;@8evx_RyI8|%H@hw%NJ_kK7 zt^hozF0~ZHbDvGEy;o=HB7FT0Ey-MGG)Lxqj+gP!eKv6cXrfBai?u{5$Iwtu%9cUq zp-!)ZXnjY8uoH8qW8bQ_?Hr)cuuM=%T}Y)ei)zb?Z6nXt;fKE%x?#63!S=6PrC&Q| z(D6jk_B4opzFgo5WtHa7fG#&dzgJMNUq8Q*xXh?f zXwmg8$5S}y^Sb?;ux!vT^a2{h=>TLh{2sx~Z!8sko74mnFlnEF($`J;9lr=j3H2JLFi)G&p8|*+(&* zZ3p0(xKsqtt}j#|Mgpbz3hJ=FT>_xlU0BPHfYt7!d%*Mv5duS}%*r{haHG!0Eyl;8 z%Z}ZA*f7^SvEpk_ys8Y%nt*8pEvjqzwG8_TP9*K&5B(vl3c|!0lDV^!&)KamiWm7y zM0|XjTIRCa@9)#w3BOY5c4yizYz7AZN-3~_HWKcYX) zs^>kGpwR)9aoPKNMa%l4mrMA?Uyah}Km^=T0LhFFj@-PLXbS*|KHb$jyoOFbe&s}e z7S}w>tIYgWdL|DdUq!&tHRagU=;K4`Vt(y9KzCKW`q<<-4D2mF(aP<1g|b{!az<*_Kb;2tT~Cay`T8jZCkX8+~_$ zKQwb|{T+VE5^{xMzSa_eb89yD@8Rw#AE%E~!Nfuw`Z@CI_OjT-X6qQ)7VGE5I(^iY zDxP^_x}dDrl%nP&x*0hzu#g%^@HtK*R+1hgoQXz2>D8+Ni+je#?xhVU>y~WSpRg5l zcy+5>>8&|AG!ct_YedJPrr2o8u)<~8kK)!=CEMXg65II@H2C_;Lic>$-}`dE<$U_o z>-lQF)Fw5mOM5rk{(S1omHa+J@#xGo%!?IHVcj-gQDU|mMW*lJ~!U7Ldu66P%tVD4g zbJ0u`let;2w*7BW9@x|umU$e>Z=gw{_=)=0XY$`B9vp#$k3{r~!tei0QFaBK(A%?c zP_R3Pd-J7Y?*@zDmoARgpTCNUa{LlK2iKY!hU$MFf0h$|xo>cJ;%-BX*N2)Y2?K|C zOZS5Je9WLeji>E~fU%=IeCYV;1d??d%BZp+WsJt%_$V2RYlzYeTiqqKJh4JOs}xHy z{jhn!3?eZnoQjzfBLQC^eWLOjfY$&7Qoka^Z38*4mAhlL$W798= z-&Sv2JX76YC7k*k<%v2+hDP^~As*qEb8#%?iY2}HZG;@t7n)b03#x01Z?qX7OrBjs zYP*9-#tFo}&Evz#x>Ta%k7B~YZ9JKw*TPlSTcw`;c)9`OW+0%q>Gy)cO6R-p;K$#p z^T?5A-hM&ABTz(s3UGsV!KFs3x;_ru6@-FsIbYC^%ocO;W4d(r&QpeA+Vv&!BQBa> zQz3xGd4d3@6WHwPNQqH0xPp9Z@q^t}Gh!6fU86(&V!Sr-@Xa27sqB z&j}1H&0U3@MLZg#f^V#bmF#;x%Si=ymagpVJdo35ntggv|E%`SFYEqHdniwzgnX`c z8fwo8RVuYdAROJ3d%faG9N;mZ;h6AN($4w2bb0^G+-vYydCS) zzZ(`93M_m2ym-l^*U!)2`Nur_l=pa*@?QG_nHR6nIc(kGukTl}+b;e2bIZiX6yfG~ z{do*U(Jx1FU5iCbr=*G9HI{!JBm-U`E|2 zTL>=zWY+400U8@yjO(%GORxmYvp*)w;39 z!I~91YAT)}{ZoK3>Ken7v(i>?kq9YTw6+{UtY<|Cvzmhu&=#^G7O%;p36>ppmvYl7 zs{I+q{enFW%yi>}4o+4XX;Xa$*ZAnpfu{we(2V$#{W|rFz8 z!-Nqmy3K)C+323X_FeR{?fkAkq$6^m%RPvAOaMAl?0}X2NN?seYMxhvJu$3I*EN82 z9L4ZjzaOf2*Kb!x*p{1kijN&x+uXOu1E!XO0AYRjL1zsS>G4T`ExD(DI^x#(Z*&Fx zg$AaZuHXC}S>Mgft^n3Bsd?&@_ZXL)Hp~8i`l2$o$34xC8m(#1J!UPWKGN4mut>iw zeR8d1f;hB0L9+NfrP5Uz%&cQY+@FR57d_9~V4czT*$-xx!MfG?wH8Rl@18 zgf;BtkZj@l$Di>=?iz|3uy_@G^{%#Xlh3b2eiMFS^*#el8+N}a+A|=A<}qF5CFCTK zr1XPnsX%tX`5Vj(-|Run=CNWD{@mkoHv?q9{qATlkY)YS#%q^6Rj9ln;`fgTsOJ_s z;qN&g^UQ0#P`rsWRf?=J^IMqax8sDj9J;opzoEH)B~ZW!{Fa|iDVI}-A(J>jFIO?eBFpvlDWFfPV;@0i}sgu!UwdQ zR}~38wq1WxKc75h@AND9+7JV$$fo7mz<1# zy<4^_!GR&qIIZg~pZrgAo!>y11a|5JD$~h(;zd%(LhpL|@Wy!&EVdh%nQ z?d6W1D3wgBoQ+e{LH$AAZ|k(p&G*1mW)6UHkl4pTeAhI|>5C&Mb_lf5e4Kf7k0*E&Ba(fUR)0lHM~^;Hj` zcPI{Ue*;WnO53>+UIdFK>tpGv{NPM z+}2yb!N@|%B`e@cwXT;SOvn3*g<>U1s%^c!&7ZG|F6wgLzM_8(DYINFjJiiKPIf8Z znvbb3FS5IRslKfy!ztGBI=`(U9iaQ<-6~P=5uK>mY-vifua8p8v=S`1oRl6Oakl*| z(N?k-O_Va9Zd-d!%tDhd5TR_pGDRTcWC_vw$vPU2ZW|-tD}zjHK4O}$X&M3|kP-Lo zIPjcUhF(bYvciupod25 zeK^@D@OOPWk&LC?75-K>Y-%iltTUzc;FA?x$r}Fi>Ga2U;dzhNX@{irm*vtTl#G4p zK|!xA(-7R0O5}Oum_X5S4*sMss9kij;)6Qp93?NzEmL&xlg=x>q_6ywJfMh2p$VH9 zX9_R2K7(*;&9j}65Zi(?IcGzRFvNL5EwU}6jaucD8NH%!Cvg7oJIumzd3QzXh){G9 z2Y?*sCe)=;uuH=v-kT~h+h4Tv$)tL}ra3JBjKNrqVBm{yapNrHHrsqDgOaMfskQ!9<@1aVu`^0?5 zlgui!2gTbbS)YFjos)>-O~$Osddz6ElRfdU{sZ8s>3Xm#=Ryj;NxC&3j^3+Tp#BEQ zwp_aHt-^Y^`0mn?hQ&rQ@-s`VRVG@e!O`s#93iYAK>zSwxl z-4k8PAWE=AxuWM#9k4pyn0*zP(5#KItfO0nPldMtOU^Yu(6AtD^h*ZTidOck+`B5K z3?2T!?16HWLy!`j(*`!rg8gXK*t1$Bw#+A#ailg`#e4)JW5xM5iq< zCC9@kNlSngekzuX+{(~n5Yju#`>vXFGXW%ng%U5j?6YIQWHBr%rtm>dx5cv7+k$Dt z?azi%U&hBqZRj2f<}PY46%vDKlUHY!UYjy>194!r5cVam3r4er1mj2IeJWJsMCQD_ z?5RDilCC@75a_pW(!VVkDPG@=CXQh-3QKMEYZ~8xBy*Mhpnc3o~f4|DsD7Yw-WjcrgE9%>t;n=^4in z()j4r$RSnrc<7g(auv^7`21~@zr8?oSs8!=8fYbAkT1q`MA!%($9%*K zgo(ZeAp7f&Le-OR1qk^Lg-|NPeVXpyd_Tvv6%C^4KwqNNLY))=mVEminu(fGF8_!ig58- zd)Wf(^xN_uDhcU8mD_;gBqIzT>@eI}hkE#MdgNVgrKG4HoFh7;7(D<6@_CiH&C#C{ zM@}`vJx=#$X^uRZ4LUl-IeNoSfV;E}TrUk#rV}HEP8eVd?qw9JO%gLgk z4}LR&WC48ehGQT6A+;Y?Eqk5}bi3H@{Vv}|lW!EwZm;;L4Z#=g3^VQ|3KYKqU6t)V z+iHSMDZ+1BP^z>ASCC&*t90KlEg3IsHPqC#M&B^fDZBBk(X>=rFe*kcI3&zBl$w8E z2a>l^2iW$^S>yB?aQ7r}my&U847jQ|xxW0OrN>)YnSWXjyMBHi^3b~Mkf~Ywmf=lmJhqN(Q=Tw05rS5v9g>3%Y%H`Oh&hB!&e1Cey?t zfRMFnoP%SNff2y5cK7Z)949jax0^|{okQW3YT4$u3yf@sSbvPVE;sDhi%{I@6PwTf zD`$lZc#(k0NW8WvWcH8c3+=1(cf5rZLDt>si}!jWm}sk%)Sr;D_Ss14a8l2TV5=M< z6>E~9;w9EMf9aKc!XKXmxsN%&ohC1o*S-f6%Tb9v!b!V(aqf zZ}r-75F=M1Tnj|N=q{Gqp{}`={X&M>0~N_{I>UncVwz{TYg!4t2o@3?p-9}(GQ^|1 zR(RW`-H_VANgXWF{v<&MtC1ra4RLLQqH#m$j)Ezx%`Iz#ds#UX; z=z(j9*XHqPmJR3@{t!xvcIMZRPNkTHs{W|(95NYR5Q z_j@bN1_C2{8tH%aND)#Q9%2W^uFNK4+2aV-JrItct;&!Wt+0w6C3l~&DvoFMUlhNK zzKD21v$bH9qU|k3yN)Jas>m0@VD0bJr@>2*-`VI^=1}-t6}|n3q9o``UqSxejZ{fN z%nN4H+L~ogvL?`3>4NdVCoF2h^-ac9w$Tzbse)B%XpWvjMi1PvE4EKhT~L z`duU!fgZi^%=YQHk!GXP!&>hvzWO&cqBPC{Lw!}q(v&EKEy)TYMM&*kVRD~`bXP*{ znj1BOqn;72e#yJ)s9BhP>%!s8x0?^SoxXl$Y^41OAxc>8vq1V#5dp*yGSvRP9bEoV z?P2yqZS%SwGile2xjbXYL=||TY_HkUfrH=|3b;aIAIv51HeT3{4Odd$$Y}r*c<&@^9P$>h}snvufIn+ zbL(`7d`#ETP)LQ*KZDLoVzpcFCp}q@V=@yfLPQXMY~qExP9OAZ?78UQ&y2q@n8&mg z0ue=ZXJ|8`MkoF@JU^=jCC9-~6OPLc_Wb4u;fiiik)EU^>NA>CO%hP&b!wxWp>q$g zi|t|rNMgIFt-HEl!T2)+RU;a|5@UuX*e__t*&8lm%wT_WlMsMM+e?WIT#3o9h47O7 zPv&{hexBPO;eIZz>j_MjS*H}3l}wZ?r@T&K*P z>sBh+ejC53x|3f|O$`YIE_jCWHjuBtHfY2zaC#QyA@)+Q1VX2ZQU*QS_uEP z3?pWFZMjXppUMQqLC;c(@8Nm(rPp8#L}ToUQDG-nek;R)x2w0kp18{^2r{-k6&PRm z6hng?5HQE%XPc*5ZAoHTPGBqmZxqlWFFIsh$ zS<7#GuBWT%zCEjF#d4NbEDgp>RsfC)B-x3mfW6wPyo#PrS<@L4%QWn*#6<4r0KCWzH=wzGXL2h#U+( zNJO3|c6UGo+b`K7>?Q(_IAT|~&uyD+FK9m*<6An!c71l}ABtiW7ctVMq*7H}Lv8E? z>nLTdMv&+yH|X2m;P>B77Cr}^LAfgPD>2Y~R_qrtWk^S^tg!!<<2}Ac$s@C@32yyP zzO&Ff&z@XnyI`>4&F|@5kd`rf_S)tTQO?ODy9JWR)-e>=$WNg!e1PotcI~J{_1K5; zeasi!BM}xW?~AdfRcC$0g1wu>U9SCTfdKxjwy;zfm`sBWz_qkpft$c4evj<4ET9@} zVBwk4VsjUk^EFR%lHMJH2LtSy))W}spy#wCE8re>HAWOci@Nl|pYz7)w|C5A!-PZ_ z*M&HAM9fL5WHG#P21y2xSn`Bk$_d8~8+F(FFZIfO(F%>e=ZzNsl4L)WCH`s`ri|=F z$`OhqP%e=8c~tiZ1EvQ6`VcoT6I#%ZYG|Hpks(E8?#4IV^F>K-u8DsQLFPsOEXw5|wpl-t zEa4^5o?0wpzv*>kA|^Z{n;eIH@SwcUCytA5VF=1`~4WCyB2WT7&F@%dd4{5K_d9t=EdyF1@k8o;*kdy+*q zRp>6y)y^kD@7GrY#b3d0Bj_nvE<}?xHvK-T3^4`=iEr1!R8xn;tsmL5wY610ODkxo zH?t5O5dZ?%SW-X^U?T?I!(qN)I?GLH6kdSiW7;-)SB@iVNS6*&8@vw5{e2oP!P=8F ztNGPcIc{qQ3oOU)30W`p$4R}Rk}n)afBk4?5u1G^W}NmW9wM6d^rjzWBp{P)JzAkf z59G#LMB!4R*}Nc|b#JJ4sTWR4c8%${1&$3$vC`QImeOp_zd$1iviw9gr6i+&qY^_? zd%-dJoT||0NVTc=DgO_9ZypWxANT!_D3N{1ZW5vFgshWPNTL$5O=VAZG8i+m?~3rv zHj3;__T6ACA!Lb+bw(vyX3&_-^1VOb`<(kazw7*d*YCQn`&{?$+`n_~Kji4l`OIg3 zzu(W-^YwVH+T_jONw`}-D+pqr#*IEOk1F<^>`^zccesZCqj3^LqQmm@L8OrZ79}qC0F`0cqoH%tM-%r)hWTsSG(l_Fc(XbFfTV<%D}w zjG>>RT-!`Tx|JM)Zs$u_;-s#c+Rf`T9U-3m1`8X4afn55!zvcVOB3ms32tjjvsoO- zJDXjFJAL@)TeH^_Zymzb2iIDDuL+Lw9y$0gkbpi{QqX{Q(Ycw!Nu0+(I5aw>y-qap z?Dn>WiS?#1Wczfczd{GhFPWqTg+gXPsPJi zr;L1pW2D%U?1n$m=j8&Qw1dCeGVW-QTLCV^1Y{$?Ie{2KHv6J4NAic?qhyg(?ow*k z7bA6=Y7O@z)j8FthnD}!+219|u%7#{T$H*LczUzvBxAyxXiHET#0YZpNIarY?VTKP zVi4(_D+iEJ%qKq$`r|(zx^=BsCm=*qaDt&o6Fv6=>AYu-Pu;eC_Hr|w_9`I<=JF_s zSMJJHwm&8;nWiH(lMCJ!ABefV$VE8-SNeh2nsAsQM0qzleZcDehHvqY_xY-fHTH6L zoyA^s1;iD(Fo<+R#@G~{fbxL(&qR!+V0M{3$QCQ!zKh@gWB?uTzapzgyCRA1mJ8+N zAbPoGg&;zzHMN=3VE|n+=K8tx;`0+-oDJ8e6`wv#sl0Zr;H3U%)^Q{!&4*y%Lgt?7 zVfR8cLQ^#*BA}mdKNlScw>B{@Sc->*ob6IPVak#s&!K)=%ojtke~LMA zA)Qkd-lED$9*;u<>zthJ@YaDfVbbTKEM=IWg+SM)HZcZ^YCMW>cAy0Sj#?kF$57FTp%EnL+sK zFc$H&p#iH`+3IqtL!Tg5v z(zD9GQd|b_+1q1%8_nzCWws!B5UBGe>$)?V%0s(G`b?=Mwc^1kG}{0`-R!lUODdye zl2~zhI&(KwC)W2GcEpQ9*>r|ZL`A;10net2!qx`>Sl0p7auYY#UHOy@SQlJcW_C!LXdr1s$b#A`!eS^N|OBMz>D%Y$tT zDa`9C(eV505FWVh6#UllWQx9&0I(jKF;>k{8a>fy`jPLZ!6<)p*kCY}x63?a4U^C# zPdb_XY8D+_sJsOjY_O#Ph|7%S=;up+%?@2q7S*?k@_n4=H~D(lnWV2LKlk9cuWjbN~FYhpY1XTvh310z$ZKj}wt4*!FtEtdNWIyM90waxT23vO`*(T8P zJL!-IuO(!6E?0`xJTDj)7Tagy;8Gh3G~g!})9du1YkpsauuwsowwGis0V81N<>uzu zH88WX#VeCp)nd#P&(n=jM~m zR~yGz-+Uh>K}IfBr|SFa+%0hRH!9|;OD1xsAFE&;CNnTBe)`aL&QK##Y-lTrn6fGQ ztf989@>0!Bx3&d-4tX{DMykXB9DBYKDgl&iIRRfzzuy@OdT`GER5Mo^9V4SXCKFJb zQSg}W&mg?(4U<)VYu1znDExuoHwZA;d;7&Ao0Kaf%is`FZ5gKWp;V?fQkGk+w|ejw$>Cxv5Udd(k`Ixpx) z4TZCI&FV`(<{r?~@q<77{x`_gq4xb$rqjM~)+eZfs&BxHA3KwGhc7ej1>3%)c>wD{ z9>!#NTz5i7m!Heqry9kt6m2fn)oDqlPF+pkDzAUU)Hi%<+fWex1Sm3apUL2%2o2aE zWTy48XDmGjguj9K(o>nGAH_6BT{(AD%r%<)XLtZGX<07J^!J?4HJ&w;+g!IwzR!Vj zYwT!`a}?)sPnJ!6bhMmI-i9U`iu4d~QHD5?cXIpFJpG26S}&3<8((By%+k9S#dQbP zSIiZiOq`5IwH)>CrAlgBo`#taIMb^M7tfr2Hr_lS8TLT&x~1aNO!13XuE7Mqz}@L3 z3{l49bFEe+58TNGKiDz3fPbw&^NID|%Yj;Hrlq*vkHy?(@48mkhId7XtK_&D-@P75 zO2g#9tB2V_Y6A_%`eKbuUH7U!7O$;k_w@}M+hIf?-hYE)RvQ`3KBcgOVJ%(BTK}r; zCm+T`bgLuhf?r6K+>eR(2TTx8-t`F6QE=~faG+^AIvZ{`Pt&fk-_8>}ioU$*gRXJs z!=49>SzM=oaT!S%eY~QBZvRg}G`d{K>GUdn9qQ%QSo~ZUgy6@&WhmE~Ic6~fS9p>e zsy_O{j7jwRh~6xyU8X2|2&O@15LFWOBi~W<237<}8-Qx;@Y?9TTt+Z|*>J?gb1Z4t zHh}Wg3CcVbc=a6E;;yqBDTN$O+~|`C!ZWhb_D@5#4YlSU5y=HO_}z{h0ScF@Z$F%^ z345IRHlrSG0YHcTOj^*}x-J5tDn}T;CY4i^^#OaQx=z^_vbm*RYK~j7t|DI7&DEd^ z<)7>%O$0a80e*j%5O*ShNJE`QsL6I;20zU(_v7eQE)swB<8;rLwz3EDJ1*yrtypo^ zwz)JG%8?g|YBbwyZh4A=?Mrb9RLWZ%61Dq~_rzL@GOPFNPC&u$Q{C61*cAp1br5q5 zHVQAnKmjX6?l?;B@~FDz`;4Z9H_&Y6ylH17{b|3C$vXRyw(10zI@5V>K&)>Oibm+b zTJI9mS_%ok?$7meH(TIQ!d?lMnEjxb^KacbPTllh5MdQA<_>(<6GG{u2E$nK;50uP z_-qDYQW92TaXstaG)<&Lla|B2C35@IL*Bqr@l!IPCpy6k^JEmDAsFK$#yxtEWA~e5 zt53ZxTfO$Ev*Fc?OATeFeM}!lAKsY*eK!S3Hr{|IkU9Z62(V^DrlR30A%^XQLg#*) z=-+T{5AmtRTV3jxGsi?5nftyvu%26sW^G|i0*;u37XXav6edZZt;*nc4c{N3=dHZL zzDgH{o|`7Tm40b-DS|)dswC>aTV-LGL2ld?xF+Dm;ist?O6n$&Ru?e@FY>Cw4#Xo7 za*S5|li!%p)wVr(3y`A!hZ*=^e%FA(unL$^Z;>=fs)gz~b+}k~eUWwH$3GD++K+Z8 zmONNRetN&A7a-I!02~V{4sk9`n#xKIWCgGzyAaQPtx?kYr?2@vKZ2S<{&^08iesr8 zM=9@1*tuz-6argqME57mLt63yi=Ttt>JPy4C~;zDSL|<4_m8lM#=X2lfg5Rpyw|Ey zPu`7UeXslfu#f+a;`}ei@;~u8+9&!O!0z#zvQCO27jz+$R(WZsTadiJ&4aww3XxRZ zGg0&W64T{5i;FFhSLzPPmi1qdZcrScvp0@CH78_nc-tGp8iwuK8`BL;?>H)?R9Z2s z>AC({l#3l=I`>@EZ^xYE(CchSNg!~?1J~9VCW{>kr_U!UHw_Uj%8FfbyhO-<8gH8| zVtlVUuD=hr+@Vut7HHz6mQE7$07Cf-LYj7a{@mHzo(o@INu2>*f>)foU1Rq8jymEe zGjlR%ANkeymjV)K@ot;`9&q+8P)~3aLV6&?`+ux^M}@}>Ti)GL-=kboObJ;-MRz!w ze46!T$Zjf~Y@q)ECFAd~Hk!sTSQI)a%T&Ha+Eq%0p*)3oIDEL@FNx0~#i1K&8mD}& zCsm$#vh~T^kL)pfplixT=XmeqQ9H&#<#4O19%;B8rLY$MgybG8Mirx8`=a>l^3fAW zghYb|lN|Gp<0jrH_MaFpm6u>H9yXu&Qf2R>Dt(1=fb+JMMzVKxr02R zz5Aq(OHeWjnhZE>3YFAjP((ECR}ZYVoa_pKOzK?G%y{(sxS-O^P2l zVz8?*3|V665HwLzeU>5flyTv6m)SR@2h4`#X#cbGl-S6p8jLnozKEKkxdc1-M`T9> zBD>)HZqLHI?X#H=ov>|{p3Aoict7fYy|MX?m>DL;H?X zdqidrBh^kU7;AP^jJJs^y4iu+^=^F_5tfT3?g6)y2YxSMrr(*3UQRPArtk@|T7 zMSFc?pZeu-eV?KbH>_{Pnhp=1Mw^O+K1@frOf?zNGNaw^sIQGLz1 zx_&YL+v;@uC{T@$W@yqb5Yuww^}*D8=Ea^`5ncHTmM82_o=kt3q|MUEXQnuiwKQJ~ zH>PJ4Q?{wPUMNn4B5der$bL6<7uKWN+K@c7u`B6Xrp;67%H)zYs*u&D47+lU`9O}q zy2G?Sxo|{&PFx-GM)CdZxzI4}+B~<{B~oD|lVh{3H&6xgSk$>t@=%EFhrHK;*;llgcivFG8y+Ko zm|9TvhkG~u`lz%BA46X5tuQ&#b zz8xkhe{-x{djaUJHXFN}_-<`;N+DGd7Ckhrpk%*DxS3mO65uCVa>mRl6#LTfmo$hg zihtYr3(1%q0OrGZaswa>{*1&s1#mX<9wnQeGENP}oo8dTev))v^7z#f9xzvn_zZ45 zrUlP3gjXbjf1-$Su$Hkwy_4lA@?>KsJarGM@*L>88&8d#xeC^&%-n9G0I$xI4~Rb! z2xGyRsVxH`Wx4WZNm3?^!Qa|(QxGjr{i>IGvNTa;z?=Y@Z?sR7v;(TfoQs60)yGI)KOh4Qs z`Eu+-8D6a*j`|js`tN`3%0&K<5RMt6n2^=yenXO+#Yz8ATSZZWbX)8_v9z;87P70i zW@_cG4E$K(Gyd4dqGfW9zknSC@HJKbm;EC0{>zS->d>8lUqXUj!u&4=cqRzlo&=if{JogL&>g+!W zF{|U=-3Y>jo=JyC_7dU;B>O})3+TDgRj?vr0kt27s$ZqYYoh5w9(G`1eP;aMphPIq zMkT?fNM_pScfL6|p~NbBWjAy{E`9%KEU;V5O9%ALm3fx^SZ-YfkTiu1)d4WvCW&b} z1G_l3SYMt3(c1-vQ#)I~H$POeTSr*+9P~P$q&biSoNUQWQ-%O^uu1w} z&7*$x;F~yEGoM&;r}3ZmgOf&-nF>nY>AK$#R?j@2@&un>xyXfcIr1xJ?QU>H6IV9EwSf+~#o?Mn zO#Go`5<+phNzVc@p!+L9(Z29^$Fqn&0S)0#QU0IwhyK*JrJgWl2I~T~zDo#xim@d< zohC=P0#q|)+tEuaPFq3;y$xdu*vQMOv`=ggZp5jUfV3Q{`64s$$eo!=3dDj`yP9Hn zejCgK_acljl{;^D#IpIZ@Kl-d=|z}Me0+I%TI+L|(yR^O&FLhnBF2#?x-^Ju-caHz zPN7{0Nu8>)0N>NydiXc!%U)#L!E^e0Vf!9nhOi|AAt-Tw*11!m;4U}f)(qb9cnmgi zaA#Hp4r|@5y!uMbt~jZ-%}x+xrJI?c!>)FyveO8#-tJP&NmzpI04g!mkZJmv{{8Yk za++Lk*)Kh#05 z&G;9O{f+%0=qJ7OJJ*VLfv9VWA35&}Ljh)TznLOMRTx?Ki`Q1SbU(_?t3%J-4kizAuDGx#koH>kuvJM8ppy_#9?VH(1B`&G1EK^0f& zZ<%>FVk=p@i(*E-JPBk*0cMxxG|Ar~7c~_u`8UrJaD=5d1Jxp_oe8&@Z$ zRh%0O&By}^?S5zB8k7g5ZTuY+zWb)xlWDlpIw#LyXz8+3EU$dpwfN@HB_Rnjm;I{w z*NedC@uXIofWtaaCB<%ACWHc;h~K@ueda!i(|76XLenMe4$}R*xsH1va-$fOHUKV$ z>rsU%XlKeRJoj1J6UtO2`~g71xwZ!&z^3P~HBT!&ZWms-T+QaE`8uk%K>WpoI@jvZ z#Vy0ZlnwX2ZrPDFHF71w5Ea|6TKaLm&5$#f#PQTBPv_upMj^U0S}=>%ShSbL8Ji2 z3o7o-GmKnk>k5e|842}gHs^e8!rR~eou3l0bTew>5ju#XNd)r8qr0FgN%}}qt1~4# zjI7<5V#%0joo*Uf`Z#pohs)Sh3nW~`3^}Tf2TBLFbqh2{5;%jwL$jYn@NP+7yu^^I zPcUhn-Su-5`BW)h!*WmJlR11?all3HoMaHyfFgaBf&|_(29)LZ6mRq9siqBLZQ)d7 zgORwIV(rs?L8Ja(PaK$;6}^Aq{-DW7dU7z(s0Va@+#qpH4(Xy3fBoK-c&2%BE_b}6 zt>YlJVY!P+4D|us7=S`uP%s|b<+z8mA{aUm(Bf} zR+fFJI{Ww(>4>5if$H9$fDkV zJylS{oAt63h_kQ%4SEK_p?kqC+I2r6~MV?agqL6qmCM`7bKIA+@)@*l90(FMPq9d1Z)WS zbDi#b_lJn;@Zw{@xF2!c9A-I;#u;NFjToBLDlyY;>j*=9y{+c?9J-*jsgkRY3MpOM zjsv1@gTgPOZHl?0F;6WJ2jm;{x+ZjnYM%$8TY6AeA8{5#{1lob`JvQY!zJM-&eDvM%dY!78ZbQODc<@D4yA~_$g*PcuD8S5%?`|?fN@E*6;^#><= zeAii@+a@E<14SB3ngBC_6)2;7>As`b+D+H&!Y>d=ZWjE_9@=or5NxeOZ(Yv|V z6_BL(Vdf$RNZg3#bzV&2`)aEtZr$)>*dW^C~eFwuvyuktiL zMSOetm|Mz)1pqYH8tTIBW*8@FQY2_b$Q9A88RPm0bfff1jgkIgVY#vmS4Z-4-k+G> zIb<`C?t_rngbM5$o~PK%9X)8uc+g1k)=pSIYvFf}Tii0TbHYqiy(^ey?Zc2aF#h;( z$L8e@TP`38K>JkiL38A_kqZq8{!lHLY&zk}zA1Cibs@Qoye@9M3QfSfFI=S`0uXy1 ze1_i*Af=ekJf86&O4KC;s`x4sQg7aB&HesPLpkt{HMk=nnkk0r_q0f}m0pW+8^fIb zIVa?NC3Drr!3lD&O~H#}kLBsO0$NGj=*>rGJ1OQ&h4OiX6g+~S%g}@?HdEr(=^BLG z=$>=lcPZhXYoE_gf16g3b>j`Q5Rtt;Ch3^@KrG7NYqjawk@jk9=uT2Vi2I!OedC%D zrAq%FLRwW1wYj*a172-909;K$carwbaGV_YY?E^gy``Ajma@FInpOn#wiNmhR|(2M zv<Kopc zyXpP@L;Dx~xlyP5$6d5S(8e#`DCair1&`|#w=&>Py56N1L=5f2&By682d!<4vOB7NwqsVxPaye9IWn z&B^Edlqas_)1G-6bU#35S}RCH(1<^H>0~Il(PMBj*&e(LL_og)3;ym@5#7@DO#vre zMhV(`Z9bZ}Ns|dsH{)=5B=sHSQa1FxK`oA|TnQ#xso=U^UIiK?!F~?zwH8ti49WI7 zt(jJa;H86f$hV8!6!2)24u+FLU7rV_4QB`_n!;pKo<~1~jiTU$!shq`v{tUl(26Bv z?1&C3akhZ>gDZ1%Y2^h>J#Y^u&H$|7W|G1>_dpC`8Pb=V7oQvSe$g{0XN09i{z8tY z#|!I;2I;D(kE$l&eK8nV%sR-fQME9S@f4OtSp~UGxG= z0;F^GCe}O8_q0%KJ&5`1$ek>b^x9-!O2j0W)52!1eaKu2dU4FV!hU5U-6iuUT`7_V;V70sTBT|F_4~yh<$m<7F_c_V&JX-BWciEG)t(2{)j16S zMgxkXXeIM-DQe_}qaB56TELgXl*ee#75Dt0GTf*|({W<9RK}REy>D1AG)oha(=>%vHDr>(m~Fo;?G`lr|^hd>XJ zVlIav;DWmW0>U-{EVaJ*zWspqz&jwt5}ilfCxIf@CebpzN6M?{^c-Am9U1Q|_a%i>9Xp)I?^Q;t z7~$1Ax)+%wa)ntYH7ZiVoX5hC`y6~eUm1^$ z#5}@@HKvp2qx5v;-$k*@qfbyUR4*79ubsjDqV_ODfM!G*@IRBE!36`G`rO)|JI}-| z&r#LI6VUlw#7y{+DQnM^vjr8x06Zu3(%@x#=$W3kE>)g0NbVqA&GyO-@&YM$%_oUSa4T(O0D{1zs0eNIVmgSv-ig? zyPi}(gde#*L7WD@99UNNL4Nz;f(DogCIc^EMIeV96#c^Dt|*O~ze8i`9vD6>ESOi1j__2HMHYM-~dtu)opXj`vkAdq72qtCDoW9*K? zw*iVC0h|i7#UM|7h1pD-@9}wVbu4GU_HO^hp`G>X!TqEBu}~@hP#)HB&=Hs$=)dlr z3Z{dHv;ifLrbbBFTw(jIlA!+6YQX_}#$`PD%y+}b*+y4Z_kT&4uHg~WP%*|8uho{^ z1OzYqQqPP_%REgu7emr&Nvb_u82{csh8X|w@w-&a)4@(Jcb3Y%c08JL(eee{yL3|* z8V}b4nmK7!U8;SM7rTemiDiv#Pu|itm-Q9~6Q-xj;0(@F?5n4c^?X@>xxC^sP2pW(CqhHbFzQFIg5UUAi zQELaJ6WCsRAh%2t#ZmjA!+Tu!z6gp(Qf4@_I92@Ah?udh^jlguJz4*OL3TzQgU_=^ zj&xz55@^diw#8oe{_5(!*nH$r^C+g^gdfEK!(iW4O}81u6`DpPB{!1bBSsF4G(_%3WN>Nr zUpLVP~PU>6}OQ`h`rLTZ`&Y;E#BGQQ5bbUQ>k zKbWZty3mSSE_kO&q z-Q_7ZiFLED@@d+aXkGi(o*QmI!A_E zh;MDTwwATdVp{=Pw(FN)G)CAEg6vcN@wu5A>2QyfR`-@(UcBJ#kaf3x2LC!NU{vgf zy6~q#X4endwK zATDRdx#m`#DSE}8Mf!GMRP@CWVr(iUZN1#0aV_#U30KErQeC;Sj}ovYWvx+g9oaPe zAN`B(&CB~V>*AF19*&d`O;sy$pMck^GdC6EP0vReS^@WH^v~lAEQ+6|N`D(%T`Tzm znqVuW5LCQvJL0J+tjwdJ)QK6}hyp*2viruvcD42g87z8v6;S3mt3lVUyN1l@gAVNRSU4^hlW+QWw8vp_8}=;pLs ztJkw#$$bgA2kx)wRi@UwN4G)zlOJz=f63g>n8pZoiBO-x#_)IYiCi=HN!sa6e*6wl zvvmi9^Mq-Mv*YS+eB+lr{q2VE;fTFDQyUOn9zBLWK|4=b2%{otmY-`75Mb>F8=c46 z1g%gS89ZYb5sSVnH$NJFgpOtS-ru;N)mT)9x$C_K6cg@!2Kv2_6#3RPeQ%QRQ&C84 zmlIyk!9u|r(!s`kJCpbajp~J{@D4*@RTyzhJrrb00gfv%D ziuB$tQvFiX^)Z-weN^P$61>bL*zfiCn}^`RcG#XMV7S|+ic(g4bD{k3i1$FL+Jg}J zM2Y>tn$e$N+B04LnlGL2#NC%CpX-cB3ByY(tH5H-)u;t3d6bCWI24%y~?0L&>f;j(r+}s z#C^+I{TqQfubjQ&zH4oZPxG`{2lsCjE_rwj|GWUtB5jl3(f``%@`=P-rixyu-AfD( zgQs{~^1^hTt}eNr5dA_+5`6s&B%YdeRq`PbMZmKF7fn+7S2&3D z@0kmZXHLE}R~pFKQWFki9W@Z?e4M}2@qahE{J)q(6kb!_lgzQ;lQgzU%Gi)SimV-f zxT>%lit)%ns(i{mZ<%?)Lnn;Kzg%Qwjo-;B%y!p|sKOAvzh;@#BaZX|Y5_X*W&lL~ zhMu+SY?&1TaP+oX%Xa=aAc#Xd2dO;V0Kzt*1n~)acptL=q6)dMiEu)!yktxult~(} zjWuLi?YHh(_lau!gK3po7d~xS!gA@0yGD?3brU&-*%ybav@64mY7d4zioOVyXDqDN zuf{@L0TQ_z1<;MyP^rIKMvn!1qLt!mSWC0a$>m=yiDlCcXl9nENDDxW1;+L0SCJW1 z6}|2Fuo{X zYjN4==7LH=pik|{9)06y)R7E3oiG&~0pa>d7PUcfFYG8jN}pSi7;L$jENH7}b_K+d zX#omC2{2SB8h~YJb--DNB$yk27!ts@;c-{i^`#jzC0D?0(Dv!AM375lCoo!@w|MuGycu%|Eu!gxkMPy&Z56H#%& z5sL=bj)u-Els^@n&AK@?%oL@eA@i&c%V#ngF7YnP@D*j8dJC>jFWU8Sr^KwE0dt8J z+pnxx9XQ@DUTZMsYf3F9y=)to>qFrj@EN;oej#$$J>jpEv|Vd`@>D`R;es4fp2!1N zc1sb3)cJ8p!%99Ns*uU_GX1-Rh~RFLP`q*zUHZDi2N^A`XN@O5e}m@_m?9i`yBm)t z?voQf@93Wao{+Qjg66$54p=t=n7^#r1%09PG3RpC_4m$JS6mWa|B{AuI3w;xakncR zpvVUFk{)ru_6Z&C1nSB~N=?LX+9-h#x0ZCbOs@^;v88*$*`<%v+aHy3q`rCuEfFMo z(D5jRbz7f5U@dA>N);-mEC917ayn?A7;)=9&Yo#iVu|=3Ut&?@G4M!Cf?)5fp30})%AL;U-+(32F&K|# zpo(`MMQjR2?q+C@OpNr5VXh40x-imcDu8|KTNUx{5d)qcRm$jrS)O0>;z;OY-lUc$ zn}gM1afZ(865Zg`82G5vOoOL{zCKA z1!kqV{;2kejniDcOG4~o(cbgOwLC4vi5|*XhBR@f)jlEpw>cnN#?Ji>dgyap@-!+- zCW!yzRlC;`S}m3n&QXRrloS#_c9o4LSVd_av`--0CN#AT%;y%}&I-F_C$A@M6Ew!u zYv4^-{hA8|lH)N+LZZX*hUZ}vDA2J?iW^78E1gPFboMRSKHcm@Tuhu-b`yD>z&LtJ z#q}rwM-P<5N7N}8VBFQS1Jo9+*G#`wMF8s!Bo^7Y{Ov3PLh4SBLF%&c4Z7rPZ9Klh z^*B!Ai{+Ikpeu&)tw2E$MnRIcZ{$B9awpg5n|m;yMD5g!DYB$iWXb`k+<^9*{*emb z0cM-?8?SYhL`;*)fJOMSGEnkLSGkauPR`r9u~XG!5qgfJH5ZSDOm6>NEjeD}KcOXBF?4sHp-NHTurNL&M(RCOR4H%%zex3~wLDb!l+v377gu zrhy`}2z!gIYbwb#vaF+ig;*iX$x3e-uxc1b&oyE(bapl8BJ^3V)eh9ed9IVqh<9=fc072-y?{pLU zP`yV~_z_NvPg{$p9#_sHu6hJr>?AxWi(7+m(R3`?ybza3+yjLcmpN4|=0iCRwG~U3 z?pP-*inu=h5I=ERT5x|p1LF!2Vhj`s6NiV+K==nq(b!(K>Sc=U;6;^%XXnGLE_Xcg z62CgKzkcpjQ>)zfV(yuIk<#|Y);v3lu7;a+#QKq&(iehur^{==Aj;@4LFENphtRER z+Tq(-w)iyXog0pDk?`=o|IYId<9=35|3w(x|DCsU3Yx6=+s6dkkzE&8iG8=Nag~I7 zs(lvaosPSv+8`WS{-)`m)qg_aAeSLN3`~;b22?0!U7;kj6)6XS4lT3Aa z%bN!#l(Zvyw<|DBNrZS$Mjx}LbXkTGbB&s((IG69q_XAiw5jYAsruv%L&qzpQ$KAX z=PHDkC$+06+YCYQkY6lLyU!A5J_r#D;fxqiwcBEd%xPA@O-|4J^&{*Pse)%mSpVhK z3k@e!A@7_o5upiPVeeb=2~MoHNoNa&WhWmrrf=~DWVD}u^||Ov{u(M4po=}70iUL5 zU>SlM0T-t(w<*#lkGh&18JC&X!9oz1YBWF1KA(WXS|)a&`k~+z``V)Sk#3I#>18FN zai=|6UdBCVvUV+iR}bBMy3vPRkf5=Wbk_;U40u=-kad|!_OOhxoAr6p*jnEzrA19X$yq@mnLi za{ik>N(IyErX;nOHEWghZFsjDIZ}WL4{b#6ph{?LGc>25itXGLeZZ3-cR({HC_NT* z>&8c=-3^pZJq1^`T+v^Xmwfo2^#&~nSh2nU8j4>Ys>EO#>)sP1Y-f>p6(YIh!q2ua zpR`JtFWV;=pV~?5b=b3Su1~tg00YqnXgW;~U%#eciPIajqRBq+6vFy%+Kj+k1`2vL z#s4J#b-~n{nN|2i&*-}-eeHqO26|mP)tDwnDfC8bp?uajwGJ#2u4|P+n`P$qua-`@ zp44KUytG(98&U;uh0BGakzU)ADF_Z=CE$y7YVm|y;vX~|_=I?USX36I4eq;f81wNq z9t5u}9O2|a=-e(QU;&wc2M;cLK#7pSWlJL>S34SLpDSYZInOp75&!ICQt)_>{34To zbzxO;R+RUas66xcNioD=#~^ypj|Xl{F(5hIrx>GQFKhCaYjmwe%TN*WlY41hgVv^@ zYD!sSYQl;^bN}=rG!&xxFlS*g!=iwBtQnGs;R~Tm1E~Ii;|`hIAC%Qtc;&_f!XD@u zK|;boCnK5#m?Q?fY^}^#NTr`YzL(SyP;Yn@ecHfCqWYT>m@G&__qS_u0`RNh$uUkI#?yfbS>#p#%8kagmt}33CGC;>3-I>%md#$hryp0Rly+%Ze(b~pOui=#=k+;E7X7= zyVPO5pjE-GCcsDyfSns9Ur;SzP_qxSzm<%!xRnHWUQr5qQ<-n8|9e2Z<8M}W)3xu` z(Wg&!#W>Rw5Ylk#89Z@s5QWolCShLKSZDgMS`z7HFOQz4irkAxT*$le@m`>AYN|Ld zSx|uKzS;D%Ly1dcw`X?On?5wgDb?;0giT9suqU$?gSh)^r~daTC;V5ICjQU1{?B#& z|HnOG$51B4C#|V)LA@E$UwkfGoE?H_{Ww0pD{xn(6MR4FA0~I!RWSkEjf6pNijo{w z<;)g84yMu{KA+b0?rK-wjTxW!2FYh_v%q^d%W>@)Y{));xLO1}iQpF(-jd<&z^Rp8 zeFL!;Ffp9W6Y)1l=qZS<^{%UPO?y{`xJ`adq;<4Lbs3+nQtGGI4c$<4!kwL9sn`D0 zj(r?&y|$M3Tl7CAl>JMmRh91UQjVzP+aR_Rc0S);v5AO9XF~2m|5_zlfEOdy!Mi7^ z*S4I`l8%z4=7WvjIYLcX$!@jv@zy!#-rEaLB@U#j4gg5k+3^2fZ2qU<{D1jT*Z}xZ z-ef$*iF&CgrXGzs{UWQBFhg<&Aanpm>Fkyr!Qh~zwa0XL647eBXZBTsHs z2X~6zDHlsxV|_5vD3*AMf_?kE~nBZE2-Jysoq7k#c!tWl9<6ipIJA*3zCF( z{s6LwE9EY!WWc6Ka=umtA?dB1F5Ti|W1TbfkPUD6x$WyPz4^gUjm(pgomWo^-hc3= z=FmWk@Hfb+BYAXmnIm)QcHdorP?`A&Llt@lO{HYj%zfjM}ib2K3cbeT%0=PPe5!7L<@ zzf#<&HVfn6*xw>Ga3gPUeh8lafW`JzIjAG**2g#Je6Iz(YE!;i%nko9hevb`udnV( zt#L0@_j{vZ2aXvQ@lWnek4pVmUb!-4Bb=a=n%c_VE+VZ-%uNCyb8SW7<{nq#UcZl} zb>qkYuB=(&b?kFJK9P9jnl;mL=nVt{4hC-6QMd|eqTagyLGl^t+S~}q1rrg&dwtaTbhWyG>Qd)veCLfqU7GSO{Rc_ zX(B}Jeho_gur3{)a0pAEQtG?#9nL46CUExEN7nCFmZy3+DKWsk*Gx1_sW4-W>5=p{ zlyAMcNUptgY@i7(s(LH?4A~_>We3qOyu;`*_>p~p8;#Ow*ZP6f8v7f1LUFf|dQIU) zrTu`}wv@FQ=*Vtya|Ls?$s)*-q@3Ya?WH|;obx7veaXSu{-aE?=T|o;VSgjmbIG9Y z8(L;(g%_5yd5zrNuYkBp^ZpzRueP+tz~w5;T}l=mDMhfqs>h!Z6yWJ&QX_s9_YBx- zHtq?0`LPrB*Ultsj*<0{wUwp!FZ$WNZ;@wiz>~l<0e0EHfUwE!vxxnzzWn`tlLNF1 z#hiMJVnX=d|MlUR)|*;E#mm$+X0z0du}7xQmpFxegUn=F7oeQ2wH;gZ6pxg`&vp0IPmXDldvc~xHQs*bz(-#qnW!2-;}hd7 zV#@G*3vuw1b`dMdVv(h(@yoL4nN|bomcVV2~B(AIuftw{Z64B@RZs2`Hy+3Mm z5PsO$@f;(oGhKc&OBOT#%2>!{u=x?o@vLz*?xdas7t)!bz;h8}wRbt@RNKXeIXmHT ztQHgR)7kzQ;S9Willvi~7Yz2g_Z14zROgE7+W3DyzgYGup+GglKSA1HpWEL=aPP7e zE3kw@)A#}ZIACAH-M1r^C(!J0sA#{-W=)jK)Xz7LO%JZ&UES`AC$e1s_2-Vi7O4a1 z$n3cSJXbFnxK?ljCQ32b@62Tn0&C)&k(*+LL@+f3|LazfNW-;vMQkHF?AB3{=Ih*v zEBurQ-z-Y`z_E6GvHz{Hnx{NC1*X{;X^^)GHy_blYbB z9{*;Gwp<%+n{-45q^Ia$nkBtS5sCMJ9SsHjw7*#^ZN~M!%H#s0q@v;pM{?@cS#=}! zPs%uTy|hmWkW_h;vS?4y2>F!^nUSr`}X} zYkhVsNX=N*i{IRZz5q9B?-~%03shrD+~c*Mb!DW4)LNgW>N9_Z>N%*rY8_41@%qqr zUqa+yLKRU(oTTvr_TyCjvqe%Q$bf@{*wBA#?@Pm>{@cDs6cMs-F_krISrcX|*%FFu z*(%u*Ly~RGSVHy?MV3UC!ldj(vV|i17PCm!Va75BGxLAGU9axvxbNe+kL%s@;(FI{ zFf;wecRA0``B_3Ew5+^@G%bSajP{=9ESYA=Sp29x;Q?0z;_ykf-zG)&l5US~i`biA zVl6z9=K`l)CY2PDUQt-cDzVN$T{wnRBlRtsdmk9yo7HH2K9qf(j^C2Og{CNw11R_D z#Yhj*3;aeWH<%i57q%jVXqTEt6cv3Ryxgl>De$tta`HrcvD)Q?j@QQ?vROjlVHzqa zE?nv^d{D0Y(BryFcL>MZxiSJO9gKn+wk532BSDDn#Bae@U`BS0Tvv*l2{*k#&3J1^ zt;1jWw9M(zOh zHjtbukW-3tP?2P{_WgweQeBhpXD@$+Z~-YPhV>pd$pQ!O8l=kGrfLBH#*J>(<$V4T zU)aEeyPDJuZ6-#)8=^rz#^&(Le62G&y&CISJ~%EuR1wAB{OSt~Hu{^)e@-ZN!Z}u^ zzR?ec4<5T_&!9jh^1iUHhzsli(F993{R7eq-{jKV_Jn_MI zOL1zz1lQuB z2=!X=t0P9$Ih%|XF@^Jn%gV}9Jl)Y_FLRl8s>Dp`Z&3WJO>Gn#z&vT6jxA4zb$DZ@ zO<|YX#RMvbK6 zn&y!)VV6RULF%d5PUjQuL#>Kkff#w-YOH6hn7solyS@A4OS#AyhvkdV_ke9i6O`B_ zj8OEgqe4#E)AT*~--~7P%Jim;_uR;|ivGoY6|gXI*=SO8t1$JTr{D+xQ0`k4QBmDu zpEU`4Il*^kWx7m5_PCEFX0dbecXzM{u~P>rePD+M1Se8lNlMsGC957mluT{YxZp^i zgBLG;+T~nlN++)1*`oLlNH}#s@3Qe*HgTrTLr zs>;flTmAn)kl%0Hw|n*PTJWmlFxGigoHT zCpfAI-}a`R0ndD9YDGdM_JDv$)ezP-dX)cQ{K7H+m&BKwH%gvq<#aSM8HVy|pM;jc z1jz+)H2;!h{f^LeV12AhQm$!kSicJ=sY{`1Ke>QyTmy!AWHrW741p*_fOZUu&N&5# zuHbI16DgCN-L>ar>Cv!@?6unjhjumoEjHEtduY=YN=I~-Z>)2z{|pQx@sO}IQPXMkL1$x_t*!otgRz!3g+q;4zx-srsqAyY5rs6vENJybClFKu&Pit|g|NHSPh-au_t-wOQj?r!}9 zF>?6HN+j~zZf%h=7=l4GU9rns=z2IF+>lR(RfsA&KelKEwU~lM*8*;|ZC9#=iva-FfzfbV$u}L3q~zs|4xuGkuVt5BapBrkk0w1?y=^NSGL8hGz&R6m1Wa*AQq-6rcMueqP0^w1z?qRq=<`rQT~WYTV& z4whP`d@y>mypXkSB57GEk`_Bjkmbzm=Us!D3m>E;9`GQUe?DRvB7(`}Rc~vvd?3;m z80(cN3DGyUXkDAAAG!#Af+ksErl6qV`v?-v#Muwpd!Nem zd~zPY6Z@8XYKQak(ZCQ_NfxE=7)ATt%^bzWXTh(zpp+$QMgXj_G+2JzJ*96>;B$-h z{P(o@$^(SeDh2G^FooV-c&-I?T;~nsC`;>_Yih5ba z}8(08kFL0?yDGy$&OGXHFJ6ApSDeH$Br zJx){bFB~NGcQl<$S53PwdL)lC<`-uYtNq>Ub}3v?KfU%|5Gn>+b)+Yty}RvHrZ$iQ z1i|_&!r7b7w<=z_C=3YNnS5ImqZ^nnpcw z0WA^7J-yaqJI^fM=y?3WlgTY}qf3W`U|)cwZprt5>x=%)pL2h8nbC3_{RiR&a(Qy| zkB$Z&tyCW(n5wYaaktd@i_FK&+Ll~PmC8SeScA}?QvDB!yX_?d8_j{HMEeSF>+ z80L7h{b|UJOdjrAaW>p_b;$%LlGVmkPnQcb=qW9zPWggSfh0mF~g?qE~?02Uu zujC>NX9W#h+uhxWgVXSjZ8UxmYLVKF;gFKh7+XU@gZl<1d&3a#%uju4oNNs7`Quv8 ziplCc|CE2IBbIty5r+%DKgbmz{4ZPTMP^p&m*r}-G zFf!vH7&Q(IR_nD=TJ%Ukxbe(zjOSUGy?*s`s;!le_}?^GMW5h#ulca7P5HM7_Z^%>Jkmj~|b&n(YRqFFT`@uf8^A7~7Mu30CQ4$9}KThzK7isX) zgox3GN{fkyM5(`mf0mN!2TT8z` z+3}GWIX%IvAiS7tLZ3QT$d2g?Du>)&{M*GRx(Mv32qMMFpv_#D_yc9fwriw4OTQbn z?Dm%-d(VWW@*fB@Yz#D|hx4eJu0XRewQ-Szc$xe@IMLo@T)e}tzTU7mv(|=-={LfrE{cuqO$7rj*Cj8whe7K|NGsd$YY{W=4-V6cH(D`1YoJ#)#sI zT6DMf8aEKy=52JsV^4=G^ZA#1ZiUz0xsjEnRBZfCC-+V@*7pLT6-sp=LoI=kvMKzy z*SC-TT&_8D&VqI`vHHt9YZo=}gqluSD?FTq&~HhQw+>*d*Pq>9aA0UPt%bjuM@+VT z$$1g$dx}KQ>`trb;SdW;3zB+c0>K%7JSQv_P>;ApH8L1irorD&-G9ud@tK(0ud8~d z-PV!~{t{E&Dvg@XIlSA^c#71ig(f{)Ia{M7-Wg_)VknaM$aS#4e#Jitn%jDWCNYXS z8$2-nRqmdd1gpIU$FJknSG481cV}Kp>@9H`p0dg%lqn%oB&14TxcXB=wU62AVAJfK zW?p~{9iQ#h>V50N6_=R{$^~UCn~X8Ui350ZqrU6T`_XT2j9rcA4N}yZtod)ti9;lw z@9z#S1(&>eo;PJ>Gp4kyC%<*01uZ{3Ak>g!vHs?aJN%gjRf&|?(KJZo52DPf1y^kb zZxgSE1S(y!w8$ATixcyC1Mg^0IqBd2ut!##-bHPH^NX5+mrdSIl){Ff3$eGpwpLNr z-@#QC$OR0xt$8K*S8VNQmhFfXulJlp%P>*5BYEWL?FM$ezL{1zIXaqDzcx#H-;NS9 zV>YA);oqA{yKYX;)_l9SWq2-IWVGf1I9`^nDUiEYDbe(oNGPGw99^^8%eOpT5hs@a=ZM^}=K20I6FBj07!ehS zZs!ZkR)!r4UNm)gPZ{Yf@Vp2dC~tk`()kC{uTuKQd)wy!#`FIxw*No;8|DXgY+}1~ z&zcqa#$Cg-*aE(1MR56FUppBPKB{dyI7+W*&$}cP@Zy!<*be#3TIpu;J+r_!pzgL= zqBLoG7KtvbE#A0pH^YgVuu7OVwD_S3pCST?%R`x#A7YEwqVd<;Gy~7#@Rhj}TXjb6(;jg| z@%_^+H=0j`hSc+d;>HQJHi6rq@uLPd@GofmteqFOy8akQcV}1K0_A8{!iURj#D5@4 zr_#^>RsBiA#(^e|jT&V7bNl_hPs7_Yc56hRd5EIFVIj{&@d$`b=JlU}{VIH(p^vLe zeo4>el>vmp$6w^ITY|x{B(@dyXK2y3i_pk6Vf7)B1%uryRGoX^-vk zdOJkQTirWt2`mZcd!ZDv%5U#&N}F;U0OtjAd|2^X@sf#jiSfnjBc(4`H?Dp#IljGo z4Ey^!tH{AA0N28VfrSsSx7KA2!C`sl?uQ2Fo6a=z*KL;O*ymsVQd5}1EWdd{4&w$W z-P1@w>@F1RhVT9;1scvO4CCkoxGOihFjGS9q63wr!S-A0&1{X;qX-om+(WO!OrSF& zBxNZ5yX)qF$$+qXYX;Dcnp01KWCH}aQy9DyIPHD}oYxno>V*|V;|lX7sEK$TvCo1% zw&aqG5QO(5{%aNPk@x0!p6cXkpX7Tsx3eDuE+tR0bq`o~u1cZfb4E{BFJz|VuI2LP zBXT?RB9G(tqm1-jE-gWU5wZ)rw`NXjJgL4t6jtfZ@Tp}0j~-)L@E$GcQg@yoM7x0g zrQNYb3-Mw4ha$*GAvzwWs4bF z0oh|{sv??}qf}2%s&m@H{Md z!Wx-)Jaop9c88ptjD4!!utV3kOP}t!m)2J{})U-I}y^FADs~=PJ z!94h5nrQlR+|xa2!AbZ~1$QBfD5Q&;Sh&oPCUHOAuC(bBH!^D(S&Su&FEIDW3r`B% z4o#qeK|quSAPdi6(UaBSNGqybrFal*pQ>Zok$PmA>IxVAlI6#tkG3409M9iOX7P|J z*vg@~|F>5yF;gi2tvgWY1nzs#`!2`Y+*IQ8PY*4Ggbo)hJB?5v7k3un%VhhM>b`1qXoF)6Zov{Cg$Li`=l+pcjHsZK*}ew9$(V;Dq(aY@_m*!$Jz*;PCG^qpB`i!$0Ka^$W>>}nmsq7iX^mW!b z>)%iieW-vRobteH7R_@84u^dgRKT(Hd8PwQssDjc<#&ln{^)W?v!Y;A3+?oa zqNZkC-|G8W93fk+7jlJ8R)4L6971)26v4LmHUw~JvIT;U5hZL)MPH#q+Llo;d$tt+?VTMZ27fOgSEI&8W*((0T(fjf7mmZ&lIRn_F zW3jfD4k$2H&lSoFV+w46tusSXc>4CiLy@9~? zM{3usx^KK&HrseR625DLR@ZJ4DN+lT!T7zTWNa z5vg)8OfDH$biMQ{e7#nJyi^EUS3LnYim3H##_NV5Uy=VuEHu_8zfcS$V5=VATs;YfMOCmY%nDS5h`ZT78%7z38|sXZJ2w2s5sL;cG( zf%gZ1v5#-B@BaPu18B*k8wTMbbWK165Chu;OecL5C@!QHh7f72^Hy9J=ha{IoWs-0 zZw)&Vvm?LF&Pu|=%J)JeLVEsIw3GD!r9K#ZBEj7@JJ0!$Gv~*T=B<*c^DI4S!}ibT z#jm)fiai?-qValA&NWa&3R9Ev&wkw0pu3Ouyq@}AtXG*4Vb;Msv;YknR-4#;!Yu`M zYcQidG_^+$rIP#)MA%@wuxRiRVw(uJR2*KlTA!tq_doo({+oNxGn5w1y-#^3aFH3} z2YLO!r-1)kv8wOixo~QkHMgAk!x8N4lno3=%+;vZS-Y|I7#crEJN(nYtFmA&PSO6J zeD&7a8UHuVWnmn4#m=w^IJdvcoWTRmhqDY|&Lk>PIv-N;$R*C^LPXeS zHH*=7Q*@1x&NCzS_v&YH&njrRV+zbUz4WLW9gArf%KAtk0;(QbQ?Dh|db**$aW8#+ zf!X+}exUV3F@)rU;N=|p@@ww)jcB+COz~fzA@8!3uRsznuN}QwOU(PtQ&I011q*Zd z&62s??Zh;2Q_~Ff6M2-njJKFp!MEnkBUqjF1~MOCd#HcmN&dJSGg7ro*1O8+@+Fqz z#wQDuz#k%xrbq&;(TypU9%ALpSKk^=&2WTSi+@~wLnKFX+zAAv+sKdJAW2Z6p5~6P zRVUYX4sx@mZF{L7cvCL_1Ca`-c+14G(zhsu9z2&H6#;it$fd@UxjTSh9m)3|=u<8v z-7=4Ud(oq*=>^s3;%hGZm(Si6r2~GIt*#S+DE7r!WVFSApmY^$G^9Rxi?F`GOzGj} zDlYiR1Ps&Dy~z&1iv6{2I5__lsXK3x7pMVVA>7e-8oKjJzh5~o!PvUya z9GT_Xz??Pi+X6uP!^ZRv?8~J7(q*p8S3bHChSZRnuJ=N_q#_O-Id>38n!x{w zC%yV|fjhcI`@Z6~li-k&(wmjXWeYEN-L>8I`uXNsuoP4JbEMLNG)*J5BS&Z-Rr$y! z+{GdDP=EM&;Q@G*#_!V}5hmJqzlS$PXb(bz4-BbZ_*Z#Bjtyt+^<&thAEh@Qltnk6 zKt0KYn4x@;mgE++pl%4PyoCA~YaG_7Y2suD2T1Q12m*p* zY2l@vk>~E6F!iK`qp)HYs9DeWJ4QQ0ctpcO2;dt{cE3j-^#@xHL0K?4j=B+{5s?9m zsU3_M&l%f_G9?~rD$m{bi+iK0qCSQ>VKWZXL|W$X)rr*wg0m)7Z5|#M>QhpPS<=$f zw3V;;L|S^XZ6t3Fj%2qF-T-!U$4;XxVk>>{m7#3+NZ-@%_}+=Pbg*&luNyk(+8O-u zi!TY<1Y8{ZU53{m5e=tx`o*4~`@zzm8K{?xx*0rgTnkoKG7_YS_AgG^tq2MJG|k;e zmU6QhL`EpckIwO4eKfV;q3z_$**V<3Fy>%6;d#tjkNq3%6H2-*IMZ}5A zI`a4Nu!Qgs%o;WR9t02mdKXq3SNino zFS7aEJG@I8yiSP5y9+G7QF3#%%TzIr`?q|4ERT+uR5v;}&}HTyZ{Aky6Jg$b#kGU; zIsXgoRQB$|U{5kDrGVbH?Jf0l=C3pJy6X{*Q571Wq{&E>8&8E#s#R`&BSxKG4m*Y# zZIz;$mI3)N8Pkg>Uf#MSUKL;F-2G8E{abZ;!tk$<8_z`IWxesC64)l|y;QI;-%+PL zJiuLrRQTA$S&nt)47ib?DUvd$5sbHm5}TX3_vg1?a}H8Zo4-I18$5Y7_u_RT7{z(u+OZiK*`$mWV~a?4~&HpuW3rIji!{O)&RAVcYd(FMMjL zbuVoh3NYfy0xNp4t^$}kw%fElAWy{I_6{g5zdoIucK45lRO+0hpquz^!-_#TAakQm zp}@?RWTo;H{_$}v>;!e;Z}ByBAW72rz6X-PvxE)i-%Ygj;m+>1x=8< zyG@`)%O4MqZRJ3-I^U08E430Tq0r)Rl}(DCJOh4We{{*wQE)q&8wu0y!o#nUKs)uC znr8@c^0*eYcI-szPC__fkx_MUyAiG8-`z>2QM%gr><>oSMa!C$6RQb8Npz~c=$t!CWPH!DeJiQ-E+p@pRfdkyT!ns5Pi9K zE#9Jrfo~5mYcuoK+g_ocBmqTr!Z@@i$you>d zjURrQYpDMIrt(dkR&I~T4h1s-?s1Gby`s${98P&dg;oU%ZU%n*{K{uM8@Zb19U^hf zJXqGNU(z)%W%AGG1b{A|0xX>Qc?)3dLXfD&qj`d@7l#n;Tguyd201$3C6029H4WD< zN?#QFa@&wu`KHhQ$9V=vBwl)Cx1H2{EB(Ne{yiu6jNtlw@MZsvdJ<+>Jgg(sBH__) z^>|IQl5;O(rub{gt{dlcNqVkJ0bqTRgMo`izK~Ip#G^N5| zhXT{kDtd7ZC-2}Fn^4&fzZXWfjkU4f_4PA8lAX>=L<5-{?2#WlLUx1?1_>S=bXh`u z#|BTZj$?B1aA3d417%Iu(D&s|D;9>9`plCN-l*>G8ME4y@qsx72hVO^;p3;}wjqA< zpx59?nVDCi@h(!HWKr!x>IPfKls#ewvN85qtg)=Id)C!?C()PmJ*5r!iw8>>Zm-i0(vKv<-W*iEddF4*RU^hUIy^^&*kQ-zIS!GhwXAK~RSx;0hpg8~$M;(T5@Fh(u6b?*x@~JsO(z z*1TXRv);FI7SbGV`^U}aorABvqu`Rst%4(HT+MWS98$}tm}W-Op+;NRT;lV-V9+vz*t^~-9Fc8|2(A(O8O^aoYYu7X1hvEWVW9Q74`BL-;@Y;M+F`DVt+*y3RLlseO1 z&pd*v^lO4g48ei~m&3J;g@k#B(ZuA=W89~u4mWN;L$!oY9Ej7dkT<#zQwJTba@34s z^xfbp`uZ&(#nCG{&DYd9XO-T^epph^kQ+G>hF1a7H4?`WQcpA(1$8q+mM`2CEaqyU zPqVMeF>iG+*xL_8S6xJEoD>K_QR-6~7QCKQ-)rH6QQ368t=TF+RuQIr2NE zM~-Q)fC5;>QJ;ce-~c$zeTdovq9$K1@2g)Pv1m!zo_3n~+M=j>#E6Uk&P`e|glX2L zX6Gxl00-}Yi`_4nMx6%WyIz>(Y#TABB;F@Lb3Q3={mEh^7U07-gQE%P9ynEjJF$W$ zi6;s%j-zAhY&n#Rq0;%cfuoPC_3FKs;C?qgKH^%#!%iSKVU9s547Oq;7ei zs}Lb+B69d#z@cR9tgQGdCCFrGO;Hpjf%$ zW1!3K`Hae15%np-cu2q9snDwXcuZG_C!VMEogrt)uL8g{Xm7;C%!5z_g*jhtN-SwM zEyHgqD8&BTm&NG_xOnRY)KAc=fit^gPICw;jfWpLI}(3KE6=BJdB8p8jGe%N!EC>L z+1K>Km!~6)nH2*7YfcixLt#I0e@W%03hF%hJbIEduzb$&?5EkjAme_TKi)o<)yeauHAIBnEbm4e(q2^)hR>Xg$doY~y|ea;8BJKmm6RUFN5+M>uS! zwCQ1;(VA}RnTYJF=KVL+QdKZN!e|00KgPahi7S&vqX%UoMbXq~1h9xUU{G zQ@p4wZAZ36s&-^eXr^Uv=x>V_lzu)uWrfYR+m<@!#{{b{UJCV%_Psr#e&BTB&_man zn7b~$7vGOA;jPaE^v>pq2(bH+4Fz?~RV;(Ug#2!t z4Hx|t&V46VgDtJ6WbWO&$Owo~E=1>M0cpQ2`5(x(0um0^Qy`d$%h(dl_?dpAKO(w_ z-t!Y{WL%pBHSTJ(;dtPCFX@JwT3fqICdJ9lXV<>-j0t>^BF$%ve}4FH;Sv9D2lW3E z-UN+7*95JNkaZ|b^w${#c;uQd^sCLSXqTm&ot7isVV>BN(@spgFk8>o2S@oA%pVFZ zfvo@@1hHK=d>63R&Nipsv_53=$j3xfM68)5P5&h27xoriKV3aXGsVEx@UXqzz2l)# z3InyNQ=jnArx?)E3HEE<~{9=@f zx{r!YrVXL53lIlxjAq)Yc0WEj`6@#3-O=;FpOtkTOO+{I3oA$UyKn?5YzXw6a6V7I zl4cR^BgQIt)=;dsUh(MR_8@nKZac2Whfrmt`beY(F3i3D@2C#LJyUP@s9CP^8H4S$ z%>o2<4c+bylMikk>6+uDh8>&GbY^QB?ygkr%1mLbS)6_lkoxjUx!Bh&w8rQ1^oo7ewvOq`lDc!3 zhZU;R2?mq)mtC2&h4Op0za~IPD$^sl@ZByIuE~`qep6UuF{q~u2Son}w#&B>52>;u zKdeT&2vCi>K_IC%p|oX0x?!l+E;2SO>}hplSaI5i-}iz}@T5h%ywk|647R;OmcbIk zB|5C9H8C?jmJhfuHHhLWV<_pAXOBG=v$01NdjvlnllHh;m9y*ZQDmkAW%I_?6?FO_ zOv2=5Ooy}Q&()5_e5&Y?WQiJRw`ht?B2PD9o?uyMrsQbH1RVwYHzUW2h@my#kYy9_ zbH`8z^KiMv332c33p1efU0dLFplWrHj4$YhIWdnQD*C@>FDqiYxCGg* zV3eMzSs7S-*`OwnQYo6%!E?0%i%8uub_%w>)<} zA;~(OomMgi$6>I?89cOWWTO}m&^u^8I$}1atn|jgt7JskQXnmp<0wnvz)!A=*Ms*b zR(=G`DTAWI;;G;&f>3bGb51Jq(hWgOY1gCI60eW)C$Pg+{)Ie!9>u8JR{}jxH>a9a z8k;H6I7q}g0c!@ejU?gpQX1H*@CatKNR>62<1_jSZkX=il5Nw_Mo#PLC_ z+&8h4U#{Chnvaa`xQxR&0Nv6RmxvF;55~dxeyT9BIC_POSJq^UbNx;d-H>BS`)^1$ hh?V>IeOdqWn*V%f|5*e7Sp)xB1OLCQ0j7VZ{tu4`h8q9? diff --git a/img/dig-class11/examp-dig1.jpg b/img/dig-class11/examp-dig1.jpg deleted file mode 100644 index 0421ad89b9f5ba511f080d6d51adfcd783c8be6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tS}W=16jCP7AKLB{__7^D~&m>Ge90S&0^C`RKy3`|&?74il zxo@AeEk#3Mk@@RuyPQtdP7|4$u##b-dyivj^u>xguSbg7g&G=)XAge#vbEl3nzwc3 zho!710`->0vem8pdV(e5>8q${PtRkE?@jz5{7GipTKy#tgqz%>UMghR2j#wt)h}yP zoU-|?MzQ|F)vd}-QkgZUa~U+gnR36fX@BIu#jeSTtKt0Jm<6xBy#s$PkonJ`ap^wy z`j4)MPCd!#O|EU#*&364JF;8!LC`J7Qzs9w9}U{pYqKz#?>|GyrkAPhg{68P4ww4w zY8E6VJ(Mh;XV|H@{nBU7zoNU?KdtS$uyl&qmPuyE%H%X8CM4XN{LbuLXxG%uQST^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tSJW=16jCP7AKLB{__7^H#jWCghv4%iqNSylYFYuG)#@3m3Y(0ouFN~+ z*U^0Rki(qDr~5ZX+4H1-Ra*PymHVyeus07*XD@#z%68#a-KrMz;=sW0!%Kx;GN;Er zx^`*p=j(-!mVB(6GEXAl)b^a)7m|Ed7gBD`*nK?jDeF(Y4~$+H-d$h}eA=%iBD{w4W%@LS?@OEiWlUpzQkH7N9TBiV zamu%+Z@0U7z7lk)o&PRuW786z7Iu-v59Ud=uUN0PCH3O636r(>?@Bz~|1>D~R?<(d zh>2`Zg{&Wlv@X%Muyr@c)YX%pGIjsLz908bM(_389Z+Mr%Bfzqlf3@Q<@x)j aYHc+-=30E)_samPuEI-x%zX<^H4JN7p diff --git a/img/dig-class11/examp-dig11.jpg b/img/dig-class11/examp-dig11.jpg deleted file mode 100644 index 0cbf013f7fa7886b14d57e098ef56d1db1d14694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmex=wkpZ3brsHWpSkRu(okRyKBaHV!TUE-p?^E)hO{9szL?2?=o#F)=AwRe33CWf?Is z1sw%tHFZrbO-XrO16>URRSiuIkRgoh?Ce||T*6#j!WvRyQW_+K{|6WZIT(x>l$jZo z7?=bZnFSgDA7PMUU|?irWIzT$$Fg%U1LX__7#NwEnOInuIiV^TnV4A^SOwV>*@cu0 zIYb--g$p;T7@0XWPF%R@&_kdWNk#@HW)$OC*cg~unSfHtf(%TI%q)zoaJv|p7?@cM zS%nmh1Vxkr6F2_9#lQp9%p}Mx$Y9Sf=VNk+(&e=>U2DUQZaDLy4zhyvm%Uq{7s?GV=UK?;7__Qwt|W-O1Hrx_7+fxqa25X)``vUVd}BhAQvp zHR;pkmt}Ze{Z^p%Z*GE?M*5N3k=e}+@Bi5CLZGu`up&YU>ARP~5r=79j&Rkq1nH>?fM4rYvLyqDnlKIB)sWy`fK z+ix9ZQ#-b4+vBnsot4k!3e33X6g>5^{k~}TA%(-~vOC!?b=eju9XxYNPDO-WG?t}D zBBzPH{;bb0Tf?60s%H$lYdmc}Nh{m_&VB7SPr0pP$IlzJz5QPUV{IN?6bq78VcIgO zI5J#i^<>#CS4}mv{`xZXI*La`x%X(=t<67cW9Ng^_fGHvup26IQ^f2 z^AcOZ;%)bSUpd^gUTp2HNuKP}XImcM8Xh<|dQybD;lVjmljUBomS_uPiLTv!`BBbl z>lJm^MUV9bEa8z!>T+FN&lCO0^M!q|YsNa3(7I!(@j{FpHZHjxdv&)mSxLXrI^=F< zZashIignWqwC-wVt1~8iW}G##@Voz=S=T>4KHg~;U6>mfp})xLj@K!t%{ydYuJ*mT zF6VaG#Jn9UE1t7y9X$TlA#VMiImgZlJw9t1e7wP4b>iU(JMI|mJ^eILU(y+x3h|tB@4jj9X5ILSd7pC3OY^uUw<;Wqdw%`W^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tR;W=16jCP7AKLB{__7^H#jWCghv4%iqNnOImkn1PZ80t`%y zER4)d%xvrsc}6B?1{PL9MK&Qrb`i(GiNd0Zg$p++83h$JZM+E7A@^3{XU(axTnH~3VYxI@Jf1>7#+va3l`f^3% z%YJU-*PdB-kAL91y?WcuHK}jXqP1r%>#ovSWApm>E3N)zt5Ux#JEp>%n{UM6fA&V0 zyL(CPH-3?C+jE&cQjGG<9=nFr?B{ygp!%k`P5plAKHYa7H$N}15HWnU+%L7N@4P&p zs&cW&x=%WjISxKxsQmnKamQQ5rpl+CHza58-G1KGXu&+0%VN!Z$;oxIUTBx>Yz>R% zcDS^}MZiNkSDtPDlF!;#cC4?@=U$TL=6C(tkL!Qep8hRe{aW&^-ppB?6Bf7LP?5Lk z`uOsXojG&jn~x`6vRBp`PqVhGG>Mha{kA1?>!0JV{Uo{8O%_3E#EdP<*M LS{iff{{Nc*0`ec# diff --git a/img/dig-class11/examp-dig13.jpg b/img/dig-class11/examp-dig13.jpg deleted file mode 100644 index ebf9db426621c1001c5bdb0c09972cbcf619218e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tS(W=16jCP7AKLB{__7^D~&n3zGXg#%VL24)s^CZL?Y00Sd4 zGZPClJ1bO{k%^gwfmM)AQApS@kln~pRMjc5XwfF+!p4OcL54A+8^+AS$i&LP29%Q* zWME`rW?)8G1yanyDrhLASUBwbs_s7ES2;Q5pX5!~# z4*#;gW_LzzGTUwxDXHz3oVWF3`1wgwZG9<-&bt+q<;xl`Lsz{IThk>8DiJf`$ry0of1PD_;0| zss}H7s^p!!W!hY)DCgu;9Jc-|*M+Y(2s>W;^7TO#;oRMQ=ePctl`Qipg2~;=H1%k) z_rL4A8|)^@$QLf2w)ovQyIGto%dVI!-twM5adFs!+BwHBJ5G67$~Sd-Sk5y3_x}Gl zmaMv1tWdc`A*Whxa{jmHX`gnoDz{sn<>}Aa<*0h1NaWJ5y2-677hc{F+_!M_7?yE diff --git a/img/dig-class11/examp-dig2.jpg b/img/dig-class11/examp-dig2.jpg deleted file mode 100644 index 4d93862443836482f699430b61582cd15f7224e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tRqW=16jCP7AKLB{__7$g`Nm_d$30&E=YtUwt90R~29CKhHk zHfE?iBNHl*sbcdT!(Zj0ogL3u1mB;)TXBSrqn;NJ; z;_aREY0Z?0PdMd2_3{eM} zcG{a$QS((!U3Ay(fTh+-@8%Y&9Pde({9&d{Pmu6MS?S1YZ|gU{sMVhIfJ4>H^YhjS ziD!cBmZ_}9s#}Ye9Di=Glv{V|l)GAA_IpjZ!^w6^Jm6JU*`yl9qh{MO_s-Y3S6#@x zZ!_-$-5;~wm-VHnrNvK}9(^UMa$o50YgZ<(x+kw675RWO{F{jL{wkZ6)pdJM{|oK@u*_<>*Y~gj&|WnE8aYxvLIa}kokPuwL?F9PB<|)Ea^QSxbem>t_imo znoKTl3wmT{KTWx#P}SrOW3J9AsY5oCsv4h0tz3V2Rb{GalT+)IPp@;#9tCo7i9DLN zId@%%|F0~wqpDgy&!6ORztg>Y_I#zw@5^OHkK~MJPndC8CUFHv*oGs83BLOlU%3>r zu}C*)d3d}}p{7Fms(n{ie5*=b{`v8W+AS9S4|kNTRp`D`anUuNKSR#K+BS i0?8XLy9QoeJ*{E(JF8op#O)MaMT)A@9)Ifpe-i*7>^si@ diff --git a/img/dig-class11/examp-dig3.jpg b/img/dig-class11/examp-dig3.jpg deleted file mode 100644 index 09dc8cc5c54ee2ae47c549fce59b770f382ba4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tR;W=16jCP7AKLB{__7$g}On3#d?L;w~x24+?!pp>2f10ypt z6AKF~D^!+|iJ66gRgg_lNLb0xF)(o=yNFTY!KC7ai#7t)i!(Byngk32CT5_7lpruT zm_b1T2aJM>hK`BEJ7pMPoM-^n2_&wlyCyL$`&zW)rf*2j9q*jj2nx}DcDrNqK$@-^#=+bY>oSLrl0 zG`;qWXR20Lkl`wCowRMMOmJ?7oPPh8ut)8IO3ha;1>O0bQY^b&-DG~7178n510@V_B!)`^t?5Xe=O25=dKpZ@X@OAOZG8q- z{SFqIP#j~p?CpjW_T)_)w!E{L<{`Jm>3FE?k6L3N=6P&v#SMJW= diff --git a/img/dig-class11/examp-dig4.jpg b/img/dig-class11/examp-dig4.jpg deleted file mode 100644 index 74f73d3d7dce61b8cedcc31ffb46ce3325b9ed3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tSpW=16jCP7AKLB{__7^E2(n3$M>4uu1D4h9xRRyJm!q`m+H zBQrBI6Eiz2R0SgwGYbQ&ARD`)kRgY#h?tUN;lz!blueuh6N`Zw#2G;VZWNHg%)|n+ zMp2M~nSl{#E<%oxNsw8{(1=CJ*wH!g|1Aa{peukvf(-TyGH@ zF=x9lWu@x=2Zkq1if-pT)iDUR{rx0%Z>>0Y$d;3l2M?z_YVGwdyuv(*tM)3BwV>a* zd)XSde*5{(%Dv~T$$qEQrfkWgsw=C{-e%?yj^jM=ST^LtcZX8zh}aKvZhl)-D0wJG zdDh~+la-^tTYXx|(;l*c;aAx0Ls_@KO?xzH%g?>^1`D{ajU<2#N9}^JUim`+U-vlUfAR%c6Dv~0$%h;6e%qF?(N>u4So*nG~=%j%9(dQ4Tn-P-%7W<#n`A;$0Dd$?<6qUMFySaj&)qV5-EBbw9(3aYa)3N>kZvp@X ChA?6P diff --git a/img/dig-class11/examp-dig5.jpg b/img/dig-class11/examp-dig5.jpg deleted file mode 100644 index 8bcee93cbf64a0058df92a283ee3a8d880c9d85e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tSBW=16jCP7AKLB{__7$g}On3#d?L;|eLENo0bDMJAUMrLLv zCU$mKs4OEBGYbQ&Ae*9)A-k}Ml4D?@sIilCV$!6>$qNr&1ewN&ZWs`~M@LzfFLP1^co(%KKK zTH9akJZIT7&0hH5wN0UuR8Mc(sVbA2H?67o0b}^r@U>>QWiNhz`=aGi*nt~M6^cF` zP1AhbofEq=Ty*Lrv!H8pRLy=rIjI#?5x^mNLrU{#(`~_>=eGzjO_((Kmw?71!wu35 zlRrJNU6p$(I9%H~o;@R~|E<=d3w|uwH+$0+9q(LaIdN|3=FM||U0w03Kx@Z^BBx!h zGv;|6KDO(?{eVBg(VcU)l)2x|4vgtO?d2|XK;`eDu7$}v4BoBVwQ2seFw5dY$G!yE zL@bRm*d#uC{^tB|FE#UfHhE34Ie6nggUHXdj!V}Dsl@88h+5ab8wizeHw|9=wz`p@$n diff --git a/img/dig-class11/examp-dig6.jpg b/img/dig-class11/examp-dig6.jpg deleted file mode 100644 index 0f8bc7021de9c73f3e62fc160283b861a28eb474..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tS}W=16jCP7AKLB{__7^H#jWCghv4%iu(fzD+DN$LwQFfubU zGqEspLZulQn1Hf^Y(k2Lf$WZn3x!1{imDg|6*ex~^bn{)f)NbhW&s(DKn*|{NkI%L zMkYl;$N#q&c$k5v3Ni~a*fS_u-iVo5`DDe{H2=AMW-?5d{I7=GUw^GzWa6gx1*tau zlGz@5_6~cl$I0opEZ+5HKl7?{H@C9R`)a&!Ys}(#VLfjSW_}MVdHQbdnc_`Mn-+eb z{H@b==D&sK8n$10WqtSG!^-8UK5yo@N~cQRxcH(ozU#Tbn+0w(bw_5P=&ZCpA+&>%ipW$We zw&nTv+7~l?3$`^qa%_U$+An#v7j9+CZM-bC=xOw_Or>>;SC>7y{!9Ri4SNa(#6X^J$Z95g_H&_eHmU;#y?gD43R04aNr0fH@5O05HPO_GFmCx10mi z)F+Vv+HV>F-Tr|eK!I(H;JpI?U`+TwfEgP6g90J|5r7Cl1Rw$sf&WPY2gm^)l!y?V zwKpY{f;09Yhf;!Z1iTzxj)2D#2yz4!MKvYhKT|2-6$l!56%D*Hj-aHWtgJy$1^{Fl z&0o6`41XH!&m5nT{w=4$D*-@8#;?2x_G@?ZYv)48y7TowJD2~-B86TWA^;J92tWiN z0zV1-+-)e~2nremyoRDW@bB8d4oDcyk39tvJTc(~5MUd4c7n-*@%_y6VG=(y;5iE% z_SfkN<}w`qSI%(v$K;2<_uo0I0btwz?gVEHFa&7fG&D4DTJS;(27(TW0D}RIM$$1c zFflPPFfuZ;a$uNQ*jX4E*|^!*Ik8+^T+A3AJ{~MD2bK%F4Gsd^>4`wlBa!r27Dg5< z)v?_QV9-D#U{3=R0pJ)I4F(g>~Pz{T!mi?NNXcTp=7og8_7b zQ)Q)3GSkFniNPtQjw77EiMrK!>#01P?mH|V+HkrJWqSEU&y^1OMz$DW`m~c~VlYqO z>8XQqW$XQeMlEP$iX*X=xxhB((T$np={f5r?FnBu731)XaEs&~v&FQxb6tf?lve8( zHgqP#Or1}Do1=d++cyCy6(+X=5fW^2Ck8hezvz@Zzm>sG2ujDK50Bjmt}zfGu*t|A zCH4O~UeLssb`JO3=wN5;R_H@LXI~MGq3KIzm}$7#6ZRnwxyjVnb-wqs(QNw;FISjo zOG+ZHG`$%=chTTKLmwC9w6P0ldDa=K-+QTm!SMjnXReD^?6&?H>$ zE^JgEq^53`>ocOlWiosoS>brEOj(@KQ_xhDZ_vm%cMoMeQK83@rqD2h=#|R6fiLY}bw|sU zm@u{}p)k`q%Y`7*6OVK*hNr(6Z(bGI>Q6L{<}I+V6yMU&sqa%E_H&10tVJqg^mTF_ z@m`ofFQFmRwFIO7@K52Q#usoT&d_wG`J(l#__+ATXCpGt*lh!N$6g)t^0beA*}91Q z*sZp%(a3uX;={YiMIBRw)>XAs!}{v2++_8uBSyQw7ywjhK zE8_08H=Mk!J}Fp9`i{uc92<$ZIh(&^vG=j^YPezr%q@(Ra0HO(+Ny78Hq0@;iFIyOGM+QhwE##iUD-j#o>cWnb= z@T*s(s&d!$56+7(`zOgg?Lpiy{vsXJW7*YfwL}satXr2T+{*DujKgRhxb>)tdni<8 zD_bqZXyW9ds*Ei^qw0xwT>NVFp0MBVlcbXl)k@sq-0C>%GT&~B$@;Qqm+KmrUt*Q{ zz=$hqKD?yKR5rA{LjC=X+0y3014^Xcqc(i$mY5rxdYRW#t)KL|93h{!i8hJXj7Y5( z*U`_r?x<4mI~MaGWL09N&x=PAp>^9+NZmJ?aF_kLSr4OnU7Io98+hnc9IwNpe_LkZ z`Bf#J%Xe;#mQP9fi%kdcbf>Zzxpt0w)n0JFPZrIO`y;G=#;_nptVRmisErWiC|WBy zVeXLPI?BJ_z}b2T_9U@_vO8+3%8SD z#Fy<_{@EuAWBn&zIGyZM#X2Cm1-XU~bJ#oiR~?IQh>p0Xn>N&~&@Iu*huWK9#6l+< z!e?eM;2r^+lXA819(mF=U($Z02l-h)=)Pce#c_?V`8U@%RYmS~^UBIqrf|9~slBL@ zR0}|VNEO~ysyDe}^VCVxRn*J>%_U@jct?_g$p_wp5$in-;}s^Omb~0f0F!?f&qDkw z(|6NVvLlbZUfZpd!Lo{?;i|7K=h*CXYF}+my}mC_YMpSH6%}2yZ_c|k>dq;@ZmYG? zQy_?Oaqqn9W704g1Z+HG?zqfc6>~51l;a;3&E9u5++?@}tWA>HCerrWbx#`I^^Q6A z(8tFRx#n=F#~4L?P^-S~|0Yh~VH;rn)9>~t?zz+b>fnFlq);a8$h}L}_I;|4F()0#KpVf}xavrvi4dKZN!FoJift_LY2+5di;XGxz65<@2Z1$yA&QU zlcll957^t|cb?OAq%KFnp(#5-oKcZRYufbcWzScustggy{vRBUZV8aQ;^rvLFE92z zkSSkuKZ)Paq3dxtH7_LYG$N=j+MBIL^4I$G$i1v+rYzgABUC=3`1nRnh5TDTaa7mX$}|wrmU$ zr>^mb3+MZiCw3Qe>cfJn`01LG&SY9O-jH_|Xk9FIOEk|fKuam&uq<3#fBYq}W9fxpg~}Grr8ISu+`ixk*Jm8)a&3PhJoK?KK`}^N zDE7o7w%Qk;%c3?P+ENNAO`Mm!iAcelv946 zxQ@o;=7+2q6}rt;#9KWz`r;f=^C-!}BwOPAQz3%|?nIvv8I7X6#ZsLT0Y9;ciV{ti z&^gwpaUF;G{Qn@An*F)Jy+_ZOP2JPBTAf zdgnp4DE3uO}?+y*|NqhZhFza%$?>C-y6 z9#gFtKBvLKs+Z6`y>HX-qlvb)zH+od#XxRU4XOk!Hqtq>ze;DB^|wuAOTvV;J}vIj z_Q>~*-~Z=z`xRl@J2W&%glI%+i+meh1I%}tZ5PD8M^yksoV`h=`DjP?Vztd&v{j)z#(k z3i1jHvY7^*G^ z7gYqP5<}Gm;i8HFRbr^RAY4=tph^r?*MA+?FV_Ys0JLgEfS!yUGc|yuMIaHhNF)M@ zLLt%gtn~DBbo3m|ER3vN9NgSo99S%`fS3?3pC~^Ti<7~L?iQDnlH?JR#mh?I#Uvyp zzB#f{C=@-Ko}HeaU4j?OD?xR9cVsI7-2ZT7^MQu+9Y6Hn0*Qj5LB}*`mzDwj*l+}B zB&XSNuI~ismIlC=!Jya(Xm)+!{Ry1u4O}9`;u28J{mpm%UHAR^O$|N~#O#=^|1k>; zG*}CZ=+m-s{L^q<((Fhm{C$xv1^Fy)ruj`}U&{!Kr1QjBvyTm(xDY0G>!@=dr^;-n z0zZEuA8oAO)!yz1Gv1r!4d|w@2-A^kb;V8<_Rm#X!(^*&vBKJKwlNn@)^l^(ZzSYawkuAN^{jnubyej`cRBxf_XS&Tn|;ORy56F%2tLbgRyiuO z1J;EG4(*F_E#rP@DeDahV=?PeM4!d-MLxx zGwHoap1)hqnP#=+Mftco+hn}vII6y9mHX83f_USqkjMMFq^zoLa$rZtNHdo=7J0MK z3zl@K$C@cE3inliW1k>3m(_2q2bbZ>@>p4W5r(v7qWO{C<8ee*02y^$>a-K%;_jeN UJZr~Al3WsA8n7O<0)0^b0>SdP%>V!Z diff --git a/img/dig-class11/examp-dig8.jpg b/img/dig-class11/examp-dig8.jpg deleted file mode 100644 index 10ab543b2eae5e6e1ca95c0693f57ebd735b02a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 820 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 H|8D{SeFe

^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tSJW=16jCP7AKLB{__7^H#jWCghv4mcQqu4QLp21@D)FfcN+ zFfg;RvO=X9nSgv&HbHhpLm?5Rz{ElhVP(gOMotSiUIeNaX9NMbNk9e@Gb01Y7C{DP z24)l~MkYZ;LnER8w-|VUYM2C>1sUua?tkW)q-K~__SkY#@`feN>o=;0#vZAd&aAi7 zUg)x@>$3nE)pId>wc@)97Wq8<`g7;4pPD_(%PK1_pQ$&IjgZ;RX}$6Lk<&U%i)B75 zpT4!J>SWDRmUpQ~Pgv}|`9nDOb@Z8r8ui+&m)U!*i?=$@J5xXH&a}gwUi}6dntQEn zjpv0vIQ@RPS9pa~ps#r0`j3eT*Q|Ra-tLurHlc-S-8|X(ujXu-Xf=o5;-F+vMfL=< z8>&u*@sH;w#Pe)QK7QuP^m$H94{Hq`GOGNN(s*wWShV#_)62_6vx2?sTC!SSUuP-W zVJ_*h$>jFM+seCk&GgK5sg&0eemTwGd44DR+R2-Dd)GeY^vL&LyFm2xiEC%u9$#B- zpzXWws^QJDYe6EHmwzv^f14B*$C>&$?}Yf5W1akQ=0~>ddHy)W>(&C74UvxyG~J5o zIm9Hu?l(6xbMoFveQV5aO<5!~<#V9A1HaY6ls(}`*QBTx`)tj3HMCpkd2fqr;c@F- zYhz4z@0N2&{Hm(q_$qYsg{<~{QjY{bYYNS(`k=5#fic}ZOQq`Tn(3C6QWF}FTI}pi zneKA?k!0Z0ohLaaTupm3AaK-M6dA0 zU5R=;(}dmdc1Y)Swt&wU1D3XGyx+R6^gMrK=A=hDmBO*P-=s=6uIIWSV$U|qJin!N zQb*w>ugVFR+;88Ssx|4grk#5mi+R$TokCXUyJyX2fBQD>j8m7Shu{o`5_z4VrJe;M I_5W`I0K5u9e*gdg diff --git a/img/dig-cont/dig-cont_3b.jpg b/img/dig-cont/dig-cont_3b.jpg deleted file mode 100644 index 5b85e73b2dab515a86ea8bd5467bec0db358a3ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tSJW=16jCP7AKLB{__7^H!YWMT$67Y5iFIGC7$E(S^(2{14+ zGcz->Ftf8lq#2o*Sr}La+1Q1I6-AT`9XXT>MU9*SgC;IaY&>}JAyAJvBM86@1JOX^ z89+7(0);_rH~?}56@iBQzs0}<6lW4-7G$tz*d)AUnMt`!kTmbMNn4BFaQu0(FYjmO zk4fB~srdqlwS{5luJD+X%7~r+{Sk}c%ch=|b5%;IftBqJu@X7Mf#{Q~=EKAM2J3l_m zzy14_o~F~{j?>|@FHd+k|GB8om#6Dq7EPPBCfDxCzIG+aK(3=PvG;pcO6S*PYHF$W zJO1U%kbZc~+rYHnvfEoDMESE=0h>nRsp~%_V{(h%exLRz?pB%h`4yU8Qx+AlMz3Ca zR43ziNUzy%JBcaVrZP@EqI~;zm-LUGI@#OdQMX%OduwETo#Q@-`R%!H;1`?lSAwtlTjtlqY>>RCN1Yqv#c@hS)(5n}(d&f5EZ+?0K%eNrv{n9qp{XgQJ7 zGpWG((YCxNZeK;G=|luS+Olk^=<1nYKTZ6XsXIOGPnpcL1&?)CB!5(qI;Xqt{-he7 zn8()_&Hoy-)c2d&e}+wOAEY>TPjF;kH1F=esqO9QOXg3yU;N9}YwFqU|8D{SE1^wO diff --git a/img/dig-cont/dig-cont_3c.jpg b/img/dig-cont/dig-cont_3c.jpg deleted file mode 100644 index b00eed080d847ad81106de7b3eacdb559bc54de3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-11|tSJW=16jCP7AKLB{__7^E2(n3$M>4uu0Yb_Nb+7FH&pq_F@4 zBQrA-GYdN>RGJaUVPF+x6Jl316j5>v{TTv^4)DWqufMxZ8fMi77-2V^iY zGBW@rBn81T$Wn|RTAw9m)AbtoHS=n-&se)~1Pgq& zyBg{EOk6XI{ef@lBfX{B9+~Cux}3zmJ-F-`%e89f`p#eXo`gLX5}C3v=F(~FLp6;n zjrA`?o}4=?na^Owr&-#TC!b```a4bT;q>&9o9v@mW1ShnVs6MCzN>w&REkU5`I@)+&bd!L zJ-uQhSd>NXJd&H~xB8OsT31)@QpsG0l7N??Y3^L6oB3_}6ZSngcj-;Jfp}lLh;7i* zv`3eF^}9abXb;7U!T|IeuOH|fjfZJPAQTkC$$&xD1sPv^y~(0$N9N zJNgA&DiHBC)Vnsryh5wf&Pu*-{iTI-s`sqmyvLRCJ+=LQx9ZU+55)bh{L$FTc{laN z*|3&)6}PkJvM$|$@kycIY~$3`F=f;j`R{^C~57Y`^Vw zrKjYevQoDL^NHZbbdS4wJiEe)yve-i*-8YWr* diff --git a/img/enable_log_image.jpg b/img/enable_log_image.jpg deleted file mode 100644 index 1c08e99cf0432c9ad405c174e9cb9255f2c928f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46887 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 BzRmyu diff --git a/img/progammer_manual.jpg b/img/progammer_manual.jpg deleted file mode 100644 index 998e2eb4ee23b733a8a8288d6f432841463f1c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85793 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 Sre|a0uI<%%d}AIZ`1o&%9_o+) diff --git a/img/wb_okay.jpg b/img/wb_okay.jpg deleted file mode 100644 index f5991bd0fbff67c5a61de48b938589027e6a2771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4244 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 PaVEaBUISrXFk|FjSjlQf diff --git a/index.html b/index.html new file mode 100644 index 0000000..0d9ebca --- /dev/null +++ b/index.html @@ -0,0 +1,135 @@ + + + + + + + + AI on the Edge Device + + + + + + + + + + + + + + +

+ +
+ + + + GitHub + + + + + +
+ + + + + + + + + + diff --git a/nav.yml b/nav.yml index 5fbbd7d..c6f7b0d 100644 --- a/nav.yml +++ b/nav.yml @@ -3,7 +3,7 @@ nav: # List all files in the expected order - - Home.md + - index.md - Links: - Web Installer/Console: https://jomjol.github.io/AI-on-the-edge-device/index.html diff --git a/search.html b/search.html index 7582b1b..ee1a757 100644 --- a/search.html +++ b/search.html @@ -34,7 +34,7 @@ diff --git a/search/search_index.json b/search/search_index.json index b8b35dc..89adf9e 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"AI-on-the-edge/","text":"Welcome to the AI-on-the-edge-device wiki! Artifical inteligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerfull processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usally called edge compution . Here this edge computing is brough into a practical example, where a AI network is implemented on a ESP32 device so: AI on the edge . Have fun in studying the new posibilities and ideas This is about image recognition and digitalization, done totally on a cheap ESP32 board using artifical intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI idenficiation) all the way down to the image recognition (CNN structure) and result plausiblisation is done on a cheap 10 EUR device. This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options. The task to be demonstrated here is an automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading. There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitize the analog pointers for the sub digit readings. This project is a evolution of the water-meter-system-complete , which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 4MB of SDRAM and a SD-Card as data storage. This systems implements several functions: (water) meter readout - it can handle also dual meters with two or even more readings picture provider fileserver OTA functionality web server The details can be found here: [[Integrated Functions]]","title":"Welcome to the AI-on-the-edge-device wiki!"},{"location":"AI-on-the-edge/#welcome-to-the-ai-on-the-edge-device-wiki","text":"Artifical inteligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerfull processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usally called edge compution . Here this edge computing is brough into a practical example, where a AI network is implemented on a ESP32 device so: AI on the edge . Have fun in studying the new posibilities and ideas This is about image recognition and digitalization, done totally on a cheap ESP32 board using artifical intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI idenficiation) all the way down to the image recognition (CNN structure) and result plausiblisation is done on a cheap 10 EUR device. This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options. The task to be demonstrated here is an automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading. There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitize the analog pointers for the sub digit readings. This project is a evolution of the water-meter-system-complete , which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 4MB of SDRAM and a SD-Card as data storage. This systems implements several functions: (water) meter readout - it can handle also dual meters with two or even more readings picture provider fileserver OTA functionality web server The details can be found here: [[Integrated Functions]]","title":"Welcome to the AI-on-the-edge-device wiki!"},{"location":"Addditional-Information/","text":"The following links point to additional information in other repos: Digits Overview Background Analog Overview Background","title":"Addditional Information"},{"location":"Addditional-Information/#digits","text":"Overview Background","title":"Digits"},{"location":"Addditional-Information/#analog","text":"Overview Background","title":"Analog"},{"location":"Best-Practice/","text":"This page shows some best practices. Camera Placement Move the Camera as close as possible(~4cm), this will help get rid of reflections. -> focus can be adjusted by turning the outer black ring of the camera. If the LED reflections are too strong, put tape over the LED to defuse the light Change the ImageSize to QVGA under \"Expert mode\" configuration when close enough, this will be faster and is often good enough for digital recognition. Reflections Try to get ride of the reflections by rotating the camera, so that the reflections are at positions, where no number is. By using the external LED option, you can place WS2812 LEDs freely away from the main axis. Users report, that a handy cover foil could also help Post-processing Filter out the Number \"9\", as \"3\" will often be misread for a \"9\" and void every number between 3 and 9 due to it being negative flow. Split the readings into two, while the decimal numbers might move to fast to be recognized, at least the slower moving part will produce a correct reading. -> keep in mind that the offset needs to be adjusted, a.e if you have a comma reading of \"3\", it needs to become \"0.3\". This can be done wherever the data ends up being sent, like home assistant using sensor templates. If you are using a low resolution and only digital mode, processing can often be done in <1 minute. Check the logs to confirm how fast it is and then set the interval accordingly under \"Expert mode\" in configuration, as the normal mode will lock you to 3+ minutes. [ ] Todo condense from various discussions, eg. ~~https://github.com/jomjol/AI-on-the-edge-device/issues/765~~ and https://github.com/jomjol/AI-on-the-edge-device/discussions/984 [ ] Todo add images and more in-depth explanation","title":"Best Practice"},{"location":"Best-Practice/#camera-placement","text":"Move the Camera as close as possible(~4cm), this will help get rid of reflections. -> focus can be adjusted by turning the outer black ring of the camera. If the LED reflections are too strong, put tape over the LED to defuse the light Change the ImageSize to QVGA under \"Expert mode\" configuration when close enough, this will be faster and is often good enough for digital recognition.","title":"Camera Placement"},{"location":"Best-Practice/#reflections","text":"Try to get ride of the reflections by rotating the camera, so that the reflections are at positions, where no number is. By using the external LED option, you can place WS2812 LEDs freely away from the main axis. Users report, that a handy cover foil could also help","title":"Reflections"},{"location":"Best-Practice/#post-processing","text":"Filter out the Number \"9\", as \"3\" will often be misread for a \"9\" and void every number between 3 and 9 due to it being negative flow. Split the readings into two, while the decimal numbers might move to fast to be recognized, at least the slower moving part will produce a correct reading. -> keep in mind that the offset needs to be adjusted, a.e if you have a comma reading of \"3\", it needs to become \"0.3\". This can be done wherever the data ends up being sent, like home assistant using sensor templates. If you are using a low resolution and only digital mode, processing can often be done in <1 minute. Check the logs to confirm how fast it is and then set the interval accordingly under \"Expert mode\" in configuration, as the normal mode will lock you to 3+ minutes. [ ] Todo condense from various discussions, eg. ~~https://github.com/jomjol/AI-on-the-edge-device/issues/765~~ and https://github.com/jomjol/AI-on-the-edge-device/discussions/984 [ ] Todo add images and more in-depth explanation","title":"Post-processing"},{"location":"Build-Instructions/","text":"New See README.md Old Build the project yourself Download and install VS Code https://code.visualstudio.com/Download Install the VS Code platform io plugin Check for error messages, maybe you need to manually add some python libraries e.g. in my Ubuntu a python3-env was missing: sudo apt-get install python3-venv git clone this project in Linux: git clone https://github.com/jomjol/AI-on-the-edge-device.git in VS code, open the AI-on-the-edge-device/code from terminal: cd AI-on-the-edge-device/code && code . open a pio terminal (click on the terminal sign in the bottom menu bar) make sure you are in the code directory To build, type platformio run --environment esp32cam or use the graphical interface: the build artifacts are stored in code/.pio/build/esp32cam/ Connect the device and type pio device monitor . There you will see your device and can copy the name to the next instruction Add upload_port = you_device_port to the platformio.ini file make sure an sd card with the contents of the sd_card folder is inserted and you have changed the wifi details pio run --target erase to erase the flash pio run --target upload this will upload the bootloader.bin, partitions.bin,firmware.bin from the code/.pio/build/esp32cam/ folder. pio device monitor to observe the logs via uart","title":"New"},{"location":"Build-Instructions/#new","text":"See README.md","title":"New"},{"location":"Build-Instructions/#old","text":"","title":"Old"},{"location":"Build-Instructions/#build-the-project-yourself","text":"Download and install VS Code https://code.visualstudio.com/Download Install the VS Code platform io plugin Check for error messages, maybe you need to manually add some python libraries e.g. in my Ubuntu a python3-env was missing: sudo apt-get install python3-venv git clone this project in Linux: git clone https://github.com/jomjol/AI-on-the-edge-device.git in VS code, open the AI-on-the-edge-device/code from terminal: cd AI-on-the-edge-device/code && code . open a pio terminal (click on the terminal sign in the bottom menu bar) make sure you are in the code directory To build, type platformio run --environment esp32cam or use the graphical interface: the build artifacts are stored in code/.pio/build/esp32cam/ Connect the device and type pio device monitor . There you will see your device and can copy the name to the next instruction Add upload_port = you_device_port to the platformio.ini file make sure an sd card with the contents of the sd_card folder is inserted and you have changed the wifi details pio run --target erase to erase the flash pio run --target upload this will upload the bootloader.bin, partitions.bin,firmware.bin from the code/.pio/build/esp32cam/ folder. pio device monitor to observe the logs via uart","title":"Build the project yourself"},{"location":"Choosing-the-Model/","text":"Which model should I use? In the Graphical Configuration Page , you can choose different models depending on your needs. This wiki page tries to help you on which model to select. For more technical/deeper explanations have a look on Neural-Network-Types . Digit Models For digits on water meters, gas-meters or power meters you can select between two main types of models. dig-class11 This model can recognize full digits. All intermediate states shown a \"N\" for not a number. But in post process it uses older values to fill up the \"N\" values if possible. Main features well suited for LCD digits with the ExtendedResolution option is not supported. (Only in conjunction with ana-class100 / ana-cont) dig-class100 / dig-cont These models are used to get a continuous reading with intermediate states. To see what the models are doing, you can go to the Recognition page. Main features suitable for all digit displays. Advantage over dig-class11 that results continue to be calculated in the transition between digits. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of digit images used for the training dig-class100 vs. dig-cont The difference is in the internal processing. Take the one that gives you the best results. Analog pointer models ana-class100 / ana-cont For pointers on water meters use the analog models. You can only choose between ana-class100 and ana-cont. Both do mainly the same. Main features for all analogue pointers, especially for water meters. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of pointer images used for the training ana-class100 vs. ana-cont The difference is in the internal processing. Take the one that gives you the best results. Both models learn from the same data.","title":"Which model should I use?"},{"location":"Choosing-the-Model/#which-model-should-i-use","text":"In the Graphical Configuration Page , you can choose different models depending on your needs. This wiki page tries to help you on which model to select. For more technical/deeper explanations have a look on Neural-Network-Types .","title":"Which model should I use?"},{"location":"Choosing-the-Model/#digit-models","text":"For digits on water meters, gas-meters or power meters you can select between two main types of models.","title":"Digit Models"},{"location":"Choosing-the-Model/#dig-class11","text":"This model can recognize full digits. All intermediate states shown a \"N\" for not a number. But in post process it uses older values to fill up the \"N\" values if possible.","title":"dig-class11"},{"location":"Choosing-the-Model/#main-features","text":"well suited for LCD digits with the ExtendedResolution option is not supported. (Only in conjunction with ana-class100 / ana-cont)","title":"Main features"},{"location":"Choosing-the-Model/#dig-class100-dig-cont","text":"These models are used to get a continuous reading with intermediate states. To see what the models are doing, you can go to the Recognition page.","title":"dig-class100 / dig-cont"},{"location":"Choosing-the-Model/#main-features_1","text":"suitable for all digit displays. Advantage over dig-class11 that results continue to be calculated in the transition between digits. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of digit images used for the training","title":"Main features"},{"location":"Choosing-the-Model/#dig-class100-vs-dig-cont","text":"The difference is in the internal processing. Take the one that gives you the best results.","title":"dig-class100 vs. dig-cont"},{"location":"Choosing-the-Model/#analog-pointer-models","text":"","title":"Analog pointer models"},{"location":"Choosing-the-Model/#ana-class100-ana-cont","text":"For pointers on water meters use the analog models. You can only choose between ana-class100 and ana-cont. Both do mainly the same.","title":"ana-class100 / ana-cont"},{"location":"Choosing-the-Model/#main-features_2","text":"for all analogue pointers, especially for water meters. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of pointer images used for the training","title":"Main features"},{"location":"Choosing-the-Model/#ana-class100-vs-ana-cont","text":"The difference is in the internal processing. Take the one that gives you the best results. Both models learn from the same data.","title":"ana-class100 vs. ana-cont"},{"location":"Configuration-Parameter-Details/","text":"Configuration Parameter Details [MakeImage] [MakeImage] LogImageLocation = /log/source WaitBeforeTakingPicture = 5 LogfileRetentionInDays = 15 Brightness = -2 ;Contrast = 0 ;Saturation = 0 ImageQuality = 5 ImageSize = VGA FixedExposure = true Parameter Meaning Options/Examples LogImageLocation location for storing a copy of the image WaitBeforeTakingPicture waiting time between switch on the flash-light and taking the image in seconds LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever Brightness Adjustment of the camera brightness (-2 ... 2) Contrast NOT IMPLEMENTED Saturation NOT IMPLEMENTED ImageQuality Input image jpg-compression quality 0 (best) to 100 (lowest) 5 = default ImageSize Input Image Size from Camera only VGA, QVGA FixedExposure If enabled, the exposure settings are fixed at the beginning and the waiting time after switching on the illumination will be skipped [Alignment] [Alignment] InitialRotate = 179 InitialMirror = false SearchFieldX = 20 SearchFieldY = 20 AlignmentAlgo = Default FlipImageSize = false /config/ref0.jpg 104 271 /config/ref1.jpg 442 142 Parameter Meaning Options/Examples InitialMirror Option for initially mirroring the image on the original x-axis InitialRotate Initial rotation of image before alignment in degree (1...359) FlipImageSize Changes the aspect ratio after the image rotation to avoid cropping of the rotated imaged /config/refx.jpg 98, 257 Link to reference image and corresponding target coordinates file link is relative to sd-card root SearchFieldX/Y Search field size in X/Y for finding the reference images [pixel] Here two reference images are needed. Therefore rotation and shifting can be compensated. As the alignment is one of the most computing time using part, the search field needs to be limited. The calculation time goes quadratic with the search field size. [Digits] [Digits] Model=/config/digits.tfl ModelInputSize 20, 32 LogImageLocation = /log/digit LogfileRetentionInDays = 2 number1.digit1 292 120 37 67 number1.digit2 340 120 37 67 number1.digit3 389 120 37 67 number2.digit1 292 180 37 67 number2.digit2 340 180 37 67 Parameter Meaning Options/Examples Model Link to the CNN-tflite file used for AI-image recognition ModelInputSize Image input size for the CNN-Network [pixel] needed to resize the ROI to the input size LogImageLocation storage location for the recognized images, including the CNN-results in the file name/location numberX.digitY ROI for the corresponding digit in the aligned image. More than one number can be specified. Therefore the name consists of a naming of the number ( numberX ) and the region of interest ( digitY ) - separated by . LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever LogImageLocation location for storing a copy of the image [Analog] [Analog] Model=/config/analog.tfl ModelInputSize 32, 32 LogImageLocation = /log/analog LogfileRetentionInDays = 2 number1.analog1, 433, 207, 99, 99 number1.analog2, 378, 313, 99, 99 number1.analog3, 280, 356, 99, 99 number1.analog4, 149, 313, 99, 99 number2.analog1, 280, 456, 99, 99 number2.analog2, 149, 413, 99, 99 Same as for [digit], here only for the analog pointers [PostProcessing] [PostProcessing] number1.DecimalShift = 0 number2.DecimalShift = -1 PreValueUse = true PreValueAgeStartup = 720 AllowNegativeRates = false number1.MaxRateValue = 0.1 number2.MaxRateValue = 0.1 ErrorMessage = true CheckDigitIncreaseConsistency = false Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples PreValueUse Use the previous value for consistency check and substitution for NaN (True / False) PreValueAgeStartup Max age of PreValue after a reboot (downtime) AllowNegativeRates Allow decrease of the readout value numberX.MaxRateValue Maximum chance rate from one to the next readout. This can be specified for each number individual. ErrorMessage Show error messages numberX.DecimalShift Shifting of the decimal separator from the default position between digital and analog. This can be specified for each number individual. DecimalShift = 2: 123.456 --> 12345.6 DecimalShift = -1: 123.456 --> 12.3456 CheckDigitIncreaseConsistency This parameter controls, if the digits are checked for a consistent change in comparison to the previous value. This only makes sense, if the last digit is changing very slowly and every single digit is visible (e.g. 4.7 --> 4.8 --> 4.9 --> 5.0 --> 5.1). If single digits are skipped, for example because the digits changes to fast, this should be disabled (e.g. 4.7 --> 5.0 --> 5.1). [MQTT] [MQTT] Uri = mqtt://IP-ADRESS:1883 MainTopic = wasserzaehler ClientID = wasser user = USERNAME password = PASSWORD Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples Uri URI to the MQTT broker including port e.g.: mqtt://IP-Address:Port MainTopic MQTT main topic, under which the counters are published. The single value will be published with the following key: MainTopic/number/PARAMETER where parameters are: value, rate, timestamp, error and json The general connection status can be found in MainTopic/connection ClientID ClientID to connect to the MQTT broker user user for MQTT authentication (optional) password password for MQTT authentication (optional) [AutoTimer] [AutoTimer] AutoStart= true Intervall = 4.85 This paragraph is used to automatically trigger the periodic automated readout. Parameter Meaning Options/Examples AutoStart Automatically trigger the readout after startup Intervall Readout interval in minutes Values smaller than 2 minutes do not make sense, as this is the time for one detection [Debug] [Debug] Logfile = true LogfileRetentionInDays = 2 This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples Logfile Turn on (true) or off (false) the extended logging parameter and section optional LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever [System] [System] TimeZone = CET-1CEST,M3.5.0,M10.5.0/3 ;TimeServer = TIMESERVER ;Hostname = undefined SetupMode = false This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples TimeZone TimeZone of the system can be specified Central european, with summertime adjustement: CET-1CEST,M3.5.0,M10.5.0/3 TimeServer An dedicated time server can be specified. default = pool.ntp.org Hostname Additionally to the wlan.ini the hostname can be specified. It will be transferred to the wlan.ini and initiate a reboot SetupMode If enabled, the server starts in an initial setup mode. This is automatically disabled at the end of the setup [Ende] No function, just to mark, that the config is done!","title":"Configuration Parameter Details"},{"location":"Configuration-Parameter-Details/#configuration-parameter-details","text":"","title":"Configuration Parameter Details"},{"location":"Configuration-Parameter-Details/#makeimage","text":"[MakeImage] LogImageLocation = /log/source WaitBeforeTakingPicture = 5 LogfileRetentionInDays = 15 Brightness = -2 ;Contrast = 0 ;Saturation = 0 ImageQuality = 5 ImageSize = VGA FixedExposure = true Parameter Meaning Options/Examples LogImageLocation location for storing a copy of the image WaitBeforeTakingPicture waiting time between switch on the flash-light and taking the image in seconds LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever Brightness Adjustment of the camera brightness (-2 ... 2) Contrast NOT IMPLEMENTED Saturation NOT IMPLEMENTED ImageQuality Input image jpg-compression quality 0 (best) to 100 (lowest) 5 = default ImageSize Input Image Size from Camera only VGA, QVGA FixedExposure If enabled, the exposure settings are fixed at the beginning and the waiting time after switching on the illumination will be skipped","title":"[MakeImage]"},{"location":"Configuration-Parameter-Details/#alignment","text":"[Alignment] InitialRotate = 179 InitialMirror = false SearchFieldX = 20 SearchFieldY = 20 AlignmentAlgo = Default FlipImageSize = false /config/ref0.jpg 104 271 /config/ref1.jpg 442 142 Parameter Meaning Options/Examples InitialMirror Option for initially mirroring the image on the original x-axis InitialRotate Initial rotation of image before alignment in degree (1...359) FlipImageSize Changes the aspect ratio after the image rotation to avoid cropping of the rotated imaged /config/refx.jpg 98, 257 Link to reference image and corresponding target coordinates file link is relative to sd-card root SearchFieldX/Y Search field size in X/Y for finding the reference images [pixel] Here two reference images are needed. Therefore rotation and shifting can be compensated. As the alignment is one of the most computing time using part, the search field needs to be limited. The calculation time goes quadratic with the search field size.","title":"[Alignment]"},{"location":"Configuration-Parameter-Details/#digits","text":"[Digits] Model=/config/digits.tfl ModelInputSize 20, 32 LogImageLocation = /log/digit LogfileRetentionInDays = 2 number1.digit1 292 120 37 67 number1.digit2 340 120 37 67 number1.digit3 389 120 37 67 number2.digit1 292 180 37 67 number2.digit2 340 180 37 67 Parameter Meaning Options/Examples Model Link to the CNN-tflite file used for AI-image recognition ModelInputSize Image input size for the CNN-Network [pixel] needed to resize the ROI to the input size LogImageLocation storage location for the recognized images, including the CNN-results in the file name/location numberX.digitY ROI for the corresponding digit in the aligned image. More than one number can be specified. Therefore the name consists of a naming of the number ( numberX ) and the region of interest ( digitY ) - separated by . LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever LogImageLocation location for storing a copy of the image","title":"[Digits]"},{"location":"Configuration-Parameter-Details/#analog","text":"[Analog] Model=/config/analog.tfl ModelInputSize 32, 32 LogImageLocation = /log/analog LogfileRetentionInDays = 2 number1.analog1, 433, 207, 99, 99 number1.analog2, 378, 313, 99, 99 number1.analog3, 280, 356, 99, 99 number1.analog4, 149, 313, 99, 99 number2.analog1, 280, 456, 99, 99 number2.analog2, 149, 413, 99, 99 Same as for [digit], here only for the analog pointers","title":"[Analog]"},{"location":"Configuration-Parameter-Details/#postprocessing","text":"[PostProcessing] number1.DecimalShift = 0 number2.DecimalShift = -1 PreValueUse = true PreValueAgeStartup = 720 AllowNegativeRates = false number1.MaxRateValue = 0.1 number2.MaxRateValue = 0.1 ErrorMessage = true CheckDigitIncreaseConsistency = false Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples PreValueUse Use the previous value for consistency check and substitution for NaN (True / False) PreValueAgeStartup Max age of PreValue after a reboot (downtime) AllowNegativeRates Allow decrease of the readout value numberX.MaxRateValue Maximum chance rate from one to the next readout. This can be specified for each number individual. ErrorMessage Show error messages numberX.DecimalShift Shifting of the decimal separator from the default position between digital and analog. This can be specified for each number individual. DecimalShift = 2: 123.456 --> 12345.6 DecimalShift = -1: 123.456 --> 12.3456 CheckDigitIncreaseConsistency This parameter controls, if the digits are checked for a consistent change in comparison to the previous value. This only makes sense, if the last digit is changing very slowly and every single digit is visible (e.g. 4.7 --> 4.8 --> 4.9 --> 5.0 --> 5.1). If single digits are skipped, for example because the digits changes to fast, this should be disabled (e.g. 4.7 --> 5.0 --> 5.1).","title":"[PostProcessing]"},{"location":"Configuration-Parameter-Details/#mqtt","text":"[MQTT] Uri = mqtt://IP-ADRESS:1883 MainTopic = wasserzaehler ClientID = wasser user = USERNAME password = PASSWORD Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples Uri URI to the MQTT broker including port e.g.: mqtt://IP-Address:Port MainTopic MQTT main topic, under which the counters are published. The single value will be published with the following key: MainTopic/number/PARAMETER where parameters are: value, rate, timestamp, error and json The general connection status can be found in MainTopic/connection ClientID ClientID to connect to the MQTT broker user user for MQTT authentication (optional) password password for MQTT authentication (optional)","title":"[MQTT]"},{"location":"Configuration-Parameter-Details/#autotimer","text":"[AutoTimer] AutoStart= true Intervall = 4.85 This paragraph is used to automatically trigger the periodic automated readout. Parameter Meaning Options/Examples AutoStart Automatically trigger the readout after startup Intervall Readout interval in minutes Values smaller than 2 minutes do not make sense, as this is the time for one detection","title":"[AutoTimer]"},{"location":"Configuration-Parameter-Details/#debug","text":"[Debug] Logfile = true LogfileRetentionInDays = 2 This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples Logfile Turn on (true) or off (false) the extended logging parameter and section optional LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever","title":"[Debug]"},{"location":"Configuration-Parameter-Details/#system","text":"[System] TimeZone = CET-1CEST,M3.5.0,M10.5.0/3 ;TimeServer = TIMESERVER ;Hostname = undefined SetupMode = false This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples TimeZone TimeZone of the system can be specified Central european, with summertime adjustement: CET-1CEST,M3.5.0,M10.5.0/3 TimeServer An dedicated time server can be specified. default = pool.ntp.org Hostname Additionally to the wlan.ini the hostname can be specified. It will be transferred to the wlan.ini and initiate a reboot SetupMode If enabled, the server starts in an initial setup mode. This is automatically disabled at the end of the setup","title":"[System]"},{"location":"Configuration-Parameter-Details/#ende","text":"No function, just to mark, that the config is done!","title":"[Ende]"},{"location":"Configuration/","text":"Most of the settings can be modified with the help of a web based graphical user interface . This is hosted through the web server on the ESP32. More configuration parameters can be edited by hand in the config.ini and corresponding files in the /config directory on the SD-card. If you where using the Version 1 of the watermeter you can easily transfer the configuration to the new system by following the steps in this migration description Processing / Config.ini principle The principle is very simple and can most easily be described as a flow of processing steps. Each step has a dedicated parameter description in the config.ini , which is indicated by brackets [name_of_step] . The steps are processed in the order written in the config file. That means, that you first have to describe the image taking, then the aligning and cutting and only after that you can start to config a neural network. The last step is the post processing. Processing steps - Overview In the following you get a short overview over the available steps. This order is also the suggested order for the processing flow. Single steps can be left out, if not needed (e.g. omit the analog part, if only digits are present) 1. [MakeImage] This steps parametrises the taking of the image by the ESP32-CAM. Size, quality and storage for logging and debugging can be set. 2. [Alignment] Image preprocessing, including image alignment with reference images 3. [Digits] Neural network evaluation of an image for digits. The neural network is defined by a tflite formatted file and the output is a number between 0 .. 9 or NaN (if image is not unique enough) 4. [Analog] Neural network evaluation of analog counter. The neural network is defined by a tflite formatted file and the output is a number between 0.0 .. 9.9, representing the position of the pointer. 5. [PostProcessing] Summarized the individually converted pictures to the overall result. It also implements some error corrections and consistency checks to filter wrong reading. 6. [MQTT] Transfer of the readings to a MQTT server. 7. [AutoTimer] Configuration of the automated flow start at the start up of the ESP32. 8. [Debug] Configuration for debugging details 9. [Ende] No meaning, just an additional indication, that the configuration is finished. A detailed parameter description can be found here: [[Configuration Parameter Details]]. Graphical configuration interface It is recommended to do the configuration of the alignment structures and ROIs through the graphical user interface. A step by step instruction can be found here: [[Graphical Configuration]] Background for Image Alignment Details on the image recognition flow can be found in the other project here: https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdf The config.ini here has the same functionality and options, but a slightly different syntax due to a own written ini-parser is used. Migration see here . Integration into Home Assistant Thanks to the help of the user @deadly667 here are some hints for the integration into the home assistant: [[Integration-Home-Assistant]]","title":"Configuration"},{"location":"Configuration/#processing-configini-principle","text":"The principle is very simple and can most easily be described as a flow of processing steps. Each step has a dedicated parameter description in the config.ini , which is indicated by brackets [name_of_step] . The steps are processed in the order written in the config file. That means, that you first have to describe the image taking, then the aligning and cutting and only after that you can start to config a neural network. The last step is the post processing.","title":"Processing / Config.ini principle"},{"location":"Configuration/#processing-steps-overview","text":"In the following you get a short overview over the available steps. This order is also the suggested order for the processing flow. Single steps can be left out, if not needed (e.g. omit the analog part, if only digits are present)","title":"Processing steps - Overview"},{"location":"Configuration/#1-makeimage","text":"This steps parametrises the taking of the image by the ESP32-CAM. Size, quality and storage for logging and debugging can be set.","title":"1. [MakeImage]"},{"location":"Configuration/#2-alignment","text":"Image preprocessing, including image alignment with reference images","title":"2. [Alignment]"},{"location":"Configuration/#3-digits","text":"Neural network evaluation of an image for digits. The neural network is defined by a tflite formatted file and the output is a number between 0 .. 9 or NaN (if image is not unique enough)","title":"3. [Digits]"},{"location":"Configuration/#4-analog","text":"Neural network evaluation of analog counter. The neural network is defined by a tflite formatted file and the output is a number between 0.0 .. 9.9, representing the position of the pointer.","title":"4. [Analog]"},{"location":"Configuration/#5-postprocessing","text":"Summarized the individually converted pictures to the overall result. It also implements some error corrections and consistency checks to filter wrong reading.","title":"5. [PostProcessing]"},{"location":"Configuration/#6-mqtt","text":"Transfer of the readings to a MQTT server.","title":"6. [MQTT]"},{"location":"Configuration/#7-autotimer","text":"Configuration of the automated flow start at the start up of the ESP32.","title":"7. [AutoTimer]"},{"location":"Configuration/#8-debug","text":"Configuration for debugging details","title":"8. [Debug]"},{"location":"Configuration/#9-ende","text":"No meaning, just an additional indication, that the configuration is finished. A detailed parameter description can be found here: [[Configuration Parameter Details]].","title":"9. [Ende]"},{"location":"Configuration/#graphical-configuration-interface","text":"It is recommended to do the configuration of the alignment structures and ROIs through the graphical user interface. A step by step instruction can be found here: [[Graphical Configuration]]","title":"Graphical configuration interface"},{"location":"Configuration/#background-for-image-alignment","text":"Details on the image recognition flow can be found in the other project here: https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdf The config.ini here has the same functionality and options, but a slightly different syntax due to a own written ini-parser is used. Migration see here .","title":"Background for Image Alignment"},{"location":"Configuration/#integration-into-home-assistant","text":"Thanks to the help of the user @deadly667 here are some hints for the integration into the home assistant: [[Integration-Home-Assistant]]","title":"Integration into Home Assistant"},{"location":"Correction%20Algorithm/","text":"Correction Algorithm After the digitization of the images and the composition to a number a checking and correction algorithm is applied. This is explained here. There are several reasons, that a check might be necessary: In case of digits there is the output of \"N\" (=NaN = Not-a-Number) in case the digit cannot be detected correctly. This happens for example if the image shows a digit between to states The replacement of the \"N\" with a previous value could be not sufficient, due to the fact, that it might have changed. There is a misreading of one one of the numbers. This can always happen in case of neural network processing. Terms and definitions PreValue The last correct read value. Either from a previous correctly identified value or manual setting by the user. This is used to replace \"N\"s and make a check for the absolute change. Digits Value that are digitized from a digital number. There are 11 allowed values for this: Digits: 0, 1, 2, ... 9 N = Not-a-Number - representing a not unique state between two numbers Analogs This are value derived from a pointer like meter. This never has the state \"N\". CheckDigitIncreaseConsistency If this is enabled an \"inteligent\" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the subdigit has gone through zero. For example: 16.6 --> 16.7 --> 1N.8 --> 17.9 corrected to 16.9 --> 17.0 --> 17.1 As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the subdigit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9 A detailed description of the algorithm can be found below (not yet ready!) Negative Rate allowed Most of the meters only have increasing numbers and do not count backwards. Therefore a negative rate (= negative change compared to the PreValue) is surely a false value. This can be checked an flagged as false reading MaxRateValue / MaxRateType Here the maximum change from one to the next reading can be limited. If a false reading of the neural network results in a change larger than this, the reading is flagged as false. There a two types of comparisons possible 1) AbsolutChange : Here the difference between the PreValue and the current reading is compared directly, independent how much time has passed since the last reading. 2) RelativeRate : in this case a change rate in the unit of change/minute is calculated, taking the time between the last and the current reading into account. Be careful, that with increasing time, the absolute allowed change increases. Example: relative rate of 0.05 m\u00b3/minute --> after 20 minutes a maximum change of 20 minutes * 0.05 m\u00b3/minute = 1 m\u00b3 is possible. That means that a false reading of 1 m\u00b3 cannot be detected false after about 20 minutes in this case Assume, that there might me no change in the meter for hours (e.g. during the night) a much bigger change could also be accepted. Flow Chart CheckDigitIncreaseConsistency Algorithm The check digit increase consistency algorithm is functional for the digits only. Due to the fact, that the rotation might be a little bit earlier or later compared to the zero crossing of the digit before, errors during the reading before and after a zero crossing can be wrong. Therefore a simple algorithm can be applied, checking the consistency of zero crossing and changes in the following digit. This is applied to one after the other digit, starting with the lowest priority digits.","title":"Correction Algorithm"},{"location":"Correction%20Algorithm/#correction-algorithm","text":"After the digitization of the images and the composition to a number a checking and correction algorithm is applied. This is explained here. There are several reasons, that a check might be necessary: In case of digits there is the output of \"N\" (=NaN = Not-a-Number) in case the digit cannot be detected correctly. This happens for example if the image shows a digit between to states The replacement of the \"N\" with a previous value could be not sufficient, due to the fact, that it might have changed. There is a misreading of one one of the numbers. This can always happen in case of neural network processing.","title":"Correction Algorithm"},{"location":"Correction%20Algorithm/#terms-and-definitions","text":"","title":"Terms and definitions"},{"location":"Correction%20Algorithm/#prevalue","text":"The last correct read value. Either from a previous correctly identified value or manual setting by the user. This is used to replace \"N\"s and make a check for the absolute change.","title":"PreValue"},{"location":"Correction%20Algorithm/#digits","text":"Value that are digitized from a digital number. There are 11 allowed values for this: Digits: 0, 1, 2, ... 9 N = Not-a-Number - representing a not unique state between two numbers","title":"Digits"},{"location":"Correction%20Algorithm/#analogs","text":"This are value derived from a pointer like meter. This never has the state \"N\".","title":"Analogs"},{"location":"Correction%20Algorithm/#checkdigitincreaseconsistency","text":"If this is enabled an \"inteligent\" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the subdigit has gone through zero. For example: 16.6 --> 16.7 --> 1N.8 --> 17.9 corrected to 16.9 --> 17.0 --> 17.1 As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the subdigit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9 A detailed description of the algorithm can be found below (not yet ready!)","title":"CheckDigitIncreaseConsistency"},{"location":"Correction%20Algorithm/#negative-rate-allowed","text":"Most of the meters only have increasing numbers and do not count backwards. Therefore a negative rate (= negative change compared to the PreValue) is surely a false value. This can be checked an flagged as false reading","title":"Negative Rate allowed"},{"location":"Correction%20Algorithm/#maxratevalue-maxratetype","text":"Here the maximum change from one to the next reading can be limited. If a false reading of the neural network results in a change larger than this, the reading is flagged as false. There a two types of comparisons possible 1) AbsolutChange : Here the difference between the PreValue and the current reading is compared directly, independent how much time has passed since the last reading. 2) RelativeRate : in this case a change rate in the unit of change/minute is calculated, taking the time between the last and the current reading into account. Be careful, that with increasing time, the absolute allowed change increases. Example: relative rate of 0.05 m\u00b3/minute --> after 20 minutes a maximum change of 20 minutes * 0.05 m\u00b3/minute = 1 m\u00b3 is possible. That means that a false reading of 1 m\u00b3 cannot be detected false after about 20 minutes in this case Assume, that there might me no change in the meter for hours (e.g. during the night) a much bigger change could also be accepted.","title":"MaxRateValue / MaxRateType"},{"location":"Correction%20Algorithm/#flow-chart","text":"","title":"Flow Chart"},{"location":"Correction%20Algorithm/#checkdigitincreaseconsistency-algorithm","text":"The check digit increase consistency algorithm is functional for the digits only. Due to the fact, that the rotation might be a little bit earlier or later compared to the zero crossing of the digit before, errors during the reading before and after a zero crossing can be wrong. Therefore a simple algorithm can be applied, checking the consistency of zero crossing and changes in the following digit. This is applied to one after the other digit, starting with the lowest priority digits.","title":"CheckDigitIncreaseConsistency Algorithm"},{"location":"Demo-Mode/","text":"For Demo and Testing Purpose, the device can use pre-recorded images. You need to enable it in the configuration ( TakeImage > Demo ) and also provide the needed files on the SD-Card. One image per round gets used, starting with the first image for the first round. For the reference image and the alignment also the first image gets used. Once the last image got reached, it starts again with the first one. Example Demo You can use the following demo or create your own one. Just install it using the OTA Update functionality. demo.zip (this is just a zip of this folder in the repo) SD-Card Structure demo/ \u251c\u2500\u2500 520.8983.jpg \u251c\u2500\u2500 520.9086.jpg \u251c\u2500\u2500 520.9351.jpg \u251c\u2500\u2500 ... \u2514\u2500\u2500 files.txt The jpg files can have any name The jpg files must be smaller than 30'000 bytes The files.txt must contains a list of those files, eg: 520.8983.jpg 520.9086.jpg 520.9351.jpg Recoding To record real images of a meter, you have to periodically fetch http:///img_tmp/raw.jpg . To automate this, you can use the following shell script (Linux only): #!/bin/bash while [[ true ]]; do echo \"fetching value...\" wget -q http://192.168.1.151/value -O value.txt value=`cat value.txt` echo \"Value: $value\" diff=`diff value.txt value_previous.txt` changed=$? #echo \"Diff: $diff\" if [[ $changed -ne 0 ]]; then echo \"Value changed:\" echo $diff echo \"fetching image...\" wget -q http://192.168.1.151/img_tmp/raw.jpg -O $value.jpg else echo \"Value did not change, skipping image fetching!\" fi cp value.txt value_previous.txt echo \"waiting 60s...\" sleep 60 done How does it work The Demo Mode tries to interfere as less as possible with the normal behavior. Whenever a Cam Framebuffer gets taken ( esp_camera_fb_get() ), it replaces the framebuffer with the image from the SD-Card.","title":"Demo Mode"},{"location":"Demo-Mode/#example-demo","text":"You can use the following demo or create your own one. Just install it using the OTA Update functionality. demo.zip (this is just a zip of this folder in the repo)","title":"Example Demo"},{"location":"Demo-Mode/#sd-card-structure","text":"demo/ \u251c\u2500\u2500 520.8983.jpg \u251c\u2500\u2500 520.9086.jpg \u251c\u2500\u2500 520.9351.jpg \u251c\u2500\u2500 ... \u2514\u2500\u2500 files.txt The jpg files can have any name The jpg files must be smaller than 30'000 bytes The files.txt must contains a list of those files, eg: 520.8983.jpg 520.9086.jpg 520.9351.jpg","title":"SD-Card Structure"},{"location":"Demo-Mode/#recoding","text":"To record real images of a meter, you have to periodically fetch http:///img_tmp/raw.jpg . To automate this, you can use the following shell script (Linux only): #!/bin/bash while [[ true ]]; do echo \"fetching value...\" wget -q http://192.168.1.151/value -O value.txt value=`cat value.txt` echo \"Value: $value\" diff=`diff value.txt value_previous.txt` changed=$? #echo \"Diff: $diff\" if [[ $changed -ne 0 ]]; then echo \"Value changed:\" echo $diff echo \"fetching image...\" wget -q http://192.168.1.151/img_tmp/raw.jpg -O $value.jpg else echo \"Value did not change, skipping image fetching!\" fi cp value.txt value_previous.txt echo \"waiting 60s...\" sleep 60 done","title":"Recoding"},{"location":"Demo-Mode/#how-does-it-work","text":"The Demo Mode tries to interfere as less as possible with the normal behavior. Whenever a Cam Framebuffer gets taken ( esp_camera_fb_get() ), it replaces the framebuffer with the image from the SD-Card.","title":"How does it work"},{"location":"Error-Codes/","text":"This page lists the possible error codes, their meaning and possible solutions. The effective error codes can be found here . Critical Errors Those Errors make the normal operation of the device impossible. Most likely they are caused by a hardware issue! 0x00000001 PSRAM bad Your device most likely has no PSRAM at all or it is too small (needs to have at least 4 MBytes)! See https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility Usually the log shows something like this: psram: PSRAM ID read error: 0xffffffff cpu_start: Failed to init external RAM! 0x00000002 Heap too small The firmware failed to allocate enough memory. This most likely is a consequential error of a bad PSRAM! 0x00000004 Cam bad The attached camera can not be initialized. This usually is because on of the following reasons: - The camera is not supported, see https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility - The camera is not attached properly -> Try to remove and attach it again. Make sure you move the black part enough into the socket! - The camera or the camera cable is damaged Non-Critical Errors Those Errors can be caused by an error during initialization. It is possible that the error has no impact at all or that a reboot solves it. 0x00000100 Cam Framebuffer bad The firmware was unable to initialize the Camera Framebuffer. The firmware will continue to work, but other consequential error might arise. A reboot of the device might help. 0x00000200 NTP failed The firmware failed to get the world time from an NTP server. The firmware will continue to work, but has a wrong time.","title":"Error Codes"},{"location":"Error-Codes/#critical-errors","text":"Those Errors make the normal operation of the device impossible. Most likely they are caused by a hardware issue!","title":"Critical Errors"},{"location":"Error-Codes/#0x00000001-psram-bad","text":"Your device most likely has no PSRAM at all or it is too small (needs to have at least 4 MBytes)! See https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility Usually the log shows something like this: psram: PSRAM ID read error: 0xffffffff cpu_start: Failed to init external RAM!","title":"0x00000001 PSRAM bad"},{"location":"Error-Codes/#0x00000002-heap-too-small","text":"The firmware failed to allocate enough memory. This most likely is a consequential error of a bad PSRAM!","title":"0x00000002 Heap too small"},{"location":"Error-Codes/#0x00000004-cam-bad","text":"The attached camera can not be initialized. This usually is because on of the following reasons: - The camera is not supported, see https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility - The camera is not attached properly -> Try to remove and attach it again. Make sure you move the black part enough into the socket! - The camera or the camera cable is damaged","title":"0x00000004 Cam bad"},{"location":"Error-Codes/#non-critical-errors","text":"Those Errors can be caused by an error during initialization. It is possible that the error has no impact at all or that a reboot solves it.","title":"Non-Critical Errors"},{"location":"Error-Codes/#0x00000100-cam-framebuffer-bad","text":"The firmware was unable to initialize the Camera Framebuffer. The firmware will continue to work, but other consequential error might arise. A reboot of the device might help.","title":"0x00000100 Cam Framebuffer bad"},{"location":"Error-Codes/#0x00000200-ntp-failed","text":"The firmware failed to get the world time from an NTP server. The firmware will continue to work, but has a wrong time.","title":"0x00000200 NTP failed"},{"location":"Error-Debugging/","text":"Error Debugging Rebooting General Remark Due to the rather complex code with a lot of external libraries and the limited availability of memory a reboot of the device from time to time is \"normal\". Background are memory leakages and therefore running out of free memory. The hardware of the ESP32CAM has a varying quality. I have one and the same hardware with a reboot range from every 5 detection runs to up to 250 detection runs. Getting deeper inside Have a look into the log file ( /log/message/... ). If the log file is very short you need to enable a enhanced logging in the config.ini (Debug --> logfile = true ) . Analyze the debugging output of the serial interface Connect a serial to USB interface (like for flashing) and make a logging of the serial communication There are a lot more intermediate information and the lines before the reboot tell you, where the firmware fails If you make an issue about this, please post these two information additionally Don't forget to remove your WLAN password in the serial log Often observed problems Hardware failure Camera not working --> check the interface, test another module Low cost module with only 2MB of PSRAM instead of 4MB --> image taking will fail first. This will never work due to too low memory ROI misaligned This typically happens if you have suboptimal \"Alignement Marks\". A very simple and working solution is to put put higly contrasted stickers on your meter and put \"Alignement Marks\" on it (see picture below) If after those adjustement you still have some issues, you can try to adjust your aligmenet settings in expert mode: My Analog Meter are recognized as Digital Counter or vice versa First, check that your ROI are correctly defined (yey!) Second, verify that the name of your ROI analog and digital ROIs are different Recognition is working well, but number aren't sorted correctly You have to sort your ROI correctly (Bigger to smaller). Select your ROI and click either \"move next\" or \"move previous\". Repeat until your ROI are correctly sorted","title":"Error Debugging"},{"location":"Error-Debugging/#error-debugging","text":"","title":"Error Debugging"},{"location":"Error-Debugging/#rebooting","text":"","title":"Rebooting"},{"location":"Error-Debugging/#general-remark","text":"Due to the rather complex code with a lot of external libraries and the limited availability of memory a reboot of the device from time to time is \"normal\". Background are memory leakages and therefore running out of free memory. The hardware of the ESP32CAM has a varying quality. I have one and the same hardware with a reboot range from every 5 detection runs to up to 250 detection runs.","title":"General Remark"},{"location":"Error-Debugging/#getting-deeper-inside","text":"Have a look into the log file ( /log/message/... ). If the log file is very short you need to enable a enhanced logging in the config.ini (Debug --> logfile = true ) . Analyze the debugging output of the serial interface Connect a serial to USB interface (like for flashing) and make a logging of the serial communication There are a lot more intermediate information and the lines before the reboot tell you, where the firmware fails If you make an issue about this, please post these two information additionally Don't forget to remove your WLAN password in the serial log","title":"Getting deeper inside"},{"location":"Error-Debugging/#often-observed-problems","text":"","title":"Often observed problems"},{"location":"Error-Debugging/#hardware-failure","text":"Camera not working --> check the interface, test another module Low cost module with only 2MB of PSRAM instead of 4MB --> image taking will fail first. This will never work due to too low memory","title":"Hardware failure"},{"location":"Error-Debugging/#roi-misaligned","text":"This typically happens if you have suboptimal \"Alignement Marks\". A very simple and working solution is to put put higly contrasted stickers on your meter and put \"Alignement Marks\" on it (see picture below) If after those adjustement you still have some issues, you can try to adjust your aligmenet settings in expert mode:","title":"ROI misaligned"},{"location":"Error-Debugging/#my-analog-meter-are-recognized-as-digital-counter-or-vice-versa","text":"First, check that your ROI are correctly defined (yey!) Second, verify that the name of your ROI analog and digital ROIs are different","title":"My Analog Meter are recognized as Digital Counter or vice versa"},{"location":"Error-Debugging/#recognition-is-working-well-but-number-arent-sorted-correctly","text":"You have to sort your ROI correctly (Bigger to smaller). Select your ROI and click either \"move next\" or \"move previous\". Repeat until your ROI are correctly sorted","title":"Recognition is working well, but number aren't sorted correctly"},{"location":"External-LED/","text":"External LED The internal flash LED is very close to the camera axis. This results in reflection, especially in case of flat glass surfaces such as for power meters. To circumvent this problem, it is now possible to control external LEDs, which than can be places somewhere else in the setup. As not simples LEDs are used, but RGB leds with a digital interface like WS2812 not only the position, but also the color and intensity of the illumination can now be adjusted. The following image shows a direct comparision of the \"old\" internal flash LED and two off axis LEDs. There is also a new meter adapter available. This has two features: designed for small clearings in front of the meter and prepared for WS2812 LEDs . 1. Hardware installation of the LED stripe The control line of the LED stripe is connected with a 470 Ohm resistor to the GPIO12. For power supply stabilization a capacitor between 5V and ground is recommended. Here a 470\u00b5F polymer capacitor is used. As a power supply a 5V from the ESP32 is used like in the following wiring. 2. Software configuration The handling of the WS2812 LED controller needs some other libraries, therefore it is controlled within a dedicated section called GPIO Settings . The external LED stripe is connected to GPIO12. After activating the \"GPIO Settings\" section, the internal flash is per default disabled. In order to activate the external LED, you need to activate GPIO 12 state and select \"extern flash light ws281x ...\" . Parameter Meaning LED-Type There are several types of controller implemented: WS2812(B), WS2813, SK6812 Numbers of LED Number of LEDs on the LED stripe LED Color The color and intensity can be controlled directly by a red/green/blue value, each within the range from 0 (off) to 255 (full) Enabling the GPIO settings automatically disables the flash LED. Therefore you can enable it here manually by checking GPIO4 and choose \"build-in led flash light\" . It is not recommended to use both illumination parallel.","title":"External LED"},{"location":"External-LED/#external-led","text":"The internal flash LED is very close to the camera axis. This results in reflection, especially in case of flat glass surfaces such as for power meters. To circumvent this problem, it is now possible to control external LEDs, which than can be places somewhere else in the setup. As not simples LEDs are used, but RGB leds with a digital interface like WS2812 not only the position, but also the color and intensity of the illumination can now be adjusted. The following image shows a direct comparision of the \"old\" internal flash LED and two off axis LEDs. There is also a new meter adapter available. This has two features: designed for small clearings in front of the meter and prepared for WS2812 LEDs .","title":"External LED"},{"location":"External-LED/#1-hardware-installation-of-the-led-stripe","text":"The control line of the LED stripe is connected with a 470 Ohm resistor to the GPIO12. For power supply stabilization a capacitor between 5V and ground is recommended. Here a 470\u00b5F polymer capacitor is used. As a power supply a 5V from the ESP32 is used like in the following wiring.","title":"1. Hardware installation of the LED stripe"},{"location":"External-LED/#2-software-configuration","text":"The handling of the WS2812 LED controller needs some other libraries, therefore it is controlled within a dedicated section called GPIO Settings . The external LED stripe is connected to GPIO12. After activating the \"GPIO Settings\" section, the internal flash is per default disabled. In order to activate the external LED, you need to activate GPIO 12 state and select \"extern flash light ws281x ...\" . Parameter Meaning LED-Type There are several types of controller implemented: WS2812(B), WS2813, SK6812 Numbers of LED Number of LEDs on the LED stripe LED Color The color and intensity can be controlled directly by a red/green/blue value, each within the range from 0 (off) to 255 (full) Enabling the GPIO settings automatically disables the flash LED. Therefore you can enable it here manually by checking GPIO4 and choose \"build-in led flash light\" . It is not recommended to use both illumination parallel.","title":"2. Software configuration"},{"location":"FAQs/","text":"Frequently Asked Questions My device is reboot frequently. What can I do? There are several reasons for the reboot: Frequent HTML requests Wrong configuration, missing configuration files Unstable hardware - see [[Hardware Compatibility]] There is a dedicated Wiki page about this: [[Frequent Reboots]] How accurate are the detections? It is hard to give a specific accuracy number. It depends on many factors, e.g. How in-focus is your camera? How sturdy is the camera mount? Does it slightly move over extended periods of time? What type of meter are you reading? Is the meter already in the training data set? Are you trying to read digits, an analog dial, or both? etc. Anecdotally, the authors of this wiki have great success with the meter. While the AI algorithm itself is not perfect and sometimes returns NaN or incorrect values, other post-processing / prevalue / sanity checks help ensure such invalid values are filtered out. With the correct settings, one author has been running this device for 1 month without any incorrect values reported. See the FAQs below for more details and configuration hints. My numbers are not corrected detected. What can I do? There is a dedicated Wiki page about the correct setting [[ROI Configuration]] This page also includes the instructions for gathering new images for the training. How can I ensure invalid numbers are never reported? As mentioned above, the AI algorithm is not perfect. Sometimes it may read an incorrect value. We can tune the software to almost never report an incorrect value. There is a tradeoff though: the software may report stale values - i.e. it will drop incorrect values for a potentially long period of time, resulting in the meter reading being outdated by hours. If never receiving an incorrect value is important to you, consider tolerating this tradeoff. You can change the following settings to reduce incorrect readings (but potentially increase staleness of data): * Set a prevalue via the UI, then change PostProcessing configuration option PreValueAgeStartup to a much larger number (e.g. 43200 = 30 days). * Change PostProcessing configuration option MaxRateType to be time based instead of absolute. Set MaxRateValue to something realistic (e.g. 5 gal/min). You can often find the max flow rate your meter supports directly on the cover. * Reduce AutoTimer configuration option Intervall to the lowest it can be (e.g. 3 min). The more often you take readings, the less likely for data staleness to occur. Even after I have setup everything perfect there is a false reading - especially around the zero crossing (roll over to next number) The roll over behavior is different for the different meters. E.g.: Rolling over start with different previous position (e.g. at 7, 8 or 9) The neutral position (no rolling) is not perfectly at zero, but rather at something like 7.9 or 8.1, even if it should be exactly 8 The \"PostProcessingAlgo\" is trying to judge out of the individual readings, what number it should be. For example if the previous number is a \"1\", but the next number seems to be a \"8.9\", mos probably there was a \"zero crossing\" and the number is a \"9\" and not still an \"8\" Currently the setting of the algorithm is set to fit most of the meters and cases. But the parameters do not fit perfectly for all situations. Therefore there might be intermediate states, where the reading is false. This is especially the case, at the positions, where the roll over (zero crossing) is just starting. To prevent a sending of false parameters, there is the possibility to limit the maximum allowed change (MaxRateChange). Usually after some time and movement of the counters a bit further, the reading is getting back to a stable reading. To handle this, a parametrized setting would be needed. This is rather complicated to implement as subtle changes make a relevant difference. Currently this is not implemented. So please be a bit patient with your meter :-)","title":"Frequently Asked Questions"},{"location":"FAQs/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"FAQs/#my-device-is-reboot-frequently-what-can-i-do","text":"There are several reasons for the reboot: Frequent HTML requests Wrong configuration, missing configuration files Unstable hardware - see [[Hardware Compatibility]] There is a dedicated Wiki page about this: [[Frequent Reboots]]","title":"My device is reboot frequently. What can I do?"},{"location":"FAQs/#how-accurate-are-the-detections","text":"It is hard to give a specific accuracy number. It depends on many factors, e.g. How in-focus is your camera? How sturdy is the camera mount? Does it slightly move over extended periods of time? What type of meter are you reading? Is the meter already in the training data set? Are you trying to read digits, an analog dial, or both? etc. Anecdotally, the authors of this wiki have great success with the meter. While the AI algorithm itself is not perfect and sometimes returns NaN or incorrect values, other post-processing / prevalue / sanity checks help ensure such invalid values are filtered out. With the correct settings, one author has been running this device for 1 month without any incorrect values reported. See the FAQs below for more details and configuration hints.","title":"How accurate are the detections?"},{"location":"FAQs/#my-numbers-are-not-corrected-detected-what-can-i-do","text":"There is a dedicated Wiki page about the correct setting [[ROI Configuration]] This page also includes the instructions for gathering new images for the training.","title":"My numbers are not corrected detected. What can I do?"},{"location":"FAQs/#how-can-i-ensure-invalid-numbers-are-never-reported","text":"As mentioned above, the AI algorithm is not perfect. Sometimes it may read an incorrect value. We can tune the software to almost never report an incorrect value. There is a tradeoff though: the software may report stale values - i.e. it will drop incorrect values for a potentially long period of time, resulting in the meter reading being outdated by hours. If never receiving an incorrect value is important to you, consider tolerating this tradeoff. You can change the following settings to reduce incorrect readings (but potentially increase staleness of data): * Set a prevalue via the UI, then change PostProcessing configuration option PreValueAgeStartup to a much larger number (e.g. 43200 = 30 days). * Change PostProcessing configuration option MaxRateType to be time based instead of absolute. Set MaxRateValue to something realistic (e.g. 5 gal/min). You can often find the max flow rate your meter supports directly on the cover. * Reduce AutoTimer configuration option Intervall to the lowest it can be (e.g. 3 min). The more often you take readings, the less likely for data staleness to occur.","title":"How can I ensure invalid numbers are never reported?"},{"location":"FAQs/#even-after-i-have-setup-everything-perfect-there-is-a-false-reading-especially-around-the-zero-crossing-roll-over-to-next-number","text":"The roll over behavior is different for the different meters. E.g.: Rolling over start with different previous position (e.g. at 7, 8 or 9) The neutral position (no rolling) is not perfectly at zero, but rather at something like 7.9 or 8.1, even if it should be exactly 8 The \"PostProcessingAlgo\" is trying to judge out of the individual readings, what number it should be. For example if the previous number is a \"1\", but the next number seems to be a \"8.9\", mos probably there was a \"zero crossing\" and the number is a \"9\" and not still an \"8\" Currently the setting of the algorithm is set to fit most of the meters and cases. But the parameters do not fit perfectly for all situations. Therefore there might be intermediate states, where the reading is false. This is especially the case, at the positions, where the roll over (zero crossing) is just starting. To prevent a sending of false parameters, there is the possibility to limit the maximum allowed change (MaxRateChange). Usually after some time and movement of the counters a bit further, the reading is getting back to a stable reading. To handle this, a parametrized setting would be needed. This is rather complicated to implement as subtle changes make a relevant difference. Currently this is not implemented. So please be a bit patient with your meter :-)","title":"Even after I have setup everything perfect there is a false reading - especially around the zero crossing (roll over to next number)"},{"location":"Frequent%20Reboots/","text":"Frequent reboots There are several types of reboots. To get a deeper insight turn on the logging: Internal logging ( config.ini ) Serial log of the UART interface (same as for flashing the firmware) There are two principle types of reboots Random reboots (always different timing and situation) Permanent Reboots always at the same time Random reboots Random reboots have two reasons: overload during HTML access and unstable system In general: there are several mechanisms in the firmware (like saving previous values), to have a \"smooth\" reboot without too many notable disturbance. Overload during HTML access If you frequently access the web server over HTML requests, the firmware tends to reboot. This especially happens during the first run and when the ESP32 is busy with the digitization flow. The reason for this are running out of memory during a flow, minor memory leakage in combination with missing error handling. There is noting you can do about this kind of reboot, beside two thing: Support the firmware development with improved and tested part of code Be patient :-) Unstable system If your system is sometimes running smoothly over several runs and sometimes reboots obviously randomly, you have an partially unstable device. You can check this in the standard log file on the SD card: 2021-12-26T06:34:09: task_autodoFlow - round done 2021-12-26T06:34:09: CPU Temperature: 56.1 2021-12-26T06:38:00: task_autodoFlow - next round - Round #23 Here you see, that the round #23 is starting, so obviously there were no reboots in the last 22 rounds. There is hardware (ESP32CAM), where only 2-3 stable rounds are possible and others, where way more than 100 rounds without any reboots is possible. There is noting you can do about it, beside testing different hardware. Permanent reboots Permanent reboots at the same situation during the flow has a systematic problem either in the hardware or the configuration. It usually happens during the first run as there all needed parts of the firmware have been loaded for the first time. To find the reason mostly the serial log of the UART interface from the startup until the reboots is very helpful. It can be stored using the USB / UART interface - the same as for flashing the firmware - and logging the serial output of the ESP32. Possible problems: SD card PSRAM too low Configuration missing SD card problems The ESP32CAM is a little bit \"picky\" with the supported SD cards. Due to the limited availability of GPIOs the SD card can only be accessed via 1-wire mode. Therefore not all SD cards are supported. Several error cases can happen: No SD card Easy to detect: fast blinking red LED directly after startup, no reaction of the web server etc. at all SD card not supported at all Error message of no detectable SC card in the log file. Normal looking log for a 16GB SD card is like this: ```09:38:25.037 -> \u001b[0;32mI (4789) main: Using SDMMC peripheral\u001b[0m 09:38:25.037 -> \u001b[0;32mI (4789) main: Using SDMMC peripheral\u001b[0m 09:38:25.138 -> Name: SC16G 09:38:25.138 -> Type: SDHC/SDXC 09:38:25.138 -> Speed: 20 MHz 09:38:25.138 -> Size: 15193MB Otherwise there is some error message. ###### SD card recognized but not supported This is the most annoying error. The SD card is detected, but the files cannot be read. Most probably this results in a problem with the WLAN connection, as the first file needed is the `wlan.ini` in the root directory. ##### PSRAM too low In order to work, there are 4 MB of PSRAM necessary. Normaly the ESP32CAM is equiped with 8 MB, whereof only 4 MB can be used effectively. Sometimes, there is hardware, where only 2 MB of PSRAM is present - **even if you have bought a 8 MB module** You can identify the amount of PSRAM in the serial log file: 09:38:21.224 -> \u001b[0;32mI (881) psram: This chip is ESP32-D0WD\u001b[0m 09:38:21.224 -> \u001b[0;32mI (885) spiram: Found 64MBit SPI RAM device\u001b[0m 09:38:21.224 -> \u001b[0;32mI (890) spiram: SPI RAM mode: flash 40m sram 40m\u001b[0m 09:38:21.224 -> \u001b[0;32mI (895) spiram: PSRAM initialized, cache is in low/high (2-core) mode.\u001b[0m ``` Here you see 64MBit (= 8MByte) - which is okay. False reading would be: 16MBit The error in the SD log file is typically related with the taking of the image (tbd) as the first time, the system is running out of memory is usually, when it tries to transfer an image from the camera to the PSRAM. There is nothing to do, than to buy a new ESP32CAM with really 64MBit of PSRAM. Configuration missing There are several files needed during on run cycle. If one of this is missing, the firmware is missing information and tends to reboot due to missing error management: /wlan.ini /config/config.ini /config/XXXXX.tflite (1 time for analog and 1 time for digital) where XXXXX is the file name, that is written in the config.ini","title":"Frequent reboots"},{"location":"Frequent%20Reboots/#frequent-reboots","text":"There are several types of reboots. To get a deeper insight turn on the logging: Internal logging ( config.ini ) Serial log of the UART interface (same as for flashing the firmware) There are two principle types of reboots Random reboots (always different timing and situation) Permanent Reboots always at the same time","title":"Frequent reboots"},{"location":"Frequent%20Reboots/#random-reboots","text":"Random reboots have two reasons: overload during HTML access and unstable system In general: there are several mechanisms in the firmware (like saving previous values), to have a \"smooth\" reboot without too many notable disturbance.","title":"Random reboots"},{"location":"Frequent%20Reboots/#overload-during-html-access","text":"If you frequently access the web server over HTML requests, the firmware tends to reboot. This especially happens during the first run and when the ESP32 is busy with the digitization flow. The reason for this are running out of memory during a flow, minor memory leakage in combination with missing error handling. There is noting you can do about this kind of reboot, beside two thing: Support the firmware development with improved and tested part of code Be patient :-)","title":"Overload during HTML access"},{"location":"Frequent%20Reboots/#unstable-system","text":"If your system is sometimes running smoothly over several runs and sometimes reboots obviously randomly, you have an partially unstable device. You can check this in the standard log file on the SD card: 2021-12-26T06:34:09: task_autodoFlow - round done 2021-12-26T06:34:09: CPU Temperature: 56.1 2021-12-26T06:38:00: task_autodoFlow - next round - Round #23 Here you see, that the round #23 is starting, so obviously there were no reboots in the last 22 rounds. There is hardware (ESP32CAM), where only 2-3 stable rounds are possible and others, where way more than 100 rounds without any reboots is possible. There is noting you can do about it, beside testing different hardware.","title":"Unstable system"},{"location":"Frequent%20Reboots/#permanent-reboots","text":"Permanent reboots at the same situation during the flow has a systematic problem either in the hardware or the configuration. It usually happens during the first run as there all needed parts of the firmware have been loaded for the first time. To find the reason mostly the serial log of the UART interface from the startup until the reboots is very helpful. It can be stored using the USB / UART interface - the same as for flashing the firmware - and logging the serial output of the ESP32. Possible problems: SD card PSRAM too low Configuration missing","title":"Permanent reboots"},{"location":"Frequent%20Reboots/#sd-card-problems","text":"The ESP32CAM is a little bit \"picky\" with the supported SD cards. Due to the limited availability of GPIOs the SD card can only be accessed via 1-wire mode. Therefore not all SD cards are supported. Several error cases can happen:","title":"SD card problems"},{"location":"Frequent%20Reboots/#no-sd-card","text":"Easy to detect: fast blinking red LED directly after startup, no reaction of the web server etc. at all","title":"No SD card"},{"location":"Frequent%20Reboots/#sd-card-not-supported-at-all","text":"Error message of no detectable SC card in the log file. Normal looking log for a 16GB SD card is like this: ```09:38:25.037 -> \u001b[0;32mI (4789) main: Using SDMMC peripheral\u001b[0m 09:38:25.037 -> \u001b[0;32mI (4789) main: Using SDMMC peripheral\u001b[0m 09:38:25.138 -> Name: SC16G 09:38:25.138 -> Type: SDHC/SDXC 09:38:25.138 -> Speed: 20 MHz 09:38:25.138 -> Size: 15193MB Otherwise there is some error message. ###### SD card recognized but not supported This is the most annoying error. The SD card is detected, but the files cannot be read. Most probably this results in a problem with the WLAN connection, as the first file needed is the `wlan.ini` in the root directory. ##### PSRAM too low In order to work, there are 4 MB of PSRAM necessary. Normaly the ESP32CAM is equiped with 8 MB, whereof only 4 MB can be used effectively. Sometimes, there is hardware, where only 2 MB of PSRAM is present - **even if you have bought a 8 MB module** You can identify the amount of PSRAM in the serial log file: 09:38:21.224 -> \u001b[0;32mI (881) psram: This chip is ESP32-D0WD\u001b[0m 09:38:21.224 -> \u001b[0;32mI (885) spiram: Found 64MBit SPI RAM device\u001b[0m 09:38:21.224 -> \u001b[0;32mI (890) spiram: SPI RAM mode: flash 40m sram 40m\u001b[0m 09:38:21.224 -> \u001b[0;32mI (895) spiram: PSRAM initialized, cache is in low/high (2-core) mode.\u001b[0m ``` Here you see 64MBit (= 8MByte) - which is okay. False reading would be: 16MBit The error in the SD log file is typically related with the taking of the image (tbd) as the first time, the system is running out of memory is usually, when it tries to transfer an image from the camera to the PSRAM. There is nothing to do, than to buy a new ESP32CAM with really 64MBit of PSRAM.","title":"SD card not supported at all"},{"location":"Frequent%20Reboots/#configuration-missing","text":"There are several files needed during on run cycle. If one of this is missing, the firmware is missing information and tends to reboot due to missing error management: /wlan.ini /config/config.ini /config/XXXXX.tflite (1 time for analog and 1 time for digital) where XXXXX is the file name, that is written in the config.ini","title":"Configuration missing"},{"location":"Gasmeter-Log-Downloader/","text":"Gasmeter Log-Downloader This small tool downloads the logfiles from your ESP32 and stores the last value of the day in an *.csv file. To use this tool you need to activate the debug logfile in your configuration (Configuration / Debug / Logfile). I go with 30 days of retention in days. It downloads only the past logfiles (yesterday and older). You can define the max. number of Logfiles to download (beginning from newest [yesterday]). I wrote this tool to get a chart of the daily gas consumption to optimize my gas powered heating. Variables to define by yourself: URL to Logfile-Path on Device: \"http://ESP32-IP-Address/fileserver/log/message/\" Download Logfiles to: enter a valid directory, e.g. \"D:\\Gaszaehler\\Auswertung\\Log-Downloads\\\" Output CSV-File: enter a valid directory, e.g. \"D:\\Gaszaehler\\Auswertung\\DailyValues.csv\" Download Logfiles from past # days: enter the max. number of logfiles you want to download (<= your logfile retention value in your device configuration) Feel free to optimize and modify it.","title":"Gasmeter Log Downloader"},{"location":"Gasmeter-Log-Downloader/#gasmeter-log-downloader","text":"This small tool downloads the logfiles from your ESP32 and stores the last value of the day in an *.csv file. To use this tool you need to activate the debug logfile in your configuration (Configuration / Debug / Logfile). I go with 30 days of retention in days. It downloads only the past logfiles (yesterday and older). You can define the max. number of Logfiles to download (beginning from newest [yesterday]). I wrote this tool to get a chart of the daily gas consumption to optimize my gas powered heating. Variables to define by yourself: URL to Logfile-Path on Device: \"http://ESP32-IP-Address/fileserver/log/message/\" Download Logfiles to: enter a valid directory, e.g. \"D:\\Gaszaehler\\Auswertung\\Log-Downloads\\\" Output CSV-File: enter a valid directory, e.g. \"D:\\Gaszaehler\\Auswertung\\DailyValues.csv\" Download Logfiles from past # days: enter the max. number of logfiles you want to download (<= your logfile retention value in your device configuration) Feel free to optimize and modify it.","title":"Gasmeter Log-Downloader"},{"location":"Graphical-configuration/","text":"Graphical configuration General remark: to activate the changes, currently the device needs a restart after saving the changes. partially the commands needs processing on the ESP32 device. This is not very fast - so please be patient. too frequent http-request could result in a reboot of the ESP32 - normally this is not a problem as the server react about 30s later normally. Access to the graphical user interface The graphical configuration mode can be reached via the \"Edit Configuration\" button in the main menue ( /index.html ): Overview function Direct edit config.ini in text editor Configuration of image alignment a. Create of reference image b. Define alignment structures Definition of ROIs for digits and analog pointers Test the settings Back to main menue (\"index.html\") 1. Edit Config.ini This is a text editor for the config.ini. Changes commited with the button on the lower left. 2a. Create Reference Image The reference image is the basis for the coordination of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated. Attention: Updating the reference image, also means, that all alignment images and ROIs needs to be teached again. Therefore do this step only with caution. At first the current image is shown and no adjustment is possible. To reload the actual image push the button \"Show actual Reference\" (1). To define a new reference image push the button \"Create new Reference\" (2). Then the last taken raw image from the camera is loaded. If you want to update this, you can push the button \"Make new raw image (raw.jpg)\". If you need to mirror your image (e.g. mirror before camera) you can do this by selecting \"mirror image\". After loading the mirroring (in case checked) and the prerotation angle from the config.ini are applied. Then use the rough and fine adjustment to get the image straight aligned (3). If everything is done, you can save the result with \"Update Reference Image\" (4). If you have problems with reflections, you can turn the camera in a positions, where the reflection is at a position, where no important information is. To reduce the intensity of the reflection you can also a peace of felt (\"Filz\") as diffusior at the LED. 2b. Define Alignment References The alignment references are used to realign every taken image to the reference coordinates. Therefore two alignment structures are identified and the image is shifted and rotated according to their position with the target to be in exactly the same position as the reference image. The alignment structures needs to be unique and have a good contrast. As this is the most calculation intensive process, only a field of view of 40x40 pixels around the original coordinates are scanned. This can be adjusted manually in the config.ini (Parameter: SearchFieldX / SearchFieldY ). In the upper part of the settings you can control the position and size of the selected reference image. You can define the ROI in the image directly via drag and drop with the mouse. Go to the starting point, push the left mouse button and drag your ROI. You will a red rectangle with the newly selected position. To make this active, you need to push \"Update Reference\" (2). You can change between the two reference images with the drop down box (\"Reference 0\", \"Reference 1\"). In some cases it might be useful to use a reference with a higher contrast. This can be achieved by pushing \"Enhance Contrast\" (3). The result will be calculated on the ESP32 - so be a bit patient, before you see it active. To save the modified reference to the config.ini push finally \"Save to config.ini\". 3a./3b. Define ROIs for image recognition Here the regions of interest for the digital and analog pointers are defined. As both are done identically, here as an example the digital images are shown. First of all you can define more than one number, for example in a dual meter counter. This can be done with defining a \"Number\" (1). Analog and digital ROIs belonging to the same \"Number\" are considered to be part of the same counter. As for the reference images you can change position, size and name of the ROI in the text fields or define them via drag and drop through the mouse button. You can iterate through the defined ROIs through the drop down box in the left upper area (2). To define new or delete ROIs use the corresponding button. Be careful: if you delete all ROIs, the tool will ask you to define minimum one manually in the config.ini . The order of the ROIs correspond to the position of the digit / analog pointer in the final readout number. The order can be changed with the button \"move Next\" / \"move Previous\" (3). In order to have a good recognition, the active ROI has two rectangles for alignment: The outer rectangle is the final size of the ROI More important is the inner smaller rectangle. This should tightly fit around the number itself in x- and in y-dimension. Maybe you need to unlock the aspect ratio to change x- and y-size independendly The line in the middle should go through the middle of the number (in case it is not moving in or out) To save the result push \"Save all to config.ini\" (4). Attention: Currently you have to reboot the ESP32 to take the changes in the config.ini to take place. This steps are running on the ESP32 directly. So be patient with the results.","title":"Graphical configuration"},{"location":"Graphical-configuration/#graphical-configuration","text":"","title":"Graphical configuration"},{"location":"Graphical-configuration/#general-remark","text":"to activate the changes, currently the device needs a restart after saving the changes. partially the commands needs processing on the ESP32 device. This is not very fast - so please be patient. too frequent http-request could result in a reboot of the ESP32 - normally this is not a problem as the server react about 30s later normally.","title":"General remark:"},{"location":"Graphical-configuration/#access-to-the-graphical-user-interface","text":"The graphical configuration mode can be reached via the \"Edit Configuration\" button in the main menue ( /index.html ):","title":"Access to the graphical user interface"},{"location":"Graphical-configuration/#overview-function","text":"Direct edit config.ini in text editor Configuration of image alignment a. Create of reference image b. Define alignment structures Definition of ROIs for digits and analog pointers Test the settings Back to main menue (\"index.html\")","title":"Overview function"},{"location":"Graphical-configuration/#1-edit-configini","text":"This is a text editor for the config.ini. Changes commited with the button on the lower left.","title":"1. Edit Config.ini"},{"location":"Graphical-configuration/#2a-create-reference-image","text":"The reference image is the basis for the coordination of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated. Attention: Updating the reference image, also means, that all alignment images and ROIs needs to be teached again. Therefore do this step only with caution. At first the current image is shown and no adjustment is possible. To reload the actual image push the button \"Show actual Reference\" (1). To define a new reference image push the button \"Create new Reference\" (2). Then the last taken raw image from the camera is loaded. If you want to update this, you can push the button \"Make new raw image (raw.jpg)\". If you need to mirror your image (e.g. mirror before camera) you can do this by selecting \"mirror image\". After loading the mirroring (in case checked) and the prerotation angle from the config.ini are applied. Then use the rough and fine adjustment to get the image straight aligned (3). If everything is done, you can save the result with \"Update Reference Image\" (4). If you have problems with reflections, you can turn the camera in a positions, where the reflection is at a position, where no important information is. To reduce the intensity of the reflection you can also a peace of felt (\"Filz\") as diffusior at the LED.","title":"2a. Create Reference Image"},{"location":"Graphical-configuration/#2b-define-alignment-references","text":"The alignment references are used to realign every taken image to the reference coordinates. Therefore two alignment structures are identified and the image is shifted and rotated according to their position with the target to be in exactly the same position as the reference image. The alignment structures needs to be unique and have a good contrast. As this is the most calculation intensive process, only a field of view of 40x40 pixels around the original coordinates are scanned. This can be adjusted manually in the config.ini (Parameter: SearchFieldX / SearchFieldY ). In the upper part of the settings you can control the position and size of the selected reference image. You can define the ROI in the image directly via drag and drop with the mouse. Go to the starting point, push the left mouse button and drag your ROI. You will a red rectangle with the newly selected position. To make this active, you need to push \"Update Reference\" (2). You can change between the two reference images with the drop down box (\"Reference 0\", \"Reference 1\"). In some cases it might be useful to use a reference with a higher contrast. This can be achieved by pushing \"Enhance Contrast\" (3). The result will be calculated on the ESP32 - so be a bit patient, before you see it active. To save the modified reference to the config.ini push finally \"Save to config.ini\".","title":"2b. Define Alignment References"},{"location":"Graphical-configuration/#3a3b-define-rois-for-image-recognition","text":"Here the regions of interest for the digital and analog pointers are defined. As both are done identically, here as an example the digital images are shown. First of all you can define more than one number, for example in a dual meter counter. This can be done with defining a \"Number\" (1). Analog and digital ROIs belonging to the same \"Number\" are considered to be part of the same counter. As for the reference images you can change position, size and name of the ROI in the text fields or define them via drag and drop through the mouse button. You can iterate through the defined ROIs through the drop down box in the left upper area (2). To define new or delete ROIs use the corresponding button. Be careful: if you delete all ROIs, the tool will ask you to define minimum one manually in the config.ini . The order of the ROIs correspond to the position of the digit / analog pointer in the final readout number. The order can be changed with the button \"move Next\" / \"move Previous\" (3). In order to have a good recognition, the active ROI has two rectangles for alignment: The outer rectangle is the final size of the ROI More important is the inner smaller rectangle. This should tightly fit around the number itself in x- and in y-dimension. Maybe you need to unlock the aspect ratio to change x- and y-size independendly The line in the middle should go through the middle of the number (in case it is not moving in or out) To save the result push \"Save all to config.ini\" (4). Attention: Currently you have to reboot the ESP32 to take the changes in the config.ini to take place. This steps are running on the ESP32 directly. So be patient with the results.","title":"3a./3b. Define ROIs for image recognition"},{"location":"Hardware-Compatibility/","text":"Hardware Compatibility See also https://github.com/jomjol/AI-on-the-edge-device/discussions/1732 General Remark: similar \"looking\" Board can have major differences: Processor Ram (Size! & Type) -> this Project needs at least 4MB RAM! Flashrom Camera Modules Onboard/External Antenna Quality of Components Manufacture Quality of the PCB and soldering Different Components \"Clone\" Components -> ESPxx etc. This can cause different Power Consumption, Power Requirements, compatibility issues, etc. Most manufacturers and sellers buy what's cheap today on the Asian markets. In the end, it looks like it is sometimes a trial and error approach which ESP32-CAM Module works reliable. Below you find some remarks and experiences from the community: ESP32 core itself Chip Version Image Status ESP32-D0WDQ6 (revision 1) okay PSRAM Labeling on PSRAM module Image Status IPUS IPS640LS0 1815XBGN okay AP MEMORY 6404L-3SOR 1040H 110089G okay AP MEMORY 6404L-3SQR 12205 150047G okay 8MB AP MEMORY 6404L-350R 1120A 130027G NOT OK PSRAM not accessible AP MEMORY 6404L-35QR 11208 130025G NOT OK PSRAM not accessible AP MEMORY 6404L-3SQR 13100 180026G NOT OK PSRAM not accessible AP MEMORY 6404L-3SQR 11207 130024G NOT OK PSRAM not accessible AP MEMORY 1604M-3SQR 0280A 070036G NOT OK 2MB only! ESP PSRAM64H 462021 1B00286 okay ESP PSRAM16M 302020 NOT OK 2MB only! ESP PSRAM16H 202020 050022G NOT OK 2MB only! OV2640 - Camera The experience with the camera only is based on single modules. It is well possible, that this module had a damage overall and other modules of the same type will work. Give it a try and report to me! Labeling on Flex-Connector Image Status TY-OV2 640-V2.0 okay DCX-OV2 640-V2 okay DC-26 40-V3 okay : 3x NOT OKAY: 1x ESP32 Modules Module Image Status ESP32CAM Different versions on the market! Especially the PSRAM is sometimes labeled wrong (Label: 4MB, Real: only 2 MB --> will not work!) okay with >=4 MB PSRAM! ESP32-S3-EYE No Flash LED, pins different used (e.g. LCD diskplay) NOT OKAY SD-Cards Due to the limited free available gpios (due to all the extensions needed like: camera, sd-card, LED-flash, ...) the sd card is connected in 1-wire mode. There are some cards, that are compatible with the esp32cam module for unknown reasons. It is observed, that smaller cards (up to 4 GB) tend to be more stable and larger cards have more problems. But quite some exceptions in the forums (4 GB cards not working, 16 G cards working like a charm). Devices known to work Please add links to stores of which you know they work: - https://arduino-projekte.info/produkt/esp32-cam-v2-integriertem-ch340-mit-ov2640-kamera-modul/ ? See https://github.com/jomjol/AI-on-the-edge-device/discussions/1041 - https://www.amazon.de/-/en/gp/product/B0B51CQ13R - https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE (27.12.2022) - ... Sandisk 2GB Micro SD Class 2 Sandisk 2GB AITRIP ESP32 and CAM ESP-32/CAM - Amazon US - Aideepen ESP32-CAM W BT Board ESP32-CAM-MB Micro USB to Serial Port CH-340G with OV2640 2MP Camera Module Dual Mode with Amazon US - Cloudisk 5Pack 4GB Micro SD Card 4 GB MicroSD Memory Card Class6 Weak Wifi The ESP32-CAM supports an external antenna. It requires some soldering skills but can improve the connection quality. See https://randomnerdtutorials.com/esp32-cam-connect-external-antenna/","title":"Hardware Compatibility"},{"location":"Hardware-Compatibility/#hardware-compatibility","text":"See also https://github.com/jomjol/AI-on-the-edge-device/discussions/1732 General Remark: similar \"looking\" Board can have major differences: Processor Ram (Size! & Type) -> this Project needs at least 4MB RAM! Flashrom Camera Modules Onboard/External Antenna Quality of Components Manufacture Quality of the PCB and soldering Different Components \"Clone\" Components -> ESPxx etc. This can cause different Power Consumption, Power Requirements, compatibility issues, etc. Most manufacturers and sellers buy what's cheap today on the Asian markets. In the end, it looks like it is sometimes a trial and error approach which ESP32-CAM Module works reliable. Below you find some remarks and experiences from the community:","title":"Hardware Compatibility"},{"location":"Hardware-Compatibility/#esp32-core-itself","text":"Chip Version Image Status ESP32-D0WDQ6 (revision 1) okay","title":"ESP32 core itself"},{"location":"Hardware-Compatibility/#psram","text":"Labeling on PSRAM module Image Status IPUS IPS640LS0 1815XBGN okay AP MEMORY 6404L-3SOR 1040H 110089G okay AP MEMORY 6404L-3SQR 12205 150047G okay 8MB AP MEMORY 6404L-350R 1120A 130027G NOT OK PSRAM not accessible AP MEMORY 6404L-35QR 11208 130025G NOT OK PSRAM not accessible AP MEMORY 6404L-3SQR 13100 180026G NOT OK PSRAM not accessible AP MEMORY 6404L-3SQR 11207 130024G NOT OK PSRAM not accessible AP MEMORY 1604M-3SQR 0280A 070036G NOT OK 2MB only! ESP PSRAM64H 462021 1B00286 okay ESP PSRAM16M 302020 NOT OK 2MB only! ESP PSRAM16H 202020 050022G NOT OK 2MB only!","title":"PSRAM"},{"location":"Hardware-Compatibility/#ov2640-camera","text":"The experience with the camera only is based on single modules. It is well possible, that this module had a damage overall and other modules of the same type will work. Give it a try and report to me! Labeling on Flex-Connector Image Status TY-OV2 640-V2.0 okay DCX-OV2 640-V2 okay DC-26 40-V3 okay : 3x NOT OKAY: 1x","title":"OV2640 - Camera"},{"location":"Hardware-Compatibility/#esp32-modules","text":"Module Image Status ESP32CAM Different versions on the market! Especially the PSRAM is sometimes labeled wrong (Label: 4MB, Real: only 2 MB --> will not work!) okay with >=4 MB PSRAM! ESP32-S3-EYE No Flash LED, pins different used (e.g. LCD diskplay) NOT OKAY","title":"ESP32 Modules"},{"location":"Hardware-Compatibility/#sd-cards","text":"Due to the limited free available gpios (due to all the extensions needed like: camera, sd-card, LED-flash, ...) the sd card is connected in 1-wire mode. There are some cards, that are compatible with the esp32cam module for unknown reasons. It is observed, that smaller cards (up to 4 GB) tend to be more stable and larger cards have more problems. But quite some exceptions in the forums (4 GB cards not working, 16 G cards working like a charm).","title":"SD-Cards"},{"location":"Hardware-Compatibility/#devices-known-to-work","text":"Please add links to stores of which you know they work: - https://arduino-projekte.info/produkt/esp32-cam-v2-integriertem-ch340-mit-ov2640-kamera-modul/ ? See https://github.com/jomjol/AI-on-the-edge-device/discussions/1041 - https://www.amazon.de/-/en/gp/product/B0B51CQ13R - https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE (27.12.2022) - ... Sandisk 2GB Micro SD Class 2 Sandisk 2GB AITRIP ESP32 and CAM ESP-32/CAM - Amazon US - Aideepen ESP32-CAM W BT Board ESP32-CAM-MB Micro USB to Serial Port CH-340G with OV2640 2MP Camera Module Dual Mode with Amazon US - Cloudisk 5Pack 4GB Micro SD Card 4 GB MicroSD Memory Card Class6","title":"Devices known to work"},{"location":"Hardware-Compatibility/#weak-wifi","text":"The ESP32-CAM supports an external antenna. It requires some soldering skills but can improve the connection quality. See https://randomnerdtutorials.com/esp32-cam-connect-external-antenna/","title":"Weak Wifi"},{"location":"Home/","text":"Welcome to the AI-on-the-edge-device! Artificial intelligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called edge computing . Here this edge computing is brought into a practical oriented example, where a AI network is implemented on a ESP32 device so: AI on the edge . Key features Tensorflow Lite (TFlite) integration - including easy to use wrapper Inline Image processing (feature detection, alignment, ROI extraction) Small and cheap device (3x4.5x2 cm\u00b3, < 10 EUR) camera and illumination integrated Web surface to administrate and control OTA-Interface to update directly through the web interface API for easy integration Idea Hardware Web interface Configuration Interface Have fun in studying the new possibilities and ideas This is about image recognition and digitalization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device. This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options. The task to be demonstrated here is a automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading. There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings. This project is a evolution of the water-meter-system-complete , which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD-Card as data storage. Functionality This systems implements several functions: water meter readout picture provider file server OTA functionality graphical configuration manager web server The details can be found here: [[Integrated Functions]]","title":"Welcome to the AI-on-the-edge-device!"},{"location":"Home/#welcome-to-the-ai-on-the-edge-device","text":"Artificial intelligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called edge computing . Here this edge computing is brought into a practical oriented example, where a AI network is implemented on a ESP32 device so: AI on the edge .","title":"Welcome to the AI-on-the-edge-device!"},{"location":"Home/#key-features","text":"Tensorflow Lite (TFlite) integration - including easy to use wrapper Inline Image processing (feature detection, alignment, ROI extraction) Small and cheap device (3x4.5x2 cm\u00b3, < 10 EUR) camera and illumination integrated Web surface to administrate and control OTA-Interface to update directly through the web interface API for easy integration","title":"Key features"},{"location":"Home/#idea","text":"","title":"Idea"},{"location":"Home/#hardware","text":"","title":"Hardware"},{"location":"Home/#web-interface","text":"","title":"Web interface"},{"location":"Home/#configuration-interface","text":"Have fun in studying the new possibilities and ideas This is about image recognition and digitalization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device. This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options. The task to be demonstrated here is a automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading. There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings. This project is a evolution of the water-meter-system-complete , which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD-Card as data storage.","title":"Configuration Interface"},{"location":"Home/#functionality","text":"This systems implements several functions: water meter readout picture provider file server OTA functionality graphical configuration manager web server The details can be found here: [[Integrated Functions]]","title":"Functionality"},{"location":"Install-a-rolling-%28unstable%29-release/","text":":bangbang: Living on the edge :bangbang: :bangbang: The branch rolling contains the latest version of the Firmware and the Web Interface. It is work in progress, don't expect it to work stable or be an improvement for your AI-on-the-edge-device! Also it might break the OTA Update and then require manual flashing over USB! :bangbang: Still here? Grab the latest build from https://github.com/jomjol/AI-on-the-edge-device/actions and proceed as following: 1. Pick the most top successful (green) build. 2. Download the firmware__extract_before_upload__only_needed_for_migration_from_11.2.0 and extract it (its a zip file). 3. Flash that binary as new firmware. 4. Download the html__only_needed_for_migration_from_11.2.0__2022-09-15_19-13-37__rolling_(042ff18) . It is also a zip file but you should not extract it! 5. Flash the zip file als html part. The filenames have changed, e.g. right now it is: * AI-on-the-edge-device__manual-setup__rolling_(4b23e0c) * AI-on-the-edge-device__remote-setup__rolling_(4b23e0c) * AI-on-the-edge-device__update__rolling_(4b23e0c) Github bot-reply Rolling Build has the following info at the moment: You can use the latest Automatic Build of the the rolling branch. It might already contain a fix for your issue. Pick the most top passing entry (it has a green circle with a tick in it), then scroll down to the Artifacts and download the file named update_*. So I do not know what the manual-setup and remote-setup are used for.","title":":bangbang: Living on the edge :bangbang:"},{"location":"Install-a-rolling-%28unstable%29-release/#bangbang-living-on-the-edge-bangbang","text":":bangbang: The branch rolling contains the latest version of the Firmware and the Web Interface. It is work in progress, don't expect it to work stable or be an improvement for your AI-on-the-edge-device! Also it might break the OTA Update and then require manual flashing over USB! :bangbang:","title":":bangbang: Living on the edge :bangbang:"},{"location":"Install-a-rolling-%28unstable%29-release/#still-here","text":"Grab the latest build from https://github.com/jomjol/AI-on-the-edge-device/actions and proceed as following: 1. Pick the most top successful (green) build. 2. Download the firmware__extract_before_upload__only_needed_for_migration_from_11.2.0 and extract it (its a zip file). 3. Flash that binary as new firmware. 4. Download the html__only_needed_for_migration_from_11.2.0__2022-09-15_19-13-37__rolling_(042ff18) . It is also a zip file but you should not extract it! 5. Flash the zip file als html part. The filenames have changed, e.g. right now it is: * AI-on-the-edge-device__manual-setup__rolling_(4b23e0c) * AI-on-the-edge-device__remote-setup__rolling_(4b23e0c) * AI-on-the-edge-device__update__rolling_(4b23e0c) Github bot-reply Rolling Build has the following info at the moment: You can use the latest Automatic Build of the the rolling branch. It might already contain a fix for your issue. Pick the most top passing entry (it has a green circle with a tick in it), then scroll down to the Artifacts and download the file named update_*. So I do not know what the manual-setup and remote-setup are used for.","title":"Still here?"},{"location":"Installation/","text":"Installation The installation requires multiple steps: 1. Get the right hardware and wire it up 1. Flash the firmware onto the ESP32 1. Write the data to the SD-Card 1. Insert the SD-Card into the ESP32 board 1. Power/restart it. Hardware ESP32-CAM OV2640 camera module SD-Card slot 4 MB PSRAM. It can be easily found on the typical internet stores, searching for ESP32-CAM for less than 10 EUR. USB->UART interface For first time flashing the firmware a USB -> UART connector is needed. Later firmware upgrades than can be flashed via OTA. Power supply For power supply a 5V source is needed. Most easily this can be done via an USB power supply. The power supply should support minimum 500mA. For buffering current peaks some users reported to use a large elco condensator like a 2200uF between ground and VCC. Attention: in several internet forums there are problems reported, in case the ESP32-CAM is only supplied with 3.3V. Housing A small 3D-printable example for a very small case can be found in Thingiverse here: https://www.thingiverse.com/thing:4571627 Attention : the focus of the OV2640 needs to be adjusted, as it is normally set from ~40cm to infinity. In order to get an image that is big enough, it needs to be changed to about 10cm. Therefore the sealing glue on the objective ring needs to be removed with a scalpel or sharp knife. Afterwards the objective can be rotated clockwise until the image is sharp again. Wiring Beside the 5V power supply, only for the first flashing a connection to the USB-UART connector, including a short cut of GPIO0 to GND for bootloader start. A example for wiring can be found here: It is also possible to use external LEDs for the illumination instead of the internal flash LED. This is described here: [[External-LED]] Firmware flashing Files Grab the firmware from the - Releases page (Stable, tested versions), or the - Automatically build development branch (experimental, untested versions). Please have a look on https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release first! You need: * partitions.bin * bootloader.bin * firmware.bin * html.zip Flashing There are several options to flash the firmware. Here three are described: 1. Web Installer There is a Web Installer available which will work right out of the web browser Edge and Chrome. You can access it with the following link: https://jomjol.github.io/AI-on-the-edge-device This is the preferred way for beginners as it also allows access to the USB Log: 2. Using the Flash Tool from Espressif The flashing of the firmware can be done with the \"Flash Download Tool\" from espressif, that can found here Download and extract the Flash tool, after starting choose \"Developer Mode\", then \"ESP32-DownloadTool\" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port. :bangbang: Attention :bangbang: if you reflashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash. But your ESP32 in bootloader mode and push start, then it will identify the board and you can configure the bin-configuration according to the following table: Filename Offset bootloader.bin 0x1000 partitions.bin 0x8000 firmware.bin 0x10000 Alternatively it can be directly flashed from the development environment - here PlatformIO. But this is rather for experienced users, as the whole development chain needs to be installed for compilation. 3. Using esptool in python directly For this you need a python environment (e.g. Anaconda in Win10). Here you need to install the esptool: pip install esptool Then connect the ESP32 with the USB-UART connector to the system, put it in bootmode and with the following command you can erase the flash and flash bootloader, partitions and firmware in two steps: esptool erase_flash esptool write_flash 0x01000 bootloader.bin 0x08000 partitions.bin 0x10000 firmware.bin Maybe you need to specify the COM-port if it is not detected by default. If the erase command throws the error A fatal error occurred: ESP32 ROM does not support function erase_flash. , your esptool might be too old, see https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/ With some Python installations this may not work and you\u2019ll receive an error, try python -m pip install esptool or pip3 install esptool Further recommendations can be found on the espressif webpage SD-Card The program expects a SD-Card installed with certain directory and file structure in order to work properly. For the first setup take the initial_esp32_setup_*.zip from the Release page and extract the content of the contained sd-card.zip onto your SD-Card. This must only be done once as further updates of the SD-Card are possible with the OTA Update. :bangbang: Attention :bangbang: Due to the limited availability of GPIOs (OV2640, Flash-Light, PSRAM & SD-Card) the communication mode to the SD card is limited to 1-line SD-Mode. It showed up, that this results in problems with very large SD-Cards (64GB, sometimes 32 GB) and some no name low cost SD-cards. There must be no partition table on the SD-card (no GPT, but only MBR for the single partition) Following setting are necessary for formating the SD-card: SINGLE PARTITION, MBR, FAT32 - 32K. NOT exFAT Some ESP32 devices share their SD-card and/or camera GPIOs with the pins for TX and RX. If you see errors like \u201cFailed to connect\u201d then your chip is probably not entering the bootloader properly. Remove the respective modules temporarily to free the GPIOs for flashing. You may find more information about troubleshooting on the homepage of Espressif . The ESP32 indicates problems with the SD card during startup with a fast not ending blinking. In this case, please try another SD card. WLAN The access to the WLAN is configured in the \"wlan.ini\" directly on the root directory of the sd-card. Just write the corresponding SSID and password before the startup of the ESP32. This file is hidden from external access (e.g. via Filemanager) to protect the password. After power on the connection status is indicated by 3x blinking of the red on board LED. WLAN-Status indication: 5 x fast blinking (< 1 second): connection still pending 3 x slow blinking (1 second on/off): WLAN connection established It is normal that at first one or two times a pending connection is indicated.","title":"Installation"},{"location":"Installation/#installation","text":"The installation requires multiple steps: 1. Get the right hardware and wire it up 1. Flash the firmware onto the ESP32 1. Write the data to the SD-Card 1. Insert the SD-Card into the ESP32 board 1. Power/restart it.","title":"Installation"},{"location":"Installation/#hardware","text":"","title":"Hardware"},{"location":"Installation/#esp32-cam","text":"OV2640 camera module SD-Card slot 4 MB PSRAM. It can be easily found on the typical internet stores, searching for ESP32-CAM for less than 10 EUR.","title":"ESP32-CAM"},{"location":"Installation/#usb-uart-interface","text":"For first time flashing the firmware a USB -> UART connector is needed. Later firmware upgrades than can be flashed via OTA.","title":"USB->UART interface"},{"location":"Installation/#power-supply","text":"For power supply a 5V source is needed. Most easily this can be done via an USB power supply. The power supply should support minimum 500mA. For buffering current peaks some users reported to use a large elco condensator like a 2200uF between ground and VCC. Attention: in several internet forums there are problems reported, in case the ESP32-CAM is only supplied with 3.3V.","title":"Power supply"},{"location":"Installation/#housing","text":"A small 3D-printable example for a very small case can be found in Thingiverse here: https://www.thingiverse.com/thing:4571627 Attention : the focus of the OV2640 needs to be adjusted, as it is normally set from ~40cm to infinity. In order to get an image that is big enough, it needs to be changed to about 10cm. Therefore the sealing glue on the objective ring needs to be removed with a scalpel or sharp knife. Afterwards the objective can be rotated clockwise until the image is sharp again.","title":"Housing"},{"location":"Installation/#wiring","text":"Beside the 5V power supply, only for the first flashing a connection to the USB-UART connector, including a short cut of GPIO0 to GND for bootloader start. A example for wiring can be found here: It is also possible to use external LEDs for the illumination instead of the internal flash LED. This is described here: [[External-LED]]","title":"Wiring"},{"location":"Installation/#firmware-flashing","text":"","title":"Firmware flashing"},{"location":"Installation/#files","text":"Grab the firmware from the - Releases page (Stable, tested versions), or the - Automatically build development branch (experimental, untested versions). Please have a look on https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release first! You need: * partitions.bin * bootloader.bin * firmware.bin * html.zip","title":"Files"},{"location":"Installation/#flashing","text":"There are several options to flash the firmware. Here three are described:","title":"Flashing"},{"location":"Installation/#1-web-installer","text":"There is a Web Installer available which will work right out of the web browser Edge and Chrome. You can access it with the following link: https://jomjol.github.io/AI-on-the-edge-device This is the preferred way for beginners as it also allows access to the USB Log:","title":"1. Web Installer"},{"location":"Installation/#2-using-the-flash-tool-from-espressif","text":"The flashing of the firmware can be done with the \"Flash Download Tool\" from espressif, that can found here Download and extract the Flash tool, after starting choose \"Developer Mode\", then \"ESP32-DownloadTool\" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port. :bangbang: Attention :bangbang: if you reflashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash. But your ESP32 in bootloader mode and push start, then it will identify the board and you can configure the bin-configuration according to the following table: Filename Offset bootloader.bin 0x1000 partitions.bin 0x8000 firmware.bin 0x10000 Alternatively it can be directly flashed from the development environment - here PlatformIO. But this is rather for experienced users, as the whole development chain needs to be installed for compilation.","title":"2. Using the Flash Tool from Espressif"},{"location":"Installation/#3-using-esptool-in-python-directly","text":"For this you need a python environment (e.g. Anaconda in Win10). Here you need to install the esptool: pip install esptool Then connect the ESP32 with the USB-UART connector to the system, put it in bootmode and with the following command you can erase the flash and flash bootloader, partitions and firmware in two steps: esptool erase_flash esptool write_flash 0x01000 bootloader.bin 0x08000 partitions.bin 0x10000 firmware.bin Maybe you need to specify the COM-port if it is not detected by default. If the erase command throws the error A fatal error occurred: ESP32 ROM does not support function erase_flash. , your esptool might be too old, see https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/ With some Python installations this may not work and you\u2019ll receive an error, try python -m pip install esptool or pip3 install esptool Further recommendations can be found on the espressif webpage","title":"3. Using esptool in python directly"},{"location":"Installation/#sd-card","text":"The program expects a SD-Card installed with certain directory and file structure in order to work properly. For the first setup take the initial_esp32_setup_*.zip from the Release page and extract the content of the contained sd-card.zip onto your SD-Card. This must only be done once as further updates of the SD-Card are possible with the OTA Update.","title":"SD-Card"},{"location":"Installation/#bangbang-attention-bangbang","text":"Due to the limited availability of GPIOs (OV2640, Flash-Light, PSRAM & SD-Card) the communication mode to the SD card is limited to 1-line SD-Mode. It showed up, that this results in problems with very large SD-Cards (64GB, sometimes 32 GB) and some no name low cost SD-cards. There must be no partition table on the SD-card (no GPT, but only MBR for the single partition) Following setting are necessary for formating the SD-card: SINGLE PARTITION, MBR, FAT32 - 32K. NOT exFAT Some ESP32 devices share their SD-card and/or camera GPIOs with the pins for TX and RX. If you see errors like \u201cFailed to connect\u201d then your chip is probably not entering the bootloader properly. Remove the respective modules temporarily to free the GPIOs for flashing. You may find more information about troubleshooting on the homepage of Espressif . The ESP32 indicates problems with the SD card during startup with a fast not ending blinking. In this case, please try another SD card.","title":":bangbang: Attention :bangbang:"},{"location":"Installation/#wlan","text":"The access to the WLAN is configured in the \"wlan.ini\" directly on the root directory of the sd-card. Just write the corresponding SSID and password before the startup of the ESP32. This file is hidden from external access (e.g. via Filemanager) to protect the password. After power on the connection status is indicated by 3x blinking of the red on board LED. WLAN-Status indication: 5 x fast blinking (< 1 second): connection still pending 3 x slow blinking (1 second on/off): WLAN connection established It is normal that at first one or two times a pending connection is indicated.","title":"WLAN"},{"location":"Integrated%20Functions/","text":"wasserzaehler http://IP-ESP32/wasserzaehler.html This is the main purpose of this device. It returns the converted image as a number with different option. The output can be modified either by the configuration parameters or by HTML parameters. Details can be found here: tbd Picture Server http://IP-ESP32/capture http://IP-ESP32/capture_with_flashlight This is a implementation of the camera interface of https://github.com/jomjol/water-meter-picture-provider It is fully compatible including the parameters ( quality =..., size=... ) . This allows to use this ESP32 system in parallel to the corresponding docker system: https://github.com/jomjol/water-meter-system-complete, from which this project is basically the successor. File server Access: http://IP-ESP32/fileserver/ Simple file server, that allows viewing, upload, download and deleting of single files of the SD-card content. The usage is self explaining. The file path or file can directly be accessed by the URL after file server. Example for config.ini : http://IP-ESP/fileserver/config/config.ini OTA-Update http://IP-ESP32/ota?file=firmware.bin Here an over the air update can be triggered. The firmware file is expected to be located in the sub directory /firmware/ and can be uploaded with the file server. By the parameter file the name of the firmware file needs to be given. Reboot http://IP-ESP32/reboot A reboot with a delay of 5 seconds is initiated, e.g. after firmware update. ATTENTION : currently this is not working properly - hardware power off is needed instead. Work in progress! Simple Web Server If none of the above URLs are fitting, a very simple web server checks, if there is a fitting file from the sub directory /html This can be used for a very simple web server for information or simple web pages.","title":"Integrated Functions"},{"location":"Integrated%20Functions/#wasserzaehler","text":"http://IP-ESP32/wasserzaehler.html This is the main purpose of this device. It returns the converted image as a number with different option. The output can be modified either by the configuration parameters or by HTML parameters. Details can be found here: tbd","title":"wasserzaehler"},{"location":"Integrated%20Functions/#picture-server","text":"http://IP-ESP32/capture http://IP-ESP32/capture_with_flashlight This is a implementation of the camera interface of https://github.com/jomjol/water-meter-picture-provider It is fully compatible including the parameters ( quality =..., size=... ) . This allows to use this ESP32 system in parallel to the corresponding docker system: https://github.com/jomjol/water-meter-system-complete, from which this project is basically the successor.","title":"Picture Server"},{"location":"Integrated%20Functions/#file-server","text":"Access: http://IP-ESP32/fileserver/ Simple file server, that allows viewing, upload, download and deleting of single files of the SD-card content. The usage is self explaining. The file path or file can directly be accessed by the URL after file server. Example for config.ini : http://IP-ESP/fileserver/config/config.ini","title":"File server"},{"location":"Integrated%20Functions/#ota-update","text":"http://IP-ESP32/ota?file=firmware.bin Here an over the air update can be triggered. The firmware file is expected to be located in the sub directory /firmware/ and can be uploaded with the file server. By the parameter file the name of the firmware file needs to be given.","title":"OTA-Update"},{"location":"Integrated%20Functions/#reboot","text":"http://IP-ESP32/reboot A reboot with a delay of 5 seconds is initiated, e.g. after firmware update. ATTENTION : currently this is not working properly - hardware power off is needed instead. Work in progress!","title":"Reboot"},{"location":"Integrated%20Functions/#simple-web-server","text":"If none of the above URLs are fitting, a very simple web server checks, if there is a fitting file from the sub directory /html This can be used for a very simple web server for information or simple web pages.","title":"Simple Web Server"},{"location":"Integration-Home-Assistant/","text":"Integration into Home Assistant There are 3 ways to get the data into your Home Assistant: 1. Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery) 1. Using MQTT (Manually Setup Entities) 2. Using REST calls The first one is the easier way if you already have MQTT in use. Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery) :bangbang: This feature will be available with the next release! Starting with Version >12.0.1 , AI-on-the-edge-devices support Homeassistant Discovery. 1. Check here to learn more about it and how to enable it in Homeassistant. 1. You also have to enable it in the MQTT settings of your device: ![grafik](https://user-images.githubusercontent.com/1783586/199350781-e2a59eeb-b5bb-407b-9c0d-2aafab50daab.png) Make sure to select the right Meter Type to get the right units! On the next start of the device, it will send discovery topics and Homeassistant should pick them up and show them under Settings > Integrations > MQTT : Using MQTT (Manually Setup Entities) First make sure with an MQTT client (for example MQTT Explorer ) that MQTT works as expected and to get a list of the available topics! Then add a sensor for each property: mqtt: sensor: - state_topic: \"wasserzaehler/main/value\" name: \"Watermeter Value\" unique_id: watermeter_value unit_of_measurement: 'm\u00b3' state_class: total_increasing device_class: water # Needs Homeassistant 2022.11! icon: 'mdi:water-pump' availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost - state_topic: \"wasserzaehler/main/rate\" name: \"Watermeter Rate\" unique_id: watermeter_rate unit_of_measurement: 'm\u00b3/min' state_class: measurement device_class: water # Needs Homeassistant 2022.11! icon: 'mdi:water-pump' availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost - state_topic: \"wasserzaehler/main/error\" name: \"Watermeter Error\" unique_id: watermeter_error icon: \"mdi:water-alert\" availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost - state_topic: \"wasserzaehler/uptime\" name: \"Watermeter Uptime\" unique_id: watermeter_uptime unit_of_measurement: 's' state_class: measurement device_class: duration entity_category: diagnostic icon: \"mdi:timer-outline\" availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost If you run the discovery once, you can also extract the information from there (MQTT Info, untested): mqtt: # Extracted form the Discovery but untested! sensor: - name: Value unique_id: wasserzaehler-main_value icon: mdi:gauge state_topic: wasserzaehler/main/value unit_of_measurement: m\u00b3 device_class: water state_class: total_increasing availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost If you want to convert the m\u00b3 to l , use a template sensor: template: - sensor: - name: \"Watermeter in l\" unique_id: watermeter_in_l icon: \"mdi:gauge\" state: \"{{ states('sensor.watermeter_value')|float(default=0) * 1000 }}\" # Convert 1 m3 => 1000 l unit_of_measurement: l availability: \"{{ states('sensor.watermeter_value') not in ['unknown', 'unavailable', 'none'] }}\" If you you want to have the consumption per day, you can use an Utility Meter . it is a helper and can be used to reset the total increasing values once a day utility_meter: utility_meter_gas_per_day: source: sensor.gasmeter_value cycle: daily utility_meter_water_per_day: source: sensor.watermeter_value cycle: daily Note that you also can add it using the UI. Examples Statistics Graph Creating Statistics Graphs (eg. usage per day) is easy using the Energy Dashboard : Note that there seems to be a bug in the graph, see https://github.com/home-assistant/frontend/issues/13995! InfluxDb Graphs If you have setup InfluxDB already, it is also possible to fetch statistics from there, eg. daily usage: from(bucket: \"HomeAssistant\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r[\"entity_id\"] == \"wasserverbrauch_tag\") |> filter(fn: (r) => r[\"_field\"] == \"value\") |> timeShift(duration: -1d) |> aggregateWindow(every: 1d, fn: max, createEmpty: false) |> yield(name: \"mean\") Using REST When using REST, Home Assistant has to periodically call an URL on the ESP32 which in return provides the requested data. See REST API for a list of available URLs. The most practical one is the json entrypoint which provides the most relevant data JSON formated: http:///json This would return: { \"main\": { \"value\": \"512.3020\", \"raw\": \"0512.3020\", \"error\": \"no error\", \"rate\": 0.000000, \"timestamp\": \"2022-10-02T20:32:06\" [..] } } To do such a REST call, you need to create a REST sensor: sensor: - platform: rest name: \"Gasmeter JSON\" resource: http:///json json_attributes: - main value_template: '{{ value_json.value }}' headers: Content-Type: application/json scan_interval: 60 template: sensor: - name: \"Gasmeter Value from JSON\" unique_id: gas_meter_value_from_json state: \"{{ state_attr('sensor.gasmeter_json','main')['value'] }}\" unit_of_measurement: 'm\u00b3' - name: \"Watermeter Value from JSON\" unique_id: water_meter_value_from_json state: >- {{ state_attr('sensor.watermeter_json','main')['value'] | float }} unit_of_measurement: 'm\u00b3' device_class: water state_class: total_increasing icon: mdi:gauge See also https://community.home-assistant.io/t/rest-sensor-nested-json/243420/9 Photo REST can also be used to show the photo of the last round: To access it, use http:///img_tmp/alg_roi.jpg resp http:///img_tmp/raw.jpg .","title":"Integration into Home Assistant"},{"location":"Integration-Home-Assistant/#integration-into-home-assistant","text":"There are 3 ways to get the data into your Home Assistant: 1. Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery) 1. Using MQTT (Manually Setup Entities) 2. Using REST calls The first one is the easier way if you already have MQTT in use.","title":"Integration into Home Assistant"},{"location":"Integration-Home-Assistant/#using-mqtt-automatically-setup-entities-using-homeassistant-mqtt-discovery","text":":bangbang: This feature will be available with the next release! Starting with Version >12.0.1 , AI-on-the-edge-devices support Homeassistant Discovery. 1. Check here to learn more about it and how to enable it in Homeassistant. 1. You also have to enable it in the MQTT settings of your device: ![grafik](https://user-images.githubusercontent.com/1783586/199350781-e2a59eeb-b5bb-407b-9c0d-2aafab50daab.png) Make sure to select the right Meter Type to get the right units! On the next start of the device, it will send discovery topics and Homeassistant should pick them up and show them under Settings > Integrations > MQTT :","title":"Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery)"},{"location":"Integration-Home-Assistant/#using-mqtt-manually-setup-entities","text":"First make sure with an MQTT client (for example MQTT Explorer ) that MQTT works as expected and to get a list of the available topics! Then add a sensor for each property: mqtt: sensor: - state_topic: \"wasserzaehler/main/value\" name: \"Watermeter Value\" unique_id: watermeter_value unit_of_measurement: 'm\u00b3' state_class: total_increasing device_class: water # Needs Homeassistant 2022.11! icon: 'mdi:water-pump' availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost - state_topic: \"wasserzaehler/main/rate\" name: \"Watermeter Rate\" unique_id: watermeter_rate unit_of_measurement: 'm\u00b3/min' state_class: measurement device_class: water # Needs Homeassistant 2022.11! icon: 'mdi:water-pump' availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost - state_topic: \"wasserzaehler/main/error\" name: \"Watermeter Error\" unique_id: watermeter_error icon: \"mdi:water-alert\" availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost - state_topic: \"wasserzaehler/uptime\" name: \"Watermeter Uptime\" unique_id: watermeter_uptime unit_of_measurement: 's' state_class: measurement device_class: duration entity_category: diagnostic icon: \"mdi:timer-outline\" availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost If you run the discovery once, you can also extract the information from there (MQTT Info, untested): mqtt: # Extracted form the Discovery but untested! sensor: - name: Value unique_id: wasserzaehler-main_value icon: mdi:gauge state_topic: wasserzaehler/main/value unit_of_measurement: m\u00b3 device_class: water state_class: total_increasing availability_topic: wasserzaehler/connection payload_available: connected payload_not_available: connection lost If you want to convert the m\u00b3 to l , use a template sensor: template: - sensor: - name: \"Watermeter in l\" unique_id: watermeter_in_l icon: \"mdi:gauge\" state: \"{{ states('sensor.watermeter_value')|float(default=0) * 1000 }}\" # Convert 1 m3 => 1000 l unit_of_measurement: l availability: \"{{ states('sensor.watermeter_value') not in ['unknown', 'unavailable', 'none'] }}\" If you you want to have the consumption per day, you can use an Utility Meter . it is a helper and can be used to reset the total increasing values once a day utility_meter: utility_meter_gas_per_day: source: sensor.gasmeter_value cycle: daily utility_meter_water_per_day: source: sensor.watermeter_value cycle: daily Note that you also can add it using the UI.","title":"Using MQTT (Manually Setup Entities)"},{"location":"Integration-Home-Assistant/#examples","text":"","title":"Examples"},{"location":"Integration-Home-Assistant/#statistics-graph","text":"Creating Statistics Graphs (eg. usage per day) is easy using the Energy Dashboard : Note that there seems to be a bug in the graph, see https://github.com/home-assistant/frontend/issues/13995!","title":"Statistics Graph"},{"location":"Integration-Home-Assistant/#influxdb-graphs","text":"If you have setup InfluxDB already, it is also possible to fetch statistics from there, eg. daily usage: from(bucket: \"HomeAssistant\") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r[\"entity_id\"] == \"wasserverbrauch_tag\") |> filter(fn: (r) => r[\"_field\"] == \"value\") |> timeShift(duration: -1d) |> aggregateWindow(every: 1d, fn: max, createEmpty: false) |> yield(name: \"mean\")","title":"InfluxDb Graphs"},{"location":"Integration-Home-Assistant/#using-rest","text":"When using REST, Home Assistant has to periodically call an URL on the ESP32 which in return provides the requested data. See REST API for a list of available URLs. The most practical one is the json entrypoint which provides the most relevant data JSON formated: http:///json This would return: { \"main\": { \"value\": \"512.3020\", \"raw\": \"0512.3020\", \"error\": \"no error\", \"rate\": 0.000000, \"timestamp\": \"2022-10-02T20:32:06\" [..] } } To do such a REST call, you need to create a REST sensor: sensor: - platform: rest name: \"Gasmeter JSON\" resource: http:///json json_attributes: - main value_template: '{{ value_json.value }}' headers: Content-Type: application/json scan_interval: 60 template: sensor: - name: \"Gasmeter Value from JSON\" unique_id: gas_meter_value_from_json state: \"{{ state_attr('sensor.gasmeter_json','main')['value'] }}\" unit_of_measurement: 'm\u00b3' - name: \"Watermeter Value from JSON\" unique_id: water_meter_value_from_json state: >- {{ state_attr('sensor.watermeter_json','main')['value'] | float }} unit_of_measurement: 'm\u00b3' device_class: water state_class: total_increasing icon: mdi:gauge See also https://community.home-assistant.io/t/rest-sensor-nested-json/243420/9","title":"Using REST"},{"location":"Integration-Home-Assistant/#photo","text":"REST can also be used to show the photo of the last round: To access it, use http:///img_tmp/alg_roi.jpg resp http:///img_tmp/raw.jpg .","title":"Photo"},{"location":"Learn-models-with-your-own-images/","text":"If your device has new, different digits and the existing models don't recognize them well, you can collect your own images and train the model. But before you do this, please check if your type really is not contained yet in the training data, see digits resp. pointers for an overview of images used for the training The neural network is trained on base of a set of images, that have been collected over time. If your digits are included or at least very similar to included images, the chance is very high that the neural network is working fine for you as well. The neural network configuration is stored in the TensorFlow Lite format as filename.tfl or filename.tflite in the /config directory. It can be updated by uploading the new file and activating it on the configuration page or in the config file /config/config.ini . In order to incorporate new digits a training set of images is required. The training images needs to be collected in the final setup with the help of the Digits or Analog log settings (not to be confused with the Data or Debug log). Enable the logging of the images on the configuration page or in the config file /config/config.ini : Now wait, until you have an image of each digit of every type on the SD card. Ideally remove the SD card from the camera and search for two to three images of each digit ( not more! :-) ). The format can be jpg. Collecting images for dig-class100/dig-cont/ana-class100 Collectmeterdigits and collectmeteranalog helps you to collect the images easily. Read the project readme for detailed instructions. Train the model For training the model you will need a python and Jupyter installation. All current labeled images you can find under ziffer_sortiert_raw dig-class11 models (digits) Fork and checkout neural-network-digital-counter-readout . Install all requirements for running the notebooks. pip install -r requirements.txt Put your labeled images into /ziffer_sortiert_raw folder and run Image_Preparation.ipynb Train_CNN_Digital-Readout-Small-v2.ipynb It creates a dig-class11_xxxx_s2.tflite model, you can upload to the config folder on your device and test it. dig-class100 / dig-cont models (digits) Fork and checkout neural-network-analog-needle-readout . All labeled images you can find under Images Install all requirements for running the notebooks. pip install -r requirements.txt Put your labeled images into images/collected/// Run dig-class100-s2.ipynb . The model to upload to your device you can find under '/output'. ana-class100/ana-cont models (analog pointers) Fork and checkout neural-network-analog-needle-readout . All labeled images you can find under data_raw_all Install all requirements for running the notebooks. pip install -r requirements.txt Put your labeled images into images/collected/// After every adding of images you need to run Image_Preparation.ipynb before you train the models. Run Train_CNN_Analog-Readout_100-Small1_Dropout.ipynb and/or Train_CNN_Analog-Readout_Version-Small2.ipynb . The model to upload to your device you can find in the project folder. Share your images If the results are good you can share the images as pull-request. Please images only! If you not able to create a pull request or don't know what it is, open an issue and put the zipped images in it. Images can be rejected if As same as dig-class11 collected, more than 1000 images of your device are really to much. images are not good configured (ROIs) will be rejected. It reduces the accuracy of the networks. Images with too little focus will be rejected. Images with too much blur are rejected. Our models are to small to recognize everything in any quality. So we use only images of medium or good quality.","title":"Learn models with your own images"},{"location":"Learn-models-with-your-own-images/#collecting-images-for-dig-class100dig-contana-class100","text":"Collectmeterdigits and collectmeteranalog helps you to collect the images easily. Read the project readme for detailed instructions.","title":"Collecting images for dig-class100/dig-cont/ana-class100"},{"location":"Learn-models-with-your-own-images/#train-the-model","text":"For training the model you will need a python and Jupyter installation. All current labeled images you can find under ziffer_sortiert_raw","title":"Train the model"},{"location":"Learn-models-with-your-own-images/#dig-class11-models-digits","text":"Fork and checkout neural-network-digital-counter-readout . Install all requirements for running the notebooks. pip install -r requirements.txt Put your labeled images into /ziffer_sortiert_raw folder and run Image_Preparation.ipynb Train_CNN_Digital-Readout-Small-v2.ipynb It creates a dig-class11_xxxx_s2.tflite model, you can upload to the config folder on your device and test it.","title":"dig-class11 models (digits)"},{"location":"Learn-models-with-your-own-images/#dig-class100-dig-cont-models-digits","text":"Fork and checkout neural-network-analog-needle-readout . All labeled images you can find under Images Install all requirements for running the notebooks. pip install -r requirements.txt Put your labeled images into images/collected/// Run dig-class100-s2.ipynb . The model to upload to your device you can find under '/output'.","title":"dig-class100 / dig-cont models (digits)"},{"location":"Learn-models-with-your-own-images/#ana-class100ana-cont-models-analog-pointers","text":"Fork and checkout neural-network-analog-needle-readout . All labeled images you can find under data_raw_all Install all requirements for running the notebooks. pip install -r requirements.txt Put your labeled images into images/collected/// After every adding of images you need to run Image_Preparation.ipynb before you train the models. Run Train_CNN_Analog-Readout_100-Small1_Dropout.ipynb and/or Train_CNN_Analog-Readout_Version-Small2.ipynb . The model to upload to your device you can find in the project folder.","title":"ana-class100/ana-cont models (analog pointers)"},{"location":"Learn-models-with-your-own-images/#share-your-images","text":"If the results are good you can share the images as pull-request. Please images only! If you not able to create a pull request or don't know what it is, open an issue and put the zipped images in it.","title":"Share your images"},{"location":"Learn-models-with-your-own-images/#images-can-be-rejected-if","text":"As same as dig-class11 collected, more than 1000 images of your device are really to much. images are not good configured (ROIs) will be rejected. It reduces the accuracy of the networks. Images with too little focus will be rejected. Images with too much blur are rejected. Our models are to small to recognize everything in any quality. So we use only images of medium or good quality.","title":"Images can be rejected if"},{"location":"MQTT-API/","text":"General Information The device is capable to register to a MQTT broker to publish data and subscribe to specific topics. The MQTT service has to be enabled and configured properly in the device configuration via web interface ( Settings -> Configuration -> section MQTT ) The following parameters have to be defined: * URI * MainTopic (optional, if not set, the hostname is used) * ClientID (optional, if not set, AIOTED- + the MAC address gets used to make sure the ID is unique) * User (optional) * Password (optional) * RetainFlag (optional) Published topics Status MainTopic /{status topic}, e.g. watermeter/status * ### Connection Interval MAC IP Hostname Uptime FreeMem WifiRSSI CPUTemp Status Result MainTopic /{NumberName}/{result topic}, e.g. watermeter/main/value Value Raw Error JSON Rate Rate_per_time_unit The time Unit gets set with the Homeassistant Discovery, eg. h or m (minutes) Rate_per_digitalization_round The interval defines when the next round gets triggered Changeabsolut Timestamp JSON All relevant results in JSON syntax GPIO MainTopic /{GPIO topic}, e.g. watermeter/GPIO/GPIO12 GPIO/GPIO{PinNumber} Depending on device configuration ( Settings --> Configuration --> Chapter GPIO ) Subscibed topics MainTopic /{subscribed topic}, e.g. watermeter/ctrl/flow_start Control Ctrl/flow_start Trigger a flow start by publishing to this topic (any character, length > 0) GPIO/GPIO{PinNumber} Depending on device configuration ( Settings --> Configuration --> Chapter GPIO )","title":"General Information"},{"location":"MQTT-API/#general-information","text":"The device is capable to register to a MQTT broker to publish data and subscribe to specific topics. The MQTT service has to be enabled and configured properly in the device configuration via web interface ( Settings -> Configuration -> section MQTT ) The following parameters have to be defined: * URI * MainTopic (optional, if not set, the hostname is used) * ClientID (optional, if not set, AIOTED- + the MAC address gets used to make sure the ID is unique) * User (optional) * Password (optional) * RetainFlag (optional)","title":"General Information"},{"location":"MQTT-API/#published-topics","text":"","title":"Published topics"},{"location":"MQTT-API/#status","text":"MainTopic /{status topic}, e.g. watermeter/status * ### Connection","title":"Status"},{"location":"MQTT-API/#interval","text":"","title":"Interval"},{"location":"MQTT-API/#mac","text":"","title":"MAC"},{"location":"MQTT-API/#ip","text":"","title":"IP"},{"location":"MQTT-API/#hostname","text":"","title":"Hostname"},{"location":"MQTT-API/#uptime","text":"","title":"Uptime"},{"location":"MQTT-API/#freemem","text":"","title":"FreeMem"},{"location":"MQTT-API/#wifirssi","text":"","title":"WifiRSSI"},{"location":"MQTT-API/#cputemp","text":"","title":"CPUTemp"},{"location":"MQTT-API/#status_1","text":"","title":"Status"},{"location":"MQTT-API/#result","text":"MainTopic /{NumberName}/{result topic}, e.g. watermeter/main/value","title":"Result"},{"location":"MQTT-API/#value","text":"","title":"Value"},{"location":"MQTT-API/#raw","text":"","title":"Raw"},{"location":"MQTT-API/#error","text":"","title":"Error"},{"location":"MQTT-API/#json","text":"","title":"JSON"},{"location":"MQTT-API/#rate","text":"","title":"Rate"},{"location":"MQTT-API/#rate_per_time_unit","text":"The time Unit gets set with the Homeassistant Discovery, eg. h or m (minutes)","title":"Rate_per_time_unit"},{"location":"MQTT-API/#rate_per_digitalization_round","text":"The interval defines when the next round gets triggered","title":"Rate_per_digitalization_round"},{"location":"MQTT-API/#changeabsolut","text":"","title":"Changeabsolut"},{"location":"MQTT-API/#timestamp","text":"","title":"Timestamp"},{"location":"MQTT-API/#json_1","text":"All relevant results in JSON syntax","title":"JSON"},{"location":"MQTT-API/#gpio","text":"MainTopic /{GPIO topic}, e.g. watermeter/GPIO/GPIO12","title":"GPIO"},{"location":"MQTT-API/#gpiogpiopinnumber","text":"Depending on device configuration ( Settings --> Configuration --> Chapter GPIO )","title":"GPIO/GPIO{PinNumber}"},{"location":"MQTT-API/#subscibed-topics","text":"MainTopic /{subscribed topic}, e.g. watermeter/ctrl/flow_start","title":"Subscibed topics"},{"location":"MQTT-API/#control","text":"","title":"Control"},{"location":"MQTT-API/#ctrlflow_start","text":"Trigger a flow start by publishing to this topic (any character, length > 0)","title":"Ctrl/flow_start"},{"location":"MQTT-API/#gpiogpiopinnumber_1","text":"Depending on device configuration ( Settings --> Configuration --> Chapter GPIO )","title":"GPIO/GPIO{PinNumber}"},{"location":"Migrate-Old-Config-To-New-Config/","text":"Migration from water-meter \u201eold\u201c to water-meter \u201cAI-on-the-edge-device\u201d There are only some few steps necessary to migrate your old system to the new one. Please follow the following steps: 1. Follow the installation guide to flash the ESP32CAM and prepare a SD-Card with the content of the master 2. Save the following files from the old Docker system on your PC: Reference Points 1-3 (only 2 needed) Config.ini 3. Copy Reference Points 1-3 onto the new water-meter system (Directory /config ) Please note only two Reference Points are supported in the new system. 4. Open new config.ini File: Insert from the old Config.ini file [alignment] and [alignment.ref0] and [alignment.ref1] section the two Ref x and y position and the initial_rotation_angle= 123 into the new Config.ini File, e.g.: Old: [alignment.ref0] image=./config/RB01_65x65.jpg pos_x=28 pos_y=63 [alignment.ref1] image=./config/RB02_50x35.jpg pos_x=497 pos_y=127 [alignment] initial_rotation_angle=180 New: [Alignment] InitalRotate=180 /config/RB01_65x65.jpg 28, 63 /config/RB02_50x35.jpg 497, 127 SearchFieldX = 20 SearchFieldY = 20 5. Insert the old Digit Values into the new Config.ini File, e.g.: Old: [Digital_Digit.ziffer1] pos_x=265 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer2] pos_x=310 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer3] pos_x=354 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer4] pos_x=399 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer5] pos_x=445 pos_y=115 dx=28 dy=51 New: [Digits] Model=/config/dig0630s3.tflite ;LogImageLocation = /log/digit ModelInputSize 20, 32 digit1, 265, 117, 28, 51 digit2, 310, 117, 28, 51 digit3, 354, 117, 28, 51 digit4, 399, 117, 28, 51 digit5, 445, 115, 28, 51 6. Make sure that you have the same quality and size settings as in your old Config.ini In the old configuration this was coded in the html-string for the image source: Old: URLImageSource=http://IP-ADRESS/capture_with_flashlight?quality=5&size=VGA Default was Quality=5 and VGA. New: ImageQuality = 5 ImageSize = VGA 7. Repeat the same for the analog section 8. Insert your SSID and Password into the new wlan.ini File 9. Compare and edit [ConsistencyCheck] Section with new [PostProcessing] Section 10. Save new config.ini File in the new System. 11. Restart the system. 12. After the first start set manually the PreValue in the new system","title":"Migration from water-meter \u201eold\u201c to water-meter \u201cAI-on-the-edge-device\u201d"},{"location":"Migrate-Old-Config-To-New-Config/#migration-from-water-meter-old-to-water-meter-ai-on-the-edge-device","text":"There are only some few steps necessary to migrate your old system to the new one. Please follow the following steps:","title":"Migration from water-meter \u201eold\u201c to water-meter \u201cAI-on-the-edge-device\u201d"},{"location":"Migrate-Old-Config-To-New-Config/#1-follow-the-installation-guide-to-flash-the-esp32cam-and-prepare-a-sd-card-with-the-content-of-the-master","text":"","title":"1. Follow the installation guide to flash the ESP32CAM and prepare a SD-Card with the content of the master"},{"location":"Migrate-Old-Config-To-New-Config/#2-save-the-following-files-from-the-old-docker-system-on-your-pc","text":"Reference Points 1-3 (only 2 needed) Config.ini","title":"2. Save the following files from the old Docker system on your PC:"},{"location":"Migrate-Old-Config-To-New-Config/#3-copy-reference-points-1-3-onto-the-new-water-meter-system-directory-config","text":"Please note only two Reference Points are supported in the new system.","title":"3. Copy Reference Points 1-3 onto the new water-meter system (Directory /config)"},{"location":"Migrate-Old-Config-To-New-Config/#4-open-new-configini-file","text":"Insert from the old Config.ini file [alignment] and [alignment.ref0] and [alignment.ref1] section the two Ref x and y position and the initial_rotation_angle= 123 into the new Config.ini File, e.g.:","title":"4. Open new config.ini File:"},{"location":"Migrate-Old-Config-To-New-Config/#old","text":"[alignment.ref0] image=./config/RB01_65x65.jpg pos_x=28 pos_y=63 [alignment.ref1] image=./config/RB02_50x35.jpg pos_x=497 pos_y=127 [alignment] initial_rotation_angle=180","title":"Old:"},{"location":"Migrate-Old-Config-To-New-Config/#new","text":"[Alignment] InitalRotate=180 /config/RB01_65x65.jpg 28, 63 /config/RB02_50x35.jpg 497, 127 SearchFieldX = 20 SearchFieldY = 20","title":"New:"},{"location":"Migrate-Old-Config-To-New-Config/#5-insert-the-old-digit-values-into-the-new-configini-file-eg","text":"","title":"5. Insert the old Digit Values into the new Config.ini File, e.g.:"},{"location":"Migrate-Old-Config-To-New-Config/#old_1","text":"[Digital_Digit.ziffer1] pos_x=265 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer2] pos_x=310 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer3] pos_x=354 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer4] pos_x=399 pos_y=117 dx=28 dy=51 [Digital_Digit.ziffer5] pos_x=445 pos_y=115 dx=28 dy=51","title":"Old:"},{"location":"Migrate-Old-Config-To-New-Config/#new_1","text":"[Digits] Model=/config/dig0630s3.tflite ;LogImageLocation = /log/digit ModelInputSize 20, 32 digit1, 265, 117, 28, 51 digit2, 310, 117, 28, 51 digit3, 354, 117, 28, 51 digit4, 399, 117, 28, 51 digit5, 445, 115, 28, 51","title":"New:"},{"location":"Migrate-Old-Config-To-New-Config/#6-make-sure-that-you-have-the-same-quality-and-size-settings-as-in-your-old-configini","text":"In the old configuration this was coded in the html-string for the image source:","title":"6. Make sure that you have the same quality and size settings as in your old Config.ini"},{"location":"Migrate-Old-Config-To-New-Config/#old_2","text":"URLImageSource=http://IP-ADRESS/capture_with_flashlight?quality=5&size=VGA Default was Quality=5 and VGA.","title":"Old:"},{"location":"Migrate-Old-Config-To-New-Config/#new_2","text":"ImageQuality = 5 ImageSize = VGA","title":"New:"},{"location":"Migrate-Old-Config-To-New-Config/#7-repeat-the-same-for-the-analog-section","text":"","title":"7. Repeat the same for the analog section"},{"location":"Migrate-Old-Config-To-New-Config/#8-insert-your-ssid-and-password-into-the-new-wlanini-file","text":"","title":"8. Insert your SSID and Password into the new wlan.ini File"},{"location":"Migrate-Old-Config-To-New-Config/#9-compare-and-edit-consistencycheck-section-with-new-postprocessing-section","text":"","title":"9. Compare and edit [ConsistencyCheck] Section with new [PostProcessing] Section"},{"location":"Migrate-Old-Config-To-New-Config/#10-save-new-configini-file-in-the-new-system","text":"","title":"10. Save new config.ini File in the new System."},{"location":"Migrate-Old-Config-To-New-Config/#11-restart-the-system","text":"","title":"11. Restart the system."},{"location":"Migrate-Old-Config-To-New-Config/#12-after-the-first-start-set-manually-the-prevalue-in-the-new-system","text":"","title":"12. After the first start set manually the PreValue in the new system"},{"location":"Neural-Network-Types/","text":"This section is describing the different types of neural networks, that are used with the AI-on-the-edge approach and gives an introduction on how and where to use them. Content 1) Overview neural network type 2) Naming convention 3) Overview of trained types and details 1. Overview neural network type There are two types of input : digits with rolling number (top town) analog pointers (clockwise rotating pointer) There are two types of neural networks : classification networks with discrete output neurons for each result class: 11 classes for digits (0, 1, ... 8, 9 + \"Not-A-Number\") 100 classes for digits or analog pointers (0.1, 0.2, 0.3, ... , 9.7, 9.8, 9.9) continuous output networks with a continuous output in the interval [0, 10[ No setting of the type in the firmware is necessary. The type can detect by the output structure automatically. Attention: It is very important to choose the right network type (digits or analog pointers). Technically a wrong network will work and create output, but that would be totally arbitrary Not all type of pointers are trained in all networks. For the 11 classes digits network there many different types of digits trained. The reason is, that you 1) only need 20-30 training images and 2) the data collection is ongoing much longer For the continious and 100 classes network especially for the digits, there are only a view types of digits trained up to now Therefore sometimes for the digits it is more effective to choose the simpler 11 classes network type (= default). 2. Naming convention Classification 11 classes 0, 1, ... 9 + \"N\" Classification 100 classes 0.0, 0.1, ... 9.9 Continuous Interval [0, 10[ Digits dig-class11 _XXX.tflite dig-class100 _XXX.tflite dig-cont _XXX.tflite Analog Pointers ana-class100 _XXX.tflite ana-cont _XXX.tflite XXX contains the versioning and a parameter for different sizes with the following naming: XXX = versioning_sY versioning = version or in newer networks the training data Y = Neural network size (typically s1, s2, ..., s4). Whereas s1 is the maximum sized neural network and s4 is the smallest. Optional the naming ends with an \"_q\" to signal, that the tflite file has been quantized (size reduction with minimum accuracy loss). Example: dig-class11_1410_s2_q.tflite Classification network for digits with 11 classes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, N) Version 1410 = 14.1.0 s2 = Size 2 (Medium) q = Quantized Version 3. Overview of trained types and details 3a. Analog Pointer (\"ana-cont_XXX.tflite\" & \"ana-class100_XXX.tflite\") This is to transfer the direction of a pointer into a continuous number between 0 and 1, whereas 0 (=1) is the upwards position (12 o'clock), 0.25 corresponds to the 3 o'clock positions and so on. This network is a envolop for all different types of pointers. Currently there are no dedicated network trainings for specific types of pointers. There are two types of network structure, currently both are supported. The \"class100\" is a pure classification network, that might need a bit more accuracy in the labeling. \"cont\" is a no classic approach with a continuous output off only 2 neurons (details see below). Types of counters trained: Training data needs Quadratic images, minimum size: 32x32 pixel Typically 100 - 200 images with a resultion of 1/100 of the full rotation (every 0.1 value or 3.6\u00b0) Naming: x.y_ARBITRARY.jpg, where x.y = value 0.0 ... 9.9 CNN Technical details: Input 32 x 32 RGB images Output ana-cont _XXX.tflite: 2 neurons with output in range [-1, 1] - representing a sinus / cosinus encoding of the angle needs to be converted to angle with arctan-hyperbolicus function ana-class100 _XXX.tflite 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9 3b. Digits with 11 classes (\"dig-class11_XXX.tflite\") The digit type is a classical classification network, with 11 classes representing the numbers 0, 1, ... 9 and the special class \"N\". It is trained for the rolling ring of gas and electric meters. As there is sometime a status between two images, the special class \"N\" is representing Not-A-Number for the case, that the image cannot be unique classified to one number e.g. because it is between two digits. For this type the lowest amount of training data per type is needed, resulting in a large variety of type being already part of the training set. Types of counters trained: Training data needs RGB images, with minimum size: 20x32 pixel Typically 10 - 20 images (1-2 for each digit and an arbitrary number for the \"N\" class Naming: x_ARBITRARY.jpg, where x = value 0 ... 9 + N CNN Technical details: Input 20 x 32 RGB images Output 11 neurons for image classification (last layer normalized to 1) Neuron 0 to 9 represent the corresponding numbers \"0\" to \"9\" Neron 10 represent the \"Not-A-Number\" class, telling, that the image is not uniquely classified 3c. Digits with rolling results (\"dig-class100_XXX.tflite\" & \"dig-cont_XXX.tflite\") This type of network tries to overcome the problem, that there are intermediate values, when a rolling digit is between two numbers. Previous this was the \"N\" class. In this network type, there are also subdigit values trained, so that the intermediate state can be used as additional information for the algorithms. Types of counters trained: [[images/dig-cont/dig-cont_1.jpg) [[images/dig-cont/dig-cont_2a.jpg) [[images/dig-cont/dig-cont_2b.jpg) [[images/dig-cont/dig-cont_3a.jpg) [[images/dig-cont/dig-cont_3b.jpg) [[images/dig-cont/dig-cont_3c.jpg) Training data needs RGB images, with minimum size: 20x32 pixel Typically 100 - 200 images (1-2 for each possible position) Naming: x.y_ARBITRARY.jpg, where x.y = 0.0, 0.1, ... 9.9 representing the intermediate state CNN Technical details: Input 20 x 32 RGB images Output dig-cont _XXX.tflite: 10 neurons representing the digits 0, 1, ... 9. The intermediate values are represented by weighted normalized values of two neighboring output neurons needs to be converted to angle with arctan-hyperbolicus function dig-class100 _XXX.tflite 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9","title":"Neural Network Types"},{"location":"Neural-Network-Types/#content","text":"1) Overview neural network type 2) Naming convention 3) Overview of trained types and details","title":"Content"},{"location":"Neural-Network-Types/#1-overview-neural-network-type","text":"There are two types of input : digits with rolling number (top town) analog pointers (clockwise rotating pointer) There are two types of neural networks : classification networks with discrete output neurons for each result class: 11 classes for digits (0, 1, ... 8, 9 + \"Not-A-Number\") 100 classes for digits or analog pointers (0.1, 0.2, 0.3, ... , 9.7, 9.8, 9.9) continuous output networks with a continuous output in the interval [0, 10[ No setting of the type in the firmware is necessary. The type can detect by the output structure automatically. Attention: It is very important to choose the right network type (digits or analog pointers). Technically a wrong network will work and create output, but that would be totally arbitrary Not all type of pointers are trained in all networks. For the 11 classes digits network there many different types of digits trained. The reason is, that you 1) only need 20-30 training images and 2) the data collection is ongoing much longer For the continious and 100 classes network especially for the digits, there are only a view types of digits trained up to now Therefore sometimes for the digits it is more effective to choose the simpler 11 classes network type (= default).","title":"1. Overview neural network type"},{"location":"Neural-Network-Types/#2-naming-convention","text":"Classification 11 classes 0, 1, ... 9 + \"N\" Classification 100 classes 0.0, 0.1, ... 9.9 Continuous Interval [0, 10[ Digits dig-class11 _XXX.tflite dig-class100 _XXX.tflite dig-cont _XXX.tflite Analog Pointers ana-class100 _XXX.tflite ana-cont _XXX.tflite XXX contains the versioning and a parameter for different sizes with the following naming: XXX = versioning_sY versioning = version or in newer networks the training data Y = Neural network size (typically s1, s2, ..., s4). Whereas s1 is the maximum sized neural network and s4 is the smallest. Optional the naming ends with an \"_q\" to signal, that the tflite file has been quantized (size reduction with minimum accuracy loss). Example: dig-class11_1410_s2_q.tflite Classification network for digits with 11 classes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, N) Version 1410 = 14.1.0 s2 = Size 2 (Medium) q = Quantized Version","title":"2. Naming convention"},{"location":"Neural-Network-Types/#3-overview-of-trained-types-and-details","text":"","title":"3. Overview of trained types and details"},{"location":"Neural-Network-Types/#3a-analog-pointer-ana-cont_xxxtflite-ana-class100_xxxtflite","text":"This is to transfer the direction of a pointer into a continuous number between 0 and 1, whereas 0 (=1) is the upwards position (12 o'clock), 0.25 corresponds to the 3 o'clock positions and so on. This network is a envolop for all different types of pointers. Currently there are no dedicated network trainings for specific types of pointers. There are two types of network structure, currently both are supported. The \"class100\" is a pure classification network, that might need a bit more accuracy in the labeling. \"cont\" is a no classic approach with a continuous output off only 2 neurons (details see below).","title":"3a. Analog Pointer (\"ana-cont_XXX.tflite\" & \"ana-class100_XXX.tflite\")"},{"location":"Neural-Network-Types/#types-of-counters-trained","text":"","title":"Types of counters trained:"},{"location":"Neural-Network-Types/#training-data-needs","text":"Quadratic images, minimum size: 32x32 pixel Typically 100 - 200 images with a resultion of 1/100 of the full rotation (every 0.1 value or 3.6\u00b0) Naming: x.y_ARBITRARY.jpg, where x.y = value 0.0 ... 9.9","title":"Training data needs"},{"location":"Neural-Network-Types/#cnn-technical-details","text":"","title":"CNN Technical details:"},{"location":"Neural-Network-Types/#input","text":"32 x 32 RGB images","title":"Input"},{"location":"Neural-Network-Types/#output","text":"ana-cont _XXX.tflite: 2 neurons with output in range [-1, 1] - representing a sinus / cosinus encoding of the angle needs to be converted to angle with arctan-hyperbolicus function ana-class100 _XXX.tflite 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9","title":"Output"},{"location":"Neural-Network-Types/#3b-digits-with-11-classes-dig-class11_xxxtflite","text":"The digit type is a classical classification network, with 11 classes representing the numbers 0, 1, ... 9 and the special class \"N\". It is trained for the rolling ring of gas and electric meters. As there is sometime a status between two images, the special class \"N\" is representing Not-A-Number for the case, that the image cannot be unique classified to one number e.g. because it is between two digits. For this type the lowest amount of training data per type is needed, resulting in a large variety of type being already part of the training set.","title":"3b. Digits with 11 classes (\"dig-class11_XXX.tflite\")"},{"location":"Neural-Network-Types/#types-of-counters-trained_1","text":"","title":"Types of counters trained:"},{"location":"Neural-Network-Types/#training-data-needs_1","text":"RGB images, with minimum size: 20x32 pixel Typically 10 - 20 images (1-2 for each digit and an arbitrary number for the \"N\" class Naming: x_ARBITRARY.jpg, where x = value 0 ... 9 + N","title":"Training data needs"},{"location":"Neural-Network-Types/#cnn-technical-details_1","text":"","title":"CNN Technical details:"},{"location":"Neural-Network-Types/#input_1","text":"20 x 32 RGB images","title":"Input"},{"location":"Neural-Network-Types/#output_1","text":"11 neurons for image classification (last layer normalized to 1) Neuron 0 to 9 represent the corresponding numbers \"0\" to \"9\" Neron 10 represent the \"Not-A-Number\" class, telling, that the image is not uniquely classified","title":"Output"},{"location":"Neural-Network-Types/#3c-digits-with-rolling-results-dig-class100_xxxtflite-dig-cont_xxxtflite","text":"This type of network tries to overcome the problem, that there are intermediate values, when a rolling digit is between two numbers. Previous this was the \"N\" class. In this network type, there are also subdigit values trained, so that the intermediate state can be used as additional information for the algorithms.","title":"3c. Digits with rolling results (\"dig-class100_XXX.tflite\" & \"dig-cont_XXX.tflite\")"},{"location":"Neural-Network-Types/#types-of-counters-trained_2","text":"[[images/dig-cont/dig-cont_1.jpg) [[images/dig-cont/dig-cont_2a.jpg) [[images/dig-cont/dig-cont_2b.jpg) [[images/dig-cont/dig-cont_3a.jpg) [[images/dig-cont/dig-cont_3b.jpg) [[images/dig-cont/dig-cont_3c.jpg)","title":"Types of counters trained:"},{"location":"Neural-Network-Types/#training-data-needs_2","text":"RGB images, with minimum size: 20x32 pixel Typically 100 - 200 images (1-2 for each possible position) Naming: x.y_ARBITRARY.jpg, where x.y = 0.0, 0.1, ... 9.9 representing the intermediate state","title":"Training data needs"},{"location":"Neural-Network-Types/#cnn-technical-details_2","text":"","title":"CNN Technical details:"},{"location":"Neural-Network-Types/#input_2","text":"20 x 32 RGB images","title":"Input"},{"location":"Neural-Network-Types/#output_2","text":"dig-cont _XXX.tflite: 10 neurons representing the digits 0, 1, ... 9. The intermediate values are represented by weighted normalized values of two neighboring output neurons needs to be converted to angle with arctan-hyperbolicus function dig-class100 _XXX.tflite 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9","title":"Output"},{"location":"OTA---Update-Firmware-and-Web-Interface/","text":"Over-The-Air (OTA) Update You can do an OTA (over-the-air) update via the graphical user interface. Grab the firmware from the Releases page (Stable, tested versions), or the Automatically build development branch (experimental, untested versions). Please have a look on https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release first! You need: * firmware.bin * html.zip General remark: It is always recommended to upload both files, as they are coupled to each other If you make a major update, it might be needed to modify the config.ini as it's syntax or context has changed It is recommended to make a backup of the /config directory, minimum of the config.ini . Access to the update page: The graphical OTA update can be accessed in the menue \"System\": Update Just follow the steps 1 to 5 to perform the update: Select (a) and upload (b) the file firmware.bin Flash the firmware Select (a) and upload (b) the file html.zip Update the html-files Reboot After the reboot with a major change it is recommended to check the configuration settings and save them again","title":"Over-The-Air (OTA) Update"},{"location":"OTA---Update-Firmware-and-Web-Interface/#over-the-air-ota-update","text":"You can do an OTA (over-the-air) update via the graphical user interface. Grab the firmware from the Releases page (Stable, tested versions), or the Automatically build development branch (experimental, untested versions). Please have a look on https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release first! You need: * firmware.bin * html.zip","title":"Over-The-Air (OTA) Update"},{"location":"OTA---Update-Firmware-and-Web-Interface/#general-remark","text":"It is always recommended to upload both files, as they are coupled to each other If you make a major update, it might be needed to modify the config.ini as it's syntax or context has changed It is recommended to make a backup of the /config directory, minimum of the config.ini .","title":"General remark:"},{"location":"OTA---Update-Firmware-and-Web-Interface/#access-to-the-update-page","text":"The graphical OTA update can be accessed in the menue \"System\":","title":"Access to the update page:"},{"location":"OTA---Update-Firmware-and-Web-Interface/#update","text":"Just follow the steps 1 to 5 to perform the update: Select (a) and upload (b) the file firmware.bin Flash the firmware Select (a) and upload (b) the file html.zip Update the html-files Reboot After the reboot with a major change it is recommended to check the configuration settings and save them again","title":"Update"},{"location":"REST-API/","text":"Various information is directly accessible over specific REST calls. For an up-to-date list search the Github repository for registered handlers Often used APIs Just append them to the IP, separated with a / , eg. http://192.168.1.1/json Control flow_start gpio The gpio entrypoint also support parameters: /GPIO?GPIO=12&Status=high ota ota_page.html reboot Results json value The value entrypoint also support parameters: http:///value?all=true&type=value http:///value?all=true&type=raw http:///value?all=true&type=error http:///value?all=true&type=prevalue img_tmp/alg_roi.jpg Last captured picture Status statusflow rssi cpu_temperature sysinfo starttime uptime Camera lighton lightoff capture capture_with_flashlight save The save entrypoint also support parameters: http:///save?filename=test.jpg&delay=3 Logs log Last part of todays log logfileact Full log of today log.html","title":"REST API"},{"location":"REST-API/#often-used-apis","text":"Just append them to the IP, separated with a / , eg. http://192.168.1.1/json","title":"Often used APIs"},{"location":"REST-API/#control","text":"","title":"Control"},{"location":"REST-API/#flow_start","text":"","title":"flow_start"},{"location":"REST-API/#gpio","text":"The gpio entrypoint also support parameters: /GPIO?GPIO=12&Status=high","title":"gpio"},{"location":"REST-API/#ota","text":"","title":"ota"},{"location":"REST-API/#ota_pagehtml","text":"","title":"ota_page.html"},{"location":"REST-API/#reboot","text":"","title":"reboot"},{"location":"REST-API/#results","text":"","title":"Results"},{"location":"REST-API/#json","text":"","title":"json"},{"location":"REST-API/#value","text":"The value entrypoint also support parameters: http:///value?all=true&type=value http:///value?all=true&type=raw http:///value?all=true&type=error http:///value?all=true&type=prevalue","title":"value"},{"location":"REST-API/#img_tmpalg_roijpg","text":"Last captured picture","title":"img_tmp/alg_roi.jpg"},{"location":"REST-API/#status","text":"","title":"Status"},{"location":"REST-API/#statusflow","text":"","title":"statusflow"},{"location":"REST-API/#rssi","text":"","title":"rssi"},{"location":"REST-API/#cpu_temperature","text":"","title":"cpu_temperature"},{"location":"REST-API/#sysinfo","text":"","title":"sysinfo"},{"location":"REST-API/#starttime","text":"","title":"starttime"},{"location":"REST-API/#uptime","text":"","title":"uptime"},{"location":"REST-API/#camera","text":"","title":"Camera"},{"location":"REST-API/#lighton","text":"","title":"lighton"},{"location":"REST-API/#lightoff","text":"","title":"lightoff"},{"location":"REST-API/#capture","text":"","title":"capture"},{"location":"REST-API/#capture_with_flashlight","text":"","title":"capture_with_flashlight"},{"location":"REST-API/#save","text":"The save entrypoint also support parameters: http:///save?filename=test.jpg&delay=3","title":"save"},{"location":"REST-API/#logs","text":"","title":"Logs"},{"location":"REST-API/#log","text":"Last part of todays log","title":"log"},{"location":"REST-API/#logfileact","text":"Full log of today","title":"logfileact"},{"location":"REST-API/#loghtml","text":"","title":"log.html"},{"location":"ROI-Configuration/","text":"ROI (Region of Interest) Configuration General remark: You are using a neural network approach which is trained to fit as many different type of meters as possible. The accuracy will never be 100%. It is normal to see a missing reading once in a while. There there are several precautions to detect this. For details see the section PostProcessing on the configuration page. The most critical settings for accurate detection are: Correct setting of the R egions O f I nterest (ROIs) for detection of the image. This must be done manually for each meter! Number type is part of the training set. Have a look on the Digital Counters resp. Analog Needles to check if your types are contained. If your number types are not contained, you should take the effort to record them so we can add them to the training data. See: Learn models with your own images on how to create new input. 1. Correct Setup of ROI Please proceed in the following order! Don't forget to save after each step! 1. Image Sharpness Ensure a sharp image of the camera by adjusting the focal length of the ESP OV2640 camera. Adjust the focus for the clearest possible image See these instructions for help. 2. Horizontal Alignment Ensure an exact horizontal alignment of the number via the alignment / reference setup: :heavy_check_mark: Okay :x: Not Okay 3. Correct Size for ROI Choose the right size of the ROI: The configuration of ROIs differs a bit on the model you choose. Below you find the differences between the different AI models. Pick the one you think fits best your purpose. If you don't get to good result, try another model. 4. Model Selection dig-class11 Configuration dig-class11 - Models recognize the complete digit only . Here it is not relevant if the ROI fits the Border of the digit window. For this model, there should be a border of 20% of the image size around the number itself. This border is shown in the ROI setup image by the inner thinner rectangle. This rectangle should fit perfectly around the number when the number has not started to rotate to the next position: Example 1 Example 2 :heavy_check_mark: Okay :x: Not Okay :x: Not Okay If you have perfect alignment you and are not getting satisfying results, most probably your numbers are not part of the training data yet. Read on Learn models with your own images how to add your meter's type of numbers to the training set. dig-class100 / dig-cont Configuration These models recognize the tenths (fractions) between the numbers. This model requires a different ROI setup; the height must be set differently and more accurately. First, the width can be set as for dig-class11, i.e. 20% margin left and right. The height of the outer rectangle should be set to the upper and lower edge of the number window. To achieve this setting, you need to unlock the aspect ratio: Here an example: Example 1 :heavy_check_mark: Okay :x: Not Okay","title":"ROI (Region of Interest) Configuration"},{"location":"ROI-Configuration/#roi-region-of-interest-configuration","text":"General remark: You are using a neural network approach which is trained to fit as many different type of meters as possible. The accuracy will never be 100%. It is normal to see a missing reading once in a while. There there are several precautions to detect this. For details see the section PostProcessing on the configuration page. The most critical settings for accurate detection are: Correct setting of the R egions O f I nterest (ROIs) for detection of the image. This must be done manually for each meter! Number type is part of the training set. Have a look on the Digital Counters resp. Analog Needles to check if your types are contained. If your number types are not contained, you should take the effort to record them so we can add them to the training data. See: Learn models with your own images on how to create new input.","title":"ROI (Region of Interest) Configuration"},{"location":"ROI-Configuration/#1-correct-setup-of-roi","text":"Please proceed in the following order! Don't forget to save after each step!","title":"1. Correct Setup of ROI"},{"location":"ROI-Configuration/#1-image-sharpness","text":"Ensure a sharp image of the camera by adjusting the focal length of the ESP OV2640 camera. Adjust the focus for the clearest possible image See these instructions for help.","title":"1. Image Sharpness"},{"location":"ROI-Configuration/#2-horizontal-alignment","text":"Ensure an exact horizontal alignment of the number via the alignment / reference setup: :heavy_check_mark: Okay :x: Not Okay","title":"2. Horizontal Alignment"},{"location":"ROI-Configuration/#3-correct-size-for-roi","text":"Choose the right size of the ROI: The configuration of ROIs differs a bit on the model you choose. Below you find the differences between the different AI models. Pick the one you think fits best your purpose. If you don't get to good result, try another model.","title":"3. Correct Size for ROI"},{"location":"ROI-Configuration/#4-model-selection","text":"","title":"4. Model Selection"},{"location":"ROI-Configuration/#dig-class11-configuration","text":"dig-class11 - Models recognize the complete digit only . Here it is not relevant if the ROI fits the Border of the digit window. For this model, there should be a border of 20% of the image size around the number itself. This border is shown in the ROI setup image by the inner thinner rectangle. This rectangle should fit perfectly around the number when the number has not started to rotate to the next position: Example 1 Example 2 :heavy_check_mark: Okay :x: Not Okay :x: Not Okay If you have perfect alignment you and are not getting satisfying results, most probably your numbers are not part of the training data yet. Read on Learn models with your own images how to add your meter's type of numbers to the training set.","title":"dig-class11 Configuration"},{"location":"ROI-Configuration/#dig-class100-dig-cont-configuration","text":"These models recognize the tenths (fractions) between the numbers. This model requires a different ROI setup; the height must be set differently and more accurately. First, the width can be set as for dig-class11, i.e. 20% margin left and right. The height of the outer rectangle should be set to the upper and lower edge of the number window. To achieve this setting, you need to unlock the aspect ratio: Here an example: Example 1 :heavy_check_mark: Okay :x: Not Okay","title":"dig-class100 / dig-cont Configuration"},{"location":"Release-creation/","text":"Preparing for release Changelog is merged back from master branch to rolling branch (should be the last step of the previous release creation) All changes are documented in the Changelog in rolling branch Release creation steps Merge rolling into master branch Best to wait for the GitHub action to run successfully On master branch tag the version like v11.3.1 and don't forget to push it. Wait for the GitHub-Action of release creation. After all is done: the release should be created the artifacts are downloadable from release The documented changes were applied to the release Merge master back in rolling In rolling create a folder rolling/docs/releases/download/ and add the firmware.bin from one of the release artifacts. Update rolling/docs/manifest.json with the new version (update the version and the last path fields)","title":"Release creation"},{"location":"Release-creation/#preparing-for-release","text":"Changelog is merged back from master branch to rolling branch (should be the last step of the previous release creation) All changes are documented in the Changelog in rolling branch","title":"Preparing for release"},{"location":"Release-creation/#release-creation-steps","text":"Merge rolling into master branch Best to wait for the GitHub action to run successfully On master branch tag the version like v11.3.1 and don't forget to push it. Wait for the GitHub-Action of release creation. After all is done: the release should be created the artifacts are downloadable from release The documented changes were applied to the release Merge master back in rolling In rolling create a folder rolling/docs/releases/download/ and add the firmware.bin from one of the release artifacts. Update rolling/docs/manifest.json with the new version (update the version and the last path fields)","title":"Release creation steps"},{"location":"Testing/","text":"Testing Option for VSCode You can test your functions directly on the device. Structure All tests are under directory \"test\" in the project and not compiled with default build option of platformio. The main function is in file test_suite_controlflow.cpp . In method app_main() you can add your own tests. Include my my own test In method app_main() of test_suite_controlflow.cpp you can add your own tests. Include your test-file in the top like #include \"components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp\" components is a subfolder of tests here. Not the components directory of root source. In the bottom add your test function. RUN_TEST(testNegative); Your test function should have a TEST_ASSERT_EQUAL_* . For more information look at unity-testing . Run tests You will need a testing device. best with usb adapter. Before you upload your tests you will need to setup the device with initial setup procedure described in [[Installation]] Now you can use Visual Studio Code or a standard console to upload the test code. In VS Code (tab platformio) open Advanced and select Test . Alternativ you can run it in console/terminal with platformio test --environment esp32cam . In my environment the serial terminal not opens. I have to do it for myself. You will see much logging. If any test fails it logs it out. Else it logs all test passed in the end. Troubleshooting If you test very much cases in one function, the device runs in stackoverflow and an endless boot. Reduce the count of test cases or split the test function in multiple functions.","title":"Testing"},{"location":"Testing/#testing-option-for-vscode","text":"You can test your functions directly on the device.","title":"Testing Option for VSCode"},{"location":"Testing/#structure","text":"All tests are under directory \"test\" in the project and not compiled with default build option of platformio. The main function is in file test_suite_controlflow.cpp . In method app_main() you can add your own tests.","title":"Structure"},{"location":"Testing/#include-my-my-own-test","text":"In method app_main() of test_suite_controlflow.cpp you can add your own tests. Include your test-file in the top like #include \"components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp\" components is a subfolder of tests here. Not the components directory of root source. In the bottom add your test function. RUN_TEST(testNegative); Your test function should have a TEST_ASSERT_EQUAL_* . For more information look at unity-testing .","title":"Include my my own test"},{"location":"Testing/#run-tests","text":"You will need a testing device. best with usb adapter. Before you upload your tests you will need to setup the device with initial setup procedure described in [[Installation]] Now you can use Visual Studio Code or a standard console to upload the test code. In VS Code (tab platformio) open Advanced and select Test . Alternativ you can run it in console/terminal with platformio test --environment esp32cam . In my environment the serial terminal not opens. I have to do it for myself. You will see much logging. If any test fails it logs it out. Else it logs all test passed in the end.","title":"Run tests"},{"location":"Testing/#troubleshooting","text":"If you test very much cases in one function, the device runs in stackoverflow and an endless boot. Reduce the count of test cases or split the test function in multiple functions.","title":"Troubleshooting"},{"location":"Watermeter-specific-analog---digital-transition/","text":"Understanding the problem At first, for the most watermeters the default configuration should be work. But the digit, especially the last digit differs in some devices. \"Normal\" transition In most cases, the transition of the last digit starts when the analogue pointer is > 9. Often the last digit \"hangs\" a bit on this devices and comes not over zero. So it is not easy to see which digit is correct. In the first example 4 or still 3? (3 is correct). Early transition Some units start the transition very early or run with the analogue pointer. In the third example, is it a 3 or a 2? Inaccuracies in image recognition The models for image recognition are good, but have inaccuracies in the range +/- 0.2. In order to obtain as many correct results as possible, a treatment is carried out in the post process in the range of 9.8-0.2 for the analogue pointer, which must start differently depending on the type of counter. How to configure for my meter type If you have a devices with \"normal\" transition you should not have any issues. On devices with \"early\" transition, you can set the option AnalogDigitalTransitionStart to a value between 6 and 8.","title":"Understanding the problem"},{"location":"Watermeter-specific-analog---digital-transition/#understanding-the-problem","text":"At first, for the most watermeters the default configuration should be work. But the digit, especially the last digit differs in some devices.","title":"Understanding the problem"},{"location":"Watermeter-specific-analog---digital-transition/#normal-transition","text":"In most cases, the transition of the last digit starts when the analogue pointer is > 9. Often the last digit \"hangs\" a bit on this devices and comes not over zero. So it is not easy to see which digit is correct. In the first example 4 or still 3? (3 is correct).","title":"\"Normal\" transition"},{"location":"Watermeter-specific-analog---digital-transition/#early-transition","text":"Some units start the transition very early or run with the analogue pointer. In the third example, is it a 3 or a 2?","title":"Early transition"},{"location":"Watermeter-specific-analog---digital-transition/#inaccuracies-in-image-recognition","text":"The models for image recognition are good, but have inaccuracies in the range +/- 0.2. In order to obtain as many correct results as possible, a treatment is carried out in the post process in the range of 9.8-0.2 for the analogue pointer, which must start differently depending on the type of counter.","title":"Inaccuracies in image recognition"},{"location":"Watermeter-specific-analog---digital-transition/#how-to-configure-for-my-meter-type","text":"If you have a devices with \"normal\" transition you should not have any issues. On devices with \"early\" transition, you can set the option AnalogDigitalTransitionStart to a value between 6 and 8.","title":"How to configure for my meter type"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome Welcome to the AI on the Edge Device Project Documentation! ...","title":"Welcome"},{"location":"#welcome","text":"Welcome to the AI on the Edge Device Project Documentation! ...","title":"Welcome"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 8001895..5c08027 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,162 +1,7 @@ - https://jomjol.github.io/AI-on-the-edge-device-docs/AI-on-the-edge/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Addditional-Information/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Best-Practice/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Build-Instructions/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Choosing-the-Model/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Configuration-Parameter-Details/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Configuration/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Correction%20Algorithm/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Demo-Mode/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Error-Codes/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Error-Debugging/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/External-LED/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/FAQs/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Frequent%20Reboots/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Gasmeter-Log-Downloader/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Graphical-configuration/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Hardware-Compatibility/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Home/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Install-a-rolling-%28unstable%29-release/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Installation/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Integrated%20Functions/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Integration-Home-Assistant/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Learn-models-with-your-own-images/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/MQTT-API/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Migrate-Old-Config-To-New-Config/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Neural-Network-Types/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/OTA---Update-Firmware-and-Web-Interface/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/REST-API/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/ROI-Configuration/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Release-creation/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Testing/ - 2023-01-02 - daily - - - https://jomjol.github.io/AI-on-the-edge-device-docs/Watermeter-specific-analog---digital-transition/ + https://jomjol.github.io/AI-on-the-edge-device-docs/ 2023-01-02 daily diff --git a/sitemap.xml.gz b/sitemap.xml.gz index df7884a7e0b74b6bb14b760f2e708cac2872e54e..3a02697bd9532d5f193b5aa39a2ff9e417aa2c35 100644 GIT binary patch literal 223 zcmV<503iP#iwFqTVzXlc|8r?{Wo=<_E_iKh08LLZZo@DP-17=UyF|rZ+Co;4r9k%d z0j|W#3S==gmAL(VWhaAgIr4Bk9L?c(OwAo9j+8sGS6Vcf9r>6;CqB;~@>Lw{&fKQN zSek0i+=-!->pQ?a&x&KgvA?pSDFC~nE(}i*w0aYE*HkP4k78363X8S(X7M`he2oJ-SNd7z`|z+n}DyNZz)(eUW-Ebz3b@ZDVsop96kR_+xz^ Z)1QHj@@NQa#g*!-_8&dGRF4_~003CSXdwUq literal 651 zcmV;60(AW!iwFqKV6$Ta|8r?{Wo=<_E_iKh0M%GcZ`&{oz4uoH0eWPdW|wwIQe;iD z1?XqyqG!co9CfnjQF7h<`_WD}6gv+C=!-2{Cf<|u_~Gg0Tjd9@$k9=l4bMj7;Q&KH z)`fC5e9BjFKD?ZtOdIwQ(?BMNI2-O$sy}C0+qR?V5>}>;BjPfP#a;$6dpBm|(Zz6n zGLWltaD3{osi$Jzd5PlYg{l|wqtc~)vmH6g7HgmYX^()mM6mek3b|1c|9X{8v(C{+ zzb2-N?0hnwe1h>Aj3+YX-S%Nxu{WW_9plfrHO?QV*$2xJaP|lBKf`XVbxGFQcvy!W zab>!ZE)ribCU{^|Brz$2-Z*b%O#I+JSsaVD{{TOOY>HiKwe4Xlz`5bLh(cP7$z((aDB{q>IN58V*o(omYfbzJLQY43Z?kRi@Nd z)7?JiIV>L5%22yr4sb8M{ILmxoZt@I_mM6(cPP2p3;fg)|A72ZYdb~v`2ql*YTIqf z%5l}_Y!fUz;}$yU^Ui4dRkXSOu234A`!y*3FR?jR7EmxMM4w|!>N?|R5iKA4omgYx lcCHZV8ZW&MfOXUA>qWeEP(%&Mc`7cvep7fa*002BULFWJf
+ + +
+ +
+
+ +
+
+
+
+ +

Welcome

+

Welcome to the AI on the Edge Device Project Documentation!

+

...

+ +
+
+ +
+
+ +
+ +