From 8f6984e3450a4e995c557fae30fe212ff1048309 Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sun, 15 Dec 2019 11:36:24 -0800 Subject: [PATCH 1/3] libobs: Add support for volume textures Also fix some mip calculations along the way. --- libobs-d3d11/CMakeLists.txt | 1 + libobs-d3d11/d3d11-rebuild.cpp | 70 ++++++++ libobs-d3d11/d3d11-subsystem.cpp | 26 +-- libobs-d3d11/d3d11-subsystem.hpp | 57 ++++++- libobs-d3d11/d3d11-texture2d.cpp | 14 +- libobs-d3d11/d3d11-texture3d.cpp | 252 ++++++++++++++++++++++++++++ libobs-opengl/CMakeLists.txt | 1 + libobs-opengl/gl-helpers.c | 11 +- libobs-opengl/gl-subsystem.c | 18 -- libobs-opengl/gl-subsystem.h | 10 ++ libobs-opengl/gl-texture2d.c | 30 ++-- libobs-opengl/gl-texture3d.c | 181 ++++++++++++++++++++ libobs-opengl/gl-texturecube.c | 2 +- libobs/graphics/device-exports.h | 3 +- libobs/graphics/graphics-internal.h | 2 +- libobs/graphics/graphics.h | 6 +- 16 files changed, 624 insertions(+), 60 deletions(-) create mode 100644 libobs-d3d11/d3d11-texture3d.cpp create mode 100644 libobs-opengl/gl-texture3d.c diff --git a/libobs-d3d11/CMakeLists.txt b/libobs-d3d11/CMakeLists.txt index 8b35d3918..be96f00ae 100644 --- a/libobs-d3d11/CMakeLists.txt +++ b/libobs-d3d11/CMakeLists.txt @@ -26,6 +26,7 @@ set(libobs-d3d11_SOURCES d3d11-stagesurf.cpp d3d11-subsystem.cpp d3d11-texture2d.cpp + d3d11-texture3d.cpp d3d11-vertexbuffer.cpp d3d11-duplicator.cpp d3d11-rebuild.cpp diff --git a/libobs-d3d11/d3d11-rebuild.cpp b/libobs-d3d11/d3d11-rebuild.cpp index 2fb89086b..5d693c632 100644 --- a/libobs-d3d11/d3d11-rebuild.cpp +++ b/libobs-d3d11/d3d11-rebuild.cpp @@ -251,6 +251,70 @@ void gs_timer_range::Rebuild(ID3D11Device *dev) throw HRError("Failed to create timer", hr); } +void gs_texture_3d::RebuildSharedTextureFallback() +{ + td = {}; + td.Width = 2; + td.Height = 2; + td.Depth = 2; + td.MipLevels = 1; + td.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + td.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + width = td.Width; + height = td.Height; + depth = td.Depth; + dxgiFormat = td.Format; + levels = 1; + + resourceDesc = {}; + resourceDesc.Format = td.Format; + resourceDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + resourceDesc.Texture3D.MostDetailedMip = 0; + resourceDesc.Texture3D.MipLevels = 1; + + isShared = false; +} + +void gs_texture_3d::Rebuild(ID3D11Device *dev) +{ + HRESULT hr; + if (isShared) { + hr = dev->OpenSharedResource((HANDLE)(uintptr_t)sharedHandle, + __uuidof(ID3D11Texture3D), + (void **)&texture); + if (FAILED(hr)) { + blog(LOG_WARNING, + "Failed to rebuild shared texture: ", "0x%08lX", + hr); + RebuildSharedTextureFallback(); + } + } + + if (!isShared) { + hr = dev->CreateTexture3D( + &td, data.size() ? srd.data() : nullptr, &texture); + if (FAILED(hr)) + throw HRError("Failed to create 3D texture", hr); + } + + hr = dev->CreateShaderResourceView(texture, &resourceDesc, &shaderRes); + if (FAILED(hr)) + throw HRError("Failed to create resource view", hr); + + if (isRenderTarget) + InitRenderTargets(); + + acquired = false; + + if ((td.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0) { + ComQIPtr dxgi_res(texture); + if (dxgi_res) + GetSharedHandle(dxgi_res); + device_texture_acquire_sync(this, 0, INFINITE); + } +} + void SavedBlendState::Rebuild(ID3D11Device *dev) { HRESULT hr = dev->CreateBlendState(&bd, &state); @@ -327,6 +391,9 @@ try { case gs_type::gs_timer_range: ((gs_timer_range *)obj)->Release(); break; + case gs_type::gs_texture_3d: + ((gs_texture_3d *)obj)->Release(); + break; } obj = obj->next; @@ -409,6 +476,9 @@ try { case gs_type::gs_timer_range: ((gs_timer_range *)obj)->Rebuild(dev); break; + case gs_type::gs_texture_3d: + ((gs_texture_3d *)obj)->Rebuild(dev); + break; } obj = obj->next; diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 4a5012b4b..742e6e1cb 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -1145,19 +1145,23 @@ gs_texture_t *device_cubetexture_create(gs_device_t *device, uint32_t size, gs_texture_t *device_voltexture_create(gs_device_t *device, uint32_t width, uint32_t height, uint32_t depth, enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, + uint32_t levels, + const uint8_t *const *data, uint32_t flags) { - /* TODO */ - UNUSED_PARAMETER(device); - UNUSED_PARAMETER(width); - UNUSED_PARAMETER(height); - UNUSED_PARAMETER(depth); - UNUSED_PARAMETER(color_format); - UNUSED_PARAMETER(levels); - UNUSED_PARAMETER(data); - UNUSED_PARAMETER(flags); - return NULL; + gs_texture *texture = NULL; + try { + texture = new gs_texture_3d(device, width, height, depth, + color_format, levels, data, flags); + } catch (const HRError &error) { + blog(LOG_ERROR, "device_voltexture_create (D3D11): %s (%08lX)", + error.str, error.hr); + LogD3D11ErrorDetails(error, device); + } catch (const char *error) { + blog(LOG_ERROR, "device_voltexture_create (D3D11): %s", error); + } + + return texture; } gs_zstencil_t *device_zstencil_create(gs_device_t *device, uint32_t width, diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 1ef2e61ef..452720269 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -294,6 +294,7 @@ enum class gs_type { gs_swap_chain, gs_timer, gs_timer_range, + gs_texture_3d, }; struct gs_obj { @@ -458,10 +459,10 @@ struct gs_texture_2d : gs_texture { D3D11_TEXTURE2D_DESC td = {}; void InitSRD(vector &srd); - void InitTexture(const uint8_t **data); + void InitTexture(const uint8_t *const *data); void InitResourceView(); void InitRenderTargets(); - void BackupTexture(const uint8_t **data); + void BackupTexture(const uint8_t *const *data); void GetSharedHandle(IDXGIResource *dxgi_res); void RebuildSharedTextureFallback(); @@ -482,7 +483,7 @@ struct gs_texture_2d : gs_texture { gs_texture_2d(gs_device_t *device, uint32_t width, uint32_t height, gs_color_format colorFormat, uint32_t levels, - const uint8_t **data, uint32_t flags, + const uint8_t *const *data, uint32_t flags, gs_texture_type type, bool gdiCompatible, bool nv12 = false); @@ -491,6 +492,56 @@ struct gs_texture_2d : gs_texture { gs_texture_2d(gs_device_t *device, uint32_t handle); }; +struct gs_texture_3d : gs_texture { + ComPtr texture; + ComPtr renderTarget[6]; + + uint32_t width = 0, height = 0, depth = 0; + uint32_t flags = 0; + DXGI_FORMAT dxgiFormat = DXGI_FORMAT_UNKNOWN; + bool isRenderTarget = false; + bool isDynamic = false; + bool isShared = false; + bool genMipmaps = false; + uint32_t sharedHandle = GS_INVALID_HANDLE; + + bool chroma = false; + bool acquired = false; + + vector> data; + vector srd; + D3D11_TEXTURE3D_DESC td = {}; + + void InitSRD(vector &srd); + void InitTexture(const uint8_t *const *data); + void InitResourceView(); + void InitRenderTargets(); + void BackupTexture(const uint8_t *const *data); + void GetSharedHandle(IDXGIResource *dxgi_res); + + void RebuildSharedTextureFallback(); + void Rebuild(ID3D11Device *dev); + void RebuildNV12_Y(ID3D11Device *dev); + void RebuildNV12_UV(ID3D11Device *dev); + + inline void Release() + { + texture.Release(); + for (auto &rt : renderTarget) + rt.Release(); + shaderRes.Release(); + } + + inline gs_texture_3d() : gs_texture(GS_TEXTURE_3D, 0, GS_UNKNOWN) {} + + gs_texture_3d(gs_device_t *device, uint32_t width, uint32_t height, + uint32_t depth, gs_color_format colorFormat, + uint32_t levels, const uint8_t *const *data, + uint32_t flags); + + gs_texture_3d(gs_device_t *device, uint32_t handle); +}; + struct gs_zstencil_buffer : gs_obj { ComPtr texture; ComPtr view; diff --git a/libobs-d3d11/d3d11-texture2d.cpp b/libobs-d3d11/d3d11-texture2d.cpp index 687f488c7..c249e208d 100644 --- a/libobs-d3d11/d3d11-texture2d.cpp +++ b/libobs-d3d11/d3d11-texture2d.cpp @@ -27,7 +27,7 @@ void gs_texture_2d::InitSRD(vector &srd) size_t curTex = 0; if (!actual_levels) - actual_levels = gs_get_total_levels(width, height); + actual_levels = gs_get_total_levels(width, height, 1); rowSizeBytes /= 8; @@ -48,7 +48,7 @@ void gs_texture_2d::InitSRD(vector &srd) } } -void gs_texture_2d::BackupTexture(const uint8_t **data) +void gs_texture_2d::BackupTexture(const uint8_t *const *data) { this->data.resize(levels); @@ -66,8 +66,10 @@ void gs_texture_2d::BackupTexture(const uint8_t **data) vector &subData = this->data[i]; memcpy(&subData[0], data[i], texSize); - w /= 2; - h /= 2; + if (w > 1) + w /= 2; + if (h > 1) + h /= 2; } } @@ -87,7 +89,7 @@ void gs_texture_2d::GetSharedHandle(IDXGIResource *dxgi_res) } } -void gs_texture_2d::InitTexture(const uint8_t **data) +void gs_texture_2d::InitTexture(const uint8_t *const *data) { HRESULT hr; @@ -226,7 +228,7 @@ void gs_texture_2d::InitRenderTargets() gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t width, uint32_t height, gs_color_format colorFormat, - uint32_t levels, const uint8_t **data, + uint32_t levels, const uint8_t *const *data, uint32_t flags_, gs_texture_type type, bool gdiCompatible, bool nv12_) : gs_texture(device, gs_type::gs_texture_2d, type, levels, colorFormat), diff --git a/libobs-d3d11/d3d11-texture3d.cpp b/libobs-d3d11/d3d11-texture3d.cpp new file mode 100644 index 000000000..1beb67aa7 --- /dev/null +++ b/libobs-d3d11/d3d11-texture3d.cpp @@ -0,0 +1,252 @@ +/****************************************************************************** + Copyright (C) 2013 by Hugh Bailey + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include +#include "d3d11-subsystem.hpp" + +void gs_texture_3d::InitSRD(vector &srd) +{ + uint32_t rowSizeBits = width * gs_get_format_bpp(format); + uint32_t sliceSizeBytes = height * rowSizeBits / 8; + uint32_t actual_levels = levels; + + if (!actual_levels) + actual_levels = gs_get_total_levels(width, height, depth); + + uint32_t newRowSize = rowSizeBits / 8; + uint32_t newSlizeSize = sliceSizeBytes; + + for (uint32_t level = 0; level < actual_levels; ++level) { + D3D11_SUBRESOURCE_DATA newSRD; + newSRD.pSysMem = data[level].data(); + newSRD.SysMemPitch = newRowSize; + newSRD.SysMemSlicePitch = newSlizeSize; + srd.push_back(newSRD); + + newRowSize /= 2; + newSlizeSize /= 4; + } +} + +void gs_texture_3d::BackupTexture(const uint8_t *const *data) +{ + this->data.resize(levels); + + uint32_t w = width; + uint32_t h = height; + uint32_t d = depth; + const uint32_t bbp = gs_get_format_bpp(format); + + for (uint32_t i = 0; i < levels; i++) { + if (!data[i]) + break; + + const uint32_t texSize = bbp * w * h * d / 8; + this->data[i].resize(texSize); + + vector &subData = this->data[i]; + memcpy(&subData[0], data[i], texSize); + + if (w > 1) + w /= 2; + if (h > 1) + h /= 2; + if (d > 1) + d /= 2; + } +} + +void gs_texture_3d::GetSharedHandle(IDXGIResource *dxgi_res) +{ + HANDLE handle; + HRESULT hr; + + hr = dxgi_res->GetSharedHandle(&handle); + if (FAILED(hr)) { + blog(LOG_WARNING, + "GetSharedHandle: Failed to " + "get shared handle: %08lX", + hr); + } else { + sharedHandle = (uint32_t)(uintptr_t)handle; + } +} + +void gs_texture_3d::InitTexture(const uint8_t *const *data) +{ + HRESULT hr; + + memset(&td, 0, sizeof(td)); + td.Width = width; + td.Height = height; + td.Depth = depth; + td.MipLevels = genMipmaps ? 0 : levels; + td.Format = dxgiFormat; + td.BindFlags = D3D11_BIND_SHADER_RESOURCE; + td.CPUAccessFlags = isDynamic ? D3D11_CPU_ACCESS_WRITE : 0; + td.Usage = isDynamic ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT; + + if (type == GS_TEXTURE_CUBE) + td.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE; + + if (isRenderTarget) + td.BindFlags |= D3D11_BIND_RENDER_TARGET; + + if ((flags & GS_SHARED_KM_TEX) != 0) + td.MiscFlags |= D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; + else if ((flags & GS_SHARED_TEX) != 0) + td.MiscFlags |= D3D11_RESOURCE_MISC_SHARED; + + if (data) { + BackupTexture(data); + InitSRD(srd); + } + + hr = device->device->CreateTexture3D(&td, data ? srd.data() : NULL, + texture.Assign()); + if (FAILED(hr)) + throw HRError("Failed to create 3D texture", hr); + + if (isShared) { + ComPtr dxgi_res; + + texture->SetEvictionPriority(DXGI_RESOURCE_PRIORITY_MAXIMUM); + + hr = texture->QueryInterface(__uuidof(IDXGIResource), + (void **)&dxgi_res); + if (FAILED(hr)) { + blog(LOG_WARNING, + "InitTexture: Failed to query " + "interface: %08lX", + hr); + } else { + GetSharedHandle(dxgi_res); + + if (flags & GS_SHARED_KM_TEX) { + ComPtr km; + hr = texture->QueryInterface( + __uuidof(IDXGIKeyedMutex), + (void **)&km); + if (FAILED(hr)) { + throw HRError("Failed to query " + "IDXGIKeyedMutex", + hr); + } + + km->AcquireSync(0, INFINITE); + acquired = true; + } + } + } +} + +void gs_texture_3d::InitResourceView() +{ + HRESULT hr; + + memset(&resourceDesc, 0, sizeof(resourceDesc)); + resourceDesc.Format = dxgiFormat; + + resourceDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + resourceDesc.Texture3D.MostDetailedMip = 0; + resourceDesc.Texture3D.MipLevels = genMipmaps || !levels ? -1 : levels; + + hr = device->device->CreateShaderResourceView(texture, &resourceDesc, + shaderRes.Assign()); + if (FAILED(hr)) + throw HRError("Failed to create resource view", hr); +} + +void gs_texture_3d::InitRenderTargets() +{ + D3D11_RENDER_TARGET_VIEW_DESC rtv; + rtv.Format = dxgiFormat; + rtv.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; + rtv.Texture3D.MipSlice = 0; + rtv.Texture3D.WSize = 1; + + for (UINT i = 0; i < 6; i++) { + rtv.Texture3D.FirstWSlice = i; + const HRESULT hr = device->device->CreateRenderTargetView( + texture, &rtv, renderTarget[i].Assign()); + if (FAILED(hr)) + throw HRError("Failed to create volume render " + "target view", + hr); + } +} + +#define SHARED_FLAGS (GS_SHARED_TEX | GS_SHARED_KM_TEX) + +gs_texture_3d::gs_texture_3d(gs_device_t *device, uint32_t width, + uint32_t height, uint32_t depth, + gs_color_format colorFormat, uint32_t levels, + const uint8_t *const *data, uint32_t flags_) + : gs_texture(device, gs_type::gs_texture_3d, GS_TEXTURE_3D, levels, + colorFormat), + width(width), + height(height), + depth(depth), + flags(flags_), + dxgiFormat(ConvertGSTextureFormat(format)), + isRenderTarget((flags_ & GS_RENDER_TARGET) != 0), + isDynamic((flags_ & GS_DYNAMIC) != 0), + isShared((flags_ & SHARED_FLAGS) != 0), + genMipmaps((flags_ & GS_BUILD_MIPMAPS) != 0), + sharedHandle(GS_INVALID_HANDLE) +{ + InitTexture(data); + InitResourceView(); + + if (isRenderTarget) + InitRenderTargets(); +} + +gs_texture_3d::gs_texture_3d(gs_device_t *device, uint32_t handle) + : gs_texture(device, gs_type::gs_texture_3d, GS_TEXTURE_3D), + isShared(true), + sharedHandle(handle) +{ + HRESULT hr; + hr = device->device->OpenSharedResource((HANDLE)(uintptr_t)handle, + IID_PPV_ARGS(texture.Assign())); + if (FAILED(hr)) + throw HRError("Failed to open shared 3D texture", hr); + + texture->GetDesc(&td); + + this->type = GS_TEXTURE_3D; + this->format = ConvertDXGITextureFormat(td.Format); + this->levels = 1; + this->device = device; + + this->width = td.Width; + this->height = td.Height; + this->depth = td.Depth; + this->dxgiFormat = td.Format; + + memset(&resourceDesc, 0, sizeof(resourceDesc)); + resourceDesc.Format = td.Format; + resourceDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + resourceDesc.Texture3D.MostDetailedMip = 0; + resourceDesc.Texture3D.MipLevels = 1; + + hr = device->device->CreateShaderResourceView(texture, &resourceDesc, + shaderRes.Assign()); + if (FAILED(hr)) + throw HRError("Failed to create shader resource view", hr); +} diff --git a/libobs-opengl/CMakeLists.txt b/libobs-opengl/CMakeLists.txt index a116c992d..086d65220 100644 --- a/libobs-opengl/CMakeLists.txt +++ b/libobs-opengl/CMakeLists.txt @@ -58,6 +58,7 @@ set(libobs-opengl_SOURCES gl-stagesurf.c gl-subsystem.c gl-texture2d.c + gl-texture3d.c gl-texturecube.c gl-vertexbuffer.c gl-zstencil.c) diff --git a/libobs-opengl/gl-helpers.c b/libobs-opengl/gl-helpers.c index 03574c8a8..82c564393 100644 --- a/libobs-opengl/gl-helpers.c +++ b/libobs-opengl/gl-helpers.c @@ -45,13 +45,10 @@ bool gl_init_face(GLenum target, GLenum type, uint32_t num_levels, data++; size /= 4; - width /= 2; - height /= 2; - - if (width == 0) - width = 1; - if (height == 0) - height = 1; + if (width > 1) + width /= 2; + if (height > 1) + height /= 2; } if (data) diff --git a/libobs-opengl/gl-subsystem.c b/libobs-opengl/gl-subsystem.c index 073aa6d78..00bc561dd 100644 --- a/libobs-opengl/gl-subsystem.c +++ b/libobs-opengl/gl-subsystem.c @@ -349,24 +349,6 @@ uint32_t device_get_height(const gs_device_t *device) } } -gs_texture_t *device_voltexture_create(gs_device_t *device, uint32_t width, - uint32_t height, uint32_t depth, - enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, - uint32_t flags) -{ - /* TODO */ - UNUSED_PARAMETER(device); - UNUSED_PARAMETER(width); - UNUSED_PARAMETER(height); - UNUSED_PARAMETER(depth); - UNUSED_PARAMETER(color_format); - UNUSED_PARAMETER(levels); - UNUSED_PARAMETER(data); - UNUSED_PARAMETER(flags); - return NULL; -} - gs_samplerstate_t * device_samplerstate_create(gs_device_t *device, const struct gs_sampler_info *info) diff --git a/libobs-opengl/gl-subsystem.h b/libobs-opengl/gl-subsystem.h index 230683618..3fc4de562 100644 --- a/libobs-opengl/gl-subsystem.h +++ b/libobs-opengl/gl-subsystem.h @@ -527,6 +527,16 @@ struct gs_texture_2d { GLuint unpack_buffer; }; +struct gs_texture_3d { + struct gs_texture base; + + uint32_t width; + uint32_t height; + uint32_t depth; + bool gen_mipmaps; + GLuint unpack_buffer; +}; + struct gs_texture_cube { struct gs_texture base; diff --git a/libobs-opengl/gl-texture2d.c b/libobs-opengl/gl-texture2d.c index 91ca42682..eec3534cd 100644 --- a/libobs-opengl/gl-texture2d.c +++ b/libobs-opengl/gl-texture2d.c @@ -26,7 +26,7 @@ static bool upload_texture_2d(struct gs_texture_2d *tex, const uint8_t **data) bool success; if (!num_levels) - num_levels = gs_get_total_levels(tex->width, tex->height); + num_levels = gs_get_total_levels(tex->width, tex->height, 1); if (!gl_bind_texture(GL_TEXTURE_2D, tex->base.texture)) return false; @@ -145,18 +145,25 @@ static inline bool is_texture_2d(const gs_texture_t *tex, const char *func) void gs_texture_destroy(gs_texture_t *tex) { - struct gs_texture_2d *tex2d = (struct gs_texture_2d *)tex; if (!tex) return; - if (!is_texture_2d(tex, "gs_texture_destroy")) - return; - if (tex->cur_sampler) gs_samplerstate_destroy(tex->cur_sampler); - if (!tex->is_dummy && tex->is_dynamic && tex2d->unpack_buffer) - gl_delete_buffers(1, &tex2d->unpack_buffer); + if (!tex->is_dummy && tex->is_dynamic) { + if (tex->type == GS_TEXTURE_2D) { + struct gs_texture_2d *tex2d = + (struct gs_texture_2d *)tex; + if (tex2d->unpack_buffer) + gl_delete_buffers(1, &tex2d->unpack_buffer); + } else if (tex->type == GS_TEXTURE_3D) { + struct gs_texture_3d *tex3d = + (struct gs_texture_3d *)tex; + if (tex3d->unpack_buffer) + gl_delete_buffers(1, &tex3d->unpack_buffer); + } + } if (tex->texture) gl_delete_textures(1, &tex->texture); @@ -253,19 +260,22 @@ failed: bool gs_texture_is_rect(const gs_texture_t *tex) { - const struct gs_texture_2d *tex2d = (const struct gs_texture_2d *)tex; - if (!is_texture_2d(tex, "gs_texture_unmap")) { + if (tex->type == GS_TEXTURE_3D) + return false; + + if (!is_texture_2d(tex, "gs_texture_is_rect")) { blog(LOG_ERROR, "gs_texture_is_rect (GL) failed"); return false; } + const struct gs_texture_2d *tex2d = (const struct gs_texture_2d *)tex; return tex2d->base.gl_target == GL_TEXTURE_RECTANGLE; } void *gs_texture_get_obj(gs_texture_t *tex) { struct gs_texture_2d *tex2d = (struct gs_texture_2d *)tex; - if (!is_texture_2d(tex, "gs_texture_unmap")) { + if (!is_texture_2d(tex, "gs_texture_get_obj")) { blog(LOG_ERROR, "gs_texture_get_obj (GL) failed"); return NULL; } diff --git a/libobs-opengl/gl-texture3d.c b/libobs-opengl/gl-texture3d.c new file mode 100644 index 000000000..3dd0b083f --- /dev/null +++ b/libobs-opengl/gl-texture3d.c @@ -0,0 +1,181 @@ +/****************************************************************************** + Copyright (C) 2013 by Hugh Bailey + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "gl-subsystem.h" + +static bool gl_init_volume(GLenum type, uint32_t num_levels, GLenum format, + GLint internal_format, bool compressed, + uint32_t width, uint32_t height, uint32_t depth, + const uint8_t *const **p_data) +{ + bool success = true; + const uint8_t *const *data = p_data ? *p_data : NULL; + uint32_t i; + const uint32_t bpp = gs_get_format_bpp(format); + + for (i = 0; i < num_levels; i++) { + if (compressed) { + uint32_t mip_size = width * height * depth * bpp / 8; + glCompressedTexImage3D(GL_TEXTURE_3D, i, + internal_format, width, height, + depth, 0, mip_size, + data ? *data : NULL); + if (!gl_success("glCompressedTexImage3D")) + success = false; + + } else { + glTexImage3D(GL_TEXTURE_3D, i, internal_format, width, + height, depth, 0, format, type, + data ? *data : NULL); + if (!gl_success("glTexImage3D")) + success = false; + } + + if (data) + data++; + + if (width > 1) + width /= 2; + if (height > 1) + height /= 2; + if (depth > 1) + depth /= 2; + } + + if (data) + *p_data = data; + return success; +} + +static bool upload_texture_3d(struct gs_texture_3d *tex, + const uint8_t *const *data) +{ + uint32_t num_levels = tex->base.levels; + bool compressed = gs_is_compressed_format(tex->base.format); + bool success; + + if (!num_levels) + num_levels = gs_get_total_levels(tex->width, tex->height, + tex->depth); + + if (!gl_bind_texture(GL_TEXTURE_3D, tex->base.texture)) + return false; + + success = gl_init_volume(tex->base.gl_type, num_levels, + tex->base.gl_format, + tex->base.gl_internal_format, compressed, + tex->width, tex->height, tex->depth, &data); + + if (!gl_tex_param_i(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, + num_levels - 1)) + success = false; + if (!gl_bind_texture(GL_TEXTURE_3D, 0)) + success = false; + + return success; +} + +static bool create_pixel_unpack_buffer(struct gs_texture_3d *tex) +{ + GLsizeiptr size; + bool success = true; + + if (!gl_gen_buffers(1, &tex->unpack_buffer)) + return false; + + if (!gl_bind_buffer(GL_PIXEL_UNPACK_BUFFER, tex->unpack_buffer)) + return false; + + size = tex->width * gs_get_format_bpp(tex->base.format); + if (!gs_is_compressed_format(tex->base.format)) { + size /= 8; + size = (size + 3) & 0xFFFFFFFC; + size *= tex->height; + size *= tex->depth; + } else { + size *= tex->height; + size *= tex->depth; + size /= 8; + } + + glBufferData(GL_PIXEL_UNPACK_BUFFER, size, 0, GL_DYNAMIC_DRAW); + if (!gl_success("glBufferData")) + success = false; + + if (!gl_bind_buffer(GL_PIXEL_UNPACK_BUFFER, 0)) + success = false; + + return success; +} + +gs_texture_t *device_voltexture_create(gs_device_t *device, uint32_t width, + uint32_t height, uint32_t depth, + enum gs_color_format color_format, + uint32_t levels, + const uint8_t *const *data, + uint32_t flags) +{ + struct gs_texture_3d *tex = bzalloc(sizeof(struct gs_texture_3d)); + tex->base.device = device; + tex->base.type = GS_TEXTURE_3D; + tex->base.format = color_format; + tex->base.levels = levels; + tex->base.gl_format = convert_gs_format(color_format); + tex->base.gl_internal_format = convert_gs_internal_format(color_format); + tex->base.gl_type = get_gl_format_type(color_format); + tex->base.gl_target = GL_TEXTURE_3D; + tex->base.is_dynamic = (flags & GS_DYNAMIC) != 0; + tex->base.is_render_target = (flags & GS_RENDER_TARGET) != 0; + tex->base.is_dummy = (flags & GS_GL_DUMMYTEX) != 0; + tex->base.gen_mipmaps = (flags & GS_BUILD_MIPMAPS) != 0; + tex->width = width; + tex->height = height; + tex->depth = depth; + + if (!gl_gen_textures(1, &tex->base.texture)) + goto fail; + + if (!tex->base.is_dummy) { + if (tex->base.is_dynamic && !create_pixel_unpack_buffer(tex)) + goto fail; + if (!upload_texture_3d(tex, data)) + goto fail; + } else { + if (!gl_bind_texture(GL_TEXTURE_3D, tex->base.texture)) + goto fail; + + bool compressed = gs_is_compressed_format(tex->base.format); + bool did_init = gl_init_volume(tex->base.gl_type, 1, + tex->base.gl_format, + tex->base.gl_internal_format, + compressed, tex->width, + tex->height, tex->depth, NULL); + did_init = + gl_tex_param_i(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0); + + bool did_unbind = gl_bind_texture(GL_TEXTURE_3D, 0); + if (!did_init || !did_unbind) + goto fail; + } + + return (gs_texture_t *)tex; + +fail: + gs_texture_destroy((gs_texture_t *)tex); + blog(LOG_ERROR, "device_voltexture_create (GL) failed"); + return NULL; +} diff --git a/libobs-opengl/gl-texturecube.c b/libobs-opengl/gl-texturecube.c index 02ba4a595..880e2f319 100644 --- a/libobs-opengl/gl-texturecube.c +++ b/libobs-opengl/gl-texturecube.c @@ -29,7 +29,7 @@ static inline bool upload_texture_cube(struct gs_texture_cube *tex, uint32_t i; if (!num_levels) - num_levels = gs_get_total_levels(tex->size, tex->size); + num_levels = gs_get_total_levels(tex->size, tex->size, 1); for (i = 0; i < 6; i++) { GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; diff --git a/libobs/graphics/device-exports.h b/libobs/graphics/device-exports.h index 566774e47..9b4e14b79 100644 --- a/libobs/graphics/device-exports.h +++ b/libobs/graphics/device-exports.h @@ -52,7 +52,8 @@ device_cubetexture_create(gs_device_t *device, uint32_t size, EXPORT gs_texture_t * device_voltexture_create(gs_device_t *device, uint32_t width, uint32_t height, uint32_t depth, enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, uint32_t flags); + uint32_t levels, const uint8_t *const *data, + uint32_t flags); EXPORT gs_zstencil_t *device_zstencil_create(gs_device_t *device, uint32_t width, uint32_t height, enum gs_zstencil_format format); diff --git a/libobs/graphics/graphics-internal.h b/libobs/graphics/graphics-internal.h index bc3fd0182..4adea3f55 100644 --- a/libobs/graphics/graphics-internal.h +++ b/libobs/graphics/graphics-internal.h @@ -53,7 +53,7 @@ struct gs_exports { gs_texture_t *(*device_voltexture_create)( gs_device_t *device, uint32_t width, uint32_t height, uint32_t depth, enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, uint32_t flags); + uint32_t levels, const uint8_t *const *data, uint32_t flags); gs_zstencil_t *(*device_zstencil_create)( gs_device_t *device, uint32_t width, uint32_t height, enum gs_zstencil_format format); diff --git a/libobs/graphics/graphics.h b/libobs/graphics/graphics.h index 51b2bd28d..3802fbbf9 100644 --- a/libobs/graphics/graphics.h +++ b/libobs/graphics/graphics.h @@ -938,10 +938,12 @@ static inline bool gs_is_compressed_format(enum gs_color_format format) return (format == GS_DXT1 || format == GS_DXT3 || format == GS_DXT5); } -static inline uint32_t gs_get_total_levels(uint32_t width, uint32_t height) +static inline uint32_t gs_get_total_levels(uint32_t width, uint32_t height, + uint32_t depth) { uint32_t size = width > height ? width : height; - uint32_t num_levels = 0; + size = size > depth ? size : depth; + uint32_t num_levels = 1; while (size > 1) { size /= 2; From e4d8eaa1bcdb145ef70dc5e46a35132646ba2065 Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sun, 15 Dec 2019 12:01:01 -0800 Subject: [PATCH 2/3] obs-filters: Use volume texture for LUT Simplifies shader calculations. Not much perf gain, but GPA shows bottleneck shift from Shader Execution to Sampler as expected. --- plugins/obs-filters/color-grade-filter.c | 70 ++++++++++++++++++- .../data/color_grade_filter.effect | 29 ++------ 2 files changed, 75 insertions(+), 24 deletions(-) diff --git a/plugins/obs-filters/color-grade-filter.c b/plugins/obs-filters/color-grade-filter.c index fb82ed81e..ccb86532b 100644 --- a/plugins/obs-filters/color-grade-filter.c +++ b/plugins/obs-filters/color-grade-filter.c @@ -12,6 +12,8 @@ /* clang-format on */ +static const uint32_t LUT_WIDTH = 64; + struct lut_filter_data { obs_source_t *context; gs_effect_t *effect; @@ -20,6 +22,8 @@ struct lut_filter_data { char *file; float clut_amount; + float clut_scale; + float clut_offset; }; static const char *color_grade_filter_get_name(void *unused) @@ -28,6 +32,54 @@ static const char *color_grade_filter_get_name(void *unused) return obs_module_text("ColorGradeFilter"); } +static gs_texture_t *make_clut_texture(const enum gs_color_format format, + const uint32_t image_width, + const uint32_t image_height, + const uint8_t *data) +{ + if (image_width % LUT_WIDTH != 0) + return NULL; + + if (image_height % LUT_WIDTH != 0) + return NULL; + + const uint32_t pixel_count = LUT_WIDTH * LUT_WIDTH * LUT_WIDTH; + if ((image_width * image_height) != pixel_count) + return NULL; + + const uint32_t bpp = gs_get_format_bpp(format); + if (bpp % 8 != 0) + return NULL; + + const uint32_t pixel_size = bpp / 8; + const uint32_t buffer_size = pixel_size * pixel_count; + uint8_t *const buffer = bmalloc(buffer_size); + const uint32_t macro_width = image_width / LUT_WIDTH; + const uint32_t macro_height = image_height / LUT_WIDTH; + uint8_t *cursor = buffer; + for (uint32_t z = 0; z < LUT_WIDTH; ++z) { + const int z_x = (z % macro_width) * LUT_WIDTH; + const int z_y = (z / macro_height) * LUT_WIDTH; + for (uint32_t y = 0; y < LUT_WIDTH; ++y) { + const uint32_t row_index = image_width * (z_y + y); + for (uint32_t x = 0; x < LUT_WIDTH; ++x) { + const uint32_t index = row_index + z_x + x; + memcpy(cursor, &data[pixel_size * index], + pixel_size); + + cursor += pixel_size; + } + } + } + + gs_texture_t *const texture = + gs_voltexture_create(LUT_WIDTH, LUT_WIDTH, LUT_WIDTH, format, 1, + (const uint8_t **)&buffer, 0); + bfree(buffer); + + return texture; +} + static void color_grade_filter_update(void *data, obs_data_t *settings) { struct lut_filter_data *filter = data; @@ -49,10 +101,17 @@ static void color_grade_filter_update(void *data, obs_data_t *settings) obs_enter_graphics(); - gs_image_file_init_texture(&filter->image); + gs_voltexture_destroy(filter->target); + if (filter->image.loaded) { + filter->target = make_clut_texture(filter->image.format, + filter->image.cx, + filter->image.cy, + filter->image.texture_data); + } - filter->target = filter->image.texture; filter->clut_amount = (float)clut_amount; + filter->clut_scale = (float)(LUT_WIDTH - 1) / (float)LUT_WIDTH; + filter->clut_offset = 0.5f / (float)LUT_WIDTH; char *effect_path = obs_module_file("color_grade_filter.effect"); gs_effect_destroy(filter->effect); @@ -121,6 +180,7 @@ static void color_grade_filter_destroy(void *data) obs_enter_graphics(); gs_effect_destroy(filter->effect); + gs_voltexture_destroy(filter->target); gs_image_file_free(&filter->image); obs_leave_graphics(); @@ -149,6 +209,12 @@ static void color_grade_filter_render(void *data, gs_effect_t *effect) param = gs_effect_get_param_by_name(filter->effect, "clut_amount"); gs_effect_set_float(param, filter->clut_amount); + param = gs_effect_get_param_by_name(filter->effect, "clut_scale"); + gs_effect_set_float(param, filter->clut_scale); + + param = gs_effect_get_param_by_name(filter->effect, "clut_offset"); + gs_effect_set_float(param, filter->clut_offset); + obs_source_process_filter_end(filter->context, filter->effect, 0, 0); UNUSED_PARAMETER(effect); diff --git a/plugins/obs-filters/data/color_grade_filter.effect b/plugins/obs-filters/data/color_grade_filter.effect index 02e02a8ec..8c9ba2041 100644 --- a/plugins/obs-filters/data/color_grade_filter.effect +++ b/plugins/obs-filters/data/color_grade_filter.effect @@ -1,13 +1,16 @@ uniform float4x4 ViewProj; uniform texture2d image; -uniform texture2d clut; +uniform texture3d clut; uniform float clut_amount; +uniform float clut_scale; +uniform float clut_offset; sampler_state textureSampler { Filter = Linear; AddressU = Clamp; AddressV = Clamp; + AddressW = Clamp; }; struct VertDataIn { @@ -31,29 +34,11 @@ VertDataOut VSDefault(VertDataIn v_in) float4 LUT(VertDataOut v_in) : TARGET { float4 textureColor = image.Sample(textureSampler, v_in.uv); - float blueColor = textureColor.b * 63.0; - float2 quad1; - quad1.y = floor(floor(blueColor) / 8.0); - quad1.x = floor(blueColor) - (quad1.y * 8.0); + float3 clut_uvw = textureColor.rgb * clut_scale + clut_offset; + float3 luttedColor = clut.Sample(textureSampler, clut_uvw).rgb; - float2 quad2; - quad2.y = floor(ceil(blueColor) / 8.0); - quad2.x = ceil(blueColor) - (quad2.y * 8.0); - - float2 texPos1; - texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); - texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); - - float2 texPos2; - texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); - texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); - - float4 newColor1 = clut.Sample(textureSampler, texPos1); - float4 newColor2 = clut.Sample(textureSampler, texPos2); - float4 luttedColor = lerp(newColor1, newColor2, frac(blueColor)); - - float4 final_color = lerp(textureColor, luttedColor, clut_amount); + float3 final_color = lerp(textureColor.rgb, luttedColor, clut_amount); return float4(final_color.rgb, textureColor.a); } From f452bfeedd5e0fed0cba043950b1817680d25ae2 Mon Sep 17 00:00:00 2001 From: jpark37 Date: Thu, 26 Dec 2019 09:41:47 -0800 Subject: [PATCH 3/3] obs-filters: Add grayscale LUT image Not sure what effect black_and_white.png is going for. Add grayscale.png to try to make it clear that the other image shouldn't be used for desaturation. --- plugins/obs-filters/data/LUTs/grayscale.png | Bin 0 -> 79446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 plugins/obs-filters/data/LUTs/grayscale.png diff --git a/plugins/obs-filters/data/LUTs/grayscale.png b/plugins/obs-filters/data/LUTs/grayscale.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bf7116192dcf0dd3379b96e4f33564f1265638 GIT binary patch literal 79446 zcmZU*2~-pJ8vh-&7VCyyuTmFCTW_lsk=6|@!dSJYt$#|b#aL0IqF_acYfwUFY*nx> zq_hGmYHFz)6r)6mipglvMp=xg2r-5MB6~s-0?8z^7nkH;JF#pg@D;qeB-zYgRLc@zH8yXUzV{xM+ZH-bgHD~~62z#ra7 z{50xQ9`Blb7`=Wl{Q0eIpMSTL#~WGB{XIY@zO<3Y^PT@<$*14$iL<drE^BY|L?CWohJjzgdZ=PAD+6kqkWRfm+Jmpf1|fs@%^$-y0f48d<2cKI^PLj zn~zpFeO{3-i7mptMINQkt8Bv=BYwu$ZDUi|OpMI*DA*1~E5_7eXM7CdlSMww&YJCO z!`Qa;;{}s8MZT=bn#(u8tvey#{bzi&E~0yTo0;z;oo_|&`O9;EN~9zG>91#ZMS31Z zM=E-bUpyTx>s+C~7;frlopritxbx)WT^Bsl6X#c^m#WSrN9yK3{#enqrtOq|=UHb} z8{+e{4U4n?=sXyj-sJf`K+~S?I3h~dzJ5P+zR3GD?`){lQ2AJR^RKb3!D~CdbjDoS zk>lASEPI)LENM-=_Qj1Wb3|>Q)SXnOYPzb!Zr&TwI*}m%c1DTQo_Sisa8G(=Y{L$1 zU$HoXaFwdhh%w5jPrYLfY%6=!GQ(-=mZ&{J?wh)FrPP$9)yukPC9=4W!WBLT-?yFR z7U4N&iRVjoOxT^K5i5LWx_3?K2n(lttz!0q1!?_QZs=9C&c65s(-vXdoBG@)3GR|T zz@8Tb?T+-;$QybUo!?$uZNcGf>alntLC>RnJ)yptJ|pY`&4<@Gv*qcpJviHif61;m z-Tdz;-z^x&1GY=#^OmC)*>!3uJtf@m=oAYJb~?(pX~xcz57_WmO(UZaSA&Y^Lhilw z)kliA-7?Q)+t&x7Hm|6|{+;h^=6qXKd-t!85k~ z@QbfdsOc--@ene z-P6?5W>#kqKCfybeOeaBTHNNaP92WM(84>-W0$e{CQCvQx!vt?R0bh2h_5ek3hlnr z7UAy{XoT!pU370Hamd$`ho?Wne$9XNhf(aBPSseAxdiLI^@Z;>`NFT!tUl)7h_P#( zgI+P+smN5`a&oW7;UJ>eiKh0Y6Wv8-{6mEGV85d3V0<-eQJYhzlGRzLLbjW(7wg1P z@E`GJHO3Z^wzRsk3+Us>P;3F)=}7rX4MKoO}AC3E*#J_w8$f>YCBqk_UPwz8}Fe&ZQV`F_Aw{1;-k$!{D z)3U!4s7J4;?H>`tD|8fkCb5g}VK`+99j?s@Wvj$ZZDxE0j7>2bJI;*8LvT&At|1W> zp=Gr;AHBTKh+}1ZYlW>$o`+KfI--ia+RH5A@53lFg2f>Fd{m~7Qe(Wa-akG0JwlW+9^gym_XKz- z8;6hZ#r5rU?Imk_h+@>|#9j-ewem`Txgw1YoQ77iaZWShn~ImXy&m!!kwtt(IuyuE zY-1|Y9qBY$s8F=Vk%$NSlD&))HtoRX3}>?-y_8-mLMHQh7}bLKVj}nT*G&3K+6cMlQ%qJP6Xs+D)xT(3h-RM{l1eAyI60?thvu?IF+E)js$ip!Bs zwJutzz$h!MkpL{N)~sw(D+)!7OXS#Tt5Hf6l+|9q&-0xE|181#>f}MlODPO&7S>Bn zbhzohf@Xc1!V^NBRLJojql5U~cc409*YiEPSi7oKorQJvsV@6B;>?1^0siyW)SI-q zicGvtTUW-!)^6gZT5JNA8~PryZEf2U9%GL&3RNjP+FB6K$umTT z9Bx>da>ix<7>}R@w1i#_29$3v;6|sAp=7VOKqq2wm_(uC)f1bIaeimmb z#%3px_FnpR`ne+V_d0nd_PWp6=!dL&X%M?Mx91Q6h}YV*qA%8&`qbt!y;j@B5ZMST z3}-p=Qr)4?B~qOEnr3ccFfzGPT#4854XH2r5o~D-q)fy~S>tgNcr%RGb%eM8%Oa)6 zyf?aX-O|Kk>U%n2bZAgHL0wdytiPLeLr=ae%v+ZXfGPDJ$NGlv=>G(m16_mDN>Og-(2wSB;hW230* zlua5@xgrEVo97xNi1>4x@O@a+A6uPwd?|sOH4pj!N}uCO6CZ4I3d)=vdier#0ZqF4uHrN z<}^Bv(AlyTXgGLsrrcu2@njjCPUqTjv zO8d7Qfn=|zPcvs+Mn@58h;u+dRt80ez&;_~S_iihVZPTNO&8CMuf6M@8|07UURoVg zZY&Bbk9P+9x(_P(k*s{r{mCOC6;x|&L_RBs?8%nCROUjeaFPGK5Q5a2^a7L)Ba*!) zZ9W8s)FXt&qPD0+5$UN%_||rTv{k6W?~8G=xJhm1d#32#{rOzhv4Nr=cJ{BmwD0YP zIN4;f0;d|gbXi0}P~W9;3&oys#@bU~>LtAeYdzHsvqEhH(gg+b$<)ciRryYaYR|Qeh~f^9;kgNZzBF6tYrp$ zIX(te@rR<k%zG{;t#3|!Sg~R`#L|qqe;tc_K;jvf07TUf-lNyzak?@iY+D3F5)=1SMcyj z^h5D}nE43bOBe|iW>%Lcf=y*X!60NGf|Y4)J`7a}A?Hc{_6Ka9A`UN!y~Z4REz}T4&^Xj0 zloXwDQRRvE^_XjIrCibi>4%S*!*ISf*^^@&3JW2|`Z^pGXR`0i@S8R@Gw@#RlUb+z zM4GhWVkKv_iEqfOF*vFH$GVbY_gjse|BQaE^ELT1d+2K9!++=c&*N5a*7dP7A~MWPDxut8o7VSnLmYDy ze(PYq@AVYqyScl6MdQ3lq}48dCU@On-llVjaU!{*T#jy1zjX7xXiMoL&J-zjH-nOO zu3&W@XDXq6W-;9=^e1jGzsBF3l==DA>+xgfEegIl=SQw&?N!jOmbqwWuC;uV}(P&<$Qga~?m$t|)6=K)q-}zF! zloO)mWE3AGx=>MCc!y9Dyh%w`2aRCPb%sfme0f|cnFeWA z>CG`FjX}>cbLdjCTAV2+MDAc!z{?t&>r4;TWa~p5KSeKih`gIoxqW2sj!W@@TUWgi zylYs>vd|~@~dl8D64J)ZPj?9wy~QoqKh^03i`o+A_tV5T7T~zy7st{>bbhG4)#;RZoKFv6mN*h}5PH zzY@pvTav3Xh`VAFN;@$YyUw^#7E#pH)DoBe1Ol456osZ6K~-mOq4fge9{Qq z0OiJVBuM)Zws8tr&oK7U=)y^VFWfpa{$tB`jj@YGKNKOUtL(K!I=id$W7>JveP<9E zptT=-YTdoWrIHaiMb9Hc@Dc0>bPD12iMZ`ixk+og61-5%2Ha^Jd=B3vgmwFhV(iHk zTs0%~#}8xQygftr@h|6&R==tJq*rq-rqeBLecHdQf}BpgxIy% zBnHPLFGjYw@7Wx|vsS)Nl|B%=WWH`^aOld7ggexouhEIi#P@Cfq87!ddo5G{ewTan zgt+9}Kbnu|8gG);TJtd>gb^J2GAFsd%$MrA(FQ#{q=|un+bD1zQKkF{b{Rr#ZvSda zz|+F0muR>*$uni?l9qXIZ1{Ejk@fPsnkd^rW09_r?);dnjB}NE#wzzb_%!Oq>+N!v{bmQZ9LR$CPJz9|lzfKDKi*j!nd#}R!d#>ce_0v-8*@U|{g&7a0a zqF{7EdVWt?gcHhjYRbW{TR!53TTwrJ!H=cqi63FSV2~f*3_;6rZ>{ny*XlTKSt;0v z7~O~YQ1S7tQj_w|nv;Z8`bd04OyFy|#0#bu#vS@0oEZzm_mOw^ReriEYsKfoZ*P&j z@%YK;SNRP;3Xa%rC}mdKTZhNp)~rU=;-}ym@$GIV-w|9EQ)!d9%~!#=)fo-Uo!+de z=#5^9im$@!=!)cnE>out*=?hY>{}T5Cz#%nna8htR^53Wn(jzIH^uZDBiOULL-#=aA#SX5<)2~Fd(|BR3LGJk z^Q=??DkRwmBmw)07>QF;d`&U$9$G)-{s*(T7bZb&+Z>)&`#0VZB|b&;MHH1Vxy{8vyc-Foqt7*rifukRNeel@bqjR^t=pB->SaFYFU2458 zy)FE_v1k)=oPkjX(Ar-2j|5jnxEZO==F)URyn7$)j@ro`Q7mI|K2wPG@NdT)+HiW% z$FIQ%-$=N=KQ>C<=z1ArhmPc0XBokyd>?ZIo>A8m`;6Pu0vUmArVM92{fQN#KUkdC z6xqr73gWe3y6}eW^Lz)81pynb!iFwQ`)rlp#BuiyNw(eS7@885NJ<-=XFbsCQtXQT z5HcWP%`D_wPxAd_p|Fy94A%w|y31r-DYhI8{|gAlR?3}A@FTLZzxba7`>mfp@`pnk zH_x>Um(2cAdg@AJX>TCQx^axX>lgV>aiNRJ@5_hSWJ8WaRO(`LHFaWFGG%SI9w+|E za!8Z^nupYxY(X6>2CbkoWT>x~ikP+E%-*d?fp zqVNz+uIQwuJ_t(0(ane|#Hey!4pl&;28e6Ufomamgqa`lB1! zdR^oP#f2m1_ymZzM&{FsR>xRj8%qB1-s@c8ul7!%?_KK;U!Q%Rk+5F;L*8%J_HdeO zR?|O4r!RV0eB2o9ER#X%f+t{8n2MvdU8&&|WGU{<+(vJOQ)L*HlWuC4x3il&k}JXdUPBN}hU^wgZ%xFF0@&M9*wA^w_t(uo`oqvi z$5IYP3`%StM>`chnudP*dbT+LpITga+%&C(U&Ew8Inux8P--lGz^!|C51bB@JKWwJ z)0XGl4^H%3dyUwT2nINN+`yZY4nW*~Z|08)^()JRH}lgnu#RP-Q(SmmR+h6v8rX?$ z`upWu_|Wv%VbTY_9A)|@FdO19oCf-%p)3kFKxWWGDO|7ovvB15@Yt;@M>Z{byLr^Z zhf~|Lc3)jT>*}J3^M+~qr&3^D3;r(5%`YSO_JU+4HQz4xS()Z zT+OAlF}^3{{=|b*4}ARfyMYy}_7^53u3H*DZ!yMni4?fwn7E3dTf_WIg!ERz?FNJ6 z;!sP=7Ecbi;8nhrtBw+EeZfVAiywhS=Z{@2?5RGHqJ$zZrsQ02eU0zSTlbS?Y-q=)}oX>7!YvkyExUJp-8vvPj zKf0tR-sT^J8{NN)ZfR!Xoy=Tr+-;C3*0JYQi$;}?%3Qc)>6794Ka93E4q?Dc_OOql z(V1L(KjO436wZ`T_!GDm-$cL>A-@;aN#@%D$pL=+lW2ayONiRWp5XYEnZJM;&JJF( zZvK#EO{3Z$4&frgTyB6v8I^+B%6jxzqz`QI=an)2*}yG+DKCfJFrnAMe_LD=9A)sL zDls$}Ehn)GwDHeL`wzm>eY7a;<8S8}?`0&S_Z$)`HVbFn=$dF+O_bNXj_ zYW=K_!cNz~Hrm>tFX8WmIHSAzUGd9hkgVy76SZ336GyOUW&f0=XiE~9bszKqY@*gM z>Jlv3%-}b+&Hwz~sLZ=V#(x^4;tG9OvqLPLC}u+yik;;oh)J)He#s4@tWr4;xAEP< zvtINUURbpa99BXn2-yxL+o?<_;v}TAoGz8Xa^jN5#&+9UF)|Z7;pXzG)9WH@ ze)?**;`M)~oQ#%~{91i+-h&TYSDfkm*7^NcJ5PCbf!LSM9S$O$C-n;yeSapN;ewjJ zZ9&`oww(&`T8lEN&arzo836y}t*X3ElqFvZ}n>&(F73u4$d=Y?+aI z%QF+pUyVyFq08gR%Ko zTN_5}umz32Jj|2lAy_NX>Lca86Clb>PNn|QGC|#HB?k*;fP@Xnh~ha96l2c|4&N^c&c z*b~|DMf4{M`t=k=^xldU5>M!^bHj3IAy{`l8*A!Z8RdfrA^N_pA>LKzQouT%)Te5l z)d4r}4*rrYit8(k>KDN-_!>Yr8-Q(eH>gXHX2fWCJXc|!)OJF@`^wH7h7-HmxMDZT zSDhkJ&A>Kt4-`m<@sGDYh~C(qJzRj1EaVus2%i56nIsE2s{LD+{L8|+t5YnZyk z{L0)QG!O@TzvSI{oerV@wgs;_mhx>67sim&eA8w(s8JtN1`CKGuC;V?Kq&P;CH52x zLG!V5Ey!E@=@r*`wWBt^TmSdKKd0|w2H$KLcr?p5H{dr<*e%|y@EHSk(_vQP?|~b` z^_mLpDQKW;hCQKk25&}h@NU^oQx;O4fHw*dOklR#& zh@HkJt?gR9$rotbqkAHc2n%ZsYKz+>s%Af6$V%}8%xG+oXc?UOBd4ExBbw$xJ=hbju&J>V36gI8TG zIV-inAYaPz?M@L=_X)3crR$Qr#yrI+D?r&UsK{7vtRsKoEV-mxQ^8Is3#D2v)`6&( z;<2UTRP~q{=#4k%#g|4c;ja(X@Me{Lg4PVYK49Lz$Gt=k(#L2imBz>0^{8i}1BABU3DZfFl)nkTLFF!B^SllvQGr};a?5|W0*{*HvKBL5tVe0}9#3bd!6NoQNVl zpu{1!XN9}ZCh}AHHn!88dS8#zF7L&L0e0Tek^5x(qWl-?{pw%ymY~D#UZ6Dt)=6JT zDXDgza1AF;%;&_|@7^*mm1q zdPX0lfK6=STJ8tMI#H!E2+KyiU4jR;lugQwid0cA`BM-U!B&J~lhM>N%~NWtOJxG7 zK?2*-YWDk@|EY|(n;lX<9!*tSmc#Z01Y&(;5(wpC z%|eX%6fZNxRim>(Tt5}Mf{_Dua%%CNbvFv723i4eJr?PrXaaLK9=du|V zwgtqiWW*S&5mtuwI2~rQ5;P00u~!d^DyRfqy+ui*w7MxZ%ouFY8RT?22$i9n+V}^) zNeqfeP4|&3Fr3doq}=+KtvffOB9b#-kE0+63qc}LP+vmQgFz^->CwY4GBF5G%NBC- z?OqV#_WZnd4xUQJ>Xa?&7NU#qvFe%ZwFi+2?28^b{m+2s(iL%5IM3Jq-vNhk16EFl zho2;JIpx!M9Vv;oO~zl!vK4ZKO7;Zfd|wo4sCIn``%?D_zyJXrhE!UW_0mM7Oh%K- z<#?4%u9!oQDIYKTKGGlC?J+x!#9_5{wsyZmmfBWfCJrM~--lm{!xD52@MoQpn`j^D zaMYRQmRHnPa=Rx+&PjUW`$QUpw14V9)LPph%oTN!4zmCR$K<~hhHLH+7*_$vH5E1; zHimup7`FX1v)QfALa10daf5EpvgCjPAED<`HRepFl$s2qKhHk8H(d93@SU;df+pCU zaJI8=g^Y2b`>M`*Vw}O{qWNr1m(uIyLvMpBxTpV%;PwxQ3vV&WI9Bu(1TwFvDw{!` zAqw$Ti7UmI2|jWX-_X{e;sZVNg4*g4=r}^5uB%Naf=-qgV2JWeKDFIb0IK3~PC~>H z6i%Uj{MQNLE^Uj>Aiy^v;pj=ck6a5U_|l!W90Zn};Npoz9D(MMQw}D~3)5co)Yyet z#4mNCzCjx$Tho*5VNL2LQIEISTLYa-nOt-biDfmQtJKzEm3)JNKLV{)=8AUFq+?73 z8jK?BST4m1P`wt!OVx96WoR0`5*Uu<=q@fkx}Bg&m+(U{x6@JNP4>89PvRjIq=_DB zDVh5mk$`s!<%);g&iH=LT=2(6Jp7NOl>>z{qXzGWIJ_{)C*i2Vz;XyPT6g zKVvPh=Tl&m;4L+x8#`T-Ijt_)RV`NOEAdXwjY{bvP|vSI7ZOy$m$Fv3iRekxDLY{c z%ory{{yfoI=&m)0O_6S+MVN(nW97ae-+@(c?0h!5;fS!>_8mCc(m15XZ?nOqU#tL~ zA>J8Vj(>r}4$CFI@wOPdL4HKM0v!g18WV?Cz}mvRK@7dzWc!XC3q9qEEcNl8RzM7pUaVL4>%lSBq~U##8krDSlRujTVa5WB z0Bw-%p`M6UHk`alNN~zSst_q0WFBQ7jcFfx+7BsrkHjRjr!T%7JiFfSAzhJmPU&^n zFSjO^gTmOPr#ZcH5qFA?!};t=G8P?%@O|%td!so_l{`~?UtTG`FD_Sj3}+0Jp}{Q& zSfXDhj+QGp0w$!dAfm@zg;t7HFh@?vKThOg4@B4EZBklG*_-yGMp>)cqzB8o27_CQ zN(wZ!)M0)qsAYX*ha>vvlIe5T%+XAsr)h7~t98)~x6(nLhk`Gu3$&J$p2EM!YP->q zvRc~_J;T~BdsQtWM=Y5~UURpHQ7KNNUGB{}!%U-2^8LAu?{;U3H+epTr~ee>%jTOb zLJhP>YV>8HPGk2h+{(%Ld5pmU5}~gUQ3=?y5D{#V=^(cX`%_6KI~oFoPF}`mQ0hJ0 zing=?7-DgBv5$UOmG#-xMef-_4lOy2Jli5FJ%Hv|7VLF5=cM_}VFGn*hi$FrN1)u%BF~bIr@Bl)LostH+8%~m*&r~I zCF~dPj;|acKB%2TX1O28$+LF%B#eEQd60-)xKV%`i`Yw!v3MBP(Nje7ohNj&t;=m6 z_fAGd>64rIu)sNR(9aUQAPCrUBCh+dMI<9HYm{knPSm_fR@(qIVC`LwM4cRx z^JJt9lx}Vg-P$T~nLlKLDzU$h8`4zYA=zxI-EGSB=l2@B<-oKY=Q5qck;FdQz9wta z)kU)wl$#sn%~HvFQXVM01=k^Q@8|EzBuHjcgl>pO?uD!@z3PvoS- z9@3XsiKNlLBQUH4E~F)*vGiol%gl1N@CVxjzOLAWjBN^+UWf!pm&}2v0ye zEJgSTsQ)X_U0~D#72mVneT(3N0_jMgj6t^&}CEqm#f!^(?0&o--A8hLuf7YiYX&T`y9Q0hz}lObOm(>k}9fks#It z%tmXQMcL#A;p_iG4^6Rs&K~#;PS{oQ{fU2JrF4y4r(oKzc;{0Q0OCXf9$^wXjOEw} z-=TjDsk;(V?=mKxu0iG>tvq*V)3%K6z;qqewD?Ylb_*%Z@{KubKX5@7M#VV8I#SE1 z?Tw&URq2oT`|~5ypY#JG_R9xgfZ3qVa|lT7lVHT3y+9WO?pLa8l9wm~IZ@sCrNN*# zh|2%j_au(d7!57CbAe1DcqBJq(QCEoBJHxr13VE1SX=~Xn8!f?mDAIx7^Is$4AIJC zb;ZyI5UBsywrXTc!p_E99kq?l=ACy&utT)}LPczJ+S6aZDT}F9o{9uyDO0Hhl?|lr z{2pgBQ3{Qi<7b!?GFN_t)7c0coemwt`;a|~8bI~4Ko_^R*<6l)i1YD>d_x{tV9?X( zKU7S=xADOQ6pR6?v#m-XtO`Kx32)+G3&ssnCXz}AqxM%6f}?#8nINA7AtsNnY#eSH zlOC78ha4f^kG!Nedm?~w&Xp8Bv`My-aeYY3htVDXEZqFw7$lT^C_aLHPp0N80{B5- zyT1`5`G6s*GVl%1A%tN!cl8;YMCJOF&=%N@y)FYlc4mtpQ~VQX{>m!ltCgEU>61NB zShWwiwJxPzfE*sPQ4W;Ka@@vw7lbs3WvrNOb(_WPTk8*%@0c1EJ7-dj=9usZVMobP zAU=KXRCu3X9BC**=k$gkBP01}3x_C#)61Q~oYobEB6JdL>riXEP%>#xkhf3~;9HGO zLi@#c+nYF&zLdU6pLJco_ys7-c_8D$9)#ha&>TA>Cxay}u9C4@bOxYgx`pt=V_pNq z09%b%(xR8}y$o!%1j2wCO72j!0$IQK)})i`Z#5n5K3H^5SDvXnJ1uSwNPW;$+0{{c z*aCv^DIAoc*u}s~frA^vI&}U1lRF%TgjgjvB;v5CwdHy+f~zPzpWUD9~qvad@n;d`geeo)03&6YYJ-vtSse*I=I?QYq!b!RYN6p;bS@Sa#Y zLtUQNq+l$G%hYvq>3O}`d_RaBA24I3wZu^7Tr<4PfpmSRAIfZ%16tb6aWQMsPl9GX zfi2_|ojG(T&}P=ABDwliBA?K};q_0@ z8D0N%#`^hB&mD?s{PLM}f_^_=la^)&ZhdE&wL-pL$gX@Ad(7sDwF}_k=Q#;Yx>zm{ zKV!L`V5TR>Fw7bbTigad3_?dXXG<2KgYtoZSlqv|nW9?0A(jhDsV~Ku1jH7@_n;-v zh9={2d;=d~EuF1Q*}r-UC^kV2U;pv*YsGhicZtol{p3Qj!&9U@h_OyZs3|U6#tmTt zP>&BT($I`_u5^@{m;@m(q~{XxP|ab&kIzRd{u>iXLjyF=K{h`u+Jy87GO;ME7M;qe zBqKO8^w>Xx+PSwsI<>>j?sbK=2r~ig1jM1CQwAX1AtF^IC-~ZI-{87c;db@-i4wG}h)rVpJi6W!^2hlV6emqxntN4kwl(1;-iH!g6 z<*9iBCq&J1d<0slyt67B>Z&*ZrVsP|eSkB{l93sxtAG92(bxk{)B4I|wVwpF*26Vh z!Ih2D{s=02Zd2=_UJ=k^7JWNEEBn>vHzuwe9Ct2n_SpbYS8X{NfRhiNS{}G^`T51r zV2&b!(d$BHfxQ47$sQuciE8x{R~f*IaPZ)3K(OcYBP$^GsXf(K=(DmG`ADpm>lki) z2;F!%w(%JNQVbSxrP8tz7DxlCNhtyxnmaQZWUjc)qH=H_sP>@(-!SSvXYi%9_KGL& zH<8se2~-w{?#AX>G{*{*g9!jn$}zP$#$|>WZj%6LhmHbgQXz;d4#tpy{=^RuDM3>K z5&=XEO^aKghj9~!@C_nx)rU3}0p&dLJ(AErw3JlDrnT6w5&jUlnqnQQh#oMGdI&BW zoiYK7@+|}6VG!IxxHNS8$on4zPv1Y^Ui&0*+Z-~(-8iu!0Csbf@38RBqEpvi*msuK z*>{@vIzB^(p|yHf6o{UAAW(DiYksfVG8WEP04Q=0t`LeMPD%3zvH85EojYC`VmawR zOO-qTzkqZAJQ9#asX((=SjU23+!ZE$&7}_aH7HXkhrNK{N46`jW)E-P@y>hWJ6l%O z+8drE9utQ|axC3AMH4iCg^!hKwM8Qn_4H=3=bB+GHqM)?*v}6^)5#^Ey{vvFc9~j* z34cBW##`ZcmQ%!>jdC(4C%DA66q%tlHTJuvB}`gt14cxA1n<;a+F=ye+!5SpZ&I_M ztQif>XQDHLg5oMaqQ~4FkL}_LMLwfM`-!dt-oE~GH>aQg7HNYw10Gr zzB7kpJFk@|l65%SmkH2Kj;5t8Lp~c=w@t1^R7&4YdjTLgb(-$onNCn$&UFe`&L|c1 zTQmah7E0D!;gEe!;hjqvn)!XIGoZ10tIv9>(IuSi*vb&6xk=zVz>CTHi`$@zRfFSx zbe$90E1IO`6B|C_G|J-%e`?y>8f{}C(*25Wg2)!=hfV~@un?yE9&Uv2r-B1;C-V&# z3OS>YbG12VMSu~*{Rb#}*)UB<)ce2!i252hwG~htSYUVbp@oO0ZJqJn=m~Se2RiSn zpA6BR7rv!!iXbyE?poA5$Ovk2g)&3iskjT9F^K@b>gDbs7rnNOtO1>tsP zzuYVUh{5h`j%`k)U@-0yzBL~f{3n7d6N3;)6voN@9z}czME{YY>kq~MCk!^X>CoJ5 z8IK#ay{qrJANXFVwYyR1#ebk#wH0ci5wKua=$pM9s10a^dXWu{OM~LX^d*OhEarRm z+VePc7jS<-b$h60@N`q5PMIe9ujo1!3b=%Rd|3_E2uIQxY_KB<#C0F&d(?t=e|&e% z$oO?{Zu%3JK+rz)RUVq;7|+60nzkm(GCGBGv6Dom_Fw5O-~@{w`Lf`a)JJ&9j%%{Z zgk_!`3f#H974l`!NBgr-@+%UXX6%6`RSFRW2i;|y5)Tny2i0Z*K+T)fTRf@;FuAZM zw=ok=@7)S}rhI6A#lj`;&HiiYy5Z>u;)d$}#=F+qPH_^-ve4X;*c%Yhz-hL4Q|txY zoe=GZcqnrop4I6nY6#^jN9t+#aV}Y{@fJU*>w%K+L0n%xq%YVISag$ICF;ZB`dJ6a z=5wJ%vkV}H7)Mz|PduR5z?~Q^!C-?+mK+3a`XF7tfr#`O z9AGDrQ0wOf1Ep&Xx4H}9MMZ@GQv<>H4L(9k<*XQMgrx;^Zy629pR5D;IBU1ALHyLF z!gIN`kR+VJ(#z2>DPZx`^YcuT-}dcw_JhP zfAIgDTZX`)tUqes|Mcj2%gPXF1#D@L1s*2JQ=#gRBWC)<01SxJ<5fnTsvrP5yR${Mb?Xr`HE=tsk=B zY40?8G2iFDDKRF z_6nG-dYbchE+Bmd4mzPf*c3qtRRFBn#r{Qd<@hG^Jr5T&`3Lp0EgYUT&$7Hx@Z@Ii zdnCuQc;flgiQXN_&-5dR@8O6V119NKLh^?GadM6U+B;%MAwbfj4`9;&n-o;HwmEnO zJD162az%Tu)k83_bccm=-jpEf1hY&0FB(_8bf>ByBlI)sX*|iDP(8mY=#6=%X)5tw zK=qJ0F)_6^$f58K(fpWeXW&c+D3-dz2RA#n-&LMo&H)LgRxZ0Hf z_mTRga0rtH0CjMW{T}LQjwW$!;D|Fg(n%k{;jRoW2B<*W)&HV+DYOLGq{KI$KX-rRQEveMYIvplQ=7>b!d{U(UYl}DFf({!d% zS`k$ZmmqS$g;Nn|5BI-41gmT?gV5PeU_wa&YY7R1eX{)BH!Ifqdf8iCLN%q{srf7m&KUIzz~)^M98>O95RF}jEQwOM zNCo%`Jl<#r5EB3%?nNtl_X}FynGUE(_S?O~C;l)xxpC;~dwB2p&}tFelh>w9ZwX#2 zDLRj;mB8+u?+C$nEUoPchU*v91!huOFCZ96o@?B;r9LHqd#Hoz7;rK$pcDuLG8lph zQnvH~;_xr7cz4Z^#T@?jWV)sH2mO=rbdiYZq=7(;O1lO0$V5~n=TaEtL?uKg*pzGr zPRynt&-VHvh|d{u&~bwSNUiT! z-}Q5RAz&?^af>U0{B(id4Bfpj2n3aIio&{LiC?|~ssunT?gq*Q`W3~^eKq?Q)_7^u zk1bQD58n8nHzUfIt_va?&V`ZxgL!&)d{`C(zGc#Wflu(p!HkNV1k^dOkP83{W}wd@ zrf|WX0do|;gm?mHIaQMf5xOH>Jk)MZG z{}q?KC;Hh4R%4Ti`vJSJRja{Z;J5=Zi8vq{ui65TQ!;B%rdCQvgK2WN z6*yao^2~zkhZ=}85O^Rw0B!{3FAO9H;FeWm=VlLEe`xVL@5LTV*!o8654KNza1ZJP zMwas*LvWG*5wHwkJ3vl=1K!dI%pxQ&=4-IM7l#PA0HlJN9Ogh&bI@^4UQvtC6$DoF z7nkxmTLsUSbA-uHSpAnkdyeln(0}-~-!TB|^aylBT7itX_%sjbmSbF794cEldfNLh zesH;jVk7%$$@Z`^0Eb4v95w-?!x`y+y#{D8aG|xHDfIe+MQ;Sm&DlQWTaMpLy}Euf zuwf@^IJa&Ermf8hJ~yo6!8Zwi0+0i44f_LE?>@GKH$mzK_Yl7XvJX>0;XhLfTx7S- zK)ltT$wz>vL!9Xkj!Fo5wWZwp1Ae&5{Q>2eq(c7#92xtuO2D@Mn;zg5v721LA%S-SM)<1V^WoYi@chwa`OD9E6U?r@{hECC}0`9PsKT!kikAEOU8{b)`0TWmb z*@mvDtnDd)!j!u~1KGWzwglQQNst%d-GwiYpeofrb6F0I;n(kuUmfV;qSa(C$C%M@ zX=*(Sc-K@}aUofQPK5$$%dhBg5COP5o?#^Pn$`S5h^>eDDtuypAX^T0uf-xbudT4= z7yt)`mSYyz{vG4Hx`r$-;_$J6cVmw|K6M6~Pa`G0oDF#NaN4Hx;7s#QXx_~DKGK9v z1tc{J@k2-8JsYmcj1VGr@Wx~7X3`&?otcRyb*_~dDJE0x{t(Gd#hcb$pGywCL9 zb@#SeKxaC?)2F@gz>Nng{qfGTJ0pP_icr8!@iW{^^&FkwHVl%1^Rv*j8V>+&Wcs6J zaXYjSxg$iblDspaU`zV{VK~khIEi^W0rN>OPFkC!eZ2e1ED_K#`QmN+Csu{st~u74 z|LXMzP7c=bj8orykX{sP+M)%-XchqIKgl%*vNX0=?c8c_4-e9SE%&dw;TM)=xslashaXh%}=ero__rw=cBJA zCC5C<9XUl+@L7f0)}%G&3Ge%ofwA_u)VQoORc)+3CJU23mpY}k8tm|j(;FgdFMl#{Y?|60uEH}qa`R*O+*i4S#`5lyd7n$pCQZa_p%F;O1)mP6NL?o`({vB93< zJSI*zm-ql2t4rr)DqDh@fh6=SK=CEb$43lv?alj)5O9T5mKD6PV#b3 zPORZ$_bX`wwJZ@37Ac*2vpldBzH9N7b8YvIfQ~TL4prbz{Z6??XGv7yA0mV{7b_X` zTb9EA&5?ur7xnRu2HmY0w2pty&D$t=XZ4Srj$Z@sM)7%0cMz{-X<1)f$fuLuxbeoc z#aDB2H}3@Dch^+E^Ll)@hZGp}fJ2Z1|9zg?0bi%A$v7eHmIYHuAXW$6-8|s;iP9`d zmFzk7V!(Ba*eIIMdnMjg^vXTy?h7;M9NrdXOJbPo)vKE}Q&3-!3cqYnzS0)@0P*%M zaMZM!+xUn4&h6lp?&Sf!RPlJ(lk#<+Zo~Zt@E7{u`+%P8w=R@@b0d4+?=HP%z}4`Q zM3|rx-eh|{U~9-iNuuPmH10=W0bJ@PTLjONW%tC){CSaH!+@*uk{1Kse(TE29Q_Z+|B#_{e6DxjBLfgC8=FQF1`QI0GhvxG#$Vmi5H&O3rc>hq0Ip3%St+F z5)aweAhz5pF*`tlH;9tl#WEhl+lHHpEeqTL+YH!R&6dIk6GToy_rti3hy+CSLy z3+UL$G@iXj_kR8Afi(lJj=D7HYB9mH@V*V;-L83zjx0}Ez?(d5lqo5Y*GCow?JLBp z2i=X}P>L63KSs+7_S}!Xt_pWqyByJ4-rl!La~IBiqh{crllCQtEDYzl29&hu(YS$o zXxWhIZ;)iupvGbArZ8{s+w2jhi6VHVyypY14!#)^{60PKgC~u`yGrEiPci#-P5IwgLWo?k>1I z_|Un#A59t^@D7!_VZcfzY5Lu&to@CeHnR-`*5$*lw(+*^7;w96gWDptd3cQjmjGOm zMtA=qx@EZ18YCr7$@+(2v>OL5QJ1)T<2GR(1MHw4!L|IE$SISlM4d*Y(Ocu)YSgn6 zIR!d%LBmd$${?2zbD0&eL*`5G0QjZU@}!n6LrO+n8oYVX&mjwk-Ti3ZAF!^)QP(5hG2r(yUC<^70;Ze1$zd;J!Eh-{Jis)05h%bw zvu+1Vx@EiQ0-e82TVYOJfl7qX`tAqg(o%>^L<%v8Pu|^IID<#O4Y=a4eF4Aut(zj+ z*S!>Am3OW$`sg;VRKu%TdxILa$HtJC&GKRU_*l)r-T?qM?oyWs(}>mkXtHVWDj9vn zD(pTS5sual-fR%v=2;!;jRU5oZcId6krjZYeI~~XvEDqsQx)6qA4!3}7u}T--vxTB zB(?UjMqa|NW*>Hoo*|b9j~cu_cG%s>h5CVa{eKSO^$l1WuyEXu%-|<+ya+kY$z;}P zZur0o%+w5PyJXmtfV&^i*|9BgAq#B~6!T$EF6l(2FbGwy!laSpFr60Y(cyaZb(@a3 zB)SFHw}m?8C)6G4cOCImhfr1r^_yQr`?ds$vno-eFHt7&Q$>1ftkWT8zu!m}FMX3I zM`rBX%qtnZkH4;C;5L{UrtfJR@GuD3GGG;N+A!Xrk4kv2OeHG5-@33+_{}G04C-6F z5*-0|-BwB-M?eGd1OyQWX$E{~E>!`{(ha(z*izgeEKy4M2>RR{4WO9nzC1zVt}ikO z%alE2Q6vi;;1p<-<}m&Ann|0j!&()qo812AGLY4%F^EU;lKl5k1p}@Yj@DliFe$#Qh! zS|p}iG@kA35s$dLnFkAI+MEhqGUUy7Ch~?aoXs1@>oZ0t0r0rY?=IDi&fz7fzo`_5 z4c`YqA>Rb>m`vXz4#avB<#;ZikHDb|&=6Ox1yp^Mo(jV*RPeEGLD~PoaUY1N zgw3mxC+w2gQWtSOa_uC>)4HKyw^QV4mDhG9!E6nRVL)k4eB2 zT{3sy0<=UYmg6mtEpT|0Cm=?d!3rNNusC8J(d2;N<#(HuZ!DDUTL~llEeqh-BHMZpj;m}sK9ikqjnD|;ay}Z-4~NwCP-Y#IUADpYsGks&1|c$dw-L7j=&hWL9n*gHACbC4W@>kiw&Q1i20AfUr zKeXu(X8|m+0L<|YU0BJN^MkNn_%Bsrkp3+zB~=kGr3t{C6`LV`!AFBaos>g}?t-dA zWMv+9CjqEX)c@OXDH|g{P1vQ%Z%1b**s-;L|QgfFLvRZ`E|8rNRS4ssmY|LUady4wKUm`KmzFK#uxd1;tYng(w8qFbIK>f+eC9Bjj$!OByj zx1cDBtpskbvoAn{dIo)KfyEP(dH=JR44R?{W))W9^{1?9?I;vt8I24O(1>KV(G zdO%e(@Dh5DN63A720lg+j&hj);?&B9d}gcX2H*+YR6vP6CUL1a@dpR+w|^qQ-c*aW z@3d7v*6>ftZcr+70L+6Ma4>Qz)>YGx2;qULaR5(voRA>ii$m`mw2i>@c6FAhtFIt( zUnoZLxKgN9_!l33{ts3987qkBT<&*ka#^R0n?`L=umpJ;GLz0}$qU3^ zm<18+OyqVjprJK#6+Z-jDCgF}qHehugjo_(;p;;$r79o?06@*+2l);ImGxSnE{X4! zrtz(jH>hA8N1t&nxD(0OycgbjR!Yo*kbwg%&KbHfk^Sk~(S)0S!4l1+4gZYK?zgA^ zyAJ|%EL~$aa~~%mV}g(nkQX~;?*nV2bdzq6+#u8Gj(_~Ruv!g zELjH^3pkWEwAtl(%`xP5QjiBwR6(6Ww(ot(aCQPvcQ*6}y%dn7dVR`u zcds^#8{iK3CRUM70bfZd+yvpBIl;WJyZ;}$-aM?yYkU6=;8Z8DEzS^Ij>lF+Y8BB6 z#5q0n>Q}8|s#xO0P@vKl3rZkC>r}0#wgn0(QK>_TG(tqQ7=j~~DPTnj0s)ah3<+Zr z$iREAhxWX`-}k-V>pK4&tFWKF*Is+=y*}$+a|Xd_bz$#i)f-E}UK+~ua{gz+#HOd+ z97DEvTwO{$xTPZG=b;x;!okEjf|tk)lcC->-Ys9*YLc_rqGIvxYnXBcb{oG6(h`ep zDWYRnN1r&+dX9ZNs;8=xM~m4B8c!vY(B13Yv*M1nq6fxd$|_5Gqkgea-Bg78wtsF^ zrxZZSdXpdt90p*dSH2<2=A!#JJx(=?i$IZ{lhiq5-gKm0B#8&Qa4FZ41YmY2y_v4AmJr~Gx=kHA{DlCJ`5H^1Rf^Z zWm03&n|ZsXrGbA6OBi0z0$G{0(9D9@ZzFMwAO29wv}@$5BW$)`OP-bo6)$-cyMI1K zXl%e(#1OaSsl5SrMqA$I_z4*nhAYZ7`ip|#5f+*iMH=gdVfS}jJ0N{vd@dkqn>JJ9 zt5%eC?ogM1%saumEwQogB>X zu+0SN=x;fts4-6vT{BlfIH;@uZlTX4>HT$9*&7bo)1?*8rgsXeEHg_Sla=wT=IdeV zI`KK)iOBwaUEDIg3x32ySIXRp4%7&+jKUYK>q7b)87?kh`RKQN*KCn>0 zfLEuj6A->(qCL%30Q$(hd5TuN$$tf)lmTM3MMnl7cB?S7M*_f|D!B@PV}UsUc`F5e zihsu%Y&UkjU$698D+82D%wHHA0cagudU!`r+o*y!mH)CNHW`1u7;B1qa5DP z!E?(O@MV{cZo*n3ibKFtY_#661Tf}&#RzIlblqGD($$fJB$DbRdmvFQ#Sx5nRoz-A z&RdHWu{QDDEsegaAU@k&aW?Gnd|&&fvcalS=@ zf0_-y%IlL8ZJv&W-Wum-i!fzidYi9jA}bKH1l(N~!$^NW2i6_z36|}&^^}@-goDgS z2_p}DaHiKD1ce@ zU*da_SQa1GfRt4OSv%F-ik!(Y5TQQ;-$k8+&?G>~LWxCT@FD>({GlTsqI7ARXueER zcgnZh6JYgM#zqKR6_`<5VNN92hKir%Y09*6~-bKmI&_?Xj-g2gy-sF+htr$_Lv_7jAJI5*u809TMzji2-)ij$~eYE z${rsAf5DsVL)AIeRI$*@q$|1)&^Q>>1;^lO4Q5ZV1VYX&v_G4y+qXSF$+{jqO^@`5 z;{cIm<3$TCI+(#Vo~2p6|87!m*S^=CAF)G^(ii(_tZ@5q})u zb^4eTrYD^ol;gd+p1}vt2cj+4Wa{)!V~iHd6ww|n>y=cBREKndn?(tbcQ^e z4FL(jc!pEAxgcOaHZyRZTq_>AkhMLlUPa6g&ca}d`Of5 zSM)?sib}jpNsO{T9>7VC3PukI6}E3};{{%MSpWCug&Dg#<}3BK^@9gz_@CSr@%YQC zUe~=rU0sdS?kgLHd;SnCqpA3-s)A?nF+l`R1A2IKdx+qLDpqxlhk^h?H}hT-RpBQZ z5|xR79XXa*IP62n0Gq5pJJRuGi z7r&lojnV<|W4s)8KW;wbHAe@j6u(_o zf|cZKt{F`Mpc!bK`U1eS5>8wh6;SU@cX}hyZNjlnci&hptq_kb*kU;h5xc#dxX}=I z!rSxPicg6TiQ$ZJO)Gd;=_tIfFO!+(=XdW!O#x_`eO*vRq`k^TEdbId&jN(y1yctA zfU?;IUjNsW17@L5>oZv!lR;O}bhAOj@lZAc**JUywyp699P=dU4lyI? zrIJ6APkQD?M&zfW9V$VEOPU6@^o3zQ3}sHl+!Yh1?FU@#H#II7NS%KtDg7RXBb>h1 zdEjG+6{Ts|ew1mt!&iuOo|a&KH?as$bxE`uWA3(y)bOjK{$45WwiK++xxG zJ-EEPJOrmd&WV4QJfBabVWHZQFNdPd`>Y>Pkgz@5EcL z$9-cOi>(GEc)}o34zbn9@^FQ&CRfoDQ)pKYrhyJc#{Kz?!O>GdxR!(@F^~u+gy?ze zeN7W@)9*C3YT&mJ`-JORWrHHGKWgONl+V;+1s6$RU-%?7?P{S(3bM4y{0<;n!!h^` z5NenaIw-_=3}s-fXNmj{l*nkMpx@KtjcaQkUUvGf;<9?|$qIFaalG(V=UX-}*}gJM z&C`NSTW-!atQQ5fxg++B2jZ*tYj54J?~2m9AID{*1Yaa)3)qwfgO?-Cw08wkBS5NT z0Ktr%f6*00`eIaRBbS6o;O4skGNahy7?6p#ff)S#0k!c82K0JVoT!F#_A4#`HTb+0 z85T`EvEfHF);D%u1;Y0I)y;R^_PjYzdAs$#_=u)+V%%NIlqVzF%=;v|Dx&I3fL{<~ zB3cdSDq*CkpsU~=kWJ*U3rca2ISWcuYJHbfE5;|K4UUW4yW+2ozti+ynBo9oP;+KA z3I#!A+*4sz_nKB)BKYlpufYuzsIcK=5Q0z~$@r8?M1A{^1_2Bvd2_Y1{eTHP6fs z`BP$hcYcjRGKMKFVf~$Wy!BNeQk* zyd5x9{7X~@AW;h~9(G^IIn708k6`g-;}I@u^Cog!{TNOSd@`&MIchjPE=MJl4Q55g zORs$mjs+!+r23=Qg?rd0z*uaTjoMb!va=bx^amVq0nY>!pP)wkA|4dhS?`cBfJ)pvkn4Sdb|ZwsjrfnJOU z7nE_1|Gw##>1nS!tumIdzT1pa4_rpBG2kE>D^uK)3&fMI6S(LEp85=&1iW*IEdnJ0 zxniNHFq%uuH^hk8VeTY?AJX>;w6Ne7vIFh^myiem#Vw0i+;9(_-Et zQ3{jQ%+4nKtUKSuiY&nqS$m|~4H1*j%bbFI*cR;Hp0yKJIxn1bYQjPXUga7{#?7~o zI?<2Mj&*2b1X6X@ejcRwS{u>^DOqWUWOcFj$R7+O;=!PTycNnP4aNZh(fWB7pr`N* z_b~(c{`V#1Sb@?>ag4iBSPuTA9D$!9NfJXLHQC(`*q!-xCAL9L9bP$l&Dspn@`TwD zvy+y;{d4x%2ZbSR_2*Ov#K-kOF!UDCZfjE&Kf@sb!8pa9hK#m&e0+%*H!+CveFq8X z{RFNUGOJPTqyd8kCZnJqTFb`dx=j(JfkU(;Z9OrW0QE@^ zGW=r^-qRx?{)y-TTjzaThFtLoe2QfE46YoVu$L+~Q)i9%a{G#Gr=uTMwT)i1B5%27 zOx}ZOHe}V0F4ze=W*1MGm(M=pGVSDk_Be&}c;G3xhTtG2J-UmQTfJ`&f-Pu#3>#k3 zsCOAykK>uq>0xSa)!xk{a=Q6ub-C>d?K41KDL5Me68h71vL5TrRCUA~vpRUNc0k!_ z@%O}lXf_-?I{K?o-=AGC57@8&eBi?-LRre$=IWy2-R{?MPWlQXOqapOpNIhpm8iy9 z1kQ;4n(x3@FLCZFp31b^*8OZaSKE=qIFBG(@f^oRHd0pmfv{$rL!pSl4f={fv{8hZdUwpb z!QFil*?+j1T;}hVTjo;P_nQIQz)fP5c*&82=c6ErM|>Y=6(??E^~T{VcRdb$5ZpjR z`bPrm(`W$_OH_>W(O&>sCc_}c;n!9GBS-uTntbpw0aaAI1YK34{eQehbeN1oUkgf# zhr07)IM1sKzJRX*uBF8D9JJs9L1v+r6#G9*jb{@mK8?Dw9B>^4G~*Xu30ri2oX^zQ zg9H?%Q{)HE^=knnfWRNB!5iXrrvblT)`1^I-h{xZe_M->-;Xu`c}G#i1*laO(<*r| zyf@qxQ?FJ$*%=~COo0mIeWfs&u*WB{#}uT9PP#=RbXGV6ts)h}U@s4-o_OPs4t%82 zkSi-A^`!jTO$@jO1*bL3p~PAm_Seun;E+Rt5=9g!n*e(mlsC0cT8~M9=YZ5xo`10B zU8OqaTe^#ufXjagfwtJ;8{pJL32FXgoM%E zegMeplb?k@6Ye(Q6s?rSZ6>#mpbD@ruud?SfGyjtsRV@*@3&^>#v#-a@4T8OZ*vXK zmh=@MMg(0pj&?gS#rb70iqkL(r^Aa@&kjB4fA{3Ju|63< zKwWGEB-=m;&(7Kk9j<#!AwcA#A^sBLZIdDOMzq)zcR-5%dbs6KrjS){C}rTq<2HJ4 zfgl)qX0*l7mP9;=WkNWFtzM1?$-3vff=yYCbKEl_Saz*EjrE?CeqT1qun^eDdImubk(1fX z)9vN|4*AsCaG8oX7WR&yS_(!hEud_7ZW_Yv)RPc2^OwP2Fd_JMg4BoD&MHAO72vBg z_G6~}AQ9|-9mSJyn+OQF6tBUWj3zStHJ4^L8)^=-LqyPTGazyzD4U)Vj8xo!JE#f_ z_SMaFaX2cSakFy0+I_(6rYr#mB2) zJiAd`hRX^mq<6b}K24=7BRLPxKFpcBdosvkJTg%P&Xh{Hhivp%V)obP0knQGi1O5b zeUSyxzmLsd;edig{WP%M{m_izE4Cht@Jh|jI_y?cIH9KfAMSBg4dJ~YpueEu??k{KB)Sw<*(B%3wl0>q;x;tuC4!vnp^XnkQ7z)b$J;&2rX`jI`e94 z&pxn_{g6u4#O)umbz4Ejp}7nAFW#P%;u)QNye#>~y_qf4U8v`RXZ*|loMeSI4(Fe+ z;JLGG5tXB*Q#o2WX`Qu_U{?>M%Fgto15SP1x6^936+m8W0jZFsL`KWg$^b!nw2&fN z&lkI+()y#(uqf`xlG^PBf1S}S&_FLPMUOu#gI2q53#h-q9#o)8`iTkL-tw@+04=md zN7Mv7PVY>!{%h9aKjU(KI-^Y(L{6hQ4jP^V34@G!-C?w||dPVtPn zSyJ}@*MusYJh?GWW3G=WVDz8l`Pr>44+`=bCQ;F^Ft%|1LKm!0K~Lgx6yt{y0uI0P zz@*bu_o+h5t5x1DN;Ez4(e(Wua|Rcsd=;opU&mIiynWv;V{HIsor|;qdVhnO{1Ve0 zDZNmGID8`%;%*CmmA?@lYHdwlDE5y}3fyj#t2;N)WqI=+ZpLPEC^x;+%*AV6V=Cn?;PEhFJ`sFWAkJp_7>9~Xsm{1n1 ziB+DcJAw`+x^Lzq5vUiG`WpOd1gF8{BuhXTl0A z>-xmAA0*s((=ESGILK;u_$6rY=pNQQv)jloH`vu!1~V0C3&o*BBVx@4r&q_>~>zFGPDy=4tEF7rBVc8^zV z8}sEG!mX^(;F#dndh_eGoCLuu*7?mhp*B|E3JItS_(Xg|N}Y$GnH7wz2PemzDfCN- z2#x_rQ*@Ij@GKE7G^f>AN4m21nmV0!aT7QnEf^K{nh7jo8+-e+kriceqrQCiM%}lk zJeF;>SKD24x;DNc6_RPJvdq?EokEo~!*yw(Jvsr+8h=)ht*P#Lc=9Gtgq$M&9+rps zS*JXu?o^#XkBpni^ym1qeFcECr6Vh1HBtD_8Tp>w+>r@oz!T;f*X!N!=gK!mIw{&7 zq=!V~<{YPspK10%OT z+9eU|J=?`oQJ~>F!Hf3+Rb4%;27nE)s&u zE3v<8+f7`B*x(m}mz*E#p2o4X?1a1dZn%msJL<~G?_-@+*QMZL@=4RBuUT7cUXHBP zx)Uj4ZB@N==GpNqHZhj#%cyu-EPU0)Q$wq(ceZ!1UrGD|{523) zH2@Vj@vO`DBkvz)aZZYUo-<1A^y#Qh)|aEUu=h_Y{L!H>IB?V{-vE2pgHJ$NJ{(y% zacLi`leN(TQ@&rn#Xjq;w*GO26AS-6J|V5LBYNwI6va0de?u4RQv<}*1eV{wVO4+c z8G9~B0$ z;xJ1qZMlJkT3v3_jJ^7dCcW*6{R@X}V_<@NSL^ z+E5v}s1I1Dv9f)p5?AFKi!LZe42vkXTZbe#AfsomxSnJbk!sAjIz0zO_y4`y#Fw>yMH)R`qLKStx=tKuN_|MqSTt2>|cl(Jhf&F{813k260R8Ni)*a zbvt=#V|_>w;MBe@-e(C_4h_M3^3TlYzoaAKbi5J&vdGc1u&s-?n01R)DY+@oW+^7Q zBt!tz!x-I0E=|D?QN`-jU=XxTXaa(H;#mogD$649DHq#Ct@Tt}8y#4a*mLc@Mp>3^ zbTX~jHHIY?^-efH>Fn^c1NPTgyT&*rFWnU*`exLYBJqksF*`6JE!Hk)3ev$n+!fG$ z47aOcX)g}1&dHm2w%BH~uT>8}8rZzakY3M|Ltd~Z9xL13qg$aAsC{?v1hUll(}1%| zqD4r<4npkv@&b8&P~MIu#)8CnN&Kt$1!gcZ&63P9g`AHJ^KzU_+=nMQ!h>Fu@SDz0 zsVmmmo;dX$WKCN7iXg$^KX?>AWFYabaF4J@(hss)^eSCM4qJO90=Bi)7zefM3Q#*RM8S%WFxB|J7L4 zq>-D?*YV>mshs!a`A>g01iB-4s#jY*2JgBWuI{^YyLEem_|CG>_@k%9SCy>j-F9b} z$azP$l?|`xF}>Q%idc>9&>sJ@RckW(2!B?F*u66!Dw|b;9!QsgTvoYq+Pf~HOV^*4 zQ-a@IV1Pw9P(TW4!9IaRj1>0fct&R^fLg|z1^L#?jy~ft1m&Fqf zoqeBG)#UvFBt)-`NGNMNdEf^Rj*&NF1~_b1g-VwRA||3gZz5|v3(8g?d|7Jyt9DDV ze4k~DcPam1b(+L;60}|6W6nN530E9tkjnY{EN3;r)bxxi>|G71KHYrLHOo94Jx9ds z5?dQ295WE4;3uOWBLp>{=9}e3GPAqx7{n|?^+woo1YT?<1j$@6OA+Yq0O&C5Sil<#O;%u%(>QE?_q}#0v-orI~L}+I-yT8kH6B?w; zl(8^!{5@Yp1fo}_RYky@Bz>)%-C+Y`*iZUm z>|G~ok)=XfB?pRF25CNi2vW9o50_spV{H^`rZT@edOF=eCnpqx6a*8!T{#@~04B;` zpUC%6o@&-iW%=0>>91lqYHv<3-(#@2D@ued4>>@LGEW<(6Xb}Aw5{waDsmhEPmeLF zUo~SjFB#oRB%nGh0=9^hl$S@{um8)u$?%mS0Fa8&$5tvyks9jjL)7fLc;7rn>xPL5 zPq^zERetuOgm+jryUZfb(GYb##riZ?d*mb5+swZY?N8Ap^S|lOBPBp$LW?8t%TTxR zBe*W(bdE94m4il|MZyIzW15*9VT#qJxO*D(95ZlAg zvZX-fQN0k3!HasE$kYtQT3u_cF&OcCViRw%%>p2NK}LR%tkGHUn%ZJQH@`XITXEDjm#L2!*AzH$^!jyDzq1A#dCpN$}ApvIr$RE zMM620wy(f)9;`N1<(@4W24f4<@@oxJVLM@*RXVBGc5IM}3w>6F$|m}S+foUq24l`%nvzw4;+Iqz z*fSqXSbyJiXi4%&9jHXET+2-G?qwiIu8*s1sh>iITK@eh`10D7@c4 zNrZ4&R*EwmrSJ?r-43q>iU%|8EO=tBL^KeuEo#;@g&-dzmXqT0JUd5Jtk!T$iV#dn(lZF-9Qgl!?{xP}nc3ndgrQijHQ=vh|#^HlUt-uQN;!S31+)#v8l2_&i7J&U{MJ9Hpmo8OMj15 z-Ik3Nz99WwWqPw-*xa|=8}|@|fgi-FJB@QO_EVBNUsR%S(Qnp|_-<4I^fh&dFi)YI z^vSzGcpwwo)SaizOH!JtAHaWPlm4jmdqiW+HA{t@zkdWwMU(}p(BBRP?HP0O1p79$ z@J=+gHdBwWC0@`~%k7$N3O~#~qKpAux=&H@SvL2!Y6ROF)+OzfWm~p@v3q5G1m!Tf zWE@!65RmP&LC6cNJ~S>sUIkl(iOrGp5m?wCt@ZG9M?gi^HxHg}^||!oq*lu{KdKJ_ zj&2S>KHC6%@qXY->r}aNk5Mk#F=Nt!2`;y@yQW)mQ#l{N;ZXtUNAjnaea8r8k~H=q z#=f}1XfCb^{+$8BKx}R|sHXzQEh>mMRAS4F6_HMW2h8k(n#(CK=%=-Hl)w)9QAj3B zw5BtddBzafn}Si6%7P^^Y$R#vd`XJ$Apr2Fz&TXMhkea|ANRj$H{*c?JUrAe*5!8c zFlAnU80sSQ{VI|0Pk3jcJgW0)nD9+oI*_#Y1t+TI$gu;ly2I}ywg8C?j240oNa4hH z@eYd~gO?W@a6Ggb@rn(ZWvH&siUSo937@`$zM?5YDvFgVzT6QwUfJzE$4S zmm&L#y>$vt*SGo4+2cfFNnHeC-?IS~>Eri6J`+UJ7m)aYiaZCRs#T!;*dXohUV0Ab zYrWvHd8RssQ!ec7oW~(#5Vfco3J@cJLkmbK7l=iCkFsr*XIQEt7R(ixc;bhj{t4^7sPF<6h#$W zh5j|+3&6Y6pqEIrYai-5(FG2Z)A$PVc#uyLBcw>Qx+3Pm|0gUk2&|XxVf{0NkSY8! zKenw6I=L8HfT3&}@EdbAXI{mab5jzDU4t1~Wg&tVROx_D`tSI`n`t(R6HK|R}qZx9-r8Y2%Wn?vaCCw$}o z7_86>04_*B-|oB|Hi-k`+0@(+PmX5wiJDw(haL+3Kg_j6hCpb=6OZ{uS#)FA+x!cbB&>+trse#}N+p4q)?rYa}a-yJOG7363^R>?2sP35$! z#`C59xXgKi->DLe^)&>>+anB- zL`X{`0fnQ39dhd63{HV>y@1pIyVe!`Z{#XbSS3$cw2veXAe|ccx#BV>W*sTPD7yHmBw}yy`Z)vZjjbO{*Wq7 zp;Pu)e4Gz-@GAx)r=?zRKnl$j_@vSNTm}CE;8d0bu_%3|q)dobv{Yd-WFIhacPes2 zZh5mIxxB#qm9eW4Oc7Rl6+7lNvJCnLsh#K4#2fwJttp%l5*cbas!Y&Mjr^wJu@(s1?^&9 zmF$*2L`7wi^#WaWGMS&7#4JU{%~|#V4{E!(D6NMkA62A%HIv6Q&(vIGPTo)@f6Zu_UO2OZr;@T(eY1ANkE!G z5nNwxJ_@=CH?{+MTWDvcm@!mM??vzb;C$$-R%3?${svJA9EdZ_qzdp%)AJ}e3%Dur zDj?w2>$%X_Y6ZF`u?BMT=i>=#y#cB+{>mB{bY~|)iGUYvb5K|sf(nkux{$$u`tGEC zJAR(@{HoJ2bP)^qnAcfjLiWm(Q^~_i!oSqPlX+I!(7HNTVH1j9vA$}?2K>l7(DpH74WE|wl2$C&iTMp z`P}=Kr{53)2=PCVM_GrZ7ej1eP434f!2LB{Cu2U8C4U`|3rvg32tq(20h%^4)GNRZ ztvE-uLPk7Y6>3x9ME%UfOXJK)g(ZqnccSGnY~gw+C9OfNC;3{`rJS)UaQ%k(uRk8IJ(dH+cP7SK%&x}?jBk+XZWg!$DKeb6L=GqO_W3W2I#3@d(r+@ zW-IkP@40&kn>P3G8K^}eDgPKSDkJBXJV13OOU!kEQD6}TP%w9+-G-Xn`IvE(NJQE| zOV&Mlb%D_x#C3|y4~20MheM=PkRxBxKg>quQz}@Qn;e`L8C98VzNmkD1W zz(=(OuMZ4M2}z}eV-nM-%aX?Dt(DHt-^4&q6nZQ;QeZC|#_oEu_pTDDyyRf_W<#cl z#IK-MJ$>N9ZQgMXV?{{ofVr4D;Dz?BZ9^+a5C0jQsRJ`n!llC>MT7u;H*is7Kv{51 zFO&sF{_4C2Uv&}=!r$;WZ^ZY&1_K(^3?1Y(04)>Q9mUx2Mu8y_Uh2s;o?Ox|MWnTM z^y|*{Q;tMznE9Fvt{?g)nn|?Q{hfp|;c`O%Y4Ft=K!QKvp9axCIRneeg*nvpEi|ReK18 zK!Fn%133b>;n{`9aBPS}u+=`l9$pCTXHP0Ux(^pW(~K^;nfwl6&)O*jL;nf-X{5`z zczr|DbEL-o7Sc0^Com)CGbH2U#q4Rg<^UpM;Hl|*QDGH=Vi08!Cyc7xaq#faT#K1N zN)Gi()f#GHIU5~4u)M$&_$7m=Lp)D!FA(bd?hgtU~(vji433O;Z? z1H}WH2hB+mO!n!;$EM%rG8kk4{GASZC|$e|wzc^3vARGHk`Ci4Q>~=pK1988iiOaP z10I2LNIc~el@Hcwjg}A z{Bf7aAeSUQxLlpyF90=Lv|l#XdQ^k(TAv+RteHBH4p!Aj7mXz17`+HcNs$aebETY` zp-w0$S_?6*5;ot*-jx~fga+dWIlXfug`O`UJ`beiuxQ89jiVsnc_P)t>sH>&3`S$R z2c6{hecnu9hG|~|`rDTVD)5^C-DXro-XU-Zigo3-j|}cBln`&cxf-`>uxY#5D*_1d>3c3bdjjMy$K^b82AoOLbEwl}ygtRYU z|2qwpsCXtpLjuU^n~>_k?LKKq{#N&S@aiqKGBPX0qua z`;d?-*kH79R7PapU-E_kv!}gjXUOca6f|l)1>-R!H6GfHMX=`+H3FI=YbKm19_BNj z|Fd=s7^!9$!#5mmIh`M!R`TJ&;OZ-l6SjCMym~Xc4pSsl*>RmnAK#&I!VdvkPzrzH zPr-_KgSv4i=8l><#^Oi~=Ac9AI4ht?YFAE>Zf@^*F9}CI&x(*0?AwT#BFm|-@UI(&Iy44;zPE}$ z1&*BHHcXBg=Y;|THRPdtZD6sMxE+B^GLoX}kN+VQ8S@+RPVSdx6Q>7M4Iw<#GhLP4 zK|_cl>d2rU7kNi{Sb;ZD6do{jCX&eshbGUx7xdx5>#1c8qw3xm7)AQDAvW};eAa=x z$Ws7c@{0gF;q|8Ymyj?fotHdo;yE60zsw-!sF9)+10`N+k{et*HG|aDP~V^mM(nKl znXk?Qj|NLJKV-l>j9U-{7mh;$+Y+QZ3ADje!GVeyO8giU<BI4A(d`v3A*O~nO^UM)~S_M@O;BbJ9rXxkmkIugL z)>ZoxjPl%w-w*m77;NKmQpu}3VjGnUugRKGC<0Mq9KwLP>X>`MSPSrYH!K7Itqk&$ zjQjLmp~T3sJHUQoFW~?XgW5hu%6@nqVFs${Aou)h;u-*bO9tfi`FvDrpSA*?^TLsd zKpU4o6mP(Xl6mcsI$ij3)UHtH5@`J%-h@uj)Fil-0L4d>VO>E&Gy>Uq7qmJQNeRL= z)uHqYqZNLKo%ucr4&Y|U+M4eV@o(pJTkPXbj8DA=@rKAqAp^X z{9uqpqPg(|amwhXiKiqKVu_x!r;nMC>GYs*6bgf)a~mg{KKjeqLL%=LT**KABkSi$ z(jbfkc7LDkg-w1X^GPqB8*#>$0twC9uI~$Rz&XK1BwI{6k3g8IvMHH?aj(5xgXl8lM;vHv?(@bMrxF~$EiLf;;$OiP_*+aCZ3Gh+9_l_+tUvS@|$qPvOi zZ2h>*oLI0L?(6S)D&#Gv^$Mh42(?dvm@^t+90LI2cWovDI36nefga`>K;lF36&~NV zLa_!apVYED1sbl>@#{X9b8qAc+_=P9_G9L~R6- zt)MDxB7M~@(IpGxp23;z zFkeRCfbES)0%p!EhLH|I(o#i3s38wP(J_u|3~vaajO?FhW)z%LdT?eO?S{NceDIMNe0>UgSN=e4W9&F zNkTCRqR+z+@$B_Lb|TcwC84ke1!fgcLf-AYM&c~N0?@C^E>gxiwebm zxXODBcMU~-stzFn_7^KQG+n|F6Vj!G$N76Vp z|oex(`7(0OF>QcwM?sR z7}0ZL_nwUYe|z8jGftjX7g2EEWA{8w`=-3q$f&eurJyD|T9(u{j_*06+jFTOU3N?2 z@Mm8XK$K*j20e9C^=Q*u3fs1}j70y&BRzjC{yM`-kYuA4&3#{vuU74SFyHm61T^U4 zZKTKQM>X|64II_J^7#^IsV`}uQtw5ijGRvO)2=Pb#~0>${onND@brBYo%<;!LElCrt%T(W5m0Cvnd|>XX(uFsxsJ)c@aXWUBzUWe;87`fX4(w4iZ) z=X;*1m1WT7dm@k{@`j)WNa7wodeU;P7~7OkpQkleGoZwY%pYdIX>K7{!16 z#+#O%+uwQo9@HWuUc0i7RdJmALtXLi#)fsB?`@l$GxPF+!WCCv1L>y4IG<%1eVo*G zy+v%#+ik4XYgk9N{U%Y=M(Xwjt4=NrdTon7qbTx~-FpDYjtB3FQVGN?LqTiT(^RXM zr478MG};gRU}=uBx9eF`jAv>hl>FjVBhlYA9B(_y2RgaK(M`a4b|8sNf`w1;+%U^; zAa2-K?>_&e@XLlHjjPTEu5dk=?r`I`k*wIRQ8`O;0^WP?%`gl!bXg&3D26-kr?G1H z?aHg~S$Zv2BVfr#E`7ziX3;haGXm6E#>xq8ixW;;wO#ow4lG4+nQzFF^0??>SBy53 zbnfl?BK=WKR>W#=!|4tmX5LCj3-3p?b~WrM&q&Xxi&aHy_U&asW3oOxh?8cW>BusG zE2@o(;u72mWJO)ii;2vti)pYc#5B*CyNc~JxXrYG7cH%Gk*$Y`WjW>)>{1OzvkLa)V zxjJscv!27`GNB5ICEcp|^i5}?p!5}{UnStzDNtAyqgmnF{lmUbklVJKI|{S*>EyAN zcPd}+72h8DL-NvSmivnLz6JzYlmMV~`2>#x5l*v5RxH1|VWd;?+v8t*hBbK`%w?Ki z!gW^OK32x6tG_uw{}9|{ad1^nX@Q7kbZiLpNznSkKuXGQMuIjDOoFhA%yg;E)W752 z{lagzvp*buhcn7?dC+T}M?%Nle&lraX_7EP`exE_A;`jxqM>;rAA8vCuUSRiggTMwQ6n*Y+;W_PU~{WCKNG;O&BgtR`E z|Ji{ohfrwEDUDszT$UPVd$)e3_SZ?Fb*Mby(6(tI7p|n8HBc^&RsM-jhySe($#dIv~&6_d!`X9y5$Tp3UGyH*#n#C32J_P!$+SjZCMTD{8K z;FHr+P~^}?tZJ;~OYl|DBXu39IP#IFVVa;Ecx`KwELPH?(CYe7S$vt%`SGn_cOKR(Cu#<#O&N*TSg{W*Eq6Vml|{M@8h92H1ktmR@iI1pw!3u ze)`hhKT-tsIovfr2teCybQM+F-5Y-6h4&2Y;uc^0afN{MV|=>R%T*c2svMfkd=Oc9 zH$xXRu`<-yH+^Z|j(5Ecw}OoI(k7K6G6)z;R$X#Gj3?SyqcElm2;!Y3u&k2v>*A02 zvT_^>$K1ZVpFQfxe$Iz|td%RUd7_K#F4qJoG~v+G-CcBO-R5CwJ|KdjRJ)2MFR;UU z(Q#=r>-;2!ofdw>x@x>-%pt%M*rBn@Zl!0czsgPUv$@R_Wyr$af06l#09uDe|7Zpn z{PtF83qar5#zi1Oz@z)va_T1aUuy3*p1r)Tf!ioPcVL~1{Wq+QqbzP4F{KId!+L{t z$6W3@dF9{O%RHo;)z6o#3^93D=GuKVA?=#(YsJVfeXOKXDCDHd;&UecU9}oiAB~gDg)|$3N>ValdMmg zo?1hL<{N!p3HA^H4B$wm6}z&oFJ&4l}VcK-E9i* zut63$FhTwLJ;z`DMhkzayUvp1*EVm8o_=`FShq11*3F|L;2L{}e;*j_3GfMEhU2p9 ztS;8y9}x}u@$LEf@=|x@7W;ajVp0;r?ei1%vu^N!)+W{)cR>iX&vblzLYWX0_LREa z-ZA3O%Am{p4OB_jeq#(0^LsLq%XEP|WS}T8crHX)*j-1t(_dh+>vr$H?vA%ByqQ5b zPpw-q_;`zO(VM2P-WzLKc7BG|F#MOBi7wV>TN2tdz4luH843Ry^Pa$tJI1LDGPRXx z*S_9RC-Eq3r$*HF+dT8tyCG9&aAgbE8{!S~U}k$Uw-9t~W1XE;R@)N@jWwO(iQUzD z9-9*e!C1bL+w$;4iVVgr+l3RSUAG~B@RT_2SKy^cLWVMo*Fpd)MYi8^EbmR9ezfwf z&_gWo;BJ9k4*Cx|U2b}s&+6}z@3A|dT(?G>IJ^y(ht~7e{DdR?giv6vevbrO6Tl`% z#@e0F0|8tKO<4w34$!+3DBWv{;%rfWue)GqukT^Bbu&<+>z8Y0qa~`#i!W}Pp>vPZ5#EaUGSJf zFrsKBJ?ZSYge?gZ6QFZF1vL}*RVyk!05a%4reefdL^5)gbPb?a!AZ@+i8Hoj*Vctc zmZ3R)CXgNePP^HjscIMS0%B0gc!QAEK^{>jE`{cJRV_02)N7m=xIwC%dORJcVs}q@ ztAbaC0)xD0Fj0Yf!)BP88o0lWU8c8xcyh4D^X$X#bxDelQRkgZ_D7c|jKLW0+CVAS z`GBXtT#s(lxva138th*TUl(t=$yR882QK4{7i~mS&^&bXOo*WAPEn)^0u$Oz{*z{? zgxFleL*-&yDMkSPB=02B(KpPdt`Id(3{+@R89+*|K+*vvT9lY-{S2IzdE&*Vou$pL zxp~AdhZ&HHZJPDW+9H`fCV?|n=wzGBeKEYEo44Ys!G4=4-0st_RK#|cDFY@Zbm!zh zb?v`tbWXSOY+qsK(63FqYMibtrr#*E_(BLVF%azF4jDS{ z-Y~vr_LYOAu4bpq&&%t=pg|1nG|R?+>#~*fM76xTVb?9zWO`o3LwBJKhbN%d?W1w;M$XF+poeVRr9PC319lCP~))sh6d(U5Me|Im;OLS=1b zMbr$_w+%%Pmsj*m$g%4bpB*t{3(E(H{a)73`9XM6lS1YzO*0Zk^d&16#Ak>sIp5uI zs=lY2y_vNLu=P5zB-HNg6i`mbB*}ySF8EBJMwaiagL8XU*vCz1b*5+Ai z;cU=0TiDn2t*!KXaL;*&ON$`WJD6T1M$~YjHs!NszaD6TX~m`JF<&uwaF);Z^w^Pw zoQIE`BBEGd+5w=h3uV8yOwYi`%5=L1@UZGv_Ys0r3xL`BU{IIGF5P3158vkSLkbbp z;5iFE5b7AH`39>K45K0ToZwzTupxs%V)j@Fx(2$wt2KrF($`aj)Q>?xvdX2J_kn;% z>5%iApcN)>(+{q2u; zDTyjVuh_Jc{{2pC?49Bh&WuiYpQ}4Fda1q}s>&%@!0G`0cjqNZwt#nD>oQ0Jioa3q zOFhJKkPYrf6$|h}XR5+0$iq%8lOZ>)BxzN-gbugG=;H*f<0rZ(Kw^MZdBIZ9$x%9i z<(9DwvzKBm){#zyYpmku{4jB>7-Br9VR|9?VkD1eMa1^bo6WWxDM7P@Z3|c?yZ1nF zuRh5hnV|U8SrEyZeU~$pm1~i+u9ad=%TR1+Z0Z!x8Eo%b0oeN87-F!zA)&lF35u}k z&{O;nlagG`#o!8Gw}oelP?-exw)3Nr1OVWhp*(p;lq2)TXg9 z2tc^TDMsrV|R}(wN8ZqVlV^j0uWpLH9DEc zDt8$KM8^Wn^99l;05)ZL zLRkBj*BBMpz6?24=pDJd1qZg zsBs9G^xPw^NhY!VYhXhXu?2p!7k4Vyg`I9}7Wi@H7Gaj-4=D;H2O%8M+}fGXCtc>A zzj09lcx9F5_U;uByiB5pb>Ux-T3WBK{2h9qs>7l^KvIF}0ZF~dQ}9856K8y1)$-5< z??%;tJt5i_jbej*0#~Vy3o4;nqpslL;DJfEmZoM^`|c>J4~fD-MlM*{e`#XP=*H11 zHmfUqfiebC(8v7}x_7KHq_;?K>-(ah4$TD)9zs`vkAMq|$CN(lMmI#{j4P4!hyr*E zy=Bx9NaqYrD(F1)=+z-zrf;#YQFsD{3_@p)AUhT{wVQ?}FAJX;bRSe~d`G>Juxo!# znp;ds!D@XagsbS73PjJ?vY+nkcq?ug*v+-34u@?Fjm?3Mb;Nz$L)ZSw@-qJGHj+~w zVnyAN5g!kA16Lr=EAX1^k&Au^0PU+_i%@{3hG}bpquqxn)*n#-r^Ua7YQdF29P2tj zw|sb6V9?!LvQb3?SMvyxFK7iINsZ4n|2#B}{CwjYQr%6y^t0%%pL?BjyO&nSVC zDCTMcV5St@Hx(t=k+1G!vsojG2*ySnsgpv``dVIWBpiR*F9^KxMoT25R+nuAWJkDo zWQU(&t@Bmq^UiT^DmR(j@2W~vehEPNATkZURR4w0-I4(^IAC`Wq`Fa2IsywAVXD-l zK`62?-GI!(P>b;)0Clwr@HPCC`=%GaS4$Q8J}HAT100qE8dm$lfwIXh@S=e-d zugAibw1LE~WBSm>;)ya`|I%868AW*Z=8t14eLF`B{{uW!a99Jgip^d^(xH|MW#T)U zB^GKhw+5)bu{xt(dK+uXj4KAfRbRCrR*Bt*ukq}WtJkQL4Z`mvAcPt4n^z)crjCNO zWa2@gJgkuh_RaqM{tn|&5>Z7nU@Ra%$QWWv3P2>FG=NKo#~+@%<4SUdd*_9{HrD2z z#g@cI(yZ});hG(CoBzm?4y|#5{AS|>lHS&=G|5p@A{RWyr4lk)Dxf_foM|@5>5&Sv zK!6dV*B9a5n4_=yQ<#5wLBW4curGLTFu-^>KNaY{5G-^?J^Blz0a8}$LX_RH=MWMy z>ye`ZXyl8V^@hXumcMu2*(W^C%aqtDZ3$^?Z4{x*-aTt8?o18h@wQM?Jaqcdlp;XU z+8}FG5myZmxBeM?^8`>H)^uxxsZ4fyYny8>3X^mAU0A_?&~N!rPuWK>v17PAhm#*Y zr-?;sP3r~Vgr-*#BSBcr`=7b+U_--&$;}_Uw`lIY;I@fAVYf!xK7`iwW({?~x0 zRy;C=b-D|yEMcZZWRQRuB`IFFRNmH);|ypz4|{(&i}wOj*HQ)F9sCwZG*!V=8+w6| z`aVJoa0fk2PzlD$4gsMTVCjg+fo>3z-27rkObN<+E>Or;Yehco1g?frhO&YuIKx#I zbXc0!`k%M5CbwTGJbJQWeUpFZ(+J^2p_%23LlyvOsjFAua9}!Rk%tC9j*R{3+Sh$G z+*mdmS*woAW?4LjSVBCDj^u-(Owm9K3^OVQeEx3`DyQR{iRS8G zfy8|h;+*SSAZ$*w5YwXL6yqqUpky-uE=~<97t=(ayyt&()t84)f=2f`!2i5p^dPXr ziJucT2EIWB`Ebpy9;px|)fW`v1DaQaIQqm*77`nKEdD=wIl9rGMnw(;I3?!9pN`jM zzx%LbN&Ob~u{qS> zhD%?Vu~Fwec<;Tr2WMYhZoG4|E31LmmDQqzQo~Px&wzwgUF1#EOhc7U24mHrF0vX3 zk^>&=*E6I|I5*lem#fyhSlS^n8ltfRSO8G61)rkI0TQEby$f6qeuCRk1%C$DUaAKf zPka{uosXas99<4INWEXZ)tQq|VG|U=^4E6Q&3k6g2daKP|-^wgEOl5=U zm3C>DVJhnN($TS&_|YsQ?XqadfbT}V-b`}_xE5C=uUFwD3*!H1&4l@&kOYtguyv{J z0o;D8kG(RQ!4=x%&TY&>^ z&aOsP0KjnDW!yT@2oH$j|M;(=nk&Fc+z-8d{R#fDRsnyds+=EL1HaMF;z0ySgCYT|j*Q4_j{@*7UXg|9%)0 z)GFE*#a4(d^=gfZ%28A#!7=C5Tg4WPKn0Z{)`_Y}fS3feqIF8Gf<+Y2)Kdg8Ny7#5 ziKxoFVHP|s&Qc%oTah)eqg!Tu!*A!}p=};fImDnAk)ivNch%a~p)w6?Xq#S5LSrkz zU4!11kUYX2sPvFy0IfL(pU1*&sW`FGx(*g>4Hd)L;V@uoP5*Lu$XM+mu~)lKibghe zlbqPA^RluwEm*oE{?qu~=Fbj`hDbdBvbSPs#=4Z?g;DSKCWuS!3*}5kNjtriem|q>V`<6LIAhe+9JINSUiy`be}#B zE^O<`nIq$`t>!d2x-O89mb{r~Oe8gWzaV;hM~F-nTi%)UbG;65972 z)L!8^Q=yH8Nx@<#vRoFF7x>RR|LQPFUjvw+S(r@LV1sGc5D2|)MeD(r5ry*tvk#7h zi~%Y3-T7Hty&&s+6)P8KUNtko?*{-9_PZ~OpRr%dV-E`gRU3>b zMKbVsfJByZ4#WM_`dtqiP^|^fjfP(hQzLrUQT@E!;+Gl>(n|kh55GIL8bXbMe`j~C zH=}f8AV|Ss0alT*`WXw9dFmjZyD#>|Ta7JVDad18Zi7r{BbXK-LPWz7Z=a|l`}{t) zxMvksOUOI^I@}tg{$_3ueQs^skC-+59tp$1u-%6U+^{K9LV`cls0J9?&C^vd=Z!qE zW#h4xGqz5sU(Wir?HS$p@2;^H@Q0V{Ad%=UeC&pDw~~d}COonyn4pVg6^0^D)>qd% z%TT0+a5fxO8z`?l4icgsgKgQyv1~&tL2)7mOm1-qU1c%Bm7^Ry7RIjUAy0;2Mqubj zx&d)(ZaC0_XSzeW`t5q#q*> zP>?4}=QSeZau*Pr53jO`Bry<5aDjhj0YDTZpq|cQ0t)R-9i)f$AMe9Rk^Y|v#a4`f zLbEPkT>J`o`p|N#-wrS-;USe8yJi zMa#oL02>~-n+u8uccJ1f(VEPEtsO@C*`MLONhcbCISm}aI3JMcpB#`1A;|SLPhPtz zp9my&CJ{MwG=g+y=1>E~kTDU2n{p)U<3fnBi_IhiBY zA6c||!_AyTBoy~eSi0RzG6DL*U8MCzEZEMjI1Pq0^BsVxbZkQw7Zvd>6i(7-dLzx?T zX>bAPsOtB`dZ9)R40N5Dh_KE=#qV44rVW2D?vr;B3b7Y2UMsBYn}9#O!9`s;&j>h; zScH}5w#qj2X#gdm@HoKP^$3ZByq6?0dZp@b`g4I0!vk&Cc?u)+*+azB1JkpL+y+9p zd%IqRXT|_)XOKoY>0$*cmrps1Im+0a1tycQ%QEgWB^m7H*WpB_~DkO^+TpL`0-p1`!A8* zkaLKadLt3AByww0;jGe$`X2aJB&h^2#~sLix1B)CsuK{Ojj1-3isTRp1Z1T{#^?qV zM^_FfUG!pf>mb#-IzN$5E-Iux^lmswLYrCX&OA2KF$haZ$`$;&I)HQp!J)_h*c-mD zxEdi$lGHGLWb8boUX1^Jne*-EU5=-|Wdp|j-{Q-Op#DI3=_kMuz%+vL6Xi7`P>94u z!7)Iz7bqd7muEmR4jsxQ4>E9l+Gvg(f&wD_)cUWXfr>7} z(;RHf!x@ug5fH;i^<;R23D`aI(ZvGXsX*01xgN)CEEdQN6SZ4F4xmv9Z)hbZaUq6V z0x!8<_!u9<#)p(6)P^5G^qc!U^P56>GESYaLV%b+yhTUG2ORsp)bYX=X(AgLi=&53 zjTQkpIL&=~+iJ<+Yb#n44GT9NVGt{`9t=2;Fo zCv*Z_-S8A6Bb^Hnmz=z@$*#tE%n>8s+Bx7 zG@}nX--LS&)`tiYPJ9N1OO(0>!AFMAxtPF^Wy3%!@(f7}u+-I(ojF;xbh3v3r=hUf zg6d<0uooknI?F<;FfYAEa~tzT*7!evbqqMQdx7_u13z!L%z+H0L8!EtgqEluZ+{2( zVEULjvgpru!|odMJUnj)qmE#Y&Ow=ZG#)z~v^7x;=^t6gY%J4cei}Ky5cYIfp_cd^ zf*_I|A_55+*41NOr;vO8VMlFES1<9;WftL((vtG$_m?{Sr8R^veAqz%!-GpYp~aZ7 zmQ+{9%75qdVshnAiTx*0nEJqfJum$T)=;^Wz<4RBPc5y)AxG6_Eug#@JYN3~ZA)qn zr1f6pFm!QBZ&Elt-Q%Z&W6CGpeRibv|E*WO6$O?5f7wG>eM>9-hu5QflWs&`?Vrgm zEIUx09kRb@pjyHR?Y&TQQNr)sp{$W>_qRbcKE8MC?w=0#uSWgq17}m~!;4fEyB9XT znON|9)c)+?ih{z5U9EL$ZA>o~kg5MPE|o+&GOh@Jx`fzyIvUBVgo2{H%>*IE-a(zv z(ti*a6}We%ajM4!PwrCzR2@wTgX9lwEF+L_ZZ~w|hqqrkSRrPoT95tL)>ND?ERPsx z{Qp+mb};{MN$cMH8~bw}nt>kvA7!EYQ5NA^U*qd>+~0N3fvf-+xvBMkD?s=EPt9mf z5ozcmW{?`JVD-L&^v<0e@6z3JE_q^pvqvYgJGZReUy(^ctGCD}~hP(&0a_R9&pYuX)HJ3M6N*hvf zHP!l*lN#GZuQBuzzgHTNk|YCa#x4}K;sGTG$B?06`71Habva`sjapjo%0$Nf1@M7wf1}TM@q;_ogkGvzCpsrImEpQ7aOFNNLM=%M}OxSia!EfFAA{ zHSqBM1-eu6zM3Hi=qf?XGK)TyFmv~uDjRXE!KySGfI@hvz+!_Ks(kGYHRpI zjzSsoP^@GBRO4@5Hr=AXR&1fMTy6GKJ|C$*?weKul<(urDZaDzJNCQeY3?~z&u#kh z=CUpa%469W+d0cZZ98n5Ry=Fw(5+l#1BZ01VOsl|sXTByE1jrEqww>-+#hVT+EJtU(3hGl_Icem%YNsw+#!f+@lmmU$6COQ2_VCTJ zZl?&^FDvdp{PoDe^BJR;-?pD+FL$Eyt}OOGwCJmC1wZ{XBZx(v&tOuqqk7id%(b6u zp8}k618Ikw>%pB9x~6W#Oa2&45@fwS-RsUB|jA;;ZZEE|E(Y3t4)QlbbIgw(0?EraDa>sDcp?9nd76My}+)M72CT zt0EsgfzZV06EB9sW5&3toODj{eo7^|my!zpHLfvCn+=sRjiGXglzEN&?x>UKV9>Gc zbLYCKzC1Q^%R8HL0JzJeDRpXL)#)#m$sF8+?W^s84==Rupl&B7IAsK@p#9kV(@k}J z`s_p34GhPZJZ8c@`zu7#beGL)K^~}9>#Pg6+c)d}49A7`Id(2% z4;}@ItIn>64(slKKzrOJps6ZaQxdOqxVgao4y7V6Y^hc*nRV!@gP+gP6#|&L`u1H3 z{P05rBQ;JZ4?5JqQ!?~;e1c{Tkn9ME#cJg&8TLui8x0!@ISJZFd-p-6s!*Jw;4AS8 zsf4mCql}@1dx@v2jyIH_is7;&8+bZJF>yX99bHbUdz8jKu*(={~mS0 zT8jR}12b+2@#Z%+eyybyy|D7O00JU)0EP^zN-d0g8649P7i$jCL8KrO+=W(z)zBLP zoM2B|0dzbSigoX`0g=P_G8C@}mYQ0JIv# zh;4$r)sfo5y6X9*6Yt-KSZzs~T}FAJG8+#xh_pl3AOYGuR3zMMmFQ*Zln?i6Lf-k{ zN51E*{2RxC$~iNccRG%C3$@!nAP$@wo1 z*hS_QduF^~U7L0A43Lb=`ypJr(xHT58>E_o{njlpZQ4(nZj{^4mzGessnt#;nS6;G z6%*EwBu_FCQ9gw#w3pggn1anR+2>VUz3C{1yxs>cJ>`6!*KF9$!9|JXQFS^Ur1Do9LwsTepO7 z9F6W7=PS<0YEEw{nU-;A?tFXk7nxJ2mKg7GD<7wQ5WJ?anyD6W}^f-uG zwkq9X3a$(Tsr~C7&x-(`v-y-kV6V==XJm1M8SEnEztcM1>uzT5D- zVrlDCdc0>rU4?oF-kdt+X_|sa+ThusfvS(+CKwg3eOJ{QzQ}YF8hV=@oDxPKoJ}z>d|!H8C~PA!{9r}n(UN#cVoAIRR4zrM zf+>}a?>>MLDe31Eh#F6l!ih#bEs8f^vukQ7?Tp!HsFfS;Q2kV_j+dM6BM1@|m)UG4 zE5wZ;>J4DfD4{upmXnggD|&RJ6+gpy0xeGGHikhb{$XI!;=M9;J(A}x^3t%HqSW%2 zD53ObL@Cz%NWoXm$7X#r<>#G_FM|>eP+jgB&U6e&^VG}{nTfu$eGMEaQ2*+bFq^ua zi_f`q)TVQT>SI5-WSq?$Ujp3qQ%%iECyGFtVW_=4+zBm?gygj2gnv+#Ya!yqTRPN$ zeFa2G4DuIROMP%*X7eQbDMXJoz1m)=LV9}M4NwLH-O4gRIspM9yx$Tg@H;YiyS=>X zg5@l41NwIc!B^4He`X)Z|8&vRnd6g|`7J9=+#EdSSNS%`9fnO!p5?p1ex^M}a)3VO z*NXO#zX8(&LLSjR)G%o-5B4oBM|8z@XGG)Rnu!_xs*aY(Xpel3T+yr>=FwHn%865# z+$0;nG;rdUJmHkbQ6BNwNy>kmDLA?7Y`WktE_qh)_j(wM58uFi`_U0yC@Cx zA~WDTZR7~%c;TlOm+j+cuDJR6#HlzGgtHH4AnPaNbm$J7H{Fe)3C&~t;;I0P;-OtU zqPDEals)EGnh+bwQ*FKmsYSM$#Y666=Jq0?q^#krDbw06fIU$1s8EJ1q!WYf@HVM# zkgaW+iD7z)2goV{BEFuQeLfXgK$1Q;E|OD`x}?sA($DlCsEt*AO%7!bo_X2>O8df( zw&lr~@i`mMq>_U5Pa8k89k;B-$U-xiRkkZVAXc+ueEd;Bcw)L9rpKxtXHxMjaX$?}PSS-fP}tvvSOM`5A9%n9G%^nd8G1>yBi!0X%I| ztjnXSPHNro;(-gAWJ>WiNF4jSG4D|~pG_&G6M)zsk7hXME@Sel?mdD$Ye+%^UO}o+ zTyAsqltOpYZ{)2s0?$Z)O!s*=)g!e^K8n|3{6Lg7wVdop7lJ`Ro`OJfW3Mp|Y~j*% zs^`rIn?#3c5nnm_e9xzjQfRx5V=r_&2Fv< zO1MJ>kqX^4PjT)_1`LazvlLNpjU1$1P*qR0->T-BYOQO8F~_$hfB8O;A*^^n&eK8R z>I5-c3n!}sOc$_hP@BA2)2v;=47wErIY3ifTXuseJk(W~Z%XSq_hhhrJHSdJ#Nuw%PaZLz0H#*5mDek|MM0u-j4yb^>-D=8aU62x72&qp zIQTn1Bq5nEF#n!T&ZXY^A5`Lcc59Kr*sTdeih_uwC;+hALCPSv8MD=f7k@JHf4p(0 z<|a$7AQytS5GU-IEHE$X0Iu8RR3)WmKDC0Gp}7>v)T+NR5sMX7p~t|iuuYAj0Ows& zo&V_m-u1KdbTRHUPy&@uJGFaOE9+Hv}fh0OB*#zlr@GLe!-ZiZ`YAAUz ze(QXn;46p|c`<|K&n_0yA#sf!eTC~Md9zBNKE=4r<%-i`nmsd-@Av~1=y*l6`HO9Q zdm1(5xShH(0(@z-SpJ#4)G&t%8LG1Fve`B}K?4d>9ny`iXo37Zz_he|av;Ts#5$+l*f9Y1FbOgKOVjoBPdT_@z| zrXwX9jc8;>t~prY;XO1l0lnwMXyhu^MBj*hG=MRrvi059N~k-CRHU63=1~ZevXS@2 z1bll$I}JlqkSuI5-l731Al0DPL`EB4N$U&ZLo3KvhX%^=MaShAOl1wh&BklML~h4l z4kTk*j|!c<;v~@P%=dxH3xDS0aJG5}Wn8f{j4~P}KGe2Qcl)|238hmCv+>d{r3)jd zpZc4-du@)HtE^Nd9j@Me3Bf!#T}aFZZF}};Qf#n#z>uy zDCT0VBDftKbPJewTZ(8e>dqq5PTG7PG7DlD1U;sbzfPxy1~OUL70gbjlKUGxh&pcL zY`b6OLtipeA-LYyM>U}(nFD<4Tn&A10TKsL#s|;01kG(*+P3&w&G1J>Vbg_-DPkFP zoZx`k;jIF9=X6&l80OUUOFy))mdTJVCisIa=Y3!*X(j?YE|iA^VlSJ4hcY4q)qz>u zJ|dKVu6;!3G5j`LMQqq?|*%8+dbGx$&m)GdW}zA?xy z<6g)anWC~V)ZJ9oqw^6EmK{w_sz;${b8bsIqTGCaI;x5M2jt}W+QkMrlso}y6%Nl{ z2o73Ll~~O~9G(xw2fT8vDoBtWJ+<_PECj<*V zVh-%-U-cB^atIQYzmYhnR^f`YPZwMm>TQDDvK7S*@NQ#t$a`4e0DmVX3kadR<49|{ zc6R}^i!TzSnyU{59r>T>69KO0v-hSWhhN=ThRHk*92&D898)>?ZM#;O2tf-1pvY>O<`MTx^w!IZu~IIY@=2zW zGprh&l)^sO0q!KS)(8ipRk8Vul`qZTP#U|wkqJ!7gZWW{FkxGNHgXJ;_Ht}|y+@X4 zW>R?VAljmm&)~$CbE`wf3Zrz{Po2&edoc6OBw-!qOblJ+))MkT@E?5~VVq4#I4K%l z)oAz;pkj-Aq(F&DWULBzgEmw}D2TK~c<@s4wgy1c_bGB(QSip2b>bI(;X3w zW|Db_s(;LGhpz4XpF12jdYfGmGU#SXq8Z+*5ZZ8wAda1!2zsS}Y`Kx!aif%gnn zb!7wo48>4e@Wg!&T2$I{w-&*VI)H>y6qLUnvdsKF4%?^<*?4Jdebe53b2;X zQ;V}C_DEhl0a2~(hJ!}L&X2ywAl76(&Okmv=7CfDQ^X@GuRbcV(x%i^H z=GcA?s?mJjS#Q{&Jr8ZHi@3_6l;*83xsTmi7#+YNDxd`sNgJju-+kB$D*Jn)3=6vD zMzX913x>pLh?d~@Ep}6f{J`vjH(bwKXk3q0lCMr`G2q?(?z<1mL2AAqd_}-;En#g6 zpoxnoVjoDd=z50v>J+Q(WUFW}X9yGC<-rRB;KnXW>IAhC&B^ZxNvW`=$mp!U#eS^L zjmk2#lTrvcyxE4$6ZF~TT`2Ce>*``NeXEIBG4F-Bs;eLo9S(t{!8g;%-+=FXLWHlM zDv@M%-LS)nX~n^-B-b~B^;C%ftnpwOsN~%vM8T)&IU7@u{I<6^QddQ)!M6c8(qOke zZY7_8NtZ%lDF!V2Cu1ts0N$>+fvSDkpKC?Iw03;F6d}e#|V{Obq=w3 z5^U^?zwDiBSeWi0?0oG7l(?0Q41qB{2v~g2{1d6ud>catHn1ukity$;=5laQsG%UE zb?z_}aj+2Nug6CHN}$uPz3`V}lqhg3CeazF(-F4Q@Jd`y94(utgVqeFJXj@a0*QRe z1|dmIf_0=~Vq8{+JoybTHFS`g2~4)YDFfdUOa|h5|Bj!FIYv)rs{EX{RMaOp`w$N7 z$r0<7Dv2-kfcR{4S8osR@6?8`z$%A;Pb}Vm6K-}3pe#5=5YF3>rFhml7-dhAut6pv zcuj^kM{=pf^o~7bXXqL6=Hr>VQ?xT ztS+8iHY^Ojj8Y$m8n+K!c+GwY=kRu`;X4AQ37iGJVUW_CjRj}kh7nn<7ejkpftSZ1 z=rX2Bqx9cGq?we-T7y<&OY0LSU$ze?+>O z7tw2Ud-rxbjw@n0a5cUGI!7>^2@t(LgAi~LfbU1kuP-lXs{X5>E7j3L)H`y)<sTWKKHd9_@VkRO6?N zB?n#}fDuD04|zt-^T1HojI%&X#O6mZH`!O=Y|uPo^&2S84~vN7+(X{!7l29zZBD+Q z+#$p$TRWDi#1z(VSksw%(gBr~0b8UClK2J` z^Q0vs_w9BEBF0EtI3TZrrNln>-|tTPB2LaksvS0$7dS%E25Asu{Ns}o z6(P>1&#Y8BPL0I44Buh*Sr37qix`^OQzmVle6oG!z2{b^LvVv1J`1=7ePviqK(n+7 z=Uii!Rdp7L5~GHGgE1vd+VP1Vz%?LRa50ee`Q-T|GEMn-ghvhzWYcEjJ6@O?fQh1{ z%m2WVFL;%JI4@v_3-!nR)U;!zLzT%Y&UkkDwdI+%1<#ygUktYcPxas6o>7;zHEMyp z04nusE|A0HW9(@tNDOmej1jc9K`d;t_%p~X(jpo)7YC;u23T!PvrtPkb)}2}a_8iN zwCF_kTx4;LPLA9cKy;8%MbZ_mA17R^DkwONx5J~>IC%C@+!y0d+;Y5;;U2rLxu!(e z>Y4sEa8HQky^{Ww-GqYIVsJe{NIwU38G`mhtmhkg@_hJ1h!{&748V!@{SW5IM$v^F zjbt9&Sy5)~B~_IYE?BN=Oav4XPf8I03~SVoOUoZM-^9u1dm*mniJ?1V-PAt`%iTI7 zY{JR*1x-5~8oLN+aP|A@|8|N`HU2>Wl1?AF;xdL1$pC$XS7QmQi#A|liAc~N9y4P& zRvkN>r3hVWDl`xhHbAo`zW5!`k_fQisKtO;^618lz!M-h;*`cF~bAYM5yf5B+D$mF0gtSlu-9?j)e)iAeh> zo^$C3tT<4Q^ZMGsPAve-GmO~DP{CBKTmcZP;1I397%EHWu5UzMIuOoqAX_@u16JRO z0hygI1FVD`6oQt@5isEpf!{Jhbcg(n0tS$!Jpr9RLPLgph;lbInk}zxJ^gRpjo`qN z_Z-*6xt{;Wf0q0bc2rZlr81=;FZ*rX?t*{)F;DR-rt(&HpIWI&{wv;KC@OIMwA5kC z(vMc{w7-!UawNOS+X&plG+U~i$(tDOKk!YLE0%z`ej%ZH)1N>U7WN~4Bf;5u-Q$oa z4G22D0BIx7HENhG=f3}=h84%J-E@mBl|&04Ymq-*eLYuK5z<+t@66-x1jZU#6A7vQEPYR(Dl&3xJV5zm$si7bO5wl#M4AI4^+2Q7hQbU zq_tFu1YiC0DX0TBSgD0?)SSg>p^lS_mcEo+T&mH&;^d}x4wVZ1T-^TZpZeRa39&!B zB?$t${!EMS(4%bY#`s<5CUKJFpDjrid}=-kS27tgfOXj_0F&uo7nzbgK5Myst(LCB zmRYUE0gR3>`8!`yo`!3xphj|iktPznB`JFBt=4IVe*E*&2K^gNK0=m%4`#u@*Y8d} z&fl+3LhFux^zm3*=TC1r&rLktKG`@U_EEZE;NA1{6{BT65a)j`act07br9E|+FKV+ zbR$bcpSYbT+$&OKXav5Lk#<4XhNdLI>wRE~n= z`gAF42$Kl`NG&&}xS73SN({SGjXWkiYY!yt`WL;^-IAsi#aQp*F@7$ekL;f6w`@Y4 z4XZt~ue!;3=%i=mjKH`JwX&h>eU}iOI-rW~1V#z&nbu!%8nv>IN9j+87VaW!ppMM{ z8B4jR^4tbm%i};W*-09@8oSiI3n*tJgZuGRi_B%o7*~Idby!$xFm@QH`E@sCTXm74 z?||PiUhz{8+lC)rH09^j8%MZZre9_^owT%g2n#Rme;N2Zb9KrtEQ9P4TnlbAYSwpc z!oBPyK*Uu3)xLn@NdU#^%Iosq_%A^hTI(IF1$q@{P2D#10tqaQs=*s*Fz{SNEUubR zIa}iy7J6nd6PZ?M+>?je$<|W$YQX0Pwa{<;l+~{>Chj{Ibj^yM#UD|5pFrHN1h_gC zR50k8O~Q#wJmjMR&F%WvCM)wBpbvZ(_b#Bjf&nl0`9Jn@7aj^cDJt0O12J~<02ZnT zflzrpe-DFjC%~qcDbpmCiH2u!ranc(xr=;40P~->+A+^O&puAc zCjzSFjGk;Qu)-uPx4(MIU8OEsh5TR4JhjZ7`k3KZD1JoPFK9hqnxpdr$l zh7a7kNEqs+xnv}+U*zcj%&~6lz2Nx7eO=^ucAE*|!M0m(W_VPN=GCMhN$X!6+rs{9 z+g+5-h(X06tB7c4JNtH(zeW>!2Gek_59gQ3STEOeMdsfTT~xy;iMV5Q&kU)u)U99L zP*L=puV=|{!G+N?&hiV8os<+>xEdaGlWC`(B;072D=od^Wfzyj*^Rzud+KubRhE(L z)t%V&PUM~X?^ax^xOTeakl7^nsV-X6ZXFtwGY@=M{hW)?gJ&)dhZq>_z7-5q%~p=a zynJJbGXTicqQNkK;W=VkWNOIH^iA->vR$5G=@q!v5@UK8qZh#_@nwTQ z=3b_ycX6+WrN?7>YpCTzXo1jFAoQMRfjnf1 zPEs$q;KU})*1E^YDDFi0l(#Y0)@<4?>$~b9--K$-Dxz<=izp}-5Q?#mP>h{r?4q6+ zLNUr-Ro}S1srj>-+8c2dJ9gI;>GKPqfOxkKy7}_XkzRN1$A~{yZf6DnLtRJeP&5Pf?5i9Y*> zmYLHvq*V60TFL&L9lL4@EBCK8lH7(UuY0e@t}{mMJ)64IOQxz=YXo%|yqnycmE8nr ztcB8}_bvi7R<;xy-mO#233?=s0pLdbIPvQyLxMv>Wj{jf0smK#XM~o zY=5)|l2E;;UAb;NotHA#i#Ls@DT)YvSM+KSDwTWM_U4|iDBG0ZT*;EBKM}m(=bMs| z&5=~$&V5|zEt1nBL{TBphMDR%HFIQ+`#8~^5viz>&Z>WjYR;YUj*-WO6`Uv8Yx<(T#5$@ zidhtN%+04xXFyt=>YBEhp32gmQRgbhZE2a{GH7hpX49x-d5`!k;g2{34e1}BMPpv% z_ccqN5AHN{+W2i)NcZBnsb=%?SU87?xK6St)jljDA5*&nMYyw;)^d8xJ!l84)r)Du zdMJ){+N_)oEk*72*7~^o-q>EFV%-AXJzljo{k=m%d|&?;{!X?u2g^?zf7OidnV-4h z+2TW4j!Et%_^N`sJ?mG;Fn+F@pE*CA^{a4Hq;N#0d%{{h=)Lu=cczHL{P^~>kPA$s zEqhwj%TAbW6I2DhZ9|G^-12Bg`q2cTIp8jB&=|m^o*fVIqH`6Ma>WW4AKTygZHn{` zMDwUinpOMWYH3Eq2Z$%D^+ zU7^8K#ZikI|L3><% z{QlKUhOKeU9iBZ4U|a$rfjErZVEw)ED))?W2P4u4jSt$3M(yP8@&n-o zntqo|mak7jnw*Mw8CbY@Uql;EA#Y3dDs$7h#SrsN7g8B#AsM+lX>nbDLxfxxUVO#W zW~Q20<7vwUk!zzfJW9uf_lAn__u!&gv*}SEP(&Pj51W`inmGix;xr!U7 z4>D~9jz)9?3xX!BrWIF(mMnxBMm8Y(To>N>4m*^kYRL94*->?Y<`!b=RiaSy7?+%# zZkUex{&uJa>bOogyn+jnDri)DIHs^7g{`^MTW?CiUznTM?N8@gMy-o|5Yyx!>~nl` zuxZ5oLq>-;PU7S*X0C{_FLdlU|EtHrCAL*|$3hOc80X$~9rG}T?r{Fgppp9>udHfv z`1QniSDRp4JrFT>FU}23vOLJ~gJY&bTeqEXsMd-k<%ND-@ZX+BVSo58c#;5WotcIPwBNTBD9bv)@G{<9Daqr-Vw5Wm zqgMk8BFmm7@{MuKV*RAEEB$A=`>e%E19Qv(hP@9(-mGq|H9)G6 zP4Y>ohYKE}X3|s9aX0w8LW8kc5hc*KzE;1FrVWy~OTh{~m8GCWhbN6>x_BJnU(}4x zoImBgP2R^-nr$Bac2j+PUQlA?gr$Kfw7xiM>Bqmvg&Q=|h(-AS5lR+i-BPd=3p7=N z*LJb5?Tp1xQsqOIvw`I_l_M;7@FQcexVOC0Tj_hWT9*>!~#6D?Nrkl;s_zjSEjT;4Y3{QKr zo|N7gcW}v}BF9+!+%LN(+?>|rFgM6H;#B$iR#zDi^+O#t*WC`n(=$PgZXw(3jZLnH zX7F?jplik_ZoW^`Xujq##}pN3KKInU@-cNx@OPSua@Kd1*rLR=OPY%M-}_Hq;-yEV zt6`aO*q1ib<58Nud}%K3aD|3s0NG+3i_zb_+({Lhzskk+^Drc-f9_^*B-)UC_#BcB zS7678?U>gjE?t9af6U*49P>XiE?Z3ti?%ne*f`2)fvJD%VVKeV}oSJdxlu)y+mgEnyBBZKCOGTU(1npt7na zl;`SV(xICQ5LR6V)}EVaUYv#M9b>=P$}S@Viy~)-2LB#p zFG4Fq)N(lR7$8+bbGOy@KKE?nD=`YOy0EPdR<&ujGt4&sU^qmePw)YcE9Fymj7#|UDK*XDNep`u~5DWa_q~VpSfz| z2deAilWr6QO()AZ!s`x{(0nR+D%7Tf_pmO}T<@3JZ64A%HrXYp6=)BY!5kPhK$wHG)fPkh%KF1A9DPwcnMyHY)y^~G5+S&ZpuPev55Y&5ePFGVL`Hy`?@o4D+K;`|2rwp;;40ovZ7-H{Mys z5wSM6+O*HPKhKTYM@P7?RpI_D4w8PwT{d^RY}y$V`6?W#l(p3r4^vSqfa~$T$TXW* zPY%x3f6LLdYVnUJa@%C*)ws3aG2xo{cfpDnW4}w!p(e$5S4%|m_u1cb9Qwj& zw61BH=ceWY^DjGnHM7>6wK)c>uj%7(!Xh8PG+2exuP=AhYNp@?(SAjq52GwiRMOx; z$)L~jH=nA9^eeY>db3TbzWE9y7xV}1E1GQlixaxhpjwvS z2K-}&>xp?`qSMsGEs>*gY0M5A-yM;yIpHlP#>xte41*v)|l#R&tY3lqA|6s>EkZA8)iZnA;z#oEpkgJ?P!i{iIEkuOlkd9H*(or$=`$R z5SVnQ6MRz_u8YYxbZ7&#xN?)Ez}ttH2pHn91lliSsy6)`Mk~p*FFWqJS8@~ZZNGHd z#{Cp7Pmq|HvjXp+9n^(T*Ai{BZm7)0zu}B*D*#)vyKgphLynV0EWlY0X;y@am;>Em zI72W1qlJ4JpxhU8qv$2R`7EpK5S4LdBw(UeNK%qL;tw$t^_FrHSn!_8Ox{Zuzm z#KaIp(;kLAfs%PXBzWO}H$(uh~2DRj_1e7IKOG8?v+`Ej(HXHVc(cEOE@Ha*wme$aTPlB$<|BwT_#1q94G=<>VW_Mv zq{p;yWVq0z-8JE=9%kShNO;Ie9>9Iv@FdN^C<{>!mccew#Pl8TUuJAx8F3RzYJbS= zHy{(hPtZ5do1ICfc8n)B9hjxd@kXMTUEtXVRS8b_2po4>q+FlQ@Ul)eNC=3O>< zBYt9f?|HTqN;SKY$|6=sUJXKGALScdRfWA}kaG0FM(1TIC2${4D$?Q(rWM{F6Ef9m zb~TK@P1@#~&LWel^sseFWb2((&Fc3tP#-fpFsMuJw|n{EKcVJ*|>q4#g-Kk7k{`w=L59E*(K=h#P{g$<}h+EE;NcWHh_e zQ;rlIRVtHb&XQRkKwNJrK7d^x0Q0O;XGbGb1aRW%y~tzON1~ZsH zH!4re3vWCt@25MIm@nCFhM4Lvb#6{g`@*^5k#~4r@ z|9+41RW{Fh{W8<@T-&ShO4VnOhSS@_ACM4JO zr`K`0Tf11-KE2O)RBqGMTs%PC{KTQ6UHd9-)H4Q;I$%?-8}lsAy!J1fCbWAowGfVt zu9u^UvD9icaP}DL+*uYmkKc%I?A}Kn7GfIBDbB1y4y--Bvq*;*^J<3*clf#-z&Lmd zSt<}~Q!S7pc^7wbDO}3AxW{;|DUQ1+ziT4@QZgpttn+gIxlBj>7e>m+DrNjU;CR3c zZEvA{XhQk>!@KiX5iTmWE4AN@|5_;aE?XLGE6ujstS^=1wlxc1+thNY`PoiD3G+o{ zdlwd9kJ3hzx-rSSSz+9M6l2DT|O-9 z3TrxgC&R<{?T5+8b%?N;Dafa!ipIgRj>E0xr?r)~Os&jJ zTjNQ_zYQz=nTLeH>H}>w?wf69DnOaMeY6bm#8+|shFQKb=G^A=*;Fb&Qlo8yiX?>W zn!Th{S?S@{Qh5yn4_l^K=uGpPKX05NUkGka;r5~EuHj6&6bUA>;l^IOV|WGC|GL3a zWe6==tX7}#L3z#wjVqHA+6l&s)IXj+F10FWetJG$jn#wg>R#+S%bZL8+cPiMX869@5AriDVV@P1`f@JgJxS3jf0b(&JT8_d} z5hd97hdHT)QL@wK zg~PGap&O`(+sh0medxtA6Y$)-t)HdPkwS{wA78tZ9aA2XBwR?K-KuU+I94o1UMEUu znlClC!LXmyZvtzw3t_`%h0KDtpfy4K+KU8qFFUPD<*&lZtk%jf$@969T;b)?m!DJA z!X^J%xy(Pj4ccuYa}^nK8r(%$$HP{VdAm=)4euCOKGj&ec!@N``2BRTl6CAs8=P=S zS`YVhs6QI~3(lqff;kB)gE6jOj6K0gW&j!hdvEb#&SAP0L*{fL_I{j7!1ZOC4gfSg zxs>FuYKKaTzO=r>RSZGfkOf`5=>(FjMaIad$bL+P24` zn*@E?N8ylvc^Da^tVKYjySJyeJFGbOjlcCgg!{A;m`}Vlk(I^YP&l!d%i0#Irx??4KQA-&v+7r6E4%hC$Tv8jO%Q;mj;k5nNv%2`hQYCl66fbEpMN zAK%GEsT&~iyySE!qO&7YOVzhz>66l>q50-kMT-}Br>=ue{}z81qs!;!HZ~*P(EYh} zt?*z;%9wO6ZLsXg_j`b0)AdP+ZOL?2Nbfo651VARy#W6042O$H(Kq3Eco^KqoUCHO zD_piUJYgg>ciSyuj6o!AwB>hNleGZz8(7jApV5tjfkt{6C~7Dg(_)mb)XX3=A<3fz z9>wS@=WQA=mC$OwzzDeMHVhI+O{qXzq_bA@`_ca)?hrmIWi*W|e9MmfJX)kV!<6pB z%`^(X)St9&EEdya__*H&k84vKHF!8=-9G%F=VVuvLur@TX|pk<$K-IVO!PF0<{Jk~ z_`eWKn08bp3uR$db_iix*%PoclSKwjz2uT49{3zvjP>1UaoTj1q^ zB|pTDlcr(M#+a@Dwpx8lQp)JX4sV&x=pOYW@d43fW<#rpU1-^>7idBVV?i1Sw?^zA z*Z|8rG76(h_Vu&r=C?7Khxqej9VEw@WGp)EVvTy6bL+>#%Cx69Im3FMhAuvkbX4+& z47)BrteYcMn%DPNNltFBRo`OgwmnA9L?>g8l+E7EwXl*W0yUfQRAW5tt09&?Wi zuXlCZ&A|1c?)pvkamj$ino8qBgLKGFGAH+e^J)8cW9|LF=_s=SMeobd6m`m==wELcf1OpCNf(%!^z$30wA>E-Q9@p~ zj9r0{abBBNzA2xeN5EM)!WTFMx;v%vm*`Q}p>`07Y>X7%U%1Mt)a1rA6>Wp{ktIOe z--yh#Tr8;3kC*-H;RIcmvoYzl$-xN0uo@@FOn2ke-(JRSW{?<#5aOj{TGtA;HhW;pci6IfG7PEAQ}oT zug~oX$GN0O>{FH|i_-g$1CGrumtP(>Ic_@0xz91~?DnSl_UA7CFW=vsbRtSmYB4@9 z6=T!6Q7cLr+-^1TBl1+@cZR94YT&iI4XmLk{`=tPPlkV!s4hYs8aEm6RFa#LQo&!6 z163#Mvo(;Nh;AHoI8v5)-}zq;yzjd=G&vubZiX6E-SF1{(#wu5Afe?{{)@pkuS}@tA%8?swud^?>JX zwEVLJSB=?(y4e93D-Wp(Wyc>vDtw(DigE?ul?hPijSP#y@MsGP!CwAX7C^omxZcwV z2jqMdCo!vC;KbQO4_@fbRX}WLw}C+0yBtOwPrS@uKk%dQ@)UVX;`gTLw}4RpPfo#g5=DW4aj@nEZ#JnaiPwJ-w8yYLY@fL zSsnTs!u@Bf5{W_CJ`*-iWOoMSMZUK29i0E0CB8mJel^W!S>1waNj~Td3I) zIX*Cs|6p`e5FkVl6bM{h`0hM$I#I%%#;b;kzvb<8<{4mkABc5Wsn9HwyJgGI-#zsE z>&w`mwGX6C;x~Y!2$DDnKwfmG_?aqwHvdnf6o}dr&6#w_YI;AG%qmjh1o`HsY)AT& zB7*lpfGs62f;bOZ8AB@R7#dB!92T-le@P31>V#()b2TcTkunl+*Pg|WWYT8lvS59TWC$Pjjus8%Ce z%*464ClN*v`FRY&Wq9`jUwVBhyf1jLeAr9jYT$dOGCa?vLlIGV3zQ+}uCO(Qv)f@r z&lVS_<=LB8Dof_YCUTEQ8Q~buN07~EWlSHpQ%%N$uy=5upu=@og?rv*KTgMrQl1=i z0l^82J9`xDYj!RhL3PV@Y2|OXcM^OSx+qy%F4!;W15C#%gExq73_Fgny9q&ftZM3a zTR`^D=vv?I9Q&t{lg`)cvqJ~J86a3{)}|35A2?TO&O%XW+@45s2`~qCqX0HeN&kfF zvFxl|XIOY+CsBLd@uNQ+ktQu)QWmmb_!maN73^=(bY9;+{dNQN3(FS3qe`X0Y6 z&Xh4a7z0kD#fb+QA4SYML~sA*ow#Xi<$cy;>&0#BxoQ@^xD)ve0r-b(pryoL{f6+? zuE@>+2>ulqwd|s8=TwPmXKa(4yG&Smx*T@Tjs|TxUG&cg@~}e=;q34Iegua_FJsCu7|wABVX4o#U0?Fh?_H7FFnk7T%AaSGdVW-|J9-QO429 z(sh*i@AS_i^eMNLk)o>#;uP0ouWWg&+M&ZDpsSVUvPolQte8IKs{mLWiZ~FvgqH*d z4G&H-D3*%Wo$7g0{{OUfrg2SQTiXsu3sq~R6|Gu`%Hxp(&e(#6Bsh_$_Eh0iOwkG` zgm@4^K!X?vh^+%Esi$H^M5w8S0vaSDN(_TTgA5{8Dggs15|9QW29rPndG8(jdp^DW zVvQO0fA78au-3Ki)yjiU4xBJpw(V>WRpE_j|5$shkDVRLkVNwjxIdV<0U(VXTz9ZZIx=2osGiHNm5d~`$xaeFzcSe z84*opUC*mlSIfWPGnIg{ZLGawMkO{(O~kEBG1F$s>N*DC00a+$OBcb)5gd6yjJvr}Jv;sohaeZ>v8m-;KJ??L5O#K2h;Oy>W!t@EI)aZj`q5{u>S zgL{wCqlj*QIr7LJwnLrq=|FUXtep?BlrR~-woKK_G$;p=fE7*dTjj`gI@FHcr)vPx zgthvTql_rQJy(}&jQ#*on~Uz8B8teY+)w~s1%l_bT-HvCwh=I~_gctbTc55{2<1?6 z{BGUq#3L__0+6ae=11qUFlQ))+xMQUOq?V3UzZELw@gjYcBdAA_`X24F?} zf4j@;RQn6vDSc~c6%6xpYNrcsHy7)PKFR8>R?Njo#?=xwQKdmWscZ{`A`L6?=W6P~ zM=O;w0^ASlTNOY@>E$&lk#+ws5!Cqp&D`Y=5U3mK|MLe(7 zWU2112arU!J^h)dEZbAky2zxN>PNsMqax(8$vC0|A=9`Aa+z({2?6 zUJ`V%>k^(moa6|YXlmDz=Yx*-=B?Xe*!gE&V-}mg?PT+slV?{u+t$0Jn7QmnrM<4l z{5~}xF6|!AE!QY<-329T1@~fv`+zTG(d!7*$N9S-21Oa6;p>-VXVUAw-5)%Vv`^=b zR@MvQ`E3cQW|9)eD|J_$6Cjki0F-4amRfv|drUY#;fWzV=l@t!FTz3cEj}z10{wyZ zp3k((h2ukemt6uh`Xg!hx~d~aE4SBWh2suF60>aEvP)|}S#;R_?nT!=uu6463JIyl z&2_$0=URwMtKfZa3&A**cXb=(%^bCQWFt@s?lzkv$HHe1uD-$vS zr}Q_T5K>-?s^Z7MAm-B6y31*S}TsX`McWlSwr40?ra`7%UJT=LC}F7 ztnt@)pd`CJA3UnH;%}S*6fFhkYZwG;7;8|8FcZOnt<5+6I#HB-z51ns2kB(@TLssVFI2K*RmonZcU=yPZ(Ml0egjl;aAcM3Gg zp9zw5J^~HXVx&K%QiK|*{Z!HaxO}i=iqPBQe|wsF$7^u`M62>Fv+js$sB@;T9{cDG z_0Yx(wGeXD#T6XR+wk+*9eRRuuCFDe*vj~#hD_*rOmbYb_N?4O!HeUF^XHAY?hfA) z-I9PMpk*2K#3Cdab65ZlebQhz;6IajkZeh`GdpZ4<*@e-cP|-T5IUO_Q_rmAAg)-1 zbr83E0+5hcTcdmbTW~mZd{X~A*00`2 zN`R2VtLzj9D9Q)HD?G~k1z4ugcxsoMV85Nz{s&nM8zEa5hZSgSnR^e?Rsb-EL6!mS z0Rc$wl=V5j1|tO^t$#x8pAE&&+~aQu^ie24-fMFYutOhQ^0DzRe{Trv%*@d`cMA6F zFpm>9?YBTIx{dFxq~^J=+vl)2iLxY#;sF)<0h<*pmTjv^W3vLa>5KPS%m*ony&P6* z%U}^61SEc;_O$#Br4Z#uB&f+fE6cOIUskGOV$Lzzl=KeixHY0aT6+BsT7K!|OxFVD?-%W-=6Hkf!=|vB{?lF9=NbY~7Bf?m zKvq6F)(uU{EGc6Zz{*8;HIDb}OAgw#9w%Cpo;<<6sS5=+Bti!?VA{OZXdY$iTL~4jL_>2 z7v&>T*Ho%6LE;E;=!)cmYdm(zDCK}b>bmqGWu6CSVZ=idEY_fN+$^%V2?m)=N^7!# z2mRFOhEE67SKA1o*l9w14O8l6c#Jw@w40LRk+; z0u%uq*txCoJCRhF7I+&n)22`lT2yFB$huFHrUS@9r~C-(E$58#b>_XvbN-n z%_sYFQKT5J$e(s3QW|2EP2Deac?%wRD=v`o+Ey)7Pa-{MQklBOPKB8`n zV4)j5tuNh%UP==bHHFwQ5P~JrU+p`3fc$=uiFE`kz2BGBTL6xNsS7bu%wY@)^bK^& zj!ijK+63|JF$R?)aMiiRbG5_5^?Fb8xA?P(PhC{Evos#mR1<-y1+JdFjO1MO0#7Mp z)ZsP(h(CCLC+O0c@Q2GqdNN_Xs*pA;s<1rkWhT(WkFw}TzMXFNFPvr$xJ3Oo!`5sx zITkEFWSKaNNJM7ld>L@9iAfQhog*#9b)*%#TXsIS?xrvw$}Sv6!qlyXLT4$8XwyX1 zP|YRXK$MgNaZs2VTszt06hcY|DsJ9*$H)y~QhlQ61#o9roIqroUsbCtQ zCx~hF#remI>wJg=>2`WV6T2&%L5X@Bi#@x+(7H)IA=G}Ulr*iA(@KZTElWoU|Fhu& zcaR^?hKE(g)50Ovkqim~xEhO97C}OIp4RR{8VsDQuPHCOc64=Db8D#I(~kc1v&aL**7GuZ$`<72hm-0evc@_cZ*#x8vDd%cz(%8>#9--zf+qrsirX^YT>~U?l-%2#qMt9%!Ds z6hD-sk%_7jXw*5>gUW%3htCGo!8_0>il350OM#95VIP0>W+tOQDIfc~OqKF{Qpf=p zvQ}bSYg;L}&Ou5LrsB)hWJIoMrTm5tcyrMB<`co!ou3Tpj%TE~e;}M=UMdh(YiwT5 z_n%)fKh$-K%i(m{ZeGe3yKilErjH5~RbSfzK$ONw8Qb13=akZ%tLvy$%{KQ4#D>$9 zlOP|(Q6_xC?Mya{LF!^gNUkSHwS3k=Sb4-gHb0)D$)drTPsbMH8?@)q>?|?p-;H{+ zF%acNJI$Km)iF=eyV`4E`e=?4lKHR3PoR$0z~1LJC$D%18a9|l_EYvevVPgOM@ZNl zEl^I_by%HF9NT{4c3KuO&k- zi`0fUi9+Th3J~(xj!#(CQv8oL{e%8~zj#OyK)cWK>vh=2 z{O+f&a2Majew&Z&a$L3E`*)mT0H`^02laK1O9d};gVGpCZAk_p$$`UT6ST6o(7eQ^ zaQL~{EVDcQZO@~6^=a8|C>SAjufjQkRJ8?i3Q90T15rmsor|`kz@+Bki#_1SCztp7 z3QOrv@+kUio301b53@cJo-3X_zRaENo9wW#rf;ao#h3pgFX)ykILHnP^Gl_6EeeT% z0+t&k%M%?lZrKTtrQ{J^&Jm?5i-d6LizoCck?}EHO0T=Ulf~EPOei?%-G@~-d9t8q z=cTXOW#WOQiQC$%lo+&gII>%*F$ zw15w`xKMIWBUG?8t=VR2O1T~KGIGH>XFQ8iOi1N7RLbn!1-hnBQ=4tp#V8PsZ$R`4 z&@+0YR^Ik-yw4b~CzPZJhcE8S)$xien#f*`m9AoMp<&=f$-f%R#vR~fPgGdWKfUd@ zbx&)3L{Eh5mJCR|i*Uc85DVX-85b9L92@m6oc!%~IvrG_we|o8{GxAgehO7n&RM>( zueO&v1Myl^Q-}l;<%BN$z6yoTv=5Nra}(EE^nxpJK48XHdKbH8+tbP$FS(>=NyhL+ zZSdQ7*w4y1(0F90ZSFR}(YkR~?4$Pmv_FF7aOA;SCsqIGbeOdv-$6j7q(HqpQ?wKi z=1i58zu30THDycMBx-dcmBJKC?W^C%La%^Uq)C)W@gt8*ue&gCQ&-o~*kMKz^)eIe zUs4Rv2615L_}-k{S7UvHfwZcpaA-e1cDN&5AVG_hK;^Ol0$N$gtnCAcnG6kPb;2iI z1p&F%DayyD(7DF2-$cvZ(^gS(s6R8;@XcaT=z9eRk{_MY2h8*XgFA;lUPPs+Pw{(P zlr1)({UoIl7Yo{Yi<(;6R`OFL2%@HgorH=6xgfdVorMgyj2yP)$6-`T?`gWNHi5kb4>&orS zjz&s>sB2Q*5qT7_#T;rX^jCtxTSp;~MZd10{uH!%K&}?V%a-E^xYYPfHc3wgYet11}HYHP1<6eYE?33Ie93#m2 z+*6UOz}dyXvfwwcLU!Pq`?h4soDJ6b)`%1*LdAmFIg^M`1TfvwK~mMXeM<8sT{z8; zbYCg;TBOY?1!)5jdu*9^PBo^q-8ZJ#N}2t+cpEpk%*sGPMmM{2#vJHreRv+IViWYf z6QBrLV8RYgP(dKiQd~>JV<2Af7Zgkg(JA;7uG4M~Jl+<4dDV6p9YLjKm~S!fluy6| zCC>9~hv20SF7O01tUOHrY>b2s+MlOYP*fik2cs2ILD}}quCx*>|2T*tMJIUz%2f`D z%uz^8FhGKX{BD1xGlhF^wImLZ<=^A#DSU|LK!0rk4i6yo<+&@z)z%_~IZO@LvqIbe z?O)SO78tb#IOm02xOU(@XVa_ZVXO;H2wli-ti5dfTr4WRWalv>RYY5oI>R@JPj&k64gqHxQ003PGC1!{Q&HZ?bblFOQ@g0Ke3(jL>i{Ou-NAJuF9 zXV|7dJ1*-Si+(k{1N5q@OwtE1)O-#xdvjg>`&JQG9#ZH$u|RD$bm}e|qU@b+pYOLn zz9E%1cPn~8CCba_Y_KhPx*(3TAyu#2ZBs&Nc`r2nCA?^QU6@TFcod`}>Y^br=x$vI ztk9kSid$0Q!{GfExi&fG0l4Pc?NFD8To#(7!Hma|dR2ayND$puI!$u9X^ z3?R7*yh8hwPY;*Y}hyGH23KnmK>5c8hD_48Mg zwYHlxaz{pt&uur$nK&a1M#xN_03KD63@fu(dskgc=2noF!_D1K^iC{~uu&n6OGd{q z1+jQdWEXl-vN9eUXhJz$7~xvT=mZ!DaQB_{SLApjL)8nXqMEh0E7Fe^u3pIWg)+ai6+DzH(X^Uc>T|IVlk$$2KL)sS zMg~3Kh|X+`X$cgnah`y&0A!PPU>PTi1iCD18}}jKz#}${-gS|YBExPg-hh=ZYVd># z;RbzQ6C4!SX(sdr(C$X4*KTIs>9-A6G)*GQ`%0+{txMTtvpglAQirqM=XH$TKy{Qu zCIno+{l9mx5YtI86MhsMbI-k*S8x53sepDIY6m!Lp$7nX#k(k9p|6LPJ7pOK$)QPSlEhzlbNyY<&RG~g73nQ{|L ze@*m7$clIG5+gbQrjh}`kOv$scu%g<)Q<=;U@x*wLOXsreA6VMH>ii7z75ikP@MVTDAuPHObl*&QdDH7P!{WVBnQ(ED|71`w5Ul zTY%TT)Mx#aI?5Im@c6?8e|? zldX#)5C3D1{EdhBJYj+*B}I5{3)~vTD_)Sbqlu_zNQt_bm8g>|u;p;|edMmc;FM3) z)e1w~EvO+%Nm%?);uHIl-;(UcDP}aG;Y`Y}6r;_m;N0}t17h2}vG7dX|49E{EaTKk zN<*HLTk(=B%(|!_A;WD&(?3Jf9AUV2c(n(r1ChI@6rDy@;oHnU=2<9#JsVq+^nB9e z=^t7ZqoK8qpdTCZk`Rac{ImeVv>nLfVOv)J96PN;Z62q1oTW|5I~lp$Q0p?%%=~(M zCh#=iD;o$1xP_RuC=*X^-33AC3(t%Jiz$4!X#m;)w|BYJiBNNFWj0`vcZSj5u^WYr z{~}PpLNa>@7Fz)Kn+G^cl)L0bP$XF1hJcGMYLU@MC4H)GUS0(kOvA7 zgCZN3B=vY$ABM48f|Bnc&12~yS$mcP5GOG=Cqk1%-;jY)oM+l-fXI$ygR5wHd!8VZ zJm`h74(LF|ft?G3#9GrRHSjvMdt`!}xelnUyvIO&jhv3JW+f8j6m-*z_>soSax;|k ze6nPbpe_=mo!!JH^v9poF+rl8lM@^`!-Cw33gDmsstJB7e=K+?jDg)oHCuV~08%ym zt`(jXVeSQ5a4!4sKTwy8;tXB|l?!5MO<};^YzGmodPp%jML)rXv}({NQHCmAj`n}Itw0onP`XIJCY;+JP^4=D zlmr>D6PUdnz>!&X!e33K=Hg{SZbEhvJS~p;f3fyeGbi(IPn4gK9HC`)4vDFGgfVnN zy;}W7qh}A{0v6y|qwWqm@dM3S8i>)M{T;g@4>Z0(kHWP?Icpiz-efA&B(Cbzlbjq^ ze4O8aN<@JCi2R`EU*IsYsv`j{8T?UltNbyUz2GnNFT^2H{$`Zl>p-LYIRYu<`@Vu_ z6JT%A9j%eDP}`wOLcAAeEGS=jXm~y8+&~EE5?~m>BDBY3G9EBsFy#U@XhXljjGQrC z87lu6BlYpDNF;z9UP=V917NnN1rkiyv+oGw!?thStkiBw@oPf#mC3=`N|FPOPF1Dr z!Nkh>1`iB-0n`&=44c$0pb|0Wxa&ezFj5I%uLTts8X&AlV95KDq)0-FYpu!o@bqEo z1jV*C@)JZFjbs?lTxKG&WtXi0AZ}3tfZ{J%ZoiyLd$IK3^xzuy^Vz~p#{3-q`RiP) zsTy%t;E?ROWZ24?i8b^Soo_uBP-Q$+6^6Sea}ZG9CBkrXK!pM#$C*NK*_59vtl0O$ zO+p3SjN_S9VkGpdAagtE^n4)I%+JUgM$)}sF|cHl&k!-f8;93$?}p}1ygmE&oiO9X z&JQ}7smsB^WjB!g-+-ZJ+9Kh6vz6wH6hjR$cn^&W*qIQNuPO|!Dw39)Loi0o*JT6~ zk8K}fsJ&P~heyf>m>e;soU6XIHKT}M=7Q3^sIH&vwk8N~a7fS-R5 zY!(GcP0+MF*Sz#>%}GC_+pwE4C~5k*k_V0w51Sv!`8ffgZOEeWlVqyN+d3XpN{xM- ztIhjV_%yF-(5hVFx?UfbrhdCOLblOPf?iEm~ z+l^Dv4CHHoS-bH7G6BTXh*=1_6yO~F-8bSMm3b9ff{n#khpUK+U=~VE{{u&RC~Lea zkwvmo6u}P&VqIXWg7V;v!)YUKbEbsN{PbrhpF6HezZxAoSgBS-4r-J&3F)-&32_z- z;1T2|?QX}S@m&OQ#I1^sqeud-L_M>t5UQf~-M11I!C#hO9_}y%%S@S|-*u=8kc=`oXes#$+XTPP;nu@w6KF>{lNQ88~xYo zZ^90227DPQU32yH{*sONIBv+!<2Mo{1EDHTSjs%r#I5LJy~Vq&VeG5y8OIL+tc X?}h4n+ZrkO?~C;t*Iiu`n)d$yVpw-S literal 0 HcmV?d00001