From 129f0af25e0c44fcba77c643587010a69425e0db Mon Sep 17 00:00:00 2001
From: minsung
오픈소스 고지: THIRD-PARTY-NOTICES - (acadrust · MPL-2.0 · local patch) + (acadrust 0.6.5 · MPL-2.0 · source)
diff --git a/public/licenses/THIRD-PARTY-NOTICES.md b/public/licenses/THIRD-PARTY-NOTICES.md index a3ecaef..f0900ab 100644 --- a/public/licenses/THIRD-PARTY-NOTICES.md +++ b/public/licenses/THIRD-PARTY-NOTICES.md @@ -10,43 +10,34 @@ Served copies of the license texts live under --- -## acadrust 0.4.1 — Mozilla Public License 2.0 — **MODIFIED** +## acadrust 0.6.5 — Mozilla Public License 2.0 — unmodified | | | |---|---| | Component | `acadrust` (DWG/DXF parser, Rust) | -| Version | 0.4.1 | +| Version | 0.6.5 | | License | MPL-2.0 — full text: [`public/licenses/acadrust-MPL-2.0.txt`](./public/licenses/acadrust-MPL-2.0.txt) (`/licenses/acadrust-MPL-2.0.txt`) | -| Upstream | https://github.com/hakanaktt/acadrust · https://crates.io/crates/acadrust/0.4.1 | -| Upstream commit | `f249c2f816acf36ee51cd5533716bdd443c2517e` (from the crate's `.cargo_vcs_info.json`) | +| Upstream | https://github.com/hakanaktt/acadrust · https://crates.io/crates/acadrust/0.6.5 | +| Upstream commit | `289a616da6c68518218594aa80802cbe7fa71309` (from the crate's `.cargo_vcs_info.json`) | +| Crate SHA-256 | `5eaa72520f70eb6f7f09b06f44e1ed0d8fad5fa743364f2c3715c30df962ec7c` (the `Cargo.lock` checksum the build used) | | Author | Hakan AK | | Shipped as | compiled into `assets/acadrust_dwg_bg-*.wasm` (Executable Form) | -**This copy is modified.** One file differs from the published crate: - -``` -src/io/dwg/dwg_stream_readers/object_reader/entities.rs (read_mesh array-count bounds) -``` - -The modification bounds `read_mesh`'s array counts by the bits remaining in the -object stream instead of the blanket 100 000-item guard, which truncated and -thereby corrupted large SubD meshes. +**This copy is not modified.** The `.wasm` is built from the published crate +exactly as crates.io serves it. ### How to obtain the Source Code Form (MPL-2.0 §3.2) -1. Get the unmodified crate source — `cargo vendor`, or - `https://crates.io/api/v1/crates/acadrust/0.4.1/download`, or the upstream - commit above. -2. Apply [`public/licenses/acadrust-0.4.1-read_mesh.patch`](./public/licenses/acadrust-0.4.1-read_mesh.patch) - (`/licenses/acadrust-0.4.1-read_mesh.patch` on the deployed site): +Download the crate, which is the complete source compiled into the shipped +`.wasm`: - ```bash - tar xf acadrust-0.4.1.crate && cd acadrust-0.4.1 - patch -p1 < acadrust-0.4.1-read_mesh.patch - ``` +```bash +curl -L -o acadrust-0.6.5.crate https://static.crates.io/crates/acadrust/acadrust-0.6.5.crate +tar xzf acadrust-0.6.5.crate +``` -The result is the exact Source Code Form of the acadrust code compiled into the -shipped `.wasm`. Both the original and the modified file remain under MPL-2.0. +or `cargo vendor` in any project that depends on `acadrust = "=0.6.5"`, or the +upstream commit above. --- diff --git a/public/licenses/acadrust-0.4.1-read_mesh.patch b/public/licenses/acadrust-0.4.1-read_mesh.patch deleted file mode 100644 index 59193bd..0000000 --- a/public/licenses/acadrust-0.4.1-read_mesh.patch +++ /dev/null @@ -1,111 +0,0 @@ ---- a/src/io/dwg/dwg_stream_readers/object_reader/entities.rs -+++ b/src/io/dwg/dwg_stream_readers/object_reader/entities.rs -@@ -1682,20 +1682,49 @@ - MLineData { scale_factor, justification, start_point, normal, openclosed, lines_in_style, vertex_count, vertices, style_handle } - } - -+/// Cap an array count against the bits actually left in the object's main -+/// stream instead of the blanket [`MAX_ARRAY_COUNT`]. -+/// -+/// MESH is the one entity whose arrays legitimately run past 100 000 items: a -+/// road-surface mesh in a civil drawing carries hundreds of thousands of -+/// vertices. Clamping those to the blanket cap does not merely truncate the -+/// mesh — the reader then continues from the wrong bit offset, so the face, -+/// edge and crease lists that follow decode as garbage (observed: a 100 000 -+/// vertex clamp left a 14-face mesh with face sizes `[64, 0, 64, 23, 0, …]`). -+/// Bounding by the remaining bits keeps the corrupt-data protection — no -+/// unbounded allocation is possible — without mis-parsing a valid drawing. -+/// -+/// `min_bits_per_item` is the shortest legal encoding of one element: a -+/// BitDouble is 2 bits at minimum (the 0.0 / 1.0 forms), so a 3BD vertex is 6 -+/// and a BitLong is 2. -+fn stream_bounded_count(reader: &DwgMergedReader, raw: i32, min_bits_per_item: i64) -> i32 { -+ let raw = raw.max(0) as i64; -+ let total_bits = (reader.main().data_len() as i64).saturating_mul(8); -+ // The handle stream follows the main stream; anything past its start is not -+ // array data. handle_start() is 0 when the framing did not supply it. -+ let handle_start = reader.handle_start(); -+ let end_bits = if handle_start > 0 { handle_start.min(total_bits) } else { total_bits }; -+ let remaining = (end_bits - reader.position_in_bits()).max(0); -+ raw.min(remaining / min_bits_per_item.max(1)).min(i32::MAX as i64) as i32 -+} -+ - pub fn read_mesh(reader: &mut DwgMergedReader) -> MeshData { - let version = reader.read_bit_short(); - let blend_crease = reader.read_bit(); - let subdivision_level = reader.read_bit_long(); - -- let num_verts = safe_count(reader.read_bit_long()); -+ let raw_verts = reader.read_bit_long(); -+ let num_verts = stream_bounded_count(reader, raw_verts, 6); - let mut vertices = Vec::with_capacity(num_verts as usize); - for _ in 0..num_verts { vertices.push(reader.read_3bit_double()); } - -- let total_face_data = safe_count(reader.read_bit_long()); -+ let raw_face_data = reader.read_bit_long(); -+ let total_face_data = stream_bounded_count(reader, raw_face_data, 2); - let mut faces = Vec::new(); - let mut i = 0; - while i < total_face_data { -- let n = safe_count(reader.read_bit_long()); -+ let raw_n = reader.read_bit_long(); -+ let n = stream_bounded_count(reader, raw_n, 2); - i += 1; - let mut face = Vec::new(); - for _ in 0..n { -@@ -1705,7 +1734,8 @@ - faces.push(face); - } - -- let num_edges = safe_count(reader.read_bit_long()); -+ let raw_edges = reader.read_bit_long(); -+ let num_edges = stream_bounded_count(reader, raw_edges, 4); - let mut edges = Vec::with_capacity(num_edges as usize); - for _ in 0..num_edges { - let s = reader.read_bit_long(); -@@ -1713,7 +1743,8 @@ - edges.push((s, e)); - } - -- let num_creases = safe_count(reader.read_bit_long()); -+ let raw_creases = reader.read_bit_long(); -+ let num_creases = stream_bounded_count(reader, raw_creases, 2); - let mut crease_values = Vec::with_capacity(num_creases as usize); - for _ in 0..num_creases { crease_values.push(reader.read_bit_double()); } - -@@ -2350,14 +2381,31 @@ - pub fn read_ole2frame(reader: &mut DwgMergedReader, version: DwgVersion) -> Ole2FrameData { - let ver = reader.read_bit_short(); - let mode = if version.r2000_plus() { reader.read_bit_short() } else { 0 }; -- // OLE binary data can be very large (embedded images/documents), -- // so don't use safe_count (100 KB cap). Use a generous 10 MB cap instead. - let data_len = (reader.read_bit_long().max(0) as usize).min(10_000_000); - let data = reader.read_bytes(data_len); - let trailing_byte = if version.r2000_plus() { reader.read_byte() } else { 3 }; -- let upper_left = reader.read_3bit_double(); -- let lower_right = reader.read_3bit_double(); -+ -+ let mut upper_left = Vector3::new(0.0, 0.0, 0.0); -+ let mut lower_right = Vector3::new(0.0, 0.0, 0.0); -+ -+ // Extract 4-corner coordinates stored in the OLE binary data header starting at offset 2 -+ if data.len() >= 66 { -+ let ul_x = f64::from_le_bytes(data[2..10].try_into().unwrap()); -+ let ul_y = f64::from_le_bytes(data[10..18].try_into().unwrap()); -+ let ul_z = f64::from_le_bytes(data[18..26].try_into().unwrap()); -+ let lr_x = f64::from_le_bytes(data[50..58].try_into().unwrap()); -+ let lr_y = f64::from_le_bytes(data[58..66].try_into().unwrap()); -+ let lr_z = if data.len() >= 74 { f64::from_le_bytes(data[66..74].try_into().unwrap()) } else { 0.0 }; -+ -+ if ul_x.is_finite() && ul_y.is_finite() && lr_x.is_finite() && lr_y.is_finite() -+ && (ul_x != 0.0 || ul_y != 0.0 || lr_x != 0.0 || lr_y != 0.0) { -+ upper_left = Vector3::new(ul_x, ul_y, if ul_z.is_finite() { ul_z } else { 0.0 }); -+ lower_right = Vector3::new(lr_x, lr_y, if lr_z.is_finite() { lr_z } else { 0.0 }); -+ } -+ } -+ - let ole_type = if version.r2000_plus() { reader.read_byte() } else { 2 }; -+ - Ole2FrameData { version: ver, mode, data, trailing_byte, upper_left, lower_right, ole_type } - } - diff --git a/src/viewer2d/acadrust-dwg/acadrust_dwg.d.ts b/src/viewer2d/acadrust-dwg/acadrust_dwg.d.ts index 42effc3..3b92c31 100644 --- a/src/viewer2d/acadrust-dwg/acadrust_dwg.d.ts +++ b/src/viewer2d/acadrust-dwg/acadrust_dwg.d.ts @@ -24,6 +24,7 @@ export interface InitOutput { readonly parse_dwg_json: (a: number, b: number) => [number, number, number, number]; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __externref_table_alloc: () => number; readonly __wbindgen_externrefs: WebAssembly.Table; readonly __externref_table_dealloc: (a: number) => void; readonly __wbindgen_free: (a: number, b: number, c: number) => void; diff --git a/src/viewer2d/acadrust-dwg/acadrust_dwg.js b/src/viewer2d/acadrust-dwg/acadrust_dwg.js index a2ef7d2..ea75166 100644 --- a/src/viewer2d/acadrust-dwg/acadrust_dwg.js +++ b/src/viewer2d/acadrust-dwg/acadrust_dwg.js @@ -65,6 +65,10 @@ function __wbg_get_imports() { const ret = typeof(arg0) === 'string'; return ret; }, + __wbg___wbindgen_is_undefined_c05833b95a3cf397: function(arg0) { + const ret = arg0 === undefined; + return ret; + }, __wbg___wbindgen_throw_344f42d3211c4765: function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); }, @@ -80,6 +84,14 @@ function __wbg_get_imports() { const ret = new Object(); return ret; }, + __wbg_now_e7c6795a7f81e10f: function(arg0) { + const ret = arg0.now(); + return ret; + }, + __wbg_performance_3fcf6e32a7e1ed0a: function(arg0) { + const ret = arg0.performance; + return ret; + }, __wbg_set_575dd786d51585f8: function(arg0, arg1, arg2) { const ret = arg0.set(arg1, arg2); return ret; @@ -90,6 +102,22 @@ function __wbg_get_imports() { __wbg_set_8a16b38e4805b298: function(arg0, arg1, arg2) { arg0[arg1 >>> 0] = arg2; }, + __wbg_static_accessor_GLOBAL_4ef717fb391d88b7: function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, + __wbg_static_accessor_GLOBAL_THIS_8d1badc68b5a74f4: function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, + __wbg_static_accessor_SELF_146583524fe1469b: function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, + __wbg_static_accessor_WINDOW_f2829a2234d7819e: function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, __wbindgen_cast_0000000000000001: function(arg0) { // Cast intrinsic for `F64 -> Externref`. const ret = arg0; @@ -126,6 +154,12 @@ function __wbg_get_imports() { }; } +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc(); + wasm.__wbindgen_externrefs.set(idx, obj); + return idx; +} + let cachedDataViewMemory0 = null; function getDataViewMemory0() { if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { @@ -146,6 +180,10 @@ function getUint8ArrayMemory0() { return cachedUint8ArrayMemory0; } +function isLikeNone(x) { + return x === undefined || x === null; +} + function passArray8ToWasm0(arg, malloc) { const ptr = malloc(arg.length * 1, 1) >>> 0; getUint8ArrayMemory0().set(arg, ptr / 1); diff --git a/src/viewer2d/acadrust-dwg/acadrust_dwg_bg.wasm b/src/viewer2d/acadrust-dwg/acadrust_dwg_bg.wasm index 36bd496af4941eff12209a829e4c3fc79cbfd8c2..1034849b85a3e9ee4d96088c9db1c8f51d883e57 100644 GIT binary patch literal 3047250 zcmeFa378wzl`mdZQn!|_YOQUzYy;}H0UNViKX>W=)M#cg=}Melhay9h*gtJ4As{^DGF=^U-E6mJmXDi(_{={WA;$TlxU z(O;D=GbIELU74b31c`Z_N|7SIK1I*oHVW6o8ZJO-dDBD7sq8W|i1kg+e7*6HZGIQ^ z)QU*dw7&2G)tJGO~Y(@UGV}P_h7NYtX7(a?#i}%5C>Kk3hUWY z8xUE%?}T_DTL80+dvAY)W?=*v-5bNv`x6+A-I)rL(SnyKP2j|0R}AAJILW51bZI|= zD8r^05!9}>R%GZ1ia1Za75&oT^XV-+G4w_3MHIz5OR;$C7zOtnT2V5JoD_z`Vn7!> z*99gReFQv!JC+rej~NSM#T!+)oxpDA;qe4>3A_QeDBfPfN;V~uRt!h9U;Gw^B0#_b z8va1ASNLPZ|093+|6BeTVZ^2#fA|Oc!xJAt{wOv8)0G@SVNbq*kKjamj_{WpVfF{) zh!K I+T(pMpb$O UR^+tP}S$j{h_BPaNk5y`aYEXL{xb`*}?LEcX z>t*ddS*tx(sl9hldrxxhJ!!Pp%i3F4t0h*9Sr+xrrsXgLEZ=#gd#Y 9s#9xmX>8mHO$ zK=I@vZ1*Xh+(Rev$|PFp@x|vBmsvu_Y7o}y=yo=y5i8;-#g!0EDOTaTo^p4!X(QR{ zN-H|aRw~4xPOB_*X@DgW33qgHaMRs=;~#qahIokX&tqW(727>DVWf8swFhvRNEcWQ z!ELU%2du5Q!9U%_X7{*qVXH5rY4xRbv@(Upi_ywNdLN8J-;Tzp5Gd}RXw{FVagVLP zU Izl&Eh%uI7Fo0s^WpuE#^3tG>{(To3F!of@ zA{v>PX4;r}8NH?kNpZC}8fr8ePAsmoXvR8=R`Mq1VXYVujdd1gq@#^>7B8)@q}^DU zqGhZg84@Q}#M>H7=TsjVOPnnPz`Ka1RR|n9nTaDz=sV!Az;U#4y&E3GG3CaH;-S?L zx| ZuD#F98Cf @5;Y1%3?<}jYY85C1&yM`dBqVh%A**3z@te2tL;XYnt){Xt`q=nw>X~sm(x>KQy{G_@z zOL?62T|4y6YS$>Tu8~^T4%j2#H9F+GMkje6d`@?5_L91;&0Jz#)9k*~iFrQ#^_Ma+ z`nIT!s1H`c5TT_d&P5&JJ2X$&toX~kre>7c^yXnki?#POU5GD?AvfWNpoF&YHj$#M z%wk7;J{ZH6u7)u(MFKTL31$c%pnI+T@w@)%SjKO}MP}lM`OU6%Lq=BN1GOLCzJ7jh z_PExJbsSe(?9Co+7nM5Wi^=yyIt8%$9_>F?YqAi(yY{2m+3%rXW4`?(zI~36JM0)F zvz;Lh@Ijz_I%6)KA7r4QffPzhN*|Odaga?)NBF@;KoD)8)QF%pgga{8fqVy*;y;=c zArO3Hz85fQQH;z@H!)ex_GqfNd5w>sMgn)%$DdpEyVa^%dSd64KBis{k@-7irpVxW z2Og36xRv00$EJ$PWFAyz)HAzSOm| mW>OKuH;{@L-a`sF z#tnN*l|bscy`_6qcZ_FmRR%~d?IN9_;B6`xA%j(y^|?T5vIX%W(yR2F2e*(;{Ca=s zYW*g?mUQOQ{?hF#C;eU0gQOctLF!UBX=Q7F=?>EIE&Zjnq$8L0mo||OlI|g$;rU+D zQPN)0%H{o~m~@hKyMCAZOD`iGEA^KyBOM}rwaQ8FBpqi2t4K#T^p}2(bhfv@w4QX5 z^ff9cy^FL$+NbAZ=#E~i3d-ywGo*}QYyABF(yx#Xkm5BGPc!7-Q#tADNQa-K;_s6o zkbCJqn ofIEr}Y}1PjY; zn}aXnCJDZ*-EI1*xZ`>h0JH<8d4*gd3gx@Q{|5U)+nf9wEvWr6SSma1nqxzv`n%v? zCafl^k7;Hm`VFDtZ+Hto^!l{8O^pLV?#f7MoazwKAFuKwY90W$<7fX_L?84vK4APp zjfgJ{7(Wt=;0I*4jA~ajPppH#B8)Ab@LPCk(5fL#L$mTio<0wy9Fu>ZQQcQTbz2 $qZSVd74;X - zM}5Oj_z#UJ6$A~C(GV+qkvaP!1n4i$i*~AKJ84_g&saVb!&pAtzXctzC(0lpM7RYa zj6crtyxb&hsSsCo;aY5j+dz ~MDs3fxNwQbL!pWzQ$9&I@IgCZhR zdM051C-Yr-nbgM|B5~-o9K|xGjA;3q;08i*E(yOBM9UF|KH7qj6Z0fy0o()?B5`^6 zg*^5UOS)XrVhM{tt>xi!3(HWwyW*GaftYmdMs3%C2~W;70N|o)WK%$SdFPs7;JsJ! z&URV$zW1}Ay}@LT4{VD!efBhV-SE4`($hiq4coPYm(yM+wF~ptlWL1v4d<>UwU8DkXcAV>*O-Q-@1iU! zFo9J6)VV7@W80HqX#_O1<_&-j7UI6l?Ic)JUPaQ gS6^l~33Tr^5(L`cAwgT; zu_1e{%XM$a?jqNYm8B23Xtq;dW!x|Q#5T*d+NQf&Fl7a6t2In}w3bFfS#KNnNQ$_o zFY~*Um^zG9d)ES~bWtIxbUz)WBE%a>rL2lbr6ppWoV86DJhp}PP-b+CriIMN7Jyrs z;Vq6%R<`s ((qfjJ}SzpnJGKbW}%-TSt+@&6Ma&6f_bH2ZG@g6FT-D_S4UuYufA j{bGZ80*2ZGwQr3dxM}THG1~KncuWe a^4Xf>YZ7`o*fk_;9H31#IAiIxH>BD-P-_t%Fp|bwW>CO z kl_vEH=99&~7OI{3&8TBfw3TIyif+Q@>0h-iu!t$V*3IM E*sB%#*+Mv^N%4Sz?kYlrD zH*Uy2?6Ws)$PW4J6&tdL$;M+y#)5AT*(*&{?u1KJ3l3S0ZE_ygeq?1VV{;lCR>n_Q zNsS+(_U+3+L05`3d|K)9zRYo@<-QE$Z)LQ)FY{TY9ddtJsm;VXl5Yo_n9!Bcw@9xd zohH43FV4aQI?;0`UC;;%8?tv$g&aQfcT;JY=bNU9xca)>JZEOyJ@Rbpp zzAYr|+2qX8-j~4)#M8daxKbG|ZY7nKVi&2n%59|LDjlTa8X>8;i~I!in^`d~(@iQa z6VY237vxzyWUJ>Y!&^O98QSW(%E7HQuF_k_Rrb#1Dtn!p*O_D{kk;jxROLI9R*>R5 zdp+Mlc;92$apZVt!B)?GrnU-eDH*s72BggJWhLf;jqv9FXj8mV+mh`$ffg(Zi(8W{ z(%7=)H}2R?bJXk!Kf6FcqY$OE=#L?$88u|fib{v$Du&uf2T^mCIAKbj4tTjGK@~Zl zmqWRHo3g*f(1c%{C`n;;3%^XopGFgUW5h2%Py0BWfr_9sQpr4zTa(W-u1$#U_?ywG z>Sm9 Kv&{4oo}(`D>^7GaN#M8N30w-_wcqgF zE-{C^`)L!6cA|?(NH?j@pHZl GdwLr$pJpv40E CNsGhsHl6YrTJGlxR#=WI;^nr<>lhBz?zIn8>Je@ z4P>Pb=`aOkyPeUfU5JGhUqx$if+PnBvO{um4<;adYiN* tg6(4a8d3?m z23#_Fa@~TF>cez7Fk@{1GnTT{))xCEPHG`gl5~lAwSybsD6EzOMCf=U7dEv>;_pS@ z0-asQ!qMZko)m=YM~f|fL@MCuAQf F{7HWnT)(8u*&^*1SuiY`lEzzjrG >npW=3UcZ-fy6y1^Kxi>YM)~gW5p7+%&C@p2J~A;&hWKh^Pk -mZoO`Y~!IGM*Z2epn(sN|9 zW4n_gLt>GiU}z?(BX%5aV8Z|)#4l*ENVD=OvdL>>&JkRJi_(hhJ?gw<8+jG3kf9{7 z>4ZPntZHA;sZL-hZFT^67+v2{2XP|}a_t0g?~ICj d)(Ax5lwdGv~6ldcs3P6tZ`K2~f5K1WP>e|HMTohbB z{8z^^;rn%nU-U=veVZtZr^|T3f~=Zoj4zJK$pT(IY01cqs%Q$*H07kmP8mc6i>Of* z#_7oli?kT%p6@GOrsd6(a=j)!Vdh|)A!FAR(W2a`6Dge5Ss$+HYDhEeWty}uO^M|M z`RiPkT Km7D z$lbxu&(Hj1c=TfrpW^3j{taH5 v?=%5@_ )*~ z&!&Cdsnjz(xU4tZT(Z_BkxN3pPfQqyO*c%2AF}4+T@yb++U%@%Q7aB40mQ2#el`b< zg5uQ!ce5QiLE5IqDQYB^oMu7pvpL*!#5U)=WC1$NsVAv!PCc$VPD#i^+BhaTfYX-& zwLS+p``jJXoWRw+TVcL@cA%EUUfgPW=jubPiLVD4R`$7tFc@Z;?Dx*o;xKgbUqC_; zg8A%3Eh}jErFcIj*)P ^p1OLpi#Yy9U0SJp7dZs-{8E%R9;nuzglA z@3TS!pB0Mu>{u;3Udv9@vXd^WfeABtP2GCLWmPJ4p;Xx~)v}Yd?3Z0u( 8uCfPe zSs|KlSIFhF@2O=Ut!3X=%MRDF@2_PsmLx4aUdswQeY<~E%L+d!Ro8{&KKs>L1!1Xw zO^E8VAE{-JxU5 f{PZX?|0*Vx{7NQ2{mLgl|L%-sOrH2 Mdz%v(N$V|&PrFgO4|rwbk>g90Bv}K zXB%Fv%E6ysWk{}{vHXkVz0A$3=5W!0`0aH^W09BbM S=PLFZ zs}gOJng8xgt6^pSyK}Ch_SNYcQq;aWRU^8yrl@^&N>Mu-c|Fxk 2GICsA;7=+|(bvj3|K`rW`12_pu!CYPllg|0(?-sO5i{%Kuv`Kby+`IF&!0 z%KtQ=-S%2rFQlIRER|;)%kF=U&j3Hsh-R34{v1_HtDQpBP7c>LMPBVzuU5k_&z6X@ zH&T7wmv!mASvy?Ek5ettvYuQ=>G?ouSo(=qZ2icm-}mYN^y&9}YMQ!4nMR7j%)T(M zg3N5Gi^13uN3N6 ?he$o1es) z%S)&9O !2Af3suDi#^oxtbBYZeZ7O$or9(lZkOg{9C3}99o}KL(M*XusJBILrn&{P9t*iIS zKWDzG>W6xP4dGmm$7$?ry-b>L4i$1fL 5oXeNuMW$`$Rt>#pxPDK>hapF@4l+-~Wtkd N|(n0-Wu;wc57eeQKdiQOZ!M)Agu&su+KsIQKt4~9#@L9$p@7Fm i*o=^rG;9u$sD>es1 zq}qSOJPW2M0@Mp;+ygfXW(5SA3uYdK9T&|0H>Hf7c!J*4j1ub;qr`g8Sf v&Z7}`!Z-@CR2fT+hI_>4$n`0aa;bZpA?N<|E5=9p#+JQV ztIh)DjauG}1!Xq#6_nXhD6^$dW=k=1SURt{3kt=W =W@vCL^)0R);>f{m z9{2~hdEg(|=B292wwlH?s>6bPX&4t4>`TG8VZm$DHG~DPP1T6@)v(~T9t*Y?OmgG8 z^KBmRC$@Q<7~dwG0IWY5$bZzp`o zHM}Bcve61B8|}c}xuYf y|IULxeTz>Y^6C9PeZZ#&e2N@q-$V|x6zOZ7B$=fyS?Q8? zmn_Dw^G1iM+vor%o(VG~-MfBJ1)*sL6&eWRQhns!>~T+3$%!PELY3Dc{FF8bu~*w* zu`<<$iwJ1LMFdP2LvO4YdSiWEMgn `}z8B}+SB;A5aT7)ffuOdk*F^xK zw@R(Et*YRy{CY3Et%iiIi_WZM&yVu8vps`;pY@sKEnrAe_I!2J0WY#-xxa;*kz zOd>m(CDPCU(!p({ZzR2yba7wi-&KyV@Drsg`!YXPy0kBYI(@ZCP6!&SO_W3QSZ%W0 zurdc|0`X*Z^Z=QI%G^(8P??9wK(1FuZy{4r=0P(1NZ(9)2kDzg5ul>|q{OGewa7_i z#1=Ax%D?I3c&1@O`5{>;J%IkIXN8`5y8R>7T-KL4tyJuzo7AzB)h6(D@LPglNQ!`o zwP1Br=*#>}^)bS|pcD_TpDJC>)$>Xnds=PmX(PY!2f0u0A^F{_l(PfhRz0yZ#IM!H z=M>3FeC{ez=j658_~0&nOY$98MdZHw)dGH8KTr!dn(X*}WhKH*s19CROQJ;G_yR zV9->-n!d~fdKr0nzfuW?h-s@$9-LN25+X!nwTXe?&1w@cL6p@dS3)pXJ4sU+F;A2Y zt4&HpMqF)T>##D!wZ??9TKx9AO1EwfPAQdR*n~1-k>kq95qV4*`Ie0;BbjkTlsR!^ z8EE%xv(oO_=4@L{X1t}2TfQ#M3&ky8m*R!SEq^avL)`NBQZ=I2)wt#Fd2T61!dScK zkE88gW}IsGtg~`{O=etDlNra(ugQ$RLd+VI85h)KMvndliNg~DVViRy!_~@E&Q3B6 zv4rDXBQJxhyA!TfaI(%Q6f?m2DpDo+B~i&!8bZ^um~9+r0?}m$#roZsQIuo}BHQKY zt}#u|?~f(sPxJ?@C8jqq#~(bhbdJ4CzRIp^tx&orIW$GonmF^DWda)G+ZOAf#T5G^ zVgg(AT{0IqryYDn Qa_=K4g}5dA)~3*1^L7ao2n$agPxy>Ub||{w}7c z+c__E8SII$+ZVcgRN?j6Ij(ChOeGt9C(}EhwL#7a; d9J7bwEo3|*2oZF7i|G4VXXKre^qcSlHhlRcJ%DzkwzadW- zlK?EMNQ96X76;pGw-WgvIWIFgvk8IOjv7cY)B%)$zn{jeK`TgkU;e(stSth)q1a>e z!PsN;V62@}llkoefS+LMT~Lfc9e2~|1RZxX`oVcOcM{A_DWWcm1}?L6j8MtT?D#wx zE96+cPNSlr^fZDqsvPga11l5#u9n N(QM>;W!Cuu?>jL?n$dZYujC@8&plIl;X0S;>- zpI@?l;hX>kSGMSUC8}Fo?hL|G$KS4O0n>H-O-HiMQm1-E&g#J6smW>0c+zyh&OlxJ z8*@q(HEJ6{5*~}QyEU=Ft|fR7Eo=(1xrY2g{%Jf9Q?`9hC$EmS ABIf)s zN1RIN&Vp5$$D@|!PGvseTj2;hL9?wP8nj>(G)VAr$&Qf@_b8!V#nc4X6f-T}c2x_p zH1!L-4R%u`T6Pt6i}B@q5cOIa`6^1oF&=DFoV}1USE3Hp3b`{Xv{ozdeuEyz9LzcI z&b>|5KP8-Ap-p>;yQ^U3_gKWmN}%IR@f&En5?c24@!k4SQMkn@&$>Hzw!DICT7ZJo z^aPq7cldGQe53OQ2F2)Yfx;MAbpVGwF+89c{;AI34V~}bsI;fw7_55(DW&cWeH-kk zd*hb$Cq7>Pg4XmPL7DyXKiqCEKY2Fwc?w(PgiLI8xoLg!bH_MoZM$wUg@~ngesD2Y z3&^G!cV4{&UpLF@X`9xjIL}k;$MXA|?;{5}$NbCtNCN(D0=fylgOQ2>Pvtb+BSARf zLV`T2gL%!khXUdkfemuxFe}_H&v!UgYP@PXCx>WF@P+9mxja3=e^)=jhVu}&x)r%9 z{Q@x!>Xy*Fd}RZor~BLKlOf(fyLhKgRw~wl9mypF3i>Wm-FIDv6o>Y=*x_DTkCIn7 zm6@x(qobf2Zf=Idnd&3t#EyMt=@DnOK}L!Pte6 C%!G&(>m-7ILfG}z{!YF6e zJWEi@3t{^ly!|M^NCBHqhKn;~jCNm=4vi? >EcK`=hrC`}_w5E-}F%G)Xh< ~d?9b>GI&%*k%-QcnWDvvXH zkV3^4XjW_icuN)gn91=*JFy(b4}SyRbwLbd)S?Qg@3IZk@8&sC1potsRpW8u(H2l8 zKPReyust1BAfJvZa8EU;fCX>?D8@Bc00{wHnq!#XS-|c}kj8yan};|Rz@;vzz#Clq z%-xu8*8;fk9Sh*1m;$K)E=bXeCvdY~x;ae&h%@3TfF$brcmmDD6F^yo4#dIb%q0r1 z)cRY%Wq0_mt%4+-6xqJ;Mhlv3qKBZ0br~l9f+si^qFbTlpw5hkUqK+{L5KMU3)FS; z-=5DBCE}Z+9a5u*6W02i2p5u*SQe{rqS3qGF;znd3cBhq6IFufUOUwfEw1RWKR@|f z1qo)ypcHtvm=fNZ(4sWWKCNgNg3#?llrP+1K*{GU>X5+IA5JG6bwErpK0I@Yz~mw# zK8dhPSTo+Po76<0L=So9Fpkd0i{>tR3doH7NaPWa{mXOJs6Yl}Q|aH6wI2)OMLxa< zBYU23{sv$+oaYD`GzVuD$Afw=1!pI~A0O|{O#?)44$g+cS@T8VxXIZOcZ7RPn97kF z;)e4e?ubL&wi@Dw^CE6|PQ PQMc#ptl(W5zGCZ<#_>Zk;vTqVO(G0!D9&MfQtv_#;1NNV4NJmVU$Gsv%u7-{GNI-fvJxrfvK^@w_%TUQOOY_ z2<&j1=8&=d76eF#j$hB;`w1_316^lT_=FD35@b3RH=Ji#I-#qW%0#XR=`$dpxnz?B zkI}i;xZ{ X^7!%1+FMRM3xa4+y&Pc1Gklg7?HX^F3Qg-@A{1pY%z zB4E_bN+ZS0pkqC5ip38!>Bo`4?2;w&W7#sFmwe`=@}s!9>j;Y`+-AbBj8=P2Bz_+R zM!L+#@ZFjp+PlGSjsg{;fyYqjF=I{@@Nyp;TX$SJj3Zp9AO=Sdp*gt*m}oO#(Pj$= z&~e5Hft?+{wu+d_bQl%|LnHfngG7D-ySAC^ic|YY+eISFMlpUJXFSjbQV^@dmo`=O zT|K|niF#L+8-0aD%mB0{TXx8GSOG|ROIKVax0!X+B&WR2H(+TsilU_e#uYZLDtE9( ziiIc`HzA@iy=iaMrro4+eeqpfC?W}7lCK5OQy=$pwo9o pn7h_hVkW=FJ4$5pFy3)CzJ6YQ+GK*+qw z@+46Ld&_Xa(x~N%mFw2bRbLQoDwH8e^jE5lGDw58%p5B6ETzyW_yW+PcR8nn{@8jU zjj>IZCZxLIve$t=G!f7-O}jeAxQW!;oRJ8jgKf(=1)#Td0$y`W#CD6h!{f!(sI<0r z$=Nh$)#Y{r9PoeSav&qGPSGx?Ol&?m-aJo)Lh)-wDlC(pChQ;R86PI%ppJNgvKN5m zBq1Wp0#WRt2xO2R(jf#S#>)k&s|x}%9%1-ha0(#py0O(eJcLGSmt6+sP0)a5MX%6m z-WGn?_HRSdAV?xq05$EKuxb9R^(GNFDncLG4gIn0BB*Jx&O#}Banm4f)uU0&xm8~F z3O`y7|C>HMTxNrCuQ615QVgGMw>OLpCnFhf@!o8j*@GpJ(BVQEGv|&572zx#G)A8R z#n;B@eCru}JbVr8>&KX)m>#BgO)!oc$pyE9k6Z+O(YD6%lp%I37UnkZc^utpVRJ~| z*u!Zw$@a*;N+Iu6nUj0fagFkFTc`5kogDoY|5z3+rm@A*vP7{9tF$F-h63hURt};& zJr8(=vM~Y?MU()#{EN^uipPLSDgNR0kkTmUVHN4GfBc?nTj1sdkJ$|bsZS;$<>??F zRGD}cKq1~#uWC|L^+0sJ+dZPHsRJUn4~9ImK%VzF3Jd>XcCiW?1M-Li9J`JCKAQI= z*`6Cd3$<*m>ex=AD>g_;lunXBq^h0%Cq(^!08^ngj5AsuJ`qL3%!b+QvP1-4mly zIAw`oj-CUbvpJ@M6jvMZKv3KSiU*;m#;lOWj9Ceb(M*b0K{~NWUU-&ED=q|pq3)?m zD=ySG%Sn)TQKbvDHR-4Z-4~(ExWMl~mb=vB!ul&K6v}N8q{yKRtCJ}&)gpo6f~ZCe zilFRcWrbux4k0?wZlb0^YrKHd5-n1I*Jctz^ORPScJ&k9Z4rHA{SjJB@+UA(v-T7P zV%&6Tyx_dsPw*sD=7I_dG~^oyX~g&T0Ka@;zTJc|3g;-b+S-Oj+OC34!i(BfI3+Du zgDZ;mEN)kU*t^Vj6?w6B?J6{7b~_Oh;CB^#LJ{=m*;U|1q4im 6VV ?n0NT8(aMKpi2Ps3aCikZ9!SbCnV<(!p%@0W^Ybo6lBvD11tC z2FSCL>VgPkQVd27E;1t@pAfv|qYE{a%?TQrlQnEeA=#02xD3}J#UdH~4b;GCzQx9a z9f0jZ?1B+u*!v%RaC!10y3pq?gq7=U@jjtcl^Z5}P<*d)DU?r_AUP2a#qcEpJ49v= zZoG!_&Tn6Zo|nMX4dC+g1Dtu}x$UcLX%|5%*;^icG22&e#$uo3Xwp*w0QZ!(vB@o0 zd0Z~*x3L1P*Yn)&)cSebSctp;j=gB>9>fZ5V~w^V5IeOv%6%5Ts~@;?ln5%@=2*3D zWlW4Uv CQ1s~zb32X z)z;AMj %_bf%sP;OeUVQ&It$o$7}z&DI@=($n@eZGuz9sNx+x){vmFBa4AOKwaPSkE z_`k#lANfQk9Fa0cmsFJn_=0QsgGhGI8_g2Mg}flf*9gx_NRj_7pBfg#ZPKF95iWEw zB7;VLmNM_6La~B4SyQ^aLlpoJn58IYXO&W&x=hkHB 5l(o *3P955&&@YKzVP2G4;N`Fs7`CW-@{> z+4yX5CzPoq?NiB}GRNE%F#?;XY!A*BKlM%C)h9+GCr{`yICqIPdN(}WqV%VSbb}+u zqH6y}WpD-9dnJ>rvw4g @8nqN-M5MfCx=!n$f@aY_05q7pf zw}?F>;a8VQ;%25R>m3bRPU9#fmxWw*2^87ZvkPECqSz{!I#Z&6r?Zum2A4z#r(J8Q zMSVB%qJ=x ET&TNakMDBn-+VI1R%7MmcC}sFYAj%} WOFqK9@Vi8pxjC112z#j=fK)oLIfC&te6e&2pUVBk? zIqQAAY|g+OlQxb}D<~aEH~EH~L_WER2p`T;umzGv3&dd6t_bO!Ahb~9XB$A@(8zaq z%$ao$Z$bMYeC7qz)&!72jiD98(?U3PK@?W;Om;kmNkf1KuSq*F0`5hv*ob6Q2cj{Z zlR;8L^^F2GgPV`3Qx#kGv2wTvk&e~hp3))%0yi{liwmV5h+|K*noU-u`wL4wEI4fW zEU%cNrv?#7idIv8IX&)r!xp<%E&VA29(urzs?;NH%3GnXyTq4GUVhL*!tmOy^m1>* zmC-y0>5jkK(0 NOcG>NpCQjS$4A6?ZNF^ONW?Nj>MJzU+aUNh9oj*t-wX*X9gOKkuxAOq*L{-A zk5hSr?1-(Z%VtyGXIasYOLvHR?s_={=+wCe0H~s>InO}DlpuDO5ENs9?Uih{VTVs< zs5Ygkhe4c2UW=j~lL&yeOj?Hc5FUMQ75KrFyH&CS){YhVJ06C%DkfJ#$;w4XS)h5M zWe2xvxovQ!qdv41QCPf8nv53M7r^I~GL#XR){$h1(ztb?SxaJ!NnJr>W{qPC2evua z!^$>c2z#7uyTgw-Vz^%+)^r&YeZr%7y{sv1x*|tbLz$_VNY_P4G{j!n=Jb#3f2tcZ ztx{#1!w}AG+0JVJHni)a^6I*D FDOh(}bg~DdGyyt;5-Gctxb_Y61 z+Q!*JSqpWYr0rTt&FRWwsWtM7QN-9_t>gidN7{f^BZu*wtbOxt*&?dkQv8O^W^#`r zgcN_Y`27BO-<~po0Jx#q;_a)~QMj896~aL-C3lLr2Xt$-7>>}X+|1| ?FQFAWBG6xPVyP#DI(VIOS@f*lUY!YV211yH3sL|#F%mlJEgNgc@ zZ|3
1>E5=tj~eGBGEM*?hB(Xgg ? zXB|X0%g~>dLOJlv1Q+lQ+Xk_uO=6L6g)~hIDOnm5q|aKc(0;RPk^X@WMrUy7hDZxk z5XdC2i|FukAV9XI@w*`sRc#zdUD4@*sJK46PsFa-wBS __VbzmLDcN3&=C?X8W1b zr7$PH;rj^@TU4#2gEmVq${q;R+ofu6Y5Z`IG-!%LN}$bt1UQ6AL|p_;S4T|GXfZH~ z(MtAmk68reA?6D8IQqtws(hiFPPW|^MpEi 30p$9k2OINThU9~4b~)oz_eoz%#&-z)k|>c`W94+4y+{V z8VK;^{ie9$f#Bk_ZX{?h=sIJksEgEP(w}#$sE0%cf~&wN?AxUx3rc|0XtAWacBlrB zxZ4S-Hs==eRUubZL5oix r0qHLGaG_d%Af)r`WZ z+X@IYmgKKNs3aC55bpwVXz@&B ` z4F|qvNx4hma(PP@CC#IhnkHIu%3?jBT@1g7-Cce_@=y#=$qU>KRrOn&i>e?Y7~ZO? zpk@Z0v2Htc_m!SY+QA(|0dYC4rk3?iO1ioK#R)rf0w_h?3GRxw?AZ+*8(fwfuYpIk zTyL>UBym{(Q(6Nd8!=~gm$w2Bi1j)FA!lva{17s_g_f16+D^Y!sK@y{0XH(Wtw&Ke zwAsxX4J?bnVd!aq1_TY_1MJoAMoc7ZTzt=~`&G-xj1KHEk5S$^hTA1Q-0d#XmZD_x zPjf_tZb_j8#Y9Qmo4uO{=$)6D=R=29kDJxQFUSgK^r|&J5P$(DnxNFX2<)(}KQsi% z%u|t8U1 5^AAU=^~P9=|Klg$2-^OBiYz+v9#Cp#b*;&xJEot0kZL>wIV;%T7ZGE%r(X&0%S z2M+{f#?G_L7qjsInJx-&P(>?~jfZ&SX3{}8@GYd1{9Z*m&2s`u@FkoOevNdX$z4}C zy0E{b>j|exk%{g0Mw23`r|T6DlfKQowa9Qn8p)B&?~
FY^nm_praIY_E|Er&@#2ntI5rRAg(_=(=Df>AQ}*<6viUzw2> ze+}b7G7qSvLS{AT5Hyr oRqE{GpG0BC{q#%v&gX{5U_*zHQ)#Z7a&nibWz-M$vTb+n^0Z>)lK8 zqf9?ii6VtJ#}J*DOKH@by@3P^40lo`h`6qn?IwHwLirT2ALSnoP;zCJ1d&@wXlogX zoa7|6C8S4>U+Es-QGGAV^;hZ{stT(5J|d2|T+!JB8dqiT$kZNaRp!-wnSVtKzbf+@ z7!JvuQj93`+P=(prKji2>bI4m)jOq>m{8wQN|n3%GT*c8MY(-$|D_8z? wC?ZM6N!OPu)YyAUv8Ic;zMNCR}@=?s< z?z>EHckub3H+bXu7-sy6d=Z!>-ojg;E5d hA%WldsKT*x=YY(-zC7WG3Ht!)w@IW?nu{z z#;59`mt{AhH&7XKeV#k7$BAZlUXM&|&~S<5O)jk0eO-_zk%p^Pt5L27NrBeqDm|jv zZb7pO*2*4cCUe~3QS&zH>D`2iLPeRAkcrL_-J(3H@SZR&gQUOI&i>q|H_zcyrLBDJ zBM7m{N2Ip+<$Xlw7=MkK=rFKZAQU>x;t8dMrU?$|-cmX3>Z}xs2<}*Ll{n65l|95> zl)J&}dIXQ_Xm^>ld#Bb^fibJ#2)|8Mrm-hiDE&LMLa=_7`$qKdgx65pS_LSsjFH@v z=IGHCARWKfvGXF?CTgkv+MV$uXfM2 *V=Jq#kgGkB~I*k?UYjX0N jSsIfDblYd>`~c?0{6Z z)Sd7=q6JlNV%SNR-<&hZ8k+7T%WtRZ1UGj^>+DH^9MiFqgjMb)Q4kAaG`J<)$RKwD zdeV@{O`D{lw3Z^d!f0vX=`0$zZj-1VBpFtidKo_vloZM f8|PeDu}yE#VF}N5x6-)os-bQCT =80Yw}1sUj>g+N!;B5w>X&a+GC>6^ut&R#$;~l% jWd#zQ>;%jBLEXIV@xXI=Es6ZQjkh&g6>nGz_F}hTH+e_Ko=A*Togk}z$XtmS% zQ*Y7-6Mu|N(RJP*<2tM4^cX@qck238;l~zoT-M-sx=A_hO=@Qq*gx1=1-=3;>T(1s zGCdUL({2E faKc5!e}OXw!#-k|qQe`pNJ>klcFo@g?I{tzVGV#bA|8Ds#Nl`Rfm z0Yi*H2<8YrX#NOwa#0rMxGQQ|pMAN6m;#6ARA-CrY76l&TYA$6^2`*A% ;13_EHcuq$U6PA2+368&`<9#e#UZ8RUV&-Ck)(BGjBB-2l0fChc&(Zp zv0XiD_o!1hGAyv8C#fPujmRf|n6#wL>+m-ZG$a}4c~q6*dw>k*#owb2Uq{z`r+N%r zZ-{zCgRbR8p_j~~U0gt(Xd!2Cncczi?}&B^`F6NPxzTGOchDNhccXNP0J=zkX(7os zls8qikX!iD{8~uG^Kx3q-a0L0!GV%#A=gG*{-at*5N;F3v6>dLAT4CC15LP|10*2Q zZnC6Yz{O@r8G-0aQ9^EIA<*X8r%PK{ @JRQec?sbsJ17&oEIaP0nHrOoMe(Ta4Tp_wt zI>-$v9V8(PO$T|YAh&cWZ=i?SkW%6S+BZoD33_MBnm{UTg@w#HiUyqX0rN~D-6|dA z*632|K{NHvFRp{66SQ}x4zj5ED(>_;NUuYkql3IjbowT*gCxAm23|?)AjQ+|AfuL~ z*VDEwZauD$4zd@L?WS;x1H{l{Xs<9f6d-!>zE_0B;)x{%(o}8}&0)&6K(?=7b)~3e z$*PJ -d-U^rR=eeWEQLo2^ADo+QJxmjc&+$iVjetdTi3}a-yK>NZ2bX zxXb`@3m=%H%;XGkl}6&1W5Tr*7e+qE9Z76)Eja46gZc0@wTHlkPM2xaYln21?v)rd zW>0^#MQF1lo=Lu6C6gkOMoEF~9$1YHR?5sCbq7dSYGi*MS!^@DCy6q1ou{{3_>3pX zJ0<>iQx|&3?(t+)ZS#CRS)xCei_u=5FxtfM%Wl(RdH8RbpiURKIWPP-_JBGGhzB_; zIvt?5(9@0aqgmT?yf__#ZE)D<>Yk|XL<8V{visMD|0-Y-R;Vl}tU2&mCAU>y8GBSW zNZm>erZlNMTgy)U H)YwLTsK=sj;cm%EY}iC(`P#f?&vFon{v}WdmB+A zeT6#+N9nWshzIVo6@=6Y%Xeo-xr^)}KvEmkBiX*pANc$eXaNT--;*1l{*={UmHF#z zj99oT^H*6+Ph{;@nz-@mB`9r*(Hqq5gC_XC!Hty_^Fw=s8!KX!FL=ExKt)q6u<2px zk^(h1V$I#{Dzh5?+1;*v)-5SeW#`9f^E61Wr`;$sL%2K5;< 6 z@?eDW2mR )`{JRvx(fT4d6z}-Pbv}8w!C!qSOt0AIvB6w*n~Z*Nu*| znB;tOP5wrXl>AKzu7|{A;~-9;-M9(hW7$LkzcC)qdP^B?6+D-^nHA7h(@Wrzl;9q= zgV&W|61aCpxV4wgd>{gHo|(pXm7Ld=k(Stn_8i5jeH)Ezx6#Iv%~BYePitD^QS zZaq-w0z=l$<}@GhqBcOn-X#mdyZ2kX4WCW17=SL^wb$Y!_FSToch}{ygz8FOR2w;E zJe#)Ri(SxXDoLzHtUYeMl~jaOdx8(T28~5f0-x|baN;t;vsA$iPKY*p^3Bn8Rq1&O zZ-{k#mnglGp4SnChY5ADc!{Sh>3JvI3mN#P?nHVnMC8-bbI2#=m!8+@O%^qS3V=kX z#YqaKtpWm*ox^DDOOu@oP8`bJ6+zjMoiPz47W}Q(xBO}%JImT?Ai#HzX0=c8!t;^r ze@J-N{=CfQT;KL5%yvdMNqF9A!ZSK4+$gndtn^MNJi7|=$e5vGU6erh2mrB6^gga?jOQjnCDP~)ocTzbkSSKwrAIwQj zTD~+TEu;9zsk)riG;cstzukP>9IcSF9HyjY4kw$myn>ok;tizbP(t(W@&<{UK SYziQqDtb-4cWnkZpt0z)BdX6%w3eyA73ren2aZh H)rdL2!#A8n=HUV6sJ+?7lmlkb_CT?bW6K&T?v`uJBv=(w9c%4eVUIS!B z1|JkP0}K&tGme5e$(F&IWIOJtWVe%SeXEIN+nvz7L+tf?TwBmAgjcDe=qa-8k#eos zt9axES#zZratwmGh5DehHmMaD9D)T179WMe;&WDrZU&tHRQSmHWZ1g$hA!n}|A?l~ zPaDb-1p-h&>6 tyg;{(OJl>Ad$TmZ9db^X>w>(cpH({cxlhoCDYE?N zpwe^}g{XBy=S(#Vn!9F+?KV?|c*vMdi^O_XaXsQ+#o4p4Wh1a4Ib@>yElyb@s}3gm z0>;#ca?cmsSCcsJ^OdU-Ck0lywl&0XPSYlGTJW c zAdXsg4R%Q`=Vb9E{=FmU%e>R_+^$en$xCu6EJ5t@Z@e{-u(&2TAd}$3R((zIc3(KC z!gpAq!G6VzQu_mNmu3bqLqY|htmhDXMxYT+@hHJZztV!wEoTTml$hZ2u(>WKf)ASv zuX?;udkqKIw3P@xw=iGl7JLrMbrHemKrlz}88qKT1RsWDa6D*AMejMo^>={pT*2oc zD3cO=4zUSI3qG`vc;1{<@HyZvMgz!eATPmZ$cPVu&%rw9#Tq^Fg3lrAtrvVA<%6!l zl;Gn>a8|+RmXzQlHEx~YV-xznzu@yLX~D-p021}Exh{Ia#~im_y4LW2wcsN!(_fb0 z!+d~DKVR_CylMOY^93KF=Kqm`&*G+L0^U{yA32OBUeogmJ_c%q1SesJP#Guq;B;IQ ze5h6xe3-izA^3PKcY+U8(FC6Z^0|iSoI~)z%fa*J770EN!!@gdk0%tHViW-{Qt(M= zOI7e0NxohqR1$nfM9t E_=J_ntDq8EI8t7iy4cbHDk2;&^NXE5cTxO|S>Bk2_W zU>x7%o`Xf>5qCPVXP=jPZb9mKcfHhu{$qZrXDEnn5sgMVIGfZn1do=~!-Pa4qV-bG zA2_LJw8kLv;aBICdLC5}I;0*xnUZ?=a#iX%q9;f_PbhU#&xl@fQqQPdSFIcMQV(iE zFZGPsgqqZYt)mYCgj;Gb z{)?e1FJ=*-4xTc5$lV#2a(f-Rea)4mibd(vl-y{23?yN+XV3nPwK z;0j6m!&!yjCNz^GF(U!BOJJ=2tk?-Exq}p=zp(z_t^QX69mXl@Fb?vM>3BT|COTd! z7sFZK_w#f{1Luq)VC0GmVI39icE#9}H>es~AMd3^@u z0Eku-k3H>?@$@sDEVG2~AChhkBjom+l*6cYdb3xMusho3tDzaWPuk#!-y|KiVyT(& z0#T{F0I_k+@fr;NABxKg-C~uxdF}$5XpvYi4pO1k4COCF+EMzJrI8HrtfT2Z< tWBd5(<)vl6+6nfXxL2Z;I z*rvdMKJ;a{KAd!Oz^&qzo~ELMnnH}XXGQO2dNUv8abm*wKCl(le!fW%sC^kpNbMJX zmg^0;u*u%vuauI_0ar8CwZPS%NrOKzn+Phv?B>kJQ`H2-8}0j91n$E22Oodi17CXP zsc%rsR#o4-il 2 |Jg@(q2;6A=${etjWsnAn{-N zDqp&dr%c3vYH>XT-k7SF>dHR7-kW)nV$$G2-%LeBnhAc|$~OmZRZ2r#S*Lp0aedx* zX-s*BGr&7aVe`o|^qsE$38kE+og!5bg_BC51(T$D=V0; 3Ks^Qcd?Gxx)?-MN|@Q{9QgN@QOcR}s4XVS8 l~_x zjf@QyBQrg@t1xT$>$AJKjt%0|le@J_Td@@lt1aD6Cc@N%V=o;wx{JkVEP3X< zcY8Rrf*Hv^z6$*5%Y5AWv??=3e$4mv6ZG|OeEE} HoQ3@xLnzO#< z7=^}MAlgsUzrXW+cq@H)hvioRynUG`ef}BpqrT2K _HDJKz;8AO5RpvMYdCIr>IOW5( zFeBB4`76pE*K-!;eZJlkl>NxJ^>R=#{rh6Qx;U!JQaS#SxW%d-QoESb z>r_vdyH)FPTqLQ-!i^^jw Q?=`CT znsmL_)apUpIMJ(E9*E$kl^;A`KCRj;oXYArF~_?^c*`w{_{CnB2UFQHUMai5Eq*+k z#p%fo!RATkF`!wnJA#JOD8683CL{QXg56R5#e_Yw2sT(b5f?CZHuDvW*}(lyQK3HA z9SzQnbi}8gru2>Xr_C=Gvz>)zQV8WhD?ZqrZ6-ke-hLnFi}4ZJFFB0NY*0XOb+qvi zlhoA{aGyjF R)|)?vqdY2D3@%)Kaw3duAKfUKhN%@I_hx8 zPvvdmb4lg5OH$zKm%86K)PB# 4L$8 zqo-X~)RT&wN|0?4Mw4$i@0np9Bp>y%QuVj>8DYxi0YS*TR+15p)jox;om)ydi-GWi z>|xc%?Ss9#el#zdf?$+Um#O=pita_?8BhkLJ#vfru_RMQe<$?1gy6TRj``dm?J)(l zuTEF9dJox#F|*}7c-+sJzE+`NFkLW^{Fqh!As&w;C92Q1ARbN^3?)C #U6r z(V5?UnYXEb2!9VLg 1o<$Z$&n-*0xn!K?s{oUY%)* zIFCpVopa2aybTAHi#PC4Vpf@&drYI$qCA!B1TR(s5w `Pz%$Gg9}^>;v9#=nok_wvlT58wTc?Z1(nzHOPY z!0*UM6PAp11`hbBsZLg94#1q=t-P*}9n z?;#o(QUfgS!@kkCQa0@KZzKQbK0iqQPksIm$iK(u-%kF$mR}S61kitn<;9p;B7K {_sMJ+vxa{U$WI&Pl@Z?bnI3gJo3*tTV{E#QQ;l%MG$b*AYj0}Xn1wV4Bh)Z zD1Zb0-Tle(^9Yz|jEAd_9cL%WgGVFCEG|gYq?<0UalOn;jalQOyD6u6%Q~KAMp7%l7HOi z-$ec|E$ (zZ|n zKqZGTyb~BDW(z%;OFMy0vMF`PFm8;ea?TbyLR*O~v=w+gw=Hxk=WL-TxHD0};_iLH z32ZVaN`@_T!rSx-Sc7ykVfU1>H6G@Ao4K~oVM10ghlvx|Va^PuZK1S~ynj|(=m~3I z`rCS2D2Mw|ykZNT%2j12K2 yCCn)~Iwou{{ z3LR7H3rJ|fof8=G^?@w8gN3DD6!TLoRLT}wa2`l@WTJOIComLbXLSN&K4`CI3r!!H zSdnr9)4T!C{iQ9)rp?iovpIonG1OE%Npk{QAxEYaXE=dr#!6evx$B%xU@PPVwj$aB z6XCpo-bwF5wEwC3gq =Y8@#3%~6aYoS-+FFNH(NPGhRgI$1x1VDa-2_46sFuh0O~z=Tkejp>I+5ccO*p$~ zFN<-8L)b}yJTg1RP}xOK jT*Z=CdZJ$M z5XSwi?&~$6mR)pAl#Pw-T!%0^i?N}HFWONDZx{6)Im0eGV-8`~)?A0M!KIF{?*O0L zwKtSkn2YYRRJl(5xln%=>Cdm~&tm={44b+rv5xsqC)P39&VKBTV-iNCST7YB2rTec z|3z6#ICoc#*8obpCv11cDeMEZgNgz*!<>K(+?lMvGPaDSnPDe;*i3r_W06GA#K+!Z zSHKzT-$&?UyRj*o+zf{?+`iz|43tj=K%J=>`0;E2F*%o-!9t5CY6gw~69f-I=fy@> zwwrD1R0}ON)dDh)Zi}6xU2xajVw%BLNyuElkqDv)-o^TB-Z)dK{T1V|N3z}Ej$9N; zIOeW-^LM*JM5&j*dM~P&BCVC1F+ax7WOlS qwXH;VbmtnY=Zr9O6W@cWk2s=w&cUqB_Bo;c&$I=9) z7LItQ^$Vw4MV)@={|^iIWO6?rF)D4XSX6gEU)kNvH@!ZQ&rqxB{4amqHM{ca*HnT+ zx@cFI$JvDu(#GU*alr4{RAohR)Mgiw7h8r7Du*0jW_4tbErkkwX^{$n2}LT*>tUXU zr9AA)BWphHvT*gci%i@uI+z%3Z?CEVRoCv$2-z&iq#1F0>@N-@UT1h9CrH^2h1tfr z$ePNql1r%!_vikPR~e?{b6a1h5KOBKi)dE@7rBTUkW)x^qB7*PQMXiv(&xpKM3<}v zFPh+o3tki#6;#E{?4~!I=N@E;dxr?OwnvdHShn@y8nWtM3pP05c2yheH&u#b;y8*t zkFkaOAY_OP^5I8hfJGBB0dmoeKLdZR!WX$2(iWj942MMS@lozDD2~U?F{e3RnK12U z;`U~jnN3mAkx s)pUs94BOYjCP4*%OBZdDCz6rLD(8UCvna3(bxFy z;cBoNFeCiF_M_Q*EPP%vOwoG#esfHqI3hd6rw}KI>EycOqCB}F_Ga $0T0nk zoKX7wXXUSqvQKZ|AB+Z9#cQ?GqN{dYueL_bx(>dZd!+T0i%9;HJ|$(cwZDagNz$~g zCE6PuK<;kX1}kVW(O1J}ZPb;UNf5WvJ>sXFROD;Yo23nM+c+KJ{8!urpr5h{82H@0 z6Tn*XlAi(f0e>y1PqQL6F;P{2Hk!VON!gIYcSROo^&0}^poa~myoJ^G0_035_Y)Y} zn1&&R++kw>Q(;J=m|#eqAU=&`EygD&ED2KVlgoto-JxEF&o`Hz4C3kMPRMg8&hlpX zcXr@(fLo^zK3&!Bx+^mVamk9SS8G(vK}!*rg|fIjHQ)k;ZW-YlLrYff_=-6RUP*Rv zx9^gh4EQAN9OA}!3m`k{!W|(&9I1voa+nOZa8(D Frdj+Tv>WpFxlj_e9{m~)^T&9xrOP}%GZ!%Mv?l?%+ zz5EQY4(HbqIb!^~JSP~EylL2m^X?`T-P&}wiO9UcP!JRpZT^#Frj_{&nL+7zpCmJ& zjL>?7jJ!C;NS$GX!ci4^C_^Gf5vK-}nN2bW^FURjz%CwPX?^D$fdnc|K7s1}sv8Yf%NoaMYi$Lu 0!_ zg)fUaP1JD8fdb9wLz4vTq 3!d1-gI=UGYLilY#K>w!4et>7V7UMsV+v)`Ror4)D#V2G7o9G2A&i zT}TY;QtVeCUp*{a1X#<-v8;m-@QV2qD&$icE()V3@g8F2x &3=hA7T z?P?Up) ;i^@62%3}Wf1CRo;hYD3Yllvd**