From 903ab1fb5969c39c0bcdb8656916bceded68f192 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 28 Dec 2020 22:02:39 +0100 Subject: [PATCH] implement FillImage command and sRGB support FillImage is like Fill, except that it takes its color from one or more image atlases. kernel4 uses a single image for non-Vulkan hosts, and the dynamic sized array of image descriptors on Vulkan. A previous version of this commit used textures. I think images are a better choice for piet-gpu, for several reasons: - Texture sampling, in particular textureGrad, is slow on lower spec devices such as Google Pixel. Texture sampling is particularly slow and difficult to implement for CPU fallbacks. - Texture sampling need more parameters, in particular the full u,v transformation matrix, leading to a large increase in the command size. Since all commands use the same size, that memory penalty is paid by all scenes, not just scenes with textures. - It is unlikely that piet-gpu will support every kind of fill for every client, because each kind must be added to kernel4. With FillImage, a client will prepare the image(s) in separate shader stages, sampling and applying transformations and special effects as needed. Textures that align with the output pixel grid can be used directly, without pre-processing. Note that the pre-processing step can run concurrently with the piet-gpu pipeline; Only the last stage, kernel4, needs the images. Pre-processing most likely uses fixed function vertex/fragment programs, which on some GPUs may run in parallel with piet-gpu's compute programs. While here, fix a few validation errors: - Explicitly enable EXT_descriptor_indexing, KHR_maintenance3, KHR_get_physical_device_properties2. - Specify a vkDescriptorSetVariableDescriptorCountAllocateInfo for vkAllocateDescriptorSets. Otherwise, variable image2D arrays won't work (but sampler2D arrays do, at least on my setup). Updates #38 Signed-off-by: Elias Naur --- piet-gpu-hal/src/hub.rs | 4 +- piet-gpu-hal/src/lib.rs | 2 +- piet-gpu-hal/src/vulkan.rs | 30 +++++---- piet-gpu-types/src/annotated.rs | 6 ++ piet-gpu-types/src/ptcl.rs | 13 ++++ piet-gpu-types/src/scene.rs | 5 ++ piet-gpu/shader/annotated.h | 55 ++++++++++++++++- piet-gpu/shader/backdrop.comp | 1 + piet-gpu/shader/backdrop.spv | Bin 11088 -> 11096 bytes piet-gpu/shader/binning.comp | 1 + piet-gpu/shader/binning.spv | Bin 15768 -> 15776 bytes piet-gpu/shader/coarse.comp | 23 +++++++ piet-gpu/shader/coarse.spv | Bin 52300 -> 61444 bytes piet-gpu/shader/elements.comp | 10 +++ piet-gpu/shader/elements.spv | Bin 64920 -> 69988 bytes piet-gpu/shader/kernel4.comp | 83 ++++++++++++++++++++++--- piet-gpu/shader/kernel4.spv | Bin 36920 -> 46312 bytes piet-gpu/shader/ptcl.h | 104 +++++++++++++++++++++++++++++--- piet-gpu/shader/scene.h | 30 +++++++++ piet-gpu/shader/setup.h | 2 + piet-gpu/shader/tile_alloc.comp | 1 + piet-gpu/shader/tile_alloc.spv | Bin 14716 -> 14740 bytes piet-gpu/src/lib.rs | 17 +++--- 23 files changed, 345 insertions(+), 42 deletions(-) diff --git a/piet-gpu-hal/src/hub.rs b/piet-gpu-hal/src/hub.rs index 53eb0c5..a52040f 100644 --- a/piet-gpu-hal/src/hub.rs +++ b/piet-gpu-hal/src/hub.rs @@ -360,9 +360,9 @@ impl DescriptorSetBuilder { self } - pub fn add_textures<'a>(mut self, images: impl IntoRefs<'a, Image>, sampler: &Sampler) -> Self { + pub fn add_textures<'a>(mut self, images: impl IntoRefs<'a, Image>) -> Self { let vk_images = images.into_refs().map(|i| i.vk_image()).collect::>(); - self.0.add_textures(&vk_images, sampler); + self.0.add_textures(&vk_images); self } diff --git a/piet-gpu-hal/src/lib.rs b/piet-gpu-hal/src/lib.rs index 5d01351..2848774 100644 --- a/piet-gpu-hal/src/lib.rs +++ b/piet-gpu-hal/src/lib.rs @@ -247,6 +247,6 @@ pub trait DescriptorSetBuilder { /// /// The same sampler is used for all textures, which is not very sophisticated; /// we should have a way to vary the sampler. - fn add_textures(&mut self, images: &[&D::Image], sampler: &D::Sampler); + fn add_textures(&mut self, images: &[&D::Image]); unsafe fn build(self, device: &D, pipeline: &D::Pipeline) -> Result; } diff --git a/piet-gpu-hal/src/vulkan.rs b/piet-gpu-hal/src/vulkan.rs index aa7972d..19b8dbe 100644 --- a/piet-gpu-hal/src/vulkan.rs +++ b/piet-gpu-hal/src/vulkan.rs @@ -209,6 +209,7 @@ impl VkInstance { for extension in surface_extensions { exts.push(extension.as_ptr()); } + exts.push(vk::KhrGetPhysicalDeviceProperties2Fn::name().as_ptr()); let instance = entry.create_instance( &vk::InstanceCreateInfo::builder() @@ -280,15 +281,16 @@ impl VkInstance { // support for descriptor indexing (maybe should be optional for compatibility) let descriptor_indexing = vk::PhysicalDeviceDescriptorIndexingFeatures::builder() + .shader_storage_image_array_non_uniform_indexing(true) .descriptor_binding_variable_descriptor_count(true) .runtime_descriptor_array(true); - let extensions = match surface { + let mut extensions = match surface { Some(_) => vec![khr::Swapchain::name().as_ptr()], None => vec![], }; - //extensions.push(vk::KhrMaintenance3Fn::name().as_ptr()); - //extensions.push(vk::ExtDescriptorIndexingFn::name().as_ptr()); + extensions.push(vk::ExtDescriptorIndexingFn::name().as_ptr()); + extensions.push(vk::KhrMaintenance3Fn::name().as_ptr()); let create_info = vk::DeviceCreateInfo::builder() .queue_create_infos(&queue_create_infos) .enabled_extension_names(&extensions) @@ -463,8 +465,7 @@ impl crate::Device for VkDevice { // want to add sampling for images and so on. let usage = vk::ImageUsageFlags::STORAGE | vk::ImageUsageFlags::TRANSFER_SRC - | vk::ImageUsageFlags::TRANSFER_DST - | vk::ImageUsageFlags::SAMPLED; + | vk::ImageUsageFlags::TRANSFER_DST; let image = device.create_image( &vk::ImageCreateInfo::builder() .image_type(vk::ImageType::TYPE_2D) @@ -994,8 +995,7 @@ impl crate::PipelineBuilder for PipelineBuilder { self.bindings.push( vk::DescriptorSetLayoutBinding::builder() .binding(start) - // TODO: we do want these to be sampled images - .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .descriptor_type(vk::DescriptorType::STORAGE_IMAGE) .descriptor_count(max_textures) .stage_flags(vk::ShaderStageFlags::COMPUTE) .build(), @@ -1068,9 +1068,8 @@ impl crate::DescriptorSetBuilder for DescriptorSetBuilder { self.images.extend(images.iter().map(|i| i.image_view)); } - fn add_textures(&mut self, images: &[&Image], sampler: &vk::Sampler) { + fn add_textures(&mut self, images: &[&Image]) { self.textures.extend(images.iter().map(|i| i.image_view)); - self.sampler = *sampler; } unsafe fn build(self, device: &VkDevice, pipeline: &Pipeline) -> Result { @@ -1095,7 +1094,7 @@ impl crate::DescriptorSetBuilder for DescriptorSetBuilder { if pipeline.max_textures > 0 { descriptor_pool_sizes.push( vk::DescriptorPoolSize::builder() - .ty(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .ty(vk::DescriptorType::STORAGE_IMAGE) .descriptor_count(pipeline.max_textures) .build(), ); @@ -1107,11 +1106,16 @@ impl crate::DescriptorSetBuilder for DescriptorSetBuilder { None, )?; let descriptor_set_layouts = [pipeline.descriptor_set_layout]; + + let counts = &[pipeline.max_textures]; + let variable_info = vk::DescriptorSetVariableDescriptorCountAllocateInfo::builder() + .descriptor_counts(counts); let descriptor_sets = device .allocate_descriptor_sets( &vk::DescriptorSetAllocateInfo::builder() .descriptor_pool(descriptor_pool) - .set_layouts(&descriptor_set_layouts), + .set_layouts(&descriptor_set_layouts) + .push_next(&mut variable_info.build()), ) .unwrap(); let mut binding = 0; @@ -1156,7 +1160,7 @@ impl crate::DescriptorSetBuilder for DescriptorSetBuilder { vk::DescriptorImageInfo::builder() .sampler(self.sampler) .image_view(*texture) - .image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL) + .image_layout(vk::ImageLayout::GENERAL) .build() }) .collect::>(); @@ -1164,7 +1168,7 @@ impl crate::DescriptorSetBuilder for DescriptorSetBuilder { &[vk::WriteDescriptorSet::builder() .dst_set(descriptor_sets[0]) .dst_binding(binding) - .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .descriptor_type(vk::DescriptorType::STORAGE_IMAGE) .image_info(&infos) .build()], &[], diff --git a/piet-gpu-types/src/annotated.rs b/piet-gpu-types/src/annotated.rs index 304726c..2460992 100644 --- a/piet-gpu-types/src/annotated.rs +++ b/piet-gpu-types/src/annotated.rs @@ -9,6 +9,11 @@ piet_gpu! { bbox: [f32; 4], rgba_color: u32, } + struct AnnoFillImage { + bbox: [f32; 4], + index: u32, + offset: [i16; 2], + } struct AnnoStroke { bbox: [f32; 4], rgba_color: u32, @@ -23,6 +28,7 @@ piet_gpu! { Nop, Stroke(AnnoStroke), Fill(AnnoFill), + FillImage(AnnoFillImage), BeginClip(AnnoClip), EndClip(AnnoClip), } diff --git a/piet-gpu-types/src/ptcl.rs b/piet-gpu-types/src/ptcl.rs index a266eb5..b35b9bf 100644 --- a/piet-gpu-types/src/ptcl.rs +++ b/piet-gpu-types/src/ptcl.rs @@ -16,6 +16,13 @@ piet_gpu! { backdrop: i32, rgba_color: u32, } + struct CmdFillImage { + // As above, really Ref + tile_ref: u32, + backdrop: i32, + index: u32, + offset: [i16; 2], + } struct CmdBeginClip { tile_ref: u32, backdrop: i32, @@ -32,17 +39,23 @@ piet_gpu! { struct CmdSolid { rgba_color: u32, } + struct CmdSolidImage { + index: u32, + offset: [i16; 2], + } struct CmdJump { new_ref: u32, } enum Cmd { End, Fill(CmdFill), + FillImage(CmdFillImage), BeginClip(CmdBeginClip), BeginSolidClip(CmdBeginSolidClip), EndClip(CmdEndClip), Stroke(CmdStroke), Solid(CmdSolid), + SolidImage(CmdSolidImage), Jump(CmdJump), } } diff --git a/piet-gpu-types/src/scene.rs b/piet-gpu-types/src/scene.rs index e0adf4e..935ea4b 100644 --- a/piet-gpu-types/src/scene.rs +++ b/piet-gpu-types/src/scene.rs @@ -25,6 +25,10 @@ piet_gpu! { struct Fill { rgba_color: u32, } + struct FillImage { + index: u32, + offset: [i16; 2], + } struct Stroke { rgba_color: u32, } @@ -58,6 +62,7 @@ piet_gpu! { Transform(Transform), BeginClip(Clip), EndClip(Clip), + FillImage(FillImage), } } } diff --git a/piet-gpu/shader/annotated.h b/piet-gpu/shader/annotated.h index 291496f..40ded79 100644 --- a/piet-gpu/shader/annotated.h +++ b/piet-gpu/shader/annotated.h @@ -6,6 +6,10 @@ struct AnnoFillRef { uint offset; }; +struct AnnoFillImageRef { + uint offset; +}; + struct AnnoStrokeRef { uint offset; }; @@ -29,6 +33,18 @@ AnnoFillRef AnnoFill_index(AnnoFillRef ref, uint index) { return AnnoFillRef(ref.offset + index * AnnoFill_size); } +struct AnnoFillImage { + vec4 bbox; + uint index; + ivec2 offset; +}; + +#define AnnoFillImage_size 24 + +AnnoFillImageRef AnnoFillImage_index(AnnoFillImageRef ref, uint index) { + return AnnoFillImageRef(ref.offset + index * AnnoFillImage_size); +} + struct AnnoStroke { vec4 bbox; uint rgba_color; @@ -54,8 +70,9 @@ AnnoClipRef AnnoClip_index(AnnoClipRef ref, uint index) { #define Annotated_Nop 0 #define Annotated_Stroke 1 #define Annotated_Fill 2 -#define Annotated_BeginClip 3 -#define Annotated_EndClip 4 +#define Annotated_FillImage 3 +#define Annotated_BeginClip 4 +#define Annotated_EndClip 5 #define Annotated_size 28 AnnotatedRef Annotated_index(AnnotatedRef ref, uint index) { @@ -84,6 +101,31 @@ void AnnoFill_write(Alloc a, AnnoFillRef ref, AnnoFill s) { write_mem(a, ix + 4, s.rgba_color); } +AnnoFillImage AnnoFillImage_read(Alloc a, AnnoFillImageRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + uint raw4 = read_mem(a, ix + 4); + uint raw5 = read_mem(a, ix + 5); + AnnoFillImage s; + s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.index = raw4; + s.offset = ivec2(int(raw5 << 16) >> 16, int(raw5) >> 16); + return s; +} + +void AnnoFillImage_write(Alloc a, AnnoFillImageRef ref, AnnoFillImage s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.bbox.x)); + write_mem(a, ix + 1, floatBitsToUint(s.bbox.y)); + write_mem(a, ix + 2, floatBitsToUint(s.bbox.z)); + write_mem(a, ix + 3, floatBitsToUint(s.bbox.w)); + write_mem(a, ix + 4, s.index); + write_mem(a, ix + 5, (uint(s.offset.x) & 0xffff) | (uint(s.offset.y) << 16)); +} + AnnoStroke AnnoStroke_read(Alloc a, AnnoStrokeRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); @@ -140,6 +182,10 @@ AnnoFill Annotated_Fill_read(Alloc a, AnnotatedRef ref) { return AnnoFill_read(a, AnnoFillRef(ref.offset + 4)); } +AnnoFillImage Annotated_FillImage_read(Alloc a, AnnotatedRef ref) { + return AnnoFillImage_read(a, AnnoFillImageRef(ref.offset + 4)); +} + AnnoClip Annotated_BeginClip_read(Alloc a, AnnotatedRef ref) { return AnnoClip_read(a, AnnoClipRef(ref.offset + 4)); } @@ -162,6 +208,11 @@ void Annotated_Fill_write(Alloc a, AnnotatedRef ref, AnnoFill s) { AnnoFill_write(a, AnnoFillRef(ref.offset + 4), s); } +void Annotated_FillImage_write(Alloc a, AnnotatedRef ref, AnnoFillImage s) { + write_mem(a, ref.offset >> 2, Annotated_FillImage); + AnnoFillImage_write(a, AnnoFillImageRef(ref.offset + 4), s); +} + void Annotated_BeginClip_write(Alloc a, AnnotatedRef ref, AnnoClip s) { write_mem(a, ref.offset >> 2, Annotated_BeginClip); AnnoClip_write(a, AnnoClipRef(ref.offset + 4), s); diff --git a/piet-gpu/shader/backdrop.comp b/piet-gpu/shader/backdrop.comp index 85e54e8..49de925 100644 --- a/piet-gpu/shader/backdrop.comp +++ b/piet-gpu/shader/backdrop.comp @@ -49,6 +49,7 @@ void main() { uint tag = Annotated_tag(conf.anno_alloc, ref); switch (tag) { case Annotated_Fill: + case Annotated_FillImage: case Annotated_BeginClip: PathRef path_ref = PathRef(conf.tile_alloc.offset + element_ix * Path_size); Path path = Path_read(conf.tile_alloc, path_ref); diff --git a/piet-gpu/shader/backdrop.spv b/piet-gpu/shader/backdrop.spv index 48fcb48a01da2d8cc342d45f4b04b41e2ce931d3..f33a50b085ee8ea36b0bf768ed16bd3ae564f6d5 100644 GIT binary patch delta 40 mcmcZ*b|Y-VBVlPyhEog-3}=9t35ZVvF*B5A+5A;FS{wl6W(j}* delta 32 jcmcZ+b|GxTBVl27hEog-3}=9t35ZVvG4tlX!qMUYr+5gj diff --git a/piet-gpu/shader/binning.comp b/piet-gpu/shader/binning.comp index 8ad72c7..3a63ac2 100644 --- a/piet-gpu/shader/binning.comp +++ b/piet-gpu/shader/binning.comp @@ -61,6 +61,7 @@ void main() { int x0 = 0, y0 = 0, x1 = 0, y1 = 0; switch (tag) { case Annotated_Fill: + case Annotated_FillImage: case Annotated_Stroke: case Annotated_BeginClip: case Annotated_EndClip: diff --git a/piet-gpu/shader/binning.spv b/piet-gpu/shader/binning.spv index be8662d160948c341821178d72acf015a71001cf..6fb185de18875f356692640e1ede619bcc3f76f3 100644 GIT binary patch delta 56 tcmbPHy`Xx-FDY$a22Vx?25%r{VqjqK0@BP-8ps6mS)erQW?AWKB>)y|2ZR6s delta 48 qcmZ2bJ)?TVFDYei22Vx?25%r{VqjqK0@6SPrkSBM%Vt&SY9#>VdIvH9 diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 3f4e460..069367f 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -203,6 +203,7 @@ void main() { uint tile_count; switch (tag) { case Annotated_Fill: + case Annotated_FillImage: case Annotated_Stroke: case Annotated_BeginClip: case Annotated_EndClip: @@ -326,6 +327,28 @@ void main() { } cmd_ref.offset += Cmd_size; break; + case Annotated_FillImage: + tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + + (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); + AnnoFillImage fill_img = Annotated_FillImage_read(conf.anno_alloc, ref); + if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { + break; + } + if (tile.tile.offset != 0) { + CmdFillImage cmd_fill_img; + cmd_fill_img.tile_ref = tile.tile.offset; + cmd_fill_img.backdrop = tile.backdrop; + cmd_fill_img.index = fill_img.index; + cmd_fill_img.offset = fill_img.offset; + Cmd_FillImage_write(cmd_alloc, cmd_ref, cmd_fill_img); + } else { + CmdSolidImage cmd_solid_img; + cmd_solid_img.index = fill_img.index; + cmd_solid_img.offset = fill_img.offset; + Cmd_SolidImage_write(cmd_alloc, cmd_ref, cmd_solid_img); + } + cmd_ref.offset += Cmd_size; + break; case Annotated_BeginClip: tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); diff --git a/piet-gpu/shader/coarse.spv b/piet-gpu/shader/coarse.spv index 23eb96295eaa1b2ecb42c21a75a0af2a600e3e27..7d0dcce2473e9f1fe5692d82b252cd8ff5f514b6 100644 GIT binary patch literal 61444 zcmbWA1)wFxwY3}Wy)(GGySux?;F>_tVVD`1fe|t@XmEE4Zo!>k0fM_b2?TeC;1&Xe z|NGAAb#L7c@8$hD?{#XewRi2>wX3>MpVMb99b?blx2ndf#;eAuRvEWyy(X>3Myaat zt3Iu^-};-aztHG0gBDt1$whRSsOo6>=`(TFx9Xzp>!GpwgiWk1_}OIE=CCuwf$y()J-sxv!Bs?l^kzmGwPubLe^YVd$T|6^F} z#+;S5%x^Y$ncuwd(Zhxg{LlGyRC5`N!?<(ziql!mW1Q|a>Z<04uR3DH$hC$J8@B1- z9b0Rm=BsD?u4-X;{It1dYQA>ZVdS2+efU2$*KyQNI}GSQaOAL&qs(KHYH_sm?{7i= zeXX*1J=wID(Ec6OqV#XisiRuV_~h#TT(XF}&hP;{4R#W|%uk!Io_X}CmW3yemOory zbzePmX=~19=!ijsonZVtH+y1EUabi474!c#!K7QyvOP~vuFP`%+~X<=cPEfSvx=y_AUU zB-~5u(my$@2X5yuS+z;8xb5u!^DO^8{zgUojf?o3_loZs_x~Hcy+?jk#Q$}7{K>1W z|1ExNi~WBOVvV*e#@MQRj6T)2;MInXSZBoOF#|>nY;Q#Op}Mc0b(*N!0bcm_Z=FY3 ztHQu?w-(1MtYdFazxJARw$>@`TQ2#o=;b`8`xYo8@!Y0wsKMP zRpz@pTt9X5mHRR`Th~O*e0LZyaF;=&Mml6G=e=p|`@iR`2PqUed;Lw$dx6_I_o?;) zuReTG_oW8f%1PZGsPMn>zDeaK}aK*|+!LfyB@J4|04`b#ERFZtsV#>acbW zc`I+#LCsfB9XhKc;N+lRs|Ipk%^Ij%gK`b6f%?DKV5;gk^g8Z;u0Wk-YmzZ+!#Ec8LF$`|K|UHoN$@bFU`8!&IKa#zTELStictunfI08tohYoa$0jl zF=6vp_ti7suIgHNk8gXPYQB2rIdydtyvOf9Pq1h3#>{F%J*Cz>{^VF3&gll)%;`pO zdrn=|&0xlFm4r>wS`Rf}<$P|1$4{I4SIt-N>-dz_-DvUs&oj!oy)qr4R2kFT60$O)su5)^(35}^=tXa zefj-FJMNU#v+&yIKhLNhu`w6b_TmxCIXpv~Is65jIs6seo(?4OFU|J6PA6jj$)?LF8k+J7~) zHvsLk%rVC%UiMoDIQy*=+}`)oRO5r)_pLGi>y6*j+j*DwZ{rYu0CO~-aly%9Ja9XQ zDXK}q=HP|uznOM%3;Fwe}pls+ns(Z0PWzenD+LW^>FM&j%h=_gxs=b3N~@7KLvx zc=*Usd?59nLhg%iqWi}$x+e9(qel6aXzM*fe?LEFX z2H(8Ff79Rt8+>pt-cb#M?_S5=qnE9-+Orq$sP=`ozgOw34g`-Hu*V{FZRK@HFW=7U zum(S(?Z0UJk8aqHZSdpU{)@%`q=x;J20yLszj*x5YS_BYGQz}t1}tk&&i>#Wvq@Lx6f<_*4GgKyv9LmGVNUc95)9iDaD8(gm2zP)@qtNnZN zj_M$I*8d1_;v54m;~d|sUuSh#mUc96F8lK$#*~`{h{n+3?HFzJs3@gv=aTwl*Wl+g__+;!UN6oy0iOC?*2~seUD4oIHu&`oenW%b*xf_!14ie1osp;43xw8V$ZygZFFj4I6yp2H&K?w`lM!8+@wNb|<5^J~$KC z?{4M3^4Za`PC;9Jr;HgoX6VSacU!*--I~@Gmk$5V>QCrn zhUEK=aazCUBkuYm2M!pv&WPP<3}kfuyQ)9qZyv3B?%CFED>c4DFz#K(^;vYwr?a{* zyk+lGJtQA8baXqAvuels3wrarj=!Om_g=3w_^S>6dL1L*jl5m+p6^Dwst?q7X4rqw z;9dR2g0=fF+TMdljjRpoA4MO@Zxx3R7`;m?*Usu=^ihLSyUyzG@I6L__o+UCTXBBs z=>N7RX$?QMA3q)2t1Y2$Z;CdwuEEdX(L*@H#ta{@D=TF^r(m-V9J$+w_IEq{&JJF0 zhn9UIcv+*x8+<8vc|I=Nu&>mM_pMfglS3>0o-?$a%UZpBJFB&O@s4VJczZ5=sx6B+ zJ^AyQN}qaf9N+HWs*trfp}T))b-K1uBX<~F*XCw;dCpqT+x6#%Jo(*&^}4&(=+>&w zJ@B$V_ci!~4gPR1-c>ycrykvO=5Vy|9 zj%t4Jo_rJLycPoQRpUj~`6Q^mta=Oc+d6RK_x!f5t6ICz+wr=p4GOItx2xI|t#y5< zH-&TF25pA{qnSZ_4nvB5J$hF)482vW))%V!c2;|}w4VCx)8P9x_yN6mpXxAp=2Py| zqtM%Xxo>qTcnrVR8`dss+*-A{Lce-H-vBPZGrqAqMrU;gxMx3iR8PX&d!(a!9^Bqf zoz)Ba72lb@+Td@%M-TpO>k8uhKZW5H~_D?X&4DM5n%bQq!Rc-y-wdOa^ z=p~;3UXDLQgU{HDcU23(nRDx>y@|OxR;!}5FLdqvwrlli z|Nf1-)bs1A1{ZqjJQ}UcanA-n3|`LZ@P_@g20y*Q&xG&jkBeHh>#WXd*w1V53mg36 z2EViy@2YNs`(9U$ad$5tzI$!(`y2eR27jW#pK9>u8~ptS|DYG|sy>37U;m-QcS;>T z?&Z^2ecs?-HTX9T{#`H5of0=ssY5x=FYS7eH>N?a*xf{%dfMV zqrvBD@P!(Dr3PQQ!MAPj{tZ5$7w=Q;3U|Ic_`{|C-i5TUVSDuQNDZ#yu`CoOXnkx&lE(N2tE`2Ca!JrS>e`IO<&_$Q?dPxH6^XS(Pw28=V4ya z^w)P5T62i5@0@UBMbp=O=cjGYsk2%Dtgbc{wgqWt;h36y7NV6?vR3~7I~ldimD|SF zznw9@ag6N)qr_ecY-}~_xHRo79Aj}9e;Hae=Q9&?Se7>NwK=clXw@CVc#g3$ZN^vy z>=iCZ`$OJp^tWdv!8gofQ_eSO}&B9)?TxY)^GXc?!OVV z+I==}?2)u;#x{<7a15>S^l_}+Xw%>4?sC`6{(I1>+24Np??ap1_5~YD&9&LDwz)3x z*&nQrHuvlSwAtVG*KXXyXw&C#uzl2wdqizBulO7Z)<>IhkD^Un`)fDu3AE{RBG^7^ zGok*zwk586(i)vatDkmbpG=$B#?Wr;Giek1EU1C|=EY$9sA;=|*4i5HQd(_l#=DF*@$9GFK3CHw-ZfzRsA;>FHu0{jZED85o;LC9 zr`B!cROw3*-yKD?xjt<`@qIivxfKAwyetowO!qq57H*4 zeYG3&aoWUu0&Gk*ZBG`qr)ry;@t&qlJo{<4&);Yh?|HEC)I3LCpiLib#(A}&xfj*n zZs_hK^$#1mdqMrPhJI2ZV~y22M{BR%x1n1<^$8ogb#She*Shof zn&5lfG-%_1)$BV1e4^T(TFsB2=fUjQe7S$;1>0w0j@ai%(`7ztZj1#W`YuSTuiA{* za$n}P!TT!L#zS5I#b{jZs+^Q+V1;|`9D;1-zVgc)!g?H`BOEw zhRJs+ic!{M3W`y##oTan&iKp0-DBY!z{f542slG^+m8g#gXFpEy|l4s;?CFmU~ze9 z|E0se-iO-9d7MVeR9c#QO76X=TJkyz?mGBBeLmQ6oTvRSfR6=Mx4+zbS2gVy)!06X zcMX~j@xP(=(QZBe3fJHM&x6gyxy%6nv9=jQ{u8a5wbcJ#wETZdH@@8Os@1fQ&4v>v zAIF;w&3$ORRRFGu@%3M|_E$Ha-0z(eZ`~T(NB`f{+?@26`~9;1ng6zMe|wtw?h9ud zcJnjg2f)+c?{(APd_T2+?e9FkgwIg$aS$hfr@!B`+CSXyMN97Yp(Xdb(31NdXUY8@ zQl9xN#HOC5;ETa$F8DKWudDidejaS{yuuG@@dH*~0K4zgcfi$R|FG?ky-#bO`Ps+y z@!ICG6szYRF(+T{&3~X!me!m-=X@?`YYlAAZE&ASm3E&+mE31gCHEOq$$h?5^1B-R zz6ST%Qv9ur&y-5;^Q3TFpC^^v=SktuV}HHi>Tfr=&ywPA>vN=%`~0ZnJ~t}4&y7m% zbEA^`yr|?~H@MG+O8cw@cm6&bD(yZSD!I>w!u9vrP`ItnhDz@9pOX9hr{q5WDY?&j zO78QXlKZ@;ZG2)@ME8zIXbpC*1x%>k0QWn9q8`ZGF}g?t7)rbV}}X zos#=(r{q50DY?&hO73%>a9f|%l-%bu;pXe}m~dO4#gyD3kxx0KxHEhYDvOStRdGna5%pSy&ckI!Dh_4nCJxa}Ja{!WAYET;7LSxm`& z9uw|;s?TJ?y*Kh%Ot`JjV#3YOXEEVp;6959xAj>}$$bt}@>Lq#XE3GRXD}uA*-N-28p+5^n2rmvH<0+$G%neeM$Oy{*q(!u9vLOSt2mS8(kyM){S?tw}d-?pSOf-_jyaW`S`pg+}7tU;eLMfc}uwcea;eYf1k62>+f@x@CV>N zX9>6eYz4Rf90k|k=PU8I_4!J;{e8X?J_hddm2mAoUkNw9&sV~2eZCUz=U|_&gxlZe zD&h9`xk|YHK356%vyRVI!tL*Km2ms}TqXQcxX)F>_4m0-xc)v@3AgpRO1S<$R|(hu z?t=R{{oaD>=W~_#+u!FZ;bY)FR|)sCoX=Il_4m0-_}cKd3hw8BpR2^Kzt2>{&Ch2l z;kG_g3D@6eD&hM3OeNg-K2r(T-)Ab}`uj{pzAAT_e(pY&`yD@v`&oZQ?lHN1R>z^K zUx|;O@s9_q`5F8>?ov+#`}!yT+D_n5^WIhbQ#Do#tF1~z$2kM+=QF=^@bh`bIulLX z0gUC?XM@%J>~>JCodZ_)p82p^`vY8Ezm>?z`((AmJrAtrJpC+pF^8Y;j1iwpYW#lALKU1hB z#_ix{t?xinPmDXk#!xrLZM15MaW}Y`_dRIpN7n0gFIX*mz|SsfiE%%;8RG#o_3Wbu z!D@+dA6PBx@-W!k!XE+alXZF&tdDxu_%U$SxZLZHqiahIo&eilJ@KCeThGLQ3ap=c ze4Yk7*Z4dG)=%A9`Wa0v{?CHdGVXI=wGkZV>~|F}a3tryg6(@U?TfW-le*?F)tcwO zb@p2FGMbcMbrFG0@>BVKNdJQ};t$p>=uAiSNwI%)=V72mmc@wU_ zF?ssk?^|Fs`}>(vp8oHE)yn?w!qrp5_rPlAm-Fp?u=>vx`?gY~nY*nGaGbu9aQ zQ`>Bf`JJ32F~6_vw%ITL1RLX8*4OL*4`8+BY>6TNmZKGmF~sRhmsa2KvEW`~+-H7= z)xq&ITt98*tCoDt&AHenMkjXj$y#;6)qKy&eAUYNnwz{2y76qC|2VYca`@8Tx3=46 zyz#)UOZfP3*YAqD9uvUzQIF4rV6XMz6Tz>7r-l>5^-;gHjx!0^SlWDFos8C(HP$vM zhno3|6MJ&7`8jv@l3eU}71l9+Q^Ku%a+nIPb`6^2O#{w&+NS1Eb3Ae4ObagOHXYo! zS&!-A`lzSR4B&G9Gs5*#x9%Co_8YDT?z5S|=HXoRHwW{ag*JKWGc$*pd5Tx1zxNok zgL4h@yV3G|pF_@ZFSYkRV@|MId3~M>Ue0rFcsb8`;QFZNS~@RS-I`|Z^TE$8>N7uF zKlSum0Icq_iPUjHxOr)FJ!hp=%Qbpoa5+E6^BTPfy0%=S7X_>N$~AB?xZhP-6JyKu zOU_Gx9Z#FzVab=JQr2oo@a(kq*OtAep8iXN?Vq_U16K21CHXH0|E2twN7t78R{*Q| zO8zUt{q8LJ%k?uCze97p-18^vvnE*0XG8Jn2RDxK z)}ob**QV9q@qJ%g2kiIQ`e<_w>(Z{r;dk(kZ9lobo)6j2w%XRG%{6fYuzTIsYuHA# z8*})w?H8~idENLmTrJm)Ex^9KPHEemL(Mqi z#Mug5)_7~UHMSnU7i`0^C5L{_S+0+BN<7;)7{~L(V_SIQZwD^(>ou(7mx9vw%UHPv=3hnn*f zo9pqkUMs~X)Yv+lSo_&}-8_l*WDZ~2PpR#;$@x^UF_PnHV6|K~<-g}JmN|&i_YAPP zgr5aA)_wJL5WW?D$y+xwVb2t=ziX*EW4G16!ZW z{c^Bct_RxG%C)ra>3;>-dS69-y#`+iR&y^nhpWN9oP)MMa{P(IJj97}4cIuT;k973 zvWC~et)aH`yB@6W+^?dQo2%nGhGWI|2C&zd_{vLP`^5J~u<^og0=wqP@6TX0{fwtg zE&jKFosZX=b!l(qSdBwnAMa6at9AR|43_Kf=lMIpYUTa&op5zOZ*PmwU0^l)-%cwx zwzhl0YTE9hl_$6R!RD*&K3ci=P4;^LyaTO$v?bSvz~*D02WjQvhiUC&|3UP71U!UR zA8q>FO{<>q9|L>c%UmCa>r>A43AlQ$)lY&S<*=_Y<@&gO$I-ghw#{pO#(WB!*WT>& zr{QW|yW{f=+-u_mtbq3ye}S`&TYsltf9;O#HCLNsk4x*=wu$psus-3>!W}z%=Q+4O z>bb`K4XmE`(HFqJJa4o;&!Og6;>3OtT#oe;yu7}@4A)0JeO>|kUKRc-{3>{Ic@3_Q z`X%f~&+FI0#?t1zlZ$OWJH7!nS8Jiad78g^AC7T2%-_~JzDZktR(=a!-V?kHFW2lH zxIXI1{avv0Pwwx*^;7ry^8u|d^U(G_hnjha6Xzpv_T<>$k2&0L>hbw|t(*IYV0k|G zeg@9xs!ze?Uj7`eJ#oGO+drRkz5=U#$&vl}HQ0XIJm32%Ir8`O5kCPx!YS`CKR0&lryTBiQjA_Xk>eKIi=eULPO(Ys9ktiopO&wyf90U^QP^uSwwkh9c`F*U!26TMEZ=eMZn{GVmx`{k7@SNvm!yzSm3v zRx_TT?=sgZ(X_>Hs=}{4Z>L7rmh0OzVEd{&p1G%*6-o8xo+Qa z*w^2}XiwjT!NyD9MZoE+t?auHTzlrb7&!AS_r>Dq+A`lIz-pQAlHjt=OTpDL-=)F! zQBPjWfRmT@GB1C>qdj>o2Tor8jyU5kkFG6wtpHYweMNA&4l8NnNM0+0?W3N&Rskn3 z?PXs6j!1jruLjP(cAZv-o4a=T8erEa$Ju$WdtLHksHQ2c7=D8`YTK3eoVE2@t zdtBqxV>>i$8M{At4vvhoJyPp zKLa~&V6_wfV}9D4(>Anf$z>=wYYD7&=703b+U)`!!l9r2<@%&1!@<_XdX(q?2sCZ+ z8(H|3*W+E$wI$!*g6*rGzN5eyqdb>Kqic)bn8L5T_U?wREo1Bswy%0>w+Gm3h;mfg)ukE%O`vkBtaxZ=&SS{b%$dBPLma)Ze5Zk@wv2Ag`_IqsQ zJWhfe`~Ld9`ed-{q@MHW6tH@}PdOEA9ChzCPp9?eX8~=eaj2P#IP*9IT#kJvyd3*1 zxMQnl?6bk@*@x$Vjia90{{d|6wPmbx!Rq1XfnBd$3(g0t>E{}0Q*#ZHyY2r}#|yBP zbGZ<1jO26?*qrn;zFZ&UyWZBuHu+r)wie0n60n-}$R1L&fA)~;-OMlJUxv-`_bt}` za=5zjE~S-c{42rEN81%(xno^LYp%BL*Q;r-;qayX+S+cLSl5A#5q>?`@v?va1lC90 zJtO}khp`RQuVQ)6KNEa3rT&YrAc7xD9NKyv%|09dX3 z-tIxTYpgAC9s;Z9Tzwd9Y<17oM`?XocWsYws5xhG;yea+{H%lA+Q-*cZr$x`o4${O ztxx9u1XwM5S({q9mexI=8=nH_GhFjC|I^sCXRK$yu1)s+U%-C9pdO#Ug4OdL^(Uf^}G-wW7Zn?BFes%O4$g0Cp}TVQLH?~>mJt9fp@C*A}5 za!+V`m*Zm&*HxUj?}Lq#J^2Axt=y9z!rhbF((fa%y1BkXD|hW3*D)L`w!BZqW}7&F z2irg6e*$){>h^zwRxSRYfz3C2<8v{GdVIbBtK0umT6t_=fy@41!`J3ekIy$?_3&@O z<`MoK*tq#!-#@_msOS9n9&8+K=J6%1T4MYFF7x;iz5$1Ne0~C}hyM#)=J7M!Jo4K> zH=;i3$zv=u<7hLFe}dH#b8N7CEx#4&fUA|iBj{}Sbivi$Vz1>p&pvSbYIFaML+i`^ zr>!r?cpUBxvAOtf9o8d;`$m6l`Xsjr!PZD$|J{RpSs0yK zZ5A|b`3?1~U^UO(%gDp;wP%B?yS{VK`f`2MXXj9J4aJ_H{(Gc3!H(zqgthUr{akSM zj5Rk{&3xPoiDR4Z%jW?*w);bW$8dh`A#LRzaxXcSInN8$$DHS<^<~cL^Kqz|vp8$F zAlN;T^J-zZn*aXNG5t3+YVltbtp7vInWkDCuI9hb%su!LU~8Z)_Y+Hk)s5-D%aJGM zQeejkUm9HQxnPf>g7x)% zz&)Vd8mC^i@@sImezu9V5;otfvZq&utL53hHZ}WSRrkM|wt3%cT~@)*@e_MBxc9V~ z&+2gJmyf}r-rr}r$5--b8X!otmZizp8;TVnSdScb!Z1LC2svaA8k1=2ZFU_JqCe| zr|ulLqg6}X9l>h3C)o+?{i=F=hJe-WKbTe?+fcB1W=R-FL~~z$AHW69m{*^ z-O#n=UV3-1ny=hT?*SjpVa~>u>t~F9`0WMGGqyd!^4v@B4fbBz{@U#C^E36#_jh1_ z1E2F}AGlifTvc1Ix|LzsYg|cyn6&YcsbqY1QrTz3fF`|GkK|3&C=2{yULNz^~V~ zi@|bjELC+G*ni_;ze~Y#|E-GmJ(q)LVXnrrpZ1J*1z6pFjw{c2SAzA|=D6~VcNN$; z+8kG&d&5719n<%pYiNCW{-|Hgq2@jpdky#ekgK~!G}U$dkLzZgJu>d~XxehW_$RPh z&et2kz8p{64IB?~7+;+De+K_j{F~9WWxa0!-^7vimg}S4d)iyU#wqVv<1;Ov`w!E$X!FwO&D z;~MjRTDkki>(ztcH))M$KkcrUHMXACHTgXZZqDHmGm>GvEs{menG zU%7V=gqyo-_X2o34t<}emFJrMBG_xTdi-Ak>+g8pm%j}5nynt6SHSAwuY$`yufe@$ ztHuz!#rhJwHLd-%ncGLS>h|}V{WUoI_$#nno7e1b!P&>(faR(6Kft+We+QQ5 zn*BZ4Yqs(1r#<8S6Rd77jw{c2KY;bu=D6~V_aoRi+8kG&YxYlI$Ml;0Gp#SLq3ZwQ zQ1hG@m-}8l*VM5nhU;dX%X4gObZxn2cYxJ$&F%tcJZ+sE({VVSIPv>}e<}Vr=-RU0 zpKH9xzj|VnRuD9O*kB_Dvp9#Rm$TeH8PsW%K>^?{g&-;nc)Z;TT*ciEH z%k|OzGc}q7Y>fOnF8|Kjq-g5#nG9?U|IV4~Cf6r>VG3~eo`0`Fp1m*?ID5~(-5}TI z-=drbY+PgdcO2xorcMifA0Ok{PrGaGI=LpUP3AZQxLJo8(bVHJ6WG5Ek@b-4lR3@| zZq{KIH1+t*3N}X8L#|KiFgrMPm<=pX9p(h54*m@axwiY6HJ`|^1WpNc>0-xT)*-hJBU4EzV5Mwv26#}*T0t` z&wI-vVBcHRDk2HUj@roi;|-mbq*KRydi)#4g}p+7rXjwdFm3I9M&` z&PZ^^(>8)*KMuzeC;o52zZ8EIy0%<@M}v3e$a{=jpPYkZz|C`TH#GJ5><%_Y-ectY zWDWKNXU+Ej%d-Z1gR|y)f#ur#8_oNGjq4ixj#i%cn0>*Y;A1@dX}8wa$68pEqD^);O8#vEZ+WZGZi=mveQ_SN?91~&+sPbiu7x;pP6e0OoYUa$8}*0j>viaKuzIdR zXMoib<4myEnS76X7F~C#q_CJ*Q z8}DG+^gp-mpYNj2gR7PO)#87C?VsPKTmVst9QB+lSBg2jCRu}wZJYPptH9=KUGz6EbHAE4x$E;s z4mEQZn=4IqE&r4A<{GeEo9`3XgLB?o2bO1!H-Pg#@h7l6?-MtIeV;I%{j_Jio51Ss zAIFtvyg!5W*XFqLjCV8GINBUno;AA#?3m8`Hd zkF2L{Ij=*CbL3HMxgUQ7EYJP;V_@&c)sxfX;PT%33Ap#;>hXCJtRDUpxa{*Z-1~9$ z_&ftv5C04JKGre!)qjQSqaL4U!FS=4`aB2MPd)wq239Zc$DfCrqqf|SzW`RZhA+}O zckxTK+HybsGT8fZeYEN0dz!lM`Tq9mHSjNe*Yi5MwtUy~23XBk_Q9L*S2=PYAlJ`1 z_rvdPaK7t#3oJLcRk6JT-h|fv+RW`0TJ_wIyazU4f15B?agekeZjzk@&IP*1;4z{brrSgv2j{S<6m?OEr~;Og=D9BhnyFCo`Q zf12t`{wL?^7ht(IuUTJ%bFO{`mS>!A!MSFA1D5BS^&Qx2mhtSTJ>&fYtZuy>SDx{{ z2kWoRapf8BpJ3x?b6k0@SwDas(`(jGw7$G%ssG5K<~2)Pp4;ll%RdaCI{b_-PhMk# zQwRT!p@~uxV+Dp46c?v zs!h%Djc0%3r2iCPeZr@Nm(OIUg6pI1dQL;@%k|VYHHVsU#nvEy*UT|vv&|UOf*mvW zHq*h?%AD28oXx$gp|zB+UDwoBzGlt)(Y`^Bzw|r(8HrW?8{L`UYWZD^HnrqCbL}5K z3*3LNoO`WV;rgh@XEt#8@0DkV`|p+0XAZbN>iG;lC)ilpto7WqskOGbIMl4Q*!kvf zxT(v(WDM=L^3Q6nUvirlU;nLJ_)-zOZ@JFK z`stVY%mKGgu6=XD^~w9CT%XKsuG;=D;);`x|IL@lIDGlv%Sb+xg3V!aT66Hf5i=i$ zIpn`buyBJf*WfGE+#LOT+zW9SBi9JI|6LjF?$0GT{Cl+J^?NC}xqQUP?$u>$zx#h1RGPEIm%s2*JdTK>ti2n=4Sm@2Ag~8E7vzMR{=X-_^M#X z$lhNKu8;Z}#B?sJgY)0Q@pG4-dDlQw_x@47mi`?6`|x}=>jzfP@731^8(-c1zAmjV zukYH{;ZSou#aWN_!R30$*Q@QW#|9kv`@o;o_2018Q~&&~%6+sEHsiU+#E$2<)a z?M&;-`l%1)P%~$-`^E1ls&Rqc5@ea9gnayl2flf7M6BjW;`O@)-kG58n;!IJpk(4%bKB z`8bAJ{PzNzi#ErT=i0b8*lVMGv^i(B%-P>)EzaR<5su7x(Hbv6yBLS_T!J?9+?N>T zJP$0m*MUO{uHRt|eni3bKf2)hAKT!^7hM073a4ORN14hO2oV=;Qu86ztmA z-x|xs)>nVm-Rr~QV6PGSXw%0vQqOotg3Ixaf~zfE`#9b);Ed-Q$&Kau=%4Y913R8R z+VpXa)id4+;Bvg*!`1w(kolbq&Umh|+*q!!{u%F7u;b~YO&|A&dd52)T#k1pT%V!sNk7W*H;)-3j`!D_Kz19pzFUkg^- zm@|JN#=8#en8vlQcFza@8+?D_@En<)!`$WiC-x0s=acj2MzH?#bLcPEM}MzTH-WW# z{SxQ;;F)} z^?#(nA1k>2PZnJNryKk)1=s(%g6sc$gTGjC{a-1#{;xIo8wJ<@or3HCUco;Ae^~RZ z*R62t>iT9)Zv(66dUrcmE!R71t``40!D@M*y9=yVUhnRKyO!<=*F-LMJ@n7{av#|9 zMIUYYxTfkE?*VW*-h*(p@_P3$Jma~ha$~uk`e(dH!H%boHhtU^>KX5Ga5>%+aJBM! z_Y^$ixhLetazE&w@ty%Yo<7?2aZjmdyuX6W@t%dNol*OE{rMX>4)42B4p6lyZV9&|fIm}(Ie`0?PwthKZzX9t%KZpKu zed7Nu*!kaI-+TN6to9v;`T4o_d$4-`M!-M8YWgJ34`Ab@&yQfW^!W*_W}l52%isU~ z3v4WH=KC`(m+Mx({lVrd*Uxdh=8sj|eLoQA{a{sWYjXHnjU(>|tJioH+BG6$1k{k6E^t71=oMFg6ls;gHKg({iiLs{?j-3j0M+!mV)a)TZ7M0 zaQ){lxc>7t`1}Ref1!fwzevIT?{Ko~W z<^5nhu-YH#+w9OjyEY>ZRujX$>AB# zHI*C7_0&J(O$l~9eYEN0o>0$tQ-jO#rh%)SSd2FvJma}1J8=%4Xs06U&O+VpWx zsb{>Iz~y)|!`03x#+wzM@!V5#W4WL7&v>(g9Zw%^`nV_6Gv1uwa=f|VYUTUEJn)R? zo|GHQ{iuJ&n-A=G`e@T<4qEk$w*a^tZ$Y?P`F^l4Jma~i<;HS9>!0x!1v{QT+Vt_9 zP|tWvfZap6UM~q&i+w4uYaaX3V71tn0lP-AFAG+SeL1i-jeU8rTHX&<06V5}?W;ZS z2P=X-C-Z(F*FUjW0$abFuPcM~&-;N~pZKq$jU&0N3RbiKYP73!*gxm8Tp#u}`yyl#!xrd^N2>+=S*UXQ&VtxF8AL%BY$U-QhTAKZTB^=EA~ z^<00}0jrs_d3rrr5AN8mw`0h~#@9dlV*{}JLmzF5H1*7L8?ajDIY0i}!qqd+{$O))ZjLDzJD$GI(>V+P`@NSw+MK6a=IK4g)*QZm z!;yJzS!3t96^HZOhBosYLX6DQ&z?KiJo6j`w_iEW!D#B4=Z;{t%yUWncY>>Dod)ak{qO#6Ut{MofWvtXq|H1=5Mz6I zIggQO>gMQqzAM|1c{`xpE`@If`t-1mSxPC55I(bRLT*$b?e>!UfSr8d6< ztECS6fYr)-o&Dg>&2=?Lx!C;l&$a0Qu-7JiwCUp<)id6~V71KQ5U}%d4*JXW(cd~B zTH9R%an@i2wox3uMsj2gcCGO)w7=zW4Mx*u4UQm2xdz7++%-79;QF1|;3pMa|5FRD z|LF~WX2JD8r{MaZTk!M27t}oUITG$X$~8U;O+9OTG*~Tb>>Sln^JBqkS>xltYULWA z0JnCofi;keoxlEBcSn zHho+J^^A8GxE$|nxLSEX`v-W&a}DIivi|yKyz{`0r;j#$TtoGYcOlq0=l87_gViqL zh|eWpeX>TEg4N2;sF%T=OX6G(Rx9INQTrs$m2kE8=hnW}Fmk;LZVrxN41L@`f26&d z!#$PrORj(Nyaw$2@>{}d!D{v&L+tCo_Rsy9Tp#;;4qji|JwL@cKX=ErH;1o1IC6gO zSz}}G#o_t+JKCI|Hxi>fKW{0x=g;j0*YC~-zq{c2-&b(`A1L@k;D>9T^X(?Md6nne zpV8E_1~-G%a=w|fT55VLSS{z#Q=R65kv;R}HPjlEmdrq#8{oPm3)OPorIC~DrdwlzK08RGXfi>Qj z_MjT?PkS(j`|nWN?7wFTlKtoYd8y#)uQd3p1=s(*g6sc5gMV0X{XZ$V{+~7Y=QYp% zd=7pPe&zoB8=89d=ks8->`&*UmioT{R?Gf;5v*43&zIrW&GokianwMzUi(bV;K{pHE)E3kPP(^%Te-(*0m<2ZaB#gTL1=o%kRdrXawq&=3ybKrQ| zoC9AI#JwnYkN&gZ>OVI4PX*V%Pe)IG{l{tWaSN{hgay}s;s&3j=Be2?jOQH6J@+k| zdd`9Gz-l=MoReB={132N&Vld2YUMfb1Khf~4%R>}cK-S&pMQa^W0}v-XzKb~A9>ag zskMg2G?w<{H5Rrqud(53IS0HxcEBAk=YZGHPBitL16^P><9ZJC1!pd;^?{q4YvUMV z*TsIxb3CwnO@IBgC(rT0Wu6nj)yi{VB6!AhjpdHx`s$zhO$v5CN#ho2CL^l+;1*m~)od}ab$_cEWE(bV;~p7N~uEZXolrm?gquUWxm zUbDf~%5!FRxZ{=Q%p7RyIcMestL2=T8=Sego^o?@EgeJbI@&LJ&IdM6{q@tHJm&|O zc`g7~E6P~sq624kteUk!RBR5V`)!bOMuI~mV~SM z{k*?#^P00X-0}RKb=G@n_%d*9so}EPIr5oiIk4JA#7L~=;fa-dRAa4xt}U@v1gqs) z;7VY%@5n3vc6?>HW3+7bwQf~-YPbqmZcRK#oSWG5!@jA{8er?Azkb@A*OUve`}zY% zt|{l%_$=DwwjA&aVqr%O3E(Wqr7Hu&&NYE_OcpC!dYL)}_p6 zV>EUBov%D=vI*EVF{ZJ!C$CMxWnP=X)yi}JS8&HG&-q`Ysb`OE4puX+bNLN8bFtoX zbFnw#LmZlsrgW_HP>H1?ai9sgx%Nm9I5%AYJ3gt4K==w z_C^kC{%6|Md}m^oH6LAY_1zkL_nN2XyTBbIweYjaFf{eld^lJwHFr$4)O-Y3Ej1qr zRx4}1E8P4ujy3-+ntEzJ3aplzj{#c?YwNt^V&~)-V&`MO)O-)HHP>H1?ai9sjosJn z9I5#oHNJ)R&KloFdl!c_zlSz8-;|&vn!5hxFHemR0b65Z8cTb# z#*bq6^&m%T{7{YWqkXu>570isVT~W7O^pvFW?AE-3$A`_gCAFL--pgAxc=uh_<1!? z4Gx2wQ(1$<(bTghM}XC`Cg!M?H8~QjmNhvFtX8hcF>vc(U7eF$?0oc3KF5QtOPS9J zXzKbqUwPK#M6hdOOk-(JUcU#Id7T7TYrhY*@10JDJD%@D$=CaxQ_!{L96c4RmV2ku zz-r~a)9LWUD({`nK-ZR7XM)vo?{pSet-N`s=5?xo4ln?(1oe?Ad2(`~>Y^YWx)KUpd^f&(UVjUO-Iun%q5jS;5t>Xz(j* zo;AM^?il5oUxcQfJ$Nx#Eql;0)w0%?fYq`GF9oY*O}&4(9PYfVlR3)8=BI!1xeDw& z%Y6QbrmnyF%Twd4!PeNA#?s!b@ypnKy}*$gzgXkvX7uCLIhj@J_>b+x^r!Eda2 z^1cRcoHFlg(bQAN>%eN(G5hLIaC32Pjwu&Ap8jITvX+_iO>pO|zkb@AbAA)MuU9!T z=htfNoL{f;k+g4cIRCe3GyhwOS444&6>!Q=fhyXqqM*Mv^UrFeeAy8=E%CfQ)Acl z-5Q@n`yPku`T=d$^>JdB>-uDaKUHwo^|^xk{m}CTcZ?Tmo_an4H-~avA4OBox;_S0 zE7$c2xbv_s<|r4NpZ;QV^E-jm>uI>_s=t2PlgBgQW*&b*Q_s5o6|9zZJ%L!y!qu~` ze*-5kYaurm>!7cGzo*}eVC${Tn#hyqOJKiuv%mecH`nzO?7lwa$hv-1W7qZL8v7ag z?;Nh{r?gqu*N9oJ>l+RJX2D(8_Y3Z4^bZT}7$4O<^?Vs_4&}POf~KBzeHE-$uIuY? z=V4vUQ7$$={l(_ycPgpZTX5G^fBm#4kGH|iJl;W5&$_+~R?E7cNv!wa>RHzhz{$&6 z$j!w%=&Rq^^!pfWy|q~rdGh=_*zZ2-s60de-$buv)pUU%;J*bumY| z*!=Vto11HpdVLLdUG>*bd-C`O+|1)!H1(|OcVM-w>qW%+2V6bt`cH83vKDf4u@3s` zcM1J|0$Xow){{{AY3H#fxWv_bv-T)ux`FjNI*Ecj-*Kcd=x_(#V>uCScI>zST z()O(D*qy!CwX?yy3hug&UvNL8Pgrorn5gEd=g;JA4&}Ns^-4YKIu=~5T-Oe`^RO=F zC>NWb{$g``t60}QaMx9T{j?{KzTjpapBV8?>_8rKkd!)^=It9e&EQu{#awz^`{!|Px~(p&sVla_xU;{ zG0XFH>IR>t;I8XT1>YAwOTisu)|#iDlfuoRT-V9a)U&RWgVoA)oeJ(etcy9y#pb8K z*xaVzNWG>7yRQ1{r#*R02X5vuJ(_yfbq26n)^#6Z%?MY|y3PzvUe-cxF4jR`{r02Z zY+&oH&6>!Q=j`A^u-V^!+MDaz#Txkzc8y)vjvD*@ODEWM?L(XE@I1sU*LA)I zpTFR)>!Jns`<=xL?ifqdJoTIdZVu(T&WWa;b)5^WR<7&3aOYuN%uy~jKmEn#HaAD= zwE)<4)n7mD$zwrqGmnMP)U&P&gVnOGHxp|SxO&!gF>vy-7IJg34*KeMEB%%PTW@XF zM4mjC0^f~~{q3i{xvt~W*H>TKtm`;6c3sD<@dM!Tz^>~Av{~2XiCM1eiVeO}!Clui z3Vt7at%5s7znZ6>OT*2fT-RmL)U&S3g4N1(T>LR%evl6tkvP_S=Tke$;(>E&BZ$CtKa?fTN`Y>wOJE+@>~b( zcXjr+pZ4auPD)>26Vhf~C#tdQI&qEtUStxm>pB^2)^$T-mg~B4gKtuB*L916`@PGS z1$T_CYMy$o3pa;yUDrcX&$_M;Rx8(aBe?UhF6Jl~o1gw-bK8I;_1YBdy6Uf=_T;e{ zxS7YV(A2Z8zXq#iT^}db=5Y0_>usm9J@X0SDxmDV}VOFNu+4faIS=5IVbANB&PnVU72=bZW-*frH={pH&JM!$W*)>oTr zATo-xHu>-(f8;xf_?bgCIJ`kLolfyx1>c%n`dDi$~uv$64L(tTnpLre% sRfq>mE|ee(*f`e;+3fg8%>k literal 52300 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

RD-#d|`8~i5?eq2A^Rh%sG0?R9W_KXq1r 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