From 339a78282c95299a3a7e5421db3d0fd170db3a5d Mon Sep 17 00:00:00 2001 From: unknown <985400330@qq.com> Date: Sat, 17 Sep 2022 14:43:34 +0800 Subject: [PATCH] add 20220907-riscv-irq-analysis-part5-generic-entry-backgroud-and-status.md --- ...art5-generic-entry-backgroud-and-status.md | 440 ++++++++++++++++++ .../image-20220921233758928.png | Bin 0 -> 41991 bytes 2 files changed, 440 insertions(+) create mode 100644 articles/20220907-riscv-irq-analysis-part5-generic-entry-backgroud-and-status.md create mode 100644 articles/images/riscv-irq-analysis/image-20220921233758928.png diff --git a/articles/20220907-riscv-irq-analysis-part5-generic-entry-backgroud-and-status.md b/articles/20220907-riscv-irq-analysis-part5-generic-entry-backgroud-and-status.md new file mode 100644 index 0000000..19e4667 --- /dev/null +++ b/articles/20220907-riscv-irq-analysis-part5-generic-entry-backgroud-and-status.md @@ -0,0 +1,440 @@ +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1-rc2 - [autocorrect]
+> Author: 牛工 - 通天塔 985400330@qq.com
+> Date: 2022/09/07
+> Revisor: Falcon ; iOSDevLog
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Proposal: [【老师提案】Linux IRQ 子系统分析 · Issue #I5E5EP · 泰晓科技/RISCV-Linux - Gitee.com](https://gitee.com/tinylab/riscv-linux/issues/I5E5EP)
+> Sponsor: PLCT Lab, ISCAS + +# Generic entry RISC-V 补丁分析 + +## 前言 + +郭老师在 RISC-V 社区中的新补丁 [[PATCH V3 0/7] riscv: Add GENERIC_ENTRY, irq stack support (kernel.org)][005] + +补丁描述如下: + +> The patches convert RISC-V to use the generic entry infrastructure from kernel/entry/\*.Add independent irq stacks (IRQ_STACKS) for percpu to prevent kernel stack overflows. Add the HAVE_SOFTIRQ_ON_OWN_STACK feature for the IRQ_STACKS config. + +补丁将 RISC-V 转换为使用 `kernel/entry/*` 的结构体。为每个 CPU 添加独立的 irq 堆栈(IRQ_STACKS),以防止内核堆栈溢出。为 IRQ_STACKS 配置添加 HAVE_SOFTIRQ_ON_OWN_STACK 特性。 + +RISC-V 引入了新的特性 Generic entry,本篇文章将对该特性的背景、好处、各架构的支持情况、RISC-V 的迁移情况进行讲述。 + +## 背景 + +在引入该补丁之前,RISC-V 的关于中断的处理很多都是自定义实现了,没有使用内核提供的一些好的中断处理接口,导致代码比较冗余。 + +还有对于 syscall 的处理函数也不够简洁可读,郭老师对于此处的代码进行了优化。 + +补丁 `[PATCH V3 4/7] riscv: convert to generic entry` 是进行 generic entry 接口转换的一个关键补丁。 + +补丁中的描述: + +``` + - More clear entry.S with handle_exception and ret_from_exception + - Get rid of complex custom signal implementation + - More readable syscall procedure + - Little modification on ret_from_fork & ret_from_kernel_thread + - Wrap with irqentry_enter/exit and syscall_enter/exit_from_user_mode + - Use the standard preemption code instead of custom +``` + +- 使 `handle_exception` 和 `ret_from_exception` 在 entry.S 中更清晰 +- 摆脱复杂的自定义信号实现 +- 更可读的 syscall 过程 +- 对 `ret_from_fork` 和 `ret_from_kernel_thread` 进行了一些修改 +- 新增 `irqentry_enter/exit` 和 `syscall_enter/exit_from_user_mode` 调用 +- 使用标准抢占代码,不使用自定义抢占代码 + +## 好处 + +基于之前的代码对本次新增的补丁的好处进行深入分析。 + +``` + arch/riscv/Kconfig | 1 + + arch/riscv/include/asm/csr.h | 1 - + arch/riscv/include/asm/entry-common.h | 8 + + arch/riscv/include/asm/ptrace.h | 10 +- + arch/riscv/include/asm/stacktrace.h | 5 + + arch/riscv/include/asm/syscall.h | 6 + + arch/riscv/include/asm/thread_info.h | 13 +- + arch/riscv/kernel/entry.S | 228 +++----------------------- + arch/riscv/kernel/irq.c | 15 ++ + arch/riscv/kernel/ptrace.c | 40 ----- + arch/riscv/kernel/signal.c | 21 +-- + arch/riscv/kernel/sys_riscv.c | 27 +++ + arch/riscv/kernel/traps.c | 11 ++ + arch/riscv/mm/fault.c | 12 +- + 14 files changed, 117 insertions(+), 281 deletions(-) + create mode 100644 arch/riscv/include/asm/entry-common.h +``` + +通过补丁可以看到本次删除掉了很多的代码,使代码更加简洁了。 + +本次改动主要涉及 4 个部分:抢占式中断处理流程、上下文保存、do_riscv_irq 函数的实现、syscall 处理函数的实现。 + +之前我有篇文章是写的中断的处理流程,[RISC-V 中断子系统分析——CPU 中断处理][002] 文章写了关于 `handle_exception` 的分析。该函数是产生异常时的跳转地址,主要用于中断处理、异常处理、syscall 处理、保护现场、恢复现场。 + +### 抢占式中断处理流程改动 + +此处就是对于 **标准抢占代码** 替代 **自定义抢占代码** 的相关处理。 + +当前的修改后: + +```assembly +@@ -14,10 +14,6 @@ + #include + #include +/* 当未设置抢占时,定义 resume_kernel 函数为 restore_all */ +-#if !IS_ENABLED(CONFIG_PREEMPTION) +-.set resume_kernel, restore_all +-#endif +- + ENTRY(handle_exception) +``` + +此处删除了如果未使能抢占的一个配置。 + +#### 自定义的抢占代码 + +当定义了抢占宏 `CONFIG_PREEMPTION` 时 + +```assembly +/* arch/riscv/kernel/entry.S */ +/* version:Linux 6.0-rc4 */ +ret_from_exception: + REG_L s0, PT_STATUS(sp) + csrc CSR_STATUS, SR_IE +#ifdef CONFIG_TRACE_IRQFLAGS + call __trace_hardirqs_off +#endif +#ifdef CONFIG_RISCV_M_MODE + /* the MPP value is too large to be used as an immediate arg for addi */ + li t0, SR_MPP + and s0, s0, t0 +#else + andi s0, s0, SR_SPP +#endif + bnez s0, resume_kernel +``` + +当使能了抢占之后,执行的是以下代码。 + +```assembly +/* arch/riscv/kernel/entry.S */ +/* version:Linux 6.0-rc4 */ +#if IS_ENABLED(CONFIG_PREEMPTION) +resume_kernel: +/* 判断此处是否需要进行抢占式的中断处理 */ + REG_L s0, TASK_TI_PREEMPT_COUNT(tp) + bnez s0, restore_all + REG_L s0, TASK_TI_FLAGS(tp) + andi s0, s0, _TIF_NEED_RESCHED + beqz s0, restore_all + call preempt_schedule_irq /*符合抢占要求,call 抢占调度函数 */ + j restore_all +#endif +``` + +#### 标准抢占代码 + +上一小节描述了自定义抢占代码的实现,改动之后,在 entry.S 中的抢占相关的判断等代码被删除,不再对抢占进行处理。 + +标准的抢占代码如下代码: + +```c +// arch\riscv\kernel\irq.c +//version:https://github.com/guoren83/linux/tree/generic_entry_v3 +asmlinkage void noinstr do_riscv_irq(struct pt_regs *regs) +{ +... + irqentry_exit(regs, state); +} +``` + +```c +// kernel\entry\common.c +//version:https://github.com/guoren83/linux/tree/generic_entry_v3 +noinstr void irqentry_exit(struct pt_regs *regs, irqentry_state_t state) +{ +... + if (IS_ENABLED(CONFIG_PREEMPTION)) + irqentry_exit_cond_resched(); +... +} +``` + +```c +// kernel\entry\common.c +//version:https://github.com/guoren83/linux/tree/generic_entry_v3 +void raw_irqentry_exit_cond_resched(void) +{ + if (!preempt_count()) { + ... + preempt_schedule_irq(); + } +} +``` + +之前的抢占相关的代码是在汇编文件 `arch/riscv/kernel/entry.S` 中进行实现的,未使用内核现有的接口。 + +新增了 `do_riscv_irq` 之后,调用了公共函数 `irqentry_exit`,完成了抢占检测和调度的工作。 + +充分利用了内核现有接口,使得 RISC-V 代码更加整洁。 + +### 上下文保存改动 + +```assembly +@@ -106,19 +102,8 @@ _save_context: + .option norelax + la gp, __global_pointer$ + .option pop +- +-#ifdef CONFIG_TRACE_IRQFLAGS +- call __trace_hardirqs_off +-#endif +- +-#ifdef CONFIG_CONTEXT_TRACKING_USER +- /* If previous state is in user mode, call user_exit_callable(). */ +- li a0, SR_PP +- and a0, s1, a0 +- bnez a0, skip_context_tracking +- call user_exit_callable +-skip_context_tracking: /* 删除了跳过上下文切换追踪的函数标签 */ +-#endif ++ move a0, sp /* pt_regs */ ++ la ra, ret_from_exception + + /* + * MSB of cause differentiates between +``` + +删除了关于 `CONFIG_TRACE_IRQFLAGS` 和 `CONFIG_CONTEXT_TRACKING_USER` 的相关调用,用于中断的调试。新增代码设置返回地址 `ret_from_exception`。 + +```assembly +@@ -126,134 +111,26 @@ skip_context_tracking: + */ + bge s4, zero, 1f + +- la ra, ret_from_exception /*代码上移,删除了跳过上下文追踪标签 */ +- + /* Handle interrupts */ +- move a0, sp /* pt_regs */ +- la a1, generic_handle_arch_irq +- jr a1 ++ tail do_riscv_irq/*更换了中断处理函数 */ + +/* 以下关于异常的代码被删除 */ + 1: +- /* +- * Exceptions run with interrupts enabled or disabled depending on the +- * state of SR_PIE in m/sstatus. +- */ +- andi t0, s1, SR_PIE +- beqz t0, 1f +- /* kprobes, entered via ebreak, must have interrupts disabled. */ +- li t0, EXC_BREAKPOINT +- beq s4, t0, 1f +-#ifdef CONFIG_TRACE_IRQFLAGS +- call __trace_hardirqs_on +-#endif +- csrs CSR_STATUS, SR_IE +- +-1: +- la ra, ret_from_exception +- /* Handle syscalls */ +- li t0, EXC_SYSCALL +- beq s4, t0, handle_syscall +- +/* 以上关于处理异常的代码被删除 */ + +/* 处理一些其他的异常 */ + /* Handle other exceptions */ + slli t0, s4, RISCV_LGPTR + la t1, excp_vect_table + la t2, excp_vect_table_end +- move a0, sp /* pt_regs */ + add t0, t1, t0 + /* Check if exception code lies within bounds */ +- bgeu t0, t2, 1f ++ bgeu t0, t2, 2f/*修改 t0>t2 之后的 PC 指针偏移,此处不明白为什么从 1f->2f */ + REG_L t0, 0(t0) + jr t0 /*跳转到异常代码处理地址 */ +-1: ++2: + tail do_trap_unknown ++END(handle_exception) +/* 再往下则删除了 syscall 的相关处理代码 */ +``` + +以上修改了中断的处理流程,改变了中断处理函数,删除了异常处理代码,修改了出现异常代码时的 PC 指针地址,删除了 syscall 的相关处理代码。 + +删除了汇编部分的 syscall 相关代码,放到了以下位置进行处理,`do_sys_ecall_u` 函数在 `arch/riscv/kernel/sys_riscv.c` 代码中进行了实现,提高了代码可读性。 + +```assembly +@@ -582,7 +398,7 @@ ENTRY(excp_vect_table) + RISCV_PTR do_trap_load_fault + RISCV_PTR do_trap_store_misaligned + RISCV_PTR do_trap_store_fault +- RISCV_PTR do_trap_ecall_u /* system call, gets intercepted */ ++ RISCV_PTR do_sys_ecall_u /* system call */ + RISCV_PTR do_trap_ecall_s + RISCV_PTR do_trap_unknown + RISCV_PTR do_trap_ecall_m +``` + +### do_riscv_irq 函数实现 + +之前在 [RISC-V 中断子系统分析——PLIC 中断处理][003] 这篇文章中,对中断处理的流程进行了分析。 + +``` +[nfk test] goldfish_rtc_interrupt +CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.17.0-dirty #85 +Hardware name: riscv-virtio,qemu (DT) +Call Trace: +[] dump_backtrace+0x1c/0x24 +[] show_stack+0x2c/0x38 +[] dump_stack_lvl+0x40/0x58 +[] dump_stack+0x14/0x1c +[] goldfish_rtc_interrupt+0x22/0x74 +[] __handle_irq_event_percpu+0x52/0xe0 +[] handle_irq_event_percpu+0x12/0x4e +[] handle_irq_event+0x5e/0x94 +[] handle_fasteoi_irq+0xac/0x18e +[] generic_handle_domain_irq+0x28/0x3a +[] plic_handle_irq+0x8a/0xec +[] generic_handle_domain_irq+0x28/0x3a +[] riscv_intc_irq+0x34/0x5c +[] generic_handle_arch_irq+0x4a/0x74 +[] ret_from_exception+0x0/0xc +[] rcu_idle_enter+0x10/0x18 +``` + +以上是之前的中断处理流程,当前补丁修改了 `generic_handle_domain_irq` 为 `do_riscv_irq`。 + +```c +/* + * generic_handle_arch_irq - root irq handler for architectures which do no + * entry accounting themselves + * @regs: Register file coming from the low-level handling code + */ +``` + +根据 `generic_handle_domain_irq` 的注释可知,该函数是架构没有自己的中断处理入口的时候才会使用的一个接口。现在 RISC-V 已经有了自己的中断处理接口 `do_riscv_irq`。 + +`````c +diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c +index 7207fa08d78f..24c2e1bd756a 100644 +--- a/arch/riscv/kernel/irq.c ++++ b/arch/riscv/kernel/irq.c +@@ -5,6 +5,7 @@ + + * Copyright (C) 2018 Christoph Hellwig + */ + ++#include + #include + #include + #include +@@ -22,3 +23,17 @@ void __init init_IRQ(void) + if (!handle_arch_irq) + panic("No interrupt controller found."); + } ++ ++asmlinkage void noinstr do_riscv_irq(struct pt_regs *regs) ++{ +// 该函数在 [PATCH V3 5/7] riscv: Support HAVE_IRQ_EXIT_ON_IRQ_STACK 又进行了修改 ++ struct pt_regs *old_regs; ++ irqentry_state_t state = irqentry_enter(regs); // 新增入口状态获取 ++ ++ irq_enter_rcu(); // 接口 ++ old_regs = set_irq_regs(regs); // 与 generic_handle_arch_irq 一致 ++ handle_arch_irq(regs); // 与 generic_handle_arch_irq 一致 ++ set_irq_regs(old_regs); // 与 generic_handle_arch_irq 一致 ++ irq_exit_rcu(); + + ++ irqentry_exit(regs, state); // 新增状态+推出 + +} +````` + +[Entry/exit handling for exceptions, interrupts, syscalls and KVM — The Linux Kernel documentation][001] 中描述了关于 `irqentry_exit` 和 `irqentry_enter` 的作用。 + +### syscall 修改 + +补丁删除了 `arch/riscv/kernel/ptrace.c` 中 syscall 相关的代码,在 `arch/riscv/kernel/sys_riscv.c` 中新增了 `do_sys_ecall_u` 函数,用于处理 syscall,**这使 syscall 的调用过程更加的可读。** + +在 `arch/riscv/kernel/traps.c` 和 `arch/riscv/mm/fault.c` 中新增了关于 `irqentry_exit` 和 `irqentry_enter` 的调用。 + +## 各架构的支持 + +各架构对于 Generic entry 的支持情况主要看对于 `kernel\entry\common.c` 的使用情况。 + +![image-20220921233758928](images/riscv-irq-analysis/image-20220921233758928.png) + +当前使用 `irqentry_exit` 函数的架构主要有:loongarch、RISC-V、s390、x86; + +arm64 架构实现了自己的 entry-common.c,与公共接口不同。 + +该接口是在 2020 年第一次引入内核,目前在各个架构上的支持还不完善,需要大家共同完成。 + +``` +commit 142781e108b13b2b0e8f035cfb5bfbbc8f14d887 +Author: Thomas Gleixner +Date: Wed Jul 22 23:59:56 2020 +0200 + + entry: Provide generic syscall entry functionality + + On syscall entry certain work needs to be done: + + - Establish state (lockdep, context tracking, tracing) + - Conditional work (ptrace, seccomp, audit...) + + This code is needlessly duplicated and different in all + architectures. + + Provide a generic version based on the x86 implementation which has all the + RCU and instrumentation bits right. + + As interrupt/exception entry from user space needs parts of the same + functionality, provide a function for this as well. + + syscall_enter_from_user_mode() and irqentry_enter_from_user_mode() must be + called right after the low level ASM entry. The calling code must be + non-instrumentable. After the functions returns state is correct and the + subsequent functions can be instrumented. + + Signed-off-by: Thomas Gleixner + Acked-by: Kees Cook + Link: https://lkml.kernel.org/r/20200722220519.513463269@linutronix.de + + kernel/entry/common.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 88 insertions(+) +``` + +## 迁移情况 + +[[PATCH V5 00/11\] riscv: Add GENERIC_ENTRY support and related features - guoren (kernel.org)][004] + +当前郭老师已经升级补丁至 V5,还在持续进行中。 + +## 小结 + +本文分析了郭老师在 V3 版本上的补丁提交,对 generic entry 的背景、好处、各架构的支持情况进行了讲述,希望大家能根据本文加深对中断处理的理解,后续我会继续跟进郭老师的补丁提交情况,向大佬学习! + +## 参考资料 + +[[PATCH V3 0/7] riscv: Add GENERIC_ENTRY, irq stack support (kernel.org)][005] + +[[PATCH V5 00/11] riscv: Add GENERIC_ENTRY support and related features - guoren (kernel.org)][004] + +[Entry/exit handling for exceptions, interrupts, syscalls and KVM — The Linux Kernel documentation][001] + +[RISC-V 中断子系统分析——CPU 中断处理][002] + +[RISC-V 中断子系统分析——CPU 中断处理][002] + +[001]: https://docs.kernel.org/core-api/entry.html +[002]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220712-riscv-irq-analysis-part3-Interrupt-handling-cpu.md +[003]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220919-riscv-irq-analysis-part2-interrupt-handling-plic.md +[004]: https://lore.kernel.org/all/20220918155246.1203293-1-guoren@kernel.org/ +[005]: https://lore.kernel.org/linux-riscv/CAJF2gTS0Oe7AHcNf1+uGHX=S0bZoKHX2nS-+O72tjjrjq4wScA@mail.gmail.com/T/#t diff --git a/articles/images/riscv-irq-analysis/image-20220921233758928.png b/articles/images/riscv-irq-analysis/image-20220921233758928.png new file mode 100644 index 0000000000000000000000000000000000000000..5729235f0e5bfbf1407e53b70143717eb4856a90 GIT binary patch literal 41991 zcmbSzby(DGv@J?Y3eo~93et@<0t(V7-Q6wS5@Jva(lH|4&Cn^`HN?;jL&MN-o5#Nf^ttA1?B!zEDZ1p zf$qmm6qF|@GH=9HJ(9N@d{tG~Yxb{+3E#gKMLQst`u53~gxc9yvYAtKT8;DhB+o;V z#52Bvb#hyg@NY7suIfrke`NBML^wNO_e!~V<8zPasl(=&4NgNwo#5_A8V%Q>ONrRfRZ!E36&?97dAQrnxTe`!659cp~0 zmXM`^Pq0uE@-=j3cX1wA)x17yPY*j=Gm)TDIx&Kxi4)r6VQeBV_5{WHc%z0N1U}I` zh#x*N5)*vEW^d~6E>4Jc?~_AQ!;p;~`mweg_^d#==R@GKGji+-@Jv+dej#`*^5<)2 ztiT16|Lsp_BEkR4&<_tGY>=QFK+5HZ@ImS)J!F#{7b z^JSfoJ~0(l@74KH&0gc>*>?FL$~$>^)9$DjJg;6kpKNPwZEg8Xe@S`*zT?n58XDS< zs3-|JIh@ff1w_niA=56xwf>~e44G(4JG)f}|4S+c#bo7Ek>erBH*elJZVWw@m6NOU zO{uLFgzL|EHTQ+&URjCzIU<%?+mAU<>kYk;zW!#?d|C^YRk6c@%_(( z7x_XG*JF%fcA~8(*`XW*OorEojJW8QqOCV7#PR)XyhnAX2MT@EHg-EbMla|pDlZoq z>HA7kyxqj|{V&;8ga@(&V8mM?k2E?5QT{r;lYPkk@4+-%&RVRuS6EBL<2(PYJ@{mH3C7VFGM zuy7nM8_GRBJ@F#md|+LdzyyX-@_sk#jeST>t>En~(zBQgdYd@i5A4plq zEtxH)+~CEV4`FNVY7lPpxu5M;V2<1xFPOtC&&F4a9KUsG;I%B&@824S3-CTwQrV;K z`K482gS1vJo*SGhbuPSgyNw+eig5f~zHQK;eUvBqi}C$O23KB2lz-j z1V#F!4#(f?L23#P?es;>@+0C{v4Mt92Qhk&jUKqKqm)007dc_M+zG7w`6pYW{I&o| z&~A-gCP5pWnAnpk7so*vUIB%2oAo?GNlZ#QABEif9aR$R@1*tb+kwt2zW(HH)NaaE z>M$=V74cZc(C|q>KtS-9FQ|?yT@O$8<_B-CFLQHq7pvg*2)B6?6O;4vLH{C*y^9Mk zu!m$66jn<+Y3TU)s^E6sy$TeT#gA|5=tGnHC(9wq8Dm_`-zQzqzVEa(%!sH_U4@Y= z={@xd*0=gbS68U@yj~8e#dE2vKjo`aek{N6sN=z_?6sNxM-ls{v$A60$<`6{_OX?P ze`ck>rmDSenPD9Be;J^L^rMzOQA%gD?;2sOA0 z3=6|;ZEYnN7^!Pd1H-NE*45Q@8xDnZN!Vt&HzbDkD)(;|LX{O#@SGrp&@XqcG! zm%muJg@u#Brd3f>8&CIkR8wj6LRv%cw(!2b7UHpfY$-8Qos%~7+eZ+QmFnp*$gcbT zFN5<$IwbQ8wxhK>L;1a5lqJmOBpgDAEEWm9%L03cI@nc#5Du{S8*eUb+_opv>@TMV z{W?I@_!<$h*7_MIUY>rp@zTB$V+*e{g4(1d5MB7@Y#9Y?r~J!~Fp9QlB~ckiM~*l) zy~A43q^PJ?Ndl2K@7`e<_J=|3;2mJF_xQbzUpAfhJJj!*I5>@BYMZPw?iz?D1#0bS z_hQ~{T~eLjzHwXSN%5Cw4fP1OPk9#gm#!j+^*Ow7$fQF1M`L$hi&r%`f4m-i%u+Te zO`JdEPckR@tszGlIOPAgqhn-bMB?q|>)RQK-vwhdy~3Z0ieKB?wl~XSH$lstktSRT zmNqudaD7?X2L!_VDE?Q=w2aKm>1Ab6U%z4vByV~!`>w`lpxAUjmcm8{-GWhHql%zNX+$G94>Mz<~I^LeUjcJIbb$Z2q`)M`{09vd-yGcbK^x=Y_* zfcmO)rzp#BRQGHjn!vu4$?VoHsmuFHKkSlP zd(uC6s@Dt_FyuZqK7PWbPH`P!rer>cxB303|}f_Ji@peE!(`f;LU%%Ob;SZGr6{r*;~X z#L{;xj>S?Gju-W)#npwfHQIYwvxYuyXWjk4Nvzz?{tM$|Kh5X`1iR{szF)`!wz7NsF$$y~voUg`# zEzWH}9WWDeGis38p-QlErc^Za_RBEHv?| ztm5i~!S{N{^9$`y(Zk3&0|!Mf3wp(?R1)RRXNes?GOa$1mHR=0wn%EO?COeiR}#DC zVNgolKI}du(G@4Wpz=>BTwzSd6ZXHkDy}0oEySxcSbz!zf38W*2askVV$J;4L#@%T zVRonS(=G;BFtipSds&*c(wE0Z*ZGfi>-X=*S7%Pb z*T?MNzJ1$7+MG9V+phH`^redETnk%|y)++8?LR+Sr{J~zRqMOj6NBP&*v;T`bH1*) z6C4r}1*X^3G{ei*#)kRDix=_z=Ct#lpJ44)1DJz_gJZHjkTO&4g!&1@Z~LZeH9dXWNZlKK_s^T7*+=_r1jIyK!Bns8mG$)phSDUl@$u=OKM!8+Y@+9JAqP2s3mLy~ z8gOznD5gQX|L1KezuPu>XC$r0>0q)zbWYAo(X$0qSNKwU==hVXg&=|tA3n5#-F6Nj z)|m5pf0Fc@H^FFH;v3Q+$;ima7y(cupTrm5(EGCdw6uc& zl~`F@KVxB$pG{3p#%(S&={!4v-1dQqkLNVO@IKjoDj<-suwcmB1?~_H0@cmcy4dMX zKUScjw6->-f`S4MA0L<1$aCJI`?_^*;px(mM1+K|L5!0O!QF)Mf(3iY;`0kJQGAD8 zQhiS-zK6~)?Ju^0Wh)+AzQa5xXMQt_rvd8NAxCTdbl`R-oe{ZHHuCbgT3T8lPc~j1 z%GJqh7;OxtS$Dt2?s&kgQ3OuVPxpD>35Q0#XIRh&_wL=x$jbV-HO9z7ic@YeNG~Xu z2w(xqpFe-j4kG=-6tkCm*_&4Wej}c(9e~dJ^`?q=Yc={%NPfX@x8(VFI_rKkY0_jk z^jlo9(;qy0EUeir$KH?;%jNZb9#i{8x(HZ0ohnk$9Boskv>h>wJ!A#}=6)=*mPOa!ja_CBF#fa<(>=&X3me7Ay@hF|nkZTb1C~%+&x)8k7Q5ox424 znbdFXs9rXnCix|=Q~K@OhmTfHp{!V_sbC`$Q&acTMGD{7i6!d&`**;lBa8R`yO-woJ&aFP;;G+0n7Fu|gY#1g_6#XC8d^ zS7J2WsxP9$LqicTS7E17wCNu|2zk9--`eCOUi7#KQg3c|tW)pK1u%S%gLgM)O>o<&U< z_@`jfoNf##=qBmzI zcRzJ@uk2?Gmpj6@*1^t$P854zU%1{!4I&rj$4XI@2I%81Ckc3;u&87!?jRA2GduxR zbrglIcV|h+oek7I3m{6ET3D!PX-zH537?>R_wQoWDOce{C;QB<+ z-X>PsKvc!3!ljTFFVe5UGVU~@j8ox`AdvH}r>5_xut1IGl2zuE?79$q zfxsNR>$u#3r|)yn?zhvXQ0WzS7qY+pUm;t3pOeTEWIUfRgMPsc+r*H6E;Ie_>)QWP z^0t1WV|Ng6s6P<&^z0RytupC!qwza4f}BYITNWSWBkyituP$6D%}nwCsFeTbCt_ng zILwbB0&l>0d=G@4-91sPz$dttfx?~xm^3moM_u=&AaLp7%W;~>dK;Oi%L9#nb<7gO z8AD%oeHtm;TRyjar>)xDC-?Sb-Th+&qe9AQzS29bH!VKY$%kVQm)HW?%=6;6_3mSf zx~~RbTD`v~7Ed_S-45pvsG8Et+I?|xB1ma)iTz5LraJH`!7cN4O-g=Z(yOOjY`n`2bw90y#MHt6v{1Qef z$aFdrpv{!Yc*^R3y+sikg3HEmevM5`@mQDGz6o(XYI(=o}vRoG3Vz0&u>7zef@3a-O3F>=*p_G$esOp@f^2sOG zNDN}+o(m(0Dr|9BK?GYc>IemLs+m6|==;p&qu}3hQO1~fS*Z!`L=>p344n}{LxR{5im3lf0 z7~<4MvMja2PIKwMdDA4^i(xOV!98vHy-fhSo(>yhRL(44`T0^5>fNufl=@4vD7E}% zFx3T49ukZOM-PgC6#ApERr|hRGgV8xCbcPHUT1|j)cB&G24=j)aET4Fozu3rkxmL= z+G$+TgKg&NDxYBT9X-ic7r{ytb8%-a6}|PJyzjd)95;Ctn?+5qN@8GM@k-VqdoI=p zgItu3%Np`U!;uQCq>nXO?9XE2RH|O2_7_9TPP4>-li6;bS}b)9IlUBnlGA-3sDAczuSK=?BEq?hGnQWOA5+g9oFpbp~`CTz&FxE~s#cB`B~} zv!8QP5@*VqtGf}Z^xW?-Lt!hgw2nyO=HMoE?D6X4yqXce{PcqpRS!!Sy&!=q{^lZz z*P{menGC;0bdhz1Oz4C7&7seAv6|e9&?(zlalR(CU1Q8JT%4@kg0kXdZdYz{i@L## zx4Fujdiz!88FtjCxtZGpwnaK`z{+POPfHI^$jE>D{InD%_Dn-*C%vmzkmrmqeP=;S zB1_V_l)g)GR?ef3Et`eS^24*B3tdfi3Gi03;72&V0CCVl7lFxIb%#@0R`_=Lzld!P)6(UNdxfgTRDkAsp?tT?w@iwKNSk zSIDG4$5@iWSRftSWt>Noltb_t_6+WOHUDe8kg&JUV+72L9wsw8dyFfF{w^vCUo^z~ zJDVfvB{%ZtzRo9SVnS{j({atybpuOlla5K3=EUKMP`mURq9@;0hKKrs3bf68B>O=nObA*s9X{bVqaUUB zE1H@bbA~ZiXOtGw)~ybVo3nh~xsWOb7G0kqj>y0rGUKSrmNanmtrqoF*_96B?YF3QJ(nvY)Bdz`&%=5b|~*lXa*S(1tOL^kV;rERUBKG-B!|0Z}%3NdH%B{e(2|HWS) zp+ZiG>lGE&*Kd_DljVCv-)_$DCyMdkZ>vPL;A8WbU~XQFxW}Muoy$=-L9)qPvN2JrGZpe^Hum2f^H+f>(cNd?C;X?Vu7bU$RP#oqT(}RXLvsgog11 zul5tOhan|Q;IMRxM22meOXYV&)) zqHwLVm+OW7C8lam^K+IL)&|yF1L(1&sS$aS^lNEM{rb&Yu?EmYwPI#`V-HID2Xg(%tcsTUq})0FVQ3ft*{b& z=XUE_#x248SwI`YlDloe)8-r6LVV$g^|d5q ztEQpcvtn>$oYJn-Fn*cV*Fm#o0o(EV-77^B;U!1_A6SdwdF3spu4#-WbMx1(6tEU% z`K!#)dlU%U&yz60t*>SwZSTC4Hm+hON1bL1hG`1dbVIJ6Ea;h-w0!JHEKlX$4+4RL zy0U+)q(5V$GNCqc)7dp1KH(f#K*WhTPpvd zYpb&bH~DWjGSAs1i{S_>y z!V0}Mdi53>@(mE>h@qDTQX8&U+(R89TyK1NcbWxx^Ab;cqF%-q*T=d?rR1UV!rr@9 z(kB^H%Rq*c=HG0o{9-q->>*C9HA7y$4b%OQBPyv;yfiD}nd*u;eo^d7$QetK{~%$} z!zUkm$7jA)c1M+C^@&-nPVG*3I@u*0TU?-%oaP)m{1z!3M5`~iaF89)Kr=8j#*@;h z%kg;#LR*eui>@H>6lH!eeTVN3iLl46Eq&(dT15rp%yTxJUFcs3jdH5gmhMjRGvh7Z zI~6web=~uk@HbdEdl4k&!LKevJCUGhlQ`S5Q+}!{xbHU9e{}8gjnVttfa~K`cXEZM zJCHWDRSh*$9Y1*Z&>F{%_FtfAc4Qw&<4t z<%a^|{2?jnK#7qgh45sp@qVSvgr!xDgi17eXeKe4I>DX()cWbgb5krj>4-bQMe!0S z3-WLN8a{g#GCDE>NLMmTyN0blF{yN!r~qI;UtBcWa1o3Xhy65a3rQQ@#3CR-98c~J zHBs12KY*>`FZ1C9u}^VhdfqXq;JY(u% zoOb{7a$~SdnFB$~iZvv%tGnCiaHadP$n;_zVD9heLfv|gpB)`i5Pbu{20|dxQc@V@ z=KV`>2lh$5QNwspPV>$Cc?SS0_s^eaoC(%r*Io^PEO`usui6<6jng>_PEJl1t+L=x zpHK!;gw_xJF1Dudo&#Ds9cEl7`!6lMd+0e)46U1;804KM#kakAQJ~!!HUFr&i46I& zoSOGQI^*qq-DUZ9`Z?jtnDI6qOWbbg$pz=yRHm5`bceWPm8_DZIK(D1kf9gMdCU2K$d3rdB;B;Npb6D1?+r7)u;T? zq*)Ii80M~I29mwRM5o5 zulFXy-=ADBM-)D?78Nsq$v_Ta@9T%Az0?mBaor|hzXc)^MOH-5vnG@(p*eYZ&jbXz zvnTF2C&0ToQ@zYqRLIQDZF6=%b0j%9zy=$y3E$ZFU>k$T$Y}RN-la#D2l^yt_c8861n*Z;QE1pl zUjEJazr8DK+NjzWiG`-6UuI@r1-QUSMS3pkKc-Hn4ov@HnXLOYvojfp5R8puM2?vD<{iM9M5BNQ8c|25MRh#}}<~^LvhfbHIQ6vdxkwDmuDtDDCOrzki1& zJ+MRDTNhfy-$+Su`grgIrXeFOO1{r?4@y48|L&=)r6 z?&}*gdo;0&*e#cnPquWwJwHFcJ3xQ`egl+_%KP`?s;WHSz7g*XP`|{b;v4Hvbw5+v z6>4VEXNy3XQ_Z&Bnp2~px%-7FS!I2!BU&)*OeK)Gult`~0NF(14_ZaLuioc%Ym#lI zeT*au?md@we>32W;ODS zmOv+K+MBHzT06cZMkXfXwvcdJ_=%vnxcCOrt68wwaaESN>2j8yO~1a2+I^-a0M!hL z0zb(NW(qL!0sU#rLpfEo@B?xehd6$67 z2kWMU_e(aZ&aI*U>|pt8q>>@HovNzpk6*v!0rh2Mv5Z%X*?-?B{CtFfoa~;_a5VOEG>vH`WzWC| zDA!2ay|j$N8JPpw{wzvrADrOq_nP(568&t^_#2x#*4e%vr3EYyw3+4Hl~Y8THu_}j z`Wcl-CQJevwAa~kzjJfD&FD?J#&h6^tu4URt3x|G83>7qgQjfVdQ#a9s&ek_9dB~G zwa8gDRp+Lth)){&8O;9h=JsvRoeEfgbou=G z^PF{0XZGFQ25vBW{Js}qUb~BJYVyhPSg*nMqm%B)qY%(6|KI@811d5K4k?Q=x5H=l z#xn`u)c$_fE&tAt5U||RXXhUMNwt^Vpw4Usec58M#0)1tPM%2HwE;*O3bdMLf! zHA=o_H)}}_K=?-rI=ZdTRjzw2{rwibJ=XxYs(UrKJCZ5)h=c@ekM3Tbf%Z_Oo7PTY zD@g2K$v^e$V55x6C&$j4zoCHzF-HvZS!E9mIhM^u2Bv9m3}|%r{k4*ixN;*zg{U$q zM6%j2F8JVPLBCwk)<<1j&U+3Y)Y9n?HD&{KRT@UJUBV4+iAO&@GVa0Wh|D$^IR~9U=s;Q}kQE-QplyC$F29DkP0tnr}K(7<`rmCut zj0{t7R6z6#qY+629NocEXwvw^wqD)b+MyXvoqLl>oZ5ZGsiI4SN27cBl)Sfh-9;Yc z$B);VnmJy(8^h`2HVP?;d9nDElv@;He#vk@kIU^aDLU{@$#?I*PMq@m0KjI6%+7Li zK1{tS**nUMq3iy>9)&l4yg9*dL*2E-VB1e8#@{uD zQ!6$0P5zN)WEHaMYIvZLr_W_JHjKU5_r6qF|Cv7s`B^UHi^JKlBQDvk=e z3_^gZ#e7>LZ{#oxw&u1}HEj7@SU9Z48LuzJ#*vcn;}@V^6 zZskLZEUm24s;UqMcC}vPH7=P8n7rDH>XO|w|iDr19Cv$j#{ zZJh_`x3R<6>d=z|89eqcr~EIfB_^caIcE+4f0r1wBSS+&=fn7C5cF3u8zhlGIT*h$ysmaC{CrYn<3lDKHuPSy)aST#@4nrf z;CCEkvVXD9LV}yahhr}hv8zP_0pANAR#s~N?xUlllx=9^Gchs9`Oz&Iuvjp(w6wTQ zj8S?5|X7F%*Bondd>V18K1>@^W6#J_y6;|;2A`c3iRk;1AcB0{{4 z;)*@ta0mCEqg@jc9VB9q&f`KIgs41i5=4D#t(6IDBfW8ULF!Ey^nhoN`uDC4lchuw z;S@T^}T&CTrXwzPOr`%}agr^3?vyOz)??=D*a!pqn<2yjdTS?wJnHW!BR| zV_M^vRi(0jlG-nshDY$1r$2>8uM$+AXoq);dy9CR6sgTva%g%N9fa5}DW{P|kFc!K!Rqc>U!h}-H2 zDgE@}cOO4S>10MMi0rafCwcOCmm@p9A!%o~o(XE~qCMuX>~Kq7<20DGq`Z6gtFZD& zZDvDVOz_pjG?f{xv7MB_po7QXyqf__RaBJ=$|pudwpz0G6tIP;pNfKf+!FdswTT}P zq8clO=^jtFyY;Mbij*|X!aWf$$0kY{P9NGpk}t5*F5byH#~uFKiIj3G{U(w)h&Y;C zVSG!Odopaj&&rbeCUfnm&1QsgUU_%b6>saB?G6VIvYLEJ@9CWNtr53zRU@6`OORh# zUmuUJtbxIb;^y_VDa1fI!P|M#|$0tO+~W$&xhvCO>7{rTl-b+7`RiDuXXDP*C^+q)Kp&k~KUImaGd3|9 zN6OPZ3voVN!PfV2;zlCz-0Z5Vs<^;R$jZ){0N4X2OA_oI5)uVn-N&n|w7I?-@|e3} z^}D|Wot)^@5Jg0$dQ%^T5cwxJ;MnCB7QVOZeE}Rdg1+RtYg?O(Y;ZnuOqKwb>S~u`bcv<|~Sy0HccGE^3Ju%CmkI(TMskP{gmZJ_- z5Hv|ovT`|BN7P^cs-ck76?Bn|S{Bi(FUtLC&VZenefcrmBr8|bD6P#SAC$}3*o(~p zsEX?bwJut|z7sHUy(x#vsUsv}f`ZdHcshg#jT&B|$pQ|sJUuZeDcu6QLdg*0+wW^m zf(S$xU|snyU0rI?ct`QEvG0WFUvd5!Rjb{xh}>dXS|Va%Z16IyKufV|Ibc9YY5fpi zQx5Y5JGUs@6<~scpx1Dnzz%Dcak9mThaB|L@2zNs2ts@>L{pe1e9Vf_-L`XAVhYTv z%EU>OJcXxYS%qRqlc7pqu``Q$;>4?76(e>VlR?GIqFb$u$0bX@-u3k%ouz}r-eH_w zMe&w^fB;||$^l*l$-Zk~VE2PgMD>UV0nOt#x-%~WgD~rO51Cq&v17%>)jwC85V|1q z=3~Mt8X8irFXd8t9)b7kLl=uZ%vyY*fy8n&&v*3~^d{_%=}~(Ey$iP^eN+fI;y2El zjC;1o-m&=vtaQSDCMS%Y_n+j|z|hTBA4e*h`C7BYcxOjf`_2I4!@H#F^ zq)Y@U$Y$xOnO#fn??A~w0Ta2s?F|Z-1)zpITJ`SqygZ+4@YbsLD7~n!uOy$xt*%_S z**25CiQ}rtPhh`k(uJC#mM+Y#WE4;JwAqfz9}!&;`&Z0&{QX-3J|F)vzoQBk-StEN z@&(!7J1ViIjr=irqN%T#u%MJrpGwy1X>aaoIJQ%)Vg5rMU>i;&_}g9+2G2>AF1Wci zfR6@X!sX#V4`<~6JRCnXZXp3ar-eJy(En1P??3}NM>XZ~$1k`c*x*g~9I~CPHdR14 z*9O;Z(A65(xqcaBtroQ!*ZCXBj3q&^QM3c2ZY*0kagfqEC%tuE<2y`cd|rO(A0|lt zOZND?!B3Abyj^qEu+~auR$YR}QY#f&9?SL{nj;Q|=@SU8Qsd9oU#y6Q2BS4qR#TL%@_m!D1e5pqv&c5rRL0q8!nB|g$Ir84Lj;aB~}3Nh*JYWACtp8Dw;0(xRtRF>39o;PGo|iREPFCQ8L-+pcPhZyW<*m>te& zMxbRn-d|8gs%Q_sE{x46oIDI6qYskAB=s#w@GbSQt3Qpwrr$v9C)?}*~@(j1j>CB16l;@B`@9SHgi%T{)FtP9hGi0+Q9&00eT zb+zpR^YR2hreP4^KLgoev8`?A#0s8Y?0|A-mH?-6GQp0dtsp(2Dq}_Du2wQP#{lrp zEmZSMNXS7sq_B*83^q1)=N0Nw3B1_)mZ1f3g?IhM!;ak(rKeIx4 z@}^edPk6lrxhBiVUiMFaTa0jd$vtd&u-#imX&g6AVJyN*pbze2?afQRHi<6XPMD7- z@ClEKFK>Md>2=4Z4h=N}K-%5i{eDo)r~3QZ8Jde=ippya@-+^-X&$#7FRJM7VEy9t z2%+5tU_Z%QRjW}1l`jq%+X^_Az{G<$y};{g%|t3k3~co(*J>cxjJw$ULvY+z7SaDs zN&n24AC%szFTQ+#p-#om&CM+%pPYj+3%J6(7UW7dF+dVR=-NR>_`rH-J8yqo{39hL zeAx1@CC{JHP0bR+07^}2NNL?=5&(`~$$)JF#VdA2!)u2mYu~9V2%5H7*@9QlEJ8$C zW%Xo8Wz8HH<=2rHkgQ~Iv8Xo-o5y5`x_jeNYkxs|V?b3?#%BK_`3MbaqP+7={! z+j0?XZIwt6nrNP>f!%)B7AiUnBbk{saB+DAEK|ft{vCgYMOZVz{X&SAqY#|~bvs3P z{ja*QM7y=Z^vR&*fw@PQ^h&FZ-^MF`|9Vs*?d|YYEztJg>b=4{1x7?lDy6LagNgr` zRGKQk_>SAi{2Bq69pG&;hgVGiuN6Rj?lpMsfUe-;=1vggRr6(54l6e@GO`B7@P@5J zwI*g`$xPFy$87pj_TEEo4$nwu*rI62aF7<`8W*d%__bkZs5T@NHgkeyx{1cTX2JEY zkH|#Cy~yxNWl_`~oPgpG4PD@NR#j>$X2Q$CsiKsLhi8l%Y$jg0aRf5>^XG$c4e5K^ zMcjY~($>)tX{4V3)wtfoC*W1kWfm9o-P1Gf}pCg=5m z+~P`r>wt~BP8c@qkw=Yt6r3JTQs8P-7@$Uh%bg$(YPKmoX$r!_U{GU=it5`HH#P>y z#j&BnMuLp1?0}(K=-Z4X4-pMbmMD%xc+s>t=g#%LyUIByC&#f2;pME9dVv93-z$8m z;TWj{w_~rIP5RoCMfN_+eU*uu(Ej5^TSp!){|+2ltW;#h(f5>zN&Ei1f~=A)bax;0 z&Jb8v1U4D-C0*86Z79^Fy?W23xwv*$`p#C(dRdo4fsS&_3@8zhMzQd#6cLE6{2E7_ zQ9XE}&|T6ATnO1^iOzY;QVj~)l!b0LM1-i`nK!U)-MJ-!;SA7wo1>v1f1O3$RL$1X zEdY||&Is5Y%>eIbe01k-{_=@H^z0M((hteWH$Jx30k7>4_Zu_1fBJ_$lb{(jFI)eR z|K|=3pR%nC{z;b`PxVTdzoSF*k0%4+rDvf>iKTO8VaRq2N+>^D&`T@{gCRYkB2CAJ zG%}XzO&i<|>ysZz@YyGb`>u?CZ`xD(VKL#ZPZAs)VBQaFm6YVG8cP;1SoQ14L37h} z?41K`f_;G^Dc)(kmgYM};iQfu#9jXk-s_gw4~;d?sDfEjk>|YZeTr|om@y=t?KT5x zkncXF^58wys9!dQ8n^89-z)nxJ*}OWpMPgEpDnW3(kW;;DJ=HRd%QOj2%q}U*b9Nn zq>27gzD|EcrbD)%Xiy%rw3JfiFG#vd4`ig$-VdW%Iu(^B!wzPM#6tBQ1rN&4?Lu0R zFWjC8U4!(<4dvG3U8Z+8fm62X)JCn%oek8dqN$8*Y0uFCBhVnD{PykJV!la{tG2+p zgSul)~&zUbyD;qIoRbO~6%8jpi#cMLd7#V4Jk9Uuejs2_bG?RGP39N#1w0e?!^rF$78PX>i#U zo`V{j+e|jkdU;P6%A+ULT$S=h(+WMb&3=H z&~LVm6rw8(6gn#GHeDJJYT8rn4EtK*b$8orCCHi^gy`|CmZeC7 zL#0+7Ofa8!z5`URyE6iD6xDS$Fc>TuNZ_VL1TNQ*j4 zHO+<{ph1@HrnI(N8Jyzm_L+VAB{Mt|ChuTrae>SiwnT@RKE?N6>XI0hRa7K_LlcBb zw$r+{@!ykxzeSmFgG+vCbgV0`TZ4n{8D1=g=g$dANw>1XDTSztUv>SSEEIPjw`~tZ zeA6#kus*P@_l-Uc$9SNj9S-g95K+~}Euxxk{L&L94S;?3p9Z;MQrcSMMqbMBJ9VK$ z({Ac@DB#M=pw^geGe&$#;SC5!$UqZf82ch_n%AFf#NF4 zJ;Zced9FUTgbGQWbZQS|#>M*U!+e&wJAL;AgqyeZl^~dac7wDekFw>Sf9Si0cm8mv z>jfMf5ZO?v{%dn1C2(${(oo=gRd4A6v|IbYd#oJ%N}1i*CzDhc@g`&Z861xr`~Z(E85E z{JxGNnDa{_XxuOoyNCxkl3ppb5AcHHc3{I|(s+CdC1W3%oZJ9h>Uo_1B7l@4Tatc$ zqVM1TjF;!#;sd%Df&ZDLB1BX{PR`-_1u`t(;^~YRAhWaJvB7|0g(9AKFI~8v4z&9f z4PRuVyFW3!&Y#)Juy@LUl4??H(CaO(wa~Iw`w@EEw!rAkxBW_XK=ATxt^YUH3b!7a z!O&~*)?~Mitu|O<)N718i0jL^!j)0vUU=s*7%7`YoPb(NHf^rTvGSvzyM1Ajs+yWW zu8vPTkTm{wGE8<8pr?uL+qUSnRD_J`YdKsEs)Vaq~15AKxil~oyBGf z8-%C{G;%%C^*FziD>-CLhV+ht;Wj`doTRWJan3JOv{8xvTwTqN|G1>K5$p`mjH1d~ zjS_^3`CeJMd4F+n%UY9{mscJlsux2Xh#dFY7$O7(y`^n^#x$E|P?pg_uCQ~Xh{lMhXt zrFw2bgH$(PK%8?dtC;h5KI02$Usc*Rx_+GrGl5V_%z&PZa!mtW&}``P$qIW&p)akbwJyzMSuRroO8|WGJ3woX zSLcns7#bT}`Cw=Ff9PJ5=uM;9gZySGpwI6v3wRVz(R}aOoDjIBC8cc%w z120RD3@5YqMpag|EyM76Vqn;uX$vD~M7@)^&7p=i0MsxtCfLFCJ8k)*A&|X8ex(!5 z|3IhXxD&*(HP3`DX|#2U55a=fRBST6_y#%w=oRHFl1hKayTtsaee?)x60-#iJ-d%$ zmh zVOCJBJw`#Jv^y&!1NaBp*(L=NUH&Wa!t1>I4R!^9lZd?}dG%NHiHBm)1;O_x_r=Bm zq&IJD|Ikfi!d)~26-w28Fu0RZ;=%A4h1a{wb#xmv)vB4;>F6ZEyGNwbf9~&d0HTD$ zy{N^WqmLMXNq2tyt`vT!sIoFH5F~a?M_E~~38TC7E=4^Lg8_h&uf6kzL`9u;4KxDT z3ys0K2zr{9`D&UFgWkA>`qMu&iG7y)IWef&Ks(B%scEB_d~M)wfCwd;hT^PuZa6j{ z1d;;2q~{M8@UHWN@?PWNUC)#R**_0~k^erUeM$nF z31R61(^(3L*1-XvG#x9!uM=C?ms-=FvZ7lTe~4ZY@8VX@X_~qUQUgr6+7V8bEaYA^ zakT=>UCQn#aAD6Zk0N)0IZ0b;MT|MUXr=Qvx}6@#YX=L`%;nSB*fLU)%$ zYzZYthn7mGJ?@M*yplodd>H>mLs5g0u`F_bEj

VGJI>u9d5ay}^&sPDhbd}p+S zHkC}*GuOQjA0dB9HKAp&W30hA0dg0;pU{Y<&m|1*xvY+2EocPS<6a#VA(K~EKHx}9 zZYdNMmiPRbai15N=;lD=q&roN-hdV<)9H#$(5g%D=^x;aUu7c+hpw%eqcmP@F}v1C zy%lfgq)+m;U$LANpp0pO55=jYd~d>|ysUAU=1&hNoD zIoHW8_lN(&NyOcYa1j7_u^h&6w9b#I{$(aV_o&tA%POQ|5=E#fZ2!?D|2j$w{z|Z{ z2qwyHE0nhN%)=j@%e2POXV>OKm|4rJi`5vm?&$!^oEy^UALML+!N>* zz|gbh3}`f9Hj#`mcz}wkR5_)lqfUr);%izm+ua5}krt)8RzP3T}Nh}+45fd9Bb0)$JH@$pWOGTg-bA8LeXW%AjS zYHkNY(o@ty%T+4y&lqv^y$|y9@eu}6TRBcL0KbVf5#*e$1H9@wI&wgD(yLR+$`~0N z%P{`~>~3$Qr4NQA#okAPkI!QnP7EZuqc4ybpzH00s2)OdK@U-EqD$;?0&GRN`OWf6GSwF=sc#z=((9B9CJxu0&s$? zjJS8jdYDEik!gN@d~)rPXBO1E52n@avQm-Tu8{Bf^S}1WiaPg|H@28AfFHt%Z#7^UP~w&xJ)LK_d##h}Gau zuT`YFbflezi8E9N#PX7cS#>)z)D*L;=!Tv4VA}T7H`uoXxQI^(UT8zQ8+ruO773Af8|3*xFZ~K0=o3i|3*H0$krPBoMpWxqr z@C;KZ1({&Y0L+jvq+Y1zo3vjW-nK1^@xO6PTw~W86m*=IIt76dRp><3STi@lb)lrm zr;TryscaXMW1PPpG4c3|aMFvo|DA#8DfTEoF!QUW?i#JS#wwVSH9Al%Lt%-jU&(^} z2OS{=1Y``ghr3_XIn{;8*Rai$3-Wq=)sv#5CBYv4ZQ|H%%LnwP{_E4*E_-hU1w3E{ z3<<%=rofvX32X%t93c6gf(9o{{9gy{WCl5>`7_cQTlqlypGM*osLwYh7Be5?fyA)z zac}2o5krE(jrWJx{uQ=^-ixc?qJ-Mq`kd+Pyxmka^}E)KclC8ff3=G~LkC7+kDduBUo``7{M+IQxIjAGh>1YC#537V=IuB9V41 z=L+HkT<`(b>J--1x;x==OA>orOxCH?_1^9=NIh(GR+rf(@9nu#7f9+@cmW#G5hA@- zuPU0d9-sTy&xG{kkA@B)c`vZc9_}`364vG8e8-W{aB^sAh_v`F_fjTcfK+^YECc@b z$`lshuj%M6T=PrCrs|LbZc93&7zWi>Zd`oWLvpPUfHP%G)(@TjTtz}$&~5sWYd$t6 zX6pPe6BE<_;OwoVs_MV5Q9x2eEJBb_5R{gb29*|&?oNRNNDBf25(3gCjdXXHfV8C2 z-6bF`{jT%)e1GxYJH{R3{>KnJvG@M0m~*bVem3?Oe6Iu@(_J>>tc_ltSgS@z5^cf3 zVDs_;PI>gQM*iy~(BFY0N=^=0`u6*9BbCe_#kx&sy@~wYi=B^Q0)3|miy|b^ji|-f zcY^UzVp5WoNmYJU7A44XKzrxldec&ClGI{mPNjMqCD*BX)C+CI0OWSEX!)3pB}hbL z6QjngVW?m%Hay&b=wA8q1SB{(c8}=jyJ}P1gMF zu`PE(F)DG}CJKJo??GZwfNHt2if$Rnc!MVj7y=n%EwJ1}7o6-rZ~)9TKsKo2J_BI4b>@E1AYm6q0` zU#2hIPk@MfAEbSNFM7D2Rt|lS30)p60{{cY?RI;(X0lG9JpKIi$-ryO50v{6(=4O@ z5H9NxO$VlRjJ#4>f2g-g@Z8c1-}XDR2&uVV z`u@k93=EU`$cw9t*@~_+K#HjW1oRgG`t!5ToQ$3m^l@}1DZ}1}ty*7L*wo_Oa zcu<<4E@MW+t!124E31^$DPXZ0^LM!FK(m;k8-ccf*lA?pGu-UMw0Z*Z+AGH&yoJD;nb; z!1f9LmB8FV=~ivDxz%3Duyo9t*R>OwGTV$1(_l>REkWY76-zs*O$EG9uWD}H7y80W zX!T*@9}2(q6M1dmCf@xkYc48n`)`(xYXy0U_mY$`{ci5R#(8TCvZ<9``5dXy zcmHgtJDu`A9;$WU)@T&-9oa}CmjsW6{nY`t2@Q31;Bw|6WeIa?F-q15hfV$(D{b$K z&AoFK-(&`1b%goZ#UliPU0~HrV&Q&@#+=10(?9&id}d;m76&Lq>Ie)KPTEI46G4hevDKj}5JzqFXy!k7r1W&JUZpTScBfm*Exv1zy?hyDG;XZ!M zH8?r>oxboacl{c!q8ZXG0(8kfWo_iV4tG)q{C=!`(`8|KGfypWk~O~l4v{>9nVUhQ zR*)6*CRGCWL&+K%C@tw8P4)j=1U?Gkc66=jaO(As3~%-$QM2dP=eHu84m&B>>NlmX zVhxH?h=&NpeI=Yk;o%$LyA>xf!m*IEb}o*wDSmsAPXRtpLPE4sckY!_erkDog5t;8r8#YR1) zwl=`35ijWjj?oWk35huv%ulH}yv;ES36RBnI4{}d(0Rh^S8dAodhpG;I^iR9Bb1g) z?u`j)Bi+?Vc0YWa8>R*pO$iBWrL!0Jomlg>TrqPrr8r`Q!(S)pihGBIuc-x=qspOc z)bc0&`t^AIgCZQ}j)nb`z+|!G=@9CVb#;99A9B;Eui|cJmhRcST8B|;AD{_2UeV=V z6T054r8NaP_T-c0mHb+N+?P0K5)#i*E-6Q+rpVY!Fi+SY;Eni{tP5GY4h{_wIJ~Ht zC0b$_aet=AEUc_*O?AT@*OIc_UTl?ROf9#=2w`57yF(LQ9_LuxK&(s4)*E z>Ahz^Q}&t=nn~;0DK~^_zOrS*u`vk=$-CtV_HqisfL7TCV$&Z8t8LJt2duZ?aV zuXpeO(e|`ANl6WuGk2y=p#Yv<^U*PGsjqVp=QCAGdq6W$l&E5V;fwcHKzzIKSmeL(hygt zYdEog-z|92Y}qGP*jHs%x~uXdgZ>8kgN7o?DjL(qe0z=%YKgpb0!=n3nppg&VFH+@ z3$qQDZPE<{ha88+OLu5ySpBJVIJ_s#8;owvytB9any!$l*8!6>Zqqa2?!UcImG4^# zh#sZ6sIkv{_ZB2uR6P0`yWpcCuC@Q@ZpKaObCiaSt;NC_hrOx(JC^L%7Hpmy6nZ$! zl@=DgQ)g?;6=eI`OU+qoJS8LCbSa|n1E(>}8Y~BA!G>)K1W|!b7awqp$zAOpA0Iou z8PRgIS@_g>PjKt{_)(?13zn9aR=faXV^Vh%!5%nwi1X8eHo;IZijkg%>Um+sT`QWG zEJ!OIFwg3$wp}Uc;=n-Ro;*s%=;OUih^}<)*fzWVW`TjUGPo|ZQJb$><@+}Qt#1{b-|Co|Jb>*V|27MIUdqt5rC0F7yp258+;ip_e_qBdrBy20QsmdnyK( z*ycb>4E_-<_*2fOfP{4z4a>-KtUzbC}?<*8LtNm%agEj?>s zZakAZh>skb>IrsBGQ^g)J7_G-)X zp#1^DiruH(gaVxlbzO~nl!97MeXQsz_XGv5Cdm6?K?*?S$)4EBA+e~{Ig=I?Xl)B$ z%sn{GU%@`lj@WA(&s6>Mi+*yfA|dHK?o90R`TIA6 z;yXpD9l2DtG>lJpOd-&kbMOakgGV{hDTwQ0AEi$~fBBDw>`q%!vz@NoEcDl}&X+N|%YSxe2mRq7rH%wIPC3rNN%A^-M=Bv< z^JEtsX(-+&oh^zX4HiM>0iRC~?nHh*ev>}I7m_tE(5 z(n8OKgtHS(wA-o1^{{7Cv0X)C8WgA8xbE@KTjN|weIzLmbJ5WhOPRPyD=SXN`i_08 zhi0La9?C63dks6Yh6yxJ-MUCOTs*&TwPaS&YPeX~_hBE(#vQlt7h11uR<Fqhf4FY?gx`W~Ce2IjFjOr*I z!N0CT%;`mnOc98MrD*rgFCw@<_wdR2KnbFFWoEN-B`X_+5gCc1G-z^~B=4g3#oF`U zripp#rrB)484A;Lb4;^;-h5m(4tAEAjmjTYUB zjpMhN{Bwy~5@s@(_R);8VY|V_^(YU<>~gkS;e9*$DzmAqo0PsOe*KYav5S2e#Cv>d z-F_@u;>zqC^ORaVSz7OKkXFr3ify~Du0DzT^KCmF6j7lPJytHt19L@E0=M9!ubotL zE<+ADYPa?tTji1UmBwl7{g`|ofre6Pt8ntL_b8>Pwkf333!g_3(SE!~#6rx9`t;o& zY;sv#%;y<1RJBpi#}-*7Sp;AE-UCb<$8WHP+i9Ut|IEv!gZJw_iIWL@yZQMCW@ZA& zhjV>H@S)&L8@{{g(%CUClxQ|<@{8|6CZ@jSR~nxpN>wdeHV`UeU#LV^J39LJ@GpP+ zIe&-uCFZt4k7lyR#OS_)C7^Jna%2MT0uQinsbVI@4x6$=3-B;;>(8L?G@UF^guVI0 zbygOAGlw;7)9Px^yQ2jLdg9jXsm9r8z7AO;flk3Gr>XSoWx|IeS7NS(ukyJCg|ZFm z{bUfG9KXSL*C9C;wU&`6vScj?*FsB)CYTd`e$0C|w{Xy6%AXhb-o5)osS$&Gc1&7Q zQrKm`$d5{!Q8I)dt_y`*l`PpN2I$v3$;VQKaq2(}Aura8%ryHyE*+u9gNyKzCNA^4vjsPojmL4Bd%XG33S_kEZP@)BRuY0PZ=}*RMa(1 zCx(Cc^8K4qwYR?8M%e)u|QlB=+Jkxiu|#uK!gyDqi2--h-3Y zWiDK&w0xH#71zITyt21o)6d}q&5ivDr!e9B?S?N4371Wk>qLa|#9`<&_DKu#bA5is z1k+pi4YR#s?77#`4lj>qrk8!0iArCG|7zfW%Svf$C+{gzShRNYy;Rk-bMH~d9!j5O z$%01U*Vev@y;8^bBI6ZFUhbOhCDMh~_(G>d7I;7U7TO;|FWka^G+Mnv&YPc)(5$}Y ztkrtDt+F%gb^YLt8t+{~93%PfhO9Q-jJG`!J5#|D?U=tAMt)@MsY#yhWCW5QZRX0I zro7B~ZClbFTstK3#2cn|qD2A-e|Jzxja3%twd>@A%ekI%5YZD z#~Pcy;h{`Dqf(0>&jO*sDUtDuVVgE-ZL z=kTwXjQTJBy9lQAW7B^dEksGYziRh7Eq#qx;9ZP*TWM}?0H`kprng!*5WyP zdqqV=kb)uOofcm#W)U(TyGK-F*Nwp67db-=#(jfhZ@HPyZ)9Kb5Mp^Wur>%}&V4Tn zN~pqsyH5R)-kQ!l;_xD_G~QmM<+$&1#r{wyP%e&Z@*B&9zGaQ;gX{*9dH2nR4)4C1 zmAK1s!QZSOp^~1Hkf;uY9{SKt7o{Zfh5vDfgAn0lcXT7!=uqPYu9m`O(7Z^cb;Gi3 z6&4AGRZ&Rs+3T0#2h{i;jSgCArxQ#KQsgr0(k;K;cCl`nE(DHQET{OAe@Rbo?V~X- zSFb*rcHw?Ak50sVc#*9RE{?(OXH;NB`P{~aHEi*EEi*GSMZLh(HgVHI57gzJ5t0L- zg+hkflXugR^m7|mv={DeiX1i`-s39{^1U>|I6LaOLNa!}oc~+Qwf9Ww?nkVd1i`=Y zsED1#rpp_~Hb^QbdO)MX^7*9`U!q_8_~tPfP8Zp4XaEogu9u&vt3#X@*XeH-voj(#Qt&Aa&nV(8@Q7jJ^oZuDKRdO<*LSXFYH+V8kK{YPZ<+KwNULO zVO!f$k`R;cF`x#g0ni$hbbv)KIG&|EXM%nbbOjPMJWKa5K1!*_GJQ`RQC0dAd$w_f zS^fe)&S`!~sg5w?lQ5wvDpSejj9UTbM8ROsSxO(`CAG-5`KCFM`=*NEA|>zfZyNu1 zP4`Cq?U zAkld}X{@mkGoba$_y=a41{l@#j=ZWJR^l0}VaTQesa%*-?sd12cbf%> zZX?!DXX<$Ryl<=X2>o$8b|$X#(vjZhjn*{ssvReqG&}xdE!MxG=*3wgp?Er;lh6B1 zY}Q`?}TAQ13&r3h#XYnJ{V5y~d5iQ~%b>eO|RSu)pc0J(e z>f+ozoY)SDjPxF3;4)(&&dPEMMod)b!3o{u#0A;vbt5CvvAVZxPy$mzz6br&WBLhk zSJ!$H_J=^fYE6SxLy`d?4gd9n&1x&otj!&8jqETb@U{(_)@s}wJ!)4 z_UQst_;c9pncA4BO#D*`ZEbQCJUl$m+g-!FLWwn&LBoZ7vzh}&D4djY^N1;+ssfZL zA`59FZ(us{)Efh3RKmQt)!$R$|JaZBCRgq zeyW2P#>kj&cEbYPWFJ44z?+|%(t=n1Df{`z3T-U@Tp8Ww^y z1?pR7fWl^8+R+-9PBwtmMQfPnHvYDN&I>)g``(QnjfJD%ZmX=-K>O$7`Ri~+`|el6 zQN21}BLzBx-Kxhc8Hrk4fx4@|PW{&PC=K$A%ZT-A5e#b6w)eKJ98({PjvP?PiM7pH zgL?GmfNs@YRUn@vBZtZ~+Lz8Bry3V|HLubqSTI>!h@6{nrO$P?1N3FjaOLzWW{ z)UpArf;Y*ZltLoca*pw3D$%YzTxe&uo)EOs?OMls`PP|CVYkGkacq-`TI+gn6kQ4e z$6U(xxrJ{!2Dfz;=l&{}^0md93XVFphM@F6gEuqKhKY`TX=vQLP)v~V9myTFmj-`% zAHIU@&K~65XkRn!m+|+w_p@G`8L0_oW)41dc#EbFS?GOyPDfYQm;8JJ2oq6J8JMpF zTAzX7iRZP$Y6!!wl$2CzZLJ1gO>y(4LwE#x#AAgL7*@7>IYIa>D1a!HrCxv~Kq5Q; z-EGlrA|+DS*>M>kwP+i62MbRIl$mPN^PvDu`Nkrac#3P@jSl7ghid%wg(p*;r6NTQ z?+BKba#7wokehi`_$EySKWsW*8?iU%{7r1`WV^)Fwc=G*a{p|ODLSBzk2F19)^=w; zy(pkEH}@!I#3UWrJ1^=W23c>%--Hd3hF29l(L48 zQwKnXvb$?B=~|gkY7z%gFnGM6eL;@46>KFyHk>lu;cyE_$LdgP$yylKuFP~2QD4~Qm3AyZw`Nr38a^y^?l+%R$6ki)=y*DUq1kQ5dB-fT!i2t z$|Ud%tvF+4$|U$pVKD!{BA8*lz1{2_2{*hOkqG6qQ~l-}{ESfX_sk5~=x9x||3H;c zrTtsV-Q))3l4bQ~xE`|5qy2!P0wvwNU(qbxw^mQy$oP*^9X;gFYviAwb%`_xT%bl4 z@V_J5StP$LY}(U(YdBiNnt;DOh}fPhszWkioqXt%kafZX;4Sqno66-vD*gFVgCg#K zt<7=F-~;{^Pt;!NgTjo)3@LW6?C z=ItX2D|QcD%Io);S=+e1C!c7}C(O8We!VWzKEyd~Y-9xfOcZwfkRJb9w_u&T!w0n4 zm2=gn*2=qKx{>k_8@GU>xO{e+{mo78H59G*yh{~_#1l`;_oQtsolm2!yEug{K4$Jz zq@|&kjxDM@r5T`meXw+aQA}HhL8Oby9K~$nO!pPXO@)}jNz<-@2#+P_0EV?=eOJB@=wnso3CgN-K6R3 zyHB7Php^1nZ}c8os;w$Cd(tO)k)bIO#$uAV@nr3!z~JaZf%L}AO0IdW_a71~EhZv` z48!*P?c!wSBW6GTImW8r-$=VZ+x=3xBXDV1h`3fFgj);~n4WrRXBsXWMBnBayBMdQ zp+?>z=;ZE8XWsmRf3|y^JHFq=0efN;Iwz7vbIZv5qMv3G0=QmH+gmkg^NHJS*Nfy#OEXMswcQUaIl&( zR`}l>UbAbPbjn?Q1EmT0v>0EU9mCRqgE6PvK*D_GT#|2P9Qsm{l3*sG2XG3=_iPU> zN|UNNnfs8Y44zj#NUvdD#l_{eo<)(#WLqtlugAqMp+|3Eu65kLUgMsgBuT37Rp?MV zIP>*1tFREzeqDGSw@VpMT_D^joI<%zyv|O$I)pj(NzbW;(ei!FUpE~X;2f!??0ic6 zm`>KGsQ(y0Qw)c%Au1T3d0}9{-zURMlw)@D+Y-}P0Un}epReR>1vYi9*M82Hj@LMG z{(Ma`fj~^%BrorJ&~B}gT`-+VI8!mP2YWi!DT?&#lzz_o?Mn}$Rf$c|I~VekA~_2>5bwAStSPp(BVy1c*>P+!RB{JpZY1QtLQ+F}7fZYg?Y zJ#esq3j@bq7*(=(RTSt96R@#gujjpY9oXH<6$AEI$g9{LO+SrGi%t5-8&9z=@A$UN zy|U*ALv*)o^I2EW{f9-HJP$L>Eo_7Y&uvaF^TFq&XRaa`-Ka7bLCq{Qld2ll zx2gNhru5FsXWhJ4&SZ(XZVj?#gtbu^u;d_?6^jO_(XtowCPj`VduSY2=UdwO$wp86 zcdtjks5ZhW3Qs3w3)`rkmd)W7+3VW(^M!g8#`a(d-IXw zgD7s@prL&MIpn^$G-mpG?Fs#(x1%K`pWLXlusNrDW1h5_)Y%)bcX5ut;_e6NIOp8L z$_jdp=b2Ke_4V~SO%jEDzs*ZiQatkV80=@D7|mhDT9nHkG(p6+Sa2$+IthZjYW
RO7m5;cKf#4K<5hY@9Nz8Y5d0N;YY5co>9^TtKI3*sO^E{ z)`P)tkdCL>cdbt1VF$Uu84*-%P)j+i%i~Qz+4K~F&L!GsrLzn&4;*i@m}>tElNWFBTF(~2`Oc6{t_lhL$f!(eWu%<@Tt^I)R) zw)0t3sXX4Yl+Ji-T>5>CwfeBAC{cO&u-JVrklQ}=zW7C!wKEJXv*VVgnYke9qS%%P zu@%9AV;RijJ%N2N<@K*zH@CKwH|x|-trWsFdZ_5nr6sCwhKNPOsuSGf2GeapHn!XE zqoN2=0!71Tie)mx`CXcy>b04xW1~Nr&o}3C{4M`(nfF~@Y~Umta#L&? zeH8#0@(Dxxy@?@1&fPH}z*)KQSvnAU&fQ%!A#IpSi@1kiWFEQmszA;DhEttI+@@O7 zji}8?_HpIc%48n|@+!8lgA3xnhjxvQI!4|EuzaHW)DnsQ*g5)Y<34@0kl#}L9{PVJ ziYZ&$mDz)eqY0;6GDcCaA8Ri%r4+U~A_%zR&ns)3DMV908g-MSE_SkP3T&RD@!$4@ zTW4yTTwkxnFC)Q>o^czt{tVr$O?LlKKD$ej>(=qUwGVVUsofZArhBomTQFMM)bi$ODA{DBT33A`jmfFgqjVSS=4B{8sz_2Gwh1^ zl~p$CHK0sS9RHzm_C#?3LA#2mqhqMj`z-E1Ju*JRbiwnLd@0H@g)%jCB!Kgk6q7-K zir!<)iYtpYDxCMmv~d@|a11X;S?V2hX}xqX(&@%Vcg0tA&9nZ3IqE91ZpYiuJ06NcoX+jeV zOuk_!n8hDB@!iL()Ms~fy)~_S%EWx99+$5vV|U=(BGny8iJ=f|!pX4>RRkiVL>wnb zJr%(?YV-N~O*btsS-fe3Jf-iY9)(^n%UTJ)kC*szkUo(43fmTxc9Z=h2_8(C;gi|u zvBxSh9u5@^0mKBGMv7f)&)&UKRYhu0*6ebQ4JB-R>nZ_RJHc3a{euDOPFU^W1r{%} zJ5GREK#_dg~r*rJkxvCTlO-=@CGxxnSHe6L2dO3Sabwktq7G-~%WWN*f z_8ehM0?t1jBz{x4p8Yncar3>}a;RP=HhPzb(NwA{bcfCxO&V!Da}H!E%f@7TakC(` ze2A_@L1;bU$-=i}FY<0=pTI5=ouKh7%jyOlckYs^?Lm;j|-)%x_` zcwG>CIcrD%^%ZOhL#sUB!_3H={u+@v^5h{i?@3%F=WkUdHg5XLqTvjSyrqQ}mg=w1 zq9zEQJtoKaw*%~;TD-1+x)I=Vn9q3KRlTf2{q4DqNm8pDgw@_&DH!3anlO`%f7-c{ zRQrgbj-qtz-cJYj-_8>fvJ`jAv*cK+K6*DHl`1<40mC}=9S;w1aa)d?Ui~pw!9^qu z?ICo=$1m;`21n6W496`Ep_F)Y`Yz|JU`~(3;_>g7V%3!;i>R6P6UIP@% z{e5(~FMULweZEtw%3$Z{*gmA38-FzG6#x|*zM017MgJ(Fmi)oS7tx$o=bt;_TF#97 zJ$zN%k@Z`4G91gEb_ z)=fK5OU%!=PSd_e+IMNJ6DQS_;S|+LAv+hZf5Kps(%;CY8}gsH_aD8+JqUxu`+l7) z5G4I>H+%krT)$AYCb-p${2BAgN05-Rf)QrY(a~ae^r<2~eN5ryvyq>TsZIlo@rB2? zw>(6fNEr+n+(~{I@^?Nr#I-!C)Or`q7ymQPXYPCv-%FrhJzsgN{zx0Jpt++@F@U}9 zpV$p)_G^&h3!WWK+N&`A$T)|Ctbyo;N=9Bju*cW{%z9u86I$)mmLos7w;)%Rf!+#6 z69W1^`K;Pzof2v$Atw=MI9`W`hjY7MJWJ}UwRvbK!e2E^rLNahZ^q8iS>ZL!LVOK0 zL7)f9Dwq}nLnF?(Py8;2S;pSu(x0KEJ)O!o*Tz|x?*O%8iJcV z;xGF8wM~%Z-D6IUY9+5`K+3pnmjjcod|%kfvSjg~ya_=$KY3pHOUZ0o82a7Chkh89 zPGq^I!GFG2&Q&tIz9zDYlH^lfeim!B!bJLW7=@wf)-&61jhfcWvq6rVwR3+P;P*)b znGd^-2X4$$853Kp$jO92%eu z-8W{BH8l(K+5!v}9?V>f8UokAc}fNJV0F-30cw!zGySSU{XL{8Wcv?59=KHa;oPP{ zE)dF)saLA!%8!?Sf_79cUZwk+ilJ)2nvt<;keg>2i^SYk&76(uwP7Hy<}D0DwxZk7 zwI~61vzkmQ?052XQcGg%-nhvAo|db)ug_J6Q9^dzSI7FL>_~3K2s{$7^$_64Qs=rM zGbHE$iZeOoikrSIDI~U}BqSZ(-3mq@Pmi`upt@CMs01s9Yaro#YCTH{fMqghrHp%G z(_`;k!}L0N+z4Pl3Y@|lpm8KqD@mRB&4RBm50{rR${;I0aKq!VS=BNlG8i+*mG z3biT6KfiSpUGkJ;vXI2{&z~Jc`;~)|APLKim5rqS*y4NHTz@p(J&@XN&6BX+p`81N z>G9)~oSd%hlUb`2(5vcqMOc*MgM@F=wvXQ|1cTd=uuGZOW)Yi*m-+OuW3!se!O1nz zPhIk2Lmu0~LLq+CLdnuBxLb!SkH&*y-T5275RR>+Kbb!v+kQq@S@e@Ls`K95$o(s3 zga(L?)M;((cBY!_X{`w(CE}4>{N|-tegJ_Z6lPLj5;1nVArV1x7 zp=#2Y0b|X&N?97eY4ZDmh_2RkKnQ z-}}B4mvB}|>$bB62)i`YhJ9htf?ERUH2FL0n>Q|sM;CU`#|+BD_2zy%@j2CN8}~JM zg;M=^ZE4xIbP^9;nvLzsE4dwV(1SX=8Z~zwaNj;gN<%GT;1+T{z!B z|G=A2P=%I)MU--$Y7-2~JRdhpE#9Yl~z2@fmC>k;*o1TTH*+C|uXly*5vCy;TBD*AL(rqSqwNUMA`@P3JOZ!O6qR zi=-SJTm+PJ2`VR~)zxE*maZ1utyj19pq>+2YR_$9NZl14Y$i{~*AaTKIjZm31s6Qt3d63Ndn6dOh!cb~mC*xGJ*>jG_JFjMQ zNAmME0uXps1>f&;%<>7Ina%rf(*yyjk@2!Kh>jAxag-*rhI;mmyN4`^u=S-2F(Q7gHM#sKH{v1hBZsi@sr+eI<1qGJCHGvlT;9dR}rY;0oD2N6v(4Dfn#n1dh!D0pgI~?vC(qmz zYpk0BnsiZ|Ey{rygfT6TD_EYr_$J*-c3l1fd=ZQ))rWH}?s`BPLjWRoUcC?9|6#4b zi;5+*NryOZfZstB(HlkTWOWrjwxU=E#HICH3D#{|O$VKxIuYG($5cFM3%AN|Q})xu zU{rGXkH}f_wr_|8EXg4t95K$}C+Ui(kEI8?JMLNx$mjx)8X4hvXgcG^bycH)vtLPN zTS3g)17dDyM8u*=#wW~&zsY$PcQLfxH3~WnzW`N1c1~BoRcMYE!m8HAH8i$T4f!wUQr8d6^= z3Oak$MP6#u1)+t1Fy}=z9mE#Mf6G+S&5e`+|G^tMCq~m;{gmx{uGC(iah6{*;#9$yV-KyoC1dqB;O3f&nt~Ytr@m$jC*A zz-~zTz&YB`mec&~YGl$(Qu0D+fA00>$^mz1T;G#Lei~IVQzk?IRmeEer4_eyjuOVp zBIbhb?+EF>gP!YK)Et8mVBIUOw2oI$_zp7WG0ljez6W}}WnUqT8o0|;5+eLn0z( zBOrUhpM}`4Tgj$mVAhTY%VLt?o#0KvN#UT9x?FKJkKg?501UwBkTCHo-p<57Uo| zG;&f5UDWl^`!rXBa~7JfIzr5 z=}8~nJ>HXRNXpbuQ*2a@J{;bvl^yl`JDy(Gl!xr3=~WBb8k0$OX`uK$3qJI-kV$`WN#IFG`k&peQXx7JQ zmQeFyhm1ho#|JvrS{gYP%#_{P7SUd-aq051zxUaex|%BAOZxje$jkuM)i_A?HhX?w(;W@32`KgNaa_R)H}8$O z{znUtDf7gBJ%9ZWdK}$<(DI+5wTIv~p*nzDUg-iGFf^-X)1eXAs$NOV3ap0+b#q(n zM(l6Q3CFi7t6H--oRMO$W<~#nNRXv{g(l69j>2x|dpgX~sI40vDWM}ARD;Ol7+~9} zl*Z|nG5K)P#Ji0v0&NzegVWvMpk562)Ny@WW5@J+hNxzoA5=oAG^`>8*=zY{wu8rY zS+XQ8p_W5bsv(2<&vrvFHka)B1h~CCRQ!LZRPI4oEBzrE_5wyGyuH04;KK6KB=@bW zthA4szAo$}kC?E4l(+F~Qgn1XFfGkNQJaVFV2S2vgVv$!9YVr+JDxW@2~aXE_rzr` zyO$p=!`73cE!_t>z*pdlp z4iGr&KK`SuaohABh-4ri%5QM*;`gmhdLiCQ&05Sd3d16*`npXVnc?H>4}M;07`}}u z)blu2MLh;ZxQ6tzqKz`0Bq@a@+qh61FHgXA*?o8R(7Z~RI#;|z0Vi{l-gul7uV26F zzQY1{5AuYUus4=GxV=wiW5)@a86oey7C}mQjD>EL)*FM{OqYJfERgBQ*q%R&#T_ z)9u@)_?YfLibghCHx3?1+`{w{j#Q29p&6f;I2QoLH!GWk;a2Rs2Dt<}01 zYKg_Ar6-735xi04dT_(R}r?TkX@>BR;KzsgH*b#lj}fS<%Iwnd1i$)(c!I zlgPA4`*P?{na%5G)KCf^a(o30o!6+%AK`&(I3qj zaq)r`Ju_|6Z;W9jrJP2murdMppX)hDq}^6tZ#E5pWdd@B=}i81v6F0pioRYEgg)_W zqn@?lCIPyx$8=rYDyX}3C|P*pxry=lvH@{ zc1?YQs@4CN0IZ?=8lXlqyXOjYEid;rZ6Hjxr|a(!PH&t1P!i1sHz44fssP|e&KGev zm8BXXC{U3d43Ox;2>Ni%f%zS$FP6_Il3w}D!n8ibCE)KKrp>AFrZ^p1*uFaLN{i_x zn9AbpAI)8CY?%sH9lCKBS_x{tosu7be6Akc#i23^{7GRn{~F%;+}R>HlV9})88VLn zK83BD?4fME8LA+7UOIbtL|+w(mj8&33XmnT|J|271uOw5ck9T1+73$M#s4`>Wn5_ z2LjHY?|V08yyUc%s(d9dbFJo{a`g84KA~(t{%yMKh z#}jj^7k66(2#o2fwt91rKpKHrH+d$f{Cctz+0tH0iRlyG_mhJhFa7!xTjr1qHHw*s zsYDnQ6)B~AVa)A|0Ibk-Bta zALo0Zzwy3AMJKJ{1o3JX%RXlKr=^+HN47N1ZEypggLVme7MuBR5`se#&NYch8+K^M zmiv-qK}_kK7v@g(KLu(zvbiZKs0lKelDJ3PGqMme2)hx;iUedf;PKo6AO!>(9?7ti{9aY{H_Eu0O~t{LI24(wT-)ufoObZEvoQ=;?5zZ5C&G86GvFH=@_*U0}C z&+V9VtSAwN)Qll_Zr|f~zLxnTJIJDZeH*|vP~)5x;PX4EFY);6sm#HSj&q()6({39&YzYJ_i z-PuA5Ss*a^9~fT4j66R@^_)C`1Q`r{NZ!BrNAY0C3#WII6;p1(L8Wa_xv z@S}GfVyzAiS+68X{b4^IqA+cs!v9}&%J|}Q#Mr{C8l+m~5z24QUFVpKrwP5{m^fVLT|WdTP6)_`hh&^2((r z+_{ZC{}D>`TjWp%fl?9(geN+uB+M-ZLN`Em^glREKem5k>i+}t_XF`%u2dZ5#y>-t zNSP0Co0<>*0zjDD|B*H!=>qKez>Wdv2ZV!TuH8lwp-|H!l}=*t$M?wzHGc%F?uLI% z^WjhSGPo=cpQ$ylrjLkig)}r$zAUC{eeRc!LG->YziyN`ycdt;jyusl zF$s(!Z!4kTWJ=NW5&u=xcP&`9H-*ql zI;mRU)@A)pWZ|mchKe;&n>g<-@RoKhR(j=P|LSEvgSv1pNV141N6y!fa_YC$m}Abh ztO@IMkA7z(c;W%W$%~qVHnF1X(pj=+>`2T?uY3;s(_QYxRqCMXp1?zkT?vZFjZyB* zvTcJksoEkJlGhc>x`&**C;oUy$PlA}WQMF)`YhH+c*MoQ#mB??DnJaW1 zRJu>m#LF`jw8~;kLhY9@6y+7uIJSpHIX4bHvt3~ zr`IcG2Tn~XTFN)kWBnqJB&%tI+iypvJk_M5jW{62Uf%}D8zjZS&de@HTlJQLFAVgG zK9yr|Ar(wdRjtGEZXc6+?dAkjQ0dr|P<``g#aQg`*yvg<%7~(B?IzA8(W9m#7;=(k z6!W(=oKf-9#d%*_V^UT#<;_0Rj2<$y^p9XCB-8#Wy-Qxz40|b$3qy6op8lt)MC5w6 zx6q2fgfsz5MOoP&H4_5oJ-1KboOpg}4i$F_q`#aP z&;&GKYY&htDg4o!r}qFRKG+e|T>m;}%>oK?4uUVzWRI@1Ls+uhx_9vWMW>N-{U(f^ zg@oBqArU-Re&9?8Oy$Kcp=AVxCRTPYh{VpO=|Rp1ee{sqBOm?uFq0oIlQ|v?+{}H6 ztq>2nxM{g91&8v3eU)mW+@Tz^paPR-Qj7Lf3a*4D0s;msnX`rvrNYDVPZuzk$Vo`3 zNx^m*l!Tdf{p|HZaNz})_VLs2mRi@5z_)s-1nU)H_bcV`W?BSuJRYEunf6X69&JDm zkZ3-5c_$O$9yB7>of9|Ip!kdd&C=14NZX1RnYY<mNJT}@#6bemQtr%CP~c*bkM6u>QS z5Nzgfs19tw&&QH0Z-)jN$1J|o*H1Bbm=SDVg`8#PjCqFF`ucS?Qqo$x9W^8dQhe|( z2?tS8V4!nz>`MaH3~Lm_}ggP5$!ZvEx0eCW0w^ZuSr&^uo(~(!JOWHo`3ft3z0u*($IaDIe}>4qI6#Fv2#Gu@ zDypdY8;p*E@4)<_Z!UV+S2q!_Va#84JVQ7|PATYTAb^9)*s1;sTL9>wm4D!=qp9F% zZl2y_0Ns+vlLxM!m}PtQ>^^YncP5w2qJ@+O61g2qablkHwZh(y+9_{CI$hT{*G_Kw z$EpVzs;XLbekqp6i9!~4^f~6kZa=QwwINAqe01Cj{m6ZZThO&2jY-Mgs^u%gyf~5= z11AM&yp9u?1&uRxSv%c-gK9o4t-)0rYuxTsvW!!g5$+%|MS8tW&gQ!HAJmQp_{6hu z)SrqzhxM`CwlwfE!cB^DU+G_e7JpGAt2U&+zE`h_|H7!qbyj3K(0nP5B~?wYY4cM> z_`OTk&!xh=y*{Ia9Wsfo1`JjOAfS6UlVM6Ra^+>^wl7~6Qgdive|S?HKY9dDsP+pg zHC@0vSDY&CG$pL@_WiG&Os(3vF^I_XFzSKn>0ZEQhioI|R-r=uDK-Q1cpMLJFnWx9 zm}acEtR#hJUdE@qveLH<6~?atzsn8RyDF1;JAtWZJ5=k*f#~hukrGIK;cc40Tbwg@?w#+?&A-g-*_pkw)_TkHyw6iW)s1~ACYW5=3j{pC ze*Pgf%(8)|3hXrV1_a9Ak?%H-9~h96pBvLxLpVzs>9t;DZ}S5bHb!k4VYJ#1h|K+c+-yB{BIiy8l`()BaJ%92W$wlt=m@rj|RiPMNh|VwF`BH|E4TEUzJ#4 zr1_V}6n-1)U}5%e_%AFLZp4A`?FnzT;g?}Z|0_#A*1sh7AQim!lPmm|p$D?6>GZov z7jaM$7AK_g2iClUKlW&IEE$9V$UCjP<9I=?^d64s>;t;7v0`+x}m)Tnf7Y= z**c~o)z!R`wxXTT!P}|dn)n;zMh5GAO2>AA+)^F+A#Lm4Tr}B#6TWs$^h#u5fCdWp z&z9Yb@&^cUY=xtd`CC+<14AWnHvxGs>#h(tA4mSHw|nPb1`Oas)ZSezcUhOOD^A~4 zx4w>6uiU(#yQlgu>-$i8mmAX+wAF`9U+U#(eZ*wD)g#zfjL*c9v8Zf5*6!mkqhD_*n>tRTqXjE?K2n)|* zZ*WP{f$P?U@8ptU=A?W>aA>vta*EWq*roJlzIKTLa9WN5Q1zP;uv$o#G)^RT_XO@em0C%Q68#kgM*aJSwSHWzrDbu27T5;1Yqr z)IJ#@N#2l@<;)W|PWXCarC^qci(A8nFAJ59c$DHxcnh{Lu;<++GsfhO=8J#7+TWi4 z?)_`%abz!$tGfq~8%6=6_X9$pC^L9+Dh7(1oyE6L4&<@qrB^P)aT|w!r$KdGRz^YV z?Z^_|@}xNz0JyvkCR4jnDXLFLs2~uCE4${ii@Hba<-O`EBLM+pBM#J=+iKjyG(15Mp>0WHO6!E^19D zRS@<4YCV2+Bm*D%hq*VQ@nQGnTER;-0>n?`#PL8#(iSdO5QBOBO76A5#Cof=3Obg%f=Ua$(Z zvmCeUM$=L~7J(e_tB>~@0b2oR%7pFeNr1pF6S)4~tN_04e^DI)^a_K)fEpk0e|r-- zsMjn;0p)FCa`K=4ino5pivLB??KqHKPDW7H%Hz2lE-~JAtRqm);8a8M9P%ymoo3HZ zh$wKkynZ_X;Mf1fQ$ChLpvf)@bJB_T7zcM%@@1u-m-vkfp0Zl6mipY_n&$G)cvWXp zzl5dK;r3TUc321))>5q=B)M8Us;ZUGMI7Q{X5jl`P?r1}owC^DEN&yh5+yEf*2x-p z=R&{k0vJ<>xCs*4y~A8muHXR1_LhduGWIR}=YATq_G<&fJ<%7T^t!mLPcG`wKp(xx zs+XzweiC4fZE}e3PiS|Vc!w7e^2d~Z?O%(9Wm;}GN?KH`srEivuh-0{QM+d+-1pWt zBqRj9)&kHvZ%1;_B=tUaa^eFF&z}0(4rTvF^GGXm)A!Fh&(8NZ74ChJrNtk#kQR~n z(JOIHFRy>D^H8Qy-;-;;-X|pky}Z=ON|zqaP8| zNcW7nD}v=!3qG8^e^eEHdvE({1ykHNaD4D8E(9&v=oPkOShlz5Ee#HkBdu_No|%~; z&d^`e1V@R=Tg|=2UL2(S`&f5LUtizO%(_t-B>;>=8=VLfwlx5Ck_lM-+xVpkN(F`p zZ%o#S_4C(+NKq*?`LvFA5RZiK^Sr(MYt*6bcgxL7ajeWiWW|G!W`Nl zVA294ZWRBVhd_t2!wo&Zevw=?Cj(Bqi_6uWwl#gwjr$R9O%WT#H4Y44Fa2Dw@Af?L zxTy{y%JMPJd^P}W{b;VoOr0Tg8XFUw<#;P%aa2}(AzDEoidkbL5Gh)u0}2jhew30j z9MxbRSsW$sf-d64&O7BN`W=i)@gz%#*`qtOXG}`*BHw~GCh`uB87;V8sEgDNQE(~0 z?pFeri{1^bSBihZCDrwUj$8GgJBacy&OEZ!@38z*RgzS@J1L-^^Nipiq0@Wo^yQ{l3}xl>v-x&4*`ut`k+} zaUCC64EJ{OpK?6}zoLwey)XkiUGXS*m+gOeI`hzr1J(69t}URclUpZ|FCD6+OZJI0 znvdwcv=xvY-kex>oVVcaMr&Lo>OgORM(?u@I#2^&40@nN?|0Yk^PV7z!c#2tR(8O_ zw5nMq5ie&eX4&zkR2s#~R7K$lT{+a6iCp(0C=p{;o}7kdyiBBxZp{=du&VgGD8DP!TYTgd*d3wub2>J61^9}jsw zwYiMFr@!Pbu}x6z(f{O%A4cMPI+Q5QAjanIe6DcnBKF3p8(m}0%!IH3lgqpvQp{3}$3h z>zsVd`EvPjeTStIp!$GNHelimmb$)$1r>_Z(I3##UaJ-j?vT90lw8=AZ{YIs>*^T5 z(#|XTD)I6w;YVNc9qF4iH&krEUiSC*e=&ZOVdu_M2$990Idi3G9Vtt;UR)!C+ai*& z$=%#0BBKv0@t~AQ@thlDt_hmL4Iw9e=66y0VaLHz!Ao7yh<;ZXG>5GMy}+*O6j^C# z6D{K<;xOlN_eRq1`yR(r?4QTo1NS+enHrhfhlXy5i?1)^JDLFJQSA4updcqu+$a6C z(IjkZ+o|%nD*`s2*l!QKbl(CNK6q$q>f?|tG_ijWPS|@mj6@2JjE?T5pPp&fpACRc z8n7d?^Y)I9CZ8W+_Vq~IYC9GZN~bIuMynLu>-o@?XnUp{>LrYflA6K?Y2~y}E+0r%9+J5v?mQbD4a#WZk$a`5<}BO= z_?{?mZ)dM_i}ve)u~2|QnY7oE?xHK(+O`}m{-mLWmsVlI1Ez5}Ek(sk&CN2PEL?47 zeGdHD((ao+SeQW|fE73zFduKy^k(y#!I!t2gx6$x3ktXZU8?kfr0TO!!ctazj|dIP5-nXnuH z*CU4qs%x5&h%A&o2mkTgC(yl*zX7jTF-Z;@5tEii+qw^La4sxuZ-=+bLgsm~-m;dN z;B^8%<=xTQ=b>IE7Vyq;eC&gNLP${IhUF3YrIh}u`mC07RFdJ~y4^T(+0p^04!1h;}R`4=SuRLR**^@)>Nv*XzPL@$=T%Hy;NJdz7r`ry=7U(um0|xswtKE9Z#JrKPe<#MuyM zqU`4RW`uaiAYbK9+(ZQkQ?E0LsOQ29! zS6A5Xuo?{ZFh8kab}AFIQ#u8KsGI-D96*bT#=` z*euW6EE}b(^bkKF0SV&KRr-Rbt0?^r>QtC_4C;G~d2cF(r^xlzsESnE_Oqikx4?nb zRadIm?spjWF61bGLg$^Nhn=53k)#V*Qn=k3W_dg#&0W6GQy3*T7+P;&(~~o(#^UIo zW!f>jc8cF});=U-tdgywtC2M3nB?%#hFI@bNWDK=6RoZu=0{y)a?-A+Kz`XqEC;g( zsn^U%hh|R~>k24~A66|uaq5@^zgE4PEIV+h5Q5f2ezCMPrtck*kX%X8P*#MUuY|rP zHFxH!;YS(V8E;dS=`BY*Q{yDYcx==$4gXrJXLeNdD~yC(2Da5gZoWJ^t5c6T|#k=2r7%5FuFH60xbTF zXVYyeUHWjGO!6=!nQ4QZubE`#K z9fR(6C$RKRX>KRL9!yaLdvU5mCaZ%h@TIkZy*8Oa!8dCMsd!=y$}Ah*S-}9J7*hFh z`6vQm31^8s_)bn0O9gr{O2|<_fVU80=H+E)VPSb>Xb5;KqAXNlhlF&iom-skN^Wiy z(72Nm!^NeggB+l9)d8d}cbkI(0+Lfx8As+*>BLSJTy)P6F_~#ht}G>6EqY|a&xC7h z=*THO3XQzWh_1`mJ#!=l1$72nKG*8X$@Tm+EdyL(CA}N`{I{&bPAE7y&VkR#OW+Qf zKe*<#2`s~@sHw^16X`OWS5d+n@9`z&3R@3{v>WrJhSecKG}{Ip;pADC1t;CTtqP1b zIgQm@as$~ldSH7e6e^eNuFdVzHt14rR?Kw8W%)E)0F@CjC={pw)2z03b)}yUpqnPc z$16OTK@d$z@zr{|kic&K6oPYNpSG7)D@$UxQB0!0T#g^0LsM+xB0YJC<7FLzfO|2cO*i5)IWT}Gz0XootqMvl(pi%1!zyd?ynvfmG)1_%3h*)D*bu?EknYfG* zfuCSbN1vSQSmh>zs7x|rJW_MCr=DzbGU*dEGFAJMK(gyoYul7GJG~-WsG%>(ZC`^N zrJyfYzu4T2K3r)5W?Y3_DYBmT`BA^0vT`YR4zHpL5)2{6;E+&O@|9J4YM5G6^GOQW zFZMh&lyDp@Nv*m9F3YS)6!<4Gy_dNqi*)C>`oH-oWfh&$=Xdw(!69OIPVTjazcr;n RYDxk=8Y;TVNG0p2{{YPJg&+U` literal 0 HcmV?d00001 -- Gitee