From a272e7204d7004e0bb95e508496206652b0aa422 Mon Sep 17 00:00:00 2001 From: qiyuexia Date: Tue, 16 Apr 2019 18:13:13 +0800 Subject: [PATCH 1/2] mesh: use new event library --- components/esp_event/event_send.c | 7 - components/esp_wifi/include/esp_mesh.h | 34 +-- components/esp_wifi/lib_esp32 | 2 +- components/esp_wifi/src/mesh_event.c | 20 +- .../internal_communication/main/mesh_main.c | 255 ++++++++++-------- .../mesh/manual_networking/main/mesh_main.c | 164 ++++++----- 6 files changed, 237 insertions(+), 245 deletions(-) diff --git a/components/esp_event/event_send.c b/components/esp_event/event_send.c index 4472bb4743..2c31ee0f6c 100644 --- a/components/esp_event/event_send.c +++ b/components/esp_event/event_send.c @@ -20,7 +20,6 @@ esp_err_t esp_event_send_noop(system_event_t *event); extern esp_err_t esp_event_send_legacy(system_event_t *event) __attribute__((weak, alias("esp_event_send_noop"))); extern esp_err_t esp_event_send_to_default_loop(system_event_t *event) __attribute((weak, alias("esp_event_send_noop"))); -extern esp_err_t esp_event_mesh_hook(system_event_t* event) __attribute__((weak, alias("esp_event_send_noop"))); esp_err_t esp_event_send_noop(system_event_t *event) @@ -42,11 +41,5 @@ esp_err_t esp_event_send(system_event_t *event) return err; } - // send the event to mesh hook - err = esp_event_mesh_hook(event); - if (err != ESP_OK) { - return err; - } - return ESP_OK; } diff --git a/components/esp_wifi/include/esp_mesh.h b/components/esp_wifi/include/esp_mesh.h index e52e541ff8..0666b182e0 100644 --- a/components/esp_wifi/include/esp_mesh.h +++ b/components/esp_wifi/include/esp_mesh.h @@ -174,8 +174,6 @@ typedef enum { MESH_EVENT_ROOT_ADDRESS, /**< the root address is obtained. It is posted by mesh stack automatically. */ MESH_EVENT_ROOT_SWITCH_REQ, /**< root switch request sent from a new voted root candidate */ MESH_EVENT_ROOT_SWITCH_ACK, /**< root switch acknowledgment responds the above request sent from current root */ - MESH_EVENT_ROOT_GOT_IP, /**< the root obtains the IP address. It is posted by LwIP stack automatically */ - MESH_EVENT_ROOT_LOST_IP, /**< the root loses the IP address. It is posted by LwIP stack automatically */ MESH_EVENT_ROOT_ASKED_YIELD, /**< the root is asked yield by a more powerful existing root. If self organized is disabled and this device is specified to be a root by users, users should set a new parent for this device. if self organized is enabled, this device will find a new parent @@ -195,6 +193,9 @@ typedef enum { MESH_EVENT_MAX, } mesh_event_id_t; +/** @brief ESP-MESH event base declaration */ +ESP_EVENT_DECLARE_BASE(MESH_EVENT); + /** * @brief Device type */ @@ -427,21 +428,6 @@ typedef union { mesh_event_router_switch_t router_switch; /**< new router information */ } mesh_event_info_t; -/** - * @brief Mesh event - */ -typedef struct { - mesh_event_id_t id; /**< mesh event id */ - mesh_event_info_t info; /**< mesh event info */ -} mesh_event_t; - -/** - * @brief Mesh event callback handler prototype definition - * - * @param event mesh_event_t - */ -typedef void (*mesh_event_cb_t)(mesh_event_t event); - /** * @brief Mesh option */ @@ -492,7 +478,6 @@ typedef struct { uint8_t channel; /**< channel, the mesh network on */ bool allow_channel_switch; /**< if this value is set, when "fail" (mesh_attempts_t) times is reached, device will change to a full channel scan for a network that could join. The default value is false. */ - mesh_event_cb_t event_cb; /**< mesh event callback */ mesh_addr_t mesh_id; /**< mesh network identification */ mesh_router_t router; /**< router configuration */ mesh_ap_cfg_t mesh_ap; /**< mesh softAP configuration */ @@ -543,9 +528,6 @@ typedef struct { /* mesh IE crypto callback function */ extern const mesh_crypto_funcs_t g_wifi_default_mesh_crypto_funcs; -/* mesh event callback handler */ -extern mesh_event_cb_t g_mesh_event_cb; - #define MESH_INIT_CONFIG_DEFAULT() { \ .crypto_funcs = &g_wifi_default_mesh_crypto_funcs, \ } @@ -1303,16 +1285,6 @@ esp_err_t esp_mesh_set_root_healing_delay(int delay_ms); */ int esp_mesh_get_root_healing_delay(void); -/** - * @brief Set mesh event callback - * - * @param[in] event_cb mesh event call back - * - * @return - * - ESP_OK - */ -esp_err_t esp_mesh_set_event_cb(const mesh_event_cb_t event_cb); - /** * @brief Enable network Fixed Root Setting * - Enabling fixed root disables automatic election of the root node via voting. diff --git a/components/esp_wifi/lib_esp32 b/components/esp_wifi/lib_esp32 index b7bfeeccdb..414f9b279e 160000 --- a/components/esp_wifi/lib_esp32 +++ b/components/esp_wifi/lib_esp32 @@ -1 +1 @@ -Subproject commit b7bfeeccdb63fd20cf6b4abc52d9185934af4cb8 +Subproject commit 414f9b279e772196e8f6cf343d19f2882a2e8741 diff --git a/components/esp_wifi/src/mesh_event.c b/components/esp_wifi/src/mesh_event.c index f0b90ae422..52c6cf56f6 100644 --- a/components/esp_wifi/src/mesh_event.c +++ b/components/esp_wifi/src/mesh_event.c @@ -14,24 +14,10 @@ #include #include "esp_event.h" -#include "esp_mesh.h" -/* mesh event callback handler */ -mesh_event_cb_t g_mesh_event_cb = NULL; +ESP_EVENT_DEFINE_BASE(MESH_EVENT); -esp_err_t esp_event_mesh_hook(system_event_t *event) +esp_err_t esp_mesh_send_event_internal(int32_t event_id, void* event_data, size_t event_data_size) { - if (event->event_id == SYSTEM_EVENT_STA_GOT_IP || event->event_id == SYSTEM_EVENT_STA_LOST_IP) { - if (g_mesh_event_cb) { - mesh_event_t mevent; - if (event->event_id == SYSTEM_EVENT_STA_GOT_IP) { - mevent.id = MESH_EVENT_ROOT_GOT_IP; - memcpy(&mevent.info.got_ip, &event->event_info.got_ip, sizeof(system_event_sta_got_ip_t)); - } else { - mevent.id = MESH_EVENT_ROOT_LOST_IP; - } - g_mesh_event_cb(mevent); - } - } - return ESP_OK; + return esp_event_post(MESH_EVENT, event_id, event_data, event_data_size, 0); } diff --git a/examples/mesh/internal_communication/main/mesh_main.c b/examples/mesh/internal_communication/main/mesh_main.c index e6ce6255c2..5b1c7d7e75 100644 --- a/examples/mesh/internal_communication/main/mesh_main.c +++ b/examples/mesh/internal_communication/main/mesh_main.c @@ -9,7 +9,7 @@ #include #include "esp_wifi.h" #include "esp_system.h" -#include "esp_event_loop.h" +#include "esp_event.h" #include "esp_log.h" #include "esp_mesh.h" #include "esp_mesh_internal.h" @@ -19,7 +19,6 @@ /******************************************************* * Macros *******************************************************/ -//#define MESH_P2P_TOS_OFF /******************************************************* * Constants @@ -71,11 +70,9 @@ void esp_mesh_p2p_tx_main(void *arg) data.data = tx_buf; data.size = sizeof(tx_buf); data.proto = MESH_PROTO_BIN; -#ifdef MESH_P2P_TOS_OFF - data.tos = MESH_TOS_DEF; -#endif /* MESH_P2P_TOS_OFF */ - + data.tos = MESH_TOS_P2P; is_running = true; + while (is_running) { /* non-root do nothing but print */ if (!esp_mesh_is_root()) { @@ -138,8 +135,8 @@ void esp_mesh_p2p_rx_main(void *arg) int flag = 0; data.data = rx_buf; data.size = RX_SIZE; - is_running = true; + while (is_running) { data.size = RX_SIZE; err = esp_mesh_recv(&from, &data, portMAX_DELAY, &flag, NULL, 0); @@ -178,53 +175,66 @@ esp_err_t esp_mesh_comm_p2p_start(void) return ESP_OK; } -void mesh_event_handler(mesh_event_t event) +void mesh_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) { mesh_addr_t id = {0,}; static uint8_t last_layer = 0; - ESP_LOGD(MESH_TAG, "esp_event_handler:%d", event.id); - switch (event.id) { - case MESH_EVENT_STARTED: + switch (event_id) { + case MESH_EVENT_STARTED: { esp_mesh_get_id(&id); - ESP_LOGI(MESH_TAG, "ID:"MACSTR"", MAC2STR(id.addr)); + ESP_LOGI(MESH_TAG, "ID:"MACSTR"", MAC2STR(id.addr)); is_mesh_connected = false; mesh_layer = esp_mesh_get_layer(); - break; - case MESH_EVENT_STOPPED: + } + break; + case MESH_EVENT_STOPPED: { ESP_LOGI(MESH_TAG, ""); is_mesh_connected = false; mesh_layer = esp_mesh_get_layer(); - break; - case MESH_EVENT_CHILD_CONNECTED: + } + break; + case MESH_EVENT_CHILD_CONNECTED: { + mesh_event_child_connected_t *child_connected = (mesh_event_child_connected_t *)event_data; ESP_LOGI(MESH_TAG, "aid:%d, "MACSTR"", - event.info.child_connected.aid, - MAC2STR(event.info.child_connected.mac)); - break; - case MESH_EVENT_CHILD_DISCONNECTED: + child_connected->aid, + MAC2STR(child_connected->mac)); + } + break; + case MESH_EVENT_CHILD_DISCONNECTED: { + mesh_event_child_disconnected_t *child_disconnected = (mesh_event_child_disconnected_t *)event_data; ESP_LOGI(MESH_TAG, "aid:%d, "MACSTR"", - event.info.child_disconnected.aid, - MAC2STR(event.info.child_disconnected.mac)); - break; - case MESH_EVENT_ROUTING_TABLE_ADD: + child_disconnected->aid, + MAC2STR(child_disconnected->mac)); + } + break; + case MESH_EVENT_ROUTING_TABLE_ADD: { + mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; ESP_LOGW(MESH_TAG, "add %d, new:%d", - event.info.routing_table.rt_size_change, - event.info.routing_table.rt_size_new); - break; - case MESH_EVENT_ROUTING_TABLE_REMOVE: + routing_table->rt_size_change, + routing_table->rt_size_new); + } + break; + case MESH_EVENT_ROUTING_TABLE_REMOVE: { + mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; ESP_LOGW(MESH_TAG, "remove %d, new:%d", - event.info.routing_table.rt_size_change, - event.info.routing_table.rt_size_new); - break; - case MESH_EVENT_NO_PARENT_FOUND: + routing_table->rt_size_change, + routing_table->rt_size_new); + } + break; + case MESH_EVENT_NO_PARENT_FOUND: { + mesh_event_no_parent_found_t *no_parent = (mesh_event_no_parent_found_t *)event_data; ESP_LOGI(MESH_TAG, "scan times:%d", - event.info.no_parent.scan_times); - /* TODO handler for the failure */ - break; - case MESH_EVENT_PARENT_CONNECTED: + no_parent->scan_times); + } + /* TODO handler for the failure */ + break; + case MESH_EVENT_PARENT_CONNECTED: { + mesh_event_connected_t *connected = (mesh_event_connected_t *)event_data; esp_mesh_get_id(&id); - mesh_layer = event.info.connected.self_layer; - memcpy(&mesh_parent_addr.addr, event.info.connected.connected.bssid, 6); + mesh_layer = connected->self_layer; + memcpy(&mesh_parent_addr.addr, connected->connected.bssid, 6); ESP_LOGI(MESH_TAG, "layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR"", last_layer, mesh_layer, MAC2STR(mesh_parent_addr.addr), @@ -237,104 +247,129 @@ void mesh_event_handler(mesh_event_t event) tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA); } esp_mesh_comm_p2p_start(); - break; - case MESH_EVENT_PARENT_DISCONNECTED: + } + break; + case MESH_EVENT_PARENT_DISCONNECTED: { + mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)event_data; ESP_LOGI(MESH_TAG, "reason:%d", - event.info.disconnected.reason); + disconnected->reason); is_mesh_connected = false; mesh_disconnected_indicator(); mesh_layer = esp_mesh_get_layer(); - break; - case MESH_EVENT_LAYER_CHANGE: - mesh_layer = event.info.layer_change.new_layer; + } + break; + case MESH_EVENT_LAYER_CHANGE: { + mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)event_data; + mesh_layer = layer_change->new_layer; ESP_LOGI(MESH_TAG, "layer:%d-->%d%s", last_layer, mesh_layer, esp_mesh_is_root() ? "" : (mesh_layer == 2) ? "" : ""); last_layer = mesh_layer; mesh_connected_indicator(mesh_layer); - break; - case MESH_EVENT_ROOT_ADDRESS: + } + break; + case MESH_EVENT_ROOT_ADDRESS: { + mesh_event_root_address_t *root_addr = (mesh_event_root_address_t *)event_data; ESP_LOGI(MESH_TAG, "root address:"MACSTR"", - MAC2STR(event.info.root_addr.addr)); - break; - case MESH_EVENT_ROOT_GOT_IP: - /* root starts to connect to server */ - ESP_LOGI(MESH_TAG, - "sta ip: " IPSTR ", mask: " IPSTR ", gw: " IPSTR, - IP2STR(&event.info.got_ip.ip_info.ip), - IP2STR(&event.info.got_ip.ip_info.netmask), - IP2STR(&event.info.got_ip.ip_info.gw)); - break; - case MESH_EVENT_ROOT_LOST_IP: - ESP_LOGI(MESH_TAG, ""); - break; - case MESH_EVENT_VOTE_STARTED: + MAC2STR(root_addr->addr)); + } + break; + case MESH_EVENT_VOTE_STARTED: { + mesh_event_vote_started_t *vote_started = (mesh_event_vote_started_t *)event_data; ESP_LOGI(MESH_TAG, "attempts:%d, reason:%d, rc_addr:"MACSTR"", - event.info.vote_started.attempts, - event.info.vote_started.reason, - MAC2STR(event.info.vote_started.rc_addr.addr)); - break; - case MESH_EVENT_VOTE_STOPPED: + vote_started->attempts, + vote_started->reason, + MAC2STR(vote_started->rc_addr.addr)); + } + break; + case MESH_EVENT_VOTE_STOPPED: { ESP_LOGI(MESH_TAG, ""); break; - case MESH_EVENT_ROOT_SWITCH_REQ: + } + case MESH_EVENT_ROOT_SWITCH_REQ: { + mesh_event_root_switch_req_t *switch_req = (mesh_event_root_switch_req_t *)event_data; ESP_LOGI(MESH_TAG, "reason:%d, rc_addr:"MACSTR"", - event.info.switch_req.reason, - MAC2STR( event.info.switch_req.rc_addr.addr)); - break; - case MESH_EVENT_ROOT_SWITCH_ACK: + switch_req->reason, + MAC2STR( switch_req->rc_addr.addr)); + } + break; + case MESH_EVENT_ROOT_SWITCH_ACK: { /* new root */ mesh_layer = esp_mesh_get_layer(); esp_mesh_get_parent_bssid(&mesh_parent_addr); ESP_LOGI(MESH_TAG, "layer:%d, parent:"MACSTR"", mesh_layer, MAC2STR(mesh_parent_addr.addr)); - break; - case MESH_EVENT_TODS_STATE: - ESP_LOGI(MESH_TAG, "state:%d", - event.info.toDS_state); - break; - case MESH_EVENT_ROOT_FIXED: + } + break; + case MESH_EVENT_TODS_STATE: { + mesh_event_toDS_state_t *toDs_state = (mesh_event_toDS_state_t *)event_data; + ESP_LOGI(MESH_TAG, "state:%d", *toDs_state); + } + break; + case MESH_EVENT_ROOT_FIXED: { + mesh_event_root_fixed_t *root_fixed = (mesh_event_root_fixed_t *)event_data; ESP_LOGI(MESH_TAG, "%s", - event.info.root_fixed.is_fixed ? "fixed" : "not fixed"); - break; - case MESH_EVENT_ROOT_ASKED_YIELD: + root_fixed->is_fixed ? "fixed" : "not fixed"); + } + break; + case MESH_EVENT_ROOT_ASKED_YIELD: { + mesh_event_root_conflict_t *root_conflict = (mesh_event_root_conflict_t *)event_data; ESP_LOGI(MESH_TAG, ""MACSTR", rssi:%d, capacity:%d", - MAC2STR(event.info.root_conflict.addr), - event.info.root_conflict.rssi, - event.info.root_conflict.capacity); - break; - case MESH_EVENT_CHANNEL_SWITCH: - ESP_LOGI(MESH_TAG, "new channel:%d", event.info.channel_switch.channel); - break; - case MESH_EVENT_SCAN_DONE: + MAC2STR(root_conflict->addr), + root_conflict->rssi, + root_conflict->capacity); + } + break; + case MESH_EVENT_CHANNEL_SWITCH: { + mesh_event_channel_switch_t *channel_switch = (mesh_event_channel_switch_t *)event_data; + ESP_LOGI(MESH_TAG, "new channel:%d", channel_switch->channel); + } + break; + case MESH_EVENT_SCAN_DONE: { + mesh_event_scan_done_t *scan_done = (mesh_event_scan_done_t *)event_data; ESP_LOGI(MESH_TAG, "number:%d", - event.info.scan_done.number); - break; - case MESH_EVENT_NETWORK_STATE: + scan_done->number); + } + break; + case MESH_EVENT_NETWORK_STATE: { + mesh_event_network_state_t *network_state = (mesh_event_network_state_t *)event_data; ESP_LOGI(MESH_TAG, "is_rootless:%d", - event.info.network_state.is_rootless); - break; - case MESH_EVENT_STOP_RECONNECTION: + network_state->is_rootless); + } + break; + case MESH_EVENT_STOP_RECONNECTION: { ESP_LOGI(MESH_TAG, ""); - break; - case MESH_EVENT_FIND_NETWORK: + } + break; + case MESH_EVENT_FIND_NETWORK: { + mesh_event_find_network_t *find_network = (mesh_event_find_network_t *)event_data; ESP_LOGI(MESH_TAG, "new channel:%d, router BSSID:"MACSTR"", - event.info.find_network.channel, MAC2STR(event.info.find_network.router_bssid)); - break; - case MESH_EVENT_ROUTER_SWITCH: + find_network->channel, MAC2STR(find_network->router_bssid)); + } + break; + case MESH_EVENT_ROUTER_SWITCH: { + mesh_event_router_switch_t *router_switch = (mesh_event_router_switch_t *)event_data; ESP_LOGI(MESH_TAG, "new router:%s, channel:%d, "MACSTR"", - event.info.router_switch.ssid, event.info.router_switch.channel, MAC2STR(event.info.router_switch.bssid)); - break; + router_switch->ssid, router_switch->channel, MAC2STR(router_switch->bssid)); + } + break; default: - ESP_LOGI(MESH_TAG, "unknown id:%d", event.id); + ESP_LOGI(MESH_TAG, "unknown id:%d", event_id); break; } } +void ip_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data; + ESP_LOGI(MESH_TAG, "IP:%s", ip4addr_ntoa(&event->ip_info.ip)); +} + void app_main(void) { ESP_ERROR_CHECK(mesh_light_init()); @@ -347,33 +382,23 @@ void app_main(void) * */ ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP)); ESP_ERROR_CHECK(tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA)); -#if 0 - /* static ip settings */ - tcpip_adapter_ip_info_t sta_ip; - sta_ip.ip.addr = ipaddr_addr("192.168.1.102"); - sta_ip.gw.addr = ipaddr_addr("192.168.1.1"); - sta_ip.netmask.addr = ipaddr_addr("255.255.255.0"); - tcpip_adapter_set_ip_info(WIFI_IF_STA, &sta_ip); -#endif + /* event initialization */ + ESP_ERROR_CHECK(esp_event_loop_create_default()); /* wifi initialization */ - ESP_ERROR_CHECK(esp_event_loop_init(NULL, NULL)); wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&config)); + ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL)); ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_FLASH)); ESP_ERROR_CHECK(esp_wifi_start()); /* mesh initialization */ ESP_ERROR_CHECK(esp_mesh_init()); + ESP_ERROR_CHECK(esp_event_handler_register(MESH_EVENT, ESP_EVENT_ANY_ID, &mesh_event_handler, NULL)); ESP_ERROR_CHECK(esp_mesh_set_max_layer(CONFIG_MESH_MAX_LAYER)); ESP_ERROR_CHECK(esp_mesh_set_vote_percentage(1)); ESP_ERROR_CHECK(esp_mesh_set_ap_assoc_expire(10)); -#ifdef MESH_FIX_ROOT - ESP_ERROR_CHECK(esp_mesh_fix_root(1)); -#endif mesh_cfg_t cfg = MESH_INIT_CONFIG_DEFAULT(); /* mesh ID */ memcpy((uint8_t *) &cfg.mesh_id, MESH_ID, 6); - /* mesh event callback */ - cfg.event_cb = &mesh_event_handler; /* router */ cfg.channel = CONFIG_MESH_CHANNEL; cfg.router.ssid_len = strlen(CONFIG_MESH_ROUTER_SSID); diff --git a/examples/mesh/manual_networking/main/mesh_main.c b/examples/mesh/manual_networking/main/mesh_main.c index 56df30ab6e..57629abe8b 100644 --- a/examples/mesh/manual_networking/main/mesh_main.c +++ b/examples/mesh/manual_networking/main/mesh_main.c @@ -9,7 +9,7 @@ #include #include "esp_wifi.h" #include "esp_system.h" -#include "esp_event_loop.h" +#include "esp_event.h" #include "esp_log.h" #include "esp_mesh.h" #include "esp_mesh_internal.h" @@ -40,7 +40,6 @@ static int mesh_layer = -1; /******************************************************* * Function Declarations *******************************************************/ -void mesh_event_handler(mesh_event_t event); void mesh_scan_done_handler(int num); /******************************************************* @@ -156,58 +155,70 @@ void mesh_scan_done_handler(int num) } } -void mesh_event_handler(mesh_event_t event) +void mesh_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) { mesh_addr_t id = {0,}; static uint8_t last_layer = 0; - ESP_LOGD(MESH_TAG, "esp_event_handler:%d", event.id); + wifi_scan_config_t scan_config = { 0 }; - switch (event.id) { - case MESH_EVENT_STARTED: + switch (event_id) { + case MESH_EVENT_STARTED: { esp_mesh_get_id(&id); ESP_LOGI(MESH_TAG, "ID:"MACSTR"", MAC2STR(id.addr)); mesh_layer = esp_mesh_get_layer(); ESP_ERROR_CHECK(esp_mesh_set_self_organized(0, 0)); esp_wifi_scan_stop(); - wifi_scan_config_t scan_config = { 0 }; /* mesh softAP is hidden */ scan_config.show_hidden = 1; scan_config.scan_type = WIFI_SCAN_TYPE_PASSIVE; ESP_ERROR_CHECK(esp_wifi_scan_start(&scan_config, 0)); - break; - case MESH_EVENT_STOPPED: + } + break; + case MESH_EVENT_STOPPED: { ESP_LOGI(MESH_TAG, ""); mesh_layer = esp_mesh_get_layer(); - break; - case MESH_EVENT_CHILD_CONNECTED: + } + break; + case MESH_EVENT_CHILD_CONNECTED: { + mesh_event_child_connected_t *child_connected = (mesh_event_child_connected_t *)event_data; ESP_LOGI(MESH_TAG, "aid:%d, "MACSTR"", - event.info.child_connected.aid, - MAC2STR(event.info.child_connected.mac)); - break; - case MESH_EVENT_CHILD_DISCONNECTED: + child_connected->aid, + MAC2STR(child_connected->mac)); + } + break; + case MESH_EVENT_CHILD_DISCONNECTED: { + mesh_event_child_disconnected_t *child_disconnected = (mesh_event_child_disconnected_t *)event_data; ESP_LOGI(MESH_TAG, "aid:%d, "MACSTR"", - event.info.child_disconnected.aid, - MAC2STR(event.info.child_disconnected.mac)); - break; - case MESH_EVENT_ROUTING_TABLE_ADD: + child_disconnected->aid, + MAC2STR(child_disconnected->mac)); + } + case MESH_EVENT_ROUTING_TABLE_ADD: { + mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; ESP_LOGW(MESH_TAG, "add %d, new:%d", - event.info.routing_table.rt_size_change, - event.info.routing_table.rt_size_new); - break; - case MESH_EVENT_ROUTING_TABLE_REMOVE: + routing_table->rt_size_change, + routing_table->rt_size_new); + } + break; + case MESH_EVENT_ROUTING_TABLE_REMOVE: { + mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; ESP_LOGW(MESH_TAG, "remove %d, new:%d", - event.info.routing_table.rt_size_change, - event.info.routing_table.rt_size_new); - break; - case MESH_EVENT_NO_PARENT_FOUND: + routing_table->rt_size_change, + routing_table->rt_size_new); + } + break; + case MESH_EVENT_NO_PARENT_FOUND: { + mesh_event_no_parent_found_t *no_parent = (mesh_event_no_parent_found_t *)event_data; ESP_LOGI(MESH_TAG, "scan times:%d", - event.info.no_parent.scan_times); - /* TODO handler for the failure */ - break; - case MESH_EVENT_PARENT_CONNECTED: + no_parent->scan_times); + } + /* TODO handler for the failure */ + break; + case MESH_EVENT_PARENT_CONNECTED: { + mesh_event_connected_t *connected = (mesh_event_connected_t *)event_data; esp_mesh_get_id(&id); - mesh_layer = event.info.connected.self_layer; - memcpy(&mesh_parent_addr.addr, event.info.connected.connected.bssid, 6); + mesh_layer = connected->self_layer; + memcpy(&mesh_parent_addr.addr, connected->connected.bssid, 6); ESP_LOGI(MESH_TAG, "layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR"", last_layer, mesh_layer, MAC2STR(mesh_parent_addr.addr), @@ -218,59 +229,71 @@ void mesh_event_handler(mesh_event_t event) if (esp_mesh_is_root()) { tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA); } - break; - case MESH_EVENT_PARENT_DISCONNECTED: + } + break; + case MESH_EVENT_PARENT_DISCONNECTED: { + mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)event_data; ESP_LOGI(MESH_TAG, "reason:%d", - event.info.disconnected.reason); + disconnected->reason); mesh_disconnected_indicator(); mesh_layer = esp_mesh_get_layer(); - if (event.info.disconnected.reason == WIFI_REASON_ASSOC_TOOMANY) { + if (disconnected->reason == WIFI_REASON_ASSOC_TOOMANY) { esp_wifi_scan_stop(); scan_config.show_hidden = 1; scan_config.scan_type = WIFI_SCAN_TYPE_PASSIVE; ESP_ERROR_CHECK(esp_wifi_scan_start(&scan_config, 0)); } - break; - case MESH_EVENT_LAYER_CHANGE: - mesh_layer = event.info.layer_change.new_layer; + } + break; + case MESH_EVENT_LAYER_CHANGE: { + mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)event_data; + mesh_layer = layer_change->new_layer; ESP_LOGI(MESH_TAG, "layer:%d-->%d%s", last_layer, mesh_layer, esp_mesh_is_root() ? "" : (mesh_layer == 2) ? "" : ""); last_layer = mesh_layer; mesh_connected_indicator(mesh_layer); - break; - case MESH_EVENT_ROOT_ADDRESS: + } + break; + case MESH_EVENT_ROOT_ADDRESS: { + mesh_event_root_address_t *root_addr = (mesh_event_root_address_t *)event_data; ESP_LOGI(MESH_TAG, "root address:"MACSTR"", - MAC2STR(event.info.root_addr.addr)); - break; - case MESH_EVENT_ROOT_GOT_IP: - /* root starts to connect to server */ - ESP_LOGI(MESH_TAG, - "sta ip: " IPSTR ", mask: " IPSTR ", gw: " IPSTR, - IP2STR(&event.info.got_ip.ip_info.ip), - IP2STR(&event.info.got_ip.ip_info.netmask), - IP2STR(&event.info.got_ip.ip_info.gw)); - break; - case MESH_EVENT_ROOT_LOST_IP: - ESP_LOGI(MESH_TAG, ""); - break; - case MESH_EVENT_ROOT_FIXED: + MAC2STR(root_addr->addr)); + } + break; + case MESH_EVENT_TODS_STATE: { + mesh_event_toDS_state_t *toDs_state = (mesh_event_toDS_state_t *)event_data; + ESP_LOGI(MESH_TAG, "state:%d", *toDs_state); + } + break; + case MESH_EVENT_ROOT_FIXED: { + mesh_event_root_fixed_t *root_fixed = (mesh_event_root_fixed_t *)event_data; ESP_LOGI(MESH_TAG, "%s", - event.info.root_fixed.is_fixed ? "fixed" : "not fixed"); - break; - case MESH_EVENT_SCAN_DONE: + root_fixed->is_fixed ? "fixed" : "not fixed"); + } + break; + case MESH_EVENT_SCAN_DONE: { + mesh_event_scan_done_t *scan_done = (mesh_event_scan_done_t *)event_data; ESP_LOGI(MESH_TAG, "number:%d", - event.info.scan_done.number); - mesh_scan_done_handler(event.info.scan_done.number); - break; + scan_done->number); + mesh_scan_done_handler(scan_done->number); + } + break; default: - ESP_LOGI(MESH_TAG, "unknown id:%d", event.id); + ESP_LOGI(MESH_TAG, "unknown id:%d", event_id); break; } } +void ip_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data; + ESP_LOGI(MESH_TAG, "IP:%s", ip4addr_ntoa(&event->ip_info.ip)); +} + void app_main(void) { ESP_ERROR_CHECK(mesh_light_init()); @@ -283,28 +306,21 @@ void app_main(void) * */ ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP)); ESP_ERROR_CHECK(tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA)); -#if 0 - /* static ip settings */ - tcpip_adapter_ip_info_t sta_ip; - sta_ip.ip.addr = ipaddr_addr("192.168.1.102"); - sta_ip.gw.addr = ipaddr_addr("192.168.1.1"); - sta_ip.netmask.addr = ipaddr_addr("255.255.255.0"); - tcpip_adapter_set_ip_info(WIFI_IF_STA, &sta_ip); -#endif + /* event initialization */ + ESP_ERROR_CHECK(esp_event_loop_create_default()); /* wifi initialization */ - ESP_ERROR_CHECK(esp_event_loop_init(NULL, NULL)); wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&config)); + ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL)); ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_FLASH)); ESP_ERROR_CHECK(esp_wifi_start()); /* mesh initialization */ ESP_ERROR_CHECK(esp_mesh_init()); + ESP_ERROR_CHECK(esp_event_handler_register(MESH_EVENT, ESP_EVENT_ANY_ID, &mesh_event_handler, NULL)); /* mesh enable IE crypto */ mesh_cfg_t cfg = MESH_INIT_CONFIG_DEFAULT(); /* mesh ID */ memcpy((uint8_t *) &cfg.mesh_id, MESH_ID, 6); - /* mesh event callback */ - cfg.event_cb = &mesh_event_handler; /* router */ cfg.channel = CONFIG_MESH_CHANNEL; cfg.router.ssid_len = strlen(CONFIG_MESH_ROUTER_SSID); From 068a2dcb3248d99497a9ba7a1eecf26463bc0015 Mon Sep 17 00:00:00 2001 From: qiyuexia Date: Thu, 18 Apr 2019 22:38:43 +0800 Subject: [PATCH 2/2] mesh: update mesh events demonstration --- docs/_static/mesh-events-delivery.png | Bin 16574 -> 62433 bytes docs/en/api-reference/network/esp_mesh.rst | 20 ++++++++---------- .../mesh/manual_networking/main/mesh_main.c | 1 + 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/docs/_static/mesh-events-delivery.png b/docs/_static/mesh-events-delivery.png index 40341bb1dd687eb0775a371a0cde9bf29cc4b3ef..ceedadf829f30ab0f66ade7a30c71d3d4cf7a352 100644 GIT binary patch literal 62433 zcmeAS@N?(olHy`uVBq!ia0y~yVDV#MV07SMVqjp<%~{98z`($k|H*Y zfq{Xuz$3Dlfr0M`2s2LA=96Y%P+;(MaSW-L^X6`3f%MHmMr~eOwc? zrCVrgz!HzHM@;V&7zMO9=JPIS%=_}aASY&)lI1P8+jH&D*_~xMniRk&&cWbHBZR5&f|X@ZO0?L%Wpof=ag6Utz3HJM z)a&;6x+r-4=PW|?HHiHnJ!xnSgclFNjQ40?Xi%9OO_t#j##&`v9Wy3hl3v1Ie&%YnG z`l|Jp`ZqT=9=CqLZe(U=W@xx^+qQ3W-`6Z(z4~?FuCC*cx98o}n(DPQ=;c}S`+K%K zYE3P&klFw9Y<`d1;J)h5ge0*G+J#t!XT%4SooL%j&FF$@*Oh0W~_GU(e&a=-y zrRUE+{j}?-(qV%bJ@Mlodp|oZ4eC@m8KHCS!i5XhuYZ5H`~9biJ*Rf93|cwm{By}R z&FQB(nmAaP?B?$;)RpwT{9s|P_Unjgsgcu`Ws10NkC`*gL*?4FYtNoPPu>`@F+xYI z+xmUc#t5DF`+l!Gn-;7ga(nB|hpyYJS48LpiG*rRJy6)Bup=ffb<&a;z3E=61_lKS z`5&1q3^?)p^T8_J4X)|}92I-xSR6n7tXUbtqEzRXO3#j&6Dk6)t#N7cTC8d+PT zIGYS+`uzWv|Nq(7D*L}*E-!ZP4+{?uzqLWf+T8qk(axZiQ)2YiuUvU^bGrZ2iv<=k zoh}E?t9b5;(VKiyWunJ{i5@CN&(F(FOyXyIaqkum>mUPmQ>Z$+x&4-{{E;Bb z%vrNGMXlXk{yr}|`*PM+j;5ZT9vxlXg&Mzpy!;# zz>9BhZ*Pn^lVKvo!zSW-{o1v4vAdsrtWcWhVK)2e$BLwl6(uEGcJJQ3aiidtk3Vbv ze~tft^}>aQ$3IS;@=_4+P!Vc%O02Bhxpr;t|9^k2=IV)cH`Z;ssneveJ^#KM$DgB*a z+qZAs`u6sA{ykd`KP=c8)9J!=c*E1DPkq#q&1T=P`<)9azrIx17OY@i_Skch&(fey zm!z}1w>|rKBx$3M+2nJ}k|##24Ebfm#$~&IhYVkzu-ar#t*Ko{lV+dIGn#oNYio#> zXs1j6cl&CNU#AWg#w-n58KTve`0V-f%P&ou6m(ASy8EuNu`&Mtuj@rSW3;AvsZ8=w z+q`R+m5Ip_10F{Kv2IlXj)u&34;81&Ca!^N*REBXs3F$<_uKaUbLY!*#)%W4if;C-S!S(POM^5g zpKNhbG*~U%eKbZ-+%-^IebzhHc~d=9-p!402%K{GAxG<>q>VFt)XvYh_rF|{o}TXP z-0ZcKDfds^|KsxYJ&Q8J!^KZ;I+;>bRP-s`{kXt)&BOF6cZKIbu=j< z>G<2S**?qGt<&p2Zfs-o=i_mCX&$x->^4)q&YnL%->Q`Bu))?S-bE|lp4%Rym%cf2 z{q^eipY|sh%%V{b^5*XDa2>IB zr-i}G{Ww{e^rp}DPiEJ(OI@F(ZT6bV`Jmaqm~;zGK?gS7CdG*TrZ~ zKYjn-x9!zcRR<33+_`fnzuk|7tgNo{&*iO3R&1J;otnCI_3GF8|G(usrlq$f{`>d- z|GkF=F*^zlW^LWJef$5P^Z!>a3}E2oyjT6+_5<5IyV|OvqD|}8y_3HG!_D2Dy-DF` zO?X&*x^d-@drGn4M4NfPv2Jv+LHbt^IUTov;1zm6gHn{c@}aqYWg^q-{RlFaQ4S z+pSS+O?+pceI{$wuE0^n!7nzgV(-15KYz}gIWxsbZz|XKuVpKzaIJMyp47p@qA0?l z62vLqocVR3{efwbyF$8-J=z&FPb*+yfW=IYXT_H5uh%|wI`*)jq`X|Z_n7a=VnvRs z0B{xG=n$YaHDVg;?yzOcmrp+Vq*GY^*6rKb+1ZY#YwYe{zPx$MmM0}vn{TcOT6yJV ziH)4U(!>{Et1kGg4SRoUEB9f8-FM?We;nJS^CR1LX%N3{JO3x86<4#C26ZZQ1g$ig z=_A&i`aFGU(8`-PZ+aOu^l~%>XiYtP_H5YdP#rOI6BCx^gPon7;qkSiCLgNyu3o)b z#q-wNZ_AdciMURmHqAz^|6<0P_3QJqvY5p0vp7Ea{FC4Q&xN;T=g*u8Nn)PqleRS~ zIy#!OiJ{Tm*SGid(@#}tTzq`|(-IXSPaC=CMLShIo7VoH`mJc^ zp4F?pmtSsNuwv=bqmMuCxcknlt#JKy>3&d0;nuBNQc_X^EDJMdCC->OZJMlIdH-=^ zYins9wtjj0x(5ds1FG8>Y3z-&H#ax8v8j1`YwNOQ%T}$@VsSL!x%{%EonJmLGc$1Y zRTJOCn`{JFY|Fk&zq(*D*K287TH3nU{br`7H!t1!aOtA++qrL(HvaIImH%>R#oZ6Z zdb4@inx^aXp0ily=I(AOb8en(wT{^7V@v!6SZrBDT(yN+Z|0PhmR@~ZHr-3L`QQY< z<*|C=6&;IKw6(Fd9~R_lopkcaw9A@ln}24<|CZWufOY5515D2pC zgxg;Px)z!EhC4Mqd-iPW)~&|r=Tw9^yA~D5#79I#L`5la9Ln1s9va%%l6f)XO4inA zMV1pX85{-L5~HG{&(E{ny>FkLon72Y7Ot|lk1gVUHeGuCHEQj(=bzthunk=s=B+a6 z=g*%THySoNT)23#F>ywS*57;I_puA@cw4hihR=Oz(AO_t?o{ua>C<-jVNXv_NS}$B znN;twW5?VkdWi6~JN|3%P!Zy5=Wac;?0smH!jmG)6I&VjBzV}mk21|_e3E%FV@l$T zdGqAv`mx_?a4oO?{%-A_*zZMFb2o3^-0I}0Blg&0-?nXGl^$x71z8MjZDo7i99Jld zb(dPjhKGyqnDFC}IZKnm3&lJ6D<*rW*!}yFJpa75nDGDC>;EsmxMKRLB_GUez7%jY z9!S}`=kM3;yZ$mRFMfJz>gl@u|IeD=H<{`4VLDfnoRo&K6j$p3d&h^fa?D`m+wWb#Byz}XkQU7sowaHVnfAv<_%!|>Jmz3OD{QTUPFD6Y23fW;w6B(o% z=WTfP>ec)D|GyLdrCfH7(G!p9Xs+M3WlP20dz;hGSM7~ke?5Eq?eMTLr-cE|&dniO zx*}W`GfYIdcE;$bpU>a_?N;{H zt5*$fH7;mpyEZjaN379-;niM_R;LNhGtWQI-(``Pm&Ydkefyq;avUrUbA)-=1X%*L zrYcS3IBd{=eDk(#+dj7aovbLp;iDGp>wA{3w3K10SE|`;Q>otTujkI5efedH-TeMV zE9T9UGpIkhNoW4~@RcDCzL?iOk60Vl>$W-jy57zhz9z|ljb>7D8!{*Nx=))v zJ^%i`+HY?nc@A?l33R$-ZIwD~Fl(9PyY{(_yR06h8 z{hb&ocG#fTEjT!Mb1dgAcb`q{jsjmC_C1(AD{)4SnYE>5W$_EQ(B7TJ{?*aZuO~}N zehF0&>uxn$7`Ap-LEVEpJ5Q@k7Cip()vH&%-31C9yW|(NaG$t$``R_N$tNpp=7oSp zHrSdUzTJL*+UciLS-lm`Ms18>*h?c9?dF@$KC8gHHh=fi2<2#X+8V_>iTBI*@A-fBo=V#+;@T(`pyFxwrqfA)#dd~1N2$@wGgGz0 z=bTer8g%XY_VYP67xBoj*mCi;D~oi0fBSx#*HLC>=8qMR{Qo`ichI}C+}4DnY934T z!RYOIx_Ww_e*XFQuWqWBstDKXSFbW=u~kmEnpL_q!_z`$-u(IHJ7c2OicPt8^GdYQ z%$V3%S$TQ;%1=*Luisbo;)0^g@t-wz{l}R(`S%srEYLZ4Icmd_0F7O{cCCxsYh`J< z@?yrd>(?EN%r-`xd06nI$g=;qwpjN>4;QVeVVC$DM5`7rUc5BOQ*E;CqjwWOek|O6 zTUUVN+nbx0FI-628uk14@AUNat65u*KaPxx+jqWb&iCZRL`4CPFW+^d;-?8^Swwmj={(AM^d$+geOY^jyDw~^PWNBn1#MiEU@S&PiuiM(N z^JmU*urMvYxTEmu{iWX1#l*!OnK&bo8JZTTr!5aqpMLu1-+$5D^G-f}^lsf(`H;9Sez-qybBTS?;;9|4xT+B1FDtzX|f-*_gEhNPvvy}f}! zfZp`zs3!(GQZHZ#tN3*u->FUPrD&ai-@s#iPty{MiKR*{Ja`ocHz>`XQ1#iqf z^spdf7Te5C0xT!fHs@`xE-Wm(EGN1&NOP)J^T7lSkuDb{sa`b+9z8w1b7#-K-LRVd zut9;lvRr?=lj2MtHL>pU4n2*oE*GVwjXO5ArU`HODEntk(8^!GejPi0JUu;~ot>St zX~o*LQ$183h+4|{m6m>e^$OHkIM`(|`|L3T9|eIOm7kxTIMLy@m~r*jeIGWjU|9L^ z(#sMZF>kfWMl;Vm{@ByotGNIC$z@@yxm%lDlon>rI{Yx_=QjH-K`U8=7JI4)Z7Atg z@!WsE{_U-;0UBQ%I9n`a`1&4i-MUq-KRqdF(Z-E|>#t{<%&M^2w_``e?{9Bqo#y`f zRki-QwShsw^K-Hv1Up<71+5g}VM|X-n>KA)R(7`cQX!sF1&*quvR`ujZi~CSx%0OF zJ~46Mx_5WyRF}CqU3h%xc;QyJ&DH+L@7#IR+AY3nO=!_hnY85Q1=SmMcJJC1wX=ft zv+>7@J5P%&W%`ue`@Ver8oEr=;nbQ6o4TK$QUe^9Zrf%i)Y;S9%ge*lu;xgD7kkLV zH8C~bDng4dMnp%?_EB?;OJi|dbn(TZLx*0y(uxoW)e-AHsx<%n`jsnJu3Gh}!iJlh zTdH^2x^;PZd3jY;RstMPKL32{$C9I|$Z_cT=dK#{vMHU%xdc;e}&43k$ME5gFUIGQ?+ zKQ=ZtPEJnlbaB!VYi>9LX^8^YM97WI5Ak*~N^aopTO9WGH;U`218y0T$Z{bN3xzzI-`5JNx%{cduT# zbmHO12lqH%c(*?Ov$xv1#_s;sZ1d*zth#C3XX+RoziUlDz1)AkoP-3!f1RmbKWpYG za4f#~lr6^X+)cK5y317T~y7^?I#yJ6~?O(t_tn8+SPOiETKu=F)=$jm)i15C49@ z|NrXxy3$uyG!2Xwhpqno`!{zhljkI5W#y{9a$n9o|GdAT_t?9;yA63xrx@|IC+Fn! zC~$NwI+FD9;$ruMA)%=&k~Ypb{gjJ^>BG0M@bLdXj@#Q+e|z)j(WCo+@7_<82-BNh zymL<2YTJqr52Ew;F1?!NxQLshX@PpeZO}wXh0VOFqR$^5-YeG4dCc;{^xnfyPfg{T z>$iNu=@`A~2NPC==(Z?uxL!PV%#E*ov*Dzb3LH+$FW-FoZPqL)gX-YQX@1LJzkA2_ zREN>vFhkkqjIB`@E@f@q_xs&$t*NUfu|zJvENfqPC&8d%@4XZw&aRCwKz+R!4Ut!` zU*Eo6A0FkqGNi1mtnRt>ea=>=nLcgHGPg$Mnn<;Ye>^)Q@6Glg3)io| z|KrQAUsZPV?_azaSh+hZJ3GGaXX@6dvzykOOqp~tMQdu80>>m3;Z7H$nLbN{f>ws; zO+THoY2CVYZ?82dawM5Z?f>_6y)jR+(adc;?I}h#-`(B)|C9dzO{-UX>rG#*5fvQ# z`I5K($De;ntaw++tqjqce3B(=YTD+=?xRd$touKovtIDLw>Zpb=9;~G|F+xzQCuO$ z1?rN3vQ2h&_UqTL6_j^g%*e^eSh0S+I9IEJmYD?4f*+GEX0XUMJz8QTmtR?FIn$?U zm7USdGdX70uU>7uKK1m|yLazuP31ZgYhAxafW@(&>8_q_-~IRhzt{i&zB*k0|NH-c z&A0NF%It8LsZvrq_C9WB4X^9Qd-wjX-~aE|Ww~?4jmuuf=($f?5~8Kb!4&iBNzu*{ ztG$|sMNh=Ae>&DQXM=Ug=}kFWQ<+R9w`Vsm(r^@DYJ8xX#;`u5yS?(KT&&jAPrv`B zZLU1+WOdtf`DMHL{=cfNx2t$gTBNbz`qPQWf48IB&!x2VtMCujX(v+>^e-pdh&MU}gob`yFkiF(IP*%i z2fkb!P4gDz?&pft6Aw=N!Y12)-uc0FkuOV5qy}w1DbVe{=;DdXa;J?OQ*YMT?ccPi z=+m|l~&*Zq(k~m}P z)Tz76-yeJY@$Ib-6*hDI*z<(!D|Jp!QrWp-gMpRRt*cj4H{aZL`vl`%^$p7(Db6dM z|I+**-&c0|>%rd&@=tI6CUjuBV2a(H2M2jRe-{1XB=F_YO|vVUY|R|YUBVAvgslZw z6QsQ({#L9W$FAufDwndZ+{{s%>No9lYK65x&Qw1YA-R6`H%$!3KmV+;kP+ix@mjiR z(_JP7&!V!jZ`amFXJ==NbsxGS{-EdhL{{=F7k6cwWEf_+eJ3mcyFU zymrR$T@$*?*p|4v?5$PBhXmD5F@gT$;bCF->i_@Ux^*kJxZa+R$E2;_%zE(or%>mU zcKbhx-rlG8_Ak=V66@Z6`t5I)DWG|zz5Djw|@N zk~ZeNN?BaAbI$qa;o;#2zdh<*efQK;BiF#yt5?_9?O(Nu>#zY|`(c9~@F-NH1B0W$ z&X_#2+1XiHTGqEV-^|ewJDp<0)abA_?ELxj?M@40^wdGC1B#uUnH>c*y2Q9xr=Q-s zZCjXz$eq0JXU_O2Oy4_FNh?Ynk&xffF{rH5?*) zqPOQIN?f~te}AE?OoV&+-(RIuy;4o2cE;rCP49MFtgNj3`0?Z7;$n^_iQZ$|wrx{( z@4IsCT2qGlOdl&5zU{YlCwfRpN$JJzGBGz7??1jY=;b`y>I$2<(o$1LfuA+^UY1nt zjcZGExOm1vL1Cf?M^i*h%$};RuP$8*Qkp2h)#|o*x})V@4i}2s6KB-e&G%a_$a3*z$7o{Nuzaqu5m%S$mvZ- zlME-HT(f?Cc;AxCnfveC+uQHou|q?s)5^-KEbg-F3cdaSRC!mE>XLYfs)75fvT%wW?M}EIKBJr~UBXzkhXgb(1#kh|ux#@o8~dm|`T^ z>n8txHV%V{h-o1O*I{dG; zSoh7GZ*OjHj#is2%E6*E(L-;#_tHzxo~5n7&i(4c6fae|{^JH`e*Ln#!50!8?S1*n zix)4B9AWXj+|Dom?)`gqVXsb?MeEkR15F^z^?SZHdV5^m&s2jSpedi5_iDf2-L}na zs@GA2p0L%rB3$NqcQ{y>X8Ihv`|e#Hi=%~1pVPt(H*@CB zotse3+kSZE>ebmfIagkm+;-K`=<-q#nzbxFJ>CA#2j}UhQ@7u?wzkeSyS;t?-&_{Q zvJUTR%Kb>_pP3E|z44+4#+T@dAVPUIQt?F@m{N>A+Q>VIIlniH|mFjIvoDrcT)_>fP zM_NXP#gda@)-vWs2fgXuYLiWTn*}WUzy1Bq z&BsMM|J2o6&7C)QZmETg)>JPIk!{IcDC0AqxWz7~~Wc zeY&UhlB?Be@x>26|9B~0VL$q?AS*jNP~_?7pW*9bBBP_Z+Ydi}{8*!ltMw3Q8tcMB z=e29s@?ZZM?gd(HC3S{TiNoo#$zcPX({^tQ9nZ7#wI6=`(V;V4545VranaA^wt5^* z3(h92V0OIl_fm$5tgP(yb+Mm+)_^9L^F&B%Q z|9R0)7Dox5Hr-%_JNA=Lez}#s{_Xw!_EWuC>AxZ@zr_^1R*eo<$lGukP?q zQekd9@a9d9ijbp#iU5a-P^Z(v4_l72+R85p$}BB4ZA)}o7_j)_mFw3*Q=rWsGx>R& z6khNj2w-no@O$aym*3vrHa9YQ^s%C?y`8zS;b4MA!GngNl`aA-u7Nva_?DIHhgG!Iin#{Ny{HquqQyz# zmBV+{$)43Vdb1Xt$T1V((bv_RlyWWQlDu^pXz9bUWo}wiA6f7*%W*W#vyyn_a3Nd@ z6x?|Q1p*;EZ?d=sHYvP%^{VXsJ>I?o3z^kdcWu~E@bS^nwl=org8`Xm9)IMMx0~a& zG%Y>-|7ZLEmtU61+11QY=$JZn>gw?IRx*9lrimG_PVrHDpPrN8I>&2i(CVvv?ahZD zhJ=Q4vM|Z@m;e6uw)pwEr$v^#@5X6}yt}uz`rDhxNh(i^cE;$n7oJnw7?D#}_U+6} zY1Wxju{xzv-Ol^z;Q(W`#c$UOe|AddTmogvTVJ9o}(%9)wibu`Fsez&?1 zXk_EryBjwmO1J*)HIIA$;zsHFHd|01l&8%~;ERuQpvYl^nLcSIQm#sYPnG5=a7-xU zIV|^Sy@YGv#t5B>9ziRw{Q0xz{`>ozdYu*uaIj1bXg~eb%*@PcuHXLq_ixV)U;6_)%dZ_4M=4PM1T^KX2W-_3i!r@<+51F84Vt6zD!WJ5F$pct*2A zM}&^qOrPG~-jgXsWo2g5PrtptfB){?x1WD*bz0ahuCF!K%OKn3@|T6q?Z1Biet7k& zo6hNV>(-q+clPeyYVpIYzH4{Cdh>PLE~~9!+6O)^x3zk)^BX(sZjVVe9=S zAMf@3r+TG&dv~8q`E{t|((Q)@7HOMz?%QW4)oa8v*+XSp&f({uyN@P4{e1H7?rvviXO5;5DMqWW{`z)1A2gHNGfjbGZCG@C ze7@Oi^Sz6l7G`9E7G5QM?GDgbvu@qJ{q_G}y~^4dqbI_pHhJaBm7Z(E;`dY(W@c(m zKB>U5C~WoY*|R}w4b4nVZSU;<=%h8(YiG>6b91fB)tA>Cd~ki=zqQ}K@x8QtsLEn% zHPIs^d;9fUZy$d6b>qg{ixU@aHQnyFd~?*=g4cX3j{btXV#_Wvv-5qCePQ|U)Wl=Q z+yWl(SBZq!%~w8IvvJ492^?FNdRTnA{{Qv=jkjO@d$s_1*=H8(kWr$E`N^ob;23-}Y-n7k;0?LUJZI5?EtzE|>_hrKAr!7tkC{-ON#%c;ac1Lby@?abd1jtGRr2k-1MkRO zLo$T*?v9(!?2apoaJ4!;Ec1T?nmxLZwe{VFP6ve>A_}2*s^gRtuzRj;I_PCwmr`|Yg4GoOC`sr~)! zU$dGGo;7JN>!$IskZ zU-vV6zWxb=RJ;HD`xbCEtq;>KfB){q-Tmu}^PiVx=0;9is*#nL_wdh6?#q`y?~IXi zoEV{V?D@y1MLV4ot&5&COgO-sW~}(*?iyFEnV+g_7hc$PGpq8=LO->+KOg+PKTY!2 zhlzH*Zp_ZI998Q!>YU!Bv*O{7r;E9{xq~lXURdzt?DqR_-`x59#GRvds^-*F$Cjxr z^SQsHOjW9P%a$!3OE0zGi{Nk+_;O)h|NFT`JAEdlSk0a0q3ScUl4*T}j@ahNO)+}W zI>*}D>{qnRI4vsF`Q+v0=P`QzMlhqJUDAxZ6!VHm2X<| zN|$uwn*|y+Ha2BXPkr?;`PD4{Z{^lgO!JIvY<|5wKHuEzn&;DkR%sST>xG%S0yH>S znyU5X4=!8w`T6DW?%L9byu@YC3vRJ4RKJK7!ecWv+PpP%so3-vZh5f z&*S2Gd@|+JvT0?r63@l&P!Q`jmEygl#pZZH_*+ej)%WH^2_x@KI^7=)8XW>|GE6=% z&edvj>}Y|^^T&UBdo5-7hwmEW=O6II{ z&$(Zgs7>|hJfg&N_yBKI*P^bY_mA3ZbQSH4VLHyqc<^C?*6HxBqe%-LL^ZoKrw6h; zEeMdC?=N7HKf6d$=d{>LCD%X`U+z{XIr*^ImIcq<6a*})zvVbPJEx~FcTu_-VQMPD z6T8nwVcMzJuV$+htkn7v^7hpY-$_sG|JDD`Pj^4QE_Qc|lj50UY>pQue|gkmbu#7E zVt#u~(QeaitM>h~+xe(m^Z)VV?|5S6jU>L#-EDo#`qsgNAx2*>=G#y8Ix4%nJTx@a z_C@x`3Y+emk7Bt4q$ho_yKs5+>ec@9YBn!kymsr#zBa;A5R`F61I^&Y%tev^Y-lW{P_N$l}|p`i|=2%ZVexQ zuaBQq&`Oi`!xKAN&+7Wd##XGhlH% zzXr5U{L1qAb*~C6e$>>}*4Cz0S&DGQ?yGrvcJg}@^X+zb9i1k)s03+FE!t@_(c{P8 zy4`pA-mi2N_@c7cVj=s`?jiL zbyaJso9gt_j&3V={fcT1)Sv88Aaj0_<-`aTA#Tnlf$pP0GhLJfi+9fXdg0fhKaaj1 zoITOQM?t|QNw8~?Ygf_kyGNB=MOQ9%@6XsG)wO7v*mU>2-oDpBCxr>FMg~x+`s5H*XzyE%>5~FCHCA(%7;DwNX{my{T-uuyr=NBWWL@mJ|L!mI#)cO!Uq*edSiVd~zV=7w-MGsa zBEqBNql1H!4Wtfmne@6bhb<6fTC{xo>DOO(hwbI%E&W}!`&&t=SL&siD`#ehulMz} zeD(Tu-~Jkx>xbvgmCfq4nyt#d{*J_6+j&0A?p3{ZaSq<= zp%gVMepf}}gJZpky>7Zwy+U5ye|j`6a$A4~3-iI(&F1WEY_DIx{`IRmw@iA?H)hB4 z;?q(k+alxQ;-aGu7tT5V{QH+LN0K&%Xmu`H6QWi5;?pL9FA|-qmzGWY=5Ycve){5q z;*8Q?or#fRB4-$0-`gH-#j(%R!R@&I;!~CqY|~HIcFc2JMU*N;7H!Q0#S zdBYZbtgvZ5xFA5oLMBAv!Ro78n{W0!uCR+&I9ZdO9UOlC-n-hnHg^23fm@^YUV3$A z$>y0RCk=ciE)tsfVokE2f&!o18{2{%@$0V_?~vJi^30};ojod(S9+*~ah7(4Tr_+e zF(Y0|QqsO)L4N)JeRr$N4|^+dRQZL5ZCZLc({BF!^UqJloC}Io6*!o+>Vk2j0*jdU z)by*894rTx3Vlft;c87V@VLCiLBT+RCtB?{TfD*oCFA+$!?mU+eH7EaCtoYU)#|h` zz~)7<_fnx5EAJ`ZdI(-5zBFjB#6`XzIy`KLrQEe+BUTbw!T{PWcztJG&6u$_Do zG(_o`VkD^%GtWnD^UXB}6Dp2PX9blH^Utqew=yXE%F&>UPrqe+wUSZ4^Ul<6{`Tzf z+h@+y7|r}r`S7khbMZd`s(&7ZM+bb+j~@Krq8w4vE9do4mxN&;8&S^GDGLy?c1pv zqm~4%bWmW}uN|Yue*EWx1B(u3+_-;TTa3GuP4?`CkZGsVHZ4rh5bJ(k^fRcFE!d

