diff --git a/.gitignore b/.gitignore
index 89ac8b0496123d0ac224589038cb20061a27faf1..035cabfc6c076e1a40df8443ce82d28e3f27194f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@ ohmpy/*
 logs/*
 sequence.txt
 /Proposition interface.odp
+doc/build/*
diff --git a/PCB_boards/accessories/battery_charge_control_2024.0.0/battery_management.ods b/PCB_boards/accessories/battery_charge_control_2024.0.0/battery_management.ods
new file mode 100644
index 0000000000000000000000000000000000000000..e9e3fee6155b01cade3095d29023dba04d446b50
Binary files /dev/null and b/PCB_boards/accessories/battery_charge_control_2024.0.0/battery_management.ods differ
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/0805-NO.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/0805-NO.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/0805-NO.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/0805-NO.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/1X12_ROUND.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/1X12_ROUND.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/1X12_ROUND.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/1X12_ROUND.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/ADAFRUIT_TEXT_20MM.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/ADAFRUIT_TEXT_20MM.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/ADAFRUIT_TEXT_20MM.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/ADAFRUIT_TEXT_20MM.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/FIDUCIAL_1MM.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/FIDUCIAL_1MM.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/FIDUCIAL_1MM.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/FIDUCIAL_1MM.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/MOUNTINGHOLE_2.5_PLATED.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/MOUNTINGHOLE_2.5_PLATED.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/MOUNTINGHOLE_2.5_PLATED.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/MOUNTINGHOLE_2.5_PLATED.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/PCBFEAT-REV-040.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/PCBFEAT-REV-040.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/PCBFEAT-REV-040.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/PCBFEAT-REV-040.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_ARROW_NOPASTE.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_ARROW_NOPASTE.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_ARROW_NOPASTE.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_ARROW_NOPASTE.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_CLOSEDWIRE.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_CLOSEDWIRE.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_CLOSEDWIRE.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/SOLDERJUMPER_CLOSEDWIRE.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/TSSOP24.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/TSSOP24.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/TSSOP24.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/TSSOP24.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/_0805MP.kicad_mod b/PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/_0805MP.kicad_mod
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/_0805MP.kicad_mod
rename to PCB_boards/accessories/i2c_ext.2024.0.0/Adafruit TCA9548A.pretty/_0805MP.kicad_mod
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_dru b/PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_dru
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_dru
rename to PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_dru
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pcb b/PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pcb
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pcb
rename to PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pcb
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_prl b/PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_prl
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_prl
rename to PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_prl
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pro b/PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pro
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pro
rename to PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_pro
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch b/PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch
rename to PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch-bak b/PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch-bak
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch-bak
rename to PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.kicad_sch-bak
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.png b/PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.png
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/MUX_v2024_tca_board.png
rename to PCB_boards/accessories/i2c_ext.2024.0.0/MUX_v2024_tca_board.png
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/TCA_board_2.png b/PCB_boards/accessories/i2c_ext.2024.0.0/TCA_board_2.png
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/TCA_board_2.png
rename to PCB_boards/accessories/i2c_ext.2024.0.0/TCA_board_2.png
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/empty.kicad_wks b/PCB_boards/accessories/i2c_ext.2024.0.0/empty.kicad_wks
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/empty.kicad_wks
rename to PCB_boards/accessories/i2c_ext.2024.0.0/empty.kicad_wks
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/fp-info-cache b/PCB_boards/accessories/i2c_ext.2024.0.0/fp-info-cache
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/fp-info-cache
rename to PCB_boards/accessories/i2c_ext.2024.0.0/fp-info-cache
diff --git a/PCB_boards/accessory/i2c_ext.2024.0.0/fp-lib-table b/PCB_boards/accessories/i2c_ext.2024.0.0/fp-lib-table
similarity index 100%
rename from PCB_boards/accessory/i2c_ext.2024.0.0/fp-lib-table
rename to PCB_boards/accessories/i2c_ext.2024.0.0/fp-lib-table
diff --git a/configs/config_default.py b/configs/config_default.py
index 0763f48ca2240311e01b281a1eea9571c324defd..49e24ecf21e05b67d55dbc77de65e46ae3c216aa 100644
--- a/configs/config_default.py
+++ b/configs/config_default.py
@@ -1,7 +1,7 @@
 import logging
 from ohmpi.utils import get_platform
 
-from paho.mqtt.client import MQTTv31
+from paho.mqtt.client import MQTTv31  # noqa
 
 _, on_pi = get_platform()
 # DEFINE THE ID OF YOUR OhmPi
@@ -17,22 +17,38 @@ OHMPI_CONFIG = {
     'settings': 'ohmpi_settings.json',  # INSERT YOUR FAVORITE SETTINGS FILE HERE
 }
 
+r_shunt = 2.
 HARDWARE_CONFIG = {
-    'ctl': {'model' : 'dummy_ctl'
-                   },
-    'tx' : {'model' : 'dummy_tx',
-             'current_max': 4800 / 50 / 2,  # Maximum current mA
-             'r_shunt': 2,  # Shunt resistance in Ohms
-             'low_battery': 12.  # Volts
+    'ctl': {'model': 'raspberry_pi'},
+    'pwr': {'model': 'pwr_batt', 'voltage': 12., 'interface_name': 'none'},
+    'tx':  {'model': 'mb_2024_0_2',
+             'voltage_max': 50.,  # Maximum voltage supported by the TX board [V]
+             'current_max': 4.80/(50*r_shunt),  # Maximum voltage read by the current ADC on the TX board [A]
+             'r_shunt': r_shunt,  # Shunt resistance in Ohms
+             'interface_name': 'i2c'
             },
-    'rx' : {'model': 'dummy_rx',
+    'rx':  {'model': 'mb_2024_0_2',
+             'latency': 0.010,  # latency in seconds in continuous mode
+             'sampling_rate': 50,  # number of samples per second
+             'interface_name': 'i2c'
             },
-    'mux': {'model' : 'dummy_mux',
-             'max_elec': 64,
-             'voltage_max' : 100,
-             'current_max' : 3
+    'mux': {'boards':
+                {'mux_00':
+                     {'model': 'mux_2024_0_X',
+                      'tca_address': None,
+                      'tca_channel': 0,
+                      'addr2': 'down',
+                      'addr1': 'down',
+                      'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
+                      'cabling': {(i+0, j): ('mux_00', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
+                      'voltage_max': 12.}
+                 },
+             'default': {'interface_name': 'i2c_ext',
+                         'voltage_max': 100.,
+                         'current_max': 3.}
             }
-}
+    }
+
 # SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS
 # Execution logging configuration
 EXEC_LOGGING_CONFIG = {
diff --git a/configs/config_mb_2023_3_mux_2024.py b/configs/config_mb_2023_3_mux_2024.py
index 8373edcbe9830a0d05fbbf0a8ce3ee02cb18ccda..d8adeb5db6afcf2d47bc5e35e292e13f811ec50d 100644
--- a/configs/config_mb_2023_3_mux_2024.py
+++ b/configs/config_mb_2023_3_mux_2024.py
@@ -1,7 +1,7 @@
 import logging
 from ohmpi.utils import get_platform
 
-from paho.mqtt.client import MQTTv31
+from paho.mqtt.client import MQTTv31  # noqa
 
 _, on_pi = get_platform()
 # DEFINE THE ID OF YOUR OhmPi
@@ -43,8 +43,6 @@ HARDWARE_CONFIG = {
                        'tca_channel': 0,
                        'addr2': 'up',
                        'addr1': 'up',
-                       # 'mcp_0': '0x26',
-                       # 'mcp_1': '0x27',
                        'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                        'cabling': {(i + 8, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                        'voltage_max': 50.},
@@ -54,8 +52,6 @@ HARDWARE_CONFIG = {
                        'tca_channel': 0,
                        'addr2': 'down',
                        'addr1': 'up',
-                       # 'mcp_0': '0x26',
-                       # 'mcp_1': '0x27',
                        'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                        'cabling': {(i + 16, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                        'voltage_max': 50.},
diff --git a/configs/config_mb_2023_4_mux_2023.py b/configs/config_mb_2023_4_mux_2023.py
index 40665972ec78fcbb165cf92d2b3b5fb2fe617836..54dd5b25f1f36fdce31e9d72b5f2009855105a3a 100644
--- a/configs/config_mb_2023_4_mux_2023.py
+++ b/configs/config_mb_2023_4_mux_2023.py
@@ -21,51 +21,51 @@ r_shunt = 2.
 HARDWARE_CONFIG = {
     'ctl': {'model': 'raspberry_pi'},
     'pwr': {'model': 'pwr_batt', 'voltage': 12., 'interface_name': 'none'},
-    'tx':  {'model': 'mb_2023_0_X',
-             'voltage_max': 50.,  # Maximum voltage supported by the TX board [V]
-             'current_max': 4.80/(50*r_shunt),  # Maximum voltage read by the current ADC on the TX board [A]
-             'r_shunt': r_shunt,  # Shunt resistance in Ohms
-             'interface_name': 'i2c'
-            },
-    'rx':  {'model': 'mb_2023_0_X',
-            'coef_p2': 2.50,  # slope for conversion for ADS, measurement in V/V
-            'sampling_rate': 50.,  # number of samples per second
-            'interface_name': 'i2c',
-            },
+    'tx': {'model': 'mb_2023_0_X',
+           'voltage_max': 50.,  # Maximum voltage supported by the TX board [V]
+           'current_max': 4.80 / (50 * r_shunt),  # Maximum voltage read by the current ADC on the TX board [A]
+           'r_shunt': r_shunt,  # Shunt resistance in Ohms
+           'interface_name': 'i2c'
+           },
+    'rx': {'model': 'mb_2023_0_X',
+           'coef_p2': 2.50,  # slope for conversion for ADS, measurement in V/V
+           'sampling_rate': 50.,  # number of samples per second
+           'interface_name': 'i2c',
+           },
     'mux':  # default properties given in config are system properties that will be
-            # overwritten by properties defined in each the board dict below.
-            # if defined in board specs, values out of specs will be bounded to remain in specs
-            # omitted properties in config will be set to board specs default values if they exist
-            {'boards':
-                {'mux_A':
-                     {'model': 'mux_2023_0_X',
-                      'mux_tca_address': 0x70,
-                      'roles': {'A': 'X'},
-                      'cabling': {(i, j): ('mux_A', i) for j in ['A'] for i in range(1, 65)},
-                      'voltage_max': 12.},
-                 'mux_B':
-                     {'model': 'mux_2023_0_X',
-                      'mux_tca_address': 0x71,
-                      'roles': {'B': 'X'},
-                      'cabling': {(i, j): ('mux_B', i) for j in ['B'] for i in range(1, 65)},
-                      'voltage_max': 12.},
-                 'mux_M':
-                     {'model': 'mux_2023_0_X',
-                      'mux_tca_address': 0x72,
-                      'roles': {'M': 'X'},
-                      'cabling': {(i, j): ('mux_M', i) for j in ['M'] for i in range(1, 65)},
-                      'voltage_max': 12.},
-                'mux_N':
-                     {'model': 'mux_2023_0_X',
-                      'mux_tca_address': 0x73,
-                      'roles': {'N': 'X'},
-                      'cabling': {(i, j): ('mux_N', i) for j in ['N'] for i in range(1, 65)},
-                      'voltage_max': 12.},
-                 },
-             'default': {'interface_name': 'i2c',
-                         'voltage_max': 12.,
-                         'current_max': 3.}
-             }
+    # overwritten by properties defined in each the board dict below.
+    # if defined in board specs, values out of specs will be bounded to remain in specs
+    # omitted properties in config will be set to board specs default values if they exist
+        {'boards':
+             {'mux_A':
+                  {'model': 'mux_2023_0_X',
+                   'mux_tca_address': 0x70,
+                   'roles': {'A': 'X'},
+                   'cabling': {(i, j): ('mux_A', i) for j in ['A'] for i in range(1, 65)},
+                   'voltage_max': 12.},
+              'mux_B':
+                  {'model': 'mux_2023_0_X',
+                   'mux_tca_address': 0x71,
+                   'roles': {'B': 'X'},
+                   'cabling': {(i, j): ('mux_B', i) for j in ['B'] for i in range(1, 65)},
+                   'voltage_max': 12.},
+              'mux_M':
+                  {'model': 'mux_2023_0_X',
+                   'mux_tca_address': 0x72,
+                   'roles': {'M': 'X'},
+                   'cabling': {(i, j): ('mux_M', i) for j in ['M'] for i in range(1, 65)},
+                   'voltage_max': 12.},
+              'mux_N':
+                  {'model': 'mux_2023_0_X',
+                   'mux_tca_address': 0x73,
+                   'roles': {'N': 'X'},
+                   'cabling': {(i, j): ('mux_N', i) for j in ['N'] for i in range(1, 65)},
+                   'voltage_max': 12.},
+              },
+         'default': {'interface_name': 'i2c',
+                     'voltage_max': 12.,
+                     'current_max': 3.}
+         }
 }
 
 # SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS
diff --git a/configs/config_mb_2023_4_mux_2024.py b/configs/config_mb_2023_4_mux_2024.py
index f15f2af3127ea11b8469d20e109fbcc6120954d0..9f143bd82682f81f0681e79aaa04ef81ef11fdff 100644
--- a/configs/config_mb_2023_4_mux_2024.py
+++ b/configs/config_mb_2023_4_mux_2024.py
@@ -38,19 +38,15 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'up',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+8, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 12.},
-                'mux_03':
+                 'mux_03':
                      {'model': 'mux_2024_0_X',
                       'tca_address': None,
                       'tca_channel': 0,
                       'addr2': 'down',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+24, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 12.},
diff --git a/configs/config_mb_2023__3_mux_2024_dps5005.py b/configs/config_mb_2023__3_mux_2024_dps5005.py
index b4d7d2cce647f725fe30c95e665f02f1e0c10f8c..b94f2f04deb7604b23bb165207cdd57c3d3e9a0f 100644
--- a/configs/config_mb_2023__3_mux_2024_dps5005.py
+++ b/configs/config_mb_2023__3_mux_2024_dps5005.py
@@ -42,8 +42,6 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'up',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+8, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 50.},
@@ -53,8 +51,6 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'down',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+16, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 50.},
diff --git a/configs/config_mb_2023_mux_2024_2_roles_AB.py b/configs/config_mb_2023_mux_2024_2_roles_AB.py
index 42fe5c13e36a6ecce55e4cfda1a862b92cce04ba..0ad831386829a3a9504f722451d4606eef8a625b 100644
--- a/configs/config_mb_2023_mux_2024_2_roles_AB.py
+++ b/configs/config_mb_2023_mux_2024_2_roles_AB.py
@@ -39,8 +39,8 @@ HARDWARE_CONFIG = {
                      {'model': 'mux_2024_0_X', # 'ohmpi_i2c_mux64_v1.01',
                       'tca_address': None,
                       'tca_channel': 0,
-                      'mcp_0': '0x22',  # TODO : Replace this with pos of jumper on MUX board (address doesn't mean anything for the average user...
-                      'mcp_1': '0x23',  # TODO : Replace this with pos of jumper on MUX board (address doesn't mean anything for the average user...)
+                      'addr2': 'up',
+                      'addr1': 'up',
                       'roles': {'A': 'X', 'B': 'Y'},
                       'voltage_max': 12.
                 }},
diff --git a/configs/config_mb_2023_mux_2024_2_roles_MN.py b/configs/config_mb_2023_mux_2024_2_roles_MN.py
index 6b911300ab4745a2585a6cbc0d6e20a73035112f..f957adfddb8e760c7ba96ba9c8002343141c7897 100644
--- a/configs/config_mb_2023_mux_2024_2_roles_MN.py
+++ b/configs/config_mb_2023_mux_2024_2_roles_MN.py
@@ -18,33 +18,34 @@ OHMPI_CONFIG = {
 }
 
 HARDWARE_CONFIG = {
-    'ctl': {'model' : 'raspberry_pi'},
-    'pwr': {'model' : 'pwr_batt', 'voltage': 12.},
-    'tx' : {'model' : 'mb_2023_0_X',
-             'mcp_board_address': 0x20,
-             'voltage_max': 12., # Maximum voltage supported by the TX board [V]
-             'current_max': 4800 / 50 / 2,  # Maximum current supported by the TX board [mA]
-             'r_shunt': 2  # Shunt resistance in Ohms
-            },
-    'rx' : {'model': 'mb_2023_0_X',
-             'coef_p2': 2.50,  # slope for current conversion for ADS.P2, measurement in V/V
-             'sampling_rate': 100.,  # Hz
-             'nb_samples': 20,  # Max value 10 # was named integer before...
-            },
+    'ctl': {'model': 'raspberry_pi'},
+    'pwr': {'model': 'pwr_batt', 'voltage': 12.},
+    'tx': {'model': 'mb_2023_0_X',
+           'mcp_board_address': 0x20,
+           'voltage_max': 12.,  # Maximum voltage supported by the TX board [V]
+           'current_max': 4800 / 50 / 2,  # Maximum current supported by the TX board [mA]
+           'r_shunt': 2  # Shunt resistance in Ohms
+           },
+    'rx': {'model': 'mb_2023_0_X',
+           'coef_p2': 2.50,  # slope for current conversion for ADS.P2, measurement in V/V
+           'sampling_rate': 100.,  # Hz
+           'nb_samples': 20,  # Max value 10 # was named integer before...
+           },
     'mux':  # default properties are system properties that will be
-            # overwritten by board properties defined at the board level within the board model file
-            # both will be overwritten by properties specified in the board dict below. Use with caution...
+    # overwritten by board properties defined at the board level within the board model file
+    # both will be overwritten by properties specified in the board dict below. Use with caution...
         {'boards':
-                {'mux_1':
-                     {'model' : 'mux_2024_0_X', # 'ohmpi_i2c_mux64_v1.01',
-                      'tca_address': None,
-                      'tca_channel': 0,
-                      'mcp_0': '0x22',  # TODO : Replace this with pos of jumper on MUX board (address doesn't mean anything for the average user...
-                      'mcp_1': '0x23',  # TODO : Replace this with pos of jumper on MUX board (address doesn't mean anything for the average user...)
-                      'roles': {'M': 'X', 'N': 'Y'},
-                      'voltage_max': 12.
-                }},
-            'default': {'voltage_max': 100., 'current_max': 3.}}
+             {'mux_1':
+                  {'model': 'mux_2024_0_X',  # 'ohmpi_i2c_mux64_v1.01',
+                   'tca_address': None,
+                   'tca_channel': 0,
+                   'addr2': 'up',
+                   'addr1': 'up',
+                   'roles': {'M': 'X', 'N': 'Y'},
+                   'voltage_max': 12.
+                   }
+              },
+         'default': {'voltage_max': 100., 'current_max': 3.}}
 }
 
 # SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS
diff --git a/configs/config_mb_2024_0_0.py b/configs/config_mb_2024_0_0.py
deleted file mode 100644
index 4df5c6963f504411cc4927e7af82322ee164da08..0000000000000000000000000000000000000000
--- a/configs/config_mb_2024_0_0.py
+++ /dev/null
@@ -1,112 +0,0 @@
-import logging
-from ohmpi.utils import get_platform
-
-from paho.mqtt.client import MQTTv31
-
-_, on_pi = get_platform()
-# DEFINE THE ID OF YOUR OhmPi
-ohmpi_id = '0001' if on_pi else 'XXXX'
-# DEFINE YOUR MQTT BROKER (DEFAULT: 'localhost')
-mqtt_broker = 'localhost' if on_pi else 'NAME_YOUR_BROKER_WHEN_IN_SIMULATION_MODE_HERE'
-# DEFINE THE SUFFIX TO ADD TO YOUR LOGS FILES
-logging_suffix = ''
-
-# OhmPi configuration
-OHMPI_CONFIG = {
-    'id': ohmpi_id,  # Unique identifier of the OhmPi board (string)
-    'settings': 'ohmpi_settings.json',  # INSERT YOUR FAVORITE SETTINGS FILE HERE
-}
-
-HARDWARE_CONFIG = {
-    'ctl': {'model' : 'raspberry_pi'},
-    'pwr': {'model' : 'DPS_5005',
-            'voltage_adjustable': True},
-    'tx' : {'model' : 'mb_2024_rev_0_0',
-             'mcp_board_address': 0x20,
-             'current_max': 4800 / 50 / 2,  # Maximum current
-             'r_shunt': 2  # Shunt resistance in Ohms
-            },
-    'rx' : {'model': 'mb_2024_rev_0_0',
-             'coef_p2': 2.50,  # slope for current conversion for ADS.P2, measurement in V/V
-             'nb_samples': 20,  # Max value 10 # was named integer before...
-            },
-    'mux': {'model' : 'ohmpi_i2c_mux64_v1.01',
-             'max_elec': 64,
-             'board_addresses': {'A': 0x73, 'B': 0x72, 'M': 0x71, 'N': 0x70},  # CHECK IF YOUR BOARDS HAVE THESE ADDRESSES
-             'voltage_max': 100,
-             'current_max': 3
-            }
-}
-
-# SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS
-# Execution logging configuration
-EXEC_LOGGING_CONFIG = {
-    'logging_level': logging.INFO,
-    'log_file_logging_level': logging.DEBUG,
-    'logging_to_console': True,
-    'file_name': f'exec{logging_suffix}.log',
-    'max_bytes': 262144,
-    'backup_count': 30,
-    'when': 'd',
-    'interval': 1
-}
-
-# Data logging configuration
-DATA_LOGGING_CONFIG = {
-    'logging_level': logging.INFO,
-    'logging_to_console': True,
-    'file_name': f'data{logging_suffix}.log',
-    'max_bytes': 16777216,
-    'backup_count': 1024,
-    'when': 'd',
-    'interval': 1
-}
-
-# State of Health logging configuration (For a future release)
-SOH_LOGGING_CONFIG = {
-    'logging_level': logging.INFO,
-    'logging_to_console': True,
-    'log_file_logging_level': logging.DEBUG,
-    'file_name': f'soh{logging_suffix}.log',
-    'max_bytes': 16777216,
-    'backup_count': 1024,
-    'when': 'd',
-    'interval': 1
-}
-
-# MQTT logging configuration parameters
-MQTT_LOGGING_CONFIG = {
-    'hostname': mqtt_broker,
-    'port': 1883,
-    'qos': 2,
-    'retain': False,
-    'keepalive': 60,
-    'will': None,
-    'auth': {'username': 'mqtt_user', 'password': 'mqtt_password'},
-    'tls': None,
-    'protocol': MQTTv31,
-    'transport': 'tcp',
-    'client_id': f'{OHMPI_CONFIG["id"]}',
-    'exec_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/exec',
-    'exec_logging_level': logging.DEBUG,
-    'data_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/data',
-    'data_logging_level': DATA_LOGGING_CONFIG['logging_level'],
-    'soh_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/soh',
-    'soh_logging_level': SOH_LOGGING_CONFIG['logging_level']
-}
-
-# MQTT control configuration parameters
-MQTT_CONTROL_CONFIG = {
-    'hostname': mqtt_broker,
-    'port': 1883,
-    'qos': 2,
-    'retain': False,
-    'keepalive': 60,
-    'will': None,
-    'auth': {'username': 'mqtt_user', 'password': 'mqtt_password'},
-    'tls': None,
-    'protocol': MQTTv31,
-    'transport': 'tcp',
-    'client_id': f'{OHMPI_CONFIG["id"]}',
-    'ctrl_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/ctrl'
-}
diff --git a/configs/config_mb_2024_0_2.py b/configs/config_mb_2024_0_2.py
index c73ecf4176c1b9f23935fe196370fb741ae89477..e0516838ee69444ee7862fd5d42a9337a99df8f5 100644
--- a/configs/config_mb_2024_0_2.py
+++ b/configs/config_mb_2024_0_2.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
diff --git a/configs/config_mb_2024_0_2__1_mux_2024.py b/configs/config_mb_2024_0_2__1_mux_2024.py
index ecc683c7d09c56a11ac44cbd4327784e40da45c4..62274c84f84be2d9da542b8c3cf23e3809fff8ac 100644
--- a/configs/config_mb_2024_0_2__1_mux_2024.py
+++ b/configs/config_mb_2024_0_2__1_mux_2024.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
@@ -39,8 +38,6 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'down',
                       'addr1': 'down',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+0, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 12.}
diff --git a/configs/config_mb_2024_0_2__1_mux_2024_dps5005.py b/configs/config_mb_2024_0_2__1_mux_2024_dps5005.py
index 60f5bfc061e71e10431b20ffb1dd670d37997604..f15eec54efae5a587a558eb050ca6a18cc927fd6 100644
--- a/configs/config_mb_2024_0_2__1_mux_2024_dps5005.py
+++ b/configs/config_mb_2024_0_2__1_mux_2024_dps5005.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
@@ -39,8 +38,6 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'down',
                       'addr1': 'down',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+0, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 12.}
diff --git a/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py b/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py
index a0f08b7995d9f7e94ea552d787bda027094792fa..5ed78807197a7a77ba134e9f4a46aa679724dd5c 100644
--- a/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py
+++ b/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
@@ -35,27 +34,23 @@ HARDWARE_CONFIG = {
     'mux': {'boards':
                 {'mux_02':
                      {'model': 'mux_2024_0_X',
+                      'roles': ['A', 'B', 'M', 'N'],
+                      'electrodes': range(1, 9),
                       'tca_address': None,
                       'tca_channel': 0,
                       'addr2': 'up',
-                      'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
-                      'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
-                      'cabling': {(i+0, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
-                      'voltage_max': 12.},
+                      'addr1': 'up'},
                  'mux_05':
                      {'model': 'mux_2024_0_X',
+                      'roles': ['A', 'B', 'M', 'N'],
+                      'electrodes': range(9, 17),
                       'tca_address': None,
                       'tca_channel': 0,
-                      'addr2': 'up',
-                      'addr1': 'down',
-                      'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
-                      'cabling': {(i+8, j): ('mux_05', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
-                      'voltage_max': 12.}
+                      'addr2': 'down',
+                      'addr1': 'down'}
                  },
              'default': {'interface_name': 'i2c_ext',
-                         'voltage_max': 100.,
+                         'voltage_max': 50.,
                          'current_max': 3.}
             }
     }
diff --git a/configs/config_mb_2024_0_2__3_mux_2024_dps5005.py b/configs/config_mb_2024_0_2__3_mux_2024_dps5005.py
index 8fa5f2421b868ae8638be841186eea7b6972a7e8..92f98a304b194bee1bd01cb67d1b30bd500355d5 100644
--- a/configs/config_mb_2024_0_2__3_mux_2024_dps5005.py
+++ b/configs/config_mb_2024_0_2__3_mux_2024_dps5005.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
@@ -39,19 +38,15 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'up',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+8, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 50.},
-                'mux_03':
+                 'mux_03':
                      {'model': 'mux_2024_0_X',
                       'tca_address': None,
                       'tca_channel': 0,
                       'addr2': 'down',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+16, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 50.},
diff --git a/configs/config_mb_2024_0_2__4_mux_2023__4_mux_2024_dps5005.py b/configs/config_mb_2024_0_2__4_mux_2023__4_mux_2024_dps5005.py
index 103f537ed1488796a68bce96b2721c1ccba3199d..ff6fdaa14a75e55ae7ab7510adcbd49a5b98de8c 100644
--- a/configs/config_mb_2024_0_2__4_mux_2023__4_mux_2024_dps5005.py
+++ b/configs/config_mb_2024_0_2__4_mux_2023__4_mux_2024_dps5005.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
@@ -67,8 +66,6 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'up',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+65+8, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 12.},
@@ -78,8 +75,6 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'down',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+65+24, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 12.},
diff --git a/configs/config_mb_2024_0_2__4_mux_2023_dps5005.py b/configs/config_mb_2024_0_2__4_mux_2023_dps5005.py
index abba800afd622de78efddc9ff8fb62855863ab22..d4cad9f9851bbc5f283ff02f6430e2b44a6a20b4 100644
--- a/configs/config_mb_2024_0_2__4_mux_2023_dps5005.py
+++ b/configs/config_mb_2024_0_2__4_mux_2023_dps5005.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
diff --git a/configs/config_mb_2024_0_2__4_mux_2024_dps5005.py b/configs/config_mb_2024_0_2__4_mux_2024_dps5005.py
index 07b11fd5e7ce4f9ad9759e9eaae7ffc4ad234d49..7a95a19e3e252b244cdb90a7c65866994f1a1e56 100644
--- a/configs/config_mb_2024_0_2__4_mux_2024_dps5005.py
+++ b/configs/config_mb_2024_0_2__4_mux_2024_dps5005.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'vmn_hardware_offset': 2501.
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
@@ -39,19 +38,15 @@ HARDWARE_CONFIG = {
                       'tca_channel': 0,
                       'addr2': 'up',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+8, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 50.},
-                'mux_03':
+                 'mux_03':
                      {'model': 'mux_2024_0_X',
                       'tca_address': None,
                       'tca_channel': 0,
                       'addr2': 'down',
                       'addr1': 'up',
-                      # 'mcp_0': '0x26',
-                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+24, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 50.},
diff --git a/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py b/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py
index c88c3bcde37de0285136007b88a30b3d2e982f05..eef3c3daa16f33434f33836d6c244b949d2037b4 100644
--- a/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py
+++ b/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py
@@ -27,7 +27,6 @@ HARDWARE_CONFIG = {
              'interface_name': 'i2c'
             },
     'rx':  {'model': 'mb_2024_0_2',
-             'coef_p2': 1.00,  # slope for conversion for ADS, measurement in V/V
              'latency': 0.010,  # latency in seconds in continuous mode
              'sampling_rate': 50,  # number of samples per second
              'interface_name': 'i2c'
@@ -36,54 +35,50 @@ HARDWARE_CONFIG = {
                 {'mux_A':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x70,
-                      'roles': {'A': 'X'},
-                      'cabling': {(i, j): ('mux_A', i) for j in ['A'] for i in range(1, 65)},
-                      'voltage_max': 12.},
+                      'roles': 'A',
+                      'electrodes': range(1, 65)},
                  'mux_B':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x71,
-                      'roles': {'B': 'X'},
-                      'cabling': {(i, j): ('mux_B', i) for j in ['B'] for i in range(1, 65)},
-                      'voltage_max': 12.},
+                      'roles': 'B',
+                      'electrodes': range(1,65)},
                  'mux_M':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x72,
-                      'roles': {'M': 'X'},
-                      'cabling': {(i, j): ('mux_M', i) for j in ['M'] for i in range(1, 65)},
-                      'voltage_max': 12.},
+                      'roles': 'M',
+                      'electrodes': range(1, 65)},
                  'mux_N':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x73,
-                      'roles': {'N': 'X'},
-                      'cabling': {(i, j): ('mux_N', i) for j in ['N'] for i in range(1, 65)},
-                      'voltage_max': 12.},
-                'mux_A2':
+                      'roles': 'N',
+                      'electrodes': range(1,65),
+                      # 'cabling': {(i, j): ('mux_N', i) for j in ['N'] for i in range(1, 65)},
+                      },
+                 'mux_A2':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x74,
-                      'roles': {'A': 'X'},
-                      'cabling': {(i+64, j): ('mux_A2', i) for j in ['A'] for i in range(1, 65)},
-                      'voltage_max': 12.},
+                      'roles': 'A',
+                      'electrodes': range(65, 129)},
                  'mux_B2':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x75,
-                      'roles': {'B': 'X'},
-                      'cabling': {(i+64, j): ('mux_B2', i) for j in ['B'] for i in range(1, 65)},
-                      'voltage_max': 12.},
+                      'roles': 'B',
+                      'electrodes': range(65,129)},
                  'mux_M2':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x76,
-                      'roles': {'M': 'X'},
-                      'cabling': {(i+64, j): ('mux_M2', i) for j in ['M'] for i in range(1, 65)},
-                      'voltage_max': 12.},
+                      'roles': 'M',
+                      'electrodes': range(65,129)},
                  'mux_N2':
                      {'model': 'mux_2023_0_X',
                       'mux_tca_address': 0x77,
-                      'roles': {'N': 'X'},
-                      'cabling': {(i+64, j): ('mux_N2', i) for j in ['N'] for i in range(1, 65)},
-                      'voltage_max': 12.},
+                      'roles': 'N',
+                      'electrodes': range(65,129),
+                      #'cabling': {(i+64, j): ('mux_N2', i) for j in ['N'] for i in range(1, 65)},
+                      },
                  },
              'default': {'interface_name': 'i2c_ext',
-                         'voltage_max': 100.,
+                         'voltage_max': 50.,
                          'current_max': 3.}
             }
     }
diff --git a/configs/config_tmp.py b/configs/config_tmp.py
deleted file mode 100644
index 26c4c561c5fc960449019bd6fa7901d724d34597..0000000000000000000000000000000000000000
--- a/configs/config_tmp.py
+++ /dev/null
@@ -1,110 +0,0 @@
-import logging
-from ohmpi.utils import get_platform
-
-from paho.mqtt.client import MQTTv31
-
-_, on_pi = get_platform()
-# DEFINE THE ID OF YOUR OhmPi
-ohmpi_id = '0001' if on_pi else 'XXXX'
-# DEFINE YOUR MQTT BROKER (DEFAULT: 'localhost')
-mqtt_broker = 'localhost' if on_pi else 'NAME_YOUR_BROKER_WHEN_IN_SIMULATION_MODE_HERE'
-# DEFINE THE SUFFIX TO ADD TO YOUR LOGS FILES
-logging_suffix = ''
-
-# OhmPi configuration
-OHMPI_CONFIG = {
-    'id': ohmpi_id,  # Unique identifier of the OhmPi board (string)
-    'settings': 'ohmpi_settings.json',  # INSERT YOUR FAVORITE SETTINGS FILE HERE
-}
-
-HARDWARE_CONFIG = {
-    'ctl': {'model' : 'raspberry_pi'},
-    'tx' : {'model' : 'mb_2023_0_X',
-             'mcp_board_address': 0x20,
-             'current_max': 4800 / 50 / 2,  # Maximum current
-             'r_shunt': 2  # Shunt resistance in Ohms
-            },
-    'rx' : {'model': 'mb_2023_0_X',
-             'coef_p2': 2.50,  # slope for current conversion for ADS.P2, measurement in V/V
-             'sampling_rate': 100.,  # Hz
-             'nb_samples': 20,  # Max value 10 # was named integer before...
-            },
-    'mux': {'model' : 'dummy_mux', # 'ohmpi_i2c_mux64_v1.01',
-             'max_elec': 64,
-             'board_addresses': {'A': 0x73, 'B': 0x72, 'M': 0x71, 'N': 0x70},  # CHECK IF YOUR BOARDS HAVE THESE ADDRESSES
-             'voltage_max': 100,
-             'current_max': 3
-            }
-}
-
-# SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS
-# Execution logging configuration
-EXEC_LOGGING_CONFIG = {
-    'logging_level': logging.INFO,
-    'log_file_logging_level': logging.DEBUG,
-    'logging_to_console': True,
-    'file_name': f'exec{logging_suffix}.log',
-    'max_bytes': 262144,
-    'backup_count': 30,
-    'when': 'd',
-    'interval': 1
-}
-
-# Data logging configuration
-DATA_LOGGING_CONFIG = {
-    'logging_level': logging.INFO,
-    'logging_to_console': True,
-    'file_name': f'data{logging_suffix}.log',
-    'max_bytes': 16777216,
-    'backup_count': 1024,
-    'when': 'd',
-    'interval': 1
-}
-
-# State of Health logging configuration (For a future release)
-SOH_LOGGING_CONFIG = {
-    'logging_level': logging.INFO,
-    'logging_to_console': True,
-    'file_name': f'soh{logging_suffix}.log',
-    'max_bytes': 16777216,
-    'backup_count': 1024,
-    'when': 'd',
-    'interval': 1
-}
-
-# MQTT logging configuration parameters
-MQTT_LOGGING_CONFIG = {
-    'hostname': mqtt_broker,
-    'port': 1883,
-    'qos': 2,
-    'retain': False,
-    'keepalive': 60,
-    'will': None,
-    'auth': {'username': 'mqtt_user', 'password': 'mqtt_password'},
-    'tls': None,
-    'protocol': MQTTv31,
-    'transport': 'tcp',
-    'client_id': f'{OHMPI_CONFIG["id"]}',
-    'exec_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/exec',
-    'exec_logging_level': logging.DEBUG,
-    'data_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/data',
-    'data_logging_level': DATA_LOGGING_CONFIG['logging_level'],
-    'soh_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/soh',
-    'soh_logging_level': SOH_LOGGING_CONFIG['logging_level']
-}
-
-# MQTT control configuration parameters
-MQTT_CONTROL_CONFIG = {
-    'hostname': mqtt_broker,
-    'port': 1883,
-    'qos': 2,
-    'retain': False,
-    'keepalive': 60,
-    'will': None,
-    'auth': {'username': 'mqtt_user', 'password': 'mqtt_password'},
-    'tls': None,
-    'protocol': MQTTv31,
-    'transport': 'tcp',
-    'client_id': f'{OHMPI_CONFIG["id"]}',
-    'ctrl_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/ctrl'
-}
diff --git a/dev/test_dummy.py b/dev/test_dummy.py
index 7370c508e36593d30f4c45f4b3e28216225d1dce..72b672c6e2821bc18b5b92d26af22c919d19bc95 100644
--- a/dev/test_dummy.py
+++ b/dev/test_dummy.py
@@ -43,10 +43,10 @@ if within_ohmpi:
     k = OhmPi(mqtt=False)
     k._hw.exec_logger.setLevel(logging.DEBUG)
     A, B, M, N = (32, 29, 31, 30)
-    k.reset_mux()
+    # k.reset_mux()
     # k.test_mux(activation_time=0.01)#mux_id='mux_A')
-    k._hw.switch_mux([A, B, M, N], state='on')
-    k._hw.vab_square_wave(12.,1., cycles=2)
+    # k._hw.switch_mux([A, B, M, N], state='on')
+    # k._hw.vab_square_wave(12.,1., cycles=2)
     # TODO self.tx_sync_wait() is blocking here
     # k._hw.switch_mux([A, B, M, N], state='off')
     # k._hw.calibrate_rx_bias()  # electrodes 1 4 2 3 should be connected to a reference circuit
diff --git a/doc/build/html/_static/underscore-1.12.0.js b/doc/build/html/_static/underscore-1.12.0.js
deleted file mode 100644
index 3af6352e613132675a354b5fc76d03e258fe229e..0000000000000000000000000000000000000000
--- a/doc/build/html/_static/underscore-1.12.0.js
+++ /dev/null
@@ -1,2027 +0,0 @@
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-  typeof define === 'function' && define.amd ? define('underscore', factory) :
-  (global = global || self, (function () {
-    var current = global._;
-    var exports = global._ = factory();
-    exports.noConflict = function () { global._ = current; return exports; };
-  }()));
-}(this, (function () {
-  //     Underscore.js 1.12.0
-  //     https://underscorejs.org
-  //     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-  //     Underscore may be freely distributed under the MIT license.
-
-  // Current version.
-  var VERSION = '1.12.0';
-
-  // Establish the root object, `window` (`self`) in the browser, `global`
-  // on the server, or `this` in some virtual machines. We use `self`
-  // instead of `window` for `WebWorker` support.
-  var root = typeof self == 'object' && self.self === self && self ||
-            typeof global == 'object' && global.global === global && global ||
-            Function('return this')() ||
-            {};
-
-  // Save bytes in the minified (but not gzipped) version:
-  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
-  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
-
-  // Create quick reference variables for speed access to core prototypes.
-  var push = ArrayProto.push,
-      slice = ArrayProto.slice,
-      toString = ObjProto.toString,
-      hasOwnProperty = ObjProto.hasOwnProperty;
-
-  // Modern feature detection.
-  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
-      supportsDataView = typeof DataView !== 'undefined';
-
-  // All **ECMAScript 5+** native function implementations that we hope to use
-  // are declared here.
-  var nativeIsArray = Array.isArray,
-      nativeKeys = Object.keys,
-      nativeCreate = Object.create,
-      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
-
-  // Create references to these builtin functions because we override them.
-  var _isNaN = isNaN,
-      _isFinite = isFinite;
-
-  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
-  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
-  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
-    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
-
-  // The largest integer that can be represented exactly.
-  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
-
-  // Some functions take a variable number of arguments, or a few expected
-  // arguments at the beginning and then a variable number of values to operate
-  // on. This helper accumulates all remaining arguments past the function’s
-  // argument length (or an explicit `startIndex`), into an array that becomes
-  // the last argument. Similar to ES6’s "rest parameter".
-  function restArguments(func, startIndex) {
-    startIndex = startIndex == null ? func.length - 1 : +startIndex;
-    return function() {
-      var length = Math.max(arguments.length - startIndex, 0),
-          rest = Array(length),
-          index = 0;
-      for (; index < length; index++) {
-        rest[index] = arguments[index + startIndex];
-      }
-      switch (startIndex) {
-        case 0: return func.call(this, rest);
-        case 1: return func.call(this, arguments[0], rest);
-        case 2: return func.call(this, arguments[0], arguments[1], rest);
-      }
-      var args = Array(startIndex + 1);
-      for (index = 0; index < startIndex; index++) {
-        args[index] = arguments[index];
-      }
-      args[startIndex] = rest;
-      return func.apply(this, args);
-    };
-  }
-
-  // Is a given variable an object?
-  function isObject(obj) {
-    var type = typeof obj;
-    return type === 'function' || type === 'object' && !!obj;
-  }
-
-  // Is a given value equal to null?
-  function isNull(obj) {
-    return obj === null;
-  }
-
-  // Is a given variable undefined?
-  function isUndefined(obj) {
-    return obj === void 0;
-  }
-
-  // Is a given value a boolean?
-  function isBoolean(obj) {
-    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
-  }
-
-  // Is a given value a DOM element?
-  function isElement(obj) {
-    return !!(obj && obj.nodeType === 1);
-  }
-
-  // Internal function for creating a `toString`-based type tester.
-  function tagTester(name) {
-    var tag = '[object ' + name + ']';
-    return function(obj) {
-      return toString.call(obj) === tag;
-    };
-  }
-
-  var isString = tagTester('String');
-
-  var isNumber = tagTester('Number');
-
-  var isDate = tagTester('Date');
-
-  var isRegExp = tagTester('RegExp');
-
-  var isError = tagTester('Error');
-
-  var isSymbol = tagTester('Symbol');
-
-  var isArrayBuffer = tagTester('ArrayBuffer');
-
-  var isFunction = tagTester('Function');
-
-  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
-  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
-  var nodelist = root.document && root.document.childNodes;
-  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
-    isFunction = function(obj) {
-      return typeof obj == 'function' || false;
-    };
-  }
-
-  var isFunction$1 = isFunction;
-
-  var hasObjectTag = tagTester('Object');
-
-  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
-  // In IE 11, the most common among them, this problem also applies to
-  // `Map`, `WeakMap` and `Set`.
-  var hasStringTagBug = (
-        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
-      ),
-      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
-
-  var isDataView = tagTester('DataView');
-
-  // In IE 10 - Edge 13, we need a different heuristic
-  // to determine whether an object is a `DataView`.
-  function ie10IsDataView(obj) {
-    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
-  }
-
-  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
-
-  // Is a given value an array?
-  // Delegates to ECMA5's native `Array.isArray`.
-  var isArray = nativeIsArray || tagTester('Array');
-
-  // Internal function to check whether `key` is an own property name of `obj`.
-  function has(obj, key) {
-    return obj != null && hasOwnProperty.call(obj, key);
-  }
-
-  var isArguments = tagTester('Arguments');
-
-  // Define a fallback version of the method in browsers (ahem, IE < 9), where
-  // there isn't any inspectable "Arguments" type.
-  (function() {
-    if (!isArguments(arguments)) {
-      isArguments = function(obj) {
-        return has(obj, 'callee');
-      };
-    }
-  }());
-
-  var isArguments$1 = isArguments;
-
-  // Is a given object a finite number?
-  function isFinite$1(obj) {
-    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
-  }
-
-  // Is the given value `NaN`?
-  function isNaN$1(obj) {
-    return isNumber(obj) && _isNaN(obj);
-  }
-
-  // Predicate-generating function. Often useful outside of Underscore.
-  function constant(value) {
-    return function() {
-      return value;
-    };
-  }
-
-  // Common internal logic for `isArrayLike` and `isBufferLike`.
-  function createSizePropertyCheck(getSizeProperty) {
-    return function(collection) {
-      var sizeProperty = getSizeProperty(collection);
-      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
-    }
-  }
-
-  // Internal helper to generate a function to obtain property `key` from `obj`.
-  function shallowProperty(key) {
-    return function(obj) {
-      return obj == null ? void 0 : obj[key];
-    };
-  }
-
-  // Internal helper to obtain the `byteLength` property of an object.
-  var getByteLength = shallowProperty('byteLength');
-
-  // Internal helper to determine whether we should spend extensive checks against
-  // `ArrayBuffer` et al.
-  var isBufferLike = createSizePropertyCheck(getByteLength);
-
-  // Is a given value a typed array?
-  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
-  function isTypedArray(obj) {
-    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
-    // Otherwise, fall back on the above regular expression.
-    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
-                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
-  }
-
-  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
-
-  // Internal helper to obtain the `length` property of an object.
-  var getLength = shallowProperty('length');
-
-  // Internal helper to create a simple lookup structure.
-  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
-  // circular imports. `emulatedSet` is a one-off solution that only works for
-  // arrays of strings.
-  function emulatedSet(keys) {
-    var hash = {};
-    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
-    return {
-      contains: function(key) { return hash[key]; },
-      push: function(key) {
-        hash[key] = true;
-        return keys.push(key);
-      }
-    };
-  }
-
-  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
-  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
-  // needed.
-  function collectNonEnumProps(obj, keys) {
-    keys = emulatedSet(keys);
-    var nonEnumIdx = nonEnumerableProps.length;
-    var constructor = obj.constructor;
-    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
-
-    // Constructor is a special case.
-    var prop = 'constructor';
-    if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);
-
-    while (nonEnumIdx--) {
-      prop = nonEnumerableProps[nonEnumIdx];
-      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
-        keys.push(prop);
-      }
-    }
-  }
-
-  // Retrieve the names of an object's own properties.
-  // Delegates to **ECMAScript 5**'s native `Object.keys`.
-  function keys(obj) {
-    if (!isObject(obj)) return [];
-    if (nativeKeys) return nativeKeys(obj);
-    var keys = [];
-    for (var key in obj) if (has(obj, key)) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  }
-
-  // Is a given array, string, or object empty?
-  // An "empty" object has no enumerable own-properties.
-  function isEmpty(obj) {
-    if (obj == null) return true;
-    // Skip the more expensive `toString`-based type checks if `obj` has no
-    // `.length`.
-    var length = getLength(obj);
-    if (typeof length == 'number' && (
-      isArray(obj) || isString(obj) || isArguments$1(obj)
-    )) return length === 0;
-    return getLength(keys(obj)) === 0;
-  }
-
-  // Returns whether an object has a given set of `key:value` pairs.
-  function isMatch(object, attrs) {
-    var _keys = keys(attrs), length = _keys.length;
-    if (object == null) return !length;
-    var obj = Object(object);
-    for (var i = 0; i < length; i++) {
-      var key = _keys[i];
-      if (attrs[key] !== obj[key] || !(key in obj)) return false;
-    }
-    return true;
-  }
-
-  // If Underscore is called as a function, it returns a wrapped object that can
-  // be used OO-style. This wrapper holds altered versions of all functions added
-  // through `_.mixin`. Wrapped objects may be chained.
-  function _(obj) {
-    if (obj instanceof _) return obj;
-    if (!(this instanceof _)) return new _(obj);
-    this._wrapped = obj;
-  }
-
-  _.VERSION = VERSION;
-
-  // Extracts the result from a wrapped and chained object.
-  _.prototype.value = function() {
-    return this._wrapped;
-  };
-
-  // Provide unwrapping proxies for some methods used in engine operations
-  // such as arithmetic and JSON stringification.
-  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
-
-  _.prototype.toString = function() {
-    return String(this._wrapped);
-  };
-
-  // Internal function to wrap or shallow-copy an ArrayBuffer,
-  // typed array or DataView to a new view, reusing the buffer.
-  function toBufferView(bufferSource) {
-    return new Uint8Array(
-      bufferSource.buffer || bufferSource,
-      bufferSource.byteOffset || 0,
-      getByteLength(bufferSource)
-    );
-  }
-
-  // We use this string twice, so give it a name for minification.
-  var tagDataView = '[object DataView]';
-
-  // Internal recursive comparison function for `_.isEqual`.
-  function eq(a, b, aStack, bStack) {
-    // Identical objects are equal. `0 === -0`, but they aren't identical.
-    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
-    if (a === b) return a !== 0 || 1 / a === 1 / b;
-    // `null` or `undefined` only equal to itself (strict comparison).
-    if (a == null || b == null) return false;
-    // `NaN`s are equivalent, but non-reflexive.
-    if (a !== a) return b !== b;
-    // Exhaust primitive checks
-    var type = typeof a;
-    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
-    return deepEq(a, b, aStack, bStack);
-  }
-
-  // Internal recursive comparison function for `_.isEqual`.
-  function deepEq(a, b, aStack, bStack) {
-    // Unwrap any wrapped objects.
-    if (a instanceof _) a = a._wrapped;
-    if (b instanceof _) b = b._wrapped;
-    // Compare `[[Class]]` names.
-    var className = toString.call(a);
-    if (className !== toString.call(b)) return false;
-    // Work around a bug in IE 10 - Edge 13.
-    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
-      if (!isDataView$1(b)) return false;
-      className = tagDataView;
-    }
-    switch (className) {
-      // These types are compared by value.
-      case '[object RegExp]':
-        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-      case '[object String]':
-        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-        // equivalent to `new String("5")`.
-        return '' + a === '' + b;
-      case '[object Number]':
-        // `NaN`s are equivalent, but non-reflexive.
-        // Object(NaN) is equivalent to NaN.
-        if (+a !== +a) return +b !== +b;
-        // An `egal` comparison is performed for other numeric values.
-        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-      case '[object Date]':
-      case '[object Boolean]':
-        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-        // millisecond representations. Note that invalid dates with millisecond representations
-        // of `NaN` are not equivalent.
-        return +a === +b;
-      case '[object Symbol]':
-        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
-      case '[object ArrayBuffer]':
-      case tagDataView:
-        // Coerce to typed array so we can fall through.
-        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
-    }
-
-    var areArrays = className === '[object Array]';
-    if (!areArrays && isTypedArray$1(a)) {
-        var byteLength = getByteLength(a);
-        if (byteLength !== getByteLength(b)) return false;
-        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
-        areArrays = true;
-    }
-    if (!areArrays) {
-      if (typeof a != 'object' || typeof b != 'object') return false;
-
-      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-      // from different frames are.
-      var aCtor = a.constructor, bCtor = b.constructor;
-      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
-                               isFunction$1(bCtor) && bCtor instanceof bCtor)
-                          && ('constructor' in a && 'constructor' in b)) {
-        return false;
-      }
-    }
-    // Assume equality for cyclic structures. The algorithm for detecting cyclic
-    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-    // Initializing stack of traversed objects.
-    // It's done here since we only need them for objects and arrays comparison.
-    aStack = aStack || [];
-    bStack = bStack || [];
-    var length = aStack.length;
-    while (length--) {
-      // Linear search. Performance is inversely proportional to the number of
-      // unique nested structures.
-      if (aStack[length] === a) return bStack[length] === b;
-    }
-
-    // Add the first object to the stack of traversed objects.
-    aStack.push(a);
-    bStack.push(b);
-
-    // Recursively compare objects and arrays.
-    if (areArrays) {
-      // Compare array lengths to determine if a deep comparison is necessary.
-      length = a.length;
-      if (length !== b.length) return false;
-      // Deep compare the contents, ignoring non-numeric properties.
-      while (length--) {
-        if (!eq(a[length], b[length], aStack, bStack)) return false;
-      }
-    } else {
-      // Deep compare objects.
-      var _keys = keys(a), key;
-      length = _keys.length;
-      // Ensure that both objects contain the same number of properties before comparing deep equality.
-      if (keys(b).length !== length) return false;
-      while (length--) {
-        // Deep compare each member
-        key = _keys[length];
-        if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
-      }
-    }
-    // Remove the first object from the stack of traversed objects.
-    aStack.pop();
-    bStack.pop();
-    return true;
-  }
-
-  // Perform a deep comparison to check if two objects are equal.
-  function isEqual(a, b) {
-    return eq(a, b);
-  }
-
-  // Retrieve all the enumerable property names of an object.
-  function allKeys(obj) {
-    if (!isObject(obj)) return [];
-    var keys = [];
-    for (var key in obj) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  }
-
-  // Since the regular `Object.prototype.toString` type tests don't work for
-  // some types in IE 11, we use a fingerprinting heuristic instead, based
-  // on the methods. It's not great, but it's the best we got.
-  // The fingerprint method lists are defined below.
-  function ie11fingerprint(methods) {
-    var length = getLength(methods);
-    return function(obj) {
-      if (obj == null) return false;
-      // `Map`, `WeakMap` and `Set` have no enumerable keys.
-      var keys = allKeys(obj);
-      if (getLength(keys)) return false;
-      for (var i = 0; i < length; i++) {
-        if (!isFunction$1(obj[methods[i]])) return false;
-      }
-      // If we are testing against `WeakMap`, we need to ensure that
-      // `obj` doesn't have a `forEach` method in order to distinguish
-      // it from a regular `Map`.
-      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
-    };
-  }
-
-  // In the interest of compact minification, we write
-  // each string in the fingerprints only once.
-  var forEachName = 'forEach',
-      hasName = 'has',
-      commonInit = ['clear', 'delete'],
-      mapTail = ['get', hasName, 'set'];
-
-  // `Map`, `WeakMap` and `Set` each have slightly different
-  // combinations of the above sublists.
-  var mapMethods = commonInit.concat(forEachName, mapTail),
-      weakMapMethods = commonInit.concat(mapTail),
-      setMethods = ['add'].concat(commonInit, forEachName, hasName);
-
-  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
-
-  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
-
-  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
-
-  var isWeakSet = tagTester('WeakSet');
-
-  // Retrieve the values of an object's properties.
-  function values(obj) {
-    var _keys = keys(obj);
-    var length = _keys.length;
-    var values = Array(length);
-    for (var i = 0; i < length; i++) {
-      values[i] = obj[_keys[i]];
-    }
-    return values;
-  }
-
-  // Convert an object into a list of `[key, value]` pairs.
-  // The opposite of `_.object` with one argument.
-  function pairs(obj) {
-    var _keys = keys(obj);
-    var length = _keys.length;
-    var pairs = Array(length);
-    for (var i = 0; i < length; i++) {
-      pairs[i] = [_keys[i], obj[_keys[i]]];
-    }
-    return pairs;
-  }
-
-  // Invert the keys and values of an object. The values must be serializable.
-  function invert(obj) {
-    var result = {};
-    var _keys = keys(obj);
-    for (var i = 0, length = _keys.length; i < length; i++) {
-      result[obj[_keys[i]]] = _keys[i];
-    }
-    return result;
-  }
-
-  // Return a sorted list of the function names available on the object.
-  function functions(obj) {
-    var names = [];
-    for (var key in obj) {
-      if (isFunction$1(obj[key])) names.push(key);
-    }
-    return names.sort();
-  }
-
-  // An internal function for creating assigner functions.
-  function createAssigner(keysFunc, defaults) {
-    return function(obj) {
-      var length = arguments.length;
-      if (defaults) obj = Object(obj);
-      if (length < 2 || obj == null) return obj;
-      for (var index = 1; index < length; index++) {
-        var source = arguments[index],
-            keys = keysFunc(source),
-            l = keys.length;
-        for (var i = 0; i < l; i++) {
-          var key = keys[i];
-          if (!defaults || obj[key] === void 0) obj[key] = source[key];
-        }
-      }
-      return obj;
-    };
-  }
-
-  // Extend a given object with all the properties in passed-in object(s).
-  var extend = createAssigner(allKeys);
-
-  // Assigns a given object with all the own properties in the passed-in
-  // object(s).
-  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
-  var extendOwn = createAssigner(keys);
-
-  // Fill in a given object with default properties.
-  var defaults = createAssigner(allKeys, true);
-
-  // Create a naked function reference for surrogate-prototype-swapping.
-  function ctor() {
-    return function(){};
-  }
-
-  // An internal function for creating a new object that inherits from another.
-  function baseCreate(prototype) {
-    if (!isObject(prototype)) return {};
-    if (nativeCreate) return nativeCreate(prototype);
-    var Ctor = ctor();
-    Ctor.prototype = prototype;
-    var result = new Ctor;
-    Ctor.prototype = null;
-    return result;
-  }
-
-  // Creates an object that inherits from the given prototype object.
-  // If additional properties are provided then they will be added to the
-  // created object.
-  function create(prototype, props) {
-    var result = baseCreate(prototype);
-    if (props) extendOwn(result, props);
-    return result;
-  }
-
-  // Create a (shallow-cloned) duplicate of an object.
-  function clone(obj) {
-    if (!isObject(obj)) return obj;
-    return isArray(obj) ? obj.slice() : extend({}, obj);
-  }
-
-  // Invokes `interceptor` with the `obj` and then returns `obj`.
-  // The primary purpose of this method is to "tap into" a method chain, in
-  // order to perform operations on intermediate results within the chain.
-  function tap(obj, interceptor) {
-    interceptor(obj);
-    return obj;
-  }
-
-  // Normalize a (deep) property `path` to array.
-  // Like `_.iteratee`, this function can be customized.
-  function toPath(path) {
-    return isArray(path) ? path : [path];
-  }
-  _.toPath = toPath;
-
-  // Internal wrapper for `_.toPath` to enable minification.
-  // Similar to `cb` for `_.iteratee`.
-  function toPath$1(path) {
-    return _.toPath(path);
-  }
-
-  // Internal function to obtain a nested property in `obj` along `path`.
-  function deepGet(obj, path) {
-    var length = path.length;
-    for (var i = 0; i < length; i++) {
-      if (obj == null) return void 0;
-      obj = obj[path[i]];
-    }
-    return length ? obj : void 0;
-  }
-
-  // Get the value of the (deep) property on `path` from `object`.
-  // If any property in `path` does not exist or if the value is
-  // `undefined`, return `defaultValue` instead.
-  // The `path` is normalized through `_.toPath`.
-  function get(object, path, defaultValue) {
-    var value = deepGet(object, toPath$1(path));
-    return isUndefined(value) ? defaultValue : value;
-  }
-
-  // Shortcut function for checking if an object has a given property directly on
-  // itself (in other words, not on a prototype). Unlike the internal `has`
-  // function, this public version can also traverse nested properties.
-  function has$1(obj, path) {
-    path = toPath$1(path);
-    var length = path.length;
-    for (var i = 0; i < length; i++) {
-      var key = path[i];
-      if (!has(obj, key)) return false;
-      obj = obj[key];
-    }
-    return !!length;
-  }
-
-  // Keep the identity function around for default iteratees.
-  function identity(value) {
-    return value;
-  }
-
-  // Returns a predicate for checking whether an object has a given set of
-  // `key:value` pairs.
-  function matcher(attrs) {
-    attrs = extendOwn({}, attrs);
-    return function(obj) {
-      return isMatch(obj, attrs);
-    };
-  }
-
-  // Creates a function that, when passed an object, will traverse that object’s
-  // properties down the given `path`, specified as an array of keys or indices.
-  function property(path) {
-    path = toPath$1(path);
-    return function(obj) {
-      return deepGet(obj, path);
-    };
-  }
-
-  // Internal function that returns an efficient (for current engines) version
-  // of the passed-in callback, to be repeatedly applied in other Underscore
-  // functions.
-  function optimizeCb(func, context, argCount) {
-    if (context === void 0) return func;
-    switch (argCount == null ? 3 : argCount) {
-      case 1: return function(value) {
-        return func.call(context, value);
-      };
-      // The 2-argument case is omitted because we’re not using it.
-      case 3: return function(value, index, collection) {
-        return func.call(context, value, index, collection);
-      };
-      case 4: return function(accumulator, value, index, collection) {
-        return func.call(context, accumulator, value, index, collection);
-      };
-    }
-    return function() {
-      return func.apply(context, arguments);
-    };
-  }
-
-  // An internal function to generate callbacks that can be applied to each
-  // element in a collection, returning the desired result — either `_.identity`,
-  // an arbitrary callback, a property matcher, or a property accessor.
-  function baseIteratee(value, context, argCount) {
-    if (value == null) return identity;
-    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
-    if (isObject(value) && !isArray(value)) return matcher(value);
-    return property(value);
-  }
-
-  // External wrapper for our callback generator. Users may customize
-  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
-  // This abstraction hides the internal-only `argCount` argument.
-  function iteratee(value, context) {
-    return baseIteratee(value, context, Infinity);
-  }
-  _.iteratee = iteratee;
-
-  // The function we call internally to generate a callback. It invokes
-  // `_.iteratee` if overridden, otherwise `baseIteratee`.
-  function cb(value, context, argCount) {
-    if (_.iteratee !== iteratee) return _.iteratee(value, context);
-    return baseIteratee(value, context, argCount);
-  }
-
-  // Returns the results of applying the `iteratee` to each element of `obj`.
-  // In contrast to `_.map` it returns an object.
-  function mapObject(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var _keys = keys(obj),
-        length = _keys.length,
-        results = {};
-    for (var index = 0; index < length; index++) {
-      var currentKey = _keys[index];
-      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
-    }
-    return results;
-  }
-
-  // Predicate-generating function. Often useful outside of Underscore.
-  function noop(){}
-
-  // Generates a function for a given object that returns a given property.
-  function propertyOf(obj) {
-    if (obj == null) return noop;
-    return function(path) {
-      return get(obj, path);
-    };
-  }
-
-  // Run a function **n** times.
-  function times(n, iteratee, context) {
-    var accum = Array(Math.max(0, n));
-    iteratee = optimizeCb(iteratee, context, 1);
-    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
-    return accum;
-  }
-
-  // Return a random integer between `min` and `max` (inclusive).
-  function random(min, max) {
-    if (max == null) {
-      max = min;
-      min = 0;
-    }
-    return min + Math.floor(Math.random() * (max - min + 1));
-  }
-
-  // A (possibly faster) way to get the current timestamp as an integer.
-  var now = Date.now || function() {
-    return new Date().getTime();
-  };
-
-  // Internal helper to generate functions for escaping and unescaping strings
-  // to/from HTML interpolation.
-  function createEscaper(map) {
-    var escaper = function(match) {
-      return map[match];
-    };
-    // Regexes for identifying a key that needs to be escaped.
-    var source = '(?:' + keys(map).join('|') + ')';
-    var testRegexp = RegExp(source);
-    var replaceRegexp = RegExp(source, 'g');
-    return function(string) {
-      string = string == null ? '' : '' + string;
-      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
-    };
-  }
-
-  // Internal list of HTML entities for escaping.
-  var escapeMap = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#x27;',
-    '`': '&#x60;'
-  };
-
-  // Function for escaping strings to HTML interpolation.
-  var _escape = createEscaper(escapeMap);
-
-  // Internal list of HTML entities for unescaping.
-  var unescapeMap = invert(escapeMap);
-
-  // Function for unescaping strings from HTML interpolation.
-  var _unescape = createEscaper(unescapeMap);
-
-  // By default, Underscore uses ERB-style template delimiters. Change the
-  // following template settings to use alternative delimiters.
-  var templateSettings = _.templateSettings = {
-    evaluate: /<%([\s\S]+?)%>/g,
-    interpolate: /<%=([\s\S]+?)%>/g,
-    escape: /<%-([\s\S]+?)%>/g
-  };
-
-  // When customizing `_.templateSettings`, if you don't want to define an
-  // interpolation, evaluation or escaping regex, we need one that is
-  // guaranteed not to match.
-  var noMatch = /(.)^/;
-
-  // Certain characters need to be escaped so that they can be put into a
-  // string literal.
-  var escapes = {
-    "'": "'",
-    '\\': '\\',
-    '\r': 'r',
-    '\n': 'n',
-    '\u2028': 'u2028',
-    '\u2029': 'u2029'
-  };
-
-  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
-
-  function escapeChar(match) {
-    return '\\' + escapes[match];
-  }
-
-  // JavaScript micro-templating, similar to John Resig's implementation.
-  // Underscore templating handles arbitrary delimiters, preserves whitespace,
-  // and correctly escapes quotes within interpolated code.
-  // NB: `oldSettings` only exists for backwards compatibility.
-  function template(text, settings, oldSettings) {
-    if (!settings && oldSettings) settings = oldSettings;
-    settings = defaults({}, settings, _.templateSettings);
-
-    // Combine delimiters into one regular expression via alternation.
-    var matcher = RegExp([
-      (settings.escape || noMatch).source,
-      (settings.interpolate || noMatch).source,
-      (settings.evaluate || noMatch).source
-    ].join('|') + '|$', 'g');
-
-    // Compile the template source, escaping string literals appropriately.
-    var index = 0;
-    var source = "__p+='";
-    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
-      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
-      index = offset + match.length;
-
-      if (escape) {
-        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
-      } else if (interpolate) {
-        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
-      } else if (evaluate) {
-        source += "';\n" + evaluate + "\n__p+='";
-      }
-
-      // Adobe VMs need the match returned to produce the correct offset.
-      return match;
-    });
-    source += "';\n";
-
-    // If a variable is not specified, place data values in local scope.
-    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
-
-    source = "var __t,__p='',__j=Array.prototype.join," +
-      "print=function(){__p+=__j.call(arguments,'');};\n" +
-      source + 'return __p;\n';
-
-    var render;
-    try {
-      render = new Function(settings.variable || 'obj', '_', source);
-    } catch (e) {
-      e.source = source;
-      throw e;
-    }
-
-    var template = function(data) {
-      return render.call(this, data, _);
-    };
-
-    // Provide the compiled source as a convenience for precompilation.
-    var argument = settings.variable || 'obj';
-    template.source = 'function(' + argument + '){\n' + source + '}';
-
-    return template;
-  }
-
-  // Traverses the children of `obj` along `path`. If a child is a function, it
-  // is invoked with its parent as context. Returns the value of the final
-  // child, or `fallback` if any child is undefined.
-  function result(obj, path, fallback) {
-    path = toPath$1(path);
-    var length = path.length;
-    if (!length) {
-      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
-    }
-    for (var i = 0; i < length; i++) {
-      var prop = obj == null ? void 0 : obj[path[i]];
-      if (prop === void 0) {
-        prop = fallback;
-        i = length; // Ensure we don't continue iterating.
-      }
-      obj = isFunction$1(prop) ? prop.call(obj) : prop;
-    }
-    return obj;
-  }
-
-  // Generate a unique integer id (unique within the entire client session).
-  // Useful for temporary DOM ids.
-  var idCounter = 0;
-  function uniqueId(prefix) {
-    var id = ++idCounter + '';
-    return prefix ? prefix + id : id;
-  }
-
-  // Start chaining a wrapped Underscore object.
-  function chain(obj) {
-    var instance = _(obj);
-    instance._chain = true;
-    return instance;
-  }
-
-  // Internal function to execute `sourceFunc` bound to `context` with optional
-  // `args`. Determines whether to execute a function as a constructor or as a
-  // normal function.
-  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
-    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
-    var self = baseCreate(sourceFunc.prototype);
-    var result = sourceFunc.apply(self, args);
-    if (isObject(result)) return result;
-    return self;
-  }
-
-  // Partially apply a function by creating a version that has had some of its
-  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
-  // as a placeholder by default, allowing any combination of arguments to be
-  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
-  var partial = restArguments(function(func, boundArgs) {
-    var placeholder = partial.placeholder;
-    var bound = function() {
-      var position = 0, length = boundArgs.length;
-      var args = Array(length);
-      for (var i = 0; i < length; i++) {
-        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
-      }
-      while (position < arguments.length) args.push(arguments[position++]);
-      return executeBound(func, bound, this, this, args);
-    };
-    return bound;
-  });
-
-  partial.placeholder = _;
-
-  // Create a function bound to a given object (assigning `this`, and arguments,
-  // optionally).
-  var bind = restArguments(function(func, context, args) {
-    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
-    var bound = restArguments(function(callArgs) {
-      return executeBound(func, bound, context, this, args.concat(callArgs));
-    });
-    return bound;
-  });
-
-  // Internal helper for collection methods to determine whether a collection
-  // should be iterated as an array or as an object.
-  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
-  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
-  var isArrayLike = createSizePropertyCheck(getLength);
-
-  // Internal implementation of a recursive `flatten` function.
-  function flatten(input, depth, strict, output) {
-    output = output || [];
-    if (!depth && depth !== 0) {
-      depth = Infinity;
-    } else if (depth <= 0) {
-      return output.concat(input);
-    }
-    var idx = output.length;
-    for (var i = 0, length = getLength(input); i < length; i++) {
-      var value = input[i];
-      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
-        // Flatten current level of array or arguments object.
-        if (depth > 1) {
-          flatten(value, depth - 1, strict, output);
-          idx = output.length;
-        } else {
-          var j = 0, len = value.length;
-          while (j < len) output[idx++] = value[j++];
-        }
-      } else if (!strict) {
-        output[idx++] = value;
-      }
-    }
-    return output;
-  }
-
-  // Bind a number of an object's methods to that object. Remaining arguments
-  // are the method names to be bound. Useful for ensuring that all callbacks
-  // defined on an object belong to it.
-  var bindAll = restArguments(function(obj, keys) {
-    keys = flatten(keys, false, false);
-    var index = keys.length;
-    if (index < 1) throw new Error('bindAll must be passed function names');
-    while (index--) {
-      var key = keys[index];
-      obj[key] = bind(obj[key], obj);
-    }
-    return obj;
-  });
-
-  // Memoize an expensive function by storing its results.
-  function memoize(func, hasher) {
-    var memoize = function(key) {
-      var cache = memoize.cache;
-      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
-      if (!has(cache, address)) cache[address] = func.apply(this, arguments);
-      return cache[address];
-    };
-    memoize.cache = {};
-    return memoize;
-  }
-
-  // Delays a function for the given number of milliseconds, and then calls
-  // it with the arguments supplied.
-  var delay = restArguments(function(func, wait, args) {
-    return setTimeout(function() {
-      return func.apply(null, args);
-    }, wait);
-  });
-
-  // Defers a function, scheduling it to run after the current call stack has
-  // cleared.
-  var defer = partial(delay, _, 1);
-
-  // Returns a function, that, when invoked, will only be triggered at most once
-  // during a given window of time. Normally, the throttled function will run
-  // as much as it can, without ever going more than once per `wait` duration;
-  // but if you'd like to disable the execution on the leading edge, pass
-  // `{leading: false}`. To disable execution on the trailing edge, ditto.
-  function throttle(func, wait, options) {
-    var timeout, context, args, result;
-    var previous = 0;
-    if (!options) options = {};
-
-    var later = function() {
-      previous = options.leading === false ? 0 : now();
-      timeout = null;
-      result = func.apply(context, args);
-      if (!timeout) context = args = null;
-    };
-
-    var throttled = function() {
-      var _now = now();
-      if (!previous && options.leading === false) previous = _now;
-      var remaining = wait - (_now - previous);
-      context = this;
-      args = arguments;
-      if (remaining <= 0 || remaining > wait) {
-        if (timeout) {
-          clearTimeout(timeout);
-          timeout = null;
-        }
-        previous = _now;
-        result = func.apply(context, args);
-        if (!timeout) context = args = null;
-      } else if (!timeout && options.trailing !== false) {
-        timeout = setTimeout(later, remaining);
-      }
-      return result;
-    };
-
-    throttled.cancel = function() {
-      clearTimeout(timeout);
-      previous = 0;
-      timeout = context = args = null;
-    };
-
-    return throttled;
-  }
-
-  // When a sequence of calls of the returned function ends, the argument
-  // function is triggered. The end of a sequence is defined by the `wait`
-  // parameter. If `immediate` is passed, the argument function will be
-  // triggered at the beginning of the sequence instead of at the end.
-  function debounce(func, wait, immediate) {
-    var timeout, previous, args, result, context;
-
-    var later = function() {
-      var passed = now() - previous;
-      if (wait > passed) {
-        timeout = setTimeout(later, wait - passed);
-      } else {
-        timeout = null;
-        if (!immediate) result = func.apply(context, args);
-        // This check is needed because `func` can recursively invoke `debounced`.
-        if (!timeout) args = context = null;
-      }
-    };
-
-    var debounced = restArguments(function(_args) {
-      context = this;
-      args = _args;
-      previous = now();
-      if (!timeout) {
-        timeout = setTimeout(later, wait);
-        if (immediate) result = func.apply(context, args);
-      }
-      return result;
-    });
-
-    debounced.cancel = function() {
-      clearTimeout(timeout);
-      timeout = args = context = null;
-    };
-
-    return debounced;
-  }
-
-  // Returns the first function passed as an argument to the second,
-  // allowing you to adjust arguments, run code before and after, and
-  // conditionally execute the original function.
-  function wrap(func, wrapper) {
-    return partial(wrapper, func);
-  }
-
-  // Returns a negated version of the passed-in predicate.
-  function negate(predicate) {
-    return function() {
-      return !predicate.apply(this, arguments);
-    };
-  }
-
-  // Returns a function that is the composition of a list of functions, each
-  // consuming the return value of the function that follows.
-  function compose() {
-    var args = arguments;
-    var start = args.length - 1;
-    return function() {
-      var i = start;
-      var result = args[start].apply(this, arguments);
-      while (i--) result = args[i].call(this, result);
-      return result;
-    };
-  }
-
-  // Returns a function that will only be executed on and after the Nth call.
-  function after(times, func) {
-    return function() {
-      if (--times < 1) {
-        return func.apply(this, arguments);
-      }
-    };
-  }
-
-  // Returns a function that will only be executed up to (but not including) the
-  // Nth call.
-  function before(times, func) {
-    var memo;
-    return function() {
-      if (--times > 0) {
-        memo = func.apply(this, arguments);
-      }
-      if (times <= 1) func = null;
-      return memo;
-    };
-  }
-
-  // Returns a function that will be executed at most one time, no matter how
-  // often you call it. Useful for lazy initialization.
-  var once = partial(before, 2);
-
-  // Returns the first key on an object that passes a truth test.
-  function findKey(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var _keys = keys(obj), key;
-    for (var i = 0, length = _keys.length; i < length; i++) {
-      key = _keys[i];
-      if (predicate(obj[key], key, obj)) return key;
-    }
-  }
-
-  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
-  function createPredicateIndexFinder(dir) {
-    return function(array, predicate, context) {
-      predicate = cb(predicate, context);
-      var length = getLength(array);
-      var index = dir > 0 ? 0 : length - 1;
-      for (; index >= 0 && index < length; index += dir) {
-        if (predicate(array[index], index, array)) return index;
-      }
-      return -1;
-    };
-  }
-
-  // Returns the first index on an array-like that passes a truth test.
-  var findIndex = createPredicateIndexFinder(1);
-
-  // Returns the last index on an array-like that passes a truth test.
-  var findLastIndex = createPredicateIndexFinder(-1);
-
-  // Use a comparator function to figure out the smallest index at which
-  // an object should be inserted so as to maintain order. Uses binary search.
-  function sortedIndex(array, obj, iteratee, context) {
-    iteratee = cb(iteratee, context, 1);
-    var value = iteratee(obj);
-    var low = 0, high = getLength(array);
-    while (low < high) {
-      var mid = Math.floor((low + high) / 2);
-      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
-    }
-    return low;
-  }
-
-  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
-  function createIndexFinder(dir, predicateFind, sortedIndex) {
-    return function(array, item, idx) {
-      var i = 0, length = getLength(array);
-      if (typeof idx == 'number') {
-        if (dir > 0) {
-          i = idx >= 0 ? idx : Math.max(idx + length, i);
-        } else {
-          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
-        }
-      } else if (sortedIndex && idx && length) {
-        idx = sortedIndex(array, item);
-        return array[idx] === item ? idx : -1;
-      }
-      if (item !== item) {
-        idx = predicateFind(slice.call(array, i, length), isNaN$1);
-        return idx >= 0 ? idx + i : -1;
-      }
-      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
-        if (array[idx] === item) return idx;
-      }
-      return -1;
-    };
-  }
-
-  // Return the position of the first occurrence of an item in an array,
-  // or -1 if the item is not included in the array.
-  // If the array is large and already in sort order, pass `true`
-  // for **isSorted** to use binary search.
-  var indexOf = createIndexFinder(1, findIndex, sortedIndex);
-
-  // Return the position of the last occurrence of an item in an array,
-  // or -1 if the item is not included in the array.
-  var lastIndexOf = createIndexFinder(-1, findLastIndex);
-
-  // Return the first value which passes a truth test.
-  function find(obj, predicate, context) {
-    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
-    var key = keyFinder(obj, predicate, context);
-    if (key !== void 0 && key !== -1) return obj[key];
-  }
-
-  // Convenience version of a common use case of `_.find`: getting the first
-  // object containing specific `key:value` pairs.
-  function findWhere(obj, attrs) {
-    return find(obj, matcher(attrs));
-  }
-
-  // The cornerstone for collection functions, an `each`
-  // implementation, aka `forEach`.
-  // Handles raw objects in addition to array-likes. Treats all
-  // sparse array-likes as if they were dense.
-  function each(obj, iteratee, context) {
-    iteratee = optimizeCb(iteratee, context);
-    var i, length;
-    if (isArrayLike(obj)) {
-      for (i = 0, length = obj.length; i < length; i++) {
-        iteratee(obj[i], i, obj);
-      }
-    } else {
-      var _keys = keys(obj);
-      for (i = 0, length = _keys.length; i < length; i++) {
-        iteratee(obj[_keys[i]], _keys[i], obj);
-      }
-    }
-    return obj;
-  }
-
-  // Return the results of applying the iteratee to each element.
-  function map(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var _keys = !isArrayLike(obj) && keys(obj),
-        length = (_keys || obj).length,
-        results = Array(length);
-    for (var index = 0; index < length; index++) {
-      var currentKey = _keys ? _keys[index] : index;
-      results[index] = iteratee(obj[currentKey], currentKey, obj);
-    }
-    return results;
-  }
-
-  // Internal helper to create a reducing function, iterating left or right.
-  function createReduce(dir) {
-    // Wrap code that reassigns argument variables in a separate function than
-    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
-    var reducer = function(obj, iteratee, memo, initial) {
-      var _keys = !isArrayLike(obj) && keys(obj),
-          length = (_keys || obj).length,
-          index = dir > 0 ? 0 : length - 1;
-      if (!initial) {
-        memo = obj[_keys ? _keys[index] : index];
-        index += dir;
-      }
-      for (; index >= 0 && index < length; index += dir) {
-        var currentKey = _keys ? _keys[index] : index;
-        memo = iteratee(memo, obj[currentKey], currentKey, obj);
-      }
-      return memo;
-    };
-
-    return function(obj, iteratee, memo, context) {
-      var initial = arguments.length >= 3;
-      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
-    };
-  }
-
-  // **Reduce** builds up a single result from a list of values, aka `inject`,
-  // or `foldl`.
-  var reduce = createReduce(1);
-
-  // The right-associative version of reduce, also known as `foldr`.
-  var reduceRight = createReduce(-1);
-
-  // Return all the elements that pass a truth test.
-  function filter(obj, predicate, context) {
-    var results = [];
-    predicate = cb(predicate, context);
-    each(obj, function(value, index, list) {
-      if (predicate(value, index, list)) results.push(value);
-    });
-    return results;
-  }
-
-  // Return all the elements for which a truth test fails.
-  function reject(obj, predicate, context) {
-    return filter(obj, negate(cb(predicate)), context);
-  }
-
-  // Determine whether all of the elements pass a truth test.
-  function every(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var _keys = !isArrayLike(obj) && keys(obj),
-        length = (_keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = _keys ? _keys[index] : index;
-      if (!predicate(obj[currentKey], currentKey, obj)) return false;
-    }
-    return true;
-  }
-
-  // Determine if at least one element in the object passes a truth test.
-  function some(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var _keys = !isArrayLike(obj) && keys(obj),
-        length = (_keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = _keys ? _keys[index] : index;
-      if (predicate(obj[currentKey], currentKey, obj)) return true;
-    }
-    return false;
-  }
-
-  // Determine if the array or object contains a given item (using `===`).
-  function contains(obj, item, fromIndex, guard) {
-    if (!isArrayLike(obj)) obj = values(obj);
-    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
-    return indexOf(obj, item, fromIndex) >= 0;
-  }
-
-  // Invoke a method (with arguments) on every item in a collection.
-  var invoke = restArguments(function(obj, path, args) {
-    var contextPath, func;
-    if (isFunction$1(path)) {
-      func = path;
-    } else {
-      path = toPath$1(path);
-      contextPath = path.slice(0, -1);
-      path = path[path.length - 1];
-    }
-    return map(obj, function(context) {
-      var method = func;
-      if (!method) {
-        if (contextPath && contextPath.length) {
-          context = deepGet(context, contextPath);
-        }
-        if (context == null) return void 0;
-        method = context[path];
-      }
-      return method == null ? method : method.apply(context, args);
-    });
-  });
-
-  // Convenience version of a common use case of `_.map`: fetching a property.
-  function pluck(obj, key) {
-    return map(obj, property(key));
-  }
-
-  // Convenience version of a common use case of `_.filter`: selecting only
-  // objects containing specific `key:value` pairs.
-  function where(obj, attrs) {
-    return filter(obj, matcher(attrs));
-  }
-
-  // Return the maximum element (or element-based computation).
-  function max(obj, iteratee, context) {
-    var result = -Infinity, lastComputed = -Infinity,
-        value, computed;
-    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
-      obj = isArrayLike(obj) ? obj : values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value != null && value > result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      each(obj, function(v, index, list) {
-        computed = iteratee(v, index, list);
-        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
-          result = v;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  }
-
-  // Return the minimum element (or element-based computation).
-  function min(obj, iteratee, context) {
-    var result = Infinity, lastComputed = Infinity,
-        value, computed;
-    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
-      obj = isArrayLike(obj) ? obj : values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value != null && value < result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      each(obj, function(v, index, list) {
-        computed = iteratee(v, index, list);
-        if (computed < lastComputed || computed === Infinity && result === Infinity) {
-          result = v;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  }
-
-  // Sample **n** random values from a collection using the modern version of the
-  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
-  // If **n** is not specified, returns a single random element.
-  // The internal `guard` argument allows it to work with `_.map`.
-  function sample(obj, n, guard) {
-    if (n == null || guard) {
-      if (!isArrayLike(obj)) obj = values(obj);
-      return obj[random(obj.length - 1)];
-    }
-    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
-    var length = getLength(sample);
-    n = Math.max(Math.min(n, length), 0);
-    var last = length - 1;
-    for (var index = 0; index < n; index++) {
-      var rand = random(index, last);
-      var temp = sample[index];
-      sample[index] = sample[rand];
-      sample[rand] = temp;
-    }
-    return sample.slice(0, n);
-  }
-
-  // Shuffle a collection.
-  function shuffle(obj) {
-    return sample(obj, Infinity);
-  }
-
-  // Sort the object's values by a criterion produced by an iteratee.
-  function sortBy(obj, iteratee, context) {
-    var index = 0;
-    iteratee = cb(iteratee, context);
-    return pluck(map(obj, function(value, key, list) {
-      return {
-        value: value,
-        index: index++,
-        criteria: iteratee(value, key, list)
-      };
-    }).sort(function(left, right) {
-      var a = left.criteria;
-      var b = right.criteria;
-      if (a !== b) {
-        if (a > b || a === void 0) return 1;
-        if (a < b || b === void 0) return -1;
-      }
-      return left.index - right.index;
-    }), 'value');
-  }
-
-  // An internal function used for aggregate "group by" operations.
-  function group(behavior, partition) {
-    return function(obj, iteratee, context) {
-      var result = partition ? [[], []] : {};
-      iteratee = cb(iteratee, context);
-      each(obj, function(value, index) {
-        var key = iteratee(value, index, obj);
-        behavior(result, value, key);
-      });
-      return result;
-    };
-  }
-
-  // Groups the object's values by a criterion. Pass either a string attribute
-  // to group by, or a function that returns the criterion.
-  var groupBy = group(function(result, value, key) {
-    if (has(result, key)) result[key].push(value); else result[key] = [value];
-  });
-
-  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
-  // when you know that your index values will be unique.
-  var indexBy = group(function(result, value, key) {
-    result[key] = value;
-  });
-
-  // Counts instances of an object that group by a certain criterion. Pass
-  // either a string attribute to count by, or a function that returns the
-  // criterion.
-  var countBy = group(function(result, value, key) {
-    if (has(result, key)) result[key]++; else result[key] = 1;
-  });
-
-  // Split a collection into two arrays: one whose elements all pass the given
-  // truth test, and one whose elements all do not pass the truth test.
-  var partition = group(function(result, value, pass) {
-    result[pass ? 0 : 1].push(value);
-  }, true);
-
-  // Safely create a real, live array from anything iterable.
-  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
-  function toArray(obj) {
-    if (!obj) return [];
-    if (isArray(obj)) return slice.call(obj);
-    if (isString(obj)) {
-      // Keep surrogate pair characters together.
-      return obj.match(reStrSymbol);
-    }
-    if (isArrayLike(obj)) return map(obj, identity);
-    return values(obj);
-  }
-
-  // Return the number of elements in a collection.
-  function size(obj) {
-    if (obj == null) return 0;
-    return isArrayLike(obj) ? obj.length : keys(obj).length;
-  }
-
-  // Internal `_.pick` helper function to determine whether `key` is an enumerable
-  // property name of `obj`.
-  function keyInObj(value, key, obj) {
-    return key in obj;
-  }
-
-  // Return a copy of the object only containing the allowed properties.
-  var pick = restArguments(function(obj, keys) {
-    var result = {}, iteratee = keys[0];
-    if (obj == null) return result;
-    if (isFunction$1(iteratee)) {
-      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
-      keys = allKeys(obj);
-    } else {
-      iteratee = keyInObj;
-      keys = flatten(keys, false, false);
-      obj = Object(obj);
-    }
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = keys[i];
-      var value = obj[key];
-      if (iteratee(value, key, obj)) result[key] = value;
-    }
-    return result;
-  });
-
-  // Return a copy of the object without the disallowed properties.
-  var omit = restArguments(function(obj, keys) {
-    var iteratee = keys[0], context;
-    if (isFunction$1(iteratee)) {
-      iteratee = negate(iteratee);
-      if (keys.length > 1) context = keys[1];
-    } else {
-      keys = map(flatten(keys, false, false), String);
-      iteratee = function(value, key) {
-        return !contains(keys, key);
-      };
-    }
-    return pick(obj, iteratee, context);
-  });
-
-  // Returns everything but the last entry of the array. Especially useful on
-  // the arguments object. Passing **n** will return all the values in
-  // the array, excluding the last N.
-  function initial(array, n, guard) {
-    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
-  }
-
-  // Get the first element of an array. Passing **n** will return the first N
-  // values in the array. The **guard** check allows it to work with `_.map`.
-  function first(array, n, guard) {
-    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
-    if (n == null || guard) return array[0];
-    return initial(array, array.length - n);
-  }
-
-  // Returns everything but the first entry of the `array`. Especially useful on
-  // the `arguments` object. Passing an **n** will return the rest N values in the
-  // `array`.
-  function rest(array, n, guard) {
-    return slice.call(array, n == null || guard ? 1 : n);
-  }
-
-  // Get the last element of an array. Passing **n** will return the last N
-  // values in the array.
-  function last(array, n, guard) {
-    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
-    if (n == null || guard) return array[array.length - 1];
-    return rest(array, Math.max(0, array.length - n));
-  }
-
-  // Trim out all falsy values from an array.
-  function compact(array) {
-    return filter(array, Boolean);
-  }
-
-  // Flatten out an array, either recursively (by default), or up to `depth`.
-  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
-  function flatten$1(array, depth) {
-    return flatten(array, depth, false);
-  }
-
-  // Take the difference between one array and a number of other arrays.
-  // Only the elements present in just the first array will remain.
-  var difference = restArguments(function(array, rest) {
-    rest = flatten(rest, true, true);
-    return filter(array, function(value){
-      return !contains(rest, value);
-    });
-  });
-
-  // Return a version of the array that does not contain the specified value(s).
-  var without = restArguments(function(array, otherArrays) {
-    return difference(array, otherArrays);
-  });
-
-  // Produce a duplicate-free version of the array. If the array has already
-  // been sorted, you have the option of using a faster algorithm.
-  // The faster algorithm will not work with an iteratee if the iteratee
-  // is not a one-to-one function, so providing an iteratee will disable
-  // the faster algorithm.
-  function uniq(array, isSorted, iteratee, context) {
-    if (!isBoolean(isSorted)) {
-      context = iteratee;
-      iteratee = isSorted;
-      isSorted = false;
-    }
-    if (iteratee != null) iteratee = cb(iteratee, context);
-    var result = [];
-    var seen = [];
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var value = array[i],
-          computed = iteratee ? iteratee(value, i, array) : value;
-      if (isSorted && !iteratee) {
-        if (!i || seen !== computed) result.push(value);
-        seen = computed;
-      } else if (iteratee) {
-        if (!contains(seen, computed)) {
-          seen.push(computed);
-          result.push(value);
-        }
-      } else if (!contains(result, value)) {
-        result.push(value);
-      }
-    }
-    return result;
-  }
-
-  // Produce an array that contains the union: each distinct element from all of
-  // the passed-in arrays.
-  var union = restArguments(function(arrays) {
-    return uniq(flatten(arrays, true, true));
-  });
-
-  // Produce an array that contains every item shared between all the
-  // passed-in arrays.
-  function intersection(array) {
-    var result = [];
-    var argsLength = arguments.length;
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var item = array[i];
-      if (contains(result, item)) continue;
-      var j;
-      for (j = 1; j < argsLength; j++) {
-        if (!contains(arguments[j], item)) break;
-      }
-      if (j === argsLength) result.push(item);
-    }
-    return result;
-  }
-
-  // Complement of zip. Unzip accepts an array of arrays and groups
-  // each array's elements on shared indices.
-  function unzip(array) {
-    var length = array && max(array, getLength).length || 0;
-    var result = Array(length);
-
-    for (var index = 0; index < length; index++) {
-      result[index] = pluck(array, index);
-    }
-    return result;
-  }
-
-  // Zip together multiple lists into a single array -- elements that share
-  // an index go together.
-  var zip = restArguments(unzip);
-
-  // Converts lists into objects. Pass either a single array of `[key, value]`
-  // pairs, or two parallel arrays of the same length -- one of keys, and one of
-  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
-  function object(list, values) {
-    var result = {};
-    for (var i = 0, length = getLength(list); i < length; i++) {
-      if (values) {
-        result[list[i]] = values[i];
-      } else {
-        result[list[i][0]] = list[i][1];
-      }
-    }
-    return result;
-  }
-
-  // Generate an integer Array containing an arithmetic progression. A port of
-  // the native Python `range()` function. See
-  // [the Python documentation](https://docs.python.org/library/functions.html#range).
-  function range(start, stop, step) {
-    if (stop == null) {
-      stop = start || 0;
-      start = 0;
-    }
-    if (!step) {
-      step = stop < start ? -1 : 1;
-    }
-
-    var length = Math.max(Math.ceil((stop - start) / step), 0);
-    var range = Array(length);
-
-    for (var idx = 0; idx < length; idx++, start += step) {
-      range[idx] = start;
-    }
-
-    return range;
-  }
-
-  // Chunk a single array into multiple arrays, each containing `count` or fewer
-  // items.
-  function chunk(array, count) {
-    if (count == null || count < 1) return [];
-    var result = [];
-    var i = 0, length = array.length;
-    while (i < length) {
-      result.push(slice.call(array, i, i += count));
-    }
-    return result;
-  }
-
-  // Helper function to continue chaining intermediate results.
-  function chainResult(instance, obj) {
-    return instance._chain ? _(obj).chain() : obj;
-  }
-
-  // Add your own custom functions to the Underscore object.
-  function mixin(obj) {
-    each(functions(obj), function(name) {
-      var func = _[name] = obj[name];
-      _.prototype[name] = function() {
-        var args = [this._wrapped];
-        push.apply(args, arguments);
-        return chainResult(this, func.apply(_, args));
-      };
-    });
-    return _;
-  }
-
-  // Add all mutator `Array` functions to the wrapper.
-  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      var obj = this._wrapped;
-      if (obj != null) {
-        method.apply(obj, arguments);
-        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
-          delete obj[0];
-        }
-      }
-      return chainResult(this, obj);
-    };
-  });
-
-  // Add all accessor `Array` functions to the wrapper.
-  each(['concat', 'join', 'slice'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      var obj = this._wrapped;
-      if (obj != null) obj = method.apply(obj, arguments);
-      return chainResult(this, obj);
-    };
-  });
-
-  // Named Exports
-
-  var allExports = {
-    __proto__: null,
-    VERSION: VERSION,
-    restArguments: restArguments,
-    isObject: isObject,
-    isNull: isNull,
-    isUndefined: isUndefined,
-    isBoolean: isBoolean,
-    isElement: isElement,
-    isString: isString,
-    isNumber: isNumber,
-    isDate: isDate,
-    isRegExp: isRegExp,
-    isError: isError,
-    isSymbol: isSymbol,
-    isArrayBuffer: isArrayBuffer,
-    isDataView: isDataView$1,
-    isArray: isArray,
-    isFunction: isFunction$1,
-    isArguments: isArguments$1,
-    isFinite: isFinite$1,
-    isNaN: isNaN$1,
-    isTypedArray: isTypedArray$1,
-    isEmpty: isEmpty,
-    isMatch: isMatch,
-    isEqual: isEqual,
-    isMap: isMap,
-    isWeakMap: isWeakMap,
-    isSet: isSet,
-    isWeakSet: isWeakSet,
-    keys: keys,
-    allKeys: allKeys,
-    values: values,
-    pairs: pairs,
-    invert: invert,
-    functions: functions,
-    methods: functions,
-    extend: extend,
-    extendOwn: extendOwn,
-    assign: extendOwn,
-    defaults: defaults,
-    create: create,
-    clone: clone,
-    tap: tap,
-    get: get,
-    has: has$1,
-    mapObject: mapObject,
-    identity: identity,
-    constant: constant,
-    noop: noop,
-    toPath: toPath,
-    property: property,
-    propertyOf: propertyOf,
-    matcher: matcher,
-    matches: matcher,
-    times: times,
-    random: random,
-    now: now,
-    escape: _escape,
-    unescape: _unescape,
-    templateSettings: templateSettings,
-    template: template,
-    result: result,
-    uniqueId: uniqueId,
-    chain: chain,
-    iteratee: iteratee,
-    partial: partial,
-    bind: bind,
-    bindAll: bindAll,
-    memoize: memoize,
-    delay: delay,
-    defer: defer,
-    throttle: throttle,
-    debounce: debounce,
-    wrap: wrap,
-    negate: negate,
-    compose: compose,
-    after: after,
-    before: before,
-    once: once,
-    findKey: findKey,
-    findIndex: findIndex,
-    findLastIndex: findLastIndex,
-    sortedIndex: sortedIndex,
-    indexOf: indexOf,
-    lastIndexOf: lastIndexOf,
-    find: find,
-    detect: find,
-    findWhere: findWhere,
-    each: each,
-    forEach: each,
-    map: map,
-    collect: map,
-    reduce: reduce,
-    foldl: reduce,
-    inject: reduce,
-    reduceRight: reduceRight,
-    foldr: reduceRight,
-    filter: filter,
-    select: filter,
-    reject: reject,
-    every: every,
-    all: every,
-    some: some,
-    any: some,
-    contains: contains,
-    includes: contains,
-    include: contains,
-    invoke: invoke,
-    pluck: pluck,
-    where: where,
-    max: max,
-    min: min,
-    shuffle: shuffle,
-    sample: sample,
-    sortBy: sortBy,
-    groupBy: groupBy,
-    indexBy: indexBy,
-    countBy: countBy,
-    partition: partition,
-    toArray: toArray,
-    size: size,
-    pick: pick,
-    omit: omit,
-    first: first,
-    head: first,
-    take: first,
-    initial: initial,
-    last: last,
-    rest: rest,
-    tail: rest,
-    drop: rest,
-    compact: compact,
-    flatten: flatten$1,
-    without: without,
-    uniq: uniq,
-    unique: uniq,
-    union: union,
-    intersection: intersection,
-    difference: difference,
-    unzip: unzip,
-    transpose: unzip,
-    zip: zip,
-    object: object,
-    range: range,
-    chunk: chunk,
-    mixin: mixin,
-    'default': _
-  };
-
-  // Default Export
-
-  // Add all of the Underscore functions to the wrapper object.
-  var _$1 = mixin(allExports);
-  // Legacy Node.js API.
-  _$1._ = _$1;
-
-  return _$1;
-
-})));
-//# sourceMappingURL=underscore.js.map
diff --git a/doc/readme.rst b/doc/readme.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c44bc4371737e3670f8a62a28d15c123df48b62b
--- /dev/null
+++ b/doc/readme.rst
@@ -0,0 +1,6 @@
+To compile the documentation:
+
+cd doc/
+rm -r build
+sphinx-build source build
+
diff --git a/doc/source/Ohmpi.rst b/doc/source/Ohmpi.rst
deleted file mode 100644
index 0f71904ebe25fbcfa27d9894e7756b7adc524ae4..0000000000000000000000000000000000000000
--- a/doc/source/Ohmpi.rst
+++ /dev/null
@@ -1,69 +0,0 @@
-*************** 
-OhmPi project 
-***************
-
-    .. image:: logo_ohmpi.JPG
-        :width: 250 px
-        :align: center
-        :height: 180 px
-        :alt: Logo OhmPi
-
-
-|  
-
-**Authors:** 
-------------
-| Rémi CLEMENT, Vivien DUBOIS, Nicolas Forquet, INRAE, REVERSAAL, Villeurbanne, France
-| Yannick FARGIER, GERS-RRO, Univ Gustave Eiffel, IFSTTAR, Lyon, France
-| Hélène GUYARD, IGE Grenoble, Université Grenoble Alpes, Grenoble, France
-| Olivier KAUFMANN, Arnaud WATLET, Université de Mons, Mons, Belgium
-| Guillaume BLANCHY, ILVO, Merelbeke, Belgium|
-
-
-**Partners:**
--------------
-
-.. table::
-   :align: center
-  
-   +----------------------------------+-----------------------------------+-------------------------------+
-   |   .. image:: logo_inrae.jpg      |  .. image:: logo_univ_gustave.png |   .. image:: logo_ilvo.png    |
-   +----------------------------------+-----------------------------------+-------------------------------+
-   |   .. image:: logo_univ_mons.png  |  .. image:: ige.png               |                               |              
-   +----------------------------------+-----------------------------------+-------------------------------+
-   
-  
-
-**Citing OhmPi:** 
------------------
-
-|
-
-*Rémi Clement, Yannick Fargier, Vivien Dubois, Julien Gance, Emile Gros, et al.. OhmPi: An open*
-*source data logger for dedicated applications of electrical resistivity imaging at the small and laboratory*
-*scale. HardwareX, Elsevier, 2020, 8, 24 p. ff10.1016/j.ohx.2020.e00122ff.*
-
-|
-   
-**Introduction :** 
--------------------
-
-.. warning::
-    **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OhmPi. The OhmPi team cannot be held responsible if the equipment does not work after assembly. You may redistribute and modify this documentation and make products using it under the terms of the CERN-OHL-P v2 (https:/cern.ch/cern-ohl). This documentation is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-P v2 for applicable conditions   **
-
-
-
-
-|
-
-This documentation presents the development of a low-cost, open hardware \ 
-resistivity meter to provide the scientific community with a robust \
-and flexible tool for small-scale experiments. Called OhmPi, this basic resistivity meter\
-features current injection and measurement functions associated with a multiplexer \
-that allows performing automatic measurements with up to 64 electrodes.\
-OhmPi's philosophy is to provide a fully open source and open hardware tool\
-to the near surface scientific community.
- 
-
-.. note:: 
-   Anyone who wants to get involved is welcome to join the OhmPi project!
diff --git a/doc/source/list - 1_02.csv b/doc/source/bom_list/list - 1_02.csv
similarity index 100%
rename from doc/source/list - 1_02.csv
rename to doc/source/bom_list/list - 1_02.csv
diff --git a/doc/source/list.csv b/doc/source/bom_list/list.csv
similarity index 100%
rename from doc/source/list.csv
rename to doc/source/bom_list/list.csv
diff --git a/doc/source/list.xlsx b/doc/source/bom_list/list.xlsx
similarity index 100%
rename from doc/source/list.xlsx
rename to doc/source/bom_list/list.xlsx
diff --git a/doc/source/conf.py b/doc/source/conf.py
index fcab499ee6b4a51fa9f1e24f224e36c94d8cf7b9..c298886f5804b1007aef8513b61a0149b02b7ca2 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -14,8 +14,8 @@
 #
 import os
 import sys
-sys.path.append(os.path.abspath('../..'))
-import ohmpi  # import Ohmpi module to be documented in api.rst by numpydoc
+sys.path.append(os.path.abspath('../../'))
+# import ohmpi  # import Ohmpi module to be documented in api.rst by numpydoc
 import sphinx_rtd_theme
 
 
@@ -27,7 +27,7 @@ copyright = '2022, the OhmPi Team.'
 author = 'Rémi CLEMENT'
 
 # The full version, including alpha/beta/rc tags
-release = 'open hardware resistivity-meter'
+release = 'v2024rc'
 
 
 # -- General configuration ---------------------------------------------------
@@ -43,7 +43,7 @@ extensions = [
 
 
 
-numpydoc_show_class_members = False
+numpydoc_show_class_members = True
 
 
 # Add any paths that contain templates here, relative to this directory.
diff --git a/doc/source/Under-Construction.png b/doc/source/img/Under-Construction.png
similarity index 100%
rename from doc/source/Under-Construction.png
rename to doc/source/img/Under-Construction.png
diff --git a/doc/logo_ohmpi.JPG b/doc/source/img/logo/ohmpi/logo_ohmpi.JPG
similarity index 100%
rename from doc/logo_ohmpi.JPG
rename to doc/source/img/logo/ohmpi/logo_ohmpi.JPG
diff --git a/doc/source/ige.png b/doc/source/img/logo/partners/ige.png
similarity index 100%
rename from doc/source/ige.png
rename to doc/source/img/logo/partners/ige.png
diff --git a/doc/source/logo_ilvo.png b/doc/source/img/logo/partners/logo_ilvo.png
similarity index 100%
rename from doc/source/logo_ilvo.png
rename to doc/source/img/logo/partners/logo_ilvo.png
diff --git a/doc/source/logo_inrae.jpg b/doc/source/img/logo/partners/logo_inrae.jpg
similarity index 100%
rename from doc/source/logo_inrae.jpg
rename to doc/source/img/logo/partners/logo_inrae.jpg
diff --git a/doc/source/logo_univ_gustave.png b/doc/source/img/logo/partners/logo_univ_gustave.png
similarity index 100%
rename from doc/source/logo_univ_gustave.png
rename to doc/source/img/logo/partners/logo_univ_gustave.png
diff --git a/doc/source/logo_univ_mons.png b/doc/source/img/logo/partners/logo_univ_mons.png
similarity index 100%
rename from doc/source/logo_univ_mons.png
rename to doc/source/img/logo/partners/logo_univ_mons.png
diff --git a/doc/source/measurement_board_requirement.jpg b/doc/source/img/measurement_board_requirement.jpg
similarity index 100%
rename from doc/source/measurement_board_requirement.jpg
rename to doc/source/img/measurement_board_requirement.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_1/raspbian_version.jpg b/doc/source/img/raspbian_version.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_1/raspbian_version.jpg
rename to doc/source/img/raspbian_version.jpg
diff --git a/doc/source/schema_measurement_board.jpg b/doc/source/img/schema_measurement_board.jpg
similarity index 100%
rename from doc/source/schema_measurement_board.jpg
rename to doc/source/img/schema_measurement_board.jpg
diff --git a/doc/source/schema_measurement_board_3.16.jpg b/doc/source/img/schema_measurement_board_3.16.jpg
similarity index 100%
rename from doc/source/schema_measurement_board_3.16.jpg
rename to doc/source/img/schema_measurement_board_3.16.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_1/thonny_first_interface.jpg b/doc/source/img/thonny_first_interface.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_1/thonny_first_interface.jpg
rename to doc/source/img/thonny_first_interface.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_1/thonny_interpreter.jpg b/doc/source/img/thonny_interpreter.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_1/thonny_interpreter.jpg
rename to doc/source/img/thonny_interpreter.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_1/thonny_interpreter_folder.jpg b/doc/source/img/thonny_interpreter_folder.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_1/thonny_interpreter_folder.jpg
rename to doc/source/img/thonny_interpreter_folder.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_1/thonny_option.jpg b/doc/source/img/thonny_option.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_1/thonny_option.jpg
rename to doc/source/img/thonny_option.jpg
diff --git a/doc/source/cable.jpg b/doc/source/img/v1.xx/cable.jpg
similarity index 100%
rename from doc/source/cable.jpg
rename to doc/source/img/v1.xx/cable.jpg
diff --git a/doc/source/connection.jpg b/doc/source/img/v1.xx/connection.jpg
similarity index 100%
rename from doc/source/connection.jpg
rename to doc/source/img/v1.xx/connection.jpg
diff --git a/doc/source/current_board.jpg b/doc/source/img/v1.xx/current_board.jpg
similarity index 100%
rename from doc/source/current_board.jpg
rename to doc/source/img/v1.xx/current_board.jpg
diff --git a/doc/source/electrode_cable.jpg b/doc/source/img/v1.xx/electrode_cable.jpg
similarity index 100%
rename from doc/source/electrode_cable.jpg
rename to doc/source/img/v1.xx/electrode_cable.jpg
diff --git a/doc/source/installation_current_board.jpg b/doc/source/img/v1.xx/installation_current_board.jpg
similarity index 100%
rename from doc/source/installation_current_board.jpg
rename to doc/source/img/v1.xx/installation_current_board.jpg
diff --git a/doc/source/installation_current_board_1_02.jpg b/doc/source/img/v1.xx/installation_current_board_1_02.jpg
similarity index 100%
rename from doc/source/installation_current_board_1_02.jpg
rename to doc/source/img/v1.xx/installation_current_board_1_02.jpg
diff --git a/doc/source/measurement_board-2-V1-02.jpg b/doc/source/img/v1.xx/measurement_board-2-V1-02.jpg
similarity index 100%
rename from doc/source/measurement_board-2-V1-02.jpg
rename to doc/source/img/v1.xx/measurement_board-2-V1-02.jpg
diff --git a/doc/source/measurement_board-2.jpg b/doc/source/img/v1.xx/measurement_board-2.jpg
similarity index 100%
rename from doc/source/measurement_board-2.jpg
rename to doc/source/img/v1.xx/measurement_board-2.jpg
diff --git a/doc/source/measurement_board.jpg b/doc/source/img/v1.xx/measurement_board.jpg
similarity index 100%
rename from doc/source/measurement_board.jpg
rename to doc/source/img/v1.xx/measurement_board.jpg
diff --git a/doc/source/measurement_board1-02.jpg b/doc/source/img/v1.xx/measurement_board1-02.jpg
similarity index 100%
rename from doc/source/measurement_board1-02.jpg
rename to doc/source/img/v1.xx/measurement_board1-02.jpg
diff --git a/doc/source/multiplexer_implementation.jpg b/doc/source/img/v1.xx/multiplexer_implementation.jpg
similarity index 100%
rename from doc/source/multiplexer_implementation.jpg
rename to doc/source/img/v1.xx/multiplexer_implementation.jpg
diff --git a/doc/source/schema_measurement_board1_02.png b/doc/source/img/v1.xx/schema_measurement_board1_02.png
similarity index 100%
rename from doc/source/schema_measurement_board1_02.png
rename to doc/source/img/v1.xx/schema_measurement_board1_02.png
diff --git a/doc/source/web_site.jpg b/doc/source/img/v1.xx/web_site.jpg
similarity index 100%
rename from doc/source/web_site.jpg
rename to doc/source/img/v1.xx/web_site.jpg
diff --git a/doc/source/image_ohmpi_2.jpg b/doc/source/img/v2023.x.x/image_ohmpi_2.jpg
similarity index 100%
rename from doc/source/image_ohmpi_2.jpg
rename to doc/source/img/v2023.x.x/image_ohmpi_2.jpg
diff --git a/doc/source/raspbian_version.jpg b/doc/source/img/v2023.x.x/step_n_1/raspbian_version.jpg
similarity index 100%
rename from doc/source/raspbian_version.jpg
rename to doc/source/img/v2023.x.x/step_n_1/raspbian_version.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_1/schema_measurement_board.jpg b/doc/source/img/v2023.x.x/step_n_1/schema_measurement_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_1/schema_measurement_board.jpg
rename to doc/source/img/v2023.x.x/step_n_1/schema_measurement_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/thonny_first_interface.jpg b/doc/source/img/v2023.x.x/step_n_1/thonny_first_interface.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/thonny_first_interface.jpg
rename to doc/source/img/v2023.x.x/step_n_1/thonny_first_interface.jpg
diff --git a/doc/source/thonny_interpreter.jpg b/doc/source/img/v2023.x.x/step_n_1/thonny_interpreter.jpg
similarity index 100%
rename from doc/source/thonny_interpreter.jpg
rename to doc/source/img/v2023.x.x/step_n_1/thonny_interpreter.jpg
diff --git a/doc/source/thonny_interpreter_folder.jpg b/doc/source/img/v2023.x.x/step_n_1/thonny_interpreter_folder.jpg
similarity index 100%
rename from doc/source/thonny_interpreter_folder.jpg
rename to doc/source/img/v2023.x.x/step_n_1/thonny_interpreter_folder.jpg
diff --git a/doc/source/thonny_option.jpg b/doc/source/img/v2023.x.x/step_n_1/thonny_option.jpg
similarity index 100%
rename from doc/source/thonny_option.jpg
rename to doc/source/img/v2023.x.x/step_n_1/thonny_option.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/00_mes_board_components.jpg b/doc/source/img/v2023.x.x/step_n_2/a/00_mes_board_components.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/00_mes_board_components.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/00_mes_board_components.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/00_mes_board_components.jpg.gsr2 b/doc/source/img/v2023.x.x/step_n_2/a/00_mes_board_components.jpg.gsr2
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/00_mes_board_components.jpg.gsr2
rename to doc/source/img/v2023.x.x/step_n_2/a/00_mes_board_components.jpg.gsr2
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/01_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/01_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/01_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/01_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/02_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/02_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/02_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/02_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/03_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/03_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/03_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/03_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/04_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/04_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/04_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/04_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/05_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/05_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/05_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/05_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/06_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/06_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/06_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/06_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/07_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/07_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/07_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/07_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/08_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/08_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/08_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/08_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/09_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/09_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/09_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/09_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/0_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/0_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/0_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/0_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/10_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/10_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/10_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/10_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/11_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/11_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/11_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/11_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/12_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/12_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/12_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/12_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/13_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/13_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/13_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/13_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/14_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/14_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/14_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/14_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/15_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/15_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/15_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/15_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/16_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/16_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/16_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/16_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/17_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/17_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/17_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/17_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/18_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/18_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/18_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/18_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/19_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/19_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/19_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/19_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/20_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/20_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/20_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/20_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/21_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/21_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/21_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/21_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/22_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/22_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/22_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/22_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/23_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/23_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/23_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/23_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/24_mes_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/24_mes_board.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/24_mes_board.jpg
rename to doc/source/img/v2023.x.x/step_n_2/a/24_mes_board.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/list_of_components.srf b/doc/source/img/v2023.x.x/step_n_2/a/list_of_components.srf
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/list_of_components.srf
rename to doc/source/img/v2023.x.x/step_n_2/a/list_of_components.srf
diff --git a/doc/source/Ohmpi_V2023/step_n_2/a/measure_board_list_2_xx.csv b/doc/source/img/v2023.x.x/step_n_2/a/measure_board_list_2_xx.csv
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/a/measure_board_list_2_xx.csv
rename to doc/source/img/v2023.x.x/step_n_2/a/measure_board_list_2_xx.csv
diff --git a/doc/source/img/v2023.x.x/step_n_2/a/schema_measurement_board.jpg b/doc/source/img/v2023.x.x/step_n_2/a/schema_measurement_board.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..da38456330fc28f6a1c562709c6dc4a4b3685922
Binary files /dev/null and b/doc/source/img/v2023.x.x/step_n_2/a/schema_measurement_board.jpg differ
diff --git a/doc/source/Ohmpi_V2023/step_n_2/b/001.jpg b/doc/source/img/v2023.x.x/step_n_2/b/001.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/b/001.jpg
rename to doc/source/img/v2023.x.x/step_n_2/b/001.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/b/002.jpg b/doc/source/img/v2023.x.x/step_n_2/b/002.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/b/002.jpg
rename to doc/source/img/v2023.x.x/step_n_2/b/002.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/b/003.jpg b/doc/source/img/v2023.x.x/step_n_2/b/003.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/b/003.jpg
rename to doc/source/img/v2023.x.x/step_n_2/b/003.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/b/004.jpg b/doc/source/img/v2023.x.x/step_n_2/b/004.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/b/004.jpg
rename to doc/source/img/v2023.x.x/step_n_2/b/004.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/b/005.jpg b/doc/source/img/v2023.x.x/step_n_2/b/005.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/b/005.jpg
rename to doc/source/img/v2023.x.x/step_n_2/b/005.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/b/test_2_xx.csv b/doc/source/img/v2023.x.x/step_n_2/b/test_2_xx.csv
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/b/test_2_xx.csv
rename to doc/source/img/v2023.x.x/step_n_2/b/test_2_xx.csv
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210904_214109.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210904_214109.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210904_214109.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210904_214109.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_121859.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_121859.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_121859.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_121859.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_121904.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_121904.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_121904.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_121904.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_121917.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_121917.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_121917.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_121917.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_121926.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_121926.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_121926.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_121926.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_121933.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_121933.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_121933.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_121933.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122447.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122447.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122447.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122447.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122454.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122454.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122454.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122454.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122546.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122546.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122546.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122546.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122547.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122547.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122547.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122547.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122603.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122603.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122603.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122603.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122627.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122627.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122627.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122627.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122801.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122801.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122801.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122801.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_122820.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_122820.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_122820.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_122820.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_123034.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_123034.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_123034.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_123034.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_132856.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_132856.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_132856.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_132856.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20210905_210045.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20210905_210045.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20210905_210045.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20210905_210045.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20211206_144334.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20211206_144334.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20211206_144334.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20211206_144334.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/20211206_150522.jpg b/doc/source/img/v2023.x.x/step_n_2/c/20211206_150522.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/20211206_150522.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/20211206_150522.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/Inked20211206_150522_LI.jpg b/doc/source/img/v2023.x.x/step_n_2/c/Inked20211206_150522_LI.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/Inked20211206_150522_LI.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/Inked20211206_150522_LI.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/Inked20211206_150522_LI2.jpg b/doc/source/img/v2023.x.x/step_n_2/c/Inked20211206_150522_LI2.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/Inked20211206_150522_LI2.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/Inked20211206_150522_LI2.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/i2cdetect.png b/doc/source/img/v2023.x.x/step_n_2/c/i2cdetect.png
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/i2cdetect.png
rename to doc/source/img/v2023.x.x/step_n_2/c/i2cdetect.png
diff --git a/doc/source/Ohmpi_V2023/step_n_2/c/ref_circuit.png b/doc/source/img/v2023.x.x/step_n_2/c/ref_circuit.png
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_2/c/ref_circuit.png
rename to doc/source/img/v2023.x.x/step_n_2/c/ref_circuit.png
diff --git a/doc/source/thonny_first_interface.jpg b/doc/source/img/v2023.x.x/step_n_2/c/thonny_first_interface.jpg
similarity index 100%
rename from doc/source/thonny_first_interface.jpg
rename to doc/source/img/v2023.x.x/step_n_2/c/thonny_first_interface.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/MUX_board_list_2_xx.csv b/doc/source/img/v2023.x.x/step_n_3/MUX_board_list_2_xx.csv
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/MUX_board_list_2_xx.csv
rename to doc/source/img/v2023.x.x/step_n_3/MUX_board_list_2_xx.csv
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_00.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_00.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_00.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_00.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_01.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_01.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_01.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_01.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_02.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_02.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_02.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_02.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_03.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_03.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_03.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_03.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_04.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_04.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_04.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_04.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_05.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_05.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_05.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_05.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_06.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_06.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_06.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_06.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_07.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_07.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_07.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_07.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_08.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_08.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_08.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_08.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_09.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_09.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_09.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_09.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_10.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_10.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_10.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_10.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_board_components.jpg b/doc/source/img/v2023.x.x/step_n_3/a/MUX_board_components.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_board_components.jpg
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_board_components.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_board_list_2_xx.csv b/doc/source/img/v2023.x.x/step_n_3/a/MUX_board_list_2_xx.csv
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_board_list_2_xx.csv
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_board_list_2_xx.csv
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/MUX_board_list_2_xx.xlsx b/doc/source/img/v2023.x.x/step_n_3/a/MUX_board_list_2_xx.xlsx
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/MUX_board_list_2_xx.xlsx
rename to doc/source/img/v2023.x.x/step_n_3/a/MUX_board_list_2_xx.xlsx
diff --git a/doc/source/Ohmpi_V2023/step_n_3/a/mux_fig.gpj b/doc/source/img/v2023.x.x/step_n_3/a/mux_fig.gpj
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/a/mux_fig.gpj
rename to doc/source/img/v2023.x.x/step_n_3/a/mux_fig.gpj
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/A_0x70-a.jpg b/doc/source/img/v2023.x.x/step_n_3/b/A_0x70-a.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/A_0x70-a.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/A_0x70-a.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/A_0x70.jpg b/doc/source/img/v2023.x.x/step_n_3/b/A_0x70.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/A_0x70.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/A_0x70.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/B_0x71-a.jpg b/doc/source/img/v2023.x.x/step_n_3/b/B_0x71-a.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/B_0x71-a.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/B_0x71-a.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/B_0x71.jpg b/doc/source/img/v2023.x.x/step_n_3/b/B_0x71.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/B_0x71.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/B_0x71.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/M_0x72-a.jpg b/doc/source/img/v2023.x.x/step_n_3/b/M_0x72-a.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/M_0x72-a.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/M_0x72-a.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/M_0x72.jpg b/doc/source/img/v2023.x.x/step_n_3/b/M_0x72.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/M_0x72.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/M_0x72.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/N_0x73-a.jpg b/doc/source/img/v2023.x.x/step_n_3/b/N_0x73-a.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/N_0x73-a.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/N_0x73-a.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/b/N_0x73.jpg b/doc/source/img/v2023.x.x/step_n_3/b/N_0x73.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/b/N_0x73.jpg
rename to doc/source/img/v2023.x.x/step_n_3/b/N_0x73.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/20211207_115706.jpg b/doc/source/img/v2023.x.x/step_n_3/c/20211207_115706.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/20211207_115706.jpg
rename to doc/source/img/v2023.x.x/step_n_3/c/20211207_115706.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/20211207_123021.jpg b/doc/source/img/v2023.x.x/step_n_3/c/20211207_123021.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/20211207_123021.jpg
rename to doc/source/img/v2023.x.x/step_n_3/c/20211207_123021.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/2022-01-24-150201_1920x1080_scrot.png b/doc/source/img/v2023.x.x/step_n_3/c/2022-01-24-150201_1920x1080_scrot.png
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/2022-01-24-150201_1920x1080_scrot.png
rename to doc/source/img/v2023.x.x/step_n_3/c/2022-01-24-150201_1920x1080_scrot.png
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/2022-01-24-150447_1920x1080_scrot.png b/doc/source/img/v2023.x.x/step_n_3/c/2022-01-24-150447_1920x1080_scrot.png
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/2022-01-24-150447_1920x1080_scrot.png
rename to doc/source/img/v2023.x.x/step_n_3/c/2022-01-24-150447_1920x1080_scrot.png
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/2022-01-24-150500_1920x1080_scrot.png b/doc/source/img/v2023.x.x/step_n_3/c/2022-01-24-150500_1920x1080_scrot.png
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/2022-01-24-150500_1920x1080_scrot.png
rename to doc/source/img/v2023.x.x/step_n_3/c/2022-01-24-150500_1920x1080_scrot.png
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/20220124_103812.jpg b/doc/source/img/v2023.x.x/step_n_3/c/20220124_103812.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/20220124_103812.jpg
rename to doc/source/img/v2023.x.x/step_n_3/c/20220124_103812.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/20220124_142929.jpg b/doc/source/img/v2023.x.x/step_n_3/c/20220124_142929.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/20220124_142929.jpg
rename to doc/source/img/v2023.x.x/step_n_3/c/20220124_142929.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/20220124_143105.jpg b/doc/source/img/v2023.x.x/step_n_3/c/20220124_143105.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/20220124_143105.jpg
rename to doc/source/img/v2023.x.x/step_n_3/c/20220124_143105.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/20220124_143823.jpg b/doc/source/img/v2023.x.x/step_n_3/c/20220124_143823.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/20220124_143823.jpg
rename to doc/source/img/v2023.x.x/step_n_3/c/20220124_143823.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/20220207_154111.jpg b/doc/source/img/v2023.x.x/step_n_3/c/20220207_154111.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/20220207_154111.jpg
rename to doc/source/img/v2023.x.x/step_n_3/c/20220207_154111.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_3/c/thonny_mux_test_01.png b/doc/source/img/v2023.x.x/step_n_3/c/thonny_mux_test_01.png
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_3/c/thonny_mux_test_01.png
rename to doc/source/img/v2023.x.x/step_n_3/c/thonny_mux_test_01.png
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_1.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_1.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_1.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_1.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_10.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_10.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_10.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_10.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_11.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_11.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_11.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_11.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_12.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_12.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_12.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_12.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_13.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_13.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_13.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_13.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_14.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_14.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_14.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_14.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_15.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_15.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_15.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_15.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_16.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_16.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_16.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_16.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_17.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_17.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_17.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_17.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_18.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_18.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_18.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_18.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_19.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_19.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_19.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_19.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_2.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_2.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_2.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_2.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_20.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_20.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_20.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_20.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_21.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_21.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_21.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_21.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_22.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_22.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_22.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_22.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_23.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_23.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_23.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_23.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_24.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_24.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_24.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_24.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_25.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_25.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_25.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_25.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_26.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_26.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_26.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_26.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_27.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_27.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_27.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_27.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_28.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_28.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_28.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_28.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_29.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_29.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_29.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_29.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_3.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_3.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_3.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_3.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_30.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_30.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_30.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_30.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_31.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_31.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_31.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_31.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_32.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_32.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_32.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_32.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_33.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_33.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_33.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_33.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_34.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_34.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_34.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_34.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_35.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_35.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_35.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_35.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_36.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_36.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_36.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_36.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_37.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_37.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_37.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_37.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_38.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_38.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_38.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_38.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_39.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_39.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_39.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_39.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_4.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_4.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_4.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_4.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_40.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_40.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_40.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_40.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_5.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_5.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_5.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_5.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_6.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_6.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_6.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_6.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_7.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_7.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_7.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_7.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_8.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_8.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_8.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_8.jpg
diff --git a/doc/source/Ohmpi_V2023/step_n_4/step_4_9.jpg b/doc/source/img/v2023.x.x/step_n_4/step_4_9.jpg
similarity index 100%
rename from doc/source/Ohmpi_V2023/step_n_4/step_4_9.jpg
rename to doc/source/img/v2023.x.x/step_n_4/step_4_9.jpg
diff --git a/doc/source/index.rst b/doc/source/index.rst
index b91937f7772d028de63ab92b97effd382c1c8ef3..0f29794bd149093f08fd285833aeb1250f1a2387 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -23,7 +23,7 @@ OHMPI: Open source and open hardware resistivity-meter
     * Release guidelines
     * General tutorials
 
-.. image:: logo_ohmpi.JPG
+.. image:: img/logo/ohmpi/logo_ohmpi.JPG
    :width: 200px
    :height: 150px
    :align: left
@@ -33,11 +33,14 @@ Contents:
 .. toctree:: 
    :maxdepth: 2 
 
-   Ohmpi
-   V1_01
-   V1_02
-   V2023
-   api
+   source_rst/Ohmpi
+   source_rst/hardware
+   source_rst/software
+   source_rst/api
+   source_rst/troubleshooting
+   source_rst/gallery
+   source_rst/developing_hardware_components
+   source_rst/archived_version
   
 
   
diff --git a/doc/source/logo-iris.jpg b/doc/source/logo-iris.jpg
deleted file mode 100644
index fad2ca03927ffbcc771222c86b6f4026700567ef..0000000000000000000000000000000000000000
Binary files a/doc/source/logo-iris.jpg and /dev/null differ
diff --git a/doc/source/logo_ohmpi.JPG b/doc/source/logo_ohmpi.JPG
deleted file mode 100644
index 2fe9b5d6b5248b0c31baae591b0d6706f3877945..0000000000000000000000000000000000000000
Binary files a/doc/source/logo_ohmpi.JPG and /dev/null differ
diff --git a/doc/source/new 1.txt b/doc/source/new 1.txt
deleted file mode 100644
index a7f8b4af89fc5c1e0f9f696e745a33be14356281..0000000000000000000000000000000000000000
--- a/doc/source/new 1.txt	
+++ /dev/null
@@ -1,324 +0,0 @@
- In this part of the board, resistance R9 has been added to measure the current flowing between electrodes A and B. This resistance value has been 
-set at 2 ohms in order to ensure:
-•	a precise resistance,
-•	a resistance less than the sum of resistors R10, R11 and R12; indeed, R10 and R12 generally lie between 100 and 5,000 ohms.
-To measure the current intensity between A and B, the electrical potential difference at the pole of the reference resistor (R9) 
-is measured. The intensity (in mA) is calculated by inserting the resulting value into the following: 
-
-
-To measure the potential difference needed to measure current intensity, the ADS 1115 is connected to the ground of the circuit. 
-In our case, the ground reference is electrode B. The analog inputs A1 and A0 of the ADS1115 are connected to each pole of the 
-reference resistor (R9). In order to increase input impedance and adapt the signal gain, tracking amplifiers have been included 
-and completed by a divider bridge (R5, R8, R6 and R7) located between the two amplifiers. The resistance of the divider bridge 
-ensures that the signal remains between 0 and 5 V, in accordance with the ADS1115 signal gain. To measure the potential difference, 
-the M and N electrodes are connected to analog inputs A2 and A3 of the ADS 1115. Between the ADC and the electrodes, two tracking 
-amplifiers and a divider bridge have been positioned so as to obtain a potential lying within the 0-5 V range at the analog input of the ADS 1115.
-Let's note that the potential difference value would equal the potential measured with ADS1115 multiplied by the voltage reduction
-value of the divider bridge (see Section 5.2). Despite the use of high-resolution resistance (i.e. accurate to within 1%), it is
-still necessary to calibrate the divider bridge using a precision voltmeter. For this purpose, the input and output potentials 
-of the divider bridge must be measured using an equivalent circuit for various electrical potential values. These values serve 
-to calculate the gain. With this electronic board, it is possible to measure the potential and intensity without disturbing the 
-electric field in the ground, with the total input impedance value being estimated at 36 mega-ohms.
-A shortcut between Electrodes A and B will generate excessive currents, whose intensities depend on the type of battery used. 
-A lithium ion battery or automobile-type lead-acid battery can deliver a strong enough current to damage the board and, as such, 
-constitutes a potential hazard. We therefore recommend adding a 1.5-A fuse between the battery and resistor R9.
-In version 1.02, we have improved the electronic board of measurement. we have added a DC/DC converter to supply the operational amplifiers 
-(2 Traco power DC/DCconverter TRN3-1215). These converters allow to limit the suppression of the signal when the injected voltage is higher than 10V.
-We also added 4 capacitors on the +12v inputs of the fast operational amplifiers. These are decoupling capacitors (typically 100nF ceramic) 
-between each power supply terminal and ground. The last point, we have added a four very high resistances of 10 MOhm, between the ground and 
-the signal input on the operational amplifiers. This prevents the operational amplifiers from overheating.
-
-.. figure:: schema_measurement_board.jpg
-   :width: 800px
-   :align: center
-   :height: 400px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Measurement board (Ohmpi version 1.02)
-   
-.. note::
-	 If you want to have very accurate measurements you can replace the resistors with a tolerance of 1% by resistors with a tolerance of 0.01% which will improve the measurement, but the cost will be higher.
-   
-   
-   
-b) Implementation
---------------------------------
-The measurement board must be printed using the PCB file (Source file repository), with components soldered onto 
-it by following the steps described below and illustrated in the following figure :
-
-* Step no. 1: test divider bridge
-     For each measurement channel, we have installed a bridge divider, it is necessary to test with ohmmeter the value of the resistances, to adjust  each coefficients (coef_p0, coef_p1, coef_p2, coef_p3) in the Ohmpi.py code..
-
-	.. math::
-		coeff po = (R1 + R2) / R1
-		
-	.. math::	
-		coeff p1 = (R3 + R4) / R3
-		
-	.. math::	
-		coeff p2 = (R7 + R6) / R7
-		
-	.. math::
-		coeff p3 = (R9 + R8) / R9
-		
-	.. code-block:: python
-		:linenos:
-		:lineno-start: 36
-
-		 """
-		 hardware parameters
-		 """
-		 R_ref = 50 # reference resistance value in ohm
-		 coef_p0 = 2.5 # slope for current conversion for ADS.P0, measurement in V/V
-		 coef_p1 = 2.5 # slope for current conversion for ADS.P1, measurement in V/V
-		 coef_p2 = 2.5 # slope for current conversion for ADS.P2, measurement in V/V
-		 coef_p3 = 2.5 # slope for current conversion for ADS.P3, measurement in V/V
-
-	The coefficient parameters can be adjusted in lines 40 to 43 of the ohmpi.py code.	
-
-
-* Step no. 2: installation of the 1-Kohm resistors with an accuracy of ± 1% (b-in the figure). 
-* Step no. 3: installation of the 1.5-Kohm resistors with an accuracy of ± 1%(C-in the figure). 
-* Step no. 4: installation of both the black female 1 x 10 header and the 7-blue screw terminal blocks (c-in the figure)
-* Step no. 5: installation of the 50-Ohm reference resistor ± 0.1%, please check the value and correct the line 39 in ohmpi.py code (d-in the figure)
-* Step no. 6: addition of both the ADS115 directly onto the header (pins must be plugged according to the figure) and the LM358N operational amplifiers (pay attention to the orientation) (e-in the figure).
-* Step no. 7: installation of the 10-Mohm resistors with an accuracy of ± 5% (f-in the figure). 
-* Step no. 8: installation of the two DC/DC converter TRN3-1215 (h-in the figure).
-* Setp no. 9: installation of the four capacitor on 100-nF/50vDC and the fuse of 10-A (h-in the figure).
- 
-1-Kohm and 1.5-Kohm resistors apply to the divider bridge. If, for example, you prefer using a stronger power supply, it would be possible to adjust the divider bridge value by simply modifying these resistors. 
-Once all the components have been soldered together, the measurement board can be connected to the Raspberry Pi and the 
-battery terminal, according to Figure 9. Between the battery and the TX+ terminal of the measurement board, remember to 
-place a fuse holder with a 1.5-A fuse for safety purposes.
-
-.. figure:: measurement_board1-02.jpg
-   :width: 800px
-   :align: center
-   :height: 700px
-   :alt: alternate text
-   :figclass: align-center
-
-   Measurement circuit board assembly: a) printed circuit board, b) adding the 1-Kohm resistors ± 1%, c)adding the 1.5-Kohm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers
-   
-.. figure:: measurement_board-2-V1-02.jpg
-   :width: 800px
-   :align: center
-   :height: 700px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Measurement board installation with Raspberry Pi
-   
-
-
-
-
-
-Current injection board
-=======================
-
-To carry out the electrical resistivity measurement, the first step consists of injecting current into the ground.
-In our case, a simple 9-V lead-acid battery is used to create an electrical potential difference that results 
-in current circulating into the ground. The current is injected through electrodes A and B (see Fig. 2). This 
-injection is controlled via a 4-channel relay module board connected to the Raspberry Pi. The mechanical relay
-module board is shown in Figure 4. Relays 1 and 2 serve to switch on the current source. The common contacts 
-of relays 1 and 2 are connected to the positive and negative battery poles, respectively. The normally open 
-contacts of both relays are connected to the common contacts of relays 3 and 4. Relays 1 and 2 are connected 
-to the GPIO 7 on the Raspberry Pi and therefore activate simultaneously. The role of relays 3 and 4 is to reverse 
-the polarity at electrodes A and B. Thus, when relays 3 and 4 are energized by the GPIO 8 in the open position, 
-the positive battery pole is connected to electrode A and the negative pole to electrode B. When not energized, 
-they remain in the normally closed position. This set-up offers a simple and robust solution to inject current.
-
-.. figure:: current_board.jpg
-   :width: 800px
-   :align: center
-   :height: 400px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Wiring of the 4-channel relay module board for current injection management
-
-The next step consists of featuring the 4-channel relay module used for current injection and its assembly. The wiring
-between the relays must be carried out in strict accordance with Fig. 10. This card must then be connected to the Raspberry
-Pi and the measurement card. On the Raspberry Pi, it is necessary to connect inputs In1 and In2 to the same GPIO. For this
-purpose, it is necessary to solder together the two pins on the 4-channel relay shield module and connect them to the Raspberry Pi GPIO-7 (Fig. 10). The same must be performed for inputs In3 and In4 with GPIO-8. Connect the GND and 5Vdc pins of
-the relay card’s 4 channels respectively to the GND pin and 5Vcc of the Raspberry Pi. Now connect relays 1, 2, 3 and 4, as
-shown in the diagram, using 1-mm2 cables (red and black in Fig. 10). Lastly, connect the inputs of relay 1 and 2 respectively
-to terminals B and A of the measurement board.   
-
-.. figure:: installation_current_board_1_02.jpg
-   :width: 800px
-   :align: center
-   :height: 700px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Current injection board installation with Raspberry Pi
-   
-   
-Congratulations, you have build a 4 electrodes resistivity-meter.
-
-
-Frist four electrodes resistivity mesurement 
-============================================
-
-
-Under construction !
-
-Describe the way to valide the first part of the instruction.
-Electrical resistivity measurement on test circuit
-
-   
-Multiplexer implentation
-*************************
-The resistivity measurement is conducted on four terminals (A, B, M and N). The user could perform each measurement 
-by manually plugging four electrodes into the four channel terminals. In practice, ERT requires several tens or thousands 
-of measurements conducted on different electrode arrays. A multiplexer is therefore used to connect each channel to one of 
-the 32 electrodes stuck into the ground, all of which are connected to the data logger.
-
-
-We will describe below how to assemble the four multiplexers (MUX), one per terminal. A multiplexer consists of 2 relay 
-modules with 16 channels each. On the first board, on each MUX, 15 relays out of the 16 available will be used. Please note that the suggested 
-configuration enables making smaller multiplexers (8 or 16 electrodes only). On the other hand, if you prefer upping to 64 electrodes, 
-which is entirely possible, a GPIO channel multiplier will have to be used. 
-To prepare the multiplexer, the channels of the two relay boards must be connected according to the wiring diagram shown below.
-
-.. figure:: multiplexer_implementation.jpg
-   :width: 800px
-   :align: center
-   :height: 500px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Schematic diagram of the wiring of two 16-channel relay shields
-
-   
-For this purpose, 0.5-mm² cables with end caps are used and their length adjusted for each connection in order to produce a clean assembly. 
-The length was adjusted so that the distance between the two points to be connected could be directly measured on the board once they had 
-been assembled one above the other, in adding an extra 3 cm. The wires at the ends need to be stripped and the end caps added. 
-As a final step, connect the cables to the correct connectors. This operation must be repeated in order to carry out all the wiring shown in Figure below.
-
-Once the operation has been completed, the 16 control pins of each 16-channel relay shield card must be prepared. Each card actually contains 16 input channels
-for activating each relay (Fig. 12). However, we will be activating several relays with a single GPIO (to limit the number of GPIOs used on Raspberry Pi,
-see Section 2.4). To execute this step, it will be necessary to follow the protocol presented in Figure.
- 
- .. figure:: connection.jpg
-   :width: 800px
-   :align: center
-   :height: 400px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Connection to the 16-channel relay shield
- 
-For the 16-channel relay shield no. 1, these steps must be followed:
-*	Position a test circuit with 10 horizontal and 10 vertical holes on the pins of the 16-channel relay shield board.
-*	Follow the diagram and solder the pins as shown in Fig.
-*	Lastly, solder 0.5-mm² wires 1 m in length to the test circuit.
-
-For relay shield no. 2, follow the same procedure, but solder all the pins together (d-e-f).
-This same operation must be repeated for the other three multiplexers as well.
-The next step consists of connecting the relay card inputs to the Raspberry Pi according to Table 5 for all four multiplexers.
-
-
-+-------------------------------+-------------------------------------------+---------------------+
-|                               |Relay shield n°1                           |Relay Shield n°2     |                      
-|                               +----------+----------+----------+----------+---------------------+
-|                               |Pin 1     |Pin 2-3   |Pin 4-7   |Pin 8-16  |Pin 1- 16            |
-+-------------------------------+----------+----------+----------+----------+---------------------+
-| Multiplexer A                 |12        |16        |20        |21        |26                   |
-+-------------------------------+----------+----------+----------+----------+---------------------+
-| Multiplexer B                 |18        |23        |24        |25        |19                   |
-+-------------------------------+----------+----------+----------+----------+---------------------+
-| Multiplexer M                 |06        |13        |04        |17        |27                   |
-+-------------------------------+----------+----------+----------+----------+---------------------+
-| Multiplexer N                 |22        |10        |09        |11        |05                   |
-+-------------------------------+----------+----------+----------+----------+---------------------+
-    
-	Connection of the GPIOs to each multiplexer
-
-
-Electrode connection
-*************************
-At this point, all that remains is to connect the electrodes of each multiplexer to a terminal block (Fig. 13). In our set-up, screw terminals assembled on a din rail were used. 
-According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming 
-connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.
-
-.. figure:: cable.jpg
-   :width: 800px
-   :align: center
-   :height: 300px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Wire cabling for multiplexer and terminal screw connection
-
-the next figure provides an example of multiplexer relay connections for electrode no. 1: this electrode of multiplexer MUX A must be connected to electrode no. 1 of MUX B. Moreover, electrode no. 1 of MUX B 
-must be connected to electrode no. 1 of MUX N, which in turn must be connected to electrode no. 1 of MUX M. Lastly, electrode no. 1 of MUX M is connected to the terminal block. 
-This operation must be repeated for all 32 electrodes.
-
-.. figure:: electrode_cable.jpg
-   :width: 800px
-   :align: center
-   :height: 800px
-   :alt: alternate text
-   :figclass: align-center
-   
-   Example of a multiplexer connection to the screw terminal for electrode no. 1.
- 
-.. warning::
-	The 16 channel relay cards exist in 5-V and 12-V , in the bottom figure we have 12-V cards that we will directly connect to the battery.
-	In case you bought 16 channel relay 5-V cards, you will need to add a DC/DC 12-V/5-V converter. You can use a STEP DOWN MODULE DC-DC (Velleman WPM404) and set the voltage to 5V with the potentiometer.
-
-Operating instruction
-*************************
-
-Preliminary procedure (Only for the initial operation)
-======================================================
-The open source code must be downloaded at the Open Science Framework source file repository for this manuscript (https://osf.io/dzwb4/) 
-or at the following Gitlab repository address: https://gitlab.irstea.fr/reversaal/OhmPi. The code must be then unzipped into a selected folder (e.g. OhmPi-master). A “readme” file 
-is proposed in the directory to assist with installation of the software and required python packages. It is strongly recommended to create a python virtual environment for installing 
-the required packages and running the code.
- 
- 
-Startup procedure
-==================
-As an initial operating instruction, all batteries must be disconnected before any hardware handling. Ensure that the battery is charged at full capacity. Plug all the electrodes (32 or fewer)
-into the screw terminals. The Raspberry Pi must be plugged into a computer screen, with a mouse and keyboard accessed remotely. The Raspberry Pi must then be plugged into the power supply 
-(for laboratory measurements) or a power bank (5V - 2A for field measurements). At this point, you'll need to access the Raspbian operating system. Inside the previously created folder “ohmPi”, 
-the protocol file “ABMN.txt” must be created or modified; this file contains all quadrupole ABMN numeration (an example is proposed with the source code). Some input parameters of the main “ohmpi.py” 
-function may be adjusted/optimized depending on the measurement attributes. For example, both the current injection duration and number of stacks can be adjusted. At this point, the9 V and 12-V battery can be 
-plugged into the hardware; the "ohmpi.py" source code must be run within a python3 environment (or a virtual environment if one has been created) either in the terminal or using Thonny. You should now 
-hear the characteristic sound of a relay switching as a result of electrode permutation. After each quadrupole measurement, the potential difference as well as the current intensity and resistance 
-are displayed on the screen. A measurement file is automatically created and named "measure.csv"; it will be placed in the same folder.
-
-Electrical resistivity measurement parameters description
-==========================================================
-
-In the version 1.02, the measurement parameters are in the Jason file (ohmpi_param.json).
-
-.. code-block:: python
-	:linenos:
-	:lineno-start: 1
-
-	
-	 nb_electrodes = 32 # maximum number of electrodes on the resistivity meter
-	 injection_duration = 0.5 # Current injection duration in second
-	 nbr_meas= 1 # Number of times the quadripole sequence is repeated
-	 sequence_delay= 30 # Delay in seconds between 2 sequences
-	 stack= 1 # repetition of the current injection for each quadripole
-	 export_path= "home/pi/Desktop/measurement.csv" 
-
-
-
-Complete list of components
-*******************************
-.. warning::
-   The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date  
-
-
-.. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master\sphinx\source\list - 1_02.csv
-   :widths: 30, 70, 70, 70, 70,70
-   :header-rows: 1
\ No newline at end of file
diff --git a/doc/source/output.pdf b/doc/source/output.pdf
deleted file mode 100644
index 7f741b574d83f318192db39ec62ae7b2e5e9839f..0000000000000000000000000000000000000000
--- a/doc/source/output.pdf
+++ /dev/null
@@ -1,384 +0,0 @@
-%PDF-1.4
-%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
-1 0 obj
-<<
-/F1 2 0 R /F2 3 0 R /F3 10 0 R /F4 11 0 R
->>
-endobj
-2 0 obj
-<<
-/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
->>
-endobj
-3 0 obj
-<<
-/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
->>
-endobj
-4 0 obj
-<<
-/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 366 /Length 14835 /Subtype /Image 
-  /Type /XObject /Width 521
->>
-stream
-s4IA1!/<peBk@>F9hbU;!!!!)!!iT*!!E9%!!*'"!XSl.!!E9%!!*'"!H%o>!!<3$!!*'*!!!$<!!N?&!!*'"!,_fV!!N?&!!*'"!-SAk!!<3$!!*'$!!!'5!!<3$!!3-%!!338!!<3$!!*'#zz!+5d,!!*'"!+5d,!!3,S!(-_k"U,)6":#,7"pbG=#RV.O$4."G'b:ia&Ju6$)&O)*(E4DC+WDFJ*>]P:/g;Si.4Zr")B^[h0.J_).P!"KgAjSA#7(SB#mq@S$PY'1(`Y"T.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnts1eUH#Q\fE#m12P!!3`5!tbS6_uLkZ!!*6(!<E3%!<<*"z!!*-'"9eu7#RLhGs24oF&-)b4!s8T-!sJi2"98E&I/sBO!!El;&g8tq"qsjB#9n.%14bR]#U;[@_%fkqn0Bf!Ee4T)()If*)C6^X-n-W&2)[BQ3BBMq77Kd<8P2o\<E<1'=^#<GAS,RgBkh^2F`qtRH$Y*rKnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A'`Q#s>ai`&\eCE.%f\,!;ioB+]k3(smlLFH:o_%qPq"add_uLk[!!<6&!<E3%!<E3$z!!*-'"9eu7#RLhGs24oF&HDk5!X&W.":#)5"98H(G5qXF!tbY>+Ya065u@kqE>'NOJHurVOeK%r#pV6(n.fDQd0^X71uTbN(Dn#.-7:2j.Q'+C3&s#e6q'R884cEP<)lt#=BSg;A7]@cBPD4&FEMbNG^4UeK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^rf%8R-g>_/RjlYail0@j2o_%qPq"addg&MN`!<<05!tbMt!;]0B.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!MWX?`c7pX$`)%U=6V?<'5++W-b+HZl%D9q"RYhkeVDMpmbs;Q?SQ^"-jHlo)Kc64?#e0#WW[j<ti[0\K19=Q?"XF=Tf+%.'_#AH[cbt_VN#PD/M-iB%8ta5SDZ3Y[nb?\hdF,>u;q_ZHW3-[1(2*S4J+@7P!3i6t(2*S4J+@7P!3iF$d_^Jui;Weue,(d7r1AlH!&M9^\EH+%C!@!SRldS1r[!V@W;K4)r2OH0,&$EhX$q:N@KCY3E5(KD:ZYb2FrC7cB(Gjtq[DcRX>p,jTLg?%l3[n1!GJ#oi^gl]Ra\^pXD]@=g0WOZi,1%ZWl,EQ"7KI6[42#/:Zc`DKii_BCZJWmMCVU:U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5GqKC:60&,$dOs+B/#%*4'bN#:HJ7;^j,qak7CGb"n<Qm'fs%%:`/]e=6?VTcaQl>:r3$aAL(BcrU=Nq"jj]Hoba8NY@PiXGf.[H7oDCj:TtR8L/RlBdIA8E`nfj9,#g=?7mH]KQNrlkKrrWq)%38B5]*,hJ+,F&1Lm;`JG^H99Y;SoCB(k4iMJD^+@j=Utk_8_uV/^"6G**gi@laehn3&<Q=#Jr)3F!4j#`(4WfDCI\W^$jcQ@(RGGtsAiVD<;GB',.u`j&.&)5!.&)5!.&)5!.&)5Ffk[%JSZl8S:Du`oZ1#gDp%_B(r@=PirZZ)8l5'BU/&22]Jb%TdpE1'sNW?4KMWgsqY=mf;7l=Nt$Juh%rk"c0VYJJ,e9;G1I?iDK/_1R[N^:rPoZh\D<qU]#C?^0meT?LEZat'#&:BlMjQi<9H=nTb`Hq/4LUC^b?fZI^nl5:W09cD91YCoo@mok4SZ##?hn%LsA*2[eCjF;F[nc_aNbbPrG*QfbUWlNgn1.>77U3>9Jr1tY9L=UbTE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!$cb*E@2jQg@U/&fK+5U8BfIf[*,IbF;Vd=17-5^uK:];@!_dR:hB?:\!Z*E:Q)VaL\XgIJ^2lca[0KUN">`ju:fE[FXdg+/O0<V\jK0ASi4K%tEk6!`[oGjG-'jcdn4AIZ7-<HMhO0HLZWF9:Mn(]=cMW6cbMC>,!MC>,!MC>,!MC>,!MC>,!MC>,!MC>,!MC>,!\k`k3b4eD:K&j>iSj4dDQ]48NaE."3n],J.\[j:p<Mr;kcus#$B[a()8rDj+rBF/deLa57KZc2?Q.uBW,I%K9pski'N>l-9d&rgQ(0ii:`o*)29TO+!nMTU#(;"@c=:+ATfbX]l8bo,Ge9W29!*k*J=?Lsc/!]?PlXT!1fmN;8RQAL(q3lD&7=%Ik'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N&+jNP&$_Ch$8iV,;@XrTgHYTjHCD-h@H*%:`_O-rY2T^)hst'br]GB)']kO"?K/3cd&GKVcW#$^&7kmHT&s3q3n]?PeO%3qIE\pDA9?0_Ej<rr<NC;+4l7"Vag!"Vag!"VlMYd;QFnK+3K<p>^M)_Or7o-i+<t4BH[%Hp+^CO*7PjGps`-P)-e4A!>2`j0))A_r.S)21j;hf]'hZW+#=ff<X3'LuWbk=Q2eoEYVSD9,#YQ>5$ecf5@?:(7cq*EJ[5Fr_,WUCY#Vi/aVLPg0;Mt'=b,7'GKe`oVlWXVisLI?;'_cRGu`Ak5PF:&&7s2QeQmPeu+J6U>FOTNKVJJIK!&3/H5\\FdSk8NNHi%dQ$;2O8\\NrG0mGY)hq>26F(=F8l5V@W-ZYj2g<NB"o=%mAI2r#pEkL5C`tdkUS:N_X>TcgF['IhjqJtATqXe1\IqjU9U:a:&GW>f3e),L3HW^IOY,-rb$l2?EpGR-UkdZ_VM>!O@re9gu)Z]Gu=>Diq:%hl8hUWE=#j]<#_8o(hF[tQ2FEOn1nui?$s5s(!UNt,M0iqG^AhEp3pX572/gnH9jt6:]X!!:]XX>NDb0H;i:/%Rj``-#9I@;Ps8X)YA0n&<+P#8..2qV@lV!?B[:PE2*5)M_(P)HFD\i!mih+pG!G/d>H]:@YD=8eeGalnf&3RR#lCAZ0ZQ:dn_`m^et\?RNF[m2dD0=)3=HEb%=O6E(9o^ar[#,F3:%U$e?\jU_l0;emPk9*.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gnceu]F?V+Z.phmWV2$itN7!70j#"P8Z>>u,lk--b5)/CGNE[t"#6>o/ND\(!:%Z\h6L/YUk,4>_]Z2DNtSpZP06>ePNNAW$33GpDh!o012F_KuVpnm:t'+JO`Db<97-MC8J!MC8J-YJVCiT2Lh6]hKCq&d,/s%6'sQ"5gW.3oj#nY7!k!rrC!\;-hc:pkfhn,U9km;:?Q,3U)1[p$Ur;Ei>7,]6%?W:BN>qSMo]ZhlH/.7;HZBNN@<SOfVC!0W;\"c`Ki/(%c2cXH/`c[rrH_754r[;*Y:!;*Y:!;*Z,1M#8!+Wp[FH[Td(EmW-84P<EpjE-pXUH-]`V2S-;f`p-34\CrC,3+QpakLR>hYl%/QW&=HWY1Tp&+1dp^J(\aYjk&!()]b87Wc]a@9Cr/`JpV_Nc;^71=l)==J&"1,MNW30[^_J,f5.]P7pP3[*"g.[?S9f&bke]q=$]7h:b\W$-igG;n.1<`nc&T"?+VqUK%BA63Dkj$f8cW0)<_6Lm9$X+RnpeRmb$N$>VbkhI?$B1LY13Z(D-*/<7]lR%SU1M31<SQI\*II;,oHT69SCB\%RH'Ak\Khl0(W'S.J/<Wni*)A>GHUbkP=0`_J;F"Vag585Vei!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!*3`gFZ%T(/"<[<-.l*8@$9],^cc\hkRD7XSpX#WI*;D(4uW4F6R74i,BIr0Fs%4l)tW+0f(Ke(-,2gV"%1i&,6t[Dii&T/pnR8/MC>,!MC>,![_+2c2S#liDD>u<,b0s87Xjbq6@QU'HWD_F(P[$mls0r;B,I&OGrPW`[o,1&*-K8Jf;"\kI^)u2fl-j[S!da"Y=IFDT&8[F7iFf7`tBjG!33%Q'FoX#FVIp0*u#Dd70"$!70"$!70"$!70"$!70"$!70%?L3Ul$7ffl<J)N1Nul&Kbt0KD>XIk6V)($='8($"-tdQb!Zfr^?F(B*;YmN11Ui8et2)=LokRpf9"XWG*H:Qse.PG'A4hOTU_.&+@!kQ6ViTE:!!TFU#@cDIQucC6?Ebf$`b^]]Z:gmi4@oM](I?6c?(^7D7XhFG)CA.Cr7h8;@XIE"e;?J-<T/8HM)Y)WT7.EGnC&8UQORb[O@2nXVeI$Sb>g"'.=deqJW.&+D-`<n#fJ-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-tg`EqfH$?+d`]H&3fEbAFc3%Mt3#5d+AC07U=8/'FV6QLVn@[bI<4iHYA&G`)$+q<[7A_b]Ip?`E[C,qk:Ro`"nUcmYWGq=EhPMC>,!MC>,-PJGmSe3$-^b,f'Z*cX/!/YA8<FQ]9EVS,m<:PZ@[gH]P[(Ob(lJdM=Tnpj5*]>$Dllg-C\50FG.=0MFK#K>hj]riZaMbisB6Ad1p7.UJ;.%gX!.%gX!.%gX!.%gX!.%gX!.%gXPD]`\QH_E%@8\/+bhJo(P4>m3>!.^Ye!,JR4kCPdbGp&Z%74K!oc8#[A**+r].b(:hof'e=FDAgik]gAJ,k+BBE?l4#fj\u^\]tI?,DqMq&Z2+epZ\QXJr1tL@7:l,!FE%hSNu*-?3')FgCjZ%!7!T0A,VRcn?44Bj5IE./h_%.\_N)u%/ck*%JZL;q0Q2@Q.4m5-/V)4c)GdCS*d3='N%;IEUf_k'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mo#lj6Nln_QP$*he89"c>g;uG('AX58s+8oIl&&0"+dr^b3_SGmWr)!"]#:rfuZSnl`')Yq:,lr;QaqluIo&iD]1%q0ml`'N^TH_*o&7!C[`=9t!^>>12,&_'Y]t@_G#X!QX@u.ESBBPa#*_p,snOq`dWYZloN='!(h<jXlO\r[0)`X)q3GI2JoZ(!umL;K@tbl4d)a;'A@B:]X!!:]X!!:]X!!:]X!!:]X!!:]X!!:^<-Xb1'U>Y4*]R)G!8sSG_,l/4P-Ch>F;`]0D,fcFUESaXaYf$t+;%Yp]PO6Q`FMQ16iTEagC<5L39rn2'd*BM6P>cmYWGj?!F#.%gXQ0*9HF?7iWWgC#bt36+n'[QcVkQ#j?_6N7%JMbX3OYIM@>0jEVtiEA#.7MqMld@=QCcY9,2/+/JE_MTb7!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!%M.Q3r51bdYPuXK*I"+h5NWj`!,[5Z9&T$qZS2'`r4aM*Y#kVc&"i"$MC>YjoR_rKTE;P!/T(3r'l!4,fsXa)EM'a"A+A<2aK=n6rrC.!A,cOG5P//\pgfq?-f'5a4sd_cRpDZIHIW^,?Z^Yq;+20!;+20!;+20!;+20!;+20!;+20!;+20!;+20"_Yd&db^+)V(o!E4[Q"EW^sCqg,?t\(?c6mY(L[7CYI4B1clTjJ^-a`:Ytau%jF*Uu/)_\a?h4UQU:et)$7MX!$7MX!4lV>IYL$(j!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!%M.Q3r51bdYPuXK*I"+h5NWj`!,[5Z9&T$qZS2'`r4aM*Y#kVc&"i"$MC>YjoR_rKTE;U8'E8%WKoc2>rrCG`=>deMTD9HXJ*j05Me_Imrr=)]X7J?VJ*utm+67au'N&4XHjES<'ED!!'ED!!'ED!!'ED!!'ED!!'ED!!'ED!!'EQ='7fNINFq=HH?i:#kbq%3@,Yo?B[]gPGleHDYa&&d%5PXaGlcq$AZWI.Sr=S``8q0iIX=0g#o$:DdU5Aq!U9/.<aa'pj>=r!Ce"ge]W!.]2r9;0\1m'PVMJ\s@72/he#NnBA'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mo#`nIdd1%E->H_(J`TJXrQO%%g9c+,tQ2HP_QV^=V=L69Y3(`+7.LpC?P=4)nRg?S.bae^V4+lZ-^s%cc5r'N&0sm0+2$5QtNA^Z8kQJ*ZMUr<u[5.\eV!.<[%Xk)5:AhC,>\Si`EdkCL*2.L/G_1'kr`e<TdMVQQ!*g1f5o'N%Oi72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q'"7\!3124"J;X,N:\`<k%#9SNpNGu;THpG56r))RK?u=gmgHEk7a5FhFHMG.#\a_J*es[\#Qc#!p"m,RF'N%;=*T9F$:]Xca'"1H:("c#"?ku*PgZj<nrDZfTFh\FQ]`!"XVN5b%7!?$*D0FiWhrWbpEEtOpF5e>b1RAtDB8<"iRH\fj7=E#A5t)Ja!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!"([B;NMDaRdD8ja)%7$P7<j7:Ze=3]D(/BPaO.8!KS+o<b.Ys1_r:lm-+A\ZfM5ng5ZIRp!D)PK3VW6N(HA898Q8t[;r,Q2En-F6eUC"?72/hI+&iqO70"$!70%Z.KJ,ODiEJ2d$cJW0"@%*E^sBaA&*$ko_#-.@#a4dS@`/g*6%OU7>FrLhIj87lIBEp\[DU!k0=^d^I4o/gP^\+,;+25PE<R%R5Qqj!5Qqj!5Qqj!5Qqj!5Qqj!5Qqj&G/'sr00m1^6G_)4+]&Xcr2O^\l:"D-Tbf)^/eE)eMVXk&iX;N.i[a9;M^W;l,H`_"*%ittJ2s^r.'J5mSE/c-T:j%N&Q)g8MC>GT.&)S!/(4D;fm+JM[nRpq\WlJug"_M$j1!:Jr8PBC38RdR30BceKiM!5`:O%2[ct4lVeMIjEU=qe_@ioYEQ9YlF-HCNZ]nAMWp4b7RGm<d\S/!YX8Ee+M_n:"I6mFT72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!>j%,hZ`&+kjbZs[BRJ`W105POam$i0qaGUK<`Q-![,!`b25=2OC+>A0GWceFib]q;(L<K_"sIpA6iQ'3e=I.?4`R(dO^APq&uRYpDNDQ1;DfSp*LK\m'a9:*;*Yri9hY@.>IM3q\RL&Y@jJ#jCiVPP3;9UhN^T0jOsX7#!L8o10Kf\!iAKnL#1`_RZudI0+jAM>N:GF_JFplI8,NT>Xa@TIHV)V5F^NbnZ1Ie:+.=[bl(dnM^GD^\MC[p%QjP79J-m^!J-m^!J-m^!J-m^!J-m^!J-t97,AM%VgM*oV4Ntu(N.O=RI>H2/O&ZqL8KpSB8Ll87!mJl-'Fpq-nVqHbrn#`hDaNho?fW'?$3h;/So=m^lcICeq`6itH%&8gPYh(=q;0Nsq@k?PMYTX*_MTb7!fAD!%\pgc=h`M,e#JdO`q-\BQ8o::REtafl4oNASKn"J6AF15-?%a8rqYs2NWo_/ELuj*?Y=r-q[*Z`GH3nL0Z8BK]9:i\Jr1tZj+&PPM?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?(K_DLqbsV1.BEH#K"$/V%o%b'S.6jp*#@]U$7j]_f`U)DK8cZY?nkE^%kl!8>HqE:q?=h^:PLNsde]F"_G8Wo*a#TZV83&(jV?p@[hErjOkE.&+FlqJ`0d-igA6&*jjAHG"Gnb\-")G3#qA1'bQ3*ok\T.&qs^#q8Ad7,]&HE0e`BB]M`p=X%F!E#DeR6Nb\f:9QnO+,Kj'>or[d@Q??lGWUc-c[=f9T)<Yk#G>/Q@BgE_;cAb'eG*9L)H^aW')?gGU5CIsjU*E1J-m^!J-m^!J-m^!J-m^))V2##Mks'n38_1G,7FTr4TNgkoE<[d8eH*0aJ_R,P)OTt3TJEs$Yr\:g,bY!+29;G0s:]i5J@!,E\#FMCTFH'Y,&V?OenL6Q?M`rI4?01XB$NIMQUl8Sql-0nBo-O:g<Vc$7MXZ:9^IM-igEj^cE+b?8ed%1DQtXM+@b*j/N%YG9HiTkDI+&Zn&8)r'>-W`jdeJ8';bKVpKYaA<1-+[=ZEL4)7C<-t=)n?Jjqs]puD7l;--YBYPA`!!)OF>[jN?@gDHcr0R<o=t$,ZT_U:9MC8J!MC8J!MC8J.,l"G1e,C)KMQO7(pd]h@r;.ePo=j&AmG.-!G56"Rbi_.Tf'DChg9:KJSt#`[?s(29I.RHfJ&>Ok!7[54!0qL%dms<nci$F"q,[Lqm5<ss%_`ZnT+c^]J$<gtqg[u$/'[s-Ngm]+ptN1qqhI2PC@2$$iKZNDrr>>l&,uXf7/m8bAq2r05PDLiQMr_kHm<WJBQN</D1&Z\]Gt>t&0>dSnA+4YLU-FL!::ltrr??9q`VpKk)AZjOe#)EW?G_@ha6V$EK]EKc?%SY5Q:]lWT/L)$M],N!!4PJ!95ru^*iDgLjU(h[[nkpDD_/rrEDep7kOchA;c_#DHuQV"Q84b#O"Sknk\WFnQPh-rZnf=I]GDuU2!VP<o.HJes!l)$%RJ+EWKKs[d9'EGLk7Ec29ltGPiST"OoP(p+NoRMou&"8+V,1qrLrZp=@5BkFq-H,Q@`QF8l5<:]=A/qb;B4m0EXk,U^Mpp?hk[V(l&iZiU"n72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!9p.?!2NCa<7g3$tA2$/4'^@(KbPYN%2pnE[Ft1gGkE492:LieUIfmt&jm1`uN?sRZPnh]_<`U(H%o>]?[u%a42Oil9l(>Yp?^[\20+dUF;<uicTf)F$r40Z@8h3Z;\,6?nEr=$Y8sO%m8)O:Pa\bJAiZ@Sd72,`'V>)RZhqD-2!+=;(h0U7?[ViCD*kg3IT5Jr8f:#X5OlDL6M4#@iAS!hN7m[Z-@<"'?<9@D-7j]ks$roJ_Dpb0D7<#sXn]H,sf^!G0neEd<69j3hVXJt[&ppYTr&u<r+rnsZn.1Jr@B*c!b;K;""=U"%kW+6P.%gX!.%gX!.kb/t"dXjWcZ&1@j"];h%I]hIkVt^%HLXim`gg;0m#-QX<0E1TgFVW9SZ\)_pNNgL2;eN0SG#c@TC^LDQX/3\[HmEIakI`p70l+/A,;frhs#Y#G?qf3YKZ_gCho.I+T/L*l?uHXV?"iDQ,dC++nA"Zr6MOho(@`Bo@?_,$7MX]ZdoI3U4<T[VJ2B#^%to8-KuJ4:Ye=mM<mIQ>.L>OEr011I@W9#X+c^[ql/J(h"qUZS7a_ERU2+fUY;db0WGN]c[if(G@TO0qIb]Xn6(//&"6ZloCP/HG%1q9jc6YE]mn+a6d_RR[)KD]AojO68DhG*%%MM)3;38c7Z&_^+UGq70j5g^k;c:4;Klq*U5G[3MC>,!MC>,!MC>,!^.J:'rrD,Zl+coqMuNcIcX0mXaZm1?r09E(rkPdgkkXEEV#?Fjk&12![kI]`?V+>D^Tofrc/86VrrBImkpcZ`NVKj=Lcei0[p-)&ek;KgX^:;;@>m=_Htldc$knpO@E0["JEpL+'ES$??_O&)eS!LH(SY[=M&KW6)LN?!X?_G>Gh%UH8N=iP,hM4MIK'<:j8MV_Kg4o3BE%t+&qE!Gg(40R:PaMfg]%7G@]tW(mB>4Sr^]h@J*l"j!(p_(M.d"`Nf#6X!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAJ9V/l9U:#4#Z9>^kQTt1jNOe9d\RYn]s;j0cgBWj8m!/6E5rrCBYQi6FR!;oh=n?KBNq=h2p!59QT!/ds9qc=6_rPtu;Oc&M>o?uj+2#dQ0NN<'Zcb5\DnG`Ld<F([F>DUd%V5lcaij7PVhZIT5k%Vjm_S+d>9UTHO[BslD7t!gFn9dl_VGVE34E5ia7kf*.JHJ-->Q4\WNMM'M^$kphTDV])*5`.1Us,[%@\W5Jq%@q)_"P@@dTtNtp04HVL,0d?GpB75j!9(ARe*XK::nsBNOA[9%%mg@+QOU%NXt)TQYkd-$@'`e4LW0JCmH8:p\AhY\"5#;Y+]`@]t$_o5Jm-b*#rH5jl#]T*7pa<_r0kXo]DnH:J2(P`o6m=Ph`%to_G(]7<Q2fL3/KJD%g*YmXEJ>b'TX/BBT=[M6:$,>2EkK6A:c*N^\*ge<"I`X[7,8UjM`R&?N&Wa$rQf'NQR>>?Vi#DtGpq)gV/4!sFR+JXi:Gh)q<IGm:NeX/Aj;jin$BB2Y6La-LK(p!"#dRWc3a$uF9r&X*?gn,YUH6f68[:+L@t*kgRIX"MCf',`7$<KE<eY].J%/e:I%^aPq7oa`;t$d7jA52=J23^F>V-TK5fE'6u%J^$tq+2lM$L4@rbrK=^r<LjIPW0Q^l@43ZqGg^K]rr=R/f01>n<eE_.6_F/LO:K5-eNUWdI8:mLM4T!qAneDZH)5GlnhF`>\seY:q"jcS\;,Bkr/\5&iFu`\C2<aaMC>WKUaVtFoSj;;*(b:PfiUW-/Bb^!kaBaoh]6_n<sVEo\RJ!"Of'77Ch6*Ub9Ft>1V8aKW\R\JJ-t[k5N!?K;Wh<@*,G^/\steDU[cAFLHP8SYNX]4K<uq7ATl'o)d6r"OLkqa+*RhV"/*nP:ZJP]-s>TAH.[5!3*7p8!5<t*Xa=/d-5I[$C5K[V<rW/OG^-<%/uQ6HS<E>RJ+s6?&4::A_eg#R')g=>6E'A"<0bRT_T("gkMGt4peUl=TXso^BUaIk@6D*Gmkr%.oYrh&oWMKbfN>>:*\tq/Edn0Q8h5Po!/6j@!)T<cRK!9R.]!(E&iCGmNO>=YEIS>;\_)?RN;chIZTK^@9)el<BcO/hhQaQ7*fia8Vu/)_?iGK?^[HsX!90sW!/6E5rrCBYQi6FR!;ohmp9#@HqhtHp`HGU6l#]uai;Wchh=uWiT59N%nht@UP`5%dSE-;7l"e"m=Or)'%@QD1UH0,13UVKV.'600MC>,!^.J:'rrD,Zl+coqMuNcIcX0mXaZm1?r09E(rkPdgkkXEEV#?Fjk&12![kI]`?V+>;^BjfkJ&88cfDbi--hab;Q]qFL07HEXjnYP82KS#-@ik=-+7RlHod'P;j]h`b[*T'+<Jfa1Hi=V,"7'.Ea_m9ofh4.dBl$8eKg&Z]7X%&H^`\eZ3Aob;nCKnt,l[l+>Q4]1f9Z>4pq*VT:;;HX(\W$9D2*[<Na:ol(c"0\Df/)c!2/6YQ7N'P=6N/+[/6sM^cijhFU5XL]0.q'$00e[A#)_u1'n0g*^RbmD=DK&bb#JpE>>muj%6K0F/V/Nm;rak#\D!nq#c^D%`9T3IcR.42Z9<K!9Ah.L]6,EoVO,5QG2)OT`5#QK_U?%h7rTZ.eo<[5=k"4M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#,\]DhjTm\Tp`?BY<gkQ\6@%<qe?h+Ra\-3!tl%;/c;EqEt.^PO%3GdS5_?Nbh4'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!(%2mqp$WXf))(p#q0o6dkF_>6kP>>r;-uY;i)^0R1]CgTp=K<EA?PL55Dc$(%0$=9^\]=&q3UuSra2*W/?f$C+$[l;*>D@X*.=b_72,`!72,`!72,`!72,`!72,`!72,dZHo(d&R%O>_rrCa<]WMe(TDZY-!:?-PcX#X\Na)MI&"i"1MTnBC-h@1s;+25`*b\D>'ED4V5IFkrPs%)*^p/CQq<R?]q'Ym:rrA4[VZ-YK(,,V.4TKID%_`ZnT+c^]J$<gtqg[u$/'[s-Ngm]+ptN1qqhI2PC@2$$iKZNDrr>>l&,uXf7/m8bB"Cdk)uaI<qf;]:g@b*'!.:"1!">jeJ,0NIJ,]KM-iX2,2:-S\p.q4"ZM;JY0qp2&CMbL.(L=d)'$(:+];XA,*I6]0C+'0C61F<'iI*.3h[aGPqL,)Gq/@Z>&>=;&lHDSRZP$"n-FB_GJ3;T[KDtq7'B1,2G5hQjR&f4MqePnXrrA2qiZJ&@rrCK7X5[:_r?J%o-ig!!-ig!!-ig!!-ig!!-ig!!-ig!!-ig7cn,/*TQi25'rrA]1^Jm)Jq%n0,qXg-S!'iE4?fB2URSs,1I8T"R;+5jEqA<'u'ED!!'ED!!'ED!!'ED!!'ED!!'ED4I=+f,;=3tKmo(1u>T/W?kbJ0\5'N%;I$1i^Q+2lM$L4@rbrK=e8i;P'QbVT7PrrDDNkN6.>PPKZ@oWl7+aF+!f-?+'(7=9+KTg]Yl!C[]!!C[]!!C[]!!C[]!!C[]!#C5gbraLBNbPqQTY4B(eL4Ae.rrBK7q`T.gp,R'gUcs9t4tAJi!.:E^nj,\Y=.ji472/Q!?R5X$J+?S2htmJorrAhWYH=kdTA$LJ8tMOP!+8pDoR-93dXK9po/D0RQi>U?UoWY8fc0p&n,%/*!8@,<PlMLq70"$!70%VBm0EXk,U^Mpp?hk[V(l&i[J&5>#QFcL-cA7CmJd0_0iu<#!W#;T'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng12/"8Gd;NEDG=sO#Ll7d6PopQOh%Z\,ACE"`EKZLKGq](=4s9k*TRZr1O8f3;U](gs&:`%krr=96rrC#>X\iCpp,roSnG`J5g&B^DG$g=+SkK(`#Z$7@kTBg)Oe_pVii)kWKI=\[oFLs%aO1"fnQ"mS;>lPC]DOn75IRg;QfJ'XP5bO!'B0Q!#QFebB`A)-W^#GKnH]!prrDUHJ,E;meJ*LCd-go6&+U7uX@HjsrrAJJ^[QpOKDpH%!;RNtr[O!(6@;*!!'pPar/Dfu!#8hJ73C1S428]2KDTErfmZ0JGq](=4s9k*TRZr1O8f3;U](gs&:`%krr=96rrC#>X\hU^4V$rMrr=2@g;J/AO85A?rr<=#Ld1)FrrA1VrrD&Wrr@^"`#nU^rrC-frrDRhlVpa[O$gPW5KH'tYoT1krb%Do!5]E/&,HP2!9@hn!;NQYi<f#Zr<*'"nhbjo<I310Iq-jnrr<T#&+-GgAbc9*RH2-PK_U3!Jc>`G)F+3N]kWETZO;D`KtejYpGd.pg6ep^V5J5cU5CJ*iX4bZF/!Cfa4PmJD>`iQbhr#lj#_81O$d2i'odMoY>*K3bhiq7<%9A[h&]5h!!lAV5Nj3h!0O&V!90sW!/)`<+7p*D!6ERf!:a(T<*,RfO$gPW5KNL^[]pj>j8N\SrrBnLiXbkjrrD+nrrDho5N)q=#Q4c)!:hsrr)J'n'RsW>mf*7tndk,h7qMJq!1Do_n:^Rhrdk(Lq&2Ks.Za?kHpRc45lUi^N?A0#'je::+5$3I^Vfu%qeHesIQut?0DltW+TDG7J,Vourr@qOrXb\5J'^F[!$b#6!6&$A;+L=C%e&oe!$M9p`-,LKq4:7Z!!lAV5Nj3h!0O&V!90sW!/)`<+7p*D!6ERf!:a(T<)NUT6bE7\a?R,<*LGgcB9N8p_@to>q?R$#jCnPnpo6R;$1S9!"9/Al1k5F'HIW^ZA'jZD!"\W2mArfhq#:>^jM12;pk/QsrrDj55Q3-npd0?orr>=a!;qfurr<d?[7)1ioK0h*r.Fl^&_VUtk&Oc4d5;@TmGHVur_K$Fm.o2<NS3MkW33Rd/(1+\1b#GEfcFHD[&_]!-+aL4U:)`_.&)5!nkY.X!ri8ZB)&C\=oSJTMu,<OZ<L*PlooU[Y4&uHR(qOu1"s<YM?*6dKRX:-!9$rX!,MT7`:*S)qb,'2!1-J+bOYSWp=hV!4gC&ooU72$!fAD!!fAD!%WC>;KR_rBn0Xjf^UF)nmClZu8!W6'fdb,<G:msC*Cj<'+8BAbqOPClPQ(X;X6D)^!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!"97$~>endstream
-endobj
-5 0 obj
-<<
-/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 151 /Length 28608 /Subtype /Image 
-  /Type /XObject /Width 250
->>
-stream
-s4IA0!"_al8O`[\!<E1.!+5d,s8E!T7VQ[M+Eqj?FED)3+E_a>DJ((^Ea`p#ATAo&Gp#UqCh.*p+B*2jFE_/6AKXZ?6SADn!(-_e!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E6$gAjSA!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%s1eUH#QU1kq?$aB!!3`5!tbS6_uLkZ!!*6(!<E3%!<<*"z!!*-'"9eu7#RLhGs24oF&-)b4!s8T-!sJi2"98E&I/sBO!!El;&g8tq"qsjB#9n.%14bR]#U;[@_%fkqn0Bf!Ee4T)()If*)C6^X-n-W&2)[BQ3BBMq77Kd<8P2o\<E<1'=^#<GAS,RgBkh^2F`qtRH$Y*rKnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A'`Q#s>ai`&\eCE.%f\,!;ioB+]k3(smlLFH:o_%qPq"add_uLk[!!<6&!<E3%!<E3$z!!*-'"9eu7#RLhGs24oF&HDk5!X&W.":#)5"98H(G5qXF!tbY>+Ya065u@kqE>'NOJHurVOeK%r#pV6(n.fDQd0^X71uTbN(Dn#.-7:2j.Q'+C3&s#e6q'R884cEP<)lt#=BSg;A7]@cBPD4&FEMbNG^4UeK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^rf%8R-g>_/RjlYail0@j2o_%qPq"addg&MN`!<<05!tbMt!<2p-3:6C\3QE@)5.kmO(rgll%$4$GhZGuNO%t*o"0Yl_NhE#^4Z[nL7XOh#"#QD2gXj2J_ich@H3+U)-Q)n=l]+c<:\$U\48%chRS<Dln&>AG`rgiJcWgMD4:o1[5j,?5%m;_"aQqSDnlKa9K_f_.F8W;unkW$1!!/;/g]?.h4QEWJ3cj'ges[,u3U?"VGrZmna)3o^0-C@W8)^&17QLX3rj^![`^_-a:,qT$B;]Qhj,Q0jJ0uK>!"OLr*-'HAH4IWD!T4FlHfQ50qr]sA4hK`!$h)\ue-";em.J[bn"8Ut'upQ1an@mDq^87ep%?<Q!PL5')=DR)%!<Q_4oU59i8fB3J^aetI<[dE)5e(*n_AKfJ9b)FnN$H79Q?)a\JXM$Id,maE,Z%"a!:Zkj#oBbK?*c\*HR2#':M4GJW]_Mk^!p"e"-jcB7Tm^Sh\Pr%oPH0J3?@.lfr.+%/q.&F?.Z5l(4FD3m[s$c8#\.T41UJT"$uE*)\^]gQ5"qq@%<R?Z,"mWVcut3Pk,<p$7Y5*U(O/F4ZBDl(5er*HRg^CsW;pfFA*]5EB-`irBR]M5(s/,JS<SnDf$Rr]lZ\jE/H\*..A:N]UaBk<3N;KAX6&!9]uJ+&Br@!#R]3j,Uf/f@09Ul46$,<-!'4*003Z8$CD6mnX9Fo`I?AQliJF0Kh0^,I_+5fQ=pm39)gqi\T3MIm1PlI_GM#R,&!bTR-;Qk8;Ko??iA%rbL9GrrB5g;;C^6*-;1&ci3uLXT1lWc@8dMqIH*;g!<@5HB&N>k.l?BIkCcA'5q46LQ:$OJWZT(\J-$'Nh493a%ed:3fh1A!"AaNI=Hq>I^g6h(a':hl>_DsOiL=[_`Sq%4S+SI!!aL8KB^D5;;[E5RHo`R3!7V3Y($Po9HW>EJ-j7<L[%sqd#Pn``unb1$02R\,,<Vsc_``5_ZsM^^:rps#IgE)3<00P,Q@bqcuMW$PLkp^%c\QjF,p3Ur-BH+N7&\VHK903a7T976@7XhkQ`?1q">QumDn1M37!%C3Zag]N#m5h&,uW5J.==4%o=rM3R?/:$t*]g=,qV'p%nRT3;+&S^`C2-"QWs#4D3.8UD_BFfQrMRj,Q/#5.SsP!HLArO5njgH@&M?n+iUGV#>T33#KY\mt*a:]l;nM!VI>'#f[>b#9JN##AsS:`XcH:#(t2j7j):hP'H<\Ih/GT&7^[Wp$1AZ4gI-kYC(:;^rbWo)$dTp*$7qG@$*\a*"G6UaQo!b"5EA/gmmMrf:a)JcP\`+!VFZ-5DDrAc8Q:F)=,TiglGg\Jj:N=B/mrBo]5beV?-?3>_!%j0uc6oA%r.fmE,9?USuIbpBSI_rr?;3q?!?2^]](,q/PaUhi:2RJ^YJ)N;WeA^qnt%_&:Ah!*jNq"-65Daj4>0irBK/70C8C!'\/(hbGk$)!R&00p1+1cX&]n(uTTul1bT_f,,R,PFfItj,cI"*;?*.*;(O!!KK73kGKPta<$]o:fR9$htnhB;:i;+)<lYPcN>6Amu`QfoGqqecQ,#>HO^)N5Kar-ob\McJ2hR1!M?(NEVX)Hf<>@7#I+MbJ]IC#rA"6ONdh[e5Q,DBkKj>'&$Y;Nl(1Xu4jRI7!13iXP(*s*^&FOM5EL02f:Pfk&cR.Ia(34<O3cE'NgUpap%B9b:HA?"j:483SNVCN0EWHh^rc<J5;A0ZdXT&nY>NS*r`D='cTjIfJ"Q?3J#+:Pl,ip;nE8Q8IPX4hk8?9)W6[j2!7pnj6/S+9f@PuUaZnh<iu_Nnj7)>S3??Fpe9YaTn]06@`dPArVLSjg*;1NT!1`T.fCCbRlc0k,q$r#oqYD1_M@On-N8XF.4.jRh/dGa\0qW9(rdLAZTE'3!5N0rOl(;d8V!!au!,%pDr:#1eF%cL^/i_0Q:X50Q*BDFtS7hZrH?)&YJ.*E=r;1lP#G.FsGWZE*HC]UH4jTui/ofM4l?fCQl.:R6:'O!3gH!;:'A#3`*kaeY3W=Nk'EI!9N:tT4+EPh'0R;T*"Q\b;+E2DNT'*?`,G/:fb44`::?.?t]4?qMa0#nCl.gF-W5l(Yc@7SMa8cQ,l](reO86g5*G@T+9P:!=N$$Dhlbsl(j7>8q?cN8`+-dusT`#@?_<mAFh0AjDJ-9frYo(e^)lGiEof+$edFTN$q=2Hir'rpKJ\e+i3#ls"S7<Q/StABsGGCaLe.K]HBDQ85IRY^dIYXhu5;&SNP]S#1r-t-1cdTWHn(`$Pa3uE68ks^S4*!B*rYbcM,S5F<Gf]qu^&]TDrGk\+2\(,u4ieKC)9M9+:(Q=)Y8$r/r\\BHZa[cc)uO6u[#I^cd_$0i>O!#.:6-^&>(u_)[0o,U.';RDG\th'pQ;ehZ2h/1O;Y:#ndGF=ama[fr[_Ep_46#!B>VOk\,<s\HM``1mq#`YT4aB<@WJQY[PEOdY)Q&\k<^n_<=$p6eSA*II$0E9/S^R>U%qJ*Gi@U_L0:)]-KD6abIDaPa'_qZKYh3^AlWSH^q02XWt?/"bAicr*I9SWV)ja0i;Li%^YYQ7!09lF?JYJOjEbbNifcCKDDBFb:.`JG"5J%fh"W8`dIHNkrMBK&GZ3WML\*`._jXqiQV]C"qTP7hC)1`bl8LbGM_*FW95bqu/Xb"]Ci!Jb<oAA-qe(Dp8GiYg)L1G_4p:C?_nR%5b>@^VL>TqShIm_:/Z#SGYeQ@;/`luZ\VaN:GD8U6,M8.Gq2&o@2A[X`EOh?.T*p7O>;E$9n>V)"W@F!q(\m7;<?k<6D/.TjT@rA;m:Ukpn0\]bAeW*6mtgIYIg4rsj`l_*I9)pp=Bn97kpMbA'^4K@@dT+Lo[L+LPZ@[VVdo@cYiHc4FlT>TeGA4'nI1&-BZIPE8b^"_JY)dZd#OOMphSilpb%?;rG0>T-BYA,-2<>Ubqi;KCioRAIe-G+jjg5dCNj`Z9rZrQ>Mae&>AGO+EH)rub$dd1eXm4V\!gX$@BF7tI]]GQ>Mj/+V5:VoVr(\!PM4kr?Ga/e[l3e+.3p_(b8cX*P-0h@B<>KY_thSH.P]2RqUdI&.Cp"iV^U'gD(2F/PtJ=DO#1(!P[otRQJ.ka!TMF\?7<]HT)eCf>K!/do>AI$L(.Uk<l09&2'n!J=r?$A$G3-=fi3n\;l*BQ["PD>Z)Y>Tr\;n'dhq6crD1-l/nr4TH10sDIKQ,1SpLrB.*'&I*JaXp>HW7l??+)eQhO-_@s`VHAkP3iMl/rFHS)mI1Bf<pgf8<eQiK\<@uhWWg.>SYP$W"$Qd)nOBBXE,Bu5!>e6rVTF-F;4#Y%a_SWe5U+XoK"m2'<hPI$jJ5(Mgh`^p$4f:Vem;P\r:7t9+mY;kk7%jqK"O29Scpb)<X)f)LD?hdKj''/pIbkCr6!4G!@TtHe"1>j+g7dZ\RnjYkl3QL>2lrX(%GY@bZcoc6LpfG;',k,:<+'-h^X4qP(h.`3oG]ddpMl8#2P>.W[<C(COEhoBH:<$2JN]rLXi>s8eY]J#E%&U`X#>NWFY;tS'(qS.S.42%R-U3&X;-&>"lYXtgGY@9)i9)-N%1X*2/j%5IXrt\R)_)_;*tOghY?!Z+)O9iq1W<p-=s(8L7\r[_\oN`O,+I!Y^,ZGarHSVbrr<IMaQa8MJF#etrr>31anX'Qci(0I.JjtW1W$j\nQ1B+6fSHb=lLmC5A+E`l]!gRH[-d>P58CPM00]16P)WtU.;oQRj9Jd:Ziht5Ek%)3;=<[0=Ul!Hn%,U!5Q<3I_CT5/`@`qc7kC$A[tfg<YBJQ#hF]'4C[DE>dY2E0bia;amup`PBX?V@E*df0*ckfcYN$r)0+51O_;1?4qeZ</]?W>>.(>+a&/+L/P/SAQ"$]_etX$@V-6biif%)4rT`k$FrlE$rr>7=HfN\0a$"B_l.[9Z!76%`V#C`$!5nUr&0=W_^PRL2rr=dW$D.7tp%dq"\%/Um/,fpin2B:e8#lJ*po1.F*^7sTkCn$_"!^%@)Qg>YkkRBQ=*2)>j!^e]6],S)rS!WA4ZasI]7#jtq20Yp:SY$qOJa07nefMi;,3u-4Jbb1m$t(O,>a&?b"X25a6puT?G>Ilj8A)KBt3p1m+<-s;;[sjcPagKIX-;Vrr@YEI`NTLDsao;45q.I7u2'l8St4"7C$8.a`0G>Q#5or3@D>a/nQ\cOiOF;IE2JU33U\r-\gb#Xrs/^i11K_Aqef,V+CZ/OuX,B>oXEub"At$7htW?m'e^m.f14+",anEGI0(].T1:Yg@1?%aYi5gP?sSWrKDrFf7\D+!qS#TibX[4E%u)b0c;TTKu_2ljf4%ZSJmCuL7;AF@^*@V4$,o4G*m]($m#pdjna:H^nW"7l@"-la,W<eFWZCJrr?;R3^!['_<_)Ip\t6d"2oUI&_$a[YL!mGht?X,85>gcpE$718G208+Q1[&:bp)K49,ZP8\r1_o:,jI?]1NmJ)I^6!![lgHqs4H_l/##GjE?7i3*^W*ZUfjH9S7cfJL96o1GP,?V+^nGAB4JMX;dB,]s/e$Te3g[Hcj6*c7M!X%+VT<Q<R_9i\54:7Qa'3D\>J;O(FMU:I1r>g?,L7`i!p\GO5D!q<r,JBW94M/XFnK?Wk.0K9ELf]&nn<[s@FXOX.>Q4""YXSn[t<2hfK1n^ZNb+b-Z)1L"_5>6^udujKV/78S/YQOG[Uj[YP%q7a_^LJql.2TlTgEX\O..B`^Hm.KV!r.\kg+40@]r-]?1lJW@l/q<u\$'2nD"AC*:O+O`Gi_r]*QkrJfYYBn7PHeAO$V)7GP1;%!8#1uR:Vc`UDH$&AVR1;`RBf,b)K.t,mpp?KTh)P#q7CX`_ol42O\?+S/]J\/`I7-LZ31\cEN`97>e4)_bnW3Ib@Vb,6_0$@]7G@,).#L3j`Y0)+(G4EjVN"o0RGeP8NooY>:iTLS<bmliXc;:VV;RkNe.QrA^[GH=1Bh:\K-W4E9dME(4)PNcEtJk<1QG>iX\N:T4m8#GD'`p?/@E5+"(E%nutI`\W1d:ZO8]$cIK?nFqTXMp6aj)W$\:m12sFc[Dk[GP8UcSS&Rp`_265WFLZ?^``&bScAnUT??&MTC>ujfgk#/jlVcbq)hICG?)"_M59W`NO>sFr8]q3Y.q&C=iYQ5j7fttf5Y1V*:PK-b;*>W3N21RH$1h[.(`5R.5t!2g>:8bS1):%g/V([]XC!GNBBkl*tGNZ`UU\ZA6^uaXCWjqo/qFNGg&d>mdRc8-&Kic8Qi+@^s3bDePAR*_iN!$kL9G2Xe3haGfS>-mQp"<PPAXiIl_e'n6Y;^ko,'<jZL+ln3"nOLf)!9A'a!C6/e<6D>Q"PqbRI%$NMthl1!$u$]FmFGae1R+,HKlnaFAJ/?#2pM&r;KXWB(3R4]FRRLN.SeF6Wn13,?`!!aSDIh0'0%nkYQ,fEG,F#_OIL9FH-3`N?sWIO?T8bkQbPi\N1J"t##NK+)Oiau&CXZE'!'f.rnF-U.r-L@jpa(86>Z&<I&FXg7CWq)%Z?afp<`uT+Q3<]#k*W<`X;WFrgJ#3J"[n_#:ik3%bJ&YiLrr<r758T1U(AR45Si4u,$+f:de=aI$=*<:@^9puX<\rZa@(_43PiF/Be%m#S3ZlPZIm0J'gt0WtV,i:AdB?<A)RSSc;O(?ZSOc=iV$`?<in%fXo2]f+%g.m.k'0K8r3mVub]#PAENOr7i%\>]AePhM9(AlJ'8<QETiMe18tB*;O-QUW@iUY-\)YM8GiKjY7S2^ZT`5!ViV\BPkFR/JmHQp%1I,B"Oudp?B3F^7r"So)9OHiSDtp6;Dh%SP1bP0gmFU7D^PU73EQ>7'HK,7%h7o?;qdf^,JtDT2$iGJ6rakI9O&,PO1aDeUY#"U'r(\<JY?Z.159J&h#C\n4Hl`4eP(,4d!3s3:!;-j4IuXI.Zr?s!hZs/]ftO0[!3I#SIqW3Y8g!j`T7c#s'n>LCWn6:Wr"i-nnBl^o$3(""<RWu.!1AaA5EE66ACp0,r"=\_!6,Fp*qp^*5P]A8hrh+j4T>DtFT2@%ir0d<rr@sYd.RD=Oc*'YXt/Tn:]=+dC]=BC4@T8MV).k\+$\ij3$8.<Se1o%l'S*!H0fO0AFo`o*-K<)/,G8*!.m-.f`(s@YriO]m+::B=@qNpLR):_n.!@t\[g;h%1.n>dT)YF3pX[=ZD;/>V/7i0#Z?t/&cB/#E-XJ)n^kJ[+6W0t7JKUI6cEC:4sTheieN,(>0"RQ%G'o(SN9H.(!(sA\Zi\3rjL!H[<\jW,!8$$c8[d.p'r_6g,r)mi\L?#`tJUG(^e\apGg<8Qa=?,F\]6U$HZu?;*-]>J"Akprr<ll*sI$_auHPWX&d>^&rou2=`$/\Af1e*[3^]MVf`kdo',`-H$lEk*)78Ke>"!`9E,!bh`1AjVd@<#kJ+RRf8@T<&H;`e#.^B&"DW>E+7eYL^3tS)p?'#Sp2TlriEt;+i9u:^0).n4[N6dE6XT*&,/)9WY1bnCf!JYs\_B<?Ih_E''jj/[6#qnF:Dn(RnIa*&otF6"Ji,crr-HG2HZ>!m35MfZC!`u9`QJ^HV^bf-4sa(.8nueP<g@nrEGN.M?Fm#8dqVIhq?Y"$\TW>;[.CAo(IoR4B%\`A/@ujVP,Ue`K#Zo;nMk:UjI>mY;QC%8BgPF6k870p;@rj.4IoRQ6FrL*o+8VUJ(N2&YQNd\5^htp;?$WJ%<M%=!;;$)+7WG-0QE0M"R@G=Va$J_q6&7neMSt#rr<]Ombd[.0BL\*VmV"H+7MRdT83FHZkm*F*'>&'rr><T@m?kt^J[(ql-C"B!9B!UrrCZpX8`/tBHQ4ud(B9T@u!;8)ih]+8",u5r"jGR8;G$?J'gj<1]IH.r1s;p*hQ,9Xa_uh&jXH.+94F`\,^Y6PE0&#rBgMa_0:CiLjU'"Vo4QokNUsi3dr*Zcf\ZYlsK'',Q$bUn_e/0/U$'r,O2OZPP_TkYK5Vcb8!7;DLD`CkK(.c%JE]AjVt@l8\\JTT3c73!3d:,OfI&:C79A5p$i7X:XlKuDsVA8Z*Z4?g"o&^(=s-3H'96!ng'$7JlROj3>J+E0A'q2]^W(nENADTZe*.=>s?[`QKI0I##.A%&ou:FBruSu<C:>RM6NYX_PoEk[X95+rr<D,iMQc*^ci>0!7ZJ8oC(/oNqMU0(EEM@6,;b?cVAM#f7V](564^&*9NP2V)`*I>iA;_>&>aVfZI'h<ie-*nkkTMpZ6*JZUl7i3)A5`iPmr/_;_HapDd#Jj)Wor.P=gu)QcJgCgI2MM:S<LWDoihSP2_D-an]i:'ir#:!!>73fAeA[[LE9W+EHJJjtKAH\gMrTpd=\nP'^TY8"7O.-Tq6=:d_?MZ)3-!.mjmh]=9:hiGE7q_A"NnI<dOi,9DkdXE)!R_8$/IGnNJ8FWdQiN[_aBjX-VcqS4aD`!J2rE64q[0phq,"8F0!!U1:T6q[;h\1AppugUQ0$d#;IN[J44rWt(2D?BfCDsXJBl0e_>3sX,[P=^PBD/r!l.#ml#d'nl1.GFH!"?L\X^1^?`SMC#%\G;<p\G\^ZqY#PGZ^cGh.`=C[HnMqi.A-PYUc[U&4T*;Sc8Zr^*)p+[]>*YN\Z>6fW'fbXanVD.Zief=-Z#+f7Z<NnuC1h36j_ZN'E/+qWIKAnbu[/%loq*Hp=*39-$,GX'tK;;o3g]YaCbE++\QG&,**2'472f<E`K5cO1*4C<P9sV-ijU7`bK4E.>[prB53o83%a3NXt^,::Tc5\?)5*mBmB68CSpHn+<_CmBOZ7lI$Q>,6O*>4ahRjX^f-hEQ<"=+)ZFhSe#/8r1,+n.7N\A.)/lmTAp]:^,2iZ[450bITj,CeW'=bX%o3Vhu;H2+2muAp;HaTC[_H"DtpI)3UUCce?j]5?eK[;3De<K.b:A30>l.+XF>Bmd^k0V>]CHU3rl;!IgB,BQTC,fhP#3Vgg4>mgg4:A9&&I!lKVEAk'7s-[$+,N,I&N#Z">8Q5GCC;/s"%Yc1&XEHI=YPFu8(g4C`49XrE5iY7"Q>KdF7SXa@=u$2Z9(AS^e1i6T7N(OU;op7:^=_%u?ZYNf;7];`Z-Y%!FK6.,.DMmeb4*J-iKrlkg0bP%@_6?'fVUqA>'.:i?2><0[4d!;/EMlBaRTW-j'][UUe;JPJ1IbMPP8e5.$r+#SCnZFsl:E)(H%etJfZT<IMKqXUeYS]IQShl81[ne^&+\ItEj#faKD_B42pnI!(VVH#6HJe'Vn]Ce2B:mn!iHN5.B/&PXg>_<[.9qD,iL^_&-BY=@J;-t1Z!AsPA-*h*#\E9c\r1?[DP2UDhGfs#iY^j1B\Y^j_^[4"aGd##*=B(n5n"%?(dI1d/5ebbONOYf_^!,E&67bV2^mt/L/Ns;T&>7:+P6>!rr<2Lq"-a6I`^IXF_sJ4DL>IBRs4XUik`,]VbusC/\Qkn^]hVj3\+prKU!F#AAL5P]K[7=DJFH/Imt78J(`JrV17=IR_B9-SXu@o[3XM7V%pUDrBp:%pl+Frps6gI`t7:uiuTi3qA!403/ff&bIEH<8huR:V*k,A+$+C6:38#2a5*]GhnAhJpA/doHfGsbm!WZc5A:&sg+VF:m)/>%=nn]\,>^;pG+9?"8^]352Qu+WG'.`-k^#D(+5^AZ0J=]IGrA^.9mLjF">W%8bIX^[3s8M\bfi<Q7LM+L!5MNrEK"t!ho63)']\nie:21Ng)jYM1n@B5^))/J^=7NTi-Q<5r=8Ddc>dXZ0,+s]=m+AD$YE%7gEC[>>9o8Il&<BIn4*j^MR/"kW96r0_Ep5P`iLehm(&?piT\M07]n(P_+EP;du@Of2]/=e)sK0=Pn*sZ4fOr[.H0fE=eAcpPOOkC&b"-DpTSd[=fsB?P\!o"PMr>X9hJ!RM8`H1@3mnMX_,5<p9X_,^,,c?*[nV6nXd(,UA,MXmR]MunD?gLPrq.&gOP1ih1Q@u[AoKWoBLXRZ\_i(UfO^bLjZ2\rr<N'MoD-L3]Dcb*Fm#k]tq\%Q_A,[R]ZM.JV\.o@@h\Z367&>?A?2$rJ<aK?Q&jqrr<_YKs[8Ed!QA_e[EsiJ)`GpC#RIHl/"^E@:FlqY'&Q+Tpcucg#Q+l,G+JdpCK+%rJ5h'rL#hWrlom/\+%/LIg'Q?%":eqVle&P]^[>\18k_+XD<"epXa<L"8O!I>!d[?/`Ar/Ib2M#B9@-b)He[qJYcQe8sER9r%j<@4r+c(P'FRcN99ET9:q=rR#6at9!aD>H,%T'!!p<!4t(h-ZOD>>r,'Cigp\EH@r"E?'^#&RAsp)QM5<3^pjO=.Wn##GUOg5+?WZsmSeEQi8h14"_q1G/WgE7`A,?E.f_USbl;lfKT>]<gOte^K\e2B=OJjXXbB#La+RMC4_B1cA6-(-4q![0k`,CAKLseI2p`%1Y#h3.U&_d#P6bh%jG)lg\frm!eMWmqmQ@!m';3a5RYOiU[ofY6&e$$/r<q>!?dkn[@MsL9;\Ph;4b0JQrRc`VhBj"r'(a;G48Jm+K<c!>Ur[knCUS"sma6d=*cM$9a]9N4Dn,qNlJ)U('=_#4&8K-m.-^HALIBD<j)Vi*ORVXm=ns5@Y?4#Y^pPSPlfQrr\#*&cr8l[T*\hu3Vd$1]3;NJ1`VcKp&-gintWQ''dP"K'4dU24QiI?Cu)1]u9I!rrdQPJZ8l<$0<+NuNb"/hO8V9;!M*E26@N\:Qe^engWl8XUL`SrT(.,K!D.Xs!s&,=QBF5VP.[%A+]*V!16iSP<<]3ACqe)Y5E[D+bIj%V%(dTer$X(c]$/1(alA7aZ0-]2.irr@=O%PN3.WV?k;HB4(<XK9'GJ)OZ;pVf%:Ek9n,pk%[&[@:4+ZWW2Y[d`0G1iY%/_,LJ23W;[di0*!'bhjGUBNm-G4sAA8\G149C0P$X?ct9"CpcJD#P1&4UM_="RA%0J[<oE/gC9B?+<oc1rkM["2;H/N'BWn9!eh#J,dG-b>b%C<P".P-^DHG8$Mh+8!J[:6j)B)\9R\H&O10#?^9<3\8>P=Gdu1<f2^\o3Jkdcc^Zf+Yn%u_9Q>dWQnQp.%As)&d+j?oo3+!lJi[_[Q&Ba*9qcc;%@4O?:Te((:UiP["_g<k8RTLOu8s-/8C:%RXO3[puo_.P:h\<JVTPN77M=diCDo;FZL:<sbM8%$1Bm3D1f\Hfc*nk*-e\%&4.#rPJKuu+O8DOa],.<7mgPYocV\\;<j!<?CA=R2!h)-JoRd->9Csltm&PfGheDXSj8p+iJKPFDc8oUb%V)bA#:7Y!uSN4Q,C/LKK3(bb^b"8IX"oeQ+4T>DF)#4+2rr?NrOjC6/<E^1rr(V;ZFN--*S0!$#a+)"Ap<!=7"[,*?K)Yfm^[,:Sre!Bcd(4RF?c:UTSiQUmF.V9D3UA9m1VquE-hAGW)pA6];"3ZCjnhJ2jR)GdrL<'oqU&p<p5/eL"JPhqP8X-Yf,sN_B-6h'C>Xbo/+MBn$`4mB)Dg>lp%VILrr@`gTQ2_Lq>).Xj7X_s#t+^m-8G">roUE_8[WKSO3c7h*^ASoTCQuo$o>me'V7HPihFpao]QL)^uO;o/&GZaFYdD%$0!V1]RKV8n,/iV"+Sse_B8_4%lO3UQ%--4K_/%]r-J-&i1CWd)p]&iZf3osr&_"6LM5Ci2cnRICbI#)'+Z%h1Ir,0Q#&/"0jSGZAc"L_S+^(]hr=*YINXC)9+*8lFY<u8&h=7c6/_Y;RG1-ZUQ]5%o8@k<VP:>G+k1A3UAu]/@Ju9AIqk%tjD]21MrF,0&4cXD\pnWlrr>6sT@?[7'fYhK:YJn.NQ6si.AqIK(-WF9?gGEF(=AhdnHOTM)>3G+\',b)/g6&.BhDKme8:?_(qc2"UZ_PPribj(7tei\ji]Gr%;HX4G)dXWZ*B$"'mHC0Pl6;[U/YkV2em35j)58e%fZNbZeup^\aDt@Fh$1W326SDjY3MMf?LU6_f]r:ejbft<GK[B*TgLA1n:.%#uZEiGf:PL14R+crr?khp^-J-^(C)&<blW-^D?:?D'6@#R#<$npu?-UV!<KP.S"2aXmV6?eKe-Fk++Em>V2]hrj$o<J)['NnUmAS;]p_=2KN8gl._a%l-d>lrrDf?9E+uD+J&l?$k#Q^;T.LF#R^+D)m2Xab3ROg%=_bMn4eDe"b16ifu$hZc\qHb](io,Va6e=nQ;4*g@ahBXR;eOmu"o(/N[7m61tak6nP`D[?=Zn-,"k:i]L3!DG'O\UBOHKWE0Tt2N/lVB'2oKHtuS`9dnAl4e.cEP(*"@qIf"Dj.!tu=g*E^9oOR(_;I+cbCM2'W\li)B]3s@N8KASWm@*Z$TV531<L[O_ojjQdtd@$#lalJ3j0I!Vna/!DneNE8j,2pN9Ap0V'#ITfDLj$g'do#*sNdRrrAE]Y'OUUpH@j<Y17OjX/UU$7ei&B$((K1o8<O35N%/:T83FHZke/TE:@$1!6S'@:ZLc%6,;ChZLKUI8=X&cI*04s-AV9c5FfHAhsusn49#:ggi`VsW]\eqrrCuh^[acV$m5>F)QnSZT9K9TYPpt?0<sQ]O3ktC4`U'(9)bL`!8tJ]njIp8EW6"r,?=Ykih)G4o3]\d8E:a3a4tajT?HP!iG-+3@1qm`ba&-H$"*3lhbI<pI3Wh/[=1f-K'(M;W+>I_9;U@%Q`9t:?O2H0$GIEk"9'\j#PB<+nc5o]f7T*u>46+7JdCG'ib5!B+Bh?KOX#hs!a4@7KiA%`M')h_S-*-6`NSYdqaK1B>M7^-GPJpgBkIiT[^Oce!"jT]%DBHg\h%ed"B"I,O[BOlZ,[b4U*;(eKhqt,LjhG`Dt.D6C&TLT`UQI:)LJ6TRXVI#mhK3^b)Sc!QHnMjP291u!3D;B,66?6cb[8B>X_8KcS0?m9%@ZJ6O/I<iu41te?ViF@cWd@X&6IBM#Nj\rm?00^u\['*Zr9P,Hm!@A_9*k5B!1TZuG\Qi@nA-0/Vcd$!+D^c?O5VG+@hG8Lnj,ooK([/c/[q$f`n!]FXLIiO5q"ib^4)Flos/Gd#&SAC94I1\dkFK&4L!)bdttB=GSn7@[F(;P"HHV<u@38Y0.%KhodNKRO6XrZuqgpj(d,$J&G+>K.^>nE5Sni.Y='I]'4#><K&'>fR#\0."T]`C`E!;Tg4_7UaI7Hc*GhMm^5[_gWELF\`ToK3,XEdnJ/rCE&7+;STf-J<8Mh>/r2B\a"@3#_ADdU9Pfi0DlIWrX#j3Hj.3Aj6+HU#]9Pih.a>V?4ZO(Rqot3-D.4^!p<Y7mU9me?cA@tlTL2(g</pL()Jo,1m;6O5M:MS*KA3(45j:L.H3Lf,*j.S0Jk7S5?c*;C\pUa7&`J]$7`_bBi]CVku4Ju;4Qe.TCU#1nDB%/9Fi-5*)ha;-%sDq\^"?7idB&[6Ft85B85utKoI(PQ8ZB#**-K1[gD^i(*D7+)i_jHlXQsA_r7:e<;ur7FGiT:oZ]Tr;jFSkZa3PVXgAB?4U*l>i/EWdg8)Kt[F=J\2&keT[^36HT(;1+<XBHUf$UkRbp/_^8>;*>G!#pG4f[E@HZnKK1&h7>j3uSo35=CNT,h"kQgBdn['ID(SgjH"ja9/ZaGNbGj>OG:p?gX(:Ae8iIP!gN>QHC[Y2R,Qr6:PcCM)7k$SS?#=!*?s5r>dgmA_gR;5Nu#drfCuA<\rbrr?gof8;?O!T:++inVAi3I_Ft)#Vg$Pgk,be1bq>VA:qP^Nk^U/.N/Qe[aZSP@sH]qd4_c\G`)8B]"]>'O#cpdritLh:d*m9E+uCHnhCgm(E``:$rT3_U^`)X*sf6Sk1g9p\t3r0DHT,[D.Tk+#RgNhU>6+LZ-R6-^l14mdIm5Wq_TV9.KueZs>`@6DP5AQ8=V)=7bF/dP@OGB4_FL3@s7Y!IBo2S.<9(E\%$LrI@'>++ZY^O2>6-h-*<_Y2=JQ%i9JY6@g<3]MaZg?,o,H[nCEU`P$g_`nNp$7Q-=k?P9WnEZPe0jOcAirHIP[D&>^q;8HZi;lPS<Q+eZpUJ=S8EiU_Ug-<ZnToTWBr)<GYB-&:;"D*OQ%K?EDnXa/qEH7gUM)^,,N5K4Kmk/;1NEgX8Mkpfj)H[mn8i5PZnqmAH"Ub#Hrr<B>p9FChi@@PgD;j;d<W<&PgVS23Odum!S$asZ5nsq_L8+G=E)d!Tg*o!/(&'rj&KBcfr#q[NHsQ5#=hQP'^D1j?m>hds,_X&WN'&ZpZTLbrJk#U.K(i^,:pdNBQDe$Uj6;'g/sjBR!:::(r%J#A1qQ3J]JG%[i"$T!&u[CYCN;#qLFt2`!L[d^=KcQ#@U!V_JU/;skKDfP`/SQjrrC#&L]7>g1^Ta*;o%6>dC_mJ7OTluYe5idb8GIW/T%FhIA5$K$,i/(&k6mYf5=dN`nhb,%oQ#EWgS8(F-N9#bd-;p$Bj5ac?(bhPdbY7;6:d$CQ,#qkg/n4WLMi1:CE<D33s.63,2EV:rI<c(Y"^Ddg8`$=O%b22Ii:dUJG"/[TS<DPCuj5hZ!RlT8:qn.fG\43dC)D=Wl3NDhfAYO%PiS[TKqs;T;EU8X:\3KJYX^f(3D`5`Cd7!3b>S7qQt27P+*bGo_oJSV^rj-^H$D/B<oLXt0Aurr@Y-pla+c5Pu1]iZF0X/N9;sGcSYe$1W_6Z%@AJ%oq.:*DdOh;DW*-^1*02&47igMZ,Ig!R##)J:ECBcdt:>K<MFnaRFZg)At_Y<`%nr][c!,-BamJWJ6@A:%_PWlJ=bMIb-eLrLoY(9[CXQ%e*GuWjt8V"GU]Ye>Fp84_LALF/`4Y9r?r.;[\ArV)><MaKK4'rNQ;%_)+=XC&\/7Iq6<Kp0V<e*u+M=9oJ!9Msgd70!;T(&h(KCX_o,t'[3"@M_:W1$uuRbq%Ap$+*%2;lK6sKg3]m"U:.J<NTRa\\<8gZJd>2cZV)j'@u_tb90A5$,(dae(%O8jqbqkGrLa&mr&F5%`34tX+,@5:6bj`Y]$PQ?A/Etf]b/V5o+Y@TK461W06.ChAQW!]gmm/)6Aj"%c1gV=rr<3tpmq:V7B-2KpidJQ!5gIBP05+02E(<!Hs>VmA]h4S,as^fKXB3@?_+PE4j4<AV>]6@J?/L;?c'HA`gP[J)!P"nLTccWeA^QpW(o/uV22/W:4eXfYr*uZKPA;g)o=_"<@Uq)B`?TB^E#E`qDS+a_YcI"fM'UNb4nUU_W3fsP#oQPbjeU1a2$5[.l*@ret\F:YumMjCgJJ0QoJ0Lonp)miA#JO#qqu:i2FE[;S.F8UKRPd4ostErWA$lCd'(gil0Re`V1.SZ:X$4%phU`o6`83TK8A-72j[K6Z0q>7siS%+,'Xo$Tr:rVrA5AIMmMrdO3WD;rXoG.h+\j,_%-Da-h.Mhb&dCdnS;nKU5clEdWtb':b4#><h*8_p96K<q23(i#da2*l%58MgRs=*KH>Yl-\skGo2([b9N:,f$`A12;RZLO]pJSY:T7=.;JjurrCuKhln2W^LR9D"u`sM+0kTrj'R_G+<E0*'PN]aBK"a)_nuBjQ:1<gY^r<oB\ooFF^)AoN#(+tBVYNU1sE6i%/>:C?^JbIEuNQi/2[_nb7TWMaukm31!Vi"KI*X)lro&r\92@C0D!qMGW3RuVPf=hN\'2D\==??i%['&k8Bfr<Mu)B3Ah_hh[dSO0acO1=#._BG*J`e<J9\tF0*r-:CTX?7t/S[!4-$crr?V;K&.F@<T/q(QSrilUZ.hmUC2/&587Fu^8n8-6DFg6eQZ<?(Wj)6TXM<UME=&A^[P8'!8ArPB:jh)r%dbBX<@;GnRff,9s\V<EI$Mm"jE1aCORPaNj!;DE]<5d/=a3'V7=*q@o$k<Ag@D9FseX>JfCR^ETs"`ph0ASrr@Y3r'8b\+o^0P*&$c'=nO:@%f!&B"mF,SZ%g.jnAK%=IqRJ)a)"R>I$`8:TF3'ae'(HAN:$F:!+fO'?PQS\k1(c8NYP2F`d:/!ot3r97PlRDD/uY*frC3iM:8.*0hOAppNP'#Nu*?g"Q4NCJM=I:C>%pH^c;M69A'7E@H@(OWmrmf<YLckX2Z]rSFG$J(NgmZbjd[XPoY<FT=gfc7'DIAhD+tsHqE7%9&`L3IMhkVqSu?V,VL?Tr["t1?+5UP@t]b:P>g/emis*:&)"/f"0YKu5EX"J`IC($n3K$H?Ntu+o8piC:DJ*q303QsU=(oRRr@eZ,F/c7ELnmlcr_XtJ^AU*iEe_id%uKW%/-5/W5;ZHenQW^WRo&HlVpG-([i^udTaif5=G>sk.'d8kk!bV0-*r5E>7s^\U(5VRWG&>/'YD:^BWdIGtXJ1LSIR8[s6>Q]2;8s&,lo_TD2iEO8duWd>-3M._Q,f!09:Dpmh9O#H@]mkGRL`I/a1_J+-ClrrBqEr."&4!$_,s:H7Uu]aHk!F81Xl-Ls4Y%.hU=1Q;>6T)=KEHbnV8-hAGW)peNa;"3iO!'U>^BW(d!Xq1"$!"f!\rrDR5c&_6*rWtm:lne-Qj,A5\p$jr@a4A!GrrCugH2dl!N;-dArrC$<)=>KB,[-7Hj+6jC^+8n%rWtc<is%[WrrCj$I6Zk+e\;.\fAjpL(K6CK1Z<dIk`gY^E'-Rf&3n3!hNdZ%-iX/o;`4RTYb!*>!7IM4k^N3bmJd1G75uCg`-r9t!9omM4cdhuf`(pnnC8Ve\`<Z^+2dFeDtlo2lrWqS^bV0_)0Xu'i.I*q#jqu>3TC89`IA(6Z3U;u8*odG!+h5MpE0,cC#A*MIsO8.j.PH'^ulj45,Y86hbP-)jCaVT!8,%$rrB$[3WB(l$GQZ;QFl[99YUKHWk/31?-hSErX.Q[*M7l>(]OKoE-O04>CV@A(\J0:\Lm1-fkKD`*GcNQcBc7-#d#u81M^0%$QM_]e86C/Nn+q0"oc^F!457R5A!-<RO?&2%JdJ6Z,(XXGcsFI#bgc9KXI2d[]cN"b`YB#H%'&eSNB<\gJYDcS.2F>J$r_<8)QUbIq]FG^+oCQisU+VO,5^U)Kqi"7_6sSgGTj/0"5<VUrRJQha\*Q)"XC6>J=R7_g`%9(&f$E_r/;J?P\#Dn`H;fRGs85C=DENN!tl*V[,\VRZ3e-Wb9fR.nLktZ(4jNXf`jeH@bbg*q9[L.*-17=g'G&(P0K*/UDPFhD['O<B<".h_V6)Q4tiE0:F\pLTAXpq2a^"V:UC2Vh,s=jk_ET,-R8B4AD9j43MVG(iiO5c7bqQiq"/$4HWTW@<2rp?SfLVk*6jpCgLn-p2d&87,b>H9:O\ZR):CY?//2+^^m_RSja&%O;hm7Z(=I7/,E9G!.kWArr<E'p44=Y3-[!7H2dl+:9XH_hi)kk\+;coIK7^@qK(jj:AOUel%As@1-adUrm50SV[is&Qlkl*ek]&kl$/__GW-WXZtncc?BN6+MYn)N/*KW(<IU)N.9:WTX-[gs=gY9@Wc7)aUo_-[C!+P6[-2WSn6OB9+s."Rm%eBorr=YH1\c(l!%,IIU]I#$\hg(c#G,$"NXrnq`IC_!n6OrI+o_NH$0hHi$R\mqT82Osg:ru]rr?7>?hK9Jlef0XrH!ou?5I=lQq"YrZSoKsFP#T6n#%.)^6/6XA?Qk]HkMlp2"HD;T9E!QRJg1]&,ljZq^$KR_#=l7(&jos9eUYH$YUI'inO7/9Lorf;UTD8DF>o,"#<7jR=o:f[\hDSLroS2rr@Y>J&+9q48U;Di(k>?-@ZZnT+/FuDKHs39B$>kI89)qnN938VjG$(Za1$PXBCtB!:^!Uk/G]ghKf5$;u@h!pf6h8rkol`kGUW90BqZ))8Q(j^`)5tBhs<6#ONK";ocWYHpSGrIhh1q`M[GT23mf^HHjn46e1)tD@^0T6#S7V.agX1Mf9;@^E^l\rr>7+oD1=c*7l-gb9;nJ7hpc^;,jEse#ur6W^\J&?aR^@QE<'AJ)*)uDJamMD\0X?*Z"9YK\;@jKD67;pih\e*&E,hE\-B)_934EQ?@r*0H#j$/UGjb<eJ;%oqP^lMrpjIp#oGh*?1Wg2o37dSgF.VnOLCp!#9l+E:@Y7$J4WeRrh[:Qe'O+(K&WKG:S;]Wp/nlVqe7@*`^B(]7;.'_Y?"Y>Jf8:^)-Phih(k+A%Bs6CS9<q2PF7om&$?h(]%^p!2]+MHFFY+EAE8AQlSeZ"b-V\3q-d<4rnmk`;Tl/?%eYZM*)r`l<YR`XJH?&$iMjBmA@^2;UJ*59a$gk/.tH&NNBPb`W#o@9)YcZ9@gaEq^_HN;FK!ATmu*0L(dle(Wk7&q^VB)_R?=2"H?%'*t[)Z.)O;?XYB_8dNeaVig11n2p#`G\/<5_-S2-pc?/G,XCZPM.S`i\:RtqU3d@#Kh5O/U=se_8r<Bo=`;"c?5%EPQ'%Et6auIif//B.Y1Ra[(7i^WrYCrT=UajM;%4p5)(DW-C@jMNCnC`,Ql:rr2!(paQGWg'EcQ!EN`d2k%cgl_g!!TP#miRVj!,,(/i;Sp`A^S4#BWSe>74rH<nV<#FZ.*n"A5Z:$e$PKaX$Xb27l7\or/;p2rBbm(n`G\t_n\Gjpkdujf&&jaB88?_&Sb3"Wb)\mc:b>e)9tA1LQ*mZ?;&N+WXCLZr!E9pn_UJ>6fK2I^*;mk[(=;;]M5L&P5MXBKUYuURcm$TG%)W'N^U@18NUC<&0*+%NUV]MqVH.Lc>(5gZFV*p%jnZ.b[PR/GBC'oW8I0Wam#Mt)uDr!7fL9oqhP)2_."*5r,%l%!,1MZi@@lg%rh1*eVki=9iK*qQ#Mtq<h+4+X]/T64q)3j#k7<%O,';Mpm#cr?MG1"nSX,aGbWAS[>OPSqb#:TU;!)5g=gnC8>L%Y+`1a#EtX;iAg[[prgXZ$$\S=)_]3WnKDmJSE@Sta\d!g&<>6p]"2o]i(MEotNqom@a5QdZea`Or[Xrm(nCun,O1]>gd<RpHrO(VA%c;#)EPAdcDJd,<"A]Vq!A&\7jQnK$I+\V4rr@cprNFQFgQ0=fH6;oL[6C#Y!3RC<kP91+WGsO^_L+_-T_#h=PUg-M;M6Gc3Ps_QPFU.fqarWGbc8+GUurT:7PTrR>Q4[3GVA&hO.Hqofo/$Pi4NoS]8A<[9[aZCid<c3oB2-o)\#^RKDM`\:B7?>"&>BP:6[/%XVk-<<jJ\R43.&%p8.chJuSak+1,[r?\oj10"`Y';@B*4kV>N"hVNL(6YJ=6&6R$iUS-Mc=2Za97r>6[>I9A.Z\Z9@TTd^nJ^55"hZpp\n(3UsC[.Pe@IMqIKDto[iULiVJ'=I`nh]YDjo5>4Y8I%on>"uE_Aut3627/3IhHu:=h_.H:<QB%5*p>e?/95^1q(9l#d.#C8.>#]%e[mU7`o[=GAti3_jMMpfmZAW;m.00=,N:ak.#e]76&bT-TY(X=#e6_8(q,U2]0\3>@3ih[uC5nnNRnXEG(-`,E0dFjS1$b;U)1[2K?V/=lJ]+kD@+8n[P)i$5dO.@u-C`i;KMsSOFH^BiC!Zq.'7Yi*Z7.Cd&p=LiqV.+3$MRYP`<eW-EC&*XpIZ<@<X]de*J__qN%I2Mgp,SL77G]Y*b$r6e4@$RN/=(A>1UrMC>?j788?W9NWaj8>Oh\fV6'>?^RCMEF&[h[Nc0IGu=_CDqYSU"N(]D.],\Y,cUaQ%cKS]UB41%E695`3NWB'LA:63p/BnGO5G.!WLO)ZT!Fl+,IZH4=R12piBWg)bRW,6Ik,d"MPkgBVUm=58,o--HAhd7's1$:CZ^I]U(<DDXth!QHM3n)NPEi(s9@'26b^QDL[YFNV]bN;cPPsW@&S0%mm)&@\'<bBdgsFgYSDsIm'@b*\@)i_jCku0[$eO-K3hh\9A7sM`S[bYa-5`niB^'>VurI1;Zu`[H/,Q;iPU0X4E"H0q7l9+]>?8rr>pHFZio!Vq#o?m7M%DXfUHLrpJe:88Tp995?UkUpuRWMV?Y<38h8s#`9Hr,)m<;>5L8P=T*dM!,)nsZW+3>n?7T74>ZL&mM0k?M-_O<RaXO1[LBoa3_V:GDS/D_W5m#fdmHH4)_Nc1=#(;M]F!T>]F3a1%f!ou8'lWL08HqsD,#+:'^9RP4s&5W%bn(mD)10/2cc+c.-Pic2VDSNPnfY^h#3Lfi2U.ipVl#"krK?4F\Nh57uV9O@'lE?r[+5g8ar4:_F>&k4@2K>PUuAjMUMM)q_mRN!CTj9H,mqb>jI2$4MDKMEc8*0`c8,>KO&_elKp7kqCko!?LDg3e?JG*IaXe[J"h?0HoLPa`9o.X6cEsU(Cs:P>7XX7_q;!4/"[QPT^#C%=d\2tVh7ffiBjCK';M!tUuLlgPn]uhkb$N=p)`ufq]GTHg%[3r3q&(d4'86I=2\rf"DrWlENu=J[#DZFBR2(h"H_k/F0%ZXP4ED3SD53mZ8+*f8\d=X*-%R;4`fB+\;NS.*tL4J..nTFa*nK2e)WeOGLi?5d;CN]N/b\C\Vg4B-r]9bY!Emb,6WD!n^IIE(],\0#1B]X4@/L5_u;(9m1r+!n99Dj)]of>MX'RFE`u$ER<:*YQq?&HD,TfI37O8;0N:9\odOOara@jQ-tYK2@u6hm-USJHXJF`':@t:g1uWQo`O[m?79M$-1]=Dlj8:LuUP,l(9K$Iur"m3f2ArSR39GK]#6R_k@I5F%>9-cWO2^*0lIDo#@unX\T024kWArYb5A@<^4r4*e4q%/?ijXdtTn4j$8\&+>`LToe>Oa;p1..c![VN;)8agTAC.b8&:b:):"E?.<_;C,47B-'o`1A.B<jOSeCAoL0[7u!HS_1PKJ#lu&W*QrWjHDaFJ0$\da%H4Jp=K8RrZhEq4u%f`=%Dbh_k.Ia.I`,1qb+E.['=dQ'C,G4as(+e?+Q(Ff.@WQBaYkq39*@Vc-?7,+0q5j5AP1sH4PS6qeNf^#3hI4g=O8M'1WIjCSH&_hVep^!oPM]F^85S@AMX6M'TTs99"Z6>D?MK?45`G>RutWZV9Yd.QG$3Q7!a'PbEcJ:lM5@#oTpiX_0XQ5"hm7.T<0>S!09?!0NmF58UT>8ad>f?\1C"_..O+K.FskanT23UJdA)q`2nO;PT<!WmHoL_;HJlTa5)gMN'W)ZE,Z/)iSkZB25)kIK'9MEqheCnB:MtZ11;eCF,jYnSc@7O,\fjUF_$bN]=Co!K*Bf[oTpmhoD<,)p$ZAFt<6<H0b_sB0#m8XA9;h)FoJY5GEC06*lJFd6'LeC&0HE@g_U\dn\@D@C*;L5R8<<[tZ^E)'qQoP"ff]*rc4pEVNu4q,d0bFdZ#bc*Ii,U9q2X]%,;7^Ekm5QAmu,r"NR34g(W!L\h86[g(f=4Q%7li/Ar3>$NkFA_C&KV.GM&d@dLLnQ)r0@WNMY3kTC2K]skaBm^<g!!POGp)!N&rr?O%NQK6>%9aA/IC"lTle=;p:(DU>1Q6__"F;.rrBDt-/,4\brrBmm'YGZmp^>.=%@;qL+lYRo[FV]J5Y^r6qfnuql84mE/5m"A_\C2>b*"<<X"+6%jMCir"P*I+Z2XeNn_iAbOdhCD"8_=gF9AL*:30d9E$l^g]IT:WYW1DZ3tYB)3`r=V$h\C+#==\.=aOnFP+OQMd5]g]DfgIRI4;mf]P$9.)e<2L_gFtl)+G8iiJMn$Hp2_[O/u=!6T)mD]sT5S@5/J0Ml2Gc/NH:pS7V-ZftK-=#t+^m-8G":fD[7pl+lgIX,M8=k<F_Zq!n@a"k1fq1ge-!TCPTE3U?\F'c*M/f<8M1a80KEDt)Ap*sfM&V0E7(c\H>L.H(^JB,Xg+VjiFJZhmGbF`:3\AtF0[B:;D&0.W40E)$BS@I]9L:Apc55AOG8LqYNi/F`Z>N]!pX:MhISe?qfrA%8trSo\pgeZ:F*pV\FkQ$h,DX#lOg1!bc@EF'#(j"+gU<l8CH@50XG8s#`Bf_o80*o!Kebr&,_e";qC?f>nS5=tAu^n)e2?_`quGW1uP3@5D'an"j)_:QpdM_Y4PX&F`2(ulo8fMJQ.:rHML2a%<p0Ae0b:ZCF.5j.j>rLQ(mpfr:Znc&TC2OjgI[Jf=h!$RBYH=MmDIYWjj%b:*YL&V/2T:`COK)A36pqO]G!!7NmV"g"gHDQq8U2#e7Y"L[FWp/!/c'@?=EN71_QJ1=TQ9R8T5fgK7JR;pfG)j8MS=Vp>e9B6f(!!siK&Y!d?\lO,Yuk[In?o2i33Qi:.9*IMV[m8tX!k#4AtA=+%).UJ!q@Xg]K=*C58*->*ck\E1X$&;KrL39`DN=!$'ig=3*1Bc*tM<(cE+S8m%YtL07$5o$:$QlJE)Z\\GS*H&^O/M'`S0LAUe3dnaD%%rMFrMUj8OdpjHhA?P)U@?k%+Yp`MQe25q3G/N).5jXekPS\mn+\Tc21nV-qnk<6HW!1\Au*P3Cu<@p^:ZIQ>Zm4VAE\%gDb)`rrsq^\UGCMV*T\6e%Sg>XI`-%b+mOssmP.e0cA#WP%-_thk2LU1eDBn^EHKg_t>k&HD+%6I&lLS%=F[-j,lo$iXKMcacl08f`JAA0X7(D(ODGo4PUD1n+gj1Ust<m#KB17`6^28e6U<5IT03E1rK(LIJM)hsTfE?=TEf(J@KI6.8cqL5jN07UeBM#RI/J,;P/pqspt:3<%:*8hmkkNUj<7Sipq>P9*hm!iZ?#%a14`Q*d6!lUTYY-7tX8AZj,TR[*&=2'&#rLSHHrm0.VcC+0G^cF]2/3H@HCON;=kpH*'!46XG,&;O.B7&sV\IXf:P,r>WW4m&/\Ro@JB,C?*PjoMTMTW05%*"9Qol-+K9LmW]PZ8,[CJUAHX"!?O\AlpBg@e&,:XSXpCWE"XGcR!Ik'=p.,FRZ(?4T3:<l*lPcW3*&ZV771?U@`k]7Qf48eihqV-\J)W$s-99$$pnrr@Z=N;O7^0q<7R-WJ.$r);#bK@>ePkOng\ir9!]+/sA%3U/p0S/VD,!'W,b"SbFUpI<Uo4n4$;g..11I32:&=%opMNT)7LqnUe2>f.kQeZ@`$)%:D[;N/*oUkL&VFoMGnC];5pL**bBK6!b-rM.:o5o;`M3:#>gor-g;&[IuKa=1[[]EVkP]fN[7NijD]I?RcjSFB2*e;Wg]P.L:%lM<mH%limp%i)D\4ik.*KX/h2)4,=9&f<aaB:iLi9VVg]e`B#oi2bhI.aQtJb>HHLj%8J6UA.0@n>kNF#'&QC#Nr?VnPADiSseiiO2AR@NP$6Ai/sWtT(k;.N#_dk9cZ/gZdL]-*@jjnNmCJL/F@QV)b>]-[^*5n/a]\"%Ch5QL,=kj-\WE`j#;`V\GlQpG9@F:5,4,gng^tGC=T>J8u5_!&pCid.b1J][[0U#4)&g(U&K[UfP+aar4`Is7WZE(0K;YL(Z_+U\1A[:F,)WLaXQ2H..\`;=[qX;V>SPe_/-kt\GSAH^CG_Ah@nAN]f3qdg\=_,3a1:#'u,SWD1["Z?aqhfe2k%/")1glaF8K*$SHYKF80\358s<LiP1@7/*$(*?d5JCPJPuHQf9#$p'DcuLAq6G]8H"fjTmLJ`]k[,-JXehaXf'GOt],Xa2D>>rWi5)i@S9L?P.ZEVYIX;3ok7WWM/U>]@u'KH/lHEAh^kq`@Nq[7k@S)/98boXH!f=jY-CP\*Q/$rr@dtn7Xq6bK#GGj59`Irr?7$LP@od_.B#D/>"u=j)OY-_QFXhB`2+RWIULM)K]ab&Q0(LE2c`qdYt/G-h,f=S_c;R$+Q1YHrA0N6h',m\8R)#B%?BRegh&p7l[3!_=9r$[-HZB*58:ML9!o\nT^!F%l1mW.^ZJ\!*PSWC8jGATD0hdmEab+MLVk&_J$RmW/GM"p4em]:D7GCpBgPa'$%hlDa0/eCXkm,'mr]`FqFoc/o?`J$aGD83&&<'`6d8SO"J<@`s`PL$V;ntYXmf65g)7$KhqtVQiYJ9IrRE>n4u:$cVW&3I1l/0+,"7SoE2&l!+X]hg?Pf,p9i%Kl4"[bXKjRl\O;S(Z8keaTLHpUko]Ci^Y#kZeTBVc9DtK1)f)G;(Y5%@T6'.1F8_^(b'<>+BC]pt=^[?14@p`ud7G94NU"D*[,K=Bpg]&alI['l=.;c\`T(rQ;g9#2Y?#\]e!u\0B,VI!)B@=ljb0't:#C`G&#(/*Shonc>K&]t`uG+P=?[hc]S:O4n`"0u7kDL'L2W$gd?XhjUJitmWb,D+ZK?fT>X^\OP\IrnFoMHH?br!%$2ZK*-2;O-Zr[%+S)J]g9>k9s_4/BSkW6/Y,c%HP9"29j$Q$obKiDG."6sh+m>U)r,`M;B5@2Bf@XtHm!#7b!$EBa!3!5*J.)<ku0KW4EPP+,E4\n3AaS!S9"3JN24cI?[`o?MJb4=\sMo8Z7eWXk,FfN`g[=&^\.dWmqaSu6.pj47$E7RC>nEsFO1pZJ+.Ef#E'f?i2>W,f<_dM_7.&G0JiS@)4QShCC,k[@<`B`SdA%BX0;:?a;gSQsgIM)S[_/Xo/J&4eHUVL4W1qPCs;>>@;[t]9!4Ah:qr$+BRFScd$ZDh=CL:IFA0'3Lr<+CqjTA@NFFo=&j@iSuAq[RRjik0^/qn\m=r#r1e&)mhLlo\/(0+bpbqSn5fXG5$s.&KY)KUtl"9T9e*0hiXM8K<l7)DX@F8#=,6`:=o:0$U,g3+4NJf;/\9X'r"t<3[.(1Jr1`.DB,#UX'c8d^rj&itmK<Ihb('ipHrO4?agpH^2mJ>E$M?Ehe01E4%-)Eh$uBAI6pek[UjH]sFIM=6fI`.[kBm1B.><>q]0ld.L*p>10QcZIJN)qb9j\]Rbr7CO`8;7sATe'.M_B6ZEf\X!u+>%RC02\j(b[0CVL!M>Jas,K(WTd<+7Ypik_9JLrF#BqT3;7sAM?c+IE:Sg:S(2ceZZVR^>]p9Q2NTkNAoNT6:$`sMbG%b:N5Z-Ve,i8@*CqbN$X*;XFrInsrtl0j=U#sKC-'C_!rJGp@0=&8=0KP^)F[0pg^:2?3)MXs`5gg=;8]q4A7pCeW(9ZgFU3u(6jmC;JAZApBOA^\A%o,Jf]Qf=Q>31A/('WB;-g-RTh<Rm&g>*THER^Xj.-Zn_4o1.2XkgAApJ_@dRdGg00i=7'ir[u<$K$5ud^7K7HF3H>GV]7<5VB7Y1_ZNsN<rn9(Er9c8MGgE?[5`2+N+A:Gq>4q,!5Tqp-i=n4F`/8t"gZZB-[[M3Bl8ZVBT7B!^Bn,+*Ne`\@?"gf%\3\YJfF)@2nVZn"m)L;l/_bc]<o/umUri?[^`WU[?7/n[(Lu`CR]TGOO6i,k`Wn/O@(7mYTSMu"BYFKiujinGm%Ld3q:S[4:cpK:Ro-MrlG*>Z[^"%,e3WAn:/9G-.H3<>?R.a)K**?4]>P4>/sRtO9j+["1/+a?EXn7\Vn;OVhNI$F3J,h0nRGSVbWg8`?^YN8u8K;P"Su?PpsuD34Us)_YCP95;F9&b].pcKmZ6TKPKN3:;'C>c>`Q[AjK2"8P4('bK"$;4Nf=LjX/r=X[aIgU7W_=Yb`17L[]%*SOV.u@(?*.=&hH=6Nt<p`]^=SrHaPc4^5CE8^DdJ`IDF-+7Mg>fP5bsE'>3+[eXdtB7n6R/WSR'cI!TrNn\l=#O06(Deo,^rr<2urK"Z,?<c]$'DN[.2q>%`?4C,W8U9=-k[[A<-+ofo\^[C`FUW_D,)qX]`8\M.[u<F4$>rsn^GN,qQLUk&G[*@V]1T-+;Te^FN$S/'\bL&Hq`K72`8`"62ra61bHM=g2)02-H0/mHfj,sT3%/A59@&lMYcESV*L*FddJU?Mb!5Ajce8KpUt)Pam!LsCi'2u$=Pm'PL#T]PRi;R=goW!orIjJOhRdt$QLYKjM\U%IMo5^3rjKRRDqU'-L[;)2ilg<D_d+f[KZAAt57h-P:To#H=r-Wo5-:mA,">kj7Kp3$6#CFH!Z3+]/C3r>&A`2tE'XV'5o9n:0h.9q)@QdKN>*QZ?5+df!'hPS:B#mt*o%5*rr</Q(&9KtEQ2k71/t;pi:>TC;l,i>jX1@,2s%#qWqg4_W>k`)d>]Vm[gHBkRf<9T-g8C^4pFoV@@)=Y,3')3$"<@o=.<$[$r&2d/a]d12@?(aUQf1:[$>i-X__l-0oRhha%7gAUOW@e:AM`jgiXJ3F6f(rJb!I2*I[d.VWSsidt,j)7WFC`qK/KOo[!L-rrC!h`LkRFNkBGR^L</9I8A>#Gc)Un*QAUWSho#jKA3<-!4Ro=1Rr[0pMpK@duRj':[QW?^E%jF-]sph%Q]II36hNsp)f>5k6L98HQDs/&WtOplfn'_HZPCR0QY)&p?S;u1Xkiin+dLWa;F[;p%7;Fj3t1PJbjBM5F9hJPP)pY4h]2%oc48o]TL_C4D,a2EM(UMCa%u%GfQN=j.(;5jiQG@TF7?Yl0XFVIXSaII^hA`I%TYScV4$#PLbf84b#,`+4PBQGr0t7W'0\>f*B$9pZMV4F.]@JrGfs>G"<b9T"TDU^gkhV4+2,$H4Jam0B.&n^S(RsH=oG$PHZ>&_;c@Pn^qjWE'Cf4%mgOA"-!*ek<Amtp#p+f!+^EbJW-0lcN"Q;1!dNmpA0a>f8m^i4Us9.Pge"PcVSXRi/YQGn^k;V\H"pcrAbb9:AONB".mOn3Ae8ooA^\50RWsEiuJAF5)IUql.kiVpZp1FGk<!6*1hXbj6i,doGrE&UEY4/PE6+;F49RdT0q**32OF_*8kitr3;3Nq@A%BVN?)K:E4B'ciS/^?@2D/V(Z_5kP2Z!4klPm0"_Zb!b77@niM/XS:2I@^JK3Kn68$F`^%T'OEtufH,kAQ^Hck3SVL(lqAqrCT^BX$3R.ogGN_MG4od`j4_Oi^:E0cC1#K00h/V^E*2jibj0qdVP".WW_8\Q`;IoMdL/0s(a<s-TH49Q+dY!^(c9M1(5&>RuPE'XuTEcQ9N:u;(I!,2MHN%_#kGM#C4[X5)*:qWC]_/0D"pRZkc?"SYa$,9e14!JMe]A&[T<:2jpZJ4L!;-[!;p"FaXtW'65>7$.:>*aclpqME]fL[>Dnol?5D!F+Go_3pgNNlMl,Tu"3<YinrV5j%[n[D6c`n;e;pKV-A:>USrD+:'kIi&(#@-Gb*iIbkr=3nudEag8niDjgo5s&?%o:d_EXr<Ia#Ot^pWp)D!;23L;Fp-S+&?gm,8fmj39e3b39eafa%r'"rD,_18\)MrqR:P45WqX"-j8UD4T"g8H^t)FkCM+o"U+AEPMa+^%R1STR)_LM6?sqCTKF26F<dZ--_@"%BgEuno_%84q@B`MqW-bNkE(+?qK<+Q*HB([nN[JlrHn/WZ1L$6G3PVk1;gUDMZ3Z[6':L*an>?iF85A!V9=0,r-S?T!$-#=j+53+NoR$5f7J@uO#V$JJ!PENgHGQ:,FgT5i+%gTClY=fA"8TWfK\pS#:#3#!-\MIStqLq)?<^X`Wnl_nEp%#]T20)Y!8'CkGN=qj+R?N*V(n*a4-XP3R0_X8il/"aR?r/p`/i%qG74=iVmoQf_+2!SFE'/-enHX@"4eTLSZU_3TI;jn`k2kj7DPM1&V=pc>k[]p^VWIM?$tYI1LCjUZd+^qN6e5SNkFr_kq\OU\Q!=csZ_2n9qtR"!9i%5DMHhr^#TFl(5Yn;3&;5ca^d_(o59hl.\>le9uD#mX"WqESET`A:=V%^7"g!3Pd6#-U!N?jj/FZ5669;_<8Q<)'([XK>0XK#F\-GHLm.]*o*8u+8pTW8pbZq3TT_#HK1U-c`ngcF+]%)_q,nm\]:\h1"ZIQ%m6!Mn]+Bh!VGOXFBkF5lc+"c8$5qXan>>O-9VU_U&=H$EQS'/E&%DZalBN`a(+<C3;bS($-`H'+S@,D3U>1=mDiU(5.t[nf-e&*:7e":ale\s;fI.=#T<7>fFE/J4Ro"f`b6GZHM/R$+&;btn_E2%!S`c_@JZ":-`?Y)MF53rB09Q4ES$9',Lb51)=?mah0S`6@jf#ilcWBOE&5j\T2*:o?lXYG!+'q5j:$,pM9d7+St(.*Jk$&/]mm\E5H]"QF%d_N*;728h!d&Mq>Dbb0MY,ER3,@Ya)T-q?XZ20DOjSomQ9s"`/_@)W$ePloBm.],G4tC.0m*?O&>5phi>7n4aWKG_8uHc&#&^aq0I+>!-]^_*CbBck2^uH3Tl8[`uKC6H_*GQJ!8"r%g2'IrqC>IN:Hj%@C\?<qKL52nis,<Nq<=]-R7s/WVb>g@K$M85tH'Y7Sd?Yj8s],1&>D9#X,uK%S?-`NuWU2j0gX&KH0J9fD2%4n2_Zk!*'"Jh4O0XU`WD'#:#gAP'W3FHQJ\b@is$WVON=d6.\7)5.u6^,Hp?h:cTE^gBWb07PTjGa'S[UJ.r')e8q3Il8JYB>b?*5dnY>_^uLB;Nh&2M4*graa\W91ofO474aW,-j#m8o'*K@GHCPI,F3#GX59\8O"$Nq[4`gGk4n*HTd#Rb539*.bO8f1mBtIJj+/a-55L1?>HAYrd?npDil.`TG"7HYE$m3Cb5@/YU8o_n\f:Yrg8H/ZPk6E:I!:i.jW'=V(rr>j<^L[<el>Ub#U&P*UI=6AhTEY8(i:6gIfD>Jr>c2M]%qC\a:N?@=P%^S?!ccg6LL-bU!3P.\.HC6ro]u?`rrB5k'EEcqa#sZV"u(>pc@(/KFrZH\f_U[#e++Ld-ii[`H2^1/4E^%MrY[74*.cCbTd9<Of=u=i72,`h)*Hp][q!n_o_hQh1,=<l`rKVXG@S+"J:7Y9!4cA6"F>.@,Hh?L4Z`+/a?5&L80,bHj.Cdb;*YT5PFhSWe76sfrr@l@dZK@K#Ho5(5<SWe4V*"\'EFO<4QN(pF;b(Q3Vr\g_1k&AN]?G$FS*]QO#0^!$]o`3&in#*l>SiaUsf>]4\$K6l[teb3QJ>q.%geH)"mP=p,N5Qe.1=!8DoGu#($:L^&EJ5XV=S5'@_NFT?MgM1-\rV+J(aB51q=Q5DR"U'Mnjpglmc:Fj<clH=VGC(4jK^]mi3[J_Q.270"a^bK`,o*QQ;,Io!u>MJ5;9:T;D?Su;5ucQ$m2-iaBh#9?D9!')'M,EAFDi6F=;gi:A1_jW!H&-(;~>endstream
-endobj
-6 0 obj
-<<
-/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 546 /Length 56520 /SMask 7 0 R 
-  /Subtype /Image /Type /XObject /Width 1271
->>
-stream
-Gb"-VKm+6_*l.;qkck;C'3nbK8<KW895uCW."rkA<$CZp&g4]r#'Y8_JkI3m_,K:JS_9Q-2E!?QZFfp]c96S=YM#InmuH2\>l4F:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz+ES;3]K;@GF7et8j2^R05AF3@gn0#`DLqYo+$Vbc@[e&HI6;lQdG]_%XfKtc8+.PPS)pX%:SD*g%XF36Ap)+i2(L>^>BO(q>.a?'7b[[](S3[ToCq_QgToelb%2B2j]j'no*a_&4.,WtikC\WY.hO$q%8)u*\qER=7&mh[7P,d-E6B6.=M)(r;-#fb^J.SjqA"T8h8ocPLg,G-b^\6[U&dLiehO-2RuQ:j?@umba>tOqr[55hu?dU)'5#GW+p%`Qq_]B`jG_#\^Dbg]ZlebbuuFEX;AQeb7+]_%fimoDi38W9m5&hjJj57@B-Trl`ZYhHM'RPk`6l-kbb5IES"sM#h(<1R]9D(f8I@brlO=QnC#*$k>"6`s,Mi^]NKS%ag6A+($*,Fgc3kec:(-%r,jh(bNEs&c(D\Y7_P`-.^j-EZpU6A%V6C]6.(UNMC>QXMsdWh.GM>gF?5mW7_Z3?ma!f\p_Z)5UXRm$!07;)p).bflUk)&DH./bg-OE"/%OV.isT.,@)!,Jb8TBcSh_AJ/ss9._49]O)%UcNr3G(nS-P6RTB)==:S,5ed614,]kTDLr`:Vu'c'q(/5lD(po"&Y9(b[QF4f`)"/4ZMTkfpO:;5)N/'e+^eOj.i^WlJdEoa?nB)VU;LoQYW@[/;79s;R2NpRXtHhUn/?O["D\9.^A=Igl-[k_GbIaBWA4n!K4m4`(tCA25iZHAD0KK-p8'c3DnCPY&rqN7ZfV<_s$l2Gi)r9]#e3>Xu!Gggp9kFk!#EujOu%UT,2Agf6JFW7s:G+_A40diL:1(`6\O4l#<hq[[b.VQLD(L;$N$Ot[j^9$YR-iUD`SYuX;Z^f<#!0f0Rn/A?[1AO5bTKu9&SNNg.CTW;?*E"b=X\.RaD;->LIdJ0W*noH0cLN@(rPP<O=$@]5o%u;KaL+It5DS?aUdVt7Km1E!@1fD54`iaF5d4G"r1a%^o=;e3?\%\hDr7Xb.nZ.GKmNDoVS2FcY24uL)5@6Ui,%:uh1iF5^(Y\YRTfLW^!e8cNDG)8Dtb7S0p/Ua&'#<<pj(#*LC.=@"E.'g6*Ac!CL>lAg9sT$3tb$\rIe%l>QYE"hBc1RbtWYtoGnTmZq3hKV=DALGGC)2*;08Vq6Qd.g^8R>e>$6:ocn99:$@_Wf/[,A1F[P?lW8.s2N(Y*]9Wp+Nf`-hS2pPhd;i:p"M(J`L/jT%0pDIZO;a#qKZ?9&;!<#pJ`(TgJ$s`ceU,]#:Ru._pr^6t>L]pq@VsX7+]iK<k4-ch]lAOhrc%ph-YD<LX1KL4+#K\D$i-gl6T=8cZDCKhPr]oYh.ii\>U9sBU11l2h4_0<,@'*[i;-H?S^'D1Hku^,8<-fqRhS]8c#$&3.AsKokT^!iXSp,/r'P;VGhr>?:S6ji"V=MkRo8+$\':BifF[*nX$A5'k@=j+Y)aYhIG8PJHAtGjO_R;gb-e]6rIWLPXqD"\;)*?E=(>;db:E`"9V8uR:g:neF.;^K%]?WTd%3FHh7T/Q#D^`nS'Qsu!!;$GdU#6UKk=oQ)gtfMOTrB"h4)33Jp2Y(#hQ5ZqmuAsV[Hd1&EKQp4aNnCHT10ZfoHu#2Ud02k.WDd]'+SsFgff"'c6oL4YqECd7TVtZZW=PR!<;&baZ"1j$71d2)9El.]9T]!9I*Z$+P2gTMa`/>A!"5a14"(X.">)ClVnje"K1h042Hn[^R78=uQc>2gS(f@)/%%#]`eI52WLs*9>EBQ$NXVPCm-=(S1Hc2J/cB$biU/-p>2?]/8t@hXB26ntuQW9tkhdmi0lMf4bdpESW,3*:[Zal:53rRd5(`!C2i5kO+[LQ.ceQ.<4e>&aOkN&M1!Sh7ruqCY)P3-tU#*XEBGSQNchA#N14i'G9E#@\ZDo2`t>*0(PCYfa!,ToI7e8/'jcoa7Clp]M=gffl>p=.nql:%ICRPs!(]5BhM-j\5c2@.]Wne/7[BJJ=uH-dApm5VIPu/[7N=WmbQ;4#2;J>#7om?K*Z0;)*;TW?!!/)7;!is>ZC'N\bgK@*o87'Y&1Y<c9;ee@M^'XhNi:Y&TZda<gakmp$0(]j5o_>Er-)TO=Rq`l"R92;4<)AWUeTGRsF**+=KWM$gY@)h_S>/mOhuu,&#IODTepC8i?bKSf&>e]QELMFe%chNSA0(dm^HD#]`eI4ZdTJ]j]&N17G[G-nGdt*Q%p4>WVn\AfXV)R*PlADM+<<\+35:8afuZ'BDn*]h*Q0DU7b8ntuQ%W<N?;+$P&dOd'^R\`u\883d-]Z`*)_drjSAI2d\4o_%\sCZX@*0W<a(IaV->3*-Ph&OA$!eO@&XlFIpj^RmZ!\'l3"K%9?VCNNm)mQ91!Z('"_7M,=TQ5m#Tm-&jL>7\n1k\A\/4FQdo;],f?J#l>Y@%^qH<ZK`bbN+(uZAN_`gcAF&fXBkg1R;=F)]g5Jgt3M'b"n>;]p:`['ic#8/h/!I*jBJF3V?U[dN^f;kmT35NNR!eKEq6Y3h:[A=CppDp=u&n4G`)(BS2$oQS1N#Chi-C:^=Pr`D;3t>-34GEam6!#;Zhi#'j^i&OVLnroeh[-b$?L)EV]oPK0ksWWmJ3pN[7?4nD3N7TH#bA7pRr4BZjr\F!+@<*]X;.$+3?nWUV`8VO4H.oS6=f8[r.TC#n'JPbjJZqb5p9**Z:1b.(Z\nl[6JiLjM>hn2jZ1Xuka.-+m5E=X\Cp!fS(o>o/l26`!C!MX]d@=k@2<eFN[pdLN?ZnYSH9nP]Q_'5$k,KgM\@/InjnjFq_NVqF"M#r,a,ckBEUM0$MQ`VX`B?XkQ+Y;@MU\GI6KUIUKZdUY^e]IXG!O5>=1^cB`cY?GT.tJ)=HE`to$'\8"nh,fgfoYlnrpZkSN8<NqsH]EZb`pT"ooA/4ouN!EDZ]#Kk<fdo&H]eGjO4RHa<(,\QFMS-]["!iGHinOeoo7GFdA"rla?'RP^%7E2+W`E`"Q66Z:HMCE5Ji<Ee3B.D0ZUbiq3]4al^&Aq<dbHcPM[;N+XgWnSY.nq=,*g%cpX@pYZEUd;.e@dJsBC<n8U&JiJ"'EB;Oa#E6XFQO@ZGKN1G)KhcDs0/38>htPmIA\JhYgr=0;+(X>da$#H0;lf;=&Z!b8MuTmE(]"@#Eo_[6C3`T592t7J)Oai-B6b8G1=P%UGn/SZYA:"Hadq-StGc.l.c<5l-b85d0l"1Sfh<\@lB20DXP_3ldoCHB[W*mO9gC[pTNI1^Dj[tdb)eX`b_Xt%3;f&Q$"_\KTNO<+4Y-DUN(,UWrbH76sYr/F^-+oN1q2h[k-sPKb]?P:S5:+^#Gc24uR'oV[@@5.C^@8a9DTmkh>$$3k#N!eO5K,*On4_W[(]U&E6Fg!1uJ'`1.*`E6k"g(.YuDI[)[2dalq/1FJ5JGlRb-A#4Nks5h7C=62B/otk4h?+5h1<Z\3pU.'Z[W"kM(CdsKo*MfQBGo%nG0+_U,mCa\lK3U'I8cYm$E?dCH8<>@]5%RlsiY30UXC\,NHqaEW>L^M7CK=cq\c(+<K6OM+c+SE$\bP?ICX9u7M#V,6cJ.Yd?VZD@0mD3?mt\#\f7%][WLm@b4:<^)[1A(1alSM$74MUr"&9u[Kph-i!J6pV)trKX*kXeABB_PG2^N?K!(+uSJp2(d-G(b_*Q,.,Ye3C;C.<k6L_2@Xm=q3^IM!>mhB,h*GLP<(6]>c[Xd!GDf^8<l?e#bL!^T<1g']U$^2PMH4F1,^Uj5;r#.Z%-Wan:0!/.A9-QY++-g*PE`E?pO?c`VeJK<';&npq7G(nC03s]kX@&&BYhLD6hDP<5s'WOcu,b8,,#BJlalC&b$!?U;O53_Fj"b>O,IU6T]SX3RX_%7jrAWkmk7*#IqgU9l"c>l_"XX\1B5XgbR/@\TN<d[*X>dm-:\cBEVe?g=,BtqIg7?HilrDkNj<t0[0B#2.Y!ON,4BI0#>T@.V!&aVt'+:)ug!'W$*HQ6'6.`?pD!2r4V%JQ;H@B2NSfC>dnoTHN4e?[TqNr@rcM'+_W]mp&h:3QW5o1uf3^9M\6<KW:^\TdAZMe>gm4.S5g/GJDpS(F9>4TAshesk[;fY%4;QAsMBSU#>;g@L(1$B'd*3h=)`nEt-jG#nUM/%LEjF#L+B=0edi;^WXA](,^gUK:Hk96\Im<P%V$JK3_d(;.i%STk$IDW\\"okU^HhVeB!Nui>FhO0Rms7T0Ldhr8gRuA2m[cBOb!aZP''&c;34R2PlN+)q#HAMq"A\gIUC+=W,?@1,+$eV"S04G\;*BS<%f3^0?Wu(.bj$##gBo@Y94jk^:fp!%r6F=OV5B#3T4HXn0Kp?E8jidB?5#`58M2(,Mgc)DD5A:)ZQdRfs)IeLF;:j,Dk=QH,\h&^,hm;qJ?h4ee)nkL*Dpk,_9_b?*)%.'XWu2N+1ql>t-,TqjR6,K9ZDH_PX5<$?/.Klg8lbU`B@ViX;WIL9II_^9Na#(p-g1H>pQoSUJ"<ikqNUBAU^un.1aW1]7pN[ko'B_,%i_g_A&fml2^XWh_8u+Xn_LdRN>f)$pGr+oDSIJm@,H8aWKP6"pep9L7cSndM_QG8BV1:MGpienO=T`37h=JjNK#A#\+]3qU@";h[Ha*iUIqM'_jL-<Q[ID7jjZk+`S#D(_@rj=%KP(AGCf\eWFsOgnf?RK5F4@]E:PQX/3cs[RiTj=BN5U0Y$UGG>kt*h<;jgVNLIh%8bF"@M?\,>>@jdC;UJYh5'1Z7Z@\E`;clGkT$%lsSe`n^_e%4d6qj>3fV")P,1g`Q)cf1LhsNR;J"=(,"8]28-W8u:nVsr)D7K4ZVl#uhY,%3[*c]_j'^(b$P)>cf,)dSJhNXe9f>A1bl`([975,J5,YlB_Th<l$7#<^1iLbnnh"!qHil`p#'6<6b_ktZl`2ToEl9l8QN/p//i`j&gi$tG[e]Z8Src,12[k$aBp3B_;c!$7-:HnCugMbs`M(<oE%i`H0C7p_/2if%BEoWGpf1Nf)nMAnT[eWDc\l&,>`G3%H`'mb.6-PdV9:qKOF37G?Bcuh4SN8?b?^p7_KN!8/aIq(pbA$5J=]G#JF+<o-krV=5C[A&57K0Sub+)g^+$4kr`/F^^+HRZS0:orGq+\GYEQe?Z>/_*AN1Y8SrU[lB6*=O.9?nGh40;&g;!,6D-CML[V'jemp=QC@#YG^q;"VW"B(b)H.3\P@JKf$hE38-'SMbh^JZg*H015[ak4VPnn![u691tIDS!]!.pKl.9\YjGr'!\QbfmNN7[J\LKN"u,'71L?NB()mChDprk"9m=k<j_FIR;('@LX]\*r\_Y2%Ni-^HKfkM_E>Z$q"L6MU+`)shY!0SJ$Mf''%'O$0=9h@'2/7q,n&J-9i=mEa`m2I]*qcC\7jf">b^Ub4F?qPY;:?[e*OQsH_n)f_7]`1-Z&1s@<(Q':$Y0?`hM$k-N>f=^I[4b/L-+)MBMPS+2:u6<ODbnD3=TNgU0]EWK:l[rA#iQOj@[PFA:"N@qla/&6)KqY"/4C\_5)NbD)4m4XN#j`fAd:oM:?"&EN,AZ0[(F)O(2G[FE*gG5LE[&]<52<3`Rgmo?EqQ18^kK"1jFD/"4\\E(H^/:Zrk!\"GR$l"!-[[S"]mF=kUC?esT7fMPS3`4mh<YR?2DjK6q62Y_\((&<YR58+DiIeubdrs;?7]Mf&`TerG0,:'"T%gG0i9f3-fo\XG:!%-a-][#La&20&]g[Dk.fE@[:-TZph.fqh>Om@)]gho+Ed)?3op$.$)1BH8<!AC_e!:<FOiRC&9=G@GY8Fe5d[-PHJ%3/Z;=FOWRW>:\8D.Zn.*m2k.ANE"IKk2tpaLO:;>#Hp1,"FRXr?D\np-(cI%*)kQH?NA!$UFJS"a4PQ5P%M8ZJX+V>N,t\:KM[="dL(gkC4uP2j1F^.7>qa4%J%0[Gnh`*e\=[?;Y6(b3K[3_ClmG^ih:ir)&RT?bp-SXCqe\!V4.R##7[)oR!eg&)FM8u$ga%iaro/MJKsC*L`Aq&SORN/\^cZ#m?NhT$'.\OAq/-]R"m\A,>tPLCiNlBZmuV3eG0=(=4u_Rj6NFJejZcPIM%RF5GE,0@l2\,(uSock,/R<ItUH_4$IC6[V_8!!;+`ug\3B)i2KDr26<)mWNCX<H<"1qBDc@NKD`+NW*V=HL/7gZZnrPNSA)0=<K.]V!:&q>J[JVD$2);,=?Vk3Z$o<QopLXt[>8T;DO[p<m&;]bR-L-d1Ek^"mG4DS52dA!tMtYcF9Vf+3pJ^\4['2Z2WcOIHr.;X)0O'':,=Ec9i_+\t)*kY4COYi=N`mt\#lp$.1g)R_0;[I@_-+J7uOp`&;V4b#PBbU,Q$T/EHK`@m&HS6tiLa(Dp`K&<ADSeo.Q9["Y/%ki-)NOk?h/Fq[C:B,X=#XPV"rWKblg%f!'Q#'0m6\Nl))`5@k2,:7]ElF*lU.'Zbd.68&qrX2abD'dNbGZJXg9"#JT>sZ%4^VL_e!D!<\sE1ISE,jYSA*12Wfn;.EYj%Sh!q-uWPa*8oq47b'fg(QX^7iJ8L;&A)7\G4:"$/509"F/6#N+O(O0Rf4`&du8L]8Q=&#gVS.Fhm1-b60-T@Yi/<U2;5t'NPZ=)MiV]H2]Q'>EZ@C7?Y+0l'N&`i4g/BF)$^+Z<?5F!$rf!N]W"oN8R.aM!lB(Rr_(ZYqPIbZ:L=AMGG]7BKbmP_+fZCe&_d!%*6Qb_Jd1As5slsFqZF_1S.rgrj-"'65Hf_o;2aGlL/PT)PrUWY_(g&!,LjITUr2V+-OOg2$CjfqKd[S=JbmC@fE,fhR`o!J!GUmlo",dH[POfnNrXV*:ldh%%;<r24=o$m8>oqJN,jqIkgM/Z\+82tmH#qSAm+BL2u6*<32`q@q18:=L\VHOaAK@6qZESP04WnPlDpY^TB]k=#5j%^V]GWp%8SGPGC:!8iZRe%(6kFm(4BR'n8A)kI^%9_`LMc6I]nXJr\KnUl?6=h^h9o_HK3:XAR*cuR9CCbI3S9e:Eg@s1i6!J)+=TZ0ELW*&]^=HM\"M&+?Hbi!jc94Cg[?J[h6YWBNe#77kk5H>rSf"gC+=*I?rMX;n,b'RT"ahe;[*,SK?9Q^Y4t(OL[t5q0\U#,!EpGQ@Olq)FZW+Ol*F8lHVGst"6*B]O[kte7O\"4bh_:mK_Nsjrob>b/142oJj28`h%:5e<c*dCqW$k4REjm[#rqGRo$Z\=N=PQFg6EEECjT`89d,>EsEjG:@[*npX_t54fE>lG\Dg`8ZQ8X*0mJn,$-h:*;Ie6M2dKL1c?G.s05#b[Bb1`gX_31&.,F<bK(CMYs'7sK&oEMjt)Dc`.WCeg8G;H=/biMJnrNBsoJm>/PoC)J[>^GN]bM1(]RV(9UB%6S@Fd10u(+i>4\ZprLlr'DtSp,gqS.ap2G?Ocl]:u7fUH`m7+NX6J-6(gXVjnl2mT<Q9Y/(3@](Cu;pG]XqV3>8@1i<qMqW(#Wogt826]#aaAFWH>Ir:I[S(EXY70e?.(*@UlH>U85Y(<"*#ZogNrEh;l2C$;nb>=;da92`l8V[aYj*t'5h333W`f$;YFDmQ$]QKBEj(uCPkJIOYNMT?-FWJ.aMhDnW7^g>X4*#ts49%-&SfRC`4O1^DbRF]c5,YI<g<_T[3@XZt'9SF?a)su.3q(gOa$>%cjJkX#4KA5u"(f364;RncUK7YK?N:?OSlo-paVWsig9jRgJ./#hlmD2Wp29Am2,Bk.Sot7W&`i4gX=%(5ZoqKed[leTVJTQ8*S,"3OK3K4NK?1[Fe"$2+]b_Tk\&:r%&q(Hn,0AokXS!=Sq!#PUV)#A0'Bid9@RU=+,f+T*TZLgMFrM+pJbpBTX$&a[I5#uX*!0tbJrh2+BPgn^"/Ip*@[#YG8^:7!?c@V%"aZ@[G]sZhYXbApKRN5mk/=t`>.VRMJIl6(kN)\Y$T,">c!j*B9/52de8/l=fZmiL%N>s[3%_<dV&.G/UeI0(sjWt=&5HYcQe55l9.t`nr*L+;HD*N.5)PKioF%7H<A,UUB^I)ngDMD(Uu04-[3CsIK%ehq%[5PHtjtENK$&<X>3!RjEd@]pUF)\36tT7o]B<H<F^9h]^eE;`1/OZ6N]Rr]6*#R\%PjBqVVaLjAPAh5CW5OesHeZ"M&jSd?CU[HTj7arTrm7Zat#&FapFFL*3t0n9oAKWroo..2'd*6+oo2bC>!<jpUjn],Habl^N!%`tC"2Gg\kK$;4qu_5_1L:;`GO>uHFe=Z^*f]'kEWrI3D1DV`e-8V)E_(c$'1a=[+'>uTX/ph6<arU7icE,LRVpVOJ]AcKId5IH^LUc)6ghEacaCI`R3\7F6R2*VLR-RsMbTJatt-7VeVF]H&L&_BY51N1hc]dJY?BEu*6<dTGRZHk;VX7C2?VsA^(<T=$0^1qE4NG@'Rn_c^6jf@O!iTp@6a_30l3Qg6DS3`h<Xt0P-iSh%#]T[Ei2A\XB&P_.`G4&+CCPjNH8]1Enkh7o]^qOW_CE<BuaOSJH+BN;VeZPj[aAoQk7pTW6'Y+Z2BoMK!?.Ea.Xt7ec[aRL&C.?p&cfYas+c2NIqJ#EbF/cXheT8\.rDjh#BB546C)6j@e/_aP?8(o`@d^Q]HZn9FFiNhbdU#JE6Knc#jjHR9)RO<JOR"B!(3-F[np>DdCqOZ`3gK!(8[J2As#>8"eC&2Ph\I4mHr!^aPNMC!LJT2MZ2RI:rbOl^labTBP;]2A+P6+pqFY[)5!a)*rg:1PV.\m'jlf;iI.c3U_hYBh?ZJ%P42:F^^OQ:@fi&Ctrd!_nY%]2c)P*_-Z"W4fFiJlD!!m8pVU"MZ*u=ct5Wj3Q%FbqmP=duWX',%IV($&IX`Be_+BL30HZGBZ[U+2pf<2**#HaR[@EXml>6b[DeZEUj"*NLkIn-I[*qSTh'H%dG"Kh(5ok%q,XulK?+rt@,C1St!qpkE+]j,Jd*EFiYp<=DbMRGM7PkUj_WM(%I;7ue(FJ76b+8ts&R>!<%Xg7Wa;e"P(E-Wlakp;0ZF1Y_<d2Fm!]:2`l[jE[4E[r#smJ\\P7>a0/RJE9NlX!l3XL\U(qL7).JqA1](Kj/<$g-i[dicZ,SnD>=;?&ftrcdO.g68#7jD:Z8X*7ZL`M:%n;XnT"o'],I:Hkj'SHF1f6-krt1Lf@rc1a&ea]g]0n(;W:VsO7McAT&Fq^mfJ!e?s6l'$@d.1`hA%go41fj;![PgU?]m%LTQ?kTU0k_2NlE[sRjHqs/TaOSK6+LekI+Y7ZPn9%qn>k:@V,s?POC>J/*_hP8c1`cPIBgmC7[nKg5=&sq%0%*XHmOuu?EDp@Eh$,T;6dATTSpFLE:L#5:5X,Z]l]^^nbOn!l9oJ-?0%EqVaue^uiK?_6qQ9BM4d>!Ls')!$<P0HWNplhJ1if<_-el:@F^H8'"h>qV*nQ?ah)9QFa:3VPa:p#+\/a(1>["o)b*&RL,3g77B%+6&='R5Q-b!I?$j2o;l!I%Rr&X8(eGGJHh_+$D1F((\qlhou?(Gt,r)dD#U?dQSPYUngA&U[O+6X^=*q;[i..P.MAUUJ>gq<\F,;sJM-Kh1VCZtX=CK.Jd2!%,^E*K\CgqPekpD_'T;C\R;ahY*[Xa%82Drj&JT3f^K<'Gh?[sq3)KDR<mc@qJMgrc*EH$aE(*O!j^;N<-d`GE^U8MQ@JSin[1IWC^2D>3G3PIWm\LM%:]lK)Z?X)o'c)Ruf[l%D5g1VQr:Ab)b[8Un<)j;Nq':Y9Ela>V8aPstXu`2-t^@"`p/`Gm8bQ#$Bc]t/+,`a0I;E6LRcP^G%P&2@3Bg!&\BQ.&4Sg!ZT`_UGFZ<m*EPaHc3G,0gg45I`r45ju?^<:j%Z4_3JCWDc%Xg6GpV7pP]\@@+>Imd45("u9GPV*V8oH/?45>bkR_b"29q]bLK<maflfFhN,T^N[0FrnW/]^K++hRr;QTI9B]+q4=.d%GbXP-dOa-denC:YVc07Z)^?im=$^"%j:B7r$G]3WhrPFG3D2Ods5qrL^O1Y4gS:l`8Vq*--%^+[8__[8\Nc.c_.'$h:%[fSe'q-[]HsM$IQdqZgq!YBg1@V5OYm6?hPV`e]U4>X'St4I.3%4M\;blXi@>$1OkT41;-C8je1GAVA_(mD*b=<!8#W5@;`9?bB+an\XW9=]V^[//.qiobcdgjY4hY<X!Z*NFZ5\alYE@82k1aMm<#<SGKZ=<7>DZY<B>H#c37\e#Iu.H=d(5?Nnij]L32nAr?m%C@mTPW7X'LtpHtd0dXRPe\QX+@QDXEA)#W3)Z]74sn/>S6NREUZ:%rc"lhbu"e.ge"\'da7I%)-8Ee>g[#8"r\8gB&Ne?SVnfZ<)QGn\`&U5phR0D+\G]XhkAYIj\)QLj'PM-I>:[]LJi.p<i]&)VH>o'G<&/1;7rAnU6*5%e5$WMLl<ht.H<$[`)fH5Z.mFa5Y?Q-4=:m],]sMNV"31(`W[,O7Bf#5Y6.[KX4YaC4C>HKN/&57X_-F\uA8\D!(h*$tH^I'js_Z$r:=YA6"1Tru,oi`#ISo@C/a3bYqlgM's/VoGI&h=[lmD8JKIihrju\_<"UO5I_P:[_cK8fhS>hl6?h<kJQY4NQp<2-!]]ME`07J#+TL5(<.<JJX1&mlPYoS86,Hn^#W6$Wlj\qFE3)Yk[84oqV!3eNKNF5]Diu"'&:=FEJPB9V/cegmPJ"L^6.T%^NZfrlK)bpU+k);IY%YLIX+d==N6fg6$g\A0`OmnpMraQ$0nWXgKl.2q4iD<T8-hNCEGO'BFJ3joi5Lg<Us3rc?``7>@tE?cqT"e,"FYhgNOIOmNQtf<;ce[sH"80Dsk'h?2#cL@WK62H>2?n+bjodb#i45u"g@qB?*RXkpctMUl@9b,8e@DGEKBUKG(;Xs(lG:u9234/1a]Vk6,_ie)C=74IDYYu/Z$GAiD.)sPIe?R@p_kSk@HOfBD^:)UgcV.Wi11;*Y&hCMS\+</s/`t$hG<MOaD"G!.$:^V5C2i$B`9)PU#]*u-UJqB;DZY1f4T!>n+kG=2,]-UMOOA`d]fO7/!`[j/se%=5$:KcKQ;?c&bdDQqYBMEJb];kPim`D$5:]@[s)SAe+X-^(6=)Na%oa^.8?E-c<AYhTJMZ3LK2f<X`l1^(e3(CIn4+l=T"n11/R8#,3lo3bKoH!(XB+n;4@qik'pX"2M6O.W?"RI=L>^'1TE@U":m&^!p,M-[8`6l`Bg<4GsX$eA*f:+\L=.,7f@*F8HfJ:!L59HqBOIQ"(D9J6VHf88m%CK+%[j#?@E;b5M`8GTY!5W,PJ)<BiI0-I`I56g&]^'YtSTjW%PK867%/t-ee!@tj@b%Hr/QA0]@\=$)XfR6TCXe@/ga.+.Uog@WA]ebL61+%'7tV#K.Pn_;*a\L"(=raVY5U>HW3fJN*r'+3'p\0+=^J':N5Ln5)<;-GIbpp1@9G`Eo!k!'7rKZY<UV97dL#sB!e($dEjr[Ccn[otpI5WKJ&BOJQgY@don*IM.e,)*`c:td<u.EskJnlOVJggb0H>(j+R@HEhsGE#<b6p=:$]!Jq$8T7H.O3Xfd\^@:WI!kNP:b1c.7%9[V1dgK*hm$V1[ROG@Qd3pKMp?j<f*=%ZXBN-e#0$i8*@EGN5HZ:E7!GA*9\2_IKul3N"U^X;B]u9p,eD(<ei_*h\8^h$>_qg%hC4X=sIQ6HPFW+Lej=#]fSC\\hB.])&CIkG8B7gkfN")`sS761.$W#O)2&aW'Y]fN>T%U=h>G=8L1a_rXC&4J^j$EUW*r34F*mAU;5sOnS.SD5>`4,GI_gZ%Ff\\9[\!8lri/(^kALiS!\Wqn#slO'edP0G\ZO=fU@5-?\k3'&RBk=JdPejNa4&;qKb@q#sa9?\ePDFD8@2gids4fi<4Sa@iU*R5l+A)_h=h<"S+?lNo)25>E-3jbY_p<-jR(OZ9h%;EhVjo"a+`V+IR$bhYL'gucET=*<bjg9Pj!m=m>><qX`_POH'p`MmH;=M<o:oqIq`9^)'?d_:-1N#fH+Zu(ud:2X6bmE4O'77A<Aa@=^Ym:+q\MPpsrmjiHt.rOkijHc_RJm;U%Q)\WuWltC-fmE#`]AT?Bf!"fN2SAa_bsAN%:%pL36)YcgFR?_?j-PZ[VeL4#B9%NQeuP./eYo6iV<DiEYL$W\RN+D:mgJC@f:JB`_BRNG%p&V$0\V`Vc;I-cH.0s+^@[qU%`*22iQe!\l<5O[6rbh[<R.b-SNL*m\Sk^kmJu7-)`3GcQXe-X:N,,)[JMFBD`oY3pM=SFjVh2cePJPn>I*)El)^u<0IFbc>GqmM57J/9R:r'QH2QsQmC\)KZO^X0pnWNIh!*CLkDpZ"^;t`oZ)i0cMQIi$[q_E!D+/,A30>>m\2FV5FZ+T`S&X@#BA1qqq[H78leBV@ME3X!\Z.`@@a#,\I@qK[ek0:iej+5nVf\29rT_Ss]u?gjP;k#H>BW;>V.h9J+RM6Af%rnDQT@i^WJq(lipSt;?i84<4^Ug.E;sM0-?05NF-ZT!##gA)Mck-Y4"K4\9NIg$"hEK*s8(:$](Mh`$`Du/.bb/%SRd*]n4HEC\5i.TOpF'4lKt^1F+M\:nSi&^S?&59g9]tJldq_0rp?E?djI4qJ_Y0.9@MA0NnW^fY+2SA:CVp2in>Nre_0j>0uUH(b+IeO=7u;V)X\oY^F/d$Xh=K>A+UOUb(M?M^3n_W%=5e"7E`WYDi/WO@K()F_h1*D\u$fMf_Y>oK6)Lp4_Nmu'@XU$p\m@#s&\S(=.1F:ajp+aRd[u1[6-DW"hE&\nS&3*MH=PuGEH51WC/&RWFh^"+bS@I83?k@6(p^b<i]CiY1L[9=*<A*h5AVDrDuH?4?@hDa]HaR?Zn+!qf&/k/+d)fmel_EP@;U0!$Esq*9<D\l:kG,r]]]?D+&!_X*F<kP/K/`BessTi6iV%.SoOF%<<Q%oWRWK$$,2BjD$j;N2\m4.'oqWZ]i[K\`/\I"Ab+0N;A":h?&/Z2Q>,$<(&,D)TQUljp:dPkPVtcDuPM$=_"6HdF<:UI$=Q!SpFaOdt]H#cBGAZSL:6_q7M/6=.YDGpK-iU8ro[9C=S7ADW%PYKh&K;PanL#:UW$X\Pgt0>e/]Rqb$1"*iWA)(+$Y\nCPh4$-"7mTh'*`lZ8gB3+*I?C;WiD)]R6QDg-K)ho]`gkW1Le1<@.Oj$f>JGaP)VO;\j`3>CPs^MJ'o^3b8d5D*5>N=`chY5H>7nRbh<A\EFD&+(K`q^*Nq+E(FjalY\U5\Q-aX6b8&\Mm/k[ZsV6Dn;b_H3cuBRIk&[jF>Yi)`/>c=HM:9C&G<8Y:KWrUZTnUVqgn:rta^fAo\6Z)`?ike]DeYICGJ#6WFM7AU7EY\)kKSIFU/mQ'h=DXXV!dJ,j+>aAo[mWtuhhah1pN;!!oM?:7'.jm/`IhTDjj>Tk!G5($2Z[!@8;`f/EA&0L`4a))=Kr62-qea".;VK(esf3^WjnJ^V70c&iQ?6Ln-A)<,lGsc4M-ZF#.\Z]=fB\tF2H[$`!4!opC<:SQMO`h)\>&WsY]\R^J_Ya0#]=14G^J+@9&(0&Uo&%3#n\@dJH?+B,>->>P[IRX>I<t.)*E6ooh>^F`@oc%1[2[,E+1(3NAr_`$YF7b[4HmkV1Z,D-UrK,EXcr>Igd*Qf&:or(:QR+*Ms'W8@,?@1Mh7V2G1G]co)-5]d<ZDTI+LWar5f\:612FVJd.2D/^I=)d5]Ca4BBPYT.O\CB?hb"]Wi:]EnC0&ZuS_]+63cMB's['RFWke\8ftWV-C'D$hM6Ga#[6<p27\a+*gOMVPVoppXu%u/JCLE\_^BoE[uK$@k>\A?eJ'Y_j"Lm4"J'_gEb+%jDTNc)5j2ig?mC8WEEYAeI6I-2]VuJM>W,fMncHS7:a=l&9:IT;opuc+,6tGqmOF".pe6%]79f>ABJl!:^qFQ$Jp31F,L0t6@/C7X;=?YeA_:8aRpgX7@KBag@0(kp>fgj19p2<X%&1to([k&[<0>]no:!CQ2GVj,LbDmN*UO)HdjTj%G.R$IIi3]/]FnuH<RA#^4ilp0Y,Mt5$H8M@mTOQR="SWXTA0:$<jo1.f#[b8?1USlC"?:4"iaA^u&I(K%qJCmX^1R@W1MGB`JDSVVJ/8KpOlD>&mEHqZ]>=1n$+AZRHK([EoA'Kq:Go)%1JS[RbZ@kga=$<pcLUbALVAI,6-ngg!oCF&R#6$$%m=g&E2hZZiLMp?U=1iJ+euI$:_<'[#RT,DYU>*`mOTr0*TBFAI#iZm>3,6=#uop.6,0EYn[skd)j"O9bMeb0/k3R7#6R4D?4.e7]FgQ\A>b%'-*gmJoDV#m)lmLF]i+b^70r>TdRFof>j)F.9R2\9.7TnGsI-K!HeAV:Vn8a=!Z1&T5"<%WY!7@&0*a$hNT@H_,/\l]P4rio,Mj)iMs03d0RjnMfaW3C0gf,+B5+-?qGmeM1OD<rM4p>7u:4hh)/S%$Y4\4IKBNo4K-aRP5dbalVB1e2-R-dQ#aK+P1@#hWOjK<uG0m:+Es#%r+k20&?&-N"<q2;F.JV",04+gUYcGZ[N&X!Q`26-i`d5N2g)HHJb<qch-:m1(PH@G*=#prXDWoH#eURO?6`OFBX0b8<[9@lr1X=c3lEU/&,u3c@&[*^LOssES93^57DWW&`d[XZCaFcr6'n3\T&9'F2m</a$u:JMtZW8#BY?SoMr"s,o.3-e!Fo#hr4bp2Uss`P554rjg&@S.=6YO[;2,$%3N0i\p'!(6_cps9bGM\RS'*NpJ+XEKA?J)6=IBEp[79Xr<`N+OJrmD,*Z;eLiX*nc#UC7#\]8?(:J"FU:dE`n];NG6#M(WN_NMG4jA+&4DTfhWTRMDoPX-`g%2RdQW/GE9ouE\aStnoH@'&?NSL29UkAO>2RYhtpt2jh@_LYTCYDNnH-af`gS/ggO>kc9F9SAS''.3<>^STuk?[XJgD5LS8t>e)JkQ8,XAV?e@ec%m6%7@olf%`7CJFU2!!FX,<Y#c!q*j[A\N^o*>jD!,:3M*`G".cpdW4c0C63f+5`Ru#fKc!`jN.#hS^C;Oi_uUBXS:o)"M#G/Cs$^.6%"_U.RV6dU/p?O$VrmWQ\+>t]C-Rb_>umHmIpD.F0fKBXMH16^s_:"T;C:YV&b]7($*MD^3lQeo\@4_X(k18bLOLt9rUK+c8BPm<6ZP0o(Xd@`odJ&E^*-n9\_*6LLGs'8@!,i4I<DWqu493:)=KC5s=#qDGEKQp5;Z6_c9IE:^qI:?G$_c(2r,_Q()aQ7r>Un_^CL00[TLZnu`;jn"5':WsNf((>5c3=89AU'&Csa*s^?R0^Zntg:op;Z+Cn=nQ5-L4aZBpccr;VU>A]s5a&eQQ+K`@Ca%kUOK5m@[idEnAD]Qgea!o>]C(4oW\*Cm-2Ce\pJji5J,05<WYsms0mCCkf<'Ufk06d]'j*^*#W^H>\agu??Gi-4qm&?iiuS9dSU>e1E(&/&=Ets_Tc2u!6bd[qiagulJG@V1@1i&k::@jDShPJcI!]ktr2j7&LZ"#ap\d*56*A3Oq]Fl7Y88I&R&d,@[nG?4Jb1T'hL5'.ZJOk=N&fimjsQ2DXRC<X]n)S2G4T)4&'UWMg[R+1l43@1gGcP.KG)d#Y!S@33T8KWTkisb>H<*HHfNEdQhQg](Qkkj<37:pgPXI,X-%a(qtJ?;pt)3HJ)9;^<?q)(e"gj[D]f3+OBK9MRJ?@B-?1uI5Bj]3#RH-<n,)fb@9nOj/_#DXd6]O1_9+F%7#Yqd<ql%12t#0CX0(,%jlbl49#q6'Y/VZTfTU[]bbJq$c_kbC>WDmY;fg]jl[&/0^L>?W>LMeIH=!>Ght'87F'.TG8_Vs7rRLJRhAI5=?3Oo%>Q0]\psH-qQkR0/mF=>4])$?+l8qe&DYfYPW)>paEfTPEPGPtBdT]lK<AS^-_7B0gnW`69--N[s#Y$`=kUjN`rDtEYm_>hc2[FONLTbc%1J1eu^4gNfHh?ejQZlW9hE$nU,YO=rgQU0Zh:%>E;pOZ(hUte]&`d[XZAClM0PGusB8R[0-l8uZrh-$hISf`n2*+V`F'lBLhIgC5!C%rj4")M0gp6]C-&46sL.JqA\boR4?[T;.=QFJpc=N9?;F.JFH1%0!Rchu+]P@gslEoXNqu9>=[CM*4JWOD0O=N8"#5$#V\u]l'bb'+$cZe\!ghNN(j9j^c2JJ&4F<rgRO1BDN40m8>)$I_P[*rutML:Sg1:6GJ)F:OG,+BP4-HD\,Qj73+W:oUV`!>26.;I]`_>RLGSZ9i6fI\&F\W?$rRJc8WTrPZ+l&6@,gn\Z>j%$:HW\[k59TWI*;7^Z$dYpD(UfWBP/1@);?KpT`_&26^kBE"<o^A!;pUDF7gN?$c\<csN`jh@B;gpT9aT5D/%7..;F&R7_s(lB#9*DZ`pldU(\CEo)aAjj\R"\%pCY$:aQ/],WG?XQ"pPj;ueN[?_2i"Ni,l.JWT-.3FOj+>UT0@_S8H4FTf<=?)hK`=D7>^7'<T+2W;>k:QNYnd;585O\MYuYAr:/]kRY>pH/"8PIVm0Hfr:4BmGL'MGJhb@>^F**=QC^LU*pDVP7h/m-q,[ZK)=/3CXLb[W6l^9Z`,NMS6[*<jBBiWGZ;h:g+BNR[k)4Q6=t<(CaPB&[[b!91FC;Pa-"m1%Rir=?=>4B[s#D7DeQ?@'K3Vij[$6dJ'0uKcS=+_99"k7.53;@,`j9=E2C68GMiR)&2u,"AdjE2bQUMYr]c^DTP!Sp<l-_?CqEclS@=.]QVZ#_p(uu/F\B=j3Sj)sHn!aIUmk^6J81bT^Dk@#scCUW_C8u^G`"U_d6Gljun%EPj1=9ZTHD]O5nj0E47HY_GW[*SDPkq)fmCiGR4-QR4.1r^I5@7OKW2l8WIJ1:06BJ7QaJK3QgG[s9RuQpWZ$#A&lhX0F>*5_C5ELrikGaW8Q![&-d?TXRk:,.[W3>dR5'o)6o(EIS*h2qq+W09h/7[5'#PVR`eha$c?.d_FP7-s;X57PNYC\LMeJ6&)i*4I\Dn/h;n'O;s_hX;MA=u&+B'rg4gtrDk!.pbY6*>6XleH2GhM\j<QQ)5hRKp`Q2Y-f2a$Mu24a-J3hdaFW:%So9(14\BlhOGN!M::NJ#`KaOgO\cJ%rBQ=&]'(E_8f_X0KaC#J!1aN]K)BFh[tm0r*mMK&g"1]mHQER,NnMG#s"1?FlnseFS,1>$9ajoR@c:@_Ks\)3g#o%s$!dH?eMt?2<B;]tTRUGC6T<'Y:cXXkP0;jCrJ-3$..0h'H(i^kqoI4Yt7ZS2_9'EQk8'm02bAd.GEq^)`)mek9r/4Q4]*6I5\NbZpf5Z8p!kmr+C;CiR&AYY!p5L]%_'F>m&`50+JYNnW^sPq0SBDZ/dp\<Ec(?WYuPZm>oLTq">3ZlHX+XquNbRQ3Hi&`d[XZ5#[n+*71gXP50tHB,p6+#bpl>;om;qhdj,@r$`dCtj!J`1/7:[AN'XX%<E"56kAR>:TKZFu?`pG\m?JR+u?BU#>?-KT$*`U8;;V,]j:%?R?R'B\gGInK><ArgmAW;NjgWB)gPj2_CiEij@V:PsKi@P]h,e73,I4RK7hbf/mOD1Jjq#*TS\CV_XF2$93,';6;lVG"0!lW^)Xr5Glc!I2lich+#K;A"VW$`>=h"9UYb^Q>2PrHWq3[mudIp*+=>?W-"r+-?#\NOK5Y--3h$'3HP#Udq[aQY,o.Q)`ESuaiZOmgTph9Y0c!m/(\33`5ZqKD4Bk?Tm#U"?B6/lSnlIf'Wb!Cn@?DR?]>+;aSfA</>D&sjV>4>/F(eDe^*ohjW0$`S6`8N,\\?=k'2tL=D'AM0XFF8V5>72\(UX`RWm]\WJ#d$o])_[Vi>f\.$r6Vp]!sUZrQe%<LQ`<FbfF`!)sgo#J&j>,Mum5[7JBj4<+Vmb4oR-I\`&9EY\3/m.7u<4X3ClL;CY+X$g1jod``E;VeqSiii._RPg0#2XpXuqcLQaZu2H,m$VQ<q%2V%/@$!R\Y$!oV]`]s`6bohB6a02gU_,q52hcu.DK'Q.LZ8;jI%.W%34Fr1hn"W`Jh@m!>jgC?+og1=n;bB@kMJfVTnZI;>T+YQE,A([J.0O4"YaTVW`)_bfLk]EeF@#8eXQ=R4pAVrk4ZhC?dk"9<54ad6DHgHZ#W.kjr+oe,!j^gE`ag'.J\J%tZQ$![-Pad$*e/cVJ-!E_'Cgmsos*]I'.V<@5e8o;8I]SsbZ$[<C%o09JXa;`$TPrcr2KqJ-nm57pcUMqg8eH#L$qnrFd)Q]ZH?m]=*MqQ-Vq0?VbN;l3Ih&`icsn1^[n6BJ7Qa;+riW@;J%AO]`9D(ut+<(n>VX?@q'_d4s0p[7:D:-LLXBG"5j`LUi,D5`f8:0l<1?iD^9*gf6rLu2FG:+?jLG\_HgkY4jF][lt6djK&m2UFm?C9X;KLE-nGkKMS\pF9)C^r[7uqS-0;jM+2iqFC+dIi@SMC5Z,LCKFe"I.U]+DMdORRI=>@@b,H7;g_TnP7(>9I=!V+p)ri\a`jOdgMaVY;<GYb"LD#S*n6EXAWE9ao4D!Z+BR412lh7l^@l;q.73:LQ.$OlU?X[tXku*5Ufn4;Wi9H9s5.5*,Kc7Ja94YQ;eeU[X0K_]"hFGSDjs?>rUQq!f)/eCKq17U[]!-eqUO@*NFE@P\<Ic@.kG/Jn9*JD?.U,ZS3QUY_;+u@>:3Es=c*/>DU_/O;hcg<i?5V2.-'I_kH2BInG=81Wms->@Nte3r9eE!l-GYu&-"1?B]'&PZ8L16BfdjEIPo/uh"\s#"s*ff(nQa.QRkoqs0C,ojFY%RLC`740QqNJP@mlI[iXASrOQ`Y/F(qH20JFlm3?n^Zgnc=:WW-i.h8i'J*kU3nLJH$PQ6B"mt\!Pk[f,&2d#hFR-(J[O$MZ@^^QMu#e6s#Oii&\<frtYfg6A'1bQCK:gW_-G@'^7;;V`7[SG>ddYgQt\JgBB;33=+13JB*B;YP-s7PP\T.M"0(a&-J\Aln:K]72DbuuHMJ2B:cjMCfJf<40uH2K/\q:c^rDfVJ`\T'4qjK\S+ZC![eCWB1Ce8LX&#SWHZ\&?o4`S&f!1Z`jWDWqJK9ft'rb.+])P:K(:ffJAi57V;]cE#mHc_#R^Sc&--rr>r33,S1gpNMmmnl[$SKA;IPXr;WiW+4$U:#c$BaV[6Se&66q^E:%qGHYS;RsCm*9`K*:H&#EMkN).<e`EFFculI\rs]me%NW2/-M#g'h01KAHi3ZdX8KW>ceUsFhIYNb';t9peX(cXZ`h]a.r*Um/q,'[q#1Sp<A.56cNU<Qn^sBdAs:Yd[<[<GO^]+IFh/&j*pM@?Off0Hll3)Y+1,D4N!K)a.[d7CL(.H6G9PX?eUAk@5,6?GWa.P5o0A?#eO#@uZ,kK"\U$3YeWSlE_BLV&207YWL!jEP0uV/a1Y#*W?<5JjFeY>588-['8VCg&>:%j"[EnM0I)R2ZW#`EmpDq/jF?IWEhjH-)HJ5*`5$X_;<F,jYX:s-ja0M\.[RDi3Z?#c[mFuM29fWlnkifAq[rq),VY'0lB["Q,U[UaX&+7-\?5gk:h"u:')X6)j\9PT/[BN2o!B`P[R_7HPA^AiHIuN`ii:?kGr=^^Sfsl<TX#BB=VH)C3>4V6=qHp]]mk,BUB$E+r(T9C'CqSW+AV).HDQB([\`PJ$"32,kII,<5`U*#^8fhF3X8Z:FUZ/%E<1_'jo/ubAQ`lb0=m'DqE$b?TbXR\pZ,kK"\O,K)AtGFMWs8:hh%mp38crDrQ\Q(YgU']'Rr+cfB5s8=3>$r:?^4['ei-S!<R\6bU:BKJQ.>[QfB__`B5Lg"l4/`p&'+TqUZ.\#0j<IbE6!T9TmQMjMsgVa6#N)_7_V(qPGbc,H/7cVRF+k1<F_i2f__c?m.OFj?@W->4am0QaP\r<^3/%hMT;;31bALpOQ"6MJYW^aC=b)WB+l872HUAK&+72KdPT7pReQi;POCE\/SIM5X0Ka3#.Y=q*AZrK,'W[t8"$nNY+#31+`8Y")oUs"^Jq2FbHOAFRaL3!LEYQWp>jc9Q\n65'',WEr@#=8hHO$6:F256Iu=9,5D*Q(pLieA80A&G^X(d&9TWJa9Ct[@Rr>l@'lNpEj!kH3hp^%K%j7,73BpHQ?*!/5=a7]]Z)Bs@QohcLcEcCl>B%/t\"JkWAQoQiDkJq7aBD%TSNHGA=YnCR2Z),'deJ0ggDa2.i$-7m=Cb'Wgkuu?R'ei@p_"/S4aL3YJ$W-V]_CZsHfsdbdT4l?Le?j6+R_X6nsd=B(M"F4?[s[i[Ffi/]"I-F4Gh:@rdMQ;!X1oPHh?ej=7J\!1Fof[+P2AS+e,r5%+Nn2dbCH]CJ:gT!5W58qLpSu>Cgg!Yk5@K2g8mbD;A![LfT,ZS=b#Y3>+T+XO!F)3I.XgRA5'QFSb(9`_F.1ZN;r.<CODRVsg^[=T0PdeQ??TK3Vi`)&q_\Vp.Wu:f;Y=:Edc2gu:7o;M<f)Fje8#:HTL(St93[?$c):/[c02X6Anbga);_Kr\CBak7e<WQot@:)Tqdp@SX#6M?t_2JnVA37m[.a.!>.<E$Y@b`6PL4;jtO"fRUXm^a&YD1\au93;hl.P&ipD%Ld[qK&RX%DQH0a_MH*=#[9@:l>2F89#,aAkAJ3I.`a]-ee87MD\`2Sfb,JD(3[rOK5Y-<X6/ce+NYNV9^#*X4oO<QbV"t(L$5[pYJTPDRpmd1F0=[.5-Lklb>2>cat++cMLpu$s/`h(q\ItJ$gJYC,Im1b\-mPQGZ#V8'a@_/(2_DHH&ZP#(g+=`jOu:[S:qu^<B5q^T[37kk$<VgK4O`,mQ5IC=S0HqT80=)nYQ'^X(TrFJ7Z[hgXBscQK(DXYf$43aHF^H$VqZ%Gen<p\ju$38Sa./%MkU05<tX=fD`R/UK?@OK5Y-<X61]F5O?<Ol5EO7!uXWqo/+B>!?JljOW_XC"Q7NL#MYl!7*2q5PG0hKHSm[@"PkFk=Q6pVd:Sr:QqCtGrNmnGt2m1aH]P#Dhe/_>40)eS+[QI(Z_Trmci1Zno@jP<k:1DaV@"4jEmT#3U@-(,4e&pK80B,]V-W?.!MBEjW]>f5H`/c3Q5pg;OWGPp"1Od9p-&d'c0d!DMGMeWR&1uRi<=3P<mJfRkKt$STnO<%1qT8/@*elmUm1kb]UsMF+2eZF[!uik>kp@/u_J!g>?S1&)EmugpYHdr%(J`"M$_IY.@k2)E_V95c!2(jOMID$sR@(o78SC=*@tiQKbR\N:l6]-B@ce;!Gn+,5K:X+tV`G"U@c'B)nW6e,!kRoETY&k+]Q4Ad2\6>@k]V=mVlX2@P^J,2E"dqeNEIj7S/TqP?pt[e02W9c1M<`UgRI'qZUMA!(U6Eqf"5UWStl]7_1'S@<*WgkmP=[(grl1i:BYFc5(MG=TC9$,(\b$m3(Sal?J%QRDidgs=D2M]P%0eZTRd=HH.S>L3;Qdc#Wp^Vuh8#>U@2/Ge,BB!iB:et4'd8;oVJ<k"#H(m_iGQd6Pq<R[Z%P,!g$R8pp#6;2dN$/=IpT&6>*?!MI+bph;QrRTuH;h+di@-XPi,DN<@2.F6i,DNCk3-MV6ck9haCtj?t?;?(#3AjOo:.phL]To%umO-VN$!ZMD<md20oQZMq7[`r3l-ctNeTCKQ,uV'MM46G/ZaoE*\JgBB6]`h>4e]le,N=?.#->0TPEjk4rDm]J$XIm$>7cg[BW/CXS[;h]<O7PoQpIl+ipXcBC.DI`V<a/7]rqqFq8;)R^46Q2KfLs`PWD$gT:CXg>kJk]f<=?1QIa#qq+bTYDch.])Qm@!H==pZQM(B1dXM"+8#]^Vq+6&!m,+;oFE%b9p[5f6#Ofs-[C9e0oX`KI99lC.%:d-?]QD0C*P6ONIf9+qdj6\7%PpOA?fJ&"6/t@Yn_Ua9_=i@Y;:[.Obl-4c3\OK.4A.?gC*hVr[H^3\n_8V]"n,(Hb%_'i)N/E-O;n/e&S",0SB:P>X1$(!b'R^5.fAf5S:*9ViO+tV:rPN3enZ,/Y]OudF(8Gs!>smt"/;::T78e=Q)\^H9RJ:eN!0inm?brSOf`00YWrS:Kt4NPEN]?1$N(3NIB5t$hlLC`FcW6U``:9>nRFI?Hr*r)nBAcR:lZUQ/`5JjIel_V]@lGSl?;>khY]D2^1s"o)oe0`dT5cFg"Y%7F5"q!/Ko_gfH3""A'?Je4^,<g<-HA7(5.=p/Q?a>'".CJY&rosVJZ^-s%ClnDP,Np&2SaWp:K#R9#b\L#Bc+Y8ua%[K%q(Wc-=7imoF5MK:Iob]pB["<c\+0"%D(OeW(bR">=m:`9=3.-'R:^igr>^D*oX#k<4gDM>bW)Sb5tN1]<lGTt5D8C=,*,YMV-a)sV#H61,Q;m8V\5@!,8J3mJK6n&akD-_nUYd_+j^fHdW<ZMa\6pJh;3?+Q:eY-;O"V1st>rNA9Pn``8UX8I3RqW,7:iiBp,$.6dt[RjBsZ6im8Fi%W9:Y9^LdSlcs&DdJe^mWZ4l:[%3RGTJHGrols/H/e&1hJSSFsV@l\BWQ>8,Ds.M/]G3e,orY3g?%2k2?A_FDf[s]E[?GSf>i<pFWfaGmupK[bppipprN7jfGi6r-pf%DJ=4Z]Mu6]9pn60O/4:<I,@#"8BXq+DL;poF\?FBI=!P%G-&3p@g7h'dCc0W'cSlDXb#iLgbTZBRPefM7h6!&(EMns/ZhEq93kBUceaZN.;ABSM5$9LC&PH6U5p)Oq<4Na?g.Lr(B%sfE+L,(:-P1*IFjg^?6F$2Yc<JCaJj6Ie:d$!H)@_QTY*tIPnka=2DG_RHBJ):er8F-l:7o?9ktD2?#R`8h"%RNEH1K@e`u*)RX`o0dQ_OGn<bAOetaR]HMkkCLCShW($f^#=W#4N2m2d!B:UYjjU)CP9q/e$\^UDii0(C2S")tHYi4Hpi0^bgA':$6mRQXYn";,@DZ0:erlb*#irf.]XP]uCU%MtSaNHP?eIDD9SX.Ke\g)/pq)EZZ_8L=t`-(qJe/_`@:Hr`d3bdnoZPS*dN^#OIe4,FC&8BpuNA6R9N#h4\B$THD>BLZ`r;G`8^)\:23HF?OV"%[-KrhsG6s7NjhAA4"<I$3eIJh^p"+C'JB\Y^VDnOPl8Y#S6DmT1Mma$@Z[`Ia8B&1Run^ELIPI>6+'h40b^O+"<X#!eJUAmE6'B&Vqqtp"gdD3AWT(Z,B4Jlc;A[?%;;$JD;leImu5E=VVmDj(t:[';A[iRb[hhoXBp?5pnjM+32p/kA%?F6k]CXP=Rkb'f-i?o-`Yi6D0Le5SQEQ#)(D;$>Kb'^:TTB\:kmFj-d<9D2C=._Y_R[t)kJ\u-Uj.HE'>un*n-$S!9(qn&-,&=H(`Pk<cMq4=3gdS/#<"c0Vh5H!?mk-U$*7bR`[Uccu]Tpg#YJ*U]E+3-dkj]N$+IWP)emFn2BA\5g)(f&?eZ,g`+VY^FYXr*?N_@BOhNXILk0er2JN;-YYZ!je3t\MG8NK"Ik+3ZLY8bi<A]N(hgO,Fe<P&s->.73=!S>]7CF5(rr7gRdb>Z_-4`[a=-9BaWC!WBb(:!.fj>1jim2\!'_fl2aFm5'h<3Q(`:7[[ZkdPTnn9&ebmR]u0-"?HNpKh$i+2;]>p<F;q](JD.KE(pjE;\ooK*JLD.b.`bDnUST-2"kNX%*,n@G\*!ktB>C4a^%qam+pkRaq0$s#YT(;9#mLJ,XV!r"pl0?.24&/,u\fgEqFKp!SBn<fJ$&Ibq8T`Po67:Y,Ieklh%uTLu>(EVe``q/)Ut*Hpl8=+U3S:-?qB*EWVd4f]`/<YZef)n[M*CZDb.C1</`;:_9N/oNmhh/lpd+q6cse<b5ZY>)t"II0Yp[`pbZQCNq<GXSntI[[Y2V]WBBS%O1GjR#knD>eUsmY--2MN9s+DUi=Ge1>*uA,n7M&\p&US7cd%aQJ:>/hhD&J:!1uc?>,OAEe4N6rubfAMk/N-XiZRGm_kL7Eure$NU3_[]ZUcQXr[1/(;g+?-k?;BB=?"Q`-1(k*GG_2Vc?T$BmX1/H7s*.tq#@P0T\@@"V!%(B/;MW=Wj.]*?97g?<WE&ZkU^cb.LJ`uB/I1LMcONYbWdODi'lHi`mgj5`$Gp:'+i&&@pd&p&*4R0fMn\=6FD5[$r]M9)d^\ars9,S6OfB2:a,fd]kTJSRVNk!)nM*P$%1NT/^rbS+X-&:N<.kWU*DHdG/d^%0D3JcYoP!!kGSUcDN1C0VM4RMb<Za?a^a%Z>1+Im^h8#Og78/1tf,nk/"t]'_O:/E#OCXP8$nV0/'*Mu(DZ:Ru%qdZ+;-!!&\%FsU3rS]7DN7NSg^p>eT=$gJnX>MnElE[n%"n]tC150[@pDE1uE`AXp7lEYG9Ab"kjFeUJml;2<t!!!!BA(m_q(A?WW"*>2c:/meqlTKVlf^>dSl\9%f9V*!%C+QCB0IH+/hWMZk_EE&$<k2hD=F*X.^Rf&R%Xe<W!!(s;i.2m:$H#o_FRC8q`3?XEQdT`t^f=-h;D'b^b]N0>p8[V7dhUoojm/aDS-(B^8OY[\aKr3]+9_?;!!!!c=O/&3/DN4^`hLa!Q["POguQq<IibmNQ8b,bDZD,DgJW=b/L/<*[r9!Zn!U(iHs,_),$ap`(ta=LnPKBr%Pe"a!.YWH&pMdP+Lc[QW(Rqu3*<ufB-2oZG3>Zi?#(m)8b+!1Ok-VHjB0r'n`K+q9,>5BOG9hQmj(>T$NL/,^gbp!k16PFh==M4(h_[i.h3>65i3"!].$I5F5+)sIf8!B6-K;P5@Ea8A'LL`5C*0!3?5r%!<<*"=D`k,^8b1Qgql8c3`WPoPV[kL:g'@E0*2&TOQfaC#bun%?ti^AO5j5-ZK]I7!!!",]g$sepZ8refg/)To;E8e*@]Tq%j*lW>%6aiYGTfFKCIO[4*cic;,P`]YM(Y<.*.Z\0<@j^i(25q!!!!u=m&OEE_1="/W+X2F]q[g-;5_HM+rgkWU@b8fMGZ1nF-/XCp"tm;t\!*QOPM#4'6lIh=+Nd#eQ!!!!!"lC<Lu'[WU=MlQVn^c/W0n^U([[I=!PI(WqV0@/WmlM!iirPMWr$ZEJ",IJPA*#WR&O8,eK!qW[nN?=@37z^h_/Mp!uPm2<mT#4n[1a&fj2_?e(,TU&&E;,rqU@;pX-%77'JtH0aTDMm**Xf=gko$31&+!<2s\;i5\@%g1o1C>7ki2O24m[*bu>]9Ep3Afn0O/WFaZk41_E%U(\0>Q3G7Q8'O!!!!"L"'.%d?r;uVr3^63cIuNtYGEPC*04F6f2A@jE=X-*g0@:WVX:an)n0FmW!d5[gKYp&!!!!1:7lc-]l'&lnW%rfX+0Nm7Hhgd]7IY::`1FM86\#ZZa5sN$)9F^(Z`#ASb02NUWk(dzTcjA@dq8,N`&mP,9(QZ_Z*QF\]#p%gXu_`Q](N.sGM-+l6N;KbXUB/roiu*ME<#t=!'nr*UK-?$`RdkVYf4nnr%r+lO9N0m/Ih'Ud`u#/^A0,3\fZ@UW/W\O#64`(!#,M?XKlA3Xq^=u*4OVHZLm?h<U==3OP@KTb/[<Oe^D(=7@cIm[4]Oka3r*1!!!"h1Ob::dk_4<>\.,*hS9)o7>lh,%!$,BN4F64\SW)SpsH.>Q;s1Eg6b<!D(>to!!!#oQoJuiFn&5A^)=?o,UY[g60$VU$?BG/[AQcjG[O`E4aln4H-8VAIe8kX;mqqpzI/H0@T69[!IiE$i?Ffj<<eHdt$?DDhg2>Z"_U\t&>;oltXXjGP!!(sIaYO=sT*5J%S!.W#OLoF,QFp>)j$B`.^i4pS]*LQJqRTf[l\!tg2GQ%4zYJ93A#`YE\&R,Fj-FkE)_iP7H!<<*"^dcIe^)$D&g)oDDhs9OKFZCJL<qRSZP<6kaB]jupzi:ZDph4YGA?Ff^8<rM5)mE+0rkF>e8KA;FX$au<(zHs!tkEo0(SXfd'7er.,u_7/ou4N.*;Tt@a5eDj'&RP_Km$_c4oA%%X+zI#K&ZcFS75kb'fA'u[d]Y%<Lq>8lSRWZQZLRXP(o(;>1r<VsbdrTJb2SnVD3z^dl]lbH-VG-B6brB3BQR[&P[C#.\)iRJcJIOe!6;ZU_TL5Phb/g[-O"z\4JcpI/Nc=Fk\2-igm'4[b4f\8X9h![OT.ZC2&3XK=YWB^0P1'O8f+)[5Jg+zj<-DYG$Y9ok-9fIrH$hE43OujiKUr*[@E:a[3fTJkSZVPYd9XK&QXohn'lW^c,B\`!!!#PY3i^"g07SbhkCl-Z*QCpp1=K[<k36g[r&EtA(`<k[oaI-2K+_>TD-q!&cht4!.YWekbpSgWYo5BppOqV7@Qs"WIn2D.TmGuenl7fPEg'-/^9io8#dk.IWt=iLGEpe/eJ'`!!!;R->g)l7o.(K#PM``>b[i;D@N`kGKbm92HQ$&&:MEi/oR*+K:a--df)Q6!!!"tieiUWG3tH-?'&9o@Ebhmp?de`4.)EL/0gJBHnIuQjj(=l7G87"JMsXFC0`EJYFYX`/t7_#z?6THQ?73n,8>gUb,l7qD$5.]6A(CQ<-Dpgnnk<E8bBml//UdWr;6$OPkF[E1q9sQVSn;W/z5Y-bqBk_cts*cI=.9CP[L#k)!MWXrMf9%O4I/1Kro6BSMqHEQdZZ#"e;D\@R!!$$MLga?O,9o]>Z_ff?B(a&sO.A?a&K1A9[$Qltl!Us4qIpcfPC:Ib$%B6s['J[1bPJj42[h/*-)]kY2BEe;!!#9LFT65Ej2Q'SKfS^+gskE6:6f^2dcnR8b]U,71iMLt#HGc_Cg+D:Qh]]?:+W=I!!!"lb$(3^hU362Uk8oBgde5CO(I/LR_M^[5=p;+n7C@M_SZ'@=,YL</2+5D5li4k'-KD"p25&fI)M*>G>nYE!!&s,#5$)8#4u(2jL/fgQuD/N8tS<C%#@&dr4s2tFuC,$d@\Pn.;eTX-**'EJ313rP]L<UE,MZ;doBr^zl^U!2Ye&>VBO)T:YeMup:9"3^gAuT3?H3.P<H:TZ@n1EY\o'\rH2O[V1TT)uP0\].I5<tj@mVdJ!!!!LrA&MNQ1J"P$)b,"QuH5$^HNNU8\P(f:'J9B9'Fm3_rA^t?9):GDVt.o@J,`T_[#Wk>tP(s!!"21hVEbfiN_r5?MF@oZf=50]#i`om:7A)I?K?chmo<0VG0s=X?\);;7fTQPtOoDX;R9,F7ra<1\0&UT-eDt\s*0p!!#@@mrE(d%H=d)5,S,GAh=Xe4F-=95s<MaGuV+VPSDA&3Gqu1TOsanm9=JL\I+"dR.fp]@qi?,0<\SEqW>1jV[Eh3!!"-P4aL5/bf#_j>gq_<pRK\S!atmBeND2g8+)((S_"?@\F)MF!c0$Wgh1P/[S4&Si;/sNFuru+z+`#Z9SQ9skM3JQm_Wc[K3dgF7_a\[:)^2DoCrr]oWq]=p-XVNqXBBhjkrL61aPlG9NW%tag`+k:QT-J\:g)$#HJSKO!._'l:nMsc+5cWrR^5/4GD`$d^G#KA!U#t5p!>#Pm:'d+;l>*:SQdb;/o)?mgraEi0#aFTQ<i?=W?O39&pH%YaXr,qO:ZJ"cD5U!^A.7j@lK`6.^qg0BR)(a-Xb>OTCQ=$]liB2h<b&T=*'ED^3BA1h+Qq'grmeUs6$_$D^tUrlGj6b1%kTtngJ_H&A2:QflF=']%k?S)cTk2e-;?OHilts:o4'srYa48V5=(/b$j,!!8'ETLN51rqkiS(WUJ9`mVI//0DR#EqlI;O\%pD>=6*[_6(N`b<knA?C&abUVor7D'Y\sEr94*u8Z1asg,!@%L44P+3d4oa\nt@4L,&@j`.^eSe)_J,obtm$WZU&kFjelI;T58f+2)CfS:):>(XARs,d%iZb5hSsM?\,^hS9*Zc'tGODi;PDY38+5hr5CdICt""`O=#MQD^=8>'OSo]E<Z^T)%"9"90pn>`sJHj1;:(:-Eur>P>[B:S,i1Xi8oSAEA_]gZj_jmOZW=s7buMJ'L8$rgApgC>J/*ViEudr92[d%j0%ZDC>h-[nHfoWTW?PPB,^7\feJNe4lGM)fT;Ph,NjfdSeBg^V0O6CEdKf!<*Kl`W?K*7-qUF,3mk-hTt&jGC$1Z.TJ`!YTO4GK"W?6.OZ(N!f@=U;(U%(2nNl=#Wl6XpjGBu\bFs-8@E'Pr,u[bfWND4KKE\\AbLbmanNlMX1E2T.#[5[<,j**ma9(.n^2K%hbB$Ibu\Ud4u\un?+b[=`BRr[oQ:[&*J(>XDEc'=e`PbNjL]M2C4OW)&pQ!oV+g&#!!#ici:^@FjC?K3Qe/C)[J+]!pJpYCQ^.,r1F8a]=R_m3/'a.p'et)H`2M(G6\gBAS8i#qY)DQ"LnIptna'21s6V*?;orcrl/?:8G213]VcUX+.A"T3X>h0[GDg!<p)=]a[3p;\4skcsRWDuY6ot#5\%,,F4aI?l)],o*jk1mY>ePOT`OBbMPZ\;_dFcffo1&P@b7l>^jm3f09'if)XSjYon@k7c,;52Jn)G0cp<%h'/pZpBeh1<M8pCeB,l@1?3-TOD8[72B<'-+_+o\rMn&!?1WL[6J!gUVd=#Hd!'p1?<l5%mdD5^[>8%$<ckMK1H:;5d^7ZNMaYpG=CYlXoUrEHu5N:-:0-rm`%,rMYmg4&hmo@KZ<\_VT9fLTj)q50e7.-f[$o9NokB9uYN/c,h-`e3Jm55b_@VC"M_D4M<I92]]c]]"7a5-=/qgZubAT)F8$*knMeW]1?K12-PVP!@g9/jo(BDjR=pN`A1"Z42!#(>?U7b+e"\]jJjf@g^\&-YK<bhr55]nR"s]_<f+41*nR5gf(nqN5F=.[;JZ+;Z#)h7C/J>j(RQEaR'r.CKIA*EXT7!\>no!AoVXJ*u>Z2oZ"r&hr.!K0*$Nn=<VpPmf4Xo6-AD^?YdE%9oUs]I.5<4ikXtT9)f/dlq=kL?TqH?X]fm;(`oZF=,_XQ--ZNR01oIep,4M$>3t!dWD!!JSNpOd0WidaM(qWh/I+R.Y)B?_f'jHu`\lrO?Ld`%gW&gh%A)]:VdA*A@_F^eg4Ob@[Va0/*tVnI(RQhGr$gFC1?A:6eGjm,"g20Tk1Z(U]sgIg<D-+,<:.`OjkPtCNn)X,dsH/j)2mF?P4Zi=.o(>^WqsX'KjUQiT>7QJcBjhr[BdLH!2)PHCWY\l/ud'dPpkcaaZk[_p[9Virt)9eb:hZVL'WC,:FE2L<T85DIO4R[Ms$][9oS%38_.lj0FgC4+FfXr#$Q&T&aXES5$.-?Y^pNPd<fq'BsG@N[cZ?/PfK9EAP<p_m:>he#ekEFmQ50*jN=<sP7e5;Hu9M++?O](I&Z?[VsZi[Hn6u7O$pZ?\%Nupp^%V."clkFMRTGrSGai0(tm$MDtEgap[>hb<pnSCp2[MB!-A>L\H,3=:p`u<3L?O=`IEfIo?Z'H-/3`Ti0Gd:LI_rd>T7S;rHGrCc=!3-GZtV#f)e:A#-p"U8aUslH$D,F?XL6/^)at<g<A\O^*rrMEUKgpJ(HW]cWIpBeGM>Kj2ONMHnfhgdaCR`)qLVPqsXBLPfHQ@IC+CRT)75b=5TW0/rDeeeB:PjY5*FfHCVt6E/2oES)oh\`Q77;Ugt'\@s7)M&/4lT@Vl,G5^+52j>Jpq(d9d8[Y]e;rQK!Gb5MrRF'gBE=t3cKR3D<Ml0#lM_A%B$Nf\#W+]iNiDNsm+p9;-Q4jKps`m$[1rHhJL::lF/&BI!'A00s6HUD<sp&D#B,KLH&dUMm9`f5JEoC).HqU8"72.t6-I.d&gm0s(-$\o1A&it9Y9hm)N))6f0A9M*9b"[3WVS$O)cnK%':<W+/4P_MonPqos'gfuAe`3A7`gK4oDO][DYut_+@-h-OgifU\A,X2/Tc19Nno)5FqVGa!NME=-kKc;6lQ9pRXg^3;:%i.GQeh`LYm&CQNgp06i+`7bPR\aT8YoBi.hDI*;<?qi>dHcm?U8;Fp&"3hifD=rE\/EpWi$uSU0mq.bpp_D5s8KO*^-S]/fU)1G&.,\Mb:[R@B2@HkM0Hp]:;c%?ecO+PIWtp3OG$0@d:Y>CAAar^gae`!!g%L5SkG'jA'1h<USAZA/VflG@6cUZ&;>d4(.KQQYJX[Q4n:G^&6<V%perC\Om.<63t+O\Tm)D$T!VqGA=J92\iN:#)mlq&B\<Zp[0!!ErYjqma1<cs"O:$>C$+CenaPj9ni^Jpc:[_n.E]uf]QN?!d/YCe'A^U`]YS)<SJfGl-Y@?Jd;&,l+P4>m9<'k\R'8\`1YiejAY[5-7eX#/6[!jNV4\Z+nkukS>!eL+litRjJjB^G_$Mah3F9BT,p/o9:d!`'/:!#MAD`UD"k@Gg)W:\Hg\n]l$@9W*P%X9b0AEFUNm%og'?"d('?AX\?rdf^k%c;<P+YplYO1Lq?rVn!*M@-aRq<B>jBQ]T3Cl"MZ!FFTD-'XZRQ]1aW\.-^53eI9)2IRa;%%_<S[$0g"O3T7i&RHgP*(;%bcQ%022=HN'3'K5Br,[@G^5?RX2WPZ;0kjfADG[LL!UbWS2@"KY7`k]e;nEh$J8c9mKIjIR.g]gMY9"O(/TA!1>lmaS#6bNiaS#-:9uimt"a>q`j#[FiCu4)7VQ"$G$';J*^QJ11NY/]+cF?!^a&A8H$AH3cer@2GHDHE<?H#IeZaCpC72BO=Ou8D,L81bE#mr._t5m'O.Y4L[#fi)0Sf#pM!."\(8;C]-/-Ei[k?gH2FJi:%UsgjNk8P33W'+"12te4QPqdIR1h$56g3RSsnqi>btIKWfSa$_LDC%9SHN(HgaY48dMso#e<Q!N.9Kn=+F\/)N?d:ZBq,tUGqi%!MBQJ93-OV*5W,jr',@X.)FG-c!kG(=h?HVldtV%mKm/=$b7d8$.iRR<`k7n=n,t6$?8(MfqMHZG:hGNKNnM:FmtJclGaG<*Vi6=BAYe[hT4LJ(%8oK0n!-aDn&5EgBFBq=.VN/7bT=HFctlfM&'/!+]epm<tTe'?K>:>1qepSNA[;k@bK;IpmI.mbIQ$Z3]&;Vc%#ZsL>9<4>2MK:Z1-[5m'^[bMR&;9B^p_X>Eu)[%L2kTj8s"rK887YqPKsNn"6npXVp!cnooOTdNcjSKD@I:9Vo@>Vs_8'B=#g/?mkXBcS(o?G&m8BOh7)aanQjf4&Z9_1u1fUrT5dFEYZu"G6fcQB^?n5Q17Q:*<8^k+'-UU(=-VG:$8]g0'mqoGG)FXUVcK/P].?tMd(GcC:bnkC[sJ%n)ja=/qCr&GfV3/O&/LUbMTP,>q(uPo8ifj<V"FJ=(B[sR"1qjaN?Vpp5.kZOsa7rZX4[[\[u9e]"uL$n+LRT[:,LXZI5@;\C%W?'D@&'7R\<PF89:ro;BQ-A<iaOI*0]Z'cZgRqrUS56(q5T*1+Ft*!Sa4,%f(^Ti.N_Q@AtPDh6:h*S?XI=,,j=]J[Ak)Z/L?5GDsaK\[]pUcr3/fZN)ibo,3I2j%mJ^lbB9k0-HQZn>k7Nf1aQ\&3jeL'?B>%D5F/oD5lZjF8@t/na;IY9<6/..W1HY;Sd=jQX.s6%90N!#h%7EXhqKE%Q3.e[09GOHNQg@4*UrIo;YT"a;f0mS!h&PQ0=>bTkeX)pV*gZ]e2XlQ:L8jfsdus7ES1]WCrgAM;1khj`&cAs89tF7KVI\8C9Llfu3J)#ipW%uM*BBF)/+cm@b9-$o1o2N9Z74<XKWrlP^`k>lae+g'q20nrr$o<>\;70Sr>>l5"^pMf6^3j(6bfu_im>5Z-b?V*Ido(l@oR$Ai(VrSMF4#U^\*uQ6'>pupdbZZTcVp)N#cqYbF!bb8YOD@W<+guo=qjH/PF`l_<VOf>t]&j+%2Q->&HPPjgZs[dWJS?I(\q-$*$lfuXlK+A`^/e!?gGDEr\9@9%Tr#=AFmBiclXkFChtu^U&qDim>X`<GEqr@8_K!EBVSe@BgS'#prc@GY.#j:j:)t\BIeZ`(G"e\tM>(tC@mQ%m(Zf`5g9Zqll"g"Y=751:,jc'_(2eH`CDtSqqMJ#;4AKW0b3_<)Ih6W$1aXg8)Op,!rVkZ?'Bjf7kb5'RQc%GSqr]G3T-o[`dVV3M2>u5#e+_a84o<s%Vq]\lG]PP"?bbY,2g31Sg-+?*Dd^D6pJ_N8HTeoV=gR+hpuB15B\bjpne(n%oR!<b6HE/[jrr>YAR2dVGpF97iB"3uS6&=*VPQ>u4$q"oZ7o:']9+h6Z74XV:-!2T#Et8&WG6j^ZMH63^AU$\qIJ%8=GphM,)^02pT@#a:6,;NWBlrc#430m/qCqeLKp2&!L4B0135U.htpC'&06nBE;iFIYP@A=$)EY&3ci;trOX]tk#[r<JA7>:[BQ@=C#l2u\q%]J[>t/P1Na:@&mr4(7JnX'k1AgCFS2rg_Cn3??R1;07;*HWq2WT2`^SG-I+*GS5pM0ZkHGgoZf.fC6HBTD1_$?6D&;`W"oBSJLP/6G=\5F5F&+/XMWImka*KUH?:3k@m5[3#b@`)*0S\As#e9pROrSLhoEfW,OK4<)lGau7_^TKn9UtJ&-fE88)T>d4O/7b/O4Gb?"B*O9[e9,0>(_p;#gG[gqadVX2kPG@hWhf%TEY>336OBL&9:bmKZ`7@DX"LR4deqbm;iC/eK3[_LKi>BeCJC)cm^IB524nOmCd=Dm`V`8/_<Y+Z(XaAFT_O8rnZ1T*XK:Vg-Ng195Vq_@De/R"rq[(<->=U]dS2'Z[J+p4G$.,;g#2^'gf&IZjF;@Ug:E!<s+5pon4c>;Up\"2_#n]r+YTO+a<qP,\]?h^n$F#2rMF<_&"k"q6*f[`<#Rj>H_Dcba=u0C=75_>:\[?_UO>+)-^n(jTD^XFC6E6<A&^<hXM1u!TZVheVger]57!d<S,B7MY34/D620a;%]h2Oon(m<J1Q"f>,'NY[K-G%-gsigm!8r7'fY3NZE0#U@\2@b-[oZ)[$anr7Irg(&BdjZd-k.Qk:5?Rp]*G@bYj35?4-E;T=VW*F*c"WVA+B#e9s++lqoW>0(!\-rng*RS"ZB-V]IqFd3p`6EVLhBur6`>%`0%RhgkCQk%"2L\C]@R[hu#WD7NT$b:)lqc`lF"EWUenZ9NN14";d<I`D;Yi>/6].K(7`r*m!P>#i'lrG)*M(&Wi]O:bD'E`\+j9!DWOK02?OR'g@fp=7sUQE[5U54m])+(JMZtRSKHBcq'[:qN#Ha[WoL@).D8f_i1(NN[Y*kXfs9X3^IAKp2oC%:)qs3uBoI]"GS''<H5M4*-g)sZhQ4^:+3A(Z+ET^j_pHNO+Rp1f*3(BJjh\K^bY4(#X8qpP,]&q2AhIp]g6ElC49PP@G8@m,i>aH]36\Ke4&f<.GXVtSZ(C\;0D:LqWYBpr!0&98MZ?HD5`;sr=#T]CrgBfEkZbk^9%hbR73K\OUg6Z-IHh1,ML'$aP:K_<fl`OEN+Xe[3W20WNuAst;BXX<1R(g$P1Wr5tf[G%\Zq[VU=!d52sRsQAVI`/DAgF>(aO0V7u57<E4dN9pj)2)6.c$r?=>W!pQ*CInb5?&!##-P-rcX$X_3Nr)39!B*@oh?)I7'lV^KNp#,m("[@^*,TVa,GnSYd93Wnd/7?284i]Qh0/sp-dahDHuk$`g8?mjQF4+QsW/%KDY,/Q$doXmd%?#5I=WN5qSh)TkW!^\mG7,'65[dI7X(mZ]ZfD=4uD6OS>@5m11<(<BS^r3GllB2f2;cnuGbkeertFH_t/0S/kC`X2n(>=8-!Q(!oSY&%N#e>uD2OKNs5=r^2eE?$TRq@=drHCqLlTGYe=PlrA29hK'JWj=3L8Q<^<HRZdS>mnEr^6>?n'7n61pCEa9O`s]FbCVLB#*%(&PrEjd/53_4rS,_FFDu444&['$$IiJ8m:S&PAROs>29Hemq&$)]Qa]0[qC\%/k9j-YO*Bok&FA]'9BC):biNCD<PqUFcIVp2MUW5dJT9Dsc@q=ddbrY$8rVCrNkpGL:reb,c+d_PraKU$G2eC:(P=.$ODB?X>Y5Z;ole3_js.I`Dj.dF7:#<<-1Zm?gdLoQ'01f^Ip@Bne$r'G\aX'ftmjBL<m@33g^,J!QbEt(9ERa2CpOT%!/.heqh-BpTGm'0F))63PM05lJI/^gFHguf"ls=!'&%O_faApR`G@+:3MY?DH8FC\4MZs\$n(fXq1Xh\lq3p(tOPC)_h/Mn9Phk*#:W,DD>un)tH6VE"6B.)M2B.dA)#qsi(rpr""XIRgK/_mLA&h!++*`YH?AAs"UloOVVki\kk3<s&F@YeZBN\'S2j/6S'R_\4Y=c8e?+WumI)I`Pdj@bE(/r:]NZAp)._<d*dY>0m"q1tT\IPEs5@2&lp8eh-YBa0gZaD=4qK[`"n*a^X-YM=Vj.d.Qc$>[`+a<T_8##b!&]^\IZZg<#T\bR67X1E7J+kPJ5Ee6?4**>KMUL=I<"9H+c[!SoQr47t\Km:H*_LDTNZT?+BLpbj27mAo*P(,`0Qa&Q<?e:>^lZ5kQ+tD(LjD8`.1*H#aAHSVknR@BWO-F9R?YXa07#PZ.0:[e6>#KOOV-YX-iW&r(_iEcl(uVcf%,9h5(\6*AX0/)RcY@:IRA#;dnbE_Y0[(ldA^2tKN#LPX8h8&Z%ihMk1tB^bmG]V.RL+rCG=YlUa.6#lFh1F^L!7,NuAb,7P=gu%(S0k)(/jZ1oR^bW]"crU>B+IZVr4n8[tsd%&iN-9V6X$FreS`M,[m!<]N)nmbsP<;.e#:js09oZ`O)NqBM,u;2alZh[k;7ApKKqXbb?9Cl+"i$hD!AF^sQIjuF8_a/2#jaeq[u4)qnU1@uXfc,+KP`;%Xis'(?M%iZJLFi-,p\(+h(_h.<<Wh&6]!O554D"i*rnsqWgnT+=2=_fFi?uE9''4L9cZV%?M"`f^/,KA1Jo&D40)H@mFs8Di;TV:=F^Db'7-S0]%K=>_X?hX&KJh*f`KNrPb8N8]UVEU<Vgon-C-%t(8Zm"'!g=>=#gRG0t:p#mDK\W)U0BUMRmb5R[-UoJ'"*jA=L'V^^Sl=WD-5Q,7XOr$-pj_BmaAmo!/\))J#2R8O2\j#jTe3'H@EQ-TLC4lCRQFWmI;nX\2s0s1].;Mt'tnnu'L2SqpI9t5?GG:f2!U3]8@b,\>hRYpc3t:YFYJjq(F=-r(3q\\X^i\uhU,Ba>J&h"A^\MaoBB&?(F-NMHe6gVX]?77?5`_i]('mh^ef%pP.??N+"HUMm'oU7%=PHtj#A<<<%m^sIae4a;P#?8hd7'k2r*QZIg0N`aWGkSKR?Y[IJM>@O!V`d@DfrtQs%Gi,JX6Wh3VCD"=eF]R#X>4<p\o,\+-YDm5m?Y"X3X$M*fo(&JK2WM#$W6ZR(6ZKR$9T5';`cRH>5K`UgT<:ZeJXd6i#]O&j>7]r&ePI%b[#0KAE$aPG`SA%4ZPWLE5q5AkkU`SZ#f`K>(^@87K9?/a3n@/@6TlYX!]jK9d.*>=>=,J!9(+!9<d_5DchC4/\7^MW&qaQD?Z.R;'TKYen!>hjZ%kAX]acp\ggHiNO"<6nYK74XP"K@%G$mU9_i+=W?QR(Ckb]pJEK!r[9&ONSjbjL)&:pug<0P<4t0o@S&1Xa\hCM>;F=4`'l[]Z;,M_P5-%^o,`2bqucfd%TDUeIi,Z(>dud6gj[8(F755$4a/XmbZ5a5.e::2`8^Js(hPB.,'<8PaI7hj+inKO+:2F%<R"tN4WQN2Qe\orV?eL2,_chD>pRb>M*l^k3@0S5VE)S[A1"n&9:b[\M;.mgNium?R_`7@t1/J%f^fuhf`f6$"54(<FYrp@[/99<34c^q!lCMF1>O,Q9V"[1YqD\cL#Am.ECo5H#$T`U6eB'>X^%REXgeWmd:\2pK)ROEFV6__?6S$lh@rrP8&:qcCa5/(34&6e+F:cmL$H&_%lFRrba)ZSC!F7]c'LsgaA.HndW+G]=d3[9*WRh2r4,<p@.Z8E^Tb^OgDHlMR<#%M"l'`Q9/VZGdZ%_bBj!^1]+2@<GflKjrUt`+m^DmNfA?3DceK<LK!T=e]U_2=_N^WI&QL03A$[SloY+$])MQ8UrrrA$1b.%UZbgV#pl@LYcm)cd?+qfTE"*b+]mK])jr'5pam:j4?[CG0$R#VhgNVR*pbSAbdgT4pV*,4/)A2ZC5/st9%0[caSN<SN#<7QgV?7#V:X2:@\&q-O1pAZjN:ZtQ6>6<6;GTZR/bN>;rd4]JeD`M2Qb0\Y=N^2P;lUa,o,,d;Yhm?YWXmKHs58*FmtK^SQ4slhCb)Z1==g,a6pP7F-B%)OF8^9>V-:%E[A3U&gn?N9LC,,^13Y%7=+V5bdmL8ni@RMXJC:C_8(.S/6BF;mA]/:,0rl)hm1k@.?e7Q0)%ch_]DKY:^p0T:4fG![C^?6gE>?J[(h^'oGFJEL0RH2=i_=+GX+Tu^Fj;5%(Y6c68%lT#iC05jdItU+9/=?V0=tr2X_jN.RJSW0)POK>'<Ba=VS^2KE^2rb"Qtg]VRY^n*K4F+ZG^t%n\fQa[\m%Q;hPNmqERi\a&G#+ZC_3;&AAqe4sFgiSR430K5D*!TUH:qMi5fL>7:PkH`-b2ES>\QhAE4]/]V^Ss2FKc.kMrBobVZ_?+XK?6W0i+^2H*<W#X2i790ls-Ao2EXUaG]`YF\nOC[pbup>_B<Msd9+JKb]`YVP\SBp[&9>0`,mb_rfOa^3S[S\*Kkg5#;-<Uk=<7Q2KHhkcKTN5?aW\.(Z[FbSs.^:!df<R8S+Fd4@&V9SljaeOf<%fCX_.'N8*=k@_epu%Rd"c7Qi,jeO.L^oAJ\udN@QUY\5-R'qeW/RGQ$6:H=\E%pe3nV,%8`Q.!A3<b,Y>j3D%X7B84#6Q+sJAEsn^**W!>NQG&I6T\S2HZtMa_`m5r7r8G^sh0Ok/+mC/ZNt*=7%1'LJY*,<@goU+n]'ugIHL+OQ'70?^:hmj)KNpr:%_:r6g1+O3/T*&[%c1.fMQ!ZU2OeDl0M%WnUm&]MghE#%YFB\:o3Cg1e-#D;E,KitON[[Z:EFrN`T7@/a$HF\#`nn)eRGX3[)\9O-X:\CdP`__Hc_$b38JC#B@/nE20_Z:):lp=YX#I-OlN2Y#ZdVcdDjg5?FDPQG!Z%W[pWOJNX<1?S2Y%#Q7eog&FE'XY1u+sBlV\LT>)j+lTSu[hS8qk?f,C!Bgj*^+QR:J8s2PZ>]`/V]?t2&$4?Yk8\h_aA^WJ)#U*7]P!Z>9XfEb+;TZ>cm-D1D!rtCELQ12Rl^c_K+Sm78*@^'8^&6<:ZE]&>#u3Y^9:pYgI8Pba.m$_Oj]O_id4RtqOi5-^\?N(FoBe0krjA21_pt_D:q2;$Nf*W2?-7E8lV1YQ`%TM_h[`\hf+pH>*Z+e/q"=I!/Mk^9D>UA<17rtnYFEB2?VC=UQu1N\k+#=2;^KjYY47kDmb;YFLrZ18rW>#-A3CS?SN<0mOK7Im;28DR@["[BgAaATYIQ*o+\p=sA5BMs.(P08+]f7T+d]r'pZN>'(S.c(\i[3`c\met<V#b<:RDtDTgPItL"mX!?;"&ie%Oc5?@=o`!CQ;4qf6fC:WpL3g9Z"=bo=ZG7b`._p(_V%6fdK=fW;G\8lj*JoTFAba<+3H,^7T_<lpPd0"n4LDdu7*2#WMV'3r+&7Iak]:3E#oc`b?]X9t+-Ek1(#it<5U=7JG(OK7Im8SH5ZOBLkm%&52VH\Si>4377,+!1FP`>@7Q&OOQ=KXd-0,Fn1:iV\nVQXW!`:Isk3\K/qrV_$a*Y'4L`0BJ5B2QIUR'QTDs$7+GFN2Psd/QTcYFC6+@j?>/uEp9Q6?,[qp)W8O%4c;6g>J#^!UQA\eh_]^oQsOR_ifCtElHG3"if=QJGF13NReCD?ji4^[ig816^E_>VZm5%nHJu>hq_*;ln]0AoDPS^10>@dQl:t)+9Ud@(\)VPtR8iDQLoF*DaOU,l+<`]1T&P(s+]lieU(+Ye%kCp6A"[O=UAq!Yc'^`T"P)X:5fcqnRitiMD`n;Z$L9:Pa3<mH)B40fi;_a7]CY3W`^Jl.3HXrPhTP4cV_)2=\mjo<Ei59`-Y`/4=RuKp>(1)ZdaK_4SDLLsld14<Yb4(U:-Q73U\n9:VqTjC/Uhu#9t2a[A,i'CdNFp3de:)iO[AJuJ$)DBA$Gh[4SXrnX)CKh>0(!aMRG=@eRbABhp]0hrZHF[R9EVE]R$u\O@q^[YFp<5Ppq<L,hTBML)hrubRXC.)Ha!,('!X2Cg]a.'7WuC^H]@qLLM.'Qo=Us<U(iZgr7sU5hnK._O=&D9Kq!`DnUKZ[FHZSq6sl.kE$iq<?LPgmnu"cj<EZ"\Os4Pf?5sNnuA.5;eZ+fB957X.OkDrI>)EoKFi/=@4UCG%KIkX^O<^H26cQB"*=6KB9`\thV>b-A'V0o;55@Ag]@pCcPP?4>>P:X,E@n-I+>MY,U94Z/Kp&!HRnbWU:meJG4EH@nP$P^Rs,iB$FuZ*8s^<6adIM?K#.Pj?0b<1pJ#p-hgSI0jlQno*HUf95;72rK]j<&';eQ`+#POBX/hjHTNP>8f`13_5#Vr+5)"LbEe'H\<drp&rZ8m4]3!L16#q[:rHLY&^1fg@R<,n==T%r(=.0G:g#%#GW!KEZAaTJf\(ke>'\bT_]%@?DJ##6OYNXdiJ1=9_(#]V8]C4[O@H/`ROPB`Xkm?Ci8,")>g:=i!n8sc!']UC'#mR*/X%1kL\Ho`LY#:`4=*Snm[3Gu2F7G1KMeh4cd:4Au9K>:T:9pd1/?-tikTd%Pb?+nXd+sgFW=VD!,$GAbr9Lh_SUB"i4Sq`Whf?b&WW^A;*fs>_fe^&uF6p;:;;h_:'V6*Vs"5_UN2=L89O]ZS?>`l7*Z]_0;.6<X>H\WK[Vbt$:Nj_8@H"Z\KT6aeQ^HotUqX4IoEcpmM0$+.LC1R(+a9d7;OD6^RsP],M=05Le'MLr@.Vpl0B=&HkPUMJDHo1#*97e$qUK2]L`0'%RiQt3?-"=L*`fk?*[B<DmH+fRJ:XE#B:`5?k1med3<?iQ"-24\A^C):'h_>dqNZX/9?A,.@p2"^<Y,Y,!JdXX<(Y3RIN`-&4ArfRmZlcIarHTg!S"IJc7h?9V"BF^m2\H@TS1r!EqfV-m>(2Saf.Q9KCIe\MuHCiEq-Iq*SULAo*([[Z,]V_#e:5O>-=%`QJ@_#+p7QL!nG17@I*=!M(sMKbIM`RH%jdj=!&pXZ85.qom->R#\d@PIVan0;MU3#aAmn)a;&el-Kk'm-)[=sqPa-LC8IbqfU'nnRH[LkDn@]@CfHbhAe0ApCX,c;A@EtX]DIU*'sW1.f&c67_HSUa#<PnOk,;eaLN66nGkCQ.'o*++hTPtq&rrTum_LbfUs/fe6!2L)?>b<]L5$3XISA;?Vgn3+=c(T'PB<ab]5mEj$*@9V8mOFVA9D)]:W\g#L"qof#'NHTk/K\R'CFNAflj(.#DR7OZi%8==U#BHqu!FEG+FK1O$<4)DedT5]WgbOah/\F[t!nYeS//(cY@6!IN*u@=AZ86A#9oD]qfSpAUfEH]5N1WD[L%CG;7/+F$F-g]9H[R[Z0GrlnP(Z4/*kJ"g).YS+7JtV>).C+nZ%Vr9_(<pYE19@`A5J@[:$fo#kC@cZS?Il(kD'P>@/[.t%tOocW=1'6:LQdu#]#hl]W'X7T69OA#84X/M-'>d_WfHP#eo#^*fAmd-`5IpVb,mAE]C*]Zi%e7Cje,.>:onh`"E,314?(il*arQ`.#Q_*V1n^^<B6W6HXadSK-h$8X;</Pe.*!qPDT[4-`cXgaS$A0r+f+&C6\P!)$JW`eC2KrQkY!6`V_-o[uKQ0j%%QX*BZ"'Oc4!"kcm5!B0&kT+VFuRRk!'3lr-'s<O6c,YL;TPb:/ib6U.bdbF/nMd71#a$S#pfP@4>H!afC,U::%St'GNVCn2:=r+?-O-aX)*5.gP)Njd@iqFX/T9C"l!&Hi;EYlqmkJb(8c?BmL^)qGH8,)DfNg\>#"T>iDaGQZRpO4>nFOYr6hX\1qM.Y]f$<>C-/cVE8sQYa>;5ZmoACVH(&IscV$Lsl7Jj-1:qG\?Lb5_Hc"RMo6(uBo[S2.d4CVII3M"CcY,'WjJj/>q+"+1(@GU4>>`eTDLD1OOlaARVOGG/d+CuXhVGZs>(8k0qts/JUlUluGuBTgrO-os[Y,S>4%s"j*e+)P2e`eTVB<Qr1CL%m17KV:)\YfT`8:j2$CT.l>e]k%#UVcIach`(DsuS3]7"`9>>)?5eC[,#?Gm$Y$fA9RS"G\@A%HWnFSV*KVVYceC%2dHHSf^Dh=.??L!J0=\7R8ehqqLKWrWhDriSa]N/BknY&393e\1ha8ipi[/s@t'^oCtDNG3B'=ECAn&Wa$hOB;;N;tg%8ge0;)/G]%tV'\D^^*,qoj?`cin\Wc\pYT8uH.CV-PEMJ:HL"%G;j3GkAm#Z9/,G[fF+"I%Q):Ug0=`hsI5gKJb)V3%k0_Z?ohoBN15MMZb[U)#D&Y5=1qin@FiuH\3a98a)pd!p-K^V,3T=US[Va6ah19t>s#PW*>5E4r^OH,F@iF,#L8*Dk5P*:?lj#k[WZa;Oj4WWNOgAYkYUFR*-dA0$_HHdV>?mK\k7L$E4*t#&oljT(OeX+0,4hm;M-Q&'bt7Jp)CPGm&ejEO8gN<LduA7D#P,p<I0.M,[^eS4&X+Q\Yf!Bn<`i2G?.,6/`r4p=FR;[<h%:d>#UH#jm)n[-W^X6qQ$?ob"KF)@#e>h[mM4(I"C>DSd1LY2K`h6.'c#29iom-c='%=%O*WM)/'dLdQ2.gna(_EQc7-TIZ#2bdRWe*mEFXX]%h$tB(#hr5NUMAK-VQ3Om-`]$XmLG67<6J?,jpMf,.%chjOW*_B5B)oD5Ze]+nsC%8nVc,+PQ,rq8cTVh,#\HIU1e([4B`$(rH<V,,]a$e*F=)50OD=<3M>M'N&5#^pMC=)rd'U%rUg4\f^b2J,pg1f:smOiN`g*b84'kN)0GeHV],g&#da>IPJ1YF=Rs0+KioFb,*+T<SGp+WTiU8iSb!DO*=fd1JL@sB!eNX`-UUUk]uE*=8IbBfE]KEXR7+g#P-m!S=X,]H0L^2i1unV'ok,'OK3-;[@t%kg[O1B-uN/2EgJCBeb3(61Nig6I2]FLA?&q/GZA:deE9oo-M",!K@tHGp)bVZP97%G$JL,RriANA/Od`\"M%Ma?'Ld2DIe3Oo]:/3O[E4+R&BHY8R4+D.Mh':Nu/aS/EC\=Lq5M"^0*X8k(t>_>h+0iPVGHraRp/&m7.b%aV@U(OB_YXUYsEg=#UKpZH$[W?G67\T`nlj#$LDS;CO)sAG[sj%gXV4qFUZ&^3oI)^,b%pih'#1d_InpI_sk`K1"C@ESK3X1W9R0c;A]>YZV2[Va`F\$$R887VL29c])G%QhY5uHr_`(!_Pc"eLfk5IN(J&,33p1)KMfNo:d0L7.H@C=]sqE?gR(nh"r>9e`buW8)8pSMEmf'Zor9Y^X'OdNbUic\Vg1]?$];Kp?qmkY<04!kfJmLgeP.lbNCVsFZfq`#5[1kIP\.E&3c'N.AQp:?(nBJnnfJ?PI9`PL6*pW"sN_\d>.-p5<%;95LunuX6fO0_YunTOaHoc'[Ph6RA$5e63#f00rFdGHVMA_Hk4WMa),'^nqf[f?S8uHY?c.&[RIooZS0ki!f[X`UR;-[`U>k]#!-aOo[c.a[AD.<^r7F_%cIShbtU)R2Rs"*/ut;KBE]R?lI_7]N2@nf?1*l0WGR-m$ra&Df-TMKf+@s,f;/Ypk$pc8?E&kFT4G-8U@5>+$g,/DF?L$EE^@"W<=ShK>r$QfCHkP&D&9?`GJKkJ3ul4+@h(1*QfRSW6\^>22QJ]%Y':k<gsW*m,kTVtQdqk/s5Us,D(e7\m3:U@m`s'tb3GMeikKJM\qFW05Q9k71LVoJLM99,rpm%>SR:$b5)U)`'\[GRRHL14c+"suTIQN!Rn^5ZM`qB6g\9B#4.8eJ+Vu;'8?\,uRl*?[lM3%/m-)d+e78L4<`i2GNP/`J4KnAIUhb9AaAiZ?A>>n.chmT`Gjq9<I-5$qM7;g`c5l(a+c/J^0^2u#k0HVbQ<*jl"b*P[SGGr+#eAr/&98^/RKa12`e:637Y#lDe0=6r5-jksEg>@(F`lRjq^_NaWT>a=E0>ATp[&dhp'ntpAc,Z9VCuZLcHH2AmI[o(<h,<!N8$In\@dP;iNHVdpnP0rfLH0?n2L>u(=PtC$R$<0=%J[>bF_]Dm_>NF+-uhE(M@)R#92?5\Er.)m([I@F,h_f)jl2IM]Pc<8jUN%>1]pAN>WDoBW\b\,@($4>c[:EH-%^H:sXmC*na]P>QH@Ad8ehf0C1<?ZnHr#L6*pW2Y6!)B;Sb-9t:*_ro>:!^n+#0BO;oa61ZLsENrSlC!0,/In811bT&*306*0u8\7!rqZXZ_-YfM^hFRK%)+hA_8$RO*6H^-A$m<R0mE$$L)c!)$#e:5O6Me.OLAKejnGI%O;S(Q%C_5/O+5D2jrdr6fd<edH.ip6p>S++89B3V6Bb&gBgVu8!<(4CknFQVI]&#XQ:h-C7V6+73a8$UT]"K9JMPj1i4gZl_+CdlZG2&?954u_h3Jk^B,gDo03D@L/dmQq@mmi(saX7FV*4jkM,D:6@-]F+P[VjXGN<>S?iC,AWX["M+,;rJa$<o/BMP7E0mpEgZNG9srB>:*tl>2MpV0b#h;A4t%00=UY"hf@r0<aK[$b8H1k,MI^1l#=)VZK0*(",&%cCLLOiVD#hgfI+MJ-@Tp]tn%%W5d1Oa9@]$V`aD5*_^qLF.cuWde0+MCXH;%nX;W^9X*d/--[HrCW&HE5=_3.7*$*=Ruj+\Oh.R=(]KgY.@m#WkKQR^Hg41.SXor:[GR&r-InEqr0!1C&fuF5gW%IjZP)(!KQQJ;-`t"CS<-D1g6+ntCkV_k;c!GQa!)i^,*t(">7s[re!)nf@nULND$ebNPf+cf43]Z]:$jHW0\B.U!0Wc7p@=B/jH+-g]JcThM%%(up`;]A("0"l13XHR4tN4Ikqf1aaPQ,]mGE?6+Dqm;r^B/Rk@k44cl0W1nb)5B^K-tj<afsC_Dg_BJ,12!@D/GO5+Q>\).ai+1r/\IAW$0/YmhjX4DdD;0kk)*<F@O3VGB'F:H!/_f_3RX2m0hpG&N2dIRC9Gl7\.mH1+[qM@T(!=nH@LW6p_[I0'g/<nce6-tC>h+?edl]'u6X*+A7a8,g4Hk0)r:\&+(BEK#&Sf`#&R9/1P_h6\eee5pj1a\oS6fq(oq#>P(T]1OdiH.5'M3i%I7nr[gmIf":po_J78i<-WG1b%JeV;U"g4G6r_*F!RQh0Ibc].`R"-VfU\Ep2f^bmL)sUl[s(I@WdMZ,))uj4/00br#qR(Mk<t]OB$J+(8a,e4r:o,YPa"r&+m3\u&ZsX?R?TPh5-tq`rp,+1u5>>h$N;f;!tRKn&pRTYX6`C(0JSGO\U6>&4m>Y"2-(%qRqM0JJh'iUg[I5t,h4q=LTB^AUlOce-Tn6Z-2cp[YWTm**mCT:>.IV0R@*ocFktSD7@o7PGWnrqE-(**B`$E^K24mb%lb/V`%TB!gApnh@hqi']_;bWgG,ZQF+l6(IrWDf<444G>/p>".4,aPWl:8,bT;CYCDST0c0\\NTcl<`Wljnt@@O=&t<@+ZCjDOQm>48MJ;?HH!6BEH;GK^N],gr'Bt2TEr)9K<a0ol)r_M`_=a\n7TGH8+>X,(OH*Rcit-H7So,?_I)V"\Z4B<-pi\",34WX=i_oOr/iDdaK`-.JdR.NT[8[6dhUb)/S\W9pZ%&*1T?EGm(TiK;<k+-O^28k>H/U@E`\DGEeAaWEr0"h)R>k(i-lVTh"gqrNG>L'9NQKPNN#tXgUA8WL4h"&b\LREe^X9c;GD"p+]hMH\O&?3>hV+Km')TEGNfe9[(&`h-6qT'ODkQ&2(R"Q>*iq&`DftLp:nl@4g7_?k"1t0M#E1`b*(I7_N[7_P^]Jh/*#<:o;,nghS".)k-07MRFWmWG5r4q`HtW`jY=P1E`$m&OmG_ros8Z/M]=a!p%br?b3gZ$]*c*NSP>`V)A;'O0)dZG[;TG'cht37cS%*8nrkW2rTcjXBE$c227^/9V3raCJ_7btcnb?V',9cW1u>oo;qn3'`Rn5b=igHC:i8BtR1OBNEeSTD\bgSVD!._)W@Q0".qKn`)'KftIJR(72)UDr<-6bOE5eFZUo[cp2gcobC`e"@Qh5mdf[5hYDc*kHQ]SQW]jYb==*LC>4<W]_ah@V8heHY;;>QHs-b+%Wr0As-<TBX[hf]lXKnoWiWWmL,p0uTLfN1B9)j'uZ9.]lp7=648*MR%J5"+);P^DYkKN%>A#k]<,&+_<AHMY,BR]pf'f;pq^o1)ae67tU-OH(K.oD/k#342<ihh;[d(G$79<"(Mknpgr"[L<,Dh&eEcC8r6Grq2pq\b)(pQjV=%G3\-5p3TbUcDCJ[DL<;d\e@C_XYZqP3ihu6#1k]egpXhBaf2afC6dLY/@u8"6=4NCs0Fqf-U2WNF0O3X#,Ff24e)"E_O6RX<Q]dGqGP+(BZ9tUR,DmjVU;@S*Kg+l>`Xe,3'0OL?+'ThC"lU63%5J,/jc_&NZiV/k_F)">7bg@Nlr5G\FcLW*]e,r8)IeT?Y7NkiQ')J@jigR<;!NQ@j'TLRJa7)0FeIXe*Bd[I)r.T+U'#j'N-k*<0+4h.<G4hQI[..VO4)q?h[r>pR?Sc>d@FdE!%&J+3AX'',3!TK\Y;8D^-ZFf08Qj;nKK,k'sc%g@>.=:YJYLa<,>*F&'T@)b5\O7Q7uF*>Ys[Io4K$X<*%"KNoZ@6git-*-1jM0ATn3o(1^rggl(Ci2)tsmc!FaU"YIB^LT92@-IQ9D2]P<\ld"c@kQ`\[:j*U+!%L1Q]%Bf\)aj9m;i3]jQ=ap_F:DB0d.hgn9/S/JX4"n\&DY\!Cq'1[GHdI\(2KT%Ha-&AY*/[+d^ihm/l\3*]Q-\WTg>Fo7A&F40qo'H$A[MZ%UZAG,:.gC0%=o=dMJ+J)@D%npa%r+QOa-$L-6,]:^1">^#1U@iq!8_;]f&+li\T4sjWGInl6j@QX\g\Hgs(UWQe`+:['VE]iW<i!?6jgTlgLIsA"R+1a9L0'%%p$+YHD)T`J!a%&'Y?.Bj:g$]ID^"L%21-/aq91pnH#m^30Q?gNUNiiRjo*S?2[3?dgf(IX#BP&l,fCj=/A*^>P[#X-?3qdkWRNG+O;Xre.Zun\s/7e^3rGKaS!>U6KMi]HbA&qre.+J>nm@f0M`,@Ct0)QL7s#\*I\*=]W6Hl$L!n!TTDa%5[\4c+lgki(]7YF[#ih@oU>k+kg85$*^g8QH@Ag_`\?HH7nlLOE@V^+Eg^V][WEZ+at?SX#cYb@,#YU)NVTV:?9k9fZSSpfUC_:Z"iZs0Y'a<eJ]A#Zoacr(tG0:s2=%AfH@LHTI6E3mL2.P.N3p[@/uHQXIY^Nll%I4Z6Y(EljNa,irskO&/rAf?iPZnb*XM\'nj0(-#@C29Bps#W46<.((')fSTD;,T\BMb]GiQn,h&H8SoFln@QJU\9X5@W^7a4*/CJh*Wg\BlV[Sh3UTjN\h,HMI'*2"7LA8[EMY$4ll0H9VC8paU,Gq[T]tBP:">Q=F0i5J_X0O+$G,IWNPYN^YIMKk[lkV0][tUAu2;jfs\XcaG1<!`Xd-oKV(u8*lG"YZZ!Y^Z1"bs+K<MCni3n`_X=RcZkCi*r/Hf=1PB!V*CK8P9`LOSqDP(SBlD4k)'];.[tDl7oWj7QTD;oV6'W05A=%UeKTq:aYo;,"O[O-F/=-r9N4%u*o1nSX.4o3T+h*q:m\Q8mDYSkk@ODTG=$rtTb,mh]+;`H8J#.KGj3e=`Xs/K;(_=:@MbhH"Ilhp'Q^i]p1KEsl`qY?]ODR('pEf]^`q4r/lSG9QmpE\)7]J1$(@=7:?E]IfqGhZFRXNJ!i5pX=iKqoO'k8p-oe1`d]V_QuK851S\4BdfI*f@`>^R^dk>M^S/jc_&NZg>Dp^Z\jD*=r3mY0p26HJP5"HPC34Sm\4@k"HZaGq8qin3Fo"s&21YV>5N\jerk+-a=c+4u"`oNcdh9[Q$jDV(XtVrZE/K\jK@lL$simG+@<9<JFrVn/,cI*[h2j2ORs.gF#DE,L+<K_CZBp.MRN^+q=9I1ABYRl-b>X#Y[d\b$21[JW_8nUdKjQ"3+;?_W5!m7N(;@[YnBE,?+':&^NU>5mOs'm9K.0tl=JF6:Z6I2*Rk5gDF:RRqL]1pB2@GMbXJT-QYJdRC.HQhb]d=0FU\VVGKi3^CbTa;*,XjIW6=g8krh@G(?V]'e`=>KG>D-6c7`-6qSp=QSX%,:R7O5bTaKqSonAa(oIM<AHZ"h[7-ESM$eQaRb+87kuESiYnkhp(DD,KdcRG1R%:qhL6^.2Q]]p'tSO_I-9&g"1YdF3N]mZJ[]7ERC8I93dV.COeMNJIQROfg[J;@-`KlLa"a?B;/N^m+ZK@YnU`"bQ#6*4DJhc%>jq=;a?7&Han-\g5<WnBG&5;X:qfOqo#o9nYEdaK%L=3o+]h4TODA[bU3u!mr:,XjV\N@G/eE%b'Of;HhJ:#F5q3WPPB0eXD9%tKa"r'3!`]t1=P-f$B."ci`WD=Fr^/<mY-`%E-MqdccZt!<@R#=s<:-Ta0<#k1c!JaTDeX')BSqdq5^'[5I\V?<KRC48^S$YSgR=;X6cf5DS)VrX'CKiXm?/P@le"D^<*QIqaCPm>T1qPj0X#;Ns4td=7u,u3^LSDW6Eun@`_Reh@BGdYEK0`lN#@G7iqR%Zo=[5kjmP$]KTM+R/#6[r,t9[L,H@TPd7i5'D\-qN'YZ?2@riFcGT"CJX&0:W=pHMVm*!fNV[$N4Qdd9FhI/X?P#S7GL2?c<?/q$9G3Xp;<n'-Z8:O"Rg7Rt4;YPCc]Hu/jc::CcolUd'd*HAM4QK%=;=Z4$*ch'8ii/@Pp[>aCEI#dWLA\^YCl]L7X]DGJQbDAGg6*cQ4QUK!1VDbi#>:\<EYVqEj.6Q^b`k2apRPN,3mimTagN<fR]'=O>Rij^0nk^IO=R,FaBc4?%-7rJGUZ0G?D,dTa@5pA%RR=NC[$)"%&<,EVKlTV/>@OBh&+dES$5e&@Fm2)0V!q>hM=7X'oPl04T=$k1n*R_&B/pAa(lZ804hn[&99l,n1-&g:h5dIPh3G<UE983qiKR,MMf!5VDhDL>cGdL&+7+^H0MnqgjM8iWOAAqnZZH\%1Q2F<;sm]L3X#`[bY<,m`NKH4)[2:?RoaQD#:WHWunlB`'loKT1+ZCo<DdLRslc)GF:]Xmh0]V5+1($g^j-=*^VJGY)k7ZQTlQ*@e.()OlF55I9O;=c)+iJ73LYP4Gs=(md2shH<:TRC_t&7[!"?f1_N>3:gRIJZY(Se=E8`dRWEt\8g@p'lEmrLe)ntJT'i.'DL?Q`rk[0<^R;f7mu:ca>Arcl(ARI>(S-Qf0_;g<K8\iai_k5(;YKHjDJA+V2<2G"1b;Xb(OQj^\D_P*FF9>nEXNr$n&juUg*Q1@OsPMe#^4&3_q-.rSZn<>9@VQPGqh/rBoTZ=Q:ZSrJNi-50<3bcBCaq&ZgKPjEibY)s3EMgQZ;8>X\NY<\tm<KUi*V;532_*`k/!\_@H:O[;K!5QqnT,MW$aApjg<IE@l"aQmlIY:%aH&I@fd#X:47G/.R2R'VZ1[&TWTtD973,o#X>i>-@6bo)H4&HOL6Uf<.8igl>tbjn/31'oRnl89+5,SiJrBlc.0DR/B%ThN1p/E4Wq&OW33TG@0t0]h:pJ3k.+]`f(StaK*S)%[qV;$cPg.K]Z:dHYhOK86AeOo$:=XD/.)MgmiH!^#JfY9U)`,=WJlN++4taN1K!]l1dkr0$=R3(%8p2mk8^_=0j4HE:n]YoKhW2+D6"Mk3StYI+_<:-*CT,UM^P([UQi;!^]J+aQ6m.EJ[m6C<<TVW,lU3S2MHO$EI/=U%dV!oP<jg_1TYl+lopBk)-bgq67P^#7Ln&mclI&):uZ/`7Xe@_L,q+9\d;[>3&Q74D$SEpEZ4YZ3%0(oWd9I^[(SLEj?Mf\Ho`4qM&87c[!W3/&52.7ZWG*Tc)EfJsaWla=ubFY?^`;+h&]S/,$T`?*K7BB0PRRVe>AT"1^FY?@M_*f(bXW-?cSlDS2/(lJK@[9UZsUR>W5oif*55Wfo5C]k=t1kT'!REO5g%L0R$iSOl&8M4jWc&kjJ3g,gFqs0fnPe.ChjX1O93T5Y7pRS[;*-&5`7r&D9:N1II_jJ)HJVAL(,hlKt+QL2@7@1"&E6>g3t`J`0jo"Ts'SmQpsVKp-P?79Y`Y/,LB1-6l=]D[KLh,sBFS^"fR.f!%QUF#;C/8BjnMK`DrGI.$XIXp"/5K?3p[^%R$HV]WrCA2Am_9'[bg6FDs=2VmAk*>irle>>Q'Hn89=%KNVbMPul&rUEF['EbO<JO`&3aZWL;V0b!BlTDi?]1$#EEp_6:4HY%?hi,2EFOmqJ(I>bcl^T.lWQ^\Q&#(rN#iXH0^m#_9Apih1=MjnD_e8aUpu;!Q^$1.JcB<%NK7+`:08RJ4XJ*2*&TcTra@?6j=W<ZpQKLp#eP9/$LkSTH.s&?\V1PE?$cg$nJsArQodB$>0-C1QMt@Co4O[eSXK1Xn'o6.5OZ;`9hmq-4>++1eAhLXWKWBm9+AF=4u\L0lF.D[r=ojR`7br=g0>MRs&JtNeEgq698%mI*$0?[p5EM-oV"Xh?GBO;V3OcbCl&M6YJqd9J<5\N/#6CjjY!A%ohACq/=Wdrbk(c2]._95'5Npf^?EDG#t9a7UmO(;E/KF4gHdYS1l\4L3F(fXC;'#^dsq2Adl4Y);_RJ7Zh\[+FcX+M*FS64LrRFV>&HO2-97dHF@\7?-`+3F$iAdVRM;6U:fuIua.=%smB+'Bq!uB?hg_g=)B*LTh>Nr6ejqCsVOIj>gK_OVl]RGY.D*#oTNr`R*cfjT@mFje+]kmhSj!&%cQef_LW'X!f`*A1EHAublBY\`?.DS;9CD\$?eksA8B<@J=)fn5rj$i!;Y9*!*\X2`q3\MQ^ONCYhVMOB01]crmA*q,28src\l"T.*]PQInl3IXC1q9!3J&k+0ZEh)%3?/UR/Za]ZS;p5OdbPlYBX"3G'E!?G3S.1lXm]oXjhrmONY?DoBk9C].-NL5H4>V6EZF<h3EhIUGlk9&cQ2r5Q2hVj$t&<*#9fET#P%2f<%Y\orfefjE;*342)'2f='!50&Cd9m^mamL5tkB'c'ack9&["812fGb*=MoVe&G"I8IiLmFcl;P(,U`%oPqFg9`IWrCh4]7k&MK^*rq")1$5XS7JN=Ie)O$g%j:nk`B632DVdZf<1?0b7:)5I604i5H1`u/uob:B61kt$;K($NN8ErU7BDnba)L3?15hCpbSBnEC.mMQP'Ocj(Hf6gB;+=B$HRs+1:@RYHa<Zk45pKjS0LZ#d#U/r9n=t5HuAuq:[`e*8qjQ1M<4km0dchNl[F5m]UHJj`enX0p1bVKoO.6L,J->lmUVK"\WRRAbTX-?3+k0]R59Z[p2VWeE6#)aT">NCfERH,K7scqN2P6NL-+%^-dX0%j,e-kjW(LLP6]IBa:K@M]_=?mg-Hjp(27[C;(-g`[d^^oC-sWV2J5UChtu"M(LmgA7$+YnG(B9p8p%O2d?I"Le.+<)'kj7#e:rVWE+.QmXogs]$='bldq_TrMl-OXg[ZQH8B>;U4JeY8GdhP?L@4;H)o-NK=/Z+;Y]/ss*3Is&6o#)$^rk%ER0Z'UuHe_qo//>T0I_%-asp*3kg%>dFe6Se&V<oDeeatIZnrdf_</HJ#u>4id'=9laikHdhns6iG>M6dQWQOO^$RriSd`P'@U<WSfnsF9^f]H]=2F:?"%5/Y?lT:Hna0#5_su<3Dn'>-TU6'(/t\\'\XPR\4pr,l0iiW\sRCY(HUN_DUm1adOrMY47?P@d^F`bc&:j=9@Ifl$nO#[_AU_Sgg9=HQl,jbY+!0i0=jD5lYAU=7u!OWIl1DMJ(%2f,^tG=\XN+^nJ*Ccj?uT.O7P6Z2(R-ZGfnW1#6='7-QsgdprE`T%W(ik1=oW+fiEL$'dk`s$I/^"/">,<?&0&4L$TuD&i%Gp96_)j=)Wg%$U5lr#:b/uC&OKA#4;M@o><(+;_>u1`U@OoG>48U*!ATG8$IMl"\b7>fCe?,YIFi3hs%fbN.e[eoWoi2L4r8[a-G@71M$uZ$AoB9&"`.c-Lt>5X^3omRd7MR:Y23;0"h@A$k4:C/o&UtaO-b-Hh@bel4kE],`R9TUY,)`(nm:\Um;q]`*9]3NN199Pr27IV/pifDt!IL4"j&F]:YPi-omtT-*\jV12kM4m-2t4\oLNtnj@uhOSe,/`rQ9Gmc)Em)u9<Xdn7Q.iLtZ[;Qi+#STaed'a\*\A+R+8*D"?4KrHXfRVQa;62ir+.Vr'VZSP6gT@gA6aho>kI)jjYL8M'lcHEl#Wu#f7*`dGr]%Y:hSul(=M@+K6<bD2,qYb,S>0(lU,+#p4>;&e^qu$BF-f=s,ZS,Du>'Um#i*I%\e#-IjP!cCk0"$mP%(VT7!$PFb:."Aej4%[tFDK<PoetXE-Voas3*ma,(#!T`IUm%Q>I+$'QgVT)$]@<TLecaEJ&%`($JFmD,NLmJe)a$9AmE'``i4`#E5:kL=&C?@7^T#&7\o9CKO&98Z$%pFL;P7f;Jt8tH&[Q\SInn$3O`1\5H*3haj)`]IXcmo9ptl.qg>Ao5"DiD"hG_K:s>7AEhAVEEcVbs^,Rr6F65Bse+5PUkB1-Kh<:IH="W?b"d%;o91nWKQSO$!htqS&Pl1$(?%FWR^152RDch@(qrURM86pGbXMfZW_E'K&&0BKhe\7uTZE&n^)4$aB;;?2=pC.N=\mrA8c\E&(!PUJt1*,jphX"2J\QheG6H[D36knZIpoh?.+1CRlP!tp<XA3h7Vk)gmI/iV-kKXd*YlFDk/O/r76UT?"G@)FTX@t]]Hsl[pDsmfV(UJQA2@^JqDmH^JS,9T=1ZTHX\ZP'q&9;?fT9*8T>h+`MNDOYn(Ugi#KWJ=%2CeY(eLP3BYGuB<)u2qPe9icpqW[k,1@i2_=`LnM^ej!"HlL7?].kk*-Y60[+bX+@@o4&03'LNhKZeSDR63L\G'?>9Odksbe0WOZ0<(FdftB4Y=En[7pM(tNc.*cD(lfPNR<.b(7VVZ'>:4k897LMbZ1OP3V%[@>CFBV(.ZDRr+ljCS<:k+*%G1I"g!\1kAEfgf&i\+350h;qQ>sA.6H6@AR/GdpZb=$23jXm]V=qMZ0\sWW^>Y2(A`a8,C#c`lGjl^m9;`]Sds@_d4[N1$5N@7S7f&P4oB2^BT.M5d9T4IGE6mWKIjFaQ)^qTC,]Ztee<3IXe%b!ZA'_ApldF7sjRL:JWkFktoB3:`P](UN$ieSC0:f`Pp?j"bC/i-I8[5)b5%7KERn!bAZGSnM(AU$Ia$t#&ZNlH1Sb1Me]6[+OM3_C..L<R?fh][8Nl`6iZ'3/o]B`>G5(Vcq2.9r&=m$+OUB_;=n'5H;o<Z'rYAG?DC(E8KQ)(`)+kNtfK\k2KlH137>;p0Z^$-4\.dH/8Ds;!OC4+Ya_kDK=H>br'qcqZZb.5+0-*:i80\n4A:PaG$Z;(7fdB8oTChu:8a=SmCADb;$\Jhj20J.SKg$@p0)&"^/?G69bUSklT/W%_6flkGBZ1sQjODFclLj"9EDKDh4g^bLlh3^LP'NnH0_"_tgZK^+DHW#1]7_&nJjG9G;\(/q':FU^&qlWH&]qiuWV)F!3KNo\4$G"*TAS:d!O3Frb@-d/ks$k.Uc7)>GKI]`]FqJa8&pjm@rV/6bKTq;pV%r]Sm,I@N*Kd8o%M6V=9\Hc4@WTgpI?43.];qQNOD24=[,fqrO!!X7Y[adh9g\6Y-("'QfZte0<)ZLq..9]::E&fM8J@i/)i)+.hP`d/h:llERUV'`<C]@;07Bqjo(!#B1L=.RHkdOP@+L8M.bt]j%(YOr5G>4CMVl+<KYoRgh@T?H0!Y5UFN&\1AoF29FF%1JJnmf\ddK>eAmUStPOU<hDVo8VZu/si\A&Vr&TZ.L6c^"6,7P)V?;p)hWQ!>j`IA[<.3Y.^-hm!Ipp@P'g6NrD3Z`bH_FUOA=/G*R/KPbSY5VSe\[Q'tRDorK[lY)GHCi0=^cVIB>aoh&QF1Y/g]eZnf%8XEF6=faH1%V.pnseAhXQkrE^t&PG4sE!D*'u'3m5Hsgtg^;aJk<%n4GPo6-S&(MYq4?^,K&lDmpU)an9g>dnN0G!Roam>&7<Jo8m_pqat*taHm;V'Zs/Uf&@)Ynd-BAqtte8Ki>_]:mCmcr#f'<iV#7T"[Xh.Y)kf">RNDHhaX(^3)fcM4_]],,jq*pH^-t>F^WA+2qR1hiS;mH\#!49lo*q5-mbjk$^2&W$b:]^#"kJ.'@a@2;l2uhZs@dujbg%RCWhJ(lKt=R/'eQld^7[lQ8=AR43PQt>]RG8%7-l3r*n4r9@dXhJ<8p6'N,n0g$A/!B:jMC1#;AbrOpnn\\FuTOXfTsOBtpc46.#!-,,u+_Q%L92ldXps8KR/d\ADa?YH\C+HpaL%1.CPk[WB%TK.[1KNoZ^%(X-@2_"MV8T[2:/2j,b!+1QbAg6:s+Joo"H]/QAKl&O/eN:QAjp@33>["OOU*:!!]00BeNJ83:8*'@,`Jg3-DocKA$f?5j>hBd=$+E@rohD3L=Y,8jgo2<:%J7Os;2*f_bY.fm"?BPELE"L%)B8RK*\U@Z=!P1mK4:#tS*a`j+d^C71VMfPG9mu>;uClUZk"ZD#e<HmW$m.NPB-9kCK4Hdg<i8hmAcK\]/$^*T(r)SGsYhOA(7F[+Vu;'a::QiHb-j=YMnZ3d/B*@l2?jL8%Ws=NK;2J]P.Y^NbZD#,Rn3$RrDYZqWGqhgVVg;8pRL4c8A<$jq71[;hNpG%4ug.>W&)jT=fU%;ReY$kKZhK>un)DrjdLFFa$o:4uB5Z$/*pOqM?0c=SO?!d?QqEXT)d"JrZ+A^:3nZmKo6^ol_Zr4tHHiip*H:`D'$!0(CX1_RYH#\V(Z"-22jS*m>I1<1d&Mj?>&plmdA!>iV:Z;r^h_cdp$&jQUeY[(*cQX0HHp"^UhS8-la3\O-!*EeS_'b0%<;P@Cq9j_;8E0-CZD)Kt<;)`_,XOR&#!oA47Z4l`SOB2Ti;]uA.SHe,0EVOKVV*5/'?(.5,4m`k"5*UUFDp=h!mGjEd*+A+WnZMFZlSOliJ*CDPob.4mB<MiA5`<YWo0"9<<DpI>mo31#@q+E5&Q4CN-8i9E7NH#;CPfSqZUa/0&qg^Eg^hu?HQX?mtHJ74BmVh,aBNZ#2Z9.P?25eL&A:>i8P4P]W>7bXl;<CC_liC"49g;i+>VUS?_DOX#7E?4L[ueenc^g?F2,fio<]K-li]gAUIJY1/UC_Gddan(/)B>@ZT?d0!^8+p!h/cJqhO=o8bVM[rI`:sD>go:89eaKr3W%EsF.YYI\%YGVmiqK*VBcn]o>%@B#2'HE3bBABSS_l5qQ-'GgL=)1M=>E]['%WB'(.)8-XnkB.Af\cPhRVV+dWIB`kPF?d`R#aCt&QmXQa=;Ud]]4]o^DJ%i#oR5gCE)0S<aqJ+cI1ob?H:M_?m^9;8;K@FO=u*5aG$J$rH0KNtnm6EX#U)0.<HIpkWeS6Yt#oIgHk5IsDMm1s@q98h<?oa&*gVn0HZ&7l(ug;4BnY]dug]f0"u9E%W4XGJFugf*5W0pdtB,AD&FkX^].DX2_$S#91.ot<GrAG,5MM(IJ8ks_[u(h=jR\`(PJ0BPt&<[Hh8k!N_911lPJ6h:\W5&.a<`*ZT*NHBrY.eLokluQ0ZQfiA)(<Ja.BgV6+D@UlCdVfA[NYY^2"R\_@BjUKJE`lBalTHYCh-6uA16np",5E7idC"a@AQYoReER`(SK7,#6<'I78SJI@#e<:q)02jE4S^sRC7I21RJ6g28QiY"'M5/oD$<8/j%5%Y;#-J8c1*i49]Ys:5PaEpePHcKq=q4DJ@\Mb\<1LIWP'uSn'-R;#p)9`"l1%Q,`E8$(:=qf7Vq!!h5.aPTCYjI%6d/1;lAe(Douj-E%O.,+9/X=jYq8KS0VO,bm\GV/h80K`;E,lq]g.YLRU`!]>Y:$(4Lo55ukUq<`_5+HH)C$:!(N5\FSTE'Hrgac7F,4#aV_[RtpYp#`b38AtBQo=7:!%+]jKcE$b&H5L-W7lZKK@DtboWIpTcA[JA=VbVD@;o:>BkFm0pNDq?:Yeti!@+Vu;'W4djh<qNZoDZ,2&\ZN>G"B1pgSeRBPrBf318'#g8o9au?l90:Kh\XJYGh0N,a)-=Mc$@jY8a[]E@SSFd=23b8p,E-UQn!4?#C1&^OdB,hIsi*^mZalu31GUE[L=,gG$rYXOsa9dV!EFU*XfO5Mg\`(EiZ?N9>/%!04^AP/4/B_>TQIj!Cq(<1Jb\fHc/4T<_erFX)$V.UK.i6C-Of8ZJg2snO1l-n2iWmn@!&%gK\I\.'<CCSUJCZ>'kh>%NI\cl?rG,Mac8u9.l.Y4VuD1RKn5F4.gn2d%Ja?qBf3DP1Iksj`>#]=e$DM+%UEP`;GME]3iqASJThDnlor:\Ho`4p)e>.$TNVNYH.OAi,c7)^l[^M;/Uk8++sCBmH#'9I(A+DBSC1V#e:ElpX2^nOeZ79YpG<8W$=4ZRQ5a<=.?n7CTCa%&dd.Wgj6;J9@cr%:+AL'[!XqHI.Mm)@I)O890ZA1nk#a'_I\jekWercqXKVr7JDWRhF$JP9thltW%6Z[BhTh(Wf/#58\5_S-(=f0cX4d#Ko>q(EFOZf(B!CEJ(>4,+q>^-;Gj,`"[4=2"lH+K<IkbU0f'Y60%5tVIh5r";E!,^+18dq@0i;_2(g2[M#Tg#mko6.Cn$387@C*m,8".i?,TLj+e``0W9F-4b/o/&If&8$G5QCff0el%Gs2!,0)dXQ/ipbE\l%pUPA&qQPM4M.1b5'Hd`p'bK'?T4>L(A4dBr1K]t<2\,dPXdSKr9e[S</,6b>sSa(s)3`3u,'Dc,KfNDGoFGA>:0?-H&\Epji.2JUQum(@Zp:-V?;Y)E+H>"i)6.S[TV!]a#I.%EC[G/:iP5NeU8F8ebk5F!iWV^JQPI\o`\nSRpLf[.!N>mAu$2>3rIbWe,4/'_rb<G4Tfn@<Z"q6j"c'.1Y>@>AX&.,oi2`T'\$34\fYRM<)<F4TI>(W$skbZ<YgOq0bl;-3KT2DT3rX@,r\'n:9B2*,dHNf+Di]XRFUqfcE<nqn*1EfiSP0SiYscgE:>IjLAh'h_:4+)su!h\TG,p@'"[/o&kH%!(E*/QYMq"6S=&Z8F/X\p7-($%'2dc'ippp[C'!7&=?pChZ1a`JuNQUW5c[?aT^Gco!?&84L%mP^PVH:89gQVG3$pk8Mm*89QbnBZcS"<-O3'F-HWkO\fHW"OS5MpWo^#=hjggaO-+SV\ZFL[S-@drY$WuOAk1]b2^fJm=')h5i8'[]])YnZM%WP9o>cnqjt<`qheW&aIu7Hd@P[^er=^<HbR5.C#`RbjF!X^rI#/_PIXrQ8?=&V"3n!)e$o.ji^3UN\B=!lCZG`fm7r)9+N7hek^n(-Nukm$T;TXslr-p%ZGi_RcTEA"LJOI]r#"N-%KOjA4>6Y\njMI1bulj#-O^n+k!]4`Z(%foJAGZDbWN.WHZi$0UK9+_[(TGN@\0u!(d+EkEbKsJMP[4B=s#p`UAr$U^@&gcgk3`INhfjA5rPmhL^Losi4b(EFOek4iti"B.7ls`%cf6LEm!,eSnup'iQ$9=%sHt?$,Rt%c(&c_p$sp"cc@1m/$\ASD?mo,IOAhgaR@^V2<RM)CrFDN_*c,^01@dm&%<]la%"=EPI+b8HAMUg.ljfi^\b%h$N0htlX>62FSPfORkj0P8fTW6Eq$;Pj3lb9qt:OA4>^m6`0dBZ;ZH^mb159K,YTYsBM][/2'*K5VC"Mg\CZ!%PM5'\dDd98GJ>9kS+c4ce:1lILf"aoa%+IJRnQ_^hiSj\):-H3[^Rb.5f`K,Wo;B[kN"8"Fi4"YF-=S)M^!A#INB[![@7#7f^ND3I%NSSIc]#,#PMCtN.6*Pmb?H=gEcq%!/,*&^HF4G5cSZU&UF@GY&E-`\Rg0nWM4`d-d8$)Js>NV$&]RpOF%-+n%OR\OeA&4<`8Rodb\<?;q@k-ol%ughRp"jG22t#6UT>W2mmHF0sIXVjX,6L7q+.IZ/3/OD@$'9p)ESigCLSpZ4:D(>5)QHa8lel)`aY8bGsI5W?kUG9rC)U!0pPbe?S`Uo$>;[8$9i3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!#7hoRBaKD#4~>endstream
-endobj
-7 0 obj
-<<
-/BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 546 /Length 203 
-  /Subtype /Image /Type /XObject /Width 1271
->>
-stream
-Gb"0;!=]#/!5bE.WG`:P'EA+5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!'^\^[af!~>endstream
-endobj
-8 0 obj
-<<
-/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 137 /Length 18297 /Subtype /Image 
-  /Type /XObject /Width 150
->>
-stream
-s4IA0!"_al8O`[\!<E1.!+5d,s8E!T7VQ[M+Eqj?FED)3+E_a>DJ((^Ea`p#ATAo&Gp#UqCh.*p+B*2jFE_/6AKXZ?6SADn!(-_e!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E6$gAjSA!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%s1eUH#QT\]Q3..3!!3`5!tbS6_uLkZ!!*6(!<E3%!<<*"z!!*-'"9eu7#RLhGs24oF&-)b4!s8T-!sJi2"98E&I/sBO!!El;&g8tq"qsjB#9n.%14bR]#U;[@_%fkqn0Bf!Ee4T)()If*)C6^X-n-W&2)[BQ3BBMq77Kd<8P2o\<E<1'=^#<GAS,RgBkh^2F`qtRH$Y*rKnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A'`Q#s>ai`&\eCE.%f\,!;ioB+]k3(smlLFH:o_%qPq"add_uLk[!!<6&!<E3%!<E3$z!!*-'"9eu7#RLhGs24oF&HDk5!X&W.":#)5"98H(G5qXF!tbY>+Ya065u@kqE>'NOJHurVOeK%r#pV6(n.fDQd0^X71uTbN(Dn#.-7:2j.Q'+C3&s#e6q'R884cEP<)lt#=BSg;A7]@cBPD4&FEMbNG^4UeK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^rf%8R-g>_/RjlYail0@j2o_%qPq"addg&MN`!<<05!tbMt!<2sGU5Aq!U5Aq!U5Aq!c9M7qrr=P3r)Ma[%eq9d]$H:^?*3@?)t;1/[/6t0>h=,!fJMtK9@I^OC$r/XDf2A.hVJNI7X("u'gNV]8/;'+IbWcLEgMPD0rsSg!W@k&&#T7l2P4il](jh9[Crs:K3_!Y(p85uiHQ7]:W1hhar3[u[<_Cm13?WqZF8<NVTAH$N/KO=CJ'UkKp?9YHWm`RhB%_:_Wo^8jc;9k/7[!d=euk.IPu2<AU,"*>;F17LH:d,Uoc]Ngil_2Vp.;/-Jp@QBfS,Hric("9]NlJ+&9P`LJuoYlFfqVTTA5"5>(qU0e\Dkn5M(9-qD9]WUDrhqcJ5JM.DoTg;h#j[C=%j+t23A/#IP0gHr1B4=CqD9,rqu/<`0;R1G2MGP8NEXL-a4f"<O18,gm$H6mb6d*R4eGlIb@bfWRL,bE=Z]16a7R#Xp/%&i".hc'$B13AcHk1C"u)V,M<@k1K:\jtM(l7VN!C,]2H]ao[dMYV:kiCbTC.`!uVqck[%8iP<nJlSV8m+oFhO7cTX*f$ppJ#7Pk'Xdp`?aK5!(T76>)t4MGZ%L%<'.j,CpeDZo,k)>a/ItXbe?0H01Ko%L:"+4a!$&mq!!no-QWhq05a`]g\N'okeGfN#GlIc[@t/+JgWJDJn7#(?')[5;%s+[s+RrJ(0/fm)<KHP!^&loD>?Z9d9S);2aTON5`Ng%nFK9Jm0?`O+';&g"VhqH@36W@+4AH&ZW2[e]o@B`d`iV3^HsF"0]"F6?^7-D.S;TM0Yk4sA#E!59d)UJo18uVfa\$;cSOm/RQ^T\@G)"''bnQ%Z!.B.QOcJ5kj1fnDq'55mMC>,!MC>,!MC>,!MC>,!MC>,!U7,&5-^n(8N]#\]`%%c?/Bl-8<",'<i!bgg94+!7n6&!0K2DN3IpbL#*]3BRl*0]UN:d!3KcUT4M28dKf=iHOHp@S5A?'j]c@r0$hWlng\KBI-=U7DUl+pdXj7/LA%1@N!Ag36RPA9>S[7J3'Y0]pbI?Y[s*16Y8/AD@Ha&dG\KYuBZ:V0T*b'^88;WNH$RTlE,hu"8ErX,"O+55?+c\R'`?\CTi\[;='^)$$YH7l/MA]2qC`P3C,;k%W6<n3ag\LtNFTP@;.BmL8U+d1.Ak18]rShf\JOFBNFcTeak`F%>Wa5?BiIMD#^f6<NaI(K=XMYp&IhaO=842=#n[$!;r]NaDjIcUHs8("D8M9aeXYN=MQVV9j2aKa?O,W@XjYhHuPjmC!E'Gg6,QKIW+k!5%uVjE]rM;:I-\`B&Ca"57qfgkB\rr<2u]O)"j=8#=l\!t8R?AkZT9B*/BV=>J@-rXLC8&UH'l&b4W+2J>3f[tr-IN@[^&D<OcP']i=8pgMDaHkl-a7NCjXp]lf=r9@Q.7)FX3C]i6:.d^rQg5Lbl1.H[G<1uaA"p#1]c&VEV["&g.d!.ZB:`Vu@pU4bBpn*CauBg1/#?9gUPd*$C"K>:bMcc(S9"P6#D^4VELECR8oG5k_cEa^@^0$:08TW.BA_@rp3$.EiY]<mn8$sBX8@,=@^<3iWVfB`L#Lj,r$p.f'V,k<n5$m653)"=3`Wi.Mbb#]gK0R#ktG[\nS9l`qs.,K(]4u&_Ra5_BHIA[49M@t'?i:_L#3/b)e_.\d)MJ.Y*7hX-<m3E<"5#./^(@,`LdQgV&tGA$2ahnJ&=/c&GUD,I3ZW*%\4#I_eH"%`s^2?`fV4@l\.WEI=!H:1L49X/CGS4irFBK:"dT)-`2,Q:e+l!7=I[_j!rTa'<(DBEH1/Y<QlpoX^7fAU\8Z+$n`Vp-pnN#N%)^oY'jk7X+u:0p1]'>c[8=D9WK7=%W<rWaC-i?K.`[h(E*uf8or7`04<4]Z+60/.bL'o9A*0qiu!7^>5nTCY8-A)Q_#2lp[Fs:#K>G2kBhVm_k.^Y%esKRFu's@p7kmAoXtdSg*OsiEa$dcJk4r+=>nTmn\:*6@:+aR'BN#HJ$@5+ifAXTZqlH7(@``*q`JW-._O<54@?)^nf-Z&p^?V$na(BM,K13D]XhI$4A-P.AHnd'lCecka7cM0;LZXc!"2#*rr<D`=EoTnZI-=#Deh$(,9B%tXQ#:GdI..Og!].fd3R7!P0?ti::c^bA7fM&R6ntZP+RV]%=D[T8)d$prZ-6t(Xfs#i8%OGH]'m*0]?.eoSmoa\5JJ@(Uj>DB%1WENKrLHg0`*XYkm2sc=gesF25=tfXc'#`8K,<Qo`T<=/gkCk=62@DXa["$<W+aM5Mj\rr<2^bVtB-$YD@*REfk\Nqb[X>#]Hcb^[%sh(%p%7u+('f,p5hOMe'I_UPEC`F[]D64`AL1i(NH\_lmG+8@9cZhn>32=VL!^Q(%WL&4aF">T+h37I?UQVZ,DA)[;F%[1hk/$1Sd3+]>Gi70Ds[%A0!C7?bs=B=Nd,JI9RrPYo!RmQYXh[P$!Ia2<i;?$V+U`(>2r!2aV_8!>NmA1kj5M2Y!Vo(0EP$<0H_S6q1Rl$!NDY6pOCJPl*Pg%j9K;;hs,@+VK)?/-fY$nuP\%B(g/\TXg>X9j$<_-h^AVro!nudqQ&&!?D(1kuLH%Nun.=GP4O7nc^<A%rmn[)jEj)EMEDgI&$8m%T?S,NU862T0-IpmS7`H8W%L+mn<3q!Xe;Pbi[M=S["HmI4:7Tc$Dnj=4JX[a+m@oO6h`SdaqKqVhA-_cJKjc@d*MC>,!MC>,!MC>,!MC>,!^R9$83Vqn6Iq8$$rmid@9tC4rj-&r^I&?2diQmM.N(h$I)(*%Y.H$SG*0a]X9f;^Prr<5frL<JPg(4/hoC2n^!5fQbl5hAK*N\LT)g&]=FI%9Q[*K'5l5&52L<e3_%sN:XK/HAK/YQ.+r6hbgD'C++U#A+&/2%Xs[AukcS8m'=.D&b9X=I,"D<R=nX\S8jUO1g"1Zs"kKksNok;7/JF/phqGt&/8P,7O2:+FAt\5Jl\:AhQ,f_uY9@h/oNpuh@brKfW$H0#ts6f[@HX,T_#^h@XCSL;Dq:9gkadXoQ9C0Gb>c'%2/cSFHar29K<^LIcTc/ESo13e^TN`"e3MOlZp\&D,S>[.7VRU6nVNr&bU7t@oJ-e[iK5Q-p[B+ql_Xl;c9T_&.oT*)`Q+2[K+Ig/(c9.\8%nE])C_nR7!)gN>\T1nahM_pE3;RS-05EgGlg.uQHA9kWT9-/&l^XZuUVQ8[XF5c;5[@[Y0_5VZL=R_Z4ohPs1(='5?hY;9o!)'`2d;GYG5ZqTh9pXL$OC6/2(k>0[msJ*#+qr./q3;ljX%#h?dB//AWCiY'8Z0k2Q0g1o/ln`iq2^7)$oTIL="pU%9+dH,'2K&IDg=i2UP,Hnl8EDW!*@#u8nk9Bg<(DX1Qn)E72/ha-gh(D4'N_FT?E]&I6ZYsT+:4(orj"_'^VrqMXsl,>OZ7:1+([,QG>ecBX9cCrSpAR?U.dj],ICm$98$:hZ6:r"6lEVQ2"M^!!TCm9q(iei.lqpE,Tk0&9sDWD\rIG*M/au_.amPW?K\=VSAQZRqYohhFP`sKHHoH8^rcMJ`OH*FX&bePGRX,l>nPG8O^8Xe98R@Lj^K2@&s&i`K(t\]nJSX&V?RW3dHB7>U2#OV.A;Mh-.0i9(&6BX$ie&_g`-KNtm%%rMKQ3?/bG5+9'KV(ZpGf<d]/$iR`jWi`C^b@RXj85/UOmb=`eqIT"p%+l,rfO75($qbm2Jn>B+52h,OJHoph/c2Qk\heS_!Q4dF8h8tqLPNkn&2>j1t_Oh&[q!7J/^)tHBQ?k`qnB^*bL9[a(??5<(hBDB3UZ!J`UC="h5OacX,]T,I+h&u4EXRA(*ZrfScnnHE7(39bqF6r_V8-(t09`<f6YRDD$/<"""=PX236rI+cQ(pfopdWM$=)lKRAZg=C/U<&[rnI1.8u^>2VNRX4q$S@9,B2ab],N#5H:g^1;[F(q5ihtGV!/E6WY!t(s:<!6et\+:UMYCCsbZdn>Gqe;+20!;+20!;+20!;+2X>*Cq8M"TU,Qe8-]/>78\3;7;)N:Xj6YZ+dQTM.X6.[(;6i\@.tF"XSnJ?/h//"^N"2JHUVr?gTZHH@EtcZ5/LFXF,Ejh;H$Oa_I</_eX]Y^DYp#ZoZ%$pd7GT6c:pIaJ9N1/O(L$faF+L_V^;:n8dE>%/3q$m(N9JHrBaA,H6_unTTn#]^Y';F#8l7H#7pjUM1Y?^Nj_;$H[X7Th7nl!0mfCbIDaYbrKEfbAe2khO'b%Qs;\[T/+>oVhTi4NB1sX]$]=Y_T]NN,g+oAj)O^"=5j"h,s5KW\#$gBKn^qK^$O9?dTX$,=$I7Gi3<4]n4\<GI_st]23/Z#-UZC+&(u0dQF2(=p_UjUNH5>VFmW(PD`(=G>4eaufu7_i`3OVkmc["Arg+gCn.RsK7Xn_D!8rGnn5\oa7H#m0I`$ZB2i/a*p"]Z*_r*2.r'@:WH<.eS9d,fELAId@GDN=XSJ#!XpfHiA*`fD?b9!!fa`1`'&puA&p\+C^!.rRHg0P<[?c-_Jp/T^dhh?M<Z+JF;]K+qhfpBYrSYao"FoYl2>k,Hj,FN[&ifP,g;bMNs==-=TBHWB[:X*`8rX!TE!!Nq`U0G5_fcT6B+t&7]AY6lhC%i4^N$X(#I/0G,3MMWO8E<L._^_E)7o2_B[4l^/INF5@`L-"dQ9KquW++t&GWN7scBKOl(l:9&N+5a>?I'9SSE1+B5C+!-S:;E:,8$2\'@$;N!LqZ`lRIq/%hY,fBMk:7<-#*rK2cJD;O#q:6F<_i6;8gF.)d:md&sMP<`T?6'fcC.#WWlF#cCbpPQ(Ucg%bOG!!T4o/`R@r^BB%"J(]b>(WClTf@l7GiFh\aN?a'Ln\;tY(2]/RX&%aHF$)W/dBlP8<LUg0ZC=^5M'7XSLM2[^V*C!T'6S5H*t:>.j8BY,rZq9(W9?.Jo3-At_Qau$NETPEW3*MFA%0%4-nU``GBYle[kAc/19s1j0%9U0AWp0<EO>4.(P'PQGt[GtN#"%">#cg7>r[189mp2`7cRXj.nQ^42NdkP(PqRgEf=%;Mo0-EI2iCt\;YPM<X0B,ke`#[f;e&^UIMq5@SqflS8biN<Lr(`8^4cK7.D(LoPY-$g:"cU/OmoQd.CN]NC-XpFUP/8D(MdU&Z*"/ib8aq;9'Rf=LN:)"*">@!$D4@[b'mm0C:Rcb?aY/KTaC6D$gs8Nr[j/&W1,GFQqn&NE110OpQ9u60Hb9E[YU<jL7ogm=/n9gKXB)rM&JhnCNV@bPqQt?Ou)/@h6KC*A^gHQ=m\K"3!<eTc@"spFs$[bOR3+eG0u(jcKqC$N6IlC[a^,rr<Z'cP-4nn3;^m,PYnEQJUoQ5k+cLV*SnqUCG.X[sHVrW//o.Y_-iee!!Y5=+'heGb@BPpP68-GslFXnISg8GHu4bKu2-#7gR6da[W;0m,_9G\Z[hu)!IOFDtlQ:Y8K%N-K[<q"m!1cljaY_B1Ab,SS,<LQl+kg1o2[DYumM'_bV4A/B_$cocZZ)*F^`_M*emh@3J3/5It4k8RL/_;tt;#lWa/9isdH=4@AX)/YMUP]]>Q_56L0<o%RJB&Q%&BCR;>&F<Pd0NLdJIL#+9=g\VpsS\G]Mi22"/^Pcs%YoaOli<>\,$Zm;*N-$(I_mYkNYVAF\(9$qDU<!p5Y00Jk().)]<Pbl9[,9SUp4(X.?VU=AnCHYUL0_MGd9#ESE%E9HNKYTajWEINftBN&(QPVT`b"qf2(MD/#D]K2dtE/'E/^&B7T"js*FgNFq465R^[$@Y0n(/4f*Q".3Q#*)_qBbX0#Ju6'i-g3TjJ[rXXR;jj(m%eateZU<[+@)>&]+l:)%BOhNXN(MCZ[nrLj,q_1n<9kJOXKJ?a@66C!StnZj[s@X8ReP'^i<>1,Slp]JGjXhTTJRJ^,;QRclV_jX?$X4l=?+.)@rf!]F,D&M->\=Rs';3top)i'V,(#uBoer&AAV)W2>g2VbNZb;RUT;,?1np8`;BP*ZM,'=i(iJ5J3Yqhi8nVhG>XA#G_=sVhY8hmuFY0fq&M]sr+7V,IpMO%.1+RL_j#EB*3L7_TiRWh?t=4AXmM?Xbl70$070@rn%]=p2TGFrK!8X@rI+$T,OOF4:e`K^l`N'\t:=O`ni3Zr#VSfb=nho%_nl'!3GrrBF`L]7?`^Or^,Ro'+bKO8$Sh7(CR&8A,1\[T3@[tr#KO5T>>X*'RC@doDCW9Z?^H%mCQ86l@*U6i)9c)&?14SHW_,su`ilQ+1Va?c*u)&u-jIIq!-"0.Lo0jg2,\&AmQ,R(*,0)S)sO,UiZ08b3*kW4HtVd4*<!#5D\p`%600[R31^%1iU2VRcBRb"NbTENb]Lq1rU`RF1UmNF<]S3C%@l"-mfq>H%'\u+L7n2MiUlVlD,05XIm)O9#k1TO!?N3+MIntXIRUqN"$.em`cV_i=L`_-V5H<nP_j\DpHCH4]rBt6_'E_9&uS(\jsn3i=khC-nO;t/u.B8cciCi>4Dhh9O-AN,4RH1AMc)ZHc]!jgd/PN!3BU$I/SU<'h;VW1EGaL87O(*W?WJc>]R#k?c8%DIto48oPYnO(4jBj8ZPoDBlJ%C$Js5UEnKP0:cB'R8Q)@>%1CD_5M<EQmLMO4Gt9T,U"-hi0ZdV(]UpM>mPa^*IB`(7NiLeR.9ZM0qJG/Mf_bl5,c3b42hHMi2?W-\<3]JdDQKj,)Fi<B.nkXnu6"bF\hu7qpp(N5)_1_B4J\._jE+f5,h!j8T+8*Z=IMYB?U9F`h10X)DFJ?eX;YVos?sH#"GK+bf>9DBW(7'T,)KVK\?VWpoJ31ORL\#BmG6+jMfeLBsieVh*$1=:@>=bH$S8/m.\ICILhoH^jN.'B:5Sfft:[%M6H5Pspf(IgfD<<oh_Mbk(aE3io5,boUQT%Sa>=[ZA_prO"k.)p91YfRIF3[>YEfN]DJOj,#.C&Qs^2:Hc@s36'>2!h%_-869bhH,d8hEIYemFSU"X!"@$r2XICu4F[n>CH,:9B%ZMtP\pR+WS5OWV*b;7oJcaj4o59SrNe_#J&C;*JBq"rCIA$^['ZJ#-njp;Y2;[GB]$5dm,tB`=!T=4<^.Du&TMk:*!!7](9Ym"S9g^t,GfJEfnD!//X?bF^mKQkY2J<G4LUQ*LrH:7\RsDWgX,)@;Nl'W:RU#dF6>#tIDf&\rrA&Q`W":?MNd,ZR&Z<I;K?`OK;WLcdns$)MJ:%8.t2\V5O_N7gG6oC(W=(pSt?b1E5cfJe+cSq%[ul3KJFg:8MAa':RhUa,Z%=[0EH*b]G^_L"W,atL9e8X-c.n1k*9I]W@Vs@TSY!j]-=tpOeVnnD6G/tnpoX0C\6XPfDIekSN[Ke_n*jOYN[ucM/BX@*rabhZ+*/Q)Cq:;-%\Q.kN.fd*gefspHm98#fM%LR:1R`OB$48mB0Ga7j(M>nkM",?cbEGiMVYqNEWab(WW%i$<NG(BP./WOmrnoN2#bX`gpgPCX\2b<E8-@75aMgrC_lcI*3su24AM;5DeSLPBd!h%ZO)BdoB<O"UR1>hL>%HnNJTjZsU]=)qm\B=7F0^iK=kc4\nl$28,ko]c9o,_Mb[O&FN[m40kXjSe#0&H2@a>Xtb"WDh?gS[K).0/)^M:+_E_r`e3@S2k1sA=a)bh,::"J(&lfLn4l1YCV&,O]Nb8%I`m$RM"D]_o1IWA9j?U9_u2AmdWK=SRN(Q%7`oR?/"92dBpGF&JnX25.28S8XLPFFiFe!3@aEag[JPH+5!Ja5nT"1)Z#:5nnE7gf:PoX@RXp^U*DJ@2:@)(7fs[76k&lJP@XWs=*./b:'E+Rd38lD1M]N7GAdU8NQ!Pa*kDXXlV^/+b$Eh*/Ni@e3W21=s`Y@Ysa[mr(d[/`^#N4H`ef-j4Q]/%n<eVE1en%_E(Gr(&3'-^FpGocpgJWWe9:&GEB)!,@!!Ku9+)C@Y_eh3&!qEonVC(?p!(G]4U@ZAq)*#WWc6f=UrrE$))<#hbp8+V`"H;),&T`AI5,g1%r`Ui+2;Qa,9;a2bac,\"g!+rWXFA7*!4CDhW;%Ps:Djc0>*L1dcRn6`WuQc"JSh6&#iK4PYDcE[!5Tt2Aj'HN:Q?JBp_Vm"&q97JnG`KH]LR2*?%%p2:FCi@T3KeRC-YWXks5u9/cc>eY&MZroWlEcUPIhWpd&1L7:*G6jut,$YnCn$3RPXn_`DL<nPGcfI35ggkG8XjqBOq_`tat\^Ct&2;Om!uiI;3u;s'.Sb-BUs2'kuRa]*@s\>J>d[^f`g&+,GX!!M3K:9eTnIt9fg?fKCmVRO()9(9%#J(aPm=4XO.XO16jrn"pSrgBTc>KLj-*#JI;Z"n#Y*`'-KdA3tU4r3q2p4rFBD5QW&cbfWBp3,qacb*pT/(F4k!#9lYRa6>/OXJU?3@t.>n?_(`&mN)Tib;F">mK%8'9A?i!WN-'?2jnV9mC\9nE5B&!,18C4q4_hJK!3UrYP)HK_1UqI%GE'h@Zur)h7tW/g`gp(3Wpr?_Q?bIPq$Apt;H3i]i(q!#.O)nM<Lq@kO\;Y7p.!,-t.VQ/;@K`9%g==]m'Yb0%lL),5Rb6S%0o2_H>40ib5Rjg:uFZCG6.JPJu*;QZ<e`a^LhVNbLMe1U,I&$eqh54G#,(]-#+D@+0k]!YTrc?P*LSn=2Nrm-hiH#F5_k$JoG<iSXrS75mdGh5jE*jH=pePs)"WYCZILuWKp5%a*#*3glMe<Eg9LX')To526D^\fjm>nRJmU4<S!U4=AtrrA*qO8@forekOk!%.^GNY%oZiUO\DO8_dB`Lls<L]2$)M#FCQA1kXWg>i1B:&b3fg:tbYj+$un%upShp0'X3J*Oo@*IbQX6Yd:*=g`W@#s1&Kqs6u>f2TKGf_g6<YMeIlVmjlU\nQr:gJ9?3G.Y/bn,7BY_6'Z:n8n<*_P7&1`QIt$SZ&Oo4rs.okQ(V_ldt;Ar#F(>IrE)V.V"F$q^m%lmV("(rr@tHnM`EQEM!11SUQWL_6)Vc7mCbGq^Gk_5P6#d"b(Ik!5ZnZ!:kWS$pX+0Hn53sX#K$TG3**%FL,'#l?N&P[on.]cMQL#f;n?.ad[e%XNJ<E-SJgSNm)V;d:p%I9bkF7r=d)[^PR)K*<X3**i7jJHW694oXtc$dVa2U@oAjAP';Yu9[hq0]tK[SMFgKBcq>aQ)nt..8F-1Xn8%%(J@*kX4Ep:ei]i%%=XT6ZC>LQ3#E$/KVDZ;fGuis%ehi:(:HhZANY=VN,R%3o$N#b\#n*eIq@EK<U\7L7HpOdsH7"QJGgF=Wl8l)UI;,SC<`#ED4u/*D]YD4I)`qSEhC.E0jZq9WBV`6g5MP)n'OUQjrK+/]!+QPn)U%+N`BT!h+L9RI(AQ'Cd/6$CMgQu5%9m!*:8+E<>53!]6IK]=Dsul>J$u/WQIb'De=-aV0'&<8i+Z9W\:][D3AtZ=AX%5X\G0R-:/e,aVC.snWJP^0N%*_d;Jenr>En'@(q1ipO-@Y0>7[7c)4"i81kl43#'F>m<?[->l7.$LiZdJFR$q#"bhK"XKUeTt@eDs;rrC]pp@/$T5@K%tRNIMQ%X?T/:CBIfg0AmKiD&a<4T5KRer$d]g[s;h8!qP>VeS$B#$W['9M8YdcK/GXSnh>lg0aKSrLU_^pdb%@p`8kEj1g-jP"uC3;t+seiuJkH+P^2UCDLmE[@PD<)k/:F93[&l'p^3N<96XG6`*7d)jB@`7jId6#F!4g;p"3r-O.?5rrE$(Kk%+8J&*d&ARh_HZ[^pS>?B:B?pTuEebi@JC)SY.k9&pYl.6^>DFYa@-Jt.)o%keVQmcA5m*_FSFKr-k]HpaC;2"HrV*_"_e;R@,8sJES^M>.?aYsZ0X6Vl!bd!>NA$X7BC=L)?#96Gt:!.FK<Y_<"q`.6idY1fFhMbedS.sD0dJj1KT=3fXTA(miWFCu&IQi-P-Zho4rr@qBpQA(h3<85*\]oUnrrDP(&uaC]!,NuM<%VtVV-@D_cIMG5ahSe>8]P:9Xa`@'[bq"S:[M$Z!+kWYBE"^9[J_"n_5r.W)?$d(l\E@'jl0J<pnbau*kniVa!P$(]oH@b^=V%S\g-At9u$AiJ,,IE?\M2%g@(q6FOJaFqFCPc"m,aaJq\IDp+c=Wi;We4^BO:5r&sS*j5'F8V.mY!Yor<Q"7VV-DehPMY%ap#/5b_:Md=;tkgr_Pl";MOh'?i"0U;VD(-`FVho+H,f0!L%:Ddl0`Z<e)?1BS)]LAr.XD"Hcc[2YVg84`2TU'k9SjaYpC\nS@!/$k-BE%sf?7GA6^b=CX_ceYcZf%I1(S3&EVo3AO'U!t@7;TV1\o$#LY?o$^G?lua;73p_mr->VI6ERr>tU#p)'?n[LAXQFGXKCf(Q3YmX'Y!R,k0BgVec8Qf/2_SX5,:.d]T=Ye$U,d#\4TPh*Dar*F:ZRZ;c)%PfJP=>TH!H_r@n^Tfcn3ig)4';0=*iSP#$@6F>1+84#03Pa!a=e#;Dnm[DnKCdp%d&llhYV-.3qnAG3*Qb9</1P@,Z]a2l03R-&r@d5R]:7?fTZTZ(_GO0bT<r<lb>?L[,q_rn5n.(>Ak425V`*NVtf1*6W$=0ef2/PMt6VGmj<:=h*h:aom8PiE;YPTZEa$!)hJbW%"T@oFJ4tuIr`P3L>cbo_pn@$*i4_jjd^U9D3^5=qSmq'sQ_/Z15p8L6NX2h0ZFesMHejmH_Rb;4TrP&%Crr<9MIaXf%d<*,0rm@>D4raELd&j$sb>n'9R%(p`1Y(h(;.c.kZ";Ft)ldXn._3KDDhkE,OaqS*6S\O]rr@XqHtNBYJjb(=5IC-<n`Sh#_d+qRBC0uBphRhAoDCc&D$PaVelQ10dQMANdWDTTl;%QXT3]q<qg5AbXCs#N]N.(RVtRX_O"sr*RILK.QXFh%38qs/V]$;@/65t\AiY&tUF9"9eJbg.[0Sca8ogIO-oc8$e)l[9B+Eu_Si[,SNPqiV7p:hQKZpED6S_W9-r.P-CJq2OFlsJ\=N6l[P+%].c):LAGUH)61`ltt;a^'Z]mJb@G=M)aMkt2q-e)Y7MZ3[p>.1!!g0/5Pjn)SN>M6u>X'S.VrQKGH6#;`\,/F[b"c[hsC9V(O"!$6Z7i:mYY(%ZkYNM6)G:@7p8lBh).e8h"m$3`*aeY**8L:Y?(DN*CQ.eeTgMPUo/%;R&>J4AA6Ad1e0VXFQ!Xl4,p:1,&XqQ<K[]f7Dptu)O-,\bmrK`M&?i%">7pkQuFoMF_f,s\&DuCI%r_>Zt,`$heptqKK?hh;V(:qS>rb<7*q"rlr[JK'?$+r`OALIK'K%_u0o(NgN1\(JF(9QqD*EJH3(TU2!6OL#t>$k'22a=JF!;JF`r^c5>>Q4\7/)f[jURiU3c9M(aTDhX\iJ7B#c\6lAB)GB,d@^1k[Rf<6n*O3he^+.EYD8OuG6.^D'^(8_/@f->lX-0sn8h/irP(N5(6UNS!/t(MY70]or^q+Ic>Z>7S7gFuW34pVr_Abm])>P]<pP76Aa7k'pX7X+oWcH+J'"b6r388/IS"$j#2A]?VgYYtVt7l_@M'iR=)o$"[u+n_G38odXjQ<TlbmJ]NcBW3aXsbQ29hu9<tOH40C<XomNV6-/<O8Z*79TI7eK1_"X#N-Jbi+@!!IYVe$W!H.>R8TVeR"@3gG]VNP%lm2HOm&hV1f)nDhMdTUOSGQ5K`rM'@cfKlgC$14h`<J)KD&fW.N+iQoE6gC*!'Ke2l.T82%'GQZs1d'UE34)''_YM?1'CW%-QZAp5"d5C.uR3g)Bb-5XM8%ClcYI2Dj*Zm#o%'q+\LN&Pl6.MlmF,Er_3RjlpNCnSUVse1k78MVfF%(++dln]O_t]b>LU0,7%>[o:>?t1.K8hm4eYK1nQ!2P7Uu<[i<f:p=h4YaMk?OOTo=+`""Q]N<m_<[ig1/%8"2EeSd!Q4p`FCibHt.N%?AQ6[WH^d"\[OWNS)Bi!@i\LdF2KCkN6sqgff[uinhODTV#LEfT8.jqn@-9<!VfUP[t41@>mJ4F#LIRr$i"L,ZA_4fVWc_kS/+!uYf<=c/9!qD^r%m=lGQd";>_"#dGln5oA\rNmu<qK[:o4$)Z2Pa-&7=6=[(8D\%FW&[e!#="E#,P03PT+o]u:.+eY@8;^?@grrAspm!\b.GRsMerLNp-r."Kk3\H]XI23c]91EX_k.gE#M(O7enHXd@A@@e7LJlNB.-J"01?U'j8qj%*)#ea=Sf9N[fk)RPPk(Zs:))___-sUN9:g90O1t,uXJs?\gea7qX]bKJKijkMd`:=G_*^%a[451A??_7BVR]\`hn/5)hqCOMhWKki4V@[/^UE%tSkn`Nrr?X!ib/7d\$c/QJ&/49neqD15O4*AcfO.irc15?aW_h8:[LseYl[*QHqXZ"MPM?h8T/p,62(0,oPOU.#-jG1BD01Lb4rF?=e1K^<UhL?+Ri,fit_67<uK&0X%C0"4:Y'6EKX,l3HA/;>?@O_7tb_34]1@$hIE-jS6OFEBmg\um<*nWp<W^FM>mPZ)YbKQ$2A;pQ\W:/GRf4\qL?Nb!#")^B>ct:ZA22hRLb/(p4[m$ibQ4\;c^0Qj0L[FG1N*Vj4gH5,aU2PE3mE]rrA7+rrDO\chJbMr"Oo^\bMTi(4:&2pd_N&5dmZM^B86)IFXpMX3*Qh/N'_c4u3gdrZ%BaG00CT!du9;:FLJsIWPMhK(XT/rrBO+`;]hk6X9SdFKYr*Ht<!aVKc$-nBZ^Y^P8eflM`((EMD^F>[D0,pk-B@B"jR*93/R5]t<eNLX)Z5G+W>?6J"e%3/mk;bO1Xsl[BDs@F__j>?^N_M=e>b-nk5Yh*])Kon;j,M'@uB#qWIi,Y8]N_7Tiek)HSNnMjm1B[t2n36[G>/)[aZ;lMlj>THpUE:T7T.4d))0<!U=)B>uGe0."icI8&B?U;X.9j3R&Nksn+4[U6S6?/oVVi.B64s`ZJ0pX<rNe4Tt,(.ju)je/DGNIEU!3JKT;4mV.VoKnS-`;]84soS:4Rc^s5D0rYM<oU;D;pNn)nul-RnhN,=KZ5`in"#VIm*-i%H#iNKO&:Q`i+K-,fpe489TG[pcle_,kta+cOKeDn8>:RTm4&^3o6Femg\S$FNk!OT<)^-.=Z+q&u-lYZn2uLEg"BeO[uR6_"Ku(^-6p\poC8oB\sPR1AjW:Kqdfj@f&gHHu%ao='a93ld$lZ`QasErR?otE$0EL'*L(dE_*4q*J+'VrX&8t!!N2oeba^k@IWH5r"%b79&&<"Qf:.S^+=Y1^TtJ\n>D!<0b)Vk)SLj%W:nPOWVEr!e+^hTkVhkW?!Kp`h8sB/`H?A0hU/<YbHe.3i[esX'06`DrG*2V%g,:u)Gs*`AO=&EGug^SVeT%m.SatgX5\U0<h0ZF25M?6bH\E!<cgO/KQZ=5Y>5_,SP"dQ.'I2W%b"1Ke=d/ioB@)VoTT%hj'09T*sR0,HpbZ&D6LTtnAi=N1qg=kCq%(I:PEnMEon(UITWJ^OVa4uN_`U=Q-X\R_jYe%r&*Hj$0]t+Bqoo_6IL6CUfsDl/[Wb<_V\):mF=M<=D]WuMug^%`u(t6^R$F[3ji6MUJ=g(b+)A=/NHk4-neR,5sI2U<RX]"l,HoL0S5MFnkk:1]ld+WWm@V@72;5!72/Q$F)CJZh=l<+h8XnLV`]1`4En!PNtH*@n4d,*LCsH.nNZC?!:YO69>k0L[6FfNpk&7uf7tt3S&PC-n<E3A%]srTT[IA\>@FX:?dF/#aBh(Z8UDZr-*-\SjC[-(!(ek:!$%2ifO+a*I5,)fRQnXW)/<NaT>JnTG_b8G]6trs[Jmk=Gb;ltqBaA3rr<=*Xmo3,QW*0qNMM\k9cE%_e0)><dL9gnbVKG4Jj#'m&H1\OLr<`h?OKW'_r@7+<G5?l1"99)C%F;VS0XVhUDG2PDKUHSGk3o?o%E!#ACq;;/u<rZ5K-R#N6A86(j['[(E(*">e2eX)KV(:;u9c:;RIp_euMRS3g>kp(:/eR^CR"9S,N]gbJX>[$[re7(W"u>[4dF6(8^&<)h.k_;bbX20+_jS(kU"EeF0QILi)N+Sh#4m+0dr.m3E=LM=uAdRljpF1\Mg`q=-74K?!ok!YaSEWBRj7_X.`ja+un[htXt&&$&!sgtJZ[/A<:_kW4F)G4td_e`)_R-C8Rn29WY;L3ZQ"nA!o5`\3!P[Ela_"R6nS\)T,nIKAp[`@3tbGj]h<RVa:er[D\.CEJ8e,1L.K!1Uigfe/WMl^P=i[V4)mWuptHLj@U*Cd'4k2ra"SoInn<iEts_n>c(_potUBnSdB)O6j5JF7t'hn>;n[?!MWh`1@q<7/%KjVI&+08#khCG[BcT)Y.n^9ge'E^6KZI-W7W]=R*:K$O!^KnUFi0.&Bf#S<bLDlc0YCkg?45;uQW(29B#N<M_,A5!+f"Q8GoBf#_EedX4oJa`6!-Z3n.N3`Ekt*/%abe#A&!P\(b&Mp*tLd**Yk^uB>o>rl,K!]-DY1Vm#^r=d5$Y[>8nMDc6!(&a9&IgUR'd&o6q^CFNDA+ipPo^<FkT1QSA%or-)L2O)7#dkVB*EqR,Rp4>8fu\)V)"ZH3TWRi>`ZNoii$>n#NP5^H7eh8hhh\_PAqQfBT+F+L@IScb*tWfSBq]d'h!03$G`pq(:=O.?KL]_Ic#7lE\g_K'jRXSL-Lj<Rr(1o*G^Lt1S2q.T-\XD'g$doILT#!fB-V,6Ra.VdcOS94Vb_HEb=g$GD=2%k(AXCI?,53%3dBuLfBl93!496&A)e)O)MXO9.t(LX^VaaWL[f#0?Wsf+cD./uRd`@FLUC9'D/AQW/`^>S/CQt1'K6h/mr8r!2R[S&K#LLr;RL8eW3Y\jW7A)?<Ki,^j'bMUVc$-_kc/W]lZ0fjb#K+>@0ijHN-9Qg).a5q@Hg\1o't!]+GDqaK(+u-4HfrdG`:J@CBZiP",=h='8Um\^Y78Wd%SX<R_qn/.h_&5\W>^9r"Eu-07t'EBC,B^.ot-u4mLW;2oCR@2rP:%B"$3-X`U&GB&Y?!g/Lu7?Y?^N\Ok6?.&=>aM61?H3C*c2Ns4hkZd6FZ&pVITYJYhnBO;9&4?;>dpt=Y&%sTbE<k9?(qCTtAqCL@+IqHZ:@s+kG-A^$l$H;_<+LQpYON9r1GM`fk;;lGG+0cp+Ift-_pk.QF07_n8^@ADF?N]R3C_1tjFR_SN[@Jhdo@iE64dDT*p7L=b<p'4bq^GP`o^E?^AkdgM^(Z.=rr<tO,_"*iZj!qV:E9-K_4%k"g3sWY1J@9#OSTcPr)'ZOh=uV0^XOFrd$B$j$OGh.[aT';dmlRob<&3"<P^1oUJd@LZc;!E(hbI"-ge1];-;OTPq!VC:7SB7S=K)4X&]]EV[!q!mGO1+gBGTbil'ep1<T)c1Mg%cEuTk-L<4G8'f^OX_-#LQ50'a(E&8t0SeHon@C#n5hd\*:V)j^R]EN'#@469p2hM&0i1;#,4r8"l[-N)Sp`lha7cH"L`4dblDhriYpge.0h!&k)g?lni\!gioNN.9o8CJI18a`.sQ)+!cRCj"!F7qNe&b*uZT,2qgHn;YoGDACr%8PYKnE$"Rhh7tAih%$%<`/.CBkMkQrr<O2`McKgZ<1j2(hSeB,/`bE^M3M5iRdFSnU5L4L0bG?XC"9g$h60mh@/rKm/u<A8cI&9fm)hug-WU3(Xoa:!1)KZa-Ti@*k:_c<oG6Gd^9TC6f,mpa75e>rr=-S?aB.e@;@6CIO\H*p^?)q[As#%+,7KN>Mk5X&^k4"n_(D$[&krohCEl-]<\nGSMgjK`kjo)4\H*6Y:.b#Q89+JVCb]#*a%[L2"6U#N9#\+b-Q`"9,!%p/d]GK\o')[e%^fBNVMZEK:Y:>_Y?6rV@SBUMSs!hYpVP@pjqTj,n+*=!gG0TALeq`$q3]`Y6j3$RUL4*Y+?R^`2]H)?guX=%c[8!j8T+:])Mbb4t-1r_Oh=4[@:ME2Y_(ID[Pd=0]$V:jO&(_B%#Dn>)aRkMJ'4-#i1/M"8o(<r[`:9p(-rQU\lV32oM>@575+QfR.ko2#dOdp_Ukm*WXTq45F+<e[2s5>1kO9\8@tjlp8&.mR3o>4NJn+_'E_;.Qff3hsc_T8,\HtBQ"7Q@nlotr)r"`9e=rMHu\YP^7!trj)ojK:%g4KgK7Za-D=pf*Lk;3ok>P:Z+jdgM5l$NT+ZSeHuAnQ4?qbB&*gaPm/=&6C!ci.8RiHU>flJJ`\I6Y>dj/TQQ..OFrge<g?<:;d"17l)X#g+@8JRS\Zki[2&_`k$r)*R+r.A1OcCnjV(+HP&(V@n@9H>_B3%lOq3tAEAP,2$EJsHDHuHueNWN1c]H7\r=M1OUqSk9.7-`))S*'WS/?2_5Kr7LNYo-gU[Y?,h2sTpe>dh;L=cO\q^e58CT9@+]6iIB2nE8d^^)F6SK5[OTf9r[8D5=Z-oAe..c)Y#]g5L29T!b>-3f;fbWT\MlYAPW9Coend7(B^LQ7/UsrrA`RYO+LB"5kf+h[;P$i#`cPSeKL.*H/lF*r&=rIpLU3?\`qtM!\DDdcL!^^P-d9CS=IFC9lWQ,7E=m;UWN'&o+n7]H?-K^Y@AuQ],dg*E$e_Bg2X4/*P]a]bR'>UtFtdT8<C_Ff4Ku2dgnc?<tBaFX=CIGK>le<"KA>R"&i[42cFe`QoWN_r4,'Dq\.++!,Rl5>BRR-fZk7p,XjaIM.$4\C*4/D;hksLSj>Lc_Y=K<\hab?/=)4B5)d(BJ(p>/fI(8oSTQ8e\Y4f?SKGJi+%R^`+G:8e#-R,2#X2O=u3!ASN'5?E.mLTk)?30dS5jmBDbcI=:G30*Ca0p0C8ZkQ:m!u%M4U.7OopaQ/V9$Xp1I8@VB9Aq!;<K%tgWI*Er]#Y-=2T@<']=.oD9Zf3K=r[F[7[4'/[B23t4OCT,rDf(3(hD6I?-jo[KKb"$Gi09n$_OA?j;7/9Da7oH*[\?C\4igDnHi>Far"hh[0AFR<jr[WT=&RcK4)c!_VC-+,Ea]i?+9useGb:&;QM;8tfm;(hK77)$PZVcsM[$9+*VNn$[VQ>tZ8LZ!WQ-\8?FerFOL93GbK^.Ocok+W=h&<Mg>WiG"NEQfjF=Ka[A>_`CWp%]"PH-o\bfV?.T]le3U4<f6JiuC?ES&ud5.)2kUlI0^Sf$M&?i\M9:JMEs0f9XPfD_-41-[ETEVL32p$>2XpmMsP]5Rrj,^SO'5,5+'-T*1a4b'C/J*%`^>40YmI_0\pqRIP7(k[Ck,bJC'+0KQPHfm5W?O*H(f,2R"rr<OM;UI`XUo_=(YFWGSf:`5$iBYEg3B8I\j.>&dl1kPin-D!6a&9sMY&j67BVX_g3dTPqQu]="g:DHFl!'l_Z<^YBY?!J4"onYnguJ"lO$QGo"34`GW>tjjJ,NpLbtCJegL.MLgJ?::95M3OLf]Or>k2iTm>c2k%Xn:i=s-AO(`oKEF.DinHNVb-#96^M;V+unn(mt0EJr[&o[PS]p?p].D=66?o"\X'@?.61l-o]Z&2D005QrO$94ZuYfc9Pe8`8M<H1f8:B7Wt.7GY(hYLR=\^A`P-U%5D,qmC@RbGS>_U5C?9;+20"s4I~>endstream
-endobj
-9 0 obj
-<<
-/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 115 /Length 7915 /Subtype /Image 
-  /Type /XObject /Width 436
->>
-stream
-Gb"/l:M:bMQH$>s?0G!M<hlct$$[[!1QY<a!jctanM2%r0f3#AM)Ukt@[PMu+`SXCJQXu@"e,(XBcGJWaCBs8H8=,j@h``mlu&%)H/,2#@4/@O]_V6t7V@bMXf>Ikkrn:aqL0.<WW(\aFmIU[kF?nbhSHuE@uN.^(h8LZ`Y`3E0ub&?N%r<h@uN.^(h8LZ`Y`3E0ub&?N%r>>Vi=3-*o4R1_rl4bSDS_hn]_;OY4'%#j^S[6=O1%A\b=:cs*=+O6"ejf@qL>b&@k1):1!cLQB`t]/U:9$3"!(#:)[W6)N[?t9tD^/]5[Wj.`Zk$45YLZ(Y5gI"Vm:c=U6AS8gG#'K>'*NN0se_%"2VO$k^1p9KnI\*V?S_8UdG,aQ_3\D2^2*!i&N<_WeYINF"WNBn\C`4R"sHJnAcF^Z-Xb9/<!!BVn.Z`gA+Z[DF>LLaC`_-itj*m$VmSABN(BOdTO60uiPl<)/V/TnaXLg#!("6A>Mdk5()I87Tj`U=PM7,dCCkrddI\N]89g,_A&*CGa%ur_,s"-ak0OgjU(m2TO,8@Z<+>&,Ode7SA4mO?LL34MU.MUG:oH^oeX"%TKY#geJl'ATRu,%d]g[Ld5,bNA1Z)+*2FR2X!D(.@hHZ)&cM^4;q]>KTX,2`@mn3eT(J2?asru1rel@h9@Rnjue%^9MX(uj/*](bWaB^1%nR8p=\<ZhL(j*GOOtdlqB@=BXk-6GO.'(b`k"o*9fa6L)V'NB@!/4q>)&NNZC3-o]Y;oi_Q0An[#hIH1(JE?[VC^M%cd_TDn2`caL9jVNP@JfC+1QDW/U&ktm01g01=7X>3JfX&lL-XK9)(_@$`=Slthcj+:$@iA\A#/M3Z[kK]Vc<;1V\C7=tnVEJ^)b[/*q`8[duf#$'OO5V4VCm^$PL]"qgA.>ErlK[Zf`.oF`Gj<eXf3We5dh*O^4f+A?=C,<G.j"Fk/k6q/r6;W(AhRNsT"/0^rb?A_A!ksBolX5/WlSP+7`5j6H"9a6XmEsaR$stJ7$9t-\5C>("-Nrbb*B_ff(76ZA;kdH_3IJZ$>U2EWJ.VIn?&fEbWi'NZGpf.n_Us+'BFhA&4o!".3sDj><MOLY%kFO`a*nL0b]'A2NIN3(l`CLLm0JC/LdiY.c.g`F"4^e%mqLC0H_`97tF/har"X.7<AJD.gr,W9c-Zu4tR<Akg?0XMGqh?_A`qF#k%oQZ'=.CUG6@3cooUQ\p:k@)J`2Zc)FX>Ufo9!/!G8*IG!E5eqjss='g0KXU4m]K5]IA5hM4>q2@@PDJinr:WqB+4$,O"\ZrCo`AH?-G"b(!K)B]INt:3ijia"Fp/I]3(9clEDa+-lgpqJ^4iJtF19@U[Fd/J3"Ac?U*1*.m)]_f[)"Dbuq:XqQ^f_A#6lp-/qt'd2pV1tKdatU$pY@KHk4;4`SnK`kNt364KfC1eqKH^jM_rbO4fa'XF.I^WNLi_('+FR5Va_C](V2=rIRasQh8R@Pf7k\eK1ORs@'3dRk:(#9&^ER@aik&@T@MKBK?hOOL8GfdV(Xp[NVs]hlH]6;S`*hD;9j<tp#<*[Dd>Krai9g0#%V3or&cYJD7k5i/r@M>$<$t6$sO4p>[Cb)R1omh<<#nC65pLt>u#K=OR^62'.6Nh40tO435r55_5l`jZl>j$Vb`pKk_qVq+;\la,;+.0Qr17*.rP@rorD/t8fm;q)>*i60:hn$J,_S=8Bf0O=L<&X-R^OQ0d6gHPSA'7Tb(DGHF@GAO?at)@91>X[\AaONum*pU/Mc^U1+R%;6V<7@<McFOCI<[0T6=fg8N6IN]%,_#90is+5:Dj82H0+6//poT2<R:\2r`)r7;1Z1+k8:!\Dd'G>lmHDTrELJN@;*I+tc9NK+q1n!?.A*MP[Jg).5r4.S_H>1(oO)o9PJH_nLmA"9^$cl^1o]cV$RohU(JL,T%SkC;A;O,=S:=#Tr=[8F6FRV7/mDZQFSFfH8(55VF!5t$-T^/A%$8hc?nc-)sQ5Y4R`o$/Xu@to9O@NUc]M_Zaa&"S$FMX8OL"$=/'>u'G?:Z>VGW#>Kn!\%U+W,"S&I[O(hGnUF;kb16=)k2jMpO!eXGUmS[ngV*0fSrO9c[6)fB&o?bW[NW.I11jq+hE%PU_gsVgCoA2KqQ<njOF$h+tfC8@t0C"q!mCLQ/?rg#43j,*WOhWWKW:jhDA5'O6skKC8QTS7rhMb<d\Yh;=[gNf5oSJ?#/K;d%.g.7(nt0RJP/aaSLu%mKh,Zd_p&]=K!JC_QH\W)N7-Kj*F$.Wh;b9)#NNZk7-'W<62*#6'HF:#<]@jk9XUd$sTP=Ed2Rpo7=K*Fefof5TKWRoghU),njJ$aJlRI=$^^a(SrLM<2GkRMq"u&XXZ@<F]<;PcAb.k\P`>pqAcR,f5@nd'Sg<18fek.(I@+MB9uBU]?fH+2p,1D)9&FUTgU*;S5D::,.bA4;Mpf-UP)W\ght6oaO37OaCoDe-G%I?d]L`3c\"R7U\;@;FQDm\^]2>`lPtr/;eol$W+;_tH)T..!+F"@8@#--XGAeNs2q7"1cr'aYko9GjYlFcd#H*^Cu-Wn,sQ_(oAcn_8;m-%!9TpufDB!.)CPtfq96"K8s6<fr8JW+%C/R;AQe0)A5cs/1FXKth$IrB.tu9Ig*gg^)<3t-QO?Y0=^a#MF'@\0GU^^7UeFalOX=j'=(C``'R3tqhd70GD,d3?Dd?PXT</<=NgckIY'ej0K*L`r<iSdM7Q#p6p)/S3E3ANN+GhioOiNBhb,917W3nA3H**5"W+*sMV+TpKDi39$d2#YnD_O"*,DXbXF`UjG,pZ?n+=i-[g-0VA2Wg>ZCDM[V%12We92JPpS4b'A<^#n?0O.fsJl=^d'%pd(Ghl3#'Q;sUZbLYhD%%pI:9?4+[ZW@6G9[:B8/l]T$R*sZ+In\>iPP1$l-7))%Ym@qZ*_IV<QIVPPTF%C,DFGIXs^MqR_eD'?6'MfA",p^.C77P)!Is#gF.!qr=><VP".(F"3FkFqJ2jLk!=o=&li3Jo)<<t1oH-cld:ouV-GT!:a,i'&>!..SHu'tWR35\jce<7lp>H-<=MpS9^1`hnX)t]$Mb.3E\M<c@5iW3YLecVS73q+Y"WN(]Vi`hiRDmCCMf<l37ntr[aq(ZdZ]ukOAtn/jmo0I82\L(6C6H+FiedOXc7lYjr;L[e@k1H3<oU]1o=dQU/uuT[#q3YXQPJGZr'@?oRoiu`mr)']Am":@hBtcrfohl=LI(?RPgs0'k2[Xd_]lM2'ZV1dBM-T:tg_ba$\[-Y!tWQ\l9N1MRc<]WSnQ._W/m+lp,=.9PC2;/_TOaffQRGd;C33XJ$WD*4afEV5O:paoM=jmH1h&Sct=Jn03r?gi7rV/aBpriD;J--a=-m*A#T^V-&d/SP;U*aTKXk+8Tb_D7&o_=3&:Bg6_tF]M5]\W\Wq9NQOW9<Dqd5j\W5&/9d7+ffYG'5UWRk+5&Y&B@2R7BEsbcA?F>H>KnQ(<E'r@P:TOo.CUjY\cq._/JktqF1eu<2\rh;Ke-)9dmf!]#A0a%h8kl@X8F8Rq5U:SXMH)43d)te=h!Oo<@H`+Q*YM36H`q(MsdQ?/omo2l3PWTUoq#I@<4XjX_8^l$pTp^D.LJA4HR5KTt`Lc21aq%@u0J%$&-;/I3Z/T:9?qF8[1jaNZK^)Xe]5bP(bf7`l?<);@dfBL@",+U)ZeVcp5kk;PUk!'6+e1X5dQ4F,a`Tq_0eI\bO#?1,X3rC3#;^3$Y.<VN_FCe#="UReTl*.T4bcRH1QoLI*4[afc%SR:M<*bjEo+$QqFO?>b7,dmgI%NPV)NSJZKFFeE8;+$[&2_PiQYD@.akkt0kQgR!&*S5+p>*#;F6[4X-L)V8X);Q,;\*lGF=[`I<-BRU)OY.uN*71?)5X62M.=DMDqM<?`Y>X^$LCduPh>Y+f46Q;jpYs7L6/ps1@LGs*':T0^3g,dYQ0m"uDOLP.5eCN2OmQO-q6RAOHZ&+ZfoO6l3E[E)S,_bg-<F\isPTms!!h2u@W9-u0HB>/A9r+0bR5C\MP+VXfNrD[$LYN?EYq7<R8G!%3k'%C2,,1_CZqr>LQ[:<-N*q0:kFetA!Y+%EUS=b>$t"(&*'sG#JYJ`DSgh?!7h27aq,;S(J>DU.Y3/c7g5K[RdmI.dG]MQQUsQ0Hma#kO`]KlR/AJdqoD[?'=#>s.1%IcjB8=0&$f-S^C`ViSm!3ZnaPE_bPFe24\/6U:=T?j0gsbf5Jd=:.+4$#M7*9cGN\!b4XU#S[LtikS:Pb_03BF%(@hCP`%=m"!=p9b)F<!V0l`h-VI=3`[eW!kNNA3n97'a'9@MILu^[\M,[8CtrfL[rULkSP$$,5rJTH+njS7f=b(j"VK&F=VU*2=ZH9m(kR+=XZp@BPXiOQqB1cLSp-W"4lG0IBgE[URh-q<nQ+N&`<9&2Vn]Uig=,2@=<>O'Z.!mcY0a1d+O6NItY<@!?Z#b9n6I:6;b9jtNH7hd[,+JDp7H_N4O%m$tI\h)WJig>7`GEhYUMnaU#ZjDi8g(t4;JENBX4F^Ng^4[U0"'/k:ReqUPOZI/?sf%*<*,Asosd2:?Rb*DG8e]-.ieYT+=51@>YD9SWU#5Ga-,u/Pgo"]I<oq81!/A[trHU/A%GgOIM0lN%+7bZKQBj`16`]bEO7qs9*eERi%i3F;Ai=#0d)**H"p5i`pXc74umQcE?kVkFH5&J2Ki&>kX=>UE]`2DAFguL"-HJ6RL'A/9mh?8"34iUbPlFs4SH\j[>;JY;TIoq-W/>OrJp"Ii4h+A,:Ros'(hTL,QlMiP=eE,p[iMKc%b\6^e"PSYT\%&q-Y2-$r72dPe$8_tIm'JLe!4Ol[@3L&2.,iVCT!,\Ed?rR-pkA^KOZ(M&+K-V3D&fUI3fhA3:!n_d,DD/J2(:_'RCY<-D)(a`436-3C2r_7>M@^adk8+39m)dU?Y6c`9N#`mTjh.r-.04ZlJfcHW[I_;^4ftcK7E4OQ",<,@Oq?:Y$rXqJK9_8>N_E>CarlqUo@;Y6LmY+3_S9QWBh][PT?ecHa/k/0n``NULEj<[8W.:^JTVDN;T&h:hc\rWK%L(1ml(;['B&VkdHjrZ2eLSAu+7=MOlkO.M"8=YWI5uL<Re%a".P--\FlB;iEd&5`?j"_^7d;W%*&a`M?Ho8tU+..=]4\c;?0Oq8Mi[Uf"'@]A^`i$fTu*1dir$p<PO?j\8]j&h,1!;YH!!"[()Jr#fim)k_"arMpHXrPrBD.U/Od;Z4k5CecH^iB$M4#&_R<s649.nQh(hpYkA0brCqG,%#W*I\@c=<`o!*Q2'Qi-k0+@bqj*j7TPI>'aMYM4q09B@CQNR2(+Fp`")!ulpD4J+#QQ0!@V*NT8#+ZfW"3o$("+0MMVMI[$\F_Q`7>E^>tHe773lh1PR8$Oe4c-j7&se%lA\a)cd!m,Nm3$8`b57-G<JmqHu%$Hr'^l7lPnj5q,MHkb]EFTgh0gMcQ=7N0:b<Ff")sk"pW.)cXSN6<[0MCE.,!giuoj4gh\;,i.2,Liu$&;2KZ+)A6De0;Lm&ncT;R2Wh>1)U:6Cb`%VgSs;3GT9N8fJ#XU2k"]9PECL\Q*dq+P<=/5S6])8t0"L?!Qk2AqIQi[)EgFF%KVRReo8*[[D&e=d$Mi-)=+:!As&C/;M(1tA:+am>S&K\J1WRD=4@HM)Bf@Mh4;"Zr7jj3Lb/S;Fbd5;'P9Y&6rJ)OW4EP?`G7[?Vq`*:Q.q,N9O]V/8K6!1K]@Ou`/Bt+nHrQr-P$'[Xb/ns0;7*TqJ30qX="(!/.uXN!(=I:SH*hNrG]mVnNBAX..>;S+3i!Wl650M[%]kXc!h,DnD/>_hqJT1/-e`f\l[H)f7^h3P>Y]qC2r6"'iF.^(29qq0]!\f</Z)_kARaoSL-?<SGP8#rE62KB8r6Tk1Tb:l.'t_@3E[<_23YLZ$3&K*p!h!tmdT'!?_l.6/V:BMT$co*NSVA&KJp.6p<nF,S%,@U:%L8G9K.)=oqeklcRV5pq64i_`C%q0ZuIdY0d7D@>XtPqToI_UY@h;blin1NQkO7FLg,kY.ICh.b$&K-2f%Fe8m=4qbXL3EFi\PVXM&n^\iJs"pG\"$@rA)+F+)(mF\T>'G/S_tC83mfA1\0mLGfWc6[%-_d8U9IWen,\6-C7?aWGKpeAdl<-_Eh[X$jVJg@uqfk*UH#a3[;Ag8p0'h"E7fH_MAL]*L<8mFK:GDJ_cuMWlT%-qR%5N>ROuNHCpd^Q(88'P&L>cA=)F.bRO#)mqES@VTbu@?3;2U-hg(X8&UbYc$:odh&QuO'2kcXj/qA*bs3E=;0M:\[8o9dFcCahh=7I2Y)'/rN#e1`Yna;PM2`0h<$Aul1Y&t`Z!S*n.8ON(\#'^#X$haO/$uh#/f:K75osI%KDSX2O:QR&M^78)H@:qJo-5HWc*qFm>=W:FAWcU,>2%m%eFr9BOe<%e#At#g1<+oLZ\'HNB$!bZY+.)=[LJEN^A\2SrU<AKK$IK#qglg3YC].\B2"2n?\d5-:3`KA6p?p0e=ukIAK-3ma<e]FSFY.C`]YC].rI;T[CN4*oPG$8#G;_f,M:&o%m=sHG=J]#o@NND/5glk8;F^9>MHT7%7EZZO\siNGU7&fTnKAffb`^)F'"6<Z"Q;kXK;s9Hu<bC:F%l?iMk9l8I*gOlS^T`uG@*7cRn?:ikT:DYG&Z%Zn[:#8+l#7[@-5CEBnGgpqKOI_ba[UTq$?ZdFSkN%d<FBT22KYnK)$<=!))KCrW]]ApQ3ZIRjL7"=[Ame;nD,/tJKNB0*9/MaBApd6q[)a>J[-XVA`fWeq7`WP*?M@ZZ]rN#6KO0-Je7P]lBC1BprNM^4E<qEr.;+AWQS-S3qD`Ws1LbKT#Y0(DtCJ\AJbb:jflM0Xkf*]j8*n2oH>?a2[h",q`^7?^?LtQHhs,3680Xciq2NBt3N%m2L%G$6t.!_m!TEl)uXN+f"Pl9ZeS%n;$`kcQb^db(RVEaA:=4gK_ULSM7*jNDl]s=qar:og\T2IIp3\=FE&4S;!7\_\M!p!MIc7O=sM7drOj'^O4;58='RmQ92(Ogb;nRaM]\!g]@1`BjN6NWDiA_,GIC6Zbgqu)=B/eCLsmJ`SN5Fq%t(k;D*[89<k`b6!Q#cQHj1r`3Sh-,BKp$-nUC3f10oU+=cg-Q`uZr^=1f@JLa9\)nB_iJ&:/a%&bdl;oO#!$TAaO_8=HD82bDR3qLD)Y'.=+BaqSjUh@Df=OGH#nC^>n^qGPPj(n-\iLVSUKh`OnZV8R3-:pW[c4PmY%pd(fMYHWsChral?$4?YSgA5&2hjEMtrG%FbBdD6ns7A'DGR*coLnh5.%5qD`EQoB=RH%Dp[UAXG3l9SU4-$b%4Aa$snS"1"]rj$"-n=H>4JN%o\?cF;]kP@f*YI7=<#%*2N-]7rWnX::SOd@GH>0s^kNq=s*)X>&kp>9D[7PK0mNnZibTr?'I=lrb0b1&JkrD]YX7=m.OL-%d3F.5MU!`#7GSS^\'N(.MfX^4AFJcUb".bW6Fn6rIOU@W6A/gA4lAWs"W?+8U2B3W/g#"*N5#0H+F2*5kQ(G.0dR;ONldq1m;c_+/rfdt&Kg2+bFM`>CBqTTE9.qLYTB:575WdC>ORbOP>EO*5^fA'>pEr?dZFERsW?[?^O9iO%4(Rd@K'+='.bbXF*rY5<9SA'DT<kb1t"^AV@M74nFAa"8Zh'[CV\N9Hu`Rl88+E_s^_\,TeMokgJK7:XQ87K&#L<HN?1(iqZ&rG\C([7).D<RDY)fYBem7)X(/F+#E?M/$o'r/NpRA'EE>SSu9`r57AYhtVcpj[JJi%Q1P0ejEKDeWOU)H&>JZ2.g:\,goaFXCMura_oZs@uN.^(h8LZ`Y`3E0ub&?N%r<h@uN.^(h8LZ`Y`3E0ub&?N%r<h@uP]uq-T(`Zqg~>endstream
-endobj
-10 0 obj
-<<
-/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
->>
-endobj
-11 0 obj
-<<
-/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
->>
-endobj
-12 0 obj
-<<
-/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 18 0 R /Resources <<
-/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
-/FormXob.120a85b25e09f27df74ed3dd6376b1f0 8 0 R /FormXob.2c142ae4a83dfb816cc592166ec9ee0a 5 0 R /FormXob.731334a9cbac82f848bea22b06a6c4a7 9 0 R /FormXob.85d01d3946b8319a1d268e97a52ee385 4 0 R /FormXob.c51b94b7f6c2506fc5af23c42fcb8aa7 6 0 R
->>
->> /Rotate 0 /Trans <<
-
->> 
-  /Type /Page
->>
-endobj
-13 0 obj
-<<
-/Outlines 15 0 R /PageLabels 20 0 R /PageMode /UseNone /Pages 18 0 R /Type /Catalog
->>
-endobj
-14 0 obj
-<<
-/Author () /CreationDate (D:20210716084258-01'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20210716084258-01'00') /Producer (ReportLab PDF Library - www.reportlab.com) 
-  /Subject (\(unspecified\)) /Title (OhmPi project) /Trapped /False
->>
-endobj
-15 0 obj
-<<
-/Count 2 /First 16 0 R /Last 17 0 R /Type /Outlines
->>
-endobj
-16 0 obj
-<<
-/Dest [ 12 0 R /XYZ 62.69291 450.0636 0 ] /Next 17 0 R /Parent 15 0 R /Title (Citing OhmPi)
->>
-endobj
-17 0 obj
-<<
-/Dest [ 12 0 R /XYZ 62.69291 375.0636 0 ] /Parent 15 0 R /Prev 16 0 R /Title (Introduction to OhmPi)
->>
-endobj
-18 0 obj
-<<
-/Count 1 /Kids [ 12 0 R ] /Type /Pages
->>
-endobj
-19 0 obj
-<<
-/Length 4546
->>
-stream
-1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 741.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 4 Tm /F2 20 Tf 24 TL 166.5949 0 Td (OhmPi project) Tj T* -166.5949 0 Td ET
-Q
-Q
-q
-1 0 0 1 62.69291 711.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 3 Tm /F2 15 Tf 18 TL 194.0924 0 Td (Partenaires) Tj T* -194.0924 0 Td ET
-Q
-Q
-q
-1 0 0 1 255.6378 641.0236 cm
-q
-84 0 0 60 0 0 cm
-/FormXob.85d01d3946b8319a1d268e97a52ee385 Do
-Q
-Q
-q
-1 0 0 1 62.69291 623.0236 cm
-q
-BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Authors:) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 617.0236 cm
-Q
-q
-1 0 0 1 62.69291 593.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.49622 Tw (R\351mi CLEMENT,Vivien DUBOIS,Nicolas Forquet, INRAE, REVERSAAL, F-69626, Villeurbanne Cedex,) Tj T* 0 Tw (France.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 581.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Yannick FARGIER, GERS-RRO, Univ Gustave Eiffel, IFSTTAR, Univ Lyon, F-69675 Lyon, France.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 569.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Julien GANCE, IRIS Instruments, 45100 Orl\351ans, France.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 557.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (H\351l\350ne GUYARD, IGE Grenoble, Universit\351 Grenoble Alpes, Grenoble.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 557.0236 cm
-Q
-q
-1 0 0 1 62.69291 539.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Parteners:) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 533.0236 cm
-Q
-q
-1 0 0 1 62.69291 516.0636 cm
-q
-1 1 1 rg
-n 0 16.96 469.8898 -16.96 re f*
-0 0 0 rg
-BT /F1 10 Tf 12 TL ET
-q
-1 0 0 1 6 6.712 cm
-q
-12 0 0 7.248 0 0 cm
-/FormXob.2c142ae4a83dfb816cc592166ec9ee0a Do
-Q
-Q
-q
-1 0 0 1 116.3529 8.805004 cm
-q
-12 0 0 5.154996 0 0 cm
-/FormXob.c51b94b7f6c2506fc5af23c42fcb8aa7 Do
-Q
-Q
-q
-1 0 0 1 240.9449 3 cm
-q
-12 0 0 10.96 0 0 cm
-/FormXob.120a85b25e09f27df74ed3dd6376b1f0 Do
-Q
-Q
-q
-1 0 0 1 351.2978 10.79486 cm
-q
-12 0 0 3.165138 0 0 cm
-/FormXob.731334a9cbac82f848bea22b06a6c4a7 Do
-Q
-Q
-q
-1 J
-1 j
-0 0 0 RG
-.25 w
-n 110.3529 0 m 110.3529 16.96 l S
-n 234.9449 0 m 234.9449 16.96 l S
-n 345.2978 0 m 345.2978 16.96 l S
-n 0 16.96 m 469.8898 16.96 l S
-n 0 0 m 469.8898 0 l S
-n 0 0 m 0 16.96 l S
-n 469.8898 0 m 469.8898 16.96 l S
-Q
-Q
-Q
-q
-1 0 0 1 62.69291 516.0636 cm
-Q
-q
-1 0 0 1 62.69291 498.0636 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Creation date : Juillet 2020.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 480.0636 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Update : 21 ao\373t 2020.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 462.0636 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Status of document: In progress.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 429.0636 cm
-q
-BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Citing OhmPi) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 387.0636 cm
-q
-BT 1 0 0 1 0 26 Tm .425984 Tw 12 TL /F3 10 Tf 0 0 0 rg (R\351mi Clement, Yannick Fargier, Vivien Dubois, Julien Gance, Emile Gros, et al.. OhmPi: An open) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (source) Tj T* 0 Tw 1.36784 Tw (data logger for dedicated applications of electrical resistivity imaging at the small and laboratory) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (scale.) Tj T* 0 Tw (HardwareX, Elsevier, 2020, 8, 24 p. ff10.1016/j.ohx.2020.e00122ff.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 354.0636 cm
-q
-BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Introduction to OhmPi) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 288.0636 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 50 Tm /F1 10 Tf 12 TL 1.130751 Tw (This documentation presents the development of a low-cost, open hardware resistivity meter to provide) Tj T* 0 Tw 1.370697 Tw (the scientific community with a robust and flexible tool for small-scale experiments. Called OhmPi, this) Tj T* 0 Tw .732706 Tw (basic resistivity meterfeatures current injection and measurement functions associated with a multiplexer) Tj T* 0 Tw .086905 Tw (that allows performing automatic measurements with up to 32 electrodes.OhmPi's philosophy is to provide) Tj T* 0 Tw (a fully open source and open hardware tool / to the near surface scientific community.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 276.0636 cm
-Q
-q
-1 0 0 1 62.69291 205.0636 cm
-q
-.960784 .960784 .862745 rg
-n 0 71 469.8898 -71 re f*
-0 0 0 rg
-BT /F1 10 Tf 12 TL ET
-BT 1 0 0 1 6 45 Tm  T* ET
-q
-1 0 0 1 16 40 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2.5 Tm /F4 12.5 Tf 15 TL (Note) Tj T* ET
-Q
-Q
-q
-1 0 0 1 16 16 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Everyone willing to get involved is welcome in OhmPi Project!.) Tj T* ET
-Q
-Q
-q
-1 J
-1 j
-.662745 .662745 .662745 RG
-.5 w
-n 0 71 m 469.8898 71 l S
-n 0 0 m 469.8898 0 l S
-n 0 0 m 0 71 l S
-n 469.8898 0 m 469.8898 71 l S
-Q
-Q
-Q
-q
-1 0 0 1 62.69291 199.0636 cm
-Q
- 
-endstream
-endobj
-20 0 obj
-<<
-/Nums [ 0 21 0 R ]
->>
-endobj
-21 0 obj
-<<
-/S /D /St 1
->>
-endobj
-xref
-0 22
-0000000000 65535 f 
-0000000073 00000 n 
-0000000136 00000 n 
-0000000243 00000 n 
-0000000355 00000 n 
-0000015380 00000 n 
-0000044178 00000 n 
-0000100904 00000 n 
-0000101315 00000 n 
-0000119802 00000 n 
-0000127908 00000 n 
-0000128024 00000 n 
-0000128144 00000 n 
-0000128605 00000 n 
-0000128711 00000 n 
-0000128982 00000 n 
-0000129056 00000 n 
-0000129170 00000 n 
-0000129293 00000 n 
-0000129354 00000 n 
-0000133952 00000 n 
-0000133993 00000 n 
-trailer
-<<
-/ID 
-[<870bb68092b857292686b2b33a691c37><870bb68092b857292686b2b33a691c37>]
-% ReportLab generated PDF document -- digest (http://www.reportlab.com)
-
-/Info 14 0 R
-/Root 13 0 R
-/Size 22
->>
-startxref
-134027
-%%EOF
diff --git a/doc/source/page0.txt b/doc/source/page0.txt
deleted file mode 100644
index 447b2d5e58a5160cccaecc6682a7ce3729e283c8..0000000000000000000000000000000000000000
--- a/doc/source/page0.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-************ 
-Seconde page 
-************ 
-
-Formule 
-******* 
-
-.. math:: 
-   \sum_{a}^{b} x_n = c_1 + c_2^3 + \cos(\pi) 
-
-Image 
-***** 
-
-.. image:: _static/tux.png 
-   :align: center 
-
-Texte 
-***** 
-
-Voici un second texte pour notre Démo. 
-
-.. note:: 
-   J'espère que cela vous parle un peu plus que la présentation présente.
\ No newline at end of file
diff --git a/doc/source/ref.txt b/doc/source/ref.txt
deleted file mode 100644
index b5207223dee9014fd05bedb541c2f18f8d1545d1..0000000000000000000000000000000000000000
--- a/doc/source/ref.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-************ 
-OhmPi V 1.01 Implementation
-************ 
-
-
-Image 
-***** 
-
-.. image:: logo_ohmpi.JPG
-   :align: center 
-
-Texte 
-***** 
-
-Voici un second texte pour notre Démo. 
-
-.. note:: 
-   J'espère que cela vous parle un peu plus que la présentation présente.
\ No newline at end of file
diff --git a/doc/source/source_rst/Ohmpi.rst b/doc/source/source_rst/Ohmpi.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e1414cc854f9e3166985df59c289258877b85621
--- /dev/null
+++ b/doc/source/source_rst/Ohmpi.rst
@@ -0,0 +1,74 @@
+*************** 
+OhmPi project 
+***************
+
+    .. image:: ../img/logo/ohmpi/logo_ohmpi.JPG
+        :width: 250 px
+        :align: center
+        :height: 180 px
+        :alt: Logo OhmPi
+
+
+|  
+
+**Authors:** 
+------------
+| Rémi CLEMENT, Vivien DUBOIS, Nicolas Forquet, INRAE, REVERSAAL, Villeurbanne, France
+| Olivier KAUFMANN, Arnaud WATLET, Université de Mons, Mons, Belgium
+| Yannick FARGIER, GERS-RRO, Univ Gustave Eiffel, IFSTTAR, Lyon, France
+| Hélène GUYARD, IGE Grenoble, Université Grenoble Alpes, Grenoble, France
+| Guillaume BLANCHY, ILVO, Merelbeke, Belgium
+
+
+**Partners:**
+-------------
+
+.. table::
+   :align: center
+  
+   +------------------------------------------------------+--------------------------------------------------------+---------------------------------------------------+
+   |   .. image::../img/Logo/partners/logo_inrae.jpg     |  .. image::../img/Logo/partners/logo_univ_gustave.png |   .. image::../img/Logo/partners/logo_ilvo.png   |
+   +------------------------------------------------------+--------------------------------------------------------+---------------------------------------------------+
+   |   .. image::../img/Logo/partners/logo_univ_mons.png |  .. image::../img/Logo/partners/ige.png               |                                                   |              
+   +------------------------------------------------------+--------------------------------------------------------+---------------------------------------------------+
+   
+  
+
+**Citing OhmPi:** 
+-----------------
+
+|
+
+*Rémi Clement, Yannick Fargier, Vivien Dubois, Julien Gance, Emile Gros, et al.. OhmPi: An open*
+*source data logger for dedicated applications of electrical resistivity imaging at the small and laboratory*
+*scale. HardwareX, Elsevier, 2020, 8, 24 p. ff10.1016/j.ohx.2020.e00122ff.*
+
+|
+   
+**Introduction :** 
+------------------
+
+.. warning::
+    OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. 
+    OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be
+    held responsible for any material or human damage which would be associated with the use or the assembly of OhmPi. 
+    The OhmPi team cannot be held responsible if the equipment does not work after assembly. You may redistribute and 
+    modify this documentation and make products using it under the terms of the CERN-OHL-P v2. This documentation is 
+    distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS
+    FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-P v2 for applicable conditions.
+
+
+
+
+
+This documentation presents the development of a low-cost, open hardware \ 
+resistivity meter to provide the scientific community with a robust \
+and flexible tool for small-scale experiments. Called OhmPi, this basic resistivity meter\
+features current injection and measurement functions associated with a multiplexer \
+that allows performing automatic measurements with up to 64 electrodes.\
+OhmPi's philosophy is to provide a fully open source and open hardware tool\
+to the near surface scientific community.
+ 
+
+.. note:: 
+   Anyone who wants to get involved is welcome to join the OhmPi project!
diff --git a/doc/source/api.rst b/doc/source/source_rst/api.rst
similarity index 73%
rename from doc/source/api.rst
rename to doc/source/source_rst/api.rst
index c5c9a92aca74518508821f8a32c77fe20aa3f902..20046317d371518eb69dc758ae4f891d2957c2df 100644
--- a/doc/source/api.rst
+++ b/doc/source/source_rst/api.rst
@@ -3,7 +3,10 @@ API reference
 .. toctree::
    :maxdepth: 2
    :caption: Contents:
-.. automodule:: ohmpi
+
+.. automodule:: ohmpi.ohmpi
    :members:
+   
+
 
 
diff --git a/doc/source/source_rst/archived_version.rst b/doc/source/source_rst/archived_version.rst
new file mode 100644
index 0000000000000000000000000000000000000000..81159f7e1b2dfab07439c75c2fdb5c11ad863d21
--- /dev/null
+++ b/doc/source/source_rst/archived_version.rst
@@ -0,0 +1,10 @@
+Archived versions
+##########################
+
+**These versions are not supported anymore.**
+
+.. toctree:: 
+   :maxdepth: 1 
+
+   v1.xx/V1_01
+   v1.xx/V1_02
\ No newline at end of file
diff --git a/doc/source/developing_hardware_components.rst b/doc/source/source_rst/developing_hardware_components.rst
similarity index 100%
rename from doc/source/developing_hardware_components.rst
rename to doc/source/source_rst/developing_hardware_components.rst
diff --git a/doc/source/source_rst/gallery.rst b/doc/source/source_rst/gallery.rst
new file mode 100644
index 0000000000000000000000000000000000000000..876c4c48b9847848c8d236fc24feeb3239ba972b
--- /dev/null
+++ b/doc/source/source_rst/gallery.rst
@@ -0,0 +1,4 @@
+Examples of applications
+========================
+
+TODO (e.g. OhmPi in Inrae, OhmPi in Rocherfort, )
\ No newline at end of file
diff --git a/doc/source/source_rst/hardware.rst b/doc/source/source_rst/hardware.rst
new file mode 100644
index 0000000000000000000000000000000000000000..da4f611431c4f08c72f884e9fe982fedd3e55b7e
--- /dev/null
+++ b/doc/source/source_rst/hardware.rst
@@ -0,0 +1,27 @@
+Hardware
+********
+
+This section contains the documentation needed to build an OhmPi.
+The OhmPi is composed of different modules:
+
+- a measurements board ('mb'): that measures the current and voltage and modulates modulate the injected current
+- 0, 1, ... or n multiplexer boards ('mux'): that addresse different electrodes
+- a power supply ('pwr'): either a 12V battery or a more advanced power supply where we can control the voltage/current
+- a general controller ('ctrl'): to control the measurements board and power supply (=raspberrypi)
+
+These module exists in different versions and can be combined using a configuration file.
+You can then upgrade your measurment board or power supply for specific applications.
+
+.. toctree:: 
+   :maxdepth: 2 
+
+   hardware/hw_info
+   hardware/mb_2023
+   hardware/mb_2024
+   hardware/mux_2023
+   hardware/mux_2024
+   hardware/hw_pwr
+   hardware/hw_rpi
+   hardware/assembling
+
+  
diff --git a/doc/source/Ohmpi_V2023/V2023_step_04.rst b/doc/source/source_rst/hardware/assembling.rst
similarity index 86%
rename from doc/source/Ohmpi_V2023/V2023_step_04.rst
rename to doc/source/source_rst/hardware/assembling.rst
index d7d17b4a2b28006aa3a41fe607c6a7a628556188..467295f1bf7c53c55a77193c547650c04309c5b7 100644
--- a/doc/source/Ohmpi_V2023/V2023_step_04.rst
+++ b/doc/source/source_rst/hardware/assembling.rst
@@ -3,18 +3,14 @@
     **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.**
 
 
-
-
-
-
-**STEP n°4:** assemble the OhmPi
+Assembling the OhmPi
 ****************************************************
    
 .. table::
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_1.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_1.jpg     |
    |      1 +------------------------------------------------------------+
    |        |Cut 4 ribbon cables composed of 16 wires each to the proper | 
    |        |length (about 1.5m). Each wire corresponds to an electrode. |                                                                      
@@ -24,7 +20,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_2.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_2.jpg     |
    |      2 +------------------------------------------------------------+
    |        |Crimp the ribbon cable on the corresponding idc connector   | 
    |        |with a suitable clamp. Pay attention to the direction of    |
@@ -36,7 +32,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_3.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_3.jpg     |
    |      3 +------------------------------------------------------------+
    |        |Example of IDC connector mounting. The wires should run as  | 
    |        |perpendicular as possible to the IDC connector.             |                                                                      
@@ -46,7 +42,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_4.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_4.jpg     |
    |      4 +------------------------------------------------------------+
    |        |Same for a 6 wires ribbon cable of 1 m length.              | 
    |        |                                                            |                                                                      
@@ -56,7 +52,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_5.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_5.jpg     |
    |      5 +------------------------------------------------------------+
    |        |Cut the ribbon cable flush with the IDC connector.          | 
    |        |                                                            |                                                                      
@@ -66,12 +62,12 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_6.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_6.jpg     |
    |      6 +------------------------------------------------------------+
    |        |Position 9 spacers above the MUX board, and 9 spacers below |
    |        |                                                            |                                                                      
    +        +------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_7.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_7.jpg     |
    |        +------------------------------------------------------------+
    |        |Profile view for mounting the spacers above and below.      | 
    |        |                                                            |                                                                      
@@ -81,7 +77,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_8.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_8.jpg     |
    |      7 +------------------------------------------------------------+
    |        |Cut a 50 cm long wire of any color (here yellow). Strip and | 
    |        |tin each end of the wire. Install the wire "A" on the screw |
@@ -92,7 +88,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_9.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_9.jpg     |
    |      8 +------------------------------------------------------------+
    |        |Cut a red wire and a black wire of 50 cm length. Strip, tin | 
    |        |and position the wires on the left screw terminal as shown  |
@@ -104,7 +100,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_10.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_10.jpg    |
    |      9 +------------------------------------------------------------+
    |        |Mount the 4 ribbon cables (16-wires each) with IDC          | 
    |        |connectors. A small noise is often heard when the IDC       |
@@ -116,7 +112,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_11.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_11.jpg    |
    |      10+------------------------------------------------------------+
    |        |Mount the ribbon cables with 6-wires with the corresponding | 
    |        |IDC connectors                                              |
@@ -127,19 +123,19 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_12.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_12.jpg    |
    |      11+------------------------------------------------------------+
    |        |Cut a red wire and a black wire of 10 cm length. Strip and  | 
    |        |tin the wires at the ends. Mount the red wire on the 12V    |
    |        |input and the black wire on the GND input on the right      |
-   |        |screw terminal.                                                   |
+   |        |screw terminal.                                             |
    +--------+------------------------------------------------------------+ 
 
 .. table::
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_13.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_13.jpg    |
    |      12+------------------------------------------------------------+
    |        |Mount and fix the second MUX board "B" on the first with    | 
    |        |the help of 9 spacers.                                      |
@@ -152,7 +148,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_14.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_14.jpg    |
    |      13+------------------------------------------------------------+
    |        |Cut, strip and tin a red wire and a black wire of 10 cm     | 
    |        |length. Mount the wires on the left screw terminal.         |
@@ -167,7 +163,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_15.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_15.jpg    |
    |      14+------------------------------------------------------------+
    |        |Crimp a 16 wires IDC connector on the ribbon cable at about | 
    |        |15 cm from the previous connector. Please, pay attention to |
@@ -180,7 +176,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_16.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_16.jpg    |
    |      15+------------------------------------------------------------+
    |        |Repeat the operation for the other 3 ribbon cables.         |                  
    +--------+------------------------------------------------------------+ 
@@ -189,7 +185,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_17.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_17.jpg    |
    |      16+------------------------------------------------------------+
    |        |Repeat the operation for the 6 wires ribbon cable.          |                  
    +--------+------------------------------------------------------------+ 
@@ -198,7 +194,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_18.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_18.jpg    |
    |      17+------------------------------------------------------------+
    |        |Cut a 50 cm long wire "here purple" (Color not relevant but | 
    |        |to be defined). Strip and tin the wire at its ends.         |
@@ -211,7 +207,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_19.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_19.jpg    |
    |      18+------------------------------------------------------------+
    |        |Repeat all these operations for the third MUX board         | 
    |        |called "M".                                                 |           
@@ -222,7 +218,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_20.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_20.jpg    |
    |      19+------------------------------------------------------------+
    |        |Repeat the operations for the fourth MUX Boards. Attention, | 
    |        |it is necessary to position 5 different spacers (here nylon |
@@ -236,7 +232,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_21.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_21.jpg    |
    |      20+------------------------------------------------------------+
    |        |When mounting the 4th MUX board ("N"), screws can be placed |
    |        |on the nylon spacers to fix the boards together. Note that  |
@@ -253,7 +249,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_22.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_22.jpg    |
    |      21+------------------------------------------------------------+
    |        |Cut a red wire and a black wire of one meter length. Place  | 
    |        |the red wire on terminal “12V” and the black wire on        |
@@ -266,7 +262,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_23.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_23.jpg    |
    |      22+------------------------------------------------------------+
    |        |Tie the A, B, M and N wires together                        |                            
    +--------+------------------------------------------------------------+   
@@ -275,7 +271,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_24.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_24.jpg    |
    |      23+------------------------------------------------------------+
    |        |Cut a PVC plate with the following minimum dimensions :     |  
    |        |200 mm * 150 mm * 5 mm                                      |                       
@@ -286,7 +282,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_25.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_25.jpg    |
    |      24+------------------------------------------------------------+
    |        |Drill the plate to mount it on the remaining metal spacers. |  
    |        |Do not tighten the assembly.                                |                       
@@ -296,7 +292,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_26.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_26.jpg    |
    |      25+------------------------------------------------------------+
    |        |Position the Raspberry Pi (RPI) board on the plate so that  |  
    |        |you can access the USB ports. Mark the holes of the RPI     |
@@ -308,7 +304,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_27.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_27.jpg    |
    |      26+------------------------------------------------------------+
    |        |Add spacers on the PVC plate.                               |     
    +--------+------------------------------------------------------------+ 
@@ -317,7 +313,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_28.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_28.jpg    |
    |      27+------------------------------------------------------------+
    |        |Attach the PVC plate to the metal spacers with washers      |     
    |        |and nuts.                                                   |                                
@@ -327,7 +323,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_29.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_29.jpg    |
    |      28+------------------------------------------------------------+
    |        |Position and fix the RPI card on the spacers                |     
    +--------+------------------------------------------------------------+     
@@ -337,7 +333,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_30.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_30.jpg    |
    |      29+------------------------------------------------------------+
    |        |Add spacers on the RPI board. The red (12V) and black (GND) |     
    |        |wires coming out of the "M" MUX board must pass under       |    
@@ -348,14 +344,14 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_31.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_31.jpg    |
    |      30+------------------------------------------------------------+
    |        |Place the measurement board on the RPI GPIO outputs and on  |
    |        |the pre-positioned spacers. Note that LEDs are present on   |
    |        |this measurement board with an associated resistance simply |
    |        |for testing purposes (do not consider this temporary        |
    |        |modification of the board). Same for the orange wire        |
-   |        |present on the board.                                               |
+   |        |present on the board.                                       |
    +--------+------------------------------------------------------------+  
 
 
@@ -363,7 +359,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_32.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_32.jpg    |
    |      31+------------------------------------------------------------+
    |        |Connect the wires " A " (here yellow), " B " (here purple), |
    |        |" M " (here brown) and " N " (here blue) on the             |
@@ -377,7 +373,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_33.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_33.jpg    |
    |      32+------------------------------------------------------------+
    |        |Top view of the assembly. Add clips to secure the wires     |     
    |        |together.                                                   |
@@ -387,7 +383,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_34.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_34.jpg    |
    |      33+------------------------------------------------------------+
    |        |Second view.                                                |     
    +--------+------------------------------------------------------------+    
@@ -397,7 +393,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_35.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_35.jpg    |
    |      34+------------------------------------------------------------+
    |        |Zoom in on the connection of the M and N wires.             |     
    +--------+------------------------------------------------------------+ 
@@ -407,7 +403,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_36.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_36.jpg    |
    |      35+------------------------------------------------------------+
    |        |Zoom in on the connection of the A and B wires.             |     
    +--------+------------------------------------------------------------+ 
@@ -417,7 +413,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_37.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_37.jpg    |
    |      36+------------------------------------------------------------+
    |        |Zoom in on the connection of the « 12V » and « GND » wires. |     
    +--------+------------------------------------------------------------+ 
@@ -426,7 +422,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_38.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_38.jpg    |
    |      37+------------------------------------------------------------+
    |        |Fixing the measurement board on the spacers present on the  |
    |        |RPI board.                                                  |
@@ -436,7 +432,7 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_39.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_39.jpg    |
    |      38+------------------------------------------------------------+
    |        |Place the SD card containing the OS and the pre-installed   |
    |        |programs. Connect a mouse and a keyboard to the USB inputs  |
@@ -449,12 +445,12 @@
    :align: center
 
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/step_4_40.jpg                        |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_4/step_4_40.jpg    |
    |      39+------------------------------------------------------------+
    |        |Connect the red and black cables of board A to a 12V        |
    |        |battery or other laboratory power supply delivering a 12VDC |
    |        |voltage.                                                    |
-   |        |Enjoy 😊                                                    |
+   |        |Enjoy                                                       |
    +--------+------------------------------------------------------------+  
 
    
diff --git a/doc/source/source_rst/hardware/hw_info.rst b/doc/source/source_rst/hardware/hw_info.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c1642dfb7f05ebf0d7099f7f7ddb6b21ae1632d4
--- /dev/null
+++ b/doc/source/source_rst/hardware/hw_info.rst
@@ -0,0 +1,79 @@
+OhmPi electronic design
+************************
+
+
+Measurement board
+=================
+
+The measurement board integrates different electronic components to
+
+- measure the voltage at MN
+- measure the current injected at AB
+- switch the polarity of AB (to make different half-cycles/stack)
+
+Some general explanation about the components is given below to help you understand
+the general electronics of the OhmPi. For more details, we redirect the reader to
+the datasheet of each component.
+
+**Measuring voltage**
+
+Voltage measurement is typically done through an **ADC (Analog to Digital Converter)**.
+In the OhmPi, the component `ADS1115`, a 16-bit ADC is used. The `ADS1115` is
+also equipped with a programmable gain control (PGA), which means it can
+scale up the measured voltage by a factor before digitising it. Its gain can
+vary between 2/3 and 16. With a gain of 1, this component can measure voltages
+between 0 and 5 V with a precision of 5 / (2 ^ 16) = 0.076 mV.
+
+However, we often measure voltage beyond 5 V. So to measure larger voltage with
+our ADC, we need to divide the received voltage. In mb_2023, this is done using
+a **resistor divider bridge**. The voltage at MN is the distributed across two
+resistors placed in series according to their respective resistances. For instance,
+if we see 12V at MN and have two resistors in series of 150 and 300 Ohms. We will measure
+12 * 150 / (150 + 300) = 4 V on the first resistor and 8 V on the second. The 4 V can
+be measured by our ADC.
+
+Another technique to reduce the voltage consist in using **opamp (Operational Amplifier)**.
+These devices have multiple applications and using a given configuration with a known resistance,
+can be used to scale down the voltage input. In addition, opamp are used in 'follow-up' mode
+to ensure a **high input impedance** of the MN part. Indeed, if current is leaking in the MN
+part while we measure, it will affect our measure.
+
+In the measurement board 2024 (mb_2024), an opamp is also used in differential model to only
+measure the difference in voltage between M and N (N is used as a 'floating ground'). This
+enables us to measure much higher voltage as long as the difference between M and N is not too large.
+
+
+**Measuring current**
+
+Current is usually measure by measuring the voltage through a very accurate resistance
+called a **shunt resistance**. In `mb_2023`, a shunt resistance of 2 Ohms is used.
+As this resistance has a tiny value, the voltage measure at on it is also very small and
+need to be amplified before being measured by the ADC. This is done through the INA282 components.
+
+In `mb_2024`, the current measurement is done via a click module where the shunt and amplifier (INA equivalent)
+are already soldered.
+
+
+**Polarity control**
+
+Each half-cycle has a different polarity. Current is first injected from A to B then from B to A
+with or without a time-off between the two. This reversed of polarity is ensured using
+four **relays** (optical in v2023, mechanical in v2024) that operate this transition. The
+relays are controlled from the MCP2308 which is **GPIO expander**.
+
+**Communication**
+
+The ADC (ADS1115) and GPI expander (MCP2308) communicate with the controller (raspberrypi) via
+two wires (SDA and SCL) using the **I2C protocol**. This protocol uses a line which sends
+pulses from a clock (SCL) and another line to transmit data (SDA). These lines must be
+pulled high using pull-up resistors (meaning at rest, there should be 5V between these lines and the ground).
+
+
+Multiplexer
+===========
+
+Multiplexer are used to address multiple electrodes. For this they use **relays**
+to create an electronic path between the electrode and the entry (A, B, M, or N) on the
+measurement board. The relays are usually controlled by **GPIO expander** (MCP23017).
+Because too many GPIO expander cannot be addressed on the same I2C bus, we use a
+**I2C expander** (TCAXXXX) which is itself connected via I2C to the controller (rapsberrypi).
diff --git a/doc/source/source_rst/hardware/hw_pwr.rst b/doc/source/source_rst/hardware/hw_pwr.rst
new file mode 100644
index 0000000000000000000000000000000000000000..23c03f1a0de6ff5d76b8d693e0fddc7aed43936b
--- /dev/null
+++ b/doc/source/source_rst/hardware/hw_pwr.rst
@@ -0,0 +1,17 @@
+Power supply
+****************************
+
+Two sources of power are available now:
+- a 12V battery
+- a regulated power supply (DPS5005)
+
+12V battery
+=================
+When injecting, we actually connect the + and - of the battery to the A, B electrodes.
+Hence, we can only inject 12V maximum.
+
+
+Regulated power supply (DPS5005)
+========================================
+This alimentation enables us to inject up to 50 V and also to regulate the current.
+It needs to be connected to a 12V battery and can be controlled using `modbus` by the raspberrypi.
diff --git a/doc/source/Ohmpi_V2023/V2023_step_01.rst b/doc/source/source_rst/hardware/hw_rpi.rst
similarity index 94%
rename from doc/source/Ohmpi_V2023/V2023_step_01.rst
rename to doc/source/source_rst/hardware/hw_rpi.rst
index 83d9ae5feef6d5431e324848f52fd1534a1a0fbd..ac7adcf6e1c97a2324072f2e139c5320eec7a9d5 100644
--- a/doc/source/Ohmpi_V2023/V2023_step_01.rst
+++ b/doc/source/source_rst/hardware/hw_rpi.rst
@@ -1,10 +1,11 @@
-**STEP n°1** : Raspberry Pi  configuration 
-*******************************************
-
 .. warning::
     **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.**
 
 
+Raspberry Pi  configuration 
+*******************************************
+
+
 
 **PART A:** OS installation  
 =============================
@@ -36,7 +37,7 @@ For this step, the installation instructions are well described on the Raspberry
 .. note:: 
      All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
 
-     .. figure:: step_n_1/raspbian_version.jpg
+     .. figure:: ../../img/v2023.x.x/step_n_1/raspbian_version.jpg
        :width: 800px
        :align: center
        :height: 400px
@@ -111,7 +112,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 2- Thonny opens, Python runs on the root (Python 3.7.3 (/usr/bin/python3))
 
-.. figure:: step_n_1/thonny_first_interface.jpg
+.. figure:: ../../img/v2023.x.x/step_n_1/thonny_first_interface.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -120,7 +121,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 3-Click on **Run>select interpreter**, a new window opens click on interpret
 
-.. figure:: step_n_1/thonny_option.jpg
+.. figure:: ../../img/v2023.x.x/step_n_1/thonny_option.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -129,7 +130,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 4-On the new open windows select **alternative Python3 or virtual environment**
 
-.. figure:: step_n_1/thonny_interpreter.jpg
+.. figure:: ../../img/v2023.x.x/step_n_1/thonny_interpreter.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -142,7 +143,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 7- In the **known interpreter** tab the path of the virtual environment should appear
 
-.. figure:: step_n_1/thonny_interpreter_folder.jpg
+.. figure:: ../../img/v2023.x.x/step_n_1//thonny_interpreter_folder.jpg
        :width: 600px
        :align: center
        :height: 450px
diff --git a/doc/source/Ohmpi_V2023/V2023_step_02.rst b/doc/source/source_rst/hardware/mb_2023.rst
similarity index 72%
rename from doc/source/Ohmpi_V2023/V2023_step_02.rst
rename to doc/source/source_rst/hardware/mb_2023.rst
index 763078b49d46d2f6dbeb2e9175f694ff76f636cc..5d0cb9c21e9f61314d988d9d3f6f14f1275e279f 100644
--- a/doc/source/Ohmpi_V2023/V2023_step_02.rst
+++ b/doc/source/source_rst/hardware/mb_2023.rst
@@ -1,9 +1,36 @@
-
-**STEP n°2**: Measurement board
-****************************************************
-
 .. warning::
-    **Ohmpi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.**
+    **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.**
+
+Measurement board v2023
+**********************************************
+
+Specifications
+==============
+
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+| **Parameter**                 |       **V1.0x**       | Units     |       **v2023**       | Units     |
++===============================+=======================+===========+=======================+===========+
+|Electrodes                     |32                     |           |64 to 128              |           |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Operating temperature          |-0 to 50               |°c         |-25 to 50              |°C         |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Power consumption of CPU and   |18.5                   |W          |18.5                   |W          |
+|control system                 |                       |           |                       |           |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Voltage injection              |12                     |V          |12                     |V          |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Battery                        |9                      |V          |12                     |V          |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Current                        |0 to 40                |mA         |0 to 40                |mA         |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Min pulse duration             |150                    |ms         |150                    |ms         |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Input impedance                |80                     |MOhm       |80                     |MOhm       |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Data storage                   |micro SD card          |           |micro SD card          |           |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
+|Resolution                     |0.01                   |Ohm        |0.01                   |Ohm        |
++-------------------------------+-----------------------+-----------+-----------------------+-----------+
 
 
 
@@ -14,7 +41,7 @@
 Required components 
 ----------------------------------------------------
 
-.. figure:: step_n_2/a/00_mes_board_components.jpg       
+.. figure:: ../../img/v2023.x.x/step_n_2/a/00_mes_board_components.jpg       
        :width: 600px
        :align: center
        :height: 450px
@@ -25,14 +52,14 @@ Required components
 
 
 .. csv-table:: List of components
-   :file: step_n_2/a/measure_board_list_2_xx.csv
+   :file: ../../img/v2023.x.x/step_n_2/a/measure_board_list_2_xx.csv
    :widths: 30, 70, 70, 70, 70, 35, 35
    :header-rows: 1
    
 Description
 ------------------  
 
-.. figure:: step_n_2/a/schema_measurement_board.jpg       
+.. figure:: ../../img/v2023.x.x/step_n_2/a/schema_measurement_board.jpg       
        :width: 600px
        :align: center
        :height: 450px
@@ -51,28 +78,28 @@ which allows to realize precise current measurement around a shunt resistor. The
 .. table::
    :align: center
    
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/01_mes_board.jpg                   |
-   |      1 +------------------------------------------------------------+
-   |        | Installation of female header, 1 by 10  pins, for ADS1115  | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
+   +--------+-------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/a/01_mes_board.jpg|
+   |      1 +-------------------------------------------------------------+
+   |        | Installation of female header, 1 by 10  pins, for ADS1115   | 
+   |        |                                                             |                                                                       
+   +--------+-------------------------------------------------------------+
    
 .. table::
    :align: center
   
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/02_mes_board.jpg                   |
-   |2       +------------------------------------------------------------+
-   |        | Soldering of 4 dual-in-line socket (2 by 2 pins) for       | 
-   |        | optical relay, AQY211EH.                                   |                                                                       
-   +--------+------------------------------------------------------------+
+   +--------+-------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/a/02_mes_board.jpg|
+   |2       +-------------------------------------------------------------+
+   |        | Soldering of 4 dual-in-line socket (2 by 2 pins) for        | 
+   |        | optical relay, AQY211EH.                                    |                                                                       
+   +--------+-------------------------------------------------------------+
    
 .. table::
    :align: center
   
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/03_mes_board.jpg                   |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/a/03_mes_board.jpg|
    |3       +------------------------------------------------------------+
    |        | Soldering of 1 dual-in-line socket (2 by 9 pins)           | 
    |        | for MCP23008.                                              |                                                                       
@@ -82,7 +109,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/04_mes_board.jpg                   |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/a/04_mes_board.jpg|
    | 4      +------------------------------------------------------------+
    |        | Soldering of 1 dual-in-line socket (2 by 4 pins)           | 
    |        |                                                            |                                                                       
@@ -91,7 +118,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/05_mes_board.jpg                   |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/a/05_mes_board.jpg|
    |5       +------------------------------------------------------------+
    |        | Soldering of 2 dual-in-line socket (2 by 4 pins)           | 
    |        |                                                            |                                                                       
@@ -101,7 +128,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/06_mes_board.jpg                   |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/a/06_mes_board.jpg|
    | 6      +------------------------------------------------------------+
    |        | Traco Power Supply 12V to 5V, TDH15 - 1211N                | 
    |        |                                                            |                                                                       
@@ -111,7 +138,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/07_mes_board.jpg                   |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/a/07_mes_board.jpg|
    |7       +------------------------------------------------------------+
    |        | Four screw terminals for 12V inpout et 5V output           |
    |        |                                                            |                                                                       
@@ -121,7 +148,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/08_mes_board.jpg                   |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/a/08_mes_board.jpg|
    |8       +------------------------------------------------------------+
    |        | Traco power Supply 12V to 24V, TRN-1215                    | 
    |        |                                                            |                                                                       
@@ -131,7 +158,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/a/09_mes_board.jpg                   |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/a/09_mes_board.jpg|
    |9       +------------------------------------------------------------+
    |        | Two screw terminals electrodes M and N                     | 
    |        |                                                            |                                                                       
@@ -141,7 +168,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/10_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/10_mes_board.jpg|
    |10       +------------------------------------------------------------+
    |         | Four screw terminals, for 12V power supply and for         | 
    |         | electrodes A and B                                         |                                                                       
@@ -151,7 +178,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/11_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/11_mes_board.jpg|
    |11       +------------------------------------------------------------+
    |         |  Soldering three capacitors (100nF)                        | 
    |         |                                                            |                                                                       
@@ -167,7 +194,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/12_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/12_mes_board.jpg|
    | 12      +------------------------------------------------------------+
    |         | 2 ohms shunt resistor pre-adjustment                       | 
    |         |                                                            |                                                                       
@@ -176,7 +203,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/13_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/13_mes_board.jpg|
    |13       +------------------------------------------------------------+
    |         | Soldering 2 ohms shunt resistor                            | 
    |         |                                                            |                                                                       
@@ -186,9 +213,9 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/14_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/14_mes_board.jpg|
    |14       +------------------------------------------------------------+
-   |         | 1 MOhm resistors                                          |
+   |         | 1 MOhm resistors                                           |
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+  
    
@@ -196,9 +223,9 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/15_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/15_mes_board.jpg|
    |15       +------------------------------------------------------------+
-   |         | Soldering tow 1 kOhm resistors                            |
+   |         | Soldering tow 1 kOhm resistors                             |
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
    
@@ -206,7 +233,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/16_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/16_mes_board.jpg|
    |16       +------------------------------------------------------------+
    |         | Soldering two 1.5 kOhm resistors                           |
    |         |                                                            |                                                                       
@@ -215,7 +242,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/17_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/17_mes_board.jpg|
    |17       +------------------------------------------------------------+
    |         | Soldering two 1.5 kOhms resistors                          |
    |         |                                                            |                                                                       
@@ -225,7 +252,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/18_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/18_mes_board.jpg|
    |18       +------------------------------------------------------------+
    |         | Female header 2 by 20 pins for Raspberry Pi connection     | 
    |         |                                                            |                                                                       
@@ -235,7 +262,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/19_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/19_mes_board.jpg|
    |19       +------------------------------------------------------------+
    |         | View of the female  header 2 by 20 pins installation       | 
    |         | for Raspberry Pi connection                                |                                                                       
@@ -245,7 +272,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/20_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/20_mes_board.jpg|
    |20       +------------------------------------------------------------+
    |         | Fixing MCP23008 component (Dot mark on the top left corner)| 
    |         |                                                            |                                                                       
@@ -255,7 +282,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/21_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/21_mes_board.jpg|
    |21       +------------------------------------------------------------+
    |         |Mounting optical relay, AQY211EH (Dot mark in the top left  | 
    |         |corners)                                                    |                                                                       
@@ -265,7 +292,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/22_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/22_mes_board.jpg|
    |22       +------------------------------------------------------------+
    |         | Mounting LM158 operational amplifier                       |
    |         |                                                            |                                                                       
@@ -275,7 +302,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/23_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/23_mes_board.jpg|
    |23       +------------------------------------------------------------+
    |         |  Mounting ADS115 board                                     | 
    |         |                                                            |                                                                       
@@ -285,7 +312,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
   
    +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/a/24_mes_board.jpg                   |
+   |         |   .. image::../../img/v2023.x.x/step_n_2/a/24_mes_board.jpg|
    |24       +------------------------------------------------------------+
    |         | Fixing the INA282 (Dot mark in the top right corner)       | 
    |         |                                                            |                                                                       
@@ -301,7 +328,7 @@ which allows to realize precise current measurement around a shunt resistor. The
 +------------------------------------------------------------------------+
 
 .. csv-table:: List of components
-   :file: step_n_2/b/test_2_xx.csv
+   :file: ../../img/v2023.x.x/step_n_2/b/test_2_xx.csv
    :widths: 30, 70, 70, 70, 70, 35, 35
    :header-rows: 1
 
@@ -309,7 +336,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/b/001.jpg                            |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/b/001.jpg         |
    |1       +------------------------------------------------------------+
    |        | Shutdown the raspberry Pi and unplug the power supply      | 
    |        |                                                            |                                                                       
@@ -319,7 +346,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
    
    +--------+--------------------------------------------------------------------------+
-   |        |   .. image:: step_n_2/b/001.jpg                                          |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/b/001.jpg                       |
    |2       +--------------------------------------------------------------------------+
    |        | Mounting the bottom spacers on the Raspberry Pi (male/female, 11mm, M3)  | 
    |        |                                                                          |                                                                       
@@ -329,7 +356,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
    
    +--------+--------------------------------------------------------------------------+
-   |        |   .. image:: step_n_2/b/002.jpg                                          |
+   |        |   .. image::../../img/v2023.x.x/step_n_2/b/002.jpg                       |
    |3       +--------------------------------------------------------------------------+
    |        | Mounting the upper spacers on the Raspberry Pi (female/female, 11mm, M3) | 
    |        |                                                                          |                                                                       
@@ -339,7 +366,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/b/003.jpg                            |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/b/003.jpg        |
    |4       +------------------------------------------------------------+
    |        | Mounting the OhmPi's measurement board on the Raspberry Pi | 
    |        |                                                            |                                                                       
@@ -349,7 +376,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/b/004.jpg                            |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/b/004.jpg        |
    |5       +------------------------------------------------------------+
    |        | Mounting the OhmPi's measurement board on the Raspberry Pi | 
    |        |                                                            |
@@ -359,7 +386,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/b/005.jpg                            |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/b/005.jpg        |
    |6       +------------------------------------------------------------+
    |        | Plug the power supply into a socket and connect it to your | 
    |        | Raspberry Pi's power port.                                 |
@@ -379,7 +406,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/i2cdetect.png                      |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/i2cdetect.png  |
    |1       +------------------------------------------------------------+
    |        |If everything is working, three I2C addresses should appear | 
    |        |on the screen.                                              |                                                                       
@@ -397,7 +424,7 @@ Setting up an equivalent electronic circuit, for this you will need:
    :align: left
  
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/ref_circuit.png                    |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/ref_circuit.png|
    |2       +------------------------------------------------------------+
    |        | Schematic of equivalent electronic circuit test            |                                                                       
    +--------+------------------------------------------------------------+
@@ -405,72 +432,72 @@ Setting up an equivalent electronic circuit, for this you will need:
 .. table::
    :align: center
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/20210905_122820.jpg                |
-   |3       +------------------------------------------------------------+
-   |        | Prepare the equivalent electronic circuit test             |                                                                       
-   +--------+------------------------------------------------------------+ 
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/20210905_122820.jpg |
+   |3       +-----------------------------------------------------------------+
+   |        | Prepare the equivalent electronic circuit test                  |                                                                       
+   +--------+-----------------------------------------------------------------+ 
 
   
 .. table::
    :align: center
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/20210905_123034.jpg                |
-   |4       +------------------------------------------------------------+
-   |        |  Prepare the battery connections and the terminals.        |                                                                       
-   +--------+------------------------------------------------------------+ 
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/20210905_123034.jpg |
+   |4       +-----------------------------------------------------------------+
+   |        |  Prepare the battery connections and the terminals.             |                                                                       
+   +--------+-----------------------------------------------------------------+ 
 
 
 .. table::
    :align: center
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/20210905_132856.jpg                |
-   |5       +------------------------------------------------------------+
-   |        | Soldering cables and terminals                             |                                                                       
-   +--------+------------------------------------------------------------+ 
+   +--------+--------------------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/20210905_132856.jpg                |
+   |5       +--------------------------------------------------------------------------------+
+   |        | Soldering cables and terminals                                                 |                                                                       
+   +--------+--------------------------------------------------------------------------------+ 
 
 
 .. table::
    :align: center
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/Inked20211206_150522_LI.jpg        |
-   |6       +------------------------------------------------------------+
-   |        |Install the red cables on the +12V terminal and black cable |                                                                       
-   |        |on the ground terminal. Connect to two different 12V        |
-   |        |batteries                                                   |
-   +--------+------------------------------------------------------------+ 
+   +--------+--------------------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/Inked20211206_150522_LI.jpg        |
+   |6       +--------------------------------------------------------------------------------+
+   |        |Install the red cables on the +12V terminal and black cable                     |                                                                       
+   |        |on the ground terminal. Connect to two different 12V                            |
+   |        |batteries                                                                       |
+   +--------+--------------------------------------------------------------------------------+ 
 
 .. table::
    :align: center
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/Inked20211206_150522_LI2.jpg       |
-   |7       +------------------------------------------------------------+
-   |        | Connect the equivalent electronic circuit test             |                                                                       
-   |        |                                                            |
-   +--------+------------------------------------------------------------+
+   +--------+--------------------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/Inked20211206_150522_LI2.jpg       |
+   |7       +--------------------------------------------------------------------------------+
+   |        | Connect the equivalent electronic circuit test                                 |                                                                       
+   |        |                                                                                |
+   +--------+--------------------------------------------------------------------------------+
    
    
 .. table::
    :align: center
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/thonny_first_interface.jpg         |
-   |7       +------------------------------------------------------------+
-   |        | Run the Thonny Interpreter                                 |                    
-   |        |                                                            |
-   +--------+------------------------------------------------------------+   
+   +--------+-------------------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/thonny_first_interface.jpg        |
+   |7       +-------------------------------------------------------------------------------+
+   |        | Run the Thonny Interpreter                                                    |                    
+   |        |                                                                               |
+   +--------+-------------------------------------------------------------------------------+   
 
 
 .. table::
    :align: center
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/c/20211206_144334.jpg                |
-   |7       +------------------------------------------------------------+
-   |        | Run sample_measurement_example.py example, if everything   |                    
-   |        | works you should  get the following result (220 Ohm)       |
-   +--------+------------------------------------------------------------+ 
+   +--------+------------------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_2/c/20211206_144334.jpg              |
+   |7       +------------------------------------------------------------------------------+
+   |        | Run sample_measurement_example.py example, if everything                     |                    
+   |        | works you should  get the following result (220 Ohm)                         |
+   +--------+------------------------------------------------------------------------------+ 
diff --git a/doc/source/source_rst/hardware/mb_2024.rst b/doc/source/source_rst/hardware/mb_2024.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2497966a75b1fdf1127122e14cc227e49ceab10b
--- /dev/null
+++ b/doc/source/source_rst/hardware/mb_2024.rst
@@ -0,0 +1,7 @@
+.. warning::
+    **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.**
+
+
+Measurement board v2024
+=======================
+
diff --git a/doc/source/Ohmpi_V2023/V2023_step_03.rst b/doc/source/source_rst/hardware/mux_2023.rst
similarity index 81%
rename from doc/source/Ohmpi_V2023/V2023_step_03.rst
rename to doc/source/source_rst/hardware/mux_2023.rst
index c6c4e47265a5f6b4d447cfe005725d2355baa863..79791372ee215f80bca157b6a48b935d7614608d 100644
--- a/doc/source/Ohmpi_V2023/V2023_step_03.rst
+++ b/doc/source/source_rst/hardware/mux_2023.rst
@@ -5,7 +5,7 @@
 
 
 
-**STEP n°3:** MUX board
+MUX board v2023
 ****************************************************
 The multiplexing of the channels is a mechanical multiplexing based on OMRON's manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with 
 a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs. 
@@ -21,7 +21,7 @@ In the following presentation for an OhmPi 64 electrodes, we will use the addres
 Required components 
 ----------------------------------------------------
 
-.. figure:: step_n_3/a/MUX_board_components.jpg
+.. figure:: ../../img/v2023.x.x/step_n_3/a/MUX_board_components.jpg
        :width: 600px
        :align: center
        :height: 650px
@@ -30,7 +30,7 @@ Required components
 
 
 .. csv-table:: List of components
-   :file: step_n_3/a/MUX_board_list_2_xx.csv
+   :file: ../../img/v2023.x.x/step_n_3/a/MUX_board_list_2_xx.csv
    :widths: 30, 70, 70, 70, 70, 35, 35
    :header-rows: 1 
    
@@ -38,18 +38,18 @@ Required components
 .. table::
    :align: center
    
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_00.jpg                         |
-   |      1 +------------------------------------------------------------+
-   |        |Mux board pcb                                               | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
+   +--------+--------------------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_00.jpg                         |
+   |      1 +--------------------------------------------------------------------------------+
+   |        |Mux board pcb                                                                   | 
+   |        |                                                                                |                                                                       
+   +--------+--------------------------------------------------------------------------------+
 
 .. table::
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_01.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_01.jpg     |
    |      2 +------------------------------------------------------------+
    |        |Installation of the 100 kOhm resistors                      |
    |        |                                                            |                                                                       
@@ -59,7 +59,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_02.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_02.jpg     |
    |      3 +------------------------------------------------------------+
    |        |Installation of the MOSFET ZVN4206A                         |
    |        |                                                            |                                                                       
@@ -70,7 +70,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_03.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_03.jpg     |
    |      4 +------------------------------------------------------------+
    |        |Installation of the diode 1N4007                            |
    |        |                                                            |                                                                       
@@ -80,7 +80,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_04.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_04.jpg     |
    |      5 +------------------------------------------------------------+
    |        |Installation of the relay                                   | 
    |        |                                                            |                                                                       
@@ -90,7 +90,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_05.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_05.jpg     |
    |      6 +------------------------------------------------------------+
    |        |Installation of the terminal screw                          | 
    |        |                                                            |                                                                       
@@ -100,7 +100,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_06.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_06.jpg     |
    |      7 +------------------------------------------------------------+
    |        |Installation of generic male header                         | 
    |        |                                                            |                                                                       
@@ -110,7 +110,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_07.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_07.jpg     |
    |      8 +------------------------------------------------------------+
    |        |Installation of Pin strip (6 pins)  and pin strip (16 pins) | 
    |        |                                                            |                                                                       
@@ -120,7 +120,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_08.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_08.jpg     |
    |      9 +------------------------------------------------------------+
    |        |Installation of DIP Dual In Line Socket 2*14                | 
    |        |                                                            |                                                                       
@@ -130,7 +130,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_09.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_09.jpg     |
    |     10 +------------------------------------------------------------+
    |        |Installation of Adafruit TCA9548A                           | 
    |        |                                                            |                                                                       
@@ -140,7 +140,7 @@ Required components
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/a/MUX_10.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_10.jpg     |
    |     10 +------------------------------------------------------------+
    |        |Installation of MCP23017                                    | 
    |        |                                                            |                                                                       
@@ -161,12 +161,12 @@ For the A electrode board, we suggest addressing it with address 0x70:
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/b/A_0x70.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/A_0x70.jpg     |
    |     1  +------------------------------------------------------------+
    |        |Mount the jumpers and note the value of the address and the |
    |        |electrode name on the mux board (A).                        |                                                                       
    |        +------------------------------------------------------------+  
-   |        |   .. image:: step_n_3/b/A_0x70-a.jpg                       |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/A_0x70-a.jpg   |
    |        +------------------------------------------------------------+
    |        |Zoom on the jumper                                          | 
    |        |                                                            |   
@@ -181,12 +181,12 @@ For the B electrode board, we suggest addressing it with address 0x71:
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/b/B_0x71.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/B_0x71.jpg     |
    |     2  +------------------------------------------------------------+
    |        |Mount the jumpers and note the value of the address and the |
    |        |electrode name on the mux board (B).                        |                                                                       
    |        +------------------------------------------------------------+  
-   |        |   .. image:: step_n_3/b/B_0x71-a.jpg                       |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/B_0x71-a.jpg   |
    |        +------------------------------------------------------------+
    |        |Zoom on the jumper                                          | 
    |        |                                                            |   
@@ -198,12 +198,12 @@ For the N electrode board, we suggest addressing it with address 0x72:
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/b/M_0x72.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/M_0x72.jpg     |
    |     3  +------------------------------------------------------------+
    |        |Mount the jumpers and note the value of the address and the |
    |        |electrode name on the mux board (B).                        |                                                                     
    |        +------------------------------------------------------------+  
-   |        |   .. image:: step_n_3/b/M_0x72-a.jpg                       |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/M_0x72-a.jpg   |
    |        +------------------------------------------------------------+
    |        |Zoom on the jumper                                          | 
    |        |                                                            |   
@@ -215,12 +215,12 @@ For the M electrode board, we suggest addressing it with address 0x73:
    :align: center
    
    +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/b/N_0x73.jpg                         |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/N_0x73.jpg     |
    |     4  +------------------------------------------------------------+
    |        |Mount the jumpers and note the value of the address and the |
    |        |electrode name on the mux board (B).                        |                                                                     
    |        +------------------------------------------------------------+  
-   |        |   .. image:: step_n_3/b/N_0x73-a.jpg                       |
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/N_0x73-a.jpg   |
    |        +------------------------------------------------------------+
    |        |Zoom on the jumper                                          | 
    |        |                                                            |   
@@ -234,41 +234,41 @@ To test the Mux boards, it will be necessary first to make a simplified assembly
 The first thing to do is to prepare a 50 cm long flat wire with two 6-poles connectors.
 
 
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/c/20211207_115706.jpg                |
-   |     1  +------------------------------------------------------------+
-   |        |Build a cable with 6 contacts with 6 pins connector.        |
-   |        |                                                            |                                                                     
-   +--------+------------------------------------------------------------+ 
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20211207_115706.jpg |
+   |     1  +-----------------------------------------------------------------+
+   |        |Build a cable with 6 contacts with 6 pins connector.             |
+   |        |                                                                 |                                                                     
+   +--------+-----------------------------------------------------------------+ 
  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/c/20220124_142929.jpg                |
-   |     2  +------------------------------------------------------------+
-   |        |Prepare the measurement board and the first mux board by    |
-   |        |example the card with address 0x71.                         |                                                                     
-   +--------+------------------------------------------------------------+
-
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/c/20220124_143105.jpg                |
-   |     3  +------------------------------------------------------------+
-   |        |Connect the 12V power supply cables to the MUX board        |
-   |        |without powering the board.                                 |                                                                     
-   +--------+------------------------------------------------------------+   
-
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/c/20220207_154111.jpg                |
-   |     4  +------------------------------------------------------------+
-   |        |Connect the 12V power supply screw terminal of the mux      |
-   |        |board to the 12V screw terminal power supply of the         |
-   |        |measurement board.                                                      |
-   +--------+------------------------------------------------------------+   
-
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/c/20220124_143823.jpg                |
-   |     5  +------------------------------------------------------------+
-   |        |Connect the 6-contact cable                                 |
-   |        |                                                            |                                                                     
-   +--------+------------------------------------------------------------+
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_142929.jpg |
+   |     2  +-----------------------------------------------------------------+
+   |        |Prepare the measurement board and the first mux board by         |
+   |        |example the card with address 0x71.                              |                                                                     
+   +--------+-----------------------------------------------------------------+
+
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_143105.jpg |
+   |     3  +-----------------------------------------------------------------+
+   |        |Connect the 12V power supply cables to the MUX board             |
+   |        |without powering the board.                                      |                                                                     
+   +--------+-----------------------------------------------------------------+   
+
+   +--------+------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220207_154111.jpg  |
+   |     4  +------------------------------------------------------------------+
+   |        |Connect the 12V power supply screw terminal of the mux            |
+   |        |board to the 12V screw terminal power supply of the               |
+   |        |measurement board.                                                |
+   +--------+------------------------------------------------------------------+   
+
+   +--------+------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_143823.jpg  |
+   |     5  +------------------------------------------------------------------+
+   |        |Connect the 6-contact cable                                       |
+   |        |                                                                  |                                                                     
+   +--------+------------------------------------------------------------------+
    
 
 Start your 12V power supply, the raspberry must start. 
diff --git a/doc/source/source_rst/hardware/mux_2024.rst b/doc/source/source_rst/hardware/mux_2024.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3b4cc2e965d658fa2960ad535556f1d41aea92a2
--- /dev/null
+++ b/doc/source/source_rst/hardware/mux_2024.rst
@@ -0,0 +1,292 @@
+
+
+.. warning::
+    **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.**
+
+
+
+MUX board v2024
+****************************************************
+
+**TO BE UPDATED**
+
+The multiplexing of the channels is a mechanical multiplexing based on OMRON's manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with 
+a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs. 
+We used gpio expander I2C (MCP23017). We have associated these components with an I2C multiplexer of type type TCA9548A from adafruit.
+This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each card has its own digital address between 0X70 and 0X77. 
+In the following presentation for an OhmPi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N.
+0X73 for the N channel. 4 MUX board will be needed to multiplex an OhmPi 64 electrodes.
+
+**PART A** Assembly of MUX board
+======================================================
+
+
+Required components 
+----------------------------------------------------
+
+.. figure:: ../../img/v2023.x.x/step_n_3/a/MUX_board_components.jpg
+       :width: 600px
+       :align: center
+       :height: 650px
+       :alt: alternate text
+       :figclass: align-center
+
+
+.. csv-table:: List of components
+   :file: ../../img/v2023.x.x/step_n_3/a/MUX_board_list_2_xx.csv
+   :widths: 30, 70, 70, 70, 70, 35, 35
+   :header-rows: 1 
+   
+   
+.. table::
+   :align: center
+   
+   +--------+--------------------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_00.jpg                         |
+   |      1 +--------------------------------------------------------------------------------+
+   |        |Mux board pcb                                                                   | 
+   |        |                                                                                |                                                                       
+   +--------+--------------------------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_01.jpg     |
+   |      2 +------------------------------------------------------------+
+   |        |Installation of the 100 kOhm resistors                      |
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_02.jpg     |
+   |      3 +------------------------------------------------------------+
+   |        |Installation of the MOSFET ZVN4206A                         |
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+      
+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_03.jpg     |
+   |      4 +------------------------------------------------------------+
+   |        |Installation of the diode 1N4007                            |
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+    
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_04.jpg     |
+   |      5 +------------------------------------------------------------+
+   |        |Installation of the relay                                   | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_05.jpg     |
+   |      6 +------------------------------------------------------------+
+   |        |Installation of the terminal screw                          | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_06.jpg     |
+   |      7 +------------------------------------------------------------+
+   |        |Installation of generic male header                         | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+ 
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_07.jpg     |
+   |      8 +------------------------------------------------------------+
+   |        |Installation of Pin strip (6 pins)  and pin strip (16 pins) | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_08.jpg     |
+   |      9 +------------------------------------------------------------+
+   |        |Installation of DIP Dual In Line Socket 2*14                | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_09.jpg     |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of Adafruit TCA9548A                           | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_10.jpg     |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of MCP23017                                    | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+   
+.. note:: 
+     This step must be duplicated 4 times for every Mux card.
+
+
+**PART B** MUX board address
+====================================================== 
+To build an ohmpi it is necessary to have 4 MUX boards, with 4 different addresses. It is therefore necessary to identify each board, by assigning an address, which will be allocated in the OhmPi code.
+We present here the addresses selected by default.
+
+For the A electrode board, we suggest addressing it with address 0x70:
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/A_0x70.jpg     |
+   |     1  +------------------------------------------------------------+
+   |        |Mount the jumpers and note the value of the address and the |
+   |        |electrode name on the mux board (A).                        |                                                                       
+   |        +------------------------------------------------------------+  
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/A_0x70-a.jpg   |
+   |        +------------------------------------------------------------+
+   |        |Zoom on the jumper                                          | 
+   |        |                                                            |   
+   +--------+------------------------------------------------------------+   
+
+  
+
+   
+For the B electrode board, we suggest addressing it with address 0x71:
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/B_0x71.jpg     |
+   |     2  +------------------------------------------------------------+
+   |        |Mount the jumpers and note the value of the address and the |
+   |        |electrode name on the mux board (B).                        |                                                                       
+   |        +------------------------------------------------------------+  
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/B_0x71-a.jpg   |
+   |        +------------------------------------------------------------+
+   |        |Zoom on the jumper                                          | 
+   |        |                                                            |   
+   +--------+------------------------------------------------------------+ 
+
+For the N electrode board, we suggest addressing it with address 0x72:
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/M_0x72.jpg     |
+   |     3  +------------------------------------------------------------+
+   |        |Mount the jumpers and note the value of the address and the |
+   |        |electrode name on the mux board (B).                        |                                                                     
+   |        +------------------------------------------------------------+  
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/M_0x72-a.jpg   |
+   |        +------------------------------------------------------------+
+   |        |Zoom on the jumper                                          | 
+   |        |                                                            |   
+   +--------+------------------------------------------------------------+ 
+
+For the M electrode board, we suggest addressing it with address 0x73: 
+  
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/N_0x73.jpg     |
+   |     4  +------------------------------------------------------------+
+   |        |Mount the jumpers and note the value of the address and the |
+   |        |electrode name on the mux board (B).                        |                                                                     
+   |        +------------------------------------------------------------+  
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/b/N_0x73-a.jpg   |
+   |        +------------------------------------------------------------+
+   |        |Zoom on the jumper                                          | 
+   |        |                                                            |   
+   +--------+------------------------------------------------------------+    
+
+**PART C** Validation of MUX board
+======================================================
+The first step is to test the Mux boards before assembling them definitively.
+To test the Mux boards, it will be necessary first to make a simplified assembly of the Mux board and the measurement board.
+
+The first thing to do is to prepare a 50 cm long flat wire with two 6-poles connectors.
+
+
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20211207_115706.jpg |
+   |     1  +-----------------------------------------------------------------+
+   |        |Build a cable with 6 contacts with 6 pins connector.             |
+   |        |                                                                 |                                                                     
+   +--------+-----------------------------------------------------------------+ 
+ 
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_142929.jpg |
+   |     2  +-----------------------------------------------------------------+
+   |        |Prepare the measurement board and the first mux board by         |
+   |        |example the card with address 0x71.                              |                                                                     
+   +--------+-----------------------------------------------------------------+
+
+   +--------+-----------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_143105.jpg |
+   |     3  +-----------------------------------------------------------------+
+   |        |Connect the 12V power supply cables to the MUX board             |
+   |        |without powering the board.                                      |                                                                     
+   +--------+-----------------------------------------------------------------+   
+
+   +--------+------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220207_154111.jpg  |
+   |     4  +------------------------------------------------------------------+
+   |        |Connect the 12V power supply screw terminal of the mux            |
+   |        |board to the 12V screw terminal power supply of the               |
+   |        |measurement board.                                                |
+   +--------+------------------------------------------------------------------+   
+
+   +--------+------------------------------------------------------------------+
+   |        |   .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_143823.jpg  |
+   |     5  +------------------------------------------------------------------+
+   |        |Connect the 6-contact cable                                       |
+   |        |                                                                  |                                                                     
+   +--------+------------------------------------------------------------------+
+   
+
+Start your 12V power supply, the raspberry must start. 
+
+Run the terminal and write:
+
+ .. code-block:: python
+
+     i2cdetect -y 1
+
+Three addresses should appear, including the address of the MUX board you have selected. This implies that your board has been detected.
+
+Open the script called "test_mux_board.py".
+
+Run the script
+
+   
+   
\ No newline at end of file
diff --git a/doc/source/Ohmpi_V2024/mux_2024/mux_2024_address_jumpers.png b/doc/source/source_rst/hardware/mux_2024_address_jumpers.png
similarity index 100%
rename from doc/source/Ohmpi_V2024/mux_2024/mux_2024_address_jumpers.png
rename to doc/source/source_rst/hardware/mux_2024_address_jumpers.png
diff --git a/doc/source/V2023.rst b/doc/source/source_rst/software.rst
similarity index 70%
rename from doc/source/V2023.rst
rename to doc/source/source_rst/software.rst
index 3b7c7486058b2f5aa91443199dcae18cabbc1b4c..d31d9d8e46078672cf4004a51289553dc7385b84 100644
--- a/doc/source/V2023.rst
+++ b/doc/source/source_rst/software.rst
@@ -1,93 +1,17 @@
 ********************************************
-OhmPi V2023 (64 electrodes and 12V)
+Software and operation
 ******************************************** 
 
 .. warning::
   **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OhmPi. The OhmPi team cannot be held responsible if the equipment does not work after assembly.**
 
 
-
-.. figure:: image_ohmpi_2.jpg
-     :width: 400px
-     :align: center
-     :height: 350px
-     :alt: OhmPi V: 2023.0.0-rc1
-     :figclass: align-center
-
-.. note:: 
-   In this version, we have developed two new board types that allow the assembly of OhmPi v2023, a measurement board and a multiplexer board.
-   This new version is made up of:
-
-   1. A measurement board for four-point measurement
-
-   2. 4 multiplexer cards
-
-   3. A box
-
-  The OhmPi V2023 software has been adapted to handle this new boards and also includes many new functionalities.
-
-The philosophy of OhmPi
-========================
-
-The philosophy of OhmPi V2023 is to offer a new DIY multi-electrode resistivity meter. It is a resistivity meter with 64 electrodes, which can be upgraded to 128 electrodes.
-It is limited to low-current injection, but suitable for small laboratory experiments and small field time-lapse monitoring.
-OhmPi is developed by a team that seeks to share its experience and wishes to improve and offer a more and more robust tool to the community. OhmPi 2023 is completely different version from the previous one. 
-We will stop the development on the version V1.0x, to dedicate our efforts on this new version.
-
-=============================================================================================================================================================
-
-Hardware
-========
-
-Specifications
---------------
-
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-| **Parameter**                 |       **V1.0x**       | Units     |       **v2023**       | Units     |
-+===============================+=======================+===========+=======================+===========+
-|Electrodes                     |32                     |           |64 to 128              |           |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Operating temperature          |-0 to 50               |°c         |-25 to 50              |°C         |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Power consumption of CPU and   |18.5                   |W          |18.5                   |W          |
-|control system                 |                       |           |                       |           |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Voltage injection              |12                     |V          |12                     |V          |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Battery                        |9                      |V          |12                     |V          |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Current                        |0 to 40                |mA         |0 to 40                |mA         |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Min pulse duration             |150                    |ms         |150                    |ms         |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Input impedance                |80                     |MOhm       |80                     |MOhm       |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Data storage                   |micro SD card          |           |micro SD card          |           |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-|Resolution                     |0.01                   |Ohm        |0.01                   |Ohm        |
-+-------------------------------+-----------------------+-----------+-----------------------+-----------+
-
-Building an OhmPi V2023 step by step
-------------------------------------
-
-.. toctree::
-   :maxdepth: 2
-
-   Ohmpi_V2023/V2023_step_01
-   Ohmpi_V2023/V2023_step_02
-   Ohmpi_V2023/V2023_step_03
-   Ohmpi_V2023/V2023_step_04
-
-
-Software and operation
-======================
-
 System architecture
 -------------------
 
 The OhmPi V2023 software is designed around a new architecture whose main components are summarized in the figure below.
 
-.. figure:: img/architecture.png
+.. figure:: ../img/architecture.png
 
      Software architecture of OhmPi V2023.
 
@@ -150,17 +74,17 @@ Once configured, the webserver should start by itself on start and once
 connected to the Pi, the user can go to `10.3.141.1:8080 <http://10.3.141.1:8080>`_
 to access the interface.
 
-.. figure:: img/http-interface-pseudo-section.png
+.. figure:: ../img/http-interface-pseudo-section.png
 
     Web interface with its interactive pseudo-section.
 
 
-.. figure:: img/http-interface-evolution.png
+.. figure:: ../img/http-interface-evolution.png
 
      Evolution of quadrupole apparent resistivity with time.
 
 
-.. figure:: img/http-interface-rs.png
+.. figure:: ../img/http-interface-rs.png
 
      Contact resistance check.
 
@@ -305,20 +229,20 @@ This may help designing complex IoT experiments and monitoring systems in which
 Examples incorporating execution commands and data outputs from OhmPi can be found in the OhmPi examples. Once Node-RED is installed on the OhmPi, these examples can be accessed separately by running a command in the console such as :
 
 .. code-block:: console
-     node-red basic_ohmpi_flows_node-red.json
+    node-red basic_ohmpi_flows_node-red.json
 
 These examples may require installing some additional node packages in order to work properly. This can be done in the `Palette Manager <https://nodered.org/docs/user-guide/editor/palette/manager> within Node-RED.
 
-.. figure:: img/node-red_flow.png
+.. figure:: ../img/node-red_flow.png
 
      Example flow in node-red to interact with an OhmPi.
 
 
-.. figure:: img/node-red_interface_control.png
+.. figure:: ../img/node-red_interface_control.png
 
      Example of a dashboard UI created with node-red to interact with an OhmPi - control tab.
      
-.. figure:: img/node-red_interface_data.png
+.. figure:: ../img/node-red_interface_data.png
 
      Example of a dashboard UI created with node-red to interact with an OhmPi - data visualization tab.
 
diff --git a/doc/source/source_rst/troubleshooting.rst b/doc/source/source_rst/troubleshooting.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cc0e094a68803d7d9de3f8ba2b9ae7975bf09653
--- /dev/null
+++ b/doc/source/source_rst/troubleshooting.rst
@@ -0,0 +1,32 @@
+Troubleshooting
+********************
+
+**TO BE REVIEWED**
+
+Issue with the pulses between A and B
+=====================================
+
+In the measurement board v2023, this is likely due to the optical relays not opening or closing properly. These relays are quite fragile and, from experience, are easily damaged. Check if the optical relay are still working by measuring if they are conductor when turned on using a multimeter without connecting any electrodes to A and B.
+
+If an optical relay is broken, you will have to replace it with a new one.
+
+In the measurement board v2024, these optical relays are replaced by mechanical relays which are more robust and shoudn't cause any issue.
+
+
+Values given is not the correct one
+===================================
+
+One possible cause is that the **shunt resistor was burned**. Once burned, the value of the resistor is not correct anymore and we advice to change it. To see if the shunt is burned, you can measure the value of the shunt resistor to see if it still has the expected value.
+
+Another possibility is that the MN voltage you are trying to measure is **over the range of the ADC** (+/- 4.5 V effective range for ADS1115). You can easily check that by measuring the voltage at MN with a voltmeter.
+
+In the measurement board v2024, the current sensing part is replaced by a click board. It is possible that the shunt resistance on this click board is burned due to malfunction. In this case, erroneous value of current will be given. The click board must be replaced to solve the issue.
+
+
+Communication issue between components
+======================================
+
+Most components of the OhmPi communicate via I2C protocol. This protocol works with two lines (SDA and SCL) that **must be pulled-up** at rest. The pull-up resistor consist in placing a 100k (or similar values) resistor between the line and VDD (5V in this case).
+
+Check with the multimeter the voltage between SDA/SCL and the ground to see if it reaches 5V at rest. If it's not the case, you may need stronger pull-up (smaller value of pull-up resistor).
+
diff --git a/doc/source/V1_01.rst b/doc/source/source_rst/v1.xx/V1_01.rst
similarity index 97%
rename from doc/source/V1_01.rst
rename to doc/source/source_rst/v1.xx/V1_01.rst
index 474ea7091e8488a305cecd947b1db10e4ec4c63c..1829d683ca5e110f3d9303c8da9b71c403096b29 100644
--- a/doc/source/V1_01.rst
+++ b/doc/source/source_rst/v1.xx/V1_01.rst
@@ -62,7 +62,7 @@ For this step, the installation instructions are well described on the Raspberry
 .. note:: 
      All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
      
-     .. figure:: raspbian_version.jpg
+     .. figure:: ../../img/raspbian_version.jpg
        :width: 800px
        :align: center
        :height: 400px
@@ -162,7 +162,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 2- Thonny opens, Python runs on the root (Python 3.7.3 (/usr/bin/python3))
 
-.. figure:: thonny_first_interface.jpg
+.. figure:: ../../img/thonny_first_interface.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -171,7 +171,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 3-Click on **Run>select interpreter**, a new window opens click on interpret
 
-.. figure:: thonny_option.jpg
+.. figure:: ../../img/thonny_option.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -180,7 +180,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 4-On the new open windows select **alternative Python3 or virtual environment**
 
-.. figure:: thonny_interpreter.jpg
+.. figure:: ../../img/thonny_interpreter.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -193,7 +193,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 7- In the **known interpreter** tab the path of the virtual environment should appear
 
-.. figure:: thonny_interpreter_folder.jpg
+.. figure:: ../../img/thonny_interpreter_folder.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -246,7 +246,7 @@ A shortcut between Electrodes A and B will generate excessive currents, whose in
 A lithium ion battery or automobile-type lead-acid battery can deliver a strong enough current to damage the board and, as such, 
 constitutes a potential hazard. We therefore recommend adding a 1.5-A fuse between the battery and resistor R9.
 
-.. figure:: schema_measurement_board.jpg
+.. figure:: ../../img/schema_measurement_board.jpg
    :width: 800px
    :align: center
    :height: 400px
@@ -303,7 +303,7 @@ Once all the components have been soldered together, the measurement board can b
 battery terminal, according to Figure 9. Between the battery and the TX+ terminal of the measurement board, remember to 
 place a fuse holder with a 1.5-A fuse for safety purposes.
 
-.. figure:: measurement_board.jpg
+.. figure:: ../../img/v1.xx/measurement_board.jpg
    :width: 800px
    :align: center
    :height: 500px
@@ -312,7 +312,7 @@ place a fuse holder with a 1.5-A fuse for safety purposes.
 
    Measurement circuit board assembly: a) printed circuit board, b) adding the 1-KOhm resistors ± 1%, c)adding the 1.5-KOhm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers
    
-.. figure:: measurement_board-2.jpg
+.. figure:: ../../img/v1.xx/measurement_board-2.jpg
    :width: 800px
    :align: center
    :height: 700px
@@ -336,7 +336,7 @@ the polarity at electrodes A and B. Thus, when relays 3 and 4 are energized by t
 the positive battery pole is connected to electrode A and the negative pole to electrode B. When not energized, 
 they remain in the normally closed position. This set-up offers a simple and robust solution to inject current.
 
-.. figure:: current_board.jpg
+.. figure:: ../../img/v1.xx/current_board.jpg
    :width: 800px
    :align: center
    :height: 400px
@@ -353,7 +353,7 @@ the relay card’s 4 channels respectively to the GND pin and 5Vcc of the Raspbe
 shown in the diagram, using 1-mm2 cables (red and black in Fig. 10). Lastly, connect the inputs of relay 1 and 2 respectively
 to terminals B and A of the measurement board.   
 
-.. figure:: installation_current_board.jpg
+.. figure:: ../../img/v1.xx/installation_current_board.jpg
    :width: 800px
    :align: center
    :height: 700px
@@ -390,7 +390,7 @@ configuration enables making smaller multiplexers (8 or 16 electrodes only). On
 which is entirely possible, a GPIO channel multiplier will have to be used. 
 To prepare the multiplexer, the channels of the two relay boards must be connected according to the wiring diagram shown below.
 
-.. figure:: multiplexer_implementation.jpg
+.. figure::../../img/v1.xx/multiplexer_implementation.jpg
    :width: 800px
    :align: center
    :height: 500px
@@ -409,7 +409,7 @@ Once the operation has been completed, the 16 control pins of each 16-channel re
 for activating each relay (Fig. 12). However, we will be activating several relays with a single GPIO (to limit the number of GPIOs used on Raspberry Pi,
 see Section 2.4). To execute this step, it will be necessary to follow the protocol presented in Figure.
  
- .. figure:: connection.jpg
+ .. figure:: ../../img/v1.xx/connection.jpg
    :width: 800px
    :align: center
    :height: 400px
@@ -451,7 +451,7 @@ At this point, all that remains is to connect the electrodes of each multiplexer
 According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming 
 connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.
 
-.. figure:: cable.jpg
+.. figure:: ../../img/v1.xx/cable.jpg
    :width: 800px
    :align: center
    :height: 300px
@@ -464,7 +464,7 @@ the next figure provides an example of multiplexer relay connections for electro
 must be connected to electrode no. 1 of MUX N, which in turn must be connected to electrode no. 1 of MUX M. Lastly, electrode no. 1 of MUX M is connected to the terminal block. 
 This operation must be repeated for all 32 electrodes.
 
-.. figure:: electrode_cable.jpg
+.. figure:: ../../img/v1.xx/electrode_cable.jpg
    :width: 800px
    :align: center
    :height: 800px
@@ -524,7 +524,7 @@ Complete list of components
 
 
 .. csv-table:: Table Title
-   :file: list.csv
+   :file: ../../bom_list/list.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/doc/source/V1_02.rst b/doc/source/source_rst/v1.xx/V1_02.rst
similarity index 97%
rename from doc/source/V1_02.rst
rename to doc/source/source_rst/v1.xx/V1_02.rst
index 6dad02c86ccf2e61b98712c1b419467572497792..a486b855f6f4e36a316d04debb2b2876a9066277 100644
--- a/doc/source/V1_02.rst
+++ b/doc/source/source_rst/v1.xx/V1_02.rst
@@ -64,7 +64,7 @@ For this step, the installation instructions are well described on the Raspberry
 .. note:: 
      All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
 
-     .. figure:: raspbian_version.jpg
+     .. figure:: ../../img/raspbian_version.jpg
        :width: 800px
        :align: center
        :height: 400px
@@ -164,7 +164,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 2- Thonny opens, Python runs on the root (Python 3.7.3 (/usr/bin/python3))
 
-.. figure:: thonny_first_interface.jpg
+.. figure:: ../../img/thonny_first_interface.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -173,7 +173,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 3-Click on **Run>select interpreter**, a new window opens click on interpret
 
-.. figure:: thonny_option.jpg
+.. figure:: ../../img/thonny_option.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -182,7 +182,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 4-On the new open windows select **alternative Python3 or virtual environment**
 
-.. figure:: thonny_interpreter.jpg
+.. figure:: ../../img/thonny_interpreter.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -195,7 +195,7 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 7- In the **known interpreter** tab the path of the virtual environment should appear
 
-.. figure:: thonny_interpreter_folder.jpg
+.. figure:: ../../img/thonny_interpreter_folder.jpg
        :width: 600px
        :align: center
        :height: 450px
@@ -253,7 +253,7 @@ We also added 4 capacitors on the +12v inputs of the fast operational amplifiers
 between each power supply terminal and ground. The last point, we have added a four very high resistances of 10 MOhm, between the ground and 
 the signal input on the operational amplifiers. This prevents the operational amplifiers from overheating.
 
-.. figure:: schema_measurement_board1_02.png
+.. figure:: ../../img/v1.xx/schema_measurement_board1_02.png
    :width: 800px
    :align: center
    :height: 400px
@@ -317,7 +317,7 @@ Once all the components have been soldered together, the measurement board can b
 battery terminal, according to Figure 9. Between the battery and the TX+ terminal of the measurement board, remember to 
 place a fuse holder with a 1.5-A fuse for safety purposes.
 
-.. figure:: measurement_board1-02.jpg
+.. figure:: ../../img/v1.xx/measurement_board1-02.jpg
    :width: 800px
    :align: center
    :height: 700px
@@ -326,7 +326,7 @@ place a fuse holder with a 1.5-A fuse for safety purposes.
 
    Measurement circuit board assembly: a) printed circuit board, b) adding the 1-KOhm resistors ± 1%, c)adding the 1.5-KOhm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers
    
-.. figure:: measurement_board-2-V1-02.jpg
+.. figure:: ../../img/v1.xx/measurement_board-2-V1-02.jpg
    :width: 800px
    :align: center
    :height: 700px
@@ -350,7 +350,7 @@ the polarity at electrodes A and B. Thus, when relays 3 and 4 are energized by t
 the positive battery pole is connected to electrode A and the negative pole to electrode B. When not energized, 
 they remain in the normally closed position. This set-up offers a simple and robust solution to inject current.
 
-.. figure:: current_board.jpg
+.. figure:: ../../img/v1.xx/current_board.jpg
    :width: 800px
    :align: center
    :height: 400px
@@ -367,7 +367,7 @@ the relay card’s 4 channels respectively to the GND pin and 5Vcc of the Raspbe
 shown in the diagram, using 1-mm2 cables (red and black in Fig. 10). Lastly, connect the inputs of relay 1 and 2 respectively
 to terminals B and A of the measurement board.   
 
-.. figure:: installation_current_board_1_02.jpg
+.. figure:: ../../img/v1.xx/installation_current_board_1_02.jpg
    :width: 800px
    :align: center
    :height: 700px
@@ -404,7 +404,7 @@ configuration enables making smaller multiplexers (8 or 16 electrodes only). On
 which is entirely possible, a GPIO channel multiplier will have to be used. 
 To prepare the multiplexer, the channels of the two relay boards must be connected according to the wiring diagram shown below.
 
-.. figure:: multiplexer_implementation.jpg
+.. figure:: ../../img/v1.xx/multiplexer_implementation.jpg
    :width: 800px
    :align: center
    :height: 500px
@@ -423,7 +423,7 @@ Once the operation has been completed, the 16 control pins of each 16-channel re
 for activating each relay (Fig. 12). However, we will be activating several relays with a single GPIO (to limit the number of GPIOs used on Raspberry Pi,
 see Section 2.4). To execute this step, it will be necessary to follow the protocol presented in Figure.
  
- .. figure:: connection.jpg
+ .. figure:: ../../img/v1.xx/connection.jpg
    :width: 800px
    :align: center
    :height: 400px
@@ -465,7 +465,7 @@ At this point, all that remains is to connect the electrodes of each multiplexer
 According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming 
 connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.
 
-.. figure:: cable.jpg
+.. figure:: ../../img/v1.xx/cable.jpg
    :width: 800px
    :align: center
    :height: 300px
@@ -478,7 +478,7 @@ the next figure provides an example of multiplexer relay connections for electro
 must be connected to electrode no. 1 of MUX N, which in turn must be connected to electrode no. 1 of MUX M. Lastly, electrode no. 1 of MUX M is connected to the terminal block. 
 This operation must be repeated for all 32 electrodes.
 
-.. figure:: electrode_cable.jpg
+.. figure:: ../../img/v1.xx/electrode_cable.jpg
    :width: 800px
    :align: center
    :height: 800px
@@ -539,7 +539,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: list - 1_02.csv
+   :file: ../../bom_list/list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/index.html b/index.html
index 99805072828a1187878bb6a598d9143ccec8105f..5077a26640f318bf93168c7b2d8e3348cc9f170b 100755
--- a/index.html
+++ b/index.html
@@ -30,7 +30,8 @@ mosquitto_sub -h raspberrypi.local -t ohmpi_0001/ctrl
         <button id='runBtn' type="button" class="btn btn-primary">&#9654</button>
         <button id='stopBtn' type="button" class="btn btn-warning">&#9724</button>
         <!-- upload button for csv which display the table ABMN -->
-        <button id="removeDataBtn" type="button" class="btn btn-danger">Clear data</button>
+        <!-- <button id="removeDataBtn" type="button" class="btn btn-danger">Clear data</button> -->
+        <button id="rmDataModal" type="button" class="btn btn-danger" data-toggle="modal" data-target="#rmModal">Clear data</button>
         <button id="getDataBtn" type="button" class="btn btn-info">Get data</button>
         <div class="form-check">
             <input id="dataRetrievalCheck" class="form-check-input" type="checkbox" value="">
@@ -93,7 +94,7 @@ mosquitto_sub -h raspberrypi.local -t ohmpi_0001/ctrl
                 <div class="modal-body">
                     <form>
                         <div class="form-group row">
-                          <label for="nb_electrodes" class="col-sm-2 col-form-label">Nb electrodes</label>
+                          <!-- <label for="nb_electrodes" class="col-sm-2 col-form-label">Nb electrodes</label> -->
                           <div class="col-sm-10">
                             <input type="number" class="form-control-number" id="nb_electrodes" value="64">
                           </div>
@@ -149,6 +150,28 @@ mosquitto_sub -h raspberrypi.local -t ohmpi_0001/ctrl
             </div>
             </div>
         </div>
+
+        <!-- Modal for removing data -->
+        <div class="modal fade" id="rmModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+            <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                <h5 class="modal-title" id="exampleModalLabel">Data clearing</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+                </div>
+                <div class="modal-body">
+                    <p>Are you sure you want to remove all data?</p>
+                    <p>Data can be downloaded as .zip at the bottom of the page.</p>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
+                    <button id="removeDataBtn" type="button" class="btn btn-danger">Clear data</button>
+                </div>
+            </div>
+            </div>
+        </div>
         <footer>v0.3.0</footer>
     </div>
 
@@ -337,7 +360,7 @@ mosquitto_sub -h raspberrypi.local -t ohmpi_0001/ctrl
         function saveConfigBtnFunc() {
             // collect values from modal
             let formVals = {
-                'nb_electrodes': parseInt(document.getElementById('nb_electrodes').value),
+                //'nb_electrodes': parseInt(document.getElementById('nb_electrodes').value),
                 'injection_duration': parseFloat(document.getElementById('injection_duration').value),
                 'nb_meas': parseInt(document.getElementById('nb_meas').value),
                 'sequence_delay': parseFloat(document.getElementById('sequence_delay').value),
diff --git a/install_resipy.sh b/install_resipy.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4201bde3df2b67bd44bb737324b3b645be890a50
--- /dev/null
+++ b/install_resipy.sh
@@ -0,0 +1 @@
+git clone -b rpi https://gitlab.com/hkex/resipy
\ No newline at end of file
diff --git a/ohmpi/config.py b/ohmpi/config.py
index 3f1c3a31d4b136087ca758e8baf8e60a4c26e6b6..40318f48bca5ab0451f8532d9e0420b965be913d 100644
--- a/ohmpi/config.py
+++ b/ohmpi/config.py
@@ -71,6 +71,7 @@ HARDWARE_CONFIG = {
                          'current_max': 3.}
             }
 }
+
 # SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS
 # Execution logging configuration
 EXEC_LOGGING_CONFIG = {
@@ -98,8 +99,8 @@ DATA_LOGGING_CONFIG = {
 # State of Health logging configuration (For a future release)
 SOH_LOGGING_CONFIG = {
     'logging_level': logging.INFO,
-    'log_file_logging_level': logging.DEBUG,
     'logging_to_console': True,
+    'log_file_logging_level': logging.DEBUG,
     'file_name': f'soh{logging_suffix}.log',
     'max_bytes': 16777216,
     'backup_count': 1024,
diff --git a/ohmpi/deprecated.py b/ohmpi/deprecated.py
index d316c465629b2345f314d252f866aa9fecb0a21a..77ccb4061e42d3b6437103f03808f16a66506a62 100644
--- a/ohmpi/deprecated.py
+++ b/ohmpi/deprecated.py
@@ -1,17 +1,21 @@
 import warnings
 
+
 def measure(self, **kwargs):
     warnings.warn('This function is deprecated. Use run_multiple_sequences() instead.', DeprecationWarning)
     self.run_multiple_sequences(**kwargs)
 
+
 def read_quad(self, **kwargs):
     warnings.warn('This function is deprecated. Use load_sequence instead.', DeprecationWarning)
     self.load_sequence(**kwargs)
 
+
 def stop(self, **kwargs):
     warnings.warn('This function is deprecated. Use interrupt instead.', DeprecationWarning)
     self.interrupt(**kwargs)
 
+
 def _update_acquisition_settings(self, config):
     warnings.warn('This function is deprecated, use update_settings() instead.', DeprecationWarning)
     self.update_settings(settings=config)
\ No newline at end of file
diff --git a/ohmpi/hardware_components/abstract_hardware_components.py b/ohmpi/hardware_components/abstract_hardware_components.py
index 5b98a620f4f1873104c14a6a3c6f4cc84ef6e7cb..74394fa2a4775dfbd54f3eeea8d1abb49a439223 100644
--- a/ohmpi/hardware_components/abstract_hardware_components.py
+++ b/ohmpi/hardware_components/abstract_hardware_components.py
@@ -55,7 +55,7 @@ class PwrAbstract(ABC):
         self._current_max = kwargs.pop('current_max', 0.)
         self._voltage_min = kwargs.pop('voltage_min', 0.)
         self._voltage_max = kwargs.pop('voltage_max', 0.)
-        self._switchable = False
+        self.switchable = False
         self.connection = kwargs.pop('connection', None)
         self._battery_voltage = np.nan
 
@@ -363,6 +363,18 @@ class TxAbstract(ABC):
         assert value > 0.
         self._injection_duration = value
 
+    @property
+    def latency(self):
+        """ Gets the Tx latency """
+        return self._latency
+
+    @latency.setter
+    def latency(self, value):
+        """ Sets the Tx latency """
+        assert isinstance(value, float)
+        assert value >= 0.
+        self._latency = value
+
     @property
     def polarity(self):
         return self._polarity
@@ -423,7 +435,7 @@ class TxAbstract(ABC):
     def pwr_state(self, state):
         if state == 'on':
             self._pwr_state = 'on'
-            if not self.pwr._switchable:
+            if not self.pwr.switchable:
                 self.exec_logger.debug(f'{self.model} cannot switch on power source')
             self.pwr.reload_settings()
         elif state == 'off':
@@ -453,6 +465,17 @@ class RxAbstract(ABC):
         self._bias = kwargs.pop('bias', 0.)
         self._vmn_hardware_offset = kwargs.pop('vmn_hardware_offset', 0.)
 
+    @property
+    def bias(self):
+        """ Gets the RX bias """
+        return self._bias
+
+    @bias.setter
+    def bias(self, value):
+        """ Sets the Rx bias """
+        assert isinstance(value, float)
+        self._bias = value
+
     @property
     def gain(self):
         return self._gain
@@ -472,6 +495,18 @@ class RxAbstract(ABC):
     def gain_auto(self):
         pass
 
+    @property
+    def latency(self):
+        """ Gets the Rx latency """
+        return self._latency
+
+    @latency.setter
+    def latency(self, value):
+        """ Sets the Rx latency """
+        assert isinstance(value, float)
+        assert value >= 0.
+        self._latency = value
+
     def reset_gain(self):
         self.gain = 1.
 
@@ -498,6 +533,5 @@ class RxAbstract(ABC):
     @property
     @abstractmethod
     def voltage(self):
-        """ Gets the voltage VMN in Volts
-        """
+        """ Gets the voltage VMN in Volts """
         pass
diff --git a/ohmpi/hardware_components/dummy_dps5005.py b/ohmpi/hardware_components/dummy_dps5005.py
new file mode 100644
index 0000000000000000000000000000000000000000..0bb675f85d2f179975e2b7d2c3aa54f7b13c9df4
--- /dev/null
+++ b/ohmpi/hardware_components/dummy_dps5005.py
@@ -0,0 +1,104 @@
+from ohmpi.hardware_components.abstract_hardware_components import PwrAbstract
+import numpy as np
+import datetime
+import os
+import time
+from ohmpi.utils import enforce_specs
+
+# hardware characteristics and limitations
+SPECS = {'model': {'default': os.path.basename(__file__).rstrip('.py')},
+         'voltage': {'default': 12., 'max': 50., 'min': 0.},
+         'voltage_min': {'default': 0},
+         'voltage_max': {'default': 0},
+         'current_max': {'default': 60.},
+         'current_adjustable': {'default': False},
+         'voltage_adjustable': {'default': True},
+         'pwr_latency': {'default': .5}
+         }
+
+# TODO: Complete this code... handle modbus connection
+
+
+class Pwr(PwrAbstract):
+    def __init__(self, **kwargs):
+        if 'model' not in kwargs.keys():
+            for key in SPECS.keys():
+                kwargs = enforce_specs(kwargs, SPECS, key)
+            subclass_init = False
+        else:
+            subclass_init = True
+        super().__init__(**kwargs)
+        if not subclass_init:
+            self.exec_logger.event(f'{self.model}\tpwr_init\tbegin\t{datetime.datetime.utcnow()}')
+        #assert isinstance(self.connection, Instrument)
+        # if a controller is passed in kwargs, it will be instantiated
+        #if self.ctl is None:
+        #    self.ctl = ctl_module.Ctl(**CTL_CONFIG)
+        #self.connection = self.ctl.interfaces[kwargs.pop('connection', ctl_connection)]
+        self._voltage = kwargs['voltage']
+        self._current_max = kwargs['current_max']
+        self.voltage_adjustable = True
+        self.current_adjustable = False
+        self._current = np.nan
+        self._pwr_state = 'off'
+        self._pwr_latency = kwargs['pwr_latency']
+        if not subclass_init:
+            self.exec_logger.event(f'{self.model}\tpwr_init\tend\t{datetime.datetime.utcnow()}')
+
+    @property
+    def current(self):
+        return self._current
+
+    @current.setter
+    def current(self, value, **kwargs):
+        self.exec_logger.debug(f'Current cannot be set on {self.model}')
+
+    def _retrieve_voltage(self):
+        self._voltage = self.connection.read_register(0x0002, 2)
+
+    @property
+    def voltage(self):
+        # return PwrAbstract.voltage.fget(self)
+        return self._voltage
+
+    @voltage.setter
+    def voltage(self, value):
+        self.connection.write_register(0x0000, value, 2)
+        self._voltage = value
+
+    def battery_voltage(self):
+        self._battery_voltage = self.connection.read_register(0x05, 2)
+        return self._battery_voltage
+
+    def current_max(self, value):  # [mA]
+        value = value * 1.2  # To set DPS max current slightly above (20%) the limit to avoid regulation artefacts
+        self.connection.write_register(0x0001, int(value*1000), 0)
+
+    @property
+    def pwr_state(self):
+        return self._pwr_state
+
+    @pwr_state.setter
+    def pwr_state(self, state):
+        """Switches pwr on or off.
+
+            Parameters
+            ----------
+            state : str
+                'on', 'off'
+            """
+        if state == 'on':
+            self.connection.write_register(0x09, 1)
+            self.current_max(self._current_max)
+            self._pwr_state = 'on'
+            self.exec_logger.debug(f'{self.model} is on')
+            time.sleep(self._pwr_latency) # from pwr specs
+
+        elif state == 'off':
+            self.connection.write_register(0x09, 0)
+            self._pwr_state = 'off'
+            self.exec_logger.debug(f'{self.model} is off')
+
+    def reload_settings(self):
+        # self.voltage(self._voltage)
+        self.current_max(self._current_max)
diff --git a/ohmpi/hardware_components/mb_2023_0_X.py b/ohmpi/hardware_components/mb_2023_0_X.py
index 7ba2a1652aa1d34523076bb589523293f70863d1..4fe1c0b62d9a524b45d35f12d4849191ed997a4c 100644
--- a/ohmpi/hardware_components/mb_2023_0_X.py
+++ b/ohmpi/hardware_components/mb_2023_0_X.py
@@ -242,7 +242,7 @@ class Rx(RxAbstract):
             self.exec_logger.event(f'{self.model}\trx_init\tend\t{datetime.datetime.utcnow()}')
 
     @property
-    def gain(self): #TODO: should be in abstract_hardware_components
+    def gain(self):  # TODO: should be in abstract_hardware_components
         return self._adc_gain
 
     @gain.setter
diff --git a/ohmpi/hardware_components/mux_2023_0_X.py b/ohmpi/hardware_components/mux_2023_0_X.py
index 1e88aef3f757bf1dafd718243fa602694bc72e6f..df4bd14d4770ef98f85c8406ef917a297dbb3a45 100644
--- a/ohmpi/hardware_components/mux_2023_0_X.py
+++ b/ohmpi/hardware_components/mux_2023_0_X.py
@@ -73,14 +73,27 @@ class Mux(MuxAbstract):
             self.exec_logger.event(f'{self.model}: {self.board_id}\tmux_init\tbegin\t{datetime.datetime.utcnow()}')
         assert isinstance(self.connection, I2C)
         self.exec_logger.debug(f'configuration: {kwargs}')
-        self._roles = kwargs.pop('roles', None)
-        if self._roles is None:
-            self._roles = {'A': 'X'}  # NOTE: defaults to 1-role
+        roles = kwargs.pop('roles', None)
+        if isinstance(roles, str):
+            roles = [roles]
+        if roles is None:
+            roles = ['A'] # NOTE: defaults to 1-role
+        else:
+            self._roles = {roles[0]:'X'}
         if np.alltrue([j in self._roles.values() for j in set([i[1] for i in list(inner_cabling['1_role'].keys())])]):
             self._mode = '1_role'
         else:
             self.exec_logger.error(f'Invalid role assignment for {self.model}: {self._roles} !')
             self._mode = ''
+        cabling = kwargs.pop('cabling', None)
+        electrodes = kwargs.pop('electrodes', None)
+        self.cabling = {}
+        if cabling is None:
+            self.cabling = {(e, r): (i + 1, r) for r in roles for i, e in enumerate(electrodes)}
+        else:
+            for k, v in cabling.items():
+                if v[0] == self.board_id:
+                    self.cabling.update({k: (v[1], k[1])})
         self._tca = [adafruit_tca9548a.TCA9548A(self.connection, kwargs['mux_tca_address'])[i] for i in np.arange(7, 3, -1)]
         # self._mcp_addresses = (kwargs.pop('mcp', '0x20'))  # TODO: add assert on valid addresses..
         self._mcp = [None, None, None, None]
diff --git a/ohmpi/hardware_components/mux_2024_0_X.py b/ohmpi/hardware_components/mux_2024_0_X.py
index 9334bb032b00518b450fb29598773437feeeb992..1da3a6cf8caedb5730d2421817163d2a56ed3bb6 100644
--- a/ohmpi/hardware_components/mux_2024_0_X.py
+++ b/ohmpi/hardware_components/mux_2024_0_X.py
@@ -69,9 +69,12 @@ class Mux(MuxAbstract):
             self.exec_logger.event(f'{self.model}: {self.board_id}\tmux_init\tbegin\t{datetime.datetime.utcnow()}')
         assert isinstance(self.connection, I2C)
         self.exec_logger.debug(f'configuration: {kwargs}')
-        self._roles = kwargs.pop('roles', None)
-        if self._roles is None:
-            self._roles = {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'}  # NOTE: defaults to 4-roles
+        roles = kwargs.pop('roles', None)
+        if roles is None:
+            roles = ['A', 'B', 'M', 'N'] # NOTE: defaults to 4-roles
+        else:
+            roles_board = ['X', 'Y', 'XX', 'YY']
+            self._roles = {roles[i]: roles_board[i] for i in range(len(roles))}
         if np.all([j in self._roles.values() for j in set([i[1] for i in list(inner_cabling['4_roles'].keys())])]):
             self._mode = '4_roles'
         elif np.all([j in self._roles.values() for j in set([i[1] for i in list(inner_cabling['2_roles'].keys())])]):
@@ -79,7 +82,15 @@ class Mux(MuxAbstract):
         else:
             self.exec_logger.error(f'Invalid role assignment for {self.model}: {self._roles} !')
             self._mode = ''
-
+        cabling = kwargs.pop('cabling', None)
+        electrodes = kwargs.pop('electrodes', None)
+        self.cabling = {}
+        if cabling is None:
+            self.cabling = {(e, r): (i + 1, r) for r in roles for i, e in enumerate(electrodes)}
+        else:
+            for k, v in cabling.items():
+                if v[0] == self.board_id:
+                    self.cabling.update({k: (v[1], k[1])})
         # Setup TCA
         tca_address = kwargs.pop('tca_address', None)
         tca_channel = kwargs.pop('tca_channel', 0)
@@ -126,7 +137,6 @@ class Mux(MuxAbstract):
 
     def switch_one(self, elec=None, role=None, state=None):
         MuxAbstract.switch_one(self, elec=elec, role=role, state=state)
-
         def activate_relay(mcp, mcp_pin, value=True):
             pin_enable = mcp.get_pin(mcp_pin)
             pin_enable.direction = Direction.OUTPUT
diff --git a/ohmpi/hardware_components/pwr_dps5005.py b/ohmpi/hardware_components/pwr_dps5005.py
index cc12fc3e44d2f03343403a7c9b3551eccd991b29..55f833278b8bb56e9934a6e7b524dfcf28980e6c 100644
--- a/ohmpi/hardware_components/pwr_dps5005.py
+++ b/ohmpi/hardware_components/pwr_dps5005.py
@@ -17,8 +17,6 @@ SPECS = {'model': {'default': os.path.basename(__file__).rstrip('.py')},
          'pwr_latency': {'default': .5}
          }
 
-# TODO: Complete this code... handle modbus connection
-
 
 class Pwr(PwrAbstract):
     def __init__(self, **kwargs):
@@ -32,10 +30,6 @@ class Pwr(PwrAbstract):
         if not subclass_init:
             self.exec_logger.event(f'{self.model}\tpwr_init\tbegin\t{datetime.datetime.utcnow()}')
         assert isinstance(self.connection, Instrument)
-        # if a controller is passed in kwargs, it will be instantiated
-        #if self.ctl is None:
-        #    self.ctl = ctl_module.Ctl(**CTL_CONFIG)
-        #self.connection = self.ctl.interfaces[kwargs.pop('connection', ctl_connection)]
         self._voltage = kwargs['voltage']
         self._current_max = kwargs['current_max']
         self.voltage_adjustable = True
@@ -93,7 +87,7 @@ class Pwr(PwrAbstract):
             self.current_max(self._current_max)
             self._pwr_state = 'on'
             self.exec_logger.debug(f'{self.model} is on')
-            time.sleep(self._pwr_latency) # from pwr specs
+            time.sleep(self._pwr_latency)
 
         elif state == 'off':
             self.connection.write_register(0x09, 0)
@@ -101,5 +95,4 @@ class Pwr(PwrAbstract):
             self.exec_logger.debug(f'{self.model} is off')
 
     def reload_settings(self):
-        # self.voltage(self._voltage)
         self.current_max(self._current_max)
diff --git a/ohmpi/hardware_components/raspberry_pi.py b/ohmpi/hardware_components/raspberry_pi.py
index 53893a975edf2788c6497b60c5d2439066c0539e..1d2b0eedb6d30b732a42e7b9f7e63d99a6b74a06 100644
--- a/ohmpi/hardware_components/raspberry_pi.py
+++ b/ohmpi/hardware_components/raspberry_pi.py
@@ -37,22 +37,22 @@ class Ctl(CtlAbstract):
         # None interface for battery
         self.interfaces['none'] = None
 
-        warnings.filterwarnings("error")  # to filter out adafruit warning about setting I2C frequency
         # I2C
         try:
             self.interfaces['i2c'] = busio.I2C(board.SCL, board.SDA)  # noqa
-        except RuntimeWarning:
-            pass
-        warnings.resetwarnings()
+        except Exception as e:
+            self.exec_logger.warning(f'Could not initialize I2C:\n{e}')
 
+       # warnings.resetwarnings()
         # Extended I2C
+        warnings.filterwarnings(action='ignore', category=RuntimeWarning, module='adafruit_blinka')  # to filter out adafruit warning about setting I2C frequency
         try:
             self.interfaces['i2c_ext'] = ExtendedI2C(4)  # 4 is defined
-        except RuntimeWarning:
-            pass
         except Exception as e:
             self.exec_logger.warning(f'Could not initialize Extended I2C:\n{e}')
 
+
+
         # modbus
         try:
             self.interfaces['modbus'] = minimalmodbus.Instrument(port=kwargs['modbus_port'],
diff --git a/ohmpi/hardware_system.py b/ohmpi/hardware_system.py
index 3e4cdaf05ddc53df2fb20dcfc2f4f4173ba33b6e..6b7f759fea3f8de9ca1734586174477b26de8c2a 100644
--- a/ohmpi/hardware_system.py
+++ b/ohmpi/hardware_system.py
@@ -43,13 +43,14 @@ for k, v in rx_module.SPECS['rx'].items():
     except Exception as e:
         print(f'Cannot set value {v} in RX_CONFIG[{k}]:\n{e}')
 
-current_max = np.min([TX_CONFIG['current_max'],  HARDWARE_CONFIG['pwr'].pop('current_max', np.inf), # TODO: replace 50 by a TX config
+current_max = np.min([TX_CONFIG['current_max'],  HARDWARE_CONFIG['pwr'].pop('current_max', np.inf),
                       np.min(np.hstack((np.inf, [MUX_CONFIG[i].pop('current_max', np.inf) for i in MUX_CONFIG.keys()])))])
 voltage_max = np.min([TX_CONFIG['voltage_max'],
                       np.min(np.hstack((np.inf, [MUX_CONFIG[i].pop('voltage_max', np.inf) for i in MUX_CONFIG.keys()])))])
 voltage_min = RX_CONFIG['voltage_min']
 # TODO: should replace voltage_max and voltage_min by vab_max and vmn_min...
 
+
 def elapsed_seconds(start_time):
     lap = datetime.datetime.utcnow() - start_time
     return lap.total_seconds()
@@ -163,8 +164,7 @@ class OhmPiHardware:
         for mux_id, mux in self.mux_boards.items():
             mux.barrier = self.mux_barrier
             for k, v in mux.cabling.items():
-                update_dict(self._cabling, {k: (mux_id, k[0])})
-
+                update_dict(self._cabling, {k: (mux_id, k[0])})   #TODO: in theory k[0] is not needed in values
         # Complete OhmPiHardware initialization
         self.readings = np.array([])  # time series of acquired data
         self._start_time = None  # time of the beginning of a readings acquisition
@@ -190,7 +190,7 @@ class OhmPiHardware:
         self._start_time = None
         self._pulse = 0
 
-    def _gain_auto(self, polarities=(1, -1), vab=5., switch_pwr_off=False): #TODO: improve _gain_auto
+    def _gain_auto(self, polarities=(1, -1), vab=5., switch_pwr_off=False):  # TODO: improve _gain_auto
         self.exec_logger.event(f'OhmPiHardware\ttx_rx_gain_auto\tbegin\t{datetime.datetime.utcnow()}')
         current, voltage = 0., 0.
         if self.tx.pwr.voltage_adjustable:
@@ -239,7 +239,7 @@ class OhmPiHardware:
             mux.barrier = self.mux_barrier
 
     @property
-    def pulses(self):  # TODO: is this obsolete?
+    def pulses(self):  # TODO: is this obsolete? I don't think so...
         pulses = {}
         for i in np.unique(self.readings[:, 1]):
             r = self.readings[self.readings[:, 1] == i, :]
@@ -271,7 +271,7 @@ class OhmPiHardware:
         if not append or self._start_time is None:
             self._start_time = datetime.datetime.utcnow()
             # TODO: Check if replacing the following two options by a reset_buffer method of TX would be OK
-            time.sleep(np.max([self.rx._latency, self.tx._latency])) # if continuous mode
+            time.sleep(np.max([self.rx.latency, self.tx.latency])) # if continuous mode
             # _ = self.rx.voltage # if not continuous mode
 
         while self.tx_sync.is_set():
@@ -395,9 +395,9 @@ class OhmPiHardware:
 
         return new_vab
 
-    def _compute_tx_volt(self, pulse_duration=0.1, strategy='vmax', tx_volt=5., vab_max=None,
-                         iab_max=None, vmn_max=None, vmn_min=voltage_min, polarities=(1, -1), delay=0.05,
-                         p_max=None, diff_vab_lim=2.5, n_steps=4):
+    def compute_tx_volt(self, pulse_duration=0.1, strategy='vmax', tx_volt=5., vab_max=None,
+                        iab_max=None, vmn_max=None, vmn_min=voltage_min, polarities=(1, -1), delay=0.05,
+                        p_max=None, diff_vab_lim=2.5, n_steps=4):
         # TODO: Optimise how to pass iab_max, vab_max, vmn_min
         # TODO: Update docstring
         """Estimates best Tx voltage based on different strategies.
@@ -467,7 +467,6 @@ class OhmPiHardware:
 
             k = 0
             vab_list = np.zeros(n_steps + 1) * np.nan
-
             vab_list[k] = vab
             # self.tx.turn_on()
             switch_pwr_off, switch_tx_pwr_off = False, False  # TODO: check if these should be moved in kwargs
@@ -486,7 +485,7 @@ class OhmPiHardware:
             diff_vab = np.inf
             if strategy == 'vmax' or strategy == 'vmin':
                 while (k < n_steps) and (diff_vab > diff_vab_lim) and (vab_list[k] < vab_max):
-                    if strategy=='vmax':
+                    if strategy == 'vmax':
                         vmn_min = vmn_max
                     vabs = []
                     self._vab_pulses(vab_list[k], sampling_rate=self.rx.sampling_rate, durations=[0.2, 0.2], polarities=[1, -1])
@@ -562,7 +561,7 @@ class OhmPiHardware:
         warnings.resetwarnings()
 
     def calibrate_rx_bias(self):
-        self.rx._bias += (np.mean(self.readings[self.readings[:, 2] == 1, 4])
+        self.rx.bias += (np.mean(self.readings[self.readings[:, 2] == 1, 4])
                           + np.mean(self.readings[self.readings[:, 2] == -1, 4])) / 2.
 
     def vab_square_wave(self, vab, cycle_duration, sampling_rate=None, cycles=3, polarity=1, duty_cycle=1.,
diff --git a/ohmpi/logging_setup.py b/ohmpi/logging_setup.py
index 33927655e620ea488ad99e3e05b1001cf0b6dbeb..726a7d9f8f0dc7f495e8b54a20595e1c632518b6 100644
--- a/ohmpi/logging_setup.py
+++ b/ohmpi/logging_setup.py
@@ -1,6 +1,6 @@
 import json
-from ohmpi.config import EXEC_LOGGING_CONFIG, DATA_LOGGING_CONFIG, SOH_LOGGING_CONFIG,\
-    MQTT_LOGGING_CONFIG, MQTT_CONTROL_CONFIG
+from ohmpi.config import (EXEC_LOGGING_CONFIG, DATA_LOGGING_CONFIG, SOH_LOGGING_CONFIG, MQTT_LOGGING_CONFIG,
+                          MQTT_CONTROL_CONFIG)
 from os import path, mkdir, statvfs
 from time import gmtime
 import logging
@@ -12,7 +12,7 @@ from termcolor import colored
 
 def get_logging_levels():
     """Gets a list of the logging levels loaded"""
-    return [logging.getLevelName(x) for x in range(1,101) if not logging.getLevelName(x).startswith('Level')]
+    return [logging.getLevelName(x) for x in range(1, 101) if not logging.getLevelName(x).startswith('Level')]
 
 
 def add_logging_level(level_name, level_num, method_name=None):
@@ -227,7 +227,7 @@ def setup_loggers(mqtt=True):
     except Exception as err:
         msg += colored(f'\n\u26A0 ERROR: Could not initialize logging!\n{err}', 'red')
     finally:
-        return exec_logger, exec_log_filename, data_logger, data_log_filename, soh_logger, soh_log_filename,\
+        return exec_logger, exec_log_filename, data_logger, data_log_filename, soh_logger, soh_log_filename, \
             EXEC_LOGGING_CONFIG['logging_level'], msg
 
 
diff --git a/ohmpi/ohmpi.py b/ohmpi/ohmpi.py
index c90ff2372d87e6c33be51aeeb9eed72013b875d9..4b966b3504708091bcf871d9a84debaf3e28067b 100644
--- a/ohmpi/ohmpi.py
+++ b/ohmpi/ohmpi.py
@@ -15,6 +15,7 @@ from copy import deepcopy
 import numpy as np
 import csv
 import time
+import pandas as pd
 from shutil import rmtree, make_archive
 from threading import Thread
 from inspect import getmembers, isfunction
@@ -42,31 +43,25 @@ VERSION = '3.0.0-beta'
 
 
 class OhmPi(object):
-    """ OhmPi class.
+    """OhmPi class.
     """
-
-    def __init__(self, settings=None, sequence=None, mqtt=True, onpi=None):
-        """Constructs the ohmpi object
+    def __init__(self, settings=None, sequence=None, mqtt=True):
+        """Construct the ohmpi object.
 
         Parameters
         ----------
-        settings:
-
-        sequence:
-
-        mqtt: bool, defaut: True
-            if True publish on mqtt topics while logging, otherwise use other loggers only
-        onpi: bool,None default: None
-            if None, the platform on which the class is instantiated is determined to set on_pi to either True or False.
-            if False the behaviour of an ohmpi will be partially emulated and return random data.
+        settings : dict, optional
+            Dictionnary of parameters. Possible parameters with their default values:
+            `{'injection_duration': 0.2, 'nb_meas': 1, 'sequence_delay': 1,
+            'nb_stack': 1, 'sampling_interval': 2, 'tx_volt': 5, 'duty_cycle': 0.5,
+            'strategy': 'constant', 'export_path': None
+        sequence : str, optional
+            Path of the .csv or .txt file with A, B, M and N electrodes.
+            Electrode index starts at 1. See `OhmPi.load_sequence()` for full docstring.
+        mqtt : bool, optional
+            If True (default), publish on mqtt topics while logging,
+            otherwise use other loggers only (print).
         """
-
-        if onpi is None:
-            _, onpi = get_platform()
-        elif onpi:
-            assert get_platform()[1]  # Checks that the system actually runs on a pi if onpi is True
-        self.on_pi = onpi  # True if runs from the RaspberryPi with the hardware, otherwise False for random data # TODO : replace with dummy hardware?
-
         self._sequence = sequence
         self.nb_samples = 0
         self.status = 'idle'  # either running or idle
@@ -80,24 +75,13 @@ class OhmPi(object):
         self._hw = OhmPiHardware(**{'exec_logger': self.exec_logger, 'data_logger': self.data_logger,
                                     'soh_logger': self.soh_logger})
         self.exec_logger.info('Hardware configured...')
+
         # default acquisition settings
-        self.settings = {
-            'injection_duration': 0.2,
-            'nb_meas': 1,
-            'sequence_delay': 1,
-            'nb_stack': 1,
-            'sampling_interval': 2,
-            'tx_volt': 5,
-            'duty_cycle': 0.5,
-            'strategy': 'constant',
-            'export_path': None,
-            'export_dir': 'data',
-            'export_name': 'measurement.csv'
-        }
+        self.settings = {}
+        self.update_settings(os.path.join(os.path.split(os.path.dirname(__file__))[0],'settings/default.json'))
+
         # read in acquisition settings
-        # if settings is not None:
         self.update_settings(settings)
-
         self.exec_logger.debug('Initialized with settings:' + str(self.settings))
 
         # read quadrupole sequence
@@ -167,30 +151,56 @@ class OhmPi(object):
             setattr(cls, i[0], i[1])
 
     @staticmethod
-    def append_and_save(filename: str, last_measurement: dict, cmd_id=None):
-        # TODO: find alternative approach to save full data (zip, hdf5 or mseed?)
+    def append_and_save(filename: str, last_measurement: dict, fw_in_csv=None, fw_in_zip=None, cmd_id=None):
         """Appends and saves the last measurement dict.
 
         Parameters
         ----------
         filename : str
-            filename to save the last measurement dataframe
+            Filename of the .csv.
         last_measurement : dict
-            Last measurement taken in the form of a python dictionary
+            Last measurement taken in the form of a python dictionary.
+        fw_in_csv : bool, optional
+            Wether to save the full-waveform data in the .csv (one line per quadrupole).
+            As these readings have different lengths for different quadrupole, the data are padded with NaN.
+            If None, default is read from default.json.
+        fw_in_zip : bool, optional
+            Wether to save the full-waveform data in a separate .csv in long format to be zipped to
+            spare space. If None, default is read from default.json.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
+        # check arguments
+        if fw_in_csv is None:
+            fw_in_csv = self.settings['fw_in_csv']
+        if fw_in_zip is None:
+            fw_in_zip = self.settings['fw_in_zip']
+
         # check if directory 'data' exists
-        ddir = os.path.join(os.path.dirname(__file__), '../data/')
+        ddir = os.path.split(filename)[0]
         if os.path.exists(ddir) is not True:
             os.mkdir(ddir)
 
         last_measurement = deepcopy(last_measurement)
         
-        # TODO need to make all the full data of the same size (pre-populate
-        # readings with NaN in hardware_system.OhmPiHardware.read_values())
-        if 'fulldata' in last_measurement:
-            d = last_measurement['fulldata']
+        # save full waveform data in a long .csv file
+        if fw_in_zip:
+            fw_filename = filename.replace('.csv', '_fw.csv')
+            if not os.path.exists(fw_filename):  # new file, write headers first
+                with open(fw_filename, 'w') as f:
+                    f.write('A,B,M,N,t,pulse,polarity,current,voltage\n')
+            # write full data
+            with open(fw_filename, 'a') as f:
+                dd = last_measurement['full_waveform']
+                aa = np.repeat(last_measurement['A'], dd.shape[0])
+                bb = np.repeat(last_measurement['B'], dd.shape[0])
+                mm = np.repeat(last_measurement['M'], dd.shape[0])
+                nn = np.repeat(last_measurement['N'], dd.shape[0])
+                fwdata = np.c_[aa, bb, mm, nn, dd]
+                np.savetxt(f, fwdata, fmt=['%d', '%d', '%d', '%d', '%.3f', '%.3f', '%.3f'])
+
+        if fw_in_csv:
+            d = last_measurement['full_waveform']
             n = d.shape[0]
             if n > 1:
                 idic = dict(zip(['i' + str(i) for i in range(n)], d[:, 0]))
@@ -199,14 +209,13 @@ class OhmPi(object):
                 last_measurement.update(idic)
                 last_measurement.update(udic)
                 last_measurement.update(tdic)
-            last_measurement.pop('fulldata')
+            last_measurement.pop('full_waveform')
         
         if os.path.isfile(filename):
             # Load data file and append data to it
             with open(filename, 'a') as f:
                 w = csv.DictWriter(f, last_measurement.keys())
                 w.writerow(last_measurement)
-                # last_measurement.to_csv(f, header=False)
         else:
             # create data file and add headers
             with open(filename, 'a') as f:
@@ -230,7 +239,6 @@ class OhmPi(object):
         output : numpy.ndarray 1D array of int
             List of index of rows where A and B are identical.
         """
-
         # if we have a 1D array (so only 1 quadrupole), make it a 2D array
         if len(quads.shape) == 1:
             quads = quads[None, :]
@@ -249,12 +257,13 @@ class OhmPi(object):
             their content won't be returned again. Only files not in the list
             will be read.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         # get all .csv file in data folder
         if survey_names is None:
             survey_names = []
-        ddir = os.path.join(os.path.dirname(__file__), '../data/')
+        # ddir = os.path.join(os.path.dirname(__file__), '../data/')
+        ddir = self.settings['export_dir']
         fnames = [fname for fname in os.listdir(ddir) if fname[-4:] == '.csv']
         ddic = {}
         if cmd_id is None:
@@ -274,7 +283,7 @@ class OhmPi(object):
                         headers[i] = 'R [Ohm]'
                 icols = list(np.where(np.in1d(headers, ['A', 'B', 'M', 'N', 'R [Ohm]']))[0])
                 data = np.loadtxt(os.path.join(ddir, fname), delimiter=',',
-                                    skiprows=1, usecols=icols)                    
+                                    skiprows=1, usecols=icols)
                 data = data[None, :] if len(data.shape) == 1 else data
                 ddic[fname.replace('.csv', '')] = {
                     'a': data[:, 0].astype(int).tolist(),
@@ -290,12 +299,12 @@ class OhmPi(object):
         return ddic
 
     def interrupt(self, cmd_id=None):
-        """Interrupts the acquisition
+        """Interrupts the acquisition.
 
         Parameters
         ----------
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         self.status = 'stopping'
         if self.thread is not None:
@@ -315,7 +324,7 @@ class OhmPi(object):
             Path of the .csv or .txt file with A, B, M and N electrodes.
             Electrode index start at 1.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
 
         Returns
         -------
@@ -323,7 +332,7 @@ class OhmPi(object):
             Array of shape (number quadrupoles * 4).
         """
         self.exec_logger.debug(f'Loading sequence {filename}')
-        sequence = np.loadtxt(filename, delimiter=" ", dtype=np.uint32)  # load quadrupole file
+        sequence = np.loadtxt(filename, delimiter=" ", dtype=np.uint32, ndmin=2)  # load quadrupole file
 
         if sequence is not None:
             self.exec_logger.debug(f'Sequence of {sequence.shape[0]:d} quadrupoles read.')
@@ -343,12 +352,12 @@ class OhmPi(object):
         self.sequence = sequence
 
     def _process_commands(self, message: str):
-        """Processes commands received from the controller(s)
+        """Processes commands received from the controller(s).
 
         Parameters
         ----------
         message : str
-            message containing a command and arguments or keywords and arguments
+            Message containing a command and arguments or keywords and arguments.
         """
         self.status = 'idle'
         cmd_id = '?'
@@ -379,90 +388,74 @@ class OhmPi(object):
             self.exec_logger.debug(f'Execution report: {reply}')
 
     def quit(self, cmd_id=None):
-        """Quits OhmPi
+        """Quits OhmPi.
 
         Parameters
         ----------
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
 
         self.exec_logger.debug(f'Quitting ohmpi.py following command {cmd_id}')
         exit()
 
     def _read_hardware_config(self):
-        """Reads hardware configuration from config.py
+        """Reads hardware configuration from config.py.
         """
         self.exec_logger.debug('Getting hardware config')
         self.id = OHMPI_CONFIG['id']  # ID of the OhmPi
-        # self.r_shunt = OHMPI_CONFIG['R_shunt']  # reference resistance value in ohm
-        # self.Imax = OHMPI_CONFIG['Imax']  # maximum current
-        # self.exec_logger.debug(f'The maximum current cannot be higher than {self.Imax} mA')
-        # self.coef_p2 = OHMPI_CONFIG['coef_p2']  # slope for current conversion for ads.P2, measurement in V/V
-        # self.nb_samples = OHMPI_CONFIG['nb_samples']  # number of samples measured for each stack
-        # self.version = OHMPI_CONFIG['version']  # hardware version
-        # self.max_elec = OHMPI_CONFIG['max_elec']  # maximum number of electrodes
-        # self.board_addresses = OHMPI_CONFIG['board_addresses']
-        # self.board_version = OHMPI_CONFIG['board_version']
-        # self.mcp_board_address = OHMPI_CONFIG['mcp_board_address']
         self.exec_logger.debug(f'OHMPI_CONFIG = {str(OHMPI_CONFIG)}')
 
     def remove_data(self, cmd_id=None):
-        """Remove all data in the data folder
+        """Remove all data in the ´export_path´ folder on the raspberrypi.
 
         Parameters
         ----------
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         self.exec_logger.debug(f'Removing all data following command {cmd_id}')
-        datadir = os.path.join(os.path.dirname(__file__), '../data')
+        datadir = os.path.split(self.settings['export_path'])
+        #datadir = os.path.join(os.path.dirname(__file__), '../data')
         rmtree(datadir)
         os.mkdir(datadir)
 
     def restart(self, cmd_id=None):
-        """Restarts the Raspberry Pi
+        """Restarts the Raspberry Pi.
 
         Parameters
         ----------
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
-
-        if self.on_pi:
-            self.exec_logger.info(f'Restarting pi following command {cmd_id}...')
-            os.system('reboot')
-        else:
-            self.exec_logger.warning('Not on Raspberry Pi, skipping reboot...')
+        self.exec_logger.info(f'Restarting pi following command {cmd_id}...')
+        os.system('reboot')  # this may need admin rights
 
     def download_data(self, cmd_id=None):
-        """Create a zip of the data folder.
+        """Create a zip of the data folder to then download it easily.
         """
-        datadir = os.path.join(os.path.dirname(__file__), '../data/')
+        datadir = os.path.split(self.settings['export_path'])
+        # datadir = os.path.join(os.path.dirname(__file__), '../data/')
         make_archive(datadir, 'zip', 'data')
         self.data_logger.info(json.dumps({'download': 'ready'}))
 
     def shutdown(self, cmd_id=None):
-        """Shutdown the Raspberry Pi
+        """Shutdown the Raspberry Pi.
 
         Parameters
         ----------
         cmd_id : str, optional
             Unique command identifier
         """
-
-        if self.on_pi:
-            self.exec_logger.info(f'Restarting pi following command {cmd_id}...')
-            os.system('poweroff')
-        else:
-            self.exec_logger.warning('Not on Raspberry Pi, skipping shutdown...')
-
+        self.exec_logger.info(f'Restarting pi following command {cmd_id}...')
+        os.system('poweroff')  # this may require admin rights
+ 
     def run_measurement(self, quad=None, nb_stack=None, injection_duration=None, duty_cycle=None,
                         autogain=True, strategy='constant', tx_volt=5., best_tx_injtime=0.1,
                         cmd_id=None, vab_max=None, iab_max=None, vmn_max=None, vmn_min=None, **kwargs):
         # TODO: add sampling_interval -> impact on _hw.rx.sampling_rate (store the current value, change the _hw.rx.sampling_rate, do the measurement, reset the sampling_rate to the previous value)
         # TODO: default value of tx_volt and other parameters set to None should be given in config.py and used in function definition
-        """Measures on a quadrupole and returns transfer resistance.
+        """Measures on a quadrupole and returns a dictionnary with the transfer resistance.
 
         Parameters
         ----------
@@ -471,36 +464,36 @@ class OhmPi(object):
             really create the route to the electrodes.
         nb_stack : int, optional
             Number of stacks. A stack is considered two pulses (one
-            positive, one negative).            If 0, we will look            for the best voltage.
+            positive, one negative). If 0, we will look for the best voltage.
         injection_duration : int, optional
             Injection time in seconds.
-        duty_cycle : float, optional, Default: 0.5
-            Duty cycle of injection square wave
+        duty_cycle : float, optional
+            Duty cycle (default=0.5) of injection square wave.
         strategy : str, optional, default: constant
-            Define injection strategy (if power is adjustable, otherwise constant tx_volt)
+            Define injection strategy (if power is adjustable, otherwise constant tx_volt, generally 12V battery is used).
             Either:
             - vmax : compute Vab to reach a maximum Vmn_max and Iab without exceeding vab_max
             - vmin : compute Vab to reach at least Vmn_min
-            - constant : apply given Vab (tx_volt) -
-                        Safety check (i.e. short voltage pulses) performed prior to injection to ensure
-                        injection within bounds defined in vab_max, iab_max, vmn_max or vmn_min. This can adapt Vab.
-                        To bypass safety check before injection, tx_volt should be set equal to vab_max (not recpommanded)
+            - constant : apply given Vab (tx_volt)
+            Safety check (i.e. short voltage pulses) performed prior to injection to ensure
+            injection within bounds defined in vab_max, iab_max, vmn_max or vmn_min. This can adapt Vab.
+            To bypass safety check before injection, tx_volt should be set equal to vab_max (not recpommanded)
         vab_max : str, optional
-            Maximum injection voltage
+            Maximum injection voltage.
             Default value set by config or boards specs
         iab_max : str, optional
-            Maximum current applied
+            Maximum current applied.
             Default value set by config or boards specs
         vmn_max : str, optional
-            Maximum Vmn allowed
+            Maximum Vmn allowed.
             Default value set by config or boards specs
         vmn_min :
-            Minimum Vmn desired (used in strategy vmin)
+            Minimum Vmn desired (used in strategy vmin).
             Default value set by config or boards specs
         tx_volt : float, optional  # TODO: change tx_volt to Vab
             For power adjustable only. If specified, voltage will be imposed.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         # check pwr is on, if not, let's turn it on
         switch_power_off = False
@@ -520,15 +513,10 @@ class OhmPi(object):
             injection_duration = self.settings['injection_duration']
         if duty_cycle is None:
             duty_cycle = self.settings['duty_cycle']
-        # quad = kwargs.pop('quad', [0,0,0,0])
-        # nb_stack = kwargs.pop('nb_stack', self.settings['nb_stack'])
-        # injection_duration = kwargs.pop('injection_duration', self.settings['injection_duration'])
-        # duty_cycle = kwargs.pop('duty_cycle', self.settings['duty_cycle'])
-        # tx_volt = float(kwargs.pop('tx_volt', self.settings['tx_volt']))
         bypass_check = kwargs['bypass_check'] if 'bypass_check' in kwargs.keys() else False
         d = {}
         if self.switch_mux_on(quad, bypass_check=bypass_check, cmd_id=cmd_id):
-            tx_volt = self._hw._compute_tx_volt(tx_volt=tx_volt, strategy=strategy, vmn_max=vmn_max, vab_max=vab_max, iab_max=iab_max)  # TODO: use tx_volt and vmn_max instead of hardcoded values
+            tx_volt = self._hw.compute_tx_volt(tx_volt=tx_volt, strategy=strategy, vmn_max=vmn_max, vab_max=vab_max, iab_max=iab_max)  # TODO: use tx_volt and vmn_max instead of hardcoded values
             time.sleep(0.5)  # to wait for pwr discharge
             self._hw.vab_square_wave(tx_volt, cycle_duration=injection_duration*2/duty_cycle, cycles=nb_stack, duty_cycle=duty_cycle)
             if 'delay' in kwargs.keys():
@@ -557,25 +545,16 @@ class OhmPi(object):
                 "nbStack": nb_stack,
                 "Tx [V]": tx_volt,
                 "CPU temp [degC]": self._hw.ctl.cpu_temperature,
-                "Nb samples [-]": len(self._hw.readings[x,2]),  # TODO: use only samples after a delay in each pulse
-                "fulldata": self._hw.readings[:, [0, -2, -1]],
-                # "I_stack [mA]": i_stack_mean,
+                "Nb samples [-]": len(self._hw.readings[x, 2]),  # TODO: use only samples after a delay in each pulse
+                "full_waveform": self._hw.readings[:, [0, -2, -1]],
                 "I_std [%]": I_std,
-                # "I_per_stack [mA]": np.array([np.mean(i_stack[i*2:i*2+2]) for i in range(nb_stack)]),
-                # "Vmn_stack [mV]": vmn_stack_mean,
                 "Vmn_std [%]": Vmn_std,
-                # "Vmn_per_stack [mV]": np.array([np.diff(np.mean(vmn_stack[i*2:i*2+2], axis=1))[0] / 2 for i in range(nb_stack)]),
-                # "R_stack [ohm]": r_stack_mean,
-                # "R_std [ohm]": r_stack_std,
-                # "R_per_stack [Ohm]": np.mean([np.diff(np.mean(vmn_stack[i*2:i*2+2], axis=1)) / 2 for i in range(nb_stack)]) / np.array([np.mean(i_stack[i*2:i*2+2]) for i in range(nb_stack)]),
-                # "PS_per_stack [mV]":  np.array([np.mean(np.mean(vmn_stack[i*2:i*2+2], axis=1)) for i in range(nb_stack)]),
-                # "PS_stack [mV]": ps_stack_mean,
                 "R_ab [kOhm]": tx_volt / I
             }
 
             # to the data logger
             dd = d.copy()
-            dd.pop('fulldata')  # too much for logger
+            dd.pop('full_waveform')  # too much for logger
             dd.update({'A': str(dd['A'])})
             dd.update({'B': str(dd['B'])})
             dd.update({'M': str(dd['M'])})
@@ -585,7 +564,6 @@ class OhmPi(object):
             for key in dd.keys():  # Check why this is applied on keys and not values...
                 if isinstance(dd[key], float):
                     dd[key] = np.round(dd[key], 3)
-
             dd['cmd_id'] = str(cmd_id)
             self.data_logger.info(dd)
             self._hw.switch_mux(electrodes=quad[0:2], roles=['A', 'B'], state='on')
@@ -601,23 +579,35 @@ class OhmPi(object):
 
         return d
 
-    def run_multiple_sequences(self, cmd_id=None, sequence_delay=None, nb_meas=None, **kwargs):  # NOTE : could be renamed repeat_sequence
+    def repeat_sequence(self, **kwargs):
+        """Identical to run_multiple_sequences().
+        """
+        self.run_multiple_sequences(**kwargs)
+
+    def run_multiple_sequences(self, sequence_delay=None, nb_meas=None, fw_in_csv=None,
+    fw_in_zip=None, cmd_id=None, **kwargs):
         """Runs multiple sequences in a separate thread for monitoring mode.
            Can be stopped by 'OhmPi.interrupt()'.
            Additional arguments are passed to run_measurement().
 
         Parameters
         ----------
-        cmd_id : str, optional
-            Unique command identifier
         sequence_delay : int, optional
             Number of seconds at which the sequence must be started from each others.
         nb_meas : int, optional
             Number of time the sequence must be repeated.
+        fw_in_csv : bool, optional
+            Wether to save the full-waveform data in the .csv (one line per quadrupole).
+            As these readings have different lengths for different quadrupole, the data are padded with NaN.
+            If None, default is read from default.json.
+        fw_in_zip : bool, optional
+            Wether to save the full-waveform data in a separate .csv in long format to be zipped to
+            spare space. If None, default is read from default.json.
+        cmd_id : str, optional
+            Unique command identifier.
         kwargs : dict, optional
-            See help(k.run_measurement) for more info.
+            See help(OhmPi.run_measurement) for more info.
         """
-        # self.run = True
         if sequence_delay is None:
             sequence_delay = self.settings['sequence_delay']
         sequence_delay = int(sequence_delay)
@@ -639,9 +629,8 @@ class OhmPi(object):
                     self.exec_logger.warning('Data acquisition interrupted')
                     break
                 t0 = time.time()
-                self.run_sequence(**kwargs)
-                # sleeping time between sequence
-                dt = sequence_delay - (time.time() - t0)
+                self.run_sequence(fw_in_csv=fw_in_csv, fw_in_zip=fw_in_zip, **kwargs)
+                dt = sequence_delay - (time.time() - t0)  # sleeping time between sequence
                 if dt < 0:
                     dt = 0
                 if nb_meas > 1:
@@ -653,15 +642,28 @@ class OhmPi(object):
         self.thread = Thread(target=func)
         self.thread.start()
 
-    def run_sequence(self, cmd_id=None, **kwargs):
+    def run_sequence(self, fw_in_csv=None, fw_in_zip=None, cmd_id=None, **kwargs):
         """Runs sequence synchronously (=blocking on main thread).
            Additional arguments are passed to run_measurement().
 
         Parameters
         ----------
+        fw_in_csv : bool, optional
+            Wether to save the full-waveform data in the .csv (one line per quadrupole).
+            As these readings have different lengths for different quadrupole, the data are padded with NaN.
+            If None, default is read from default.json.
+        fw_in_zip : bool, optional
+            Wether to save the full-waveform data in a separate .csv in long format to be zipped to
+            spare space. If None, default is read from default.json.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
+        # check arguments
+        if fw_in_csv is None:
+            fw_in_csv = self.settings['fw_in_csv']
+        if fw_in_zip is None:
+            fw_in_zip = self.settings['fw_in_zip']
+
         # switch power on
         self._hw.pwr_state = 'on'
         self.status = 'running'
@@ -679,9 +681,6 @@ class OhmPi(object):
                                                         f'_{datetime.now().strftime("%Y%m%dT%H%M%S")}.csv')
         self.exec_logger.debug(f'Saving to {filename}')
 
-        # make sure all multiplexer are off
-        
-
         # measure all quadrupole of the sequence
         if self.sequence is None:
             n = 1
@@ -694,59 +693,60 @@ class OhmPi(object):
                 quad = self.sequence[i, :]  # quadrupole
             if self.status == 'stopping':
                 break
-            # if i == 0:
-            #     # call the switch_mux function to switch to the right electrodes
-            #     # switch on DPS
-            #     self.mcp_board = MCP23008(self.i2c, address=self.mcp_board_address)
-            #     self.pin2 = self.mcp_board.get_pin(2) # dps -
-            #     self.pin2.direction = Direction.OUTPUT
-            #     self.pin2.value = True
-            #     self.pin3 = self.mcp_board.get_pin(3) # dps -
-            #     self.pin3.direction = Direction.OUTPUT
-            #     self.pin3.value = True
-            #     time.sleep (4)
-            #
-            #     #self.switch_dps('on')
-            # time.sleep(.6)
-            # self.switch_mux_on(quad)
             # run a measurement
-            if self.on_pi:
-                acquired_data = self.run_measurement(quad=quad, **kwargs)
-            else:  # for testing, generate random data
-                # sum_vmn = np.random.rand(1)[0] * 1000.
-                # sum_i = np.random.rand(1)[0] * 100.
-                # cmd_id = np.random.randint(1000)
-                # acquired_data = {
-                #     "time": datetime.now().isoformat(),
-                #     "A": quad[0],
-                #     "B": quad[1],
-                #     "M": quad[2],
-                #     "N": quad[3],
-                #     "inj time [ms]": self.settings['injection_duration'] * 1000.,
-                #     "Vmn [mV]": sum_vmn,
-                #     "I [mA]": sum_i,
-                #     "R [ohm]": sum_vmn / sum_i,
-                #     "Ps [mV]": np.random.randn(1)[0] * 100.,
-                #     "nbStack": self.settings['nb_stack'],
-                #     "Tx [V]": np.random.randn(1)[0] * 5.,
-                #     "CPU temp [degC]": np.random.randn(1)[0] * 50.,
-                #     "Nb samples [-]": self.nb_samples,
-                # }
-                pass
+            acquired_data = self.run_measurement(quad=quad, **kwargs)
+     
+            # log data to the data logger
             self.data_logger.info(acquired_data)
 
-            # # switch mux off
-            # self.switch_mux_off(quad)
-            #
-            # # add command_id in dataset
+            # add command_id in dataset
             acquired_data.update({'cmd_id': cmd_id})
             # log data to the data logger
-            # self.data_logger.info(f'{acquired_data}')
+            # self.data_logger.info(f'{acquired_data}')  # NOTE: It could be useful to keep the cmd_id in the
             # save data and print in a text file
-            self.append_and_save(filename, acquired_data)
+            self.append_and_save(filename, acquired_data, fw_in_csv=fw_in_csv, fw_in_zip=fw_in_zip)
             self.exec_logger.debug(f'quadrupole {i + 1:d}/{n:d}')
         self._hw.pwr_state = 'off'
 
+        # file management
+        if fw_in_csv:  # make sure we have the same number of columns
+            with open(filename, '.csv', 'r') as f:
+                x = f.readlines()
+
+            # get column of start of full-waveform
+            icol = 0
+            for i, col in enumerate(x[0].split(',')):
+                if col == 't1':
+                    icol = i
+                    break
+
+            # get longest possible line
+            max_length = np.max([len(row.split(',')) for row in x]) - icol
+            nreadings = max_length // 5
+            print('-----', nreadings, max_length)
+
+            # create padding array for full-waveform  # TODO test this!
+            with open(filename, '.csv', 'w') as f:
+                # write back headers
+                xs = x[0].split(',')
+                f.write(','.join(xs[:icol]))
+                for col in ['t','s','p','v','i']:
+                    f.write(','.join([col + str(j+1) for j in range(nreadings)]))
+                f.write('\n')
+                for i, row in enumerate(x[1:]):
+                    xs = row.split(',')
+                    f.write(','.join(xs[:icol]))
+                    fw = np.array(xs[icol:])
+                    fw_pad = fw.reshape((5, -1))
+                    fw_padded = np.zeros((max_length, 5))
+                    fw_padded[:fw_pad.shape[0], :] = fw_pad
+                    f.write(','.join(fw_padded.flatten()) + '\n')
+
+        if fw_in_zip:
+            with ZipFile(filename.replace('.csv', '_fw.zip'), 'w') as myzip:
+                myzip.write(filename.repleace('.csv', '_fw.csv'))
+            os.remove(filename.replace('.csv', '_fw.csv'))
+
         # reset to idle if we didn't interrupt the sequence
         if self.status != 'stopping':
             self.status = 'idle'
@@ -758,7 +758,7 @@ class OhmPi(object):
         Parameters
         ----------
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
 
         def func():
@@ -771,7 +771,7 @@ class OhmPi(object):
     # TODO: we could build a smarter RS-Check by selecting adjacent electrodes based on their locations and try to
     #  isolate electrodes that are responsible for high resistances (ex: AB high, AC low, BC high
     #  -> might be a problem at B (cf what we did with WofE)
-    def rs_check(self, tx_volt=5., cmd_id=None):
+    def rs_check(self, tx_volt=5.0, cmd_id=None):
         # TODO: add a default value for rs-check in config.py import it in ohmpi.py and add it in rs_check definition
         """Checks contact resistances.
         Strategy: we just open A and B, measure the current and using vAB set or
@@ -780,9 +780,9 @@ class OhmPi(object):
         Parameters
         ----------
         tx_volt : float
-            Voltage of the injection
+            Voltage of the injection.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         # check pwr is on, if not, let's turn it on
         switch_tx_pwr_off = False
@@ -790,8 +790,6 @@ class OhmPi(object):
             self._hw.pwr_state = 'on'
             switch_tx_pwr_off = True
 
-        # self._hw.tx.pwr.voltage = float(tx_volt)
-
         # create custom sequence where MN == AB
         # we only check the electrodes which are in the sequence (not all might be connected)
         if self.sequence is None:
@@ -804,17 +802,13 @@ class OhmPi(object):
                 elec[:-1],
                 elec[1:],
             ]).T
-        # if self.idps:
-        #     quads[:, 2:] = 0  # we don't open Vmn to prevent burning the MN part
-        #     # as it has a smaller range of accepted voltage
-
+        
         # create filename to store RS
         export_path_rs = self.settings['export_path'].replace('.csv', '') \
                          + '_' + datetime.now().strftime('%Y%m%dT%H%M%S') + '_rs.csv'
 
         # perform RS check
         self.status = 'running'
-
         self.reset_mux()
 
         # turn dps_pwr_on if needed
@@ -833,31 +827,15 @@ class OhmPi(object):
             print(vab, current)
             time.sleep(0.2)
 
-            # self.switch_mux_on(quad, bypass_check=True)  # put before raising the pins (otherwise conflict i2c)
-            # d = self.run_measurement(quad=quad, nb_stack=1, injection_duration=0.2, tx_volt=tx_volt, autogain=False,
-            #                          bypass_check=True)
-
-            # if self._hw.tx.voltage_adjustable:
-            #     voltage = self._hw.tx.voltage  # imposed voltage on dps
-            # else:
-            #     voltage = self._hw.rx.voltage
-
-            # voltage = self._hw.rx.voltage
-            # current = self._hw.tx.current
-
             # compute resistance measured (= contact resistance)
             rab = abs(vab*1000 / current) / 1000 # kOhm
-            # print(str(quad) + '> I: {:>10.3f} mA, V: {:>10.3f} mV, R: {:>10.3f} kOhm'.format(
-            #    current, voltage, resist))
-            # msg = f'Contact resistance {str(quad):s}: I: {current :>10.3f} mA, ' \
-            #       f'V: {voltage :>10.3f} mV, ' \
-            #       f'R: {resist :>10.3f} kOhm'
+            
             # create a message as dictionnary to be used by the html interface
             msg = {
                 'rsdata': {
                     'A': int(quad[0]),
                     'B': int(quad[1]),
-                    'rs': np.round(rab,3),  # in kOhm
+                    'rs': np.round(rab, 3),  # in kOhm
                 }
             }
             self.data_logger.info(json.dumps(msg))
@@ -880,26 +858,26 @@ class OhmPi(object):
         self.status = 'idle'
         if switch_pwr_off:
             self._hw.pwr.pwr_state = 'off'
+        
         # if power was off before measurement, let's turn if off
         if switch_tx_pwr_off:
             self._hw.pwr_state = 'off'
-    #
-    #         # TODO if interrupted, we would need to restore the values
-    #         # TODO or we offer the possibility in 'run_measurement' to have rs_check each time?
+    
+        # TODO if interrupted, we would need to restore the values
+        # TODO or we offer the possibility in 'run_measurement' to have rs_check each time?
 
     def set_sequence(self, sequence=None, cmd_id=None):
-        """Sets the sequence to acquire
+        """Sets the sequence to acquire.
 
         Parameters
         ----------
-        sequence : list, str
-            sequence of quadrupoles
+        sequence : list of list or array_like
+            Sequence of quadrupoles (list of list or array_like).
         cmd_id: str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         try:
             self.sequence = np.array(sequence).astype(int)
-            # self.sequence = np.loadtxt(StringIO(sequence)).astype('uint32')
         except Exception as e:
             self.exec_logger.warning(f'Unable to set sequence: {e}')
 
@@ -908,12 +886,12 @@ class OhmPi(object):
 
         Parameters
         ----------
-        cmd_id : str, optional
-            Unique command identifier
         quadrupole : list of 4 int
             List of 4 integers representing the electrode numbers.
         bypass_check: bool, optional
-            Bypasses checks for A==M or A==N or B==M or B==N (i.e. used for rs-check)
+            Bypasses checks for A==M or A==N or B==M or B==N (i.e. used for rs-check).
+        cmd_id : str, optional
+            Unique command identifier.
         """
         assert len(quadrupole) == 4
         if (self._hw.tx.pwr.voltage > self._hw.rx._voltage_max) and bypass_check:
@@ -931,15 +909,15 @@ class OhmPi(object):
 
         Parameters
         ----------
-        cmd_id : str, optional
-            Unique command identifier
         quadrupole : list of 4 int
             List of 4 integers representing the electrode numbers.
+        cmd_id : str, optional
+            Unique command identifier.
         """
         assert len(quadrupole) == 4
         return self._hw.switch_mux(electrodes=quadrupole, state='off')
 
-    def test_mux(self, activation_time=1.0, mux_id=None, cmd_id=None): # TODO: add this in the MUX code
+    def test_mux(self, activation_time=0.2, mux_id=None, cmd_id=None):
         """Interactive method to test the multiplexer boards.
 
         Parameters
@@ -947,11 +925,11 @@ class OhmPi(object):
         activation_time : float, optional
             Time in seconds during which the relays are activated.
         mux_id : str, optional
-            id of the mux_board to test
+            ID of the mux_board to test.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
-        self.reset_mux()  # All mux boards should be reset even if we only want to test one otherwise we might create a shortcut
+        self.reset_mux()  # all mux boards should be reset even if we only want to test one otherwise we might create a shortcut
         if mux_id is None:
             self._hw.test_mux(activation_time=activation_time)
         else:
@@ -963,32 +941,28 @@ class OhmPi(object):
         Parameters
         ----------
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         self._hw.reset_mux()
 
     def update_settings(self, settings: str, cmd_id=None):
         """Updates acquisition settings from a json file or dictionary.
         Parameters can be:
-            - nb_electrodes (number of electrode used, if 4, no MUX needed)
-            - injection_duration (in seconds)
-            - nb_meas (total number of times the sequence will be run)
-            - sequence_delay (delay in second between each sequence run)
-            - nb_stack (number of stack for each quadrupole measurement)
-            - strategy (injection strategy: constant, vmax, vmin)
-            - duty_cycle (injection duty cycle comprised between 0.5 - 1)
-            - export_dir (directory where to export the data)
-            - export_name (name of exported file, timestamp will be added to filename)
-            - export_path (path where to export the data, timestamp will be added to filename ;
-                            if export_path is given, it goes over export_dir and export_name)
-
+        - nb_electrodes (number of electrode used, if 4, no MUX needed)
+        - injection_duration (in seconds)
+        - nb_meas (total number of times the sequence will be run)
+        - sequence_delay (delay in second between each sequence run)
+        - nb_stack (number of stack for each quadrupole measurement)
+        - strategy (injection strategy: constant, vmax, vmin)
+        - duty_cycle (injection duty cycle comprised between 0.5 - 1)
+        - export_path (path where to export the data, timestamp will be added to filename)
 
         Parameters
         ----------
         settings : str, dict
             Path to the .json settings file or dictionary of settings.
         cmd_id : str, optional
-            Unique command identifier
+            Unique command identifier.
         """
         if settings is not None:
             try:
@@ -1009,22 +983,23 @@ class OhmPi(object):
             self.exec_logger.warning('Settings are missing...')
 
         if self.settings['export_path'] is None:
-            self.settings['export_path'] = os.path.join(self.settings['export_dir'], self.settings['export_name'])
-        else:
-            self.settings['export_dir'] = os.path.split(self.settings['export_path'])[0]
-            self.settings['export_name'] = os.path.split(self.settings['export_path'])[1]
+            self.settings['export_path'] = os.path.join("data", "measurement.csv")
 
-    def run_inversion(self, survey_names=[], elec_spacing=1, **kwargs):
-        """Run a simple 2D inversion using ResIPy.
+        if not os.path.isabs(self.settings['export_path']):
+            export_dir = os.path.split(os.path.dirname(__file__))[0]
+            self.settings['export_path'] = os.path.join(export_dir, self.settings['export_path'])
+
+    def run_inversion(self, survey_names=None, elec_spacing=1, **kwargs):
+        """Run a simple 2D inversion using ResIPy (https://gitlab.com/hkex/resipy).
         
         Parameters
         ----------
         survey_names : list of string, optional
             Filenames of the survey to be inverted (including extension).
         elec_spacing : float (optional)
-            Electrode spacing in meters. We assume same electrode spacing everywhere.
+            Electrode spacing in meters. We assume same electrode spacing everywhere. Default is 1 m.
         kwargs : optional
-            Additiona keyword arguments passed to `resipy.Project.invert()`. For instance
+            Additional keyword arguments passed to `resipy.Project.invert()`. For instance
             `reg_mode` == 0 for batch inversion, `reg_mode == 2` for time-lapse inversion.
             See ResIPy document for more information on options available
             (https://hkex.gitlab.io/resipy/).
@@ -1036,7 +1011,7 @@ class OhmPi(object):
             for the values in resistivity of the elements.
         """
         # check if we have any files to be inverted
-        if len(survey_names) == 0:
+        if survey_names is None:
             self.exec_logger.error('No file to invert')
             return []
         
@@ -1051,8 +1026,8 @@ class OhmPi(object):
             reg_mode = 0
             kwargs['reg_mode'] = 0
 
-        pdir = os.path.dirname(__file__)
         # import resipy if available
+        pdir = os.path.dirname(__file__)
         try:
             from scipy.interpolate import griddata  # noqa
             import pandas as pd  #noqa
@@ -1066,7 +1041,7 @@ class OhmPi(object):
         # get absolule filename
         fnames = []
         for survey_name in survey_names:
-            fname = os.path.join(pdir, '../data', survey_name)
+            fname = os.path.join(self.settings['export_path'], survey_name)
             if os.path.exists(fname):
                 fnames.append(fname)
             else:
@@ -1075,7 +1050,7 @@ class OhmPi(object):
         # define a parser for the "ohmpi" format
         def ohmpiParser(fname):
             df = pd.read_csv(fname)
-            df = df.rename(columns={'A':'a', 'B':'b', 'M':'m', 'N':'n'})
+            df = df.rename(columns={'A': 'a', 'B': 'b', 'M': 'm', 'N': 'n'})
             df['vp'] = df['Vmn [mV]']
             df['i'] = df['I [mA]']
             df['resist'] = df['vp']/df['i']
@@ -1111,7 +1086,7 @@ class OhmPi(object):
             grid_v = griddata(df[['X', 'Z']].values, df['Resistivity(ohm.m)'].values,
                               (grid_x, grid_z), method='nearest')
             
-            # set nan to -1
+            # set nan to -1 (hard to parse NaN in JSON)
             inan = np.isnan(grid_v)
             grid_v[inan] = -1
 
diff --git a/ohmpi/ohmpi_bkp b/ohmpi/ohmpi_bkp
deleted file mode 100644
index e7ea81a2e7e6fa1500981de8d21cb1a8eb0f4fd1..0000000000000000000000000000000000000000
--- a/ohmpi/ohmpi_bkp
+++ /dev/null
@@ -1,1701 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-created on January 6, 2020.
-Updates dec 2022.
-Hardware: Licensed under CERN-OHL-S v2 or any later version
-Software: Licensed under the GNU General Public License v3.0
-Ohmpi.py is a program to control a low-cost and open hardware resistivity meter OhmPi that has been developed by
-Rémi CLEMENT (INRAE), Vivien DUBOIS (INRAE), Hélène GUYARD (IGE), Nicolas FORQUET (INRAE), Yannick FARGIER (IFSTTAR)
-Olivier KAUFMANN (UMONS), Arnaud WATLET (UMONS) and Guillaume BLANCHY (FNRS/ULiege).
-"""
-
-import os
-from ohmpi.utils import get_platform
-import json
-import warnings
-from copy import deepcopy
-import numpy as np
-import csv
-import time
-import shutil
-from datetime import datetime
-from termcolor import colored
-import threading
-from ohmpi.logging_setup import setup_loggers
-from ohmpi.config import MQTT_CONTROL_CONFIG, OHMPI_CONFIG, EXEC_LOGGING_CONFIG
-from logging import DEBUG
-
-# finish import (done only when class is instantiated as some libs are only available on arm64 platform)
-try:
-    import board  # noqa
-    import busio  # noqa
-    import adafruit_tca9548a  # noqa
-    import adafruit_ads1x15.ads1115 as ads  # noqa
-    from adafruit_ads1x15.analog_in import AnalogIn  # noqa
-    from adafruit_mcp230xx.mcp23008 import MCP23008  # noqa
-    from adafruit_mcp230xx.mcp23017 import MCP23017  # noqa
-    import digitalio  # noqa
-    from digitalio import Direction  # noqa
-    from gpiozero import CPUTemperature  # noqa
-    import minimalmodbus  # noqa
-
-    arm64_imports = True
-except ImportError as error:
-    if EXEC_LOGGING_CONFIG['logging_level'] == DEBUG:
-        print(colored(f'Import error: {error}', 'yellow'))
-    arm64_imports = False
-except Exception as error:
-    print(colored(f'Unexpected error: {error}', 'red'))
-    arm64_imports = None
-
-class OhmPi(object):
-    """ OhmPi class.
-    """
-
-    def __init__(self, settings=None, sequence=None, use_mux=False, mqtt=True, onpi=None, idps=False):
-        """Constructs the ohmpi object
-
-        Parameters
-        ----------
-        settings:
-
-        sequence:
-
-        use_mux:
-            if True use the multiplexor to select active electrodes
-        mqtt: bool, defaut: True
-            if True publish on mqtt topics while logging, otherwise use other loggers only
-        onpi: bool,None default: None
-            if None, the platform on which the class is instantiated is determined to set on_pi to either True or False.
-            if False the behaviour of an ohmpi will be partially emulated and return random data.
-        idps:
-            if true uses the DPS
-        """
-
-        if onpi is None:
-            _, onpi = get_platform()
-
-        self._sequence = sequence
-        self.nb_samples = 0
-        self.use_mux = use_mux
-        self.on_pi = onpi  # True if run from the RaspberryPi with the hardware, otherwise False for random data
-        self.status = 'idle'  # either running or idle
-        self.thread = None  # contains the handle for the thread taking the measurement
-
-        # set loggers
-        config_exec_logger, _, config_data_logger, _, _, msg = setup_loggers(mqtt=mqtt)  # TODO: add SOH
-        self.data_logger = config_data_logger
-        self.exec_logger = config_exec_logger
-        self.soh_logger = None  # TODO: Implement the SOH logger
-        print(msg)
-
-        # read in hardware parameters (config.py)
-        self._read_hardware_config()
-
-        # default acquisition settings
-        self.settings = {
-            'injection_duration': 0.2,
-            'nb_meas': 1,
-            'sequence_delay': 1,
-            'nb_stack': 1,
-            'export_path': 'data/measurement.csv'
-        }
-        # read in acquisition settings
-        if settings is not None:
-            self.update_settings(settings)
-
-        self.exec_logger.debug('Initialized with settings:' + str(self.settings))
-
-        # read quadrupole sequence
-        if sequence is not None:
-            self.load_sequence(sequence)
-
-        self.idps = idps  # flag to use dps for injection or not
-
-        # connect to components on the OhmPi board
-        if self.on_pi:
-            # activation of I2C protocol
-            self.i2c = busio.I2C(board.SCL, board.SDA)  # noqa
-
-            # I2C connexion to MCP23008, for current injection
-            self.mcp_board = MCP23008(self.i2c, address=self.mcp_board_address)
-            self.pin4 = self.mcp_board.get_pin(4) # Ohmpi_run
-            self.pin4.direction = Direction.OUTPUT
-            self.pin4.value = True
-
-            # ADS1115 for current measurement (AB)
-            self.ads_current_address = 0x48
-            self.ads_current = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_current_address)
-
-            # ADS1115 for voltage measurement (MN)
-            self.ads_voltage_address = 0x49
-            self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_voltage_address)
-
-            # current injection module
-            if self.idps:
-                #self.switch_dps('on')
-                self.pin2 = self.mcp_board.get_pin(2) # dsp +
-                self.pin2.direction = Direction.OUTPUT
-                self.pin2.value = True
-                self.pin3 = self.mcp_board.get_pin(3) # dsp -
-                self.pin3.direction = Direction.OUTPUT
-                self.pin3.value = True
-                time.sleep(4)
-                self.DPS = minimalmodbus.Instrument(port='/dev/ttyUSB0', slaveaddress=1)  # port name, address (decimal)
-                self.DPS.serial.baudrate = 9600  # Baud rate 9600 as listed in doc
-                self.DPS.serial.bytesize = 8  #
-                self.DPS.serial.timeout = 1  # greater than 0.5 for it to work
-                self.DPS.debug = False  #
-                self.DPS.serial.parity = 'N'  # No parity
-                self.DPS.mode = minimalmodbus.MODE_RTU  # RTU mode
-                self.DPS.write_register(0x0001, 1000, 0)  # max current allowed (100 mA for relays)
-                # (last number) 0 is for mA, 3 is for A
-
-                #self.soh_logger.debug(f'Battery voltage: {self.DPS.read_register(0x05,2 ):.3f}') TODO: SOH logger
-                print(self.DPS.read_register(0x05,2))
-                self.switch_dps('off')
-
-
-            # injection courant and measure (TODO check if it works, otherwise back in run_measurement())
-            self.pin0 = self.mcp_board.get_pin(0)
-            self.pin0.direction = Direction.OUTPUT
-            self.pin0.value = False
-            self.pin1 = self.mcp_board.get_pin(1)
-            self.pin1.direction = Direction.OUTPUT
-            self.pin1.value = False
-
-        # set controller
-        self.mqtt = mqtt
-        self.cmd_id = None
-        if self.mqtt:
-            import paho.mqtt.client as mqtt_client
-
-            self.exec_logger.debug(f"Connecting to control topic {MQTT_CONTROL_CONFIG['ctrl_topic']}"
-                                   f" on {MQTT_CONTROL_CONFIG['hostname']} broker")
-
-            def connect_mqtt() -> mqtt_client:
-                def on_connect(mqttclient, userdata, flags, rc):
-                    if rc == 0:
-                        self.exec_logger.debug(f"Successfully connected to control broker:"
-                                               f" {MQTT_CONTROL_CONFIG['hostname']}")
-                    else:
-                        self.exec_logger.warning(f'Failed to connect to control broker. Return code : {rc}')
-
-                client = mqtt_client.Client(f"ohmpi_{OHMPI_CONFIG['id']}_listener", clean_session=False)
-                client.username_pw_set(MQTT_CONTROL_CONFIG['auth'].get('username'),
-                                       MQTT_CONTROL_CONFIG['auth']['password'])
-                client.on_connect = on_connect
-                client.connect(MQTT_CONTROL_CONFIG['hostname'], MQTT_CONTROL_CONFIG['port'])
-                return client
-
-            try:
-                self.exec_logger.debug(f"Connecting to control broker: {MQTT_CONTROL_CONFIG['hostname']}")
-                self.controller = connect_mqtt()
-            except Exception as e:
-                self.exec_logger.debug(f'Unable to connect control broker: {e}')
-                self.controller = None
-            if self.controller is not None:
-                self.exec_logger.debug(f"Subscribing to control topic {MQTT_CONTROL_CONFIG['ctrl_topic']}")
-                try:
-                    self.controller.subscribe(MQTT_CONTROL_CONFIG['ctrl_topic'], MQTT_CONTROL_CONFIG['qos'])
-
-                    msg = f"Subscribed to control topic {MQTT_CONTROL_CONFIG['ctrl_topic']}" \
-                          f" on {MQTT_CONTROL_CONFIG['hostname']} broker"
-                    self.exec_logger.debug(msg)
-                    print(colored(f'\u2611 {msg}', 'blue'))
-                except Exception as e:
-                    self.exec_logger.warning(f'Unable to subscribe to control topic : {e}')
-                    self.controller = None
-                publisher_config = MQTT_CONTROL_CONFIG.copy()
-                publisher_config['topic'] = MQTT_CONTROL_CONFIG['ctrl_topic']
-                publisher_config.pop('ctrl_topic')
-
-                def on_message(client, userdata, message):
-                    command = message.payload.decode('utf-8')
-                    self.exec_logger.debug(f'Received command {command}')
-                    self._process_commands(command)
-
-                self.controller.on_message = on_message
-            else:
-                self.controller = None
-                self.exec_logger.warning('No connection to control broker.'
-                                         ' Use python/ipython to interact with OhmPi object...')
-
-    @staticmethod
-    def append_and_save(filename: str, last_measurement: dict, cmd_id=None):
-        """Appends and saves the last measurement dict.
-
-        Parameters
-        ----------
-        filename : str
-            filename to save the last measurement dataframe
-        last_measurement : dict
-            Last measurement taken in the form of a python dictionary
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        last_measurement = deepcopy(last_measurement)
-        if 'fulldata' in last_measurement:
-            d = last_measurement['fulldata']
-            n = d.shape[0]
-            if n > 1:
-                idic = dict(zip(['i' + str(i) for i in range(n)], d[:, 0]))
-                udic = dict(zip(['u' + str(i) for i in range(n)], d[:, 1]))
-                tdic = dict(zip(['t' + str(i) for i in range(n)], d[:, 2]))
-                last_measurement.update(idic)
-                last_measurement.update(udic)
-                last_measurement.update(tdic)
-            last_measurement.pop('fulldata')
-
-        if os.path.isfile(filename):
-            # Load data file and append data to it
-            with open(filename, 'a') as f:
-                w = csv.DictWriter(f, last_measurement.keys())
-                w.writerow(last_measurement)
-                # last_measurement.to_csv(f, header=False)
-        else:
-            # create data file and add headers
-            with open(filename, 'a') as f:
-                w = csv.DictWriter(f, last_measurement.keys())
-                w.writeheader()
-                w.writerow(last_measurement)
-
-    def _compute_tx_volt(self, best_tx_injtime=0.1, strategy='vmax', tx_volt=5):
-        """Estimates best Tx voltage based on different strategies.
-        At first a half-cycle is made for a short duration with a fixed
-        known voltage. This gives us Iab and Rab. We also measure Vmn.
-        A constant c = vmn/iab is computed (only depends on geometric
-        factor and ground resistivity, that doesn't change during a
-        quadrupole). Then depending on the strategy, we compute which
-        vab to inject to reach the minimum/maximum Iab current or
-        min/max Vmn.
-        This function also compute the polarity on Vmn (on which pin
-        of the ADS1115 we need to measure Vmn to get the positive value).
-
-        Parameters
-        ----------
-        best_tx_injtime : float, optional
-            Time in milliseconds for the half-cycle used to compute Rab.
-        strategy : str, optional
-            Either:
-            - vmax : compute Vab to reach a maximum Iab and Vmn
-            - constant : apply given Vab
-        tx_volt : float, optional
-            Voltage to apply for guessing the best voltage. 5 V applied
-            by default. If strategy "constant" is chosen, constant voltage
-            to applied is "tx_volt".
-
-        Returns
-        -------
-        vab : float
-            Proposed Vab according to the given strategy.
-        polarity : int
-            Either 1 or -1 to know on which pin of the ADS the Vmn is measured.
-        """
-
-        # hardware limits
-        voltage_min = 10.  # mV
-        voltage_max = 4500.
-        current_min = voltage_min / (self.r_shunt * 50)  # mA
-        current_max = voltage_max / (self.r_shunt * 50)
-        tx_max = 50.  # volt
-
-        # check of volt
-        volt = tx_volt
-        if volt > tx_max:
-            self.exec_logger.warning('Sorry, cannot inject more than 50 V, set it back to 5 V')
-            volt = 5.
-
-        # redefined the pin of the mcp (needed when relays are connected)
-        self.pin0 = self.mcp_board.get_pin(0)
-        self.pin0.direction = Direction.OUTPUT
-        self.pin0.value = False
-        self.pin1 = self.mcp_board.get_pin(1)
-        self.pin1.direction = Direction.OUTPUT
-        self.pin1.value = False
-
-        # select a polarity to start with
-        self.pin0.value = True
-        self.pin1.value = False
-        
-        
-        if strategy == 'constant':
-            vab = volt
-
-            self.DPS.write_register(0x0000, volt, 2)
-            self.DPS.write_register(0x09, 1)  # DPS5005 on
-            time.sleep(best_tx_injtime)  # inject for given tx time
-            # autogain
-            self.ads_current = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_current_address)
-            self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_voltage_address)
-            gain_current = self._gain_auto(AnalogIn(self.ads_current, ads.P0))
-            gain_voltage0 = self._gain_auto(AnalogIn(self.ads_voltage, ads.P0))
-            gain_voltage2 = self._gain_auto(AnalogIn(self.ads_voltage, ads.P2))
-            gain_voltage = np.min([gain_voltage0, gain_voltage2])  # TODO: separate gain for P0 and P2
-            self.ads_current = ads.ADS1115(self.i2c, gain=gain_current, data_rate=860, address=self.ads_current_address)
-            self.ads_voltage = ads.ADS1115(self.i2c, gain=gain_voltage, data_rate=860, address=self.ads_voltage_address)
-            # we measure the voltage on both A0 and A2 to guess the polarity
-            I = AnalogIn(self.ads_current, ads.P0).voltage * 1000. / 50 / self.r_shunt  # noqa measure current
-            U0 = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.  # noqa measure voltage
-            U2 = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000.  # noqa
-
-            # check polarity
-            polarity = 1  # by default, we guessed it right
-            vmn = U0
-            if U0 < 0:  # we guessed it wrong, let's use a correction factor
-                polarity = -1
-                vmn = U2
-        
-        elif strategy == 'vmax':
-            # implement different strategies
-            I=0
-            vmn=0
-            count=0
-            while I < 3 or abs(vmn) < 20 :  #TODO: hardware related - place in config
-            
-                if count > 0 :
-                    #print('o', volt)
-                    volt = volt + 2
-                   # print('>', volt)
-                count=count+1
-                if volt > 50:
-                    break
-        
-                # set voltage for test
-                if count==1:
-                    self.DPS.write_register(0x09, 1)  # DPS5005 on
-                    time.sleep(best_tx_injtime)  # inject for given tx time
-                self.DPS.write_register(0x0000, volt, 2)
-                # autogain
-                self.ads_current = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_current_address)
-                self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_voltage_address)
-                gain_current = self._gain_auto(AnalogIn(self.ads_current, ads.P0))
-                gain_voltage0 = self._gain_auto(AnalogIn(self.ads_voltage, ads.P0))
-                gain_voltage2 = self._gain_auto(AnalogIn(self.ads_voltage, ads.P2))
-                gain_voltage = np.min([gain_voltage0, gain_voltage2])  #TODO: separate gain for P0 and P2
-                self.ads_current = ads.ADS1115(self.i2c, gain=gain_current, data_rate=860, address=self.ads_current_address)
-                self.ads_voltage = ads.ADS1115(self.i2c, gain=gain_voltage, data_rate=860, address=self.ads_voltage_address)
-                # we measure the voltage on both A0 and A2 to guess the polarity
-                for i in range(10):
-                    I = AnalogIn(self.ads_current, ads.P0).voltage * 1000. / 50 / self.r_shunt  # noqa measure current
-                    U0 = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.  # noqa measure voltage
-                    U2 = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000.  # noqa
-                    time.sleep(best_tx_injtime)
-
-                # check polarity
-                polarity = 1  # by default, we guessed it right
-                vmn = U0
-                if U0 < 0:  # we guessed it wrong, let's use a correction factor
-                    polarity = -1
-                    vmn = U2
-            
-            n = 0
-            while (abs(vmn) > voltage_max or I > current_max) and volt>0:  #If starting voltage is too high, need to lower it down
-                # print('we are out of range! so decreasing volt')
-                volt = volt - 2
-                self.DPS.write_register(0x0000, volt, 2)
-                #self.DPS.write_register(0x09, 1)  # DPS5005 on
-                I = AnalogIn(self.ads_current, ads.P0).voltage * 1000. / 50 / self.r_shunt
-                U0 = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.
-                U2 = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000.
-                polarity = 1  # by default, we guessed it right
-                vmn = U0
-                if U0 < 0:  # we guessed it wrong, let's use a correction factor
-                    polarity = -1
-                    vmn = U2
-                n+=1
-                if n > 25 :   
-                    break
-                        
-            factor_I = (current_max) / I
-            factor_vmn = voltage_max / vmn
-            factor = factor_I
-            if factor_I > factor_vmn:
-                factor = factor_vmn
-            #print('factor', factor_I, factor_vmn)
-            vab = factor * volt * 0.9
-            if vab > tx_max:
-                vab = tx_max
-            print(factor_I, factor_vmn, 'factor!!')
-
-
-        elif strategy == 'vmin':
-            # implement different strategy
-            I=20
-            vmn=400
-            count=0
-            while I > 10 or abs(vmn) > 300 :  #TODO: hardware related - place in config
-                if count > 0 :
-                    volt = volt - 2
-                print(volt, count)
-                count=count+1
-                if volt > 50:
-                    break
-
-                # set voltage for test
-                self.DPS.write_register(0x0000, volt, 2)
-                if count==1:
-                    self.DPS.write_register(0x09, 1)  # DPS5005 on
-                time.sleep(best_tx_injtime)  # inject for given tx time
-
-                # autogain
-                self.ads_current = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_current_address)
-                self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_voltage_address)
-                gain_current = self._gain_auto(AnalogIn(self.ads_current, ads.P0))
-                gain_voltage0 = self._gain_auto(AnalogIn(self.ads_voltage, ads.P0))
-                gain_voltage2 = self._gain_auto(AnalogIn(self.ads_voltage, ads.P2))
-                gain_voltage = np.min([gain_voltage0, gain_voltage2])  #TODO: separate gain for P0 and P2
-                self.ads_current = ads.ADS1115(self.i2c, gain=gain_current, data_rate=860, address=self.ads_current_address)
-                self.ads_voltage = ads.ADS1115(self.i2c, gain=gain_voltage, data_rate=860, address=self.ads_voltage_address)
-                # we measure the voltage on both A0 and A2 to guess the polarity
-                I = AnalogIn(self.ads_current, ads.P0).voltage * 1000. / 50 / self.r_shunt  # noqa measure current
-                U0 = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.  # noqa measure voltage
-                U2 = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000.  # noqa
-
-                # check polarity
-                polarity = 1  # by default, we guessed it right
-                vmn = U0
-                if U0 < 0:  # we guessed it wrong, let's use a correction factor
-                    polarity = -1
-                    vmn = U2
-
-            n=0
-            while (abs(vmn) < voltage_min or I < current_min) and volt > 0 :  #If starting voltage is too high, need to lower it down
-                # print('we are out of range! so increasing volt')
-                volt = volt + 2
-                print(volt)
-                self.DPS.write_register(0x0000, volt, 2)
-                #self.DPS.write_register(0x09, 1)  # DPS5005 on
-                #time.sleep(best_tx_injtime)
-                I = AnalogIn(self.ads_current, ads.P0).voltage * 1000. / 50 / self.r_shunt
-                U0 = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.
-                U2 = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000.
-                polarity = 1  # by default, we guessed it right
-                vmn = U0
-                if U0 < 0:  # we guessed it wrong, let's use a correction factor
-                    polarity = -1
-                    vmn = U2
-                n+=1
-                if n > 25 :
-                    break
-
-            vab = volt
-
-        self.DPS.write_register(0x09, 0) # DPS5005 off
-        # print('polarity', polarity)
-        self.pin0.value = False
-        self.pin1.value = False
-        # # compute constant
-        # c = vmn / I
-        Rab = (volt * 1000.) / I  # noqa
-
-        self.exec_logger.debug(f'Rab = {Rab:.2f} Ohms')
-
-        # self.DPS.write_register(0x09, 0) # DPS5005 off
-        self.pin0.value = False
-        self.pin1.value = False
-
-        return vab, polarity, Rab
-
-    @staticmethod
-    def _find_identical_in_line(quads):
-        """Finds quadrupole where A and B are identical.
-        If A and B are connected to the same electrode, the Pi burns (short-circuit).
-
-        Parameters
-        ----------
-        quads : numpy.ndarray
-            List of quadrupoles of shape nquad x 4 or 1D vector of shape nquad.
-
-        Returns
-        -------
-        output : numpy.ndarray 1D array of int
-            List of index of rows where A and B are identical.
-        """
-
-        # if we have a 1D array (so only 1 quadrupole), make it a 2D array
-        if len(quads.shape) == 1:
-            quads = quads[None, :]
-
-        output = np.where(quads[:, 0] == quads[:, 1])[0]
-
-        return output
-
-    def _gain_auto(self, channel):
-        """Automatically sets the gain on a channel
-
-        Parameters
-        ----------
-        channel : ads.ADS1x15
-            Instance of ADS where voltage is measured.
-
-        Returns
-        -------
-        gain : float
-            Gain to be applied on ADS1115.
-        """
-
-        gain = 2 / 3
-        if (abs(channel.voltage) < 2.040) and (abs(channel.voltage) >= 1.0):
-            gain = 2
-        elif (abs(channel.voltage) < 1.0) and (abs(channel.voltage) >= 0.500):
-            gain = 4
-        elif (abs(channel.voltage) < 0.500) and (abs(channel.voltage) >= 0.250):
-            gain = 8
-        elif abs(channel.voltage) < 0.250:
-            gain = 16
-        self.exec_logger.debug(f'Setting gain to {gain}')
-        return gain
-
-    def get_data(self, survey_names=None, cmd_id=None):
-        """Get available data.
-        
-        Parameters
-        ----------
-        survey_names : list of str, optional
-            List of filenames already available from the html interface. So
-            their content won't be returned again. Only files not in the list
-            will be read.
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        # get all .csv file in data folder
-        if survey_names is None:
-            survey_names = []
-        fnames = [fname for fname in os.listdir('data/') if fname[-4:] == '.csv']
-        ddic = {}
-        if cmd_id is None:
-            cmd_id = 'unknown'
-        for fname in fnames:
-            if ((fname != 'readme.txt')
-                    and ('_rs' not in fname)
-                    and (fname.replace('.csv', '') not in survey_names)):
-                try:
-                    data = np.loadtxt('data/' + fname, delimiter=',',
-                                      skiprows=1, usecols=(1, 2, 3, 4, 8))
-                    data = data[None, :] if len(data.shape) == 1 else data
-                    ddic[fname.replace('.csv', '')] = {
-                        'a': data[:, 0].astype(int).tolist(),
-                        'b': data[:, 1].astype(int).tolist(),
-                        'm': data[:, 2].astype(int).tolist(),
-                        'n': data[:, 3].astype(int).tolist(),
-                        'rho': data[:, 4].tolist(),
-                    }
-                except Exception as e:
-                    print(fname, ':', e)
-        rdic = {'cmd_id': cmd_id, 'data': ddic}
-        self.data_logger.info(json.dumps(rdic))
-        return ddic
-
-    def interrupt(self, cmd_id=None):
-        """Interrupts the acquisition
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        self.status = 'stopping'
-        if self.thread is not None:
-            self.thread.join()
-            self.exec_logger.debug('Interrupted sequence acquisition...')
-        else:
-            self.exec_logger.debug('No sequence measurement thread to interrupt.')
-        self.exec_logger.debug(f'Status: {self.status}')
-
-    def load_sequence(self, filename: str, cmd_id=None):
-        """Reads quadrupole sequence from file.
-
-        Parameters
-        ----------
-        filename : str
-            Path of the .csv or .txt file with A, B, M and N electrodes.
-            Electrode index start at 1.
-        cmd_id : str, optional
-            Unique command identifier
-
-        Returns
-        -------
-        sequence : numpy.array
-            Array of shape (number quadrupoles * 4).
-        """
-        self.exec_logger.debug(f'Loading sequence {filename}')
-        sequence = np.loadtxt(filename, delimiter=" ", dtype=np.uint32)  # load quadrupole file
-
-        if sequence is not None:
-            self.exec_logger.debug(f'Sequence of {sequence.shape[0]:d} quadrupoles read.')
-
-        # locate lines where the electrode index exceeds the maximum number of electrodes
-        test_index_elec = np.array(np.where(sequence > self.max_elec))
-
-        # locate lines where electrode A == electrode B
-        test_same_elec = self._find_identical_in_line(sequence)
-
-        # if statement with exit cases (TODO rajouter un else if pour le deuxième cas du ticket #2)
-        if test_index_elec.size != 0:
-            for i in range(len(test_index_elec[0, :])):
-                self.exec_logger.error(f'An electrode index at line {str(test_index_elec[0, i] + 1)} '
-                                       f'exceeds the maximum number of electrodes')
-            # sys.exit(1)
-            sequence = None
-        elif len(test_same_elec) != 0:
-            for i in range(len(test_same_elec)):
-                self.exec_logger.error(f'An electrode index A == B detected at line {str(test_same_elec[i] + 1)}')
-            # sys.exit(1)
-            sequence = None
-
-        if sequence is not None:
-            self.exec_logger.info(f'Sequence {filename} of {sequence.shape[0]:d} quadrupoles loaded.')
-        else:
-            self.exec_logger.warning(f'Unable to load sequence {filename}')
-        self.sequence = sequence
-
-    def measure(self, **kwargs):
-        warnings.warn('This function is deprecated. Use run_multiple_sequences() instead.', DeprecationWarning)
-        self.run_multiple_sequences(**kwargs)
-
-    def _process_commands(self, message: str):
-        """Processes commands received from the controller(s)
-
-        Parameters
-        ----------
-        message : str
-            message containing a command and arguments or keywords and arguments
-        """
-        status = False
-        cmd_id = '?'
-        try:
-            decoded_message = json.loads(message)
-            self.exec_logger.debug(f'Decoded message {decoded_message}')
-            cmd_id = decoded_message.pop('cmd_id', None)
-            cmd = decoded_message.pop('cmd', None)
-            # args = decoded_message.pop('args', None)
-            # if args is not None:
-            #    if len(args) != 0:
-            #        if args[0] != '[':
-            #            args = f'["{args}"]'
-            #        self.exec_logger.debug(f'args to decode: {args}')
-            #        args = json.loads(args) if args != '[]' else None
-            #        self.exec_logger.debug(f'Decoded args {args}')
-            #    else:
-            #        args = None
-            kwargs = decoded_message.pop('kwargs', None)
-            # if kwargs is not None:
-            #     if len(kwargs) != 0:
-            #         if kwargs[0] != '{':
-            #             kwargs = '{"' + kwargs + '"}'
-            #         self.exec_logger.debug(f'kwargs to decode: {kwargs}')
-            #         kwargs = json.loads(kwargs) if kwargs != '' else None
-            #         self.exec_logger.debug(f'Decoded kwargs {kwargs}')
-            #     else:
-            #         kwargs = None
-            self.exec_logger.debug(f"Calling method {cmd}({str(kwargs) if kwargs is not None else ''})")
-            # self.exec_logger.debug(f"Calling method {cmd}({str(args) + ', ' if args is not None else ''}"
-            #                        f"{str(kwargs) if kwargs is not None else ''})")
-            if cmd_id is None:
-                self.exec_logger.warning('You should use a unique identifier for cmd_id')
-            if cmd is not None:
-                try:
-                    # if args is None:
-                    #     if kwargs is None:
-                    #         output = getattr(self, cmd)()
-                    #     else:
-                    #         output = getattr(self, cmd)(**kwargs)
-                    # else:
-                    if kwargs is None:
-                        output = getattr(self, cmd)()
-                    else:
-                        output = getattr(self, cmd)(**kwargs)
-                    status = True
-                except Exception as e:
-                    self.exec_logger.error(
-                        f"Unable to execute {cmd}({str(kwargs) if kwargs is not None else ''}): {e}")
-                    status = False
-        except Exception as e:
-            self.exec_logger.warning(f'Unable to decode command {message}: {e}')
-            status = False
-        finally:
-            reply = {'cmd_id': cmd_id, 'status': status}
-            reply = json.dumps(reply)
-            self.exec_logger.debug(f'Execution report: {reply}')
-
-    def quit(self, cmd_id=None):
-        """Quits OhmPi
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        """
-
-        self.exec_logger.debug(f'Quitting ohmpi.py following command {cmd_id}')
-        exit()
-
-    def _read_hardware_config(self):
-        """Reads hardware configuration from config.py
-        """
-        self.exec_logger.debug('Getting hardware config')
-        self.id = OHMPI_CONFIG['id']  # ID of the OhmPi
-        self.r_shunt = OHMPI_CONFIG['R_shunt']  # reference resistance value in ohm
-        self.Imax = OHMPI_CONFIG['Imax']  # maximum current
-        self.exec_logger.debug(f'The maximum current cannot be higher than {self.Imax} mA')
-        self.coef_p2 = OHMPI_CONFIG['coef_p2']  # slope for current conversion for ads.P2, measurement in V/V
-        self.nb_samples = OHMPI_CONFIG['nb_samples']  # number of samples measured for each stack
-        self.version = OHMPI_CONFIG['version']  # hardware version
-        self.max_elec = OHMPI_CONFIG['max_elec']  # maximum number of electrodes
-        self.board_addresses = OHMPI_CONFIG['board_addresses']
-        self.board_version = OHMPI_CONFIG['board_version']
-        self.mcp_board_address = OHMPI_CONFIG['mcp_board_address']
-        self.exec_logger.debug(f'OHMPI_CONFIG = {str(OHMPI_CONFIG)}')
-
-    def read_quad(self, **kwargs):
-        warnings.warn('This function is deprecated. Use load_sequence instead.', DeprecationWarning)
-        self.load_sequence(**kwargs)
-
-    def _read_voltage(self):
-        pass
-
-    def remove_data(self, cmd_id=None):
-        """Remove all data in the data folder
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        self.exec_logger.debug(f'Removing all data following command {cmd_id}')
-        shutil.rmtree('data')
-        os.mkdir('data')
-
-    def restart(self, cmd_id=None):
-        """Restarts the Raspberry Pi
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        """
-
-        if self.on_pi:
-            self.exec_logger.info(f'Restarting pi following command {cmd_id}...')
-            os.system('reboot')
-        else:
-            self.exec_logger.warning('Not on Raspberry Pi, skipping reboot...')
-
-    def run_measurement(self, quad=None, nb_stack=None, injection_duration=None,
-                        autogain=True, strategy='constant', tx_volt=5., best_tx_injtime=0.1,
-                        cmd_id=None):
-        """Measures on a quadrupole and returns transfer resistance.
-
-        Parameters
-        ----------
-        quad : iterable (list of int)
-            Quadrupole to measure, just for labelling. Only switch_mux_on/off
-            really create the route to the electrodes.
-        nb_stack : int, optional
-            Number of stacks. A stacl is considered two half-cycles (one
-            positive, one negative).
-        injection_duration : int, optional
-            Injection time in seconds.
-        autogain : bool, optional
-            If True, will adapt the gain of the ADS1115 to maximize the
-            resolution of the reading.
-        strategy : str, optional
-            (V3.0 only) If we search for best voltage (tx_volt == 0), we can choose
-            vmax strategy : find the highest voltage that stays in the range
-            For a constant value, just set the tx_volt.
-        tx_volt : float, optional
-            (V3.0 only) If specified, voltage will be imposed. If 0, we will look
-            for the best voltage. If the best Tx cannot be found, no
-            measurement will be taken and values will be NaN.
-        best_tx_injtime : float, optional
-            (V3.0 only) Injection time in seconds used for finding the best voltage.
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        self.exec_logger.debug('Starting measurement')
-        self.exec_logger.debug('Waiting for data')
-
-        # check arguments
-        if quad is None:
-            quad = [0, 0, 0, 0]
-
-        if self.on_pi:
-            if nb_stack is None:
-                nb_stack = self.settings['nb_stack']
-            if injection_duration is None:
-                injection_duration = self.settings['injection_duration']
-            tx_volt = float(tx_volt)
-
-            # inner variable initialization
-            sum_i = 0
-            sum_vmn = 0
-            sum_ps = 0
-
-            # let's define the pin again as if we run through measure()
-            # as it's run in another thread, it doesn't consider these
-            # and this can lead to short circuit!
-            
-            self.pin0 = self.mcp_board.get_pin(0)
-            self.pin0.direction = Direction.OUTPUT
-            self.pin0.value = False
-            self.pin1 = self.mcp_board.get_pin(1)
-            self.pin1.direction = Direction.OUTPUT
-            self.pin1.value = False
-            self.pin7 = self.mcp_board.get_pin(7) #IHM on mesaurement
-            self.pin7.direction = Direction.OUTPUT
-            self.pin7.value = False
-            
-            if self.sequence is None:
-                if self.idps:
-
-                    # self.switch_dps('on')
-                    self.pin2 = self.mcp_board.get_pin(2) # dsp +
-                    self.pin2.direction = Direction.OUTPUT
-                    self.pin2.value = True
-                    self.pin3 = self.mcp_board.get_pin(3) # dsp -
-                    self.pin3.direction = Direction.OUTPUT
-                    self.pin3.value = True
-                    time.sleep(4)
-                    
-            self.pin5 = self.mcp_board.get_pin(5) #IHM on mesaurement
-            self.pin5.direction = Direction.OUTPUT
-            self.pin5.value = True
-            self.pin6 = self.mcp_board.get_pin(6) #IHM on mesaurement
-            self.pin6.direction = Direction.OUTPUT
-            self.pin6.value = False
-            self.pin7 = self.mcp_board.get_pin(7) #IHM on mesaurement
-            self.pin7.direction = Direction.OUTPUT
-            self.pin7.value = False           
-            if self.idps: 
-                if self.DPS.read_register(0x05,2) < 11:
-                    self.pin7.value = True# max current allowed (100 mA for relays) #voltage
-            
-            # get best voltage to inject AND polarity
-            if self.idps:
-                tx_volt, polarity, Rab = self._compute_tx_volt(
-                    best_tx_injtime=best_tx_injtime, strategy=strategy, tx_volt=tx_volt)
-                self.exec_logger.debug(f'Best VAB found is {tx_volt:.3f}V')
-            else:
-                polarity = 1
-                Rab = None
-
-            # first reset the gain to 2/3 before trying to find best gain (mode 0 is continuous)
-            self.ads_current = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860,
-                                           address=self.ads_current_address, mode=0)
-            self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860,
-                                           address=self.ads_voltage_address, mode=0)
-            # turn on the power supply
-            start_delay = None
-            end_delay = None
-            out_of_range = False
-            if self.idps:
-                if not np.isnan(tx_volt):
-                    self.DPS.write_register(0x0000, tx_volt, 2)  # set tx voltage in V
-                    self.DPS.write_register(0x09, 1)  # DPS5005 on
-                    time.sleep(0.3)
-                else:
-                    self.exec_logger.debug('No best voltage found, will not take measurement')
-                    out_of_range = True
-
-            if not out_of_range:  # we found a Vab in the range so we measure
-                if autogain:
-
-                    # compute autogain
-                    gain_voltage = []
-                    for n in [0,1]:  # make short cycle for gain computation
-                        self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860,
-                                                       address=self.ads_voltage_address, mode=0)
-                        if n == 0:
-                            self.pin0.value = True
-                            self.pin1.value = False
-                            if self.board_version == 'mb.2023.0.0':
-                                self.pin6.value = True # IHM current injection led on
-                        else:
-                            self.pin0.value = False
-                            self.pin1.value = True  # current injection nr2
-                            if self.board_version == 'mb.2023.0.0':
-                                self.pin6.value = True # IHM current injection led on
-
-                        time.sleep(injection_duration)
-                        gain_current = self._gain_auto(AnalogIn(self.ads_current, ads.P0))
-                        
-                        if polarity > 0:
-                            if n == 0:
-                                gain_voltage.append(self._gain_auto(AnalogIn(self.ads_voltage, ads.P0)))
-                            else:
-                                gain_voltage.append(self._gain_auto(AnalogIn(self.ads_voltage, ads.P2)))
-                        else:
-                            if n == 0:
-                                gain_voltage.append(self._gain_auto(AnalogIn(self.ads_voltage, ads.P2)))
-                            else:
-                                gain_voltage.append(self._gain_auto(AnalogIn(self.ads_voltage, ads.P0)))
-
-                        self.pin0.value = False
-                        self.pin1.value = False
-                        time.sleep(injection_duration)
-                        if n == 0:
-                            gain_voltage.append(self._gain_auto(AnalogIn(self.ads_voltage, ads.P0)))
-                        else:
-                            gain_voltage.append(self._gain_auto(AnalogIn(self.ads_voltage, ads.P2)))                        
-                        if self.board_version == 'mb.2023.0.0':
-                            self.pin6.value = False # IHM current injection led off
-
-                    self.exec_logger.debug(f'Gain current: {gain_current:.3f}, gain voltage: {gain_voltage[0]:.3f}, '
-                                           f'{gain_voltage[1]:.3f}')
-                    self.ads_current = ads.ADS1115(self.i2c, gain=gain_current, data_rate=860,
-                                                address=self.ads_current_address, mode=0)
-
-                self.pin0.value = False
-                self.pin1.value = False
-
-                # one stack = 2 half-cycles (one positive, one negative)
-                pinMN = 0 if polarity > 0 else 2  # noqa
-
-                # sampling for each stack at the end of the injection
-                sampling_interval = 10  # ms    # TODO: make this a config option
-                self.nb_samples = int(injection_duration * 1000 // sampling_interval) + 1  #TODO: check this strategy
-
-                # full data for waveform
-                fulldata = []
-
-                #  we sample every 10 ms (as using AnalogIn for both current
-                # and voltage takes about 7 ms). When we go over the injection
-                # duration, we break the loop and truncate the meas arrays
-                # only the last values in meas will be taken into account
-                start_time = time.time()  # start counter
-                for n in range(0, nb_stack * 2):  # for each half-cycles
-                    # current injection
-                    if (n % 2) == 0:
-                        self.pin0.value = True
-                        self.pin1.value = False
-                        if autogain: # select gain computed on first half cycle
-                            self.ads_voltage = ads.ADS1115(self.i2c, gain=np.min(gain_voltage), data_rate=860,
-                                                           address=self.ads_voltage_address, mode=0)
-                    else:
-                        self.pin0.value = False
-                        self.pin1.value = True  # current injection nr2
-                        if autogain: # select gain computed on first half cycle
-                            self.ads_voltage = ads.ADS1115(self.i2c, gain=np.min(gain_voltage),data_rate=860,
-                                                           address=self.ads_voltage_address, mode=0)
-                    self.exec_logger.debug(f'Stack {n} {self.pin0.value} {self.pin1.value}')
-                    if self.board_version == 'mb.2023.0.0':
-                        self.pin6.value = True  # IHM current injection led on
-                    # measurement of current i and voltage u during injection
-                    meas = np.zeros((self.nb_samples, 3)) * np.nan
-                    start_delay = time.time()  # stating measurement time
-                    dt = 0
-                    k = 0
-                    for k in range(0, self.nb_samples):
-                        # reading current value on ADS channels
-                        meas[k, 0] = (AnalogIn(self.ads_current, ads.P0).voltage * 1000) / (50 * self.r_shunt)
-                        if self.board_version == 'mb.2023.0.0':
-                            if pinMN == 0:
-                                meas[k, 1] = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000
-                            else:
-                                meas[k, 1] = -AnalogIn(self.ads_voltage, ads.P2).voltage * 1000
-                        elif self.board_version == '22.10':
-                            meas[k, 1] = -AnalogIn(self.ads_voltage, ads.P0, ads.P1).voltage * self.coef_p2 * 1000
-                        # else:
-                        #    self.exec_logger.debug('Unknown board')
-                        time.sleep(sampling_interval / 1000)
-                        dt = time.time() - start_delay  # real injection time (s)
-                        meas[k, 2] = time.time() - start_time
-                        if dt > (injection_duration - 0 * sampling_interval / 1000.):
-                            break
-
-                    # stop current injection
-                    self.pin0.value = False
-                    self.pin1.value = False
-#                     if autogain: # select gain computed on first half cycle
-#                             self.ads_voltage = ads.ADS1115(self.i2c, gain=gain_voltage[2],data_rate=860,
-#                                                            address=self.ads_voltage_address, mode=0)
-                    self.pin6.value = False# IHM current injection led on
-                    end_delay = time.time()
-
-                    # truncate the meas array if we didn't fill the last samples  #TODO: check why
-                    meas = meas[:k + 1]
-
-                    # measurement of current i and voltage u during off time
-                    measpp = np.zeros((meas.shape[0], 3)) * np.nan
-                    start_delay = time.time()  # stating measurement time
-                    dt = 0
-                    for k in range(0, measpp.shape[0]):
-                        # reading current value on ADS channels
-                        measpp[k, 0] = (AnalogIn(self.ads_current, ads.P0).voltage * 1000.) / (50 * self.r_shunt)
-                        if self.board_version == 'mb.2023.0.0':
-                            if pinMN == 0:
-                                measpp[k, 1] = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.
-                            else:
-                                measpp[k, 1] = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000. * -1
-                        elif self.board_version == '22.10':
-                            measpp[k, 1] = -AnalogIn(self.ads_voltage, ads.P0, ads.P1).voltage * self.coef_p2 * 1000.
-                        else:
-                            self.exec_logger.debug('unknown board')
-                        time.sleep(sampling_interval / 1000)
-                        dt = time.time() - start_delay  # real injection time (s)
-                        measpp[k, 2] = time.time() - start_time
-                        if dt > (injection_duration - 0 * sampling_interval / 1000.):
-                            break
-
-                    end_delay = time.time()
-
-                    # truncate the meas array if we didn't fill the last samples
-                    measpp = measpp[:k + 1]
-
-                    # we alternate on which ADS1115 pin we measure because of sign of voltage
-                    if pinMN == 0:
-                        pinMN = 2  # noqa
-                    else:
-                        pinMN = 0  # noqa
-
-                    # store data for full wave form
-                    fulldata.append(meas)
-                    fulldata.append(measpp)
-
-                # TODO get battery voltage and warn if battery is running low
-                # TODO send a message on SOH stating the battery level
-
-                # let's do some calculation (out of the stacking loop)
-
-                # i_stack = np.empty(2 * nb_stack, dtype=object)
-                # vmn_stack = np.empty(2 * nb_stack, dtype=object)
-                i_stack, vmn_stack = [], []
-                # select appropriate window length to average the readings
-                window = int(np.min([f.shape[0] for f in fulldata[::2]]) // 3)
-                for n, meas in enumerate(fulldata[::2]):
-                    # take average from the samples per stack, then sum them all
-                    # average for the last third of the stacked values
-                    #  is done outside the loop
-                    i_stack.append(meas[-int(window):, 0])
-                    vmn_stack.append(meas[-int(window):, 1])
-
-                    sum_i = sum_i + (np.mean(meas[-int(meas.shape[0] // 3):, 0]))
-                    vmn1 = np.mean(meas[-int(meas.shape[0] // 3), 1])
-                    if (n % 2) == 0:
-                        sum_vmn = sum_vmn - vmn1
-                        sum_ps = sum_ps + vmn1
-                    else:
-                        sum_vmn = sum_vmn + vmn1
-                        sum_ps = sum_ps + vmn1
-
-            else:
-                sum_i = np.nan
-                sum_vmn = np.nan
-                sum_ps = np.nan
-                fulldata = None
-
-            if self.idps:
-                self.DPS.write_register(0x0000, 0, 2)  # reset to 0 volt
-                self.DPS.write_register(0x09, 0)  # DPS5005 off
-
-            # reshape full data to an array of good size
-            # we need an array of regular size to save in the csv
-            if not out_of_range:
-                fulldata = np.vstack(fulldata)
-                # we create a big enough array given nb_samples, number of
-                # half-cycles (1 stack = 2 half-cycles), and twice as we
-                # measure decay as well
-                a = np.zeros((nb_stack * self.nb_samples * 2 * 2, 3)) * np.nan
-                a[:fulldata.shape[0], :] = fulldata
-                fulldata = a
-            else:
-                np.array([[]])
-
-            vmn_stack_mean = np.mean([np.diff(np.mean(vmn_stack[i*2:i*2+2], axis=1)) / 2 for i in range(nb_stack)])
-            vmn_std =np.sqrt(np.std(vmn_stack[::2])**2 + np.std(vmn_stack[1::2])**2) # np.sum([np.std(vmn_stack[::2]),np.std(vmn_stack[1::2])])
-            i_stack_mean = np.mean(i_stack)
-            i_std = np.mean(np.array([np.std(i_stack[::2]), np.std(i_stack[1::2])]))
-            r_stack_mean = vmn_stack_mean / i_stack_mean
-            r_stack_std = np.sqrt((vmn_std/vmn_stack_mean)**2 + (i_std/i_stack_mean)**2) * r_stack_mean
-            ps_stack_mean = np.mean(np.array([np.mean(np.mean(vmn_stack[i * 2:i * 2 + 2], axis=1)) for i in range(nb_stack)]))
-
-            # create a dictionary and compute averaged values from all stacks
-            # if self.board_version == 'mb.2023.0.0':
-            d = {
-                "time": datetime.now().isoformat(),
-                "A": quad[0],
-                "B": quad[1],
-                "M": quad[2],
-                "N": quad[3],
-                "inj time [ms]": (end_delay - start_delay) * 1000. if not out_of_range else 0.,
-                "Vmn [mV]": sum_vmn / (2 * nb_stack),
-                "I [mA]": sum_i / (2 * nb_stack),
-                "R [ohm]": sum_vmn / sum_i,
-                "Ps [mV]": sum_ps / (2 * nb_stack),
-                "nbStack": nb_stack,
-                "Tx [V]": tx_volt if not out_of_range else 0.,
-                "CPU temp [degC]": CPUTemperature().temperature,
-                "Nb samples [-]": self.nb_samples,
-                "fulldata": fulldata,
-                "I_stack [mA]": i_stack_mean,
-                "I_std [mA]": i_std,
-                "I_per_stack [mA]": np.array([np.mean(i_stack[i*2:i*2+2]) for i in range(nb_stack)]),
-                "Vmn_stack [mV]": vmn_stack_mean,
-                "Vmn_std [mV]": vmn_std,
-                "Vmn_per_stack [mV]": np.array([np.diff(np.mean(vmn_stack[i*2:i*2+2], axis=1))[0] / 2 for i in range(nb_stack)]),
-                "R_stack [ohm]": r_stack_mean,
-                "R_std [ohm]": r_stack_std,
-                "R_per_stack [Ohm]": np.mean([np.diff(np.mean(vmn_stack[i*2:i*2+2], axis=1)) / 2 for i in range(nb_stack)]) / np.array([np.mean(i_stack[i*2:i*2+2]) for i in range(nb_stack)]),
-                "PS_per_stack [mV]":  np.array([np.mean(np.mean(vmn_stack[i*2:i*2+2], axis=1)) for i in range(nb_stack)]),
-                "PS_stack [mV]": ps_stack_mean,
-                "R_ab [ohm]": Rab
-            }
-                # print(np.array([(vmn_stack[i*2:i*2+2]) for i in range(nb_stack)]))
-            # elif self.board_version == '22.10':
-            #     d = {
-            #         "time": datetime.now().isoformat(),
-            #         "A": quad[0],
-            #         "B": quad[1],
-            #         "M": quad[2],
-            #         "N": quad[3],
-            #         "inj time [ms]": (end_delay - start_delay) * 1000. if not out_of_range else 0.,
-            #         "Vmn [mV]": sum_vmn / (2 * nb_stack),
-            #         "I [mA]": sum_i / (2 * nb_stack),
-            #         "R [ohm]": sum_vmn / sum_i,
-            #         "Ps [mV]": sum_ps / (2 * nb_stack),
-            #         "nbStack": nb_stack,
-            #         "Tx [V]": tx_volt if not out_of_range else 0.,
-            #         "CPU temp [degC]": CPUTemperature().temperature,
-            #         "Nb samples [-]": self.nb_samples,
-            #         "fulldata": fulldata,
-            #     }
-
-        else:  # for testing, generate random data
-            d = {'time': datetime.now().isoformat(), 'A': quad[0], 'B': quad[1], 'M': quad[2], 'N': quad[3],
-                 'R [ohm]': np.abs(np.random.randn(1)).tolist()}
-
-        # to the data logger
-        dd = d.copy()
-        dd.pop('fulldata')  # too much for logger
-        dd.update({'A': str(dd['A'])})
-        dd.update({'B': str(dd['B'])})
-        dd.update({'M': str(dd['M'])})
-        dd.update({'N': str(dd['N'])})
-
-        # round float to 2 decimal
-        for key in dd.keys():
-            if isinstance(dd[key], float):
-                dd[key] = np.round(dd[key], 3)
-
-        dd['cmd_id'] = str(cmd_id)
-        self.data_logger.info(dd)
-        self.pin5.value = False #IHM led on measurement off 
-        if self.sequence is None :
-            self.switch_dps('off')
-
-        return d
-
-    def run_multiple_sequences(self, cmd_id=None, sequence_delay=None, nb_meas=None, **kwargs):
-        """Runs multiple sequences in a separate thread for monitoring mode.
-           Can be stopped by 'OhmPi.interrupt()'.
-           Additional arguments are passed to run_measurement().
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        sequence_delay : int, optional
-            Number of seconds at which the sequence must be started from each others.
-        nb_meas : int, optional
-            Number of time the sequence must be repeated.
-        kwargs : dict, optional
-            See help(k.run_measurement) for more info.
-        """
-        # self.run = True
-        if sequence_delay is None:
-            sequence_delay = self.settings['sequence_delay']
-        sequence_delay = int(sequence_delay)
-        if nb_meas is None:
-            nb_meas = self.settings['nb_meas']
-        self.status = 'running'
-        self.exec_logger.debug(f'Status: {self.status}')
-        self.exec_logger.debug(f'Measuring sequence: {self.sequence}')
-
-        def func():
-            for g in range(0, nb_meas):  # for time-lapse monitoring
-                if self.status == 'stopping':
-                    self.exec_logger.warning('Data acquisition interrupted')
-                    break
-                t0 = time.time()
-                self.run_sequence(**kwargs)
-
-                # sleeping time between sequence
-                dt = sequence_delay - (time.time() - t0)
-                if dt < 0:
-                    dt = 0
-                if nb_meas > 1:
-                    time.sleep(dt)  # waiting for next measurement (time-lapse)
-            self.status = 'idle'
-
-        self.thread = threading.Thread(target=func)
-        self.thread.start()
-
-    def run_sequence(self, cmd_id=None, **kwargs):
-        """Runs sequence synchronously (=blocking on main thread).
-           Additional arguments are passed to run_measurement().
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        self.status = 'running'
-        self.exec_logger.debug(f'Status: {self.status}')
-        self.exec_logger.debug(f'Measuring sequence: {self.sequence}')
-        t0 = time.time()
-        self.reset_mux()
-        
-        # create filename with timestamp
-        filename = self.settings["export_path"].replace('.csv',
-                                                        f'_{datetime.now().strftime("%Y%m%dT%H%M%S")}.csv')
-        self.exec_logger.debug(f'Saving to {filename}')
-
-        # make sure all multiplexer are off
-        
-
-        # measure all quadrupole of the sequence
-        if self.sequence is None:
-            n = 1
-        else:
-            n = self.sequence.shape[0]
-        for i in range(0, n):
-            if self.sequence is None:
-                quad = np.array([0, 0, 0, 0])
-            else:
-                quad = self.sequence[i, :]  # quadrupole
-            if self.status == 'stopping':
-                break
-            if i == 0:
-                # call the switch_mux function to switch to the right electrodes
-                # switch on DPS
-                self.mcp_board = MCP23008(self.i2c, address=self.mcp_board_address)
-                self.pin2 = self.mcp_board.get_pin(2) # dsp -
-                self.pin2.direction = Direction.OUTPUT
-                self.pin2.value = True
-                self.pin3 = self.mcp_board.get_pin(3) # dsp -
-                self.pin3.direction = Direction.OUTPUT
-                self.pin3.value = True
-                time.sleep (4)
-
-                #self.switch_dps('on')
-            time.sleep(.6)
-            self.switch_mux_on(quad)
-            # run a measurement
-            if self.on_pi:
-                acquired_data = self.run_measurement(quad, **kwargs)
-            else:  # for testing, generate random data
-                sum_vmn = np.random.rand(1)[0] * 1000.
-                sum_i = np.random.rand(1)[0] * 100.
-                cmd_id = np.random.randint(1000)
-                acquired_data = {
-                    "time": datetime.now().isoformat(),
-                    "A": quad[0],
-                    "B": quad[1],
-                    "M": quad[2],
-                    "N": quad[3],
-                    "inj time [ms]": self.settings['injection_duration'] * 1000.,
-                    "Vmn [mV]": sum_vmn,
-                    "I [mA]": sum_i,
-                    "R [ohm]": sum_vmn / sum_i,
-                    "Ps [mV]": np.random.randn(1)[0] * 100.,
-                    "nbStack": self.settings['nb_stack'],
-                    "Tx [V]": np.random.randn(1)[0] * 5.,
-                    "CPU temp [degC]": np.random.randn(1)[0] * 50.,
-                    "Nb samples [-]": self.nb_samples,
-                }
-                self.data_logger.info(acquired_data)
-
-            # switch mux off
-            self.switch_mux_off(quad)
-
-            # add command_id in dataset
-            acquired_data.update({'cmd_id': cmd_id})
-            # log data to the data logger
-            # self.data_logger.info(f'{acquired_data}')
-            # save data and print in a text file
-            self.append_and_save(filename, acquired_data)
-            self.exec_logger.debug(f'quadrupole {i + 1:d}/{n:d}')
-
-        self.switch_dps('off')
-        self.status = 'idle'
-
-    def run_sequence_async(self, cmd_id=None, **kwargs):
-        """Runs the sequence in a separate thread. Can be stopped by 'OhmPi.interrupt()'.
-            Additional arguments are passed to run_measurement().
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        """
-
-        def func():
-            self.run_sequence(**kwargs)
-
-        self.thread = threading.Thread(target=func)
-        self.thread.start()
-        self.status = 'idle'
-
-    def rs_check(self, tx_volt=12., cmd_id=None):
-        """Checks contact resistances
-
-        Parameters
-        ----------
-        tx_volt : float
-            Voltage of the injection
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        # create custom sequence where MN == AB
-        # we only check the electrodes which are in the sequence (not all might be connected)
-        if self.sequence is None or not self.use_mux:
-            quads = np.array([[1, 2, 1, 2]], dtype=np.uint32)
-        else:
-            elec = np.sort(np.unique(self.sequence.flatten()))  # assumed order
-            quads = np.vstack([
-                elec[:-1],
-                elec[1:],
-                elec[:-1],
-                elec[1:],
-            ]).T
-        if self.idps:
-            quads[:, 2:] = 0  # we don't open Vmn to prevent burning the MN part
-            # as it has a smaller range of accepted voltage
-
-        # create filename to store RS
-        export_path_rs = self.settings['export_path'].replace('.csv', '') \
-                         + '_' + datetime.now().strftime('%Y%m%dT%H%M%S') + '_rs.csv'
-
-        # perform RS check
-        # self.run = True
-        self.status = 'running'
-
-        if self.on_pi:
-            # make sure all mux are off to start with
-            self.reset_mux()
-
-            # measure all quad of the RS sequence
-            for i in range(0, quads.shape[0]):
-                quad = quads[i, :]  # quadrupole
-                self.switch_mux_on(quad)  # put before raising the pins (otherwise conflict i2c)
-                d = self.run_measurement(quad=quad, nb_stack=1, injection_duration=0.2, tx_volt=tx_volt, autogain=False)
-
-                if self.idps:
-                    voltage = tx_volt * 1000.  # imposed voltage on dps5005
-                else:
-                    voltage = d['Vmn [mV]']
-                current = d['I [mA]']
-
-                # compute resistance measured (= contact resistance)
-                resist = abs(voltage / current) / 1000.
-                # print(str(quad) + '> I: {:>10.3f} mA, V: {:>10.3f} mV, R: {:>10.3f} kOhm'.format(
-                #    current, voltage, resist))
-                msg = f'Contact resistance {str(quad):s}: I: {current * 1000.:>10.3f} mA, ' \
-                      f'V: {voltage :>10.3f} mV, ' \
-                      f'R: {resist :>10.3f} kOhm'
-
-                self.exec_logger.debug(msg)
-
-                # if contact resistance = 0 -> we have a short circuit!!
-                if resist < 1e-5:
-                    msg = f'!!!SHORT CIRCUIT!!! {str(quad):s}: {resist:.3f} kOhm'
-                    self.exec_logger.warning(msg)
-
-                # save data in a text file
-                self.append_and_save(export_path_rs, {
-                    'A': quad[0],
-                    'B': quad[1],
-                    'RS [kOhm]': resist,
-                })
-
-                # close mux path and put pin back to GND
-                self.switch_mux_off(quad)
-        else:
-            pass
-        self.status = 'idle'
-
-    #
-    #         # TODO if interrupted, we would need to restore the values
-    #         # TODO or we offer the possibility in 'run_measurement' to have rs_check each time?
-
-    def set_sequence(self, sequence=None, cmd_id=None):
-        """Sets the sequence to acquire
-
-        Parameters
-        ----------
-        sequence : list, str
-            sequence of quadrupoles
-        cmd_id: str, optional
-            Unique command identifier
-        """
-        try:
-            self.sequence = np.array(sequence).astype(int)
-            # self.sequence = np.loadtxt(StringIO(sequence)).astype('uint32')
-            status = True
-        except Exception as e:
-            self.exec_logger.warning(f'Unable to set sequence: {e}')
-            status = False
-
-    def stop(self, **kwargs):
-        warnings.warn('This function is deprecated. Use interrupt instead.', DeprecationWarning)
-        self.interrupt(**kwargs)
-
-    def _switch_mux(self, electrode_nr, state, role):
-        """Selects the right channel for the multiplexer cascade for a given electrode.
-        
-        Parameters
-        ----------
-        electrode_nr : int
-            Electrode index to be switched on or off.
-        state : str
-            Either 'on' or 'off'.
-        role : str
-            Either 'A', 'B', 'M' or 'N', so we can assign it to a MUX board.
-        """
-
-        if not self.use_mux or not self.on_pi:
-            if not self.on_pi:
-                self.exec_logger.warning('Cannot reset mux while in simulation mode...')
-            else:
-                self.exec_logger.warning('You cannot use the multiplexer because use_mux is set to False.'
-                                         ' Set use_mux to True to use the multiplexer...')
-        elif self.sequence is None and not self.use_mux:
-            self.exec_logger.warning('Unable to switch MUX without a sequence')
-        else:
-            # choose with MUX board
-            tca = adafruit_tca9548a.TCA9548A(self.i2c, self.board_addresses[role])
-
-            # find I2C address of the electrode and corresponding relay
-            # considering that one MCP23017 can cover 16 electrodes
-            i2c_address = 7 - (electrode_nr - 1) // 16  # quotient without rest of the division
-            relay_nr = (electrode_nr-1) - ((electrode_nr-1) // 16) * 16
-
-            if i2c_address is not None:
-                # select the MCP23017 of the selected MUX board
-                mcp2 = MCP23017(tca[i2c_address])
-                mcp2.get_pin(relay_nr).direction = digitalio.Direction.OUTPUT
-
-                if state == 'on':
-                    mcp2.get_pin(relay_nr).value = True
-                else:
-                    mcp2.get_pin(relay_nr).value = False
-
-                self.exec_logger.debug(f'Switching relay {relay_nr} '
-                                       f'({str(hex(self.board_addresses[role]))}) {state} for electrode {electrode_nr}')
-            else:
-                self.exec_logger.warning(f'Unable to address electrode nr {electrode_nr}')
-
-    def switch_dps(self,state='off'):
-        """Switches DPS on or off.
-
-            Parameters
-            ----------
-            state : str
-                'on', 'off'
-            """
-        self.pin2 = self.mcp_board.get_pin(2) # dsp -
-        self.pin2.direction = Direction.OUTPUT
-        self.pin3 = self.mcp_board.get_pin(3) # dsp -
-        self.pin3.direction = Direction.OUTPUT
-        if state == 'on':
-            self.pin2.value = True
-            self.pin3.value = True
-            self.exec_logger.debug(f'Switching DPS on')
-            time.sleep(4)
-        elif state == 'off':
-            self.pin2.value = False
-            self.pin3.value = False
-            self.exec_logger.debug(f'Switching DPS off')
-
-
-    def switch_mux_on(self, quadrupole, cmd_id=None):
-        """Switches on multiplexer relays for given quadrupole.
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        quadrupole : list of 4 int
-            List of 4 integers representing the electrode numbers.
-        """
-        roles = ['A', 'B', 'M', 'N']
-        # another check to be sure A != B
-        if quadrupole[0] != quadrupole[1]:
-            for i in range(0, 4):
-                if quadrupole[i] > 0:
-                    self._switch_mux(quadrupole[i], 'on', roles[i])
-        else:
-            self.exec_logger.error('Not switching MUX : A == B -> short circuit risk detected!')
-
-    def switch_mux_off(self, quadrupole, cmd_id=None):
-        """Switches off multiplexer relays for given quadrupole.
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        quadrupole : list of 4 int
-            List of 4 integers representing the electrode numbers.
-        """
-        roles = ['A', 'B', 'M', 'N']
-        for i in range(0, 4):
-            if quadrupole[i] > 0:
-                self._switch_mux(quadrupole[i], 'off', roles[i])
-
-    def test_mux(self, activation_time=1.0, address=0x70):
-        """Interactive method to test the multiplexer.
-
-        Parameters
-        ----------
-        activation_time : float, optional
-            Time in seconds during which the relays are activated.
-        address : hex, optional
-            Address of the multiplexer board to test (e.g. 0x70, 0x71, ...).
-        """
-        self.use_mux = True
-        self.reset_mux()
-
-        # choose with MUX board
-        tca = adafruit_tca9548a.TCA9548A(self.i2c, address)
-
-        # ask use some details on how to proceed
-        a = input('If you want try 1 channel choose 1, if you want try all channels choose 2!')
-        if a == '1':
-            print('run channel by channel test')
-            electrode = int(input('Choose your electrode number (integer):'))
-            electrodes = [electrode]
-        elif a == '2':
-            electrodes = range(1, 65)
-        else:
-            print('Wrong choice !')
-            return
-
-            # run the test
-        for electrode_nr in electrodes:
-            # find I2C address of the electrode and corresponding relay
-            # considering that one MCP23017 can cover 16 electrodes
-            i2c_address = 7 - (electrode_nr - 1) // 16  # quotient without rest of the division
-            relay_nr = electrode_nr - (electrode_nr // 16) * 16 + 1
-
-            if i2c_address is not None:
-                # select the MCP23017 of the selected MUX board
-                mcp2 = MCP23017(tca[i2c_address])
-                mcp2.get_pin(relay_nr - 1).direction = digitalio.Direction.OUTPUT
-
-                # activate relay for given time    
-                mcp2.get_pin(relay_nr - 1).value = True
-                print('electrode:', electrode_nr, ' activated...', end='', flush=True)
-                time.sleep(activation_time)
-                mcp2.get_pin(relay_nr - 1).value = False
-                print(' deactivated')
-                time.sleep(activation_time)
-        print('Test finished.')
-
-    def reset_mux(self, cmd_id=None):
-        """Switches off all multiplexer relays.
-
-        Parameters
-        ----------
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        if self.on_pi and self.use_mux:
-            roles = ['A', 'B', 'M', 'N']
-            for i in range(0, 4):
-                for j in range(1, self.max_elec + 1):
-                    self._switch_mux(j, 'off', roles[i])
-            self.exec_logger.debug('All MUX switched off.')
-        elif not self.on_pi:
-            self.exec_logger.warning('Cannot reset mux while in simulation mode...')
-        else:
-            self.exec_logger.warning('You cannot use the multiplexer because use_mux is set to False.'
-                                     ' Set use_mux to True to use the multiplexer...')
-
-    def _update_acquisition_settings(self, config):
-        warnings.warn('This function is deprecated, use update_settings() instead.', DeprecationWarning)
-        self.update_settings(settings=config)
-
-    def update_settings(self, settings: str, cmd_id=None):
-        """Updates acquisition settings from a json file or dictionary.
-        Parameters can be:
-            - nb_electrodes (number of electrode used, if 4, no MUX needed)
-            - injection_duration (in seconds)
-            - nb_meas (total number of times the sequence will be run)
-            - sequence_delay (delay in second between each sequence run)
-            - nb_stack (number of stack for each quadrupole measurement)
-            - export_path (path where to export the data, timestamp will be added to filename)
-
-        Parameters
-        ----------
-        settings : str, dict
-            Path to the .json settings file or dictionary of settings.
-        cmd_id : str, optional
-            Unique command identifier
-        """
-        status = False
-        if settings is not None:
-            try:
-                if isinstance(settings, dict):
-                    self.settings.update(settings)
-                else:
-                    with open(settings) as json_file:
-                        dic = json.load(json_file)
-                    self.settings.update(dic)
-                self.exec_logger.debug('Acquisition parameters updated: ' + str(self.settings))
-                status = True
-            except Exception as e:  # noqa
-                self.exec_logger.warning('Unable to update settings.')
-                status = False
-        else:
-            self.exec_logger.warning('Settings are missing...')
-        return status
-
-    # Properties
-    @property
-    def sequence(self):
-        """Gets sequence"""
-        if self._sequence is not None:
-            assert isinstance(self._sequence, np.ndarray)
-        return self._sequence
-
-    @sequence.setter
-    def sequence(self, sequence):
-        """Sets sequence"""
-        if sequence is not None:
-            assert isinstance(sequence, np.ndarray)
-            self.use_mux = True
-        else:
-            self.use_mux = False
-        self._sequence = sequence
-
-
-VERSION = '2.1.5'
-
-print(colored(r' ________________________________' + '\n' +
-              r'|  _  | | | ||  \/  || ___ \_   _|' + '\n' +
-              r'| | | | |_| || .  . || |_/ / | |' + '\n' +
-              r'| | | |  _  || |\/| ||  __/  | |' + '\n' +
-              r'\ \_/ / | | || |  | || |    _| |_' + '\n' +
-              r' \___/\_| |_/\_|  |_/\_|    \___/ ', 'red'))
-print('Version:', VERSION)
-platform, on_pi = get_platform()
-
-if on_pi:
-    print(colored(f'\u2611 Running on {platform} platform', 'green'))
-    # TODO: check model for compatible platforms (exclude Raspberry Pi versions that are not supported...)
-    #       and emit a warning otherwise
-    if not arm64_imports:
-        print(colored(f'Warning: Required packages are missing.\n'
-                      f'Please run ./env.sh at command prompt to update your virtual environment\n', 'yellow'))
-else:
-    print(colored(f'\u26A0 Not running on the Raspberry Pi platform.\nFor simulation purposes only...', 'yellow'))
-
-current_time = datetime.now()
-print(f'local date and time : {current_time.strftime("%Y-%m-%d %H:%M:%S")}')
-
-# for testing
-if __name__ == "__main__":
-    ohmpi = OhmPi(settings=OHMPI_CONFIG['settings'])
-    if ohmpi.controller is not None:
-        ohmpi.controller.loop_forever()
diff --git a/ohmpi/utils.py b/ohmpi/utils.py
index 8458e6743f84634951f7f24d70412eff119453fb..c1c45595b5bb6556da8e2f2a79780350d4a07706 100644
--- a/ohmpi/utils.py
+++ b/ohmpi/utils.py
@@ -23,6 +23,7 @@ def enforce_specs(kwargs, specs, key):
 
     return kwargs
 
+
 def update_dict(d, u):
     """Updates a dictionary by adding elements to collection items associated to existing keys
 
@@ -113,7 +114,33 @@ def parse_log(log):
     session = np.array(session)
     return time, process_id, tag, msg, session
 
-def mux_2024_to_mux_2023_takeouts(sequence):
+
+def mux_2024_to_mux_2023_takeouts(elec_list):
+    """ Updates cabling for mux v2024 so that takeouts are similar to takeouts from mux v2023.
+    This is only useful when replacing mux v2023 installations or re-using old test circuits.
+
+    Parameters
+    ----------
+    elec_list: list of electrodes or sequence
+
+    """
+
     mapper = {1: 16, 2: 1, 3: 15, 4: 2, 5: 14, 6: 3, 7: 13, 8: 4, 9: 12, 10: 5, 11: 11,
               12: 6, 13: 10, 14: 7, 15: 9, 16: 8}
-    remapped_sequence = mapper[sequence]
\ No newline at end of file
+
+    return np.vectorize(mapper.get)(elec_list)
+
+def mux_2023_to_mux_2024_takeouts(elec_list):
+    """ Updates cabling for mux v2023 so that takeouts are similar to takeouts from mux v2024.
+    This is only useful when replacing mux v2023 installations or re-using old test circuits.
+
+    Parameters
+    ----------
+    elec_list: list of electrodes or sequence
+
+    """
+
+    mapper = { 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16,
+               9: 15, 10: 13, 11: 11, 12: 9, 13: 7, 14: 5, 15: 3, 16: 1,}
+
+    return np.vectorize(mapper.get)(elec_list)
\ No newline at end of file
diff --git a/ohmpi_settings.json b/ohmpi_settings.json
deleted file mode 100644
index 2964e24b850157b3fe3a449a4cf5e62a701f82f3..0000000000000000000000000000000000000000
--- a/ohmpi_settings.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "nb_electrodes": 16,
-    "injection_duration": 0.2,
-    "nb_stack": 1,
-    "nb_meas": 1,
-    "sequence_delay": 120,
-    "export_path": "data/measurement.csv"
-}
diff --git a/ohmpi/ABMN.txt b/sequences/ABMN.txt
similarity index 100%
rename from ohmpi/ABMN.txt
rename to sequences/ABMN.txt
diff --git a/settings/default.json b/settings/default.json
new file mode 100644
index 0000000000000000000000000000000000000000..89f24ac1746e11b84a935acab9deb2ac42da5144
--- /dev/null
+++ b/settings/default.json
@@ -0,0 +1,13 @@
+{
+    "injection_duration": 0.2,
+    "nb_meas": 1,
+    "sequence_delay": 1,
+    "nb_stack": 1,
+    "sampling_interval": 2,
+    "tx_volt": 5,
+    "duty_cycle": 0.5,
+    "strategy": "constant",
+    "fw_in_csv": false,
+    "fw_in_zip": true,
+    "export_path": "data/measurements.csv"
+}
\ No newline at end of file