From 77531ca3474c3a8c1a05c4774ac8adba6e0925d2 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Sat, 26 Aug 2023 20:34:11 +0100 Subject: [PATCH 01/33] Drastically refactor glTexImage2D --- CMakeLists.txt | 5 +- GL/flush.c | 16 +- GL/platforms/software.c | 4 + GL/private.h | 7 +- GL/state.c | 12 + GL/texture.c | 703 +-- include/GL/gl.h | 35 +- include/GL/glkos.h | 18 +- samples/nehe06/main.c | 5 +- samples/prof_texture_upload/image.h | 8207 +++++++++++++++++++++++++++ samples/prof_texture_upload/main.c | 47 + tests/CMakeLists.txt | 26 + tests/test_glteximage2d.h | 74 + tools/test.h | 445 ++ tools/test_generator.py | 212 + 15 files changed, 9410 insertions(+), 406 deletions(-) create mode 100644 samples/prof_texture_upload/image.h create mode 100644 samples/prof_texture_upload/main.c create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test_glteximage2d.h create mode 100644 tools/test.h create mode 100755 tools/test_generator.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 41a2b07..9cb2edd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,6 +175,8 @@ function(gen_sample sample) endif() endfunction() +add_subdirectory(tests) + gen_sample(blend_test samples/blend_test/main.c) gen_sample(depth_funcs samples/depth_funcs/main.c) gen_sample(depth_funcs_alpha_testing samples/depth_funcs_alpha_testing/main.c samples/depth_funcs_alpha_testing/gl_png.c) @@ -206,9 +208,10 @@ gen_sample(zclip_trianglestrip samples/zclip_trianglestrip/main.c) gen_sample(scissor samples/scissor/main.c) gen_sample(polymark samples/polymark/main.c) gen_sample(cubes samples/cubes/main.cpp) - gen_sample(zclip_test tests/zclip/main.cpp) +gen_sample(prof_texture_upload samples/prof_texture_upload/main.c) + if(PLATFORM_DREAMCAST) gen_sample(trimark samples/trimark/main.c) gen_sample(quadmark samples/quadmark/main.c samples/profiler.c) diff --git a/GL/flush.c b/GL/flush.c index cf85a4e..b2aab2d 100644 --- a/GL/flush.c +++ b/GL/flush.c @@ -49,7 +49,15 @@ void APIENTRY glKosInitConfig(GLdcConfig* config) { config->internal_palette_format = GL_RGBA8; } +static bool _initialized = false; + void APIENTRY glKosInitEx(GLdcConfig* config) { + if(_initialized) { + return; + } + + _initialized = true; + TRACE(); printf("\nWelcome to GLdc! Git revision: %s\n\n", GLDC_VERSION); @@ -83,6 +91,12 @@ void APIENTRY glKosInitEx(GLdcConfig* config) { aligned_vector_reserve(&TR_LIST.vector, config->initial_tr_capacity); } +void APIENTRY glKosShutdown() { + aligned_vector_clear(&OP_LIST.vector); + aligned_vector_clear(&PT_LIST.vector); + aligned_vector_clear(&TR_LIST.vector); +} + void APIENTRY glKosInit() { GLdcConfig config; glKosInitConfig(&config); @@ -117,4 +131,4 @@ void APIENTRY glKosSwapBuffers() { aligned_vector_clear(&TR_LIST.vector); _glApplyScissor(true); -} \ No newline at end of file +} diff --git a/GL/platforms/software.c b/GL/platforms/software.c index 59d3859..d9d7fc8 100644 --- a/GL/platforms/software.c +++ b/GL/platforms/software.c @@ -33,6 +33,10 @@ static VideoMode vid_mode = { AlignedVector vbuffer; void InitGPU(_Bool autosort, _Bool fsaa) { + + // 32-bit SDL has trouble with the wayland driver for some reason + setenv("SDL_VIDEODRIVER", "x11", 1); + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS); WINDOW = SDL_CreateWindow( diff --git a/GL/private.h b/GL/private.h index b0fe41a..5b11c52 100644 --- a/GL/private.h +++ b/GL/private.h @@ -164,7 +164,9 @@ typedef struct { GLboolean isCompressed; GLboolean isPaletted; //50 - GLubyte padding[14]; // Pad to 64-bytes + GLenum internalFormat; + //54 + GLubyte padding[10]; // Pad to 64-bytes } __attribute__((aligned(32))) TextureObject; typedef struct { @@ -376,6 +378,9 @@ extern GLubyte ACTIVE_TEXTURE; extern GLboolean TEXTURES_ENABLED[]; GLubyte _glGetActiveTexture(); +GLint _glGetTextureInternalFormat(); +GLboolean _glGetTextureTwiddle(); +void _glSetTextureTwiddle(GLboolean v); GLuint _glGetActiveClientTexture(); TexturePalette* _glGetSharedPalette(GLshort bank); diff --git a/GL/state.c b/GL/state.c index 2a16367..52f2656 100644 --- a/GL/state.c +++ b/GL/state.c @@ -494,7 +494,11 @@ GLAPI void APIENTRY glEnable(GLenum cap) { GPUState.is_dirty = GL_TRUE; } break; + case GL_TEXTURE_TWIDDLE_KOS: + _glSetTextureTwiddle(GL_TRUE); + break; default: + _glKosThrowError(GL_INVALID_VALUE, __func__); break; } } @@ -596,7 +600,11 @@ GLAPI void APIENTRY glDisable(GLenum cap) { GPUState.is_dirty = GL_TRUE; } break; + case GL_TEXTURE_TWIDDLE_KOS: + _glSetTextureTwiddle(GL_FALSE); + break; default: + _glKosThrowError(GL_INVALID_VALUE, __func__); break; } } @@ -977,6 +985,10 @@ void APIENTRY glGetIntegerv(GLenum pname, GLint *params) { case GL_FREE_CONTIGUOUS_TEXTURE_MEMORY_KOS: *params = _glFreeContiguousTextureMemory(); break; + case GL_TEXTURE_INTERNAL_FORMAT_KOS: + *params = _glGetTextureInternalFormat(); + break; + default: _glKosThrowError(GL_INVALID_ENUM, __func__); break; diff --git a/GL/texture.c b/GL/texture.c index e18c2e4..13f7605 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -23,16 +23,67 @@ GLubyte ACTIVE_TEXTURE = 0; static TexturePalette* SHARED_PALETTES[MAX_GLDC_SHARED_PALETTES] = {NULL, NULL, NULL, NULL}; -static GLuint _determinePVRFormat(GLint internalFormat, GLenum type); +static GLuint _determinePVRFormat(GLint internalFormat); static GLboolean BANKS_USED[MAX_GLDC_PALETTE_SLOTS]; // Each time a 256 colour bank is used, this is set to true static GLboolean SUBBANKS_USED[MAX_GLDC_PALETTE_SLOTS][MAX_GLDC_4BPP_PALETTE_SLOTS]; // 4 counts of the used 16 colour banks within the 256 ones static GLenum INTERNAL_PALETTE_FORMAT = GL_RGBA8; +static GLboolean TEXTURE_TWIDDLE_ENABLED = GL_FALSE; static void* YALLOC_BASE = NULL; static size_t YALLOC_SIZE = 0; +static const unsigned short MortonTable256[256] = + { + 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015, + 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055, + 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115, + 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155, + 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415, + 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455, + 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515, + 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555, + 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015, + 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055, + 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115, + 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155, + 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415, + 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455, + 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515, + 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555, + 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015, + 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055, + 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115, + 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155, + 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415, + 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455, + 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515, + 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555, + 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015, + 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055, + 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115, + 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155, + 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415, + 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455, + 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515, + 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555 +}; + + +/* Given a 0-based texel location, and an image width/height. Return the + * new 0-based texel location */ +GL_FORCE_INLINE uint32_t twid_location(uint32_t i, uint32_t w, uint32_t h) { + uint16_t y = i % w; + uint16_t x = i / w; + + return MortonTable256[y >> 8] << 17 | + MortonTable256[x >> 8] << 16 | + MortonTable256[y & 0xFF] << 1 | + MortonTable256[x & 0xFF]; +} + + static void* yalloc_alloc_and_defrag(size_t size) { void* ret = yalloc_alloc(YALLOC_BASE, size); @@ -146,78 +197,12 @@ static void _glReleasePaletteSlot(GLshort slot, GLushort size) } } -/* Linear/iterative twiddling algorithm from Marcus' tatest */ -#define TWIDTAB(x) ( (x&1)|((x&2)<<1)|((x&4)<<2)|((x&8)<<3)|((x&16)<<4)| \ - ((x&32)<<5)|((x&64)<<6)|((x&128)<<7)|((x&256)<<8)|((x&512)<<9) ) -#define TWIDOUT(x, y) ( TWIDTAB((y)) | (TWIDTAB((x)) << 1) ) - - -static void GPUTextureTwiddle8PPP(void* src, void* dst, uint32_t w, uint32_t h) { - uint32_t x, y, yout, min, mask; - - min = MIN(w, h); - mask = min - 1; - - uint8_t* pixels; - uint16_t* vtex; - pixels = (uint8_t*) src; - vtex = (uint16_t*) dst; - - for(y = 0; y < h; y += 2) { - yout = y; - for(x = 0; x < w; x++) { - int32_t idx = TWIDOUT((yout & mask) / 2, x & mask) + - (x / min + yout / min)*min * min / 2; - - gl_assert(idx < (w * h)); - vtex[idx] = pixels[y * w + x] | (pixels[(y + 1) * w + x] << 8); - } - } +GLboolean _glGetTextureTwiddle() { + return TEXTURE_TWIDDLE_ENABLED; } -static void GPUTextureTwiddle4PPP(void* src, void* dst, uint32_t w, uint32_t h) { - uint32_t x, y, yout, min, mask; - - min = MIN(w, h); - mask = min - 1; - - uint8_t* pixels; - uint16_t* vtex; - pixels = (uint8_t*) src; - vtex = (uint16_t*) dst; - - for(y = 0; y < h; y += 2) { - yout = y; - for (x = 0; x < w; x += 2) { - vtex[TWIDOUT((x & mask) / 2, (yout & mask) / 2) + - (x / min + yout / min) * min * min / 4] = - vtex[TWIDOUT((x & mask) / 2, (yout & mask) / 2) + - (x / min + yout / min) * min * min / 4] = - ((pixels[(x + y * w) >> 1] & 15) << 8) | ((pixels[(x + (y + 1) * w) >> 1] & 15) << 12) | - ((pixels[(x + y * w) >> 1] >> 4) << 0) | ((pixels[(x + (y + 1) * w) >> 1] >> 4) << 4); - } - } -} - -static void GPUTextureTwiddle16BPP(void * src, void* dst, uint32_t w, uint32_t h) { - uint32_t x, y, yout, min, mask; - - min = MIN(w, h); - mask = min - 1; - - uint16_t* pixels; - uint16_t* vtex; - pixels = (uint16_t*) src; - vtex = (uint16_t*) dst; - - for(y = 0; y < h; y++) { - yout = y; - - for(x = 0; x < w; x++) { - vtex[TWIDOUT(x & mask, yout & mask) + - (x / min + yout / min)*min * min] = pixels[y * w + x]; - } - } +void _glSetTextureTwiddle(GLboolean v) { + TEXTURE_TWIDDLE_ENABLED = v; } TexturePalette* _glGetSharedPalette(GLshort bank) { @@ -278,7 +263,27 @@ GLubyte _glGetActiveTexture() { return ACTIVE_TEXTURE; } - static GLint _determineStride(GLenum format, GLenum type) { +static GLint _determineStrideInternal(GLenum internalFormat) { + switch(internalFormat) { + case GL_RGB565_KOS: + case GL_ARGB4444_KOS: + case GL_ARGB1555_KOS: + case GL_RGB565_TWID_KOS: + case GL_ARGB4444_TWID_KOS: + case GL_ARGB1555_TWID_KOS: + return 2; + case GL_COLOR_INDEX8_TWID_KOS: + case GL_COLOR_INDEX4_TWID_KOS: + case GL_COLOR_INDEX4_EXT: + case GL_COLOR_INDEX8_EXT: + return 1; + } + + return -1; +} + + +static GLint _determineStride(GLenum format, GLenum type) { switch(type) { case GL_BYTE: case GL_UNSIGNED_BYTE: @@ -528,6 +533,16 @@ TextureObject* _glGetBoundTexture() { return TEXTURE_UNITS[ACTIVE_TEXTURE]; } +GLint _glGetTextureInternalFormat() { + TextureObject* obj = _glGetBoundTexture(); + if(!obj) { + return -1; + } + + return obj->internalFormat; +} + + void APIENTRY glActiveTextureARB(GLenum texture) { TRACE(); @@ -538,8 +553,6 @@ void APIENTRY glActiveTextureARB(GLenum texture) { ACTIVE_TEXTURE = texture & 0xF; gl_assert(ACTIVE_TEXTURE < MAX_GLDC_TEXTURE_UNITS); - gl_assert(ACTIVE_TEXTURE >= 0); - gl_assert(TEXTURE_OBJECTS.element_size > 0); } @@ -837,10 +850,8 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target, /* Set the required mipmap count */ active->width = width; active->height = height; - active->color = _determinePVRFormat( - internalFormat, - internalFormat /* Doesn't matter (see determinePVRFormat) */ - ); + active->internalFormat = internalFormat; + active->color = _determinePVRFormat(internalFormat); active->mipmapCount = _glGetMipmapLevelCount(active); active->mipmap = (mipmapped) ? ~0 : (1 << level); /* Set only a single bit if this wasn't mipmapped otherwise set all */ active->isCompressed = GL_TRUE; @@ -868,53 +879,95 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target, _glGPUStateMarkDirty(); } +static GLboolean isTwiddledInternalFormat(GLint internalFormat) { + switch(internalFormat) { + case GL_RGB565_TWID_KOS: + case GL_ARGB4444_TWID_KOS: + case GL_ARGB1555_TWID_KOS: + case GL_COLOR_INDEX8_TWID_KOS: + case GL_COLOR_INDEX4_TWID_KOS: + case GL_RGB_TWID_KOS: + case GL_RGBA_TWID_KOS: + return true; + default: + return false; + } +} + +/** + * Takes an internal format, and returns a GL format matching how we'd store + * it internally, so it'll return one of the following: + * + * - GL_RGB565_KOS, + * - GL_ARGB4444_KOS + * - GL_ARGB1555_KOS + * - GL_RGB565_TWID_KOS + * - GL_ARGB4444_TWID_KOS + * - GL_ARGB1555_TWID_KOS + * - GL_COLOR_INDEX8_EXT + * - GL_COLOR_INDEX4_EXT + * - GL_COLOR_INDEX8_TWID_KOS + * - GL_COLOR_INDEX4_TWID_KOS + */ static GLint _cleanInternalFormat(GLint internalFormat) { switch (internalFormat) { + case GL_RGB565_KOS: + case GL_ARGB4444_KOS: + case GL_ARGB1555_KOS: + case GL_RGB565_TWID_KOS: + case GL_ARGB4444_TWID_KOS: + case GL_ARGB1555_TWID_KOS: + case GL_COLOR_INDEX8_TWID_KOS: + case GL_COLOR_INDEX4_TWID_KOS: case GL_COLOR_INDEX4_EXT: - return GL_COLOR_INDEX4_EXT; case GL_COLOR_INDEX8_EXT: - return GL_COLOR_INDEX8_EXT; + /* All of these formats are fine as they are, no conversion needed */ + return internalFormat; + case GL_RGB_TWID_KOS: + return GL_RGB565_TWID_KOS; + case GL_RGBA_TWID_KOS: + return GL_ARGB4444_TWID_KOS; case GL_ALPHA: -/* case GL_ALPHA4: + case GL_ALPHA4: case GL_ALPHA8: case GL_ALPHA12: - case GL_ALPHA16:*/ - return GL_ALPHA; + case GL_ALPHA16: + return (TEXTURE_TWIDDLE_ENABLED) ? GL_ARGB4444_TWID_KOS : GL_ARGB4444_KOS; case 1: case GL_LUMINANCE: -/* case GL_LUMINANCE4: + case GL_LUMINANCE4: case GL_LUMINANCE8: case GL_LUMINANCE12: - case GL_LUMINANCE16:*/ - return GL_LUMINANCE; + case GL_LUMINANCE16: + return (TEXTURE_TWIDDLE_ENABLED) ? GL_ARGB1555_TWID_KOS : GL_ARGB1555_KOS; case 2: case GL_LUMINANCE_ALPHA: -/* case GL_LUMINANCE4_ALPHA4: + case GL_LUMINANCE4_ALPHA4: case GL_LUMINANCE6_ALPHA2: case GL_LUMINANCE8_ALPHA8: case GL_LUMINANCE12_ALPHA4: case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: */ - return GL_LUMINANCE_ALPHA; -/* case GL_INTENSITY: + case GL_LUMINANCE16_ALPHA16: + return (TEXTURE_TWIDDLE_ENABLED) ? GL_ARGB4444_TWID_KOS : GL_ARGB4444_KOS; + case GL_INTENSITY: case GL_INTENSITY4: case GL_INTENSITY8: case GL_INTENSITY12: case GL_INTENSITY16: - return GL_INTENSITY; */ + return (TEXTURE_TWIDDLE_ENABLED) ? GL_ARGB4444_TWID_KOS : GL_ARGB4444_KOS; case 3: - return GL_RGB; + return (TEXTURE_TWIDDLE_ENABLED) ? GL_RGB565_TWID_KOS : GL_RGB565_KOS; case GL_RGB: - /* case GL_R3_G3_B2: */ + case GL_R3_G3_B2: case GL_RGB4: case GL_RGB5: case GL_RGB8: case GL_RGB10: case GL_RGB12: case GL_RGB16: - return GL_RGB; + return (TEXTURE_TWIDDLE_ENABLED) ? GL_RGB565_TWID_KOS : GL_RGB565_KOS; case 4: - return GL_RGBA; + return (TEXTURE_TWIDDLE_ENABLED) ? GL_ARGB4444_TWID_KOS : GL_ARGB4444_KOS; case GL_RGBA: case GL_RGBA2: case GL_RGBA4: @@ -923,92 +976,51 @@ static GLint _cleanInternalFormat(GLint internalFormat) { case GL_RGB10_A2: case GL_RGBA12: case GL_RGBA16: - return GL_RGBA; - + return (TEXTURE_TWIDDLE_ENABLED) ? GL_ARGB4444_TWID_KOS : GL_ARGB4444_KOS; /* Support ARB_texture_rg */ case GL_RED: -/* case GL_R8: + case GL_R8: case GL_R16: - case GL_RED: - case GL_COMPRESSED_RED: */ - return GL_RED; -/* case GL_RG: + case GL_COMPRESSED_RED: + return (TEXTURE_TWIDDLE_ENABLED) ? GL_RGB565_TWID_KOS : GL_RGB565_KOS; + case GL_RG: case GL_RG8: case GL_RG16: case GL_COMPRESSED_RG: - return GL_RG;*/ + return (TEXTURE_TWIDDLE_ENABLED) ? GL_RGB565_TWID_KOS : GL_RGB565_KOS; default: return -1; } } - static GLuint _determinePVRFormat(GLint internalFormat, GLenum type) { +static GLuint _determinePVRFormat(GLint internalFormat) { /* Given a cleaned internalFormat, return the Dreamcast format * that can hold it */ switch(internalFormat) { - case GL_ALPHA: - case GL_LUMINANCE: - case GL_LUMINANCE_ALPHA: - case GL_RGBA: - /* OK so if we have something that requires alpha, we return 4444 unless - * the type was already 1555 (1-bit alpha) in which case we return that - */ - if(type == GL_UNSIGNED_SHORT_1_5_5_5_REV) { - return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_NONTWIDDLED; - } else if(type == GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS) { - return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_TWIDDLED; - } else if(type == GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS) { - return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_TWIDDLED; - } else { - return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_NONTWIDDLED; - } - case GL_RED: - case GL_RGB: - switch(type) { - case GL_UNSIGNED_SHORT_5_6_5_TWID_KOS: - return GPU_TXRFMT_RGB565 | GPU_TXRFMT_TWIDDLED; - case GL_COMPRESSED_RGB_565_VQ_KOS: - case GL_COMPRESSED_RGB_565_VQ_MIPMAP_KOS: - return GPU_TXRFMT_RGB565 | GPU_TXRFMT_NONTWIDDLED | GPU_TXRFMT_VQ_ENABLE; - case GL_COMPRESSED_RGB_565_VQ_TWID_KOS: - case GL_COMPRESSED_RGB_565_VQ_MIPMAP_TWID_KOS: - return GPU_TXRFMT_RGB565 | GPU_TXRFMT_TWIDDLED | GPU_TXRFMT_VQ_ENABLE; - default: - return GPU_TXRFMT_RGB565 | GPU_TXRFMT_NONTWIDDLED; - } - break; - /* Compressed and twiddled versions */ - case GL_UNSIGNED_SHORT_5_6_5_TWID_KOS: - return GPU_TXRFMT_RGB565 | GPU_TXRFMT_TWIDDLED; - case GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS: - return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_TWIDDLED; - case GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS: - return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_TWIDDLED; - case GL_COMPRESSED_RGB_565_VQ_KOS: - case GL_COMPRESSED_RGB_565_VQ_MIPMAP_KOS: - return GPU_TXRFMT_RGB565 | GPU_TXRFMT_NONTWIDDLED | GPU_TXRFMT_VQ_ENABLE; - case GL_COMPRESSED_RGB_565_VQ_TWID_KOS: - case GL_COMPRESSED_RGB_565_VQ_MIPMAP_TWID_KOS: - return GPU_TXRFMT_RGB565 | GPU_TXRFMT_TWIDDLED | GPU_TXRFMT_VQ_ENABLE; - case GL_COMPRESSED_ARGB_4444_VQ_TWID_KOS: - case GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_TWID_KOS: - return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_TWIDDLED | GPU_TXRFMT_VQ_ENABLE; - case GL_COMPRESSED_ARGB_4444_VQ_KOS: - case GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_KOS: - return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_NONTWIDDLED | GPU_TXRFMT_VQ_ENABLE; - case GL_COMPRESSED_ARGB_1555_VQ_KOS: - case GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_KOS: - return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_NONTWIDDLED | GPU_TXRFMT_VQ_ENABLE; - case GL_COMPRESSED_ARGB_1555_VQ_TWID_KOS: - case GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_TWID_KOS: - return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_TWIDDLED | GPU_TXRFMT_VQ_ENABLE; - case GL_COLOR_INDEX8_EXT: - return GPU_TXRFMT_PAL8BPP | GPU_TXRFMT_TWIDDLED; - case GL_COLOR_INDEX4_EXT: - return GPU_TXRFMT_PAL4BPP | GPU_TXRFMT_TWIDDLED; - default: - return 0; + case GL_RGB565_KOS: + return GPU_TXRFMT_RGB565 | GPU_TXRFMT_NONTWIDDLED; + case GL_ARGB4444_KOS: + return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_NONTWIDDLED; + case GL_ARGB1555_KOS: + return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_NONTWIDDLED; + case GL_RGB565_TWID_KOS: + return GPU_TXRFMT_RGB565 | GPU_TXRFMT_TWIDDLED; + case GL_ARGB4444_TWID_KOS: + return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_TWIDDLED; + case GL_ARGB1555_TWID_KOS: + return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_TWIDDLED; + case GL_COLOR_INDEX8_EXT: + return GPU_TXRFMT_PAL8BPP | GPU_TXRFMT_NONTWIDDLED; + case GL_COLOR_INDEX4_EXT: + return GPU_TXRFMT_PAL4BPP | GPU_TXRFMT_NONTWIDDLED; + case GL_COLOR_INDEX8_TWID_KOS: + return GPU_TXRFMT_PAL8BPP | GPU_TXRFMT_TWIDDLED; + case GL_COLOR_INDEX4_TWID_KOS: + return GPU_TXRFMT_PAL4BPP | GPU_TXRFMT_TWIDDLED; + default: + _glKosThrowError(GL_INVALID_ENUM, __func__); + return 0; } } @@ -1121,109 +1133,68 @@ static inline void _a8_to_argb4444(const GLubyte* source, GLubyte* dest) { *((GLushort*) dest) = (color << 8) | color; } -static TextureConversionFunc _determineConversion(GLint internalFormat, GLenum format, GLenum type) { - switch(internalFormat) { - case GL_ALPHA: { - if(format == GL_ALPHA) { - /* Dreamcast doesn't really support GL_ALPHA internally, so store as argb with each rgb value as white */ - /* Applying alpha values to all channels seems a better option*/ - return _a8_to_argb4444; - } else if(type == GL_UNSIGNED_BYTE && format == GL_RGBA) { - return _rgba8888_to_a000; - } else if(type == GL_BYTE && format == GL_RGBA) { - return _rgba8888_to_a000; - } - } break; - case GL_RED: { - if(type == GL_UNSIGNED_BYTE && format == GL_RED) { - /* Dreamcast doesn't really support GL_RED internally, so store as rgb */ - return _r8_to_rgb565; - } - } break; - case GL_RGB: { - if(type == GL_UNSIGNED_BYTE && format == GL_RGB) { - return _rgb888_to_rgb565; - } else if(type == GL_UNSIGNED_BYTE && format == GL_RGBA) { - return _rgba8888_to_rgb565; - } else if(type == GL_BYTE && format == GL_RGB) { - return _rgb888_to_rgb565; - } else if(type == GL_UNSIGNED_BYTE && format == GL_RED) { - return _r8_to_rgb565; - } - } break; - case GL_RGBA: { - if(type == GL_UNSIGNED_BYTE && format == GL_RGBA) { - return _rgba8888_to_argb4444; - } else if (type == GL_BYTE && format == GL_RGBA) { - return _rgba8888_to_argb4444; - } else if(type == GL_UNSIGNED_SHORT_4_4_4_4 && format == GL_RGBA) { - return _rgba4444_to_argb4444; - } - } break; - case GL_RGBA8: - case GL_RGBA4: - case GL_RGB5_A1: - case GL_RGB565_KOS: +/* Given an cleaned internal format, and the passed format and type, this returns: + * + * 0 if not conversion is necessary + * 1 if a conversion is necessary (func will be set) + * 2 if twiddling is necessary + * 3 if twiddling and conversion is necessary (func will be set) + * -1 if a conversion is unsupported + * + */ +static int _determineConversion(GLint internalFormat, GLenum format, GLenum type, TextureConversionFunc* func) { + static struct Entry { + GLint internalFormat; + GLenum format; + GLenum type; + TextureConversionFunc func; + bool twiddle; + } conversions [] = { + {GL_ARGB4444_KOS, GL_ALPHA, GL_UNSIGNED_BYTE, _a8_to_argb4444, false}, + {GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_argb4444, false}, + {GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, _rgba4444_to_argb4444, false}, + {GL_ARGB4444_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, NULL, false}, + {GL_ARGB4444_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS, NULL, false}, + {GL_ARGB4444_TWID_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_argb4444, true}, + {GL_ARGB1555_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL, false}, + {GL_ARGB1555_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS, NULL, false}, + {GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_rgb565, false}, + {GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, _r8_to_rgb565, false}, + {GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_BYTE, _rgb888_to_rgb565, false}, + {GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_rgb565, false}, + {GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, _r8_to_rgb565, false}, + {GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL, false}, + {GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_TWID_KOS, NULL, false}, + {GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_BYTE, _rgb888_to_rgb565, true}, + {GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, NULL, false}, + {GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_BYTE, NULL, false}, + {GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, NULL, false}, + }; - if(type == GL_UNSIGNED_BYTE && format == GL_RGBA) { - return _rgba8888_to_rgba8888; + for(size_t i = 0; i < sizeof(conversions) / sizeof(struct Entry); ++i) { + struct Entry* e = conversions + i; + if(e->format == format && e->internalFormat == internalFormat && e->type == type) { + *func = e->func; + int ret = (e->func) ? 1 : 0; + ret += (e->twiddle) ? 2 : 0; + return ret; } - else - if (type == GL_BYTE && format == GL_RGBA) { - return _rgba8888_to_rgba8888; - } - else - if(type == GL_UNSIGNED_BYTE && format == GL_RGB) { - return _rgb888_to_rgba8888; - } - else - if (type == GL_BYTE && format == GL_RGB) { - return _rgb888_to_rgba8888; - } - else - if(type == GL_UNSIGNED_SHORT_4_4_4_4 && format == GL_RGBA) { - return _rgba4444_to_rgba8888; - } - else - if(type == GL_UNSIGNED_BYTE && format == GL_RGBA4) { - return _rgba4444_to_rgba8888; - } - else - if(type == GL_UNSIGNED_BYTE && format == GL_RGB5_A1) { - return _rgba5551_to_rgba8888; - } - else - if(type == GL_UNSIGNED_BYTE && format == GL_RGB565_KOS) { - return _rgb565_to_rgb8888; - } - break; - case GL_COLOR_INDEX8_EXT: - if(format == GL_COLOR_INDEX) { - switch(type) { - case GL_BYTE: - case GL_UNSIGNED_BYTE: - return _i8_to_i8; - default: - break; - } - } - break; - default: - fprintf(stderr, "Unsupported conversion: %x -> %x, %x\n", internalFormat, format, type); - break; } - return 0; + + return -1; } static GLboolean _isSupportedFormat(GLenum format) { switch(format) { case GL_ALPHA: + case GL_LUMINANCE: + case GL_INTENSITY: + case GL_LUMINANCE_ALPHA: case GL_RED: case GL_RGB: case GL_RGBA: case GL_BGRA: case GL_COLOR_INDEX: - case GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS: return GL_TRUE; default: return GL_FALSE; @@ -1299,49 +1270,44 @@ void _glAllocateSpaceForMipmaps(TextureObject* active) { #define TOSTRING(x) STRINGIFY(x) #define INFO_MSG(x) fprintf(stderr, "%s:%s > %s\n", __FILE__, TOSTRING(__LINE__), x) -void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, - GLsizei width, GLsizei height, GLint border, - GLenum format, GLenum type, const GLvoid *data) { - - TRACE(); - +static bool _glTexImage2DValidate(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type) { if(target != GL_TEXTURE_2D) { INFO_MSG(""); _glKosThrowError(GL_INVALID_ENUM, __func__); - return; + return false; } if (width > 1024 || height > 1024){ INFO_MSG("Invalid texture size"); _glKosThrowError(GL_INVALID_VALUE, __func__); - return; + return false; } if(format != GL_COLOR_INDEX) { if(!_isSupportedFormat(format)) { INFO_MSG("Unsupported format"); _glKosThrowError(GL_INVALID_ENUM, __func__); - return; + return false; } /* Abuse determineStride to see if type is valid */ if(_determineStride(GL_RGBA, type) == -1) { INFO_MSG(""); _glKosThrowError(GL_INVALID_ENUM, __func__); - return; + return false; } internalFormat = _cleanInternalFormat(internalFormat); if(internalFormat == -1) { INFO_MSG(""); _glKosThrowError(GL_INVALID_VALUE, __func__); - return; + return false; } } else { if(internalFormat != GL_COLOR_INDEX8_EXT && internalFormat != GL_COLOR_INDEX4_EXT) { INFO_MSG(""); _glKosThrowError(GL_INVALID_ENUM, __func__); - return; + return false; } } @@ -1352,7 +1318,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, /* Width is not a power of two. Must be!*/ INFO_MSG(""); _glKosThrowError(GL_INVALID_VALUE, __func__); - return; + return false; } @@ -1360,7 +1326,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, /* height is not a power of two. Must be!*/ INFO_MSG(""); _glKosThrowError(GL_INVALID_VALUE, __func__); - return; + return false; } } else { /* Mipmap Errors, kos crashes if 1x1 */ @@ -1368,26 +1334,38 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, gl_assert(ACTIVE_TEXTURE < MAX_GLDC_TEXTURE_UNITS); gl_assert(TEXTURE_UNITS[ACTIVE_TEXTURE]); TEXTURE_UNITS[ACTIVE_TEXTURE]->mipmap |= (1 << level); - return; + return false; } } if(level < 0) { INFO_MSG(""); _glKosThrowError(GL_INVALID_VALUE, __func__); - return; + return false; } if(level > 0 && width != height) { INFO_MSG("Tried to set non-square texture as a mipmap level"); printf("[GL ERROR] Mipmaps cannot be supported on non-square textures\n"); _glKosThrowError(GL_INVALID_OPERATION, __func__); - return; + return false; } if(border) { INFO_MSG(""); _glKosThrowError(GL_INVALID_VALUE, __func__); + return false; + } + + return true; +} + +void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, + GLsizei width, GLsizei height, GLint border, + GLenum format, GLenum type, const GLvoid *data) { + + TRACE(); + if(!_glTexImage2DValidate(target, level, internalFormat, width, height, border, format, type)) { return; } @@ -1400,19 +1378,16 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, return; } - gl_assert(active); - GLuint original_id = active->index; - GLboolean isPaletted = (internalFormat == GL_COLOR_INDEX8_EXT || internalFormat == GL_COLOR_INDEX4_EXT) ? GL_TRUE : GL_FALSE; - - /* Calculate the format that we need to convert the data to */ - GLuint pvr_format = _determinePVRFormat(internalFormat, type); + GLenum cleanInternalFormat = _cleanInternalFormat(internalFormat); + GLuint pvrFormat = _determinePVRFormat(cleanInternalFormat); + GLuint originalId = active->index; if(active->data && (level == 0)) { /* pre-existing texture - check if changed */ if(active->width != width || active->height != height || - active->color != pvr_format) { + active->internalFormat != cleanInternalFormat) { /* changed - free old texture memory */ yalloc_free(YALLOC_BASE, active->data); active->data = NULL; @@ -1445,7 +1420,8 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, /* need texture memory */ active->width = width; active->height = height; - active->color = pvr_format; + active->color = pvrFormat; + active->internalFormat = cleanInternalFormat; /* Set the required mipmap count */ active->mipmapCount = _glGetMipmapLevelCount(active); active->mipmap_bias = GL_KOS_INTERNAL_DEFAULT_MIPMAP_LOD_BIAS; @@ -1476,139 +1452,66 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, /* If we run out of PVR memory just return */ if(!active->data) { _glKosThrowError(GL_OUT_OF_MEMORY, __func__); - gl_assert(active->index == original_id); + gl_assert(active->index == originalId); return; } /* Mark this level as set in the mipmap bitmask */ active->mipmap |= (1 << level); - /* Let's assume we need to convert */ - GLboolean needsConversion = GL_TRUE; - - /* Let's assume we need twiddling - we always store things twiddled! */ - GLboolean needsTwiddling = GL_TRUE; - - /* - * These are the only formats where the source format passed in matches the pvr format. - * Note the REV formats + GL_BGRA will reverse to ARGB which is what the PVR supports - */ - if(format == GL_COLOR_INDEX) { - /* Don't convert color indexes */ - needsConversion = GL_FALSE; - - if(type == GL_UNSIGNED_BYTE_TWID_KOS) { - needsTwiddling = GL_FALSE; - } - } else if(format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && internalFormat == GL_RGBA) { - needsConversion = GL_FALSE; - } else if(format == GL_BGRA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV && internalFormat == GL_RGBA) { - needsConversion = GL_FALSE; - } else if(format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 && internalFormat == GL_RGB) { - needsConversion = GL_FALSE; - } else if(format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5_TWID_KOS && internalFormat == GL_RGB) { - needsConversion = GL_FALSE; - needsTwiddling = GL_FALSE; - } else if(format == GL_BGRA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS && internalFormat == GL_RGBA) { - needsConversion = GL_FALSE; - needsTwiddling = GL_FALSE; - } else if(format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS && internalFormat == GL_RGBA) { - needsConversion = GL_FALSE; - needsTwiddling = GL_FALSE; - } - GLubyte* targetData = (active->baseDataOffset == 0) ? active->data : _glGetMipmapLocation(active, level); gl_assert(targetData); - GLubyte* conversionBuffer = NULL; - - if(!data) { - /* No data? Do nothing! */ - gl_assert(active->index == original_id); + TextureConversionFunc conversion; + int needs_conversion = _determineConversion(cleanInternalFormat, format, type, &conversion); + if(needs_conversion < 0) { + _glKosThrowError(GL_INVALID_VALUE, __func__); + INFO_MSG("Couldn't find necessary texture conversion\n"); return; - } else if(!needsConversion && !needsTwiddling) { + } else if(needs_conversion > 0) { + /* Convert the data */ + GLint sourceStride = _determineStride(format, type); + GLint destStride = _determineStrideInternal(cleanInternalFormat); + + if(sourceStride == -1) { + INFO_MSG("Stride was not detected\n"); + _glKosThrowError(GL_INVALID_OPERATION, __func__); + return; + } + + GLubyte* conversionBuffer = (GLubyte*) malloc(bytes); + const GLubyte* src = data; + GLubyte* dst = conversionBuffer; + for(uint32_t i = 0; i < (width * height); ++i) { + if(needs_conversion > 1) { + // Needs twiddling. Set dst to the twiddle location + // for this texel + uint32_t newLocation = twid_location(i, width, height); + dst = conversionBuffer + (destStride * newLocation); + } + + if(conversion) { + conversion(src, dst); + } + + dst += destStride; + src += sourceStride; + } + + FASTCPY(targetData, conversionBuffer, bytes); + free(conversionBuffer); + } else { + /* No conversion necessary, we can just upload data directly */ gl_assert(targetData); gl_assert(data); gl_assert(bytes); /* No conversion? Just copy the data, and the pvr_format is correct */ FASTCPY(targetData, data, bytes); - gl_assert(active->index == original_id); - return; - } else if(needsConversion) { - TextureConversionFunc convert = _determineConversion( - internalFormat, - format, - type - ); - - if(!convert) { - INFO_MSG("Couldn't find conversion\n"); - _glKosThrowError(GL_INVALID_OPERATION, __func__); - return; - } - - GLint stride = _determineStride(format, type); - gl_assert(stride > -1); - - if(stride == -1) { - INFO_MSG("Stride was not detected\n"); - _glKosThrowError(GL_INVALID_OPERATION, __func__); - return; - } - - conversionBuffer = malloc(bytes); - - GLubyte* dest = conversionBuffer; - const GLubyte* source = data; - - gl_assert(conversionBuffer); - gl_assert(source); - - /* Perform the conversion */ - GLuint i; - for(i = 0; i < bytes; i += destStride) { - convert(source, dest); - - dest += destStride; - source += stride; - } + gl_assert(active->index == originalId); } - if(needsTwiddling) { - const GLubyte *pixels = (GLubyte*) (conversionBuffer) ? conversionBuffer : data; - - if(internalFormat == GL_COLOR_INDEX8_EXT) { - GPUTextureTwiddle8PPP((void*) pixels, targetData, width, height); - } - else{ - if(internalFormat == GL_COLOR_INDEX4_EXT) { - GPUTextureTwiddle4PPP((void*) pixels, targetData, width, height); - } - else { - GPUTextureTwiddle16BPP((void*) pixels, targetData, width, height); - } - } - - /* We make sure we remove nontwiddled and add twiddled. We could always - * make it twiddled when determining the format but I worry that would make the - * code less flexible to change in the future */ - active->color &= ~(1 << 26); - } else { - /* We should only get here if we converted twiddled data... which is never currently */ - gl_assert(conversionBuffer); - - // We've already converted the data and we - // don't need to twiddle it! - FASTCPY(targetData, conversionBuffer, bytes); - } - - if(conversionBuffer) { - free(conversionBuffer); - conversionBuffer = NULL; - } - - gl_assert(active->index == original_id); + gl_assert(active->index == originalId); _glGPUStateMarkDirty(); } @@ -1764,13 +1667,15 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize gl_assert(sourceStride > -1); - TextureConversionFunc convert = _determineConversion( + TextureConversionFunc convert; + int ret = _determineConversion( INTERNAL_PALETTE_FORMAT, format, - type + type, + &convert ); - if(!convert) { + if(ret < 0) { _glKosThrowError(GL_INVALID_OPERATION, __func__); return; } diff --git a/include/GL/gl.h b/include/GL/gl.h index f65bee6..7cc049e 100644 --- a/include/GL/gl.h +++ b/include/GL/gl.h @@ -310,7 +310,7 @@ __BEGIN_DECLS #define GL_4_BYTES 0x1409 /* ErrorCode */ -#define GL_NO_ERROR 0 +#define GL_NO_ERROR ((GLenum) 0) #define GL_INVALID_ENUM 0x0500 #define GL_INVALID_VALUE 0x0501 #define GL_INVALID_OPERATION 0x0502 @@ -371,6 +371,31 @@ __BEGIN_DECLS #define GL_RGBA 0x1908 #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE_ALPHA 0x190A + +#define GL_R3_G3_B2 0x2A10 + +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E + +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 + +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 + +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D + #define GL_BGRA 0x80E1 #define GL_INTENSITY 0x8049 #define GL_RGB4 0x804F @@ -387,6 +412,14 @@ __BEGIN_DECLS #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B +#define GL_R8 0x8229 +#define GL_RG8 0x822B +#define GL_RG 0x8227 +#define GL_R16 0x822A +#define GL_RG16 0x822C +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 + /* Polygons */ #define GL_POINT 0x1B00 #define GL_LINE 0x1B01 diff --git a/include/GL/glkos.h b/include/GL/glkos.h index e2ef11a..5307d6b 100644 --- a/include/GL/glkos.h +++ b/include/GL/glkos.h @@ -87,7 +87,7 @@ GLAPI void APIENTRY glKosInitConfig(GLdcConfig* config); */ GLAPI void APIENTRY glKosInitEx(GLdcConfig* config); GLAPI void APIENTRY glKosSwapBuffers(); - +GLAPI void APIENTRY glKosShutdown(); /* * CUSTOM EXTENSION multiple_shared_palette_KOS @@ -186,12 +186,28 @@ GLAPI void APIENTRY glKosSwapBuffers(); /* Memory allocation extension (GL_KOS_texture_memory_management) */ GLAPI GLvoid APIENTRY glDefragmentTextureMemory_KOS(void); +/* glGet extensions */ #define GL_FREE_TEXTURE_MEMORY_KOS 0xEF3D #define GL_USED_TEXTURE_MEMORY_KOS 0xEF3E #define GL_FREE_CONTIGUOUS_TEXTURE_MEMORY_KOS 0xEF3F //for palette internal format (glfcConfig) #define GL_RGB565_KOS 0xEF40 +#define GL_ARGB4444_KOS 0xEF41 +#define GL_ARGB1555_KOS 0xEF42 +#define GL_RGB565_TWID_KOS 0xEF43 +#define GL_ARGB4444_TWID_KOS 0xEF44 +#define GL_ARGB1555_TWID_KOS 0xEF45 +#define GL_COLOR_INDEX8_TWID_KOS 0xEF46 +#define GL_COLOR_INDEX4_TWID_KOS 0xEF47 +#define GL_RGB_TWID_KOS 0xEF48 +#define GL_RGBA_TWID_KOS 0xEF49 + +/* glGet extensions */ +#define GL_TEXTURE_INTERNAL_FORMAT_KOS 0xEF50 + +/* If enabled, will twiddle texture uploads where possible */ +#define GL_TEXTURE_TWIDDLE_KOS 0xEF51 __END_DECLS diff --git a/samples/nehe06/main.c b/samples/nehe06/main.c index 387d963..7f32af5 100644 --- a/samples/nehe06/main.c +++ b/samples/nehe06/main.c @@ -56,11 +56,12 @@ void LoadGLTextures() { glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data); free(image1); -}; +} /* A general OpenGL initialization function. Sets all of the initial parameters. */ void InitGL(int Width, int Height) // We call this right after our OpenGL window is created. { + glEnable(GL_TEXTURE_TWIDDLE_KOS); LoadGLTextures(); glEnable(GL_TEXTURE_2D); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black @@ -74,7 +75,7 @@ void InitGL(int Width, int Height) // We call this right after our OpenG gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window - glMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); } /* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */ diff --git a/samples/prof_texture_upload/image.h b/samples/prof_texture_upload/image.h new file mode 100644 index 0000000..44d9898 --- /dev/null +++ b/samples/prof_texture_upload/image.h @@ -0,0 +1,8207 @@ +/* GIMP header image file format (RGB): /home/kazade/Documents/Untitled.h */ + +static unsigned int width = 512; +static unsigned int height = 256; + +/* Call this macro repeatedly. After each use, the pixel data can be extracted */ + +#define HEADER_PIXEL(data,pixel) {\ +pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \ +pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \ +pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \ +data += 4; \ +} +static char *header_data = + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D*C=H)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D;7JKR-<&XO$@V.85L+WN;7JJ*S=H)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D@8Z^X_(AZODHZ?@GY_8EZ/L:>(2T256&GZS<>XFY+CIK)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DA)'\"" + "Y?0CZODHZODHZODHZODHZODHZODHZ?@GS=L(?XNYM\\3TY_8EY_8ET^(1H*W>3UR," + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DAI/$Y?0C" + "ZODHZODHZODHZODHZODHZODHZODHYO4DP<[[BI?&X>`?Z/8:V*C=G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DAY3$Y?0CZODH" + "ZODHZODHZODHZODHZODHZODHZ?@GW>L:O\\OXQM0#Z?@GZ/\\>N@7H:_?15*\")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-DB9;'Y/,BZODHZ?@GZODHZODHZODHZODHZODHZODHZ?@GZ?@G" + "Z?@GZ?@GZ?02HZ_@7Y?,BZO@GZOEZ34O\\>X>\\>" + "X>\\>XN`?XN`?X_$@X_$@Y/(AXN`?ZODGY?0CU>,2M<+SC9K)1U.$)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "1E*#Q-,\"Z?@GZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ/\\>H:S9U^43Z/@7I[3D4V\"1)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*S=H:'6EJ;;FU.(1Z/8EZ_DH[/LJZ_DH" + "Z?@GY_4DY?,BY/(AXN`?X>\\>X.X=WNP;W>L:W.H9V^D8VN@7VN@7V><6V><6V><6" + "V><6V.<6V><6VN@7VN@7V^D8V^D8WNP:X_(AXO$@Y/(AY/(AU^03<7VM)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D8&R=" + "U.(1ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/\\>NL?W`?W^T=WNP;W.H9V^D8VN@7V><6V.85U^44UN03UN03U>,2U.(1U.(1T^$0T^$0" + "T^$0T^$0T^$0TM`0T^$0T^$0U.(1U.(1UN03UN03V><6V^D8V^D8P,W\\*C9G)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D>XBYW^X=" + "ZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZ?@GZODHZODHZODHZ?@GZ?@GZ?@G" + "Z?@GZ?@GYO4DKKKGR-4\"Z/WNT<6U^85UN44U>,3T^$1TM`/T=\\.T-X.S]T-S]T,S]T,SMP+S=L*S-H)" + "S=L*S-H)S=L*S-H)S=L*S=L*SMP+SMP+S]T,T-X-T-X-S]T,T=\\.T-X-L\\#PAY/$" + "25:&)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DEJ/3Y?0CZODH" + "ZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/<6Z?8E[/LI[?PJZ_HIZ/`?WNP;W.L:V^D8VN@7V><6" + "U^44U>,2T^$1T=\\/S]T-S]T-SMP+S=L*S=P+S-H)R]D(R]D(S-H)RM@(RM@'RMD(" + "RM@'RM@'R=@'R=@&R=@'R=@'R=@'R=@'R=@&RM@'RMD'R]D(S-H)S=L*SMT+T-X-" + "S=L*K;KJLL#PC)G*-D)S)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D,3UNK[SLZ/`?N<;V;WRL)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D/TM\\" + "I;+BW>L:Z/8E[/LJ[?PKZ_HJY_8EX_(AX.X=W>L:V^D9VN@7V><6U^44U>03T^$0" + "T-X-S]T-S=L+S-L*S-L*S-H*S=L*R]H)R]D(R]D(RM@'R]D(RMD'RMD(RM@'RM@'" + "R=@'R=@'R=@'R=<&R-<&R-<&R-<&R-<&R-<%R-<%R-8%R-<%R=<&R=<&RM@'RM@'" + "R]H)R]H)R]D%Z_HJV><7J[?H7VN<)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D1%\"!P](\"ZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z/,1Z/<6VN@7V.86UN04T^$1T-X.SMP,S-H*" + "R]D(S-H)R]H)R]D)R]D(RM@'Q=(\"O\\O[P\\[^R=<&RM@'R]D(RM@'RM@'RM@'RM@'" + "RM@'RM@'RM@'R=@'R=<&R-<&R-<&R-<&R-<&R-8%R-<&R-<%Q]8$R-<%R-<%R-8%" + "R-8%R-8%K+GGYO0CY?,CY/,BX_$@P]$!>8:W*S=H)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D7FN<7V><6U^44U>,3TM`0S]T-S=L*R]D)RMD(RMD(" + "R]D(R]D)S-H)Q]0%M+GILJW9MZ_:O;+=NK+=L[#;M[CEQL[[R]D(RMD(RM@'RM@'" + "RMD(RM@'RMD'RM@'R=<&R=<&R=<&R-<&R-<&R-<&R-<&Q]8%Q]8%R-8%Q]8%R-8%" + "Q]8$Q]8$J[GIU>(0X_(BX>\\?X_$@Y/(BX_(AQ-$!=(&Q)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D>86VWNPW>L:V^D8V><6U^85U.(2TM`0S]T,S-H*RMD(RMD(RM@(RM@(RMD(" + "RMD(R]D(PLW_M*[:R:/.UG^EVFE`V6!KV6)QVG.-T9>\\P;#8O+[HRM@&R]D(RMD(" + "RMD(RM@'RM@'R=@'R=@'R=<&R=@'R=<&R-<&R-<&R-<&R-<%R-8%R-8%Q]8%R-8%" + "Q]8$Q]8$N\\GZNL7SY_4FX>\\?X.X>X>\\?X_$@Y/(AX_$AP,W]9W2E)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-DDZ#1Y/,BZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZ?@GZ?@GZ/<6V.85U>03T=`0SMP,S-H)RMD(RMD(RMD(RMD(RMD(R]D(R]D(" + "R]D(Q,`\"N:_2VVU]R;3Y_4EXN`@X.X>X.X>X.X>X.X>XN`@X_(AX>\\>L+SM3EJ+)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D+CIKK+GJZ/03H*W=2E>()S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D>H>XS]T,Y?,BY_4C[/PJ[OTLZODIW.H:W^X<" + "W.L:VN@7V.<6UN44TN$0SMT-S-H*RM@(R=@'R=@'RM@'R=@'RMD(RMD(R]D(R]D(" + "R]D)N;3EU(FTV(.1R+SDSJO8UXVUV8BLUX^TSZW5R;SIUXFMVV]_QKKDO\\7QR]D(" + "R]D(RM@'RM@'R=@'RM@'R=<&R=<&R-<&R=<&R-<&R-<&R-<&R=<&R-8%R-8%Q]8%" + "Q]8$Q]8$Q]8$H:[>X.X=XN`@X.X>X.X>X.X>X.X>X.X>X>\\?XO$@X_$@VN@7DI_/" + "*S=H)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D0DY_P<__Z?@GZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GXO$@" + "HJ_V.86UN43" + "V><6V.85U.,2T-\\/S-L*RM@'RM@'R=@'R=@'R=@'RMD(RM@(RMD(R]D(R]D)S-H)" + "P\\S_RJ+1VG%YRKKBU9K*X&-MVHZGU9R^VHJIX5]EV(^KR;[KVH*EV8F@OL+NR-/`" + "R]D(RMD(RMD'RM@'RM@'R=@'R=@'R=@'R=<&R-<&R=@&R-<&R=<&R=@'Q]8$R-8%" + "Q]8$R-8%Q]8$K+KJS]P)Y/(CX.X>X.X>X.X>X.X>X.X>X.X>W^T=X>\\>XN`@X_$@" + "N\\CX35J*)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D7&B9T=`/ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GSMP*" + "HZ_L;VN@7V><6V.86" + "UN44T^(2SMP,R]H)R=@'R=@'R=@'RM@(R=@'RM@(RMD(RMD(R]D(R]D(R]D)S-H)" + "O\\'SV(>RTJ&\\S;#>WF9PTK'4T:S9U*/+S[+X.X>X.X>X.X>X.X>X.X>W^T=X.X>X.X>X>\\?" + "XN`@U>,2?(FY)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D=X.TW>P;Z?@GZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GY_4EKKKH" + "Q='_Z?@GZ/Y_8EZ_HIZ_HIW^T=V><7V.85V.85U>,3" + "T=`0S-L*RM@(RM@(R=<'R=@'R=@'RM@(RMD(RMD(RMD(R]D)R]D(RMD(R]H)S-H*" + "PK_PW'\"1S;37V(ZZVI2JUIS+X&APWX.:XV)JUZ\"_U*/0WVQUR,+MT:O5R;SBO<;T" + "SML)R]D(RMD'R]D(RM@'RMD(RM@'R=@'R=@'R=@'R=<&R=<&R-<&R-<%R-8%R-<%" + "Q]8%R-8%Q]8$QM4$H:W;YO0DX>\\?X.X>X.X>X.X>X.X>W^T=W^T=W^T=W^T=W^T=" + "X.X>X>\\?WNP;H:_?,3UN)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "+CIKGZW>Y/,BZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GVN@7GJG6" + "W^XL9V^@6W.D7X_$@Y?,BYO4DV^D9V.85V.85U.,3S]X." + "R]H)RMD(R=@'R=@'R=@'R=@'R=@'RM@(RMD(RMD(R]D)R]D)R]D(R]D)R]D)S=L+" + "Q<#PW&=`RKC>W(.NU*7#W(&JUZ*^R,'MTZW:X69JS[KBWW*-T*W.P,CWP,O[O\\O[" + "R-4!R]D(R]D(RMD(RM@'RMD(RMD(R=@'R=@'R=@&R=@&R=<&R=<&R=<&R-<%R-<%" + "R-8%R-8%Q]8$Q]8%H:_?WNP;XN`@X.X>X.X>X.X>X.X>X.X>W^T=W^T=W^T=W^T=" + "W^T=X.X>X>\\?XN`?P,W]3UN,)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D5&\"1" + "Q=0#ZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ/84V.43X.X=X_$@VND9U^85U^85U.,3SMT-RMD(" + "R=@'RMD(R=@(R=@'R=@'RM@'RM@(RM@(RM@(R]D(R]D(R]D)R]D)R]H)R]H)S-L+" + "Q,3SW7*2SZ[0UY;#V9:QUI_)X6Y`W8.DS[;>X'\"2TJ[/VI;#V96MPX.X>X.X>X.X>X.X>X.X>W^T=W^T=W^T=" + "W^T=W^T=W^T=X.X>X>\\?TM`/;7FJ)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D@Y\"`W>P;" + "ZODHZ?@GZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@G" + "ZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZ?@GX>`?GZS9U.(0" + "Z?@GZ?@GZ?@GZ?@GZ/<6T^,3S-L+RMD(R=@'" + "RM@(RMD(RMD(RMD(R=@'RM@(RM@(RM@(RMD(RMD(R]D)R]D)R]H)S-H)R]H)S-L*" + "Q,GXV92`VI.JSK3BX6IVT+??TJS4U*G,T;/@XF9]T+/4V)O*W)\"?PX.X>X.X>X.X>X.X>W^T=W^T=W^T=W^T=" + "W^T=W^T=W^T=W^T=X.X>X>\\?VN@7A)'!)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-T-TK[SMZ/\\>X.X=W^TP;WNP;W>P;W>P;W>P;WNP;W^TX>\\>XO$@X_(AY/(AY?,BYO0C" + "YO4DZ/8EZ/P;L+WN8FZ?)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-DN<7VV.43W>L8Z?ZW).ZXFE\\VIJQR\\'NX'JAU:;!P,O[P\\?X.X>X.X>X.X>W^T=X.X>X.X>W^T=W^T=" + "WNP\\>WNP;FZC8*S=H)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D97&BS]X.Z?@GZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZODHZ?@GY?0CJ[?EO\\>" + "W.H9VN<6V><5V><5VN@6W.D8W>L:WNP;W^T\\>XO$@X_(@Y/,AY?,BY?,BYO0C" + "YO0CYO0CYO4DYO0CYO4DYO4CYO0CY?0CY?,BY?,BY/,AY/(AX_$@XN`?XN\\>X>\\=" + "X.X=W^TXO$@Y/,BYO0CY_8EZ/L9XO$AX>\\?X.X>X.X>X.X>W^T=W^T=W^T=W^T=" + "W^T=W^T=W^T=WNP\\?X>\\?K[SL0DY_)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*S=HE*'2XO$@Z?@GZODHZ?@GZ?@G" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZ?@GZ?@GZODHZODHZ?@GZ?@GU^44F:71T^$/XN`?" + "Y/(AYO0CY_8EZ/\\>X.X=X.X=X>\\>X_(AY?0CY_8E" + "Z?H^WVY]V9F^U*K4TJO7UI['WW22WWJ&R[[EO\\KZP,S\\P,W]P,W]" + "O\\S\\OLO[N\\GYI;3FN\\CXO\\S\\O,GXS-H'RMD(RM@'RM@'RM@'R=@&R=@&R=@&R-<%" + "R-<%R-<%Q]8%R-8%Q]8%KKSMR=8#Y?,DX>\\?X.X>X.X>X.X>X.X>X.X>W^T=W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=X.X>X>\\?X.\\?W>P;WNT=WNP<7U.(2" + "S]X-R]H)R-<&Q-(\"O\\S]N\\CYMH>X0$Q]" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D1E*#O\\>X.X=XN`?Y?,BY_8EZ?@GZO@HZ?@GZ/8EY_8EY_8EY_8EY_8EY_8EY_8EY_8E" + "Y_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8E" + "Y_8EY_8EYO4DYO4DY_8EY_8EYO4DW>L:KKOK7VR<)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D-$!QNLCXZ?`AF:?8SMT+RMD(R=@'RM@(" + "R=@'RMD(R=@'RMD(R=@'R=@'RMD(RMD(RMD(RMD(RMD(R]D)RMD(R]H)R]H)S-H)" + "S-L*O\\OZP\\?X.X>X.X>X.X>X.X>W^T=W^T=W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPXN`@Y/(BW^T=V^H:Y?,CYO4E" + "Y?,CY?0DY?0DY?0DY?0DYO4DYO4DYO0DYO4DYO4DYO4DYO4DYO4DYO4DYO0DWNP<" + "KKOL04U^)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D=8&RV.<6Z?@GZODHZODHZ?@GZODHZ?@GZ?@G" + "Z?@GZODHZODHZODHZODHZODHZ?@GZ?@GZODHZ?@GZODHZODHZ?@GZODHZODHZ?@G" + "ZODHZODHZ?@GZODHZODHZ?@GY_8EW^X=T^(1R=<&S-D'U>,1W^T;Z/\\>X.X=X_$@YO0CZ/\\?X>\\?X.X>X.X>X.X>X.X>W^T=W^T=" + "W^T=W^T=W^T=W^T=WNPVN@8U.(2W>L;" + "X.X>X.X>X.X>X.X>X.X>X.X>X.\\?X>\\?X>\\?XN`@X>\\?XN`@XN`@XN`@XN`@XN`@" + "W^TV^@6XN`@X.X>X.X>X.X>X.X>X.X>W^T=W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPL;W^T=WNPL9Z/8EZ?@GZODHZODHZODHZODHZODHZODHZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/L;LK[N" + "9G*C)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-DF:;7Y/,B[/LJ\\/\\O\\/\\PZ?@IY?0EY/0DY/0DY/,DV^L=EJ+1T-\\.RMD(R=@'" + "R=@'RMD(RM@(RMD(RMD(RM@'RMD(RMD(R]D)R]D(R]D(S-H*RMD*M,'RKK_SE*/4" + "J;?GEJ?;J[ONHK'CG:[BG*W@I;/BJ;CMD9_4F:C;LL+VJ;;EH+'GH;#BI[;IJKGJ" + "J;?FM\\3SOX.X>X.X>X.X>X.X>W^T=X.X>" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPPL;W>L;W>L;W>L;W>L;W>L;" + "W>L;W.H:TM\\.6665)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-DAY/$WNTX>\\>Y/,BY_8EZ/`AF:G=S=L)RMD(R=@'" + "RM@(R=@'RMD(RMD(RMD(RMD(RMD(R]D)RMD(RMD(RMD(S-H)Q=0$O\\S[N,?XF:C;" + "N\\CXK;_TDJ38I[/CF*C?K[OJM<3WFZKGJS=N\\CXL[_OO,GZO\\O[P,W]P,W]" + "P,W]O\\?X.X>X.X>X.X>X.X>X.X>X.X>" + "W^T=W^T=W^T=W^T=W^T=WNPPL;" + "TN$1U.(2W^T=WNPL;W>L;WNPL;W>L;W>L;W>L;W>L;W>L;W>L;" + "W>L;WNP\\>X.X=Y/(AY_4DZ/\\?X.X>X.X>X.X>X.X>X.X>X.X>" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNP<6W^T=WNPL;WNPL;W>L;W>L;W>L;W>L;W>L;W>L;W>L;W>L;" + "W>L;W>L;W>L;V><6@X^_)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "9W.DT=`/Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ/X>X.X=Y/(AY_8EY_8EY_8EY_8EY_8EY_8E" + "YO4DY_8EYO4DY_4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO0CX.\\>NL?W=H*S*C9H)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D0T]`SML+" + "Y?,B[OTL\\?`P[OTMY_8GY?0EY?0DY?,DY/,CY?0DY/0DY/(CR=H.I[/?SMX.R=@'" + "R=@'RMD(RM@(RMD(R=@'RM@(RMD(RM@(RMD(RMD(R]D(R]H)S-L*O\\W\\P<[_H;3G" + "I;+BI;/DOX.X>X.X>X.X>X.X>X.X>" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPL;WNPL;W>L;W>L;W>L;W>L;W>L;W>L;W>L;W>L;" + "W>L;W>L;W>L;V^D9RM@'/TM\\)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*S=HFJ?8" + "X_$AZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>Y?,BY_8EY_8EYO4D" + "Y_4DYO4DY_8EY_8EYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DY?0CY?,BS=L*DZ#0/TM\\)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C9GN<;WX_$@" + "Z_HI\\/\\O\\/\\OZ/DZ#/T-\\.RMD(" + "R=@'R=@'RM@(RM@(RM@(RMD(R]D(RM@(RMD(RMD(R]D)R]H)S-L*P,[^QM0#O\\S\\" + "O\\S\\P,W]P<[^OLO[NX.X>X.X>X.X>X.X>X.X>" + "W^T=W^T=W^T=W^T=W^T=WNPWNPL;W>L;WNPL;W>L;W>L;W>L;" + "W>L;W>L;W>L;W.H:VN@7H:[=)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D6&25QM0#Z?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\?X.X>X.X>X.X>W^T=X.X>" + "X.X>W^T=W^T=W^T=W^T=W^T=W^T=WNPL;W>L;W>PL;W>L;W>L;W>L;W>L;W>L;" + "W>L;W>L;W>L;W>L;W.H:U.(18FZ>)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C=HD9[.X.\\>Z?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ_HIZODHZ/`>Z/\\>Y?0CY_8EYO4DYO4DYO4DY_4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO0CYO0CX_$@PL__@Y\"`,3UN" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D;7JKW>L:Y/,B[?PK" + "\\P$Q[?PMYO4FY?,DY/,DY/,DY/0DY/,DY?0DY/,DY/,DY/,DX_(CLL+VO\\?X.X>X.X>X.X>X.X>W^T=" + "W^T=X.X>W^T=W^T=W^T=W^T=W^T=W^T=WNPL;WNPL;WNPL;W>L;W>L;W>L;W>L;W>L;" + "W>L;W>L;W>L;W>L;W.H:VN@8N<;V*C9G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D4%V.P,[^Z/X.X>W^T=X.X>W^T=" + "W^T=X.X>W^T=W^T=W^T=W^T=W^T=WNPWNPPL;WNPL;W>L;W>L;WNPL;" + "W>L;W>L;W>L;W>L;W>L;W.H:V.85@HZ^)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DB9;'W>L:Z?@GZ?@GZ?@GZ/Z/\\>X.X=Y/(AY_4DY_4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0C" + "Y?0CW^TP>D9W,T-X-" + "R-<&R-<&R=@'R=@'R=@'RMD(R]D(R]D)R]D)R]D(R]D(S-H)S=L*S-L*S=L*S=L*" + "S=L*S=L+S=P*SMP+SMP+SMP+SMP+S=L*RMD(Q-,\"NLCYK[WLHK'@EZ?5D*#-C)O'" + "B9G%AY?$AI7\"A)/!@Y&_@(Z\\?8NY>XFW>8:T=(&O<7ZL=8*O>(6S=(*O>HBUG:K7" + "Q-,!RMD'R=@'R=<&R=<&R-8&R-8%Q]8%J[GJR-4\"Y/,CX.X>X.X>X.X>X.X>X.X>" + "X.X>X.X>W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPL;W>L;W>L;W>L;W>L;W>L;W>L;" + "W>L;W>L;W>L;W>L;W>L;W>L;VN@8R=8%.D9W)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D1U2%NL?XZ/<7P,W[O,0Y_4DZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>X.X=Y/(AY_8EYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CYO4D" + "YO4DYO4DY?0CY/(ARM@'CIO+.$1U)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D@H^_X.X=Y/$@Z_HI\\?`O\\/XO" + "Y_8GY?,DY/,DY/,DY/,CY/,DY/,DY/,DY/,DY/,DY/,DY/,DY/,DX>`AG*O=RM@&" + "R=@(R-<&R=@'R=@'RMD(R]D)R]D)R]D(R]H)R]H)S-H)S-H)S-H*S=L*S=L*SMP+" + "S=L+SMP+SMP+SMP+S=L*R=@'P,__L,#PH+#?D:'0BYK(B9?%AY;#AY7\"AI3\"A9/!" + "@Y&_@I\"^@8^]?XR[>XFW>8:T=8&O;WRJ;'BG9W2B97*@:'6C:'6C;7JG?8RYDI_-" + "L;[LS=L*R=@'R=@'R=<&R-<&R-8%Q]8%O,O\\K+CEYO4EX.X>X.X>X.X>X.X>X.X>" + "X.X>X.X>W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPL;W>L;W>L;WNPL;W>L;W>L;" + "W>L;W>L;W>L;W>L;W>L;W>L;W.H:V.45EZ/3)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D@(V]VND8Z?@GZ?@GZ?@GZODHZODHZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GYO4DU>,2N\\CUP,WYV^D6Z/W^X=Y?,BY_8EYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DY?0CY?0CV><6J+7E6666)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D2%6&UN03XN`?Y_4D[OTM\\`$QZ?DJ" + "Y?0EY/,DY/,DY/,DY/,DY/,DY/,DY/,DY/,DY/,DY?,DY/,DY/,DX_(CM,3XNL;S" + "R]L*R=<'RM@(R]D)R]D)R]D)R]H)R]H)S-H)S-H)S-H)S-H)S-L*S=L*S=L*S=L+" + "S=L+S=L+R]D)Q-,\"LL'RG:S;BYO)A9/!A)&_A)*`A)*`A)&_A)*`@Y&_@I\"^@H^]" + "@(Z\\?HRZ?(JX>8:T=H.Q54U^-45V*4EZ,76J7=X6QBYG'H;#>" + "LL#NS=L*R]D(R=@'R-<&R-<%R-8%R-8%QM4$FJ;5Y?,BX>\\?X.X>X.X>X.X>X.X>" + "W^T=X.X>W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPL;S]X.V.86X.X>WNPL;W>L;W>L;W>L;" + "W>L;W>L;W>L;W>L;W>L;W>L;W.H:VN@8RM<&-4%R)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D0$Q]L\\'QY_8EZ?@GZ?@GZODHZODHZODHZODHZ?@GZ?@GZ?@G" + "ZODHZ?@GZ?@GZ?@GZ?@GYO4DT^(1N,3QP`?OH>W+CIK)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DL+[NXN`?Y/$@Z_HI\\?`O[_XNY?0E" + "Y/,DY/(CY/,DY/,DY/(CY/,DY/,DY/,DY/,DY/,DY?,DY/,DY/,DY/(CS=X1H*S9" + "S]X.R=@'RM@(RMD(R]D)RMD(R]H)R]H)R]H)S-H)S-H)S-H)S-L*S=L*S=L*S-H*" + "R=<'OXFW>8:T=(&O;WNI:W>E:76C:WBD;GRI;GRJ:'>F7FR:HFW@I&_G*O:K+OI" + "M<3RR-<%SMT-RM@'R-<&R-<%R-8%Q]8%R-8%FJC8W.H8XN`@X.X>X.X>X.X>X.X>" + "X.X>X.X>W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNP04S]X.X.X=WNPL;WNPPL;" + "W>L;W>L;W>L;W>L;W>L;W>L;W.H:V^D9U^45AI+\")S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D=X2UU^44ZODHZODHZODHZ?@GZ?@GZODHZODHZODHZ?@GZODHZ?@G" + "Z?@GZ?@GZ?@GY_8EUN04ML/QO,GTW>L8Z?`?YO4DY_4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DY?0CYO0CY?0CYO4DY?0CY?0CYO4DY?0CY?,BS]T-F:7615&\")S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DT>DI[." + "S]X-RM@(RM@(RMD(R]D)R]D)R]D(R]D)R]H)S-H)S-H)S-L*S=L*S-H*Q]8&N(:S=X6R>(:T>HBU?(FW?(JX?HRZ?XRZ?XV[?HRZ?8NY>HBV=X6R=H2Q" + ">(6R?(FV@(Z[@Y*_?HZ];H\"Q6VV>052((C5H$\"17$2!16&6,H[/ACI[.I;7DK[[M" + "M<7SP<_^T=`/R=@'R-<&R-<&R-<%R-8%R-8%I[7GRM<$Y/(BX.X>X.X>X.X>W^T=" + "X.X>W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPPWNPL;W>L;" + "W>L;W>L;W>L;W>L;W>L;W.H:W.H:W.H:VN@8O\\S[*C9G)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D.45VK;KKY_8EZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZ?@GZODHZ?@G" + "Z?@GZ?<3Z?L:L;WN9G*C" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D,3UNR=<&XN`?X_$@ZODH\\O`P[_XOYO4FY/(C" + "Y/(CY/,DY/(CY/(CY/,DY/,DY/(CY/,DY/,DY/,DY/,DY/,DY/,DY/,CX?$AG:S?" + "R-8$R]D)RM@(RMD(RMD)R]D)R]D)R]H)R]H)R]H)S-H*S-H)R=<'N(:T>8>T>8>T>8:T=X2R>8:S?8JW@Y\"\\B9C#B9K&" + "?I&`;'^P56F<-TV\"&\"]B\"298\"\"=:!RU?!C%F!3AO\"#5M2EJ#LL+QFJO=J;KIL<#O" + "M<7TN\\KZTN$0RM@(R=<&R-<&R-<&R-8%R-8%NLGZK[KGYO0EX.X>X.X>X.X>X.X>" + "X.X>W^T=W^T=W^T=W^T=WNT=WNPPL;" + "WNPL;W>L;W>L;W>L;W>L;W.H:W.H:V^D9U^44<7VM)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ";WRMT^$0ZODHZODHZODHZODHZ_HIZ_HIZODHY?,BZ/\\>Y?,B[OTL\\`$QZ?@IY/,DY/,D" + "Y/,CX_(CY/,DY/,DY/,CX_(CY/(CY/,DY/,CY/,DY/,DY/,DY/,DY/,DX_(CM<7X" + "M\\/PS=P,R=@'RMD(RMD(RMD(R]D(R]H)S-H)S-H*S-H)PL`!GJW>H:S@(RYB)2`C)O'A9?%>(NZ9'FI2F\"2*4)V" + "#RYA\"BI\\?X.X>X.X>W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPPPWNPL;W>L;W>L;W>L;W.H:W.H:W.H:W.H:V><7LK[N)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-$!QIK/C" + "Y?0CZODHZODHZODHZODHZ/03" + "K;OHN\\?RXO$>Z?@GZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZ?@GZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZ?@GZ?@GZO@HZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/,2HJ_@4%R-)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D0D]`U>,2X.TZ?@G\\?`O[_XOYO4FY/,DY/,D" + "Y/(CXO$AY/,DY/,DY/,DY/,DY/(CY/(CY/,DY/,DY/(CY/(CY/,DY/,DY/(CSMX1" + "GZK6T-\\/R=@'RMD(RMD(RMD(R]D(R]D)S-H*R]H)OLS^@Y'#86^=7VV;8F^<9'&?" + "9W.A:G:D;WNI>(2R@8Z[BIC%B9G'@)&`;H*R66V>.$^#&39J\"RYA\"#%D!C=M!39L" + "!#AO!#IQ!#MQ!#MT!#QS!#YX!$!Y!$-^!$B&!%&.!%*2$SMRI;3AN\\O]JKOKL\\3T" + "M<7VN,CYR=@&SMT,R=@&R-<&R-8%R-8%R-8%Q]8%EZ;5W>L9XN\\@X.X>X.X>W^T=" + "X.X>W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPPPPPPP04S=P+X>\\?WNPL;WNPL;W>L;W>L;W>L;W.H:W.H:V^D9T^$06V>7)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D9W.DSMT,Z?@G" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHY/(AP<_^J+/=" + "T]`,Z?@GZ?@GZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@G" + "ZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/T?" + "D9W.S]X-RMD(RMD(RMD(R]D)R]D)R]D)S-H*R-<'D:#47VN:6&226V>49G*?=(\"L" + "@(VZAY7#@I/\"=8>W872G1ER/)S]S$3%D#S-D!S5I!3EO!#MR!#QR!$%X!$1^!$1^" + "!$-^!$1`!$5_!$5`!$5`!$5`!$>\"!$J%!$V-!%.4!%F<#$%\\CY[*Q]<(JKOLL\\3U" + "M<7VN,CXPM#`T-`/R=@'R-<&R-<&R-8%Q]8%Q]8%I++CS=H'X_$BX.X>X.X>X.X>" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPPPPPPPT=W.PWNPL;" + "WNPL;W>L;W>L;W>L;W>L;W>L;W.H:W.H:V^D9V.86I+'@)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*S=HEZ35Y/,BZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GVND8K;OGM+_IXN`=" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ/\\>XN`?Z/8E[/LK\\?`P[OTNYO4FY/,DY/,CX_(C" + "Y/(CX_(CY/(CY/(CY/(CY/,DY/,DY?,DY/,DY/(DY/(CY/,DY/,DY/,DY/,DXO$B" + "GJW@R-8#R]H)RMD(RM@(R]D)R]D)R]H*R]H*PM$\"9G2D8VZ98BV=H6T:'BH" + "4F68,DQ]%S=K#3)D\"3-G\"39K!SAP!#YV!$!X!$-Z!$=_!$9_!$B!!$J#!$N%!$N'" + "!$J'!$R(!$R(!$R(!$B%!$F&!$N)!$^-!%&3!%>9!%ZB!TR)=8>OR]P,K;[PL\\3U" + "M<;WM\\CYOX.X>W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPPL;W>L;WNPL;W>L;W>L;W.H:W.H:W.H:W.H:VN@8S]T,1%!`)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D1%\"!N\\GYZ?@GZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ/\\>YO4DYO4DYO0CYO4DYO0CYO4DY?0CYO4DYO4DYO0C" + "Y?0CYO4DY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY/,BV><6JK?G7&F9)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D9W2EML3TW>L:XN`?Y?,BZ/!!$J\"!$J\"!$N%!$^(!$Z(!$V(!$^)!$Z)!$Z)" + "!$^+!%\"+!$^*!%\",!$N)!$V*!$Z-!%&1!%.6!%JW^T=W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNPP(2D;#@7Y>T8J:[?L#4J=?ST^@2V.<6X.X=X.X>WNPL;W>L;W>L;W>L;W>L;W.H:W>L;W.H:W.H:V^D9U^04C9K))S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D(.ZODHZODHZODH" + "ZODHZ_HIZODHZODHZODHZOHHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZODHZODHZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>X.X=Y?0CYO4DYO4DYO4DYO4DYO0CYO4DYO0CYO4D" + "YO0CYO0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BX>\\>O\\S\\?HJ[+CIK)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D:W>H" + "NL?WX.X=X_$@YO0CZODI[?PLX>`@X>\\?[_XMZ_LLYO4FY?,DY/,DY/(CY/,CY/(C" + "Y/(CX_(CY/(CY/(CY/,DY/(CY/,DY/(CY/(CY/,CY/(CY/(CY/(CY/,DY/(CY/(C" + "SMX1GJK7T-\\.RMD(RMD(RMD(R]D)S-H*S-H)Q-4'.ER=$3-F#S1G\"#=K!SIO!#UU" + "!$%Y!$-\\!$A`!$F#!$N$!$R$!$Z'!%\"*!%\"+!%\",!%&,!%&-!%*.!%&,!%*,!%*-" + "!%*-!%*-!%&,!$^+!%\"-!$Z+!$Z-!%&0!%67!%J;!&\"E!%VB*$EZP-#]P-(#LL3U" + "M<;WML?XNLGZR=@'SMP,R=<&R-<&Q]8%Q]8%Q]4$Q]4$EZ33W^T;X>\\?W^T=W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNP_<%WNPL;W>L;W>L;W>L;W>L;W>L;W.H:W.H:V^D9V><6NL?V)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D-$!QJ+;FYO4DZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHXO$@M,'OHJ_9WNP9ZODHZODHZ_HIZ_HI" + "Z_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZ_HIZ_HIZODHZODHZ_HIZOHH" + "Z_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/C)C'S]X,RMD(R=@'RMD(R]H)R]H)R]H)R=@(8H;%##MP!CEN!#QS!$!W!$-[" + "!$A`!$J$!$N$!$V'!$Z(!%\")!%\"*!%&+!%*,!%60!%60!%61!%62!%60!%..!%6/" + "!%2/!%2/!%.-!%./!%*/!%&.!%\"/!%*1!%:7!%F9!%^C!&.H#49_JKGES-T.L,+S" + "M<;WML?XNW^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=W^T=W^T=WNP.WV@_L,9_,\"7._Z8>WZ6>OV6NKT:.OVI^D#U^@6W.L;W>PL;WNPL;W>L;W>L;W>L;W.H:W.H:W.H:V^D9VN@8T^$05F*2)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D4V\"0RMD(Z?@GZODHZODHZODHZODHZ_HIZ_HIZ_HI" + "ZODHZ_HIZ_HIZ_HIZODHZ_HIZODHW^X=JK?DJ;7>X_$?ZODHZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZODHZ_HIZODHZODHZODHZODHZ_HIZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZODHZ?@HZ?@GZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZODH" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ/L:LK_O:'6F)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C9G=(\"QO\\S\\X.X=Y/(AZ/8E" + "[/LK[OTM[_XN[OTNZOHJX>`BR]D*Z/`AEJ77Q]4#R]D)R=@(RMD)R]D)R]H)R]H)R]H)B:7C!T%X!#UU!$!Z!$1\\!$A_" + "!$N#!$Z(!$^)!%\"*!%\")!%.,!%*,!%6/!%6/!%:0!%B2!%>3!%:2!%>3!%:2!%>0" + "!%60!%6/!%*,!%21!%*/!%&.!%&/!%.3!%24!%F9!%V@!&:K!$Z,CZ#+TN,3L,+T" + "M<;WML?XN,GYOLW]T-\\.R=@'R-<&R-8%Q]8%Q]8$Q]8$L<#QN,/OX_(BW^T=W^T=" + "W^T=W^T=W^T=W^T=W^T=WNPH:E\\7P9^'EB?T.OV3^GS5>CT1>'H6>CS8^?SL>,\"UN85V^H:W>P<" + "WNPL;W>L;W>L;W>L;W>L;W.H:W.H:W.H:W.H:VN@8UN03F*34)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D=X2UV^D8ZODHZODHZODHZ_HIZODHZODHZ_HIZ_HIZODH" + "ZODHZ_HIZ_HIZODHZODHZODHW>L;I;+?K;GAYO0BZODHZ_HIZ_HIZ_HIZ_HIZ_HI" + "ZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODHZ_HIZ_HIZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/86VPL_`X>X=Y/(AZ/$!$)]!$-]!$A`!$N\"" + "!$V&!$^(!%&*!%*,!%2.!%6/!%:0!%:0!%B1!%>1!%>2!%B3!%>2!%:1!%61!%:/" + "!%:0!%60!%.-!%..!%*/!%&.!%&0!%.3!%66!%B8!%Z?!&:K!523:'NFTN,2ML?Z" + "M<;WML?XN,GYO,O\\S]X-R]D)R=<&R-8%Q]8$Q]4$Q]8%P=$!G:C5Y/,BX.X>W^T=" + "W^T=WNPP<78,'4?O3_A/L-8._]0.3M0N;N4NGT0N+L4N;P4^GU5>3P>^+RR]\\+V.86V^H:" + "W>L;W>PL;W>L;W>L;W>L;W>L;W.H:W.H:W.H:V^D9V^D9V.86P<[^)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D*S=HFZC8YO4DZODHZODHZODHZODHZODHZODHZODIZ_DIZ?@GZ_HI" + "Z_HIZ_HIZODHZ_HIZ_HIW>P;HJ[\\>Y_8EYO4DYO0CYO4D" + "YO4DYO4DYO4DYO0CYO4DY?0CY?0CY?0CYO0CY?0CY?0CY?0CY?0CY?0CY?0CYO0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BY?,BY?0C" + "Y?,BY?0CY?0CY?,BY/(BU>03I+#A5&\"1)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D*C9G?HN[Q-(!X>\\>Y/(AZ?!$9^!$F\"!$N#!$V%" + "!%\"(!%.+!%.,!%6.!%:0!%>0!%B2!%B2!%B1!%B2!%F3!%B3!%>2!%B4!%B4!%:0" + "!%>1!%F5!%61!%61!%21!%.0!%.2!%65!%:6!%B8!%Z>!&2I!%R?1%F&S=X+OL`\"" + "M,;WML?XN,CYN\\O[RMD(S=P,R=<&R-8%Q]8$Q]8$Q]8%QM4$DI[.W>H9X.X>W^T=" + "W^T=W^T=W^T=W^T=W^T=W^T=WNPPSY4.GT-./K/.3L+]_E8NSZ3^7P4>/N7./NLMC\\T^$0V><7" + "W.H:W>L;W>L;W>L;W.H:W>L;W.H:W.H:W.H:W.H:V^D9V^D9V><7U.(16VB8)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D1%\"!O,KZZODHZODHZODHZ_HIZODHZ_HIZ?@GZ_HI[/LKZ?@GY/(AZODH" + "Z_HIZ_HIZ_HIZ_HIW^T=HK#Y_8DZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZODHZODHZ?@GZ?@G" + "Z?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/XNL9X.@6X.84X><5XND7Y.P:YN`>" + "Z/4DZ_@GZ?\\>Z/8EYO0CY_4D" + "YO4DYO4DYO4DYO4DYO4DYO4DY?0CY?0CYO0CY?0CYO4DYO0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?,BY?,BY?,BY?0CY/,BY?,BY/,BX.X=N\\CX>(2U*C9G)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D+3EK@HZ_Q]4$X>\\>Y/,BZ?1!%B1!%B2!%F3!%F4!%B2!%J6!%F3!%B2" + "!%>2!%>3!%:4!%21!%20!%63!%.2!%:5!%65!%B8!%V\\?W^T=" + "W^T=W^T=W^T=W^T=WNP,22,K.@?@(8O#`2^OU2NGR2NGR,./K/.3L7NSY2^3M3>/L5>+LG-7QS-L*UN45" + "VND9W.H:W>L;W>L;W>L;W.H:W.H:W.H:W.H:W.H:V^D9V^D9VN@8UN03DI[.)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D;7JKUN44ZODHZODHZODHZODHZ_HIZ_HIZODHY_8EX_(AY?0CY_4DZO@GZ_HI" + "Z_HIZ_HIZ_HIXO$@IK/AHJ_6Y?0BZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZ?@GZ?@GZODHZODHZODHZ?@GZ?@G" + "Z?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ/8EX.L9VN$/W=\\,YMD%[<;Q]+7<]JS.]JO,]:_4\\KG@[L;O" + "Y]3`X^(.X^H7Z/,BZO\\>Y_8EYO4D" + "YO4DYO4DYO4DY?0CYO4DYO4DYO0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BY?0CY?0CY?0CY?0CY?0CY?,B" + "Y?0CY?,BY?,BY?0CY?,BY?0CY/,BY/,BY/,BY/(ASMP+EJ/30$Q])S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D*S=H=X2UQ-(!X>\\>Y/(AZ?`AE:/6R-8$R]D)RMD)R]D)S-H*S-L*S-H*RMD)?Z#>!$R#!$R\"!$Z&!%&)" + "!%.+!%.+!%6-!%B1!%>0!%B1!%>0!%J4!%J4!%B1!%J4!%F3!%J5!%F4!%J3!%F2" + "!%N6!%F5!%J6!%>3!%60!%61!%:3!%:4!%:5!%F8!%V>!&.E!&FK#D^(I+3@TN,4" + "LL3VML?XM\\CYNL;VNH:" + "SN440\\7-=?+`6>[\\0>GR0N?P1.?O1^;P-.+I3^CT1^/M2>+L4N#KDM#IQ-+`U.,2" + "V><7W.H:W.H:W>L;W>L;W.H:W.H:V^H:W.H:W.H:W.H:V^D9V^D9V.86N,3T)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "DI_/X_(AZODHZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZ_HIZ_HIZ_HI" + "Z_HIZ_HIYO4DK[SKEZ/*XN`=Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZ_HI" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZ?@GZODHZ?@GZODHZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/HO0!%F2!%F2!%J4!%J4!%J3!%F3!%J4!%J4!%F2!%N4!%N5" + "!%N4!%J5!%F4!%:2!%:2!%:1!%:1!%:2!%>6!%B8!%R;!&*B!&JL\"%61B)C$U>86" + "M,;XML?XM\\CYN,GZOL;VNH:" + "U>869L'88^KQ5NWX0.GQ/N;P/.7N/^7N'=WD3.;R0^+L1N#K4=[JD,+?P,[YT^$0" + "V><7V^D9W.H:W.H:W.H:V^H:VNH:VNH:V^H:V^H:V^H:W.H:V^D9V><7T=\\.0DY_" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D.T=XM,+R" + "Z?@GZODHZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ?P;W.H9W>L:X.X=Y?,BZO@GZ?@GZ?@G" + "Z?@GZ/8EW.@6V^,1X>85\\,'I_WZ%];G;ZML&\\L;P^J3#^Y>P^YJU^YNW^YNW^:7#" + "\\\\#I[=@#\\[_C^X^E]+7:Y=\\,X^H8ZO<6[_TMZODIZ/@HZ/1!%>2!%>2!%:1!%B3!%>5!%>7!%R;!&&@!&FK!5R;9'B@U.44" + "NLO]ML?XML?XN,GZO,S\\R]D)S-L*R-8%R-8%Q]4$QM4$QM0#Q-,\"EJ+1X>\\>X.X>" + "W^T=W^T=W^T=WNPL;W>L;V^L:" + "V.@8H,KQ4-C;4>KT1.?P/^7N.N3M../L+-[B3^?R/>#J0=[I4]GEB:G/N<;PT^$1" + "V.86VND9V^H:V^H:VNH:VND9VND9VNH:VNH:V^H:V^H:W.H:W.H:V^D9U>,2@8V]" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D7FNL:V><7VN@7WNL;XN`@Y/,B" + "X>\\>W.<7WND9W^H8Z=D$`'J\"];O>Y]X+^*K*_XJ;\\L;M\\LOS];G?]K?=\\\\;N\\0!%F2!%J3!%F2!%N4!%N5!%N4!%N3!%R6!%N5!%N4!%N4!%N3" + "!%J3!%F3!%B2!%>1!%>3!%>2!%:0!%:2!%>4!%B7!%N9!%^>!&BI!&*@-51_S-T)" + "P]4&M<;WML?XN,GZNLO[QM4$S]T-R-<&Q]8%Q]4$QM4$QM4$Q=0#F:?7V>84X>\\?" + "W^T=W^T=W^T=WNPL;W.L;" + "VND9SN(18;W*5N'G1^7N/./L-N+K,>'I0.+K0N'L/=[H0]SF@9U^<8U>48UN88V>@9V^D:V^H:V^H:V^H:V^D9U^45J+7D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D?HN\\W^X=ZODHZ_HI" + "ZODHZODHZ_HIZODHZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "W>P\\>WNL:W^T\\>" + "W^T2!%:2!%B6!%B6!%R9!%ZH'4N\"ML;R" + "S-T.M,7VM\\CYM\\CYNL;W>L;W>PL;" + "V^H:U^@7N]8#2[S&2=SB/>'J,N#H+M_F,-[F--WF-MKC6\\G9F[?;JKGHL+[KUN44" + "V><7VN@9V>@9U>88M\\`+A)[@8X'%;(W4E['QQ]D-VND:V^H:V^H:W.H:V><7P\\__" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+CIKH['AY_8EZ_HIZ_HIZODH" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIY_8E" + "J[GHCYJ`Y/(@Z_HIZ_HIZ_HIZ_HIZ_HIZ_HJZ_HJ[/LJZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HJZ_HIZ_HIZ_HIZ_HIZ_HIZODIZ_HIZ_HIZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ/[=@\"_)ZX_)NX[-3`[=D#`GA^" + "^*O-Z]L'`(:5_9\"GY=X+\\<#F`VQ@[LGRV-L'Z?/!%B0!%F0!%N2!%R5!%N5!%R5!%N3!%R5!%N5!%R5!%R5!%N4!%V7" + "!%J3!%N4!%J4!%J5!%B3!%B3!%>3!%:3!%:4!%F5!%R8!%V;!&.A!&NK\"U\"(G:W4" + "U.05LL3VM\\CYN,GZNL;W>L;W>L;" + "W.L;VND9U^<7O=<#9K?)00LW69+K*FK79N@7" + "V>@8V>@8U.48DJ_W*6C$09K`3+0A1K,3W>L:W^P@7]+O?_H>8\\L8XN`?Y/,B" + "YO4EZ/\\?Y/(CZ/.!%F0!%F0!%J1!%N4!%N4!%R5!%N3!%V6!%N5!%R4!%N4!%R5!%N5" + "!%J4!%N4!%J5!%J6!%B3!%B3!%B4!%:2!%>5!%>4!%F5!%R9!&&?!&NJ!5>/>XVS" + "U.45M\\GZM\\CYM\\CYNL;W>L;WNP;" + "W>L;W.H:V>D9UN<6T>,2KZS&E;'3K\\+LP,[]S-H)SMT,M,+QV^D9" + "V>@8UN87H+T!%G;=1+,C1KHN(*\\H\"J@8VN@9U>,2" + "?HFY)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D7FN;T^$0ZODHZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIXO$@E*'." + "I+#6ZODH[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HJZ_HJZ_HJZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZODHZODHZ_HIZODH" + "Z_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZODHZ?@G" + "Z?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/H9WNH:X><6[\\KR_(ZB^:G+[]'[\\-'Y];SA^*W-^J;\"^+#/[M+[" + "[M/^_XVC_8^AZMH%Z-X*_9\"F_HF7Y=`-V=X+Z?\\>X.X=X_(AY_4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?,BY?0CY?0CY?0CY?0CY?0CY?,BY?,BY/,BY?,BY/,BY/,BY/,B" + "Y/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/(AY/(AX.X>O,GY>H:W*C9G)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D1U2&T=X,WNP;XN`?Y/,B" + "YO4EZ/W^T=XO$AZ/.!%>.!%J2!%N4!%N4!%N4!%N4!%R4!%R5!%N4!%R4!%R6!%R6!%J4" + "!%N5!%N5!%F4!%J5!%F5!%B3!%B4!%>3!%:4!%:4!%J6!%R8!%^W^T=W^T=WNPL;W.H:W.H:VND9V>@8U^86T^03SMX-R]L*S-L*S]T,T=`0U>,3UN44NLCXVN@8" + "VND9R=\\7/7G:.*T>6;\\P):`H$*HE!Z8C!)X>!)\\>\"*(?(*,=D,$6T^(3V.86UN04" + "H*S=)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D@(V]W^X=ZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI[/LJ[/LJZ_HIZ_HIZ_HIZ_HIZODHO,GY?(BL" + "W.D5Z_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HJ[/LJ[/LJZ_HI[/LJZ_HI[/LJ" + "[/LJZ_HIZ_HJ[/LJZ_HJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZ_HIZ_HIZ_HI" + "ZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZ_HIZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZ?@GZODH" + "ZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/W.H:V^D9P<[`" + "Q=,#QM0$M\\3VUN,3T-T-V^<7WN<7X^(/\\,'F^9JS_)BT^*W0]+OB\\\\+K];[E^:S-" + "_X:5^:G&ZMX*XN<5Z=3`^Y>NZM/]W^02XNT;Z/8EZ/8EZ/W>L;W>P<" + "Y?0DZ/.!%F0!%J3!%J4!%N4!%R5!%R5!%N4!%N4!%R5!%V7!%V6!%N5" + "!%N5!%R6!%J4!%B3!%>3!%B4!%B4!%:2!%:3!%>4!%J5!%N7!%^\\?W^T=W^T=WNPL;W>L;W.H:W.H:V^D9VND9VND9V><7V.<6V.86V><7V>@8V>@8O\\W^U^44" + "VND:I\\,%&8CW7,$N1;B97#K+?@" + "Z_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HJZ_HI[/LJ[/LJ[/LJZ_HJZ_HI" + "Z_HI[/LJ[/LJZ_HJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZ_HIZ_HIZODH" + "ZODHZODHZODHZODHZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODH" + "Z?@GZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\?W.H9" + "R]D)S]T-O@8X.<6YM`,Z]/\\\\,?N\\L+F\\L+G[LWT" + "Z=\\*XNH9X>P;X>TP;X>H9W^@7Y.`>Z?\\>Y_8EYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0C" + "YO0CYO4DYO4DY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,CY?,BY?,BY?,BY?,BY?,BY/,BY/,B" + "Y/,BY/,BY/,BY/,BY/,BY/,BY/,BY/(AY/(AY/(AX_$@X.X=V.85S=L*QM,!Q-'`" + "I;+CD9[.3%B))S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DC)K,U>$.W^TV^H:" + "V^D9XO$AY_8FY_8GYO4FYO4FY?0DY/,DY/,DY/(CY/(CY/(CY/(CY/(CY/(CX_(C" + "X_(CY/(CX_$BXN`AH;#DP,OYRMD)R=@'R=@'R]D)R]D)R]H)R]D)C:OI!%*)!$^&" + "!%*)!%2,!%:.!%B/!%F0!%F1!%J3!%R5!%N4!%R5!%Z7!%V8!%R4!%V7!%V7!%V6" + "!%R5!%N5!%N5!%F4!%F4!%>3!%J6!%>3!%:2!%B4!%B4!%N7!%^;!&6E!&JI%D^$" + "K[_HT>(3M<;WN,GZN,GZNLK[P,__S]X.Q]8%QM4$QM0#QM0#Q=0\"Q=,\"KKSNN,/P" + "XO$AW^T=W^T=W^T=W^T=WNPL8W>H8WNL9W^P;WNP;" + "W^TL;W.H:W.H:W.H:W.H:W.H:W.H:W.H:W.H:V^H:Q=0$T^$0" + "W.L,3" + "S=L*,3QM)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D-D)SML3TZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZODH[/LJ[/LJZ/8FYO4D[/LJ[/LJZ_HIZ_HJZ_HIN\\CY=8&JW.H6" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HJZ_HIZ_HJ[/LJ[/LJ[/LJ[/LJ" + "Z_HI[/LJ[/LJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HI" + "ZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZ?@GZODH" + "ZODHZ?@GZ?@GZODHZ?@GZ?@GZ/H9W^L;X.L;X>PTT=" + "X>T=X>X>X>X>X>X>X>X=X>X=Y_0CZ?Y?,BYO4DYO4DYO4DYO4DYO4DY?0CYO4DYO0CY?0CYO4D" + "Y?0CYO4DYO4DY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BY?0CY?,BY?0CY?,BY?,BY?0C" + "Y/,BY/,BY/,BY/,BY/,BY/,BY/(AXN`?W>L:T^$0Q]0#N<7TKKOIOUN,0X.X=X_$@Y?,C" + "Y_8FZ?@H\\?\\O\\?`P[?TM[/PLZ_LK[/LK[/LK[/LK[/LK[?PL[?PL[OTM[OTM[?TM" + "[/PL[/PLZ_LKZODJYO4FX>`AWNP=WNT=X>`@Y/,CY?0DY?0DY?,CY/(BX_$AX.\\?" + "V^D9V.86W^X>YO4EYO4FYO4FY?0EY?0EY/,DY/(CY/,DY/(CY/(CY/(CX_(CY/(C" + "X_(CY/(CX_$BX_$BN3!%:2!%B3!%:3!%>4!%N7!%V:!&2B!&NL\"%6." + "E*3,UN<7M<;XN,GZN,GZNL;W>L;W>L;W.H:W>L;W>L;W>L;W>L;W>L;W.L;RMD*S=L*" + "W>T>>Z#R+:,76;TN\"J4E!:0C!)49\")T,2T-X.T=\\/N,;WS-H)O\\S^S=L+V^D9W^PX>X>X>" + "XN\\?XN\\?X>\\>XN\\>X>X=Z?8EZ/<6S]T+P]#_N,3RK+GFJ+7BO@7Y/,CY/,CY?,C" + "Y/,CY/,BY/(AX_$@R=<&5F*3)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DKKOLV>83X.X=X_$AY?,C" + "YO4EZODI\\P$Q\\?`P[?TMZ_HJZ_HJZ_HJZ_HJ[/LK[?PL[OTM[_XN[OXN[OXN[?TM" + "[/PLZ/T?HFV?XJW@HVZCYO)K+CGT-X,X_$AY/(BX_$AXN`@" + "X.X>V><7UN04W^T=Y?0EY?4EY?0EY?0EY/,DY/,DY/,DY/(CY/(CY/(CY/(CX_(C" + "X_(CX_$BX_$BX_$BS]\\2D9O)SMT-RM@(RM@(RMD(R]D)R]D)R]D)O=(&(F2G!$^&" + "!%\"'!%.+!%6-!%>/!%>0!%F1!%J3!%N5!%J4!%N4!%R5!%R6!%V6!%R7!%R6!%V6" + "!%Z8!%R5!%R6!%N5!%B3!%F4!%B4!%B5!%>2!%>3!%>5!%J6!%R9!&*A!&NM!%R7" + "`?W^T=WNPH9R]/ZF8^3OZI!X]!!\\-Y![]Q!Y=)L;W>L;W>L;W>L;W>L;W>L;W>L;W>L;W.L;S]T.Q]4#" + "W^\\?A*;U))P30+0K!*$C!*$B!)D:\"Y88\"9L<$)`=!)(5#9`;!9L68J<.P,[`T-X." + "TM`0AI'!)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D;7JJU^85ZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "[/LJ[/LJZ_HIZODHZODHZ_HI[/LJ[/LJ[/LJ[/LJ[/LJZ_HIR=@'<7^ET=X)[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJZ_HJZ_HIZ_HIZ_HIZODIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HI" + "ZODHZODHZODHZODHZODHZODHZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZODHZODH" + "Z?@HZ?@HZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/V.85V><7RM<'ML/UM\\3VR]@)S-H*V.86WNPX>X>X>X>\\>X.T=Y/(AZ?\\>Y/,BYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO0CY?0CYO4DYO0CYO4DY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BY?,CY?0CY/,BY?,BY/,BY/(B" + "X>`?W.H9T^$0RM@'P<[]M\\3RK+CEHZ_DWNP,2X.X>Y/,DY?0EY?0EY/,DY/,DY/,DY/(CY/(CY/(CY/(CY/(C" + "X_(CX_(CX_$BXO$AW.P=B9;'R]H(RM@(R=@(RMD(R]D)R]D)R]D)Q]<'6H;(!%&'" + "!%\"'!%.+!%2+!%>0!%>0!%F1!%J3!%J3!%R6!%R5!%R5!%R6!%R5!%N5!%N4!%R4" + "!%Z7!%V7!%R7!%N6!%J6!%J6!%B4!%B5!%>5!%>5!%>5!%J7!%N:!%^?!&JK!&.B" + "25^&T>$.P]0%M\\CYN,GZNP:X.X>W^T=W^T%!`_1!`_!!`NQ!`>I!`.E!_NE!" + "[N*LWND.W^TL;W>L;W>L;W>L;W>L;W.H:T^(3P,S\\" + "X?$AG;C_\"(D\"&*HE!)`B!)T@!)H;$IL:!:$>!)H9!(`2)J0,3T^$1S]T-R]D)S-L+" + "W.H:WNPW^P\\>Y_8EYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "Y?0CY?0CYO4DYO4DY?0CYO4DYO4DY?0CY?0CY?0CY?0CY?0CY?0CYO0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BY?0CY/,BY/,BX_$@WNPL9X.X=Y/(BY?0D" + "Y_8FZ_HJ\\`$Q[OTNZ?@HZ?@HZ?@HZ_HJ[/LK[?PL[_XN\\P$Q\\?`P\\/\\O[?PMQ-4)" + "AI\"`K+?CQ]4#T-X-T^$0U>,2UN03U>,2T^$0T=\\.T=\\.S]T,Q=,\"IK+AL;SJW^T<" + "X.X>W^T=V^D9U>,2U.(2X>\\?Y/,DY?0EY/,DY/,DY/,DY/,DY/(CY/(CX_$BX_(C" + "X_$BX_(CX_$BX_$BX.\\@G*K>PL_]RMD)R=@'RM@(RM@(RMD)RMD)R=@(@J/B!%&'" + "!%&(!%*)!%6+!%:/!%>0!%B0!%J3!%J5!%N6!%N5!%R5!%V6!%V7!%R7!%V8!%R5" + "!%R5!%N6!%R7!%R7!%F4!%N6!%F5!%B5!%>5!%>5!%B6!%J8!%R;!%^>!&>I!&JI" + "(D^#O\\[YS=X.M\\CXNW^T=W^T=W^TA!`.5!_>)!_N1!" + "_>1![>.YVN<2WNP;WNPL;W>L;W>L;W>L;W>L;W.H:U^46N\\CW" + "XO$AP=<2&7#A\")`=!)`B!)T?!)L=!)$4!(T1!(P.%YX9%I\\9$)@2@JKZO,KZS=L+" + "T^$0ML/R)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C9G" + "G:O;Y_8EZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJW^X>?(FVK[GBZ_HI[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HJZ_HJZ_HIZ_HIZ_HIZODHZOHIZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZODHZ_HIZ_HIZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>YO0CYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DY?0CYO4DYO4DYO4DYO4DY?0CY?0CYO4DY?0CYO0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,CY/(AX.\\>VN@7T=\\.R=<&PL_^OL:X>\\>Y/(AY?0D" + "Y_8F[/LK\\P$QZ?@HZ/L;W.H:V.86T=\\/UN44XN`AY/,DY?,DY/,DY/,DY/(CY/(CY/(CX_$BX_$B" + "X_$BX_$BX_$BX_$BX>\\@M,3XL+OHS-H*R=<'R=@(RMD)RMD(RMD)RM@(G[OV!%6-" + "!%\"'!%&(!%.*!%6-!%:.!%B1!%F2!%F5!%N7!%R7!%R7!%R7!%V7!%V8!%V8!%R7" + "!%R6!%N6!%J5!%N6!%N6!%J5!%B4!%F6!%F7!%F7!%J8!%N9!%V45M\\CXNLKZNLKZN\\O[P,__S]X-Q]8%QM0#QM0#Q=0#Q=0\"Q=,\"GJO<" + "T^$.X>\\?W^T=W^T=W^TE!_^-!`.5!_^-!]]A!`.=!" + "_>%!^>!*W-_KV><6W>L:WNP;WNP;WNPL;W>L;W>L;V><8N,7U" + "X_$@UN88>9OL!8H\"!)TAT=X([/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HJZ_HJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HI" + "Z_HIZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZ_HIZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GY_8EX_$@W>L;T=X.QM0$S=L+" + "M,#RSMT-N,7VO,GZV^D9W^TL:Z/\\>X.\\>XN`?Y_8EY_4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CYO4DYO4DY?0CY?0C" + "Y?0DY?0CY?0CY?0CY/,BXO$@W>L:U>,2S-H)Q-(!O\\S[N\\CWML/QJ[CEFZ?4@HVY" + ">(2PG*C7P<[^WNP;X_$AY/(BY/,CY?0CY?0CY?0DY?0DY?0CY?0CY?0DY?0CY?0C" + "Y/,CX_(AX.X=V><6T=X-R-8#L:X>\\>Y/(BY?0D" + "Y_8F[OTL[/LLYO4EY_8FZ?@HZODIZ_HJ[?PL\\?`P\\`$Q\\P$Q\\?`PR-H/D9S'QM+`" + "TM`/U>,2U^44VN@7V.85T^$0TM`/TM`/T-X-S]T,SMP+S=L*S-H)S-H(R]D(R=@&" + "Q='`V^@8VN@8V><7T^$1S]T-W.H:XO$AX_(CY/(CY/,DY/(CY/(CY/(CY/(CX_$B" + "X_$BX_$BX_$BX_$BXN`@S=T0EZ'.S=P+R-<'R=@'RM@(RMD)RMD(RMD(NLX$&%R?" + "!%\"'!%&(!%2,!%6,!%:/!%F2!%F5!%B4!%N7!%N7!%N6!%R8!%Z9!%Z:!%V8!%R7" + "!%R7!%N7!%R8!%N6!%J6!%N6!%F6!%N8!%F8!%F8!%J9!%R:!%ZF!&^N" + "!UN7B)F`V.@8N\\@W^T=W^T=W^TL9Q\\#2^>!!`_E\"`^U!_^1!^]I!_>%!^^!!^]Y!_^=!" + "_.!!^]]!Y-JKU.$-V^D7W>L;WNP;WNPL;W>L;W>L;VN@8M\\3T" + "X>\\?VND9Q=D12WK9#(X$!I@7!)@8!)87!)46!),4!9,3+I4+?:'KL\\'PQM0#T-X." + "U>,2TM\\.0DU^)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D6&25S]T-Z_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI[/LJZ_HIZ_HIZ_HIZ_HIZ_HI[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIJ[KI='VBY?0A[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HJZ_HIZ_HIZODHZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>Y_8EYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CY?0CYO4DY?0CY?0C" + "Y?0CY/(BW^T=V.85S]T,Q]4#PCYO)=8&N=8*NFZC6P<[]" + "W.H9XN`@X_(AY/,BY/,BY?,CY?0CY?0CY?0CY?0CY?0DY?0DY?0CY?0CY?0CY?,C" + "Y/(AX>\\>VN@7TM\\.R-4#QM,!:7:G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D@I#!TM\\,W>L:X>\\>Y/(BY?0D" + "Y_8F[/PLY?0DY?0CY_8EZ?@HZODIZ_HJ[_TM\\`$R\\`$Q\\P$QWN\\CD)S+PL_\\TM`/" + "U.(1U.(1W.H8V^D8V><6UN03U.(1T-X-S]T,RM@'S-H)S-H)R-8%R]D'RM@&R-8$" + "Q]4#S=L)V.86U^45U>03S]T-TM`0W^T>XO$AX_(BY/(CX_(CY/(CX_(CY/(CY/(C" + "X_$BX_$BX_$BXO$AXN`AW.L=B97%S-H)R=@(R=<'R=@'RM@(RMD(RMD(Q=8'27F^" + "!%\"&!%&(!%**!%6-!%:/!%>2!%B4!%F5!%B4!%N7!%N8!%R9!%Z:!%V9!%R9!%R8" + "!%Z:!%R8!%N6!%V8!%N7!%N8!%V:!%R:!%J9!%N;!%V!&\">!&.B!&BF!'&N" + "#&2<;GZAVNH9P-(\"O,W]OL[_O\\__P-#`SMT,RMD(QM4$Q=,\"Q=,\"Q=,\"Q=,\"HK#A" + "SML'X>`@W^T=WNP)!" + "^]]!^=Y![-IRS=C^U^44V^D8WNP;WNPL;W>L;W>L;W.H:V^D9M\\7U" + "X.X=V^H:U^86P-,,6H'5&X'S'9(+%9,0#Y(/&9(,.H[^>IKEJ[KJP,[]S-H*TM`0" + "U>,3TM`/:76E)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D<'VMV^D9Z_HIZ_HI" + "Z_HIZ_HIZ_HJZ_HIZ_HIZ_HI[/LJZ_HI[/LJ[/LJZ_HI[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ/8FCY[,D)K!Z_HH[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HJZ_HIZ_HIZODHZ_HIZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZODHZ_HIZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZ?@GZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>W.D9W>L:WNP\\>Z/8EZ/`?W.H9" + "T^$0RM@'P]#_OLOZN\\?VL\\#NI[/AE:'.?(BU:W>D?8JXIK/BRM@&WNP;XN`?X_$@" + "Y/(AY/,BY/,BY/,BY?,CY?0CY?0DY?0CY?0CY?0CY?0CY?0DY?0DY?0CY?0CY/(B" + "X>\\?V^D8T]`/R=8$Q-#_QM,!9G.D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DD)_1T]`-W>L:X>\\>Y/(BY?,C" + "Y_8FZ/,2VN<6W>L:U^44V><6UN03TM`/SMP+SMP+S=L*R]D'R]D(R=<&R=<&R=<%Q]4#" + "Q]4#QM0\"T-T,U>,3U>,3T-X.S-H)VN@8X>\\?XN`AX_$BX_(CY/(CX_(CX_(CX_$B" + "X_$BX_$BX_$BX_$BXN`AX.\\@E:38Q=,!R=@(R-<'R=<'R=@(RM@(RM@(R-<'=9K<" + "!%&(!%&(!%*+!%6-!%6.!%>2!%F5!%F5!%N7!%J7!%R:!%ZUY/,CRML+Q=<'QM<'QM<'Q]@(U>03R]H*QM0#Q=0#Q=,\"Q=,\"Q=,\"HK#A" + "SML(XN`@W^T=WNP5!`_)!`>A!`.1!_N)!_.)!^MQ!^]]!^^!!" + "^=Y!^-U![MA1R='OU.(1VN@7W.H:W>L;W>L;W>L;W>L;W>L;W.H:W.H:V^D9N<;W" + "W^TL;VN@8V.87SM\\2H[;O;8S657[56H38=(_5F:O?M,+SPL__S-H)TM`/U>,2" + "UN04T^$0@X^_)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DA9+\"X_(AZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HI[/LJ[/LJZ_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJX.\\?>H:QK;?A[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HIZ_HIZODHZODHZ_HIZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZ_HIZODHZODHZODHZ_HIZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZ?@GZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/X_$@Y_8EYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DY?0CYO4DYO4DYO4DYO4DYO4DY?0CX_(AWNT(/W>L:X>\\>X_(BY?,C" + "Y_8FY/(BX_(AYO4DY_8FZ?@HZ?@H[/LK\\`$Q]0$R\\`$QV^T@F:32S-H'U>,2X>\\>" + "V^@7X.X=WNP<6T^$0TM`/TM`/S-H)RM@'Q]4$R=<&Q]4$R=<%Q=,\"Q]4#" + "QM0\"Q]4#Q-'`T=\\/T^$1T=\\/R]D(TM`0W>P`AK;WQM<'ORMD)R-<&R-<&R=@(R=@(RM@(R=@(F+3R" + "!%.,!%\"'!%.+!%2-!%:/!%>3!%>4!%J6!%N7!%N8!%R:!%VR]P,RML+RML+RML+SMX.V>D9R=<'QM0#Q=0#Q=,\"Q=,\"Q=,\"GJS>" + "T-T*X>\\@WNP<6W.H:W>L;W>L;W>L;W>L;W>H:W.H:W.D9V^D9NL?W" + "WNL:WNP,2UN04" + "U^45U.(2F:75)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DF:76YO4DZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HJ[/LJ[/LJZ_HI[/LJ[/LJ[/LJ[/LJZ_HI[/LJZ_HI[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJU>,3;WFBPLWW[/LJ[/LJ[/LJ" + "[?PK[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HIZ_HIZ_HIZODHZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/(1R]@&Q='`Q-#_Q-#_Q]0#9G*C)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DH:[@UN,0W>L:X>\\>X_(AY?,C" + "YO4EX>`?X_(AYO0DY_8FZ/L;U^44T^$0TM`/S-L*RMD'S-H)R]D(R-8%R-8%QM0#QM0\"QM0\"" + "QM0#PL__P@8WNT=X>\\@XN`AXN`AX_$BX_$BX_$B" + "X_$BX_$BX_$BX_$BXN`AXN`AQ=8)GJG5S-L*R-<'R-<'R=<'R=@(RM@(R=@(L\\H!" + "\"%B8!%\"(!%.+!%2,!%:/!%B3!%B5!%F6!%N8!%N8!%R:!%V=!%Z=!%Z=!%Z=!&\">" + "!&*>!&*>!&\"=!&.>!&2>!&2?!&6?\"FF@)FN?57ZMA*',J[[JR-H$W>P;Y/,BX.`@" + "V.<7S]T-R=@'RMD(R=D(RMH)S-L*T^,2T^(2QM4$QM0#Q=0\"Q=,\"Q=,\"Q=,\"FZC9" + "UN,1X.X?WNPH9T=7WY\\E!_^A!_N-!_>%!^]]!]-=!_N=!_.%!^-M!" + "^MY!]-I!W,IVP\\OPT=\\-V.86W.H9W>L:W>L;W>H:W>H:W.D9W.D9W.D9V^@8N<7U" + "W>H9WNP@8V.<7V.87UN04U>,3U.(2U.(2U>,3UN04U^45V.86" + "V.86U>,3J[?F)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+CIKJ[CIZ?@GZ_HIZ_HIZ_HIZ_HI[/LJ" + "[/LJZ_HJ[/LJZ_HJZ_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LK[?PK[/LJ[/LJ[/LJ[/LJR-8&9G\"9S]P&[/LK[/LJ[/LK" + "[/LK[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZ_HIZODHZODHZODHZ?@G" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?<6XO$@Y_8EYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DY?0CX_$AWNP;U>,2S-H)Q-'`O\\S[N\\CVM<'OJ[CFF:73@8RY:G2B9&^<" + "B9;%LK_NT=\\-W^TL:U>,1" + "S-D'Q='`Q-#_P\\_^Q-#_Q]0#76F:)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DI;/EV.43WNP;X>\\>X_$AY/,C" + "X_(BX>\\>X_$@Y?0CYO4EZ/,2Y?0DXO$A" + "W>L:W.H:W>L;V^D9U^45U.(1S=L*S=L*R]D(R=@&QM4#R-8%R-8%QM0#R-8%P]#_" + "P<[]PL__P<[]PL[]S-H)SMP+R]D)Q=,#UN04W.L;X.X>X>\\@X>\\@XN`AX_$BX_$B" + "X_$BX_$BXN`AXN`AXN`AXN`AV.@:B)/!S-H*R-<'R-<&R=<'R=@'R=@(R=@(P]0&" + ".G*U!%&)!%&*!%2-!%60!%B6!%B6!%N9!%V;!%R;!%Z=!%Z>!&\"?!&\"@!&*?!&6@" + "!&:@!&>@!&BB%6NB,G*B:8JVEZW9M\\CUT-`,X.\\>Y/,BX.\\?V.<7S]X.Q]8%PL__" + "P,W]P<[^P]#`R-<&R]H(S=P+T^(1TN$1R-<&QM4#Q=0#Q=,\"Q-,!Q=,\"Q-(!E:+3" + "W>L8X.X>WNPL:VN83S[B=]]U!_N-!_>%!^M]!]]E!_N5!^-U!]MM!" + "]MM![]5!Q+RAQ<_XTM`/V><6W.D9W.H:W.H:W.H:W.D9W.D8W.@8W.D9V^@8NL;U" + "W>H8W^P<7V.86V><6V.86V><6V><7V><6" + "V.86UN03N\\?X)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D.45VO,GZZ_HIZ_HI[/LJZ_HI[/LJ[/LJZ_HJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJN\\GY8VV3U^41[/LK[/LJ[/LK" + "[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJZ_HIZODHZ?@GZODHZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HI" + "ZODIZ_HIZODHZ_HIZODHZ_HIZODHZODHZODHZODHZ_HIZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@G" + "ZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/<6X_$AY?0CY_8EYO4DYO4DYO4DYO4DY?,C" + "X>\\?VN@7T=X-Q]4$PCIG'>(.P9&^:>86RH[#>Q-(!W.H8" + "XN`?X_$@X_$@Y/(AY/(AY/(AY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY?,B" + "Y?,BY?0CY?0CY?,CY?0CY?0CY?0CY?0CY?0CY?0DY?0CY/,BXN`@WNP;U>,2S-H(" + "Q='`Q-#_Q-#_Q-#_Q-#_Q]4#35J*)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DJ[CJV><4WNP;X>\\>X_$AY/,C" + "XN`@X.X=X_$@Y/,CYO4EY_8FZ/,3U.(1T^$1S=L*S-H)Q]4$R-<%R-8$Q]4$Q=,\"Q=,\"P]#`P\\__" + "P\\__PL[^P,W\\O@8W>PX>\\@XN`AXN`AXN`A" + "X_$BX_$BXN`AXN`AXN`AXN`AWNT>C9S.QM0!R-<'R-<&R-<&R=@'R=@'R=@(Q]8&" + ";9/2!%&*!%&*!%2-!%:1!%F6!%N8!%N9!%Z@(FN>" + "2'NG?9C%I+GEPM+^U^<5XO$?X_(BW^X>V.<7T-\\/R-<&Q-(\"P](!P](!P]'`Q-,!" + "Q=0#QM4$R-<&R]H)T=`/U.03SMT-R-<%QM0#QM0#QM0#Q=,\"Q-,!Q-(!P](!D9W," + "XN`?X.X>WNPL;V^D8TM;YV+UA^-Q!^^!!^-Y!^=Y!^-Q!]MI!\\]E!" + "\\-5!U<7W.D9W.D9W.D9V^@8V>05Q\\K^N;7HP+KJU-4#V^44" + "WNH9WNL;W>H:W>H:W.H:V^D9V^D9V^D9VN@8VN@8VN@8VN@8VN@8VN@7V>@7V><7" + "V.86UN04R-8%*C9G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D2U>(R]@(Z_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LK[/LJL\\#P9FV1WNP8[?PK[/LK[/LK" + "[/LK[/LK[/LK[/LK[?PK[/LK[?PK[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZODHZODHZ_HIZODHZODHZ?@G" + "ZODHZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "Z?@GZODHZ?@GZODHZ?@GZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?XN`?X_$@X_$A" + "Y/(AY/(AY/(AY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,CY/,BY/,B" + "Y?0CY?0CY?,CY?0CY?,CY?0CY?0CY?0CY?0CY?0CY/,BX_$@WNP;U^03S=H(QM,!" + "Q-#_Q-#_P\\_^Q-#_P\\_^R=8$15&\")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DL;_PVN@5W>L:X>\\>X_$AY/(B" + "W^X>X.X=XN`@Y/,BY?0DY_8FZ/H:W.H9V^D8U^85U.(2S=L*S-H)RM@'R-8%Q]4$Q]4$Q]4$QM0#R-8%Q-#`Q-(!" + "PL_^P,W\\P\\@X>\\@X.X?I;3HN,3QRMD(R-8&R-<&R=@'R-<'R=<'R=<'" + "DJ_M!%.,!%**!%2-!%:1!%N8!%N7!%V:!&&%F6>,&R?7H*PC:71K\\/OS-P'" + "W>P:Y/(BXO(AW.L;UN45SMT-Q]8%Q=0#QM4$Q]8$Q]4$Q]8%Q]8%Q]8%Q]8%R-<&" + "R=@'RMD(S]X-U.,2T=`/RM@(Q]8%QM0#QM0#Q=0\"Q=,\"Q-(!Q-(!Q-(!P<_`DI[," + "YO4DW^T=WNPL;W>L:VN<6S]#KU+EL[]1!\\MI!\\]I!\\MA!\\=9!Z]%!" + "SKA;M;.[PLWXT-T,U^44VN@8W.D9W.D9V^<7RLT\"B'&IFT-LPUV(UFB4V&V7VI_)" + "W=X,WNH:W>H:W>H:W.H:W.H:W.H:V^D9V^D9V^D9V^D8VN@8VN@8VN@7VN@8V><7" + "V><6U^45T-X-1U.$)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D6F:7U.,2Z_HI[/LJ[/LJ[/LJZ_HI[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LK" + "[?PK[/LJ[?PK[/LJ[/LJ[/LJ[/LJ[/LJ[/LKZ_HJKKOK;'27X.X;[/LK[?PK[/LK" + "[?PK[?PK[/LK[/LK[?PK[?PK[?PK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[?PK" + "[/LJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HI" + "Z_HIZODHZODHZ_HIZ_HIZ_HIZODHZ_HIZODHZODHZODHZODHZ_HIZODHZODHZ?@G" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODH" + "ZODHZODHZ?@GZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/H:T^$0R=<&P<[]N\\CVL\\#N" + "JK?EG:G7AY3!DCYO)L\\#NT-X,W^TL:X>\\>XN`@Y/(B" + "WNP\\>V.<7" + "V><6VN@7V.85U>,3TM`/T-X-R]D(RMD(Q]4$Q]4$QM0#QM0#Q=,\"PL__PL__P,W]" + "P,W]O\\S[O,3V>@8W>LX.X?X>\\@" + "X>\\@XN`AXN`AXN`AXN`AX>\\@X.\\@O\\`$H:O7RMD(Q]8&R-<&R-<&R-<&R=<'R-<&" + "KL3^!%>5!%**!%2+!%B/!%R4%EZ4.FJ:;(FVEZW9NLGUT=`-W^X@8" + "T>$0RMD(Q=0#Q=0\"QM0#QM4$Q]8$Q]8$Q]8%R=<&R=@'RM@'RMD(R]D(RMD(S-L*" + "T-X.U.,2T=`0R]H)Q]8%QM4$QM0#QM0#Q=0\"Q=,\"Q-,\"Q-(!Q-(!Q-(!NL;W>L;W>L;W.H9V><5T]K`QKNVSK9@U[]!U;U!R+-2MJF+" + "MKG,P\\WVSML*U>,2V><6V^@8W.D9V^@8RLL!J4^#\\6N3`WNI`V^A`VJ:`VF9`F^?" + "^(VYX]8#W.@8W>H:W.H:W.H:W.H:V^D9V^D9V^D9V^D8VN@8V><7VN@8V><7V><7" + "V><7U^45TM`/:W>G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D7FJ;VN@7[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LK[/LJ[/LJ[/LK[/LJ" + "[/LK[/LJ[?PK[/LJ[/LJ[?PK[/LK[/LK[?PKZ_HJK;KJT^$/W>L:UN03OLOZN<7SK[WKH[#>D)S(>X6R" + "<7RIBI?$K;KIR]D'W>P:XN`?X_$@X_$@X_$@X_$@Y/(AY/(AY/(AY/(AY/(AY/(A" + "Y/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY?,CY/,B" + "Y?,BY?0CY?,CY?,CY/,BY?0CY?,CY/,BY/,BX_$@W^T\\>XN`@X_$A" + "W>L;WNP;X>\\>X_$AY/(BY?,CYO4EZODJZ_HKZ_HKT.$4LK[KS=L*S]T,UN03U>04" + "U>,2T=\\.U.(1SMP+SMP+R=<'R=<&Q]4$Q]4$Q]4$QM0#Q=,\"Q-,!Q-(!PL__PL__" + "P,W\\OLOZO,GXN,7TM<'OPL__QM0#PL[_P]#`T^$1U^86V^H:W>PX.X?" + "X>\\@X.X?X>\\@XN`AX>\\@X>\\@X>\\@U^<9B)/!RM@'Q]8&Q]8%R-8&R-<&R=<'R-<&" + "P=,%.W\"M(%2#0&2/<8BOEJC4ML;PSMX+VND8W.L:V.<7T>$0S-L+QM0$P](!Q-,!" + "Q=,\"QM0#QM4#QM4#QM4$Q]8%R-<%R=@&RM@'RM@'R]D(R]H)S-H)SMP+TM`/U.,2" + "T-\\/R]H)R-<&Q]8%QM4$QM4$QM0#Q=0#Q=0#Q=,\"Q-,\"Q-(!Q-(!Q-(!I[7GP,OW" + "Y/,CWNPL;W>L;W>L:W.H:V^D8VN@7V>84TMT%R,WLP\\CCPLKJQ=#Y" + "R]@%T=\\-UN03V><6V^@8V^D8W.D9V=`3LVFG^VN5`X*Q`VR>`V66`V.5`V*4`F*4" + "`F65^H2NWM8#VN<7W.D9W.H:W.H:W.H:V^D9V^D8V^D8VN@8VN@8VN@8V><7V><7" + "V><7U^45TM`/AI+!)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D9'&AW.L:[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LK[/LK[/LK[?PK[/LK[/LJ[/LK[?PK[/LJ[/LK[/LK[?PK[/LK[?PK[/LK" + "[/LK[?PK[?PK[?PK[/LK[?PK[/LK[/LK[?PK[/LJK[WM=H*GWNP9[?PK[?PK[?PK" + "[?PK[?PK[?PK[/LK[?PK[?PK[/LK[/LJ[/LJ[?PK[/LJ[/LJ[/LJ[/LK[/LJ[/LJ" + "[/LJ[/LJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HI" + "ZODHZ_HIZ_HIZ_HIZODHZ_HIZODHZODHZODHZ_HIZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZODHZODHZ?@G" + "ZODHZODHZ?@GZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/L:XN`?X_$@X_$@X_(AX_$@X_$@Y/(AY/(AY/(AY/(AY/(AY/,BY/,BY/(AY/,B" + "Y/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY?,CY?,BY?,B" + "Y?,BY?,BY/,BY?,CY?0CY?0CY?,BY?,CX_$@W^TL:X.X>XN`@X_$A" + "W>L;W>L:X.X=XN`@X_$AY/(BY?0DZ/@9W.H;WNP=WNP=X.X?" + "X.X?X>\\@X>\\@XN`AX>\\@XN`@X>\\@W^T?E:37P83" + "X.\\?WNPL;W>L;W>L;W.H:V^D9V^D8VN@7V><6UN03U>,2U>,2" + "UN03V.85VN@7V^D8V^D9W.D9V^@8Q;SVZ51Z`XJW`W2H`V26`V26^UN+`5Z-`F\"2" + "`&\"1_F>5[IB_U=\\-V>86V^D8W.H9W.H9V^D9V^D8V^D8VN@8VN@8VN@8V><7V><7" + "V><7V.86TM`/EZ/4)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D:7:FWNP;[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[?PK[?PK[?PK" + "[?PK[/LK[/LK[/LK[/LK[/LJ[?PK[?PK[?PK[?PK[?PK[/LK[/LK[/LK[/LK[/LK" + "[?PK[/LK[?PK[?PK[/LK[?PK[/LK[/LK[?PK[/LJML3T=H*IV>@4[?PK[?PK[?PK" + "[?PK[?PK[?PK[?PK[/LJ[?PK[/LK[?PK[/LJ[?PK[/LJ[/LJ[/LK[/LJ[/LK[/LJ" + "[/LJ[/LJZ_HJZ_HIZ_HIZ_HIZODHZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZODHZODHZODHZODHZ_HIZODHZODHZ_HIZODHZODHZODHZ?@GZODH" + "ZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@G" + "ZODHZ?@GZ?@GZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/<6W^X=X_$@X_$@OX:T:7:CGZS;Q-'`W>L9X_$@X_(AX_(A" + "Y/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/,BY/(AY/,BY/,BY/,BY/,BY/,BY/,B" + "Y/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY?,BY/,BY?0CY?,B" + "Y?0CY?0CY/,BY?,CY?0CY/,BY/,BX_$@W^TL:X.X=XN`@X_$A" + "W>L;W.H9W^T\\>XN`@X_$AY/(BY_8FZ/T?K+CGQ]4#R-<%R=<&Q-'`" + "S-H(S]T,SMP+S-H)S=L*R-8%Q=,\"Q]4$Q-(!Q-(!QM0#PL__PL__P,W]P<[]OLOZ" + "O,GXN\\CWM\\3SJKCGKKKGO,3V.87V^D:W.H;WNP=W^T>" + "X.X?X.X?X>\\@X>\\@X>\\@X>\\@X>\\@X.X?NL;W>L;W>L;W.H:W.H:W.H:V^D9V^D9V^D8V^D8V^D8VN@7" + "V^D8V^D9V^D9W.H9W.H9V^D9VN87PY+._VV3`Y7(`V*4`V\"2`V&3^%.$_5&$`5^1" + "_V\"1_6.2^&^9U\\?SU.(1V><6V^D9V^D9V^D9V^D9V^D9VN@8VN@8VN@8V><7VN@7" + "V><7V.86T^$0I[/B)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D;WRMX.\\>[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[?PK[?PK[?PK[/LK[/LK" + "[/LK[?PK[/LK[/LK[/LK[/LK[/LK[/LJ[/LJ[?PK[?PK[/LK[?PK[?PK[?PK[/LK" + "[/LK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LK[/LJPM#`=8&IT=\\*[?PK[?PK[?PK" + "[?PK[?PK[?PK[?PK[/LK[?PK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJZ_HJZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZ?@GZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODH" + "Z?@HZODHZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/L:X.X=XN`@X_$A" + "W>PL:W^T=X.X>X>\\?X_$AY/,DY?0EY?0EXO$BK[SMPL__QM0#QM4#PL__" + "Q-'`S-H)S=L*RM@'QM0#Q]4$QM0#QM0#P]#`Q-(!PL__P<[^PL_^O\\S\\O@9W.H;W>L\\?X>\\@X>\\@X>\\@X>\\@X.X?V.@:A9&`Q]4#QM4%Q]8%Q]8%Q]8%R-<&" + "R-<&R=<'PM#`J[OHJ;GEK[[KM,+PM\\7SNLCWO,GYO\\S\\P,W]P<[^P]#`Q=0\"QM4#" + "Q]4$R-<%S-H)SMP+T-\\.TN$0TN$0T=\\/S=L+RM@(R-<&Q]8%Q]8%Q]4$QM4$Q]4$" + "QM4$QM0$QM0#QM4$Q=,#Q=,\"Q=,\"Q=,\"Q-,\"Q-(!Q-(!Q-(!Q-(!K;SNKKCDYO4E" + "WNPL;W>L;W>L;W>L;W>L;W>L;W.H:W.H:W.H:W.H9W.H:W.H:W.H:" + "W.H:W.H:W.H:W.H:W.H:W.D9V>46RW:S`G>@`XB\\`UZ/`UZ0`UZ1^E!`_5:,_U>)" + "_F&2_&.3]6.1W*S4S]P+UN03VN@7V^D9V^D9VN@8VN@8VN@8VN@8VN@8V.86V><7" + "V><6V.86T^$1M,'P)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ">(6VX>`?[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LK[/LK[/LK[/LK[?PK[/LK[/LK[/LK" + "[?PK[/LK[/LK[/LK[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[?PL[?PK[?PK[?PK[/LK" + "[/LK[?PK[?PK[/LK[?PK[?PK[?PK[?PK[?PK[/LJT=\\0<'RFQM+_[?PK[?PK[/LK" + "[?PK[?PK[?PK[?PK[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJZ_HJZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZODHZ_HIZODH" + "Z_HIZODHZ_HIZ_HIZODHZODHZODHZ_HIZ_HIZODHZODHZ_HIZODHZODHZODHZODH" + "ZODHZODHZO@GZ?@GZ?@GZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZ?@H" + "Z?@GZ?@GZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>Y/(AY/,BY/,B" + "Y/,BY?0CY?,BY?0CY?,BY?,BY/(AM+[K&R54F*C9Y?0CY/,BY/,BY/,BY/,BY/,B" + "Y/,BY/,BY/,BY/(AY/,BY/,BY/,BY/(AY/(AY/(AY/,BY/,BY/(AY/(AY/,BY/(A" + "Y/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY?,BY/,B" + "Y?0CY?0CY?,CY?,BY/,BX_$@W^TL:W^T\\?X_$A" + "X.X>V><6V^D8WNP;W^T=X.X>X>\\?X_(BY/(BX_(CX_(COLW`N\\CVP]#`Q-'`P<[^" + "N\\CWR-8$Q]4$R-8%Q]4$Q=0\"QM0#P]#`PL__PL__P<[^P<[]OLOZN\\CWO,GXNL?V" + "N,7TN<;UKKWM@HVYLK[LN\\CXO\\S\\M\\3TP<[^SMP,T^$2UN04V.<7V^D:W.H;WNP=" + "W^T>W^T=X.X?X.X?X>\\?X>\\@X>\\@X>\\@W^T>I+3GL;SIR-<'Q]4%QM4$Q]8%R-<&" + "R-8&R-8&R=<'R]H)S=L+R]H)RMD(RM@'RM@'RM@'R]D)S=L*SMP+S]T,T-\\.T=\\." + "T=\\/T=\\/T-X.SMT,S-L*RMD(R=<'R-8&Q]8%Q]4%Q]8%Q]4$QM4$QM4$QM4$QM0#" + "QM4$QM4$Q=0#Q=0#Q=,#Q=,\"Q=,\"Q-(!Q-(\"Q-(!Q-(!Q-(!P]#`C)K+U^01X>\\@" + "W>L;WNPL;W>L;W>L;W>L;W.H:W.H:W.H:W.H:W.H:V^D9V^D9W.H:W.H9W.H:" + "W.H:W.H:V^D9W.H:W.D:V^@9V>06RV^M`G.?`W:J`UN.`ER/`EZ1^DU]`&N;^4Z!" + "_F&2^V.3]F21WIS$RM8$U.(1V.85VN@7VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7" + "V><6V.85U.(1P,W\\)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DA)#!" + "Y/,B[/LJ[/LJ[/LJ[/LJ[/LK[/LJ[/LK[?PK[/LK[/LK[?PK[?PK[/LK[/LK[?PK" + "[?PK[?PK[?PK[?PK[?PK[?PK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[?PK[?PK[?PK[?PK" + "[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LJX.X>;WJEM04V.87VN@9W.H:W>L<" + "WNPX.X?X.X?X>\\?X>\\@X.X?X.X?T>(4@X^]Q=0\"Q]8%QM4$Q]8%Q]4%" + "Q]8%Q]8%R-8&R-8&R-<&R=@'R=@'R]D(R]D)R]H)R]H)R]D)R]D)RMD(R=@'R=<'" + "R-<&R-<&R-8&R-<&R-8&Q]8%Q]8%Q]4%Q]4%Q]4$Q]4$QM4$QM4$QM0#QM0#QM0$" + "Q=0#QM0#Q=0#Q=,\"Q=,\"Q-(!Q-(!Q-(!Q-(!P]#`P](!P]'`N\\CZCYG%Y_4EW^T=" + "W>L;W>L;W>L;W>L;W>L;W>L;W.H:W.H:W.H:W.H:W.H:V^D9W.H:W.H:W.H:V^D9" + "W.H:W.H:W.H:V^D9W.D:V^@9V.04Q(._`&24`VJ=`EN.`EN.`%R/^4M`^4-[^U.&" + "^E>(^6.0]F62V9O\"QM#_TM\\/U^44VN@7VN@8VN@8VN@8VN@8V><7V><7V><7V><7" + "V><7U^45U.(1RM<&,#QM)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DCIS,Y_8E" + "[/LJ[/LJ[/LJ[/LJ[/LK[/LJ[?PK[/LK[/LJ[/LK[/LK[/LK[?PK[/LK[?PK[?PK" + "[?PK[?PK[?PL[?PK[?PK[/LK[/LJ[/LK[/LJ[/LJZ_HJZ_HJZ_HJ[?PK[?PK[?PK" + "[?PK[/LK[?PK[?PK[?PK[?PK[/LK[/LK[/LK[/LKZ/G*O=Y?0CY/,BY/,BY/,BY/,BY/,B" + "Y?,BY/,BY/,BY/,BY/,BY/(AY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/(A" + "Y/,BY/,BY/,BY/,BY/(BY/(AY/,BY/,BY/,BY/,BY/,BY?,BY/,BY/,BY/,BY/,B" + "Y?,BY?,CY/,BX_$AW^T@9V^D:W.H;" + "W.H;W^T=W^T>X.X>X.X?X>\\?X>\\?X.X?X.X?WNT>H*_CK+CEQ]8%Q]8%QM0$QM4$" + "QM4$Q]8%Q]8%Q]8%Q]8&Q]8&Q]8%Q]8%Q]8&Q]8%R-<&Q]8%Q]8%R-<&Q]8%Q]8%" + "Q]8%Q]8%Q]8%Q]8%Q]8%QM4$QM4$QM4$QM4$Q]4$QM4$QM4$QM0#QM0#Q=0#QM0$" + "Q=0#Q=0#Q=0#Q=,\"Q-(!Q-,\"Q-,\"Q-(!Q-(!P]#`P]#`P]#`E:+4Q]/`X_(BWNP<" + "W>L;W>L;W>L;W.L;W.H:W.H:W.H:W.H:W.H:W.H:W.H:W.H:W.H:V^D9W.H:W.H:" + "W.H:W.H:V^D9V^D9V^D9VN@8V>86PJ;B]%>$`V*5`EJ.`5J-_%:)_%6#`6&1_U^." + "\\U2#^621\\F21RJ3-Q,_^T=X-UN03V><6VN@8VN@7VN@8VN@8VN@8V><7V><7V><7" + "V.86U^45U.(1SML*45V,)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DF:?7Z?@G[/LJ" + "[/LJ[/LJ[/LK[/LJ[/LK[?PK[/LK[/LJ[/LJ[/LK[/LK[/LK[?PK[?PK[?PK[?PL" + "[?PL[?PL[?PK[?PL[?PK[/LJ[/LK[/LK[/LJZ_HJZ_HIZ_HIZODH[?PK[?PK[?PK" + "[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LK[/LKZ_HJG*G8BY>_X_(@[?PK[/LK" + "[/LK[?PK[/LK[/LK[/LJ[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJZ_HJ[/LJZ_HIZ_HIZ_HIZODHZODHZ_HIZODHZODHZODHZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@G" + "Z?@GZ?@GZ?@GZODHZODHZODHZODHZODHZODHZ?@GZODHZODHZODHZODHZODHZODH" + "Z?@GZODHZODHZODHZ?@GZ?@GZODHZ?@GZ?@HZ?@HZ?@HZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/-C]LI;3EYO0DY/,BY/,BY/,BY/,BY/,B" + "Y?,BY/,BY/,BY/,BY/(AY/,BY/(AY/,BY/,BY/,BY/,BY/(AY/,BY/(AY/(AY/(A" + "Y/(AY/,BY/,BY/,BY/(AY/(AY/,BY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY?0C" + "Y?,BY/,BX_$@W^TXN`@" + "Y/,CW^X?U^44V><7V^D8W.H:W.H:WNPW^T>W^T>U.06K;OJN<;UNL?V" + "N,7TL;[MJ;;DN<7TP,W]P,W]P,W]O\\S\\OLO[O@8VND:V^H:" + "W.L;WNPX.X>X>\\?X>\\?X.X?X.X?W^T>T^,5?XJYP<_]QM4$QM0$Q=0#" + "QM0$QM4$Q]8%Q]8%Q]8%Q]8%Q]4%Q]8%Q]8%Q]8%Q]8%Q]8%Q]8%Q]8%QM4%Q]8%" + "Q]4$Q]4$Q]4$Q]4%Q]4$QM4$QM4$QM4$QM0#QM0#QM4$QM0#Q=0#Q=0#Q=,#Q=,#" + "Q-,\"Q=0#Q=,\"Q-(!Q-(!Q-(!Q-(!Q-(!P]#`P](!P]#`NP<" + "W>L;W>L;W.L;W.L;W.H:W.H:W.H:W.H:W.H:V^D9W.H:V^D9W.H:W.H:V^D9V^D9" + "V^D9V^D9V^D9V^D9VN@8V^@9V>87T=('T$Y__V\"0`5J-_U:*^52%^V&-^U2'^E2%" + "^%R+]5^.YVZ8NK/=Q='`T=\\.UN03V.86V><7VN@8VN@8V><7V><7V><7V><7V><6" + "V.86U^45U.(2S=L*;GJI)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C9GI+'BZODH[/LJ[/LJ" + "[/LK[/LK[/LK[/LJ[/LKZ_HJZ_HJZ_HJ[/LJ[/LK[/LK[?PK[?PK[?PK[/LJZ/8F" + "Y/(AX.\\>W>P;W.L:W>L:WNP;X>`?YO4DZ_HIZ_HJZ_HIZODHZ?@GZ_HI[?PK[?PK" + "[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LJO,GZ>82LU>,1[/LK[/LK" + "[/LK[/LK[?PK[/LK[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJZ_HJZ_HIZ_HIZODHZ_HIZODHZODHZ_HIZ_HIZ_HIZODHZ_HI" + "Z_HIZ_HIZ_HIZ_HIZODHZ_HIZODHZODHZODHZ_HIZODHZODHZODHZODHZ?@GZODH" + "ZODHZODHZ?@GZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZ?@GZ?@GZ?@GZ?@HZ?@GZ?@GZ?@GZ?@HZ?@HZ?@HZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/XN`@" + "X_(BY?0EUN45U^44V><6VN@8V^D9W.H:W.H:WNPPPPI[3AM,#ON<;VNL;VKKWLN\\CWQ]4%S=L+T=\\0U.(2U^46V><8VND:V^H;" + "W.L;W>PX.X>X.X>X.X?X.X?X.X>X.X>W^T>K[_RF*30QM4$QM4$Q=0#" + "Q=0#QM4$QM4$QM4$QM4$Q]4%Q]4$Q]4$QM4$QM4$QM4$Q]4$QM4$QM4$QM4$QM4$" + "QM4$QM4$QM4$QM4$QM4$QM4$QM4$QM0#Q=0#QM0#Q=0#Q=,\"Q=0#Q=,\"Q-,\"Q=0#" + "Q=,\"Q-,\"Q=,\"Q-,\"Q-(!Q-(!Q-(!P]#`P]#`P]#`PL__BIC)R=4!Y/(BWNPL;" + "W>L;W>L;W.L;W.H:W.H:W.H:V^D9W.H:W.H:W.H:W.H:V^D9V^D9V^D9V^D9V^D9" + "V^D9V^D9V^D9V^D9V^D9V^D9VN<7UN(3OJ#9Y%6!_5V/_E6(^U.$^E6&^5.$^F\"1" + "]5:([EV+Q)*YN<#LR=4$TM\\/UN04V.86V><7V><7VN@8VN@7V><7V><7V><7V><6" + "V.86U^45U.(2S=L*@XZ^)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+CIKKKOKZODI[/LK[/LK[/LJ" + "[/LJ[/LK[/LJ[/LKZ_HJZ_HJZ_HJZ_HJ[/LJ[/LK[/LK[/LKY_4EW^X=V><7V.85" + "V.85U^44U^44U^44UN03UN03UN03UN03V.<6X>`?Z/<4W.H9W>L;X.X=X>\\?" + "X_(AY_8FWNP>U>,2U^44V.86V><7V><7VN@8W.H:W.L;V^L;V^L;V^H;P],#K;KH" + "L+[LK[WKK[SJI;+AF*;4EJ/1J+3BML+QN<;UN<;UML3RM,'PL+WKH*S<LPW^T>X.X>X.X?X.X>X.X>X.X>X.X>V^H;AI7'LK[LQM0#Q=0#" + "Q=0#Q=0#QM0$QM4$QM4$QM4$Q]4$QM4$QM4$QM4$QM4$QM4$QM4$QM0#QM0$QM0#" + "Q=0#QM0$QM0$Q=0#QM0#QM0#QM0#Q=0#Q=0#Q=0#Q=,#Q=,#Q=,#Q=,#Q=,#Q=,#" + "Q-,\"Q-(\"Q-(!Q-(!Q-(!P]#`P]#`P]#`P]#`P]#`K+OLE9_+Y_4EW^T=W>PL;" + "W>L;W>L;W.L;W.H:W.H:W.H:V^D9W.H:W.H:W.H:V^D9V^D9V^D9V^D9V^D9V^D9" + "V^D9V^D9V^D9V^D9V^D9VN@8VN@8V.45U-X/MHW\"W%F'\\V\"0]U6']5&#\\U\"%\\%*'" + "YUZ-QHFPL[3?P<7V><7VN@7V><7V><7V><7V><7V.86" + "V.86U^45U.(1S=L*CIK))S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D,3UNM\\7UZ_HJ[/LJ[/LK[/LK[/LK" + "[/LJ[/LJ[/LK[/LJZODHZODIZ_HJZ_HJ[/LJ[/LJYO0DW.H9V.85V.85V.85U^44" + "U^44V.85U^44U^44UN03UN03UN03UN03U>,2U>,2VN@7Y/,BY?,BZ/8E[?PK[?PK" + "[?PL[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LKZODHA)*`J+3?YO0C[?PK" + "[/LK[/LJ[/LJ[/LK[/LJ[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HJ" + "[/LJ[/LJ[/LJ[/LJ[/LJZ_HJZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZODHZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZ?H9A(ZY6V>5S-L+Y?,BY/,BY/,BY/,BY/,BY/(A" + "Y/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/(AY/,BY/(AY/(AY/(AY/(AY/,B" + "Y/,BY/,BY/(BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BX_$@" + "W^PL:W^T=X>\\?" + "X_$AYO4EY_,2UN03U^44U^45V.86V><7VND9VNH:VNH:VND9VND:Q]8'" + "J;;EJ;?EJ[GGJ;?EI;+@G:K9EZ32DY_-E*#.E:'/DI_-BI?&=H*Q5%^--#]L;':?" + "HZ_LLW^X>X.X>X.X>X.X>X.X>W^T=SMX0>H:TO82SV^@6X>\\@WNPL;W>L;" + "W.L;W.H:W.H:W.H:W.H:V^H:V^D9W.H:V^H:V^D9V^D9V^D9V^D9V^D9V^D9V^D9" + "V^D9V^D9VN@8V^D9V^D9V^D9VN@8V><7U^45U=X0NZ_ANFJ8SEJ(UUJ'TEN(QW\"6" + "M9C!M+?DP,KXRM<&T=\\.U>,2U^45V><6V><7V><7V><7V><7V><7V><7V><7V.86" + "V.86U^45U.(1S=L*F:75)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D.$5VP,W^Z_HI[/LJ[/LJ[/LJ[/LK[/LK" + "[/LJ[/LJ[/LJZODHZ?@GZ?@HZODIZ_HJZ?@HWNP;U^44U>,2U^44V><6U^44V.85" + "V.85V.85V.85U^44U^44U^44UN03UN03UN03U>,2U>,2U.(1X>\\>Y_4D[?PK[?PK" + "[?PL[?PK[?PK[/LK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LJM\\7UCIK%U^43[?PK" + "[?PK[?PK[/LK[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZODHZ_HIZ_HIZ_HIZ_HIZODHZ_HIZODHZODHZODHZ?@GZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZ?@GZODHZ?@HZ?@GZODHZODHZ?@GZ?@GZ?@HZ?@HZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/" + "XN`@YO4EZODIW>T>T=\\.T^$0U.(1U>,3UN04U^44U^45V><7V>@8V>@8V>@8VND9" + "T=`0KKSKG*G7GJO9G:K8G*C7F*33D9[,BY?&A)\"^=H*P7VN91U)_3UF$BY7!J[CF" + "L\\#OML3SN<;VN,7TL<#OJ;;DOLO[QM0$S-H*S]T-T^$1U>,3UN45V.<7VND9VNH:" + "V^L;WNPX.X>X.X>X.X>X.X>X.X>W^T>NLK]@HVZP<[]" + "Q=0#Q=0#Q-,\"Q=,#Q-,\"Q=0#Q=,#Q=0#QM0$Q=0#Q=0#Q=0#Q=0#Q=0#Q=0#Q=0#" + "Q=0#Q=0#Q=,#Q=,#Q=0#Q=,\"Q=0#Q=,\"Q=,\"Q=,\"Q=,#Q=,\"Q=,\"Q-(\"Q-,\"Q-(!" + "Q-(!Q-(!P]#`P]#`P]#`P]#`Q-(!P]#`P,[^A9/$P,OXY?0DWNPL;W.L;W.L;" + "W.H:W.H:W.H:V^H:W.H:V^H:W.H:V^D9V^D9V^D9V^D9V^D9VN@8V^D9V^D9V^D9" + "V^D9V^D9VN@8VN@8V^D9VN@8VN@8V><7V>86U^04UN,3TMP,PL3TM;/ANK?AO,#M" + "O\\CWQM'`S=D(T=\\.U.(1U^44V.85V.86V><7V><7V><7V><7V><7V><7V><7V><6" + "V.86U^45T^$1S=L*I+#?)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D04Y^Q]8%[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJZ_HJZ/8FZ/<6UN03TM`/UN03T^$0U>,2T-X-TM`/" + "U.(1UN03U^44V.85U^44U^44UN03UN03U>,2U>,2U.(1R=<&T]`.Y?0B[?PK[?PK" + "[?PL[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LJW^X>?(JTP,WZZODH" + "[?PK[/LJ[/LK[/LJ[/LJ[?PK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ?@GZODHZODH" + "ZODHZODHZODHZ?@GZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/BD)S'K;KGM,'QML3S" + "N<;VNL?WN,7UL\\'PI;/CM04U^45V.<7VN@9VNH:" + "V^H;W>LPX.X>X.X>W^T>W^T>W^T>WNT>J;CLC)?#" + "PL_^Q-,#Q=,#Q-,\"Q=,#Q-,\"Q=,\"Q-,\"Q=,#Q=,#Q=0#Q=0#Q-,\"Q=,#Q=,#Q-,\"" + "Q=,\"Q=,#Q-,\"Q-,\"Q=,#Q-,\"Q=,\"Q=,\"Q=,\"Q=,\"Q-,\"Q-(\"Q-(\"Q-(\"Q-(\"Q-(!" + "Q-(!P]$!P]#`P]#`P]#`P]#`P]#`P<__EZ78H:O7YO4EW^T=W>L;W>L;W.L;W.L;" + "W>L;W.H:W.H:V^H:V^D9V^H:W.H:V^D9V^D9V^D9V^D9V^D9VN@8V^D9V^D9V^D9" + "V^D9V^D9V^D9V^D9V^D9VN@8VN@8VN@8V><7V.86U^45U^44U.$1IK'APLKTS]P," + "S]P,T=\\.T^$0U>,2U^44V.85V><6V><6V><7V><7V><7V><7V><7V><7V.86V.86" + "V.85U^44T^$1S=L*J[CH)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D2E>(SMT,Z_HJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LK[/LJ" + "[/LJ[/LJZ?@HY?,CYO4DY_8EY?,CV.85UN03U.(1U^44TM`/V.85U.(1T^$0U.(1" + "U.(1T^$0TM`/T^$0UN03U^44UN03UN03U>,2U.(1U.(1P]#`OL;W^T=" + "X>\\?Y/,CY_8FY_8GX>`ASMT-S=L+S]T-T-X.T=\\/T=\\/TM`0T^$1UN04UN04V.86" + "V.87V.86UN04UN04TM`0QM0#M\\7TK[OIL;WJM,#NN<7SO,KYO,GYN\\CXN\\CXO@8VND9VNH:" + "W.L;W>LPX.X>X.X>W^T>W^T>W^T>X.X>W^T>W>P=GJW@" + "CIG%P<[]Q-,\"Q-(\"Q-(\"Q-,\"Q-(\"Q-(\"Q=,\"Q-,\"Q=,\"Q=,\"Q-,\"Q-,\"Q-(\"Q-,\"" + "Q-,\"Q-,\"Q-(!Q-,\"Q=,\"Q-,\"Q-(\"Q-,\"Q-(\"Q-(\"Q-(\"Q-(\"Q-(\"Q-(\"P]$!Q-(!" + "P]#`P]#`P]#`P]#`P]#`P]#`PL__H*[@C);\"X_(AX.X>W>L;W.L;W>L;W.L;W.H:" + "W.H:W.H:W.H:V^H:V^D9V^D9V^D9V^D9V^D9V^D9V^D9V^D9V^D9V^@9VN@8VN@8" + "VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V.86V.85U.(2CIG'W.D7U^45" + "UN03U^44U^44V.85V.86V><6V><6V><7V><7V><7V><7V><7V.86V><6V.86V.86" + "V.86UN04T^$0S-H)M<+Q)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D5F*3T^(1Z_HJ[/LJ[/LJ[/LJ[/LK[/LK[/LK[/LK[/LJ" + "[/LJ[/LJYO4DX_$@Y/(AY/,BV.86U^44UN03U^44U^44UN03U>,3U^44U.(1U.(1" + "UN03TM`/U.(2UN03T-X-T=\\/T^$0U>,2U.(1U.(1T^$0M\\3TO04CIO'R-<#" + "Z_DH[?PK[/LK[/LJ[/LJ[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJZ_HI[/LJ[/LJZ_LJ[/LJ[/LJZ_HJ[/LJZ_HIZ_HIZODHZ_HIZ_HIZ_HIZODH" + "ZODHZ_HIZ_HIZ_HIZ_HIZ_HIZODHZODHZ_HIZ_HIZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "Z?@GZODHZ?@GZODHZ?@GZODHZODHZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/:WBFN,?WY?,BY/(AY/(AY/(AY/,BY/(AY/,B" + "Y/,BY/(AY/(AY/(AY/,BY/(AX_(AY/(AY/(AY/(AY/(AY/,BY/(AY/,BY/,BY/(A" + "Y/,BY/,BY/(AY/,BY/,BY/(AY/,BY/,BY/,BY/,BY/,BXO$@WNP:U^03S]P*Q]0\"" + "Q='`Q='`QM+`QM'`Q='`QM,!QM,!QM,!QM,!QM,!QM,!QM,!QM,!QM,!QM,!QM,!" + "QM,!QM,!QM,!QM,!QM,!M,'P)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D@I#$S]P)V^D8W.H9W.H:WNP<" + "X.X>X_(BYO4EY_8FY/(CW.P=RMD)R]D(S=L*SMP+S]T-S]T-T-X-T=\\/T^$1U>,3" + "U>04U>,3T^$1TM`0T-X.S]T-S=L+R]D)R=<&Q=,#P]#`P<[_P,W^P,W]O\\S\\N\\CX" + "M<+QLL#OI[;FIK3CN\\GYQ-(\"R=<'SMP,T-X.T^$1U>,3U^46V.<7VN@9VND9V^H:" + "W.L;W>LPX.X>W^T>W^T>W^T>X.X>X.X>W^T>W^T>W.L<" + "G:O>B)2`O\\S\\Q-(\"Q-,\"Q-(\"Q-(\"Q-(\"Q-(\"Q-(!Q-(\"Q-(\"Q-,\"Q-,\"Q-(\"Q-(\"" + "Q-(\"Q-(\"Q-(!Q-(\"Q-,\"Q-(\"Q-(!Q-,\"Q-(\"Q-(!Q-(!P](!P]$!P](!P]#`P]#`" + "P]#`P]#`PL_`PL_`P]#`P<__GZ[@@XVYX.X=X.\\?W>L;W>L;W>L;W.L;W.L;W.H:" + "W.H:W.H:V^D9V^D9V^D9V^D9V^D9W.H:V^D9V^D9VN@8V^D9V^D9VN@8VN@8V^@9" + "VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V.86Q]8'J;/@Y/(BV><7" + "V><6V><6V><6V><6V><6V><7V><7V><7V><7V><7V><7V><7V><7V.86V.86V.86" + "U^45UN03T^$0S=L*O,2U.(1T^$0T=\\/H:S8WNL6[?PK[?PL[?PL" + "[?PL[?PL[?PL[?PK[?PK[?PK[?PK[?PK[?PL[?PL[?PK[?PK[/LKZODII+'@L+[J" + "W^X=[?PK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HI[/LJ[/LJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/84C)?#=(&PS]\\.Y?,BY/(AY/,BY/,BY/(AY/(AY/,B" + "Y/,BY/,BY/(AY/(AY/(AY/,BY/(AY/(AY/,BY/,BY/(AY/,BY/,BY/,BY/(AY/,B" + "Y/,BY/,BY/(AY/(AY/(AY/,BY/,BY/,BY/,BY/(AXN`?W>L:UN,2SMP*R-4\"Q='`" + "Q='`Q='`QM,!QM(!QM,!QM,!QM,!QM,!QM,!Q]0\"QM,!Q]0\"QM,!Q]0\"QM,!QM,!" + "QM,!QM,!QM,!QM,!QM,!LK[N)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D,3UN45U^86V>@8VND9V^D:W.L;" + "W.L;W>PX.X>W^T>W^T>W^T>W^T=W^T>W^T>W^T=W^T=" + "WNP=I;3G>X>SN<;UP](!Q-(\"Q-(\"P](!Q-(!P](!Q-(!Q-(!Q-(!P](!Q-(!Q-(\"" + "Q-(\"Q-(\"Q-(!Q-(!Q-(\"P](!Q-(!P](!P](!P]$!P]$!P]#`P](!P]$!P]#`P]#`" + "P]#`P]#`PL_`P]#`P,W^F*;9A(^ZX.X=X>\\?W>L;W>L;W>L;W.H:W.H:W.H;W.H:" + "W.H:W.H:W.H:V^D9V^D9V^D9V^D9V^D9V^D9VN@8VN@8VN@8VN@8V^D9VN@8VN@8" + "VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V.86M,'SQM+_X>\\@V><7" + "V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><6V.86V.86V.86V.85" + "U^44U>,2TM`/S-H)Q='`)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D:G>GW.L:Z_HJ[/LK[/LK[/LK[/LJ[/LJ[/LK[/LK[/LJ[?PK[/LJ" + "[/LJ[/LKW.H:V><6U.(1UN03UN04UN04U^44U^44U^44U^44U^44UN04UN04UN04" + "U^44UN03T^$0U.(1T=\\/TM`/U>,2U.(1T^$0T^$0P]#`O\\OU[/LJ[?PK[?PL[?PK" + "[?PL[?PK[?PL[?PL[?PK[?PL[?PK[?PL[?PK[?PK[?PK[?PK[?PK[/LJV.86F:;2" + "R=<$Z?@G[?PK[/LK[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJZ_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZODHZODHZ_HIZ_HIZODHZODHZ_HIZ_HIZODHZ_HIZODHZ_HI" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZ?@HZ?@HZ?@GZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/`@Y/,BY/(AY/,BY/,BY/(AY/(AY_4D" + "Y?0CX_(AY/(AY/(AY/,BY/(AY/(AY/(AY/(AY/(AY/(AY/,BY/,BY/(AY/(AY/,B" + "Y/,BY/,BY/,BY/(AY/(AY/,BY/,BY/,BY/(AXN`?W>H9UN02SML)Q]0\"Q='`Q='`" + "Q='`Q='`Q='`QM,!QM,!QM,!QM,!QM,!QM,!Q]0\"QM,!QM,!Q]0\"QM,!Q],\"QM,!" + "Q]0\"QM,!QM,!QM,!P\\_^KKKH)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D6VFL;" + "W^T=XN`@Y/,CY_8GY/(CXO$AX>`@V>D:Q]8&QM0#Q]4$Q]4%R-8&R-8&R-8&R-8&" + "R=<'R]D(S-H*S=L+S=L+S=L+S-H*RM@(R-8&Q=,#PL_`OLO[N,7UL\\'PL;[MK[WL" + "H+#@I;/ANPW^T>W^T>W^T>W^T>W^T=W^T=W^T>W^T>" + "X.X>W^T>M\\7X<'NJK+CFPM#`Q-(\"P](!Q-(!P]$!P]$!P]$!P]#`P]$!P](!P]#`" + "P]$!P]$!P]$!P]$!Q-(\"P](!P]$!P]$!P]$!P]#`P]$!P]#`P]#`P]#`PL_`PM#`" + "P]#`PL_`P<[_N\\GZ@Y'#E9_,XN`?X>\\?W>L;W>L;W>L;W.H:W.H:W.H:W.H:W.H:" + "W.H:V^D9V^D9V^D9V^D9V^D9V^D9V^D9VN@8V^D9VN@8VN@8VN@8VN@8VN@8VN@8" + "VN@8VN@8V><7VN@8VN@8VN<8VN@8V><7V><7V><7V><7U^45H*S=W>H9W.H;V><7" + "V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86V.86V.86V.86V.85" + "U^44U>,3TM`/S-H)R=8%,CYO)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D<'VMW^X=[/LJ[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK" + "[?PK[/LJV.86S-H)O,CVU>,2UN03UN03UN03UN03UN04UN03UN03UN03UN03UN04" + "UN04UN04UN04UN03T=\\.U>,2U.(1U.(1T^$0S-H)M\\/LZODG[?PK[?PL[?PL[?PL" + "[?PL[?PK[?PK[?PK[?PK[?PK[/LK[?PK[?PK[?PK[?PK[?PK[?PK[?PKZ_HILK_M" + "L[_MW.H8[/LJ[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJZ_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HIZ_HIZ_HI" + "Z_HIZ_HI[/LJZ_HIZODHZODHZODHZ_HIZ_HIZODHZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@HZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/L:" + "WNP\\?Y/(BYO4EY/(DX_$BXN`@X>\\@VND;R=<(PL__Q-(!Q-(!Q=,\"Q-(!Q-(\"" + "Q-(!Q-(!P]#`P]#`PL_`PL__P,3U^45V.<7V>@8V^D:W.H:W.H;W.L;" + "W.L;W>PPW^T=W^T>W^T=W^T>WNT=W^T=W^T=W^T=W^T=" + "W^T>W^T>W^T=RMH+>H>XCYK(N\\GXP]$!P](!P](!P]$!P]$!P]$!P]$!P]$!P]$!" + "P]#`P]$!P]#`PL_`P]$!P]#`P]#`P]$!P]$!P]#`P]#`P]#`PM#`PM#`PL_`PL_`" + "PL__P,W^J;CJ:':FL;SIY?,CX.X>W>L;W>L;W>L;W.H:W.H:W.H:V^H:W.H:W.H:" + "V^H:V^D9V^D9V^D9V^D9VN@8V^D9V^D9V^D9VN@8VN@8VN@8VN@8VN@8VN@8VN@8" + "VN@8VN@8VN@8V><7VN@8V><7V><7V><7V><7V><7V.86S-H+HZ[<7" + "V><7V><7V><7V><7V><7V><7V><6V><7V><7V><7V><6V.86V.86V.86V.86V.86" + "U^45U>,3TM`/S-H)RM<&2%2$)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D;WNLX.X=[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LK[/LJ[/LK[/LK[/LK[/LK[?PK" + "[/LK[/LKVND9L+WNJ+3>U.(2U>,2U>,2U>,2U>,2U>,2U>,2UN03UN03UN03UN04" + "UN04UN03UN04UN03U>,3U>,2U>,2U.(1R]H)N<3OY_4C[?PK[?PK[?PK[?PL[?PK" + "[?PK[?PK[/LK[?PK[?PK[/LK[?PK[?PK[/LK[?PK[?PK[?PK[?PK[?PK[/LJX>`?" + "H*[:Q-'_Y_4D[/LK[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "Z_HJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HIZ_HI" + "Z_HIZ_HI[/LJZ_HIZODHZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZ_HIZODHZ_HIZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZ?@GZODHZODHZODHZODHZ?@HZ?@GZ?@HZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>W.D8U>,1S=H(QM,!Q='`Q='`Q='`Q='`" + "QM,!QM,!QM,!QM,!QM,!Q]0\"QM,!Q]0\"Q]0\"QM,!QM,!QM,!Q]0\"Q]0\"Q]0\"QM,!" + "QM,!Q=,!N\\;TLKWJR=8#O,CW)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C9GO\\S\\V><5VN@7W.H9W.H:" + "WNP;X.X>X_(BY?0DY/,DX_$BXN`AXN`AX.X?V^H:T-\\/PL_`O\\S\\P<[^P<[^P,W^" + "P,3U^45V.<7V>@8VND9V^D:V^H:W.L;W>L;" + "W>PW^T>W^T>W^T=WNT=W^T=W^T=WNT=W^T=" + "W^T=W^T=W^T=W^T=VND:I;/F;'>EH*S:OLO[P]#`P]$!P]$!P]$!P]$!P]#`P]#`" + "P]#`P]#`P]#`PM#`P]#`P]#`PM#`P]#`P]#`P]#`PM#`PM#`PL_`PL_`PL_`P<[_" + "M<+T@)#!>(.PT-X+Y/,CW^T=W>L;W>L;W>L;W.L;W.H:W.H:W.H:V^H:V^D9V^H:" + "V^D9V^D9V^D9V^D9V^D9V^D9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN<8" + "VN@8VN@8V><7V><7VN@8VN@8V><7V><7V><7V><7V.86M,'SPL[\\X_$BV><7V><7" + "V><7V><7V><6V><7V><7V.86V><6V.86V><7V.86V.86V.86V.86V.86V.86U^45" + "U^45U.(2T=\\/S-H)R=<%6F:5)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ";7FJW^X=Z_HI[/LJ[/LK[/LK[/LK[/LJ[/LJ[/LK[/LK[/LK[/LK[/LK[?PK[?PK" + "[?PK[?PKZ/,2U>,2U>,2U>,2UN03UN03UN04" + "UN04UN04UN04UN04UN03U>,3T^$1Q=,\"OY/(AY/(AY/(AY/(AY/,BY/(AX_$@W>L:" + "V.85VN@6W.H9Y/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(A" + "Y/,BY/,BY/,BY/,BY/,BX_(AX.X=VN@7U.(1S-D'QM,!Q-#_Q='`Q='`QM,!QM,!" + "QM,!Q='`QM,!Q]0\"QM,!Q],\"Q]0\"Q],!QM,!QM,!QM,!QM,!Q]0\"Q]0\"Q]0\"Q]0\"" + "Q='`M\\+ON,3QR]@%R-4\"OL;W^T=XN`@Y?,DY?,DXO$BXN`AXN`AXN`AW^X>W>LD9VND9V^H:V^H;V^H;W.L;W>L<" + "W>LW^T>W^T=W^T=WNP=W^T=WNT=W^T=WNT=" + "W^T=W^T=W^T=W^T=W^T=W^T>T-X/DJ#1;WJHGJK8N\\CWPL__PL_`P]$!P]$!P]#`" + "PM#`P]#`P]#`P]#`PM#`P]#`P]#`P]#`P]#`PL_`P]#`PM#`PL_`O\\W]L<#QAI3&" + "97\"=ML'OXO$@X>\\?W>L;W>L;W>L;W>L;W.L;W.H:W.H:V^D9W.H:W.H:V^D9V^D9" + "V^D9V^D9V^D9VND9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7VN@8VN@8VN@8" + "V><7VN@8V><7V><7V.86V><7V><7V>87V><7V><7U>,3GJK:W>L9W>L;V.86V><7" + "V><6V><6V.86V><6V.86V><6V.86V.86V.86V.86V.86V.86V.86V.86V.86V.85" + "UN04U.(2T=\\.R]D(R=8%97\"@)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D9'\"A" + "W>P;Z_HI[/LJ[?PK[/LJ[/LJ[/LK[/LK[?PK[/LK[/LK[?PK[?PK[?PK[?PK[/LK" + "[?PK[?PK[/LJRMH+AI&XR=<%U.(1U.(1U.(1U.(1U>,2U.(2U.(1U>,2U>,3UN03" + "UN04UN04UN04UN03U.(2SMP+NL;SRM<#Z_DH[?PK[?PK[?PL[?PL[?PL[?PK[?PK" + "[?PK[?PK[?PK[?PK[/LK[/LK[/LK[?PK[/LK[/LK[/LK[?PK[/LK[/LK[/LK[/LJ" + "Z?@HLK_NO,GWWNP;[/LJ[/LK[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HI" + "Z_HIZ_HIZODHZODHZODHZODHZODHZ_HIZ_HIZ_HIZ_HIZODHZ_HIZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZODHZ?@HZ?@HZODHZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ/L:WNP\\?Y/(BY?0EX_$BXN`AXN`AXN\\@X>\\@X.X?WNP=V^D:UN45S=P,P](!" + "O,KZM\\7TM<+RL\\'QLK_OL+[NKKOJJ[GGJ;?GJ[CHL+[NN\\CXPL_`Q]4%R]D)S=L," + "S]X.TM`0T^$1U.,3U.04UN45U^86U^87U^<7V.<8V>D9V^D:W.L;V^L;W>PP<" + "W>PPWNP=WNP=WNT=W^T=WNT=WNP=WNP=" + "W^T=WNT=W^T=W^T=WNT=W^T=W^T=W^T=SMT-FJC9:W>FBI7$J;7DN\\CXP<[^PL__" + "PL_`PM#`PL__PL_`PM#`PL_`PL_`PL_`PL__PL__O\\W]ML3UG*G;L;W>L;W>L;W>L;W.H:W.L;W.H:W.H:V^D9V^D9V^D9V^D9V^D9" + "V^D9V^D9V^D9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V><7V><7" + "VN@8V><7V><7V><7V><7V><7V><7V><7V.86V.86QM0%I[+?YO0DVN@8V><6V.86" + "V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86U^45" + "UN04U.(2T-X.R]D(R-4$<'RL)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-T-TT-X-" + "ZODH[/LJ[?PK[?PK[/LK[/LK[/LK[/LK[/LK[/LK[?PK[?PK[?PL[?PL[?PK[?PL" + "[?PK[?PK[?PK[/LKQ=0\"L+[LRM@&T^(0U.(1U>,2U.(2U>,2U>,2U>,2U>,3UN03" + "U>,3UN03UN04SMP+OLKYOLKVW^T:[/LK[?PK[?PL[?PL[?PL[?PL[?PK[?PK[?PK" + "[?PK[?PK[?PK[?PK[?PK[/LK[?PK[?PK[?PK[?PK[?PK[/LK[?PK[?PK[?PK[?PK" + "[/LJX>`?K+KGQ]4#Y?,B[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HJ" + "Y/,BY_8EZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZ_HIZ_HI" + "ZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZ?@GZ?@GZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>S-@$?XFU4U^.T^,2Y/,BY/(AY/(AY/(AY/(AY/(AY/(AY/,BY/,B" + "Y/(AY/(AY/(AY/,BY/,BY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/,BY/(AY/,BY/,B" + "Y/,BY/,BY/(AX_$@X.X=VN@7TM`/RM@&Q='`Q=#_QM'`Q='`Q='`QM,!QM,!QM,!" + "QM,!Q]0\"Q]0\"Q]0\"Q]0\"QM,!Q]0\"Q]0\"Q]0\"QM,!Q]0\"Q]0\"QM,!QM0!PLW[L+OH" + "Q='_RM<$Q]0\"Q]0!R-4#M\\/R)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DE:+6T-T*V><6VN@8W.H9" + "W>L:WNP;X.X>X_$AY?0EX_(CXN`AXN`AX>\\@XN`AX>\\@X>\\@W^X?W>P=VND9U^87" + "T^(3S]T.R]D*QM4%P](\"P<_`P<_`P<_`P](\"M,4T^,4S-L,M\\3WH:_AD)W.B97&BY?'EZ/2NL7SWNPPPPPW^T=WNP=WNP=WNP=WNT=WNP=WNP=WNP=WNP=" + "WNP=WNP=WNP=WNP=W^T=W^T=W^T=W^T=W^T=W^X>V>@8NL?YD9[/;WRJ?8FVDI[-" + "H:[=K+GHL\\#PM\\3TN,7UML/SL;[NJ+7EFZG8B)7%;'FH9G&?F*32R-4#XO$@XN`@" + "W^T=W>L;W>L;W>L;W.L;W.L;W.H:W.H:W.H:W.H:V^D9V^D9V^D9V^D9V^D9VN@8" + "V^D9VN@8V^D9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V><7VN@8V><7" + "V><7V><7VN<8V><7V><7V><7V><7V><7V.86UN04J;;GS-@&X>\\@V><6V><6V.86" + "V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.85U^45" + "UN04T^$1S]T-R]D(Q]4#?(>W)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D?(BYX>\\>" + "Z/,3" + "T-X.R-4$NL?UP]#^W.H8[/LJ[?PL[?PL[?PL[?PK[?PL[?PK[?PK[?PL[?PK[?PK" + "[?PK[/LK[?PK[/LK[?PK[?PK[/LJ[?PK[?PK[?PK[?PK[?PK[/LK[?PK[?PK[?PK" + "[/LJ[/LJU.(1L\\'OSMP+Z/H8Z?@GZ?@GZODHZ_HIZODHZODHZODHZODHZODHZ_HIZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZ?@GZODHZODHZODHZ?@HZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?<6TM\\.RM<%Q='`Q-#_Q-#_Q='`Q='`QM,!QM,!QM,!QM,!" + "Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"QM,!Q='`O<6VN@7V^D8" + "W.H:W>L;W^T=XN`@Y?0DY/(CXN`AXN`AXN`AX>\\@X>\\@XN`AX>\\@X.X?WNP=W>L<" + "V^D:V><8U^46U.04T^(2TM`1T=\\0T=\\0T=\\0RMD+HK'AN<;UU>04U.,3U>04U.04" + "U>,4TN$2ML7Y@8_#1U2&+#9F)C)B+#AG,S]O,SYM;WFFLK[LWNP;W>PPP<" + "W>PPX>\\?W.L;S-L+M\\7V" + "H['BDI_/A)\"`>8:U82RD)W+I;'AO,GXT^$0XN`@XN`AW^X>W>PP<" + "W>L;W>L;W.L;W.H:W.H:W.H:V^H:W.H:V^H:V^D9V^D9V^D9V^D9V^D9VND9VN@8" + "VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V><7V><7V><7VN<8VN@8" + "V><7V><7V><7V><7V><7V.86V><7V.86V.86S]X.F*32X_$@V^D9V.86V><6V.86" + "V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.85V.86U^45V.85U^45U^44" + "U>,3T^$1S]T-RM@'QM,\"AI&`)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DDI[/W.D8" + "Y/(AYO4DZ/P;S=P+P]#`P,W]P<[]P<[]O\\S\\O,1ZODH[/LK[/LK[?PK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJX_$@" + "U>,2UN03U.$0UN,1YO4CZ?@GZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZODHZ?@GZ?@HZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>Q]+`@8RY7&B6T^(1Y/(AX_(AY/(AY/(AY/(AY/(AY/(AY/,BY/(AY/(A" + "Y/(AY/(AY/(AY/(AY/(AY/,BY/(AY/(AY/(AY/,BY/(AY/,BY/,BY/,BY/,BY/,B" + "Y/(AX_$@WNP;V><6T=\\-R=<$Q='`Q-#_Q='`Q-#_Q='`Q='`QM,!QM,!QM,!QM,!" + "Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"QM0\"Q='`Q='_N,/PML/PS-D&R=8#" + "R-4\"R-4\"R-4\"R-4\"R=8#J;;E)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D:WFLR=8#V><6VN@7V^D8" + "W.H9W>L:W^T\\@X>\\@X>\\@X>\\@X>\\@XN`AX>\\@X>\\@X.X?" + "WNP=W>L@8V.<7V.87V.87U^87UN05O\\[`M\\3UT^$0U^87U^86U>05" + "O,O_PPP<" + "W>PPP" + "X.\\?XN`@XN`@XN`@XN`@XN`@XO$AXN`AX>\\@X.X?WNP=W>L;W>PPPL;" + "W.L;W.L;W.H:W.H:W.H:W.H:W.H:V^D9W.H:V^D9VN@8V^D9V^D9V^D9VN@8VN@8" + "VN@8VN@8VN@8VN@8V><7V><7VN@8V><7V><7V><7V><7V><7V><7V><7V><7V><7" + "V><7V><7V><7V><7V><7V.86V.86V.86U^45M,'SNL7SY/,CV><7V.86V.86V.86" + "V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86U^45V.85U^45UN04" + "U>,3TM`0S]T,RM@'Q=(!BY;$)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DG*C9T=\\." + "VN@7W^T,2U>,2U.$/X.XH:_@Y/,BY/(AY/(AY/(AY/(AY/,BY/(AY/(AY/(AY/(AY/(A" + "Y/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AX_(AY/(AY/,BY/,BY/,BY/,BX_$@X_(A" + "XN`?WNP;V.44T-X,R=8$Q='`Q-#_Q='`QM,!Q='`Q='`QM,!QM,!QM,!QM0\"QM,!" + "Q]0\"Q]0\"Q]0\"Q]0\"Q]4#Q]0\"Q]0\"Q]0\"Q]0\"QM,!Q-#_L[[KO,GWS=H(R-4\"R-4\"" + "R-4\"R-4\"R-4\"R-4#R=8#IK+B)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D0$U_QM,\"V.85V><6V^D8" + "W.H9W>L:WNP\\?X_(BY/,DXN`AX>\\@X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@" + "X.X?W^T>WNT=WNP=W>LL@9TN(3OQ=#_VNH:W.L;W>P<" + "W>PP<" + "WNPPPPPPP<7V><7VN@8V><7V><7V><7V><7V><7V><7V><7V><7V><7" + "V><7V><7V><7V><7V><7V.86V.86U^45TN$1EJ/3WNP:W>L;V><6V.86V.86V.86" + "V.86V.86V.86U^45V.86V.86V.86V.86V.86V.85V.86V.86U^45V.45U^44UN04" + "U>,2TM`0SMP+R=<&P]#`D)S*)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DI+'AS=L*" + "TM`/U.(1U^85W.H9W^X=X_$@Y?0CY_8FZ?@GZ_HI[/LK[?PK[?PL[OTL[OTM[OTL" + "[OTM[OTL[OTL[?PL[OTL[OTM[OTM[OTM[?PL[OTL[?PL[OTL[?PL[?PL[?PL[?PL" + "[?PL[OTL[?PL[?PL[?PL[?PL[?PL[?PL[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LJ" + "[?PK[?PK[?PK[/LK[/LK[?PK[?PK[/LK[?PK[/LK[?PK[/LK[/LK[?PK[?PK[/LK" + "[/LK[/LJ[/LJ[/LJY_8EO,KXP]'_W>L:Z_HI[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIUN03" + "UN03U>,3U>,2U>,2U>,2U.(1V><5YO4DZODHZODHZODHZODHZODHZ_HIZODHZODH" + "ZODHZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZ?@GZODHZODHZODHZ?@GZ?@GZ?@GZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/L9N<3Q>X:R<7ZLW.P;Y/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(A" + "Y/,BY/(AY/,BY/(AY/,BY/(AY/(AY/(AY/,BY/(AY/,BY/,BY/,BY/,BX_(AXN`?" + "W>L:U^03S]P+R-4#Q='`Q='`Q='`QM,!Q='`QM,!QM,!QM,!QM,!QM,!QM,!QM,!" + "Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"QM,!Q='`PLW[L;SIQ-'_S-D'R-4\"R-4\"R-4\"" + "R-4\"R-4\"R-4\"R-4#R=8#I+#?)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DM\\/SV.83VN@7VN@7" + "V^D9W.H:WNP;X.X=X_$AY/,CX>`@X.\\?X.X?X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@" + "X>\\@X>\\@X>\\?X.X?X.X>W^T>W^T=WNP=W.H;W.L;V^D:Q]8'P,W_U>,2VND9R=P0" + "-4-X?XNXL;[MQ=,!U>,3T=\\/R]D)QM4$Q=,#Q-(\"PL_`F:C:J+/?UN04V^D9W.L;" + "W>PW^T=W^T=W^T=W^T=W^T=WNPPP<" + "WNPPPPPPPPPPPPL;W>L;W>L;W.L;W.L;W.L;W.L;W.L;" + "W.L;W.H:W.H:V^H:V^H:V^H:V^D9V^D9VN@8VN@8V^D9VN@8VN@8VN@8VN@8VN@8" + "VN@8VN@8V><7V><7V><7V><7V><7V><7VN<8V><7V><7V><7V><7V><7V><7V><7" + "V><7V><7V.86V><7V><7V.86U^45U^45N<7V.86V.86V.86V.86" + "V.86V.86U^45U^45V.86V.86U^45U^45U^45U^45V.85V.86U^45U^44U^44UN04" + "U.(2TM`0S=L*R-8%PL__E:#0)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DK+CHS=L)" + "T-X-TM`/T^$0T^$0U>,2V.85W>L:X>\\>Y/(BYO4DZ?@GZODI[/LJ[?PK[OTL[OTM" + "[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTL[?PL[?PL[OTM[OTL" + "[OTL[OTL[OTL[?PL[?PK[OTL[?PL[?PL[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LK" + "[?PK[?PK[/LJ[?PK[?PK[?PK[/LK[?PK[?PK[?PK[?PK[/LK[?PK[?PK[?PK[?PK" + "[/LK[/LK[/LJ[/LJ[/LJY?0CN\\GWQ]0\"WNP;[/LJ[/LK[/LK[/LK[/LJ[/LK[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJX_(AU^44" + "UN03UN03U>,3U>,2U>,2U>,2U>,2U.(1WNT;Z?@GZODHZODHZODHZ_HIZODHZODH" + "Z_HIZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/X=" + "R-4\"CIG%9W.@P](!Y/,BY/(AY/(AY/,BY/(AY/(AY/,BY/(AY/(AY/(AY/(AY/(A" + "Y/,BY/(AY/(AY/(AY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BX_$@XN\\?W>H9" + "UN,2SML*Q]0\"Q=#_Q='`Q='`Q='`Q='`QM,!QM,!QM,!QM,!QM,!QM,!QM0\"QM,!" + "Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"Q],!QM,!QM,!OLGWL;SIRM<$R]@&R-4\"R-4\"R-4#R-4\"" + "R-4\"R-4\"R-4\"R-4#R=8$GZO:)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DHJ_@U>(.V><6VN@7" + "V^D8W.H9W>L;W^T`AX.X?X.X?X.X?X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@" + "X>\\@X>\\@XN`@X>\\@X>\\@X.X?W^T>W^T>WNP=WNP=W.H;UN46P](\"Q=,\"V^H:U>47" + "7V^G;GJGH*WPL<" + "W>LPPL;WNPLPPPPPPP<" + "W>PPPPL;W.L;W.L;W.L;W.L;V^L;V^H;W.L;V^L;V^H;" + "V^H:V^H:V^H:V^H:V^H:VND9V^D9V^D9V^D9V^D9VN@8VN@8VN@8VN@8VN@8VN@8" + "VN@8VN@8V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7" + "V><7V.86V.86V.86V.86V.86U^45TN$2E:+2VN<5W>L,3" + "U.(2T=\\.S=L*Q]4$PL[^FZ?6)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DL;[MS-H)" + "T-X-TM`/TM`/TM`/T^$0T^$0U>,2U^44VN@7WNP;XN`@Y?0CZ/P;U^44" + "U>,2UN03U>,3U>,2U>,2U>,2U>,2U>,2U>,2UN03X>\\>ZODHZODHZODHZ_HIZODH" + "ZODHZ_HIZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/Y/,BY/(AY/(AY/(AY/(AY/,BY/(AY/,BY/(AY/(AY/(AY/,BY/(A" + "Y/(AY/(AY/(AY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BX_$@X>X=V^D8U>(1" + "S=H)Q]0\"Q='`Q-#_Q='`Q='`Q='`Q=,!QM,!QM,!QM,!QM,!QM,!Q]0\"Q]0\"Q]0!" + "Q]0\"Q]0\"Q]0\"Q]0\"QM,!QM,!Q='_N,/QM<#NS=H'R]<%R-4\"R=8#R-4\"R-4\"R-4\"" + "R-4\"R-4#R-4\"R-4\"RM<$FZ?6)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DCIS/T=X)V><6VN@7" + "V^D8V^D9W>L:WNP\\@X>\\@" + "X>\\@X>\\@X>`AX>\\@XN`AX>\\@X.\\@X.X?W^T>WNT=WNP=W.LPT=W>P=W>LP<" + "W>LL;W>L;W.L;W>L;W.L;W>PLL;W>PL;W>PPL;W>L;W>P<" + "W>PL;W>LL;W>L;W.L;W.L;W.L;W.L;W.L;W.L;V^L;V^H;V^H:V^H:V^L;" + "V^H:V^H:VNH:V^H:V^D9VN@8V><7V^D9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8" + "VN@8V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86V>87V><7V><7" + "V><7V.86V.86V.86V.86U^45UN04N,;XK;?CYO0DVN@8V.86V.86V.86U^45U^45" + "U^45U^45U^45U^45U^45U^45U^45U^45U^45U^45U^45U^45U^45U^44UN04U>,3" + "T^$1T-X-S-H)QM0#P,2UN03V.85W.H9X.X=Y/(BYO4EZ?@H" + "ZODI[/LJ[?PK[OTM[OTL[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTM[OTL[OTL" + "[OTL[OTL[OTL[?PL[OTL[?PL[?PL[?PK[?PL[?PK[?PK[?PK[?PK[?PK[/LK[?PK" + "[/LK[/LK[?PK[/LK[?PK[?PK[?PK[/LK[?PK[?PK[?PK[?PK[?PK[/LK[?PK[/LK" + "[?PK[/LK[/LJ[?PK[/LJ[/LJ[/LJXO$@OLSZRM<&W^T<6UN04" + "UN03UN03UN03UN03U>,2UN03UN03U>,2U>,2U>,2UN03U^44XN`?ZODHZODHZODH" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZ?@GZ?@GZODHZODHZ?@HZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/X:SAI3\"X.\\>Y/(AY/(AY/(AY/(AY/(AY/,BY/,BY/,BY/,BY/(AY/(AY/(AY/(A" + "Y/(AY/,BY/,BY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BX_(AW^T<6V><6" + "VN@8V^D9W.H:WNP\\?XN`AXN`AX>\\@X.X?X.X?X.X?X>\\@X.\\?X.\\@X>\\@X>\\@" + "X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@X>\\@X>\\?X.X?W^T>WNP=WNP=V>@9R-<'Q-(\"V^H9" + "J+GO5V*/E:'1KKOKQM,\"R=<'P]$!PL_`PL_`PL_`PL_`O,K\\:W>HN\\;SU.,3V.<7" + "V>@8T^(3Q-,$KKOLDZ#/D9O(U.$/W^T=W^T=WNP=WNP=W>PPL;" + "W>L;W>PL;W>L;W>L;W>L;W>PL;W>L;W>PLL;W.L;W.L;W.L;W.L;W.L;V^L;V^L;W.L;V^H:V^H;V^L;V^H:V^H:" + "V^H:V^H:V^H:V^D9V^D9V><7VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8" + "VN<8V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86V.86V.86V.86V><7" + "V.86V.86V.86V.86V.86U^45T=`0DI[-VN@5W>P,2UN03U^44VN@7WNP;X>`?" + "Y?,CZ/L:Z_HI[/LK[/LK[/LK" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIY?0CV.85UN04" + "UN03UN03UN03UN03U>,2UN03UN03U>,2UN03UN03UN03U>,2U>,2U^44X>\\>Z?@G" + "ZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZODHZ?@GZ?@HZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/<5M<#LA(^[" + ">H:SU^85Y/,BY/(AY/(AY/(AY/(AY/(AX_$@Y?0CY?0CY/(AY/(AY/(AY/(AY/(A" + "Y/(AY/(AY/,BY/,BY/,BY/,BY/,BY/,BY?,BY/,BX_$@W^T<6TM\\.RM<%Q='`" + "Q-#_Q='`Q='`Q='`Q='`Q='`Q='`QM,!QM,!QM,!QM,!QM0!QM,!Q]0\"Q]0\"Q]0\"" + "Q]0\"Q]0\"Q]0\"Q='`PL[\\L;SIPL_]SML(R-4\"R-4\"R=8#R=8#R=8#R=8#R-4#R=8#" + "R-4#R-4#R-4\"R-4#RM<$F*33)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D3%N-R=8#V.85V><6" + "VN@7V^D8W.H9W>L;W^T=XN`@XN`AX>\\@X>\\@X.X?X.X?X.X?X.X?X.X?X.X?X.X?" + "X>\\@X>\\@X>\\@X>\\@X>\\@X.X?X.X?X.X?X.X?X.X>W^T>WNP=W.L;T=`1Q=0%T-X-" + "Q=8*45R-CYO*J[GHPPPL;W>L;W.L;" + "W>L;W.L;W.L;W.L;W.L;W>L;W.L;W.L;W.L;W.L;W.L;W.L;W.L;W.L;W.L;W.L;" + "V^L;W.L;W.H;W.L;W.L;W.L;V^H;V^H:V^H:V^H;V^H:V^H:V^H:V^H:VNH:V^H:" + "V^H:VND9V^D9V^D9VN@8V><7V^D9VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7VN@8" + "V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86V.86V.86V.86V.86V.86" + "V.86V.86U^45V.86U^45UN04L+[QLKWFY?,CV><7V.86V.86V.86V.86U^45U^45" + "U^45U^45U^44U^45U^44U^45UN04U^45U^45U^45UN04U^45U^45UN04U>,3U.(2" + "TM`0S]T,R]D(Q=,\"O\\S\\I;'?)S-D)S-D)S-D)S-D)S-D)S-D)S-D45V/O\\OZRM@&" + "S=L*T=\\.TM`/TM`/TM`/T^$0T^$0U.(1U.(1U.(1U.(1U>,2UN03UN03U^44V><6" + "V^D8WNP,2U>,2UN03UN03U>,2U>,2U>,2U.(1" + "W.H9Y_8EZODHZO@GZO@HZODHZODHZODHZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZ?@GZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@HZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/`=H.M" + "S=P,Y/,BY/(AY/(AY/(AY/(AY/(AY/(AY/(@Y_8EY?,BX>\\>X.T<6" + "VN@7VN@7V^D9W>L:W^T\\@X.X?X.X?X.X?X.X?X.X?X.X?X.X?" + "X.X?X.X?X.X?X.X?X.X?X.X?X.X?X.X?X.X?X.X?W^T>WNP=WNP=W.H;S=P-SMP," + "V.@997.HB)7#JKCGOPPPL;" + "W>LL;W.L;W.L;W.L;W.L;W.L;W.L;W.L;W.L;W.L;W.H;W.L;W.L;" + "V^L;V^H;V^H;V^H;V^H:V^H:V^H:V^H:V^H:V^H:V^H:V^H:V^H:VND:VNH:VND:" + "V^D:VND9VND9V^D9V^D9VN@8V^D9VN@8VN@8VN@8VN@8VN@8V><7V><7V><7V><7" + "V><7V><7V><7V><7V><7V><7V><7V>87V><7V.86V.86V.86V.86V.86V.86V.86" + "V.86V.86U^45U^45U^45R]H+D)S(W^P:W.L;V.86V.86V.86V.86U^45U^45U^45" + "U^45U^45U^44U^45U^44UN04UN04U^44U^45UN04UN04UN04UN04U>,3U>,3T^$1" + "T=\\/S]T,RM@'Q-(!O\\S[I[/A)S-D)S-D)S-D)S-D)S-D)S-D)S-D7&F:O\\OZR=<%" + "S=L*T-X-TM`/TM`/TM`/TM`/T^$0T^$0U.(1U.(1U.(1U>,2UN03U>,2UN03U^44" + "U^44V.85V><6W.H9X.\\>Y/(AYO4EZ?@GZODI[/LK[?PL[?PL[OTM[OTM[OTM[OTL" + "[OTM[OTL[?PL[OPL[?PL[?PL[?PL[?PL[?PL[?PL[?PK[?PK[?PK[?PK[?PK[?PK" + "[?PK[/LK[/LK[?PK[?PK[?PK[?PK[?LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK" + "[/LK[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJZ_HJZ/8FRM@'R-8$U^43Z/,2U>,2U>,2U>,2U>,2U>,2U>,2" + "U>,2U.(1V.85X>\\>Z?@GZODHZODHZ?@GZODHZODHZODHZODHZODHZODHZODHZODH" + "ZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/(2NQM4$" + "Y/,BY/(AY/(AY/(AY/(AY/,BY/(AX_(@X.X,1X_$AY/(AY/(A" + "Y/(AY/,BY/,BY/,BY/,BY/,BY/,BY/(AXN`?W>L:U^03S]P*Q]4\"Q='`Q-#_Q='`" + "Q='`Q='`Q='`QM,!QM(!QM,!QM,!QM,!QM,!Q]0\"QM,!Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"" + "QM,!Q-#_NL7SM<'NS=H'R]@&R-4\"R-4\"R=8#R-4\"R=8#R=8#R=8#R=8#R-4#R=8#" + "R-4\"R-4\"R-4#R-4\"RM<$@HZ^)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DJK;FU^43V.86" + "VN@7VN@8V^D8W.H:WNP;X>\\>X_$AX_$BX>`@X.X?X.X?X.X?X.X?X.X?X.X?X.X?" + "X.X?X.X?X.X?X.X?X.X?X.X?X.X?X.X?X.X?W^X>W^T>WNT>WNT=W>P=V>D9QM0#" + "W>PPL;W.L;" + "W.L;V^L;W.L;W.L;V^H:W.L;V^L;V^H:V^H;W.H:W.L;W.L;W.H;W.L;W.H;W.H;" + "W.L;V^H;V^H:V^H:V^L;V^D9V^H:V^H:VNH:V^H:V^H:V^H:V^H:VND9VND9VND9" + "VND9VND9V^D9V^D9VN@8VND9V^D9VN@8VN@8VN@8VN@8V><7V><7V><7V><7V><7" + "V><7V><7V><7V><7V><7V><7V><7V.86V.86V.86V.86V.86V.86V.86V.86V.86" + "V.86V.86U^45U^45U>,3GZW?PLWXXO$AV><7V.86U^45V.86U^45U^45U^45V.85" + "U^45U^45U^45UN04UN04UN04UN04UN04U^44UN04UN04UN04UN03U>,3U.(2T^$1" + "T=\\.SMP+RM@'Q-(!O\\S[J[?E)S-D)S-D)S-D)S-D)S-D)S-D)S-D:7:GOLOZR-8$" + "S-H)T-X-TM`/TM`/TM`/TM`/T^$0T^$0T^$0U.(1U.(1U>,2U>,2UN03UN03UN03" + "U^44U^44U^44V.85V><6V^D8WNP;X>`?Y?,CY_8EZ?@HZ_HI[/LK[?PL[OTM[OTM" + "[OTM[OTL[OTL[?PL[OTL[?PL[?PL[?PL[?PK[?PL[?PL[?PK[?PK[?PK[?PK[?PK" + "[/LK[/LK[?PK[/LK[/LK[?PK[?PK[?PK[/LK[/LK[/LK[/LK[/LK[/LJ[/LK[/LJ" + "[/LJ[/LK[/LJ[/LK[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LJZODHT-\\-Q]4#T^$/Y?0C" + "[/LJ[?PK[/LJ[/LK[/LK[/LK[/LK[/LJ[/LK[/LJ[?PK[/LJYO4DV.85U^44UN04" + "UN03UN03UN03UN03UN03UN03UN03UN03UN03U>,2U>,2U>,2U>,2U>,2U>,2U>,2" + "U>,2U>,2U>,2U.(0T^$0V^D7Y/(AZODHZ?@HZ?@GZODHZ?@GZODHZ?@GZ?@GZ?@H" + "ZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@HZ?@GZ?@HZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/(:PP](!Y/,B" + "Y/,BY/,BY/(AY/(AY/(AY/(AY/(AY/(AX_$@WNP:VN@6U^03W^T\\=V^D8U>(1S=L)Q]0!Q-#_Q-#_Q-#_Q='`" + "Q='`Q='`QM,!QM,!Q],!QM,!QM,!QM,!QM,!QM,!Q]0\"Q]0\"Q]0\"Q]0\"Q]0\"QM,!" + "Q=#_M<#NNL?TS]P)RM<$R-4\"R-4\"R-4\"R=8#R=8#R=8#R=8#R=8#R=8#R=8#R-4\"" + "R-4\"R-4#R-4\"R-4#RM<$(0V><6" + "V><6VN@7V^D8W.H9W>L:X.X>X>\\@XO$AX>`AX.X?X.X?X.X?X.X?X.X?X.X?W^T>" + "W^T>W^T>W^T>W^T>X.X?X.X?W^X?X.X?W^T>W^X>W^T>WNT>WNT>WNT>W^X?WNP<" + "W.LL;W>PP<7V><7V><7V><7V><7" + "V><7V><7V><7V><7V><7V.86V><7V><7V.86V><7V.86V.86V.86V.86V.86V.86" + "V.86U^45U^45UN04O,K\\FJ7/X_$@VN@8V.86U^45U^45U^45U^45U^45U^45U^45" + "U^45U^45U^44UN04UN04UN04U^45UN04UN04UN04UN04UN04UN03U>,3U.(2TM`0" + "T-X.S-H*R-8%P]#`OLOZKKGG)S-D)S-D)S-D)S-D)S-D)S-D)S-D=(*QOLOZQ]4#" + "S-H(S]T,T=\\.TM`/TM`/TM`/T^$0T^$0T^$0U.(1U.(1U>,2U>,2UN03UN03UN03" + "UN03U^44U^44V.85V.85V.85V.85V><6W.H9W^T@7QM0\"S]T," + "X.X=Z_HI[/LK[/LK[/LK[/LJ[/LK[/LK[/LK[/LK[/LJ[/LJX.X=V.85U^44UN03" + "UN03UN03UN03UN03UN03UN03UN03UN03UN03UN03U>,2U>,2U>,2U>,2U>,2U>,2" + "U>,2U>,2U.(1U>,2U.(1U.(1TM`/U>,1W>H9YO0CZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?,/WNP=V.86V.86U^45U^45U^45U^45U^45U^45U^45" + "U^45U^45U^45UN04UN04UN04UN04UN04UN04UN03UN03UN04U>,3U>,3T^$1TM`0" + "S]T-S-H)R-8%P]#`OLOZK;GG)S-D)S-D)S-D)S-D)S-D)S-D)S-D?8NZO\\S[QM0\"" + "R]D(SMP+T-X-TM`/TM`/TM`/T^$0T^$0U.(1U.(1U.(1U>,2U>,2UN03UN03UN03" + "U^44U^44U^44U^44U^44U^44V.85V.85V.85V><6VN@7W>L:X>\\>Y/(BY_4EZ?@G" + "Z_HI[/LK[?PK[?PL[?PL[OTL[?PL[?PL[?PK[?PL[?PL[?PL[?PK[?PL[?PK[?PK" + "[?PK[?PK[?PK[?PK[?PK[?PK[/LK[/LK[?PK[/LK[/LJ[/LJ[/LK[?PK[/LJ[/LK" + "[/LJ[/LK[/LK[/LJ[/LK[/LJ[/LJ[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJXN`@R=<%" + "R]D'VN@7Z?,2U>,2U>,2U>,2U>,2U>,2U>,2U>,2" + "U>,2U>,2U.(1U.(1U.(1U.(1U.(1U.(1U.(1T=\\-U^44WNT;YO0DZ?@GZ?@GZ/8E" + "Y_4EY_8EZ/U>,1M,#MCIG$?XVUR-<&Y/,BY/(AY/(A" + "Y/(AY/(AY/(AY/,BY/,BY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/(AY/,BY/(A" + "Y/,BY/(AY/(AY/(AXN`?WNP;V>85T=\\-RM<%Q='`P\\_^Q-#_Q-#_Q-#_Q='`Q='`" + "QM,!QM,!QM,!QM,!QM,!QM,!QM,!Q]0\"Q]0\"Q]0\"Q]0\"QM,!QM,!Q='`O\\OYL+SI" + "R-8#SMH(R-4\"R-4#R-4\"R=4#R-4\"R-4\"R=8#R-4\"R=8#R=8$R=8#R=8#R=8#R-4#" + "R-4#R-4\"R-4#R-4\"R=8$.T=X)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D9'*DSMH&V>86" + "V><6VN@7V^D8V^D9W.H:WNPXN`@XN`AX>\\@X.X?W^T>X.X?W^T>W^T>W^T>" + "W^T>W^T>WNT>WNP=W^T>W^T>W^T>W^X>W^T>UN46P<`!H['C@(V_5&\"22%.#76F9" + ">XBUFZC7K+GGM<7V><7V><7V><7V><7" + "V><7V><7V><7V.86V><7V><7V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86" + "U^45UN04U.(2GJ[?N<3NX_$AV><7U^45U^45U^45U^45U^45U^45U^45U^45U^45" + "U^45U^45UN04UN04UN04UN04UN04UN04UN04UN03UN03U>,3U>,3U.(2T^$1T=\\/" + "S]T-R]D)Q]4$PL__O,2U>,2U>,2UN03UN03" + "UN03U^44U^44U^44U^44U^44V.85V.85V.85V.85V.85V><6V><6V^D8WNP;XN`?" + "Y?,CZ/8EZ?@HZ_HJ[/LK[?PL[?PL[?PL[?PL[?PL[?PK[?PL[?PL[?PL[?PK[?PK" + "[?PK[?PK[?PK[/LK[/LK[?PK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK" + "[/LJ[/LK[/LJ[/LK[/LJ[/LJ[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ/,2U>,2U>,2U>,2U>,2U>,2U>,2U.(1U.(1" + "U.(1U.(1U.(1U.(1U.(1U.(1U.(1T^$0T^$0T^$0T^$0T^$0S]T,R]D'Y/(AZ/8F" + "Z?@GZ?@GZODHZODHZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@HZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>W>L:U^44T-T,R=8$Q-#_P\\_^Q-#_Q-#_Q='`Q='`Q='`Q='`" + "QM,!QM,!QM,!QM,!QM,!QM,!QM,!Q]0\"Q]0\"Q]0!Q]0!QM,!Q='_N\\;TM<'NS=H'" + "S-D&R-4\"R-4\"R-4\"R-4\"R-4\"R=8#R=8#R-4\"R=8#R=8#R=8#R=8#R=8#R=8#R-4#" + "R=8#R-4\"R-4#R-4#O,CV)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D.DAYR=8#V.85" + "V><6V><6VN@7V^D9W.H9WNP;X.X>X>\\?XN`@X>\\@X.X?W^T>W^T>W^T>W^T>W^T>" + "W^T>W^T>W^T>WNP=W^T>WNP=W^T>WNT=V>D;:WNS.T5T0DQ\\45V,:WBGBY?%I;+A" + "NL?VQM0#R]D(SMP,S]T-S-L+Q=0$J[KMIK3DK+OLM,+SN<;WOT^$1V><7V^H:W.L;W.L;V^H:V^H:" + "V^H:V^L;V^H:W.H:V^H:V^H:V^H:V^H:V^D9V^D9V^D9VND9V^H:V^H:V^H:VNH:" + "V^H:V^D9VNH:VND:V^D:VND:VND:VND9VNH:VND9VND9VND9VND9VND9VN@9VN@8" + "VN@9V>@9VN@8VN@8VN@8VN@8VN@8V>@8VN@8V><7V><7VN@8V><7V><7V><7V><7" + "V><7V><7V><7V><7V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86U^45U^45" + "U^45UN04M\\7XFJ7,X_$@VN@9U^45U^45V.86U^45U^45U^45U^45U^45U^45U^45" + "U^45UN04UN04UN04UN04UN03UN03UN03UN03UN03U>,3U>,3U.(2U.(2T^$1T=\\." + "SMP,R]D(QM0#PL__O,2U>,2UN03UN03UN03" + "UN03U^44U^44U^44V.85V.85V.85V.85V.85V.85V.85V.85V><6V><6V><6VN@7" + "W.H9X.X=X_(AYO4DZ/,2U>,2U>,2U>,2U>,2U>,2U.(1U.(1U.(1" + "U.(1U.(1U.(1U.(1T^(1T^$1T^$1T^$1T^$0T-X-QM,!P,SZT=\\-Y?,BZODIZODI" + "ZODHZODIZODHZODHZ?@HZODHZ?@GZ?@HZ?@HZ?@HZ?@GZ?@GZ?@HZ?@HZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>W.H9U>,2SML)Q]0\"Q-#_P\\_^Q-#_Q-#_Q='_Q='`Q='`QM,!Q='`" + "QM,!QM,!QM,!QM,!QM,!QM,!QM0\"Q]0\"QM,!QM,!QM+`Q-#^ML'ON\\?US]P*R]<%" + "R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4#R=8#R=8#R=8#R=8#R=8#R=8#R=8#R=8#R=8#" + "R-4\"R-4#R-4#R=8#J+3C)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DNL;UV.85" + "V.85V><6VN@7V^D8V^D9W>L:W^T=X>\\?X>\\@X>\\@W^X>W^T>W^T>W^T>W^T>WNT>" + "WNP=WNP=WNP=WNP=WNP=WNP=W>P=WNP=UN<976R@E:'-M<+QP]#`S-L*S]T-T-X." + "SMP,R]H)R=<'Q]4%QM0$Q=,#O\\W_I[7EKKWLM@9VND9VN@8VN@9VN@9" + "VN@9V>@8VN@8V>@8VN@8VN@8VN@8V><8V><7VN@8V><7V><7V><7V><7V><7V><7" + "V><7V.86V.86V.86V><7V.86V.86V.86V.86V.86V.86V.86V.86U^45U^45UN04" + "UN04QM4&B96`V.83W>L,3UN03U>,3U>,3U>,3U>,3U>,3U.(2U.(2TM`0T-X." + "SMP+RM@'QM0#P<[^O,GXK;GF)S-D)S-D)S-D)S-D)S-D)S-D)S-DGJS;OLOYQ-'`" + "R=<%S=L*S]T,T=\\.TM`/TM`/T^$0T^$0T^$0U.(1U.(1U.(1U>,2UN03UN03UN03" + "UN03U^44U^44V.85U^44V.85V.85V.85V.85V.85V.85V.85V.85V.85V.85V><6" + "V><6VN@7V^D8WNP;XN`?Y?,CY_8EZ?@HZ_HJ[/LK[?PK[?PL[?PL[?PL[?PL[?PK" + "[?PK[?PK[?PK[?PK[?PK[?PK[/LK[/LK[/LK[?PK[/LJ[/LJ[/LK[/LK[/LK[/LK" + "[/LJ[/LK[/LK[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJY?0CT-X-S-H)U.(1X_(A[/LJ[?PK[/LJZO@HTM\\.SML*U>,2U^44UN03" + "UN03UN03UN03UN03UN03U>,2U>03U>,2U>,2U>,2U>,2U>,2U>,2U.(1U.(1U.(1" + "U.(1U.(1U.(1U.(1T^(1T^$1T=\\/R-8$N,3QNL;RT^$.Y_8EZ?@GZODHZODIZ_HI" + "ZODIZODIZODIZODIZODHZODHZODHZODHZ?@HZODHZ?@HZ?@HZ?@HZ?@HZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/<6V><6VN@7V^D8V^D8W.H:W^TX>\\@X>\\@X.X?W^T>W^T>WNP=WNP=WNP=" + "W>PLLP=WNP=W>LLL,3V><8V^H:W.L;V^H:W.H:" + "V^H:V^H:W.H:W.H:V^H:V^H:V^H:V^H:V^D9V^D9V^D9V^D9V^D:V^D9V^D9V^D9" + "VNH:VND:VND9VND9VND9VND9VND9V^D9VND9VND9VND9VND9VND9VN@8VN@9VN@8" + "VN@9VN@9V>@8V>@8VN@8VN@8VN@8VN@8VN@8V><7V><7V><7V><7V><7V><7V>87" + "V.86V.86V><7V.86V><7V.86V.86V.86V.86V.86V.86V.86V.85U^45U^45UN04" + "S]T.C)C(Q]+^X>\\?V.86U^45U^45U^45U^45U^45U^45U^45U^45UN04U^45UN04" + "UN04UN04UN04UN04UN03UN03U>,3U>,3U>,3U>,3U>,3U>,3U.(2T^$1TM`0S]T-" + "S=L*R=@'Q=,\"P,W]O,GXK;GF)S-D)S-D)S-D)S-D)S-D)S-D)S-DI;+?O<6V><6" + "V.85V><6V><6V><6VN@7W.H9X.X=X_(AYO0DZ/,2S-D(T^$0" + "U^44UN04U>,2UN03U>03UN03U>,2U>,2U>,2U>,2U>,2U>,2U.(2U.(1U.(1U.(1" + "U.(1U.(1T^$1TM`0R]D(O,GWK;KGP,SZVND7Y_8EZ/\\@WNX?U^87RMD)QM0$" + "Q=0$Q-(\"PL_`O<7V^D9V^H:V^H:W.H:" + "V^H:V^H:W.H:V^H:V^H:V^H:VND:V^H:V^H:V^D9V^H:V^D9V^D9VND9V^D9VND9" + "VND9VND9VND9VND9VND9VND9VND9VND9VND9VND9VN@9VN@9VN@8VN@8V>@8VN@8" + "VN@9VN@9VN@8V>@8V>@8VN@8VN@8V><8V><7V><7V><7V><7V><7V><7V><7V><7" + "V>87V><7V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86U^45U^44T^$2" + "F:;7LKSFX_(BVN<7U^45U^45U^45U^45U^45U^45U^45U^45U^45UN04UN04UN04" + "UN04UN04UN04UN03UN04U>,3U>,3U>,3U>,3U>,3U.(2U.(2U.(2T^$1T=\\/S]T-" + "S=L*R=<&Q-(!P,W]O,CXK;KG)S-D)S-D)S-D)S-D)S-D)S-D)S-DJ[GFO,2U>,2U>,2UN03" + "UN03UN03U^44U^44U^44V.85V.85V.85V.85V.85V.85V.85V.85V.85V><6V><6" + "V><6V><6V.85V><6V><6V><6VN@7V^D8WNP;X>\\?Y?,BY_8EZ?@HZ_HJ[/LJ[?PK" + "[?PK[?PL[?PK[?PK[?PK[?PK[?PK[?PK[?PK[/LK[?PK[/LK[/LK[?PK[/LK[/LK" + "[/LK[/LJ[/LK[/LJ[/LK[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJY_8EU>,2S=L*TM`/WNT03U>03U>,2U>,2U.(1U>,2U>,2U>,2U>,2U.(2U.(2U.(1U.(1" + "T^$1S]T,PL_^K[OIJ[CDR-8$X_(AZ?@GZODHZ?BY?!E:+.T^(0Y/(AY/(AY/(AY/(AY/,BY/,BY/,BY/,BY?,B" + "Y/,BY/,BY/,BY/(BY/,BY/,BY/,BY/(AY/,BY/,BY/,BY/(AY/(AX_(AX>\\>W.H9" + "UN,2S]T+Q]4#Q-#_P\\_^Q-#_P\\_^Q-#_Q-#_Q='`Q='`Q='`QM'`Q='`QM,!QM,!" + "QM,!QM,!Q],!Q]0\"QM,!QM,!QM,!Q='_O,?TL[_LS-D'S=H'R-4\"R-4\"R-4\"R-4#" + "R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4#R-4#R=8#R=8#R-4#R=8#R=8#R=8#" + "R-4\"R-4\"R-4\"R-4#0$Q\\)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D=X6YTM\\+" + "V.85V><6VN@7VN@7V^D8W.H9W>L;W^T=X.X>X>\\?X>\\?W^T>WNP=WNP=WNP=W>L<" + "W>LP=W>LLLLL@:<7^RK;GGP<[_R-8%SMP,R-8&PL_`" + "PL_`PL_`PL_`P]$!P]$!Q=,#Q=,#P<[_Q-(\"RM@(T=\\0V^D:V>D9U>05Q=,#N\\GZ" + "LL#PHJ_@B9?(;WRM2E>(*S=G)C)A45R)HJS8SMP,U.(2V.86VND9V^H:V^L;W.H:" + "V^H:V^H:V^H:V^H:V^H:V^H:VND:V^H:V^D9V^D9V^D9V^D9VND9VND9VND9VND9" + "VND9VND9VND9VND9VND9VND9V^D9VND9VND9VN@9VN@8VND9VN@8VN@8VN@8VN@8" + "V>@8V>@8V>@8VN@8V>@8VN@8V><7V><7VN@8V><7V><7V><7V><7V><7V><7V><7" + "V><7V><7V.86V.86V.86V.86V.86U^45V.86V.86V.86V.86U^45U^45U.(2IK3F" + "G:G6XO$@V^D9V.86U^45U^45U^45U^45U^45U^45U^45UN04U^45UN04U^45UN04" + "UN04UN04UN04U>,3UN04U>,3U>,3U>,3U>,3U.(2U>,3U.(2U.(2TM`0T-X.SMP," + "S-H)R-8%Q-(!O\\S\\N\\CWK;KH)S-D)S-D)S-D)S-D)S-D)S-D-$!QL;[KO,2U>,2UN03UN03" + "UN03UN03U^44U^44V.85V.85V.85V.85V.85V.85V.85V.85V.85V.85V><6V><6" + "V><6V><6V><6V><6V><6V><6V.85V><6VN@7V^D8W>L:X.X=X_(AYO4DZ/,2U>,2U>,2U>,2U>,2U.(2U.(2U.(2U.(1T=`/R-8%" + "M\\3SIK+>L;WIT=\\-YO4DZ?@GZODHZ_HIZODHZODHZ/X=" + "T^$/N,3REZ//B)2`L\\'OX.\\>Y/(AY/(AY/(AY/,BY/,BY/,BY/(AY/,BY?0CY_8E" + "Y?0CY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/(AY/,BY/,BY/(AX_$@X.X=VN@7U.$0" + "S-H(QM,!P\\_^P\\_^P\\_^Q,__Q-#_Q-#_Q='`Q='`Q='`Q='`QM(!Q='`QM,!QM,!" + "QM,!QM,!QM,!QM,!QM,!Q='`Q-#_M\\+PN,3RS]P)S-@&R-4\"R-4\"R-4\"R-4\"R-4\"" + "R-4#R-4\"R-4\"R-4\"R=8#R-4\"R=4#R=8#R-4\"R=8#R-4#R-4\"R-4#R=8#R=8#R-4\"" + "R-4\"R-4\"Q]0!O,CW)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D5V:8SML(" + "V.85V><6VN@7VN@7V^D8V^D9W>L:W^T=X.X>X.X?X.X?W^T>WNP=WNP=WNP=W>L<" + "W>LLLLLLLL04U>04RM@)N\\G[>XF\\" + "/TIZ&B55%B)2&B94(\"Q;,#MJ256#?8BTN\\?TT=\\/U>,3V.<7VND9V^H:V^L;V^H:" + "V^H:V^H:W.H:V^H:V^H:V^H:VNH:V^H:V^D9VND9V^D9V^D9V^D9VND9VND9VND9" + "VND9VND9VND9VND9VND9VND9V^D9VN@9VND9VND9VND9V>@8VN@8VN@8VN@8VN@8" + "V>@8V>@8V>@8VN@8V>@8VN@8VN@8V><7V><7V><7V><7V><7V><7V><7V><7V><7" + "V><7V><7V.86V.86V.86V.86V.86U^45V.86V.86V.86U^45U^45U>,3L+[OD9O)" + "W^T,3U>,3U>,3U>,3U>,3U>,3U>,3U.(2U.(2T^$1TM`0T-X-SMP," + "R]D(Q]4%Q-(!O\\S\\NL?WKKKI)S-D)S-D)S-D)S-D)S-D)S-D2U>(L;_JO,GXPL_^" + "Q]4#RM@'S=L*T-X-TM`/TM`/T^$0T^$0U.(1T^$0U.(1U.(1U>,2U>,2UN03UN03" + "UN03U^44U^44U^44U^44V.85V.85V.85V.85V.85V.85V.85V.85V.85V><6V><6" + "V><6V><6V><6V><6V><6V><6V><6V><6V><6V><6VN@7VN@7W.H9WNP;XN`?Y?,C" + "Y_8FZ?@GZODI[/LJ[/LK[?PK[?PK[?PK[?PK[/LK[?PK[?PK[?PK[/LJ[/LK[/LK" + "[/LK[/LK[/LK[/LK[/LJ[?PK[/LK[/LJ[/LJ[/LK[/LJ[/LK[/LK[/LJ[/LJ[/LJ" + "[/LJ[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZODHWNTP;SMP+U.$1UN03U>,2U.(2U.(2U.(2T^(1S]P,P<[^K[SJH[#<" + "M\\7RV.85Z/C9G&F:;3T-\\.X_(AY/(AY/(AY/(AY/(AY/,BY/,BY/,BY/,BY/,BZ/\\>Y/,BY/,BY/,BY/,BY/,BY/,BY/(BY/(AXN`?WNP;V.85TM\\-RM<%" + "Q-#_P\\_^P\\_^P\\_^P\\_^Q-#_Q='`Q='`Q='`Q='`Q='`QM,!QM,!QM,!QM,!QM,!" + "QM,!QM,!QM,!QM,!Q='`P\\[\\L[[KO\\OYS]T*RM<$R-4#R=8#R-4\"R-4\"R-4\"R=8#" + "R-4\"R=8#R=8#R=8#R=8#R=8#R=8#R-4\"R=8#R=8#R=8#R-4\"R-4\"R=8#R=8#R-4\"" + "R-4\"R-4\"R-4\"H:W<)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D,3YOR-4\"" + "V.85V><6V><6V><7VN@7V^D8W.H9WNPX.X>X.X?W^T>W^T>WNP=WNP=W>L<" + "W>LLL@8VND9V^H:V^H;V^H:" + "V^H:V^H:V^H:V^H:V^D9V^H:VNH:VND:VND9VND9VND9V^D9VND9VND9VND9VND9" + "VND9VND9VND9VND9VND9VND9VN@9VN@8VN@9VN@9VN@9V>@8VN@8VN@8VN@8VN@8" + "V>@8V><8V>@8VN@8V>@8VN@8V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7" + "V><7V.86V.86V.86V.86V.86V.86V.86V.86V.86V.86U^45U>,3M,'SBI7#W.H8" + "W^T=V.86U^45U^45U^45U^45U^45U^45U^45U^45UN04UN04UN04UN04UN04UN04" + "UN04UN03UN04U>,3U>,3U>,3U>,3U.(2U.(2U.(2U.(2U.(2TM`0T=\\/S]T-S=L+" + "RM@(Q]4$P]#`OLO[NL?VK[SI)S-D)S-D)S-D)S-D)S-D)S-D6F>7L;[JN\\CWP<[]" + "Q=,\"R=<&S=L*S]T,T=\\.TM`/T^$0T^$0U.(1T^$0U.(1U.(1U>,2U>,2U>,2UN03" + "UN03U^44U^44U^44U^44U^44V.85V.85V.85V.85V.85V.85V.85V><6V><6V><6" + "V><6V><6V><6V.85V><6V><6V><6V><6V><6V><6VN@7V><6VN@7V^D8V^D8WNL:" + "X>\\>Y/,BYO4EZ/(.M?(BSAY3!J+7D" + "Q-(!S=L*UN03Y?0CZ_HJV^H9S=L*U.,2U>,2TM`0RM@'N\\?WJ+7BI+'>PL_]X.X=" + "Z?H9S=H)LKWJEJ+." + "CYS(OLS[X>`?X_(AY/(AY/(AY/(AY/,BY/,BY/(AY/,BY/,BY/,BY/(AW^TH9UN,2S]P+R-4#Q-#_" + "P\\_^P\\_^P\\_^P\\_^Q-#_Q-#_Q-#_Q='`Q='`Q='`Q='`QM,!QM,!QM,!QM,!QM0\"" + "QM,!QM,!Q='`Q-#_P,SZL+SIQM0!S]P)R=8#R-4\"R-4\"R-4\"R-4\"R=8#R=8#R-4\"" + "R=8#R-4\"R-4\"R-4#R-4#R-4\"R=8#R=8#R=8#R=8#R-4#R-4\"R=8#R-4\"R-4\"R-4\"" + "R-4\"R-4\"R-4\"9W.C)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DN<3R" + "V.85V><6V><6V><7VN@7V^D8W.H9W>L;W^T=W^T=W^T>WNP=WNP=WNP=W>LL<" + "W>LLSJ;?EOLO[Q]4$R]D)SMP+S]T-TM`0T^(2UN45V.<8VN@8V^H:V^H:V^H:V^H:" + "V^H:V^H:V^H:V^D:V^D9V^D9VND9VNH:VND9VND9VND9VND9VND9VND9VN@9VN@9" + "VND9VND9VND9VN@9VND9VND9VN@9VN@9VN@8VN@9V>@9VN@9VN@8VN@8VN@8V>@8" + "V>@8V><8V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86" + "V><7V.86V.86V.86V.86V.86V.86V.86U^45V.86U^45U>,3ML/UBY;$RM<&U.(2" + "VN@8V.86V.86U^45U^45U^45U^45U^45UN04UN04UN04UN04UN04UN04UN04UN04" + "U>,3U>,3UN04U>,3U>,3U>,3U>,3U>,2U>,3U.(2U.(2T^$1TM`0T=\\/S]T-S=L+" + "RM@'QM0#P]#`OLO[NL?VL;[J)S-D)S-D)S-D)S-D)S-D)S-D:'2DLK[JN\\CWP<[]" + "Q=,!R=<%S-H)S]T,T=\\.T^$0T^$0T^$0T^$0U.(1U.(1U.(1U>,2U>,2U>,2UN03" + "UN03U^44U^44U^44U^44U^44V.85V.85V.85V><6V.85V.85V.85V.85V><6V><6" + "V><6V><6V><6V><6V><6V><6V><6V><6V><6V><6V><6VN@7VN@7VN@7VN@7V^@7" + "V^D8W.H9X.X=X_$AY?0CZ/9W*?9W&=;WJF?(BTB9;%F:73" + "GJO8KKOJQ-(!S-L)V.<5Z/JK?ERMD&Y/,BZ?@GZODH" + "Z_HIZ_HIZ_HIZ_HIZ_HIZ_HJZ_HIZ_HIZ_HIZODIZODIZODIZODIZODIZODIZODI" + "ZODIZODIZODHZODHZODHZODHZODHZODHZODHZ?@HZ?@HZ?@HZ?@HZ?@HZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ/" + "V^D7W>L:Y/(AY/,BY/,BY/,BY/,BY/(AX_(AX.X=V^D8U.$0S-H'QM,!P\\_^P\\_^" + "P\\_^P\\_^P\\_^Q-#_Q-#_Q-#_Q='`Q='`Q=,!Q='`QM,!QM,!QM,!QM,!QM,!Q]0\"" + "QM,!Q='`QM'`O,CULK[KR]@&S=H(R=8#R=8#R-4\"R-4#R-4#R-4\"R-4\"R=8#R=8#" + "R-4\"R-4#R=8#R-4\"R-4\"R=8#R=8#R-4\"R=8#R-4#R-4\"R=8#R-4\"R-4\"R-4\"R-4\"" + "R-4\"R-4\"K;GG*C9G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DHZ_>" + "V.85V><6V.86V>@7VN@7VN@8V^D9W>L;WNPW^T>WNP=WNP=W>L<" + "W.H;W.L;W.L;W.L;V^H;V^H;W.H;W.LL47;GNMHJ[HJ_" + "HJS8P<[^R]D(T-X.TM`0U.(2U>03UN45V.86V.<7VN@9V^D9V^H:V^H:V^H:V^H:" + "V^H:V^H:V^H:V^H:VND9VND9VND:VND9VND9VND9VND9VND9VND9VND9VND9VN@8" + "VND9VN@9VN@8VN@9VN@9VN@9VN@9VN@8V>@8VN@8VN@8VN@8VN@8V>@8V><8V><8" + "V>@8V><7V><7V><7V><7V><7V><8V><7V><7V><7V><7V><7V><7V><7V.86V.86" + "V.86V.86V.86V.86V.86V.86V.86V.86U^45UN04U>,3M<+TC9C&RM@'TM`0S]T-" + "U>,2V><7U^45U^45U^45U^45U^45U^45UN04UN04UN04UN04U>,3U>,3U>,3U>,3" + "U>,3UN04U>,3U>,3U>,3U>,3U>,3U>,2U.(2U.(2T^$1TM`0T=\\/T-X-SMP+S-H)" + "RM@'QM0#PL__OLOZNL?VLK_L*S=H)S-D)S-D)S-D)S-D)S-D=H*QLK_KN\\CVP,W\\" + "Q-(!R=<%S-H)S]T,T=\\.TM`/T^$0T^$0T^$0U.(1U.(1U.(1U>,2U>,2U>,2UN03" + "UN03UN03UN03U^44U^44U^44V.85V.85V><6V.85V.85V.85V.85V.85V.85V><6" + "V><6V><6V><6V><6V><6V><6V><6V><6V><6V><6VN@7V><6V><6VN@7VN@7VN@7" + "VN@7VN@7V^D8W.H9W^T02Y/,B" + "Y/,BY/,BY/,BY/,BY/,BY/,BY/,BY/(AY/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,B" + "Y/(AY/,BY/,BY/,BY/,BY/,BY/(AX_$@W^T85TM`/RM@&Q-'_P\\_^P\\_^P\\_^" + "P\\_^Q-#_Q-#_Q-#_Q-#_Q='`Q='`Q='`Q='`QM,!QM,!QM,!QM,!QM,!QM,!QM,!" + "Q='`Q-#^N<3QML/PSMP)R]@%R-4\"R=8#R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R=8#R=8#" + "R-4\"R-4\"R=8#R=8#R=8#R=8#R-4\"R-4\"R=8#R-4#R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"" + "R-4\"QM+`7&B8)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DC)C)" + "U^02V><6V><6V><6VN@7VN@8V^D9W.H:WNPW^T>WNP=W>LL<" + "W.H;W.H;W.H;W.H;W.H;W.H;W.H;W>LL<8V>@8VN@8V^D9V^D:V^D:V^H:V^H:V^H:V^H:" + "V^H:VND9V^D:V^H:VND9VND:VND9VND:VND9VND9VND9VND9VND9VN@9VND9VND9" + "VN@9VN@8VN@9VN@9VN@9VN@9VN@9VN@8VN@8VN@8VN@9VN@8V>@8V><8V>@8V>@8" + "V>@8V><7V><6V.86V.86V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86" + "V.86V.86V.86V.86V.86V.86V.86U^45UN04U.(2L+WOC9G'R]@'T^$1TM`0TM`0" + "S]T-V.85V.86U^45U^45U^45U^45U^45UN04UN04UN04UN04UN04U>,3U>,3U>,3" + "UN04U>,3U>,3U>,2U>,3U>,3U>,3U.(2U.(2T^$1T^$1TM`0T=\\/T-X-SMP+S-H)" + "R=<&Q=,\"P<[^O,2U>,2U>,2UN03" + "UN03UN03UN03U^44U^44V.85V.85U^44U^44U^44V.85V.85V><6V><6V><6V><6" + "V><6V><6V><6V><6VN@7V><6V><6VN@7V><6V><6V><6V><6VN@7VN@7VN@7VN@7" + "VN@7VN@7VN@7VN@7V^D8W.H9WNP;X>\\>Y/(AYO0DZ/L:T=\\-O,CVHZ_;DZ'+J+;CTN$/Y/,BY/,BY/,B" + "Y/(AY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,B" + "Y/,BY/,BY/,BY/,BY/,BY/(AXO$@WNP;U^44T-X,R=8$Q-#_PL[]P\\_^P\\_^P\\_^" + "Q-#_Q-#_Q-#_Q-#_Q='`Q='`Q='`Q='`QM,!QM,!QM,!QM,!QM,!QM+`QM,!QM+`" + "P\\_]M+_LO<6V><7VN@7VN@8V^D9V^D9WNPLLL04V.<7VND9V^D:V^H:V^H:V^H:V^H:VNH:V^H:V^H:V^H:V^H:" + "V^H:VND:V^D:V^H:VND:VND9VND9VND9VND9VND9VND9VND9VN@9VN@9VND9VN@9" + "V>@8VN@8VN@9VND9VN@8VN@8VN@8VN@8VN@8VN@8VN@8V>@8VN@8V><8V><7V><7" + "V><7V><7V><6V.85V.85V><7V><7V><8V><7V><7V><7V><7V><7V.86V><7V.86" + "V.86V.86V.86V.86V.86V.86U^45UN04T^$1J+7GD9W+S=H)T^$1TM`0TM`0T^$1" + "TM`0T-X.V><7U^45UN04U^45UN04U^45U^44UN04UN04UN04U>,3U>,3U>,3UN04" + "U>,3U>,3U>,3U>,3U>,3U>,3U.(2U.(2U.(2T^$1T^$1TM`0T=\\/S]T-S=L+R]D(" + "R-8&Q-,\"P<[^O,GYN,;TM,'N+#AI)S-D)S-D)S-D)S-D)S-DD)S)LK_LN,2U>,2U>,2UN03" + "UN03UN03UN03U^44U^44U^44V.85UN03R]D'T=\\-U>,2U^43V.85V><6V><6V><6" + "V><6V><6V><6V><6V><6V><6VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7" + "VN@7VN@7VN@7VN@7V^D8V^D8V^D8W.D9W>L:X.X=X_$AY?0DZ/86V><6V><6VN@7VN@8VN@8V^D9W>L;WNPLL<" + "W.H;W.H;V^H;V^D:W.H;W.H;W.H;W.LL04V><7V^H:W.H;W.L;W.L;V^L;V^H;V^L;V^L;V^H:V^H:V^H:" + "V^H:VND:V^D:VND9VND9VND9VND9VND9VND9VN@9VND9VND9VND9VN@9VN@9VN@9" + "VN@9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V><7" + "V><7V><7V><7V><6V><6V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7" + "V.86V.86V.86V.86V.86U^45U^45S]T.G*G:FJ73S]T,TM`0T=\\/TM`0T^$1T^$1" + "T^$1T=\\/T^$0V><7U^45U^45UN04UN04UN04UN04UN04UN04UN04U>,3UN03U>,3" + "UN03U>,3U>,3U>,3U>,3U.(2U>,3U.(2U.(2T^$1T^$1TM`0T-X.S]T-S=L+R]D(" + "R-8%Q-(!P,W]O,GYN,7TM<+O+CIK)S-D)S-D)S-D)S-D)S-DDY[+LK_MN<;TOLOZ" + "PL_^Q]4#RM@'S=L*S]T,T=\\.T^$0U.(1U.(1U.(1U.(1U.(1U.(1U>,2U>,2UN03" + "UN03UN03U^44U^44U^44U^44V.85U>,3S-D(T^$0T-\\-TM`/UN03U^44V.85V><6" + "V><6V><6V><6VN@7V><6VN@7V><6VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7" + "VN@7V^D8V^D8VN@7VN@7V^D8V^D8V^D8V^D8V^D8W.H:W^T\\>P]#_R-4#R]D&RM<%Q]0\"I[3C;7FH" + "8&N9>H6SDIS(IK+>R]D&V^H9T^$0S=L*SMP+T^$0W>L:YO4D[/LJ[?PK[/LJZ_HJ" + "Z_HIZ_HJZ_HIZ_HIZ_HIZ_HIZODIZ_HIZODHZODIZODHZODIZODIZODIZODHZODI" + "ZODIZODHZODIZODHZODHZODHZ?@HZODHZODHZ?@HZ?@HZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ/X=V^D8U.$0S=H(QM,!P\\_^PL[]P\\_^P\\_^P\\_^Q-#_Q-#_" + "Q-#_Q='`Q='`Q='`Q='`Q='`QM,!QM,!Q='`QM,!QM,!QM,!Q='`Q-#_OLCVL+SH" + "R-8\"S=H'R-4\"Q]0!R-4#R-4\"R=8#R-4\"R-4\"R-4\"R=8#R=8#R=8#R=8#R=8#R=8#" + "R-4\"R-4\"R-4\"R=8#R-4\"R-4\"R=8#R-4\"R=8#R-4\"Q]0!R-4\"R-4\"R=8#RM<$RM<$" + "?HFY)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+SML" + "R-0!V><6V><6V><6V><6VN@7VN@8V^D8W.H:W>L;WNPLP,3V><7V^H:W.L;W.L;W.L;W.L;V^L;V^H:V^H:VNH:VNH:VNH:" + "V^H:V^D:V^D:VND:VND:VND:VND9VND9VND9VND9VN@9VND9V>@9VN@9VN@9VN@9" + "VN@8VN@9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V><7V><7" + "V.86V.86V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86" + "V.86V.86V.86V.86U^45UN04Q]8&CIO+IK+@T=\\.TM`0T=\\/TM`0T^$1T^$1T^$1" + "T^$1T^$1S]X-U>,3V.86UN04UN04U>,3UN04UN04U>,3U>,3U>,3U>,3U>,3U>,3" + "U>,3U>,3U>,3U.(2U.(2U.(2U.(2U.(2T^$1T^$1TM`0T=\\/T-X.S]T,S-H*R]D(" + "Q]4$Q-(!P,W]O,GXN,7TML+O-T-S)S-D)S-D)S-D)S-D)S-DDI[+LK_LN,;TO,2UN03UN03" + "UN03UN03U^44U^44U^44U^44U^44U.(1P<[^Q-#`S=L*U.(1TM`/U.(1UN03V.44" + "V><6V><6VN@7VN@7VN@7VN@7VN@7VN@7VN@7V><6VN@7VN@7VN@7V^D8V^D8VN@7" + "V^D8V^D8V^D8VN@7V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8W.H9WNP;XN`?Y/,B" + "YO4EZ?@HZ_HI[/LJ[/LK[?PK[?PK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK" + "[/LK[/LK[/LK[/LK[/LK[/LK[/LJZODHRM@&L\\#MO,CVQ]0!S]P*T]`.R]D'DY_." + "<7RFH*O5T-X,Y?,BZ/,2SMP+T=\\.U^44W^T<6V><6V><6VN@7VN@7VN@7V^D8W.H9W>L;WNPL<" + "W.H;W.H;W.H;W.H;W.H;W.H;W.H;W>LLPLLM,#MR=<'T^$1U^45VND9W.H:W.L;V^H:W.L;V^H:V^H:V^H;V^H:V^H:V^H:" + "V^D:V^D:V^D:VND:VND9VND9VND9VND9VN@9VND9VN@9VN@9VND9VN@9VN@8VN@9" + "VN@9VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8VN@8V><7V><7V.86U^45" + "U^45V.86V.86V.86V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7" + "V.86V.86V.86U^45U.,3N,7WAY/\"ML+QTM`0T=\\/T=\\/T=\\/TM`0TM`0TM`0T^$1" + "T^$1T^$1T^$1S]T-V.86U^45UN04UN04UN04UN04UN03UN04U>,3U>,3U>,3U>,3" + "U>,3U>,3U.(2U>,3U.(2U.(2U.(2T^$1T^$1TM`0TM`0T=\\/S]T-SMP,S-H)RM@'" + "QM0#P]#`O\\S\\N\\CWM\\7SM\\/P0$M[)S-D)S-D)S-D)S-D)S-DC9G&LK_KM\\7RO,GW" + "P,W\\Q=,!R=<%S-H)S]T,T=\\-TM`/T^$0T^$0U.(1U.(1U.(1U.(1U.(1U>,2UN03" + "UN03UN03U^44U^44U^44U^44V.85T^$0P<[^P<[^PL__Q=,\"S]T,U.,2T^$0U>,2" + "U^44V><6VN@6VN@7VN@7VN@7V^D8VN@7VN@7VN@7VN@7V^D8V^D8V^D8V^D8V^D8" + "V^D8V^D8VN@7V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8W.H9WNP;" + "X>\\>X_(AYO4EZ/P;U.(1S]T,T=\\.UN03" + "W^TL:U.(0QM+`M,'N" + "I+#>GJO9ML/QT=`/X_(AY/,BY?,BY?0CY/,BY?0CY?,BY?0CY?0CY?,BY?0CY?0C" + "YO4DY_8EY?0CY/,BY?,BY?,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,B" + "Y/,BX_$@W^TL:U^44S]P+Q]0\"P\\_^PL[]P\\_^P\\_^P\\_^P\\_^P\\_^Q-#_Q-#_Q-#_Q-#_" + "Q='`Q='`Q='`Q='`QM,!QM,!QM,!Q='`Q='`Q-#_PLW[L;SHP,W[S]P*R=8#R-4\"" + "R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4#R-4\"R-4\"R-4\"R=8#R-4\"R-4\"R-4\"R=8#R=8#" + "R-4\"R=8#R=8#R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"RM8#R=8#R=8#R-0\"O\\KX.45U" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "B93$V>84V><6V><6V><6V><7VN@7VN@8V^D9W.H:WNPPLLLL<" + "W>L<8V><8V.87U^86U.05=86[<7V><7V.86T^(3M<+Q" + "O<7V><7V><7V><7V><7V><7V><7V><7V><7V><7V><7V.86U^45" + "U^45U>,3O,G[BI;'I;#?SMP+T=\\/T-X.T=\\/T=\\/TM`0T=\\/TM`0TM`0TM`0TM`0" + "T^$1T^$1TM`0T^$1T=\\/U.(2V><7UN04U>,3U>,3U>,3U>,3U.(2U.(2U.(2U.(2" + "U>,3U.(2U.(2U.(2U.(2U.(2T^$1T^$1TM`0TM`0T=\\/T-X-SMP,S=L+R]D)R-8%" + "Q=,\"PL__OLO[NL?VML3RML'N0$MZ)S-D)S-D)S-D)S-D)S-D?XFWM<#LKKKGI[/<" + "N\\CUQ-'`R=<%S-H)SMP+T=X-TM`/T^$0U.(1U.(1U.(1U>,2U.(1U>,2UN03UN03" + "UN03UN03UN03U^44U^44U^44U^44S]T,P<[^P<[^P<[^P<[^P<[^PL__P]#`R-8$" + "TM`/U.(1TM`.UN03V.85VN@7V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8" + "V^D8W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8" + "V^D8W.H9W.H9W>L:W^T,2SMP+S=L*T=\\.U^44X.X>Y_8EZ_HJ[?PK[/LJZ_HIZODHZODHZODH" + "ZODHZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/<6T=X-Q='`M\\/QJK?EI;+@M,'PRM@'WNT\\>" + "Y?,CXN`?WNP;V.85XN`?Y/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/,BY/(AXN`?" + "W.H9UN,2S=H)QM,!P\\_^PL[]PL[]P\\_^P\\_^P\\_^Q-#_P\\_^Q-#_Q-#_Q='`Q='`" + "Q-#_Q='`QM,!Q='`Q='`QM,!QM,!Q='`Q-#_OLGWK[KGQM+`SML(R-4\"R-4\"R-4\"" + "R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R=8#R-4\"R-4\"R-4\"R-4\"" + "R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"Q]0!R-4\"R=8#R-4\"R-4\"R-0\"Q]0!F:33)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ";GJLU>(0V><6V><6V><6V><7V><7VN@7V^D9W.H:W>L;W>PLLL;W>L<" + "W.L;W.L;W.H;V^H:V^D:V^D:V^H:V^H;W.H;W.H;W.H;W.H;W.L;W.H;W.H;W.H;" + "V^D:VN@9VN@9V>@8U^87E:;=9W.@J+7CM\\3SL;WNGJO;CIO+=8*S3%B*)C%A.4-O" + "?XJUM\\/RQ=,#M<3UGZW>I+#@Q=,!V.86V^D:VNH:VNH:V^H:V^D:V^H:V^H:VND:" + "V^H:VND9VND:VNH:VN@9VND9VND9VN@9VN@9VND9VN@9VN@9VN@9VN@9V>@8VN@9" + "VN@9VN@8VN@8VN@8VN@8VN@8VN@8VN@8V>@8V><7V><7V><7V.86U^45O\\W_U>(0" + "V.87O\\W^M<#MUN03V.86V><7V><7V><7V><7V><7V><7V><7V.<7V.86V.86UN05" + "R=<(G*G:C)C&OLKYTM`/T-X-T-X.T-X.T=\\/T=\\/T=\\/T=\\/TM`0TM`0TM`0TM`0" + "TM`0TM`0TM`0TM`0T^$1T-X.U^45U^45U>,3U>,3U>,3U>,3U.(2U.(2U.(2U.(2" + "U.(2U.(2U.(2U.(2U.(2U.(2T^$1T^$1TM`0T=\\/T=\\/T-X-SMP,S=L+R]D(R-8%" + "Q-(!P<[^O(2U>,2U>,2U>,2UN03" + "UN03UN03UN03U^44U^44U^44U^44S=L*P<[^P<[^P<[^P<[^P<[^P<[^PL__P]#`" + "Q-(!RM@'U.(1T^$0TM`/U^44V><6VN@7V^D8V^D8V^D8V^D8W.H9V^D8W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8W.H9W.H9V^D8W.H9W.H9W.H9V^D8" + "V^D8V^D8V^D8V^D8W.H9W>L:W^T`?V><7T=\\.S-H)SMP+TM`/V.85X.X=Y_8EZ_DI[/LK[/LJ" + "Z_HIZODHZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/Y?0CY?0CY?0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BY?,BY/,BY?,BY?0CY/,BY/,BY/,BY/,B" + "X>\\>W>L:U^03W^T\\>V^D8" + "U.$0R]D'Q='`P\\_^PL[]PL[]P\\_^P\\_^P\\_^P\\_^Q-#_Q-#_Q-#_Q='`Q='`Q='`" + "Q='`Q='`QM,!Q=,!Q='`Q='`Q='`Q-#_N\\;SL[[KRM@%S=H'R=4#R-0!R-4\"R-4\"" + "R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"Q]0!" + "Q]0!R-4\"R-4\"R-4\"R-4\"R-4\"R-0\"R-4\"R=8#R-0\"R-4\"Q]0!Q]+`Q]+`:'2D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "35J-T=X,V>86V><6V><6V><6VN@7VN@7V^D8V^D9W>L;W>L;W>L;W.H;W>L;W.L;" + "W.H;W.H;V^H:V^H:V^D:V^H:V^H:V^H:V^H:V^H:V^H;W.H;W.H;W.H;W.H;W.H;" + "W.H;V^D:V^D:V^H:V^D:K\\+Z4%N*;'FH8FZ>4UZ//TI[+#=G*#)A0$IW='^KGJK8" + "ML/RPL__R]D)TM`0S]\\/O@8VND:V^H:VND:V^H:V^H:V^D:" + "V^D:VND:V^D:VND9VND9VN@9VN@9VN@9VND9VN@9VN@9VN@9VN@9VN@9VN@8VN@8" + "V>@8V>@9VN@8VN@8VN@8VN@8VN@8VN@8VN@8V>@8VN@8V><7V.86T^(4N\\CXVND9" + "S-L,Q-(\"O\\S]ML'LUN03V.86V><7V><7V><7V><7V><7V><7V.86U^45T-X.K+CI" + "AI/\"JK;ESMP+T=\\/S]T-S]T-T-X.T-X.T=\\/T=\\/T=\\/T=\\/TM`0TM`0T=\\/TM`0" + "TM`0TM`0TM`0TM`0TM`0TM`0T=\\/V><7UN04U>,3U.(2U.(2U.(2U.(2U.(2T^$1" + "U.(2U.(2U.(2U.(2U.(2T^$1T^$1T^$1TM`0T=\\/T=\\.S]T-SMP+S-H*RM@(R-8%" + "Q-(!P,W]O,2U>,2U>,2UN03UN03" + "UN03UN03U^44UN44U^44U^44U^44R]D(P<[^P,W]P<[^P<[^P<[^PL__PL__PL__" + "P]#`P]#`Q=,!R]D(U.(1TM`/T=\\.U^03V><5VN@7V^D8W.H9W.H9W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9" + "V^D8V^D8V^D8V^D8V^D8V^D8W.H9W.H9WNP;X>\\?Y/(BY_8EZ?@HZ_HI[/LK[?PK" + "[/LK[?PK[/LK[/LK[/LK[/LJY?0CO,3W.H9" + "X_$@Z/8FZODI[/LJ[/LJZODIZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\?W>L;V><6T]`/" + "RM<%O\\S[ML/PK;OHK;OHN<6V><6V><6V><6V><7VN@7V^D8V^D9W.H:W>L;W>L@8T=`1OLW^KKOLM<'QSMP+V><8VND9VND:VND9V^D:" + "VND9VND9VND9VN@9VND:VN@9VN@9VND9VN@9VN@9VN@9VN@9VN@9VN@9VN@9VN@8" + "V>@8V>@8VN@8VN@9VN@9V>@8VN@8VN@8VN@8V>@8V><7V.<7U^45P-$#SMP*UN46" + "Q-(\"P,W^PL_`O\\S]N<7V><7V><7V.86U^45T-\\/L;[OB97&G:G8" + "Q=,\"T=\\.SMP,S]T,S]T-T-X.T-X.T-X.T=\\/T=\\/T=\\/T=\\/T=\\/TM`0T=\\/TM`0" + "TM`0TM`0TM`0TM`0TM`0T^$1T=\\/U>,2V><7UN04U>,3U.(2U.(2U.(2T^$1T^$1" + "T^$1U.(2U.(2U.(2T^$1T^$1T^$1T^$1TM`0T=\\/T-X.S]T-S=L+R]D)R=<'Q]4$" + "P]#`P,W]O,2U>,2UN03UN03" + "UN03UN03UN43U^44U^44U^44UN03RM@'P,W]P<[^P,W]P,W]P<[^PL__PL__PL__" + "P]#`P]#`PL__Q-(!QM0#S=L*U>,2TM`/T^$/U^44V><6V^D7V^D8W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8W.H9W.H9" + "V^D8W.H9W.H9V^D8V^D8W.H9V^D8V^D8W.H9W.H9WNP;X>\\?Y/(BYO4EZ?@H[/LK" + "[/LK[?PK[?PK[?PK[/LK[/LKZ_HIZ_HIZ_HJ[/LJ[/LJ[/LK[/LK[/LK[/LK[/LJ" + "[/LK[/LJ[/LJ[/LJ[/LJ[/LJ[/LJZ_HIZ_HI[/LJZ_HIZ_HIZ_HIZ_HIZ_HIZ_HI" + "ZODIZ_HIZ_HIZ_HIZ_HIZODIZODIZODHZODHZODHZ?@HY_8EX>\\>VN@7T^$0S-H)" + "RM@'S-H(S]T,U.(1VN@7X.X=Y/,BZ/@7Y/,BYO4DYO4DY?0CY?0CY?0CY?0CY?0CY?0CY?0CYO0CY?0C" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?,BY?0CY?,BY?0CY/,BY?,BY?,BY?0CY/,BY/,B" + "Y?,BY?,BY?,BY/,BY/,BY?,BY/,BY/,BY/,BY/,BY/,BX_$AW^T<5T-X-R-4$" + "P\\_^PL[]PL[]P\\_^P\\_^P\\_^P\\_^P\\_^Q-#_Q-#_Q-#_Q-#_Q='`Q-#_Q='`Q='`" + "Q='`Q='`Q='`Q='_Q-#^P<6V>86V><6V><6V><6VN@7VN@7V^D8W.H:W>L;W>LL;W>L;W>LP<7V^D9V^H;TN$2O\\[_L+[OL\\'QRM@'U^86VN@9VN@9" + "VND9VN@9VN@9VN@9VN@9VN@9VN@9VN@9VN@9VN@9V>@9V>@9VN@9VN@9VN@9V>@8" + "V>@8VN@9VN@9VN@8V>@8V>@8VN@8V>@8V>@8VN@8V><7V.<7U.,4N<7V.87UN05SMP,KKOLBY?&F:73P,W\\T=\\/" + "S]T,SMP+SMP,S]T-S]T-T-X.T-X.T-X.T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/TM`0" + "TM`0TM`0TM`0TM`0T=\\/TM`0T^$1T=\\/V.86U^45U>,3U.(2U.(2T^$1T^$1T^$1" + "T^$1U.(2U.(2T^$1T^$1T^$1T^$1TM`0TM`0T=\\/T-X.S]T-S=L+R]D)R=<'QM0#" + "PL__O\\S\\O,GYN,7TM<+PML+M+SML)S-D)S-D)S-D)S-D)S-D1U.#K+;@L;WHM<+M" + "NL;TOLKYPL[]R=8#T=\\-Q]4\"P\\_\\T-X,U.(1U.(1U.(1U.(1U>,2U>,2UN03UN03" + "UN03UN03U^44U^44U^44U^44UN03R=<&P<[^P,W]P,W]P,W]P<[^PL__PL__PL__" + "P]#`PL__P]#`Q-(!Q-(!Q=,\"Q]4#SMP+U>,2TM`/T^$0V.85VN@6V^D8W>L:W.H9" + "W.H9W.H9W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8W.H9V^D8V^D8W>L:WNP;X.X>Y/(AYO4E" + "Z?@HZ_HJ[?PL[?PL[?PL[?PK[?PK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LJ" + "[/LK[/LK[/LJ[/LJ[/LJZ_HI[/LJZ_HJZ_HIZ_HIZ_HJZ_HIZ_HJZ_HIZ_HIZ_HI" + "Z_HIZ_HIZ_HIZ_HIZODIZODIZODIZODIZODHZODHZODHZODHZODHZ?@GZ?@GZ/X_$AY?0CY_8E" + "Z/8EZ?@GZ?@GZ?@GZ?@GZ/`?" + "W^TL:VN@7UN03T=\\.S-H(Q]4#P<[]N\\CWML3QL\\'NN<;TP]#_S-H)U^44X>\\?" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CY?0CYO4DYO4DY?0CY?0CYO4DYO4D" + "Y?0CY?0CY?0CY?0CY?0CY?0CY?,BY?0CY?0CY/,BY?0CY/,BY?,BY?0CY/,BY/,B" + "Y?,BY/,BY?,BY?,BY/,BY/,BY?,BY/,BY?,BY/,BX_$AW^P;U^44T-T,Q]0\"PL[]" + "PL[]PL[]PL[]P\\_^P\\_^P\\_^P\\_^P\\_^P\\_^P\\_^Q-#_Q-#_Q-#_Q-#_Q-#_Q='`" + "Q='`Q='`Q-#_P\\_]OV.85V><6V.86V><6V><6V><7VN@7V^D8W.H:W>L;W>L;W.L;V^H:V^H:" + "V^H:W.H;V^H;V^H:V^D:V^D:VND:VNH:V^H:V^D:V^D:W.H;W.H;V^D:W.H;W.H;" + "V^H:W.H;W.L;W.L;W.L;W.L;W.L;W.L;V^D:V.87U.(3T=\\0S]T-S]T-S]X.T-X." + "T=\\/T^$1U.,3UN04V.86V><8VND9V^H:W.L;W>P<8VN@9VN@9V^D9VN@9VN@9VN@9VN@9VN@9VN@9V>@9V><8V><8VN@9VN@9V>@9" + "V>@8VN@9VN@8VN@9VN@9V>@8V>@8V>@8V>@8VN@8V><8U^86RMH,Q='_V.87QM0$" + "P,W^P,W^P,W^P,W^P<[_N,7UPLWZUN04T^(2J;?KA)&`FZC6P,S\\T-X.S]T,S=L+" + "SMP+SMP,S]T-S]T-T-X.T-X.T-X.T=\\/T-X.T-X.T=\\/T=\\/T=\\/T=\\/T=\\/TM`0" + "TM`0TM`0TM`0T=\\/TM`0TM`0TM`0TM`0TM`0VN<7UN04U.(2T^$1U.(2T^$1T^$1" + "T^$1T^$1U.(2T^$1T^$1T^$1TM`0TM`0TM`0T=\\/T-X-SMP,S-H*R]D)R-8&QM0#" + "PL__O\\S[N\\CWN,7TM<+PM<#L*C9G)S-D)S-D)S-D)S-D)S-D+#AHIK#:L+SGM<+M" + "NL;SO(1Q=,!R-8#U.(1U>,2U>,2U>,2U>,2UN03UN03" + "UN03U^44U^44U^44U^44U^44UN03Q]4$P,W]P<[^P,W]P<[^P<[^PL__PL__PL__" + "PL__PL__P]#`P]#`Q-(!Q-(!Q-(!Q=,\"R-8$T-X-U.(2T=`/U>(1V.85VN@6W.H8" + "W>L:W>L:W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9W>L:W>L:W.H9W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8W.H9W.H9W.H9W>L:WNP;X.X=" + "X_$AYO0DZ?@H[/LK[?PK[?PL[?PL[?PL[/LK[/LK[/LK[/LK[/LK[/LK[/LK[/LJ" + "[/LJ[/LK[/LJ[/LJ[/LJZ_HJ[/LJZ_HJZ_HJZ_HIZ_HJZ_HIZ_HIZ_HIZ_HIZODI" + "Z_HIZ_HIZ_HIZODIZODIZODIZODHZODIZODHZODHZODHZODHZ?@HZODHZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GY_8EX_(AWNT@7U>,2T-X-S-H)R=<&R-8$R=<%R]@'" + "S=L*S]T,TM`/U.(1U^44V><6V^D8W>L:WNP;W^TX.\\>X.\\>X.X>" + "X.X=X.X=W^TL:V^H9VN@7V.85UN03U.(1TM`/S]T+R]D(R-8%Q=,!" + "PL[^OLOZNLCVN<;UN\\GWPL[]R-8%SMT,U>03W>P;Y/,BYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO0CYO4DYO4DYO4DYO4DYO4DYO0CY?0CY?0CYO0CYO4DYO4DY_4EY_8E" + "YO0CY?0CY?0CY?0CY?0CY?0CY?0CY?,BY?,BY/,BY?,BY/,BY/,BY?,BY?,BY/,B" + "Y/,BY?,BY/,BY?,BY/,BY?,BY/,BY/,BY/,BX_$@WNL:U^03S]P*QM,!PL[]P<6V><6V.86V><6VN@7VN@8V^D9W.H:W>L;W.L;V^H;V^H:" + "V^H;V^H;V^H;V^H:V^D:V^H:VND:VNH:VNH:V^D:VND:V^D:V^D:V^H:W.H;W.H;" + "W.H;W.H;V^H:W.H;W.H;W.L;W.L;W.L;V^H:VN@9V.87U>04U.,3U.(2U.(2U.(2" + "U.,3UN04U^46V.86V>@8V>@8VND9VND:VND:V^H:W.L;WNP<8V><8VN@9VN@9VN@9VN@9VN@9V>@9V><8VN@9VN@9V>@8V><8" + "V.<8VN@9VN@9VN@9V>@8V>@8V>@8V>@8V>@8V><8V.<7UN45N\\G\\T^(0T^$2PL_`" + "O\\S]O\\S]O\\S]OLO\\O,3V><7U>,3U.(2U.(2U.(2U.(2" + "T^$1T^$1U.(2T^$1T^$1T^$1TM`0TM`0T=\\/T-X.S]T-SMP,S=L*R]D(R-8%Q=,\"" + "PL__OLO[N\\CWM\\7SM,'PL+OG)S-D)S-D)S-D)S-D)S-D)S-D)S-DC9C#L+SGM,'M" + "N<;SO,2U>,2UN03UN03UN03" + "U^44U^44U^44U^44U^44U^44UN03Q=,\"P,W]P,W]P,W]P<[^P<[^P<[^PL__PL__" + "P]#`P]#`P]#`Q-(!Q-(!Q-(!Q=,\"Q=,\"QM0#QM0#R=<&T=\\.U>,2TM`/U>,2V.85" + "VN@7W.H9W>L:W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9W>L:W.H9W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9V^D8W.H9W.H9V^D8W.H9W.H9V^D8W.H9W>L:W>L:" + "WNP;X.X=X_$AY?0DZ?@G[/LK[?PL[?PL[?PK[?PK[?PK[/LK[/LK[/LK[/LJ[/LJ" + "[/LJ[/LK[/LJ[/LJ[/LJZ_HJ[/LJ[/LJ[/LJZ_HJZ_HJZ_HIZ_HIZ_HJZ_HIZ_HI" + "Z_HIZ_HIZ_HIZODIZ_HIZODIZODIZODIZODIZODHZODHZODHZODHZODHZODHZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/\\>W>L:" + "VND8U^44T^$0T-X-S=L*R]D(R=8%Q]4#Q=,\"Q-(!Q-(!Q=,\"Q=,!Q=,!Q=(!P]#_" + "PL__PL__P<[^P<[^P\\>Y/,BY_8EYO8EY_8EY_8EY_8EYO4DYO4DYO4DY?0DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CY?0CY?0CY?0CY_4EZ/H9UN,2S=H(Q=(!PL[]PL[]PL[]" + "PL[]P\\_^P\\_^P\\_^Q-#_Q-#_P\\_^Q-#_Q-#_Q-#_Q-#_Q-#_Q=#_Q-#_Q=#_Q=#`" + "Q-#_PL[\\ML'MLK[KS-D'R]@%QM+`QM+`Q]0!R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"" + "R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"Q]0!Q]0!Q]0!" + "R-4\"R-4\"R=4\"R-+`Q]'`QM#^QM#^Q,_^Q,_]P\\[\\P\\[\\F*+1+#AI)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D9G*EU.$/V><6V><6V><6V><6V><6VN@7VN@8V^D9W.H:W>L;W>L;V^H:V^H:" + "V^H;V^H:V^H:V^H:V^D:V^D:VNH:VND:V^H:VND:V^D:V^D:V^H:V^H:V^H:V^D:" + "W.H;W.H;V^D:W.H;W.H;W.H;W.L;W.H;W.H;V^H:V>@9V.<8U^86U^86UN46U^45" + "U^46V.87V.<7V><8VN@9VN@9VND9VND9VND:VND:V^H:V^H:W.H;W>L<8V><8V><8VN@9V><8V><8VN@9V><8" + "V>@8V><8VN@8VN@9V>@8V>@8V>@8V>@8V>@8V>@8U^86U.,4ML7VUN45RMD*O\\S]" + "O87U^45U.(2U>,3U.(2U.(2" + "U.(2U.(2T^$1T^$1T^$1TM`0TM`0TM`0T=\\/T-X.S]T-SMP+S=L*RM@(Q]4$Q-(!" + "P<[^OLO[NL?VM\\7SM,'OJ[;C)S-D)S-D)S-D)S-D)S-D)S-D)S-D45R+JK7?M+_L" + "N<7QO,GVP,S[Q-#`Q]4#RM@&S=H)SMP*T=\\-U^43S]P*Q=+`TM\\.U>,2UN03UN03" + "U^44U^44U^44U^44U^44V.85UN03Q-(!P,W]P,W]P,W]P,W]P<[^P<[^P<[^P<[^" + "PL__P]#`P]#`Q-(!Q-(!Q=,\"P,W\\OLS[QM0#QM0#QM0#Q]4$RM@&TM`/U.(1TM`/" + "U>,2V><5VN@7W.H9W>L:W>L:W>L:W>L:W>L:W>L:W.H9W>L:W.H9W>L:W.H9W>L:" + "W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9" + "W.H9W>L:WNP;X.X=XO$@Y?0DZ?@G[/LK[?PL[?PL[?PK[?PK[?PK[/LK[/LK[/LJ" + "[/LK[/LJ[/LJ[/LJ[/LJ[/LJZ_HJZ_HJZ_HJZ_HJZ_HJZ_HJZ_HJZ_HJZ_HJZ_HI" + "Z_HIZ_HIZ_HIZ_HIZODIZODIZODIZODIZODIZODHZODHZODHZODHZODHZODHZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/`@XO$@XO$AX_$AX_(AY/,BY?0CYO4DY_8EY_8EY_8EY_8EY_8EY_8EY_8EY_8E" + "Y_8EY_8EYO4DY_8EY_8EY_8EYO4DYO4DYO4EYO4DYO4DYO4DYO4DYO4DYO4DYO4D" + "YO4DYO4DYO4DYO4DYO4DYO4DYO4DYO4DY?0CY?0CY?0CY?0CY?0CXN`?YO0CXN`?" + "W^T<6V.85V><6V.86V><7V><7VN@8V^D9W.H:W>L;W>L;W.L;V^H:" + "VNH:V^H:V^D:V^D:VND:V^D:VND:V^D:V^D:VND:V^D:VND9V^D:V^H:V^H;V^D:" + "V^H;V^D:V^H:V^H;W.H;W.H;W.H;V^H:V^H:W.L;V^H:VN@9V>@9V.<8V>@8V.<8" + "V><8V>@8VN@9VN@9VN@9VN@9VND:VND:VNH:V^H:VND:V^D:VN@9VN@9Q-,$T=\\/" + "V>@8T^(3R=D)O,4U^46V.87V.<7V><8" + "V><8V><8V><8V><8V.<7V.<7V.<7V><7V.<7V.87U^46Q=8+PL[\\U.(2P]$!O,GZ" + "N\\CYNLCXNL?XN<;WN,;WN,7VN,7VK[WLM\\/QQ]4$Q]4$R]D(SMP,SMP,SMP,S]T-" + "S]T,S]T-S]T-S]T-T-X.T-X.T-X.T-X.T-X.T-X.T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/" + "T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/TM`0TM`0T^$1T^$1T^$1V><7U>,3U.(2U.(2U.(2" + "U.(2U.(2U.(2T^$1T^$1T^$1TM`0TM`0T=\\/T-X.S]T-S=L+S-H)RM@'Q]4$Q-(!" + "P,W]O(1UN03" + "U^44U^44U^44V.85V.85V.85UN03P]#`P,W]P,W]P,W]P,W]P,W]P<[^OLO[ML3R" + "M,+POLO[PL__Q=,\"Q=,\"Q=,\"N\\CVQ-'`QM0#QM0#Q]4$Q]4$Q]4$Q]4$R]D'T^$0" + "U.,1TM`/UN03V><5V^D7W.H9W>L:W>L:W>L:W.H9W>H9W>L:W>L:W.H9W.H9W.H9" + "W>L:W.H9W.H9W.H9W.H9W.H9W.H9V^D8W.H9W.H9V^D8V><6V^D8W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9W>L;X.X=XN`?Y?0CZ?<6" + "V.85W.H9X_(AY?,BY?,BY?,BY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0CY?0C" + "Y/,BY/,BY?0CY/,BY/,BY/(AXN\\?V^D8T^$0R]@&P\\_^PH6T)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-DN\\?WV.86V><6V><6V><6V><7VN@7VN@8V^D9W.H:W>L;W>L;W.L;V^H:" + "V^D:V^D:V^H:V^D:VND:V^D:V^D:V^D:V^D:VND:V^D:V^D:V^D:V^H:V^D:W.H;" + "V^H:V^D:V^H:V^H:V^H;V^D:V^H;W.H;V^H:V^H:V^H;V^D:VND9VN@9V>@9V>@9" + "VN@9VND9VN@9VN@9VN@9VND9VND:VND:VNH:VND:VND:V^D:VN@9U^87O,GZTM`/" + "V.86V><7VN@8VND9UN86S]X.QM4%NLGZK[WOIK3EH*W=H*W=I;'AJK?GL+SLM<'R" + "N<;VO,CXOLO[O\\O\\OLK[O,CXM<'QL;WNL;WKU.(1SMP,L+WQSMP*S=L+O,3U.(2U.(2" + "U.(2U.(2U.(2T^$1T^$1T^$1T^$1T=\\/T=\\/T-X.S]T,S=L+S-H*R=<&QM0#P]#`" + "O\\S\\O,2PL__P<[^P<[^P,W]P,W]P<[^O\\S\\K+OI?HVZ" + "4UZ)AY2^K[SIP]#_QM0#Q=,\"O,GWP]#`Q]4$Q]4$Q]4$Q]4$Q]4$Q]4$Q]4$R-8$" + "S-H)U.$0U>,2T^$0UN03V><6V^D8W>L:W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9" + "W>L:W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8K;GIG*?7N<7TU>,2W.H9W>L:" + "W.H9W>L:W.H:W.H9W.H9W>L:WNP;X.T=XN`@Y?,CZ/\\>V^@7TM\\.RM<%P\\_^P<6V><6VN@7VN@7V^D8V^D9W.H:W>L;W>L;V^H:" + "V^H:V^D:VND:VND:VND:V^D:V^D:VN@9VND:VND:V^D:V^H:V^D:V^D:V^D:V^D:" + "V^D:V^D:V^H:VND:V^D:V^D:V^D:V^D:V^D:V^D:V^H:V^D:VND:VND:VND9VND:" + "V^D:V^D:V^D:VND:VN@9V^D:VND:V^D:VND:V^D:VND9V^D:VN@9SMT0O\\S[U.(2" + "U^45U^46U^86U^86V.87V><7VN@9VND9V.<7T^(2S=P,QM4%P,[_N,3U.(2" + "U.(2U.(2U.(2T^$1T^$1TM`0TM`0TM`0T-X.T-X-SMP,S=L+R]D)R=<&QM0#PL__" + "O\\S\\O,GYN<;UM<+QM,#NF:30)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D45V,GZK7OLGWP]#^R-4$R]@'S=H)SML*S]P+S]P+T-T,T=X-TM`.VN<6U.(1" + "P\\_\\SMP)V.85V.85V.85V.85U.(1P<[^P<[^P<[^P<[^P<[^PL__OH9W>L:W>L:W.H9W>L:W>L:" + "W.H9W.H9W>L:W>L:W.H9W>L:W.H9W.H9W.H9UN03EZ/4K+CHIK/CGZO;Q=(!W.H9" + "W.H9W>L:W.H9W.H9W.H9W.H9W>L:W>L:WNP;X.X=X_$@Y?0CZ/\\>VN<6TM\\.R-8$P\\_^PL[]PL[]PL[]PL[]P\\_^P\\_^P\\_^" + "P\\_^P\\_^P\\_^P\\_^Q='`Q='`Q-#_Q-#_Q-#_Q-#_Q=#_Q-#_P\\_]N<3QK[KGRM<%" + "R]@&Q]0!Q]0!Q]0!QM+`Q]0!QM+`Q]0!Q]0!R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"R-4\"" + "Q]0!Q]0!Q]0!Q]0!R-0\"R-4\"R-4\"R-4\"Q]0!R-4\"R-4\"Q]0!QM+`Q]+`Q]'_Q]'_" + "QM#^Q<_]Q,[\\P\\W[P\\W[PLSZL[WK8VZ=)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-DAI+#V.44V><6V><6V><6V><6V><7VN@7VN@8V^D9W.H:W>L;W>L;W.H;" + "VNH:VND:VND:VND9V^D:V^D:V^D:VND:V^D:V^D:V^D:V^D:V^D:V^D:V^H:V^D:" + "VND:V^H:VND:VND:V^D:V^D:V^D:V^D:V^D:V^H:V^H:V^D:V^H:V^D:VND:V^D:" + "V^D:V^D:V^D:V^D:V^D:VND9VND:V^D:VND:VND:VND:VN@9V>@9P<`\"R-8%U>,3" + "UN45U^46U^46U^46U^46UN45UN45U^45U^45UN45U^45V.86V.86V.86V.86V.86" + "U^45U>04U.,3U.(2U.(2U.(2U.(2U>,3X.X>S]T-M<7XP<7U>,3U.(2" + "U.(2U.(2U.(2T^$1T^$1TM`0TM`0T=\\/T-X.T-X-SMP,S-H*R]D(R-8%Q=,\"PL__" + "O\\S\\O,GYN,;TM,+PM<'NCIG&)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D*C9G<'NJM+_KQ='_R=<%S-H(SML*S]P+T-T,T-T,T-X,T=X-TM\\.U>(1" + "W.D8S]T+P]#^T^$/V.85V.85T^$0P<[^P<[^P<[^P<[^PL__P]#`P,W]QM0!W^T<" + "X_$@XN`?W^X=V.85P]'`LK_MO,GVQ]4$R-8%R-8%R-8%R-8%R-8%R-8%R-8%R-8%" + "Q]4$R-8%R-8%R-8%S=L)U>,2U>,2T^$0U^44VN@7V^D8W.H9W>L:W>L:W>L:W>L:" + "W>L:W>L:W>L:W>L:W>L:W>L:W>L:W>L:W.H9VN@8H:[?G*G:F*35H*W>PL__N\\?X" + "N<;VU>,2W.H9W.H9W>L:W.H9W.H9W>L:W>L:W>L:WNP;X.X=X_$@Y?0DZ/<6T=X-R-4#PL[]PL[]PL[]PL[]PL[]PL[]P\\_^P\\_^P\\_^" + "P\\_^P\\_^Q-#_Q-#_Q='`Q='`Q='`Q='`Q-#_Q-#_Q='_P\\_^M+_LL[_LS-H'RM8$" + "QM+`Q]0!Q]0!Q]0!QM+`QM+`QM+`R-4\"R-4\"R-4\"R-4\"R-4\"Q]0!R-0\"Q]0!Q]0!" + "Q]0!Q]0!Q]0!Q]0!R-0!R-4\"R-4\"R-4\"R-4\"Q]0!Q]0!QM'_Q]'_QM#^QM#^QM#^" + "Q,[\\Q,[\\P\\W[PLSZPLSZJ+'@/TMZ)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D76J(/V.85V.85V><6V><6V><6VN@7VN@8V^D9W.H:W>L;W>L;W.L;" + "V^H:VND:VND:VND9VND9VND:VND:VND:V^D:V^D:VND:V^D:V^D:VND9VND:VND:" + "VND:VND:V^D:V^D:VND9VND9V^D:V^D:V^D:VND:VND:V^D:VND:VND:VND9VND:" + "V^D:V^D:VND:VND9VN@9V^D:VN@9V^D:V^D:VND:VND9VN@9U^46N<;XSMP,U>04" + "UN45U^46U^46U^86UN45UN05UN05UN04U>04U>,4U>,3U.(2U.(2U.(2U.(2T^$1" + "T^$1T^$1T^$1T^$1TM`0T=\\/T=\\/U.(1W.H;RM@(K;OLS-H)R-8&M\\7UM,+RM,+R" + "L\\'QL\\'RM,+SM,+RL\\'RL\\'QLL#OLL#OJK;FL+KFQ-#`RM@'R=<&SMP,S]T-S]T-" + "T-X.T-X.T-X.T-X.T-X.T-X.T-X.T=\\/T-X.T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/" + "TM`0TM`0T=\\/TM`0TM`0TM`0TM`0TM`0TM`0T^$1T^$1T^$1TM`0V><7U^45U.(2" + "U.(2U.(2U.(2T^$1T^$1TM`0TM`0T=\\/T-X-S]T-S=L+S-H*RM@(R-8%Q-(!PL__" + "O\\S\\N\\CWM\\7SM,'NM<'NA(^[)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D.T=WDI[,O\\OYRM<%S=H)S]P+T-T,T-T,T=X-T=X-T=X-T=\\." + "T]`/V.44V^D8R-8$QM+`UN02T=\\.P<[^P<[^P<[^P<[^PL__Q]4$VN@6YO0CYO4D" + "Y?0CY/,BX_(AXN`?X.X=V.<6PM#`L\\#NOLSYQM0#R-8%R-8%Q]4$R-8%R-8%R-8%" + "R-8%R-8%R-8%Q]4$Q]4$R-8%S=L*U>,2U.(1T^$0V.84VN@7W.H9W.H9W>L:W>L:" + "W>L:W>L:W>L:W>L:W>L:W>L:W>L:W>L:W>L:V><7P,W_H*S=HZ_@LK_OQM0$EJ+5" + "J+3GGJOL:W.H9W.H9W>L:W>L:W>L:W>L:WNP;X.X=XN\\?Y/(B" + "Z/86V><6V><6V><6V><6VN@7VN@8V^D9W.H:W.H:W>L;W.L;" + "V^H:VNH:VND9V>D9VND9VND:VND9VND:VND:V^D:V^D:V^D:V^H:VND:VND9VND:" + "VND9V^D:VND:VN@9V^D:V^D:VN@9VND:VND:V^D:VND:VND:VND:VND:VND9VN@9" + "VND:VND9VND9VND:V^D:VND9V^D:V^D:VND9VND9VND9VN@9S=T/O,CXT=\\/U>04" + "UN45U^45UN45UN45UN45U>45UN45UN04UN04U>,3U>,3U.(3T^(2T^$1T^$1T^$1" + "TM`0TM`0T=\\/T=\\/T=\\/T=\\/T=\\/V.86UN04Q=4&LK[LS=L+PL_`M,+SL\\'RM,+R" + "M,+QL\\'RM,+RL\\'QLL#PL+[MG*C9@XRYC9:]ML+OQ-#`R=<&R-8%S=L+S]T-S]T-" + "T-X.T-X.T-X.T-X.T-X.T-X.T=\\/T=\\/T-X.T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/TM`0" + "TM`0T=\\/TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0T^$1T^$1TM`0U>,3VN@8U>,3" + "U.(2U.(2U.(2T^$1T^$1T^$1T=\\/T=\\/T-X-S]T-S=L+S-H)RM@'Q]4$Q-(!P<[^" + "OLO[NL?WM\\3RM,#MM\\+O=7^M)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D45V,HZ_>Q]4\"S=H)T-T,T-T,T-X,T=X-T=X-T=\\." + "TM\\.T]`/U.$0V^@6VN<6PL[\\OY_8EZ/,2U.,2U.(1V.85VN@7V^D8W.H9" + "W>L:W>L:W>L:W>L:W>L:W>L:W>L:W>L:W>L:TM`0HZ[?GZO,1W.H9W.H9W>L:W.H9W>L:W>L:W.H9W>L:W>L:W^T<" + "XN`@Y?,BZ?86V>86V><6V><6V><6VN@7V><7VN@8V^D9W.H:W>L;W.L;" + "V^H:VNH:VND9V>D9VND:VND9VND:VND:VND:VND:VND9VND:VND:VNH:VND:VND9" + "VND9VND9VND:V^D:VND:VND9VN@9VND9V^D:VND9VND:VN@9VN@9VN@9VN@9VN@9" + "VND9VND9VND9VND9VN@9V^D:V^D:V^D:V^D:VN@9VN@9V><8O\\\\\"Q-(!T^$1U>04" + "U^45UN45UN04UN04U>05U>05U>04UN04U>04U>,3U>,3U.(2U.(2T^$1T^$1TM`0" + "TM`0TM`0T=\\/T=\\/T=\\/T=\\/T=\\/W.L:T-X/NLG]PX>TEJ',K[SJN<7UP,S\\QM0#RM@'RM@'S-H*S]T,S]T," + "T-X.T-X.T-X.T-X.T=\\.T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/TM`0" + "T=\\/TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0T^$1T^$1T^$1U.(2TM`0V><7V.86" + "U>,3U.(2U.(2T^$1T^$1TM`0TM`0T=\\/T-X.SMP,S=L*S-H)R=<'QM0#P]#`P,W]" + "OL:W>L:WNP;W>L:WNP;W>L:W>L:W>L:SMP,HZ_?I;+DFJ?8I;+CJK;GH[#A" + "HJ_AGJOL:W.H9W>L:W.H9W.H9W.H9W.H9" + "W>L:W^T\\>Y/,CZ/<6V><6V><6V><7VN@7VN@7VN@8V^D9W.H:W>L;W>L;" + "V^H:VNH:VND:VND9VND9VND9VND9VND9VND9VND:VND9VN@9VND:VNH:VND9VND9" + "VND9VND:VND:VND9VN@9VND9VN@9VN@9V^D:VND:VND9VN@9VN@9VN@9V>@8VN@9" + "VN@9VN@9V>@9V>@9VND9VND9V^D:VN@9VND9VND9VN@9UN46M\\7WR]D(U.(2U>04" + "UN04UN04U>04UN04U>04U>05U>,4U>,3U>,3U.(3U.(3U.(2T^$2T^$1T^$1T^$1" + "TM`0T=\\/TM`0T=\\/T=\\/T-X.TM\\/W>L;SMP,LL'TQ]4#QM0#ML3SL+[NJ+3DF*;5" + "AY+!>82Q?(>SE:#,K+GFM,'ON,7TO\\S\\PL__Q=,\"R-8&R]D(S-H)S=L+S]T-S]T-" + "T-X.T-X.T-X.T-X.T=\\.T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/TM`0TM`0T=\\/" + "TM`0TM`0TM`0TM`0T^$1TM`0TM`0TM`0T^$1TM`0T^$1T^$1U.(2TM`0U.(2V^D9" + "UN04T^$1U.(2T^$1T^$1TM`0TM`0T=\\/S]T-SMP,S=L*S-H)R=<&QM0#P]#`P,W]" + "O\\>V.85P<__O,2U.(1U.$0" + "V.85VN@6W.H8WNP;WNP;WNP;WNP;WNP;WNP;W>L;T=`0L+[PGZS85W>L:W.H9W.H9W>L:W.H9W>L:W.H9" + "W.H9W>L:W>L:W^T\\?Y/,CZ?L:" + "UN03S=L)Q-#`P6)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D;'BIU^43V><6V><6V><6V><6V><7VN@7VN@8V^D9W.H:W.H:W>L;" + "W.L;V^H:VND:VND9VND9VN@9VN@9VND9VND9VND9VND9VN@9VND9VND9VND9VND9" + "VND9VND9VND:VND9VN@9VN@9VN@9VND9VN@9VND9VN@9VN@9V>@9V>@9V>@9V>@9" + "VND9VN@9V>@9VND9VN@9VN@9VN@9VND9VND9VN@9VN@9S]X/N,7USMP+U.(2U>,3" + "U>,3UN04U>04U>04U>04U>04U.,3U>,3U>,3U.(2U.(2U.(2T^$1T^$1TM`0TM`0" + "TM`0T=\\/T=\\/T=\\/T=\\/T=\\/U.(2VN@8S=L+M<7XEJ'0BI7\"?HJW?(FVB)3!F*73" + "JK;CLL#ON,7TN<;TN\\CWP\\__Q-(!Q=,\"Q]4$R=8&RM@'S-H)S=L+S=L+S]T-S]T-" + "S]T-T-X.T-X.T-X.T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/TM`0T=\\/TM`0TM`0TM`0TM`0" + "TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0T^$1T^$1T^$1U.(2U.(2T=\\/V.86" + "V.86U>,3U.(2T^$1T^$1TM`0T=\\/T=\\/S]T-SMP,S-H*R]D)R=<&QM0#P]#`P,W]" + "O,GYN,7TM<'OL\\#MN,+N+#AI)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D4U^/H:W<5V^D7W.H9W>L:WNP;WNP;WNP;WNP;WNP;W>L:U>03TN$0U>,2H:W>" + "G:G;HJ_ANL?XK+GLG:K;I[3EIK/EI;+CVN@7SML+L[[NTM`/W.H9W>L:W.H9W.H9" + "W.H9W.H9W.H9W.H9W>L:W^T\\?Y?,CZ?@H[?PL[?PL[/LJZ_HJZ_HJZ_HJZ_HJ" + "Z_HJZ_HIZ_HIZ_HIZODIZODIZODIZODIZODIZODHZODHZ?@HZODHZODHZODHZODH" + "ZODHZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/,2" + "S=H(Q-#_P<6V>86V><6V><7VN@7VN@7VN@8V^D9V^D9W.H:W>L;" + "W.L;V^H:VND:VND9VND9VN@9VN@9VND9V>D9V>@9V>@9V>@8VND9VND9VN@9VND:" + "VND9VND9VN@9VN@9V>@9VN@9VN@9VND9VND:V>@9VND9VN@9VN@9VN@9V>@9VND9" + "VN@9VND9VND9VND9VN@9VND9VND9V>@9VN@9VN@9V><8P=$#P,W\\T-X-U.(2U>,3" + "U>,3UN04U>,3U>,3U>,3U>,3U.,3U.(2U.(2U.(2U.(2T^$2T^$1TM`0TM`0TM`0" + "TM`0T=\\/T=\\/T=\\/T-X.T-X.V.85U.,3SMP,SMP+R]D)P<[_O,KZN,;UN<;UNL?V" + "O,CWP\\__O\\S\\QM0#Q=,\"Q]4$QM0#R=<&RM@'RM@(S-H*S=L*S=L+SMP,S]T-S]T-" + "S]T-T-X.T-X.T=\\/T=\\/T=\\/T=\\/T=\\/TM`0TM`0TM`0T=\\/TM`0TM`0TM`0TM`0" + "TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0T^$1TM`0T^$1T^$2U>,3T^(2T^$0" + "V^D9UN04U.(2U.(2T^$1T^$1TM`0T-X.S]T-SMP,S-H*R]D)R-8&Q=,\"PL__O\\S\\" + "N\\CXM\\3SM,#NM,#NL;KG)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D8V^>LK[KSML)" + "T=X-TM`/T]`/T^$0T^$0U.$0V^D7Z?85V^@7W.H9W>L:WNP;WNP;WNP;WNP;WNP;WNP;W>L:P]$!" + "GJSH[#BGJO<7IK/FJ+;GJ+3EVN@7W>L:W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9W>L:W^TL:U>(1S-D(" + "Q-#_P<6V><6V><6V><6V><7VN@7VN@8V^D9V^D9W.H:W.H:" + "W>L;W.H:V^H:V>D9VND9VN@9VN@9VN@9VND9VN@9VN@9VN@9VN@9V>@9VN@9VND9" + "VND9VND9VND9VND9VN@9VN@9VN@9VN@9VN@9VN@9VN@9V>@9V>@8V>@8V>@9V>@9" + "VND9VN@9VND9VND9VND9VN@9VN@9VN@9VN@9VN@9U^46N,3" + "U>,3U>,3U>04U>,3U>,3U>,3U.(2T^(2T^$1T^$1T^$1T^$1T^$1TM`0TM`0TM`0" + "TM`0T=\\/T=\\/T=\\/T-X.T=\\/V><7T=\\/SMP,SMP,S=L*R=<'R-8&Q]0$PL_^Q]0#" + "PL__RM@'QM,\"R-4%RM@'R=<&R=8&R]D)S-H*S-H*S-H*S=L+SMP,S]T-S]T-S]T-" + "T-X.T-X.T-X.T=\\/T=\\/T=\\/TM`0T=\\/TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0" + "TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0T^$1T^$1U.(2U>,3TM`0" + "U^44V><7U>,3T^$1T^$1TM`0TM`0T=X/S]T-SMP,S-H*RM@(R-8%Q=,\"PL__OLO[" + "N\\CWML/QM,#NM<'OI['=)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+CIK@HZ]" + "P\\[]T-T,TM`/U.$0UN,2X.XY/$>Y/(?Y/(?Y_0BZO@FZ?<6V^D8W>L:W>L:WNP;WNP;WNP;WNP;WNP;WNP;" + "T^$1LL#RHJ_@L;[PH:[>G:KL:W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W>L:W^TL:VN@7V><6V^D8W.L:X.X=XN`?Y/,CYO4D" + "YO4EZ/H:U>,2R]D'P\\_^" + "P<6V><6V><7VN@7VN@7VN@8V^D9W.H:W.H:" + "W>L;W.H:VNH:VND:VND9VN@9VN@9VN@9VN@9V>@9V>@9V>@9V>@9VN@9V>@9VND9" + "V>@9VND9V>D9VN@9V>@9V>@9VN@9VN@9V>@9V>@9V>@9V>@9V><8VN@9V>@9VN@9" + "VN@9VND9VN@9VN@9VN@9VN@9VN@9VN@9V>@9V><8T=`2M,+QRM@(T=\\/T^$1U.(2" + "U>,3U>,3U>,3U>,3U>,3U.(2U.(2U.(2T^$1T^$1T^$1TM`0TM`0TM`0T=\\/T=\\/" + "T=\\/T=\\/T=\\/T=\\/T-X.T=\\/V.86S]T-SMP,SMP,S=L+S-H*S-H*R=8&Q]4$S-H*" + "R=<&Q]4%R-8&R=<&RM@(R]D)S-H*S=L+S=L+S=L+SMP,SMP,S]T-S]T-T-X.T-X." + "T-X.T-X.T=\\/T=\\/TM`0T=\\/TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0" + "TM`0TM`0T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/TM`0TM`0TM`0TM`0U.(2U>,3U.(2" + "TM`/VN@8UN04U.(2T^$1TM`0T=\\/T-X.S]T-SMP,S-H*RM@(R-8%Q-(!P<[^OLO[" + "N\\?WM\\?V^D8TM`/Q=0\"L+[LDZ'," + "P<[^Q-(!Q-(!Q=,\"Q=,\"Q=,\"Q=,\"Q=,\"QM0#QM0#QM0#Q]4$Q]4$R-8%R-8%R-8%" + "R-8%R=<&R=<&R]D(T=\\.U^44U.(1U.(1V><6V^D8W>L:WNP;WNP;W^TL:UN03U.(2I+#AH[#CJ;?HH*S=K;KLI;+CC9G+H[#CPL__W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9V^D8W.H9V^D8W.H9W>L:W^T=XN`@Y/,CZODI[OTM" + "[OTM[/LKZ_HJZ_HJZ_HJZ_HIZODIZODIZ_HIZODIZODIZODIZODIZODHZODHZODH" + "ZODHZODHZ?@HZ?@HZODHZODHZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/85T-X,SMP+T=\\.U.(1V.85V^D9WNP`?Y/,CYO4EZ/(6VV.44V><6V><6V><6VN@7VN@7VN@7V^D8V^D9W.H:W.H:" + "W.H:W.H:V^H:V^H:V>D9VND9V>@9VN@9V>@9V>@8VN@9VN@9VN@9V>@9V>@9V>@9" + "V>@8VN@9VN@9V>D9V>@9V>@9VN@9VN@9V>@8VN@9V>@9V>@9V>@9V>@9V>@9V>@8" + "VN@9V>@9VN@9VN@8VN@9VN@9VN@9V>@9V>@8V.87Q]8(NL?VS=L*TM`0U.(2U>,3" + "U.(2U.(2U.(2U>,3U.(2U.(2T^$1T^$1TM`0T^$1TM`0TM`0TM`0T=\\/T=\\/T=\\/" + "T=\\/T=\\/T=\\/T=\\/T=\\/T=\\.U>,3SMP,SMP,SMP,SMP,SMP+T-X.S]T,R-8%R]D(" + "RM@'R]D(S-H*S=L+S=L+S=L+S=L+SMP,SMP,S]T-S]T-S]T-S]T-T-X.T-X.T=\\/" + "T=\\/T-X.T=\\/T=\\/TM`0T=\\/T=\\/TM`0T=\\/T=\\/T=\\/T=\\/T=\\/T=\\.T-X.T-X." + "T-X.T-X.S]P,SMP+SMP,SMP+S=L+S=L*S=L+S=L*S=H*S=H*S=L+S]T-TM`0U>,3" + "T-X.U.(2V><7U>,3T^$1T^$1T=\\/T-X.S]T-S=L+S-H*RM@'Q]4$Q-(!P<[^O,2U.(1V><5V^D8W.H9WNP;WNP;WNP;" + "WNP;WNP;WNP;W>L:U>,3M,'RG*G:EJ+4D)W0H:[?G:K>H[#CL\\#PW.H9W>L:W>L:" + "W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9V^D8W.H9W.H9W>L:W^T=XN`@YO0D" + "Z_HJ[OTM[OTM[/LKZ_HJZ_HJZODIZODIZ_HIZODIZODIZODIZODIZODIZODHZODH" + "ZODHZ?@HZODHZ?@HZODHZODHZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/L:U.(1RM@&P\\_^P<6V><6V><6V><6V><7VN@7V^D8V^D9V^D9W.H:" + "W.H:W.H:V^H:VNH:VND9V>@9V>D9V>@9V>@9V>@9VN@9VN@9V>@9V>@9V>@8V>@9" + "V>@8V>@8V><8V>@9V>@8V>@8V>@8VN@9V>@8V><8VN@9V>@8V>@8VN@9V>@9V>@8" + "V>@8V>@9VN@9VN@9VN@9VN@9VN@9VN@9V>@8U^46O,K\\P<[]SMP,TM`0T^$1U.(2" + "U.(2T^$1U.(2U.(2U.(2T^$1T^$1TM`0TM`0TM`0TM`0TM`0T=\\/T=\\/T=\\/T=\\/" + "T=\\/T=\\/T=\\/T=\\.T-X.T=\\/TM`0SMP,SMP,SMP,SMP,SMP+S=L+S-H*S=L*S=L+" + "S=L+SMP,SMP,SMP,SMP,SMP,S]T-S]T-S]T-S]T-S]T-T-X.S]T-S]T-T-X.T-X." + "T-X.T-X.T-X.T-X.T-X.S]T,SMP+S-H*R]@(R=8&Q]4$Q=,\"P]#`P\\__P\\_^PL[]" + "PLW\\PLS\\P,S[O\\OZP,OYO\\KYOLKYOLGXOLGWOXN`=ZODGZ/85V^@7W.H9W>L:" + "WNP;WNP;WNP;WNP;WNP;W>L:U.(2M,+TIK/EE*#3H*W?GZS>I;+CW.H9W>L:W>L:" + "W>L:W>L:W.H9W.H9W.H9W>L:W.H9W.H9W.H9V^D8V^D8V^D8W.H9W.H9W>L:W^T=" + "X_$@YO4E[/LK[_XN[?PLZ_HJZ_HJZ_HJZ_HIZODIZODIZODIZODIZODIZODIZODH" + "ZODHZODHZODHZODHZODHZ?@HZ?@HZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/,2U>,1UN03VN@7X.X>Z/8F[?PL[?PL" + "Z_HJZ_HIZODIZODIZ?@HZ?@HZ/<6V><6V><6V><7VN@8V^D9VN@8W.H:" + "W.H:W.H:V^H:VNH:VND:VND9V>D9V>@9V>@9V>@9VN@9V>@9V>@8V>@8V>@8V>@9" + "V><8VN@9V><8V>@9V>@9V>@8V>@8V>@8V>@9V><8V><8V>@9V>@8V>@9V>@9V>@8" + "V>@8V>@8V>@8VN@9VND9V>@8VN@9VN@9V><8U.,3MHJO<7U>,3T^$1T=\\/T-X.S]T-S=L+R]D)R=<'QM0#P]#`O\\S\\O,GY" + "N,7TM<'PM<'OO,?U4EV,)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D?XN[" + "W>H9Z?@GZ?@GZ?@GZ?@GZO@GZODHZODHZ_HIZ_HI[/LI[/LJZODHZ/,2S-H)P<_]M\\7RL;_MK+OFGZW9DJ#," + "P,W]P]#`P]#`Q-(!Q=,\"Q=,\"Q=,\"QM0#Q]4$Q]4$QM0#Q=,\"QM0#R-8%R-8%R=<&" + "RM@'RM@'P,W\\S-H)Q]4#RM@'RM@'RM@'R]D(S-H)T=\\.UN44U.(2U.(1V>85V^D8" + "W.H9W>L:WNL:WNP;WNP;WNP;WNP;W>L:U^45Q]4$JK;HJK?HH*W?V><6W>L:W>L:" + "W>L:W>L:W>L:W>L:W>L:W.H9W.H9V^D8W.H9W.H9V^D8V^D8V^D8V^D8V^D8W.H9" + "WNL;W^T=X_$AY_8F[/LK[_TN[?PLZ_HJZ_HJZ_HIZODIZODIZ_HIZODIZODIZODI" + "ZODIZODHZODHZ?@HZ?@HZ?@HZODHZ?@HZ?@GZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ/,2U.(1U.(1U.(1U.(1T^$0TM`/TM`/TM`/V.85Y/(B" + "[/LK[/LKZODIZ?@HZ?@HZ/<6V><6V><6V><6V><7V><7VN@8V^@8V^D8V^D9" + "W.H:W.H:W.L;VNH:VND9VND9V>@8V>@8V>@9V>@9V>@8V>@8V>@9V>@8V><8V>@9" + "V>@9V><8V><8V>@8V><8V>@8V>@8V><8V>@9V>@8V><8V><8V><8V>@8V>@8V>@8" + "V>@8V>@8V>@8V>@8V>@8V>@8V>@9VN@8V.87SMP.M<+RR=<'T-X.TM`0T^$1U.(2" + "T^$1T^$1T^$1T^$1T^$1T^$1TM`0TM`0TM`0TM`0TM`0TM`0T=\\/T=\\/T=\\/T=\\/" + "T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T-X.S]T-S]T-S]T-T-X.T-X.T-X.S]T-S]T-T-X." + "T-X-T-X.S]T-T-X.S]T-T-X.S]T-S]T-S]T,SMP+S=L+S-H)RM<'QM,\"Q,_^PG^P2U2%)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D?X6NEYN`IJ_9M,#MN,/RN\\?V" + "O\\O[Q]4$S-H)V><7UN04T^$1T=\\/T-X.SMP,S=L+R]D)R-8&Q=,\"PL__O\\S\\N\\CX" + "N,7SML+PM\\/QN<3R+SMK)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+3EJH:W=YO0C" + "Z?<6TM`/R=<%OLS[ML/QL\\'NL;_LK+OGH*_:EJ71" + "P,W]P]#`P]#`Q-(!Q=,\"Q=,\"QM0#QM0#Q]4$QM0#O\\S\\L+WKI[/@M\\/RQM0\"R-8%" + "RM@'RM@'O\\S[Q=,\"Q=,!R]D(R]D(R]D(R]D(RM@'R]D(S-H)T=\\.UN03U>,2U.(1" + "V.85VN@7W.D8W>L:W>L:WNP;WNP;WNP;WNP;W>L:UN04ML3UEJ+3S]T,W>L:W>L:" + "W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8" + "V^D8W.H9W>L:W^T=X_$AZ/8F[?PL[_XN[?PKZ_HJZ_HIZODIZODIZODIZODIZODH" + "ZODIZODHZODHZODHZ?@HZ?@HZ?@GZ?@GZ?@GZ?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z/86V><6V><6VN@7VN@7VN@8VN@8V^D9V^D9" + "W.L;W.H:W.L;V^H:VND9VND9V>D9V>@9V>@9V>@8V>@8V><8V>@8V><8VN@9V>@8" + "VN@9V>@8V>@9V>@8V><8V><8V>@8V><8V><8V><8V><8VN@9V>@8V><8V>@8VN@9" + "V>D9V>@8V>@8VN@9V>@8VN@9VN@9V><8U^86P](#N\\CWR]D)T-X.TM`0T^$1T^$1" + "T^$1T^$1T^$1T^$1T^$1TM`0TM`0TM`0TM`0TM`0TM`0TM`0T=\\/T=\\/T=\\/T=\\/" + "T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T-X.T-X.T-X.T-X.T-X.T=\\/T-X.T-X.T-X.T-X." + "S]T-T-X.S]T-SMP,SMP,S=L+S-H)R=8%QM(!P,KYM+[KHZS:DIO(@(FV:G*@3E>&" + ",#MK)S-D)S-D)S-D.4)U5EJ5.#YZ*S%J+S)L-3IS65Z7<7BK)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D9FZ:@8>ODIG\"H:K5ML'PN<;U" + "O\\O[P]#`R=8&T^$1V><7U.(2TM`0T-X.SMP,S-H*R]D(R-8%Q=,\"PL__OLO[N\\CW" + "N,3SML+PN,3RKKCF)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D256%P,S\\Z?@GZ?@G" + "Z?8EZ/8EZ/<4W^T,2T^(0V.85VN@6V^D7W>L:WNP;WNP;WNP;WNP;WNP;W>L;UN44U>,2W>L:W>L:" + "W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8" + "V^D8V^D8V^D8W.H9W>L;X.X>Y/(BZ/<7V><6V><6V><7VN@8VN@8VN@8VN@8V^D9" + "W.H:W.H:W.L;W.H:VNH:VND9VND9V>@9V>@9V><8V><8V><8V><8V><8V><8VN@9" + "VN@9V><8V><8V><8V><8V>@9V><8VN@9V><8V><8VN@9V>@9V>@8V>@8V>@8V>@8" + "V>@8V>@8V>@8V>@9V>@8V>@8V>@8V><8U>05N'^S0TQ\\)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D2%.\"AHZV@(>OFZ+-JK3@NL;V" + "P,S\\P]#`R-4$S=L*V><7UN04TM`0T-X.SMP,S-H*RM@(R-8%Q=,\"P<[^O\\>V><6T-X*S]T+P<[]N,;TM,'OLL#MLL#MLL#ML;_LK;SHIK7@H*[:" + "P<[^P]#`P]#`Q=,\"Q=,\"QM0#Q]4$Q]4$R-8%O\\S\\GJS;=X2O<'VJ>8>UC9S*EZ/2" + "C);\"M\\/QS-H)QM0$R=<&R]D(R]D(R]D(R]D(R]D(R]D(R]D(R]D(R]D(RM@'S-H)" + "T-X-UN43U>,2U.(1U^44VN@6V^D8W>L:WNP;WNP;WNP;WNP;WNP;W>L:W>L:W>L:" + "WNP;W>L:W>L:W>L:W>L:W.H9W>L:W.H9W>L:W.H9W.H9W.H9W.H9W.H9V^D8V^D8" + "V^D8V^D8V^D8V^D8V^D8W.H9WNP;X.X=Y/(BZODH[OTM[OTM[/LKZ_HJZ_HIZODI" + "ZODIZODIZODHZODIZODHZ?@HZ?@HZ?@HZ?@HZ?@GZ?@HZ?@GZ/<6V><6V><6V><6V><7VN@7VN@8VN@8V^D9" + "W.H:W.H:W.H:W.H:VNH:VND9V>D9V>@9V>@9V>@8V>@9V>@9V>@9V><8V>@8VN@9" + "V>@8V><8V><8V><8V>@8V>@8V><8V><8V><8V>@9V>@9V>@8V>@9V>@9V>@9V>@8" + "V>@8V>@8V>@8V>@9V>@8V>@8V>@8V><8TN$2M,'QQ=(\"SMP,T=\\/TM`0T^$1T^$1" + "T^$1T^$1T^$1T^$1TM`0TM`0TM`0TM`0TM`0TM`0T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/" + "T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T-X.T=\\/T-X.T-X.T-X-S]T-S]T,S=L+RM<'P,2V.<7T^$1T-X.SMP,S-H*RM@(Q]4$Q-(!P,W]O(:Q=H.OA93!FZG9FZK8" + ".41R-T!L@8JUN<7SR-8%RM@'R]D(R]D(R]D(R]D(R]D(R]D(R]D(RM@'R]D(RM@'" + "R]D(R]D(T-T,UN03U>,2T^$0U^44VN@7W.D8W>H9WNP;WNP;WNP;WNP;W>L:WNP;" + "W>L:WNP;WNP;W>L:W>L:W>L:W>L:W>L:W.H9W.H9W>L:W.H9W.H9W.H9W.H9W.H9" + "W.H9V^D8V^D8V^D8V^D8V^D8V^D8W.H9WNP;X>\\>Y/,CZODI[_XN[OTM[/LKZ_HJ" + "ZODIZODIZODHZODHZODHZODHZ?@HZ?@HZ?@HZ?@HZ?@HZ?@HZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ?@GZ/<6V><6V><6VN@7V><7VN@7VN@7V^D9V^D9" + "V^D9W.H:W.H:V^H;V^H:V^H:VND9V>@9V><8V>@9V>@9V>@9VN@9VN@8V>@9V><8" + "V><8V>@8V><8V><8V><8V><8V>@8V>@8V>@8V>@8V>@8V><8V><8V>@8V>@8V>@8" + "VN@9VN@9V>@8V>@9V>@8V>@8V>@8V.<7S-L,ML+RQ]4%SMP,T=\\/TM`0TM`0T^$1" + "T^$1T^$1T^$1T^$1T^$1TM`0TM`0TM`0TM`0TM`0T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/" + "T=\\/T=\\/T=\\/T-X.T=\\/T=\\/T-X.T-X.S]T-SMP+R]D)Q=($LK[RFZ7;@8>];G&J" + ";&^I;W2U;G6V;W2[8&*=,3QO)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D0$M^4%21/D)[/$%]046!4EB5>X&W+CIK)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D=7ZJAHVVA8RUH:G3LKOG" + "P,S\\Q-$!Q]4$R=<&S]T,V><8U>,3T=\\/SMP,S-H*R=<'Q]4$P]#`P,W]O,GYN,7T" + "M\\/RN,3RO8>T>HBTC9O*I;7CH+#@" + "-D)P&B=7!A)\"*3)<@8RXN,3RQ]4$RM@'R]D(R]D(S-H)R]D(R]D(R]D(R]D(R]D(" + "R]D(RM@'RM@'R]D(S]T,UN03U>,2T^$0U^44V><6V^@7W>L:WNP;WNP;WNP;WNP;" + "WNP;WNP;WNP;WNP;W>L:W>L:W>L:W>L:W.H9W>L:W>L:W>L:W.H9W.H9W.H9W.H9" + "W.H9V^D8W.H9V^D8V^D8V^D8V^D8V^D8V^D8W.H9WNP;X>\\?YO0D[/LK[_XN[OTM" + "Z_HJZODIZODIZODHZODHZ?@HZODHZ?@HZ?@HZ?@HZ?@HZ?@GZ?@GZ?@GZ?@GZ?@G" + "Z?@GZ/\\?Z/(2V><6V><6V><6V><7VN@8VN@8V^D8V^D9" + "V^D9W.H:W.H:W.H:W.H:W.H:VND9VND9V>@9V>@9VN@9V>@9VN@9VN@9VN@9VN@9" + "V><8V>@8V><8V><8V><8V>@9V>@8V>@8V>@8V>@8V><8V><8V>@9V>@9V>@9VN@8" + "VN@9VN@8V>D9V>@8V>@8V>@8V>@8U^86PL`\"O,CWRM@'S]T-T=\\/TM`0T^$1T^$1" + "T^$1T^$1T^$1TM`0T^$1TM`0TM`0T=\\/TM`0T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/T=\\/" + "T=\\/T=\\/T-X.T-X.S]T-S]T-SMP,RM@(P,S^J;+GBI/-;'.T96JL:FRM;&^P;W*S" + "X>XX_$@[/HI[OTL[?PKZ_HIZODHZODH" + "Z?@GZ?\\>W.H9" + "UN02SMP*PL_^N=X&MM<+P" + "Q-(!Q=,\"QM0#QM0#Q]4$Q]4$R-8%R=<&R=<&OXFV?(RXE:32K+KII;/B" + "-D)R&R=8!!!!!1%\"!A%\"*S-?@XVYNL7SR-8%RM@'R]D(R]D(R]D(R]D(R]D(R]D(" + "RM@'R]D(RM@'RM@'RM@'R]D(S]T,U>,2U>,2T^$0UN03V><6V^D8W.H9W>L:WNP;" + "WNP;WNP;WNP;WNP;WNP;WNP;W>L:W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9" + "W.H9V^D8W.H9V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8W.H9W^P,2U>,2U>,2TM`0S]T-S=L*R=<&S-D(R]D(TM`0R]D(T-X.T=\\/T=\\.T=\\.T-X." + "T-X.SMP+S=L*S-H)R]D(T-X-Y_8FZ/H''>H'(=W_(='O#9FFC)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D3%*+3E*22$F*2DN,3$^-8FJF9W&F)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+SIKCY?!BI.^C9:`I:[8" + "M\\+PP]#`Q]0#R=<&R]D(T=\\.V>@8U.(2SMP,S-H)R=<&Q=,\"PL__OLO[N\\CWN,7T" + "N,3SN<;TL+OJ)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DQM0\"W^P;Y/$@ZODH[OTL[OTL[/HIZODH" + "ZODHZODHZ_@GZO,1U.(1TM`/UN03V><6VN@7W.H9" + "W>L:WNP;WNP;WNP;WNP;WNP;WNP;W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9" + "W.H9W.H9V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8W>L:W^TL:LK[JBI6_T-\\.U.(2" + "U>,2U>,2U>,2TM`/T=\\/T=\\/S=L*R]@(T-X-S=L*R]D(QM0#R]H)T=\\/T=\\/T-X." + "T-X.S]T,S=L*S-H)S-H)Q-'`W^X=Z?@GZ/<6V><6V><7V><7VN@8VN@8VN@8VN@8" + "V^D9V^D9W.H:W.H:W.L;W.H:VND9V>D9VN@9VN@9V>@9V>@8V>@8V>@8VN@9V>@8" + "VN@9VN@9VN@9V><8V><8VN@9V><8V><8V><8V>@8V>@8V><8VN@9V>@8V>@9V>@8" + "V><8VN@8V>@8V>@8V>@8V>@8V.<7T^$2M<+RP]#`S-H*S]T-T=\\/TM`0T^$1T^$1" + "TM`0TM`0TM`0TM`0TM`0TM`0TM`0T=\\/T=\\/T=\\/TM`0T=\\/T-X.T-X.S]T-SMP," + "SMP+S-D)PLW]H:S;=G^N.D5T)S-D+3EJ='JX;W&T;G.Y<'C\"=7[(>(++?(C1?XK4" + "@8S6@HS6@(G3=W_'9&BC)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D-T%T6%R;3%&23U\"53E\"36V&=H9X.T;XN`?Z?8E[?LJ[_XM[?PK" + "Z_HIZ_DHZ_DGZO@FZO@GZO@GZO@GZODHZ_DHZO@GYO4DXN`?WNP;V.85TM`.Q]0\"" + "O,CVML3OM,2TM`/U>,2V><6" + "V^D8W.H9W>L:WNP;WNP;WNP;WNP;WNP;W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9" + "W.H9W.H9W.H9W.H9V^D8W.H9V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8W.H9" + "X.X=X_$AZ?82NTM`0U.(2" + "U>,2U>,2U>,2T=\\/T=\\.T=\\/T=\\.T=\\/T=\\/T-T-Q]4$S]T,T=\\.S=L*S]T,T-X." + "T-X.S]T-S=L*S-H)R]D(R-8%R=<%Z/<6V><6V><7VN@7VN@7VN@8VN@8" + "V^D9W.H:W.H:W.H:W.H:V^H:VNH:V>D9VN@9VN@9V>@9V><8V>@8V>@8VN@8VN@9" + "V><8V>@8V>@9V>@9V>@8VN@9V>@8V>@8V><8V>@9V>@8V>@9VN@8V>@8V>@8V>@8" + "V>@8VN@8V>@8VN@9VN@9V><8V.<7S=L-M<+QQ=,#S=L+T-X.T=\\/TM`0TM`0TM`0" + "TM`0TM`0TM`0TM`0TM`0TM`0TM`0TM`0T=\\/T=\\/T=\\/T-X.S]T-SMP,S-H)QM,\"" + "J;/C=X*Q-4!Q)S-D)S-D)S-D)S-D)S-DU='N`=7W%>H/.?HG4@HW:AI'?B9/A" + "AY+?AY+?A)#<>H3-8F>@)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D76&=4E>;45694%6855N9<7TM`1S-H*R-8%Q-(!P,W]OL9W^P;X>X=Y/(AZ?\\>W>H9U^44S]P+P\\__NL?U" + "ML3PM,2TN$0" + "U>,2V><6V^@7W>L:WNP;W>L:WNP;WNP;WNP;W>L:W>L:W>L:W>L:W>L:W.H9W.H9" + "W.H9W.H9W.H9W.H9W.H9V^D8W.H9V^D8V^D8V^D8V^D8V^D8V^D8VN@7VN@7VN@7" + "V^D8W>L:X.X=Y/(BZ_HI[_XN[OTMZ_HJZODHZODHZ?@HZ?@HZ?@HZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ/<6V><6V><6VN@7VN@7VN@8VN@8" + "V^D9V^D9W.H:W.H:W.H:W.H:VNH:VNH:VND9VN@9VN@9V>@8V>@8V><8V>@8V>@8" + "VN@9VN@9VN@9V>@8VN@9V><8V><8V><8VN@9V><8V>@8V>@9VN@9V>@8VN@8V>@8" + "V>@8V>@8V>@9V>@8V>@8V><8U^86Q=,$N<;UR-8%SMP,T-X.TM`0TM`0TM`0T^$1" + "TM`0TM`0TM`0TM`0TM`0T=\\/TM`0T=\\/T-X.S]T-SMP,S=L*R=<&M\\+QBI3$2%.\"" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D:G*M?8/'?X?.@HS7AI+?BI;DC)CGCIGI" + "C9CHB);DAI+A<7K#65^4)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D55N47%^E6%F@6%NA55R>;'.P3E:&)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D,SYOF:',EI_*F*'-" + "HJS7M+_LQM,\"R=8%R]@(R]D(S]T,V.86U>,3S=L+Q]4%P]#`P,S\\O,GYN<;UN,7T" + "NL;UOL9WNP:X.TY?,A" + "ZO@F[?PK[_XM[_XM[OTL[?PKZ_DHZ?8EY/(AX.X=V^D7U>,2R]D(O\\SZNL?TM\\7Q" + "M\"A9(#!E)(S!@)3)C*#5F*SAI*SEJ*#9G%R-58FN5R-8%S-H)R]D(R]D(" + "R]D(R]D(R]D(R]D(R]D(R]D(RM@'RM@'RM@'RM@'RM@'R=<&R=<&R=<&S=H)T^$0" + "U>,2TM`/U>,2V><6VN@7W>H9W>L:WNP;WNP;WNP;W>L:W>L:W>L:W>L:W>L:W.H9" + "W.H9W.H9W.H9W.H9W.H9W.H9V^D8W.H9V^D8V^D8V^D8V^D8V^D8V^D8VN@7VN@7" + "VN@7VN@7V^D8W>L:X.X>Y?0C[/LK\\/\\O[OTMZODIZODHZ?@HZ?@HZ?@GZ?@GZ?@G" + "Z?@GZ?@GZ?@GZ/@R]D(T^$1" + "TM`0TM`0T=\\/TM`/T=\\.T-X.T-X.T-X.T=\\/T=\\.SMP+S]T,R]D(R]D(S=L*S=H)" + "RM@'S]T,S-H)R]D(RM@'R=<&J[?DY_8FZ?@GZ?@GZ?@HZ?@HZ?@HZ?@HZ?@HZ?@H" + "Z/H9T^$0" + "R=8$P<6V><6V><7V><7V><7VN@8VN@8" + "V^D9V^D9W.H:W.H:W.H:W.H:V^H:V^H:VND9VND9VND9V>@9V>@9V>@8V>@8V>@8" + "V>@8V>@8V>@9V>@8V>@8VN@9V><8V><8V><8VN@9V>@9VN@9VN@8V>@8V>@8V>@8" + "V>@9V>@8V>@8V>@8V>@8V>@8UN45OXC65V&K65R?5%N0)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D2U.(8VFN8&*J862K7&\"F96NM86B;)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DAX^]FJ/-FZ70" + "H*G5K[KFP03U^45S]T-Q]4%P]#`O\\S\\O,CXN<;UN,7T" + "NL?VLKWK*C9G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D.45VU^03VN@6V^D7WNP:X.T\\>X_$@Y_4DZ_DH[OPL\\?\\N[OTLY?0CW^T*#5F*SAI*SAI*39H#AI+#A=%LK[KR]D(R]D(R]D(" + "R]D(R]D(R]D(RM@'RM@'R]D(RM@'RM@'RM@'RM@'RM@'RM@'RM@'R=<&R=<&RM@'" + "S-H)TM`/U>,2TM`0U.(1V><6V^D7W.H9WNP;WNP;W>L:W>L:W>L:W>L:W>L:W>L:" + "W>L:W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8V^D8" + "VN@7VN@7VN@7VN@7W.H9WNP;X>\\?Y_4E[?PL[_XN[/LKZODIZ?@HZ?@HZ?@GZ/L:T^$0R=8$" + "PL[]P,SZP<6V><6V><7V><7VN@7VN@8" + "VN@8V^D9V^D9W.H:W.H:W.H:W.H:V^H:VND9VND9VND9VN@9V>@8V>@9V>@8V>@8" + "V>@8V>@8V>@8VN@8V>@8VN@9V>@8V><8V>@9VN@9V>@8VN@9V>@8V>@8V>@8V>@8" + "VN@9V>@8V>@8VN@8V>@8V>@8U>,4N,7VP8'.<7K&9FNU" + "1TZ8.D&.866T@H?125&#)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-#]Q:&^P:&NR9FVU8VJR96NO:W*J)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D9&Z;H*G3GZC3" + "H:O8J[7BN<5V><6V^D:X_$@Z?X_$?Y?,BZ/8EY/(BVN@7T-X-QM,!O,2T^$0T^(1V.85VN@7W.H9W>L:W>L:W>L:W>L:W>L:W>L:" + "W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8V^D8" + "V^D8VN@7VN@7VN@7VN@7V^D8W.H9WNPL:T^$/R-4#P`:G&X=7RY-4!P" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+3EJFZ//HJO6" + "I*W:J+/?LK[KQM+`R]D(S-H)S-H*S]T,U^45U.(2S-D)PL_`OLO[N\\?VN<;UNL;U" + "OH6T)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D+3EJS]T,T-X1P,X.O\\T1P<\\1RM@1X.T=Y_8E" + "X.XKKOIM<+QO,GYP<[^" + "Q-(!QM0#R-8%R-8%R=<&R=<&R=<&RM@'RM@(QM0$M,2T^$0T^$0V.84VN@7V^D8W>L:W>L:W>L:W>L:" + "W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8" + "V^D8VN@7V^D8VN@7VN@7VN@7VN@7V^D8W.H9W^T=X_$AZO@I\\/XN[_TMZ_HJZ?@G" + "Z?@HZ?@GZ?@GZ?@GZ?@GZ?@GZ/,3UN04U^45UN04U.(2TM`0T=\\/T=\\.T=\\/T=\\/T-X.T-X.T-X.SMP,RM@'" + "R-8%R-8%R=<&R=<&R-8%L[[MNL:U.(0R-4#P<6V><6VN@7V><7V><7" + "VN@8V^D9V^D9V^D9V^D9W.H:W.H:W.H:V^H:VND9VND9VN@9VN@9V>@8V>@9V>@8" + "V>@8V>@8V>@8VN@9V><8VN@9V>@8V>@9V>@8V>@8VN@9VN@8V>@8V>@9V>@9V>@9" + "V>@9VN@9V>@8VN@9V>@8V.<7R]H+ML/RQ=(\"S-H*S]T-T=\\/T=\\/T=\\/T=\\/TM`0" + "T-X.S]T-S-H*R-0#J;/A;'>D*S=H)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C5F8+*>H7.8.PI:W9" + "IJ_,2T^$0TM`/U^44V><6V^D8W.H9W>L:" + "W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8" + "V^D8V^D8V^D8VN@7VN@7VN@7VN@7VN@7VN@7VN@7W>L:X.X=Y?,BZ_HJ\\/\\O[OTM" + "ZODIZ?@HZ?@GZ?(1RM@&PL[]PHV.85V><6V><6V><7V><7V><7" + "VN@8VN@8VN@8V^D9V^D9W.H:V^H:V^H:V^H:VND9VND9VN@8VN@8VN@9VN@9VN@8" + "V>@8VN@9V>@8VN@9VN@9VN@9V><8V>@8V>@8V>@8V>@8V><8VN@8V>@9VN@9VN@9" + "VN@9VN@9V>@9VN@9V>@8U^86Q=,$NL;VQM0$S=L*T-X.T=\\/T=\\/T=\\/T=\\/S]T," + "S-H)Q,__GZG87&:4)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D;G6\\65^O:&JUA(;0D9CCF*#JF:3Q" + "E:#OB)3E>H',AXK23UF,)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D4EN3@8?-@HK4AY#<@8O5?(/+;G6N" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D/$=WI*W9" + "J;+?J[;CK[KGM<'NR=8#S=H*SMP+S]P,TM`0U^45T-X.QM0$OLO[N\\?WNL?VO,CW" + "J+3B)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D>H:`N<8)O,L/OL9WNP:W>L9VN@7RM@'N\\?UN<;RN<7QN,7QN,7QN,3PM\\/N" + "ML+NM\\/ON,3OHZ_;8FV;?8BVG:C4FJ;2FZ?4GJO7H[#=J;?CL+WLM\\3SO,GYP,W]" + "P\\__Q=,\"R-8%R-8%R=<&R=<&R=<&R=<&RM@'R]D(Q=,#ML3TKKWLL+[MML3TN<6V^D8" + "W.H9W>L:W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8" + "V^D8V^D8V^D8V^D8V^D8VN@7VN@7VN@7VN@7VN@7VN@7V^D8W>L:X.X>YO4D[?PL" + "\\/XO[/LKZ?@HZ?@HZ?@HZ?@GZ?@GZ?@GZ?@HZ?@GZ?@GZ/,2W.H:W>L;WNP86V><6V><6V><7V><7" + "VN@7VN@8V^D9V^D9V^D9W.H:V^H:V^H:V^H:V^H:V^D9VN@9VN@8VN@9V>@8VN@8" + "VN@9V>@8V>@8V>@9VN@9VN@9V>@9V>@8V>@8VN@9VN@9V>@8V>@8V>@8VN@9VN@9" + "VN@9VN@9VN@9VN@9V>@9UN45OLO]O8'/FZ7R" + "EJ'ODISK?875:FJM3%6))S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-4!RBX[2BY'>CYGGCYCFAY#;@HC'" + ",#MK)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D>H6S" + "J[;BK+CDK[OHML+POLGUS=H*SMP+S]P,T=\\.UN04TM\\0R-8&O\\O[O,CXN\\?VO(0U>,1VN@6W.D8W.H8W.D7V>85R=8%N\\?UN<;RN<7QN,7QN<7QN,7PM\\/N" + "N,3PN<3PDY_*,CUN)S-D)S-D0$Q[@8VZHJW:HZ_;IK/?J[GFL;[MM\\3RO,GXP,W]" + "P\\__Q=,\"Q]4$R-8%R-8%R-8%R=<&R=<&R=<&R]D(RM@(P,W^M,1" + "V.85VN@7V^D8W.H9W.H9W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9W.H9" + "W.H9V^D8V^D8W.H9V^D8V^D8V^D8VN@7VN@7VN@7VN@7VN@7VN@7W.H9WNPH:V^D9VN@8V.86T^$1S]T,S-H)RM@(R-8&R-8%Q]4$QM0#" + "QM0#QM0#Q=,\"NL;TG*C5X.\\?Z/U*C5F)S-D)S-D)S-D)S-D)S-D2%.#BY7\"JK7AK;KGLK_MM\\3RO,CXO\\S\\" + "PL__Q-(!QM0#Q]4$R-8%R-8%R-8%R=<&R=<&RM@'S-H)R=<'OLO\\M\\7UN,;VO>8:S;'BE:W>E@8Z[F:;4LK[LQ=,\"RMD'" + "Q]4$OL:W>L:W>L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9W.H9" + "W.H9W.H9W.H9V^D8V^D8V^D8VN@7V^D8VN@7VN@7VN@7VN@7VN@7VN@7VN@7W.H9" + "W^T(2PML+QK;;B:G.>EJ/1P\\_^Q-#_Q-#_Q='`Q-#_Q-#_" + "Q='`Q-#_Q-#_Q=#_Q-#_Q-#_Q='_Q-#_Q-#_Q-#_Q='`Q-#^KKGFQ]0!QM+`Q='_" + "Q='_QM+`QM+`QM'_Q=#_Q='_Q='_Q='_QM'_QM'_QM'_QM#^Q<_^Q,[]P\\W[P8'/CY?H>G[#.T9X)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D:'&JF9[IG:;RHJOXGZGVEI_L" + "@X;$*35F)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ";'BFK[KGK[OHLK[LN,3SOLCUSML+S]P,T-X-T^$1T^$1RM@(P<[^O,CXO,CWL+SK" + "*C5F)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D86VDL;[_O(;L:W>L:W>L:W>L:W>L:W>L:W.H9W.H9" + "W.H9W.H9W.H9W.H9V^D8W.H9V^D8V^D8VN@7V^D8V^D8V^D8VN@7VN@7V><6VN@7" + "V^D8W>L:X.X>Y?,C[?LK\\/\\O[OTMZ_HIZ?@HZ?@HZ?@HZ/`?W.H9U^45T^$0S]T,S=L*R]D(R=<&R-8%Q]4#Q-'`" + "O,CVIK+>L+WLV><6XN`?YO0CY_8EZ/<7V><7VN@8VN@8VN@8V^D9V^D9W.H:V^H:V^H:V^D9V^H:VND9VN@8VND9VN@8" + "V>@8V>@9V>@8VN@9V><8VN@9V>@8VN@8VN@9VN@9VN@9VN@9VN@9VND9VND9VND9" + "VN@9VND:VN@9V^D:V><8S=P-M\\/RP]#_R-4%P'_%E9CBE:#PD9[PD)OOE)[Q" + "F:/REZ'N<7C'@H?'+CIK)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D.D5XG:'GHZOUJ+#]J++^H*SX" + "F)_F6V*6)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "*35FF*/0L;SILK[LM<'PM\\'NS-H)SMP+S]T,TM\\/TM`0R]D)PL__OXGCEJ#SJKD$;7G.>X39GJKX" + "FJ;RF:/MN,+RQM/]V.43VN<5VN<6U^03R-8$N\\;QN<3MN<7PNL;RO,CTGZO8/TM[" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D7&>6G*C7N<;UOLO[" + "P<6V^D8W.H9W>L:W>L:W>L:W>L:W>L:W>L:" + "W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8V^D8V^D8VN@7VN@7VN@7VN@7" + "VN@7VN@7W.H9WNP;X>\\?Y_8E[OTM\\?\\O[?PKZ?@HZ?@HZ/;7FDG*G7Q-#_Q-#_Q-#_Q='_Q-#_Q-#_" + "Q-#_Q-#_Q-#_Q='`Q-#_Q='_Q='_Q-#_Q='_Q='`Q='_Q,_]KKGFQ]0!QM'_Q=#_" + "Q='_QM'_QM'`QM'`QM'_QM'`QM'_QM'`QM'`QM#^Q<_]P\\[\\PLW[P<7V><7VN@8VN@8V^D9V^D9V^D9V^H:V^H:V^H:V^H:VND9VN@8VN@8VN@9" + "V>@8V><8V><8V>@9VN@9VN@9V><8VN@9VN@9VN@9VN@9VN@9VND9VN@9VN@9VN@9" + "VND9VND9V^D9VND9V.87R-8'NL;UP,S\\G:C73EB')S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D=(#!=7S/=GW*B(W6CI/>EY_J" + "E9_MDIOIC)3>>X&_)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DA8W)IZ[VJK3^K+@!JK;`" + "H:OWE9O8.D5V)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D35F(K+CELK[LM<'PN<7TP<6V^D8W.H9W.H9W>L:W>L:W>L:" + "W>L:W.H9W.H9W.H9W.H9W.H9V^D8V^D8W.H9V^D9V^D8V^D8V^D8V^D8VN@7VN@7" + "V><6VN@7VN@7V^D8V^D9W^T85SML*Q,_^P,S[P,S[P,S[PIK/BP,OY:'&;B)3#O,CWI:_<;WNHGJO:Q-#_Q='`Q-#_Q='`Q='`Q-#_" + "Q-#_Q-#_Q=#`Q-#_Q='`Q='`Q='`Q-#_Q='`Q=#_Q-#_O,;TJK7BQ]+`QM'`QM'`" + "Q-#^QM'`QM'_Q='_QM'_QM'`Q]+`Q]'_QM#^Q,[]P\\[\\PLW[P<6V><7V><7VN@8VN@8V^D9V^D9V^H:V^H:V^D9V^H:V^D9V^D9VN@8VN@8" + "V>@8V>@9V>@8V>@8VN@9VN@9VN@9VN@8VN@9VN@9VN@9VN@9VN@9VN@9VN@9VND9" + "VND9VND:VN@9VND9U^86Q-(\"L+SJ9&^>)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D3%:,DYSBD)WKB)7FAY+AEJ#K" + "E:#MDYSIDIC=4EF+)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D4UV3J;#TK+7^K[H\"K[L#" + "J[@!HZWVC9+/+SML)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D:G:EL;WKM,#OM\\/RM\\/OSMP+S]T,T-X-T-X.R]D(PL[^OLKZM\\+Q+CIK" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D.45X" + "K;;[NL8-O(>R>8BTBIC(I[7DK+OJ35>&'2E:\"15&" + "!!!!#AE+\"!-$*35?2U)\\E)[*O\\OZR=<&RM@'RM@'R]D(RM@'RM@'R=<&R=<&R=<&" + "R=<&R-8%R-8%R-8%R-8%RM<&SMP+T^$0TM`/T=\\.U>,2V><6W.H9W>L:W>L:W>L:" + "W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8VN@7VN@7" + "VN@7VN@7VN@7VN@7VN@7V^D8W.H9W^T<6S]P+Q-#_P<7V><7VN@8VN@8V^D9W.H:V^D9W.H:V^D9V^D9V^D9VND9VN@9" + "VN@9VN@9V>@9VN@8VN@9VN@9V>@9VN@9VN@9VND9V>D9VND9VND9VND:VN@9VND9" + "VND:V^D:V^D:VN@9UN05LK[O04Q\\)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D45N2CYC=F:/LF:/LEZ#K" + "EI[HE)S@EIW:.$%Q)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-DCI;4K;7[L+L\"L;T%" + "L+T%K;H!IK#XBY'*,#ML)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D@X^^M,#OML+QNL;TQ=,!S]T,S]T-S]T-R=<&PL[^O\\O[FZ?6)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D4%V5" + "HZSQK;;^OHBU?(NXC)O*J;CGKKSK252\"'\"A9\"!1%" + "!1%\"(R]A(\"Q>'RI7\"Q9',CIG0TISF*+/QM0#RM@'R]D(RM@'RM@'RM@'RM@'R=<&" + "R=<&R-8%R-8%R-8%R-8%R-8%R-8%R=<&S=L*T^$1T^$0T-X-U.(1V><5V^D8W.H9" + "W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8W.H9V^D8V^D8V^D8" + "VN@7VN@7VN@7VN@7VN@7VN@7VN@7V^D8W>L:X.X>YO0D[?PL\\/\\O[?PLZ?@HZ/\\?V><6T-T+Q='`P,S[PCIO)O\\S[H:G6<7V><7V><7VN@8V^D9V^D9V^D9V^D9V^D9V^D9V^D9VND9VND9" + "VN@9VN@9VN@9VN@9VN@9VN@9VN@9VN@9VN@9VN@9VND9VND9VND9V^D:V^D:VND9" + "VND9VN@9V^D:VN@9U.(2BI;')S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D9&^GFZ'DEYWBEYSA" + "F)WCF9[BBI'+)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D1U*&I[#QL+G_LKT%" + "L[\\&L[`'K[T$J[3\\D9K5/4AY)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D*35FB)3\"ML+PNL;UNL7TSMP+S]T,S=L*R-8%P)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D?HS%" + "J[C`HJ[\\L+P$N,8.L;`*FJ?WF*7UI[/`@HS?H:VM<'PQ=,\"Q]4$Q]4$R-8%R-8%R=<&R-8%RM@'S-H)T=\\/" + "V.86T^$1S-L*R-8&Q]4$QM0#Q=,\"Q-(!PL__P]#`R]D(S=L*R]D(RM@'R]D(S-H)" + "R]D(R]D(R]D(R]D(S-H)R-8%M\\7TCIK*?HNY@8^^D)[-JKGHKKSK2E6#'2E:!A)#" + "!A)#(S!B*35H)C-E(2Y?)B]='2=6.T)KA(ZYQM8$RM@'R]D(RM@'RM@'RM@'RM@'" + "R=<&R=<&R=<&R-8%R-8%R-8%R-8%R-8%R-8%R=<&S-H)TM`/T^(1T=\\.T^$0V.85" + "V^D7W.H9W>L:W>L:W>L:W>L:W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8" + "V^D8V^D8VN@7VN@7VN@7VN@7VN@7V><6VN@7V^D8W>L:X>\\?Z/8:SL;[MN<3R;'2?D)[+P,W\\G:;1=8&NIK/BQ='`Q='`Q-#_Q-#_Q='`Q='`" + "Q-#_Q-#_Q='`Q-#_Q='`Q='`Q='`Q=#_M;_MJ;3AQ-'_Q=#^O\\GVQM'`QM'`QM'_" + "Q=#_QM'_QM'_Q]'`Q=#^Q<_]Q,[]PLW[P<7V><7VN@8V^D9V^D9V^D9V^D9V^D9V^D9V^D9V^D9VN@9" + "VN@9V>@9VN@8VN@9VN@9VN@9VN@9VND9VND9VND9VND9VND9VND9V^D:VND9VND:" + "V^D:V^D:VND9VN@9T=\\/86T)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D,#ML?HJYML+RQM0\"Q]4$Q]4$R-8%Q]4$R=<&R=<&S-H)" + "S]T,T^$0T^$1T=\\.S=L+R]H)RM@'R=<&RM@(S=L+SMP+S-H)R]D(R]D(R]D(R]D(" + "RM@'R]D(R]D(R]D(S-H)R=<&M\\3TD9[-@Y\"_B);%DJ'0K+SJK[[M8W&@(BYA\"!1%" + "!A)#(C!A*35G*SAJ*SAJ*C9H(2Y@)C%?$1Q)H*S9RM@'R]D(RM@'R]D(RM@'R=<&" + "RM@'RM@'R=<&R=<&R-8%R-8%R=<&R-8%R-8%R-8%R-8%R=<&R]D(T=\\.U.(1TM`/" + "TM`/V.85VN@7W.H9W>L:W>L:W.H9W>L:W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8" + "V^D8VN@7VN@7VN@7VN@7VN@7V><6V><6V><6V><6VN@7W.H9WNP<7V><7VN@8VN@8V^D9V^D9V^D9V^H:V^D9V^D9V^D9V^D9" + "VND9VND9VN@8VN@9VN@9VN@9VN@9VN@9VND9VND9VND9VND9VND9V^D:VND9V^D:" + "V^D:V^D:V^D:V><8S=L,5V*1)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D,CYP0DQ_" + "04M^)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*35FB)3/L+K^" + "LKP!M+\\&ML,*ML,+M<0+M,$)LKX%GZCG9W\"F*C9G)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D=8*QML+RM;[KR]D(R=8%Q=(!NL7U3%B()S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*C9G:'2LH:WMO,D-O#Q]4$RM@(R]D(R]D(RM@'RM@'" + "RM@'R=<&R=<&R=<&R=<&R=<&R=<&R-8%R-8%R-8%R-8%R-8%R-8%R-8%RM@'T-X-" + "U.(1TM`/T-X-U^44VN@7V^D8W.H9W.H:W.H9W.H9W.H9W.H9W.H9V^D9W.H9V^D8" + "V^D8V^D8VN@7VN@7VN@7VN@7V><6VN@7V><6V><6V><6VN@7VN@7W.H9W^T=Y?0D" + "[OPL\\O`P[OPLZ?@GZ/8*NNL;UH:K7;7>DGJK9P\\_^" + "?H:P@8VZML+PML#M;GBCE:+0PL_^F*',>(2QJ+7DQ-#_Q='`Q='`Q='`Q-'`Q-#_" + "Q-#_Q-#_Q='`Q='`Q='`PL[\\J++?M,#MQ],!Q-#^PL[]P\\_\\OLGUQ='_QM'_QM'_" + "QM'`Q]'_QM#^Q,[\\Q,[\\PLS[P<7V><7VN@8V^D9V^D9V^D9V^D9V^D9V^D9V^D9V^D9" + "VND9VND9VND9VN@9VND9VND9VN@9VND9VND9VND9VND9VND9VND9V^D:V^D:V^D:" + "V^D:V^D:VN@9V.87Q]0$,S]O)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+SMME9_<" + "L;K^L[T\"M+\\&M<()ML0+M\\0,M\\0,M\\0+M<$%H:OJ<'JR,CYO)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D4EZ/G*C5N,'LQ='`J+3C3UJ*)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D56\"4AY'-KKGZO)S-D)S-D)S-D" + ")S-D-$!Q:'2D')S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-4%RA)\"_N<;VQ]4$Q]4$R-8%R=<&" + "R=<&R=<&R]D(S-H)SMP+S]T,SMP+S=L*S-H)R]D(RM@'RM@'RM@'RM@'R]D(R]D(" + "RM@'RM@'R]D(R]D(R]D(RM@'OD9_.E:/2G:K:JKCGM,+RLL#O?8^`-T9X" + "+#IO\"15&$!Q-(BY?*SEJ+SMM+CMM(2Y@!A)#$!E&ML+QR]D(R]D(R]D(RM@'RM@'" + "RM@'R=<&RM@'RM@'R=<&R=<&R=<&R=<&R=<&R-8%R-8%R-8%R-8%R-8%Q]4$R-8%" + "RM@'SMP+U.(1TM`/T-X-U>,2V><6V^D8V^D8W.H9W.H9W.H9W.H9W.H9W.H9W.H9" + "V^D8V^D8V^D8V^D8VN@7VN@7VN@7VN@7VN@7VN@7V><6V><6V><6VN@7V^D8W>L:" + "X>\\>Z/<7VN@8VN@8VN@8V^D9W.H:V^D9V^D9VN@8VND9" + "VND9VND9VND9VND9VND9VN@9VN@9VND9VND9VND:VND:VND:VND:V^D:V^D:V^D:" + "V^D:V^D:V^D:UN05O8F\\" + "2EB-/4R\"#!A*!1%\"$1U.)#%B*SAI'RQ=!1%\"#AA&LK_NR]D(R]D(R]D(R]D(RM@'" + "RM@'RM@'RM@'R=<&R=<&R=<&RM@'R=<&R=<&R=<&R=<&R=<&R=<&R-8%R-8%R-8%" + "R-8%R-8%R=<&S-H)T^$0U.(1T=\\.T^$0V.85VN@7V^D8W.H9W.H9W.H9W.H9W.H9" + "V^D8V^D8V^D8V^D8V^D8V^D8VN@7VN@7VN@7VN@7V><6VN@7V><6V><6V><6VN@7" + "V^D8WNP;XN`@Z_HJ\\?\\P[OTMZO@HZ/H:T^$0" + "R-8$P'^KAI*_N<;TL;SI;GFEF*33P\\_^D9O'>H:SK+GHQ-#_Q='`Q='`Q-#_Q='`Q='`" + "Q='`Q=#_Q-#_OLGWI:_87V><7VN@8VN@8V^D9V^D9V^D9V^D9V^D9V^D9" + "V^H:VND9VND9VN@9VN@9VN@9VND9VND9VND9VND9VND:VND:VND9VND9V^D:V^D:" + "V^D:V^H:VN@9U.(3J+3D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "+#AI?HK#KKG[L;O_L;P!L[X%ML$)M\\0+N,8-NL8.NL8.N<8.N<8-M\\,*LKX!H:WM" + "C);2='ZW7VJ>2%2'+3EJ)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+3EJ0TY_" + "8&J>?(6]DIS7IK#PM\\(#OHR`3ER0156+'BM@\"!1&!1%\"#AE*!Q-$!!!!$!M(M\\3SR]D(R]D(R]D(R]D(RM@'" + "RM@'RM@'RM@'RM@'RM@'R=<&R=<&R=<&R=<&R=<&R=<&R=<&R=<&R=<&O,GXP]#`" + "R-8%R-8%R-8%R-8%R-8%R]D(TM\\.U.(1T=\\.T=\\.UN03V><6V^D8V^D8W.H9W.H9" + "V^D8V^D8V^D8V^D8V^D8V^D8VN@7V^D8VN@7VN@7VN@7V><6VN@7V><6V><6V><6" + "V><6VN@7V^D9W^T(1R=<$" + "PX:TKKOIQ='`Q='`Q='`Q-#_Q='`Q='`" + "Q-#_Q-#^NP\\_]Q-#^Q-#^Q-#^Q,_^P\\_^P\\_^OLCTQ-#^QM'_QM#^Q,_]" + "P\\[\\PLW[P<7VN<8VN@8VN@8V^D9V^D9V^D9V^H:V^H:" + "V^D9VND9VND9VND9VND9VND9VND9VND9VND:VND:VND:VND:VND9V^D:VND:V^H:" + "VND:VNH:V>@9TM`1C9C()S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D7&B>HJWML;K^L+K_L[X#L[`%ML()N,0+N,4-N<8-N\\<.N\\,2V><6VN@7V^D8" + "W.H9V^D9W.H9V^D8V^D8V^D8V^D8V^D8V^D8VN@7VN@7VN@7VN@7V><6V><6V><6" + "V><6V><6V><6VN@7W.H9X.X>Y_8F[_XN\\/\\NZODIY_8FY_8FY_8FY_8EY_8FY_8F" + "Y_8EY_8EY_8EY_8FY_8EY_8EY_8EY_8EYO4EY_8EYO4DY/(BWNP;UN,2R]@&PL[]" + "P,S[P,S[PX>UK[SKQ='`Q-#_Q='_Q='_Q='`Q-#_" + "P\\_^LKSIJ[;CP\\_]P\\_]P\\_]P\\_^P\\_]P\\_]Q,_^P\\_^P,OXQM'_Q=#^Q<_]Q,[\\" + "PLW[PGU>,2UN03UN04UN04U^45V.85V.86V><7V><7VN@8VN@8V^D9V^D9V^D9V^H:" + "V^H:V^H:V^H:VND:VND:VND9VN@9VND9VND9VND:VND:V^D:VND:VND9V^H:V^D:" + "V^H:V^D:V.<7S]T.;'>G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D,S]Q?HK#J;/TL;K^K[K_L;T#L[\\&M<((M\\,*N<4-N<4-N<8.N\\HZ[<6V><6V><6" + "V><6V><6V><6V><6VN@7V^D8W>L;XO$@Z_HJ\\/\\O[OTMZ?@HY_8FY_8EY_8FY_8F" + "Y_8EY_8EY_8FY_8FY_8EY_8EY_8EY_8EY_8EYO4EY/,BW^TH>SM,'PL;OH:G2?E*#/P<[]DYS(>(2RK+CGPL[\\" + ";76ABI?%O,CXJ[7A<'RIG*G8Q-#_B(VX>86QL+SKQ='`Q='`Q='`Q='`Q='_P\\[]" + "KKCEL;WKQ=#^P\\_]P\\_^P\\_^P\\_]P\\_^P\\_^P\\_^Q-#^Q,[\\Q<_^Q,[]Q,[\\PLW[" + "P<7VN@8VN@8V^D9V^D9V^D9W.H:" + "V^H:V^D9V^H:V^H:VNH:VND9VND9VND9VND9VND9VNH:VND:V^H:V^H:VND:V^D:" + "V^D:VND:U^86R]@)/TIZ)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D/TM^B)//K;;VKKG[L+K_L+T\"LK\\$M+`'M<((ML,*M\\0+" + "N,0,N<4-N<8,NL8-NL8.NL8.NL8.NL8-NL<.NL<.NL<.N\\<.N\\<.NL<.NL8-N<4+" + "ML0*M+`'L;T$K;D!JK7]IK'ZI*[WH:OTH:?QGJ3MGJ/IEIW=>H&Z.T=Y)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D15*\"EJ/3PL__R-8%R-8%R-8%R=<&R-8%R=<&R=<&R=<&R=<&R=<&" + "R=<&RM@'RM@'RM@'R]D(R]D(R]D(RM@(PL__M<3SLL#PM<6VN@7" + "V><6V><6V><6V><6V><6V><6VN@7W.H9W^TB@8R[M\\/RKKCF;'>BEJ/2PL[]D9G%>H:TKKKHPBYC&OLKYJ;+?;WNHGZS:Q-'`@HFS>8>SLK_NQ='`Q='`Q='_Q-#_PL[\\J;/?" + "N,3QP\\_]P\\[]Q-#^Q-#_P\\_^P\\_^Q,_^Q-#^Q=#_P\\[[Q<_]Q,[]P\\W\\PLS[P<7V><7VN@8VN@8V^D9V^D9W.H:" + "V^D9V^H:V^H:V^H:V^H:VNH:VND:VND:VND9VND9VNH:VND:VNH:V^H:V^H:V^H:" + "V^H:VND:UN45N<7V)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D/TM]?(B_GZGFKKG[K[G\\L+G^L+O`L;X\"L[\\%" + "M+`'M,$'M<$)M<$)ML()ML$)M,$)M<()M,$(M,$'M,$'LK\\&LKT%K[L\"K[H!KK?_" + "J[3]J;/[I['XIJ[UHZSSH*GPH:;MH*7KFZ'DA8W)7FB>+#AI)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D3%B)FZ?7P]#`R-8%R-8%R-8%R-8%R-8%R=<&R=<&R=<&" + "RM@'R=<&RM@'RM@'RM@'RM@'R]D(S-H)RM@(O\\S]M\\7VN,7UN\\CXO\\S\\PL__OLS\\" + "P,W]P<[^PL__P]#`P]#`N\\GYLL#QJ;CHKKSLOLO[R]D(R]D(R]D(R]D(R]D(R]D(" + "R]D(RM@'RM@'RM@'P]#`I[3C>(:S<'RK>(:UD9[.G*C8=G^M;G>CI[+?R-4$S-H)" + "R]D(R=<&R=<&R=<&R=<&R=<&R-8%R-8%R-8%Q]4$Q]4$QM0$Q]4$Q]4$RM<&T=\\." + "T^$0S-H)T=\\.V^D8V^D8V^D8V^D8V^D8V^D8V^D8VN@7VN@7VN@7VN@7VN@7V><6" + "VN@7V><6V><6V><6V.85V><6V><6V><6VN@7W.H9X.X>Y_4E\\/XN\\/\\OZODIY_8F" + "Y_8EY_8EY_8FY_8FY_8EY_8FY_8FY_8EY?,CX.X=V.85SML)P\\_^P,SZP,S[PAA)&^N,7SK+;D;GFDF*;4PL_^C9;\">X>TK[SKP,SZ" + ":W2>C9K)OLOZIJ_<;WNGH*W;Q-'`AHZYC)K)O,GWQ='`Q='`Q='_P,OYIK#<7VN@8VN@8VN@8V^D9V^D9" + "V^D9V^H:V^H:V^H:V^H:V^H:VND:VND:VND:V^H:V^H:V^H:V^H:V^H:V^H:V^D:" + "V^D:VND9U>,4H:W>)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D3UN/?XO$G*;CK;;WKKCZKKC\\" + "K[C]L+K_L;K`L+K`L;P\"L+P\"L+P\"L+P\"K[L!K[L!KKG`K;C`K+?_JK3\\J;/[J;+Y" + "IJ_WI:[UHZOQHZKPHZONFZ/CAI#+8FRB+SMM)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D5%^0GZO;Q-(!Q]4$R-8%R-8%R-8%R=<&R=<&" + "R=<&R=<&R=<&RM@'RM@'RM@'RM@'R]D(S=L+R]D*P,W^O,GZO(:S=(*OA9/\"GZS<6V><6V.85V.85V><6V><6V><6V><6V^@8W>L;X_$AZ_HJ\\?\\P[OTM" + "Z?@HY_8FY_8EY_8EY_8FY_8FY_8EY?0CX>\\>VN<6S]P+P\\_^O\\OZP,SZPCIO)O\\OZI*S9<'NGHJ_P,SZP\\_]" + "P\\_]P\\_^Q,_^P\\_^P\\_]Q-#^Q=#_QM'`Q<_^O\\KVP\\W\\PLS[P<7V><7VN@8V^D9V^D9" + "V^D9W.H:V^H:V^H:V^H:V^H:V^H:VNH:V^H:V^H:VND9V^H:V^H:V^H:V^H;V^H:" + "V^H:V>@9T^$1@X^`)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-T1U8V^E?8G#" + "D9O9GZGGJ[/SK;?WK;7XK;;YK+7YJ[7ZJ[;ZJ[;ZJK3YJK/XJ;+WJ+#UIJ_SIZ_Q" + "GZGIDYS;A(_*<'RT4%N/*C9G)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D6&25HZ_?Q=,\"R-8%R-8%R-8%R=<&" + "R=<&R=<&R=<&RM@'RM@'R]D(RM@'R]D(S-H)T-X.S]X.P]$!P,W]P,W]P<[^Q-(!" + "Q]4$PL__O\\S\\P,W]P,W]P<[^P<[^P<[^P<[^P]#`S=L*R]D(R]D(RM@'R]D(R]D(" + "R]D(R]D(R]D(RM@'P,W]H:W=>(6S>8>TCYW,J+;FJ;;F/D=T&B97!!!!!!!!!Q)\"" + "2E)]E9[+OLKYR-4$R-8%R=<&R=<&R-8%R-8%R-8%Q]4$Q]4$Q]4$QM0#QM0#QM0#" + "Q=,\"P<[^M<'PV><6V^D8V^D9V^D8V^D9V^D8V^D8VN@7V^D8VN@8VN@7VN@7VN@7" + "VN@7VN<7V><6V><6V><6V><6V.85V><6V><6V><6V>86V><6V^D9WNP=Y?,C[OTM" + "\\?`P[/LKZ/<7NGG:K9P\\_^B)\"]?HNXL[_NOCYS*P,S[H*G5<7VKI;+@QM'`N,3SP\\_^Q='`Q-#_M\\'NJ[;BPL[\\P\\_]P\\_^" + "P\\_^Q-#^P\\_]P\\_^P\\_^QM'_QM'_Q,_]P<.D9X" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D7VN;I[/CQM0#R-8%R-8%" + "R-8%R-8%R=<&R=<&RM@'RM@'RM@'RM@'R]D(S=L*U>,3U.,3QM4$PL_`PL__PL__" + "QM0#Q]4$QM0#P]#`P,W]P,W]P,W]P<[^P<[^R-8%S-H*R]D(RM@'R]D(RM@'R]D(" + "R]D(R]D(R]D(R=<&O\\S\\G*G8>8:S?(FWDZ'1K+KJJK?G.4-P'\"A9!!!!!!!!!!!!" + "!A%\"%A]-/T5PB9/!N<3SQ]0#R-8%R=<&R-8%R-8%Q]4$Q]4$Q]4$Q]4$QM0#QM0#" + "Q=,\"O\\S\\M\\3SV><6V^D8W.H9V^D8V^D9V^D8V^D8V^D8V^D8VN@7VN@7VN@8VN@7" + "VN@7VN<7V><6V><6V><6V><6V><6V.85V>86V.86V><6V><6V><6VN@7W.H:X>\\?" + "Z?\\>VN@7T=\\-Q='`O\\OZO\\OZP,2U>,2UN04UN04U^45V.86V><6V><7VN@8VN@8" + "V^D9V^D9V^D9V^D9V^D9V^H:V^H:V^H:V^H:V^H:VNH:V^H:V^H:V^H:V^H;W.H:" + "VND:U^86Q=,#+CIK)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D9G&AJK?GQM0#" + "R-8%R-8%R-8%R=<&R=<&RM@'RM@'RM@'RM@'R]D(SMP,V><7V><7R=<'Q=,#Q-(!" + "Q-(!Q=,\"R-8%Q]4$R-8%Q-(!PL__P<[^P<[^S=L*S-H)R]D(RM@'RM@'R]D(R]D(" + "RM@'R]D(R]D(R=<&OHBU?8JYF*?6KKSKJ+;E.$%N&R=8!!!!#QQ/%B18" + "+CEF*S5C\"!-$&2)0,CIC?XFUN,/RR-8%R-8%R-8%R=<&R-8%Q]4$Q]4$QM0#QM0#" + "Q=,\"OLOZN\\?VVN@7V^D8W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8VN@8VN@7VN@7" + "VN@7VN@7V><6V><6V><6V><6V><6V.85V><6V><6V.85V>86V><6V.85V><6VN@8" + "WNP;Y/(BZ/<6TM\\.Q],\"P,SZO\\OZP,S[P@BYC$O,2U>,2UN03UN03UN04U^45V.86V>87V><7VN@8" + "VN@8V^D9V^D9V^D9W.H:V^H:V^H:V^H:V^H:V^H:V^H:V^H:V^H:V^H:W.L;V^H:" + "VND9U>04L+SN)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D*35F:W:F" + "K+GIQ]4$R-8%R-8%R=<&R=<&R=<&RM@'RM@'RM@'R]D)S]T,V><7V^D9SMP,R-8&" + "QM0$Q-(!Q=,!Q-(!Q-(!P]#`P<[^P<[^R]@'S=L*R]D(RM@'RM@'RM@'RM@'RM@'" + "RM@'R]D(R]D(R=<&N\\CXE:+1>XJX@(Z]F:G8K[WLIK/C-#UK%R-4!!!!%2%4*#5H" + ")#%D%R59,CQI+3AE\"11$'B=3/D-PJK7DQ]4$R-8%R-8%R-8%Q]4$Q]4$Q]4$QM0#" + "Q=,\"O,GXO<6V><6V><6V><6V><6V><6V><6V><6V.85V.85V.85V.85V.85" + "V><6VN@8W.H9VN@8U^45U.(1SML*QM,\"P,S[O\\OZP,SZP,S[P,S[PQ@(RZML+QN,+P" + "9G\";E*'/PL[]NL;TO,GXQM,!Q='`O\\KWJ;/@P,SZQ<_^Q-#^Q-#_Q-#_Q-#_Q-#_" + "Q-#_Q=#_QM'`Q,_]PLW\\P,2U>,2UN03UN03UN04U^45U^45V>87V><7" + "VN@8VN@8V^D9V^D9W.H:V^H:V^H:V^H:V^H:V^H:V^H;V^H:V^H:V^H:V^H:V^D:" + "V><8U.(2E:+3)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + "*35F;GJJL+SLQ]4$R-8%R=<&R=<&R=<&RM@'RM@'RM@'S-H)SMP+U.(2V.86T^$1" + "S=L+RM@(R-8&QM0#Q=,\"Q=,\"QM4$S-H*SMP,R]D(R]D(RM@'RM@'RM@'RM@'RM@'" + "RM@'RM@'RM@'R-8%NL?WE:'1?XV\\A9/\"FZO:L+[MI;'@.T5S%R-4!!!!%B)4*#5G" + "*SAJ*C=J*35H&299,SUM+S9C\"!-$1E%^O<6VN@7V><6VN@7V><6V><6V><6V><6V><6V>86V><6V.85V><6V.85" + "V><6V.85UN04U.(1S]T-RM<&P]#_O\\O[OLKYP,SZO\\OZP,S[PQ-#_Q='`Q=,!Q-#_O,?TJK7BP\\_]Q,_]Q,_]Q='_Q-#^P\\_^Q-#_Q-#_" + "QM+`Q='_PLW\\PLW[P,2U>,2U>,2UN03U^44U^45V.86V>87" + "V><7VN@8VN@8V^D9V^D9V^D9V^H:V^H:V^H:V^H:V^H:V^H:V^H:V^H;V^H;V^D:" + "V>@8T=\\/=H*S)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D*35F!1%\"#AI)H:_=R-4%R-8%R-8%R-8%Q]4$QM0#QM0#" + "QM0#N,7TQ-#`V^D8W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8" + "VN@8VN@7VN@7VN@7VN@7V><6V><6V><6V><6V><6V><6V><6V><6V><6V><6V><6" + "V><6V.85UN03T=\\.R]D(Q=,\"P<[]OLKYOLKYO\\OZP,SZP,S[P,2U>,2U>,2UN04U^45U^45V.86" + "V>87V><7VN@8V^D9V^D9V^D9V^D9V^D:V^H:V^H:V^H:V^L;V^H;V^H;V^H;VND9" + "U^86S=L,3EJ+)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D+#AI=(\"OLK[NQ]4$R=<&R=<&RM@'RM@'RM@'RM@(S-H)S=L*" + "S]T,T=\\.T=\\/T=\\/T=\\.T-X-SMP+S-H)RM@'RM@'RM@'RM@'RM@'RM@'RM@'RM@'" + "RM@'R]D(RM@'R=<'OLO[H*W=C)G)D9[.F:G8LL'PM\\3TC)K*.TE\\'\"E;\"A9''2E:" + "*C9H+#AJ+#AI+3EK+3EL(2U?!!!!%!]0GJO;Q-(!R=<&R-8%R-8%Q]4$Q]4$QM0#" + "Q=,\"ML+PR-4$W.H9W.H9W.H9W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8V^D8V^D8" + "VN@8VN@7VN@8V^D8VN@7VN@7V><6V><6V><6V><6V><6V><6V><6V><6V><6V><6" + "V><6V.85U>,2T-X-R]@'Q=(!PH>XTM\\/U.(1U>,2U>,3UN03UN04U^45" + "V.86V><7V><7VN@8V^D9V^D9V^D9W.H:V^H:V^H:V^H:V^H:V^H:V^H:V^H:VN@9" + "U>04P<[_*35F)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D+#=H=X.SM,#OQ]4$R-8%R=<&R=<&R=<'RM@'RM@'" + "R]D(R]D)S-H*S-H)S-H)R]D)R]D(RM@'R=<&RM@'RM@'RM@'RM@'RM@'RM@'RM@'" + "RM@'RM@'RM@'RM@'P<[^JK?GE*'1EZ34GJS<6V><6VN@7V><6V><6V><6V><6V><6" + "V><6V.85UN03T-X-R]@'Q=,!P,2UN03U^45" + "U^45V.86V><7V><7VN@8V^D9V^D:W.H:V^D9V^H:V^H:V^H:V^H:V^H:V^H:V>@8" + "T^$1J[?H)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+CIJ>X:VM<'PQ]4$R-8%R=<&R=<&R=<&" + "RM@'R=<&RM@'RM@'RM@(RM@'RM@'RM@'R=<'R=<&R=<'RM@'R=<&RM@'RM@'RM@'" + "RM@'RM@'RM@'RM@(Q=(\"M,'QGJO;G:K:H[+AK+KIN,;VO,GYK[SL>8F[3ER1/DZ%" + "#1E,!A%##AI*(2U>)C-D$Q]1!!!!&RA5K;KJQ-(!R=<&R-8%R-8%R-8%Q]4$Q]4$" + "Q=,\"KKKIS]T+V^D8W.H9Q=,#P,W]UN03V^D8W.H9W.H9V^D8V^D8W.H9V^D9V^D8" + "V^D8V^D8V^D8V^D8V^D8VN@7VN@7VN@7VN@7V><6VN@7V><6V><6V><6VN@7V><6" + "V><6V.85U>,2T-X-RM@'Q=,!PADI_,P,W[E9[+,2U>,3" + "UN04U^45V.86V><7V><7VN@8V^D9V^D9V^D9V^H:V^H:V^H:W.H:W.H:V^D9V.86" + "S]T.C9G*)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D,#QM?8FXM<'PQ]0#R-8%R=<&" + "R=<&R=<&R=<&R=<&R=<&R=<'RM@'RM@'R=<&R=<'RM@'R=<&RM@'R=<&RM@'RM@'" + "RM@'RM@'RM@'RM@(R-8%O,GYJ+?GH;#@J+;EK;SKN,;VN\\CXO\\S\\L\\'Q>HN^3%J." + "1E6-'RQ?\"19&!1%\"!A)#!!!!!!!!(\"M;LL#OQM0#R=<&R-8%R-8%R-8%Q]4$Q]4$" + "Q=,\"J[?ET^$/V^D8W.H9S-H*J[?IJ;7FML/ST]`/V^D8V^D8V^D8V^D9V^D9V^D8" + "V^D8V^D8V^D8V^D8VN@7V^D8VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7V><6V><6" + "V><6V><6U>,2T-X-RM@'Q=(!PBDI_,P,W[E)S(=(\"LJK?EQ='`J+/@P<[\\Q='`Q-#_" + "O,;TJ;3APL[\\P,2" + "U>,2UN04U^45V.86V><7V><7VN@8V^D9V^D9V^D9V^H:V^H:W.H:W.H:V^D9U>,3" + "R]D*9'\"@)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D+CIJ>8.SL+SLQ]0#" + "R-8%R-8%R=<&R=<&R=<&R=<&R=<&R=<'RM@'RM@'R=<&R=<'RM@'R=<&R=<&R=<&" + "R=<'RM@'RM@'RM@'RM@'P]#`M,+SJ+?FJ[GHLL#OM<6V><6U>,2T-X-RM@'Q=,!P,2U>,3UN04U^45V.86V><7V><7VN@8V^@9V^D9V^D9W.H:W.H:V^D9V><7TM`0" + "P<6VN@7VN@7" + "VN@7V><6U>,2T-X-R]D'QM,\"P,3UN04U^45V.86V><7V><7VN@8VN@8V^D9V^D9V^D9VND9UN04SMP," + "I+#A)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D97\"@IK'AQ-(!R-8%R=<&R=<&R=<&R=<&R-8&R=<&R=<&R=<&R=<'R=<&R=<&" + "R=<&R=<&R=<&RM@'RM@'R]D(Q=,#OHR^5FB:/T^\"1%*\"D9_.P<[^R]D(R=<&R-8%R-8%R-8%R-8%Q]4$" + "P\\_`K;GGV><6V^D8W.H9W.H9W.H9W.H9W.H9V^D8V.86P](\"J+7GG:O<6U>,2T-X-R]D(QM,\"P<7VN<8V^@9V^D9V^D9V><7T^$2RM@(" + "?(>X)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D6V:7H*S;P]#`R-8%R-8&R-8%R-8&R-8%R=<&R=<&R=<&R=<&R=<&" + "R=<&R=<&R=<&RM@'RM@'RM@'RM@'QM0$O<6V^D8W.H9W.H9W>L:W.H9W.H9W.H9W.H9SMP+O,CYPM$!L;[OM\\3U" + "FJ76J;7FO,CYV><6VN@7VN@8V^D8VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7VN@7" + "VN@7V.85U>,2T-X-R]D(QM,\"P<7V><7VN@8VN@8U^05S]T-P<[^" + ".D9W)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D45V-F:74P<[^Q]0$R-8%R-8%R-8%R=<&R=<&R=<&R=<&" + "R=<&R=<&R=<&R=<&RM@'RM@'R]D(R]D)R=<'P,W]OL:W>L:W.H9W.H9W.H9W.H9UN,3M\\/TL;_PQ=(\"RM@'" + "N,7WI+'CHZ_BQ-(\"T=X-R]D'U^44VN@7VN@7VN@7VN@7VN@7V^D8V^D8VN@7VN@7" + "VN@7V><6U.(1T-X-R]D(QM,\"PP,2U>,3UN04U^45V.86V.86V><7V.86T^$1RM@(GZO;" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D1U.#DIW-OLKZQ]4$R-8%R-8%R-8&R=<&R=<&" + "R-8%R=<&R=<&RM@'R=<&RM@'RM@'R]D)T=\\/S]X.P]$!P,W^PL__Q-(!QM4$P<[_" + "OLO[O\\S\\P,W]P,W]P,W]P<[^P<[^PL__R-8%R]D(R=<&R-8%R-8%R-8%Q]4$QM0#" + "P,3UN03UN04U^45U^45U>,3SMP,Q=,\"9'\"@" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D/4EYBI;%N\\CXQ]4$Q]4%R-8%R-8%" + "R-8%R-8&R=<&R=<&R=<&R=<'R=<&RM@(S=L*UN45U>04Q]4%Q-(\"Q-(!Q=,\"Q]4$" + "QM0#PL__O\\S]OLO[O\\S\\O\\S\\P,W]PL__S-H*RM@'R=<&R-8%R-8%Q]4$Q]4$Q]4$" + "O\\O[NL;UV^D8W.H9W.H9W.H9W.H9W>L:W.H9W.H9W.H9V^D8T=\\.D)[0C)C*GJK=" + "N<6U>,2S]T,R]D(Q=,\"PL[]O\\OZP,2U>,3UN04UN04T=\\/RM@(K[SL*35F" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D-D%R@HZ^M\\/SQ]4$R-8%" + "R-8%R-8%R-8%R=<&R=<&R=<&R=<&R=<'RM@(S=L+V><7V^H:S-L+Q]4%Q=0#Q=,\"" + "QM0\"Q]4$Q]4$Q=,\"P]#`P,W]P,W]RM@'S=L*R=<&R-8%R-8%R-8%R-8%Q]4$Q]4$" + "OH9W.H9W>L:W.H9W.H9W.H9W.H9W.H9V^D8T^$0NL?XI[3E" + "E:+4K+GIO\\S\\P<[^N<;WL+WNK+GJJKCIV><6V^D8V^D8VN@7V^D8V^D8V^D8V^D8" + "V^D8VN@7U>,2T-X-R]@'Q=,!PL[]P,S[PTM\\,V^D8W.H9W.H9W>L:W.H9W.H9W.H9W.H9W.H9V^D8V^D8V^D8TN$1" + "N\\GZG*G;E*'4G*G:N,3TOLO[GZO=O,KZV><6VN@7VN@7VN@7V^D8V^D8V^D8V^D8" + "V^D8V><6U>,2T-X-R]D'Q=,!PL[]P,S[PL[]PL[]PL[]P\\_^P\\_^P\\_^PL[]P\\_^" + "PL[]P\\_^Q-#^P\\_]PL[\\O\\KXI:_;N\\?TPLW[P,2VN@7VN@7VN@7V^@8V^D8V^D8V^D8" + "V^D8V><6U>,2T-X-R]D'QM0\"PL[]P,S[PL[]PL[]P\\_^P\\_^P\\_^P\\_^P\\_]PL[]" + "P\\_^Q,_^P\\_^PL[\\O,?TI*_;O\\KXP<6QM4%N,?XCYS-FZG:KKKJP,W]SMP+U^44VN@7V^D8V^D8V^D8" + "V^D8V><6U>,2S]T,RM@'Q=,!PL[]PPH8W>L:TM`.OLGWQM'_V.43W.H9W.D8W.H9W.H9W.H9W.H9" + "W.D8V^D8V^D8V^D8VN@7VN@7T-X.P]$!E*#2Q=,#FZ?8KKOLO\\S\\T^$0V^@8V^D8" + "V^D8V><6U>,2S]T,R]@'QM,!P<6VN<5V^@7W>L9V.44Q-#^P\\[[T]`.V^D8W.H9W.H9W.H9" + "W.H9V^D8V^D8V^D8V^D8V^D8V^D8VN@7U.,2U^44KKOLM,'RE*'3K;OMVN@7V^D8" + "V^D8VN@7U>,2S]T,RM@&Q=,!PL[]P,S[PS=L)V.85U^44V.85V><5V>85V><5VN<6W.D8V^@7R=8%P<6U.(1S]T,RM<&Q=(!P<6V><6V.85V.85V.84V^@6W.H9T=\\.P,W[R-0!" + "V.44V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8VN@7U.(1V^D8V^D8" + "V^D8V><6U.(1S]T,RM<&Q='`P<6V><6V><6V><6V><6V>85V>85V.85V.44V.44VN<6W>H9U^43" + "Q-#_Q,_]T]`-V^@7V^@7V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D8V^D9V^D9V^D8" + "V^D8V><6U.(1S]T,RM<&Q='`PL[]P<6VN@7V><6V><6V><6V><6V>85V.85V.85V.44V.84V>85V>85" + "W.D8VN<6RM<&PLW[S=H&VN<6V^D8V^D8VN@7V^D8V^D8V^D9W.D9V^D8V^D8V^D8" + "V^D8V><6U.(1S]T,RM<&Q='`P<6VN<6VN<6VN<6V><6V><6V>85V.85V.85V.44V.85V.85" + "V>85V>85V^@7V^D7S]P+P<6U.(1S]T,RM<&Q='`P<6V><6V><6V><6V><6V><6V.85V.85V.85V.85" + "V.85V>85V>85V.85V>85VN@6U^03Q='_P\\[\\T-X+V^@7V^D8W.H9W.H9W.D9V^D9" + "V^D9V><6U.(1SMP+R=<&Q-#_P'DI[-O,CXQM,\"Q]4$Q]4$QM0#QM0#QM0#P]#`LK[L" + "GJC6G*;3F*+-JK7@L[[IQ<_]T=X,UN,2V>85V><6V><6V><6V><6V>85V>85V.85" + "V.85V.85V.85V.85V.44V.44V>85W.D8W.D7S-H(P,OYR-4\"V>85V^D8W.H9W.H9" + "V^D8V><6U.(1S]P+R=<&Q-#_P,S[P,S[O\\OYI['>ML+OP,SZP<6V><6V><6V>85V.85" + "V.85V.85V.85V.85V.44U^44V.44V>85V>85VN@7W.D8U.(1PLWZQ=#^UN,1W.D8" + "V^D8V.85T^$0SMP+R=<%P\\_^P,SZNL7RIK#JK7BH:S8BY7$@XVZJ[3@N,+LNL3PO<;SP\\W[S-@&T]`.U^03V.85V>85V.85" + "V>85V.85V>85V.85V.85U^44U^44U^44V.85V.85V.85VN<6WNP;VN@7R=8$PLW[" + "S=D'UN02T]`/SMP+R-4#P,OZKKGFJ+/@OLKXP,S[PL[]P\\[]PL[\\P\\_]P\\_^Q=#_" + "H*K8-#]P)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D7VN:FZ?7IK+BD9S)" + "85V>85V><6V>85V.85U^44V.44V.44U^44V.44V>85V><6VN@7W>H9W>L:" + "T-X-N\\?ULKSJJ[7BHZW:I[+?N\\;TP(0U^03V.44V.85V>85V.85V.85V.85V.85V.85V.85V.85V><6V><6V><6V><6" + "VN@7W.D8V>85T]`.R]@&QM+`P,SZP,SZPL[\\PL[\\PL[]PL[\\PL[\\O\\OY=H\"O)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D" + ")S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D)S-D1U*!B93!LKSIO,;TOLCWP,KX" + "Q=#_S=H(T]`/UN,2V.44V.85V>85V>85V.85V.85V.85V.85V.85V><6V.85V><6" + "V.85UN,2T=\\.R]@&Q-#_P82RJ[7BO,1U^44V.85V.85V>85V><6V.85V>85V><6V><6V><6" + "V>85U>,2T=X-R=<%Q-#_P<6V><6V><6V><6V><6" + "V.85U>,2T-T,R=8$Q-#_P85V.85V><6V><6" + "V.85U>(1S]T,R=8$Q-#_P +#include +#include + +#ifdef __DREAMCAST__ +#include +#endif + +#include +#include + +#include "image.h" + + +int main(int argc, char* argv[]) { + (void) argc; + (void) argv; + + glKosInit(); + glClearColor(0.5f, 0.0f, 0.5f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glKosSwapBuffers(); + + GLuint texture_id = 0; + glGenTextures(1, &texture_id); + glBindTexture(GL_TEXTURE_2D, texture_id); + + time_t start = time(NULL); + time_t end = start; + + int counter = 0; + + fprintf(stderr, "Starting test run...\n"); + + while((end - start) < 5) { + glTexImage2D( + GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, header_data + ); + + ++counter; + end = time(NULL); + } + + fprintf(stderr, "Called glTexImage2D %d times (%.4f per call)\n", counter, (float)(end - start) / (float)(counter)); + + return 0; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..bc7a45f --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,26 @@ + + +FILE(GLOB GL_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/test_*.h) + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) + +SET(TEST_GENERATOR_BIN ${CMAKE_SOURCE_DIR}/tools/test_generator.py) +SET(TEST_MAIN_FILENAME ${CMAKE_CURRENT_BINARY_DIR}/main.cpp) + +ADD_CUSTOM_COMMAND( + OUTPUT ${TEST_MAIN_FILENAME} + COMMAND ${TEST_GENERATOR_BIN} --output ${TEST_MAIN_FILENAME} ${TEST_FILES} ${GL_TESTS} + DEPENDS ${TEST_FILES} ${GL_TESTS} ${TEST_GENERATOR_BIN} +) + +add_executable(gldc_tests ${TEST_FILES} ${TEST_SOURCES} ${TEST_MAIN_FILENAME}) +target_link_libraries(gldc_tests GLdc) + +if(!PLATFORM_DREAMCAST) +set_target_properties( + gldc_tests + PROPERTIES + COMPILE_OPTIONS "-m32" + LINK_OPTIONS "-m32" +) +endif() diff --git a/tests/test_glteximage2d.h b/tests/test_glteximage2d.h new file mode 100644 index 0000000..3c5995a --- /dev/null +++ b/tests/test_glteximage2d.h @@ -0,0 +1,74 @@ +#include "tools/test.h" + +#include +#include +#include + + +class TexImage2DTests : public test::TestCase { +public: + uint8_t image_data[8 * 8 * 4] = {0}; + + void set_up() { + glKosInit(); + + /* Init image data so each texel RGBA value matches the + * position in the array */ + for(int i = 0; i < 8 * 8 * 4; i += 4) { + image_data[i + 0] = i; + image_data[i + 1] = i; + image_data[i + 2] = i; + image_data[i + 3] = i; + } + } + + void tear_down() { + glKosShutdown(); + } + + void test_rgb_to_rgb565() { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, image_data); + assert_equal(glGetError(), GL_NO_ERROR); + + GLint internalFormat; + glGetIntegerv(GL_TEXTURE_INTERNAL_FORMAT_KOS, &internalFormat); + + assert_equal(internalFormat, GL_RGB565_KOS); + } + + void test_rgb_to_rgb565_twiddle() { + glEnable(GL_TEXTURE_TWIDDLE_KOS); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, image_data); + glDisable(GL_TEXTURE_TWIDDLE_KOS); + + assert_equal(glGetError(), GL_NO_ERROR); + + GLint internalFormat; + glGetIntegerv(GL_TEXTURE_INTERNAL_FORMAT_KOS, &internalFormat); + + assert_equal(internalFormat, GL_RGB565_TWID_KOS); + } + + void test_rgba_to_argb4444() { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data); + assert_equal(glGetError(), GL_NO_ERROR); + + GLint internalFormat; + glGetIntegerv(GL_TEXTURE_INTERNAL_FORMAT_KOS, &internalFormat); + + assert_equal(internalFormat, GL_ARGB4444_KOS); + } + + void test_rgba_to_argb4444_twiddle() { + glEnable(GL_TEXTURE_TWIDDLE_KOS); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data); + glDisable(GL_TEXTURE_TWIDDLE_KOS); + + assert_equal(glGetError(), GL_NO_ERROR); + + GLint internalFormat; + glGetIntegerv(GL_TEXTURE_INTERNAL_FORMAT_KOS, &internalFormat); + + assert_equal(internalFormat, GL_ARGB4444_TWID_KOS); + } +}; diff --git a/tools/test.h b/tools/test.h new file mode 100644 index 0000000..6341a36 --- /dev/null +++ b/tools/test.h @@ -0,0 +1,445 @@ +/* * Copyright (c) 2011-2017 Luke Benstead https://simulant-engine.appspot.com + * + * This file is part of Simulant. + * + * Simulant is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Simulant 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Simulant. If not, see . + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#define assert_equal(expected, actual) _assert_equal((expected), (actual), __FILE__, __LINE__) +#define assert_not_equal(expected, actual) _assert_not_equal((expected), (actual), __FILE__, __LINE__) +#define assert_false(actual) _assert_false((actual), __FILE__, __LINE__) +#define assert_true(actual) _assert_true((actual), __FILE__, __LINE__) +#define assert_close(expected, actual, difference) _assert_close((expected), (actual), (difference), __FILE__, __LINE__) +#define assert_is_null(actual) _assert_is_null((actual), __FILE__, __LINE__) +#define assert_is_not_null(actual) _assert_is_not_null((actual), __FILE__, __LINE__) +#define assert_raises(exception, func) _assert_raises((func), __FILE__, __LINE__) +#define assert_items_equal(expected, actual) _assert_items_equal((actual), (expected), __FILE__, __LINE__) +#define not_implemented() _not_implemented(__FILE__, __LINE__) + + +namespace test { + +class StringFormatter { +public: + StringFormatter(const std::string& templ): + templ_(templ) { } + + struct Counter { + Counter(uint32_t c): c(c) {} + uint32_t c; + }; + + template + std::string format(T value) { + std::stringstream ss; + ss << value; + return _do_format(0, ss.str()); + } + + template + std::string format(Counter count, T value) { + std::stringstream ss; + ss << value; + return _do_format(count.c, ss.str()); + } + + template + std::string format(T value, const Args&... args) { + std::stringstream ss; + ss << value; + return StringFormatter(_do_format(0, ss.str())).format(Counter(1), args...); + } + + template + std::string format(Counter count, T value, const Args&... args) { + std::stringstream ss; + ss << value; + return StringFormatter(_do_format(count.c, ss.str())).format(Counter(count.c + 1), args...); + } + + std::string _do_format(uint32_t counter, const std::string& value) { + std::stringstream ss; // Can't use to_string on all platforms + ss << counter; + + const std::string to_replace = "{" + ss.str() + "}"; + std::string output = templ_; + + auto replace = [](std::string& str, const std::string& from, const std::string& to) -> bool { + size_t start_pos = str.find(from); + if(start_pos == std::string::npos) + return false; + str.replace(start_pos, from.length(), to); + return true; + }; + + replace(output, to_replace, value); + return output; + } + +private: + std::string templ_; +}; + +class StringSplitter { +public: + StringSplitter(const std::string& str): + str_(str) { + + } + + std::vector split() { + std::vector result; + std::string buffer; + + for(auto c: str_) { + if(c == '\n') { + if(!buffer.empty()) { + result.push_back(buffer); + buffer.clear(); + } + } else { + buffer.push_back(c); + } + } + + if(!buffer.empty()) { + result.push_back(buffer); + } + + return result; + } + +private: + std::string str_; +}; + +typedef StringFormatter _Format; + +class AssertionError : public std::logic_error { +public: + AssertionError(const std::string& what): + std::logic_error(what), + file(""), + line(-1) { + } + + AssertionError(const std::pair file_and_line, const std::string& what): + std::logic_error(what), + file(file_and_line.first), + line(file_and_line.second) { + + } + + ~AssertionError() noexcept (true) { + + } + + std::string file; + int line; +}; + + +class NotImplementedError: public std::logic_error { +public: + NotImplementedError(const std::string& file, int line): + std::logic_error(_Format("Not implemented at {0}:{1}").format(file, line)) {} +}; + + +class SkippedTestError: public std::logic_error { +public: + SkippedTestError(const std::string& reason): + std::logic_error(reason) { + + } +}; + +class TestCase { +public: + virtual ~TestCase() {} + + virtual void set_up() {} + virtual void tear_down() {} + + void skip_if(const bool& flag, const std::string& reason) { + if(flag) { throw test::SkippedTestError(reason); } + } + + template + void _assert_equal(T expected, U actual, std::string file, int line) { + if(expected != actual) { + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, test::_Format("{0} does not match {1}").format(actual, expected)); + } + } + + template + void _assert_not_equal(T lhs, U rhs, std::string file, int line) { + if(lhs == (T) rhs) { + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, test::_Format("{0} should not match {1}").format(lhs, rhs)); + } + } + + template + void _assert_true(T actual, std::string file, int line) { + if(!bool(actual)) { + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, test::_Format("{0} is not true").format(bool(actual) ? "true" : "false")); + } + } + + template + void _assert_false(T actual, std::string file, int line) { + if(bool(actual)) { + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, test::_Format("{0} is not false").format(bool(actual) ? "true" : "false")); + } + } + + template + void _assert_close(T expected, U actual, V difference, std::string file, int line) { + if(actual < expected - difference || + actual > expected + difference) { + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, test::_Format("{0} is not close enough to {1}").format(actual, expected)); + } + } + + template + void _assert_is_null(T* thing, std::string file, int line) { + if(thing != nullptr) { + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, "Pointer was not NULL"); + } + } + + template + void _assert_is_not_null(T* thing, std::string file, int line) { + if(thing == nullptr) { + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, "Pointer was unexpectedly NULL"); + } + } + + template + void _assert_raises(Func func, std::string file, int line) { + try { + func(); + auto file_and_line = std::make_pair(file, line); + throw test::AssertionError(file_and_line, test::_Format("Expected exception ({0}) was not thrown").format(typeid(T).name())); + } catch(T& e) {} + } + + template + void _assert_items_equal(const T& lhs, const U& rhs, std::string file, int line) { + auto file_and_line = std::make_pair(file, line); + + if(lhs.size() != rhs.size()) { + throw test::AssertionError(file_and_line, "Containers are not the same length"); + } + + for(auto item: lhs) { + if(std::find(rhs.begin(), rhs.end(), item) == rhs.end()) { + throw test::AssertionError(file_and_line, test::_Format("Container does not contain {0}").format(item)); + } + } + } + + void _not_implemented(std::string file, int line) { + throw test::NotImplementedError(file, line); + } +}; + +class TestRunner { +public: + template + void register_case(std::vector methods, std::vector names) { + std::shared_ptr instance = std::make_shared(); + + instances_.push_back(instance); //Hold on to it + + for(std::string name: names) { + names_.push_back(name); + } + + for(U& method: methods) { + std::function func = std::bind(method, dynamic_cast(instance.get())); + tests_.push_back([=]() { + instance->set_up(); + func(); + instance->tear_down(); + }); + } + } + + int32_t run(const std::string& test_case, const std::string& junit_output="") { + int failed = 0; + int skipped = 0; + int ran = 0; + int crashed = 0; + + auto new_tests = tests_; + auto new_names = names_; + + if(!test_case.empty()) { + new_tests.clear(); + new_names.clear(); + + for(uint32_t i = 0; i < names_.size(); ++i) { + if(names_[i].find(test_case) == 0) { + new_tests.push_back(tests_[i]); + new_names.push_back(names_[i]); + } + } + } + + std::cout << std::endl << "Running " << new_tests.size() << " tests" << std::endl << std::endl; + + std::vector junit_lines; + junit_lines.push_back("\n"); + + std::string klass = ""; + + for(std::function test: new_tests) { + std::string name = new_names[ran]; + std::string this_klass(name.begin(), name.begin() + name.find_first_of(":")); + bool close_klass = ran == (int) new_tests.size() - 1; + + if(this_klass != klass) { + if(!klass.empty()) { + junit_lines.push_back(" \n"); + } + klass = this_klass; + junit_lines.push_back(" \n"); + } + + try { + junit_lines.push_back(" \n"); + std::string output = " " + new_names[ran]; + + for(int i = output.length(); i < 76; ++i) { + output += " "; + } + + std::cout << output; + test(); + std::cout << "\033[32m" << " OK " << "\033[0m" << std::endl; + junit_lines.push_back(" \n"); + } catch(test::NotImplementedError& e) { + std::cout << "\033[34m" << " SKIPPED" << "\033[0m" << std::endl; + ++skipped; + junit_lines.push_back(" \n"); + } catch(test::SkippedTestError& e) { + std::cout << "\033[34m" << " SKIPPED" << "\033[0m" << std::endl; + ++skipped; + junit_lines.push_back(" \n"); + } catch(test::AssertionError& e) { + std::cout << "\033[33m" << " FAILED " << "\033[0m" << std::endl; + std::cout << " " << e.what() << std::endl; + if(!e.file.empty()) { + std::cout << " " << e.file << ":" << e.line << std::endl; + + std::ifstream ifs(e.file); + if(ifs.good()) { + std::string buffer; + std::vector lines; + while(std::getline(ifs, buffer)) { + lines.push_back(buffer); + } + + int line_count = lines.size(); + if(line_count && e.line <= line_count) { + std::cout << lines.at(e.line - 1) << std::endl << std::endl; + } + } + } + ++failed; + + junit_lines.push_back(" \n"); + junit_lines.push_back(" \n"); + } catch(std::exception& e) { + std::cout << "\033[31m" << " EXCEPT " << std::endl; + std::cout << " " << e.what() << "\033[0m" << std::endl; + ++crashed; + + junit_lines.push_back(" \n"); + junit_lines.push_back(" \n"); + } + std::cout << "\033[0m"; + ++ran; + + if(close_klass) { + junit_lines.push_back(" \n"); + } + } + + junit_lines.push_back("\n"); + + if(!junit_output.empty()) { + FILE* f = fopen(junit_output.c_str(), "wt"); + if(f) { + for(auto& line: junit_lines) { + fwrite(line.c_str(), sizeof(char), line.length(), f); + } + } + + fclose(f); + } + + std::cout << "-----------------------" << std::endl; + if(!failed && !crashed && !skipped) { + std::cout << "All tests passed" << std::endl << std::endl; + } else { + if(skipped) { + std::cout << skipped << " tests skipped"; + } + + if(failed) { + if(skipped) { + std::cout << ", "; + } + std::cout << failed << " tests failed"; + } + + if(crashed) { + if(failed) { + std::cout << ", "; + } + std::cout << crashed << " tests crashed"; + } + std::cout << std::endl << std::endl; + } + + return failed + crashed; + } + +private: + std::vector> instances_; + std::vector > tests_; + std::vector names_; +}; +} // test + diff --git a/tools/test_generator.py b/tools/test_generator.py new file mode 100755 index 0000000..a3bb43c --- /dev/null +++ b/tools/test_generator.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 + +import argparse +import re +import sys + +parser = argparse.ArgumentParser(description="Generate C++ unit tests") +parser.add_argument("--output", type=str, nargs=1, help="The output source file for the generated test main()", required=True) +parser.add_argument("test_files", type=str, nargs="+", help="The list of C++ files containing your tests") +parser.add_argument("--verbose", help="Verbose logging", action="store_true", default=False) + + +CLASS_REGEX = r"\s*class\s+(\w+)\s*([\:|,]\s*(?:public|private|protected)\s+[\w|::]+\s*)*" +TEST_FUNC_REGEX = r"void\s+(?Ptest_\S[^\(]+)\(\s*(void)?\s*\)" + + +INCLUDE_TEMPLATE = "#include \"%(file_path)s\"" + +REGISTER_TEMPLATE = """ + runner->register_case<%(class_name)s>( + std::vector({%(members)s}), + {%(names)s} + );""" + +MAIN_TEMPLATE = """ + +#include +#include +#include + +#include "tools/test.h" + +%(includes)s + + +std::map parse_args(int argc, char* argv[]) { + std::map ret; + + for(int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + + auto eq = arg.find('='); + if(eq != std::string::npos && arg[0] == '-' && arg[1] == '-') { + auto key = std::string(arg.begin(), arg.begin() + eq); + auto value = std::string(arg.begin() + eq + 1, arg.end()); + ret[key] = value; + } else if(arg[0] == '-' && arg[1] == '-') { + auto key = arg; + if(i < (argc - 1)) { + auto value = argv[++i]; + ret[key] = value; + } else { + ret[key] = ""; + } + } else { + ret[arg] = ""; // Positional, not key=value + } + } + + return ret; +} + +int main(int argc, char* argv[]) { + auto runner = std::make_shared(); + + auto args = parse_args(argc, argv); + + std::string junit_xml; + auto junit_xml_it = args.find("--junit-xml"); + if(junit_xml_it != args.end()) { + junit_xml = junit_xml_it->second; + std::cout << " Outputting junit XML to: " << junit_xml << std::endl; + args.erase(junit_xml_it); + } + + std::string test_case; + if(args.size()) { + test_case = args.begin()->first; + } + + %(registrations)s + + return runner->run(test_case, junit_xml); +} + + +""" + +VERBOSE = False + +def log_verbose(message): + if VERBOSE: + print(message) + + +def find_tests(files): + + subclasses = [] + + # First pass, find all class definitions + for path in files: + with open(path, "rt") as f: + source_file_data = f.read().replace("\r\n", "").replace("\n", "") + + while True: + match = re.search(CLASS_REGEX, source_file_data) + if not match: + break + + class_name = match.group().split(":")[0].replace("class", "").strip() + + try: + parents = match.group().split(":", 1)[1] + except IndexError: + pass + else: + parents = [ x.strip() for x in parents.split(",") ] + parents = [ + x.replace("public", "").replace("private", "").replace("protected", "").strip() + for x in parents + ] + + subclasses.append((path, class_name, parents, [])) + log_verbose("Found: %s" % str(subclasses[-1])) + + start = match.end() + + # Find the next opening brace + while source_file_data[start] in (' ', '\t'): + start += 1 + + start -= 1 + end = start + if source_file_data[start+1] == '{': + + class_data = [] + brace_counter = 1 + for i in range(start+2, len(source_file_data)): + class_data.append(source_file_data[i]) + if class_data[-1] == '{': brace_counter += 1 + if class_data[-1] == '}': brace_counter -= 1 + if not brace_counter: + end = i + break + + class_data = "".join(class_data) + + while True: + match = re.search(TEST_FUNC_REGEX, class_data) + if not match: + break + + subclasses[-1][-1].append(match.group('func_name')) + class_data = class_data[match.end():] + + source_file_data = source_file_data[end:] + + + # Now, simplify the list by finding all potential superclasses, and then keeping any classes + # that subclass them. + test_case_subclasses = [] + i = 0 + while i < len(subclasses): + subclass_names = [x.rsplit("::")[-1] for x in subclasses[i][2]] + + # If this subclasses TestCase, or it subclasses any of the already found testcase subclasses + # then add it to the list + if "TestCase" in subclass_names or "SimulantTestCase" in subclass_names or any(x[1] in subclasses[i][2] for x in test_case_subclasses): + if subclasses[i] not in test_case_subclasses: + test_case_subclasses.append(subclasses[i]) + + i = 0 # Go back to the start, as we may have just found another parent class + continue + i += 1 + + log_verbose("\n".join([str(x) for x in test_case_subclasses])) + return test_case_subclasses + + +def main(): + global VERBOSE + + args = parser.parse_args() + + VERBOSE = args.verbose + + testcases = find_tests(args.test_files) + + includes = "\n".join([ INCLUDE_TEMPLATE % { 'file_path' : x } for x in set([y[0] for y in testcases]) ]) + registrations = [] + + for path, class_name, superclasses, funcs in testcases: + BIND_TEMPLATE = "&%(class_name)s::%(func)s" + + members = ", ".join([ BIND_TEMPLATE % { 'class_name' : class_name, 'func' : x } for x in funcs ]) + names = ", ".join([ '"%s::%s"' % (class_name, x) for x in funcs ]) + + registrations.append(REGISTER_TEMPLATE % { 'class_name' : class_name, 'members' : members, 'names' : names }) + + registrations = "\n".join(registrations) + + final = MAIN_TEMPLATE % { + 'registrations' : registrations, + 'includes' : includes + } + + open(args.output[0], "w").write(final) + + return 0 + +if __name__ == '__main__': + sys.exit(main()) From 34173d926c8a6086689d01b77072ebe10afe7db8 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Thu, 31 Aug 2023 08:44:09 +0100 Subject: [PATCH 02/33] Drastically refactor glTexImage2D --- tests/test_allocator.h | 89 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 tests/test_allocator.h diff --git a/tests/test_allocator.h b/tests/test_allocator.h new file mode 100644 index 0000000..3f2b762 --- /dev/null +++ b/tests/test_allocator.h @@ -0,0 +1,89 @@ +#include "tools/test.h" + +#include +#include + +#include +#include + +#include "GL/alloc/alloc.h" + +static inline int round_up(int n, int multiple) +{ + assert(multiple); + return ((n + multiple - 1) / multiple) * multiple; +} + +class AllocatorTests : public test::TestCase { +public: + uint8_t pool[16 * 2048]; + + void set_up() { + } + + void tear_down() { + alloc_shutdown(pool); + } + + void test_alloc_init() { + alloc_init(pool, sizeof(pool)); + + void* expected_base_address = (void*) round_up((uintptr_t) pool, 2048); + assert_equal(alloc_next_available(pool, 16), expected_base_address); + assert_equal(alloc_base_address(pool), expected_base_address); + + int expected_blocks = ( + uintptr_t(pool + sizeof(pool)) - + uintptr_t(expected_base_address) + ) / 2048; + + assert_equal(alloc_block_count(pool), expected_blocks); + } + + void test_alloc_malloc() { + alloc_init(pool, sizeof(pool)); + + void* base_address = alloc_base_address(pool); + void* a1 = alloc_malloc(pool, 1024); + + /* First alloc should always be the base address */ + assert_equal(a1, base_address); + + /* An allocation of <= 2048 (well 1024) will not necessarily be at + * a 2k boundary */ + void* expected_next_available = base_address + uintptr_t(1024); + assert_equal(alloc_next_available(pool, 1024), expected_next_available); + + /* Requesting 2k though will force to a 2k boundary */ + expected_next_available = base_address + uintptr_t(2048); + assert_equal(alloc_next_available(pool, 2048), expected_next_available); + + /* Now alloc 2048 bytes, this should be on the 2k boundary */ + void* a2 = alloc_malloc(pool, 2048); + assert_equal(a2, expected_next_available); + + /* If we try to allocate 1k, this should go in the second half of the + * first block */ + expected_next_available = base_address + uintptr_t(1024); + void* a3 = alloc_malloc(pool, 1024); + assert_equal(a3, expected_next_available); + + alloc_free(pool, a1); + + /* Next allocation would go in the just freed block */ + expected_next_available = base_address; + assert_equal(alloc_next_available(pool, 64), expected_next_available); + + /* Now allocate 14 more 2048 size blocks, the following one should + * return NULL */ + for(int i = 0; i < 14; ++i) { + alloc_malloc(pool, 2048); + } + + assert_is_null(alloc_malloc(pool, 2048)); + + /* But we should still have room in the second block for this */ + assert_is_not_null(alloc_malloc(pool, 64)); + } + +}; From f278777c0e7c41793d4732565a672b17b69dee43 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Thu, 31 Aug 2023 08:45:05 +0100 Subject: [PATCH 03/33] WIP: Start implementing new allocator --- CMakeLists.txt | 1 + GL/alloc/alloc.c | 228 +++++++++++++++++++++++++++++++++++++++++++ GL/alloc/alloc.h | 28 ++++++ tests/CMakeLists.txt | 2 +- 4 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 GL/alloc/alloc.c create mode 100644 GL/alloc/alloc.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cb2edd..7e52ac2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,7 @@ set( GL/texture.c GL/util.c GL/yalloc/yalloc.c + GL/alloc/alloc.c ${CMAKE_CURRENT_BINARY_DIR}/version.c ) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c new file mode 100644 index 0000000..85b96a9 --- /dev/null +++ b/GL/alloc/alloc.c @@ -0,0 +1,228 @@ +#include + +#include "alloc.h" + + +/* This allocator is designed so that all allocations larger + * than 2k, fall on a 2k boundary. Smaller allocations will + * never cross a 2k boundary. + * + * House keeping is stored in RAM to avoid reading back from the + * VRAM to check for usage. Headers can't be easily stored in the + * blocks anyway as they have to be 2k aligned (so you'd need to + * store them in reverse or something) + * + * Defragmenting the pool will move allocations less than 2k + * first, and then shift any full 2k blocks to the start of the + * address space. + * + * The maximum pool size is 8M, made up of: + * + * - 4096 blocks of 2k + * - each with 8 sub-blocks of 256 bytes + * + * Why? + * + * The PVR performs better if textures don't cross 2K memory + * addresses, so we try to avoid that. Obviously we can't + * if the allocation is > 2k, but in that case we can at least + * align with 2k and the VQ codebook (which is usually 2k) will + * be in its own page. + * + * The smallest PVR texture allowed is 8x8 at 16 bit (so 128 bytes) + * but we're unlikely to use too many of those, so having a min sub-block + * size of 256 should be OK (a 16x16 image is 512, so two sub-blocks). + * + * We could go down to 128 bytes if wastage is an issue, but then we have + * to store double the number of usage markers. + */ + +#include + +#define EIGHT_MEG (8 * 1024 * 1024) +#define TWO_KILOBYTES (2 * 1024) +#define BLOCK_COUNT (EIGHT_MEG / TWO_KILOBYTES) + +static inline int round_up(int n, int multiple) +{ + assert(multiple); + return ((n + multiple - 1) / multiple) * multiple; +} + +struct AllocEntry { + void* pointer; + size_t size; + struct AllocEntry* next; +}; + + +typedef struct { + /* This is a usage bitmask for each block. A block + * is divided into 8 x 256 byte subblocks. If a block + * is entirely used, it's value will be 255, if + * it's entirely free then it will be 0. + */ + uint8_t block_usage[BLOCK_COUNT]; + uint8_t* pool; // Pointer to the memory pool + size_t pool_size; // Size of the memory pool + uint8_t* base_address; // First 2k aligned address in the pool + size_t block_count; // Number of 2k blocks in the pool + + /* It's frustrating that we need to do this dynamically + * but we need to know the size allocated when we free() */ + struct AllocEntry* allocations; +} PoolHeader; + + +static PoolHeader pool_header = { + {0}, NULL, 0, NULL, 0, NULL +}; + +void* alloc_base_address(void* pool) { + return pool_header.base_address; +} + +size_t alloc_block_count(void* pool) { + return pool_header.block_count; +} + +void* alloc_next_available(void* pool, size_t required_size) { + uint8_t* it = pool_header.block_usage; + uint32_t required_subblocks = (required_size / 256); + if(required_size % 256) required_subblocks += 1; + + while(true) { + // Skip full blocks + while((*it) == 255) { + ++it; + if(it >= pool_header.block_usage + sizeof(pool_header.block_usage)) { + return NULL; + } + continue; + } + + uint32_t found_subblocks = 0; + bool requires_alignment = required_size >= 2048; + + /* We just need to find enough consecutive blocks */ + while(found_subblocks < required_subblocks) { + uint8_t t = *it; + + /* Optimisation only. Skip over full blocks */ + if(t == 255) { + ++it; + found_subblocks = 0; + continue; + } + + /* Now let's see how many consecutive blocks we can find */ + for(int i = 0; i < 8; ++i) { + if((t & 0x80) == 0) { + if(requires_alignment && found_subblocks == 0 && i != 0) { + // Ignore this subblock, because we want the first subblock to be aligned + // at a 2048 boundary and this one isn't (i != 0) + found_subblocks = 0; + } else { + found_subblocks++; + if(found_subblocks >= required_subblocks) { + /* We found space! Now calculate the address */ + uintptr_t offset = (it - pool_header.block_usage) * 8; + offset += (i + 1); + offset -= required_subblocks; + return pool_header.base_address + (offset * 256); + } + } + } else { + found_subblocks = 0; + } + + t <<= 1; + } + + ++it; + if(it >= pool_header.block_usage + sizeof(pool_header.block_usage)) { + return NULL; + } + } + + } + +} + +uint32_t alloc_block_from_address(void* p) { + +} + +int alloc_init(void* pool, size_t size) { + if(pool_header.pool) { + return -1; + } + + if(size > EIGHT_MEG) { // FIXME: >= ? + return -1; + } + + uint8_t* p = (uint8_t*) pool; + + memset(pool_header.block_usage, 0, sizeof(pool_header.block_usage)); + pool_header.pool = pool; + pool_header.pool_size = size; + pool_header.base_address = round_up(pool_header.pool, 2048); + pool_header.block_count = ((p + size) - pool_header.base_address) / 2048; + + return 0; +} + +void alloc_shutdown(void* pool) { + pool_header.pool = NULL; +} + +void* alloc_malloc(void* pool, size_t size) { + void* ret = alloc_next_available(pool, size); + if(ret) { + uintptr_t start_subblock = (uint8_t*) ret - pool_header.base_address; + + uint32_t required_subblocks = (size / 256); + if(size % 256) required_subblocks += 1; + + uintptr_t start_block = start_subblock / 8; + uintptr_t filled_blocks = required_subblocks / 8; + uintptr_t trailing_subblocks = required_subblocks % 8; + + for(size_t i = start_block; i < start_block + filled_blocks; ++i) { + pool_header.block_usage[i] = 255; + } + + uint8_t* trailing = &pool_header.block_usage[start_block + filled_blocks]; + uint8_t mask = 0; + for(size_t i = 0; i < trailing_subblocks; ++i) { + mask |= 1; + mask <<= 1; + } + + mask <<= 8 - trailing_subblocks - 1; + *trailing |= mask; + } + + return ret; +} + +void alloc_free(void* pool, void* p) { + +} + +void alloc_defrag_start(void* pool) { + +} + +void* alloc_defrag_address(void* pool, void* p) { + +} + +void alloc_defrag_commit(void* pool) { + +} + +bool alloc_defrag_in_progress(void* pool) { + +} diff --git a/GL/alloc/alloc.h b/GL/alloc/alloc.h new file mode 100644 index 0000000..466c80a --- /dev/null +++ b/GL/alloc/alloc.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int alloc_init(void* pool, size_t size); +void alloc_shutdown(void* pool); + +void *alloc_malloc(void* pool, size_t size); +void alloc_free(void* pool, void* p); + +void alloc_defrag_start(void* pool); +void* alloc_defrag_address(void* pool, void* p); +void alloc_defrag_commit(void* pool); +bool alloc_defrag_in_progress(void* pool); + +void* alloc_next_available(void* pool, size_t required_size); +void* alloc_base_address(void* pool); +size_t alloc_block_count(void* pool); + +#ifdef __cplusplus +} +#endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bc7a45f..7dc2faf 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -16,7 +16,7 @@ ADD_CUSTOM_COMMAND( add_executable(gldc_tests ${TEST_FILES} ${TEST_SOURCES} ${TEST_MAIN_FILENAME}) target_link_libraries(gldc_tests GLdc) -if(!PLATFORM_DREAMCAST) +if(NOT PLATFORM_DREAMCAST) set_target_properties( gldc_tests PROPERTIES From f49a98ab543b1be0049e07456fb23022435ba450 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Thu, 31 Aug 2023 20:49:34 +0100 Subject: [PATCH 04/33] Fix allocate and free --- GL/alloc/alloc.c | 198 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 170 insertions(+), 28 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index 85b96a9..8222db6 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -1,4 +1,6 @@ #include +#include +#include #include "alloc.h" @@ -35,6 +37,10 @@ * * We could go down to 128 bytes if wastage is an issue, but then we have * to store double the number of usage markers. + * + * FIXME: + * + * - Allocations < 2048 can still cross boundaries */ #include @@ -69,7 +75,12 @@ typedef struct { size_t block_count; // Number of 2k blocks in the pool /* It's frustrating that we need to do this dynamically - * but we need to know the size allocated when we free() */ + * but we need to know the size allocated when we free()... + * we could store it statically but it would take 64k if we had + * an array of block_index -> block size where there would be 2 ** 32 + * entries of 16 bit block sizes. The drawback (aside the memory usage) + * would be that we won't be able to order by size, so defragging will + * take much more time.*/ struct AllocEntry* allocations; } PoolHeader; @@ -79,10 +90,12 @@ static PoolHeader pool_header = { }; void* alloc_base_address(void* pool) { + (void) pool; return pool_header.base_address; } size_t alloc_block_count(void* pool) { + (void) pool; return pool_header.block_count; } @@ -91,7 +104,9 @@ void* alloc_next_available(void* pool, size_t required_size) { uint32_t required_subblocks = (required_size / 256); if(required_size % 256) required_subblocks += 1; - while(true) { + uint8_t* end = pool_header.block_usage + pool_header.block_count; + + while(it < end) { // Skip full blocks while((*it) == 255) { ++it; @@ -102,6 +117,8 @@ void* alloc_next_available(void* pool, size_t required_size) { } uint32_t found_subblocks = 0; + + /* Anything gte to 2048 must be aligned to a 2048 boundary */ bool requires_alignment = required_size >= 2048; /* We just need to find enough consecutive blocks */ @@ -112,6 +129,11 @@ void* alloc_next_available(void* pool, size_t required_size) { if(t == 255) { ++it; found_subblocks = 0; + + if(it >= end) { + return NULL; + } + continue; } @@ -140,20 +162,19 @@ void* alloc_next_available(void* pool, size_t required_size) { } ++it; - if(it >= pool_header.block_usage + sizeof(pool_header.block_usage)) { + if(it >= end) { return NULL; } } } -} - -uint32_t alloc_block_from_address(void* p) { - + return NULL; } int alloc_init(void* pool, size_t size) { + (void) pool; + if(pool_header.pool) { return -1; } @@ -167,48 +188,169 @@ int alloc_init(void* pool, size_t size) { memset(pool_header.block_usage, 0, sizeof(pool_header.block_usage)); pool_header.pool = pool; pool_header.pool_size = size; - pool_header.base_address = round_up(pool_header.pool, 2048); + pool_header.base_address = (uint8_t*) round_up((uintptr_t) pool_header.pool, 2048); pool_header.block_count = ((p + size) - pool_header.base_address) / 2048; + pool_header.allocations = NULL; + + assert(((uintptr_t) pool_header.base_address) % 2048 == 0); return 0; } void alloc_shutdown(void* pool) { - pool_header.pool = NULL; + (void) pool; + + struct AllocEntry* it = pool_header.allocations; + while(it) { + struct AllocEntry* next = it->next; + free(it); + it = next; + } + + memset(&pool_header, 0, sizeof(pool_header)); +} + +static inline uint32_t size_to_subblock_count(size_t size) { + uint32_t required_subblocks = (size / 256); + if(size % 256) required_subblocks += 1; + return required_subblocks; +} + +static inline uint32_t subblock_from_pointer(void* p) { + uint8_t* ptr = (uint8_t*) p; + return (ptr - pool_header.base_address) / 256; } void* alloc_malloc(void* pool, size_t size) { void* ret = alloc_next_available(pool, size); + if(size >= 2048) { + assert(((uintptr_t) ret) % 2048 == 0); + } + if(ret) { - uintptr_t start_subblock = (uint8_t*) ret - pool_header.base_address; - - uint32_t required_subblocks = (size / 256); - if(size % 256) required_subblocks += 1; - - uintptr_t start_block = start_subblock / 8; - uintptr_t filled_blocks = required_subblocks / 8; - uintptr_t trailing_subblocks = required_subblocks % 8; - - for(size_t i = start_block; i < start_block + filled_blocks; ++i) { - pool_header.block_usage[i] = 255; - } - - uint8_t* trailing = &pool_header.block_usage[start_block + filled_blocks]; + uintptr_t start_subblock = subblock_from_pointer(ret); + uint32_t required_subblocks = size_to_subblock_count(size); + size_t offset = start_subblock % 8; + size_t block = start_subblock / 8; uint8_t mask = 0; - for(size_t i = 0; i < trailing_subblocks; ++i) { - mask |= 1; - mask <<= 1; + + /* Toggle any bits for the first block */ + for(int i = offset - 1; i >= 0; --i) { + mask |= (1 << i); + required_subblocks--; } - mask <<= 8 - trailing_subblocks - 1; - *trailing |= mask; + if(mask) { + pool_header.block_usage[block++] |= mask; + } + + /* Fill any full blocks in the middle of the allocation */ + while(required_subblocks > 8) { + pool_header.block_usage[block++] = 255; + required_subblocks -= 8; + } + + /* Fill out any trailing subblocks */ + mask = 0; + for(size_t i = 0; i < required_subblocks; ++i) { + mask |= (1 << (7 - i)); + } + + if(mask) { + pool_header.block_usage[block++] |= mask; + } + + + /* Insert allocations in the list by size descending so that when we + * defrag we can move the larger blocks before the smaller ones without + * much effort */ + struct AllocEntry* new_entry = (struct AllocEntry*) malloc(sizeof(struct AllocEntry)); + new_entry->pointer = ret; + new_entry->size = size; + new_entry->next = NULL; + + struct AllocEntry* it = pool_header.allocations; + struct AllocEntry* last = NULL; + + if(!it) { + pool_header.allocations = new_entry; + } else { + while(it) { + if(it->size < size) { + if(last) { + last->next = new_entry; + } else { + pool_header.allocations = new_entry; + } + + new_entry->next = it; + break; + } else if(!it->next) { + it->next = new_entry; + new_entry->next = NULL; + break; + } + + last = it; + it = it->next; + } + } } return ret; } void alloc_free(void* pool, void* p) { + struct AllocEntry* it = pool_header.allocations; + struct AllocEntry* last = NULL; + while(it) { + if(it->pointer == p) { + size_t used_subblocks = size_to_subblock_count(it->size); + size_t subblock = subblock_from_pointer(p); + size_t block = subblock / 8; + size_t offset = subblock % 8; + uint8_t mask = 0; + /* Wipe out any leading subblocks */ + for(int i = offset; i > 0; --i) { + mask |= (1 << i); + used_subblocks--; + } + + if(mask) { + pool_header.block_usage[block++] &= ~mask; + } + + /* Clear any full blocks in the middle of the allocation */ + while(used_subblocks > 8) { + pool_header.block_usage[block++] = 0; + used_subblocks -= 8; + } + + /* Wipe out any trailing subblocks */ + mask = 0; + for(size_t i = 0; i < used_subblocks; ++i) { + mask |= (1 << (7 - i)); + } + + if(mask) { + pool_header.block_usage[block++] &= ~mask; + } + + if(last) { + last->next = it->next; + } else { + assert(it == pool_header.allocations); + pool_header.allocations = it->next; + } + + free(it); + break; + } + + last = it; + it = it->next; + } } void alloc_defrag_start(void* pool) { From 3248499d5ae4b19b5d961776e7f8d6c679ae6efa Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Thu, 31 Aug 2023 21:21:14 +0100 Subject: [PATCH 05/33] Switch to the new allocator --- GL/alloc/alloc.c | 72 ++++++++++++++++++++++++++++++++++++++--- GL/alloc/alloc.h | 3 ++ GL/platforms/software.c | 2 +- GL/texture.c | 46 +++++++++++++------------- tests/test_allocator.h | 6 ++-- 5 files changed, 97 insertions(+), 32 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index 8222db6..45e2ebc 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -41,6 +41,7 @@ * FIXME: * * - Allocations < 2048 can still cross boundaries + * - Only operates on one pool (ignores what you pass) */ #include @@ -73,6 +74,7 @@ typedef struct { size_t pool_size; // Size of the memory pool uint8_t* base_address; // First 2k aligned address in the pool size_t block_count; // Number of 2k blocks in the pool + bool defrag_in_progress; /* It's frustrating that we need to do this dynamically * but we need to know the size allocated when we free()... @@ -86,7 +88,7 @@ typedef struct { static PoolHeader pool_header = { - {0}, NULL, 0, NULL, 0, NULL + {0}, NULL, 0, NULL, 0, false, NULL }; void* alloc_base_address(void* pool) { @@ -100,6 +102,8 @@ size_t alloc_block_count(void* pool) { } void* alloc_next_available(void* pool, size_t required_size) { + (void) pool; + uint8_t* it = pool_header.block_usage; uint32_t required_subblocks = (required_size / 256); if(required_size % 256) required_subblocks += 1; @@ -301,6 +305,8 @@ void* alloc_malloc(void* pool, size_t size) { } void alloc_free(void* pool, void* p) { + (void) pool; + struct AllocEntry* it = pool_header.allocations; struct AllocEntry* last = NULL; while(it) { @@ -354,17 +360,73 @@ void alloc_free(void* pool, void* p) { } void alloc_defrag_start(void* pool) { - + (void) pool; + pool_header.defrag_in_progress = true; } void* alloc_defrag_address(void* pool, void* p) { - + (void) pool; + return p; } void alloc_defrag_commit(void* pool) { - + (void) pool; + pool_header.defrag_in_progress = false; } bool alloc_defrag_in_progress(void* pool) { - + (void) pool; + return pool_header.defrag_in_progress; +} + +static inline uint8_t count_ones(uint8_t byte) { + static const uint8_t NIBBLE_LOOKUP [16] = { + 0, 1, 1, 2, 1, 2, 2, 3, + 1, 2, 2, 3, 2, 3, 3, 4 + }; + return NIBBLE_LOOKUP[byte & 0x0F] + NIBBLE_LOOKUP[byte >> 4]; +} + +size_t alloc_count_free(void* pool) { + uint8_t* it = pool_header.block_usage; + uint8_t* end = it + pool_header.block_count; + + size_t total_free = 0; + + while(it < end) { + total_free += count_ones(*it) * 256; + ++it; + } + + return total_free; +} + +size_t alloc_count_continuous(void* pool) { + (void) pool; + + size_t largest_block = 0; + + uint8_t* it = pool_header.block_usage; + uint8_t* end = it + pool_header.block_count; + + size_t current_block = 0; + while(it < end) { + uint8_t t = *it++; + if(!t) { + current_block += 2048; + } else { + for(int i = 7; i >= 0; --i) { + bool bitset = (t & (1 << i)); + if(bitset) { + current_block += (7 - i) * 256; + if(largest_block < current_block) { + largest_block = current_block; + current_block = 0; + } + } + } + } + } + + return largest_block; } diff --git a/GL/alloc/alloc.h b/GL/alloc/alloc.h index 466c80a..d69bb9f 100644 --- a/GL/alloc/alloc.h +++ b/GL/alloc/alloc.h @@ -19,6 +19,9 @@ void* alloc_defrag_address(void* pool, void* p); void alloc_defrag_commit(void* pool); bool alloc_defrag_in_progress(void* pool); +size_t alloc_count_free(void* pool); +size_t alloc_count_continuous(void* pool); + void* alloc_next_available(void* pool, size_t required_size); void* alloc_base_address(void* pool); size_t alloc_block_count(void* pool); diff --git a/GL/platforms/software.c b/GL/platforms/software.c index d9d7fc8..4245930 100644 --- a/GL/platforms/software.c +++ b/GL/platforms/software.c @@ -12,7 +12,7 @@ #define CLIP_DEBUG 0 #define ZNEAR_CLIPPING_ENABLED 1 -static size_t AVAILABLE_VRAM = 16 * 1024 * 1024; +static size_t AVAILABLE_VRAM = 8 * 1024 * 1024; static Matrix4x4 MATRIX; static SDL_Window* WINDOW = NULL; diff --git a/GL/texture.c b/GL/texture.c index 13f7605..aebfde5 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -8,7 +8,7 @@ #include "config.h" #include "platform.h" -#include "yalloc/yalloc.h" +#include "alloc/alloc.h" /* We always leave this amount of vram unallocated to prevent * issues with the allocator */ @@ -31,8 +31,8 @@ static GLboolean SUBBANKS_USED[MAX_GLDC_PALETTE_SLOTS][MAX_GLDC_4BPP_PALETTE_SLO static GLenum INTERNAL_PALETTE_FORMAT = GL_RGBA8; static GLboolean TEXTURE_TWIDDLE_ENABLED = GL_FALSE; -static void* YALLOC_BASE = NULL; -static size_t YALLOC_SIZE = 0; +static void* ALLOC_BASE = NULL; +static size_t ALLOC_SIZE = 0; static const unsigned short MortonTable256[256] = { @@ -84,15 +84,15 @@ GL_FORCE_INLINE uint32_t twid_location(uint32_t i, uint32_t w, uint32_t h) { } -static void* yalloc_alloc_and_defrag(size_t size) { - void* ret = yalloc_alloc(YALLOC_BASE, size); +static void* alloc_malloc_and_defrag(size_t size) { + void* ret = alloc_malloc(ALLOC_BASE, size); if(!ret) { /* Tried to allocate, but out of room, let's try defragging * and repeating the alloc */ fprintf(stderr, "Ran out of memory, defragmenting\n"); glDefragmentTextureMemory_KOS(); - ret = yalloc_alloc(YALLOC_BASE, size); + ret = alloc_malloc(ALLOC_BASE, size); } gl_assert(ret && "Out of PVR memory!"); @@ -505,15 +505,15 @@ GLubyte _glInitTextures() { //memset((void*) SUBBANKS_USED, 0x0, sizeof(SUBBANKS_USED)); size_t vram_free = GPUMemoryAvailable(); - YALLOC_SIZE = vram_free - PVR_MEM_BUFFER_SIZE; /* Take all but 64kb VRAM */ - YALLOC_BASE = GPUMemoryAlloc(YALLOC_SIZE); + ALLOC_SIZE = vram_free - PVR_MEM_BUFFER_SIZE; /* Take all but 64kb VRAM */ + ALLOC_BASE = GPUMemoryAlloc(ALLOC_SIZE); #ifdef __DREAMCAST__ /* Ensure memory is aligned */ gl_assert((uintptr_t) YALLOC_BASE % 32 == 0); #endif - yalloc_init(YALLOC_BASE, YALLOC_SIZE); + alloc_init(ALLOC_BASE, ALLOC_SIZE); gl_assert(TEXTURE_OBJECTS.element_size > 0); return 1; @@ -610,7 +610,7 @@ void APIENTRY glDeleteTextures(GLsizei n, GLuint *textures) { } if(txr->data) { - yalloc_free(YALLOC_BASE, txr->data); + alloc_free(ALLOC_BASE, txr->data); txr->data = NULL; } @@ -858,10 +858,10 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target, /* Odds are slim new data is same size as old, so free always */ if(active->data) { - yalloc_free(YALLOC_BASE, active->data); + alloc_free(ALLOC_BASE, active->data); } - active->data = yalloc_alloc_and_defrag(imageSize); + active->data = alloc_malloc_and_defrag(imageSize); gl_assert(active->data); // Debug assert @@ -1242,14 +1242,14 @@ void _glAllocateSpaceForMipmaps(TextureObject* active) { memcpy(temp, active->data, size); /* Free the PVR data */ - yalloc_free(YALLOC_BASE, active->data); + alloc_free(ALLOC_BASE, active->data); active->data = NULL; } /* Figure out how much room to allocate for mipmaps */ GLuint bytes = _glGetMipmapDataSize(active); - active->data = yalloc_alloc_and_defrag(bytes); + active->data = alloc_malloc_and_defrag(bytes); gl_assert(active->data); @@ -1389,7 +1389,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, active->height != height || active->internalFormat != cleanInternalFormat) { /* changed - free old texture memory */ - yalloc_free(YALLOC_BASE, active->data); + alloc_free(ALLOC_BASE, active->data); active->data = NULL; active->mipmap = 0; active->mipmapCount = 0; @@ -1434,7 +1434,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, /* If we're uploading a mipmap level, we need to allocate the full amount of space */ _glAllocateSpaceForMipmaps(active); } else { - active->data = yalloc_alloc_and_defrag(active->baseDataSize); + active->data = alloc_malloc_and_defrag(active->baseDataSize); } active->isCompressed = GL_FALSE; @@ -1856,23 +1856,23 @@ GLAPI void APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height gl_assert(0 && "Not Implemented"); } GLuint _glMaxTextureMemory() { - return YALLOC_SIZE; + return ALLOC_SIZE; } GLuint _glFreeTextureMemory() { - return yalloc_count_free(YALLOC_BASE); + return alloc_count_free(ALLOC_BASE); } GLuint _glUsedTextureMemory() { - return YALLOC_SIZE - _glFreeTextureMemory(); + return ALLOC_SIZE - _glFreeTextureMemory(); } GLuint _glFreeContiguousTextureMemory() { - return yalloc_count_continuous(YALLOC_BASE); + return alloc_count_continuous(ALLOC_BASE); } GLAPI GLvoid APIENTRY glDefragmentTextureMemory_KOS(void) { - yalloc_defrag_start(YALLOC_BASE); + alloc_defrag_start(ALLOC_BASE); GLuint id; @@ -1881,11 +1881,11 @@ GLAPI GLvoid APIENTRY glDefragmentTextureMemory_KOS(void) { TextureObject* txr = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, id); if(txr){ gl_assert(txr->index == id); - txr->data = yalloc_defrag_address(YALLOC_BASE, txr->data); + txr->data = alloc_defrag_address(ALLOC_BASE, txr->data); } } - yalloc_defrag_commit(YALLOC_BASE); + alloc_defrag_commit(ALLOC_BASE); } GLAPI void APIENTRY glGetTexImage(GLenum tex, GLint lod, GLenum format, GLenum type, GLvoid* img) { diff --git a/tests/test_allocator.h b/tests/test_allocator.h index 3f2b762..32ac1cc 100644 --- a/tests/test_allocator.h +++ b/tests/test_allocator.h @@ -16,7 +16,7 @@ static inline int round_up(int n, int multiple) class AllocatorTests : public test::TestCase { public: - uint8_t pool[16 * 2048]; + uint8_t __attribute__((aligned(2048))) pool[16 * 2048]; void set_up() { } @@ -32,7 +32,7 @@ public: assert_equal(alloc_next_available(pool, 16), expected_base_address); assert_equal(alloc_base_address(pool), expected_base_address); - int expected_blocks = ( + size_t expected_blocks = ( uintptr_t(pool + sizeof(pool)) - uintptr_t(expected_base_address) ) / 2048; @@ -43,7 +43,7 @@ public: void test_alloc_malloc() { alloc_init(pool, sizeof(pool)); - void* base_address = alloc_base_address(pool); + uint8_t* base_address = (uint8_t*) alloc_base_address(pool); void* a1 = alloc_malloc(pool, 1024); /* First alloc should always be the base address */ From 4b47f6878ffe4ebe7d4b8b41ab0541ab7e759c24 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 08:34:48 +0100 Subject: [PATCH 06/33] Remove yalloc --- CMakeLists.txt | 1 - GL/texture.c | 2 +- GL/yalloc/LICENSE | 21 - GL/yalloc/README.md | 158 ------- GL/yalloc/yalloc.c | 803 ----------------------------------- GL/yalloc/yalloc.h | 176 -------- GL/yalloc/yalloc_dump.c | 39 -- GL/yalloc/yalloc_internals.h | 63 --- 8 files changed, 1 insertion(+), 1262 deletions(-) delete mode 100644 GL/yalloc/LICENSE delete mode 100644 GL/yalloc/README.md delete mode 100644 GL/yalloc/yalloc.c delete mode 100644 GL/yalloc/yalloc.h delete mode 100644 GL/yalloc/yalloc_dump.c delete mode 100644 GL/yalloc/yalloc_internals.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e52ac2..c148059 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,7 +80,6 @@ set( GL/state.c GL/texture.c GL/util.c - GL/yalloc/yalloc.c GL/alloc/alloc.c ${CMAKE_CURRENT_BINARY_DIR}/version.c ) diff --git a/GL/texture.c b/GL/texture.c index aebfde5..e699e3c 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -510,7 +510,7 @@ GLubyte _glInitTextures() { #ifdef __DREAMCAST__ /* Ensure memory is aligned */ - gl_assert((uintptr_t) YALLOC_BASE % 32 == 0); + gl_assert((uintptr_t) ALLOC_BASE % 32 == 0); #endif alloc_init(ALLOC_BASE, ALLOC_SIZE); diff --git a/GL/yalloc/LICENSE b/GL/yalloc/LICENSE deleted file mode 100644 index 8aa2645..0000000 --- a/GL/yalloc/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) [year] [fullname] - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/GL/yalloc/README.md b/GL/yalloc/README.md deleted file mode 100644 index ca23ec2..0000000 --- a/GL/yalloc/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# Summary - -yalloc is a memory efficient allocator which is intended for embedded -applications that only have a low amount of RAM and want to maximize its -utilization. Properties of the allocator: - - - pools can be up to 128k - - user data is 32bit aligned - - 4 bytes overhead per allocation - - supports defragmentation - - uses a free list for first fit allocation strategy (most recently freed - blocks are used first) - - extensively tested (see section below) - - MIT license - -# Defragmentation - -This feature was the initial motivation for this implementation. Especially -when dealing with highly memory constrained environments fragmenting memory -pools can be annoying. For this reason this implementation supports -defragmentation which moves all allocated blocks into a contiguous range at the -beginning of the pool, leaving a maximized free range at the end. - -As there is no garbage collector or other runtime system involved that updates -the references, the application must do so. This is done in three steps: - - 1. yalloc_defrag_start() is called. This calculates the new - post-defragmentation-addresses for all allocations, but otherwise leaves - the allocations untouched. - - 2. yalloc_defrag_address() is called by the application for every pointer that - points to an allocation. It returns the post-defragmentation-address for - the allocation. The application must update all its relevant pointers this - way. Care must be taken not not yet dereference that moved pointers. If the - application works with hierarchical data then this can easily be done by - updating the pointers button up (first the leafs then their parents). - - 3. yalloc_defrag_commit() is called to finally perform the defragmentation. - All allocated blocks are moved to their post-defragmentation-address and - the application can continue using the pool the normal way. - -It is up to the application when (and if) it performs defragmentation. One -strategy would be to delay it until an allocation failure. Another approach -would be to perform the defragmentation regularly when there is nothing else to -do. - -# Configurable Defines - -INTERNAL_VALIDATE - -If this is not defined on the compiler commandline it will be defined as 0 if -NDEBUG is defined and otherwise as 1. If you want to disable internal -validation when NDEBUG is not defined then define INERNAL_VALIDATE as 0 on the -compiler commandline. - -If it is nonzero the heap will be validated via a bunch of assert() calls at -the end of every function that modifies the heap. This has roughly O(N*M) -overhead where N is the number of allocated blocks and M the number of free -blocks in a heap. For applications with enough live allocations this will get -significant. - -YALLOC_VALGRIND - -If this is defined in yalloc.c and NVALGRIND is not defined then -valgrind/memcheck.h is included and the the allocator functions tell valgrind -about the pool, the allocations and makes the block headers inaccessible outside -of yalloc-functions. This allows valgrind to detect a lot of the accidents that -can happen when dealing dynamic memory. This also adds some overhead for every -yalloc-call because most of them will "unprotect" the internal structure on -entry and "protect" it again (marking it as inaccessible for valgrind) before -returning. - -# Tests - -The tests rely on internal validation of the pool (see INTERNAL_VALIDATE) to -check that no assumptions about the internal structure of the pool are -violated. They additionally check for correctness of observations that can be -made by using the public functions of the allocator (like checking if user data -stays unmodified). There are a few different scripts that run tests: - - - run_coverage.sh runs a bunch of testfunctions that are carefully crafted to - cover all code paths. Coverage data is generated by clang and a summary is - shown at the end of the test. - - - run_valgrind.sh tests if the valgrind integration is working as expected, - runs the functions from the coverage test and some randomly generated - testcases under valgrind. - - - run_libfuzzer.sh uses libfuzzer from clang to generate interesting testcases - and runs them in multiple jobs in parallel for 10 seconds. It also generates - coverage data at the end (it always got 100% coverage in my testruns). - -All tests exit with 0 and print "All fine!" at the end if there where no -errors. Coverage deficits are not counted as error, so you have to look at the -summary (they should show 100% coverage!). - - -# Implementation Details - -The Headers and the user data are 32bit aligned. Headers have two 16bit fields -where the high 15 bits represent offsets (relative to the pools address) to the -previous/next block. The macros HDR_PTR() and HDR_OFFSET() are used to -translate an offset to an address and back. The 32bit alignment is exploited to -allow pools of up to 128k with that 15 significant bits. - -A pool is always occupied by non-overlapping blocks that link to their -previous/next block in address order via the prev/next field of Header. - -Free blocks are always joined: No two free blocks will ever be neighbors. - -Free blocks have an additional header of the same structure. This additional -header is used to build a list of free blocks (independent of their address -order). - -yalloc_free() will insert the freed block to the front of the free list. -yalloc_alloc() searches that list front to back and takes the first block that -is big enough to satisfy the allocation. - -There is always a Header at the front and at the end of the pool. The Header at -the end is degenerate: It is marked as "used" but has no next block (which is -usually used to determine the size of a block). - -The prev-field of the very first block in the pool has special meaning: It -points to the first free block in the pool. Or, if the pool is currently -defragmenting (after yalloc_defrag_start() and before yalloc_defrag_commit()), -points to the last header of the pool. This state can be recognized by checking -if it points to an empty block (normal pool state) or a used block -(defragmentation in progress). This logic can be seen in -yalloc_defrag_in_progress(). - -The lowest bit of next/prev have special meaning: - - - low bit of prev is set for free blocks - - - low bit of next is set for blocks with 32bit padding after the user data. - This is needed when a block is allocated from a free block that leaves only - 4 free bytes after the user data... which is not enough to insert a - free-header (which is needs 8 bytes). The padding will be reclaimed when - that block is freed or when the pool is defragmented. The predicate - isPadded() can be used to test if a block is padded. Free blocks are never - padded. - -The predicate isNil() can be used to test if an offset points nowhere (it tests -if all 15 high bits of an offset are 1). The constant NIL has all but the -lowest bit set. It is used to set offsets to point to nowhere, and in some -places it is used to mask out the actual address bits of an offset. This should -be kept in mind when modifying the code and updating prev/next: Think carefully -if you have to preserve the low bit when updating an offset! - -Defragmentation is done in two phases: First the user calls -yalloc_defrag_start(). This will put the pool in a special state where no -alloc/free-calls are allowed. In this state the prev-fields of the used blocks -have a special meaning: They store the offset that the block will have after -defragmentation finished. This information is used by yalloc_defrag_address() -which can be called by the application to query the new addresses for its -allocations. After the application has updated all its pointers it must call -yalloc_defrag_commit() which moves all used blocks in contiguous space at the -beginning of the pool, leaving one maximized free block at the end. diff --git a/GL/yalloc/yalloc.c b/GL/yalloc/yalloc.c deleted file mode 100644 index 6dcf0e5..0000000 --- a/GL/yalloc/yalloc.c +++ /dev/null @@ -1,803 +0,0 @@ -#include "yalloc.h" -#include "yalloc_internals.h" - -#include -#include - -#define ALIGN(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) - -#if defined(YALLOC_VALGRIND) && !defined(NVALGRIND) -# define USE_VALGRIND 1 -#else -# define USE_VALGRIND 0 -#endif - -#if USE_VALGRIND -# include -#else -# define VALGRIND_MAKE_MEM_UNDEFINED(p, s) ((void)0) -# define VALGRIND_MAKE_MEM_DEFINED(p, s) ((void)0) -# define VALGRIND_MAKE_MEM_NOACCESS(p, s) ((void)0) -# define VALGRIND_CREATE_MEMPOOL(pool, rz, z) ((void)0) -# define VALGRIND_MEMPOOL_ALLOC(pool, p, s) ((void)0) -# define VALGRIND_MEMPOOL_FREE(pool, p) ((void)0) -# define VALGRIND_MEMPOOL_CHANGE(pool, a, b, s) ((void)0) -#endif - -#define MARK_NEW_FREE_HDR(p) VALGRIND_MAKE_MEM_UNDEFINED(p, sizeof(Header) * 2) -#define MARK_NEW_HDR(p) VALGRIND_MAKE_MEM_UNDEFINED(p, sizeof(Header)) -#define PROTECT_HDR(p) VALGRIND_MAKE_MEM_NOACCESS(p, sizeof(Header)) -#define PROTECT_FREE_HDR(p) VALGRIND_MAKE_MEM_NOACCESS(p, sizeof(Header) * 2) -#define UNPROTECT_HDR(p) VALGRIND_MAKE_MEM_DEFINED(p, sizeof(Header)) -#define UNPROTECT_FREE_HDR(p) VALGRIND_MAKE_MEM_DEFINED(p, sizeof(Header) * 2) - - -#if USE_VALGRIND -static void _unprotect_pool(void * pool) -{ - Header * cur = (Header*)pool; - for (;;) - { - UNPROTECT_HDR(cur); - if (isFree(cur)) - UNPROTECT_HDR(cur + 1); - - if (isNil(cur->next)) - break; - - cur = HDR_PTR(cur->next); - } -} - -static void _protect_pool(void * pool) -{ - Header * cur = (Header*)pool; - while (cur) - { - Header * next = isNil(cur->next) ? NULL : HDR_PTR(cur->next); - - if (isFree(cur)) - VALGRIND_MAKE_MEM_NOACCESS(cur, (char*)next - (char*)cur); - else - PROTECT_HDR(cur); - - cur = next; - } -} -#define assert_is_pool(pool) assert(VALGRIND_MEMPOOL_EXISTS(pool)); - -#else - -static void _unprotect_pool(void * pool){(void)pool;} -static void _protect_pool(void * pool){(void)pool;} -#define assert_is_pool(pool) ((void)0) -#endif - -// internal version that does not unprotect/protect the pool -static int _yalloc_defrag_in_progress(void * pool) -{ - // fragmentation is indicated by a free list with one entry: the last block of the pool, which has its "free"-bit cleared. - Header * p = (Header*)pool; - if (isNil(p->prev)) - return 0; - - return !(HDR_PTR(p->prev)->prev & 1); -} - -int yalloc_defrag_in_progress(void * pool) -{ - _unprotect_pool(pool); - int ret = _yalloc_defrag_in_progress(pool); - _protect_pool(pool); - return ret; -} - -#if YALLOC_INTERNAL_VALIDATE - -static size_t _count_free_list_occurences(Header * pool, Header * blk) -{ - int n = 0; - if (!isNil(pool->prev)) - { - Header * cur = HDR_PTR(pool->prev); - for (;;) - { - if (cur == blk) - ++n; - - if (isNil(cur[1].next)) - break; - - cur = HDR_PTR(cur[1].next); - } - } - return n; -} - -static size_t _count_addr_list_occurences(Header * pool, Header * blk) -{ - size_t n = 0; - Header * cur = pool; - for (;;) - { - if (cur == blk) - ++n; - - if (isNil(cur->next)) - break; - - cur = HDR_PTR(cur->next); - } - return n; -} - -static void _validate_user_ptr(void * pool, void * p) -{ - Header * hdr = (Header*)p - 1; - size_t n = _count_addr_list_occurences((Header*)pool, hdr); - assert(n == 1 && !isFree(hdr)); -} - -/** -Validates if all the invariants of a pool are intact. - -This is very expensive when there are enough blocks in the heap (quadratic complexity!). -*/ -static void _yalloc_validate(void * pool_) -{ - Header * pool = (Header*)pool_; - Header * cur = pool; - - assert(!isNil(pool->next)); // there must always be at least two blocks: a free/used one and the final block at the end - - if (_yalloc_defrag_in_progress(pool)) - { - Header * prevUsed = NULL; - while (!isNil(cur->next)) - { - if (!isFree(cur)) - { // it is a used block - Header * newAddr = cur == pool ? pool : HDR_PTR(cur->prev); - assert(newAddr <= cur); - assert(newAddr >= pool); - - if (prevUsed) - { - Header * prevNewAddr = prevUsed == pool ? pool : HDR_PTR(prevUsed->prev); - size_t prevBruttoSize = (char*)HDR_PTR(prevUsed->next) - (char*)prevUsed; - if (isPadded(prevUsed)) - prevBruttoSize -= 4; // remove padding - assert((char*)newAddr == (char*)prevNewAddr + prevBruttoSize); - } - else - { - assert(newAddr == pool); - } - - prevUsed = cur; - } - - cur = HDR_PTR(cur->next); - } - - assert(cur == HDR_PTR(pool->prev)); // the free-list should point to the last block - assert(!isFree(cur)); // the last block must not be free - } - else - { - Header * prev = NULL; - - // iterate blocks in address order - for (;;) - { - if (prev) - { - Header * x = HDR_PTR(cur->prev); - assert(x == prev); - } - - int n = _count_free_list_occurences(pool, cur); - if (isFree(cur)) - { // it is a free block - assert(n == 1); - assert(!isPadded(cur)); // free blocks must have a zero padding-bit - - if (prev) - { - assert(!isFree(prev)); // free blocks must not be direct neighbours - } - } - else - { - assert(n == 0); - } - - if (isNil(cur->next)) - break; - - Header * next = HDR_PTR(cur->next); - assert((char*)next >= (char*)cur + sizeof(Header) * 2); - prev = cur; - cur = next; - } - - assert(isNil(cur->next)); - - if (!isNil(pool->prev)) - { - // iterate free-list - Header * f = HDR_PTR(pool->prev); - assert(isNil(f[1].prev)); - for (;;) - { - assert(isFree(f)); // must be free - - int n = _count_addr_list_occurences(pool, f); - assert(n == 1); - - if (isNil(f[1].next)) - break; - - f = HDR_PTR(f[1].next); - } - } - } -} - -#else -static void _yalloc_validate(void * pool){(void)pool;} -static void _validate_user_ptr(void * pool, void * p){(void)pool; (void)p;} -#endif - -int yalloc_init(void * pool, size_t size) -{ - if (size > MAX_POOL_SIZE) - return -1; - - // TODO: Error when pool is not properly aligned - - // TODO: Error when size is not a multiple of the alignment? - while (size % sizeof(Header)) - --size; - - if(size < sizeof(Header) * 3) - return -1; - - VALGRIND_CREATE_MEMPOOL(pool, 0, 0); - - Header * first = (Header*)pool; - Header * last = (Header*)((char*)pool + size) - 1; - - MARK_NEW_FREE_HDR(first); - MARK_NEW_HDR(first); - - first->prev = HDR_OFFSET(first) | 1; - first->next = HDR_OFFSET(last); - first[1].prev = NIL; - first[1].next = NIL; - - last->prev = HDR_OFFSET(first); - last->next = NIL; - - _unprotect_pool(pool); - _yalloc_validate(pool); - _protect_pool(pool); - return 0; -} - -void yalloc_deinit(void * pool) -{ -#if USE_VALGRIND - VALGRIND_DESTROY_MEMPOOL(pool); - - Header * last = (Header*)pool; - UNPROTECT_HDR(last); - while (!isNil(last->next)) - { - Header * next = HDR_PTR(last->next); - UNPROTECT_HDR(next); - last = next; - } - - VALGRIND_MAKE_MEM_UNDEFINED(pool, (char*)(last + 1) - (char*)pool); -#else - (void)pool; -#endif -} - - -void * yalloc_alloc(void * pool, size_t size) -{ - assert_is_pool(pool); - _unprotect_pool(pool); - assert(!_yalloc_defrag_in_progress(pool)); - _yalloc_validate(pool); - if (!size) - { - _protect_pool(pool); - return NULL; - } - - Header * root = (Header*)pool; - if (isNil(root->prev)) - { - _protect_pool(pool); - return NULL; /* no free block, no chance to allocate anything */ // TODO: Just read up which C standard supports single line comments and then fucking use them! - } - - /* round up to alignment */ - size = ALIGN(size, 32); - - size_t bruttoSize = size + sizeof(Header); - Header * prev = NULL; - Header * cur = HDR_PTR(root->prev); - for (;;) - { - size_t curSize = (char*)HDR_PTR(cur->next) - (char*)cur; /* size of the block, including its header */ - - if (curSize >= bruttoSize) // it is big enough - { - // take action for unused space in the free block - if (curSize >= bruttoSize + sizeof(Header) * 2) - { // the leftover space is big enough to make it a free block - // Build a free block from the unused space and insert it into the list of free blocks after the current free block - Header * tail = (Header*)((char*)cur + bruttoSize); - MARK_NEW_FREE_HDR(tail); - - // update address-order-list - tail->next = cur->next; - tail->prev = HDR_OFFSET(cur) | 1; - HDR_PTR(cur->next)->prev = HDR_OFFSET(tail); // NOTE: We know the next block is used because free blocks are never neighbours. So we don't have to care about the lower bit which would be set for the prev of a free block. - cur->next = HDR_OFFSET(tail); - - // update list of free blocks - tail[1].next = cur[1].next; - // NOTE: tail[1].prev is updated in the common path below (assignment to "HDR_PTR(cur[1].next)[1].prev") - - if (!isNil(cur[1].next)) - HDR_PTR(cur[1].next)[1].prev = HDR_OFFSET(tail); - cur[1].next = HDR_OFFSET(tail); - } - else if (curSize > bruttoSize) - { // there will be unused space, but not enough to insert a free header - internal_assert(curSize - bruttoSize == sizeof(Header)); // unused space must be enough to build a free-block or it should be exactly the size of a Header - cur->next |= 1; // set marker for "has unused trailing space" - } - else - { - internal_assert(curSize == bruttoSize); - } - - cur->prev &= NIL; // clear marker for "is a free block" - - // remove from linked list of free blocks - if (prev) - prev[1].next = cur[1].next; - else - { - uint32_t freeBit = isFree(root); - root->prev = (cur[1].next & NIL) | freeBit; - } - - if (!isNil(cur[1].next)) - HDR_PTR(cur[1].next)[1].prev = prev ? HDR_OFFSET(prev) : NIL; - - _yalloc_validate(pool); - VALGRIND_MEMPOOL_ALLOC(pool, cur + 1, size); - _protect_pool(pool); - return cur + 1; // return address after the header - } - - if (isNil(cur[1].next)) - break; - - prev = cur; - cur = HDR_PTR(cur[1].next); - } - - _yalloc_validate(pool); - _protect_pool(pool); - return NULL; -} - -// Removes a block from the free-list and moves the pools first-free-bock pointer to its successor if it pointed to that block. -static void unlink_from_free_list(Header * pool, Header * blk) -{ - // update the pools pointer to the first block in the free list if necessary - if (isNil(blk[1].prev)) - { // the block is the first in the free-list - // make the pools first-free-pointer point to the next in the free list - uint32_t freeBit = isFree(pool); - pool->prev = (blk[1].next & NIL) | freeBit; - } - else - HDR_PTR(blk[1].prev)[1].next = blk[1].next; - - if (!isNil(blk[1].next)) - HDR_PTR(blk[1].next)[1].prev = blk[1].prev; -} - -size_t yalloc_block_size(void * pool, void * p) -{ - Header * a = (Header*)p - 1; - UNPROTECT_HDR(a); - Header * b = HDR_PTR(a->next); - size_t payloadSize = (char*)b - (char*)p; - if (isPadded(a)) - payloadSize -= sizeof(Header); - PROTECT_HDR(a); - return payloadSize; -} - -void yalloc_free(void * pool_, void * p) -{ - assert_is_pool(pool_); - assert(!yalloc_defrag_in_progress(pool_)); - if (!p) - return; - - _unprotect_pool(pool_); - - Header * pool = (Header*)pool_; - Header * cur = (Header*)p - 1; - - // get pointers to previous/next block in address order - Header * prev = cur == pool || isNil(cur->prev) ? NULL : HDR_PTR(cur->prev); - Header * next = isNil(cur->next) ? NULL : HDR_PTR(cur->next); - - int prevFree = prev && isFree(prev); - int nextFree = next && isFree(next); - -#if USE_VALGRIND - { - unsigned errs = VALGRIND_COUNT_ERRORS; - VALGRIND_MEMPOOL_FREE(pool, p); - if (VALGRIND_COUNT_ERRORS > errs) - { // early exit if the free was invalid (so we get a valgrind error and don't mess up the pool, which is helpful for testing if invalid frees are detected by valgrind) - _protect_pool(pool_); - return; - } - } -#endif - - _validate_user_ptr(pool_, p); - - if (prevFree && nextFree) - { // the freed block has two free neighbors - unlink_from_free_list(pool, prev); - unlink_from_free_list(pool, next); - - // join prev, cur and next - prev->next = next->next; - HDR_PTR(next->next)->prev = cur->prev; - - // prev is now the block we want to push onto the free-list - cur = prev; - } - else if (prevFree) - { - unlink_from_free_list(pool, prev); - - // join prev and cur - prev->next = cur->next; - HDR_PTR(cur->next)->prev = cur->prev; - - // prev is now the block we want to push onto the free-list - cur = prev; - } - else if (nextFree) - { - unlink_from_free_list(pool, next); - - // join cur and next - cur->next = next->next; - HDR_PTR(next->next)->prev = next->prev & NIL; - } - - // if there is a previous block and that block has padding then we want to grow the new free block into that padding - if (cur != pool && !isNil(cur->prev)) - { // there is a previous block - Header * left = HDR_PTR(cur->prev); - if (isPadded(left)) - { // the previous block has padding, so extend the current block to consume move the padding to the current free block - Header * grown = cur - 1; - MARK_NEW_HDR(grown); - grown->next = cur->next; - grown->prev = cur->prev; - left->next = HDR_OFFSET(grown); - if (!isNil(cur->next)) - HDR_PTR(cur->next)->prev = HDR_OFFSET(grown); - - cur = grown; - } - } - - cur->prev |= 1; // it becomes a free block - cur->next &= NIL; // reset padding-bit - UNPROTECT_HDR(cur + 1); - cur[1].prev = NIL; // it will be the first free block in the free list, so it has no prevFree - - if (!isNil(pool->prev)) - { // the free-list was already non-empty - HDR_PTR(pool->prev)[1].prev = HDR_OFFSET(cur); // make the first entry in the free list point back to the new free block (it will become the first one) - cur[1].next = pool->prev; // the next free block is the first of the old free-list - } - else - cur[1].next = NIL; // free-list was empty, so there is no successor - - VALGRIND_MAKE_MEM_NOACCESS(cur + 2, (char*)HDR_PTR(cur->next) - (char*)(cur + 2)); - - // now the freed block is the first in the free-list - - // update the offset to the first element of the free list - uint32_t freeBit = isFree(pool); // remember the free-bit of the offset - pool->prev = HDR_OFFSET(cur) | freeBit; // update the offset and restore the free-bit - _yalloc_validate(pool); - _protect_pool(pool); -} - -size_t yalloc_count_free(void * pool_) -{ - assert_is_pool(pool_); - _unprotect_pool(pool_); - assert(!_yalloc_defrag_in_progress(pool_)); - Header * pool = (Header*)pool_; - size_t bruttoFree = 0; - Header * cur = pool; - - _yalloc_validate(pool); - - for (;;) - { - if (isFree(cur)) - { // it is a free block - bruttoFree += (char*)HDR_PTR(cur->next) - (char*)cur; - } - else - { // it is a used block - if (isPadded(cur)) - { // the used block is padded - bruttoFree += sizeof(Header); - } - } - - if (isNil(cur->next)) - break; - - cur = HDR_PTR(cur->next); - } - - _protect_pool(pool); - - if (bruttoFree < sizeof(Header)) - { - internal_assert(!bruttoFree); // free space should always be a multiple of sizeof(Header) - return 0; - } - - return bruttoFree - sizeof(Header); -} - -size_t yalloc_count_continuous(void * pool_) -{ - assert_is_pool(pool_); - _unprotect_pool(pool_); - assert(!_yalloc_defrag_in_progress(pool_)); - Header * pool = (Header*)pool_; - size_t largestFree = 0; - Header * cur = pool; - - _yalloc_validate(pool); - - for (;;) - { - if (isFree(cur)) - { // it is a free block - size_t temp = (uintptr_t)HDR_PTR(cur->next) - (uintptr_t)cur; - if(temp > largestFree) - largestFree = temp; - } - - if (isNil(cur->next)) - break; - - cur = HDR_PTR(cur->next); - } - - _protect_pool(pool); - - if (largestFree < sizeof(Header)) - { - internal_assert(!largestFree); // free space should always be a multiple of sizeof(Header) - return 0; - } - - return largestFree - sizeof(Header); -} - -void * yalloc_first_used(void * pool) -{ - assert_is_pool(pool); - _unprotect_pool(pool); - Header * blk = (Header*)pool; - while (!isNil(blk->next)) - { - if (!isFree(blk)) - { - _protect_pool(pool); - return blk + 1; - } - - blk = HDR_PTR(blk->next); - } - - _protect_pool(pool); - return NULL; -} - -void * yalloc_next_used(void * pool, void * p) -{ - assert_is_pool(pool); - _unprotect_pool(pool); - _validate_user_ptr(pool, p); - Header * prev = (Header*)p - 1; - assert(!isNil(prev->next)); // the last block should never end up as input to this function (because it is not user-visible) - - Header * blk = HDR_PTR(prev->next); - while (!isNil(blk->next)) - { - if (!isFree(blk)) - { - _protect_pool(pool); - return blk + 1; - } - - blk = HDR_PTR(blk->next); - } - - _protect_pool(pool); - return NULL; -} - -void yalloc_defrag_start(void * pool_) -{ - assert_is_pool(pool_); - _unprotect_pool(pool_); - assert(!_yalloc_defrag_in_progress(pool_)); - Header * pool = (Header*)pool_; - - // iterate over all blocks in address order and store the post-defragment address of used blocks in their "prev" field - size_t end = 0; // offset for the next used block - Header * blk = (Header*)pool; - for (; !isNil(blk->next); blk = HDR_PTR(blk->next)) - { - if (!isFree(blk)) - { // it is a used block - blk->prev = end >> 1; - internal_assert((char*)HDR_PTR(blk->prev) == (char*)pool + end); - - size_t bruttoSize = (char*)HDR_PTR(blk->next) - (char*)blk; - - if (isPadded(blk)) - { // the block is padded - bruttoSize -= sizeof(Header); - } - - end += bruttoSize; - internal_assert(end % sizeof(Header) == 0); - } - } - - // blk is now the last block (the dummy "used" block at the end of the pool) - internal_assert(isNil(blk->next)); - internal_assert(!isFree(blk)); - - // mark the pool as "defragementation in progress" - uint32_t freeBit = isFree(pool); - pool->prev = (HDR_OFFSET(blk) & NIL) | freeBit; - - _yalloc_validate(pool); - internal_assert(yalloc_defrag_in_progress(pool)); - _protect_pool(pool); -} - -void * yalloc_defrag_address(void * pool_, void * p) -{ - assert_is_pool(pool_); - assert(yalloc_defrag_in_progress(pool_)); - if (!p) - return NULL; - - Header * pool = (Header*)pool_; - - _unprotect_pool(pool); - _validate_user_ptr(pool_, p); - - if (pool + 1 == p) - return pool + 1; // "prev" of the first block points to the last used block to mark the pool as "defragmentation in progress" - - Header * blk = (Header*)p - 1; - - void * defragP = HDR_PTR(blk->prev) + 1; - - _protect_pool(pool); - return defragP; -} - -void yalloc_defrag_commit(void * pool_) -{ - assert_is_pool(pool_); - _unprotect_pool(pool_); - assert(_yalloc_defrag_in_progress(pool_)); - Header * pool = (Header*)pool_; - - // iterate over all blocks in address order and move them - size_t end = 0; // offset for the next used block - Header * blk = pool; - Header * lastUsed = NULL; - while (!isNil(blk->next)) - { - if (!isFree(blk)) - { // it is a used block - size_t bruttoSize = (char*)HDR_PTR(blk->next) - (char*)blk; - - if (isPadded(blk)) - { // the block is padded - bruttoSize -= sizeof(Header); - } - - Header * next = HDR_PTR(blk->next); - - blk->prev = lastUsed ? HDR_OFFSET(lastUsed) : NIL; - blk->next = (end + bruttoSize) >> 1; - - lastUsed = (Header*)((char*)pool + end); - VALGRIND_MAKE_MEM_UNDEFINED(lastUsed, (char*)blk - (char*)lastUsed); - memmove(lastUsed, blk, bruttoSize); - VALGRIND_MEMPOOL_CHANGE(pool, blk + 1, lastUsed + 1, bruttoSize - sizeof(Header)); - - end += bruttoSize; - blk = next; - } - else - blk = HDR_PTR(blk->next); - } - - // blk is now the last block (the dummy "used" block at the end of the pool) - internal_assert(isNil(blk->next)); - internal_assert(!isFree(blk)); - - if (lastUsed) - { - Header * gap = HDR_PTR(lastUsed->next); - if (gap == blk) - { // there is no gap - pool->prev = NIL; // the free list is empty - blk->prev = HDR_OFFSET(lastUsed); - } - else if (blk - gap > 1) - { // the gap is big enouogh for a free Header - - // set a free list that contains the gap as only element - gap->prev = HDR_OFFSET(lastUsed) | 1; - gap->next = HDR_OFFSET(blk); - gap[1].prev = NIL; - gap[1].next = NIL; - pool->prev = blk->prev = HDR_OFFSET(gap); - } - else - { // there is a gap, but it is too small to be used as free-list-node, so just make it padding of the last used block - lastUsed->next = HDR_OFFSET(blk) | 1; - pool->prev = NIL; - blk->prev = HDR_OFFSET(lastUsed); - } - } - else - { // the pool is empty - pool->prev = 1; - } - - internal_assert(!_yalloc_defrag_in_progress(pool)); - _yalloc_validate(pool); - _protect_pool(pool); -} diff --git a/GL/yalloc/yalloc.h b/GL/yalloc/yalloc.h deleted file mode 100644 index 4349eb9..0000000 --- a/GL/yalloc/yalloc.h +++ /dev/null @@ -1,176 +0,0 @@ -/** -@file - -API of the yalloc allocator. -*/ - -#ifndef YALLOC_H -#define YALLOC_H - -#include - -/** -Maximum supported pool size. yalloc_init() will fail for larger pools. -*/ -#define MAX_POOL_SIZE ((2 << 24) - 4) - -/** -Creates a pool inside a given buffer. - -Pools must be deinitialized with yalloc_deinit() when they are no longer needed. - -@param pool The starting address of the pool. It must have at least 16bit -alignment (internal structure uses 16bit integers). Allocations are placed at -32bit boundaries starting from this address, so if the user data should be -32bit aligned then this address has to be 32bit aligned. Typically an address -of static memory, or an array on the stack is used if the pool is only used -temporarily. -@param size Size of the pool. -@return 0 on success, nonzero if the size is not supported. - */ -int yalloc_init(void * pool, size_t size); - -/** -Deinitializes the buffer that is used by the pool and makes it available for other use. - -The content of the buffer is undefined after this. - -@param pool The starting address of an initialized pool. -*/ -void yalloc_deinit(void * pool); - -/** -Allocates a block of memory from a pool. - -This function mimics malloc(). - -The pool must not be in the "defragmenting" state when this function is called. - -@param pool The starting address of an initialized pool. -@param size Number of bytes to allocate. -@return Allocated buffer or \c NULL if there was no free range that could serve -the allocation. See @ref yalloc_defrag_start() for a way to remove -fragmentation which may cause allocations to fail even when there is enough -space in total. -*/ -void * yalloc_alloc(void * pool, size_t size); - -/** -Returns an allocation to a pool. - -This function mimics free(). - -The pool must not be in the "defragmenting" state when this function is called. - -@param pool The starting address of the initialized pool the allocation comes from. -@param p An address that was returned from yalloc_alloc() of the same pool. -*/ -void yalloc_free(void * pool, void * p); - -/** -Returns the maximum size of a successful allocation (assuming a completely unfragmented heap). - -After defragmentation the first allocation with the returned size is guaranteed to succeed. - -@param pool The starting address of an initialized pool. -@return Number of bytes that can be allocated (assuming the pool is defragmented). -*/ -size_t yalloc_count_free(void * pool); - -/** -Returns the maximum continuous free area. - -@param pool The starting address of an initialized pool. -@return Number of free bytes that exist continuously. -*/ -size_t yalloc_count_continuous(void * pool_); - -/** -Queries the usable size of an allocated block. - -@param pool The starting address of the initialized pool the allocation comes from. -@param p An address that was returned from yalloc_alloc() of the same pool. -@return Size of the memory block. This is the size passed to @ref yalloc_alloc() rounded up to 4. -*/ -size_t yalloc_block_size(void * pool, void * p); - -/** -Finds the first (in address order) allocation of a pool. - -@param pool The starting address of an initialized pool. -@return Address of the allocation the lowest address inside the pool (this is -what @ref yalloc_alloc() returned), or \c NULL if there is no used block. -*/ -void * yalloc_first_used(void * pool); - -/** -Given a pointer to an allocation finds the next (in address order) used block of a pool. - -@param pool The starting address of the initialized pool the allocation comes from. -@param p Pointer to an allocation in that pool, typically comes from a previous -call to @ref yalloc_first_used() -*/ -void * yalloc_next_used(void * pool, void * p); - -/** -Starts defragmentation for a pool. - -Allocations will stay where they are. But the pool is put in the "defagmenting" -state (see @ref yalloc_defrag_in_progress()). - -The pool must not be in the "defragmenting" state when this function is called. -The pool is put into the "defragmenting" state by this function. - -@param pool The starting address of an initialized pool. -*/ -void yalloc_defrag_start(void * pool); - -/** -Returns the address that an allocation will have after @ref yalloc_defrag_commit() is called. - -The pool must be in the "defragmenting" state when this function is called. - -@param pool The starting address of the initialized pool the allocation comes from. -@param p Pointer to an allocation in that pool. -@return The address the alloation will have after @ref yalloc_defrag_commit() is called. -*/ -void * yalloc_defrag_address(void * pool, void * p); - -/** -Finishes the defragmentation. - -The content of all allocations in the pool will be moved to the address that -was reported by @ref yalloc_defrag_address(). The pool will then have only one -free block. This means that an yalloc_alloc(pool, yalloc_count_free(pool)) -will succeed. - -The pool must be in the "defragmenting" state when this function is called. The -pool is put back to normal state by this function. - -@param pool The starting address of an initialized pool. -*/ -void yalloc_defrag_commit(void * pool); - -/** -Tells if the pool is in the "defragmenting" state (after a @ref yalloc_defrag_start() and before a @ref yalloc_defrag_commit()). - -@param pool The starting address of an initialized pool. -@return Nonzero if the pool is currently in the "defragmenting" state. -*/ -int yalloc_defrag_in_progress(void * pool); - - -/** -Helper function that dumps the state of the pool to stdout. - -This function is only available if build with yalloc_dump.c. This -function only exists for debugging purposes and can be ignored by normal users -that are not interested in the internal structure of the implementation. - -@param pool The starting address of an initialized pool. -@param name A string that is used as "Title" for the output. -*/ -void yalloc_dump(void * pool, char * name); - - -#endif // YALLOC_H diff --git a/GL/yalloc/yalloc_dump.c b/GL/yalloc/yalloc_dump.c deleted file mode 100644 index f0dfdcb..0000000 --- a/GL/yalloc/yalloc_dump.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "yalloc_internals.h" - -#include - -static void printOffset(void * pool, char * name, uint16_t offset) -{ - if (isNil(offset)) - printf(" %s: nil\n", name); - else - printf(" %s: %td\n", name, (char*)HDR_PTR(offset) - (char*)pool); -} - -void yalloc_dump(void * pool, char * name) -{ - printf("---- %s ----\n", name); - Header * cur = (Header*)pool; - for (;;) - { - printf(isFree(cur) ? "%td: free @%p\n" : "%td: used @%p\n", (char*)cur - (char*)pool, cur); - printOffset(pool, cur == pool ? "first free" : "prev", cur->prev); - printOffset(pool, "next", cur->next); - if (isFree(cur)) - { - printOffset(pool, "prevFree", cur[1].prev); - printOffset(pool, "nextFree", cur[1].next); - } - else - printf(" payload includes padding: %i\n", isPadded(cur)); - - if (isNil(cur->next)) - break; - - printf(" %td bytes payload\n", (char*)HDR_PTR(cur->next) - (char*)cur - sizeof(Header)); - - cur = HDR_PTR(cur->next); - } - - fflush(stdout); -} diff --git a/GL/yalloc/yalloc_internals.h b/GL/yalloc/yalloc_internals.h deleted file mode 100644 index ffb70cb..0000000 --- a/GL/yalloc/yalloc_internals.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef YALLOC_INTERNALS_H -#define YALLOC_INTERNALS_H - -#include - -typedef struct -{ - uint32_t prev; // low bit set if free - uint32_t next; // for used blocks: low bit set if unused header at the end - - /* We need user data to be 32-byte aligned, so the header needs - * to be 32 bytes in size (as user data follows the header) */ - uint8_t padding[32 - (sizeof(uint32_t) * 2)]; -} Header; - -// NOTE: We have 32bit aligned data and 16bit offsets where the lowest bit is used as flag. So we remove the low bit and shift by 1 to address 128k bytes with the 15bit significant offset bits. - -#define NIL 0xFFFFFFFEu - -// return Header-address for a prev/next -#define HDR_PTR(offset) ((Header*)((char*)pool + (((offset) & NIL)<<1))) - -// return a prev/next for a Header-address -#define HDR_OFFSET(blockPtr) ((uint32_t)(((char*)blockPtr - (char*)pool) >> 1)) - -#ifndef YALLOC_INTERNAL_VALIDATE -# ifdef NDEBUG -# define YALLOC_INTERNAL_VALIDATE 0 -# else -# define YALLOC_INTERNAL_VALIDATE 1 -#endif -#endif - - -/* -internal_assert() is used in some places to check internal expections. -Activate this if you modify the code to detect problems as early as possible. -In other cases this should be deactivated. -*/ -#if 0 -#define internal_assert assert -#else -#define internal_assert(condition)((void) 0) -#endif - -// detects offsets that point nowhere -static inline int isNil(uint32_t offset) -{ - return (offset | 1) == 0xFFFFFFFF; -} - -static inline int isFree(Header * hdr) -{ - return hdr->prev & 1; -} - -static inline int isPadded(Header * hdr) -{ - return hdr->next & 1; -} - - -#endif // YALLOC_INTERNALS_H From cfbaea4a465bd9bdd1347e3b5c8f87ae4a53f7a6 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 08:52:01 +0100 Subject: [PATCH 07/33] Don't calculate things twice --- GL/alloc/alloc.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index 45e2ebc..42b64e0 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -101,7 +101,13 @@ size_t alloc_block_count(void* pool) { return pool_header.block_count; } +void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_subblock, size_t* required_subblocks); + void* alloc_next_available(void* pool, size_t required_size) { + return alloc_next_available_ex(pool, required_size, NULL, NULL); +} + +void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_subblock_out, size_t* required_subblocks_out) { (void) pool; uint8_t* it = pool_header.block_usage; @@ -110,6 +116,10 @@ void* alloc_next_available(void* pool, size_t required_size) { uint8_t* end = pool_header.block_usage + pool_header.block_count; + if(required_subblocks_out) { + *required_subblocks_out = required_subblocks; + } + while(it < end) { // Skip full blocks while((*it) == 255) { @@ -155,6 +165,11 @@ void* alloc_next_available(void* pool, size_t required_size) { uintptr_t offset = (it - pool_header.block_usage) * 8; offset += (i + 1); offset -= required_subblocks; + + if(start_subblock_out) { + *start_subblock_out = offset; + } + return pool_header.base_address + (offset * 256); } } @@ -226,14 +241,14 @@ static inline uint32_t subblock_from_pointer(void* p) { } void* alloc_malloc(void* pool, size_t size) { - void* ret = alloc_next_available(pool, size); + size_t start_subblock, required_subblocks; + void* ret = alloc_next_available_ex(pool, size, &start_subblock, &required_subblocks); + if(size >= 2048) { assert(((uintptr_t) ret) % 2048 == 0); } if(ret) { - uintptr_t start_subblock = subblock_from_pointer(ret); - uint32_t required_subblocks = size_to_subblock_count(size); size_t offset = start_subblock % 8; size_t block = start_subblock / 8; uint8_t mask = 0; From 246cb997dabe0ea377d5f052c78eabdcfcf198eb Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 20:22:19 +0100 Subject: [PATCH 08/33] Add optional dcprof to prof_texture_upload --- CMakeLists.txt | 4 ++-- samples/prof_texture_upload/main.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c148059..51ad8ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,11 +210,11 @@ gen_sample(polymark samples/polymark/main.c) gen_sample(cubes samples/cubes/main.cpp) gen_sample(zclip_test tests/zclip/main.cpp) -gen_sample(prof_texture_upload samples/prof_texture_upload/main.c) - if(PLATFORM_DREAMCAST) gen_sample(trimark samples/trimark/main.c) gen_sample(quadmark samples/quadmark/main.c samples/profiler.c) + gen_sample(prof_texture_upload samples/prof_texture_upload/main.c samples/profiler.c) else() gen_sample(quadmark samples/quadmark/main.c) + gen_sample(prof_texture_upload samples/prof_texture_upload/main.c) endif() diff --git a/samples/prof_texture_upload/main.c b/samples/prof_texture_upload/main.c index d2fd12f..4981679 100644 --- a/samples/prof_texture_upload/main.c +++ b/samples/prof_texture_upload/main.c @@ -4,6 +4,7 @@ #ifdef __DREAMCAST__ #include +#include "../profiler.h" #endif #include @@ -11,11 +12,13 @@ #include "image.h" +#define PROFILE 0 int main(int argc, char* argv[]) { (void) argc; (void) argv; + fprintf(stdout, "Initializing\n"); glKosInit(); glClearColor(0.5f, 0.0f, 0.5f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -32,6 +35,13 @@ int main(int argc, char* argv[]) { fprintf(stderr, "Starting test run...\n"); +#ifdef __DREAMCAST__ +#if PROFILE + profiler_init("/pc/gmon.out"); + profiler_start(); +#endif +#endif + while((end - start) < 5) { glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, header_data @@ -41,6 +51,13 @@ int main(int argc, char* argv[]) { end = time(NULL); } +#ifdef __DREAMCAST__ +#if PROFILE + profiler_stop(); + profiler_clean_up(); +#endif +#endif + fprintf(stderr, "Called glTexImage2D %d times (%.4f per call)\n", counter, (float)(end - start) / (float)(counter)); return 0; From 36de063756c6055a6944d086ba5efa423f328826 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 20:22:38 +0100 Subject: [PATCH 09/33] Allow configuring automatic texture twiddling in glKosInitEx Defaults to enabled. --- GL/flush.c | 6 ++++++ include/GL/glkos.h | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/GL/flush.c b/GL/flush.c index b2aab2d..75da3c8 100644 --- a/GL/flush.c +++ b/GL/flush.c @@ -47,6 +47,8 @@ void APIENTRY glKosInitConfig(GLdcConfig* config) { config->initial_tr_capacity = 1024 * 3; config->initial_immediate_capacity = 1024 * 3; config->internal_palette_format = GL_RGBA8; + + config->texture_twiddle = GL_TRUE; } static bool _initialized = false; @@ -78,6 +80,10 @@ void APIENTRY glKosInitEx(GLdcConfig* config) { _glInitTextures(); + if(config->texture_twiddle) { + glEnable(GL_TEXTURE_TWIDDLE_KOS); + } + OP_LIST.list_type = GPU_LIST_OP_POLY; PT_LIST.list_type = GPU_LIST_PT_POLY; TR_LIST.list_type = GPU_LIST_TR_POLY; diff --git a/include/GL/glkos.h b/include/GL/glkos.h index 5307d6b..3dfe9ad 100644 --- a/include/GL/glkos.h +++ b/include/GL/glkos.h @@ -57,6 +57,13 @@ typedef struct { GLuint initial_pt_capacity; GLuint initial_immediate_capacity; + /* Default: True + * + * Whether glTexImage should automatically twiddle textures + * if the internal format is a generic format (e.g. GL_RGB). + * this is the same as calling glEnable(GL_TEXTURE_TWIDDLE_KOS) + * on boot */ + GLboolean texture_twiddle; } GLdcConfig; From b19b9d498ad876c4a828ef07a5d3b0537d086782 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 20:25:21 +0100 Subject: [PATCH 10/33] Clean up the allocator code --- GL/alloc/alloc.c | 58 ++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index 42b64e0..b263d46 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -116,47 +116,41 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su uint8_t* end = pool_header.block_usage + pool_header.block_count; + /* Anything gte to 2048 must be aligned to a 2048 boundary */ + bool requires_alignment = required_size >= 2048; + if(required_subblocks_out) { *required_subblocks_out = required_subblocks; } - while(it < end) { - // Skip full blocks - while((*it) == 255) { - ++it; - if(it >= pool_header.block_usage + sizeof(pool_header.block_usage)) { - return NULL; - } - continue; - } - uint32_t found_subblocks = 0; - /* Anything gte to 2048 must be aligned to a 2048 boundary */ - bool requires_alignment = required_size >= 2048; - /* We just need to find enough consecutive blocks */ while(found_subblocks < required_subblocks) { uint8_t t = *it; /* Optimisation only. Skip over full blocks */ if(t == 255) { - ++it; found_subblocks = 0; - - if(it >= end) { - return NULL; - } - - continue; - } - - /* Now let's see how many consecutive blocks we can find */ - for(int i = 0; i < 8; ++i) { - if((t & 0x80) == 0) { - if(requires_alignment && found_subblocks == 0 && i != 0) { - // Ignore this subblock, because we want the first subblock to be aligned - // at a 2048 boundary and this one isn't (i != 0) + } else { + /* Now let's see how many consecutive blocks we can find */ + for(int i = 0; i < 8; ++i) { + if((t & 0x80) == 0) { + if(requires_alignment && found_subblocks == 0 && i != 0) { + // Ignore this subblock, because we want the first subblock to be aligned + // at a 2048 boundary and this one isn't (i != 0) + found_subblocks = 0; + } else { + found_subblocks++; + if(found_subblocks >= required_subblocks) { + /* We found space! Now calculate the address */ + uintptr_t offset = (it - pool_header.block_usage) * 8; + offset += (i + 1); + offset -= required_subblocks; + return pool_header.base_address + (offset * 256); + } + } + } else { found_subblocks = 0; } else { found_subblocks++; @@ -173,11 +167,9 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su return pool_header.base_address + (offset * 256); } } - } else { - found_subblocks = 0; - } - t <<= 1; + t <<= 1; + } } ++it; @@ -185,7 +177,6 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su return NULL; } } - } return NULL; @@ -279,7 +270,6 @@ void* alloc_malloc(void* pool, size_t size) { pool_header.block_usage[block++] |= mask; } - /* Insert allocations in the list by size descending so that when we * defrag we can move the larger blocks before the smaller ones without * much effort */ From 5e7b33797df32c88b87871dcf5cfa777a4c9d484 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 20:23:22 +0100 Subject: [PATCH 11/33] Perf improvements and fixes --- GL/texture.c | 113 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 35 deletions(-) diff --git a/GL/texture.c b/GL/texture.c index e699e3c..e8e33e1 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -31,6 +31,10 @@ static GLboolean SUBBANKS_USED[MAX_GLDC_PALETTE_SLOTS][MAX_GLDC_4BPP_PALETTE_SLO static GLenum INTERNAL_PALETTE_FORMAT = GL_RGBA8; static GLboolean TEXTURE_TWIDDLE_ENABLED = GL_FALSE; +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) +#define INFO_MSG(x) fprintf(stderr, "%s:%s > %s\n", __FILE__, TOSTRING(__LINE__), x) + static void* ALLOC_BASE = NULL; static size_t ALLOC_SIZE = 0; @@ -1018,6 +1022,30 @@ static GLuint _determinePVRFormat(GLint internalFormat) { return GPU_TXRFMT_PAL8BPP | GPU_TXRFMT_TWIDDLED; case GL_COLOR_INDEX4_TWID_KOS: return GPU_TXRFMT_PAL4BPP | GPU_TXRFMT_TWIDDLED; + case GL_COMPRESSED_ARGB_1555_VQ_KOS: + return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_VQ_ENABLE; + case GL_COMPRESSED_ARGB_1555_VQ_TWID_KOS: + return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_VQ_ENABLE | GPU_TXRFMT_TWIDDLED; + case GL_COMPRESSED_ARGB_4444_VQ_KOS: + return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_VQ_ENABLE; + case GL_COMPRESSED_ARGB_4444_VQ_TWID_KOS: + return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_VQ_ENABLE | GPU_TXRFMT_TWIDDLED; + case GL_COMPRESSED_RGB_565_VQ_KOS: + return GPU_TXRFMT_RGB565 | GPU_TXRFMT_VQ_ENABLE; + case GL_COMPRESSED_RGB_565_VQ_TWID_KOS: + return GPU_TXRFMT_RGB565 | GPU_TXRFMT_VQ_ENABLE | GPU_TXRFMT_TWIDDLED; + case GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_KOS: + return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_VQ_ENABLE; + case GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_TWID_KOS: + return GPU_TXRFMT_ARGB1555 | GPU_TXRFMT_VQ_ENABLE | GPU_TXRFMT_TWIDDLED; + case GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_KOS: + return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_VQ_ENABLE; + case GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_TWID_KOS: + return GPU_TXRFMT_ARGB4444 | GPU_TXRFMT_VQ_ENABLE | GPU_TXRFMT_TWIDDLED; + case GL_COMPRESSED_RGB_565_VQ_MIPMAP_KOS: + return GPU_TXRFMT_RGB565 | GPU_TXRFMT_VQ_ENABLE; + case GL_COMPRESSED_RGB_565_VQ_MIPMAP_TWID_KOS: + return GPU_TXRFMT_RGB565 | GPU_TXRFMT_VQ_ENABLE | GPU_TXRFMT_TWIDDLED; default: _glKosThrowError(GL_INVALID_ENUM, __func__); return 0; @@ -1076,7 +1104,13 @@ GL_FORCE_INLINE void _rgb888_to_rgba4444(const GLubyte* source, GLubyte* dest) { } GL_FORCE_INLINE void _rgb888_to_rgb565(const GLubyte* source, GLubyte* dest) { - *((GLushort*) dest) = ((source[0] & 0b11111000) << 8) | ((source[1] & 0b11111100) << 3) | (source[2] >> 3); + GLushort* d = (GLushort*) dest; + + uint16_t b = (source[2] >> 3) & 0x1f; + uint16_t g = ((source[1] >> 2) & 0x3f) << 5; + uint16_t r = ((source[0] >> 3) & 0x1f) << 11; + + *d = r | g | b; } GL_FORCE_INLINE void _rgb565_to_rgb8888(const GLubyte* source, GLubyte* dest) { @@ -1144,31 +1178,31 @@ static inline void _a8_to_argb4444(const GLubyte* source, GLubyte* dest) { */ static int _determineConversion(GLint internalFormat, GLenum format, GLenum type, TextureConversionFunc* func) { static struct Entry { + TextureConversionFunc func; GLint internalFormat; GLenum format; GLenum type; - TextureConversionFunc func; bool twiddle; } conversions [] = { - {GL_ARGB4444_KOS, GL_ALPHA, GL_UNSIGNED_BYTE, _a8_to_argb4444, false}, - {GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_argb4444, false}, - {GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, _rgba4444_to_argb4444, false}, - {GL_ARGB4444_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, NULL, false}, - {GL_ARGB4444_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS, NULL, false}, - {GL_ARGB4444_TWID_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_argb4444, true}, - {GL_ARGB1555_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL, false}, - {GL_ARGB1555_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS, NULL, false}, - {GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_rgb565, false}, - {GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, _r8_to_rgb565, false}, - {GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_BYTE, _rgb888_to_rgb565, false}, - {GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, _rgba8888_to_rgb565, false}, - {GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, _r8_to_rgb565, false}, - {GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL, false}, - {GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_TWID_KOS, NULL, false}, - {GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_BYTE, _rgb888_to_rgb565, true}, - {GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, NULL, false}, - {GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_BYTE, NULL, false}, - {GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, NULL, false}, + {_a8_to_argb4444, GL_ARGB4444_KOS, GL_ALPHA, GL_UNSIGNED_BYTE, false}, + {_rgba8888_to_argb4444, GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false}, + {_rgba4444_to_argb4444, GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false}, + {NULL, GL_ARGB4444_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, false}, + {NULL, GL_ARGB4444_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS, false}, + {_rgba8888_to_argb4444, GL_ARGB4444_TWID_KOS, GL_RGBA, GL_UNSIGNED_BYTE, true}, + {NULL, GL_ARGB1555_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, false}, + {NULL, GL_ARGB1555_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS, false}, + {_rgba8888_to_rgb565, GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false}, + {_r8_to_rgb565, GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, false}, + {_rgb888_to_rgb565, GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_BYTE, false}, + {_rgba8888_to_rgb565, GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false}, + {_r8_to_rgb565, GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, false}, + {NULL, GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false}, + {NULL, GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_TWID_KOS, false}, + {_rgb888_to_rgb565, GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_BYTE, true}, + {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, false}, + {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_BYTE, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, false}, }; for(size_t i = 0; i < sizeof(conversions) / sizeof(struct Entry); ++i) { @@ -1266,10 +1300,6 @@ void _glAllocateSpaceForMipmaps(TextureObject* active) { active->baseDataOffset = _glGetMipmapDataOffset(active, 0); } -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) -#define INFO_MSG(x) fprintf(stderr, "%s:%s > %s\n", __FILE__, TOSTRING(__LINE__), x) - static bool _glTexImage2DValidate(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type) { if(target != GL_TEXTURE_2D) { INFO_MSG(""); @@ -1479,23 +1509,36 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, return; } - GLubyte* conversionBuffer = (GLubyte*) malloc(bytes); + GLubyte* conversionBuffer = (GLubyte*) memalign(32, bytes); const GLubyte* src = data; GLubyte* dst = conversionBuffer; - for(uint32_t i = 0; i < (width * height); ++i) { - if(needs_conversion > 1) { - // Needs twiddling. Set dst to the twiddle location - // for this texel + + if(needs_conversion == 1) { + // Convert + for(uint32_t i = 0; i < (width * height); ++i) { + conversion(src, dst); + dst += destStride; + src += sourceStride; + } + } else if(needs_conversion == 2) { + // Twiddle + for(uint32_t i = 0; i < (width * height); ++i) { uint32_t newLocation = twid_location(i, width, height); dst = conversionBuffer + (destStride * newLocation); - } - if(conversion) { + for(int j = 0; j < destStride; ++j) + *dst++ = *src++; + + src += sourceStride; + } + } else if(needs_conversion == 3) { + // Convert + twiddle + for(uint32_t i = 0; i < (width * height); ++i) { + uint32_t newLocation = twid_location(i, width, height); + dst = conversionBuffer + (destStride * newLocation); conversion(src, dst); + src += sourceStride; } - - dst += destStride; - src += sourceStride; } FASTCPY(targetData, conversionBuffer, bytes); From 0e31aa3d2777a315aeb3b03ea89578d05d1c7357 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 20:23:36 +0100 Subject: [PATCH 12/33] Tweak --- samples/lights/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/lights/main.c b/samples/lights/main.c index f03ede9..afd048d 100644 --- a/samples/lights/main.c +++ b/samples/lights/main.c @@ -145,7 +145,7 @@ int check_start() { void DrawCube(float x, float z) { static float pos = 0.0f; - const static float radius = 30.0f; + static const float radius = 30.0f; pos += 0.001f; From 9cedc8185065ff59cb909cbdb7a0a485b8d334bf Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 20:29:24 +0100 Subject: [PATCH 13/33] Fix broken merge --- GL/alloc/alloc.c | 19 +++++-------------- tests/test_glteximage2d.h | 5 ++++- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index b263d46..24ade90 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -147,25 +147,16 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su uintptr_t offset = (it - pool_header.block_usage) * 8; offset += (i + 1); offset -= required_subblocks; + + if(start_subblock_out) { + *start_subblock_out = offset; + } + return pool_header.base_address + (offset * 256); } } } else { found_subblocks = 0; - } else { - found_subblocks++; - if(found_subblocks >= required_subblocks) { - /* We found space! Now calculate the address */ - uintptr_t offset = (it - pool_header.block_usage) * 8; - offset += (i + 1); - offset -= required_subblocks; - - if(start_subblock_out) { - *start_subblock_out = offset; - } - - return pool_header.base_address + (offset * 256); - } } t <<= 1; diff --git a/tests/test_glteximage2d.h b/tests/test_glteximage2d.h index 3c5995a..3349c42 100644 --- a/tests/test_glteximage2d.h +++ b/tests/test_glteximage2d.h @@ -10,7 +10,10 @@ public: uint8_t image_data[8 * 8 * 4] = {0}; void set_up() { - glKosInit(); + GLdcConfig config; + glKosInitConfig(&config); + config.texture_twiddle = false; + glKosInitEx(&config); /* Init image data so each texel RGBA value matches the * position in the array */ From 49a0e103cb613daade35d494d4e329c6c78fd03c Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 1 Sep 2023 20:34:29 +0100 Subject: [PATCH 14/33] Fix up CI --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 51ad8ea..65b940f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,10 +54,10 @@ else() set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -ffast-math") endif() -set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -mpretend-cmove -fexpensive-optimizations -fomit-frame-pointer -finline-functions") +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -fexpensive-optimizations -fomit-frame-pointer -finline-functions") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++14 -O3 -g0 -s -fomit-frame-pointer -fstrict-aliasing") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 -mpretend-cmove -fexpensive-optimizations -fomit-frame-pointer -finline-functions") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 -fexpensive-optimizations -fomit-frame-pointer -finline-functions") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -std=c++14 -O3 -fomit-frame-pointer -fstrict-aliasing") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g -Wall -Wextra") From 4d39e19ed51c4f0e57a69e504a492031432f4532 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Sat, 2 Sep 2023 21:10:42 +0100 Subject: [PATCH 15/33] Start repairing paletted textures --- GL/texture.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/GL/texture.c b/GL/texture.c index e8e33e1..daf4e74 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -281,6 +281,12 @@ static GLint _determineStrideInternal(GLenum internalFormat) { case GL_COLOR_INDEX4_EXT: case GL_COLOR_INDEX8_EXT: return 1; + case GL_RGBA8: + return 4; + case GL_RGB8: + return 3; + case GL_RGBA4: + return 2; } return -1; @@ -1047,6 +1053,7 @@ static GLuint _determinePVRFormat(GLint internalFormat) { case GL_COMPRESSED_RGB_565_VQ_MIPMAP_TWID_KOS: return GPU_TXRFMT_RGB565 | GPU_TXRFMT_VQ_ENABLE | GPU_TXRFMT_TWIDDLED; default: + fprintf(stderr, "Unexpected format: %d\n", internalFormat); _glKosThrowError(GL_INVALID_ENUM, __func__); return 0; } @@ -1203,6 +1210,8 @@ static int _determineConversion(GLint internalFormat, GLenum format, GLenum type {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, false}, {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_BYTE, false}, {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, false}, + {NULL, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false}, + {NULL, GL_RGBA8, GL_RGBA, GL_BYTE, false}, }; for(size_t i = 0; i < sizeof(conversions) / sizeof(struct Entry); ++i) { @@ -1215,6 +1224,7 @@ static int _determineConversion(GLint internalFormat, GLenum format, GLenum type } } + fprintf(stderr, "No conversion found for format: %d, internalFormat: %d, type: %d\n", format, internalFormat, type); return -1; } @@ -1707,6 +1717,7 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize } GLint sourceStride = _determineStride(format, type); + GLint destStride = _determineStrideInternal(internalFormat); gl_assert(sourceStride > -1); @@ -1785,10 +1796,15 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize /* Transform and copy the source palette to the texture */ GLushort i = 0; for(; i < width; ++i) { - convert(src, dst); - - src += sourceStride; - dst += 4; + if(convert) { + convert(src, dst); + src += sourceStride; + dst += destStride; + } else { + for(int j = 0; j < sourceStride; ++j) { + *dst++ = *src++; + } + } } _glApplyColorTable(palette); From e5a4f4f716b3dec2c4e07face47cfde0ed40473c Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Sun, 3 Sep 2023 21:12:11 +0100 Subject: [PATCH 16/33] Continue fixing up paletted texture issues --- GL/texture.c | 133 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 98 insertions(+), 35 deletions(-) diff --git a/GL/texture.c b/GL/texture.c index daf4e74..f890d05 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -297,7 +297,19 @@ static GLint _determineStride(GLenum format, GLenum type) { switch(type) { case GL_BYTE: case GL_UNSIGNED_BYTE: - return (format == GL_RED || format == GL_ALPHA) ? 1 : (format == GL_RGB) ? 3 : 4; + switch(format) { + case GL_RED: + case GL_ALPHA: + case GL_COLOR_INDEX: + return 1; + case GL_RGB: + return 3; + case GL_RGBA: + return 4; + default: + _glKosThrowError(GL_INVALID_VALUE, __func__); + return 1; + } case GL_UNSIGNED_SHORT: return (format == GL_RED || format == GL_ALPHA) ? 2 : (format == GL_RGB) ? 6 : 8; case GL_UNSIGNED_SHORT_5_6_5: @@ -921,6 +933,7 @@ static GLboolean isTwiddledInternalFormat(GLint internalFormat) { */ static GLint _cleanInternalFormat(GLint internalFormat) { switch (internalFormat) { + /* All of these formats are fine as they are, no conversion needed */ case GL_RGB565_KOS: case GL_ARGB4444_KOS: case GL_ARGB1555_KOS: @@ -929,10 +942,11 @@ static GLint _cleanInternalFormat(GLint internalFormat) { case GL_ARGB1555_TWID_KOS: case GL_COLOR_INDEX8_TWID_KOS: case GL_COLOR_INDEX4_TWID_KOS: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - /* All of these formats are fine as they are, no conversion needed */ return internalFormat; + case GL_COLOR_INDEX4_EXT: + return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX4_TWID_KOS : internalFormat; + case GL_COLOR_INDEX8_EXT: + return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX8_TWID_KOS : internalFormat; case GL_RGB_TWID_KOS: return GL_RGB565_TWID_KOS; case GL_RGBA_TWID_KOS: @@ -1174,6 +1188,16 @@ static inline void _a8_to_argb4444(const GLubyte* source, GLubyte* dest) { *((GLushort*) dest) = (color << 8) | color; } + +enum ConversionType { + CONVERSION_TYPE_NONE, + CONVERSION_TYPE_CONVERT = 1, + CONVERSION_TYPE_TWIDDLE = 2, + CONVERSION_TYPE_PACK = 4, + CONVERSION_TYPE_INVALID = -1 +}; + + /* Given an cleaned internal format, and the passed format and type, this returns: * * 0 if not conversion is necessary @@ -1190,42 +1214,61 @@ static int _determineConversion(GLint internalFormat, GLenum format, GLenum type GLenum format; GLenum type; bool twiddle; + bool pack; // If true, each value is packed after conversion into half-bytes } conversions [] = { - {_a8_to_argb4444, GL_ARGB4444_KOS, GL_ALPHA, GL_UNSIGNED_BYTE, false}, - {_rgba8888_to_argb4444, GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false}, - {_rgba4444_to_argb4444, GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false}, - {NULL, GL_ARGB4444_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, false}, - {NULL, GL_ARGB4444_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS, false}, - {_rgba8888_to_argb4444, GL_ARGB4444_TWID_KOS, GL_RGBA, GL_UNSIGNED_BYTE, true}, - {NULL, GL_ARGB1555_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, false}, - {NULL, GL_ARGB1555_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS, false}, - {_rgba8888_to_rgb565, GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false}, - {_r8_to_rgb565, GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, false}, - {_rgb888_to_rgb565, GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_BYTE, false}, - {_rgba8888_to_rgb565, GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false}, - {_r8_to_rgb565, GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, false}, - {NULL, GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false}, - {NULL, GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_TWID_KOS, false}, - {_rgb888_to_rgb565, GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_BYTE, true}, - {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, false}, - {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_BYTE, false}, - {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, false}, - {NULL, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false}, - {NULL, GL_RGBA8, GL_RGBA, GL_BYTE, false}, + {_a8_to_argb4444, GL_ARGB4444_KOS, GL_ALPHA, GL_UNSIGNED_BYTE, false, false}, + {_rgba8888_to_argb4444, GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false, false}, + {_rgba4444_to_argb4444, GL_ARGB4444_KOS, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false, false}, + {NULL, GL_ARGB4444_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, false, false}, + {NULL, GL_ARGB4444_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS, false, false}, + {_rgba8888_to_argb4444, GL_ARGB4444_TWID_KOS, GL_RGBA, GL_UNSIGNED_BYTE, true, false}, + {NULL, GL_ARGB1555_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, false, false}, + {NULL, GL_ARGB1555_TWID_KOS, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS, false, false}, + {_rgba8888_to_rgb565, GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false, false}, + {_r8_to_rgb565, GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, false, false}, + {_rgb888_to_rgb565, GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_BYTE, false, false}, + {_rgba8888_to_rgb565, GL_RGB565_KOS, GL_RGBA, GL_UNSIGNED_BYTE, false, false}, + {_r8_to_rgb565, GL_RGB565_KOS, GL_RED, GL_UNSIGNED_BYTE, false, false}, + {NULL, GL_RGB565_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false, false}, + {NULL, GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_TWID_KOS, false, false}, + {_rgb888_to_rgb565, GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_BYTE, true, false}, + {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, false, false}, + {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_BYTE, false, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, false, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, true, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_BYTE, true, false}, + {NULL, GL_COLOR_INDEX4_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, false, true}, + {NULL, GL_COLOR_INDEX4_EXT, GL_COLOR_INDEX, GL_BYTE, false, true}, + {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, false, true}, + {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, true, true}, + {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_BYTE, true, true}, + {NULL, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false, false}, + {NULL, GL_RGBA8, GL_RGBA, GL_BYTE, false, false}, + {_rgb888_to_rgba8888, GL_RGBA8, GL_RGB, GL_UNSIGNED_BYTE, false, false}, + {_rgb888_to_rgba8888, GL_RGBA8, GL_RGB, GL_BYTE, false, false}, }; for(size_t i = 0; i < sizeof(conversions) / sizeof(struct Entry); ++i) { struct Entry* e = conversions + i; if(e->format == format && e->internalFormat == internalFormat && e->type == type) { *func = e->func; - int ret = (e->func) ? 1 : 0; - ret += (e->twiddle) ? 2 : 0; + + int ret = (e->func) ? CONVERSION_TYPE_CONVERT : CONVERSION_TYPE_NONE; + + if(e->twiddle) { + ret |= CONVERSION_TYPE_TWIDDLE; + } + + if(e->pack) { + ret |= CONVERSION_TYPE_PACK; + } + return ret; } } - fprintf(stderr, "No conversion found for format: %d, internalFormat: %d, type: %d\n", format, internalFormat, type); - return -1; + fprintf(stderr, "No conversion found for format: 0x%x, internalFormat: 0x%x, type: 0x%x\n", format, internalFormat, type); + return CONVERSION_TYPE_INVALID; } static GLboolean _isSupportedFormat(GLenum format) { @@ -1446,11 +1489,6 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLint destStride = isPaletted ? 1 : 2; GLuint bytes = (width * height * destStride); - //special case 4bpp - if(internalFormat == GL_COLOR_INDEX4_EXT){ - bytes >>= 1; - } - if(!active->data) { gl_assert(active); gl_assert(width); @@ -1523,7 +1561,10 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, const GLubyte* src = data; GLubyte* dst = conversionBuffer; - if(needs_conversion == 1) { + bool pack = (needs_conversion & CONVERSION_TYPE_PACK) == CONVERSION_TYPE_PACK; + needs_conversion &= ~CONVERSION_TYPE_PACK; + + if(needs_conversion == CONVERSION_TYPE_CONVERT) { // Convert for(uint32_t i = 0; i < (width * height); ++i) { conversion(src, dst); @@ -1551,6 +1592,28 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, } } + if(pack) { + assert(isPaletted); + + size_t dst_byte = 0; + for(size_t src_byte = 0; src_byte < bytes; ++src_byte) { + uint8_t v = conversionBuffer[src_byte]; + + if(src_byte % 1 == 0) { + conversionBuffer[dst_byte] = (conversionBuffer[dst_byte] & 0xF) | ((v & 0xF0) << 4); + } else { + conversionBuffer[dst_byte] = (conversionBuffer[dst_byte] & 0xF0) | (v & 0xF); + } + + if(src_byte % 1 == 0) { + dst_byte++; + } + } + + // Halve the byte count to upload + bytes >>= 1; + } + FASTCPY(targetData, conversionBuffer, bytes); free(conversionBuffer); } else { From 12bd6f474f993bfba5ac8e8057f73feed4cea05f Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Wed, 6 Sep 2023 07:59:40 +0100 Subject: [PATCH 17/33] Fix issues with the allocator --- GL/alloc/alloc.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index 24ade90..cb549e4 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "alloc.h" @@ -42,6 +43,7 @@ * * - Allocations < 2048 can still cross boundaries * - Only operates on one pool (ignores what you pass) + * - If there are no 2048 aligned blocks, we should fall-back to unaligned */ #include @@ -222,6 +224,11 @@ static inline uint32_t subblock_from_pointer(void* p) { return (ptr - pool_header.base_address) / 256; } +static inline void block_and_offset_from_subblock(size_t sb, size_t* b, uint8_t* off) { + *b = sb / 8; + *off = (sb % 8); +} + void* alloc_malloc(void* pool, size_t size) { size_t start_subblock, required_subblocks; void* ret = alloc_next_available_ex(pool, size, &start_subblock, &required_subblocks); @@ -231,13 +238,17 @@ void* alloc_malloc(void* pool, size_t size) { } if(ret) { - size_t offset = start_subblock % 8; - size_t block = start_subblock / 8; + size_t block; + uint8_t offset; + + block_and_offset_from_subblock(start_subblock, &block, &offset); + uint8_t mask = 0; /* Toggle any bits for the first block */ - for(int i = offset - 1; i >= 0; --i) { - mask |= (1 << i); + int c = (required_subblocks < 8) ? required_subblocks : 8; + for(int i = 0; i < c; ++i) { + mask |= (1 << (7 - (offset + i))); required_subblocks--; } @@ -309,8 +320,10 @@ void alloc_free(void* pool, void* p) { if(it->pointer == p) { size_t used_subblocks = size_to_subblock_count(it->size); size_t subblock = subblock_from_pointer(p); - size_t block = subblock / 8; - size_t offset = subblock % 8; + size_t block; + uint8_t offset; + block_and_offset_from_subblock(subblock, &block, &offset); + uint8_t mask = 0; /* Wipe out any leading subblocks */ From 7ce01ad93f5fc2164b977e796c38cd02113c682a Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Wed, 6 Sep 2023 08:01:01 +0100 Subject: [PATCH 18/33] Fix up paletted textures --- GL/flush.c | 4 +- GL/texture.c | 188 ++++++++++++++++++++++-------------- include/GL/glkos.h | 2 - samples/paletted/main.c | 2 +- samples/paletted_pcx/main.c | 6 +- tests/test_allocator.h | 15 +++ 6 files changed, 137 insertions(+), 80 deletions(-) diff --git a/GL/flush.c b/GL/flush.c index 75da3c8..e07c3a1 100644 --- a/GL/flush.c +++ b/GL/flush.c @@ -46,7 +46,9 @@ void APIENTRY glKosInitConfig(GLdcConfig* config) { config->initial_pt_capacity = 512 * 3; config->initial_tr_capacity = 1024 * 3; config->initial_immediate_capacity = 1024 * 3; - config->internal_palette_format = GL_RGBA8; + + // RGBA4444 is the fastest general format - 8888 will cause a perf issue + config->internal_palette_format = GL_RGBA4; config->texture_twiddle = GL_TRUE; } diff --git a/GL/texture.c b/GL/texture.c index f890d05..e60200c 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -28,7 +28,7 @@ static GLuint _determinePVRFormat(GLint internalFormat); static GLboolean BANKS_USED[MAX_GLDC_PALETTE_SLOTS]; // Each time a 256 colour bank is used, this is set to true static GLboolean SUBBANKS_USED[MAX_GLDC_PALETTE_SLOTS][MAX_GLDC_4BPP_PALETTE_SLOTS]; // 4 counts of the used 16 colour banks within the 256 ones -static GLenum INTERNAL_PALETTE_FORMAT = GL_RGBA8; +static GLenum INTERNAL_PALETTE_FORMAT = GL_RGBA4; static GLboolean TEXTURE_TWIDDLE_ENABLED = GL_FALSE; #define STRINGIFY(x) #x @@ -224,8 +224,8 @@ void _glSetInternalPaletteFormat(GLenum val) { GPUSetPaletteFormat(GPU_PAL_ARGB4444); break; case GL_RGB5_A1: - GPUSetPaletteFormat(GPU_PAL_ARGB1555); - break; + GPUSetPaletteFormat(GPU_PAL_ARGB1555); + break; case GL_RGB565_KOS: GPUSetPaletteFormat(GPU_PAL_RGB565); break; @@ -301,15 +301,19 @@ static GLint _determineStride(GLenum format, GLenum type) { case GL_RED: case GL_ALPHA: case GL_COLOR_INDEX: + case GL_COLOR_INDEX8_TWID_KOS: + case GL_COLOR_INDEX4_TWID_KOS: // We return 1 for 4bpp, but it gets sorted later + case GL_COLOR_INDEX4_EXT: + case GL_COLOR_INDEX8_EXT: return 1; case GL_RGB: return 3; case GL_RGBA: return 4; default: - _glKosThrowError(GL_INVALID_VALUE, __func__); - return 1; + break; } + break; case GL_UNSIGNED_SHORT: return (format == GL_RED || format == GL_ALPHA) ? 2 : (format == GL_RGB) ? 6 : 8; case GL_UNSIGNED_SHORT_5_6_5: @@ -324,6 +328,8 @@ static GLint _determineStride(GLenum format, GLenum type) { return 2; } + fprintf(stderr, "Couldn't find stride for format: 0x%x type: 0x%x\n", format, type); + _glKosThrowError(GL_INVALID_VALUE, __func__); return -1; } @@ -812,13 +818,13 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target, case GL_PALETTE4_RGB8_OES: glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 16, internalFormat, GL_UNSIGNED_BYTE, data); ptr += 16*3; - glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX4_EXT, width, height, border, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ptr); + glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX4_EXT, width, height, border, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, ptr); return; case GL_PALETTE4_RGBA8_OES: glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 16, internalFormat, GL_UNSIGNED_BYTE, data); ptr += 16*4; - glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX4_EXT, width, height, border, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ptr); + glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX4_EXT, width, height, border, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, ptr); return; case GL_PALETTE4_R5_G6_B5_OES: @@ -826,31 +832,28 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target, case GL_PALETTE4_RGB5_A1_OES: glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 16, internalFormat, GL_UNSIGNED_BYTE, data); ptr += 16*2; - glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX4_EXT, width, height, border, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ptr); + glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX4_EXT, width, height, border, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, ptr); return; case GL_PALETTE8_RGB8_OES: glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 256, internalFormat, GL_UNSIGNED_BYTE, data); ptr += 256*3; - glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX8_EXT, width, height, border, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ptr); + glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX8_EXT, width, height, border, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, ptr); return; case GL_PALETTE8_RGBA8_OES: - // glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 256, internalFormat, GL_UNSIGNED_BYTE, data); ptr += 256*4; - glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX8_EXT, width, height, border, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ptr); + glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX8_EXT, width, height, border, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, ptr); return; - - case GL_PALETTE8_RGBA4_OES: case GL_PALETTE8_RGB5_A1_OES: case GL_PALETTE8_R5_G6_B5_OES: glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 256, internalFormat, GL_UNSIGNED_BYTE, data); ptr += 256*2; - glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX8_EXT, width, height, border, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ptr); + glTexImage2D(GL_TEXTURE_2D, level, GL_COLOR_INDEX8_EXT, width, height, border, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, ptr); return; default: { @@ -944,7 +947,10 @@ static GLint _cleanInternalFormat(GLint internalFormat) { case GL_COLOR_INDEX4_TWID_KOS: return internalFormat; case GL_COLOR_INDEX4_EXT: - return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX4_TWID_KOS : internalFormat; + // FIXME: We can't auto twiddle GL_COLOR_INDEX4 -> GL_COLOR_INDEX4_TWID_KOS + // so until we can, we need to not twiddle 4bpp paletted textures automatically + // return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX4_TWID_KOS : internalFormat; + return internalFormat; case GL_COLOR_INDEX8_EXT: return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX8_TWID_KOS : internalFormat; case GL_RGB_TWID_KOS: @@ -1234,18 +1240,35 @@ static int _determineConversion(GLint internalFormat, GLenum format, GLenum type {_rgb888_to_rgb565, GL_RGB565_TWID_KOS, GL_RGB, GL_UNSIGNED_BYTE, true, false}, {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, false, false}, {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX, GL_BYTE, false, false}, - {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, false, false}, {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, true, false}, {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX, GL_BYTE, true, false}, {NULL, GL_COLOR_INDEX4_EXT, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, false, true}, {NULL, GL_COLOR_INDEX4_EXT, GL_COLOR_INDEX, GL_BYTE, false, true}, - {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, false, true}, + + {NULL, GL_COLOR_INDEX4_EXT, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, false, false}, + {NULL, GL_COLOR_INDEX4_EXT, GL_COLOR_INDEX4_EXT, GL_BYTE, false, false}, {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, true, true}, {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_BYTE, true, true}, + + /* FIXME: Implement 4bpp -> 4bpp twiddling + {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, true, false}, + {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX4_EXT, GL_BYTE, true, false}, */ + + {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, false, false}, + {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, GL_BYTE, false, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX8_TWID_KOS, GL_UNSIGNED_BYTE, false, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX8_TWID_KOS, GL_BYTE, false, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, true, false}, + {NULL, GL_COLOR_INDEX8_TWID_KOS, GL_COLOR_INDEX8_EXT, GL_BYTE, true, false}, + {NULL, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false, false}, {NULL, GL_RGBA8, GL_RGBA, GL_BYTE, false, false}, {_rgb888_to_rgba8888, GL_RGBA8, GL_RGB, GL_UNSIGNED_BYTE, false, false}, {_rgb888_to_rgba8888, GL_RGBA8, GL_RGB, GL_BYTE, false, false}, + {_rgb888_to_argb4444, GL_RGBA4, GL_RGB, GL_UNSIGNED_BYTE, false, false}, + {_rgb888_to_argb4444, GL_RGBA4, GL_RGB, GL_BYTE, false, false}, + {_rgba8888_to_argb4444, GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE, false, false}, + {_rgba8888_to_argb4444, GL_RGBA4, GL_RGBA, GL_BYTE, false, false}, }; for(size_t i = 0; i < sizeof(conversions) / sizeof(struct Entry); ++i) { @@ -1271,23 +1294,6 @@ static int _determineConversion(GLint internalFormat, GLenum format, GLenum type return CONVERSION_TYPE_INVALID; } -static GLboolean _isSupportedFormat(GLenum format) { - switch(format) { - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - case GL_LUMINANCE_ALPHA: - case GL_RED: - case GL_RGB: - case GL_RGBA: - case GL_BGRA: - case GL_COLOR_INDEX: - return GL_TRUE; - default: - return GL_FALSE; - } -} - GLboolean _glIsMipmapComplete(const TextureObject* obj) { // Non-square textures can't have mipmaps @@ -1366,32 +1372,40 @@ static bool _glTexImage2DValidate(GLenum target, GLint level, GLint internalForm return false; } - if(format != GL_COLOR_INDEX) { - if(!_isSupportedFormat(format)) { - INFO_MSG("Unsupported format"); - _glKosThrowError(GL_INVALID_ENUM, __func__); - return false; - } + GLint validFormats [] = { + GL_ALPHA, + GL_LUMINANCE, + GL_INTENSITY, + GL_LUMINANCE_ALPHA, + GL_RED, + GL_RGB, + GL_RGBA, + GL_BGRA, + GL_COLOR_INDEX, + GL_COLOR_INDEX4_EXT, /* Extension, this is just so glCompressedTexImage can pass-thru */ + GL_COLOR_INDEX8_EXT, /* Extension, this is just so glCompressedTexImage can pass-thru */ + GL_COLOR_INDEX4_TWID_KOS, /* Extension, this is just so glCompressedTexImage can pass-thru */ + GL_COLOR_INDEX8_TWID_KOS, /* Extension, this is just so glCompressedTexImage can pass-thru */ + 0 + }; + if(_glCheckValidEnum(format, validFormats, __func__) != 0) { + return false; + } + + if(format != GL_COLOR_INDEX4_EXT && format != GL_COLOR_INDEX4_TWID_KOS) { /* Abuse determineStride to see if type is valid */ if(_determineStride(GL_RGBA, type) == -1) { INFO_MSG(""); _glKosThrowError(GL_INVALID_ENUM, __func__); return false; } + } - internalFormat = _cleanInternalFormat(internalFormat); - if(internalFormat == -1) { - INFO_MSG(""); - _glKosThrowError(GL_INVALID_VALUE, __func__); - return false; - } - } else { - if(internalFormat != GL_COLOR_INDEX8_EXT && internalFormat != GL_COLOR_INDEX4_EXT) { - INFO_MSG(""); - _glKosThrowError(GL_INVALID_ENUM, __func__); - return false; - } + if(_cleanInternalFormat(internalFormat) == -1) { + INFO_MSG(""); + _glKosThrowError(GL_INVALID_VALUE, __func__); + return false; } GLuint w = width; @@ -1461,7 +1475,12 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, return; } - GLboolean isPaletted = (internalFormat == GL_COLOR_INDEX8_EXT || internalFormat == GL_COLOR_INDEX4_EXT) ? GL_TRUE : GL_FALSE; + GLboolean isPaletted = ( + internalFormat == GL_COLOR_INDEX8_EXT || + internalFormat == GL_COLOR_INDEX4_EXT || + internalFormat == GL_COLOR_INDEX4_TWID_KOS || + internalFormat == GL_COLOR_INDEX8_TWID_KOS + ) ? GL_TRUE : GL_FALSE; GLenum cleanInternalFormat = _cleanInternalFormat(internalFormat); GLuint pvrFormat = _determinePVRFormat(cleanInternalFormat); GLuint originalId = active->index; @@ -1486,8 +1505,26 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, /* All colour formats are represented as shorts internally. Paletted textures * are represented by byte indexes (which look up into a color table) */ - GLint destStride = isPaletted ? 1 : 2; - GLuint bytes = (width * height * destStride); + GLint destStride = _determineStrideInternal(cleanInternalFormat); + GLint sourceStride = _determineStride(format, type); + GLuint srcBytes = (width * height * sourceStride); + GLuint destBytes = (width * height * destStride); + + TextureConversionFunc conversion; + int needs_conversion = _determineConversion(cleanInternalFormat, format, type, &conversion); + + // Hack: If we're doing a 4bpp source (via glCompressedTexture...) + // halve the srcBytes + if(format == GL_COLOR_INDEX4_EXT || format == GL_COLOR_INDEX4_TWID_KOS) { + srcBytes /= 2; + } + + /* If we're packing stuff, then the dest size is half what it would be */ + if((needs_conversion & CONVERSION_TYPE_PACK) == CONVERSION_TYPE_PACK) { + destBytes /= 2; + } else if(internalFormat == GL_COLOR_INDEX4_EXT || internalFormat == GL_COLOR_INDEX4_TWID_KOS) { + destBytes /= 2; + } if(!active->data) { gl_assert(active); @@ -1504,9 +1541,9 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, active->mipmapCount = _glGetMipmapLevelCount(active); active->mipmap_bias = GL_KOS_INTERNAL_DEFAULT_MIPMAP_LOD_BIAS; active->dataStride = destStride; - active->baseDataSize = bytes; + active->baseDataSize = destBytes; - gl_assert(bytes); + gl_assert(destBytes); if(level > 0) { /* If we're uploading a mipmap level, we need to allocate the full amount of space */ @@ -1540,24 +1577,19 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLubyte* targetData = (active->baseDataOffset == 0) ? active->data : _glGetMipmapLocation(active, level); gl_assert(targetData); - TextureConversionFunc conversion; - int needs_conversion = _determineConversion(cleanInternalFormat, format, type, &conversion); if(needs_conversion < 0) { _glKosThrowError(GL_INVALID_VALUE, __func__); INFO_MSG("Couldn't find necessary texture conversion\n"); return; } else if(needs_conversion > 0) { /* Convert the data */ - GLint sourceStride = _determineStride(format, type); - GLint destStride = _determineStrideInternal(cleanInternalFormat); - if(sourceStride == -1) { INFO_MSG("Stride was not detected\n"); _glKosThrowError(GL_INVALID_OPERATION, __func__); return; } - GLubyte* conversionBuffer = (GLubyte*) memalign(32, bytes); + GLubyte* conversionBuffer = (GLubyte*) memalign(32, srcBytes); const GLubyte* src = data; GLubyte* dst = conversionBuffer; @@ -1590,13 +1622,17 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, conversion(src, dst); src += sourceStride; } + } else if(pack) { + fprintf(stderr, "Just packing\n"); + FASTCPY(conversionBuffer, data, srcBytes); } if(pack) { assert(isPaletted); + fprintf(stderr, "Packing data...\n"); size_t dst_byte = 0; - for(size_t src_byte = 0; src_byte < bytes; ++src_byte) { + for(size_t src_byte = 0; src_byte < srcBytes; ++src_byte) { uint8_t v = conversionBuffer[src_byte]; if(src_byte % 1 == 0) { @@ -1610,25 +1646,28 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, } } - // Halve the byte count to upload - bytes >>= 1; + fprintf(stderr, "Packed\n"); } - FASTCPY(targetData, conversionBuffer, bytes); + fprintf(stderr, "Uploading data (%d)...\n", destBytes); + FASTCPY(targetData, conversionBuffer, destBytes); free(conversionBuffer); } else { /* No conversion necessary, we can just upload data directly */ gl_assert(targetData); gl_assert(data); - gl_assert(bytes); + gl_assert(destBytes); /* No conversion? Just copy the data, and the pvr_format is correct */ - FASTCPY(targetData, data, bytes); + fprintf(stderr, "Uploading data (%d)...\n", destBytes); + FASTCPY(targetData, data, destBytes); gl_assert(active->index == originalId); } gl_assert(active->index == originalId); _glGPUStateMarkDirty(); + + fprintf(stderr, "Done\n"); } void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param) { @@ -1780,13 +1819,16 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize } GLint sourceStride = _determineStride(format, type); - GLint destStride = _determineStrideInternal(internalFormat); + + /* We always store the palette in RAM in RGBA8888. We pack when we set + * the individual colours in the PVR */ + GLint destStride = 4; gl_assert(sourceStride > -1); TextureConversionFunc convert; int ret = _determineConversion( - INTERNAL_PALETTE_FORMAT, + GL_RGBA8, format, type, &convert @@ -1833,8 +1875,8 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize palette->bank = -1; } - palette->data = (GLubyte*) malloc(width * 4); - palette->format = format; + palette->data = (GLubyte*) malloc(width * destStride); + palette->format = internalFormat; palette->width = width; palette->size = (width > 16) ? 256 : 16; gl_assert(palette->size == 16 || palette->size == 256); diff --git a/include/GL/glkos.h b/include/GL/glkos.h index 3dfe9ad..81827d5 100644 --- a/include/GL/glkos.h +++ b/include/GL/glkos.h @@ -35,8 +35,6 @@ extern const char* GLDC_VERSION; #define GL_NEARZ_CLIPPING_KOS 0xEEFA -#define GL_UNSIGNED_BYTE_TWID_KOS 0xEEFB - /* Initialize the GL pipeline. GL will initialize the PVR. */ GLAPI void APIENTRY glKosInit(); diff --git a/samples/paletted/main.c b/samples/paletted/main.c index 7ada768..7b88cf3 100644 --- a/samples/paletted/main.c +++ b/samples/paletted/main.c @@ -132,7 +132,7 @@ void LoadGLTextures() { // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. - glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1->width, image1->height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE_TWID_KOS, image1->data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1->width, image1->height, 0, GL_COLOR_INDEX8_TWID_KOS, GL_UNSIGNED_BYTE, image1->data); glGenerateMipmapEXT(GL_TEXTURE_2D); free(image1); diff --git a/samples/paletted_pcx/main.c b/samples/paletted_pcx/main.c index 4f08a64..7599dcb 100644 --- a/samples/paletted_pcx/main.c +++ b/samples/paletted_pcx/main.c @@ -429,7 +429,7 @@ void LoadGLTextures() { #ifndef USE_16C_PALETTE glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image1.data); #else - glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX4_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image1.data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX4_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, image1.data); #endif glBindTexture(GL_TEXTURE_2D, textures[1]); // 2d texture (x and y size) @@ -444,7 +444,7 @@ void LoadGLTextures() { #ifndef USE_16C_PALETTE glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image1.data); #else - glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX4_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image1.data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX4_EXT, image1.width, image1.height, 0, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, image1.data); #endif glBindTexture(GL_TEXTURE_2D, textures[2]); @@ -463,7 +463,7 @@ void LoadGLTextures() { #ifndef USE_16C_PALETTE glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, image2.width, image2.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image2.data); #else - glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX4_EXT, image2.width, image2.height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, image2.data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX4_EXT, image2.width, image2.height, 0, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, image2.data); #endif } diff --git a/tests/test_allocator.h b/tests/test_allocator.h index 32ac1cc..1c5d7e9 100644 --- a/tests/test_allocator.h +++ b/tests/test_allocator.h @@ -40,6 +40,21 @@ public: assert_equal(alloc_block_count(pool), expected_blocks); } + void test_complex_case() { + uint8_t* large_pool = (uint8_t*) malloc(8 * 1024 * 1024); + + alloc_init(large_pool, 8 * 1024 * 1024); + alloc_malloc(large_pool, 262144); + alloc_malloc(large_pool, 262144); + void* a1 = alloc_malloc(large_pool, 524288); + alloc_free(large_pool, a1); + alloc_malloc(large_pool, 699056); + alloc_malloc(large_pool, 128); + alloc_shutdown(large_pool); + + free(large_pool); + } + void test_alloc_malloc() { alloc_init(pool, sizeof(pool)); From 6eb079228eeeb18211e16c47204fd275a29f26af Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Wed, 6 Sep 2023 21:01:37 +0100 Subject: [PATCH 19/33] Fix infinite loop --- GL/alloc/alloc.c | 25 +++++++++++++++++++-- GL/texture.c | 51 +++++++++++++++++++++++++----------------- tests/test_allocator.h | 20 +++++++++++++++++ 3 files changed, 73 insertions(+), 23 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index cb549e4..1a03cc3 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -47,11 +47,20 @@ */ #include +#include #define EIGHT_MEG (8 * 1024 * 1024) #define TWO_KILOBYTES (2 * 1024) #define BLOCK_COUNT (EIGHT_MEG / TWO_KILOBYTES) +#define ALLOC_DEBUG 0 +#if ALLOC_DEBUG +#define DBG_MSG(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) +#else +#define DBG_MSG(fmt, ...) do {} while (0) +#endif + + static inline int round_up(int n, int multiple) { assert(multiple); @@ -230,6 +239,8 @@ static inline void block_and_offset_from_subblock(size_t sb, size_t* b, uint8_t* } void* alloc_malloc(void* pool, size_t size) { + DBG_MSG("Allocating: %d\n", size); + size_t start_subblock, required_subblocks; void* ret = alloc_next_available_ex(pool, size, &start_subblock, &required_subblocks); @@ -245,6 +256,8 @@ void* alloc_malloc(void* pool, size_t size) { uint8_t mask = 0; + DBG_MSG("Alloc: size: %d, rs: %d, sb: %d, b: %d, off: %d\n", size, required_subblocks, start_subblock, start_subblock / 8, start_subblock % 8); + /* Toggle any bits for the first block */ int c = (required_subblocks < 8) ? required_subblocks : 8; for(int i = 0; i < c; ++i) { @@ -308,6 +321,8 @@ void* alloc_malloc(void* pool, size_t size) { } } + DBG_MSG("Alloc done\n"); + return ret; } @@ -326,9 +341,12 @@ void alloc_free(void* pool, void* p) { uint8_t mask = 0; + DBG_MSG("Free: size: %d, us: %d, sb: %d, off: %d\n", it->size, used_subblocks, block, offset); + /* Wipe out any leading subblocks */ - for(int i = offset; i > 0; --i) { - mask |= (1 << i); + int c = (used_subblocks < 8) ? used_subblocks : 8; + for(int i = 0; i < c; ++i) { + mask |= (1 << (7 - (offset + i))); used_subblocks--; } @@ -359,6 +377,7 @@ void alloc_free(void* pool, void* p) { pool_header.allocations = it->next; } + DBG_MSG("Freed: size: %d, us: %d, sb: %d, off: %d\n", it->size, used_subblocks, block, offset); free(it); break; } @@ -366,6 +385,8 @@ void alloc_free(void* pool, void* p) { last = it; it = it->next; } + + DBG_MSG("Free done\n"); } void alloc_defrag_start(void* pool) { diff --git a/GL/texture.c b/GL/texture.c index e60200c..5fcf473 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -947,10 +947,7 @@ static GLint _cleanInternalFormat(GLint internalFormat) { case GL_COLOR_INDEX4_TWID_KOS: return internalFormat; case GL_COLOR_INDEX4_EXT: - // FIXME: We can't auto twiddle GL_COLOR_INDEX4 -> GL_COLOR_INDEX4_TWID_KOS - // so until we can, we need to not twiddle 4bpp paletted textures automatically - // return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX4_TWID_KOS : internalFormat; - return internalFormat; + return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX4_TWID_KOS : internalFormat; case GL_COLOR_INDEX8_EXT: return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX8_TWID_KOS : internalFormat; case GL_RGB_TWID_KOS: @@ -1250,9 +1247,8 @@ static int _determineConversion(GLint internalFormat, GLenum format, GLenum type {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, true, true}, {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX, GL_BYTE, true, true}, - /* FIXME: Implement 4bpp -> 4bpp twiddling {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX4_EXT, GL_UNSIGNED_BYTE, true, false}, - {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX4_EXT, GL_BYTE, true, false}, */ + {NULL, GL_COLOR_INDEX4_TWID_KOS, GL_COLOR_INDEX4_EXT, GL_BYTE, true, false}, {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, false, false}, {NULL, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, GL_BYTE, false, false}, @@ -1457,6 +1453,10 @@ static bool _glTexImage2DValidate(GLenum target, GLint level, GLint internalForm return true; } +static inline GLboolean is4BPPFormat(GLenum format) { + return format == GL_COLOR_INDEX4_EXT || format == GL_COLOR_INDEX4_TWID_KOS; +} + void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *data) { @@ -1605,14 +1605,32 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, } } else if(needs_conversion == 2) { // Twiddle - for(uint32_t i = 0; i < (width * height); ++i) { - uint32_t newLocation = twid_location(i, width, height); - dst = conversionBuffer + (destStride * newLocation); + if(is4BPPFormat(internalFormat) && is4BPPFormat(format)) { + // Special case twiddling. We have to unpack each src value + // and repack into the right place + for(uint32_t i = 0; i < (width * height); ++i) { + uint32_t newLocation = twid_location(i, width, height); - for(int j = 0; j < destStride; ++j) - *dst++ = *src++; + // This is the src/dest byte, but we need to figure + // out which half based on the odd/even of i + src = &((uint8_t*) data)[i / 2]; + dst = &conversionBuffer[newLocation / 2]; + if(i % 2 == 0) { + *dst = (*dst & 0xF) | (*src & 0xF0); + } else { + *dst = (*dst & 0xF0) | (*src & 0xF); + } + } + } else { + for(uint32_t i = 0; i < (width * height); ++i) { + uint32_t newLocation = twid_location(i, width, height); + dst = conversionBuffer + (destStride * newLocation); - src += sourceStride; + for(int j = 0; j < destStride; ++j) + *dst++ = *src++; + + src += sourceStride; + } } } else if(needs_conversion == 3) { // Convert + twiddle @@ -1623,14 +1641,11 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, src += sourceStride; } } else if(pack) { - fprintf(stderr, "Just packing\n"); FASTCPY(conversionBuffer, data, srcBytes); } if(pack) { assert(isPaletted); - - fprintf(stderr, "Packing data...\n"); size_t dst_byte = 0; for(size_t src_byte = 0; src_byte < srcBytes; ++src_byte) { uint8_t v = conversionBuffer[src_byte]; @@ -1645,11 +1660,8 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, dst_byte++; } } - - fprintf(stderr, "Packed\n"); } - fprintf(stderr, "Uploading data (%d)...\n", destBytes); FASTCPY(targetData, conversionBuffer, destBytes); free(conversionBuffer); } else { @@ -1659,15 +1671,12 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, gl_assert(destBytes); /* No conversion? Just copy the data, and the pvr_format is correct */ - fprintf(stderr, "Uploading data (%d)...\n", destBytes); FASTCPY(targetData, data, destBytes); gl_assert(active->index == originalId); } gl_assert(active->index == originalId); _glGPUStateMarkDirty(); - - fprintf(stderr, "Done\n"); } void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param) { diff --git a/tests/test_allocator.h b/tests/test_allocator.h index 1c5d7e9..f31e8aa 100644 --- a/tests/test_allocator.h +++ b/tests/test_allocator.h @@ -55,6 +55,26 @@ public: free(large_pool); } + void test_complex_case2() { + uint8_t* large_pool = (uint8_t*) malloc(8 * 1024 * 1024); + alloc_init(large_pool, 8 * 1024 * 1024); + + void* a1 = alloc_malloc(large_pool, 131072); + alloc_free(large_pool, a1); + + alloc_malloc(large_pool, 174768); + void* a2 = alloc_malloc(large_pool, 131072); + alloc_free(large_pool, a2); + + alloc_malloc(large_pool, 174768); + void* a3 = alloc_malloc(large_pool, 128); + + alloc_free(large_pool, a3); + + alloc_shutdown(large_pool); + free(large_pool); + } + void test_alloc_malloc() { alloc_init(pool, sizeof(pool)); From db9e1cd42434a5c66f815af9af0dbdfd38948eda Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 8 Sep 2023 09:13:33 +0100 Subject: [PATCH 20/33] Fall back to unaligned if there's no more aligned spaced --- GL/alloc/alloc.c | 89 ++++++++++++++++++++++++++++++------------ tests/test_allocator.h | 35 ++++++++++++++++- 2 files changed, 99 insertions(+), 25 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index 1a03cc3..6b787d6 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -44,6 +44,7 @@ * - Allocations < 2048 can still cross boundaries * - Only operates on one pool (ignores what you pass) * - If there are no 2048 aligned blocks, we should fall-back to unaligned + * - Defrag not implemented! */ #include @@ -61,8 +62,12 @@ #endif -static inline int round_up(int n, int multiple) +static inline intptr_t round_up(intptr_t n, int multiple) { + if((n % multiple) == 0) { + return n; + } + assert(multiple); return ((n + multiple - 1) / multiple) * multiple; } @@ -112,6 +117,23 @@ size_t alloc_block_count(void* pool) { return pool_header.block_count; } +static inline void* calc_address( + uint8_t* block_usage_iterator, + int bit_offset, + size_t required_subblocks, + size_t* start_subblock_out +) { + uintptr_t offset = (block_usage_iterator - pool_header.block_usage) * 8; + offset += (bit_offset + 1); + offset -= required_subblocks; + + if(start_subblock_out) { + *start_subblock_out = offset; + } + + return pool_header.base_address + (offset * 256); +} + void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_subblock, size_t* required_subblocks); void* alloc_next_available(void* pool, size_t required_size) { @@ -125,7 +147,7 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su uint32_t required_subblocks = (required_size / 256); if(required_size % 256) required_subblocks += 1; - uint8_t* end = pool_header.block_usage + pool_header.block_count; + // uint8_t* end = pool_header.block_usage + pool_header.block_count; /* Anything gte to 2048 must be aligned to a 2048 boundary */ bool requires_alignment = required_size >= 2048; @@ -133,16 +155,27 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su if(required_subblocks_out) { *required_subblocks_out = required_subblocks; } - while(it < end) { - uint32_t found_subblocks = 0; + /* This is a fallback option. If while we're searching we find a possible slot + * but it's not aligned, or it's straddling a 2k boundary, then we store + * it here and if we reach the end of the search and find nothing better + * we use this instead */ + + uint8_t* poor_option = NULL; + size_t poor_start_subblock = 0; + + uint32_t found_subblocks = 0; + uint32_t found_poor_subblocks = 0; + + for(size_t j = 0; j < pool_header.block_count; ++j, ++it) { /* We just need to find enough consecutive blocks */ - while(found_subblocks < required_subblocks) { + if(found_subblocks < required_subblocks) { uint8_t t = *it; /* Optimisation only. Skip over full blocks */ if(t == 255) { found_subblocks = 0; + found_poor_subblocks = 0; } else { /* Now let's see how many consecutive blocks we can find */ for(int i = 0; i < 8; ++i) { @@ -153,35 +186,39 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su found_subblocks = 0; } else { found_subblocks++; - if(found_subblocks >= required_subblocks) { - /* We found space! Now calculate the address */ - uintptr_t offset = (it - pool_header.block_usage) * 8; - offset += (i + 1); - offset -= required_subblocks; - - if(start_subblock_out) { - *start_subblock_out = offset; - } - - return pool_header.base_address + (offset * 256); - } } + + found_poor_subblocks++; + + if(found_subblocks >= required_subblocks) { + /* We found space! Now calculate the address */ + return calc_address(it, i, required_subblocks, start_subblock_out); + } + + if(!poor_option && (found_poor_subblocks >= required_subblocks)) { + poor_option = calc_address(it, i, required_subblocks, &poor_start_subblock); + } + } else { found_subblocks = 0; + found_poor_subblocks = 0; } t <<= 1; } } - - ++it; - if(it >= end) { - return NULL; - } } } - return NULL; + if(poor_option) { + if(start_subblock_out) { + *start_subblock_out = poor_start_subblock; + } + + return poor_option; + } else { + return NULL; + } } int alloc_init(void* pool, size_t size) { @@ -200,7 +237,11 @@ int alloc_init(void* pool, size_t size) { memset(pool_header.block_usage, 0, sizeof(pool_header.block_usage)); pool_header.pool = pool; pool_header.pool_size = size; - pool_header.base_address = (uint8_t*) round_up((uintptr_t) pool_header.pool, 2048); + + intptr_t base_address = (intptr_t) pool_header.pool; + base_address = round_up(base_address, 2048); + + pool_header.base_address = (uint8_t*) base_address; pool_header.block_count = ((p + size) - pool_header.base_address) / 2048; pool_header.allocations = NULL; diff --git a/tests/test_allocator.h b/tests/test_allocator.h index f31e8aa..5117f52 100644 --- a/tests/test_allocator.h +++ b/tests/test_allocator.h @@ -19,12 +19,45 @@ public: uint8_t __attribute__((aligned(2048))) pool[16 * 2048]; void set_up() { + assert(((intptr_t) pool) % 2048 == 0); } void tear_down() { alloc_shutdown(pool); } - + + void test_poor_alloc_aligned() { + /* If we try to allocate and there are no suitable aligned + * slots available, we fallback to any available unaligned slots */ + alloc_init(pool, sizeof(pool)); + + // Leave only space for an unaligned block + alloc_malloc(pool, (15 * 2048) - 256); + + // Should work, we have space (just) but it's not aligned + void* a1 = alloc_malloc(pool, 2048 + 256); + assert_is_not_null(a1); + assert_equal(a1, pool + ((15 * 2048) - 256)); + } + + void test_poor_alloc_straddling() { + /* + * If we try to allocate a small block, it should not + * cross a 2048 boundary unless there is no other option */ + alloc_init(pool, sizeof(pool)); + alloc_malloc(pool, (15 * 2048) - 256); + void* a1 = alloc_malloc(pool, 512); + assert_true((uintptr_t(a1) % 2048) == 0); // Should've aligned to the last 2048 block + + /* Allocate the rest of the last block, this leaves a 256 block in the + * penultimate block */ + alloc_malloc(pool, 1536); + alloc_free(pool, a1); + + /* No choice but to straddle the boundary */ + a1 = alloc_malloc(pool, 768); + } + void test_alloc_init() { alloc_init(pool, sizeof(pool)); From 3308a57e5948aa09bb739279e265f37367471822 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 8 Sep 2023 17:49:46 +0100 Subject: [PATCH 21/33] Implement defragmenting the memory --- GL/alloc/alloc.c | 169 ++++++++++++++++++++++++----------------- GL/alloc/alloc.h | 6 +- GL/texture.c | 36 +++++---- tests/test_allocator.h | 48 ++++++++++-- tools/test.h | 8 +- 5 files changed, 170 insertions(+), 97 deletions(-) diff --git a/GL/alloc/alloc.c b/GL/alloc/alloc.c index 6b787d6..6760ff4 100644 --- a/GL/alloc/alloc.c +++ b/GL/alloc/alloc.c @@ -6,7 +6,7 @@ #include "alloc.h" -/* This allocator is designed so that all allocations larger +/* This allocator is designed so that ideally all allocations larger * than 2k, fall on a 2k boundary. Smaller allocations will * never cross a 2k boundary. * @@ -15,9 +15,9 @@ * blocks anyway as they have to be 2k aligned (so you'd need to * store them in reverse or something) * - * Defragmenting the pool will move allocations less than 2k - * first, and then shift any full 2k blocks to the start of the - * address space. + * Defragmenting the pool will move larger allocations first, then + * smaller ones, recursively until you tell it to stop, or until things + * stop moving. * * The maximum pool size is 8M, made up of: * @@ -41,10 +41,7 @@ * * FIXME: * - * - Allocations < 2048 can still cross boundaries * - Only operates on one pool (ignores what you pass) - * - If there are no 2048 aligned blocks, we should fall-back to unaligned - * - Defrag not implemented! */ #include @@ -90,7 +87,6 @@ typedef struct { size_t pool_size; // Size of the memory pool uint8_t* base_address; // First 2k aligned address in the pool size_t block_count; // Number of 2k blocks in the pool - bool defrag_in_progress; /* It's frustrating that we need to do this dynamically * but we need to know the size allocated when we free()... @@ -104,7 +100,7 @@ typedef struct { static PoolHeader pool_header = { - {0}, NULL, 0, NULL, 0, false, NULL + {0}, NULL, 0, NULL, 0, NULL }; void* alloc_base_address(void* pool) { @@ -147,8 +143,6 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su uint32_t required_subblocks = (required_size / 256); if(required_size % 256) required_subblocks += 1; - // uint8_t* end = pool_header.block_usage + pool_header.block_count; - /* Anything gte to 2048 must be aligned to a 2048 boundary */ bool requires_alignment = required_size >= 2048; @@ -160,7 +154,6 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su * but it's not aligned, or it's straddling a 2k boundary, then we store * it here and if we reach the end of the search and find nothing better * we use this instead */ - uint8_t* poor_option = NULL; size_t poor_start_subblock = 0; @@ -180,7 +173,16 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su /* Now let's see how many consecutive blocks we can find */ for(int i = 0; i < 8; ++i) { if((t & 0x80) == 0) { - if(requires_alignment && found_subblocks == 0 && i != 0) { + bool block_overflow = ( + required_size < 2048 && found_subblocks > 0 && i == 0 + ); + + bool reset_subblocks = ( + (requires_alignment && found_subblocks == 0 && i != 0) || + block_overflow + ); + + if(reset_subblocks) { // Ignore this subblock, because we want the first subblock to be aligned // at a 2048 boundary and this one isn't (i != 0) found_subblocks = 0; @@ -188,6 +190,12 @@ void* alloc_next_available_ex(void* pool, size_t required_size, size_t* start_su found_subblocks++; } + /* If we reset the subblocks due to an overflow, we still + * want to count this free subblock in our count */ + if(block_overflow) { + found_subblocks++; + } + found_poor_subblocks++; if(found_subblocks >= required_subblocks) { @@ -234,7 +242,7 @@ int alloc_init(void* pool, size_t size) { uint8_t* p = (uint8_t*) pool; - memset(pool_header.block_usage, 0, sizeof(pool_header.block_usage)); + memset(pool_header.block_usage, 0, BLOCK_COUNT); pool_header.pool = pool; pool_header.pool_size = size; @@ -253,6 +261,10 @@ int alloc_init(void* pool, size_t size) { void alloc_shutdown(void* pool) { (void) pool; + if(!pool_header.pool) { + return; + } + struct AllocEntry* it = pool_header.allocations; while(it) { struct AllocEntry* next = it->next; @@ -261,6 +273,7 @@ void alloc_shutdown(void* pool) { } memset(&pool_header, 0, sizeof(pool_header)); + pool_header.pool = NULL; } static inline uint32_t size_to_subblock_count(size_t size) { @@ -285,10 +298,6 @@ void* alloc_malloc(void* pool, size_t size) { size_t start_subblock, required_subblocks; void* ret = alloc_next_available_ex(pool, size, &start_subblock, &required_subblocks); - if(size >= 2048) { - assert(((uintptr_t) ret) % 2048 == 0); - } - if(ret) { size_t block; uint8_t offset; @@ -367,6 +376,45 @@ void* alloc_malloc(void* pool, size_t size) { return ret; } +static void alloc_release_blocks(struct AllocEntry* it) { + size_t used_subblocks = size_to_subblock_count(it->size); + size_t subblock = subblock_from_pointer(it->pointer); + size_t block; + uint8_t offset; + block_and_offset_from_subblock(subblock, &block, &offset); + + uint8_t mask = 0; + + DBG_MSG("Free: size: %d, us: %d, sb: %d, off: %d\n", it->size, used_subblocks, block, offset); + + /* Wipe out any leading subblocks */ + int c = (used_subblocks < 8) ? used_subblocks : 8; + for(int i = 0; i < c; ++i) { + mask |= (1 << (7 - (offset + i))); + used_subblocks--; + } + + if(mask) { + pool_header.block_usage[block++] &= ~mask; + } + + /* Clear any full blocks in the middle of the allocation */ + while(used_subblocks > 8) { + pool_header.block_usage[block++] = 0; + used_subblocks -= 8; + } + + /* Wipe out any trailing subblocks */ + mask = 0; + for(size_t i = 0; i < used_subblocks; ++i) { + mask |= (1 << (7 - i)); + } + + if(mask) { + pool_header.block_usage[block++] &= ~mask; + } +} + void alloc_free(void* pool, void* p) { (void) pool; @@ -374,42 +422,7 @@ void alloc_free(void* pool, void* p) { struct AllocEntry* last = NULL; while(it) { if(it->pointer == p) { - size_t used_subblocks = size_to_subblock_count(it->size); - size_t subblock = subblock_from_pointer(p); - size_t block; - uint8_t offset; - block_and_offset_from_subblock(subblock, &block, &offset); - - uint8_t mask = 0; - - DBG_MSG("Free: size: %d, us: %d, sb: %d, off: %d\n", it->size, used_subblocks, block, offset); - - /* Wipe out any leading subblocks */ - int c = (used_subblocks < 8) ? used_subblocks : 8; - for(int i = 0; i < c; ++i) { - mask |= (1 << (7 - (offset + i))); - used_subblocks--; - } - - if(mask) { - pool_header.block_usage[block++] &= ~mask; - } - - /* Clear any full blocks in the middle of the allocation */ - while(used_subblocks > 8) { - pool_header.block_usage[block++] = 0; - used_subblocks -= 8; - } - - /* Wipe out any trailing subblocks */ - mask = 0; - for(size_t i = 0; i < used_subblocks; ++i) { - mask |= (1 << (7 - i)); - } - - if(mask) { - pool_header.block_usage[block++] &= ~mask; - } + alloc_release_blocks(it); if(last) { last->next = it->next; @@ -430,24 +443,40 @@ void alloc_free(void* pool, void* p) { DBG_MSG("Free done\n"); } -void alloc_defrag_start(void* pool) { - (void) pool; - pool_header.defrag_in_progress = true; -} +void alloc_run_defrag(void* pool, defrag_address_move callback, int max_iterations, void* user_data) { -void* alloc_defrag_address(void* pool, void* p) { - (void) pool; - return p; -} + for(int i = 0; i < max_iterations; ++i) { + bool move_occurred = false; -void alloc_defrag_commit(void* pool) { - (void) pool; - pool_header.defrag_in_progress = false; -} + struct AllocEntry* it = pool_header.allocations; -bool alloc_defrag_in_progress(void* pool) { - (void) pool; - return pool_header.defrag_in_progress; + if(!it) { + return; + } + + while(it) { + void* potential_dest = alloc_next_available(pool, it->size); + if(potential_dest < it->pointer) { + potential_dest = alloc_malloc(pool, it->size); + memcpy(potential_dest, it->pointer, it->size); + + /* Mark this block as now free, but don't fiddle with the + * allocation list */ + alloc_release_blocks(it); + + callback(it->pointer, potential_dest, user_data); + + it->pointer = potential_dest; + move_occurred = true; + } + + it = it->next; + } + + if(!move_occurred) { + return; + } + } } static inline uint8_t count_ones(uint8_t byte) { @@ -459,6 +488,8 @@ static inline uint8_t count_ones(uint8_t byte) { } size_t alloc_count_free(void* pool) { + (void) pool; + uint8_t* it = pool_header.block_usage; uint8_t* end = it + pool_header.block_count; diff --git a/GL/alloc/alloc.h b/GL/alloc/alloc.h index d69bb9f..49400f9 100644 --- a/GL/alloc/alloc.h +++ b/GL/alloc/alloc.h @@ -14,10 +14,8 @@ void alloc_shutdown(void* pool); void *alloc_malloc(void* pool, size_t size); void alloc_free(void* pool, void* p); -void alloc_defrag_start(void* pool); -void* alloc_defrag_address(void* pool, void* p); -void alloc_defrag_commit(void* pool); -bool alloc_defrag_in_progress(void* pool); +typedef void (defrag_address_move)(void*, void*, void*); +void alloc_run_defrag(void* pool, defrag_address_move callback, int max_iterations, void* user_data); size_t alloc_count_free(void* pool); size_t alloc_count_continuous(void* pool); diff --git a/GL/texture.c b/GL/texture.c index 5fcf473..4871e12 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -78,8 +78,8 @@ static const unsigned short MortonTable256[256] = /* Given a 0-based texel location, and an image width/height. Return the * new 0-based texel location */ GL_FORCE_INLINE uint32_t twid_location(uint32_t i, uint32_t w, uint32_t h) { - uint16_t y = i % w; - uint16_t x = i / w; + uint16_t y = i / w; + uint16_t x = i % w; return MortonTable256[y >> 8] << 17 | MortonTable256[x >> 8] << 16 | @@ -1611,14 +1611,21 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, for(uint32_t i = 0; i < (width * height); ++i) { uint32_t newLocation = twid_location(i, width, height); + assert(newLocation < (width * height)); + assert((newLocation / 2) < destBytes); + assert((i / 2) < srcBytes); + // This is the src/dest byte, but we need to figure // out which half based on the odd/even of i src = &((uint8_t*) data)[i / 2]; dst = &conversionBuffer[newLocation / 2]; - if(i % 2 == 0) { - *dst = (*dst & 0xF) | (*src & 0xF0); + + uint8_t src_value = (i % 2) == 0 ? (*src >> 4) : (*src & 0xF); + + if(newLocation % 2 == 0) { + *dst = (*dst & 0xF) | (src_value << 4); } else { - *dst = (*dst & 0xF0) | (*src & 0xF); + *dst = (*dst & 0xF0) | (src_value & 0xF); } } } else { @@ -2044,21 +2051,20 @@ GLuint _glFreeContiguousTextureMemory() { return alloc_count_continuous(ALLOC_BASE); } -GLAPI GLvoid APIENTRY glDefragmentTextureMemory_KOS(void) { - alloc_defrag_start(ALLOC_BASE); - - GLuint id; - - /* Replace all texture pointers */ - for(id = 0; id < MAX_TEXTURE_COUNT; id++){ +static void update_data_pointer(void* src, void* dst, void*) { + for(size_t id = 0; id < MAX_TEXTURE_COUNT; id++){ TextureObject* txr = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, id); - if(txr){ + if(txr && txr->data == src) { + fprintf(stderr, "Defrag moved 0x%x -> 0x%x\n", src, dst); gl_assert(txr->index == id); - txr->data = alloc_defrag_address(ALLOC_BASE, txr->data); + txr->data = dst; + return; } } +} - alloc_defrag_commit(ALLOC_BASE); +GLAPI GLvoid APIENTRY glDefragmentTextureMemory_KOS(void) { + alloc_run_defrag(ALLOC_BASE, update_data_pointer, 5, NULL); } GLAPI void APIENTRY glGetTexImage(GLenum tex, GLint lod, GLenum format, GLenum type, GLvoid* img) { diff --git a/tests/test_allocator.h b/tests/test_allocator.h index 5117f52..5967983 100644 --- a/tests/test_allocator.h +++ b/tests/test_allocator.h @@ -1,7 +1,9 @@ #include "tools/test.h" -#include -#include +#include +#include +#include +#include #include #include @@ -14,22 +16,52 @@ static inline int round_up(int n, int multiple) return ((n + multiple - 1) / multiple) * multiple; } +#define POOL_SIZE (16 * 2048) + class AllocatorTests : public test::TestCase { public: - uint8_t __attribute__((aligned(2048))) pool[16 * 2048]; + uint8_t* pool = NULL; + + std::vector> defrag_moves; void set_up() { + pool = (uint8_t*) memalign(2048, POOL_SIZE); assert(((intptr_t) pool) % 2048 == 0); } void tear_down() { alloc_shutdown(pool); + free(pool); + } + + static void on_defrag(void* src, void* dst, void* user_data) { + AllocatorTests* self = (AllocatorTests*) user_data; + self->defrag_moves.push_back(std::make_pair(src, dst)); + } + + void test_defrag() { + alloc_init(pool, POOL_SIZE); + + alloc_malloc(pool, 256); + void* a2 = alloc_malloc(pool, 256); + void* a3 = alloc_malloc(pool, 256); + + alloc_free(pool, a2); + + alloc_run_defrag(pool, &AllocatorTests::on_defrag, 5, this); + + assert_equal(defrag_moves.size(), 1u); // Moved a3 -> a2 + + assert_equal(defrag_moves[0].first, a3); + assert_equal(defrag_moves[0].second, a2); + + assert_equal(alloc_malloc(pool, 256), a3); } void test_poor_alloc_aligned() { /* If we try to allocate and there are no suitable aligned * slots available, we fallback to any available unaligned slots */ - alloc_init(pool, sizeof(pool)); + alloc_init(pool, POOL_SIZE); // Leave only space for an unaligned block alloc_malloc(pool, (15 * 2048) - 256); @@ -44,7 +76,7 @@ public: /* * If we try to allocate a small block, it should not * cross a 2048 boundary unless there is no other option */ - alloc_init(pool, sizeof(pool)); + alloc_init(pool, POOL_SIZE); alloc_malloc(pool, (15 * 2048) - 256); void* a1 = alloc_malloc(pool, 512); assert_true((uintptr_t(a1) % 2048) == 0); // Should've aligned to the last 2048 block @@ -59,14 +91,14 @@ public: } void test_alloc_init() { - alloc_init(pool, sizeof(pool)); + alloc_init(pool, POOL_SIZE); void* expected_base_address = (void*) round_up((uintptr_t) pool, 2048); assert_equal(alloc_next_available(pool, 16), expected_base_address); assert_equal(alloc_base_address(pool), expected_base_address); size_t expected_blocks = ( - uintptr_t(pool + sizeof(pool)) - + uintptr_t(pool + POOL_SIZE) - uintptr_t(expected_base_address) ) / 2048; @@ -109,7 +141,7 @@ public: } void test_alloc_malloc() { - alloc_init(pool, sizeof(pool)); + alloc_init(pool, POOL_SIZE); uint8_t* base_address = (uint8_t*) alloc_base_address(pool); void* a1 = alloc_malloc(pool, 1024); diff --git a/tools/test.h b/tools/test.h index 6341a36..b4ef409 100644 --- a/tools/test.h +++ b/tools/test.h @@ -289,7 +289,13 @@ public: std::function func = std::bind(method, dynamic_cast(instance.get())); tests_.push_back([=]() { instance->set_up(); - func(); + try { + func(); + } catch(...) { + instance->tear_down(); + throw; + } + instance->tear_down(); }); } From 61e5a7a2a6c72201c3b1815ddc998cce47f01b88 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Sun, 10 Sep 2023 19:41:25 +0100 Subject: [PATCH 22/33] More twiddling work --- GL/texture.c | 68 +++++++++++++++++++++++++++++--- samples/nehe06/main.c | 2 +- samples/nehe06/romdisk/NeHe.bmp | Bin 196662 -> 522 bytes samples/paletted_pcx/main.c | 4 +- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/GL/texture.c b/GL/texture.c index 4871e12..a60c715 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -75,16 +75,70 @@ static const unsigned short MortonTable256[256] = }; +static struct TwiddleTable { + int32_t width; + int32_t height; + int32_t* table; +} TWIDDLE_TABLE = {0, 0, NULL}; + + +int32_t twiddle_recurse(int32_t* table, int32_t stride, int32_t x, int32_t y, int32_t block_size, int32_t idx) { + int32_t prev_idx = idx; + if(block_size == 1) { + table[idx++] = y * stride + x; + } else { + block_size = block_size >> 1; + idx += twiddle_recurse(table, stride, x, y, block_size, idx); + idx += twiddle_recurse(table, stride, x, y + block_size, block_size, idx); + idx += twiddle_recurse(table, stride, x + block_size, y, block_size, idx); + idx += twiddle_recurse(table, stride, x + block_size, y + block_size, block_size, idx); + } + + return (idx - prev_idx); +} + +void build_twiddle_table(int32_t* table, int32_t w, int32_t h) { + free(TWIDDLE_TABLE.table); + TWIDDLE_TABLE.table = (int32_t*) malloc(w * h * sizeof(int32_t)); + TWIDDLE_TABLE.width = w; + TWIDDLE_TABLE.height = h; + + int32_t idx = 0; + + if(w < h) { + for(int32_t i = 0; i < h; i += w) { + idx += twiddle_recurse(table, w, 0, i, w, idx); + } + } else { + for(int32_t i = 0; i < w; i += h) { + idx += twiddle_recurse(table, w, i, 0, h, idx); + } + } +} + /* Given a 0-based texel location, and an image width/height. Return the * new 0-based texel location */ GL_FORCE_INLINE uint32_t twid_location(uint32_t i, uint32_t w, uint32_t h) { - uint16_t y = i / w; - uint16_t x = i % w; + if(TWIDDLE_TABLE.width != w || TWIDDLE_TABLE.height != h || !TWIDDLE_TABLE.table) { + build_twiddle_table(TWIDDLE_TABLE.table, w, h); + } - return MortonTable256[y >> 8] << 17 | - MortonTable256[x >> 8] << 16 | - MortonTable256[y & 0xFF] << 1 | - MortonTable256[x & 0xFF]; + uint32_t ret = TWIDDLE_TABLE.table[i]; + fprintf(stderr, "%d -> %d\n", i, ret); + + return ret; + +// uint32_t x = i % w; +// uint32_t y = i / w; + +// uint32_t ret = MortonTable256[y >> 8] << 17 | +// MortonTable256[x >> 8] << 16 | +// MortonTable256[y & 0xFF] << 1 | +// MortonTable256[x & 0xFF]; + +// uint32_t min = (w < h) ? w : h; +// uint32_t r = (x / min + y / min) * min * min / 2; +// return ret + r; } @@ -1024,6 +1078,8 @@ static GLuint _determinePVRFormat(GLint internalFormat) { /* Given a cleaned internalFormat, return the Dreamcast format * that can hold it */ + + fprintf(stderr, "Internal format -> 0x%x\n", internalFormat); switch(internalFormat) { case GL_RGB565_KOS: return GPU_TXRFMT_RGB565 | GPU_TXRFMT_NONTWIDDLED; diff --git a/samples/nehe06/main.c b/samples/nehe06/main.c index 7f32af5..21aaa15 100644 --- a/samples/nehe06/main.c +++ b/samples/nehe06/main.c @@ -53,7 +53,7 @@ void LoadGLTextures() { // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. - glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data); free(image1); } diff --git a/samples/nehe06/romdisk/NeHe.bmp b/samples/nehe06/romdisk/NeHe.bmp index 6b3db10f2b8d60997f7e213255809961985c2ef3..06f8a229e75734c035a0203715ca36297f0c68b4 100644 GIT binary patch literal 522 zcmZ?rW-t^9atLCFOANaL>}Xb3Wu5%yH&32CdGgfkdPk$zC`X5XdF6{% z{ioIVmH+K~{D0$PjKGJDz`p%rd~%GyFCGE4-~ZyPIj-OsfqfAe^M7Ah#wR}z1jhXT zKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah z#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n z&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV z^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXT zKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zF#5dXD59QzhEJ~>9<$RThb{_B4@bUNKT ztEt0oOGW*IMsBuOobQ*0jch&{k{ouu{@uxNn99Dl^1p>(Kj=T@twQhS(Cc)P(_TnN zMxEl~L~X8L?o>0ekk@84|4{@u5dTdkli6$*MbY7Kr2Mvi(r~6LTwhN;xw`zD&#wK$ zZ=d}8-+ui+|LHgX{qKMEufPBLuYdLN*H11#`{>x?tFsT!&s^M`>^Jg0kMxFO>vh^# z(6c(-e|-JIcc0$;`oY%Y%M%Yzl|S9CetvWAtB<#?T|CxnmRwHpg#v>PO(&)~)B91d zfBfy!|NdXT`#=BkyZ`l1zx}sAeEa47%Zn3TpX}hqgwL|pi#)wH_2-|R`@6q<`0s!B z?f?FlzxW^j@Mr)0mtTB*Woy`|*llKuQCp6Q$7eH7t}XxevupqK7tgqW%l_}b`}QAx z^W^f$m2x)yf(-ok?c|4G=$MGCA7;!~W_%AXbie!L%x^!t_wD_wC*~*8QQylCN(F?q z>D*WMPX5hrKK=K<{d21M=+1>+tNikn>Y29_Oug6e!+`=6&6;M)ac;Fl)BMe^AN~8^ z{`UX*x8MKg-#*>hT#N+2m(yX@b+YosjoLRK@BGbgxaQCQ-~aZ9|Ms`PzH#AXF`Imq zgz9;tL7#~Sww9;AynFRGPw#yD(az^LXTP{K`25D~Hy@vQbm#oW!fYZMH0aege!af1 zSN?h+{@ZLem&+9h1TvXSrI0Qr{k5oNIv2V;SATYK_7Bgl(*^$Z_fP)Qw|76fyuLbF zYNUd-s4z?!PIg@Pwrk%$JooJ3jbn@Rkx<~30`30bw42+FgTO4~U7Nvl=x|<-%v?8jmi`|HT(K zA??5Y^|QbF^7g%p>$Ckb{7;76+%?QtRy(2V3svO*>(6ie)9*h2x4-`EyGNI=oSGYU zD)WPuBw8I7?I>@bYsRl1Ykq!v@`r+;K53X&!AkrZPQ*Q@etJNw90$;p>Zl>he=$1b|IrY0o7ykKoU;K~1|FhqJ z^YO#m=X%ZWdtXe}&sU}Ge(B-X;CG*1{O8|&{y+cm*Z<{jzNUw6Y%J_6p?XqwScaYK z?F(zDzK^b*?bLJ8M7mZ;=F&;Q?irL553kJr{#SQDxp{iB*RTt=*A(^opAN)-G=DG{ zg#U>|!k4Ito@P!6RC98(Gb(qM6UA;Q5DY}^^=AF-skLVxU;F6h=845jKX0pL0#Yzu z4HX|=SpEH1pItk*Q!bQV)pPA;U9T88yVk#Sa=zbg%7S}iX6?r5`JLHFKj^7Sa=Yv= z)$2}Q^X%Hxx1Zj-d}bq;PN>zCB&lBrq}Jk z$J5zHASx!aAufA(<2?HR1^ypKel$!x9&e>nF;_M3bT!M7;q3C(_Qj7bokRbt{D=H1 z3Hh{J^ryS_Yp1%6h3mD}d^i|(`#g-l|Md^wyxi`G5lk%ͰF-6LSL>~!sG^Y!B7 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 diff --git a/samples/paletted_pcx/main.c b/samples/paletted_pcx/main.c index 7599dcb..f306481 100644 --- a/samples/paletted_pcx/main.c +++ b/samples/paletted_pcx/main.c @@ -281,6 +281,8 @@ int BMP_GetPalette(FILE *pFile) } return 1; } + + fprintf(stderr, "BitCount: %d\n", BmpInfoHeader.BitCount); return 0; } @@ -346,7 +348,7 @@ int LoadPalettedBMP(const char* filename, Image* image) } if (!BMP_GetPalette(fp)) { - printf("Only 16c BMP are supported for this sample"); + printf("Only 16c BMP are supported for this sample\n"); return 0; } From 951ece6d198004ff60b77cb73af324db28b64b25 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Mon, 11 Sep 2023 17:25:47 +0100 Subject: [PATCH 23/33] Add test job to CI --- .gitlab-ci.yml | 18 +++++++++++++++++- samples/nehe06/romdisk/NeHe.bmp | Bin 522 -> 196662 bytes 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f90dcd..701e2a9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,6 @@ stages: - build + - test build:sh4-gcc: stage: build @@ -17,7 +18,7 @@ build:sh4-gcc: build:x86-gcc: stage: build - image: fedora:34 + image: fedora:38 before_script: - sudo dnf install -y cmake gcc gcc-c++ SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 script: @@ -25,3 +26,18 @@ build:x86-gcc: - cd builddir - cmake -DCMAKE_BUILD_TYPE=Release .. - make + artifacts: + paths: + - builddir/tests/gldc_tests + +test:x86-gcc: + stage: build + image: fedora:38 + before_script: + - sudo dnf install -y cmake gcc gcc-c++ SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 + script: + - cd builddir/tests/ + - SDL_VIDEODRIVER=dummy ./gldc_tests --junit-xml=report.xml + artifacts: + reports: + junit: builddir/tests/report.xml diff --git a/samples/nehe06/romdisk/NeHe.bmp b/samples/nehe06/romdisk/NeHe.bmp index 06f8a229e75734c035a0203715ca36297f0c68b4..6b3db10f2b8d60997f7e213255809961985c2ef3 100644 GIT binary patch literal 196662 zcmeFa_j4RccJJHXRabXcwTbrLn`rNWh7EWSpaDP=^xn=4gF|vSepb6HZAiPix=*_D zSN8|KYva8?@x4!>W-t^9atLCFOANaL>}Xb3Wu5%yH&32CdGgfkdPk$zC`X5XdF6{% z{ioIVmH+K~{D0$PjKGJDz`p%rd~%GyFCGE4-~ZyPIj-OsfqfAe^M7Ah#wR}z1jhXT zKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah z#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n z&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV z^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zFV^M7Ah#wR}z1jhXT zKpJ{n&3zFV^M7Ah#wR}z1jhXTKpJ{n&3zF#5dXD59QzhEJ~>9<$RThb{_B4@bUNKT ztEt0oOGW*IMsBuOobQ*0jch&{k{ouu{@uxNn99Dl^1p>(Kj=T@twQhS(Cc)P(_TnN zMxEl~L~X8L?o>0ekk@84|4{@u5dTdkli6$*MbY7Kr2Mvi(r~6LTwhN;xw`zD&#wK$ zZ=d}8-+ui+|LHgX{qKMEufPBLuYdLN*H11#`{>x?tFsT!&s^M`>^Jg0kMxFO>vh^# z(6c(-e|-JIcc0$;`oY%Y%M%Yzl|S9CetvWAtB<#?T|CxnmRwHpg#v>PO(&)~)B91d zfBfy!|NdXT`#=BkyZ`l1zx}sAeEa47%Zn3TpX}hqgwL|pi#)wH_2-|R`@6q<`0s!B z?f?FlzxW^j@Mr)0mtTB*Woy`|*llKuQCp6Q$7eH7t}XxevupqK7tgqW%l_}b`}QAx z^W^f$m2x)yf(-ok?c|4G=$MGCA7;!~W_%AXbie!L%x^!t_wD_wC*~*8QQylCN(F?q z>D*WMPX5hrKK=K<{d21M=+1>+tNikn>Y29_Oug6e!+`=6&6;M)ac;Fl)BMe^AN~8^ z{`UX*x8MKg-#*>hT#N+2m(yX@b+YosjoLRK@BGbgxaQCQ-~aZ9|Ms`PzH#AXF`Imq zgz9;tL7#~Sww9;AynFRGPw#yD(az^LXTP{K`25D~Hy@vQbm#oW!fYZMH0aege!af1 zSN?h+{@ZLem&+9h1TvXSrI0Qr{k5oNIv2V;SATYK_7Bgl(*^$Z_fP)Qw|76fyuLbF zYNUd-s4z?!PIg@Pwrk%$JooJ3jbn@Rkx<~30`30bw42+FgTO4~U7Nvl=x|<-%v?8jmi`|HT(K zA??5Y^|QbF^7g%p>$Ckb{7;76+%?QtRy(2V3svO*>(6ie)9*h2x4-`EyGNI=oSGYU zD)WPuBw8I7?I>@bYsRl1Ykq!v@`r+;K53X&!AkrZPQ*Q@etJNw90$;p>Zl>he=$1b|IrY0o7ykKoU;K~1|FhqJ z^YO#m=X%ZWdtXe}&sU}Ge(B-X;CG*1{O8|&{y+cm*Z<{jzNUw6Y%J_6p?XqwScaYK z?F(zDzK^b*?bLJ8M7mZ;=F&;Q?irL553kJr{#SQDxp{iB*RTt=*A(^opAN)-G=DG{ zg#U>|!k4Ito@P!6RC98(Gb(qM6UA;Q5DY}^^=AF-skLVxU;F6h=845jKX0pL0#Yzu z4HX|=SpEH1pItk*Q!bQV)pPA;U9T88yVk#Sa=zbg%7S}iX6?r5`JLHFKj^7Sa=Yv= z)$2}Q^X%Hxx1Zj-d}bq;PN>zCB&lBrq}Jk z$J5zHASx!aAufA(<2?HR1^ypKel$!x9&e>nF;_M3bT!M7;q3C(_Qj7bokRbt{D=H1 z3Hh{J^ryS_Yp1%6h3mD}d^i|(`#g-l|Md^wyxi`G5lk%ͰF-6LSL>~!sG^Y!B7 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 literal 522 zcmZ?r Date: Mon, 11 Sep 2023 17:27:04 +0100 Subject: [PATCH 24/33] Fix twiddling issues --- GL/draw.c | 24 +------ GL/platforms/software.h | 3 +- GL/texture.c | 72 +++----------------- samples/nehe06/main.c | 1 - samples/nehe06/romdisk/NeHe.bmp | Bin 196662 -> 98442 bytes samples/paletted_pcx/main.c | 3 + samples/paletted_pcx/romdisk/NeHe-Alpha.bmp | Bin 32886 -> 16586 bytes 7 files changed, 16 insertions(+), 87 deletions(-) diff --git a/GL/draw.c b/GL/draw.c index 2fa6d88..38139d7 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -78,7 +78,7 @@ static void _readVertexData3f3f(const GLubyte* __restrict__ in, GLubyte* __restr // 10:10:10:2REV format static void _readVertexData1i3f(const GLubyte* in, GLubyte* out) { - const static float MULTIPLIER = 1.0f / 1023.0f; + static const float MULTIPLIER = 1.0f / 1023.0f; GLfloat* output = (GLfloat*) out; @@ -585,7 +585,6 @@ static void _readPositionData(ReadDiffuseFunc func, const GLuint first, const GL const GLubyte* vptr = ((GLubyte*) ATTRIB_POINTERS.vertex.ptr + (first * vstride)); float pos[3]; - float w = 0.0f; ITERATE(count) { PREFETCH(vptr + vstride); @@ -726,9 +725,7 @@ typedef struct { } Float2; static const Float3 F3Z = {0.0f, 0.0f, 1.0f}; -static const Float3 F3ZERO = {0.0f, 0.0f, 0.0f}; static const Float2 F2ZERO = {0.0f, 0.0f}; -static const uint32_t U4ONE = ~0; static void generateElementsFastPath( SubmissionTarget* target, const GLsizei first, const GLuint count, @@ -910,24 +907,6 @@ static void transform(SubmissionTarget* target) { TransformVertices(vertex, target->count); } -static void mat_transform3(const float* xyz, const float* xyzOut, const uint32_t count, const uint32_t inStride, const uint32_t outStride) { - const uint8_t* dataIn = (const uint8_t*) xyz; - uint8_t* dataOut = (uint8_t*) xyzOut; - - ITERATE(count) { - const float* in = (const float*) dataIn; - float* out = (float*) dataOut; - - TransformVec3NoMod( - in, - out - ); - - dataIn += inStride; - dataOut += outStride; - } -} - static void mat_transform_normal3(const float* xyz, const float* xyzOut, const uint32_t count, const uint32_t inStride, const uint32_t outStride) { const uint8_t* dataIn = (const uint8_t*) xyz; uint8_t* dataOut = (uint8_t*) xyzOut; @@ -1224,7 +1203,6 @@ GL_FORCE_INLINE void submitVertices(GLenum mode, GLsizei first, GLuint count, GL target->header_offset = vector_size; target->start_offset = target->header_offset + (header_required ? 1 : 0); - gl_assert(target->header_offset >= 0); gl_assert(target->start_offset >= target->header_offset); gl_assert(target->count); diff --git a/GL/platforms/software.h b/GL/platforms/software.h index bbb4f35..5fee317 100644 --- a/GL/platforms/software.h +++ b/GL/platforms/software.h @@ -48,7 +48,8 @@ void TransformVec3NoMod(const float* v, float* ret); /* Transform a 3-element normal using the stored matrix (w == 0)*/ static inline void TransformNormalNoMod(const float* xIn, float* xOut) { - + (void) xIn; + (void) xOut; } void TransformVertices(Vertex* vertices, const int count); diff --git a/GL/texture.c b/GL/texture.c index a60c715..fe1df47 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -38,54 +38,16 @@ static GLboolean TEXTURE_TWIDDLE_ENABLED = GL_FALSE; static void* ALLOC_BASE = NULL; static size_t ALLOC_SIZE = 0; -static const unsigned short MortonTable256[256] = - { - 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015, - 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055, - 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115, - 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155, - 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415, - 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455, - 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515, - 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555, - 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015, - 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055, - 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115, - 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155, - 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415, - 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455, - 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515, - 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555, - 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015, - 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055, - 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115, - 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155, - 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415, - 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455, - 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515, - 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555, - 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015, - 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055, - 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115, - 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155, - 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415, - 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455, - 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515, - 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555 -}; - - static struct TwiddleTable { int32_t width; int32_t height; int32_t* table; } TWIDDLE_TABLE = {0, 0, NULL}; - int32_t twiddle_recurse(int32_t* table, int32_t stride, int32_t x, int32_t y, int32_t block_size, int32_t idx) { int32_t prev_idx = idx; if(block_size == 1) { - table[idx++] = y * stride + x; + table[y * stride + x] = idx++; } else { block_size = block_size >> 1; idx += twiddle_recurse(table, stride, x, y, block_size, idx); @@ -97,7 +59,7 @@ int32_t twiddle_recurse(int32_t* table, int32_t stride, int32_t x, int32_t y, in return (idx - prev_idx); } -void build_twiddle_table(int32_t* table, int32_t w, int32_t h) { +void build_twiddle_table(int32_t w, int32_t h) { free(TWIDDLE_TABLE.table); TWIDDLE_TABLE.table = (int32_t*) malloc(w * h * sizeof(int32_t)); TWIDDLE_TABLE.width = w; @@ -107,11 +69,11 @@ void build_twiddle_table(int32_t* table, int32_t w, int32_t h) { if(w < h) { for(int32_t i = 0; i < h; i += w) { - idx += twiddle_recurse(table, w, 0, i, w, idx); + idx += twiddle_recurse(TWIDDLE_TABLE.table, w, 0, i, w, idx); } } else { for(int32_t i = 0; i < w; i += h) { - idx += twiddle_recurse(table, w, i, 0, h, idx); + idx += twiddle_recurse(TWIDDLE_TABLE.table, w, i, 0, h, idx); } } } @@ -120,25 +82,11 @@ void build_twiddle_table(int32_t* table, int32_t w, int32_t h) { * new 0-based texel location */ GL_FORCE_INLINE uint32_t twid_location(uint32_t i, uint32_t w, uint32_t h) { if(TWIDDLE_TABLE.width != w || TWIDDLE_TABLE.height != h || !TWIDDLE_TABLE.table) { - build_twiddle_table(TWIDDLE_TABLE.table, w, h); + build_twiddle_table(w, h); } uint32_t ret = TWIDDLE_TABLE.table[i]; - fprintf(stderr, "%d -> %d\n", i, ret); - return ret; - -// uint32_t x = i % w; -// uint32_t y = i / w; - -// uint32_t ret = MortonTable256[y >> 8] << 17 | -// MortonTable256[x >> 8] << 16 | -// MortonTable256[y & 0xFF] << 1 | -// MortonTable256[x & 0xFF]; - -// uint32_t min = (w < h) ? w : h; -// uint32_t r = (x / min + y / min) * min * min / 2; -// return ret + r; } @@ -295,7 +243,6 @@ void _glApplyColorTable(TexturePalette* src) { GLushort i; GLushort offset = src->size * src->bank; - for(i = 0; i < src->width; ++i) { GLubyte* entry = &src->data[i * 4]; @@ -1000,10 +947,12 @@ static GLint _cleanInternalFormat(GLint internalFormat) { case GL_COLOR_INDEX8_TWID_KOS: case GL_COLOR_INDEX4_TWID_KOS: return internalFormat; + /* Paletted textures are always twiddled.. otherwise they don't work! */ case GL_COLOR_INDEX4_EXT: - return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX4_TWID_KOS : internalFormat; + return GL_COLOR_INDEX4_TWID_KOS; case GL_COLOR_INDEX8_EXT: - return (TEXTURE_TWIDDLE_ENABLED) ? GL_COLOR_INDEX8_TWID_KOS : internalFormat; + return GL_COLOR_INDEX8_TWID_KOS; + case GL_RGB_TWID_KOS: return GL_RGB565_TWID_KOS; case GL_RGBA_TWID_KOS: @@ -1079,7 +1028,6 @@ static GLuint _determinePVRFormat(GLint internalFormat) { * that can hold it */ - fprintf(stderr, "Internal format -> 0x%x\n", internalFormat); switch(internalFormat) { case GL_RGB565_KOS: return GPU_TXRFMT_RGB565 | GPU_TXRFMT_NONTWIDDLED; @@ -1700,8 +1648,8 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, for(uint32_t i = 0; i < (width * height); ++i) { uint32_t newLocation = twid_location(i, width, height); dst = conversionBuffer + (destStride * newLocation); + src = data + (sourceStride * i); conversion(src, dst); - src += sourceStride; } } else if(pack) { FASTCPY(conversionBuffer, data, srcBytes); diff --git a/samples/nehe06/main.c b/samples/nehe06/main.c index 21aaa15..543c3a2 100644 --- a/samples/nehe06/main.c +++ b/samples/nehe06/main.c @@ -61,7 +61,6 @@ void LoadGLTextures() { /* A general OpenGL initialization function. Sets all of the initial parameters. */ void InitGL(int Width, int Height) // We call this right after our OpenGL window is created. { - glEnable(GL_TEXTURE_TWIDDLE_KOS); LoadGLTextures(); glEnable(GL_TEXTURE_2D); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black diff --git a/samples/nehe06/romdisk/NeHe.bmp b/samples/nehe06/romdisk/NeHe.bmp index 6b3db10f2b8d60997f7e213255809961985c2ef3..ad2171df184e5b0e600054579faf304e98d5b506 100644 GIT binary patch literal 98442 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ͰF-6LSL>~!sG^Y!B7 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 diff --git a/samples/paletted_pcx/main.c b/samples/paletted_pcx/main.c index f306481..e397ab7 100644 --- a/samples/paletted_pcx/main.c +++ b/samples/paletted_pcx/main.c @@ -254,6 +254,8 @@ int BMP_Infos(FILE *pFile, uint32_t *width, uint32_t *height) *width = (uint32_t)BmpInfoHeader.Width; *height = (uint32_t)BmpInfoHeader.Height; + fseek(pFile, BmpInfoHeader.Size + 14, SEEK_SET); + return 1; } @@ -270,6 +272,7 @@ int BMP_GetPalette(FILE *pFile) bitCount = BmpInfoHeader.ClrImportant * sizeof(RGB_QUAD); if (fread(BmpRgbQuad, 1, bitCount, pFile) != bitCount){ + fprintf(stderr, "Failed to read palette: %d\n", bitCount); return 0; } diff --git a/samples/paletted_pcx/romdisk/NeHe-Alpha.bmp b/samples/paletted_pcx/romdisk/NeHe-Alpha.bmp index db96b15c092cb4ca6756dd4886aeeb25a420961e..d8d9dea7ca9d685826dd72fb7a01cc347a21a775 100644 GIT binary patch literal 16586 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 UF8E^_>i?`1?XwK!2kdN literal 32886 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 From 3eee140addac7bfcaa48b43a10060e605b5ffcde Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Mon, 11 Sep 2023 17:29:59 +0100 Subject: [PATCH 25/33] Fix stage --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 701e2a9..94a548b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,7 +31,7 @@ build:x86-gcc: - builddir/tests/gldc_tests test:x86-gcc: - stage: build + stage: test image: fedora:38 before_script: - sudo dnf install -y cmake gcc gcc-c++ SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 From a1536cba445ea0a96ad69881784a78b3a095bb79 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Mon, 11 Sep 2023 17:31:08 +0100 Subject: [PATCH 26/33] Add dependency --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 94a548b..56bd87c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -33,6 +33,8 @@ build:x86-gcc: test:x86-gcc: stage: test image: fedora:38 + dependencies: + - build:x86-gcc before_script: - sudo dnf install -y cmake gcc gcc-c++ SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 script: From 9bc6da9fba3bbd87858acccf018f498633d66684 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Mon, 11 Sep 2023 19:55:26 +0100 Subject: [PATCH 27/33] Add some requirements --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 56bd87c..fbd447f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,7 +20,7 @@ build:x86-gcc: stage: build image: fedora:38 before_script: - - sudo dnf install -y cmake gcc gcc-c++ SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 + - sudo dnf install -y cmake gcc gcc-c++ SDL2.i686 SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 pkgconf-pkg-config.i686 script: - mkdir builddir - cd builddir @@ -36,7 +36,7 @@ test:x86-gcc: dependencies: - build:x86-gcc before_script: - - sudo dnf install -y cmake gcc gcc-c++ SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 + - sudo dnf install -y cmake gcc gcc-c++ SDL2.i686 SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 pkgconf-pkg-config.i686 script: - cd builddir/tests/ - SDL_VIDEODRIVER=dummy ./gldc_tests --junit-xml=report.xml From 1bf85549263aea1fffc1dd82211d486ad66883f8 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Mon, 11 Sep 2023 20:34:18 +0100 Subject: [PATCH 28/33] More erquirements --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fbd447f..01e03dd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,7 +20,7 @@ build:x86-gcc: stage: build image: fedora:38 before_script: - - sudo dnf install -y cmake gcc gcc-c++ SDL2.i686 SDL2-devel glibc-devel pkgconf-pkg-config glibc-devel.i686 SDL2-devel.i686 pkgconf-pkg-config.i686 + - sudo dnf install -y cmake gcc gcc-c++ SDL2.i686 SDL2-devel.x86_64 glibc-devel glibc-devel.i686 SDL2-devel.i686 pkgconf-pkg-config.i686 pkgconf-pkg-config.x86_64 script: - mkdir builddir - cd builddir From 00b44689280774ea2b3cb77e8d5d397b4dd60f6e Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Mon, 11 Sep 2023 20:42:09 +0100 Subject: [PATCH 29/33] Remove unused function --- GL/texture.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/GL/texture.c b/GL/texture.c index fe1df47..b7fd350 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -905,21 +905,6 @@ void APIENTRY glCompressedTexImage2DARB(GLenum target, _glGPUStateMarkDirty(); } -static GLboolean isTwiddledInternalFormat(GLint internalFormat) { - switch(internalFormat) { - case GL_RGB565_TWID_KOS: - case GL_ARGB4444_TWID_KOS: - case GL_ARGB1555_TWID_KOS: - case GL_COLOR_INDEX8_TWID_KOS: - case GL_COLOR_INDEX4_TWID_KOS: - case GL_RGB_TWID_KOS: - case GL_RGBA_TWID_KOS: - return true; - default: - return false; - } -} - /** * Takes an internal format, and returns a GL format matching how we'd store * it internally, so it'll return one of the following: @@ -2059,7 +2044,6 @@ static void update_data_pointer(void* src, void* dst, void*) { for(size_t id = 0; id < MAX_TEXTURE_COUNT; id++){ TextureObject* txr = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, id); if(txr && txr->data == src) { - fprintf(stderr, "Defrag moved 0x%x -> 0x%x\n", src, dst); gl_assert(txr->index == id); txr->data = dst; return; From d054dde785c82d64a7dab74415004e242011a933 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Tue, 12 Sep 2023 21:11:05 +0100 Subject: [PATCH 30/33] Fix paletted texture glitch --- GL/texture.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GL/texture.c b/GL/texture.c index b7fd350..f54cb2e 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -1611,7 +1611,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat, uint8_t src_value = (i % 2) == 0 ? (*src >> 4) : (*src & 0xF); - if(newLocation % 2 == 0) { + if(newLocation % 2 == 1) { *dst = (*dst & 0xF) | (src_value << 4); } else { *dst = (*dst & 0xF0) | (src_value & 0xF); From 202f5468483f807585307690e6d43715c82954ae Mon Sep 17 00:00:00 2001 From: Spencer Elliott Date: Wed, 20 Sep 2023 10:18:55 -0500 Subject: [PATCH 31/33] Fixed alignment for matrix passed into UploadMatrix4x4 in gluLookAt --- GL/matrix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GL/matrix.c b/GL/matrix.c index 32afff4..d95cd49 100644 --- a/GL/matrix.c +++ b/GL/matrix.c @@ -409,7 +409,7 @@ GL_FORCE_INLINE void vec3f_normalize_sh4(float *v){ void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz) { - GLfloat m [16]; + GLfloat m [16] __attribute__((aligned(32))); GLfloat f [3]; GLfloat u [3]; GLfloat s [3]; From 79172452f24a1ac1af6934723273a3588dd9cf1d Mon Sep 17 00:00:00 2001 From: Spencer Elliott Date: Tue, 26 Sep 2023 18:51:29 +0000 Subject: [PATCH 32/33] Convert GL_SHORT to proper float on conversion --- GL/draw.c | 5 +++-- samples/nehe06_4444twid/main.c | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/GL/draw.c b/GL/draw.c index 38139d7..01d9cf7 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "private.h" #include "platform.h" @@ -159,8 +160,8 @@ static void _readVertexData2us2f(const GLubyte* in, GLubyte* out) { const GLushort* input = (const GLushort*) in; float* output = (float*) out; - output[0] = input[0]; - output[1] = input[1]; + output[0] = (float)input[0] / SHRT_MAX; + output[1] = (float)input[1] / SHRT_MAX; } static void _readVertexData2ui2f(const GLubyte* in, GLubyte* out) { diff --git a/samples/nehe06_4444twid/main.c b/samples/nehe06_4444twid/main.c index b0649e5..3cc58d5 100644 --- a/samples/nehe06_4444twid/main.c +++ b/samples/nehe06_4444twid/main.c @@ -59,10 +59,10 @@ int ImageLoad(char *filename, Image *image) { fread(&header, sizeof(header), 1, file); - GLboolean twiddled = (header.type & (1 << 25)) < 1; - GLboolean compressed = (header.type & (1 << 29)) > 0; - GLboolean mipmapped = (header.type & (1 << 30)) > 0; - GLboolean strided = (header.type & (1 << 24)) > 0; + GLboolean twiddled = (header.type & (1 << 26)) < 1; + GLboolean compressed = (header.type & (1 << 30)) > 0; + GLboolean mipmapped = (header.type & (1 << 31)) > 0; + GLboolean strided = (header.type & (1 << 25)) > 0; GLuint format = (header.type >> 27) & 0b111; image->data = (char *) malloc (header.size); From 0efe4c6cefdd75d531b5fd78cf9df2337d280079 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Thu, 19 Oct 2023 22:26:13 +0100 Subject: [PATCH 33/33] Add missing defines --- include/GL/gl.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/GL/gl.h b/include/GL/gl.h index 7cc049e..028f900 100644 --- a/include/GL/gl.h +++ b/include/GL/gl.h @@ -359,7 +359,7 @@ __BEGIN_DECLS #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 - +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_COLOR_INDEX 0x1900 @@ -396,6 +396,7 @@ __BEGIN_DECLS #define GL_INTENSITY12 0x804C #define GL_INTENSITY16 0x804D +#define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_INTENSITY 0x8049 #define GL_RGB4 0x804F