From 6a94e5ed93b33232a08c0d969ce317e80699a0c7 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski <6207777+grcevski@users.noreply.github.com> Date: Thu, 12 Sep 2024 10:56:05 -0400 Subject: [PATCH] Propagate context through TCP packets (#1161) --- bpf/http_types.h | 5 +- bpf/k_tracer.c | 92 +++++++++++++++--- bpf/protocol_http.h | 2 +- bpf/protocol_tcp.h | 2 +- bpf/tcp_info.h | 2 +- bpf/trace_common.h | 54 +++++++--- bpf/tracing.h | 16 ++- pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go | 6 ++ pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o | Bin 329848 -> 330248 bytes .../ebpf/gotracer/bpf_debug_arm64_bpfel.go | 6 ++ .../ebpf/gotracer/bpf_debug_arm64_bpfel.o | Bin 772112 -> 772512 bytes .../ebpf/gotracer/bpf_debug_x86_bpfel.go | 6 ++ .../ebpf/gotracer/bpf_debug_x86_bpfel.o | Bin 773632 -> 774032 bytes .../ebpf/gotracer/bpf_tp_arm64_bpfel.go | 6 ++ .../ebpf/gotracer/bpf_tp_arm64_bpfel.o | Bin 371736 -> 372144 bytes .../ebpf/gotracer/bpf_tp_debug_arm64_bpfel.go | 6 ++ .../ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o | Bin 865248 -> 865648 bytes .../ebpf/gotracer/bpf_tp_debug_x86_bpfel.go | 6 ++ .../ebpf/gotracer/bpf_tp_debug_x86_bpfel.o | Bin 866768 -> 867168 bytes .../ebpf/gotracer/bpf_tp_x86_bpfel.go | 6 ++ pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o | Bin 373216 -> 373624 bytes pkg/internal/ebpf/gotracer/bpf_x86_bpfel.go | 6 ++ pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o | Bin 331328 -> 331728 bytes pkg/internal/ebpf/httpssl/bpf_arm64_bpfel.go | 6 ++ pkg/internal/ebpf/httpssl/bpf_arm64_bpfel.o | Bin 243304 -> 244952 bytes .../ebpf/httpssl/bpf_debug_arm64_bpfel.go | 6 ++ .../ebpf/httpssl/bpf_debug_arm64_bpfel.o | Bin 400752 -> 404144 bytes .../ebpf/httpssl/bpf_debug_x86_bpfel.go | 6 ++ .../ebpf/httpssl/bpf_debug_x86_bpfel.o | Bin 401936 -> 405328 bytes .../ebpf/httpssl/bpf_tp_arm64_bpfel.go | 6 ++ .../ebpf/httpssl/bpf_tp_arm64_bpfel.o | Bin 258568 -> 259464 bytes .../ebpf/httpssl/bpf_tp_debug_arm64_bpfel.go | 6 ++ .../ebpf/httpssl/bpf_tp_debug_arm64_bpfel.o | Bin 418840 -> 422336 bytes .../ebpf/httpssl/bpf_tp_debug_x86_bpfel.go | 6 ++ .../ebpf/httpssl/bpf_tp_debug_x86_bpfel.o | Bin 420024 -> 423520 bytes pkg/internal/ebpf/httpssl/bpf_tp_x86_bpfel.go | 6 ++ pkg/internal/ebpf/httpssl/bpf_tp_x86_bpfel.o | Bin 259752 -> 260648 bytes pkg/internal/ebpf/httpssl/bpf_x86_bpfel.go | 6 ++ pkg/internal/ebpf/httpssl/bpf_x86_bpfel.o | Bin 244496 -> 246144 bytes pkg/internal/ebpf/ktracer/bpf_arm64_bpfel.go | 6 ++ pkg/internal/ebpf/ktracer/bpf_arm64_bpfel.o | Bin 333896 -> 354512 bytes .../ebpf/ktracer/bpf_debug_arm64_bpfel.go | 6 ++ .../ebpf/ktracer/bpf_debug_arm64_bpfel.o | Bin 514496 -> 542120 bytes .../ebpf/ktracer/bpf_debug_x86_bpfel.go | 6 ++ .../ebpf/ktracer/bpf_debug_x86_bpfel.o | Bin 514344 -> 541968 bytes .../ebpf/ktracer/bpf_tp_arm64_bpfel.go | 6 ++ .../ebpf/ktracer/bpf_tp_arm64_bpfel.o | Bin 349136 -> 368992 bytes .../ebpf/ktracer/bpf_tp_debug_arm64_bpfel.go | 6 ++ .../ebpf/ktracer/bpf_tp_debug_arm64_bpfel.o | Bin 532584 -> 560312 bytes .../ebpf/ktracer/bpf_tp_debug_x86_bpfel.go | 6 ++ .../ebpf/ktracer/bpf_tp_debug_x86_bpfel.o | Bin 532440 -> 560168 bytes pkg/internal/ebpf/ktracer/bpf_tp_x86_bpfel.go | 6 ++ pkg/internal/ebpf/ktracer/bpf_tp_x86_bpfel.o | Bin 348872 -> 368736 bytes pkg/internal/ebpf/ktracer/bpf_x86_bpfel.go | 6 ++ pkg/internal/ebpf/ktracer/bpf_x86_bpfel.o | Bin 333640 -> 354256 bytes 55 files changed, 281 insertions(+), 36 deletions(-) diff --git a/bpf/http_types.h b/bpf/http_types.h index f6e42e440..f9f86bda4 100644 --- a/bpf/http_types.h +++ b/bpf/http_types.h @@ -175,12 +175,13 @@ const u8 ip4ip6_prefix[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}; #ifdef BPF_DEBUG static __always_inline void dbg_print_http_connection_info(connection_info_t *info) { - bpf_dbg_printk("[http] s_h = %llx, s_l = %llx, d_h = %llx, d_l = %llx, s_port=%d, d_port=%d", + bpf_dbg_printk("[conn] s_h = %llx, s_l = %llx, s_port=%d", *(u64 *)(&info->s_addr), *(u64 *)(&info->s_addr[8]), + info->s_port); + bpf_dbg_printk("[conn] d_h = %llx, d_l = %llx, d_port=%d", *(u64 *)(&info->d_addr), *(u64 *)(&info->d_addr[8]), - info->s_port, info->d_port); } #else diff --git a/bpf/k_tracer.c b/bpf/k_tracer.c index 85781862e..2053ddf1a 100644 --- a/bpf/k_tracer.c +++ b/bpf/k_tracer.c @@ -10,6 +10,8 @@ char __license[] SEC("license") = "Dual MIT/GPL"; +#define TC_SYN_PACKET_ID 0xdeadf00d + // Temporary tracking of accept arguments struct { __uint(type, BPF_MAP_TYPE_LRU_HASH); @@ -186,6 +188,39 @@ int BPF_KPROBE(kprobe_tcp_connect, struct sock *sk) { bpf_dbg_printk("=== tcp connect %llx ===", id); + tp_info_pid_t *tp_p = tp_buf(); + + // Connect runs before the SYN packet is sent. + // We use this opportunity to setup a trace context information for the connection. + // We'll later query the trace information in tc_egress, and serialize it on the TCP packet. + // Why would we do this here instead of on the tc_egress itself? We could move this on the tc_egress, + // but we would be modifying all packets, not just for processes which are instrumented, + // since we can't reliably tell the process PID in TC or socket filters. + if (tp_p) { + tp_p->tp.ts = bpf_ktime_get_ns(); + tp_p->tp.flags = 1; + tp_p->valid = 1; + tp_p->pid = TC_SYN_PACKET_ID; // set an ID up here in case someone else is doing what we are doing + urand_bytes(tp_p->tp.span_id, SPAN_ID_SIZE_BYTES); + tp_info_pid_t *server_tp = find_parent_trace(); + if (server_tp && valid_trace(server_tp->tp.trace_id)) { + __builtin_memcpy(tp_p->tp.trace_id, server_tp->tp.trace_id, sizeof(tp_p->tp.trace_id)); + __builtin_memcpy(tp_p->tp.parent_id, server_tp->tp.span_id, sizeof(tp_p->tp.parent_id)); + } else { + urand_bytes(tp_p->tp.trace_id, TRACE_ID_SIZE_BYTES); + __builtin_memset(tp_p->tp.parent_id, 0, sizeof(tp_p->tp.span_id)); + } + + connection_info_t conn = {}; + parse_sock_info(sk, &conn); + sort_connection_info(&conn); + + bpf_dbg_printk("Setting up tp info"); + dbg_print_http_connection_info(&conn); + + bpf_map_update_elem(&outgoing_trace_map, &conn, tp_p, BPF_ANY); + } + u64 addr = (u64)sk; sock_args_t args = {}; @@ -232,7 +267,7 @@ int BPF_KRETPROBE(kretprobe_sys_connect, int fd) sort_connection_info(&info.p_conn.conn); info.p_conn.pid = pid_from_pid_tgid(id); info.orig_dport = orig_dport; - + bpf_map_update_elem(&pid_tid_to_conn, &id, &info, BPF_ANY); // to support SSL } @@ -678,17 +713,35 @@ int app_ingress(struct __sk_buff *skb) { return 0; } - unsigned char buf[12]; + // handle SYN only, ignore SYN+ACK packets + if (!tcp_syn(&tcp) || tcp_ack(&tcp)) { + return 0; + } - if (tcp_syn(&tcp) && !tcp_ack(&tcp)) { - bpf_skb_load_bytes(skb, tcp.hdr_len, &buf, 4); + if (skb->len - tcp.hdr_len < sizeof(tp_info_pid_t)) { + bpf_printk("SYN packet without tp info"); + return 0; + } + + tp_info_pid_t tp = {0}; - s32 len = skb->len-sizeof(u32); - bpf_printk("SYN packed len = %d, offset = %d, hdr_len %d", skb->len, len, tcp.hdr_len); + bpf_skb_load_bytes(skb, tcp.hdr_len, &tp, sizeof(tp_info_pid_t)); - bpf_printk("***Data: %x%x", buf[3], buf[2]); - bpf_printk("***Data: %x%x", buf[1], buf[0]); + if (tp.pid != TC_SYN_PACKET_ID) { + bpf_printk("SYN packet without the custom ID inside pid, ignoring..."); + return 0; } + + s32 len = skb->len-sizeof(u32); + bpf_printk("Received SYN packed len = %d, offset = %d, hdr_len %d", skb->len, len, tcp.hdr_len); + + unsigned char tp_buf[TP_MAX_VAL_LENGTH]; + make_tp_string(tp_buf, &tp.tp); + bpf_printk("tp: %s", tp_buf); + + // Once we receive a traceID over the wire (TCP packet) we store it for later to be used by the trace code. + bpf_map_update_elem(&incoming_trace_map, &conn, &tp, BPF_ANY); + return 0; } @@ -703,17 +756,26 @@ int app_egress(struct __sk_buff *skb) { return 0; } + // handle SYN only, ignore SYN+ACK packets + if (!tcp_syn(&tcp) || tcp_ack(&tcp)) { + return 0; + } + sort_connection_info(&conn); - if (tcp_syn(&tcp) && !tcp_ack(&tcp)) { + tp_info_pid_t *tp = bpf_map_lookup_elem(&outgoing_trace_map, &conn); + + if (tp) { bpf_printk("SYN packed len = %d", skb->len); - u32 val=0xdeadf00d; + unsigned char tp_buf[TP_MAX_VAL_LENGTH]; + make_tp_string(tp_buf, &tp->tp); + bpf_printk("tp: %s", tp_buf); uint16_t pkt_end = skb->data_end - skb->data; bpf_printk("Changing tail and setting data on syn, end=%d", pkt_end); - bpf_skb_change_tail(skb, pkt_end + sizeof(val), 0); - bpf_skb_store_bytes(skb, pkt_end, &val, sizeof(val), 0); + bpf_skb_change_tail(skb, pkt_end + sizeof(tp_info_pid_t), 0); + bpf_skb_store_bytes(skb, pkt_end, tp, sizeof(tp_info_pid_t), 0); u32 offset_ip_tot_len = 0; u32 offset_ip_checksum = 0; @@ -724,10 +786,10 @@ int app_egress(struct __sk_buff *skb) { offset_ip_tot_len = ETH_HLEN + offsetof(struct ipv6hdr, payload_len); } - u16 new_tot_len = bpf_htons(bpf_ntohs(tcp.tot_len) + sizeof(val)); + u16 new_tot_len = bpf_htons(bpf_ntohs(tcp.tot_len) + sizeof(tp_info_pid_t)); - bpf_printk("tot_len = %d, tot_len_alt = %d, new_tot_len = %d", tcp.tot_len, bpf_ntohs(tcp.tot_len), new_tot_len); - bpf_printk("new_tot_len_alt = %d, h_proto = %d, skb->len = %d", bpf_ntohs(new_tot_len), tcp.h_proto, skb->len); + bpf_printk("tot_len = %u, new_tot_len = %u", bpf_ntohs(tcp.tot_len), bpf_ntohs(new_tot_len)); + bpf_printk("h_proto = %u, skb->len = %u", tcp.h_proto, skb->len); if (offset_ip_checksum) { bpf_l3_csum_replace(skb, offset_ip_checksum, tcp.tot_len, new_tot_len, sizeof(u16)); diff --git a/bpf/protocol_http.h b/bpf/protocol_http.h index 700d74ec4..9e0edc644 100644 --- a/bpf/protocol_http.h +++ b/bpf/protocol_http.h @@ -263,7 +263,7 @@ int protocol_http(void *ctx) { if (meta->type == EVENT_HTTP_CLIENT && !valid_span(tp_p->tp.parent_id)) { bpf_dbg_printk("Looking for trace id of a client span"); tp_info_pid_t *server_tp = find_parent_trace(); - if (server_tp && server_tp->valid) { + if (server_tp && server_tp->valid && valid_trace(server_tp->tp.trace_id)) { bpf_dbg_printk("Found existing server span for id=%llx", bpf_get_current_pid_tgid()); __builtin_memcpy(info->tp.trace_id, server_tp->tp.trace_id, sizeof(info->tp.trace_id)); __builtin_memcpy(info->tp.parent_id, server_tp->tp.span_id, sizeof(info->tp.parent_id)); diff --git a/bpf/protocol_tcp.h b/bpf/protocol_tcp.h index 71b2e124a..242772b46 100644 --- a/bpf/protocol_tcp.h +++ b/bpf/protocol_tcp.h @@ -50,7 +50,7 @@ static __always_inline void handle_unknown_tcp_connection(pid_connection_info_t tp_info_pid_t *server_tp = find_parent_trace(); - if (server_tp && server_tp->valid) { + if (server_tp && server_tp->valid && valid_trace(server_tp->tp.trace_id)) { bpf_dbg_printk("Found existing server tp for client call"); __builtin_memcpy(req->tp.trace_id, server_tp->tp.trace_id, sizeof(req->tp.trace_id)); __builtin_memcpy(req->tp.parent_id, server_tp->tp.span_id, sizeof(req->tp.parent_id)); diff --git a/bpf/tcp_info.h b/bpf/tcp_info.h index d6b1513a6..dc38b3c41 100644 --- a/bpf/tcp_info.h +++ b/bpf/tcp_info.h @@ -101,7 +101,7 @@ static __always_inline bool read_sk_buff(struct __sk_buff *skb, protocol_info_t tcp->h_proto = h_proto; tcp->hdr_len += doff; - if ((skb->len - tcp->hdr_len) < 0) { // less than 0 is a packet we can't parse + if (tcp->hdr_len > skb->len) { // bad packet, hdr_len is greater than the skb len, we can't parse this. return false; } diff --git a/bpf/trace_common.h b/bpf/trace_common.h index 6941cf1df..a15afc50c 100644 --- a/bpf/trace_common.h +++ b/bpf/trace_common.h @@ -156,6 +156,14 @@ static __always_inline void delete_server_trace(trace_key_t *t_key) { // bpf_dbg_printk("Deleting server span for id=%llx, pid=%d, ns=%d, res = %d", bpf_get_current_pid_tgid(), t_key->p_key.pid, t_key->p_key.ns, res); } +static __always_inline u8 valid_span(unsigned char *span_id) { + return *((u64 *)span_id) != 0; +} + +static __always_inline u8 valid_trace(unsigned char *trace_id) { + return *((u64 *)trace_id) != 0 && *((u64 *)(trace_id + 8)) != 0; +} + static __always_inline void server_or_client_trace(http_connection_metadata_t *meta, connection_info_t *conn, tp_info_pid_t *tp_p) { if (!meta) { return; @@ -196,27 +204,47 @@ static __always_inline void get_or_create_trace_info(http_connection_metadata_t if (meta) { if (meta->type == EVENT_HTTP_CLIENT) { + // Before this change the client code only looked for a server wrapped trace and + // if it didn't find it would generate the trace information later. Now we look if + // the TC egress has setup TCP trace info for us. If we find this info we set the bool as having trace info, + // i.e. we must not regenerate it later. The kprobe on 'tcp_connect' does the lookup of the server trace + // for us, so the server context should already be setup. + tp_info_pid_t *in_tp = bpf_map_lookup_elem(&outgoing_trace_map, conn); tp_p->pid = -1; // we only want to prevent correlation of duplicate server calls by PID - tp_info_pid_t *server_tp = find_parent_trace(); - - if (server_tp && server_tp->valid) { + if (in_tp) { found_tp = 1; - bpf_dbg_printk("Found existing server tp for client call"); - __builtin_memcpy(tp_p->tp.trace_id, server_tp->tp.trace_id, sizeof(tp_p->tp.trace_id)); - __builtin_memcpy(tp_p->tp.parent_id, server_tp->tp.span_id, sizeof(tp_p->tp.parent_id)); + tp_p = in_tp; + } else { + tp_info_pid_t *server_tp = find_parent_trace(); + + if (server_tp && server_tp->valid && valid_trace(server_tp->tp.trace_id)) { + found_tp = 1; + bpf_dbg_printk("Found existing server tp for client call"); + __builtin_memcpy(tp_p->tp.trace_id, server_tp->tp.trace_id, sizeof(tp_p->tp.trace_id)); + __builtin_memcpy(tp_p->tp.parent_id, server_tp->tp.span_id, sizeof(tp_p->tp.parent_id)); + } } } else { //bpf_dbg_printk("Looking up existing trace for connection"); //dbg_print_http_connection_info(conn); - tp_info_pid_t *existing_tp = trace_info_for_connection(conn); - - if (correlated_requests(tp_p, existing_tp)) { + // For server requests, we first look for TCP info (setup by TC ingress) and then we fall back to black-box info. + tp_info_pid_t *existing_tp = bpf_map_lookup_elem(&incoming_trace_map, conn); + if (existing_tp) { found_tp = 1; - bpf_dbg_printk("Found existing correlated tp for server request"); + bpf_dbg_printk("Found incoming (TCP) tp for server request"); __builtin_memcpy(tp_p->tp.trace_id, existing_tp->tp.trace_id, sizeof(tp_p->tp.trace_id)); __builtin_memcpy(tp_p->tp.parent_id, existing_tp->tp.span_id, sizeof(tp_p->tp.parent_id)); - } + } else { + existing_tp = trace_info_for_connection(conn); + + if (correlated_requests(tp_p, existing_tp)) { + found_tp = 1; + bpf_dbg_printk("Found existing correlated tp for server request"); + __builtin_memcpy(tp_p->tp.trace_id, existing_tp->tp.trace_id, sizeof(tp_p->tp.trace_id)); + __builtin_memcpy(tp_p->tp.parent_id, existing_tp->tp.span_id, sizeof(tp_p->tp.parent_id)); + } + } } } @@ -276,8 +304,4 @@ static __always_inline void get_or_create_trace_info(http_connection_metadata_t return; } -static __always_inline u8 valid_span(unsigned char *span_id) { - return *((u64 *)span_id) != 0; -} - #endif \ No newline at end of file diff --git a/bpf/tracing.h b/bpf/tracing.h index d7c2cdb16..b9e90f7a6 100644 --- a/bpf/tracing.h +++ b/bpf/tracing.h @@ -15,6 +15,20 @@ struct { __uint(pinning, LIBBPF_PIN_BY_NAME); } trace_map SEC(".maps"); +struct { + __uint(type, BPF_MAP_TYPE_LRU_HASH); + __type(key, connection_info_t); // key: the connection info + __type(value, tp_info_pid_t); // value: traceparent info + __uint(max_entries, MAX_CONCURRENT_REQUESTS); +} incoming_trace_map SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_LRU_HASH); + __type(key, connection_info_t); // key: the connection info + __type(value, tp_info_pid_t); // value: traceparent info + __uint(max_entries, MAX_CONCURRENT_REQUESTS); +} outgoing_trace_map SEC(".maps"); + static __always_inline void make_tp_string(unsigned char *buf, tp_info_t *tp) { // Version *buf++ = '0'; *buf++ = '0'; *buf++ = '-'; @@ -34,7 +48,7 @@ static __always_inline void make_tp_string(unsigned char *buf, tp_info_t *tp) { } static __always_inline tp_info_pid_t *trace_info_for_connection(connection_info_t *conn) { - return (tp_info_pid_t *)bpf_map_lookup_elem(&trace_map, conn); + return (tp_info_pid_t *)bpf_map_lookup_elem(&trace_map, conn); } static __always_inline u64 current_epoch(u64 ts) { diff --git a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go index 5ccf20278..b51d548f6 100644 --- a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go @@ -262,6 +262,7 @@ type bpfMapSpecs struct { FetchRequests *ebpf.MapSpec `ebpf:"fetch_requests"` GoTraceMap *ebpf.MapSpec `ebpf:"go_trace_map"` GolangMapbucketStorageMap *ebpf.MapSpec `ebpf:"golang_mapbucket_storage_map"` + IncomingTraceMap *ebpf.MapSpec `ebpf:"incoming_trace_map"` KafkaRequests *ebpf.MapSpec `ebpf:"kafka_requests"` Newproc1 *ebpf.MapSpec `ebpf:"newproc1"` OngoingClientConnections *ebpf.MapSpec `ebpf:"ongoing_client_connections"` @@ -282,6 +283,7 @@ type bpfMapSpecs struct { OngoingServerConnections *ebpf.MapSpec `ebpf:"ongoing_server_connections"` OngoingSqlQueries *ebpf.MapSpec `ebpf:"ongoing_sql_queries"` OngoingStreams *ebpf.MapSpec `ebpf:"ongoing_streams"` + OutgoingTraceMap *ebpf.MapSpec `ebpf:"outgoing_trace_map"` ProduceRequests *ebpf.MapSpec `ebpf:"produce_requests"` ProduceTraceparents *ebpf.MapSpec `ebpf:"produce_traceparents"` RedisWrites *ebpf.MapSpec `ebpf:"redis_writes"` @@ -311,6 +313,7 @@ type bpfMaps struct { FetchRequests *ebpf.Map `ebpf:"fetch_requests"` GoTraceMap *ebpf.Map `ebpf:"go_trace_map"` GolangMapbucketStorageMap *ebpf.Map `ebpf:"golang_mapbucket_storage_map"` + IncomingTraceMap *ebpf.Map `ebpf:"incoming_trace_map"` KafkaRequests *ebpf.Map `ebpf:"kafka_requests"` Newproc1 *ebpf.Map `ebpf:"newproc1"` OngoingClientConnections *ebpf.Map `ebpf:"ongoing_client_connections"` @@ -331,6 +334,7 @@ type bpfMaps struct { OngoingServerConnections *ebpf.Map `ebpf:"ongoing_server_connections"` OngoingSqlQueries *ebpf.Map `ebpf:"ongoing_sql_queries"` OngoingStreams *ebpf.Map `ebpf:"ongoing_streams"` + OutgoingTraceMap *ebpf.Map `ebpf:"outgoing_trace_map"` ProduceRequests *ebpf.Map `ebpf:"produce_requests"` ProduceTraceparents *ebpf.Map `ebpf:"produce_traceparents"` RedisWrites *ebpf.Map `ebpf:"redis_writes"` @@ -343,6 +347,7 @@ func (m *bpfMaps) Close() error { m.FetchRequests, m.GoTraceMap, m.GolangMapbucketStorageMap, + m.IncomingTraceMap, m.KafkaRequests, m.Newproc1, m.OngoingClientConnections, @@ -363,6 +368,7 @@ func (m *bpfMaps) Close() error { m.OngoingServerConnections, m.OngoingSqlQueries, m.OngoingStreams, + m.OutgoingTraceMap, m.ProduceRequests, m.ProduceTraceparents, m.RedisWrites, diff --git a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o index dbc05699f6f23b1beb0cfe76ceac642a168356d2..468a1458659840b3c62013b260806d7c4d88696f 100644 GIT binary patch literal 330248 zcmeEv34mNxmG-OdRCf~~9Rl^zG-xUzG%>P-MF
BuACG33q2?D*K7wn2c9IE_^!sw zd5(U3H^ )erFZ`CCvYyG``+B zk+T2A^-Db}@_ky*iTp>-Z|{?if_`f6f0TAX<9zM?kFr0;_LIdA=)Tx3lCNt2V;%n) z`##8bW#IP1#dR$r{{WPMi`o~phkEUMd>^DeXAbR?-g3c#tl#l{kjq$a#pR0?E>gHq z;e3S!g>x0oQ8-IsUSXTU$qL1v)BbDozp8zZvOF2sI*mWB)BD +pRx?oV2C4$zOlD>Gsc9z%VviV7^=grZdSAWP1t=}jv514N)J~VDy zeQccTUOqN`#+!t1uJK!3UUB&lms3?=S)Qo5kHUZMv-0E3!Y9}K6{!dMPr7Vf!_N1q zS5A6 n&1m|6Dq0zc%kGwo5y<{Sbcr57F{y-6k6pSkB^d(LbGAG3s+&svUO* zcd|XI_8%`}ww3+IU`kWVTJq3%S$*F8TbXa&{l|U6pV}i`d) )UhW1PeYn9{sU)pbS!9}c>Y;ZA`Q%~=tKY!jH>%ODs zqn*uGz54CU=HDi7t@i2H%j{w8YVZ!O7Us{oZm~sZ^4m6)w>LXI`}S97-J)%O79i4d zQLOz%+Mz`Hy<(& 2(aNzl}e&^zDx)<_Biy&fxd_yy>q;@jiF&`-ZDf zgZk&O?_hto=ZWfm<>$ ?Ps>1KCK@=AN6x%&6f@2cT7y5@qO~# z@7s&`jqh`3cgA_?bEH2-W7wv1Ac{%$`JW@{=-e9oNBZ%7?xc}u;uhB1_@ePNMF1 zg#RogEx});yAH dY%ojK4J9~v51k$t(&yG%zt*kikJ@>($?q!aIj{B| zqTlb)_~G}fG+#*ftLc6?EzjUo5jb{3jO^>VtF|vb*QD#wD}`UK`Q40I{nGVH%W2QA zHV)c+sMd4XF4Qyq{8^8m%@=Epzy5Qim22Z~ym=SfHP?JI*Tc@!%4KepdSRYLS8<&@ zFBI2}K0h}8Rxdk0q8WX39(<@i{`~OSJcsSBp_j_@;|vlvuzBZbdKqnAV(;&BI9HG6 zQ=OUAxzwS~14G#tWcH8r+{#GzVML)Uut#AN%N2z>4-9EkqWzsZ4@~w$%V1{T-zDcw zcX4vwUqw5UNRPxJ%ezGAIZNzf`mUbm%eukyVMo$%+K#60D*N|W EU;z z_h;kp&&jSY+WcPZMdv)wPB-6fHSO9bdP& i)+hA? !XhuS_6`);QyovxSJd;g@L@%*e@qkm|9zsN!QrY PvyUJRQ{$vvsbP0 z&L5|&yt?v+BCpxgmwTrtx0P%BV*Q }+rS~Z&=izoseQNRX`?I7T$vzj^7i)aXuWIRKZ2r8r-@_2Us_04l%ihoX z_5ZNeU-~l{?`ox6ujxjtTj=ktRLXho_IRj QCJ>$tU9{Sm|cMwC;}U!J>t z>dZ%8wBO0t!|lSi^MfPoZ0k~*&WT>q;}-cb?YJ)9vzGahooT>`+TX=AO|SE~yC+I~ z@tzWgSAMTn{GsxDwTm@g7SM|A%akTA^nPRo)2?q0(^0$dBRR4ZKXDbu`{U(U)`8N` z9X ;&pOd(@;grxMgB_vFeLR!&V?&0y -Wc=J0S3I!VKjYI z?68~bMS3F7?e@MS7y7fQc(GF@{TDgje)rp+!|c6gF7vA@z3m>wPPyP`oW8P;V4Ko3 ztD$~D%8!$Cqr^`t=SGQtROAzXs?d*C$wSZWe!HkO9_+1M4BC5uz9E%U%JuC*{Zl>v ztehk8N^;i`cC43=dhRqo>bK9vojy09vK}&x`IA1Vt9#+j37ALSM~&~vPpt|k%SIh@ zIUL`IG9>@p0|!i>TTq-Q{!m;eelWO&N`dc!$xgCkpV0n1n1(dsmj|pmCt#HHg<9$R z5r~V{N63$<9GWSSK9h3r%#xfFutnOJKmJ-is<+k8&;Puh6M#ZUzScGPgUiHnE z=5th!F4c?eOI(S1l8Z+juVMT6;gm1xIGw}seJsP3&=1uQ-`7g|Eg*1_opz+krF5}A zFPR?fJ(<}pnP;n9wd}is`AC0|r1#2A`v=v>%Inham;HK4eb1^>-!rwoXQb*|V4CF4 zf`76uL`ucw^PdYkdWrr{2 Eo1sxzfif{W7JGQTlMDk5>9HrC+IZyVA3jK2+&fC@nv5 z;v9J=l|NPEk5XC|cAb;wMEt&x#viHihbTQ$>4TM~(Uka2QF?~b2Pr*W>B&mxm2Opf zn$nY$e!0>ID*ZC04^Wy`A*sCml|D@AiAu{l1J<{dmIXVkb1O})jq=luShVvl`YYqw zL4ef1{t68!j I^Til$R3 zQVzlNI*XlC^L(F&UH^GT{2^`=zZ`#_A*;yvNERP|o{@Rn|CQ&Nc T}ftBt7~$Oe5w~K9o)ZM7rKoul(X_dG4@zWv%sadfxWu zrBr_9dn@Um)B6@{t*`pe2Ud^z-&;xlY L5t4G(FmVzD2QBb~lfkizR+V&F`=dG3YcX^3nPyc{GU0)oO zY0MvS{Zr)Wwe!LIMb3C&y~sV=XsJiMX@i7Yz1l6Eg!}6+rBVE{vi@=xEADpuB~P*6 zy(Jo^#_w `tndOHzt;lS2`KdSnjCez{M z_i~ePVG~?2xkOo$-}@}KOFtSr@$X{0^slj=Z&z$z%z8-Xwc4L$gFfa{yk|1UQ-4R- zzW?6CEY6?f+RAzgv8w-lW1iE;{gTg~d#Qg|i+sh|EgVnlD3gh9Zxi{b^TL%4UdPbR zpMzSmQyTpg=L@m|oS^2(kt;nBweeK_MKy#*+*4fk)lmU<2uaQrZpmBog8TU(l zj=5_tD9{gxKC^-8orAIO`B%e~K9~6~sehk@cV>Pr-!s #zP^@dl26LgTBySM1{WA&sy8Ua_0wAJ_Qm?-iGD{7#LR?;6iTW%CH9? h`8zbf@bUAD{IWjl`m4WJl=8Q0{`B{XnczAuU)G~t|F=0^h5z5`_l#u@ zx8Ey13i8+fo^ckZBfqNsJ>%a?ybJ^QJqPjMc(dfIe9u_obmlL)#*cAHw2lM)~Hy z^aO79UxME`hg%F2jiChV^7A=gg}yLFOMhVT=Kt0&bWgk_m3~o*elyd4e_3lBxAn^O zdbpo&73B8U)8~Rt&j-@^)6Zolzt8tJ@NwFIR-Lo0 c8-x?FQ3fpV?1`so!w}a{e^ca~nnIHTLtv<=pD3 zdd(C@_0JFA!gj05XZkot@>lj%%X!&*(@%2Fwbt9+d%u*E9a+EDb5*`eQsvyYS<)le z*GKC@O%FbFRi7U&ze_=V@rZl{N)0`e(Qqa8*?6CngLXI~y|zoYn3LByKV16l=<+Vk zAI-Z`;OuUOZs0-T3qKjb_Xy!veSWx{V_nw{s>ejH$|st4m6oUHUf(O{V7pE79=NWZ zIz^6Tzw@R~iM$9NA@3ZO7xkbkDPQNk?!K+H^QG*Rl(X@Zl76iERz6krsN*+P>5de+ z^=Bi4%h33^ot`D((d;EGPc-prf%BF!bOV1Ya-!ZN^r3op1E1meeLp{Z1?S5KmolvE z-`mc#-(S^xZ%5rjWxn|oS7faDY#*7OGu5N>rFfOh3){TDhZxiNwVR;Y|90SOa97?3 zeiIbtU;4hD;z>pJyleZ^Uby#!KcwPEycd}aI_glpOyOugkD6*2bv(%dQTPNy8YlQY z;RZ>UeCNDbXxd-Blg1+_H0gu*_~+756!FOeR=pog e*JTY-97J{#Zt@5$2sLSvEX z-OdxY=b4r8CyI|cp26Q*e*7~IAMG4*u)sPzCrkFh#{)91_jcUI5#+aYb$4u4_#nfm zL)P_udFCRf{(0lndybTI7N?hW5uZ<6QA4fyPol;*br*;K@FGProna`lZJgTc54$1DEHz%V2lvu;MK;zexIJuYaU=R;xcI z&F2Ey;B4=Y%>St!(w+XDqqJP?O~`Y5ka8<4tNmF-OhwCd-~3$u?9^dmo?6$a`78T~PXTd6bVtOwJ+B e`kmiE>gepu;481{zuC@l@JHxz~0 zdUS92evOy@u{V6L($fF+hGKx8jI2ZVhU+z+tWV|trP9*>^oFu-*pneGQT#fMm;R$S zTq|_*OoqKTe@x?N2pw)=nB~<-%+qe($aL{$k-K=alwZ7A_?X?}`(*ym8w$VPn}v_N z@-EI#>&-2|T$kjxb$Hh;^`qxy>i=BV-I5;0A`RO*ysclm?)OPN(lfs+MPCb!;NZYr zCHkc2H|BTc2P8epXMSf%x& RcP-Nk)IZ%-qR)hX*E=P>$$KV~ zSbrSic4+duEB`{$nI5{uP9}%z7CR<-xa!@K9`#_kPZGWh#BBV0nn%zAakHR!f%J<# zUE+U ?fVITJe`9S zQHRLkhtK8kk8*xLJkQ}$4?lbshkv9hJ=r BE&SD@{^U z{?95c4%r=UQ<`c^@t HtuLFWRDH+VC3>Rg@EJhKPe`?-*9o|v|L>TkUD~-PG_RxbY<~ZOeb@XVfB$Op zandWzh)A!bLd5`w)nW;;Dx*y~lbU+Vg2&(tO&!ruQnp=qIU0uFt?!75UQVE-&Nc zJWrnjw4VR{Z?P|Zhe$JRv-7^%_hC_2a?V6NWr#zHv!xwdd$sml@dH^urSjlfK{Q+F z-u9nx`|obwrTu`++w44uy5~>G^nlO7rsuJ=-E5yw`aP8Y-m2F6tvy$!^HtSb=cC1W zT5p{XkQ{4OM+B(8uLB&sN&=~!zy!(p|Ne7REqQF5=;U4wd >CrhCnNIpw(np+O`h-C<^0~B45g<0@_xG~;V0+!_GI+=QqNWC$sC~R *fnwT@a}IHO>Dk z-`Ovgc>QkIzSk|buhQ_6!nF)@O}~=z+vhNyu4iH&apRi5UoZ!HB>j<{OfMuq%|A#! z{6~9~ax42j m6bf#t=X{FZQJxr gZ&$&UYQGJe;8gPP svxp%1C^hU+} z)am)P=b_L%!fD^tjeyzUM=XD>ePcIpysSId+BZfbW`qCK{MGx$x;g$k8ehF{YzfE9 zx^w+=?qxq&{d4ZWs{E_>jfwpKs_{D+`t_IczpU}q`^K(g`M#v_>3w4l>%OqhalEao z9|ir^-WMkRPyI*jePQyww7sW~H;doK_e;LYzOW5kUaj-&&0oor% 1J^PhXioF5>#w`#Rfq zR{2hQh3G#si_5WoIvZ5K9~iA3)!*gss~(2L&I2q4@8=r5JbC|Fspr0yC-XC3ucMV` z{gT;*>_=}jyC;f%E41v_tI&(NUKLvQ6; @s(@mJ4yW1_9-U&-Zn{p zRkdI0Rhs@{fysWavo-u)`8|)SeCKNXB?6Oj?i&=j5Imwj3pIUKVD&ye=?7`d9Feb} z`DoIHD=BB=KS((kZ%3pDO_y8DpvFEv@$2aF9?l=lTP|>RFGDx*Md6G0MI-ngA^fWM z@yR%`@B8?qJ-LBLq}+S;cULya^Ies`%}z4?sGM86>0d-%h&MvsIVvyeL04i|wX?f# zd+mHFJ5~1a$#_Y}U5_ZIp1ze&RXytXO;x%hMeh3h_^xI7qlwoEoOeA#Hz3c?b=%*7 z%nSB?A76?2Q~yNGJR7`)Y5RUW*Ki!S{%5_vPxY8 {X_MF0An<3Deky;iWjBwvzVUf%|__HEKwVtRie_TiCVB>V6-%XpleHz(6(-iJDu z(&@P!_4nD)tc}vu+ixcwMARYce)jyk68%D+^JOVJ^4HscCj)5IA?t*G{>hwAI+mz| zo*t=Q(gE3dw<|&7(G}q+kl{pzq+cr8=56+S >=Z?m@zG%;f)%&iFXFhw|cjeEoM_Zqd2UKpDht@-K z!7G@5Pi6+g-YEi;b=E0)ji c)BI}~bI_?x%&rQ~Gr-&Ysb>u0s5SOeY zPdP;SOGD_LA~0D;o sC?rA=?}W5UB z{T KmvlDNfAucv0*3T^AwW`1 x#`;8PA$^zSo)g$#9 $&Ou1N1yiPmERT T)qaFg-iH@zrSC@|E_#mNt?T;q z{7?2z%E7C$eLYXe&p$rD8=v2e&+p{@x4*Ape12Ei2V&>O_~X*}{sr2vK)pZhw-ETk z?_W5P%d>U#?*D817j(Y@)t@FDc0N&OBT*H9U8?c6&*4vHe?xJ$?1zhW9+zv9eI)7m zUo72KVCOhRt7U&mQGchPD*ZvMp5(i^WWQa%gwy 00jqfy;i!*6F^f&dke#We9iuvR}P3a~OZG -^V~Z|i9C>G@i@MmYzkd-WEc zKNt0P0*b5Udz0eo^%^eqDX!khbUi!QvhPk$4zpXVzuTK@dMC7u{ST{mX*olq@;5zO zIXG@izRUFLy{krfb>&rmH~;bd&HtX!%B{#R^5&YzOW?2lB6lt$6Yb*aJzAgLQXlE2 zIW4E}6V&)xef;vbXg#Rwv2yF4AJQ%SYVoo8`-t|HoHrr+@$B4+(SGlQo(FAzkI8Lv z+3#=WGJE@7Xz?c-M~dy@SFwKg?AQOjS|0TWS?(36Ul4uz>8u_4{X(q2-<`HYJO;gg ztcKoAKUVL3*K-FO$bX*OfO4LVUyjWVf9&6XuC~*?BkW152%bH?=TqN~{=9Do^84R~ zk=@h!+v|5>Txw;1U-df15T~%;;i~wlwD0u!A4NTf!G0gMnEbBrR%!q3TNG|osQs$_ zUWodCQNJIre8;{*(=SuFSm7dt3l+{+SWq}u;T(mt6y_DSDV(gZMPZ u1cPiYWaJ#~?!fgt-D%_%Qqrwde*DGABu%vL6!W9fj|Fp9 Xo zXyS6Fi{rl^4Q nSSAZKU(Ce ze3vZcSH4RwbNQ9ukKU1zZ(E9%?;3qQ(LBfR510L6-}}R7y cT43C_RcV27 z-xj3>#(f)=78v(!P+DNzw_a(1ao<{{1;%|Pr3J$NN(+Sjl@ f29S&{z?mk{goC7`ztLF_E%aU?60&y*k5UZu)op*ZT?x*=MEds{PBn+ ziS!&DKb$1`WB=YU$$JFu7w$XIh}(z1E=-z?I&P>6CyhoOa!_>?uHbl@7yMuNT?RYn zgX}?5XR7y0`+dsFD*K6DZ|3kQypbWLV!MVnN&3yG94`7Uljr~5a{{GHzyEsad=FX_ z`Sm-ll^74DzN h%!@sKi)zeEh#yI2^MTH$O`z~R zc)#QyfBxDn&kOCl6plZCk$+Hop^ waEd64x=@ypH&fm6iALk}=zmT@8oo85e{_qxN!{-SvM1O4GliPYO`2(%9 z?oB=$Z`12+x#s0uK=GdWEEkQ}G~W5^wDVD}m1pu kx~xt0Z5&Teim#d~%!tgFv8!pF+3_1>Y@I(t2S_PaE6J^+pEzMkm0 zKGBnwYxRk@h`hO$Q&^z5U*yhZ 8ElTIbXom*GJO}t#8!TOTVlS=J1}6{H_zf+d}?K`XIwbQ}sNG zsq&q^=_#6ui4n(>6(}7Xmtm8_tU}^O@r?>eD@2RJqp3{d{et^u>tKXRYKwe{2&QI~=pQrNs zeqi>pcAWT6zsODX9^LM8p09syJ*}|R^V8AJIUnH{T8~5@iC^T@FTOE6!Y^L5bL_=0 z=sn{}sHe3v^9z$V8_4_W#Lj){2T;Cm=WHPBftB^UeH-^}-kobYf(!8b{n6$Nx!`4- zK9**J{hEg{U3pI~{ZrldlxaWfm->;v)apNr>%^bU-$wI;5&dSBA6P#r?V0Rw5Q f!}Vaek*WS<~4F|O>w!lkL5e1eJvOL6qk!0?A*HIa?z{p2QMz)qUkp( z+@Ns1!nF!Z3Rf}o^+^3vx;`W)wcAd8{;JqT%CFF4^Rr5NsZWI#yJq=UPe#rY$)0h; zEJy)+Ocxk8 EZFWJr4TdjV<_D`h!&d*m*-!$_|`{$spqsLuCh=ttkd#dbLOAeBk?3W9UqHICj zHHTs4_ZntOcxIV~iyq?4Vx`3& E|jfeiLU* zj;$I$OXIgFomX1?Io97puydI!{fGE>rGHtg`8hlEB>tY(yZ=71RKxE_vs*nq*Rq?9 zqe;IKs{b8i`q<6#=9;Fmz-c+_wZ|Nf>ePQoe%r5+PH*FPYnSOm>`8u+#a)~z_V&xA z`uY0VIR^ct{k1Y*6MOsox7FZhemW@X334ruklO~yd!%;p6Q9r4(fB0uw*SX`Y&{{Z zADRc1QBM8$x1W^!_)AEnzw1Wx8G6!6&NI~aVgCCZvap?F=!cW%+xMM*IJJPN104@8 zKRgfm`TiYUv%mk|jpcobzK^rtNsrfvgVb7=*aCkbdr}IjA3guXo1{O F%1!k4fXJKMZypO|{Y)++{Z{2UV7t^$=k@jE zF#gH&bC=YU^tK8p)d&9*yN#Joe}#{~k2R@BvR`#RN*d+4TaMl2-=RqBX}hOyt4D>u z)E|1uOa}kX%&YmAXGuS#n0P?!A5GD989kTL^cPLhbs7D>A(|o`SET1NMpLpRb`a_L zjL{StWr!wi5#(wCG6{blVte?0c@?5aztkSGfqZuu>+f-N_vI0aalqd1+k1U`pWnyP zfpcdt5`{AEJNFu;Wqr}P)0Mu6p>r~yjY63>JNIghm-8K+6TgbW*J=7wHU0vn#m}Pf ze5Fs(`1wkotn_(G%er6`zE){D=P?S;Rr*9te~!{};7=5ut@QC4f0oiRKZ(LKm6mfY zqp+a#u?(Y7^y1txN{e2clXE1aQ1s&5D>Yv9;@oVdMK8|1LTS;9bF-8dy*PK2(xMmV zI+PZ@ICrGdq8I08DlK|(?g*ttFV4+STJ+-FbfrZv&gGRBy*M{bY0-;wFIQUh;+(9P zM4{-#Ir(lp3Pmr@$@)nYie8+P{n$|`dT~w~U=)g8oNH75q8I06eiVhG7w2R`9EGA6 z=W?1}^y1thN{e2clMX!!MK8`tgNZ`Xi*vL}g7y@OUYwh(wCKgTR;BX{os;udqfqqX z+<_V|dU5UmrA05!Y5NaFFV4yOY!r%KoYQ_F6ume{y%5PGdU38 F=ONq3Fdqjz)gbOP4EfKzI07hF$uD3Eg2y zX=#_;dhThLlXl)6uGRR347>IBxx3sYO0U=WMM}R{={GCALFvUxe^}|Ol-{WHGNtcT z`WmITFuWaq$ ^R;Vm5gHyj>?4>BZqct6jbOa`|8H~4_iG=7sjgLesS e8hZP?D;8<@a-)2e2BxNa4W-=8QaJ6NlEXO z%g<5Dzn;Bp{oCx8=pmKQ CdP_5EAs z6Y1|)SL*v24k!L})!)w}{Z@KDNAlc(JK4trKB!t{9}j3^ZSxpPe;d&Q_=Ah~@6>z# zqn^%BSMPa~(n+l=-$~f~$>v8?Kl2yzFMBUZcA%@W-YtHduBSaunExmC>XQ64|6L7~ z%E5oO6O}V&KK&Iw)=sUxu)N9q_mMwP%E2B@kM^<*XuWc*UDtYV>$gj*7uiS3v-z;S zhuZcB3MYLH14f7HIC!Xxf2POiPzc2FBt50m@$OI^=MK$kIB}zR9nTIWtr3j^7&53i z555smq-Ww_@@9j3SubXHzkl`Zo((=K>81>E0m*lyGJFPcnCI|Z<3@&7uZn+^srv92 zSq~}ddPeaj{@o1ei!2t+o~-h>Fs$o0st^A;v&DOUBE3uhC46#?VoyK)bWLACT1%g6 zx)v1dCvJi7DA}Eo?_vG?fmfcb! Ab#Qauihsz)2wt-q+X4zSCsr`4~nU1a*q;{&xYUtfN|VdWaXSl_efnor?+RKEXw zmDEd`YcS^Zjfk@)>l?ltYqdTj`a$UyBoqGH`%#nA^yBmK*EN!QB;SFaz`Tr)&9i79 zPg*bjI*XN8;iu~(nVCF3bY_m?ekJMWLYwcW`ngd1Ib8>iLha{5?dQTQ%NK>(&xP90 zCBGx0{hU1hpr4cVB)|SQsve0$HjoBs{@1PjR8fCVq^RqCMU}_)>-*#94)F8WgC~Pd z`&oLu{9&$zKd!2rT@q0>uG)93V_hec=3CQ`*46MMv$ypJ`|daL`<(uFt*dJ2!N&XN z{(Z5HpI;fdkK;w#-&5^Zx2ax7j-P+W{aE6M-n?_<`1u)0chC?!fQ^g3pKY(9Pik-E z@%G%7Yxy4Mcel#8Pv pxY z(*6>DYor}6knRHfq@5=GZj+9W&Z}j9Cn>*~0x3KXbipA)=O%1tq^jLO{xV|fzkm1~ z=NtciX)f!b7z!N!eo4odCK*pwLObM `_le?=~Ivtde(k)CHg1oKckL^IK1w<$7YWH z6a0QjW-8V79ev%S{(6Uu3$^-r(h&K<9k`Qq4>Vu6aAn;CG>vSw?(uwmzf^f2FY{J^ z+@*PLT3(Wq 1 z{#A|nQCGk4&FML2X}$aNYRaE3Z*TMJ>U}{wxE_8vG=ER?P3$Y~8pKOQ5AoF!kZXCI z1N{2Y{EYNPDQq51e8@7cUw$Vxr{CdqW*%ezvGvvNcG+iGdH=qR Vsxvchc&w<_GCaHGNv3fC)KtFWYSmBJMYmnmGVaFN1=3~8LCnL^Y) zpJ}oiwKTsyaXW68^nN(E Z!Y@?NR34mFp{ zt+hTg*W+jHB;F+HpZE1AZ~R@1b{cQl$$pw^S;!T!=YQMBUEJG#jWtq#drq!ZzkOPN zBIDz#wVpg;{YlGB^tEM|*5ee;U$y?E~Hf&tC!!um9&4OA;HS8yT3oB zAD_?Y>rbaiJ?>(V%zJC;WyJbZS})0WMaSy;)A1wMpZ egizwG0Pw6|nv>&9$Q$K&bak3F2 zRm~%8-OYPGp_-WA#G8lMZ>`>A_D}71YWe4_HT*MK*BT|?=>GUMmeYS |0#U`1wk^Sr6mqE3Hs}Sf=_A_`mUdr6W+o7jC`pdg*tn)`hOC z3a61g>bRD}qwpGrG!F9qrVVU{WZpBr-WLS4&S}rp)Nk85;bP$Fb $r%<~hYUTk>!>8Iy!T5-emS1vg&T5`k9OKzCob=_6h zEV<#58@jHGR$PC>jc<{Fi*LMPN!PVe{>B^fM_zNys{GRHZ@B)Z8+)!>0&-QJxV+es z|8dGgQ`)C1$TT!g$Tl^%?5Ei#?tj36lUnQZ*js%4oG(gDaL!F#*W_P+{w2qqxA4M0 zjtRy~9oN9P23}wd?3qUMo?C+N4-dEg0QVEPpTzwX?jPdD+G6XEF?9WIc=(JT3Euj9 z;7 OuJGkyt(cPXvE#{C=I|AiZC6RrP^`+so%7B_9n z*n@%dzj6N$9&!I0^5iHC_y1sy^*;#zEyaWWEzyAV28@=cXx>B@O(bZokiO8MuQupQ zj>B=&7auRj4VJ;1asL+g?`{c#JmDzocT^@Kr-Qx%_n+f_3+~0ZyKrBLyBqgaxR>C* z8uwD%^yJcmdpYi2+_Vx+yCSc{eLZe^(xJKI4Y+@Yo2H1r$NgKBwR^ZZ_#NQy&Ip1T z6n=}Gb9e-BnorKeoyC15?hf2X;iflqv}g7v+_P}M0{3j(P)G1e+&AMs8aK`N=;{3! z+$(Xf!X4wLmH8s>KcKANA=B?s_V1?whyI@$ZVkRRd`9p?z+Je%4*W6P-@yGX_{BE? z{{!&bxF5&;9o*l=4f_Y*1B4F*@PXjpk!}byd?ENx!0+S!0q!SoKR!GSK6Xa%B=Bzm zJ_Yzg-0&IjJ_9_b1wTUB-v<6T?p=uc5$^9I{KtUbLD+Y3!@p4GG~8#Pd@B1ElsOIM zO#?gwWln=Ew}3taauEMpkiQk-XF!%SAPe!h1#*xKX9Pb7jy3Pb|HS(*1n68FHNw z`~u;-08zIL+C?MUMI+ip<9COLo4 LP4BAtG z_Jr`^#$O>Gc4$P|;4|C^c^Xl6Gs MQW?fh;Ig;X7Fi-E(vcuaO&Z5 zwY~iC!|`9P1UbBE;=}_EY--tm;>4EyTbi1hve_*D($(D3+H}Cg1Dl#_UM VL)|Sh)w;z7kVTT>kb_jA%_CpVC zYipm{ei$XhMUhDP(Wf&>KXM5gJ>6?Qg~lRR1G)(AUkFh9%qJutPs;rcg;Tquc8kl> z35Bjn-mo)C-IQH?5(f2IxOmm=I3O8x1JsVs#w{yvL2v 9^)0lLSjK%TZd{Yl zbtd_MHqay7J8|P`p=H#+!i|bfpyyt{9;8;PQvtVL4b<1`HA2=o)Y-|^psyl`8j;3i zhujmWUmUGI2O++Mo9aVjP8s(<;HI&JD)S|Rs2hzb#usP m)yg7hB z#!cf3UBASQE|trmafa|R?kt$G9RcY?_B_H0fU-Ir@LPJaw_aR78n<90exFn;oYEf- z9=KYj 90uW`BUdA5y#oTrbu|9t7!v{86tF;a6!O(oDz$AI%45 zBEE#%_vrzYi)#{%se&@yK;x;dowv|<`c*_y8N}l$;Ky>ZAo!``CD6YDPHmVN{Z?@~ zm7fB|ck@8Nhi%)?00cH9UushPc;E*Jo*_VOh%TsQuRcz5ffDX|Ha$%EPC5Z;Af8 >1u+?V6kpih^$meYV= z0v!J*P`Y})g($X59&j|<&qI6(w{QC%mE&}T`*IXO-=T7x3H*a31pcoDUP8j70O>Mc zCi%#h&jKt#5g$YPbAgwEe_Z*T4f-L)&jG$oaO=A>pVzq8BJN*+lRl}B|0eMB0O|Uk z;(6e^6fXdO8aS?&`S|mU;^zbZwcsPhBdSLpaii%9)59uV@j!@naslE@S7YJj`=pH{ zGf_EQlP>gl0c}`-KW9iB@0NHyaMA QDww*I4v- zG18TA`+mDwWSDd*!hQMP1p4nKuH|yz-vo~T6AHk6`JO?b$!9W^kcO_Y$g~LQO1OQQ zek0{h`ZI)^Ok?2%dsXo|7#VR*x&nWU7tn^q_%lc1TDpLr1spCufyN>7=R9t@-iUDO zzpd{CxmTZm3(}Wx`*peu8F5Xz5`TO-xQ|EJSomIrbS2zA-|Lm{5`_DFmw|q##I^JQ ze*id*t)y??eqTbk*{=i!gqLt{*YGlMvnv%q^A1iU{lS>zCViH0`*MFB{BccMjz7NK z*Mi AUDb8+r{dDxZn_^A(^P{%mjWt;9A^fyD}0bbwEPvQ%n0}{($s( zq#XjT7kghG1dE}<0iQr&B!kI&4RB;n`U0X$xczz_O$ks>>MJbYSa?yk5^kT@*~*L7 z0``TMKR>g6bD{FO(c=ZQfu8l3NL IbypcKrE~#I@W3d=GHA^Mo?+v9t%W z-iCh^ZiTE$4XqwyMdnxycxyNev`52Z*Tp{5FXYO{b?TpJx$1? zEaGpnP~Sju7jRQs`U~78+_ho_yGRs#XbVJ3Lr0yGj=t6&@lBQOGD}OYWR?0sWb~!a9;=S*R*${kPW~KxYq-} z2e5>j^cmtV y>_of5iHe|OFZr?WBlozc>?2Q*SodRyMO)XyAmDfhZ8!w;@ zoABoch=WT_u)5!iFuI;bIQ2gzH2z-#e*id*YrhA69`GUH*=Fsdz+kfC1>kh-!e3Kf z;4>`^n7zu<5Mx}hO_rW9UxV=bB#8fRR(w9f$rhBR6ZriaemQV*{W9Pcic=@GSn&dI zz1UAEE%@-d28H`Pw@?5s;z?o|PZm*m5}xKsVaAj8Q{Za(82 r&64 RfX8{X^t-y(A3HUVNL%_?x=K%jca9Zqrwc-WfX952Kg=4}sA2@W* zFJ>+WPJ9Y8Ft<{CG4N}EQ{79z-wOOG;AP;q1OE|l`q=Ys;JbhpfPVxy*{Cox2tEOv z)^|$4Kd< kIUjhFK!iRu29~%Te15Pi7+JS!sXaV>uf$s)h27a=J zmpg*sG~hp{H1N6C0cTyozpeoO3krWl5G+=_1bjJgTEi>@kATy 6{I`m40zL%~S(LX7 zyhHKN0iUDz=Yh{t{0qS6EB-~`Z&v(Ez`GUyC*Ug-e+2kj72gj0PT(Xny*PU>aQcL; z0G#FsA?X2O1Gov#18&C6bp-r0ZfX}Lz_S6ljQ}s>{tD<|P7r)q@e=T_0;e?O2;bH4 z0`R94F9ZK2aN2KMI05hMfFB0D1e_KMiD&5~ydzaSz~bF>;ItlG0)8~`mjN#WpQku2 z!d(EI{Sf$Nz^N}S0lz}=GVpH2gHy210sQ481Mr)Hvwr5n9~3VDU!&_ zzX$$WN&`F#-SO$7uff0o{IgU?;L{W@1D^x@eBy&et`mV@0K5SFRN${8p1{unej)J$ zegW{;Q~E*>yaD({lpgq-fYaJ{33!*{W#HE-9-IkX0e>T<2YwrHl7|)v{}TAc6b}3z z;M_)lZw7uQ!pp!P0)8oQaw_tP<0w7wFKhb6z`qXsGK80ae;fFlDE&F;Gk}wQ3IDC) z1>i04q01>f@PmQVdxMR@4+DM$@G|fjz+XXp&P8(o&b|%&RN!x+G{DaTPBI6t4T6Qh z*{^_K0emsilz?9iyo=HU?*)D(@jMUjqk(q=F92T${3=Qh{C&WeP =U6@Snix0ln}B)CKrkftP^)Qt|b`8_*Z9{J c805mqLEveMnOPPS>r9 zw;_BD@G`<@0>2G-a2f0c{0`tH;I9HsdME=gC_V)I4ZxZIBG?N!)vEyf2E|Lj-=XQt zz&9v91bj1aTH_Di6a=3HegNeK{(0b^16~5YL-CEkp8!r}m4W|Q@!)doF#*07d yT?B1- zc{gz4Pxt`vM}QW9KLq?Qh!5~D0KW@(`3m?R@Igxd=a_Q<=XMSJN5J1h>4E =BtgE$+aP>1!12hp19hOhV?HbzY{6}e>uW&*}D)XAa}L} z*wLDY0_Oq$M~;<0NW<^S&q6r)6J7Ha&jarSj;p1NKZ}7wlnE1nuK@lzK)P dyE^sWZu zg|f0F+rvo1eFX49;3lW$Y52QJ=7uj<@QM9k@CeeklBg)~G2s8A@!taeDDV>Q?*r$) z3~6Y-&OQhHrwHdZ4?cSoF96?fu7sC>Pf@%Ke3s&5=#zmXC@26w8*m5i67bUy{#D>* z3Rj#IIUhLrL;?6B;9mny&h}>D;KO=erfDeZdf;T=0`Aqo!H#|FRxizaf&Z(f`H12r z(0Vmc{qIA#@h4mSn?`;D;e;2I252B1>DBPhh9P_a3_gwY`$2{R!v7IC>kat7DNf-# z6)ypQ5;*sFz<;Lr5b)mv=e7a;H=U|F0e-OJCE$kx|2oo^6({-0mySfZ`N^@0=MjD) z@MfgJv?w?mxYgrA;8a!#_a%y#fp-IEKHyLOa6H2Dz^_9%;d6lB4E!6w3&8bicnnAp z;giuF4*@5;kdEnkC&Ec5W!qJV4$7#fi^@ikE;tWa)wb1Mstuj|}xCOAnm-5t6e6 z{3{42d}Bk9`L^Ql|IAa0!$z4sif;nmI4=nP9qG%+dw}8ay~BWikHX=5(}6>;Y|~c& z--&R#js^ZLLQwvzf&T|klK&jw-vv(cpAS3_ybOGS;@g2=s`w7zf3EmW;8z2OC=)0T zm1TOn890?y#{G8SxLVF)z<(OPtvFa5__*TV0lY)_HK9tu`z2qn1rX`%YM}b-)$nN) zZumD1gGkU-unqaZ=QiR+{g?XK{+~xU;rpZcJ*xO56!CS%(eGGsXr7q6;3gha)DY4f zMkG@F9JsZY-zi=|n(V8!p8-Bu@iOp36{ox%iWh(%Z|Q-bZs~!a2b^_=g5PB6fiJQ2 zz^}LTz*i|woyx729{Bq#J@8Ljdf;EN^r+kqEj{qxS$g2jr>Xw~pQ?C}#Tc)60r;yG zF9CnOr3d~NOAnu1ZRvskg{24n5#XpQ_XAsiKM6f~SA!nGN O@ydEoTC^)yE%e^7JjKTsvM>z9xQ>f c_sLIQo&`DaG4>{|q>;mS^zimx9w&nA<3=c@W<`=>JCCX94-bGvEP03b-dK zUIIQ<@iOoufTJ?Jm&Vqp5F8wfaOx`yxaTTf2Ci4bCs0{hBLU#NXCaOG@%g|fK)8aX zMzUW6zX;)nAZiEjD}bAvS1V5GuLb@qz!L786fXmR8*uIyz;}(NF9UxM@LwRF1la)m zH$V%(@6$9T;2#J6-v}=Q{|s=d7mdMR1pYsi9?JVy;J*c40{$3qlC2E rT_ODZL~lX-O%t&uyQa)0|t+J|`Di j`j70qTY^*k+x2C_sw~lu)|cmdIQP``pNq7tZ>SBaKKsoO z7WM+#-p)Ejud-9$i(7@C)|n)S44c`T@E>L49nj~KRuy+$7eLP%Wq-Of4(j5zWRcU0 zxgR8)oYkkQ#unu4srw 7^N+UIqP>X<{&igpUFEK^Q1Q(2`(ylb zbzcPUPo3_<;rq~(%f`Kb3hr6gkA=cNjl2Bl;=WMz@+{o^GcDPr(3cQja&`Te7=R#O za~cshnY i0Z?QQV&kzv`G 0apn1+6$W4xL{u^!!E8J%r_!J&Qk()<(;rZOsh#)zAv7bmhL%)4B;d&QIj7u*$#e zX1OPqwd2+DfTMxH?7G(D0xn(+t+mqU;_WC7+W&bx_{;97hV{Y<_-^Ry@XIZGC4aPz z*b99hwA^Q*AApwoVd!3Hxz9n@q2+!8dN;J(mGOt5Rc{sON1$KIy~^+HPR~OBJE!NM zk2tN0`AGB+{b}guW#j?+OVGB~3;m}~tMGs6bQSuv)3eZVePRxJ(FW`((ouz72z?`T z6 DZH@a`2Y!juD*x?HUyr*k zZh6=jyW2hP=Oy4BPAhEP>GilzL31;Ccr*0N0LeuOnKScK)~TL&b$zk`T^~*8UrFd+ zPv}oM&26FN^8jf@_Ce^Xr~B^Up6j0t?*0MXZ-K7H91uK)!KrJb`{TAGdWm7dR*wA; zDu>edt4n8Gf1S7qXLWEC`gTBab$tUrpKw14`&nq&HObZWl~@?^@ fY*pxLJO_j{7U!&C|28NY|?@V*MF@h{ANn_n>3mw12P#53~6BE8Mxd zcYy!S>3gB)-4fiR4FKwzBQmY;laRH;)A56oUC)Mo9IC?ah0r^RqYCX;*Pr3>8r->* zy=+6EyC1;cUC`W2PQ`l-AYPEBoA1R>#oZrp|I$?&i(Z%b$Ei#E27YyYwJVZY*W(HO z>4g4PLi^ch1?u`l;{NS~-bMVoZn1c~zl8ff=<~_H?53ZAmW`n6olaMw-{bTw^e;O- z2mQh5pE!Rz`iK5R^bdU;nydRkXkFY)1~ey%GVo3JGYa!>q2 U5SORlaxFn8hyeQak%c0=#QO;@x9s?f?q1NT|z322KS{6^?~@=reB z;q)x@FS{QJ@)4(Jp+6qoDbN?7@oIYdxYLJm|1+oOpug+%3Fz-TE&crirz_C&Zw>KO zp`QW$8RG1PejfA}6+d)tpF)2WH 2xpj05o2+S!n6eD)G!g>oZ;Zp{vnoA^0B>!6PB8_3@vDj`qU4pe;Yd^ Y7;|cv2(EmjGc(pdwdd}xP(85g?@q#KDy#)Ff zJ-#cT-vh0F^n7TQd6voMwa}8iIp~+VyB?;#+35=OUC=6D75ddq&qCLse~CEfpm#(6 zH|Xl+$P)B- NB_{Dj{c!_4o!KOgVxzL%a04QWUzv}_OW9=zZByk z%zuGCL^`w3C!neN1xxY&_t5_icU`BUC9~>K|KfB7y6d)JyH%l=Ky%H5w73kp4fI~( zA>ORQ?+W}aR2sOggeEDwUgmTKbeq#v=a{;qBquRddi6Lo1(( z;Dt_Cp {}kT3jIB3lY8jDgSK{gHZltRd-&J+xcLa~ ze^6K^w~L`w&pHS99H)DsmpeTR{Sv1SL*E8%@k4KieoXN^hc#>HD)b!msQa%zm+=nz zalG_G{}lA6@G}ej^U$A$u3k$2mpguDp+63-x|)NYgZ=|(y~rVsqg7}<_ckX#(8us& zGJw(YpP(OCoX}r^{w(w?^nZt@`Lj9be|C30w0kiH|El~$>(jQ1XBPTO=>MYlp=Dct z4O)j@SK|IB@(=xD=>IA|FQok#Qxw0><=ue0+Fj@JZh^+#)~2>Y^R9&-jd17r{~x`P zJJ00*=oh(j`_XT5*Y$bsO77bMcOMqu;+Bv1vLST+1%6(R2+l(9;z!Z!ieqR6^bhz! zl(Q;7T^}IqEcbtP_c`druLypW$g`ZT&dcUq;q(URtDR= LiIH}ucD`#sR_bDB9; z*RMN`oj&g)PH%($jMLkpzw9(~uz7#x^u5sk%jx@|7vCAudKL6ir Loavw z)zB|?n)%hdTb+Il^cJU?Bh7o2)6Add^*LRG9(B4Gy5V#m^c$S+hklFG1JJ+V^dR(y zoUTJZ>h#b&EeWB!)z JdfdZSp}*$zEcEw0>>RY#Y<~mq zC!qhq{m7u}zRT@5=x0IGtXVJg)lN@BU+;cqp>K8iF!U>-FTnpCv@W8yb=p_EyWEBo zI{H}vG41il?I#mj7{0~xt|aU)CG@W+^hXmq4g1N&{SOoRj}rQu3H=@Dr;+rWBH{XV zuj9YN{fly-jM9P96; r}3}xPK8iCES7&2nCm0B&qB|?+w~sf;M1M1 zLO;)Gjg{9rt+7%U=`QRwig}plP4G7o`Zp8$(S-i3gg% 2~PtPR~KV4qD~Sh-<>>3UtHiDzxlv`RV2U2<{)|KFjYdPFG>R6PoI oB *E>!^+S1ovuRv0Qz?bI}81f&@|zjB?4Wyg*_L@OD?`A z(3lV1(*L*fW7zC^rn@uTbzR{!Lzd-)cr4wkaj)QC*E*-Wp>Kkgjij<~f;QQMeudMs z(7Gt2&HF_Eu9s2tM-w{M)m9HH{%fEm+f@Os=w~?bGvjpCeAu6^&*AYWaOdj&IN{#~ zt+1FOwl;wdw(Enq{}EI*K>h8~GxtXl|2l8+S?7OX1NxD$vySEe6CM}0CDHkl?k2u$ zo{tb;Y{PV|FRqi!;_(=MB!h?f`PKD#@)GIKv`I&{Pvrk~LjPgnH_Dy-JwX~=-JeVR ze%@*Fm*+pm`vvEHz=GMIt}o(tig+*$?R>_(Ero2K2Yn2F6|ak-zXUxCeTn;-gVs5% z|EPHRJ=fi<(3eAhS^oJ+K9%n|=&Rk28gM1_AK_Moj_WeB(9y1&gT6lcr$9GD|FQf- zZ-zb&Jqx|f{mel>0R0u*DNR;)dKP-Z{irj&(djC*#$V-a7W${%eGd9i^pE27tLqEo zC(>Vp{&oCtv$5tA&>G9)^`DdnzsQ!^Z=b=B#$sJxgw|MD;rB;Q3;zjpj8l6MX`KH# ziIY6PS$*~|@b7*W{*BXQ|HA*{H2Ps-wl(;nzjQ5f8YAKSr#pQm`Mccdt7yp;PA|v* z^-iPH=HKY_HQ^O)%BPh}&q+xC=-PxI(G>x%=tuLN=;w}-A9*{5$8EUF|56-Y10Bn* z=hi-eTa}+*UB8FNNFPmT zmM@AZ~84j!EgU Aj3$6L(EVN%; zA5Q90WsmNkE!>GV%+tubjTQeyJQUORSD*Gu=3E}`Vy9>E_pIm+@6zZFU5W0*e-$)0 zYyY*-u^z5>x=K7Rg(jH!Nz>9Z8;fvP|I(Vl eQUvXDv{p$L)gg%nchZFiY6Z(%5`j4U4 z6X(;&{{bSr4f^|vpDV7X&OyHdce88Y?S%d!ZpvF7`fs=^Z KpTZ9^X6b$b`d{7SA3^^e@l?TI zg^qbpyMG3^!~Fc}`g_kSc=4|ir}P7Q)835`{mXBxw+ghzapk!Rt!L_f06h!+^6laI zK-Kvz&{|Vb{l+$$CGNX%|3A2?!u&Goy8y~!zkBh6SCipa2im;GwT-GF`(t7MH}NT~ zqSeK{>ABY*?liZj{eycb^H0Av@c*#`|MLF8|K|?;JDvY89r!1m|Dz84e;5q$+a^St z{Qv5%z@Ja0=pve?@_ono3p?=F4u|mPci?~7`HMR6e|IE=zn}yE$_E4AGSw!3e>)!d z7j+0fe=_hd?!e#c{7X9UFPaYFpV@(b-=4sKb_f39y@CIn4*XB<3w(b+SWEq1^l;!m zuS58?Zw&k^I`IEyHt?_Pz+d;Kz<)sp{$tL+ssn%XTSEA&JMi~8e? U+7A3*bN+Q5_`N?9;(u`m{wv-Q_%H3ifBwP1e_03qr9U6| zFYmx#`>w#hsRRFaej)IGtONf8?+N@39r(Zd-oW43fq&D#5ByCX_#ZnQ__uf9|K$4v z|Bep)>IVY<&JO%felYOw?!f=&BZ0rg`KXA+75?~TI{cOJq{A8Gvx^@!&V}1>bCoFv z^B2#@$SAzR{pme;^0y-3?%U-%To&d&k6WJBd6-vun5u`V#1Nj&{YjY39_G~^#=S0n zE!eL`iy`iJf3I U+{4FcZg)#q2 zOSq?mz3hwCCVp9ck9pnQiQ_FEX58y)e<_Z4m+)_v@TW`o>m~d@O89gMFaB-ISze|} z3Exn{_m=QP3IB8nA1>j?O4#eAOSX?+i+=+8Yr$XlPePx7z7X->ihOF`RdJ7hh5IUK z*@?SxmyA`p$9IFxLhD^VZz7I4=(y%JcRn^5Vbu>#K>rfF7eULg+r_QIZz=S@;79Z_ zXxV+6pexXCz&~qc_Fk5GzZ23`;)|gbXH^*qm$f%*Y1Vh=xL<-Ft_$Btd_)tkuD5{w zTKrb%=LUb>2cTaBt@-F20Xmic7W_;Q!5aMB4*gcqi;D8BAp(_O$yA|Zea%A0`kI4| z<&>g{S~{knu6Na&%2-ks17C3GX9XA=66g#Ph_ep5pKbV9#9q2HO%m=|_c z_=_oFSB1a797rqguO#&Q6MC9Dzt-z~ySD`*p1m$ zJ#>ij62u)`tz=Y{_ZNd1b02h9O?HbejZKek0kWx5?bpkG3-|p_Y(>I z{e=F F$pd^wSgi1qpp!LT^auyA!%Mp+^$>;e>umLccSi^&XFy zpHU-2y JguW)B z^;}$x|Axd}@85{-TN3wLLXRi(8x#7i3H{E5et$xLG@<`6q4j>7nC_Pn_irThcN6;W z6MEi9i?Dj{N{mPESBZ3Y;^#RDy*8osu8-(n@9v0nHSx1Gq5BegETQ)%bT%?Roz-d^ zwr$&Re{K66uijMKasSp$wOTe_-&-4+86T*PjPIEk=$jsy7_UvYbIm6Ers_m8!z)c{ zHT|6#Z;b33uMbv6C&qW#pKN;nWIfwm-=FR28=a|VV}1K-gqa$tHxwn`KpR+_<)1aH zjn$|72K%P_+BlJi>5;K|W4do_GMgM3A0HXtm66N@_gWr9Bb%Ni<3khj9;j@3s&AlP z8yU ODnV^rnan8a@PzU*J)8|pj89W5wbA e{ zP6g#}UQh{tEM}Tu%vjB&F!~q>xlSu0ikZ^RMa>dK&?Q+WbS5_sjkc4QR@bb78?xCq zmeI&l`y~!}CdHGhI?k@C$$?s9YEPSJJF$={eM&HoF8H%=4;GCPi)+k@$@)~^biFoQ z?;EU7d7_jme4wyFq0L+2Vj|g`K*DT_+iSVzf^HFc9k=$ZGjOwk0q;jmb(MyQ4Vq2W z2S*w;PX$*BP U88ST5_!mXWP`G?#;)4r^psV;5eYMBirsxfyZg|P zYG<;N!fawP8>&wa47bWa@Rk=fz^2+OJ9*4`kdg6$i7_c>tC5 $Uo5eXM7BEa|Gs@|IlURz$U`a?94+Y8&pkf5i%qbE-Z) zGc{gW^YXS;NAqHSP@8;6wOoDT5maVQrCqg)--8g%3`|!hL-SFIRFS8w+KHtZotW4? zGkFfBp?(!kHBpp`54BeAx%aNSV$7kv+z81n7d1iPtSEwBdvov>nr)3m9z5mYY-CRY z$0l6s?XCP2o}+ HJY>mY!9CDoiK@w66
F&W^6N5XK9m)uOp8X*xIPgLxADvd zY8iXm^>RhJ8r{}x(Vj_O@@WLhW_tL6HLt}p9a<3;lD<0F!_8c}5jj`CX;WH87ffo` zfzy-M-fWgUaq~7J#jVRr7lxbAm3mqvGRegB ebrVRVD~5Ap1 yjn~{p>X;JdzQOBrPx+gH1bUh^(1a9R#g%tUoJ-Kc8c-F%9<6K%7(tq zy$(z;A{5nn=9JBIOWNkzoVusnKDN<`UA1*JAE29~Y-KgaOSNvf?Y8ZkcGR}qRzoPa z-FwfDJMP|8+kE$it+m_k*mT#ewOc%G6*5gj&0D$gM&_2~)I+1URjSAtJO=Q?+{; z8c#lt_ins%(~j+)Q#DC3LGbxVWu+!(E(IDFn?{nTLtILW(5;FyNhAy|Llbd0QNp^4 z;4yKzkhbNaRc5WrYkJ;rc~!)tBfIOP`)l>d;rbZ%Kl2eLgp6fF6W87xW{)c>%a>QK zJd?jLz08MjMSI40-TztR_4HR%9(g2FforwxuiCJ+hY9Q|6iJc8h& |EuTxzy7%JFTo-5yzk=@ym_yRVF(tUaoRlVMXXt(-GAqq81#AznMt&PMZK@fChs> zrozC?l-7kb8Lmz58X4?K`to#CiOrTpsAH29eB69fg)zKAV=;L^u`{GiH%#t&h_iBK ziH(~HTUjYv`iXqIE!o3Dz=|H?x%uV_RMZ<*antp&$;!&gJsa-XvVGIWE%)5Iy|#7J zw%VqxTQ+VE9*Y_X)iW?bVMnob2hs1gHdEU>GCdqCAyi-Nsw;bBWz!y3Dqogbp)ML3 zVT_{4kr`6W`NUT+(WC1rc@n&*96op{MWQ%@N7lfa!pGpgQs$K-|8a1QJ`A@im5}e5 z>5);FNY$5ef89EYy_^a410%0hl9EUX%OoobgA-#~or!W1g|%r8aYln_RYe1LoI4Z^ zC4st9!>*>k*!n%s4_3zWS7}^dB_o(MxHzykO-0-uN%~=240X VKSOhB`kk`b5l$TJ?GgFLKX #J3D&dnWP(9DG%;nX2$cs-8oAwAxqHLT+AYCOdU@r+ zYpw}CRTN#J;Y??^K5|RVGViUKr*iGh=G;JotnQnd>f2v*bVb&_nL9=vdTL(fXYq$v zbo3!%Zq7=SjoemO{&b1aF&@_)>Q(gdS6#QUcHf4(YIkkA=k^_&i+amzc_h^G2(`Ta z<&}|g-72Z1>R5ps?rRKFcUq3{DMZLr$X4Q)H94!~Bqw)ny1ykS3SH{tap?DEB%-{6 zTUpd;n?w=kV2LRDOn-E#G>x^&Jyp|KCjv7xcj*aE*J?mtQF+meFlfdkQ5B8Fm3rU6 zFl#_8Xb+%IE7B)@1Jm`X%%bK`ThYn$mKUL=r%{6DsRg>T=RphzDJkZ4tpTDLsFd4E zN!zR>OJu7t>XW^qJa380X!g;n(3<&C9kt0>s)m(eH=xcYz?8Ze1yaw_&NN@T7N%%z zN2hJMF&FXzLYF#WbH7V#)0gn9t7rsJS6RC%>LvA<#?*ke4CptNYi?SX7Bt@?vSCNd zCiq3(iXPtVqaPnrY>Q1XQV-YnJ@8Ovd1cMMp`nfeCS#P>uI=cjuN3KIYovpX=?74# z8VY-Q`ZOoLo|#dlA3NF7FY>D#_M7XPp`u~hT3K;MYI8%MmbzKnIwx(imkRSsmFWv| z8Vk1tt9ZLsjN&R*;+`ezvx&2LkNv0J@~q~zP5Ymfm2u9X;`%al(|jiu?%b!_lBp|W zw5gDUfos4=sJO0{F1bpu72N!!LB;Uk6rrYacr+n8Y O} zef6MFGQ|-uA45kQwwopk&FzBdp`@ahPe-qL*UDW|T@iD`_7wqq-7ChayX8E|{>=E^ zDNF?UHdoDldzw5khQ_oLGa`=yg P4z)Lvt;WcU<-@N*U-rLVEbH|JjF T?sVz z3%MW_53hMcp%Oy*hHUE7EHUL$1wVP20&G{S5?bX=KAOuiG?>L4`UqmH1oA8ysSQmr z{~H?YiAl*Zkq=KYDR0RAsMc$|>m))Em{aYU< jAIiOs}C7;xqb*0W$q&yle`W~ z8E2TGJ*TGgY_r^!W|+Z|ikKba9@%AYT2@pZY%odJ@bV(LD3tQG z+%ul%%kdfVM$&X sJrI0a5$<uz$W%M!KLxJkqI!#R^`VqLSe z)TlNXVS!_0^7@g sJLq8JR52XxhfJ zs-mUWSb>FhQNkS>JFatL(W w!Y!b!&%F0SkB>3?(dP~evTMHu(-D)%?itWlG!m EZold%)twC3G!i2*^aP!(! z+ZGv)%~TTWq}YXz_RB@F`{i*;99qhuR8^MFvMwJXSkfki_qbGD)UE{x=R)kzN(fx= zm0aGO<(^f{lRLFcELR5sD`GBERF3j$h{BP34E`)SZ=TTfm6av|o{uToia9PFz~(1C z%fnI2T+O$JXY^T pdTnTQWU^tbK-UKA1AY5z z(~WGjk6}(>>e*C%K%G%%w2GJ%2Qg1Q#8JDE2|Faq**c@gC#J@ y+(})8y9PVX_nv;_Kp<_4jIXN*pGO#}zpHeY6i#s|xv9~^`>R?L6sXaS9 zmLns^sP}AaWEY1ob@F OgIHVswzxdbLru;k+(1Vw*Hj=9$K@@=#O#Bye!l zUB<>TR@g@NaAa>R+cVZTzzQ7o-w2b`aEva9j}Gh52DFAzIzLXXCI>mpHq1VQp$8}W z2c~hPawp&xEvvpVU89y*>De7yoAt4&k^ULZWUAPs6MdW>HaQ6OMF9hxY>b$=sYz$* zoJ|kTQ}wY4&K*e*X?6CC>-*{h91DaRnb_MmGA+v5ZK!W%l!Nh9tw~5NZ;y-_&FeY4 zi!bdqbCRiVzd}J%=+RM&RR^h=8F6NB3^5KZNO|mFO}`EvX4*Rqrx9xdedB#}BO1z1 z2oscZq$8t)j9FP@q<>Ux9WpU$0^mK7 1FcHd1=EX~GVW1_GU9Y_pMx+FpFKq{`MG2Pcs}{_e8BbdWugJ_F->1{!;_@e#X) z!g>H5DC(b>m^R3{QL1D*8|!<}?#w7h_Qgo(Vxd@Mf)lx+R*VXNBy0I@ER>!;&|x7v ze>-9ayEzHEr%@l%iO@Zb;jy558Y~ub6xPnNG`U!ohImw9WR$bGlyyeRI^!ht)Wklt zOpsD;!%S^5YrL4P2z0V^Q1WcuJ9g?uA02}KJY3)u>&B7xPE8N9x@}~AGlSMwSpVHO z&DqplBjYoY5RLN_<3 %-+1=m1g9+#Pg4{9RFbKV$ H_8YFM-`1s^y!rCi1(eofdNi& zQk(R$wP+vEp0Na|5%*1^HR*)8B2Ga~3R@}|VaJ_TvB7R?f>X88y)oL?Ut(Ct;dzW* zp}?F)onaia!rLYUnM$0fJkxt#I}ru_IE2#T@fc~uF_BqtumIA2G@7(VjZ>-|F)ncM zoH$tOl);Ce5e<#?JsPTpY~&02a(rg2uf~b!aVvR&h-ic-Q_2ols{4YY;^A040xhXC zf3926r5f&~KU7X+(MEL}M$O;kC !F{)x|IPP+T^T_G1Z$Yj82$C z4xaNYP{9}qeL @i!G%!hI6q(ID46zTy;D;joUV$1 Njg6tf5P{xF zP_1vzu57m^^#jvW^mO75)sx#d$^l&vaSXjB!B&MnHqy(PyY)FjG=l 2G>h~H z2#nS_{M}S*ID#=UPGycWSMq@{)6)QJiU) ~4a#Rp0~4cYSul@k5DCO+eTdRye%kR{HNhUY&@2T_ z7JPL=!Vr=q^F@9HbP!2JlD0&rg>hx1KloNWdF} q zjjCHUZH=WIU@bGPVYD6OXsUNmoaz3k6HQ#qrv^Wd2V>defr@PaiRn9tX@){UZ3k5h z)xTGGu+9^fA!RFd>Nj@4L3!M-(>7=+$Z^uP@ij~&aEU4dGIXSoakth3)F4&QhS75< zDpTfJtuZmgh%`BZiOR4vZciR&I-aC{$8#<`Tg5pz-Q-huJv0+kpw(e$^B6@q{>Q_9 zArZm`>D;_cCxN%s?%A?!)Ak)3w(ZEGOT<18BVj)mEE~q=8euktmZkEdk*~}lLwdMM zwu~BvK47GVGb2Jj4s1jvSou_$dbb0KP-C>tqd*~oKr03~G_g3b3C%cie}R@i>wy-) zh8IyyJ&W{4ZBQBN!^-3_v^WFASQ%1@ firco@ilb_v!&Ff$Zd=_xYYWlb-I#?ev-r_GjnE%snf{dD6&^{{GpL4 zIwE$N#wPTtQ(6BAQSm4i=2)1?_Gfyen1b4KT0FGH&T?=V>(7{3jApf4^mj6}tU7O) znVBWRfua$P7X`D#J3W>FTE-NpmJ~t{HrvMfGQ$~WhNia-{@5TyvumkEFbE0+6L?|M z-rP-*ai8j!mTSzgT2QaocJXu^jy7AiaTb5H9!_Bzz `I}%_ zh1=vVPVred#K;_`G;IkKC1h$FW $tK#1%X&SU_otYXdTSUK%ndcPU3S zKp-&9>(rM9x~77tGUG6(u@etr(0j@CkY-Tj%K&{-Ot&mIL*uAq23j+CnWv3USfA4R z$!IpC%>g|hXl>5=u&F+C<*7Q&SWp3eCyg2tzNzv0DC<7PQnDyAiAl|#M&Gdm^>WXq zO!o~t?zqpWja%;Cx?x8)HO8aa(QX$#Gc<@;=?}-JOkGORPcu-~2Xq_P-A)=82?rQt zI7p8*y0Vi^_3cGsN5%!nSqcr9C##sm*F%w}mTZY8-15btX>^7uW2_kIY;;D@h^B7$ zN7Ouvu9^0hSl0JYqK700slGO>5t&K3jm+G!Rx}32@p+7=tuxI*ZKc8{qoV4f>Y|1k zB8M8rmqAvyZp$ F`hNW0jm2BCiDWJdIj_3QcZ>_JpH z(|VhR`}{Y@h^dyobL?vx(R*Bi1=sp!FlHp^Vd&7K;-(z*v@>gdp;zpt2((oAn+q54 zx^+13rfA&4-<%5!T$e=3fY$=JnxJe9udHeEM5%tV1!W-wlSjj>txzCqm@*ub4jM>{ z7B#I}@Y4g$v;h+uO `lV6sH%OJZaL7UsC}nQ)cKIVKsQ626*YhUi+(Obf+xEy;|5Ato85L z)7ADwuhYy}2kN65BvV&)G#?^R%ocar(OTRz8wn#pBvcTap z;~__?^odD2n;93DkWYM&<9wd(s~VGIGjXnjCJl|KH&{>tUp*KaW!A3+RmWjoYOUuU zy+h|79W$1OeF6=k?uPAEaAg3AH>8DY6u1olVFfut&Wq?db6a2Z$&*dqq)Nh(@VJ0v z @)Zymqu_+8KM#r$5v@1^|KlQq5F#EwHl ztaHjU95QO1waI0VJ)Mrz6yfP)%)i236K~6iFK(%!^QPC5g5^9Yz{U(?Cr!ip<#c_L zIdnrxAnZZxO~G(K%|oZ%or$u^P_j%F-W}o_LcVAn`a+P_Ku5(ZNr;O|q1nQC8fXs@ z0D|Sw`TI#2r7(s N3Xg-mp~90;*Q7n&S60^nwvn35=kG0&TirVjSx?Gp*$HIHoQU z{23XF!l)gpM%~0Z3@TJ~?0`~f4 #^1EZ)@`!Nv2)0)Q-rzY#pR>56RY;pv+MZ_) zcvV79n &(x9xopWiBfW6T89!QP>frgN2lQ;Y|iMnvLak7AK_t z6D<~`iATk5t8Kb((>*(C%w2bEs@=M2!>w71>!zJ|>}cb t}YU)y5z;5>@63Y aK6D765Ujx{8~F_O~Q6S3TUz#RCQ4I z%6$l=YALogc6pw{Tq jCVs*lkZeG?i{WK(Wwf4m?M zyTS&YhWns&_R7v<$~oO2Qtg9LYsRrjBazq$JjrX(f_jxj!iM;+U1&rzH(LD#GelLY zL6X%1?5H>dj?gVMhK%oKEllKqgl3XTm*uXSwm)k_;k?bmEiB=Nolg!EP4NaK-v%9> zVC}}t>aaAZkrPX; RF7oyg7Ih0*kh$qn;w z+Q4Pqb3eUrJd+Pzu|*ZrZBaR4IAz4)C0gpYw4%G^S|;=kb&I0^8D-t9=z_ssm>k9? zv@BRsX2qJlAiFWF02xfP?MvxHGw8oPeN$^|gL`#fSF_u7+|0K&FZ28h@RldtMzLFU zZ;Vew7p+K`cZ}@lN1JO#``TU}1cQvw{i7ksRAY~p3$*=?9nS7{NL(e(`uayql+0kZ zop0;Q!Lrw5XtspRKn=yRXCRPw+puJ*vmird`3S5?Xh}zwQZY7%NH~RKPfmwK!d%v9 ze6zP|vp8)kGx65~fvd^B$&tQ{KmGg}6g4PnSD)=ayI1BV*)YXQ1N*SI=7yKPIMW$0 z7Jjb1Ilh8UC$03TxgJa2$Z~dV8`eON>>-|mV1a N>|6-_1X(neEg7*9tU|F!#l}1$qmv#ATw^s}H&dD- zY?*YQJ>Hq^>kAFWJ* d0mAJR#sA1 zx);aa%(ZRngqcG)NkdzOIU?Sz#nxX>LiABrU^sJ%hm`v@8Jz(#+a?DuwPuwy5QZi* zvVy$yESI #Vl+Pj+IldW`c!aTXHNed>ViSH^oY;D@mpqefL5kOT5By2B`o)HC^zAa zE4f6sWH5ayp(!F3Eqj_HT66YTqP*#$m9)C1y`74TB@fD${F23l85*Z4XZDI14JFs! zjP1f(B2>os3W&l@V>A!?dXm9sEN!Rw!lV9aY{8{DF1f{+JbGl2_rg*Vz4NB&EpdU< z`Z^9jRLuJ*7O7FMbd%ex16x>Kku7Sx-n&sefs9QywZAxjEcLPNmfD8
_TOmBuZCkc&+*EtjhC4UiyR~vdbiHSbJB5l@r;3TQA;!W$ zsL)jv9Y{9S-xI6ij2*DUk?p)+n!!c(5(5SXR8gF31o_HTN1T6i&H z$hM_sHc8QzH6Aw3#e{l&I8#g*?<2)4RQ&y9HSLIold82^PY*AswU<)XYCOR{v%bQD zu$|%M4LHQ(Z{9RP@G}$1QGMBwj37nItIzdCX3Cu;L-U)kewB85aV$wcrGfF&?g4H^ zqCJEPrl8AGG3fO?nTNQG?1UGcB~M1#yN1Hrvkl`<;;D@otCxb|w(>AfRP3!+hScDd zzDnSbe`KE(1O 8ubRV2`=`?iJGq?R=xs}s`j*t+@aQ*-SYg2cy2+C810mZ9_0 zTgB^y?M=lk*>|HUtx)eND|L5OBXjJW(`a8$o{*Y0MBMz63ai6*2JXhY?qIPu^l U)ZP`}6S>0nooQRg4#dM`g|GVn(HPndaw*V>fMjS8bdP zq+;7q4 O4V80*sKj*0V!TJpe2>&N{l3DR^4Zp zqLAa(JX!EGW1+a=O&XcfikHHko1idPn$TmdO)nJ*1+nB@2$C^gajQ?3%c- JsXN#re&8l>}7W`xC zs?Fe_N;rGFow1t!pE@;**|+h&DULCE#S{)nSI!;J)Qek-u~JS*Ld!lk*(1Uy{RA z27~PR%Vt_tM<`U$0GQ#ipm`g}P0bK<+14^Sw_JL1EaNv=iP%W#3(e^D+m@G9bvyo< zYF&cd`cWIbz&ftHovi^ZhI5=(NZ(yqL>*fqv;sRPVbtz4*ar_Wkm@`HR8v?Rd3cW~ zyw(d~d o zey VVO^35kNy!`XqeEJt<_tcGcWLF8N{2DPmYUeqVt3Q!EqyTpTOm!a zwT@-fT?>6W=4yU~w08G!CRY9mXB}KB-r?Nz`einp6HXZI^Kd=Q0mJA`^o56};OXd| zdkIm*w>zhSEo@|zQVyYtC9Rfl1uKLM0c_zGzZSKDz*TL;OI5^TCGYpfqoknSUQYC^ zdsJ*qCZSE^{7ov73Pw^z+{W&+we4FsM!gwf`PJc?#XqE1SnER?VJk0m$@~*tWH)Mt z^~slY)@RCO@N1FlEt84gm!+THX#E6O`{iTFYuj?isb=zVFpA!6yx>sixS~d+xLm{Q zs8LZRj#TilsolBYFG&g>wy`@G{H5;K)3mw?>qzMmQ{sH4aYE&7U3h;I!^D{?>|Cbg z=MY|AeA@q1UiZ=x9L<-$?Zres9esQ$qiGj*`z!CNrE64@&0@*psqDihF`WBetO5ne zV1pp84#nP6eraZrKi}&r!uYCOp+#buJM9E2;nL6&qkm|0RVDAB`A1)hp2AWQ4Txgv z8%w508X59XbnDcA?q1|i9XEHb++2y%v#_s70{KhOmD6V5yrZ^hZ?WuKA&SC0kS9}m zH@b>{E_-X 3E**(D?9%$gVGL`>S;U*e#U&AbtDM|)$~s9BtWS6*633hQt~<0 z?c28IgKe{8GEHb=oJsG8TDHZsI3Bj0hFK{}AFymGMKTd 8;Kop32IwP2nTf*`tmYWe9dAot8x0 z=AHY2OHWTSVBddI2{Zi(GMS8m#fDyL^#l(=80djIFV$p%Y5?eT5U_cpMu~b1G aj`NF2seLoMp5vY0b_NottdLc5OD2l+APjh6fd}C35>Hz;iN>g4eTJ zAs%C57`3X4r!ed;_jn8KB(Z9vWrC;%C9|CMn6s-JA9avHA7;YlsO=8N^@R3J&85RJ z+F1EI$L9?Y2j%OMl>z0srA3+>M5wtv@;GyI)m-92U#3WPnE`Eyx6upoAib39hij9s zX^PpBEh~Q_C`z;`W0q8Np4#oDD{@`2!*n(}&LZb@;;0>4Ooom2A@_|8Fts~aQ|3u5 zAKY6R%1dajXmA%RK51J8KZPDaTg4`glN`1G^;r?2dv0DCdU4YJ))jmeyLFwTP`|mQ zrZ#Oe*9dv@i9w-8m6LKix~IG$9j7fB>*1+PJd|XS@6~Z>(939g{Yg)RVisLNp4;5U zQ|vf4BRxev3!_t7-xWY2D)-d)1{ >n!myW! zWV+g-3cE7+C=Y5K&s3$7*|842L434sH3!lqDa%AMaM#9@LykqSVuePhKZ>67WQOWC zwHnVR6>S}lR@rBPvJP$5IanBQq6{WOY14P_^q7lj?pWboN4dJ~;eo^z9G_mtVd*ut zIdglRSEBk$zIS0v`BC7gp?M*=URT5WBRHTw#KS7}sruE8O5b>enD`(Yhg>;iU)jj% zrPcS2?;hvjal|2vMp4yvHYv{5TWIN4dE7WU!P~i76>I8VOM1~AriojHmjawYa;>8B zP8l*9I%91cFYLX$u`9;tIceu5Y3GnyY~ZNE)BZ9Q&b)^%5av|&dR%GVRjTfyHVQky z=I^1fwL&F$md@s_kU}%Z&QKf1k3v-hlT~Bm?@g5ugO9^JhH9K}o~SUEIIG=cRu?fv zbL9;Ckme;HKn$hBM=1k(nI5lN2)mHh4oa*vEVZ5;578DmwjSrXzNvEc@YVVPii)w; zK6H2WbndXO>~LLhn9O}#9~>H2rxmFL^j152dr``0lU+M)lyCm#Rbh1 cUwv;p48#(k=lTYbdRfh_hBUS2X=Bp7!wtm)7veEpuAMtt+#?{E^UF z#O1EhGUqa1{^8xusU&4k5*Fy%o1ffXlLDrN{C|3;= +&FIdX%3Lr@&jclv`EM#+!Jrz5Lrc5CQf&~t_45{nvz>np zesYBw0!mYcB(90_tU*hDIl5Bl&e&y|)SuU@P9eA5z=$apQ$*!hm#N{7=L3~kV%-Ie zpDvZ;%02n&n?8>f-Thofe(px@nI&BM)Bapzj3y|Yux^pmMJbNvl@EK`56?@UL@1M7xm?7740v62w4u5gq#^7XkxsG zrK{YYsl}0tA?aRI;hlA%U-Nk`WWb*UXwHUW)E;q|x}8IEc+90<6P#6*&S{zCw5F$` zE4`c1&&hI{vJ$UyAx#FXq}w*#ddK#fzS7KhhDn@{tmZ?Pm)35)5uaDY>6J{b)Y>!K z48ptnhIaSyU8SZy;pSZsTBfkOw{5w1#~t@ O%XLo;k&kV!?q1~r&fAA zg2m%>cKFJ_dKl%hNlDO=2WNQMyNxnoYeUMylFFDS;my=v9Lv>tJiB%ls(}OfAN#!PwD$S9y8W_}=(xNpUPCgZB zd_UHvZwRSUV`VmV@-tOt(#I8_WhQ?TQZDgou^K}8?Ri!;hZ_!gBe&ZJA|t##$kr6} zwgj)j)p}V|5rIl-PIS4VUYdJXEM}9;#Qo2_xQeOm5M$A%CSfdOjJIjtoyVt@>5?oK zeKH!a`7;XM9b4QJ6Qj&KlZ6o_VP#$?otpa`>%m*Tqxc139%Hs1x N%%4n5}9GRXWv4S*DM$pRM-e(MCn9nh%kt75~%)rnMeRT0)7gP9(z?0E3{c z%EXLU>^cl A?J7qZ3!ja1<(%lxyh4MOHPL8J$KqkBuI1pI8oK%5YIDFS z2u*U8 sU4&PDJ#;)Ji5IIxV z_n}EPmK_u<9=S@LltCYiqUH@Se~LFX+yhHeK}Rf`0qG{04Md7C?aj?PprW0FhcjhB zSF`+|-LU2mCAN7oFnFn4OqvYqj`2^ecHxSPT>+oP-h9&C)GDm>DRQ}G%2;}xeLca( z$To7WSej%#EF}0rtu?u1E7_)lW~qG@Wvyup9IES!dmSZ>Uet7YuvzRHrVPWpG|t1k zp_*9Aen~uhv9+h{-2UAzXUSz!W0a)L`yJebZnhBeX?D_M@}XK;HZgA-Un=+VsjI1d zas}7C+}d2)*f_Canv}rVi|lQ|d*l1`89CbG4!urQU+;8Nq#dix0zvTR%LBa9j_nb? zEjJoIe`-%)`8rBa5PUMq=FROE9aUw N^-Zi~M%Y|B3wfqV zp&I2$JX~{@!g+V`)(lH&^pMz|>GVYPSnSZJHC$@c2A}`s8(A|$t19bl70ZT)!iqxo z@p@0a@spHt&kq#l-kqE7uWjA3{k269rJaXKEyLS3?bx`v^2j4aj49Xc#x$?$o^9ni zsna4|`3^N0=j|;URq~>%7%_|0 U %A&0J%KNHm zOie>pTv%y|v3ao>_0z0B^?aG$Sfd#dpL41E;{zpC+R2x)6Z(zjk5P%GcCDJaX|1!Z zE=cwYN|k)(0c*18LU|Tjhb!eWh+I1Ml?AVj+Bws%bW24yH(g>D#pIEfa++e9)%4V6 zw(YWP^Gmn6;#{iJK6h()bXB{3Zsk*#shmzr3G&d?)6Qs!rTRS@V~QcYBnz<&=Q1Bu zScPes6P~@XMkcQxnS2SofDb6{%WAw-et@q{a*zwd!9Hd+JTo*j#@B*%dY645oY(U< z?$lLh=Q3I|ehLLkO+yXu4c8k~r4kG#Z|>tw^1O*VGSG<0x&OksHno@S5+cgqTwpJ* zj$=g@j?Y=f@<7Quld|+3I(+}nM@!->UWLHtVgTVZq cA*YcST$rwxW4-l*Xzq z?4 YTQBv3cO|vYn8m9_>TMxQ*Ip3mi=4K$e38mXxEw<*p;P0%viwykR$KG_&R; z;(B#@l;AK~;X4+3XHbomZZhK1RY-p*ldB;M?ZM0^wc`&uNGx0mOhRH@ZGD7qa9Dz? z`#G$&T5k-@R-=%h*>4rfRSSKmmVZPgyr-TF+b2~*vxE<)=mQUYP=N2$^J??(6eJ(A zMhEFN_jv$&+kK9PY#0b%1qff`2%i>`=AeCaWOmxVhOJL^+DAJ>fZ$hOb>QvwlYE25 zKKN 5D(!9NMJ+h~1MQF>EL?fw}# zKC@7p9OdI-d{%`ybxaf_MH3+}*cpmZ8BP1}Y4-3b1{1CHdrJO=2EIVa_jUNTcfj#G zGWNNb5Mln|obcI;@Y;Gl#bDp?)2Bp>Hi$V (<%FL3#H+A4lZX$?@Ze5|unkG#lRl*GEY8 zU2~3bs@?rdAxfE#8}Sjm{uydrpHK-O7m%O6X?EL6?)Gg`f{ !38*|O7F_Pz_VtQ*$b z&d;)W?&r6-e+kEke+PVGae+Sq{+$a7{88}C {bf{sZ^7^c4PnAH3xL z0-q*EM;qg}-NkdoIed%en8~Q}|m3{=>Zm zelGa0XfKLs*Ja>)-dNxY`23$J;(b1N^AggMzc&@`FLd|i+ yd{sRdc~67B=