ci!Y0>5EAy^;IGoI)uP~GHaj*d%Bu90i07oR)nA{SoGjJ* z?B0L>$tR!8wJuLfPfy-BBW$&8$%}yM>feuL+b+NS^XK#V-Me>xe|uYf@=3XjyyMS5 zTgvo({P?k^?zKn&N0Y|XQ@?)w3XiLNx{*Ee`^o@~A2s`&7B)Pt2o1gJ9RK|?XeA;W zJNwb1RhJAa%d09gQ?o7^+V5{sNaZ=~P*bBnd+)InGtp121r>K6 z&d?R@e)zTH_|uuQqdVM^lQyzAPGE9Xy_`8KQG~1YY?!aW|L@&v*6rIi>8GwpjJtq} zT>s>hW6!x?lI)PhszkL1r^HHITLstB#spw~@QcJLz=d)1bqL1SA_J!w!C;O{%AaJJPRQlqP~U$Gy6`dSSqdef#bu7}(qkP@n1J=jZqD^!`8IX0x~6 z2CW2bbeenh>eb@s=W2gEY&Y>0K5}h){+h7Y4-dEV%h~+c;xxC!%GSnaj^A=qsb0V3 z)i1iIC2icXZ(rTFH#Z+XeAw2;Hq)mp|IY*u6~Fm*Z@>S3{p!`PU%%$1tT48<{dDh z>$U}i6jq*$%w2sd#mM5^_S>t==UshRU?J4`;lxGf{5?N^Eqh#J7q2(H^N4k7;nGYi z2_CLir?2nB`x=jAXKmfJx;o!#rd9Q`LoEd{VUYl;DSUVXjscp_OOXJ+gbp z`dxs#cwP{(;7$q&to# zO+NW$%Oe>UN1@ImJBy#E7)9pi>+?LD@2DTOVzK#)SJJQ5)R)Dsmg|g|bNVSO)541> zTW;ol{@neU+gq($b7DvLQKeo#?R$mITwRMK+Fq92dNyqtyDXb);KB>PUIwR|WR;%Z zr`LS2LD-`GFyqeaTcUKGFK^ylY$GSu=@Pv1O4;8XG4HgQuh;Brh+4dE?PgAvmI$3^ zi8me{Qu2KExsuCKKyUi#r$xm-W6UO>efn9t_*ClVn<+*!&rT}(`93KBbjqe#Qm+p> zvx|vOUl+gIurNJn@kN{Lg?wELV)VjSUo9&s={TCSqg}M=-P5w&k3q$~f~SzoM6ac3 zn{Q^Acr7*RIsMe;_HP$Ojw+)oSz9A?=FOP#;@!J)y+K@scjkkI)c#Ct#Yo`KHst15b-Ui!O8m+yh09e|+}r zS@Q9|+?x!CH|VOb*(Y$=K*e*KmnvVo@>H+#ee1cxrZ3ds+Qyb^a}d0=N&BX(nXUF* zKVu%|Ywv4TZqL(R&K$(b!P4~h*}-?k3A69bXP4sfobkb*~uC z;?Z5}yFKq-nN_SspD~ZJ0OwP!)L7@Yr&d+hW5Zd9#9tiqOo`Gi`@A9$V%X?Q7bkP_=hk z`u%y2*Y8O&l3q0N#G5m7E+*XAo4(!Q1CQ^#1sY9{D~f~fe&6@qc5T@1!}6RgwW+;5 zJuZtc255-%9~Wd{%s$dDXX_=v(p4nMb}zC;fx}T?$*x_u5)3Tnp7T&SWN_x#|JUJR zVQFb;;4OIH+qg`8(>LFAQJUzXa_Qxk0F5c9pK49@(h&=nx@7LS<>UA^6OsLaEX<~)VxyK*BRP7C0z4yFot`TT$!}~jJDxLx^oGeYg z%b6c(7tA^R)QD&D`RA8kmS~8adRipW7O5llL9Jl|{}J7tG3z39gjfQ#re1pa<<>2! z)0>ngp2#sfonll_IO%NK!KkFJMMg7yOr%&}=Q(`*?xXhjYn7vV*y>QFi8GadE(9pLVVplaSTH&;i;hOl7q>Z}m6VE^AZe?meoG76-`|Pf}c}s&bH%1&u z`Z&Er@zYFJ>4=nCoy7OYjJlUP5R)&VTtGB*=`AVd2 zrr;6}6(cDgv+AwoXUpH+Nu7MuMZhK1Q`PtK!T=2ko~K1WS81J|cJsVL;DWDT3#{gv z&E%00k7p;H6WD>I*-dHFeMqs#j1%BJ-f z>WhmXpPZck=g;%^{(e?hmYIH$Iqiri&Bkd-p#9jyY>3FcXzpOwKy&GxBpv`m!~Jfb8GjT zaW7xL4qh2D^(8zrM*R}0(*V`s@i|gIlQRuuh zXz!m-r|;gqD=q))&F1rY_xIJlxUkT+`kMq#TY^Ew(^FF?PMlZ)+WvQ7!|d6!ckkMD zV4i%}qNalnW*VnId-m+x`}^-pte!u6#?|U%HTPN3&bM#hs{7BgsraDKq_Es??ysl% z^*eX$;J9~K+B~o3`|kU1U%%d6_xIP2A3r{QDq0wj5IODeLjjhHSFdiZ|NpPAukZMd z%}XP6*qRR>JP2CId-UUVLd^Hj3{`1zXTgO&xlzwiGq>Rj)w{K(PTEgvw25zh>~1p?6Ber@20m-Ujwfx@mpOCg%9X9z*PlIq zKKW!ys?~|S?fd_JyKOd`mnS(RgQLc$Zhw7crKJEz#M*27_U+5BeH|UO_FLgzU1?kY zg?=kt+?6&qo^F=vO}^}WEz3K1t*lSmsg$6lL4qIHWAwhSR*y52_>v$y%SSC)LQT%U z%u99mt*92KgVW7Jcn*tjxyIMO-+FMi_PMLv&-L~7Ewxvl@G8-i;Ltsz@1-*7Z|&Zx zzvkJHmw1+rREQyWdu8>#ChwcW&HSm{|Am z&(H3()e{vyu+Lr4qVQtnkFS3^H9RXj+p$fCqe;PGZCJF9Sf`5+51Y7{ z*sk5XwHNwX$oMV4tiSimr6*6GEDK17tVVhK_%T=OqNPh&j~7l-dHnImix(@vTgrQT zdoN~`BqcpM)+;U4$+AUr`st4qHDzUDTP%y7cq~2aps?U##+RzS4hkopfByXW^Xk>B zk0xzgyLRo$m7Xg@-qnbyc)BS~)RkA_a8eK`*cmfxS@Omkmo5bb2M4QOIr+3muK)SF zySx3Cf8KgMPMCw`W5u5{GmVXnjc?{`+qqNn_{SQ%_uqdnU%veC!wq4p*REdu_+!P+ zn7q8acc-RmA598e7;xq4RY8`AWxHebu0MFNAa4EksI_X7J(pj;diCnr^XI))g!abq z2kEa_yLPTssn-1St3$Nr`n4xUSk0X`bEc%Ubh5;=%AHfUR+$PaJA+BdwEI8lPN}C zOM{jMMe0nev6Js~dG_oXXnU*L>z6MDyN|vssVXQa$jCVH{PWf=TRc>RCTMC+^l(v{ z_|~ZHdC|_PQ~%H3Yt7sDcpsnZ{mYjxU*7!ww_S5>d`ByTc)?`Pz)7mX_mWN)zUi71 z{_~N_`KhbISH8YeZhvQ2sJZ9QeIYw170KN0OpWex@m!)YQOI-RgEm=(4%r!uY@7Mh z?r(qhec@6=9wq_L#ukrx_r*Og-`>wIaC7Y$(@)?K!{ zHYKG+p<}Uo|0Tgq*I&y@Noo1-j?@vG>!&W(EgzS6@v-150|_28Y4<=Ak*+<}zifGK z|0tEIeb(WmxA?hgq|UT^3u2>Uy3~clW_vCTT%>X8;m3*^x#_2uYIrTbd?hTr$g-ZJ z)PU!40f)@-)A1&Ae|i2t-P}9#^y6=`b`!kP_sIQ!>izfn`nyjAawe&~j65Bpb^3AP zs#Uqi=i8=jth0KkB=BL0(aBe<)P*`(nHu;1IDLIhn73_k$3)znQt z-J2-kxWTYz>d7U=H+7~TzPY_V-$3Bci^Zo~YXX;FF0j~f{4qb9v(v&2+qbV?w#;av z&*qyJo{MzEx(_C7D2UOT{{HRTPe1=Mo3lTE_RK`ew8e_S#!Z5Ut?#kg+0%$xm;j3zu!e^Y0%2WiY|S4pdF#)$sSHvP`uX?YZ1enopY8vD?v*wV5HX$UGj{#>p!Unt=tj;T3`M5%X0hDoiUFeKen~CeVV8u#Mz_(+AAsDd(20z`17-~^?$F| z&z&6x;AX})vSpgDQ2@*uUh3d-)`@=ZPQLaEs#k! zkk}aU=GNBiyzS9CV&>-N-b*iS+_=&FUWK#L#4lgJ*1oU4KiNa&VZo1QXJ`Na_x^v~ z(^FG#-HNiCpKl^1$l|#)C~p1qeFxXqeO;|IF(WJMRWrZc576dWGqbSpaP{e@`(-Q_ z1+9E{XXoOu)%~*8-!6IUi*_Gf9lpNq&&T8K{PO>Ckci(>Vz>(~E0eevSO zmoHz&=xzVouQS!Fx3{;_X5Q}2T!$YPCG}J9K5OL`=V5c+xhhU;s+6p3?aQUp_x=02K0G}9_~VZY7cQ*-wY+}ToHTPZwRfeb~Tf z_0@e}wu;}n9qsORENt$&fC60^zRNSat>!MR)i{&FY9_y3>FI{a|PtXWe}rc^brOaC9Y_~MS7__!JI2@fk4Mm+iSqt~}r zf_wFfZEJrzH#!uQnyO7cx&PDD#c$v0PUGU9efXq!_u93*B2F`P)XWaL3A8BOsQ$L) z>E_7J3FniNUVB?IGVJ^FV$arJzka>1`@TDV+ao2027Ug80XHsQG&D0aGd6bi=QxtI z@#Dvj9x6&xy{=|`{pI@bXN{c<-}y6V)~sE-_t&e{XV0Fkv73J|!DH#Awzf9$xQfJt zga$i*yZOsEZ#J6gV>EM$hl-Ba>7E@ezd#nBDTDe}&73N@xjg9@H6I@@v|7OlIXW3t? zU%!33cI8Sz4i=5BsI}M5o%3rxcp$;xMe5)3{^bE0Pl_yesidh*UU=W(^(sGqHD|)vwCU5QU%z(kUEQ6f(;3$CH~y%ptFGSdqn4eKvEZ?Q+GI@;u9r*~ zX8NSnrns&@vvT$7%{Oy$%%YVh&HxRCJ@{DhqGp?iO49b*&!0WpwR<;c{`yjIP>o&v z{e88?#l@#jpN^h-$!}>;b93|2q{8#_Y8T&+$DB0p;Xd00sGA1|DvD%KgQ)p{`H!mEETo@8z9I(u(%*h-_9JO>q7 zm>L~49(?{OF*!4KTg#!ug#jzBX8NWzgI0HhM9pchoS} zD@^n`@$}QGQ(dcGajA8?K3`b&_N|M6%fgTg-IX(ZmiegVX6A}^}YUQfl(ctFKCmt}J78mW;i6HfiIQ?c4KrHJ?lg(h%`c z3)T^P{k5vq>EZX^>gwv*ptV}PZj1evU(PXme{*v?XuE*3d*SKRr<usBnW7`s9Vc4+y<$hqx}cRNv(MJ;|9@ttv9`9h z)>JRh&cvW!uYcW1@{ZBlzHVLKWwAvI173W3dirT!)|Uz2-rYT&U=ScOch)Sg`n04Z zC85p>chyc?Z;sIEb#uPn>ma~#yl`Vgj)~Ocj~24?SeY7^E?w%haKZK0($dl|qlz`U zv_!hPy1G`aTIGA0gS*v9X(9((^Gu&(ufN9aE?aBkI{Ea|u&}T{b^lMD>N@=J!po8q z>Ha5*cE+r(J&^w9_op2#RxZWGk8R(bN!s|O>hImDRwY(z{kH!s&oY|rlXltmUCn-u zrn^_JG?YGb)vL3&zfj~@ zRC`{n-bbRRjeXuuCWbd+J7ezMz3aQ*=Jwl-3=I3ORM^Zrn6RVf=cik@X5D@(*69L1 zuH#aIfr*JpPKE#cvuWXBVUtd#C{5f^_V!j=1%so&_SCal=JfL?PITPO zlb4p(7V8cT4dvzKEiEnO<>i&`;_Yxz+8ML2&X&zlz(($UarVSS3AL$S@f8nS-`D^D zJ->Rn(abZTwS4Pt-n?037q276+~}Y*aYNMF>hJHK7FbO5IP$cp_3*>f)AjZB^w!y% z&GfnSQulQ-^RCtBe=W21QJWmsx#g`{0=k{B@dM5!FSJ&3NdGqJYDY1~r&dz>VU?IYF z_Uu{K=7YRH)4ohU8M(cQ`FP>lu-7GZQD@WyI4tJ+$$`o`vptOA8X{qszB@Mr%k1LeSLjj%XepP z-MTev>#Y={lTV9QhWy%I|9ku6$B&;rfAjhI`TgJTRp;jBw)4x^eLN~I|1egGqp8DX z(Y}5AzTdCE|Ni@QucbF{-fV1SlsPWS#Tr}H*H@on6d4*C>g#*J1U&ja@I??trsyjRfDyrzFr@#HFehP*|}!3Po`9v zJif``B+I~1@#lfXKJEH+1_n86jjl_a`bINza&mlDU%iyr@1hjAGDKP{eq)4=l_U4@ zkH3CZtqqIrD|?}5HPfd}Pvt;@0aq(i|8dY-*w&p*?qO^e>1=j-R^=kMR&3p#XUrjJ^$oAY_a3wIlL#N_4XzHOVg(?Lod!Xsy zgCj?d9PJk08I$Mh+v~S{v9zc5)KdW(Cf3%~`_)Cdk7`ZTntj%7@kJMWK)m;2A(SNOQ? zV1fWwYtYIs?`9_QwI^?lx|vh9FyKOl$=kPYt>*Tf+qp>Ej;+~I=J?B1XZ@BJmzHkb zxUum6zrSDX;?{rv^Yiobb90NW=6({kw*Y@`I z@~|n-^}GG{8|b)_=H}+@`Jf%%)+^Zl@1};wWoBeND6kN5743Fi z7~nDK$=)sLvHfvDuHPBHR@kI%o_RLyvahT2!U?CJM(y`m(R2K<=2R~$tuPId>hJGD zwWfYq`Z8a6qQ`~8ugd>w7u>xc4hkGlT2Y(a=@%|7FE1}Got>3+YfF*x?6YPPJSEaI z&F|L~CnYt-ZRk_*Fp#Kuy>@%u@7wp|c9m#OK6&Q+`T5r6@9h77w$H!6FZN!$%E=O| zSPc;a9$~K5`MX*ECmKlgMy=hpe}8>uX6Nz8TeobP^8QNN=B?Ye3$qkHKGwVaUX}Jl z4+RdV@brCke}BDRzyIIA-|wwu`q+19#OC)dS`naOVrBKKJO0n3W`4T`t9L1KI891X zo6OmMxYNaHX^`!edvZ5($`TV3OG`~Bdfa)xW|oW6#;CPduU>6*cyMW{_m}UJ&p*GL z_x;o&zlb_%s;O$ z)~z@F^|iIpSzBlMRZl*dQnb@Xge!J$mFZl+&p&HKT%8wQ0H3wDcFme6A1mVb^t-MM z@lp{o&%1L&?YpPm^!NAo@3(PI-5QmhmDSeP763X9uY^6cN_el=^0jNvJ}rvfQPAjj z%vnH1sFR16cWIF3=9_|+Fx5vrX+2? z`Ld*{veHtld*<1+%{TuX5O$Z=5a~K~%4@ElI1iiszaNi}9(6UFJ@@p}7b#8?J*J#Z zyZ&AJZ;VCX>Z`8~xAXh^`Ni$6nz~41rjOgCCC48ZTFBJc)n8sz%mFG0laKd_a<#sE z`I6uMPeEQ@-@I+RYJY#baz(^ZKxrb!@sGdfrrr`1cm)be2AjYD5mgQ+rHL25&V4yg zIA~?a`s>rZRJTUmy>caF-F*)M7TfayeCoGu-QsFJbm`Kiv$M_f@9sMK{PX6UId=2Y zjb_IGJQdz2XM5^lft0kgA&<1IEU33CCH3fIg^$|i5Ur&_EBEc&$IQ-GU@<2~&s~6J zuT9$FMG8#{KWglzpT4_nAy?ny9JASZnO1go`>y8k^76huy(MDpwP(+s-T(Wp{EJMh zi;|}JZzYaH2?jFub${;cEN*UYE`N9DVbM;DzRL@vva?^G*5AJ-M9X+4&t3m#@7PO3 zTz}Ts%|EZs(RA+S;{pp&QPJ>qF*}Q%o;q{pO#J_^@$z;xpnbiI7cYLl=QH2lJFRig zQVb-js;k$AyWFo} z3sj!!wR-jH^z`)8toL8cH=2GrcD}3I|D+45&t7PE9ewnCUbWs-uep}RX=P>8PCvc0 zaF*Zl)vH&3{#jF!AI5X|8h@ycnEn4hpFdXAR961HwA5Ro?c#lZz3GoX|2%L1-{$TD zPDcT=*}nfbIkK98qw0e~iczG$|M~m>|K7iT^=hVxl+~FFFH6?%{T5{-_xxjp)!cP| z*6hr`Z@25AXKiim&ky(R#Z5lBWzU{BC04a|^IeoKzW!Qr+_Tlm@wmF%;*ZDe|9yP* zYSrbJB^ELzlS>v~%-9(5;Y-m zRiI+azT|~~EZdf?TQx;CWZeV^yfn>VkslXF)H^W9^-$3GTW z);<2SOjvi|@3yZ86*zS^e&zP@Mg+V(J1R5Ud{`2Y9%|NgU4Kf~+4hI=h73OA}{ ztdNv&*o?E^OUtB6aqz zqPvL{FALM^)vI;Hyp<+qY>jGk2$-jE>iOp{!SCDTYmH_uNoJ5aZtnAAifH%I95d8FlHY|EHfd8X}9Lzi)_Gvpf1`%I2F9I?q7!o)%q;O5R`Obqv%IJDs-K zXlBk|-OJq75jtXy0Xa+it$T0LO=)HB-HoUd@Ws30oMz(drbVH=S=?(#8m@xnf+c zIcB?Sin+;%?$)|kvcm2&2WLdcRgq(uSvBH|mi?~xko2ClO`_FwnWvnjUwk7l9 zmfhvc-0SwoR+;U6@jNb8Z~FbatJ{wzt&Q*7`f{cu&#|zz+&g0Of`c#LmCvhp`nBk` z$eX$pK|jfm1W3Dx!KP8+3L`kzlh547Q@SHYk2&#)k>w;6`KJvG3j|vJtxYzXS-$-* z6WHtraXFH&JeCHr9r8FbIfc_n_CrRX$HIUG8eGRe7FEZB)iAs}J?;F&tgW*Srnn_t zOj`LxgPn!JbK=VqDMx{c9!FA)%BwBF3Lk82$=&LxH1P@d%?ceyrxna{3v2Y|_oy4H zxe2iJJ>G3A!@$7sVB?hY&ksK|@SLWy5 z!51CLu&P9|-P&=Bc5nq(q1 zcRuKx;ExqGiHVBy_1}DZ!SF*_;+P0mD_5)2(jd>JK|5pgCVCj~ByWt6XnT7l>#eTy z+;iv78Km{lcm}(QQ^7O(v$Mu1XIZ8xzH5vo7ST zxZ$-lNI~Gk&%ZBA&LwR;w1$s?fnmem9MCCW=jK|Qo7zT)UjA~Xusd%3 z8c8m{T>12r=z9AVA=%MU zx7UWvj?ugQwvh3I0(j^^h=WCIYSe1u1w2QdMiuH<=ik|J@y3k=v)S@*w%k6;zVhm; zTeqTQ)R`K$E>*1t9ijQ^pdRyqZ(KiXEF^Xny_9lYbpPkM@(``7dHoy=3=BU$Ez-~u z;OOb^-~audWNXy-Put@%?{8**B=dnKVWYuRufk71#lL-fmtJg{e!spxqrzhPY1;^i zPnIk5i+28LxBs)yL!ZHi^GV1{-f9&2}_0;R@q`QS5A04f*`NyFC zb520};fE&X=GU*Aa#So@c<`ci`Lg7V5+%17ty>qZh*7gPwX`iwR}<y4nQp&5 z*Khgz?<%*~UUdZRyW?xWeEG7n0LQZL)N^Ut<6 zWsBSIn&Yvg*R9y!pFczyRHAHioV4Wp^ZM_1jhQB{*t^(!X@CI#!s9j!@oY?u4;~zJ z)_eZx=)u{=#l=jG4X2;pyDs@oGe(eurL?rv{>MRnH@Eis|G#dBhEChIZQ8C~QEVdL z8TeNPfHn;E@%8uj-U-vXTK)aomhJCJz7I#)9vYEVrlz}9{s#_%}l1< zg55mOq#3prz~-UW>Q_z+Pi)P;ZYk4uFk#2~;guJnZoKDTvv#fPV$O*kw{G0H za_7#U16xfQ7#JFsA3xPqTzFDXr1Pp&Z_K(IZyz#zxG?j~vk04S$6oJWwW2^ph_lh5 z;QjG?*+Np2PfqbrsjaQOdiAP&-H(S;wZp~4o@HmP%F5Ex)>>mVH%e{#XV*pSQuY;5 zKmOYNo^<%}C*Qj>XU>}S^z+YlKG|Qlw(oaa?(**23y{sn54?Hv=h33YrT)vq*fsAz zSh*l*WlmVO&BPC&6ZF0>Y_T$tIUcHYb@O?<+js8l+4ZVq_uabv?-%#4JCbyxnL&gPqM zYWbvXVvm3Z4T3bDq-{Q$wtB+pr#TUxoD2*McV>gfLzN~Ln9aVJwe|bgJn4qxQnSx) zyOop8_UZax36zun#6ep`Jg{srkSHRv}dZItLfI>Se8{`vF;0ZigHt}}dmbfyK0h;mfC zf9(Js_hMj>V{Ua)l;Ja$@M(1DFnS=!2U51oK|@JXMTYPG^~MkXK@Mg(klf&x;2gNj zK_P9y2M+dmN*Y~7tV~>qN0Ltdw*H{V3o1((7~UvMQsHi80ySR^JmQ%j#5q8QPd-#A zcuqR#5Fp~JaERA8RQnR^Ot%p4KkWpvNOhSxv^OH&bxX0@9%F`X7(3So2)tgbgR=s50y<(YuTC| zmj=E4wg4Q$2PVJS=PYY=sL*Qe>C>kVCKw3y9b43yV>aDGCHUl*!xBmrOa=jNCUXwm zw3vN%o4&4hYSPY_JOj{P;;6Ov-d+TibPNsZ7yg2eX`bq(tFJ%bw))%O@8^Hk*tLcv zo7`Ywn&_B*>B=j)OBx3suM5#)J-jc%M(T?z8yg!lqrRu8|Gb)SM>>U*HqJPjvzgUOe7Zd&kEC%&(n z4)h%~5Q|q>wPwv}@z2@i*Vx$HBzW39R1Ou&xGvnU3)WpxaJ$t?#MO22MbLokZmBCP z&t47nbz1mjVlR)4Drm}G_^K!`)4UgJjrX5>Uc7bdR->6cXVcz)y8zaHAUS8Z`16Yy zC545VHGj<7K1M}XTgd!VmKLkHwSm(~EjVOW_T|nu?ecXJT&-o*E?`X$K5o0a=G>`M zr(V3!2tD*9sMm|tw)lYak(8vGeH)hT%FHW#bZhHtUtiy#l~WYvt@!j*#nWx^#R{8w zK5B-b4XV*=y}H~M*X`dQp|j~`&cXl2C|-$!1p68y_~uD;)&1cMe(au?!ijjz}Pb_ajP?tt{HtXEP0zy3PqH~HYV6KpK=qIAUK!mn?7 z6*+HD*}aDm*It%L^`>oS-#XcA>7`GfKAkz!bNJzdj}>dzu8nTB(wqMJ(o*l0Azo^e zuU@%gVrKR(XN5EW;kRY;tx8|jInPbnXklcuX~&KkUQ4&Fn%bTi5gHmA8+%u;%}T{{ znwP5Do3zo?5xn*?4Q*CnI_UfxItCqc&=3)&w!qndpvucB+_H?ngR&&3d zRWfPCvJ1?b^_=uuTyy>2hY_ zw=ZAbd@Cpu@|@J^atM5?afi#ITeogaohrIC=;XtKQ@^KpEp<>x*nazMS+$OsFjwov zj4c5gZyp$ckBX?WU zKmIAeK!T@hQPRd6fByVAJKLOJ&Sr<*6-}}3?fLiPVq%tvf97Cm+I`-kw$1MLGR~;) zo6i4zw{sroETOITzb^J$SzB+vzq#gF_05w0?QZ$1o|FEa=dBI`-T3gP?Dvfu5hhYg z{Uh#0*}dBLP8{T({>8e^vfFRRYD{oyoYH9||Fq#iaNpsF9x6grcmL$|KVA5sXlK;g zu!R8yJMUb)c=6h`YhNp?jwThBm6^@;+rD+{+4JY`*H-9F?>_$c^XJbC16D-nyehHU z8@K-Q%XjzE6B842bJqrFaIi2zjAJB^{4Sti;8|!KcKAhK9Z_e&V$>2y~`NkdBzQf`E^&Z>7z=6eCRm zjvlvU%gDY(D;yLAxLP&3xY(NYrgxuB^HvdRQt(YwRYU6yaj!IXrK}^mh_%oi2-> zJxl9a1in7t%dfRdgHFCI2@=_weqL_>{rz>qo|EeK-+x$e=Iq(E>(;p~zL>O8WAe!! zx8%~&(%js&E=mhmuh!Mo_4V_+^jn0BRR**_`)*!-R#uSK)ThE?T&)u)3husZ2Rt7;%r^9Zf0iYr9q%==b#IS<}W*>Cd4`ayt$E)()82)a<*Lx z9tr{xF)=Zbk%d-sSFc_Tx|yYE%4HIS`&;`!(2=U57JwffDmDE#x|W6_GopMUDb?)q}h`u&z| z+vIGkrl_2}dGqG{|9_ryb93*E>5F^v`18+c)2Gj`{dRMDeBI3i0|N=3{^P~}{`|an z@#5C4rXsE{y{C9BojFrdZ@RUS(Wl4q|97lfb?WukzP`S5=g(g*wpbaGRaY0cFrdO_ zUj3ir^*$;>C0jZbJhY~IsZCzL@7F8i^ES*2&xyMPhO7+vrDOh~AJio?crpJv^ZuO* zo|9BOyB1w*a%?$xA;aVg=l%y9PHS{2d8=|czF1ZJlz*b`CH?FCJ&QD~42!hC^uB)= zzwD{}8R2iAI2ahVZI4}{{6wq8$*{%hfnc(M1dE@6fScOnhXoe?aVwm!C#i8P3edQ- zuQpn5dU$B4BFCeT6~~Sr?>@T7YpKyp9~r*oGOwN#?Q~Em`1$E+fX0`r>+7~|-WZQvAn1~*RS1a z;ktF}=FOYe*2c!-C?+oc`}c2lHnulqyYIihziO9M@4T|zMNdyH^Im1ZlbxNtSl*47 z%~?fgXX)#(@NjWkOXvHU_4W4CPhZV2DRD5euy|2m(I;zt?ZO3z^e?*l`usdRJ-xlL z`)X#+t8f%(QSqF9y7h5Ie0+R%_G+hvpc_5@{@tE;S4vK<%t9s&bhCy1_dCTieU9aA zm$$9jvVOh)^2?Pr^Bz8YSYq|JS^m$0g$ojIs#z8xmEZq3=W_tXMwfp^Fn!7hP%s=U(D<=K7jG2L99$U1X%d*Rvla>_B;mvP2 zpnS|hpyyEXG#*2&4qT2ohT+H~plSGH!yjS*|Y zR!d8Rj`dp@@Ze*`(x8(WCexOefZAV=&z?P7TU%T5A$e<*s?fVy~u-0sIU<0e)_p`Wk}ZMn>=jHU5muJTlIvuZ`$u-DFG(?g%-nejJZH?Xin|GC`dI@*79Dls8^08F= z;kBz)r5SAF3H(#{|H_lM+2QNGQjPA3#jcw4a!1tSn@8=>UTZoieSN*?$wh99O=s(J zFfHU`c#!#V$zFZ-2Zf3gJ=TQ1e)a0rr%y(IJrx9I%$bvunYr<%nc3T~6*kw`#df>rrcW z|L$y#rVqdWhOGwOk!ND!n?PXU?3tv!ihF&YhBu0&LBS6FsuBvro%528b-ZJymO}7hChj z%)~slW=H+EAAbKe&%YGJmNTcOS+yFj2S{qur(QAd*$CwhoJ@zvUFJL>5{sx|nf$p6%SZcS}oo(>7NgZ~Hg1LTTFhr!N|g zy#HSN*7pj>nxA^cWm#OrjYAbW~{yDYc9x=XfUJflf4U z!l_ie-D+i_&H&K*-qO<2u+^oBpj&U;)F%7-_?$U+?$YcnQMz-J+{Gn+ zwAcS&-x?Kb=f5#xPvz&dg#il|ulG%#`Qk<2>8E+dQEHQK-nu2l*B%}o{H zzu&9&*Adg6>a{nn{=}ZYQ0VN7uAcGZe82`{=l-?Gkm5Tf9!lqf`P%N3LG|5yi$vc zKeuv=Gc`6Ge&`^eBET_0Wo6jvr$v=^^W*mygZjCbOKf-Xy57E#V`j^pviYU~&uZ{| zw}|V_x8Evk_HEiU>HPEO&z~<}zWnk_lfC<%cJt2zO|Rd1_UzgDx1f+YlUD5P+o3iqK(dOgLN~ z)b{wtx2uaJdD^1ZzI*Ya({URA8Z?V4aC%@ zd1z^Ay}u{I!&Y?j&s1;m^z`&IVynHDx`8rT+UCgR#i}A)X+e@Kjs{}grytMo5u54L z_qf7rHZL1<+3!cMRvFLqVQXfTIqtR8DKwO~N#SC~k-Y8dk2c1bxyQ4nZ)SB`cr|OP z#}baFnzA30jwXd_{96(G{?MTqrHKNaE?+#Zeg0kR_x#kUPem46jvbm2zCJEYV+vPm z(9)oMW8=j^E6w+Q{2CTM_hG?~5Up8f#a4!FtGoPZld@1}f<&5u#E~S9IdA*5OD}nx0%i2V*9By3wX%9!oSB)J zm1Q)s<9E%ypF3|x7gd&)u66pD$|KImkZ{~_1@nP-3xrox*vz~BdT-TNttJJ(<-tl5 zJB}vlP2c@+(|=++U&o}iq89juHswaqV)3hYwLms4fo&2$HeTZ z{r&C9lP4!moM`11cUl-=H^2Vf&gXJZbCoz2g=kq@S)H3_`?|p5g%{7qia#eNDnDhj z<6(1NeDTWFt8*<1lMeTYc}|jOyU5BjZQ3-s3LX*H(2$TDIol$1w(Z$tV`*t=Yinz4 zY;0m;Vs8HYV}-(%${V|ORWaH9umAgRyRve#)!uo021YY`u0O7Pzjr$udtPO1T$dAz z(>}NLKfi7Nzh!my`Vg(&qe;!p%=`a5-LH4#QgXFPMyl?S|r1Fe0}}j z_uQK|FWhR%lBmF;I`O2|s#X8K`0u}eP0cOPM5>pM@7}MY`v0EpzW?`NBXc`Plg4o^ z`PwfJ4;_lh%{@F(`S_Dh_EqoZ&zvbGDYvWg?X3In3wO@hSl>}vQu6+Gxx>nk+Jh=v z7A`zEapJ-hqo1d=@81=8_2ql~%o!5TKmUyXee1N+#2JfLY}|O!TikwE<=d#8=N|ss zx9_lfpRDbw0|q+aga3`w?|G^Sowxn|XsNe&TRWT0>Ulz*SzB(+tKF;azfVEL%s`^Y zd%9iK^SS>&{j~jAqqk*SS$fu^t=InvImt2{2xfAUWhmpFe9}a!w`_N9L4kmyfXs1g zYwMTd8>Kl~ohF}rQnd30Czs6e(SJ?%%#`ZDHY&zHjPvR$DKw)C+c8rW}9lsDH8DT}NznNY>JzsXj}b778>etPIIYs(Dks{=a%>z}C{< z^S0kj*_tZ$yn8q?TE6B(oQ~MfXXg8rg*v6AXYc>}_Witn>&-9E42i!lxHQPs|7FaM zf_KMyU(5BcUc5Sb@x_NaVJcE(Ypv3kEk8f6(p;=t&aP%lfQHKh_pVXPcpfkM`-)kCm0})|*fD zy7=_^%TF2So=$bqxp#GIxX!eyz4KmQ|D7MVU#!>7-{$)q7p27-m!5w{oEX-3^z&o%Lcm6L9F}o<;&gO-8ORmi!X+RhMs)- z$!VcOxLo(~$2(*4mb3W>h8WG%(Kor(a5CkQg`aqhFjuP>XhoaF+;jc*|12h-ypX(D z{D#5IGpA0SdiwO~%$btA-fg~`j}bEs|gVhu0QHLCqC zO5kJ1di(p&pFf{%A~n+|&1j|o%fZ4qezHrr6&u>S6gV0KG$x*!w9>^w#!2AF!wvmB z{Jgw;HpP!_?zP=pTFT4AcKBtCo5Yp5*4y3P+rGbf8MNB8YVW+WY5e#0h<3Y5NzM9F zwK!;{)>N#wiAI?F?4)0Qn6t5>X9xzaVzWUim3jJMtT_C|%RTS2=~ZYJ)p zd6}d(*G#Inolk!1$tNnFzy9v4u-W!1W@pXE$3mSg2NNc!y!`xg*|KFGlis|0cP(oxQ=@`dccsm|r%zKC253w^ z`OfZVv!dsv*I)CbW*AEFG$||z(u_@JI9}N4vgm3S=t$OIFO(NwTyZhu6nm1yw)FG! zcJADHdAa}opU-BO>||nb6cZBzFHYQ1uyEI|U3Z>;k$VW*E`Bk>(;F)Ua7vmyiE!R6ADU7L|g->dbxhrW#tz=c8Dd((P(Oi%OQ>?9$sEPUfuwa z(gzOrFD9SA@H=Dct!dM?{r`CX|Lv~Bg)c9;yZ6~7Zw{T|qbAos`*iBnthomho_zj! zGiTZ&jlK5@o}B1>^(t%Ey|#-PJ}QrxHY!a0_eF@m?P!u9OZ(}kMut77AI|bw_I7vm z)6YA%n*PuK_c;9hyt?Ykvb(CQ`(E_t$NS}~m#xm$k1gM~ZJXZo({+C?w*J!&=ldqR?WSFUt|9NJ<-?H|XNn2v8lj2ODQ%^qyFZU}g zFR%ZYSiCbv#I^b01L^!diUJ((?lHOsE)Ck5e}A8Ne9gw1C&Z_mxERyD{=^Ry4c8_Z)9fw_V#voboB0*t!76P43-3~yqK|O z#flm8=J|myx@hNFd8jxoyzueyanNBMuKPs__`6!2Y^0ul zuv^P3(A%bb(V$6T@#4cfYo`61prScR=jY#j1r|0I6`Qwiy_>fBMuD8#WKV%3ox&b2nYp}d&EJl?R!xmHk&={?d&2qS8kcl)e{rAOre%a(*zj9@6fko4z`RCLu z=W2hf(2@AEGiG(;`BS0=J8f2PbyE0oSX;yR z{uVdTxa#&TTWTIl-=A>$>DjYqpNh@b5nH``xAj!7i%Yp*_*+?7705jQSaC7KWUk-k zw? zlkTIhUcEYG;G-j!FIt!=aqZTvuE#&xW?g@M@v7i8@rGjtYu2sPn||7J>7{k+)^&B+ z+w3ut;F;)g<;IN@DMsw`CD_Oe^MHmVCs|j&5ojK>%uDtMT^|8l>EUrSGN5Xn18So@;?#xiJGBc8i z;dWD+7-H3^(2;$0>gi_@Z`^-P={KAiqqlzN&eHphXOq)5M#P+}pL{aK_V>5?AOC)5 zA52i1c%bmk`|tjDcka!Pk1zGr?OL?(!mRVpJ(o_3o1dPRb}R3{vuR(Aop}H8f+pYT z@r#{h#kj@0msEn&X!wdwP=GT2&xs%j80 zuQ~DfrYjmx;nzc2m_RWorpi80Mf>%ztnX|8Y*W#5R!09+4K;y~B3bQwd zlQvd?!8GJB;+Kms6#cc_i>9hD^p+$6=&#uzf$BxU#O2|t(3bgocU`=W~ z8@4sn^^?29x(WBalY?8GDxaJ%7G9jZvEt18?}-wp-xgVliSPf|`~J#R(*+t*96xI9 z^j!lFHq76XEi2fhAU4}qYw|;jc_&lK{+Tf_JU9s&9_g24Yd-k=^Ua*HjS(^T)t}@s zH6F+?$=iQ^I&b^oiy0;yO*VUyGHUGZ=a|*!nage1{OozUy83Zu#`%8Bw?}CUusr-= z5!5>6@I#ybhrF*|HGN&~xAc-k+sTw7D~($U6Fqj^eU}}+zT)m`_deO|oUDskTP3(3 ze`GPfTt02uvzJG8kVOmp*ET-Mb6QA7q_08@3*S5K@zIySv+v55u;hl># zYTI(mCZA2a)~_zt{j}(2QTaJ{HqepEU)TYuET=NW*C^3=GpN)&piKeHf z9>_5>mgsR>DA4J0uj=!6ZSB*)`D83AKmGj5{VsE+&#kv{sfjv!&t157E%4pWDd(SG zURk0v>j7uw7j=ui$2xNkCb%qq=%M1muQSo(%(-*B?yTNe@#WsTwnZ9Qv+WI5p8vPe z_raEjA8y^MT7UcRyO)=j2AxbXldpUxIrGhBrVB+oW7eB%Onvq9=gx@}7cN_t25Lep zh_rtB9>25T-{GG(Z~p)G{r~%Yf4|3iH~;!l_wKs|gPC~$@xu=b)FxkiS;BSHd3}Q4 zq!hjB+-%H0YZ~XxJpZ(4_3G6ng@JtSpE>4bDNXdy5er^@)kf~U;2xvX&x`e@zmD7G zlCkyHTwaf^qe)5=Km4pQn%NV_`RB*4pmwX5C0S`{If4)P!G2~BH>;4@><0xqtmdxVw{7RHRf&JkZH%yx;w`qYvGYIh^kex8JG-eKN6zi} zujV>cYfb3Zt!teW*Mu@W*ys{?<-`dOwaJDOJYGwSYGpg_PV!83Yj6Mm{QsZ#ukAV8 zo%F72HJ^O(;?=KPE7wn7t+IXVTTit|+trWT@2t7Fb5qRy8z<6)A6~fiCvps zb8UVy+5X?$=%SRH|6WE~E^?Fpzc=asmoHk>wQiAJZF*K+-8B72;-6TnL??KtT$229 z?bNBAH*a3f-}|)0>hn*h1Mg?gp3A#-ZRfUsm;28@znv5McYchV)UL1l|6TvTV$GU$ zD_3S`W!?M|sWtyRYx6(zdq2*;_;F!bx-y4fY3bRIkIzqyw+Rmk*%hlNQoB7w>!fJc z;r6~um9tH@M%8|56=%!4Yf=8~Zi&^(u@z(A zQ}m`s$IRMU^RzieEjTvv^wR<@tyg6w60GaXORK7EWV&VESr_ha7w4*+UY%N#R8aAS zt;xVErBmgk)4~aU%WLeW-+zDd=_VhwW!GnNG&zIz1kH<|5f?EhYelyC3teluS5H3e zT=~*)Q^P?U%WN8*H;Qz-9!=uxKi==USg6xw>C2Bh z?kY`O0bcjfee~O*@c5z|vW*S@e|=r8Bi3gWz!;yfHH^bm2{dS!!*lpY&AyW<=fpoT zH8LDF;CUP#7Isrhd-KjWmo6#I*T3?TXZE?bAAZ&>4N5hcDRlD4FX{h}_1gtFT3$b| zSrRn!V#cOhIjv3yv(|2i$bBsz@PzB=!o%*9JC8hi^ykf+p35&&HbyKJI+@O6CT1ZYn5ahTE4R|3T;v7)(I=!x;AY4mAjMD zmMqTAEZcgi*+hSL`uWJ>k}sPUU+qaNPfuI=@?B>5+tsJVZM)f6INs-~`Bc4+ePXA= z-O9!|OH0gQ!vF6fQzZp|rVDx8v46Mszy7LC5y2~$gecvtvN~+Q*6g|XqL<30Q>z$f z#?-CYoqqMH*YaR)Zf;xKkN!W;^Lz`?nyMwj<+O0Zq7~_D=fy1y@K6!jY<#)7{QVMR z&0fFd=2BO)zCNGzDrNJ{tD)Dg9I@~Wn#!conxrVgH;GAWrq8E8m*=csvqomOxrvFb zZRNW^+Ot`6z&F=*xGnbIDF59#f#a|N&+&pckL4Rmw6<>9p&-DK!nHGKp^DwRiC?dz zZ&8|f;?SWxFFx!&c5Iou{NJ4FWx;d1e9T07ehWCoy^k^x3R`u>;@`<7i7P|8T$SVA z|GM?d$mztK+D+B5)e2L+;&y&}_u|G~7p1ySPfqjA4nDV1z$tEhbzWUf#t%Oeu|Aik z_!Fs%K`Q~@||G(AmDtX!b`uci4o;#avuim|jZ@z7HT}q0ET)%X0Xwt@( zWtnTks^1(rnY3}m_1CRVik_4FmVf?pdVNIhw;Z$V&7s;;U&*oyOZBeXyVzT4s$I?P z{;<`z%XWFKwJUw*vod5;#G2b|n~HWm`tUGrXN;w#rJJxd#3!lTYgC=(rpbbkhiVZECkaz2HMx{`-lx^P;DDsI>FR zPdh2%w)p4Ew8)(?plz+s+^-*VYwMS_-uZLK)wI(o)v|rJypH}kKig~Vzi09_)!9)` z%hvwc|No=?i78#@)~$Q@F7D#-^21-N{%)JKG~qI%M`=rshi0&H%c6@PZalg0(D}H< zyU8Kyv(NhY@TV8eoHeVhLgkdvqQBiG=|__ilaqZNF3!zuw~pFf8YS$?Dc}Siuzzf^ zaf{LWxY$0ICa#@A$LHTY{;O3N?L^iezYbW?=RGmDuar$P_?uz0pEXr+o!=eBnz!&Y8d?)UZb zmV(VQ`F$^2&0V+rxrev6w9|_P>-W?94uDvZuYh@A2ka$Ov-Xyt`==cr_k(Yg3Hgbg%NeNdX!nTE%KCjy6TJJoKi2 z|GwWPkZEJYp4^9FdegaCn5M40dw1Pui{m-L@%Ixvn}!U})HG+dsTv zRk`+mTv?eKFJ|0{nzkU~#AFf81sW@-7|%W%^zyHG)d%ixg^w!F%;4X}JmFPh*k&d7ZCXovr#moa+g*7l(~B3UwDxr>cOetL?9MBWzTVsBE6*PH#cQtoi! zti&r`y-`aSYj7QY_rJ8$#pz#z`Mi#4cKhTt#XO%BEsa`x`_}ZeAzEzC|B_Zpbh~@E zGPON6IlE%2R9|pMS$ta9qn{~8eTg%o)?UrxnO*I_G{{eDYU*amg#j`=tSnO&L})zu zqAd|cxv6b>19b?V&n3c=BVL^VhGMf029H?fzJA zdUjdbtVD_ChyTu}s7?M@VJ6gBVK-mh^VIXNY)t>0_9;w1z13>%!Gw^NSCclfD2j0W zXg=tmHT8&r&Gggjciw&J)270?HEOZBM2Xehpp~~a9*EMLem^2QIU;fA8qsc7i@xWd ze+Fp0_?S~+JFme$Ku1*4EyLi|*);E`VH|yrXZoa-UX|r*J@l~PzTFMHgZ$FTmw^{TC2$L{j9Z{ z54wRM`Qz`*X20deGgnXXN=+@;vFp{hpL;+j&b6i(J-qoL<&xwa1(U3;7gH`t^BB#n zId1MDaAez-0MJ!Zjsh%)F9d0RPsp~|fB*T-8yzl62NNFDNhwd(4%ONjv(Eg^dbz+% zqjyn}->UX*j3_ytEH~wBn)1XCmmV>B25L>cm11O{J-K(cCBsTSCl7^$oNcoLGdq4n{5Y~V zM9DE|irZ@YYnSg|yQC^~)#i_`NY~L4z3pq|We#&#TlGcgY@O(FBgIIZ>t`?T_o>qF z&z|W`H(DvZU0+YfH+r>9{Le?*zgPuZ&D~Y=b?(KD2YY+3_S=iy$|{{>SNZVE$@`wA z*RD;=zf)14k)j~f`@lkPlGki$>pmH)!1()06W>hO`kedc&eoL&tIfmjbg$p@W$UqD zW^Iktbqq2pQ>W$_8yoN4yVq=XtWI6t`}2$+9<4~Rw*Pt3zvqK+D1D1nn;bc7 z{`z%m-@beI_N}dzm5q^=Rnga1sym(bNv5a>?W_3scjnBM9x6IQo_Dpi=Y9QpD%frD zNACE4Me+ALPu1;Nx$@-e>+5y&^(QS^FhT#!*)vb<<2IG9+W-H~Y4NJ6zIQX8t=$z{ z|GoZCKHKDvA^&HF$Ng+_aZ;V!S^fRpzQ50Am$S2J9iJegIn^`1@~ijrbFnL~{|M_a2zyIsC{QAq~e}4R&9{=*yD>n{ZoinvR9-K*>#P+($_aCo`JOArdm16t~naXc>c82f!5EUK${PL;f#oQBo)lFpq$t9{l6QaK*S+=s&NJ?>|18lNa%&+7c`O$pIQU*_K;2SQuMdOLn_mS|xJ2OTcNSkChbfbT8Mb zLBYA@_jXlQex6ce_xf|?y~_8~_Z?_+TlqHUU1~<6)$Dn5WF;l#eU=72KVRp$_R_M; zCm(Ly{r%nDPd~3!^Ut5)mGabx%Z+Juwzv5Dz1kwhXMN`iO=MA=a&l?y!LJuP9kZuC zuKAz6qDOzX__Ubf?RoKnT#>6wuZOrhaIU%bs&i#^c>bQ*K1bI~lUjQ$;livGBiE;~ zA=4fPO=(c^Tzl=ptviyPEI}tLl4DnIUUo5OgV&KuD{o%B&3s)f{MnbP%MaJtO%h2d znpvQ-W0O(+^LJmJ6z|_H_0bDY+w^kc#ofw_%cqGwpHr&KwR6_O)`b&}zrJ7bIQ;+D zsb|8aU)}z2e{b;v{)+VH>i2#>2$$$9-}d#!nyWJGrZ*WZD!Ps)fl42Ff0bZf-?cy4 zznx)V;9C@+QS$uU-2MN5@2~&+^?I(^?R)0Ux6<1C6(7qdjY zo}Rff<-f=MZO!J_u3ftpCOtbk{^z0Wve~kVCidprHyD(^Jtex+C(%Gc+xbt3mZ_=T zI`dgkQMdPhn!4VQN4WdwvE%N4?e0(Yo}RPq)p5_yf9n2!_;7)L-*XYC(HtpKB_kS+#|8-N^J}xfi$FuGKHY{9tFl%$JcFlah<>6t|?$v*v+i1N# z>h^6Z>Dk)4{q1b*>T1XAD!$7ysayJ~O+Hx!I?wh?HS;sA(--$WzS!-(ho9EwKv3Bk6H!Js}f(tEjLrF)8WIy$20flX7!% zo>}BoWPEt^`@Q7ZXP?F6R<6&#VUt!-a3Cl(Gb7`cS>%-S&zTz!EbW%Rv!l*;UBDMv z>#|+{-!R_#RBjL?%c#1-=yuY_7iaDqdG)KyY2hjr&WRocxwWne3qnCHhr7G1v?aKF z&iC~7@~^sb>)f|{S?{dLxCR;FDcT7Kty)~?Z;7Pxce#=99C zKBS6p{VtT5JyZJh(@m{T`-%=aZJcoac|_aRS+c!f*Rm*1(4NwoRG0K<-tE0peAKqD z`*5!-ZN{@@eJNUYR(0hypXMFkyzZ*R6t1a33n!kQsuZ>+DD#SzZrei%HxHFLOHVBf z%JTF|FuOU&)VFG`r-HzbKhnkB!9o+SMBct}t)@ePAxEr7kMFrXZF!e-b;ftWH?y& zex7ylx24aXg|#Kt*v0P)kdTw&X>IyhV>i`nX^WbC*FYG^0x|p#<19ah67rEl{oUM|H(v&=ymGntNrC_R zqe;#jC!Z9xB){MP`P+{h9#fBAx^*i|OZ4)}5T#iexw-G(zRk|dTdI*&Sy`Bum{ymU zSD3gkDBzv3)>N;L6?;N-R$f`Pxc2y~SFf~J_W9+XNHLmjUvq!+#(5qpDngydH*efw zaQ)7;Ygg`6y}FXwGU06A^phzsQ-YN4%{!2?IkNwF@$+wMJ3nr$u`7S^;o-Z(d#_&Y zk2v+k$5LV?U!Sm2n9{TYiAMjkeVS9HCZFsQi2A<9_iW$kCtOp#yeEEnc2BzH!l_e# z+_$e+ne=h7`)~a@|FfPRESkAJYR&%2&+6~@{C_=h<8CL#)q&Z2|MfbpOfU%vjg)b# z6?Hn1wQ=*B8#$YVezQh{DnrAP9DcjTCB{;s=6Wm;YW?M+v1rD zWh=g%;&OGb^7A|zB&fW{+{nP(+S1lks*6n`YDL(qHDSj;?lV6A`&^JnbE1T!K+#IC zGhQ5XCKPK;4bq-`lDkzWUW-fe;lp$Ls?xhJW~_{f)C<2SvqP#}w`I}7BvAHJn)u++ zqn-#Q+p;$~)!y5Cf)!fUgt(;aL598l=P8ED4SpW3Z)cgCsM$dcx{V$&w!}(3Q`xTBR847&pzq4Dq+vS_K3d4cR zQ_rS_hlkhyc`Wbm=lAXV_vv1L7N7rlXGe^7xA$kStxh^S_y1nKZ=d3W@BcqNx1Tp} z){GevuU}g3+9~d*GtKMB9c}S_30rS!^ync`Ji z{(Yjbx?kwIrxua%_d5?ZHgglI)I?6j2N9a_2 zeYG^k?sn;p-&bB5XMOz}vtsq?=p$WuvHR_;t(C*Iva{_o_Xo$uUcOtq|G~bPbs5>O zd03rRx@2WPZ1nG4q_H*X`mK8t&p)3vYnJ(G9*wD5n{PS=HYIJGar&uNy-~%y^C?EN z%RkHZNi`q5a_7>z0F4l>tJhAuExy?Kaie_A`}w9(Z(kax$5%czZFTy1bMakocIB&% z9Ev=dSFEx_&;GjQrSM>_jTqO@Yu96CbKAe(dMj-nJhQ|?N^4rz>UT?DU%$WBCPHs| z<-GFsde1-a{CQM!_SRb|2GPFP5)zVAzVI~)t2Ku%z7{(3jnKv|oA>|^X+CN~CvUv^)pdNk93T51 z#`i~0zhARPXJ5^~(^YdT+rRfFs(6~4mb}`MHZ`a@c}I1r>b#C+!5ReoB^96^fv{|n1>wH;4Cmh_RMQP?cnw>a5d^=!3R z0>?uR`@%m*c7A@oB?Pj^p=i9Gdy*hK|%(dTtJ1@L&=Rd$ic658`g0Yblh>MBwoFjexbrry&rO-bR_W@=w9QL{R<1gwHM#cF zTX)b>@u0KWqHdCQtWLZA)AdCwq5)4h7xvY}v7YKYOOY%D|U0+h(=?Tp6J=>EseYr;QON zGkd~k=45Tvn|(IV)?)hUBf=YlRzCT-mY47TtzT309~|^ln(O(rC~{WXtGQ=CR+vma ztGD*d?;7bjF8kKZzMk33wzpGhv}Uarb59$iVTO49^wQ(8lJo|*2o zG)C{Z!6C2x=W6U``>5^t*SnSX`mJ53pWnQ3BSLmh`RZ-U;!bP`df7bnmZ6M#2BY)D zrmd#oDpGwePAhXZh3KRNpG+~@7ip?D{j}=j&Y+blNvc^>^NjskCIl@EtBZ+Ol=!6F z60|a9--Po|H}jl*vU5(uq7`$yHoq0;Ni3#W5t|wHbSpf`#8P1OK(}jn9AnS)(Vxp`&wV z=N;{%NgE?{e*N9&qczt@ZJVEr<*L=c`{u9637R!WM%^Q3Wr!q?TKnE*8+S%32!tGq zwTbsiztou$qcqh(Cs^aj;fDcFo$Vs{f>tdK%glOnZZ*$j&*jdJ_D&je{Q{>PNZ4}X zsaAh_?(2g;W9%mTD783E4A9#C*W5+tX-Lu34pGk5MSXpXv$h^gE9L9GA6KfcuY0CW zf}11rT2$!gU*Z2&>|FVGGtXA>KH-j{uT)!5k zANTLAySaW}Kfl+JnBwB=eb*!7X6~&Qld}oq6_|e(g)|+ox)p@A~-q27+!n++CW~o;btHTvX=x{0y!~D?3~cP1gh6 zw&k+MLgGvN;e%)Y8b2+Xnf5Y7>1pKmHf6zgjY=n~nU8Z$6AikuuKD)YuUn}%yjFOD;DSH?l!Qqv$CGK?)06*J#Y_YgcZ}P|=y@VU`|} zywStpMfb7AT2sT0bO|^`^{!jC>s`V3lRuZfbXsX(W~wxKwc=IA2Mv?FmfpR4_x_J# z<~DNvMl+o<-n%<8*zmLo%c!qjpD)mzxbNe}l+8CmHOFPv+}vDUU0tzmRgqis=T^-0 zNy|)}w`j$@#kJ|@=H0cb4AK$}Uiqc^{hp^$k)UtF zHaW;J-DH;bX4|RmpLV|8{keFiPW%JivftO*y7(vhEl*2ZW@WXF|90NJJ@1Ov%GlL> zxwrS=!i9{TJ~dBXY<%}FZef6i$R>-v*297qnXNy`_bC)kbeZF&Zf16^>*%3o_6sIw zH@)fOZL;V8Sn=l8R_(?G>o@LvIW>I$imR_$oTjDT4AHW*Guu@frYpkbx;U`Y<b^q^{r==~s zU-^4`?eV_r*UjIZon58H7qrS*K;?8-snz83+YOD%#1)TtTJGN4wyb=ItBRnfiB_)F z>>y1O-g9CL13DhN?2OS9(z^nS-TYrIbGC9UESkyBQhR3F$*_e1O9EDSOzJwS{Q9+aSoGVp zRgbwV+>XCX+cdK(ee>C7w-T=+RcEg$F(_ZI{p7cq2sXYjBLb zG{=v_4+E40x8IcUTKeju`kn-XmdjfL76;njcp&=5LvMPw%c4_TI8SeKTm13M%gb}; z&IR3iemgPYZ)LaJ;_TIV+q0Lh+qdxhiHnbq`{(9*MQfJrH!$D5!@%C6VEMv@8z;S5 za(ShT&ATGq%Uc|@o(ec^jJWbRlApc#+%LA(SHmP%h;$##P}#L{-@A`FE3QgSQqex^ z@V730VZesltF^#tR8@9vcC42z1owO8)^sZ*Pr zR<2l||KhcEoTZ^q=Z?FpZ~A;YnEff$Zu;qW5i1-N7Vx?qUUhr#zHMTiE=Q6)Q|*Iv z#6IWbv^XnvhGdzAzr9)aILFM`-dx)M$SfUQTid-+Z~vNB2L}glj93%$>xp(@VPaxh z+OB;I4`yu*4UH6V`dL#~mG$cF_Io|YAJ^?)KWXPfi*sC&Q@wJxTW^V)TYYrvo-HL` zPpM9fSaV%kRp?}2YWsXgcFn7f92ZT3AFtqN{X2Q`VUC5$w(44$XPVu$o_cj(EXq$g z@c8D3DqFY3GZQ)HJr7=aWNzc@>3aL`UMzd@Vq#tM#b2M}|8K9bN!om+=I7S?;zl}- z0&{%U1!ajCr7AqB|8UCRWof{5i#gX@-W7dL12+?0%mKR3r;$^?~A2Nq;Tt-cCccx+ey zZ%@=(I}O{rcIw^T-2cD$|JM`ieroqG>CV~meV^5j_s_qQwY7gu!tWVs>c`pH@_haM z|Gk|5@90GKUEK^HB3Fd03XiY-`t^GJ_6Qx&F6A$r^P8tmT{>~1;`;Qre@=_@$-le% zE!26E%JIUiwQf41yQfWG{IKBZ#}uQ7-z(S0?mlC1XxXwfP%rq?hYu5uZ?4<%eZ}Fx z=$pGkHJ%(+{Qu&`hP}IX?fvmNTa9KRDTijk^UwQw5!d5582QF4Kr=6@%=L}O4++X`!`TMHZ2eZYx zk4D(cs!ot+aq`eedHqW2Pu%}suV!T*Rh?QiwdqRU_froZ%>6lY=H>LbtlYO1UAqhA z)`dKp{P9Y&aq{WY-R1B3LbmM)=eaNa=c;~v-Ip65i=W5e3v-E95jy#_sOiVtHw_9L zD?@Hwxbh?__UB3d{p*8PzJ5LX)vH&0r;@HTPkY6Y(Z04UvoLK@j2lPcoI@E~^1}FT zoXROHDHo5Ces}cg%=kaAs;^%CI%kTuD0eaU<#k(AXFA=ySa~FA)MTBaD)EHjNYIlCfs*E{Fh$CJNL6MtU+n)0QzWMX0#B6e2zU7^Jm)2gN$=P%zV~bSpJSCRv>-Ik{)1P%VZ11@hS6@7Pre?S2 z)3r;d=ENmCa8%YxduxCGn8I^-Ly1x3$?KAew{KoFHZuEgZ|QwE;lk!~F5D~!GcwZh z7KLbR+g=iW`?XxhgfOkGy1MOd$KT(R+mW!S5;M| z{N7^mZ)T9@=E%TGm8m|z_Qb7h5$-(dG_m0HME{)=YVGFtyC%PW_q9ap?~BEZ6*+6y zu3hdw|KG3c`{ROxgEih9uJJqiYE^Y+rlZot%q><+gLXca{d?=yuW8fzcD|hXa;E3f zsHx|lA64?~;OOn`V`*+YCC9)1_~Z`txZjt;{pP;g9-%Weq1F8mRY5D?y|le`>DHisXkN^Krzw(M!lS;Eg$H%AM@4YQFolZRe z%KG=;w{y;W-TN))mYVE!H&wCdv%Y%2{_m})ufx|*IsNo(+wxAACIybxn5k#eu3x+3 zw)kLV`1Ol7Ev;=uxmfk${|P8g@k~Fout0BqZdRsc*_)P(<*Us2+`pa_Uj967x%0#a zOTFLE_HpwloyR1j?xNHgv~XEwVrti970tQV5{x2!)mAqw;b~iS_UUXE&s8B=jGkRb zgJje#{NiF`@87&qMbR-n^mPamj`|P z%3E$BbHH%TiO(;6PAxFrYEmY}8*0(leKcrkkgr|9vK|GGsX=R}Xtz2&>^p79*)+u? zRaZBb#m~pLzwI#N`ufE!KY~`OEMQ?`jMaIPJMGoAXU=BXy&;DbTU?Yj-pp9J@%qyu z$^PYy z1pD2unZ-OTU^pD0HT#&rwM$nn-ng*rs??>ITY?s9eOBEV;U%ErI6;W>`lUOf-R{SZ zu^)Qqpd{ED!rqWB-g23XR{-CAB&Ci}`v z%Gbm<-AHos%2oR|avnEeRCVC!bXm0QnOLvi>g&=Tlcsnq*}C=IV|Bl?e*V?A(x*>% zr-mFWbXpm(ZF_lHX}NLFhGoYp|NJ=VVlz+w$@Aywf=)u6AuB^H=aw4zO*@+sG3}_q z8Y9oES1vvJTFKq&w6wtZ{AahtE0=CP`)l-Lli8^K(o0o((&_=~0c{@~cvFx6UlF+WGeS>}4;j(icaq4b~EUqIYywCga;R zc_z|2bKkbRyS>xd^~{FRUu)_lFN^Mz@782)xINdcIW>D(%I0fx-u`z|*l=*Mk$U*) z6t1a3i!aZ5ckg#bU1nKb>cUeQx%rk?E?o&cAs(}iwZD9-SisVtK!pX_tEDYC!;@F9 z-ZM8qCBrOY*Y3V=GOvU=BAOJsjwZ$CGCQ3}*bt(2B!ltpl?!dkai_XCCY^aw7O{?t zq2gMC#I-wj_WZp6Tl$Rgp@%C#7d@R`+aI&DCNrsI&(gJjOa9;F7LU98XW7w089S2? zJ;AH5uHX0T)oK0xckbTZo4)&Y`Q;lo7G0Lq)=n$8c3XTAbX5(HTa!Z2$|uK;Svh&E zHwU#nDivPD$IS6x8uayRuV4D!7`^&}xEDt{FE2koM^+AJ;eF>gjch{Xf`7uUM zd-6$ZE56LF-`6K^jMy5Ln;rf9&6_W`W=SiC#NUqyzpgO(q|!tW6RD#HIh)&`oeciF zHdl6I#uNq5l_94#Ejql{ea=_js=al^rz69|%afBgUw=J!?%cT8QpJ{6ucThRl6q3~ z^O@efRj|`?qWn z;A=md)_plLe`}Qa`j-VE*(SHXebd_-wfCn`(auL-ukV-SVA*u@&9gNZH@~0hSE}Ka zU=sDD$aQ6iP^aC>o>EEK>9aCIgd;;xdzzQU#)wUC zwS87zF)_WkGp1Hjv1`#$CCJ^y4mF+gRycB&EU`OiHQ)^4(RQpDRg zdFu5^C#P&Zr?z*Y)=aMuzA&w;Cc0~;I4{UdtghB~>PS_cEh=lkV?6VX(#9!^UNC=o z%zc2HkL~sC1c`0Ae?oqi9W~%NZrG$CC!@dY^2@JZw{F}hxc>TNA2k7|sI}+v*5~Er ziFUfoj%$OnZxH4|(B@3c2mAhgEKH42YhS*4b?*6R6;CY@uUY?63R)jq95#qrJMH;TFEPi< zC843Bu7M`L^?w8tE&2*&o)=hzXr(Uw+vc=z!OP#lJ0#jTS+@8sPmWv&n!@v3y2)#E zQQu=N=D%kx#ipfdc1=2&V$nBQ#Z#cgY2gG9mFU|ni4tL+|680Ab93Kb0$r!-w)kP? zJOz#>1?|gWMl;X6Tw^TNyEA59s%y~7lGiTgu7OhzY&#b7Q~g4Q$!zt@)7!lN9rvTR>q<74agMgb+yQwb}oejL@-diprx z+eWSP8`flG^B(8oJnE@p{p7FH!*9y(_sc##m*1}9xwo!;hNa)X8AoLp86H?3_*}Cv zKtf)6?hJ|fGv{_4Pu>|LrnqI(railMN%64k-pxPzOj=8T!h`wq=S%M>&Q4CYmFj-- zxpJDQzP|qXb3XGe3U{sB7pHV{q0ie_tE!Wd{ycNPel~QP?d@4S^Q6H?eA(Ykoi@KU zK%-{PUdgF*7!{}ZsF`i%o}?hkwbbcjhgOzF-)5cNw_oiz#Za5=xcTh$TW!lSXDxeL zbhPifB8QWTknIlHrA61SxodPS(#XoTv99CT9s5Bs{9e_;yXS7{{%F4w?KpqW_qT_4 z<~|IyT7Ai6Z}d(Nnd7WX2e2tU5Kv z#L%$p?W?Ed_i8@Z|BV0t-D{PxrDfgA!~AxC9yBj|mbUrmsZBW=BC}@C{rPYIpXW&% zHKuvIdbKUQ#*rg-ciGeC@AqfVp7-yt{XgNk=RWlCL>zSd*c2Yj@*uM@gq?xmK(~en z7az}^KJ}#1uV3%~c(z?dC^PkAac=HichDH)WchXL*0C`$PW9Tl!C?Qsjd{fue)BDF zU%BE0+6E#mE9=ZWReEN3L;^^4Y_`Ow6pY>+5wADZF|M&Iby|`XC=9PRE3k`ZM zByHTf?YL)?fXx=JnL#U8t#kZ{c>WNxKA%S^0|UdJ4g(%_&rKUwMy|g4_1m|H z7I7LPmtL0WO`ohSvNA+Vu3K%g=Txt$UP~W+lsG@#uq7hwNZ}mNQOB+uBbF>XrYYvV zZJFWf)$e@FK0joCZ)kG&(yg**ON*`M^8HF{66ZZ^U^crsvBjeA;+Ml!Usqk7wd|SL zQm@d^uMyTv3>8WfUV+ZW7JON8HiLjfO=lCs;)w_P_Qq%R_jTh8~O^s$Y zJwLrYFGiHB^`Xa-ojcFIEV=de>ixg({x>|9X#4ADxc&9@bpk4u)}~+Y|9=|4zvN$P ztJ6oFH=67T{Tp?nV`JYISX?-M)v;{x#f&RirQY7!f0i|zXI^5(z`zjaGPNl8`ug~} z67t`3)+{zUCH`q;%BmCM*RI`(zP?1(zOHE@tCQkn&-8os-`{q>-=A$VYpd1V7)|@) zXEDCLn~Ng!=5w?CO*%DY5M7} zd*A>4{N+eX(8@or-q#*ZD}GT@HPh!=+3x#wug%TZ#oesha53Z8t?PB`WAxM~d#=B3 zZEIUt{@~nGe)~UP*VhSlyYK&fcfShZi!i(?M`v))gSPOnSD$69<5=Nw)y9kmB!kqyN!)6=kNRJ-RZ)# zl8=Gm4L3BEdMynyo4hP@mIBA5B^CQb`j20J`Q*xzAD12_?Tpd;ShF(3iDT`WHFx$_ zvpdgl(OH-|Ynf!D!vPM-NsCyRq8vB{ex)pD^b-iuRG(U8ySMgcOkPgOj;&i`S6`Ll zal0{rfq|i#2O5TM8YVM(rB}bcJX!egVP~#Zt=VVwbkD~BdeD4v;=`hyF&ZLVtxQfG zk5g9k^z!ga^ByzOdR^i+|Gcq{iG__t#QiHN#Ubx!9G0=I+A~A{-oF>udS72>VfvLF zUp-ghLB1XX!yC;Xw^$h%KHN!a={cA(!E33=*1eqz&!+v~Z2!Ca{-0mdy}P^jS3F+M z#CUeYnh2$L)^(dUuKamv>Gw~qbIw06w3>VOt}PRzZi+yK ze2dauix+brFYH>R64ZHbN&3y-s=P;%3a4Hz+OgeSu7B6v(-$**w5A4$Y<)hTk%3{) z4uz|XAcq94zN+pw*GR(0YHr@`JKaGmt%{yR=!iYF&=cWMY&nv&@nFWgmoIgvS1$Be z5tJD*&6OiGG*ZK>Au%I0_2m1{=|PzbJywLQTpJc09=`o#iW^7f)?3S-iTSBrepNE{ zH8%^>;)^A_{-62uX_3z|jp?VOzyD`oV7S2y$^CgZ-(Ic%_xykIQqLECr_aPyy*xD2 z__>{*(+022vMmA5&cbbp7Iph~ukc&GyWnByy!A`8pY~Tb-m#ZZymI44O#J-_z3Jxi zjvSd=L4`=`^V3t66W4>1jv+Yd*laJ5sjuKJYf{*zrXKBo=huFTHbIu1mmB%37rM`5 zWng$v{B?sp0~8cEIId!buq*i9&U$qs#c0lf%QsEVf3B7kU`TE0s#)1HRkN#U>07X( z2bXV}UJcX;v1n8e>J(aHmB2ssbn3p4Q{qJuZJe!#WUpU<81}(q_cYZD86~YTmV*7C zmR^cuV~HzBou~iw^UM;q!v=ki6T;ZR2G&^ZKKE+HRj)Y?A4Aq05&v$a@S*AS^GzpH zVpNh`l?0zyf>k{TzHNGS<4qlrR(9rlNrFML8_I)Lrf56~Upd8VY0>^<@F~X(>^Ih} z^sBD6)>R0P_5N9tr_ao!zr#c4&AkZ2nZ9b1Gm+Kx`7M9^M8@yoL(qP{_o+S)T*W$B zW2L*pqC-PNuht!h-1ESV8%vCzew)ReSxUhY?VWYV4`OlpxHZr`+j0|Vr zW!nrYR~Z-{Y`(FTN!n?}%9WZ@ow0u&?3ys~#v0RVG2seBQSYNyzb^IAQJC7bYPGD@ z+`RqD5cAn@tlMnGp*Z>El}on{8KkH@ijHpfwSG_>^6Y1hmZeoyyNdVvz29cJEk5|M z{ciz8&xZnjY2PB5^zFB!qGuZ{vaq$5>UZsGJv7giEly)&M8#3l`ChI(Zn^RC^L^BA zzwZDC;DLkRI;5X_E&XI&|3`MNXYK2ESHEtZ>Z7&OJh4&y?4whEuFigc-7Mt$moGEU zrp;RR-C7B(tzd&~&U!wl4h4>xK4otrRcgtrx)c9c4rLBd=dB-f=CG+xt3L|AF-H9U<(84Z0S+di^?MR^0s?97k<}jg{S!r$()u z>XmBY=U`v`;pGRL`Ch7r7B*bpzU^7$gp)_lp6&h0Tbi}CYQHliIh}7lzN=PGsPomU zIiPEOGuIo&?)mntTK-Q`Rhh~3(^F3Wc`hqo5hvQ+I(6#N?|Ofq?f?77K9jd=dc5uT zThrr%SBCtS1s@2@P~m5j6t;Yk(e}jw8h-QbR)%Oz6PqR$E1W#JIcsUy;!E11Qs9Xj z3%`$+?%aG@^PUHPjIf&Ql^R^P|N7&2ezv_92VeJ|+BdoW(zR<@8zWel4%W3pPWYZD z-#_)$0$uH!U#jlzt^S^Of1j=e!lS91>L>Cz%Xy!ao4G*AnWfq}2VYgO>GpCv|-dWYBWRWwfVT3TV# z7Z9m7+3sQ|xR7RGkYNyU)tq`NXkx$HV;la>Ru5Q%bi|q+?b{OF7QgKD`}2kSM#a4I zpgR_|X8M3HGYZ!cv-^7WKzGBk%!wW$2 zm>LuIH!~&Zi*Qx;r^_BUn0@x2i+bI!kmV6NziRf)oH_I5%gpW7cb|VgmNe17*7Spt zfdr4=^3AJOty;Nq<-&!D`wxT4JU*c&g@|dPtEVOzzK$#HK9V%mYwLYS#tq`1cJ9f} zj8sZ{E%j>NizDiOrJsKOId<&W-sg&0V>Ey}GB+;SGQLK=+SSTuYQlGm#3ver>wgvn^7*OROHa9{60N zH8(0M=FOX&{Os)7MaAGWs*(e zlLtqIxY(|R$NpPTUs|gBfIDULP9L?&9x89jb~`OxkXf~#8IR%ti+9BcE!X!+RPMNfZ8=l}V#`~KfNfB*i2 z2{+y|fUdGgk4;Wawwd?iseb*#oUFXO_fL)_@vtR4*tu=fCKF4;XC+p$e8(r}eXCm& zvOGZJ$KQXTTapjI-h5+Kb^p9AH&?IL3ELRqBXDGSm*k!q@BZ&G~p z?V6?Uv{hN_KX2dv>*t|ILXMLx9B1^nEezOkpAl4loY$D7Qfd`jU;qEWfx9O^UVJqx zYHb*Mz16|b%VYGGUw%3BXXO6#%3_?+(X)Nk9#4*YvN6pj|L(4@o9F*O6nMSh&y|_q zzUfU9wXNL3@W$bUfmrd?@_#SlqjRq2@BjVo!i5RPAK!cry1AeseO8Q~edVVmaqGET z{~Z4Q?pMvdzkM7H%h!i!u`>OO-}6y9M6d4a>iD&*R{atYp3y(!YUj~M=6N+wiq?ll zzV+=rtG1X^Ye(~Pj>86%RF(#<+qhFVT!)X3Pn4T=Yt-3II%|4Csidq0G}f_q@7^g6 z1>fHV*v&tmwwce})HU$8tQ3PkvyTdR6kdoeN;`%x!3f=7eSW9jS;Lo#>R$r*5>w>mNze4P?+lV-C7US zbG{iG9_}u1Cc~$oi3N|-evw>eBgPz7>9}1)r-mM0&V}lEVuvqv*x!f zC`o+qQTDu)xBdUs_`g%nCdo@g@w38{2I`P9BAr2O=rJrtWOxBv3RaRD)Ra23bwB=Mxs)5v3w#jk%LR^xQ zT38=Gm>H%ccKG3j>#rkYOLg`2RD?NYj{DEIyLsmh=-`_|8BaS$Eudecv)G=+fLe-#`&hdG*7tX_TjWr^0* zSEr_GfByV=CFsbMwQJX|zN*(ID8N#3m+|}-@TgeR!G`nOH|~2i$xCJH)~)(`ORgnt zw8<2o%l>xOD-}@J?)g`?HDas7R{!nMXFiY|wAys**3!K1t4=;CvYPu_7F3KCFnBDz z^zPlewzjsfU%xI~xbWr6o89mCo7)=C^-}F>{Zr@8e&8@iMq}La^=sGW=4IN|Z@Zti zIdf}NTcX|Rlyl2s^$m@Tf^@`W`F3;sYH6}vaxEkKwG{iiI|e)F?Z($b)nSF^rW*&Z+S-{^m3-O6)U zu7vE2*%p~=5;C2w+GAZnRL(c^`oEu_FFxqEG2%>$QQmgx!$S+bi5@CKp1E)9+L;b)PP`tXF2M1@=KRSN zmX9K8{R|a8I;XX!o^mmo>7nw?dfIY@xqkZk`u`8x|6z6w6xWM+@%HWAC|$#uKK~xu z|9gDl!UPwkpR@P>oIP)zT<4QI+wytO4?p~HJAeP*#qxh&Sl|E2cf9cP=g;!BUoK8m zcK`P+|9{!`>5nV#z5crI@3-6c|Nr}5ZtbQZAY)tg<;+auy?giC|9$DNuC5+A?Jwwz zpkv35vGePRaDntcJw2VBjje3ALf>Pz#UBr~a@YSkUjHXT{?v1Y>8D*62Tnh&D%L%F z)~s*ZJfQZ3O>miS@}GYbraVq5Vr6W#J|L&$IcZrYk1|(llG@~jnNr93Kh$}(C0g{I zPBA)|aN%ju*6rK#?WX#ug@=cWi;2bPO%Gc=ciucRsa{@Q-l^%{OD~-|b?VZkARVz_ z4H2W6IeB?~i&nU=i`Jd$wJ;!~uyEtfoso+#+T8H#Tcpu^FyQ3MuA@ny^;cXr=iiqd z%mLjixcFj5Zm#a}LVmf1#}%o4FAVJ`pFe!%$`$GSJqxd9ZLd27a(Kl-+ng}>LnkeE zGNqLsh&yD^qvFxE=+x69tGQ~PpB$E3F*Q1*>eKJP-QC^M z!E+M~EKE(8255Lpn&P!oT3R|gJA3wdvF@Wwmo9Zs2)KD5*=+XKsN9VaH3ies+*Lfy z%*^Il79UG7diz7iQGms<<{@`HXe6f1w&=gSYoL3-+}pQr?|zKrIXus6Cg`MphKA)C z*Drc5jbrZlF1Z-r=?nwyLFAKx1XS~;=r zgKMD3QVlOqG4tx~yOq~pZ_m5yr6MHaI@hlDR^ImawhF$Nt9#V=e_V8z2d!&6d+qMs zT%(y~b|pVQrA|v_Zfv;zI#r_W@s8~4>&~7%dvbHAh^ryb<=eM!-?^hxzJ2}GteZLC z&ds$}@!Ym`Yj1C_>*9+sdhH4wN0T_&n(yAdo3?r8^Pl~8zg}Eg>U}b$C@G1_^TXcguJq^kX`#M-3+-`lm1Z*7#XtC)I2B`HXSh{`rem{Qmy_dC|_Ioj#Yh?5WV7=`%^?=Jo5#FTb30 z^2rM@`0(MwW0$$d4}Si$HhR07y86|utu=q{T$c$DX!-c@8RF zZL)mb4@F0TPj^DpCU?3h$=Cfzw2)aBwpyYMwD~$nZE|8{*z(I0RZecoF`Buj;-k{} z&o4`=va+$h)W-ADcH z|9&|)*ZO2iP#m+Sr%>PHtx>)LE$`mFTmSnbBdB4~$sWkwkT32iP`Cg7(<08M4SV*y z`TX;VtiI0aX{S@?pTB)Tzi*z`n(AdBQS)x+^AN48pFVw>svWKuzb{5dZ1${KYrdHzVwaq(r+_-tu z(!#>R#AM0EjJ$h$e)j+W(Vv@}`~3X;>D8h=y}f(?e!KmC&u722Va+Q*{d^lR6-! zy2z|rUu4bItc?+GK)2K%m#_cxVX;LYJ5ytTh6oRvwUyPOhaa|PUssygasU1F>5G;I zt-N?K&~wt4DqBYZZf@?$lP711 zUaI@=*T1>3aoaXC7Dp4QUZ;f}N0Y37*Mh?50Y~!+<^$Wk?>${~HLKJrR!8jijT;Xv z^3u}Ma&vnVB^F=IFp%gvy69$3TvU{lw6wH@gvRvKn>TOH+8SkN{NthFQ=ScbKeL1G zCG(tg=Utfk_f_jcw76Q6o(pe{%5`==eBr`{=~diK3L&en-nD-+f!wy=cdd9TJ@`5ujBUU#j+gN?fTmRZD`$ zN~W)~vlCPV{P_4dYHgU@{k-k-?P_2ux^N!F-@@!_A!7*x1*vUuS1$ zHz}-Hw@$3vb^2-7%O*_<5^X#0zKhTi>vRF%I5KngY-6e3{yX-{o|9^lo?W{(t%lV# zu+?ed_1C;?%{8v?Obl#n{v6;Cam_TDrN3L(ePu|M%{IkB~?{j?YuBR zLBOKy&5S=Y!5%#Uit0Lp*=J>CWmm6Wy)?+P&&uZf_b*>gTo(LPCs!FdTc-5U#~&M$ zkIV2KKkR%`F)=46CoRowUsK|Yn>lhaGB)-9{(KYNe*5mNTdzJ=l-Y?NHfT}^(YiWa zOAa(1H*3}`D{E`{I`BcUs{Zm1E#4LF?31_Ow_}F{X#Sa_{cv${@gfZ~GqWlixj>P} zAAdZ1woIdoo11%ONLIB>pvcomsm(Wi0+s2KC-A5mNt=heNcYAyL{wwOBO26SS$09z4-v?8Swr<}ZzpF%Z{(1GuCtZ{r zFPD^;ZF?!2`R;C!uJpcTut_DB9YF85Yc>US4XMYm?`C)a@&ONpK zZHZB9uYvZ8Ov_(VS2_2_)7Jl>X_HNiP!9zu;^T^xV+ow;Tel~6M<(DQBJXf=} z#;q@wQD3 zP`m2m4+}on$n&*dere(;;Op!A>D?6e0FlyHS5`JQHdgK3S1Wk@qk2m0w7Yrsm7kvE z*L|Md+uN%hzAk2W+1db&FWrAwFI-rgP_7Pcqu{Y>NZ9yeuBwyU&}Yd$!^Yw4nk z85$y4IXP42Ysec*^&j_DyZrO>bNQca^6hi7)W9IF`t8@%Ja3qzqdErM9Np~GIMoWiPhXW0xp4Hs`f^$Eqgv~D)W)g zH9KSaT$K8A*xMC2`W~}2CswBm_C5CX_5D~;Q&O@eLZ_^}{QI|WdFNm4xSI#MAm_*1 z+uN^ZZB^h9aV?aYeln%*|L^GkoLhdo0(VUQ$w0S-ErP&Yur2 z$NH!RXJ@~D@j}D*a^3#_r_K0(d<$89HN)f=|NjsC{dZP3FIo|`R!&m#XZQXe+&{Vc z9?zXS*Vx$j`}_O(IXNaXeavS2-V11XT;c5OTwnkH!i5XH(&lOD>FVn0Ys0ejrq7-? zukUEm-@kwD|2*WM>!*JHbASB8JCS-aeEB&!K7M}xo~YZueDh{c#m7h0@AsOUnyQ-j zd8-Ho2M4!0DT;7y-MaOl8)$y^!HMP-pVvOFw3~eLg!*ck65R(16IE{BzaOtRz0~UN z&f@1xjR%;`Z@m2$yxi}kEVthri;bUui1)f(zH(*C>8CYz_vQ2z&G|F(^XvcpeEzp? z{~o~%bBjK6b93&d1tD7Hzx#y`8|=P&@9y2$_1Amd9y2fhlCxjKbCR|EA%is=Hx?EY z6ciS2T)K4W^5yBzMYudCEev?E{@<(hc0Zp??(OaMQJd_eX2?@)A>-`qY-?-l>+7pE zbyeK@+d11NtNUkdy~SR&X{OJzd-v`+C?uH8eyZ*3>udk-WB>E#&$Xv^MXe268DeW| zTmO4|y|uadbg!k$mM@=Z|D`S?H}~z^x3y2CLG7*sg2giy`4tr#&-Bp>^;-P#Ae-;Z zGhtS9S8XocI?GUkmuK76%If#YXQ-y)5+$|LuB);B-j>7o?4I@EL0mfLgvPn`R@T-Z_I?c28^ zu9Y_P`ug~`-~M}m*KP5}-Me=Ot(>58^WMFE#&r@rZQHh)wI#~kT#+E%wJ2)sw$-b- zT`xK)Z1}7*%l+Ert5;LE-}anzC%1Xuo_lYObP89y>##WPiF;haXOzI(6+@-L+xTJZ!&z{j!nkpK~EVWNXw~Wo2a(UumAUxswgb zcKQE(Y4yoD#~)XIy&ArJ*|KfhwsAB~n9fvXGw;0J@0_fxtjbDBM}f&FML1a6 z+S>NL+2{nyI2KFzg0KAi@u~g)zi0ZhX3d^o|8Tdm^7(f)86{u7<=1__mR4hYT^)OE2gD{r+FABkBKv1E=-t-%sw>|Nm>Pc|R}jT-)k(yLX$*_1Ay6 zm#<&<;a=YQ)nUfW&d%xcEwA6W@#Wd<|C{#hOEa2T|7r66!rgm!+p5mIBO$%}|HtF< z$F5!D-uWlZXyKC3wC<@F4V#GriAmk&$IZvv6D1BCd~%$|)%xh+UL}jZ?5(#pr=M5ia0p-2Lf zK76R!(ALH_`>dP55#{M!C%f-NMMYK26K8R>vq^t`ya_bmx!iB=q|>)6yZTN)HJW|a zqA&mcnh>q0-9?)jE9dj~J+7^-m6es1IezlL$0U^{wV?jR%fcCp_?nbT_sR9HOEFr> zF6X&?o7l5w-bW`nIY#D8yLRnD*_D+cTC-=*?&dBoTYfre<0O^N1syFOHpe-e6g-8_ ze?Ix-*{M@O+1b1O*4O_yZ?x1a)hK$3*HjfxoztPKbxvP%4XjG(U8E7V`s&Hf&inDZ zBGygW%WL=AFnVj0V?c<=k*OIeSw(9?H1>TjW!n(d)C(OU-vk$ z{rS(cXU}fkx}s*@Npow9ADaw#f;B{Tubt-<7-E|uL>%>9`)-xQY5J^nI%gZrVI zohm2SZ(E!CUVV|quH){FZ+>P9uzYmrI&9$c&ga8{xhB5yS95~bU-w=*sYd9c<8{#R zx6MMn;46j_yn5TSYjfAe{CXVNxkzJ^PV@|L3 z)#if&99u4!ye+Z%-S^ep#3Xn7d9!BCn`2e^?aYA#1<}#gO$su{pMKtHU7pu>Z)fq_SIhrBV_2Mc z<&_(Yqte8q_y4~8TeMS#V@u8E`4UYElTv7Z>|2zno)s z*v+eNL)+vq8F>z z?^Dy?b~9JpWo?+W^zQAOcCERX5m)$iaRKXX^BcrMb|wtc&{$I<=&KHJ~jQFt}O z=vPfIN7I$pIV(e&WSAH#YA$Ac3E%%K)Ij3R%a@jQe||VlXJ%kvu;~Pa|7_i}{~oA6 zd75Lkd*8mitx=kw6TmlbzPz&JQij>ruky3!&6zVt;(XfXsa~#ezb5%D4-22Z#j5vU z#)M#Zl}#4L#;IFx&7Soq?Dg}5Y)1oF*9NSGSoh95d6utIHqVT(Ni&)KrS1IWlYe4<+`Yf=^39uTL$tOpKKFP<$SL!@m~OXl zU9oI$@7KzU`T8DP&2?NGcKp@X)}5A33SX-BdMyppn)+#5OM>_6v+o=PTozxv^7_uF zPoLbB6#bo#CU5NQ+~}~tb-lR=*U#DJ>-~G~$4ACat6*_d@pP)_{QPrP(akr;=X(M~ zS{G&PjG4!M{?49CT^n&dv93u9*It)SJ}J_>PKf2^ojZRVDrJs~a$tE!?$mItFNvK(YhIxn^tz}Y1z)0JQl~UpGjtOd0VZv2m5XexYLnu zV)mDj4dy-fpJNfK@#I=^Ad6$w?_cp1AEzc5MCgSdJO1wf<@5j7d#$xA zeC4BX;m``xr(Qp=t$jW5=uz(Md~>s3rct_%0-rxWEWcm-yj=XgeRbZGCnt^dmRrxf zv%|dV`{jQ9>8GEj@Bch!PjE)`!T^r*=l(s4|8E(8!koQX-EU5v1s@{=-^A9|R?rbt z)1#m8^76`-fR?`;5Po9dDl6hDy5-Qzvg5)Vr%qL!miqc@)xv-ishj+!TZ_C3SuMHw z=%Y^+i!M&>?cJfkaWu(rs@JrxR<`x$v;NlnauRW!_t+(HN|{NZwrIC}+%5}q>(d7H zn>gKe96W=#q`ZkI276xKQI=X1wjCF$mwYje-% z-F#ctepq$A12;=ljGnl!HfK|T)m*p5oQDlr9M6b(gT}yojb{2RGwV(Bj*k9);zYTR z8n0ATX+5S#G|btTCS7oKh1o>`|DZ4 zhW+&q45uFiANg)=y_<)v+3mQFuG^&9CvQ}hl%~#9@L-ubi@C9}apA&;ljZu|7hlXW zky`rcb6TF()Ke)&iX2UeE8G@a7Je#;j$W~JsqZ_Z@YSKbY|5U2txo%5^sc@xl{uca zYnUtKYdrR$ZgBgBz}50uD&Y9vE|P+!c?Y^3~ z`KIZt*x$Sg9E;Mfq@T0BeD7YS!HlxF@C#gX{nlTv-}!f6*4A6^^UEw`WR8cfzWU!CUh>8eyh%sFu!wA z#QLy8o}-#S68RWzY;xt>v~Hu+}O*1EY|*;{X2d7{$yxG0`w*0Mqwa|s@{ z=7md_iaH8(UyWK9vP@k)_~etk<|UU`ZroV?et*5<{Ie@VrFagPRINRk6t+_0to%8y zDJq^KEH0A_c$7W4Tra*|-o5BV;n$>%JN~Y7^;Gd(^!~=iq(&( z^4+h2ofTA=gob42McA68;Tq*+WF?yt4-&h z-;P@tzWQp=$}4wwZ?~1}ukl)WFTp^fM_Kv4rdYR-l5b!C?VNA(?$vc4{lxOF#W8To zB8~OSKR%rvUuUGv^5DSTz18MYz3bMl&CRX7S9|2~$2~tDb?fTt?yUJYSvx#2jNL}j zV&3`ZMHY?*Jwl847!u~oo?5Z^@@rqW;)*o2sXjt1f?4lx+?&|1(Bb6B-mJUX*m!er z@X@4;X`9PSOHZf2dBZGnIHX5wUWac_Z)sWCM3uyiHFmx#p!R=s^vkbbHQW|VNxFWr zD@RQ_HuCDruVuS0KmI7h(zqyNY0$ixGxbD1&EGH3^~fU6L~_&49FM^YeOqeeBw>`}=Cux5;Tw^=eXhU{QBrYSZ%A ztwE8IkwGh`=uLlpGRB>O!Qv2K>J`J8XZ)7`zI=cP_712jTbhgyV) z$m}RuX(2wZ&@#u@*H@sFf#LU?05{pySKsCH#nilKQonLl%Jkdv_~;;!r{CF4qD3g@@1c1{iTd8>-T)Jowwe7+Oztv@AvQd@vqu!w)5IRVHHIVC(U@RC!eP{eSEW7 zzoh*8X@5}rbh)*W{r`Wv#e-Hp;jjB3KP79by}*vr$Eyxp*Pgm5XyvL9t(74~rKOhh z&%Z7`R$~{g@#JmU@1LK~Pwk%CEx+gY`v0H)OV#wIZ7$8$-fUpMU9f-uhfC$r(YNK- zO-P(EJ^r7ui%Z@A-QMBrYP^E3Jb3Wo@ODN9KGw>+xA^NmG_PBy$KseV%S@ugZ@KRL z^Z9vsPFEP&*9DyL@9EvPb&ntqTjDH1h7IRIkv{wET-jK4zq!v?_pRNV{QHZ9q~|2F z*=rYXe*MMxxs+7RC$4pKbIPjI{rlHnTz~mxq0IHyU*9eaSQ+zWhi&!x;>pe;zS_QO zpU*uzXPqdq?DES#d3(!TLDdgD(gKfC{pNd-Rw=`($*48OrQJ&hLT5D7`IZRp-wtDmJx3aRbv!$gsM)<70yhy`M zV9D*bmbK5;1g-Q*4|-WrRa+ao&%&nU&y52Mjz4w{Jo7$Z%`*semx>mPBS+JRs=cyv zW2L1zMO?GC-U|P3&d6Y4A<RDtlhv&08`?CazWfwDc z?W*ROv?W6BV$jXo53Eant-1Zybmke0zSkwY-p#XXzW5^d!&}+XjHsJ;@7}&}VMW;L ztFQL%)6UJz{9ILgaN4yDlU*A(Zrmp~RV8rw<)1aackk|981Veu>{z|+e#?&=HhV~9FIzN-MZ~OckbQUvu8j2&=a;gSz_xSzv`;rHuu^- ze*9frY`pQtuA4b;-@JMEUfy7)kBDoi*3@(7{e)0$C2k=yj_r>l5&1zj*X``PC7 zCX2q@{raHR`TDC_pUztNUD)EJ=YLP(%ZXX9zgnHXrs6rNz4p%e+V~|wC;xw%|37&1 z{*TM;|E|26ReR|a^8?QbK5B;_7C1XM-^{5?NSpoqXV%tV<@MjoU;6ypDITAjn`t=H zXLm32f$gvA|MmahwM*#dLuvaLFJBf~$bc%?2P=y;(n|$c4jSaVH+{j?nzUW*D8Eh1 zA`Rcm{hz;^v?Xdy{l%UC`|yStK`Za%&b@tD+5SUWfJo@dEByQKoO|rJ{k;muq{I{M zb#l9}{`p|R(BSN{`s%iA+g_FIYOlX=(p_S{WpUbH7NE*ctrUTW%d= zlXn!@5X|(ZKSpo+jvWPWZ%tjs<{zKG{qVzv&?yWJ%#8cLF)%#fNRn8#di87je_!Lz zpY_@E``r4;GkK!d%a;T`$TYO7dVcGww$16X(o#M?zIU}*W(*89)en~QGcd?FO0>;9 z`|RJoeMKv`NJRcRYX5)F_U-GJF1`Bpn_NlegA-cet2f@b_4lIn%aBVeuFtWwymRf= zuLE&L3=B8?LFMv;j3BM4dedLOxw)CeanH|Zvn{%=th(y8bWx&7R$JhzD;9mpyUmjr z9~fTE+Um75XluU@Q?0j`Rj0^_?-2__V)`zbQd47I=@$R`7Uu5+@&5zst>!teq3nELyR&Keq zcUL6ShS^rfL$#*X*tIW`a1`L`vZzeD@%rPJZ{MtB`u6T#!o+akUjt|w-(9BfvDea1 zKRzxDSfMM|e}B)Gi`0`yQ-bas4%T)rpyz*|sfPT5d)6%UVDC z{4?RA6vKm)jNnKX<2h_%W_IiCH}SZNd8yeyYZPan&C6ZNze}$`LsNunu3!50+fNs7 z6y<6STG`^7&CsCE^~ZyWp$MVD>LAea*urztw~cZP0xXVC{=YEbX_i|CQo!(F^-a@P5o`H) z4j1jzb$sxBvjT$(=fg_JNdZj?P-`02r(Iu>Y$hEbqA9}Fr0^!)@qwm#m(uw{ozqDY zt1e~~$k@N=0vmQ<;g;8ei`*7B3afNjCCvY56Tdc0rE|GP(AqG0@JImz!-EaCO2dwW zx|@^EKUa9w@Ha$n`u1(xK+TB^zFlHqV+uOnN|oNaecMnZGP3JRWSKoTlmAX1wat4r zJt?r5|(#@=-Ew5=0Y2jR-P!lQ+JJJUfRo&qC~qlA9w7Hdyi0Q zYqcTLS50{Bg2x*x%x2#`KkL9{ot+ao{QZAP?XjExenB>N&7hToiC*mBFsbpac9rc~^rq~0xBk8rL6^+e$M?D|ep*y{ zUyIp)sz=JlPfzd9^l4jnt}nr0MbJvVUC{k8JKl?DU31M zwadVM`wj#BuCHnJ!S(U+$;peO*4n+e1P+4(fgd6Q*&PJ}MYN}$I@&F+ANxzTE9v02 zzJT!llNkZ4uZS#F@MJp9DRZ2&$szE|Z9OR&Jy4Ywvi^GIJaN~JVXHUhtc}n(bH>lt zzwh|<#q0NeyY=Bifq{h03omf=AGr8&2gHKUKWlWv_JgjserYq{a?S&wW+-G_~VPO zRjp2i7p8&}Y{TNm-Y&9{Yr~@B;^xhq85zkhU11Z z&LSc=Z``+qZ9Dyx0)6*2Gu71hT>8LB_9Fpi&GR zuJa-;*hAu)p@0Qc_JBoY96{wcnCULy0-B9wU|={P$O6+wSm~GljFEw%8vEX4*?^4k MboFyt=akR{05H$3ssI20 literal 16574 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 diff --git a/docs/en/api-reference/network/esp_mesh.rst b/docs/en/api-reference/network/esp_mesh.rst index 299a8b9529..b5ae9efdf3 100644 --- a/docs/en/api-reference/network/esp_mesh.rst +++ b/docs/en/api-reference/network/esp_mesh.rst @@ -51,9 +51,9 @@ An application interfaces with ESP-MESH via **ESP-MESH Events**. Since ESP-MESH ESP-MESH System Events Delivery -The :cpp:type:`mesh_event_id_t` defines all possible ESP-MESH system events and can indicate events such as the connection/disconnection of parent/child. Before ESP-MESH system events can be used, the application must register a **Mesh Event Callback** via :cpp:func:`esp_mesh_set_config`. The callback is used to receive events from the ESP-MESH stack as well as the LwIP Stack and should contain handlers for each event relevant to the application. +The :cpp:type:`mesh_event_id_t` defines all possible ESP-MESH events and can indicate events such as the connection/disconnection of parent/child. Before ESP-MESH events can be used, the application must register a **Mesh Events handler** via :cpp:func:`esp_event_handler_register` to the default event task. Should contain handlers for each event relevant to the application. -Typical use cases of system events include using events such as :cpp:enumerator:`MESH_EVENT_PARENT_CONNECTED` and :cpp:enumerator:`MESH_EVENT_CHILD_CONNECTED` to indicate when a node can begin transmitting data upstream and downstream respectively. Likewise, :cpp:enumerator:`MESH_EVENT_ROOT_GOT_IP` and :cpp:enumerator:`MESH_EVENT_ROOT_LOST_IP` can be used to indicate when the root node can and cannot transmit data to the external IP network. +Typical use cases of mesh events include using events such as :cpp:enumerator:`MESH_EVENT_PARENT_CONNECTED` and :cpp:enumerator:`MESH_EVENT_CHILD_CONNECTED` to indicate when a node can begin transmitting data upstream and downstream respectively. Likewise, :cpp:enumerator:`IP_EVENT_STA_GOT_IP` and :cpp:enumerator:`IP_EVENT_STA_LOST_IP` can be used to indicate when the root node can and cannot transmit data to the external IP network. .. warning:: When using ESP-MESH under self-organized mode, users must ensure that no calls to Wi-Fi API are made. This is due to the fact that the self-organizing mode will internally make Wi-Fi API calls to connect/disconnect/scan etc. **Any Wi-Fi calls from the application (including calls from callbacks and handlers of Wi-Fi events) may interfere with ESP-MESH's self-organizing behavior**. Therefore, user's should not call Wi-Fi APIs after :cpp:func:`esp_mesh_start` is called, and before :cpp:func:`esp_mesh_stop` is called. @@ -81,8 +81,6 @@ The following code snippet demonstrates how to initialize LwIP for ESP-MESH appl */ ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP)); ESP_ERROR_CHECK(tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA)); - /* do not specify system event callback, use NULL instead. */ - ESP_ERROR_CHECK(esp_event_loop_init(NULL, NULL)); .. note:: @@ -108,12 +106,15 @@ The prerequisites for starting ESP-MESH is to initialize LwIP and Wi-Fi, The fol */ ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP)); ESP_ERROR_CHECK(tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA)); - /* do not specify system event callback, use NULL instead. */ - ESP_ERROR_CHECK(esp_event_loop_init(NULL, NULL)); + + /* event initialization */ + ESP_ERROR_CHECK(esp_event_loop_create_default()); /* Wi-Fi initialization */ wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&config)); + /* register IP events handler */ + ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL)); ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_FLASH)); ESP_ERROR_CHECK(esp_wifi_start()); @@ -134,6 +135,8 @@ The following code snippet demonstrates how to initialize ESP-MESH /* mesh initialization */ ESP_ERROR_CHECK(esp_mesh_init()); + /* register mesh events handler */ + ESP_ERROR_CHECK(esp_event_handler_register(MESH_EVENT, ESP_EVENT_ANY_ID, &mesh_event_handler, NULL)); .. _mesh-configuring-mesh: @@ -149,9 +152,6 @@ ESP-MESH is configured via :cpp:func:`esp_mesh_set_config` which receives its ar +==================+=====================================+ | Channel | Range from 1 to 14 | +------------------+-------------------------------------+ -| Event Callback | Callback for Mesh Events, | -| | see :cpp:type:`mesh_event_cb_t` | -+------------------+-------------------------------------+ | Mesh ID | ID of ESP-MESH Network, | | | see :cpp:type:`mesh_addr_t` | +------------------+-------------------------------------+ @@ -173,8 +173,6 @@ The following code snippet demonstrates how to configure ESP-MESH. mesh_cfg_t cfg = MESH_INIT_CONFIG_DEFAULT(); /* mesh ID */ memcpy((uint8_t *) &cfg.mesh_id, MESH_ID, 6); - /* mesh event callback */ - cfg.event_cb = &mesh_event_handler; /* channel (must match the router's channel) */ cfg.channel = CONFIG_MESH_CHANNEL; /* router */ diff --git a/examples/mesh/manual_networking/main/mesh_main.c b/examples/mesh/manual_networking/main/mesh_main.c index 57629abe8b..99ccfbe7f1 100644 --- a/examples/mesh/manual_networking/main/mesh_main.c +++ b/examples/mesh/manual_networking/main/mesh_main.c @@ -193,6 +193,7 @@ void mesh_event_handler(void *arg, esp_event_base_t event_base, child_disconnected->aid, MAC2STR(child_disconnected->mac)); } + break; case MESH_EVENT_ROUTING_TABLE_ADD: { mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; ESP_LOGW(MESH_TAG, "add %d, new:%d",