From be46a0e4c25b3b8516d1868c62462bfc555baa2a Mon Sep 17 00:00:00 2001 From: Richard Geldreich Date: Tue, 10 Sep 2024 14:31:34 -0400 Subject: [PATCH] UASTC HDR changes --- webgl/ktx2_encode_test/index.html | 452 ++- webgl/ktx2_encode_test/renderer.js | 75 +- webgl/transcoder/CMakeLists.txt | 16 +- webgl/transcoder/basis_wrappers.cpp | 3342 +++++++++--------- webgl/transcoder/build/basis_transcoder.js | 23 +- webgl/transcoder/build/basis_transcoder.wasm | Bin 472914 -> 527333 bytes 6 files changed, 2201 insertions(+), 1707 deletions(-) diff --git a/webgl/ktx2_encode_test/index.html b/webgl/ktx2_encode_test/index.html index 1835ae7..10045bb 100644 --- a/webgl/ktx2_encode_test/index.html +++ b/webgl/ktx2_encode_test/index.html @@ -1,7 +1,13 @@ + + + -
- Basis Universal KTX2 encoding and transcoding test + Basis Universal .KTX2 GPU Texture Encoding and Transcoding Test
-
This demo uses the Basis C++ transcoder (compiled to Javascript using Emscripten) to transcode a .ktx2 file to FORMAT -
It also supports encoding .PNG files to .KTX2. -
Thanks to Evan Parker for providing webgl-texture-utils and this test bed. +
This demo uses the Basis Universal C++ transcoder (compiled to WebAssembly using Emscripten) to transcode a .ktx2 file to FORMAT +
It also supports encoding .PNG, .EXR or .HDR files to LDR or HDR .KTX2 files. +
Thanks to Evan Parker for providing webgl-texture-utils and this test bed. Go back.

.ktx2 file: @@ -593,47 +891,57 @@ function downloadEncodedFile()

- .png file: - - + .png/.exr/.hdr file: + +
+
- Debug: - + Use UASTC HDR: + + +
+ Use UASTC LDR: + + +
+ Convert LDR images to linear light (UASTC HDR mode): + +
+ Debug output: +
Compute Stats:
- sRGB: + Use sRGB/perceptual metrics:
- Mipmaps: + Generate Mipmaps:
- UASTC: - - - -
- ETC1S Quality: - - +
-
- + + + +
+ + + + 1 -
- - -
+
+ +
+

+
diff --git a/webgl/ktx2_encode_test/renderer.js b/webgl/ktx2_encode_test/renderer.js index 26f1a65..93a0ffe 100644 --- a/webgl/ktx2_encode_test/renderer.js +++ b/webgl/ktx2_encode_test/renderer.js @@ -106,11 +106,10 @@ Renderer.prototype.createDxtTexture = function(dxtData, width, height, format) { height, 0, dxtData); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - //gl.generateMipmap(gl.TEXTURE_2D) gl.bindTexture(gl.TEXTURE_2D, null); return tex; }; @@ -127,15 +126,35 @@ Renderer.prototype.createCompressedTexture = function(data, width, height, forma height, 0, data); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - //gl.generateMipmap(gl.TEXTURE_2D) gl.bindTexture(gl.TEXTURE_2D, null); return tex; }; +Renderer.prototype.createHalfRGBATexture = function(data, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + width, + height, + 0, + gl.RGBA, + format, + data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; Renderer.prototype.createRgb565Texture = function(rgb565Data, width, height) { var gl = this.gl_; @@ -151,17 +170,38 @@ Renderer.prototype.createRgb565Texture = function(rgb565Data, width, height) { gl.RGB, gl.UNSIGNED_SHORT_5_6_5, rgb565Data); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + +Renderer.prototype.createRgbaTexture = function(rgbaData, width, height) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + width, + height, + 0, + gl.RGBA, + gl.UNSIGNED_BYTE, + rgbaData); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - //gl.generateMipmap(gl.TEXTURE_2D) gl.bindTexture(gl.TEXTURE_2D, null); return tex; }; -Renderer.prototype.drawTexture = function(texture, width, height, mode) { +Renderer.prototype.drawTexture = function(texture, width, height, mode, scale, linearToSRGBFlag) { var gl = this.gl_; // draw scene gl.clearColor(0, 0, 0, 1); @@ -179,8 +219,8 @@ Renderer.prototype.drawTexture = function(texture, width, height, mode) { x = 1.0; else if (mode == 2) y = 1.0; - - gl.uniform4f(this.uniformLocations_.control, x, y, 0.0, 0.0); + + gl.uniform4f(this.uniformLocations_.control, x, y, scale, linearToSRGBFlag ? 1.0 : 0.0); gl.enableVertexAttribArray(this.attribLocations_.vert); gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); @@ -229,9 +269,18 @@ Renderer.fragmentShaderSource_ = [ 'uniform sampler2D texSampler;', 'uniform vec4 control;', 'varying vec2 v_texCoord;', + + // Function to convert linear RGB to sRGB + 'vec3 linearToSrgb(vec3 linearRGB) {', + ' vec3 srgbLow = linearRGB * 12.92;', + ' vec3 srgbHigh = 1.055 * pow(linearRGB, vec3(1.0/2.4)) - 0.055;', + ' return clamp(mix(srgbLow, srgbHigh, step(0.0031308, linearRGB)), 0.0, 1.0);', + '}', + 'void main() {', ' vec4 c;', ' c = texture2D(texSampler, v_texCoord);', + ' c.rgb *= control.z;', ' if (control.x > 0.0)', ' {', ' c.w = 1.0;', @@ -240,6 +289,8 @@ Renderer.fragmentShaderSource_ = [ ' {', ' c.rgb = c.aaa; c.w = 1.0;', ' }', + ' if (control.w > 0.0)', + ' c.rgb = linearToSrgb(c.rgb);', ' gl_FragColor = c;', '}' ].join('\n'); diff --git a/webgl/transcoder/CMakeLists.txt b/webgl/transcoder/CMakeLists.txt index 372653d..afdf83f 100644 --- a/webgl/transcoder/CMakeLists.txt +++ b/webgl/transcoder/CMakeLists.txt @@ -41,7 +41,21 @@ if (EMSCRIPTEN) add_executable(basis_transcoder.js ${SRC_LIST}) - target_compile_definitions(basis_transcoder.js PRIVATE NDEBUG BASISD_SUPPORT_UASTC=1 BASISD_SUPPORT_BC7=1 BASISD_SUPPORT_ATC=0 BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 BASISD_SUPPORT_PVRTC2=0 BASISD_SUPPORT_FXT1=0 BASISD_SUPPORT_ETC2_EAC_RG11=0 BASISU_SUPPORT_ENCODING=0 ${KTX2_DEFINITION} ${ZSTD_DEFINITION} ) + target_compile_definitions(basis_transcoder.js PRIVATE NDEBUG + BASISD_SUPPORT_UASTC_HDR=1 + BASISD_SUPPORT_UASTC=1 + BASISD_SUPPORT_BC7=1 + BASISD_SUPPORT_ATC=0 + BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 + BASISD_SUPPORT_PVRTC2=0 + BASISD_SUPPORT_FXT1=0 + BASISD_SUPPORT_ETC2_EAC_RG11=0 + BASISU_SUPPORT_ENCODING=0 + BASISD_ENABLE_DEBUG_FLAGS=1 + ${KTX2_DEFINITION} + ${ZSTD_DEFINITION} + ) + target_compile_options(basis_transcoder.js PRIVATE -O3 -fno-strict-aliasing) target_include_directories(basis_transcoder.js PRIVATE ../../transcoder) diff --git a/webgl/transcoder/basis_wrappers.cpp b/webgl/transcoder/basis_wrappers.cpp index 739f092..0e7f78f 100644 --- a/webgl/transcoder/basis_wrappers.cpp +++ b/webgl/transcoder/basis_wrappers.cpp @@ -1,7 +1,8 @@ // basis_wrappers.cpp - Wrappers to the C++ compressor and transcoder for WebAssembly/WebGL use. +// This file exposes wrappers for transcoding and encoding .basis and .KTX2 files. // -// **Important**: -// Compile with -fno-strict-aliasing +// **Important**: +// Compile with -fno-strict-aliasing (same as the Linux kernel). // This code HAS NOT been tested with strict aliasing enabled. // The "initializeBasis()" function MUST be called at least once before using either the compressor or transcoder. // @@ -10,11 +11,12 @@ // getFileDesc(), getImageDesc(), getImageLevelDesc(): These functions return low-level information about where compressed data is located for each image in a .basis file. // This is useful for when you want to extract the compressed data and embed it into your own file formats, for container independent transcoding. // -// 2. Encoding (optional): See class basis_encoder. Encodes PNG or 32bpp images to .basis files in memory. Must compile with BASISU_SUPPORT_ENCODING=1. +// 2. Encoding (optional): See class basis_encoder. Encodes LDR .PNG or 32bpp images, or HDR half-float/float or .EXR/.HDR images to .basis/.ktx2 files in memory. +// Must compile with BASISU_SUPPORT_ENCODING=1. // Requires basisu_transcoder.cpp as well as all the .cpp files in the "encoder" directory. Results in a larger WebAssembly executable. // -// 3. Low level transcoding/container independent transcoding: See class lowlevel_etc1s_image_transcoder or function transcodeUASTCImage(). For -// transcoding raw compressed ETC1S/UASTC texture data from non-.basis files (say from KTX2) to GPU texture data. +// 3. Low level transcoding/container independent transcoding: See class lowlevel_etc1s_image_transcoder or function transcodeUASTCImage(). +// For transcoding raw compressed ETC1S/UASTC LDR/UASTC HDR texture data from non-.basis files (say from KTX2) to GPU texture data. // // 4. Helpers, transcoder texture format information: See functions getBytesPerBlockOrPixel(), formatHasAlpha(), etc. @@ -43,66 +45,67 @@ using namespace basisu; static bool g_basis_initialized_flag; +// Global one-time initialization. MUST be called before using any other functionality. void basis_init() { #if BASISU_DEBUG_PRINTF - printf("basis_init()\n"); -#endif - - if (g_basis_initialized_flag) - return; - -#if BASISU_SUPPORT_ENCODING - basisu_encoder_init(); + printf("basis_init()\n"); #endif - basisu_transcoder_init(); + if (g_basis_initialized_flag) + return; - g_basis_initialized_flag = true; +#if BASISU_SUPPORT_ENCODING + basisu_encoder_init(); +#endif + + basisu_transcoder_init(); + + g_basis_initialized_flag = true; } static void copy_from_jsbuffer(const emscripten::val& srcBuffer, basisu::vector& dstVec) { - unsigned int length = srcBuffer["length"].as(); + unsigned int length = srcBuffer["length"].as(); - dstVec.resize(length); + dstVec.resize(length); - emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; - emscripten::val memoryView = srcBuffer["constructor"].new_(memory, reinterpret_cast(dstVec.data()), length); - - // Copy the bytes from the Javascript buffer. - memoryView.call("set", srcBuffer); + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = srcBuffer["constructor"].new_(memory, reinterpret_cast(dstVec.data()), length); + + // Copy the bytes from the Javascript buffer. + memoryView.call("set", srcBuffer); } static bool copy_to_jsbuffer(const emscripten::val& dstBuffer, const basisu::vector& srcVec) { - if (srcVec.empty()) - { -#if BASISU_DEBUG_PRINTF - printf("copy_to_jsbuffer: Provided source buffer is empty\n"); + if (srcVec.empty()) + { +#if BASISU_DEBUG_PRINTF + printf("copy_to_jsbuffer: Provided source buffer is empty\n"); #endif - return false; - } - - // Make sure the provided buffer from Javascript is big enough. If not, bail. - int dstBufferLen = dstBuffer["byteLength"].as(); - - if (srcVec.size() > dstBufferLen) - { -#if BASISU_DEBUG_PRINTF - printf("copy_to_jsbuffer: Provided destination buffer is too small (wanted %u bytes, got %u bytes)!\n", (uint32_t)srcVec.size(), dstBufferLen); + return false; + } + + // Make sure the provided buffer from Javascript is big enough. If not, bail. + int dstBufferLen = dstBuffer["byteLength"].as(); + + if (srcVec.size() > dstBufferLen) + { +#if BASISU_DEBUG_PRINTF + printf("copy_to_jsbuffer: Provided destination buffer is too small (wanted %u bytes, got %u bytes)!\n", (uint32_t)srcVec.size(), dstBufferLen); #endif - assert(0); - return false; - } + assert(0); + return false; + } - emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; - emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(srcVec.data()), srcVec.size()); + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(srcVec.data()), srcVec.size()); - // Copy the bytes into the Javascript buffer. - dstBuffer.call("set", memoryView); - - return true; + // Copy the bytes into the Javascript buffer. + dstBuffer.call("set", memoryView); + + return true; } #define BASIS_MAGIC 0xDEADBEE1 @@ -110,1360 +113,1466 @@ static bool copy_to_jsbuffer(const emscripten::val& dstBuffer, const basisu::vec struct basis_file_desc { - uint32_t m_version; - - uint32_t m_us_per_frame; - - uint32_t m_total_images; - - uint32_t m_userdata0; - uint32_t m_userdata1; - - // Type of texture (cETC1S or cUASTC4x4) - uint32_t m_tex_format; // basis_tex_format - - bool m_y_flipped; - bool m_has_alpha_slices; - - // ETC1S endpoint codebook - uint32_t m_num_endpoints; - uint32_t m_endpoint_palette_ofs; - uint32_t m_endpoint_palette_len; + uint32_t m_version; - // ETC1S selector codebook - uint32_t m_num_selectors; - uint32_t m_selector_palette_ofs; - uint32_t m_selector_palette_len; + uint32_t m_us_per_frame; - // Huffman codelength tables - uint32_t m_tables_ofs; - uint32_t m_tables_len; + uint32_t m_total_images; + + uint32_t m_userdata0; + uint32_t m_userdata1; + + // Type of texture (cETC1S, cUASTC4x4, or cUASTC_HDR_4x4) + uint32_t m_tex_format; // basis_tex_format + + bool m_y_flipped; + bool m_has_alpha_slices; + + // ETC1S endpoint codebook + uint32_t m_num_endpoints; + uint32_t m_endpoint_palette_ofs; + uint32_t m_endpoint_palette_len; + + // ETC1S selector codebook + uint32_t m_num_selectors; + uint32_t m_selector_palette_ofs; + uint32_t m_selector_palette_len; + + // Huffman codelength tables + uint32_t m_tables_ofs; + uint32_t m_tables_len; }; struct basis_image_desc { - uint32_t m_orig_width; - uint32_t m_orig_height; - uint32_t m_num_blocks_x; - uint32_t m_num_blocks_y; - uint32_t m_num_levels; + uint32_t m_orig_width; + uint32_t m_orig_height; + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_num_levels; - // Will be true if the image has alpha (for UASTC this may vary per-image) - bool m_alpha_flag; - bool m_iframe_flag; + // Will be true if the image has alpha (for UASTC this may vary per-image) + bool m_alpha_flag; + bool m_iframe_flag; }; struct basis_image_level_desc { - // File offset/length of the compressed ETC1S or UASTC texture data. - uint32_t m_rgb_file_ofs; - uint32_t m_rgb_file_len; + // File offset/length of the compressed ETC1S or UASTC LDR/HDR texture data. + uint32_t m_rgb_file_ofs; + uint32_t m_rgb_file_len; - // Optional alpha data file offset/length - will be 0's for UASTC or opaque ETC1S files. - uint32_t m_alpha_file_ofs; - uint32_t m_alpha_file_len; + // Optional alpha data file offset/length - will be 0's for UASTC LDR/HDR or opaque ETC1S files. + uint32_t m_alpha_file_ofs; + uint32_t m_alpha_file_len; }; struct basis_file { - int m_magic = 0; - basisu_transcoder m_transcoder; - basisu::vector m_file; + int m_magic = 0; + basisu_transcoder m_transcoder; + basisu::vector m_file; - basis_file(const emscripten::val& jsBuffer) - : m_file([&]() { - size_t byteLength = jsBuffer["byteLength"].as(); - return basisu::vector(byteLength); - }()) - { - if (!g_basis_initialized_flag) - { -#if BASISU_DEBUG_PRINTF - printf("basis_file::basis_file: Must call basis_init() first!\n"); -#endif - assert(0); - return; - } - - unsigned int length = jsBuffer["length"].as(); - emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; - emscripten::val memoryView = jsBuffer["constructor"].new_(memory, reinterpret_cast(m_file.data()), length); - memoryView.call("set", jsBuffer); + basis_file(const emscripten::val& jsBuffer) + : m_file([&]() { + size_t byteLength = jsBuffer["byteLength"].as(); + return basisu::vector(byteLength); + }()) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("basis_file::basis_file: Must call basis_init() first!\n"); +#endif + assert(0); + return; + } - if (!m_transcoder.validate_header(m_file.data(), m_file.size())) - { -#if BASISU_DEBUG_PRINTF - printf("basis_file::basis_file: m_transcoder.validate_header() failed!\n"); -#endif - m_file.clear(); - } + unsigned int length = jsBuffer["length"].as(); + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = jsBuffer["constructor"].new_(memory, reinterpret_cast(m_file.data()), length); + memoryView.call("set", jsBuffer); - // Initialized after validation - m_magic = BASIS_MAGIC; - } + if (!m_transcoder.validate_header(m_file.data(), m_file.size())) + { +#if BASISU_DEBUG_PRINTF + printf("basis_file::basis_file: m_transcoder.validate_header() failed!\n"); +#endif + m_file.clear(); + } - void close() - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return; + // Initialized after validation + m_magic = BASIS_MAGIC; + } - m_file.clear(); - } + void close() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return; - uint32_t getHasAlpha() - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + m_file.clear(); + } - basisu_image_level_info li; - if (!m_transcoder.get_image_level_info(m_file.data(), m_file.size(), li, 0, 0)) - return 0; + uint32_t getHasAlpha() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; - return li.m_alpha_flag; - } + basisu_image_level_info li; + if (!m_transcoder.get_image_level_info(m_file.data(), m_file.size(), li, 0, 0)) + return 0; - uint32_t getNumImages() - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + return li.m_alpha_flag; + } - return m_transcoder.get_total_images(m_file.data(), m_file.size()); - } + uint32_t getNumImages() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; - uint32_t getNumLevels(uint32_t image_index) - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + return m_transcoder.get_total_images(m_file.data(), m_file.size()); + } - basisu_image_info ii; - if (!m_transcoder.get_image_info(m_file.data(), m_file.size(), ii, image_index)) - return 0; + uint32_t getNumLevels(uint32_t image_index) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; - return ii.m_total_levels; - } + basisu_image_info ii; + if (!m_transcoder.get_image_info(m_file.data(), m_file.size(), ii, image_index)) + return 0; - uint32_t getImageWidth(uint32_t image_index, uint32_t level_index) - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + return ii.m_total_levels; + } - uint32_t orig_width, orig_height, total_blocks; - if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) - return 0; + uint32_t getImageWidth(uint32_t image_index, uint32_t level_index) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; - return orig_width; - } + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; - uint32_t getImageHeight(uint32_t image_index, uint32_t level_index) - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + return orig_width; + } - uint32_t orig_width, orig_height, total_blocks; - if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) - return 0; + uint32_t getImageHeight(uint32_t image_index, uint32_t level_index) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; - return orig_height; - } - - basis_file_desc getFileDesc() - { - basis_file_desc result; - memset(&result, 0, sizeof(result)); - - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return result; - - basisu_file_info file_info; - - if (!m_transcoder.get_file_info(m_file.data(), m_file.size(), file_info)) - { - assert(0); - return result; - } - - result.m_version = file_info.m_version; - result.m_us_per_frame = file_info.m_us_per_frame; - result.m_total_images = file_info.m_total_images; - result.m_userdata0 = file_info.m_userdata0; - result.m_userdata1 = file_info.m_userdata1; - result.m_tex_format = static_cast(file_info.m_tex_format); - result.m_y_flipped = file_info.m_y_flipped; - result.m_has_alpha_slices = file_info.m_has_alpha_slices; - - result.m_num_endpoints = file_info.m_total_endpoints; - result.m_endpoint_palette_ofs = file_info.m_endpoint_codebook_ofs; - result.m_endpoint_palette_len = file_info.m_endpoint_codebook_size; - - result.m_num_selectors = file_info.m_total_selectors; - result.m_selector_palette_ofs = file_info.m_selector_codebook_ofs; - result.m_selector_palette_len = file_info.m_selector_codebook_size; - - result.m_tables_ofs = file_info.m_tables_ofs; - result.m_tables_len = file_info.m_tables_size; + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; - return result; - } - - basis_image_desc getImageDesc(uint32_t image_index) - { - basis_image_desc result; - memset(&result, 0, sizeof(result)); - - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return result; - - basisu_image_info image_info; - - // bool get_image_info(const void *pData, uint32_t data_size, basisu_image_info &image_info, uint32_t image_index) const; - if (!m_transcoder.get_image_info(m_file.data(), m_file.size(), image_info, image_index)) - { - assert(0); - return result; - } - - result.m_orig_width = image_info.m_orig_width; - result.m_orig_height = image_info.m_orig_height; - result.m_num_blocks_x = image_info.m_num_blocks_x; - result.m_num_blocks_y = image_info.m_num_blocks_y; - result.m_num_levels = image_info.m_total_levels; - result.m_alpha_flag = image_info.m_alpha_flag; - result.m_iframe_flag = image_info.m_iframe_flag; - - return result; - } - - basis_image_level_desc getImageLevelDesc(uint32_t image_index, uint32_t level_index) - { - basis_image_level_desc result; - memset(&result, 0, sizeof(result)); - - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return result; - - basisu_image_level_info image_info; - - if (!m_transcoder.get_image_level_info(m_file.data(), m_file.size(), image_info, image_index, level_index)) - { - assert(0); - return result; - } - - result.m_rgb_file_ofs = image_info.m_rgb_file_ofs; - result.m_rgb_file_len = image_info.m_rgb_file_len; - result.m_alpha_file_ofs = image_info.m_alpha_file_ofs; - result.m_alpha_file_len = image_info.m_alpha_file_len; - - return result; - } + return orig_height; + } - uint32_t getImageTranscodedSizeInBytes(uint32_t image_index, uint32_t level_index, uint32_t format) - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + basis_file_desc getFileDesc() + { + basis_file_desc result; + memset(&result, 0, sizeof(result)); - if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) - return 0; + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return result; - uint32_t orig_width, orig_height, total_blocks; - if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) - return 0; + basisu_file_info file_info; - const transcoder_texture_format transcoder_format = static_cast(format); + if (!m_transcoder.get_file_info(m_file.data(), m_file.size(), file_info)) + { + assert(0); + return result; + } - if (basis_transcoder_format_is_uncompressed(transcoder_format)) - { - // Uncompressed formats are just plain raster images. - const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); - const uint32_t bytes_per_line = orig_width * bytes_per_pixel; - const uint32_t bytes_per_slice = bytes_per_line * orig_height; - return bytes_per_slice; - } - else - { - // Compressed formats are 2D arrays of blocks. - const uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + result.m_version = file_info.m_version; + result.m_us_per_frame = file_info.m_us_per_frame; + result.m_total_images = file_info.m_total_images; + result.m_userdata0 = file_info.m_userdata0; + result.m_userdata1 = file_info.m_userdata1; + result.m_tex_format = static_cast(file_info.m_tex_format); + result.m_y_flipped = file_info.m_y_flipped; + result.m_has_alpha_slices = file_info.m_has_alpha_slices; - if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) - { - // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: - // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt - const uint32_t width = (orig_width + 3) & ~3; - const uint32_t height = (orig_height + 3) & ~3; - const uint32_t size_in_bytes = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; - return size_in_bytes; - } + result.m_num_endpoints = file_info.m_total_endpoints; + result.m_endpoint_palette_ofs = file_info.m_endpoint_codebook_ofs; + result.m_endpoint_palette_len = file_info.m_endpoint_codebook_size; - return total_blocks * bytes_per_block; - } - } + result.m_num_selectors = file_info.m_total_selectors; + result.m_selector_palette_ofs = file_info.m_selector_codebook_ofs; + result.m_selector_palette_len = file_info.m_selector_codebook_size; - bool isUASTC() - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return false; + result.m_tables_ofs = file_info.m_tables_ofs; + result.m_tables_len = file_info.m_tables_size; - return m_transcoder.get_tex_format(m_file.data(), m_file.size()) == basis_tex_format::cUASTC4x4; - } + return result; + } - uint32_t startTranscoding() - { - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + basis_image_desc getImageDesc(uint32_t image_index) + { + basis_image_desc result; + memset(&result, 0, sizeof(result)); - return m_transcoder.start_transcoding(m_file.data(), m_file.size()); - } + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return result; - uint32_t transcodeImage(const emscripten::val& dst, uint32_t image_index, uint32_t level_index, uint32_t format, uint32_t unused, uint32_t get_alpha_for_opaque_formats) - { - (void)unused; + basisu_image_info image_info; - assert(m_magic == BASIS_MAGIC); - if (m_magic != BASIS_MAGIC) - return 0; + // bool get_image_info(const void *pData, uint32_t data_size, basisu_image_info &image_info, uint32_t image_index) const; + if (!m_transcoder.get_image_info(m_file.data(), m_file.size(), image_info, image_index)) + { + assert(0); + return result; + } - if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) - return 0; + result.m_orig_width = image_info.m_orig_width; + result.m_orig_height = image_info.m_orig_height; + result.m_num_blocks_x = image_info.m_num_blocks_x; + result.m_num_blocks_y = image_info.m_num_blocks_y; + result.m_num_levels = image_info.m_total_levels; + result.m_alpha_flag = image_info.m_alpha_flag; + result.m_iframe_flag = image_info.m_iframe_flag; - const transcoder_texture_format transcoder_format = static_cast(format); + return result; + } - uint32_t orig_width, orig_height, total_blocks; - if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) - return 0; + basis_image_level_desc getImageLevelDesc(uint32_t image_index, uint32_t level_index) + { + basis_image_level_desc result; + memset(&result, 0, sizeof(result)); - basisu::vector dst_data; + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return result; - uint32_t flags = get_alpha_for_opaque_formats ? cDecodeFlagsTranscodeAlphaDataToOpaqueFormats : 0; + basisu_image_level_info image_info; - uint32_t status; + if (!m_transcoder.get_image_level_info(m_file.data(), m_file.size(), image_info, image_index, level_index)) + { + assert(0); + return result; + } - if (basis_transcoder_format_is_uncompressed(transcoder_format)) - { - const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); - const uint32_t bytes_per_line = orig_width * bytes_per_pixel; - const uint32_t bytes_per_slice = bytes_per_line * orig_height; + result.m_rgb_file_ofs = image_info.m_rgb_file_ofs; + result.m_rgb_file_len = image_info.m_rgb_file_len; + result.m_alpha_file_ofs = image_info.m_alpha_file_ofs; + result.m_alpha_file_len = image_info.m_alpha_file_len; - dst_data.resize(bytes_per_slice); + return result; + } - status = m_transcoder.transcode_image_level( - m_file.data(), m_file.size(), image_index, level_index, - dst_data.data(), orig_width * orig_height, - transcoder_format, - flags, - orig_width, - nullptr, - orig_height); - } - else - { - uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + uint32_t getImageTranscodedSizeInBytes(uint32_t image_index, uint32_t level_index, uint32_t format) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; - uint32_t required_size = total_blocks * bytes_per_block; + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; - if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) - { - // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: - // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt - // The transcoder will clear the extra bytes followed the used blocks to 0. - const uint32_t width = (orig_width + 3) & ~3; - const uint32_t height = (orig_height + 3) & ~3; - required_size = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; - assert(required_size >= total_blocks * bytes_per_block); - } + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; - dst_data.resize(required_size); + const transcoder_texture_format transcoder_format = static_cast(format); - status = m_transcoder.transcode_image_level( - m_file.data(), m_file.size(), image_index, level_index, - dst_data.data(), dst_data.size() / bytes_per_block, - static_cast(format), - flags); - } + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + // Uncompressed formats are just plain raster images. + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + return bytes_per_slice; + } + else + { + // Compressed formats are 2D arrays of blocks. + const uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); - emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; - emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(dst_data.data()), dst_data.size()); + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + const uint32_t size_in_bytes = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + return size_in_bytes; + } - dst.call("set", memoryView); - return status; - } + return total_blocks * bytes_per_block; + } + } + + bool isUASTC() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return false; + + return m_transcoder.get_tex_format(m_file.data(), m_file.size()) == basis_tex_format::cUASTC4x4; + } + + // Returns true if the texture is UASTC HDR. In this case, it can only be transcoded to BC6H, ASTC 4x4 HDR, or half-float RGB/RGBA images. + bool isHDR() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return false; + + return m_transcoder.get_tex_format(m_file.data(), m_file.size()) == basis_tex_format::cUASTC_HDR_4x4; + } + + uint32_t startTranscoding() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + return m_transcoder.start_transcoding(m_file.data(), m_file.size()); + } + + uint32_t transcodeImage(const emscripten::val& dst, uint32_t image_index, uint32_t level_index, uint32_t format, uint32_t unused, uint32_t get_alpha_for_opaque_formats) + { + (void)unused; + + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + const transcoder_texture_format transcoder_format = static_cast(format); + + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + basisu::vector dst_data; + + uint32_t flags = get_alpha_for_opaque_formats ? cDecodeFlagsTranscodeAlphaDataToOpaqueFormats : 0; + + uint32_t status; + + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + + dst_data.resize(bytes_per_slice); + + status = m_transcoder.transcode_image_level( + m_file.data(), m_file.size(), image_index, level_index, + dst_data.data(), orig_width * orig_height, + transcoder_format, + flags, + orig_width, + nullptr, + orig_height); + } + else + { + uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + + uint32_t required_size = total_blocks * bytes_per_block; + + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + // The transcoder will clear the extra bytes followed the used blocks to 0. + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + required_size = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + assert(required_size >= total_blocks * bytes_per_block); + } + + dst_data.resize(required_size); + + status = m_transcoder.transcode_image_level( + m_file.data(), m_file.size(), image_index, level_index, + dst_data.data(), dst_data.size() / bytes_per_block, + static_cast(format), + flags); + } + + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(dst_data.data()), dst_data.size()); + + dst.call("set", memoryView); + return status; + } }; #if BASISD_SUPPORT_KTX2 struct ktx2_header_js { - uint32_t m_vk_format; - uint32_t m_type_size; - uint32_t m_pixel_width; - uint32_t m_pixel_height; - uint32_t m_pixel_depth; - uint32_t m_layer_count; - uint32_t m_face_count; - uint32_t m_level_count; - uint32_t m_supercompression_scheme; - uint32_t m_dfd_byte_offset; - uint32_t m_dfd_byte_length; - uint32_t m_kvd_byte_offset; - uint32_t m_kvd_byte_length; - uint32_t m_sgd_byte_offset; - uint32_t m_sgd_byte_length; + uint32_t m_vk_format; + uint32_t m_type_size; + uint32_t m_pixel_width; + uint32_t m_pixel_height; + uint32_t m_pixel_depth; + uint32_t m_layer_count; + uint32_t m_face_count; + uint32_t m_level_count; + uint32_t m_supercompression_scheme; + uint32_t m_dfd_byte_offset; + uint32_t m_dfd_byte_length; + uint32_t m_kvd_byte_offset; + uint32_t m_kvd_byte_length; + uint32_t m_sgd_byte_offset; + uint32_t m_sgd_byte_length; }; struct ktx2_file { - int m_magic = 0; - basist::ktx2_transcoder m_transcoder; - basisu::vector m_file; - bool m_is_valid = false; + int m_magic = 0; + basist::ktx2_transcoder m_transcoder; + basisu::vector m_file; + bool m_is_valid = false; - ktx2_file(const emscripten::val& jsBuffer) - : m_file([&]() { - size_t byteLength = jsBuffer["byteLength"].as(); - return basisu::vector(byteLength); - }()) - { - if (!g_basis_initialized_flag) - { -#if BASISU_DEBUG_PRINTF - printf("basis_file::basis_file: Must call basis_init() first!\n"); -#endif - assert(0); - return; - } - - unsigned int length = jsBuffer["length"].as(); - emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; - emscripten::val memoryView = jsBuffer["constructor"].new_(memory, reinterpret_cast(m_file.data()), length); - memoryView.call("set", jsBuffer); - - if (!m_transcoder.init(m_file.data(), m_file.size())) - { -#if BASISU_DEBUG_PRINTF - printf("m_transcoder.init() failed!\n"); + ktx2_file(const emscripten::val& jsBuffer) + : m_file([&]() { + size_t byteLength = jsBuffer["byteLength"].as(); + return basisu::vector(byteLength); + }()) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("basis_file::basis_file: Must call basis_init() first!\n"); #endif - assert(0); - - m_file.clear(); - } - - m_is_valid = true; - - // Initialized after validation - m_magic = KTX2_MAGIC; - } - - bool isValid() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return false; - - return m_is_valid; - } - - void close() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return; - - m_file.clear(); - m_transcoder.clear(); - } - - uint32_t getDFDSize() - { - return m_transcoder.get_dfd().size(); - } - - uint32_t getDFD(const emscripten::val& dst) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - const uint8_vec &dst_data = m_transcoder.get_dfd(); - - if (dst_data.size()) - return copy_to_jsbuffer(dst, dst_data); - - return 1; - } - - ktx2_header_js getHeader() - { - ktx2_header_js hdr; - memset(&hdr, 0, sizeof(hdr)); - - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return hdr; - - const basist::ktx2_header& h = m_transcoder.get_header(); - - hdr.m_vk_format = h.m_vk_format; - hdr.m_type_size = h.m_type_size; - hdr.m_pixel_width = h.m_pixel_width; - hdr.m_pixel_height = h.m_pixel_height; - hdr.m_pixel_depth = h.m_pixel_depth; - hdr.m_layer_count = h.m_layer_count; - hdr.m_face_count = h.m_face_count; - hdr.m_level_count = h.m_level_count; - hdr.m_supercompression_scheme = h.m_supercompression_scheme; - hdr.m_dfd_byte_offset = h.m_dfd_byte_offset; - hdr.m_dfd_byte_length = h.m_dfd_byte_length; - hdr.m_kvd_byte_offset = h.m_kvd_byte_offset; - hdr.m_kvd_byte_length = h.m_kvd_byte_length; - - // emscripten doesn't support binding uint64_t for some reason - assert(h.m_sgd_byte_offset <= UINT32_MAX); - assert(h.m_sgd_byte_length <= UINT32_MAX); - hdr.m_sgd_byte_offset = (uint32_t)h.m_sgd_byte_offset; - hdr.m_sgd_byte_length = (uint32_t)h.m_sgd_byte_length; - - return hdr; - } - - bool hasKey(std::string key_name) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return false; - - return m_transcoder.find_key(key_name) != nullptr; - } - - uint32_t getTotalKeys() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - return m_transcoder.get_key_values().size(); - } - - std::string getKey(uint32_t index) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return std::string(""); - - return std::string((const char*)m_transcoder.get_key_values()[index].m_key.data()); - } - - uint32_t getKeyValueSize(std::string key_name) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - const uint8_vec* p = m_transcoder.find_key(key_name); - return p ? p->size() : 0; - } - - uint32_t getKeyValue(std::string key_name, const emscripten::val& dst) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - const uint8_vec* p = m_transcoder.find_key(key_name); - if (!p) - return 0; - - if (p->size()) - return copy_to_jsbuffer(dst, *p); - - return 1; - } - - uint32_t getWidth() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_width(); - } - - uint32_t getHeight() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_height(); - } - - uint32_t getFaces() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_faces(); - } - - uint32_t getLayers() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_layers(); - } - - uint32_t getLevels() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_levels(); - } - - uint32_t getFormat() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return (uint32_t)m_transcoder.get_format(); - } - - bool isUASTC() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return false; - return m_transcoder.is_uastc(); - } - - bool isETC1S() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return false; - return m_transcoder.is_etc1s(); - } - - bool getHasAlpha() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return false; - return m_transcoder.get_has_alpha(); - } - - uint32_t getDFDColorModel() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_dfd_color_model(); - } - - uint32_t getDFDColorPrimaries() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_dfd_color_primaries(); - } - - uint32_t getDFDTransferFunc() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_dfd_transfer_func(); - } - - uint32_t getDFDFlags() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_dfd_flags(); - } - - uint32_t getDFDTotalSamples() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_dfd_total_samples(); - } - - uint32_t getDFDChannelID0() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_dfd_channel_id0(); - } - - uint32_t getDFDChannelID1() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.get_dfd_channel_id1(); - } - - // isVideo() will return true if there was a KTXanimData key, or if (after calling start_transcoding()) there were any P-frames on ETC1S files. - bool isVideo() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - return m_transcoder.is_video(); - } - - // startTranscoding() must be called before calling getETC1SImageDescImageFlags(). - uint32_t getETC1SImageDescImageFlags(uint32_t level_index, uint32_t layer_index, uint32_t face_index) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - return m_transcoder.get_etc1s_image_descs_image_flags(level_index, layer_index, face_index); - } - - ktx2_image_level_info getImageLevelInfo(uint32_t level_index, uint32_t layer_index, uint32_t face_index) - { - ktx2_image_level_info info; - memset(&info, 0, sizeof(info)); - - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return info; - - if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) - { - assert(0); - return info; - } - - return info; - } - - uint32_t getImageTranscodedSizeInBytes(uint32_t level_index, uint32_t layer_index, uint32_t face_index, uint32_t format) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) - return 0; - - ktx2_image_level_info info; - if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) - return 0; - - uint32_t orig_width = info.m_orig_width, orig_height = info.m_orig_height, total_blocks = info.m_total_blocks; - - const transcoder_texture_format transcoder_format = static_cast(format); - - if (basis_transcoder_format_is_uncompressed(transcoder_format)) - { - // Uncompressed formats are just plain raster images. - const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); - const uint32_t bytes_per_line = orig_width * bytes_per_pixel; - const uint32_t bytes_per_slice = bytes_per_line * orig_height; - return bytes_per_slice; - } - else - { - // Compressed formats are 2D arrays of blocks. - const uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); - - if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) - { - // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: - // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt - const uint32_t width = (orig_width + 3) & ~3; - const uint32_t height = (orig_height + 3) & ~3; - const uint32_t size_in_bytes = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; - return size_in_bytes; - } - - return total_blocks * bytes_per_block; - } - } - - // Must be called before transcodeImage() can be called. - // On ETC1S files this method decompresses the ETC1S global data, along with fetching the ETC1S image desc array, so it's not free to call. - uint32_t startTranscoding() - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - return m_transcoder.start_transcoding(); - } - - // get_alpha_for_opaque_formats defaults to false - // channel0/channel1 default to -1 - uint32_t transcodeImage(const emscripten::val& dst, uint32_t level_index, uint32_t layer_index, uint32_t face_index, uint32_t format, uint32_t get_alpha_for_opaque_formats, int channel0, int channel1) - { - assert(m_magic == KTX2_MAGIC); - if (m_magic != KTX2_MAGIC) - return 0; - - if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) - return 0; - - const transcoder_texture_format transcoder_format = static_cast(format); - - ktx2_image_level_info info; - if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) - return 0; - - uint32_t orig_width = info.m_orig_width, orig_height = info.m_orig_height, total_blocks = info.m_total_blocks; - - basisu::vector dst_data; - - uint32_t flags = get_alpha_for_opaque_formats ? cDecodeFlagsTranscodeAlphaDataToOpaqueFormats : 0; - - uint32_t status; - - if (basis_transcoder_format_is_uncompressed(transcoder_format)) - { - const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); - const uint32_t bytes_per_line = orig_width * bytes_per_pixel; - const uint32_t bytes_per_slice = bytes_per_line * orig_height; - - dst_data.resize(bytes_per_slice); - - status = m_transcoder.transcode_image_level( - level_index, layer_index, face_index, - dst_data.data(), orig_width * orig_height, - transcoder_format, - flags, - orig_width, - orig_height, - channel0, channel1, - nullptr); - } - else - { - uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); - - uint32_t required_size = total_blocks * bytes_per_block; - - if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) - { - // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: - // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt - // The transcoder will clear the extra bytes followed the used blocks to 0. - const uint32_t width = (orig_width + 3) & ~3; - const uint32_t height = (orig_height + 3) & ~3; - required_size = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; - assert(required_size >= total_blocks * bytes_per_block); - } - - dst_data.resize(required_size); - - status = m_transcoder.transcode_image_level( - level_index, layer_index, face_index, - dst_data.data(), dst_data.size() / bytes_per_block, - static_cast(format), - flags, - 0, - 0, - channel0, channel1, - nullptr); - } - - emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; - emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(dst_data.data()), dst_data.size()); - - dst.call("set", memoryView); - return status; - } + assert(0); + return; + } + + unsigned int length = jsBuffer["length"].as(); + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = jsBuffer["constructor"].new_(memory, reinterpret_cast(m_file.data()), length); + memoryView.call("set", jsBuffer); + + if (!m_transcoder.init(m_file.data(), m_file.size())) + { +#if BASISU_DEBUG_PRINTF + printf("m_transcoder.init() failed!\n"); +#endif + assert(0); + + m_file.clear(); + } + + m_is_valid = true; + + // Initialized after validation + m_magic = KTX2_MAGIC; + } + + bool isValid() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + + return m_is_valid; + } + + void close() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return; + + m_file.clear(); + m_transcoder.clear(); + } + + uint32_t getDFDSize() + { + return m_transcoder.get_dfd().size(); + } + + uint32_t getDFD(const emscripten::val& dst) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + const uint8_vec &dst_data = m_transcoder.get_dfd(); + + if (dst_data.size()) + return copy_to_jsbuffer(dst, dst_data); + + return 1; + } + + ktx2_header_js getHeader() + { + ktx2_header_js hdr; + memset(&hdr, 0, sizeof(hdr)); + + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return hdr; + + const basist::ktx2_header& h = m_transcoder.get_header(); + + hdr.m_vk_format = h.m_vk_format; + hdr.m_type_size = h.m_type_size; + hdr.m_pixel_width = h.m_pixel_width; + hdr.m_pixel_height = h.m_pixel_height; + hdr.m_pixel_depth = h.m_pixel_depth; + hdr.m_layer_count = h.m_layer_count; + hdr.m_face_count = h.m_face_count; + hdr.m_level_count = h.m_level_count; + hdr.m_supercompression_scheme = h.m_supercompression_scheme; + hdr.m_dfd_byte_offset = h.m_dfd_byte_offset; + hdr.m_dfd_byte_length = h.m_dfd_byte_length; + hdr.m_kvd_byte_offset = h.m_kvd_byte_offset; + hdr.m_kvd_byte_length = h.m_kvd_byte_length; + + // emscripten doesn't support binding uint64_t for some reason + assert(h.m_sgd_byte_offset <= UINT32_MAX); + assert(h.m_sgd_byte_length <= UINT32_MAX); + hdr.m_sgd_byte_offset = (uint32_t)h.m_sgd_byte_offset; + hdr.m_sgd_byte_length = (uint32_t)h.m_sgd_byte_length; + + return hdr; + } + + bool hasKey(std::string key_name) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + + return m_transcoder.find_key(key_name) != nullptr; + } + + uint32_t getTotalKeys() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + return m_transcoder.get_key_values().size(); + } + + std::string getKey(uint32_t index) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return std::string(""); + + return std::string((const char*)m_transcoder.get_key_values()[index].m_key.data()); + } + + uint32_t getKeyValueSize(std::string key_name) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + const uint8_vec* p = m_transcoder.find_key(key_name); + return p ? p->size() : 0; + } + + uint32_t getKeyValue(std::string key_name, const emscripten::val& dst) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + const uint8_vec* p = m_transcoder.find_key(key_name); + if (!p) + return 0; + + if (p->size()) + return copy_to_jsbuffer(dst, *p); + + return 1; + } + + uint32_t getWidth() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_width(); + } + + uint32_t getHeight() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_height(); + } + + uint32_t getFaces() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_faces(); + } + + uint32_t getLayers() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_layers(); + } + + uint32_t getLevels() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_levels(); + } + + // Returns cETC1S, cUASTC4x4, or cUASTC_HDR_4x4. + uint32_t getFormat() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return (uint32_t)m_transcoder.get_format(); + } + + // Returns true if the texture is UASTC LDR (and not HDR - see isHDR()). + bool isUASTC() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + return m_transcoder.is_uastc(); + } + + bool isETC1S() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + return m_transcoder.is_etc1s(); + } + + // Returns true if the texture is UASTC HDR. In this case, it can only be transcoded to BC6H, ASTC 4x4 HDR, or half-float RGB/RGBA images. + bool isHDR() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + return m_transcoder.is_hdr(); + } + + bool getHasAlpha() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + return m_transcoder.get_has_alpha(); + } + + uint32_t getDFDColorModel() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_color_model(); + } + + uint32_t getDFDColorPrimaries() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_color_primaries(); + } + + uint32_t getDFDTransferFunc() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_transfer_func(); + } + + uint32_t getDFDFlags() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_flags(); + } + + uint32_t getDFDTotalSamples() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_total_samples(); + } + + uint32_t getDFDChannelID0() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_channel_id0(); + } + + uint32_t getDFDChannelID1() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_channel_id1(); + } + + // isVideo() will return true if there was a KTXanimData key, or if (after calling start_transcoding()) there were any P-frames on ETC1S files. + bool isVideo() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.is_video(); + } + + // startTranscoding() must be called before calling getETC1SImageDescImageFlags(). + uint32_t getETC1SImageDescImageFlags(uint32_t level_index, uint32_t layer_index, uint32_t face_index) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + return m_transcoder.get_etc1s_image_descs_image_flags(level_index, layer_index, face_index); + } + + ktx2_image_level_info getImageLevelInfo(uint32_t level_index, uint32_t layer_index, uint32_t face_index) + { + ktx2_image_level_info info; + memset(&info, 0, sizeof(info)); + + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return info; + + if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) + { + assert(0); + return info; + } + + return info; + } + + uint32_t getImageTranscodedSizeInBytes(uint32_t level_index, uint32_t layer_index, uint32_t face_index, uint32_t format) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + ktx2_image_level_info info; + if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) + return 0; + + uint32_t orig_width = info.m_orig_width, orig_height = info.m_orig_height, total_blocks = info.m_total_blocks; + + const transcoder_texture_format transcoder_format = static_cast(format); + + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + // Uncompressed formats are just plain raster images. + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + return bytes_per_slice; + } + else + { + // Compressed formats are 2D arrays of blocks. + const uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + const uint32_t size_in_bytes = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + return size_in_bytes; + } + + return total_blocks * bytes_per_block; + } + } + + // Must be called before transcodeImage() can be called. + // On ETC1S files this method decompresses the ETC1S global data, along with fetching the ETC1S image desc array, so it's not free to call. + uint32_t startTranscoding() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + return m_transcoder.start_transcoding(); + } + + // get_alpha_for_opaque_formats defaults to false + // channel0/channel1 default to -1 + uint32_t transcodeImage(const emscripten::val& dst, uint32_t level_index, uint32_t layer_index, uint32_t face_index, uint32_t format, uint32_t get_alpha_for_opaque_formats, int channel0, int channel1) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + const transcoder_texture_format transcoder_format = static_cast(format); + + ktx2_image_level_info info; + if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) + return 0; + + uint32_t orig_width = info.m_orig_width, orig_height = info.m_orig_height, total_blocks = info.m_total_blocks; + + basisu::vector dst_data; + + uint32_t flags = get_alpha_for_opaque_formats ? cDecodeFlagsTranscodeAlphaDataToOpaqueFormats : 0; + + uint32_t status; + + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + + dst_data.resize(bytes_per_slice); + + status = m_transcoder.transcode_image_level( + level_index, layer_index, face_index, + dst_data.data(), orig_width * orig_height, + transcoder_format, + flags, + orig_width, + orig_height, + channel0, channel1, + nullptr); + } + else + { + uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + + uint32_t required_size = total_blocks * bytes_per_block; + + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + // The transcoder will clear the extra bytes followed the used blocks to 0. + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + required_size = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + assert(required_size >= total_blocks * bytes_per_block); + } + + dst_data.resize(required_size); + + status = m_transcoder.transcode_image_level( + level_index, layer_index, face_index, + dst_data.data(), dst_data.size() / bytes_per_block, + static_cast(format), + flags, + 0, + 0, + channel0, channel1, + nullptr); + } + + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(dst_data.data()), dst_data.size()); + + dst.call("set", memoryView); + return status; + } }; #endif // BASISD_SUPPORT_KTX2 #if BASISU_SUPPORT_ENCODING + class basis_encoder { public: - basis_compressor_params m_params; + basis_compressor_params m_params; - basis_encoder() - { - } + basis_encoder() + { + } - bool set_slice_source_image(uint32_t slice_index, const emscripten::val& src_image_js_val, uint32_t src_image_width, uint32_t src_image_height, bool src_image_is_png) - { - // Resize the source_images array if necessary - if (slice_index >= m_params.m_source_images.size()) - m_params.m_source_images.resize(slice_index + 1); + // Only works for LDR inputs. + bool set_slice_source_image(uint32_t slice_index, const emscripten::val& src_image_js_val, uint32_t src_image_width, uint32_t src_image_height, bool src_image_is_png) + { + // Resize the source_images array if necessary + if (slice_index >= m_params.m_source_images.size()) + m_params.m_source_images.resize(slice_index + 1); - // First copy the src image buffer to the heap. - basisu::vector src_image_buf; - copy_from_jsbuffer(src_image_js_val, src_image_buf); + // First copy the src image buffer to the heap. + basisu::vector src_image_buf; + copy_from_jsbuffer(src_image_js_val, src_image_buf); - // Now extract the source image. - image& src_img = m_params.m_source_images[slice_index]; - if (src_image_is_png) - { - // It's a PNG file, so try and parse it. - if (!load_png(src_image_buf.data(), src_image_buf.size(), src_img, nullptr)) - { + // Now load the source image. + image& src_img = m_params.m_source_images[slice_index]; + if (src_image_is_png) + { + // It's a PNG file, so try and parse it. + if (!load_png(src_image_buf.data(), src_image_buf.size(), src_img, nullptr)) + { #if BASISU_DEBUG_PRINTF - printf("basis_encoder::set_slice_source_image: Failed parsing provided PNG file!\n"); -#endif - return false; - } + printf("basis_encoder::set_slice_source_image: Failed parsing provided PNG file!\n"); +#endif + return false; + } - src_image_width = src_img.get_width(); - src_image_height = src_img.get_height(); - } - else - { - // It's a raw image, so check the buffer's size. - if (src_image_buf.size() != src_image_width * src_image_height * sizeof(uint32_t)) - { + src_image_width = src_img.get_width(); + src_image_height = src_img.get_height(); + } + else + { + // It's a raw image, so check the buffer's size. + if (src_image_buf.size() != src_image_width * src_image_height * sizeof(uint32_t)) + { #if BASISU_DEBUG_PRINTF - printf("basis_encoder::set_slice_source_image: Provided source buffer has an invalid size!\n"); -#endif - return false; - } + printf("basis_encoder::set_slice_source_image: Provided source buffer has an invalid size!\n"); +#endif + return false; + } - // Copy the raw image's data into our source image. - src_img.resize(src_image_width, src_image_height); - memcpy(src_img.get_ptr(), src_image_buf.data(), src_image_width * src_image_height * sizeof(uint32_t)); - } + // Copy the raw image's data into our source image. + src_img.resize(src_image_width, src_image_height); + memcpy(src_img.get_ptr(), src_image_buf.data(), src_image_width * src_image_height * sizeof(uint32_t)); + } + + return true; + } + + // Accepts RGBA half float or RGBA float images, or .EXR, .HDR, or .PNG file data. + bool set_slice_source_image_hdr( + uint32_t slice_index, + const emscripten::val& src_image_js_val, + uint32_t src_image_width, uint32_t src_image_height, + hdr_image_type img_type, bool ldr_srgb_to_linear_conversion) + { + // Resize the source_images_hdr array if necessary + if (slice_index >= m_params.m_source_images_hdr.size()) + m_params.m_source_images_hdr.resize(slice_index + 1); + + // First copy the src image buffer to the heap. + basisu::vector src_image_buf; + copy_from_jsbuffer(src_image_js_val, src_image_buf); + + // Now load the source image. + imagef& src_img = m_params.m_source_images_hdr[slice_index]; - return true; - } - - uint32_t encode(const emscripten::val& dst_basis_file_js_val) - { - if (!g_basis_initialized_flag) - { -#if BASISU_DEBUG_PRINTF - printf("basis_encoder::encode: Must call basis_init() first!\n"); -#endif - assert(0); - return 0; - } + return load_image_hdr(src_image_buf.get_ptr(), src_image_buf.size(), src_img, src_image_width, src_image_height, img_type, ldr_srgb_to_linear_conversion); + } - // We don't use threading for now, but the compressor needs a job pool. - job_pool jpool(1); + uint32_t encode(const emscripten::val& dst_basis_file_js_val) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("basis_encoder::encode: Must call basis_init() first!\n"); +#endif + assert(0); + return 0; + } - // Initialize the compression parameters structure. This is the same structure that the command line tool fills in. - basis_compressor_params ¶ms = m_params; + // We don't use threading for now, but the compressor needs a job pool. + job_pool jpool(1); - params.m_pJob_pool = &jpool; + // Initialize the compression parameters structure. This is the same structure that the command line tool fills in. + basis_compressor_params ¶ms = m_params; - // Disabling multithreading for now, which sucks. - params.m_multithreading = false; - - params.m_status_output = params.m_debug; + params.m_pJob_pool = &jpool; - params.m_read_source_images = false; - params.m_write_output_basis_files = false; + // Disabling multithreading for now, which sucks. + params.m_multithreading = false; - basis_compressor comp; + params.m_status_output = params.m_debug; - if (!comp.init(params)) - { -#if BASISU_DEBUG_PRINTF - printf("Failed initializing BasisU compressor! One or more provided parameters may be invalid.\n"); -#endif - return 0; - } + params.m_read_source_images = false; + params.m_write_output_basis_or_ktx2_files = false; -#if BASISU_DEBUG_PRINTF - printf("Begin BasisU compression\n"); -#endif + basis_compressor comp; - basis_compressor::error_code ec = comp.process(); + if (!comp.init(params)) + { +#if BASISU_DEBUG_PRINTF + printf("Failed initializing BasisU compressor! One or more provided parameters may be invalid.\n"); +#endif + return 0; + } #if BASISU_DEBUG_PRINTF - printf("BasisU compression done, status %u, %u bytes\n", (uint32_t)ec, (uint32_t)comp.get_output_basis_file().size()); -#endif + printf("Begin BasisU compression\n"); +#endif - if (ec != basis_compressor::cECSuccess) - { - // Something failed during compression. -#if BASISU_DEBUG_PRINTF - printf("BasisU compression failed with status %u!\n", (uint32_t)ec); -#endif - return 0; - } + basis_compressor::error_code ec = comp.process(); - if (params.m_create_ktx2_file) - { - // Compression succeeded, so copy the .ktx2 file bytes to the caller's buffer. - if (!copy_to_jsbuffer(dst_basis_file_js_val, comp.get_output_ktx2_file())) - return 0; +#if BASISU_DEBUG_PRINTF + printf("BasisU compression done, status %u, %u bytes\n", (uint32_t)ec, (uint32_t)comp.get_output_basis_file().size()); +#endif - // Return the file size of the .basis file in bytes. - return (uint32_t)comp.get_output_ktx2_file().size(); - } - else - { - // Compression succeeded, so copy the .basis file bytes to the caller's buffer. - if (!copy_to_jsbuffer(dst_basis_file_js_val, comp.get_output_basis_file())) - return 0; - - // Return the file size of the .basis file in bytes. - return (uint32_t)comp.get_output_basis_file().size(); - } - } + if (ec != basis_compressor::cECSuccess) + { + // Something failed during compression. +#if BASISU_DEBUG_PRINTF + printf("BasisU compression failed with status %u!\n", (uint32_t)ec); +#endif + return 0; + } + + if (params.m_create_ktx2_file) + { + // Compression succeeded, so copy the .ktx2 file bytes to the caller's buffer. + if (!copy_to_jsbuffer(dst_basis_file_js_val, comp.get_output_ktx2_file())) + return 0; + + // Return the file size of the .basis file in bytes. + return (uint32_t)comp.get_output_ktx2_file().size(); + } + else + { + // Compression succeeded, so copy the .basis file bytes to the caller's buffer. + if (!copy_to_jsbuffer(dst_basis_file_js_val, comp.get_output_basis_file())) + return 0; + + // Return the file size of the .basis file in bytes. + return (uint32_t)comp.get_output_basis_file().size(); + } + } }; #endif class lowlevel_etc1s_image_transcoder : public basisu_lowlevel_etc1s_transcoder { - // Using our own transcoder state, for video support. - basisu_transcoder_state m_state; - + // Using our own transcoder state, for video support. + basisu_transcoder_state m_state; + public: - lowlevel_etc1s_image_transcoder() - { - } - - bool decode_palettes(uint32_t num_endpoints, const emscripten::val& endpoint_data, uint32_t num_selectors, const emscripten::val& selector_data) - { - basisu::vector temp_endpoint_data, temp_selector_data; - copy_from_jsbuffer(endpoint_data, temp_endpoint_data); - copy_from_jsbuffer(selector_data, temp_selector_data); + lowlevel_etc1s_image_transcoder() + { + } -#if 0 - printf("decode_palettes: %u %u %u %u, %u %u\n", - num_endpoints, (uint32_t)temp_endpoint_data.size(), - num_selectors, (uint32_t)temp_selector_data.size(), - temp_endpoint_data[0], temp_selector_data[0]); -#endif - - if (!temp_endpoint_data.size() || !temp_selector_data.size()) - { -#if BASISU_DEBUG_PRINTF - printf("decode_tables: endpoint_data and/or selector_data is empty\n"); -#endif - assert(0); - return false; - } - - return basisu_lowlevel_etc1s_transcoder::decode_palettes(num_endpoints, &temp_endpoint_data[0], (uint32_t)temp_endpoint_data.size(), - num_selectors, &temp_selector_data[0], (uint32_t)temp_selector_data.size()); - } - - bool decode_tables(const emscripten::val& table_data) - { - basisu::vector temp_table_data; - copy_from_jsbuffer(table_data, temp_table_data); - - if (!temp_table_data.size()) - { -#if BASISU_DEBUG_PRINTF - printf("decode_tables: table_data is empty\n"); -#endif - assert(0); - return false; - } - - return basisu_lowlevel_etc1s_transcoder::decode_tables(&temp_table_data[0], (uint32_t)temp_table_data.size()); - } - - bool transcode_image( - uint32_t target_format, // see transcoder_texture_format - const emscripten::val& output_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, - const emscripten::val& compressed_data, - uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, - uint32_t rgb_offset, uint32_t rgb_length, uint32_t alpha_offset, uint32_t alpha_length, - uint32_t decode_flags, // see cDecodeFlagsPVRTCDecodeToNextPow2 - bool basis_file_has_alpha_slices, - bool is_video, - uint32_t output_row_pitch_in_blocks_or_pixels, - uint32_t output_rows_in_pixels) - { - if (!g_basis_initialized_flag) - { -#if BASISU_DEBUG_PRINTF - printf("transcode_etc1s_image: basis_init() must be called first\n"); -#endif - assert(0); - return false; - } - - // FIXME: Access the JavaScript buffer directly vs. copying it. - basisu::vector temp_comp_data; - copy_from_jsbuffer(compressed_data, temp_comp_data); - - if (!temp_comp_data.size()) - { -#if BASISU_DEBUG_PRINTF - printf("transcode_etc1s_image: compressed_data is empty\n"); -#endif - assert(0); - return false; - } - - uint32_t output_blocks_len = output_blocks["byteLength"].as(); - if (!output_blocks_len) - { -#if BASISU_DEBUG_PRINTF - printf("transcode_etc1s_image: output_blocks is empty\n"); -#endif - assert(0); - return false; - } - - basisu::vector temp_output_blocks(output_blocks_len); - - bool status = basisu_lowlevel_etc1s_transcoder::transcode_image( - (transcoder_texture_format)target_format, - &temp_output_blocks[0], output_blocks_buf_size_in_blocks_or_pixels, - &temp_comp_data[0], temp_comp_data.size(), - num_blocks_x, num_blocks_y, orig_width, orig_height, level_index, - rgb_offset, rgb_length, alpha_offset, alpha_length, - decode_flags, - basis_file_has_alpha_slices, - is_video, - output_row_pitch_in_blocks_or_pixels, - &m_state, - output_rows_in_pixels); - - if (!status) - { -#if BASISU_DEBUG_PRINTF - printf("transcode_etc1s_image: basisu_lowlevel_etc1s_transcoder::transcode_image failed\n"); -#endif - assert(0); - return false; - } - - if (!copy_to_jsbuffer(output_blocks, temp_output_blocks)) - return false; + bool decode_palettes(uint32_t num_endpoints, const emscripten::val& endpoint_data, uint32_t num_selectors, const emscripten::val& selector_data) + { + basisu::vector temp_endpoint_data, temp_selector_data; + copy_from_jsbuffer(endpoint_data, temp_endpoint_data); + copy_from_jsbuffer(selector_data, temp_selector_data); - return true; - } +#if 0 + printf("decode_palettes: %u %u %u %u, %u %u\n", + num_endpoints, (uint32_t)temp_endpoint_data.size(), + num_selectors, (uint32_t)temp_selector_data.size(), + temp_endpoint_data[0], temp_selector_data[0]); +#endif + + if (!temp_endpoint_data.size() || !temp_selector_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("decode_tables: endpoint_data and/or selector_data is empty\n"); +#endif + assert(0); + return false; + } + + return basisu_lowlevel_etc1s_transcoder::decode_palettes(num_endpoints, &temp_endpoint_data[0], (uint32_t)temp_endpoint_data.size(), + num_selectors, &temp_selector_data[0], (uint32_t)temp_selector_data.size()); + } + + bool decode_tables(const emscripten::val& table_data) + { + basisu::vector temp_table_data; + copy_from_jsbuffer(table_data, temp_table_data); + + if (!temp_table_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("decode_tables: table_data is empty\n"); +#endif + assert(0); + return false; + } + + return basisu_lowlevel_etc1s_transcoder::decode_tables(&temp_table_data[0], (uint32_t)temp_table_data.size()); + } + + bool transcode_image( + uint32_t target_format, // see transcoder_texture_format + const emscripten::val& output_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const emscripten::val& compressed_data, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t rgb_offset, uint32_t rgb_length, uint32_t alpha_offset, uint32_t alpha_length, + uint32_t decode_flags, // see cDecodeFlagsPVRTCDecodeToNextPow2 + bool basis_file_has_alpha_slices, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: basis_init() must be called first\n"); +#endif + assert(0); + return false; + } + + // FIXME: Access the JavaScript buffer directly vs. copying it. + basisu::vector temp_comp_data; + copy_from_jsbuffer(compressed_data, temp_comp_data); + + if (!temp_comp_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: compressed_data is empty\n"); +#endif + assert(0); + return false; + } + + uint32_t output_blocks_len = output_blocks["byteLength"].as(); + if (!output_blocks_len) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: output_blocks is empty\n"); +#endif + assert(0); + return false; + } + + basisu::vector temp_output_blocks(output_blocks_len); + + bool status = basisu_lowlevel_etc1s_transcoder::transcode_image( + (transcoder_texture_format)target_format, + &temp_output_blocks[0], output_blocks_buf_size_in_blocks_or_pixels, + &temp_comp_data[0], temp_comp_data.size(), + num_blocks_x, num_blocks_y, orig_width, orig_height, level_index, + rgb_offset, rgb_length, alpha_offset, alpha_length, + decode_flags, + basis_file_has_alpha_slices, + is_video, + output_row_pitch_in_blocks_or_pixels, + &m_state, + output_rows_in_pixels); + + if (!status) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: basisu_lowlevel_etc1s_transcoder::transcode_image failed\n"); +#endif + assert(0); + return false; + } + + if (!copy_to_jsbuffer(output_blocks, temp_output_blocks)) + return false; + + return true; + } }; +// Supports UASTC LDR and HDR. bool transcode_uastc_image( - uint32_t target_format_int, // see transcoder_texture_format - const emscripten::val& output_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, - const emscripten::val& compressed_data, - uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, - uint32_t slice_offset, uint32_t slice_length, - uint32_t decode_flags, // see cDecodeFlagsPVRTCDecodeToNextPow2 - bool has_alpha, - bool is_video, - uint32_t output_row_pitch_in_blocks_or_pixels, - uint32_t output_rows_in_pixels, - int channel0, int channel1) + uint32_t target_format_int, // see transcoder_texture_format + const emscripten::val& output_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const emscripten::val& compressed_data, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t slice_offset, uint32_t slice_length, + uint32_t decode_flags, // see cDecodeFlagsPVRTCDecodeToNextPow2 + bool has_alpha, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels, + int channel0, int channel1) { - transcoder_texture_format target_format = static_cast(target_format_int); - - if (!g_basis_initialized_flag) + transcoder_texture_format target_format = static_cast(target_format_int); + + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: basis_init() must be called first\n"); +#endif + assert(0); + return false; + } + + // FIXME: Access the JavaScript buffer directly vs. copying it. + basisu::vector temp_comp_data; + copy_from_jsbuffer(compressed_data, temp_comp_data); + + if (!temp_comp_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: compressed_data is empty\n"); +#endif + assert(0); + return false; + } + + uint32_t output_blocks_len = output_blocks["byteLength"].as(); + if (!output_blocks_len) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: output_blocks is empty\n"); +#endif + assert(0); + return false; + } + +#if 0 + printf("format: %u\n", (uint32_t)target_format); + printf("output_blocks size: %u buf size: %u\n", output_blocks_len, output_blocks_buf_size_in_blocks_or_pixels); + printf("compressed_data size: %u\n", compressed_data["byteLength"].as()); + printf("%u %u %u %u %u\n", num_blocks_x, num_blocks_y, orig_width, orig_height, level_index); + printf("%u %u\n", slice_offset, slice_length); + printf("%u\n", decode_flags); + printf("has_alpha: %u is_video: %u\n", has_alpha, is_video); +#endif + + basisu::vector temp_output_blocks(output_blocks_len); + + bool status = false; + if (basis_transcoder_format_is_hdr(target_format)) { -#if BASISU_DEBUG_PRINTF - printf("transcode_uastc_image: basis_init() must be called first\n"); -#endif - assert(0); - return false; + basisu_lowlevel_uastc_hdr_transcoder transcoder; + + status = transcoder.transcode_image( + (transcoder_texture_format)target_format, + &temp_output_blocks[0], output_blocks_buf_size_in_blocks_or_pixels, + &temp_comp_data[0], temp_comp_data.size(), + num_blocks_x, num_blocks_y, orig_width, orig_height, level_index, + slice_offset, slice_length, + decode_flags, + has_alpha, + is_video, + output_row_pitch_in_blocks_or_pixels, + nullptr, + output_rows_in_pixels, + channel0, channel1); } - - // FIXME: Access the JavaScript buffer directly vs. copying it. - basisu::vector temp_comp_data; - copy_from_jsbuffer(compressed_data, temp_comp_data); - - if (!temp_comp_data.size()) + else { -#if BASISU_DEBUG_PRINTF - printf("transcode_uastc_image: compressed_data is empty\n"); -#endif - assert(0); - return false; - } - - uint32_t output_blocks_len = output_blocks["byteLength"].as(); - if (!output_blocks_len) - { -#if BASISU_DEBUG_PRINTF - printf("transcode_uastc_image: output_blocks is empty\n"); -#endif - assert(0); - return false; + basisu_lowlevel_uastc_transcoder transcoder; + + status = transcoder.transcode_image( + (transcoder_texture_format)target_format, + &temp_output_blocks[0], output_blocks_buf_size_in_blocks_or_pixels, + &temp_comp_data[0], temp_comp_data.size(), + num_blocks_x, num_blocks_y, orig_width, orig_height, level_index, + slice_offset, slice_length, + decode_flags, + has_alpha, + is_video, + output_row_pitch_in_blocks_or_pixels, + nullptr, + output_rows_in_pixels, + channel0, channel1); } -#if 0 - printf("format: %u\n", (uint32_t)target_format); - printf("output_blocks size: %u buf size: %u\n", output_blocks_len, output_blocks_buf_size_in_blocks_or_pixels); - printf("compressed_data size: %u\n", compressed_data["byteLength"].as()); - printf("%u %u %u %u %u\n", num_blocks_x, num_blocks_y, orig_width, orig_height, level_index); - printf("%u %u\n", slice_offset, slice_length); - printf("%u\n", decode_flags); - printf("has_alpha: %u is_video: %u\n", has_alpha, is_video); -#endif - - basisu::vector temp_output_blocks(output_blocks_len); - - basisu_lowlevel_uastc_transcoder transcoder; - - bool status = transcoder.transcode_image( - (transcoder_texture_format)target_format, - &temp_output_blocks[0], output_blocks_buf_size_in_blocks_or_pixels, - &temp_comp_data[0], temp_comp_data.size(), - num_blocks_x, num_blocks_y, orig_width, orig_height, level_index, - slice_offset, slice_length, - decode_flags, - has_alpha, - is_video, - output_row_pitch_in_blocks_or_pixels, - nullptr, - output_rows_in_pixels, - channel0, channel1); - - if (!status) - { -#if BASISU_DEBUG_PRINTF - printf("transcode_uastc_image: basisu_lowlevel_uastc_transcoder::transcode_image failed\n"); -#endif - assert(0); - return false; - } - - if (!copy_to_jsbuffer(output_blocks, temp_output_blocks)) - return false; + if (!status) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: basisu_lowlevel_uastc_transcoder::transcode_image failed\n"); +#endif + assert(0); + return false; + } - return true; + if (!copy_to_jsbuffer(output_blocks, temp_output_blocks)) + return false; + + return true; } uint32_t get_bytes_per_block_or_pixel(uint32_t transcoder_tex_fmt) { - return basis_get_bytes_per_block_or_pixel(static_cast(transcoder_tex_fmt)); + return basis_get_bytes_per_block_or_pixel(static_cast(transcoder_tex_fmt)); } bool format_has_alpha(uint32_t transcoder_tex_fmt) { - return basis_transcoder_format_has_alpha(static_cast(transcoder_tex_fmt)); + return basis_transcoder_format_has_alpha(static_cast(transcoder_tex_fmt)); +} + +bool format_is_hdr(uint32_t transcode_tex_fmt) +{ + return basis_transcoder_format_is_hdr(static_cast(transcode_tex_fmt)); } bool format_is_uncompressed(uint32_t transcoder_tex_fmt) { - return basis_transcoder_format_is_uncompressed(static_cast(transcoder_tex_fmt)); + return basis_transcoder_format_is_uncompressed(static_cast(transcoder_tex_fmt)); } -bool is_format_supported(uint32_t transcoder_tex_fmt) +bool is_format_supported(uint32_t transcoder_tex_fmt, uint32_t file_fmt) { - return basis_is_format_supported(static_cast(transcoder_tex_fmt)); + return basis_is_format_supported(static_cast(transcoder_tex_fmt), static_cast(file_fmt)); } uint32_t get_format_block_width(uint32_t transcoder_tex_fmt) { - return basis_get_block_width(static_cast(transcoder_tex_fmt)); + return basis_get_block_width(static_cast(transcoder_tex_fmt)); } uint32_t get_format_block_height(uint32_t transcoder_tex_fmt) { - return basis_get_block_height(static_cast(transcoder_tex_fmt)); + return basis_get_block_height(static_cast(transcoder_tex_fmt)); +} + +uint32_t convert_float_to_half(float f) +{ + return basist::float_to_half(f); +} + +float convert_half_to_float(uint32_t h) +{ + assert(h < 65536); + return basist::half_to_float(h); +} + +void set_debug_flags_wrapper(uint32_t flags) +{ + basist::set_debug_flags(flags); +} + +uint32_t get_debug_flags_wrapper() +{ + return basist::get_debug_flags(); } EMSCRIPTEN_BINDINGS(basis_codec) { function("initializeBasis", &basis_init); - + + function("setDebugFlags", &set_debug_flags_wrapper); + function("getDebugFlags", &get_debug_flags_wrapper); + // Expose BasisFileDesc structure value_object("BasisFileDesc") - .field("version", &basis_file_desc::m_version) - .field("usPerFrame", &basis_file_desc::m_us_per_frame) - .field("totalImages", &basis_file_desc::m_total_images) - .field("userdata0", &basis_file_desc::m_userdata0) - .field("userdata1", &basis_file_desc::m_userdata1) - .field("texFormat", &basis_file_desc::m_tex_format) - .field("yFlipped", &basis_file_desc::m_y_flipped) - .field("hasAlphaSlices", &basis_file_desc::m_has_alpha_slices) - .field("numEndpoints", &basis_file_desc::m_num_endpoints) - .field("endpointPaletteOfs", &basis_file_desc::m_endpoint_palette_ofs) - .field("endpointPaletteLen", &basis_file_desc::m_endpoint_palette_len) - .field("numSelectors", &basis_file_desc::m_num_selectors) - .field("selectorPaletteOfs", &basis_file_desc::m_selector_palette_ofs) - .field("selectorPaletteLen", &basis_file_desc::m_selector_palette_len) - .field("tablesOfs", &basis_file_desc::m_tables_ofs) - .field("tablesLen", &basis_file_desc::m_tables_len) + .field("version", &basis_file_desc::m_version) + .field("usPerFrame", &basis_file_desc::m_us_per_frame) + .field("totalImages", &basis_file_desc::m_total_images) + .field("userdata0", &basis_file_desc::m_userdata0) + .field("userdata1", &basis_file_desc::m_userdata1) + .field("texFormat", &basis_file_desc::m_tex_format) + .field("yFlipped", &basis_file_desc::m_y_flipped) + .field("hasAlphaSlices", &basis_file_desc::m_has_alpha_slices) + .field("numEndpoints", &basis_file_desc::m_num_endpoints) + .field("endpointPaletteOfs", &basis_file_desc::m_endpoint_palette_ofs) + .field("endpointPaletteLen", &basis_file_desc::m_endpoint_palette_len) + .field("numSelectors", &basis_file_desc::m_num_selectors) + .field("selectorPaletteOfs", &basis_file_desc::m_selector_palette_ofs) + .field("selectorPaletteLen", &basis_file_desc::m_selector_palette_len) + .field("tablesOfs", &basis_file_desc::m_tables_ofs) + .field("tablesLen", &basis_file_desc::m_tables_len) ; - // Expose BasisImageDesc structure + // Expose BasisImageDesc structure value_object("BasisImageDesc") - .field("origWidth", &basis_image_desc::m_orig_width) + .field("origWidth", &basis_image_desc::m_orig_width) .field("origHeight", &basis_image_desc::m_orig_height) .field("numBlocksX", &basis_image_desc::m_num_blocks_x) .field("numBlocksY", &basis_image_desc::m_num_blocks_y) .field("numLevels", &basis_image_desc::m_num_levels) .field("alphaFlag", &basis_image_desc::m_alpha_flag) .field("iframeFlag", &basis_image_desc::m_iframe_flag) - ; + ; // Expose BasisImageLevelDesc structure value_object("BasisImageLevelDesc") - .field("rgbFileOfs", &basis_image_level_desc::m_rgb_file_ofs) + .field("rgbFileOfs", &basis_image_level_desc::m_rgb_file_ofs) .field("rgbFileLen", &basis_image_level_desc::m_rgb_file_len) .field("alphaFileOfs", &basis_image_level_desc::m_alpha_file_ofs) .field("alphaFileLen", &basis_image_level_desc::m_alpha_file_len) - ; + ; // Expose some key enums to JavaScript code. // enum class transcoder_texture_format enum_("transcoder_texture_format") - .value("cTFETC1_RGB", transcoder_texture_format::cTFETC1_RGB) - .value("cTFETC2_RGBA", transcoder_texture_format::cTFETC2_RGBA) - .value("cTFBC1_RGB", transcoder_texture_format::cTFBC1_RGB) - .value("cTFBC3_RGBA", transcoder_texture_format::cTFBC3_RGBA) - .value("cTFBC4_R", transcoder_texture_format::cTFBC4_R) - .value("cTFBC5_RG", transcoder_texture_format::cTFBC5_RG) - .value("cTFBC7_RGBA", transcoder_texture_format::cTFBC7_RGBA) - .value("cTFPVRTC1_4_RGB", transcoder_texture_format::cTFPVRTC1_4_RGB) - .value("cTFPVRTC1_4_RGBA", transcoder_texture_format::cTFPVRTC1_4_RGBA) - .value("cTFASTC_4x4_RGBA", transcoder_texture_format::cTFASTC_4x4_RGBA) - .value("cTFATC_RGB", transcoder_texture_format::cTFATC_RGB) - .value("cTFATC_RGBA", transcoder_texture_format::cTFATC_RGBA) - .value("cTFFXT1_RGB", transcoder_texture_format::cTFFXT1_RGB) - .value("cTFPVRTC2_4_RGB", transcoder_texture_format::cTFPVRTC2_4_RGB) - .value("cTFPVRTC2_4_RGBA", transcoder_texture_format::cTFPVRTC2_4_RGBA) - .value("cTFETC2_EAC_R11", transcoder_texture_format::cTFETC2_EAC_R11) - .value("cTFETC2_EAC_RG11", transcoder_texture_format::cTFETC2_EAC_RG11) - .value("cTFRGBA32", transcoder_texture_format::cTFRGBA32) - .value("cTFRGB565", transcoder_texture_format::cTFRGB565) - .value("cTFBGR565", transcoder_texture_format::cTFBGR565) - .value("cTFRGBA4444", transcoder_texture_format::cTFRGBA4444) - .value("cTFTotalTextureFormats", transcoder_texture_format::cTFTotalTextureFormats) - ; + .value("cTFETC1_RGB", transcoder_texture_format::cTFETC1_RGB) + .value("cTFETC2_RGBA", transcoder_texture_format::cTFETC2_RGBA) + .value("cTFBC1_RGB", transcoder_texture_format::cTFBC1_RGB) + .value("cTFBC3_RGBA", transcoder_texture_format::cTFBC3_RGBA) + .value("cTFBC4_R", transcoder_texture_format::cTFBC4_R) + .value("cTFBC5_RG", transcoder_texture_format::cTFBC5_RG) + .value("cTFBC7_RGBA", transcoder_texture_format::cTFBC7_RGBA) + .value("cTFPVRTC1_4_RGB", transcoder_texture_format::cTFPVRTC1_4_RGB) + .value("cTFPVRTC1_4_RGBA", transcoder_texture_format::cTFPVRTC1_4_RGBA) + .value("cTFASTC_4x4_RGBA", transcoder_texture_format::cTFASTC_4x4_RGBA) + .value("cTFATC_RGB", transcoder_texture_format::cTFATC_RGB) + .value("cTFATC_RGBA", transcoder_texture_format::cTFATC_RGBA) + .value("cTFFXT1_RGB", transcoder_texture_format::cTFFXT1_RGB) + .value("cTFPVRTC2_4_RGB", transcoder_texture_format::cTFPVRTC2_4_RGB) + .value("cTFPVRTC2_4_RGBA", transcoder_texture_format::cTFPVRTC2_4_RGBA) + .value("cTFETC2_EAC_R11", transcoder_texture_format::cTFETC2_EAC_R11) + .value("cTFETC2_EAC_RG11", transcoder_texture_format::cTFETC2_EAC_RG11) + .value("cTFBC6H", transcoder_texture_format::cTFBC6H) + .value("cTFASTC_HDR_4x4_RGBA", transcoder_texture_format::cTFASTC_HDR_4x4_RGBA) + .value("cTFRGBA32", transcoder_texture_format::cTFRGBA32) + .value("cTFRGB565", transcoder_texture_format::cTFRGB565) + .value("cTFBGR565", transcoder_texture_format::cTFBGR565) + .value("cTFRGBA4444", transcoder_texture_format::cTFRGBA4444) + .value("cTFRGB_HALF", transcoder_texture_format::cTFRGB_HALF) + .value("cTFRGBA_HALF", transcoder_texture_format::cTFRGBA_HALF) + .value("cTFRGB_9E5", transcoder_texture_format::cTFRGB_9E5) + .value("cTFTotalTextureFormats", transcoder_texture_format::cTFTotalTextureFormats) + ; - // Expose some useful transcoder_texture_format helper functions - function("getBytesPerBlockOrPixel", &get_bytes_per_block_or_pixel); - function("formatHasAlpha", &format_has_alpha); - function("formatIsUncompressed", &format_is_uncompressed); - function("isFormatSupported", &is_format_supported); - function("getFormatBlockWidth", &get_format_block_width); - function("getFormatBlockHeight", &get_format_block_height); - - // Expose enum basis_texture_type - enum_("basis_texture_type") - .value("cBASISTexType2D", cBASISTexType2D) - .value("cBASISTexType2DArray", cBASISTexType2DArray) - .value("cBASISTexTypeCubemapArray", cBASISTexTypeCubemapArray) - .value("cBASISTexTypeVideoFrames", cBASISTexTypeVideoFrames) - .value("cBASISTexTypeVolume", cBASISTexTypeVolume) - ; + // Expose some useful transcoder_texture_format helper functions + function("getBytesPerBlockOrPixel", &get_bytes_per_block_or_pixel); + function("formatHasAlpha", &format_has_alpha); + function("formatIsHDR", &format_is_hdr); + function("formatIsUncompressed", &format_is_uncompressed); + function("isFormatSupported", &is_format_supported); + function("getFormatBlockWidth", &get_format_block_width); + function("getFormatBlockHeight", &get_format_block_height); - // Expose enum basis_tex_format - enum_("basis_tex_format") - .value("cETC1S", basis_tex_format::cETC1S) - .value("cUASTC4x4", basis_tex_format::cUASTC4x4) - ; + function("convertFloatToHalf", &convert_float_to_half); + function("convertHalfToFloat", &convert_half_to_float); + + // Expose enum basis_texture_type + enum_("basis_texture_type") + .value("cBASISTexType2D", cBASISTexType2D) + .value("cBASISTexType2DArray", cBASISTexType2DArray) + .value("cBASISTexTypeCubemapArray", cBASISTexTypeCubemapArray) + .value("cBASISTexTypeVideoFrames", cBASISTexTypeVideoFrames) + .value("cBASISTexTypeVolume", cBASISTexTypeVolume) + ; + + // Expose enum basis_tex_format + enum_("basis_tex_format") + .value("cETC1S", basis_tex_format::cETC1S) + .value("cUASTC4x4", basis_tex_format::cUASTC4x4) + .value("cUASTC_HDR_4x4", basis_tex_format::cUASTC_HDR_4x4) + ; // .basis file transcoder object. If all you want to do is transcode already encoded .basis files, this is all you really need. class_("BasisFile") @@ -1476,6 +1585,9 @@ EMSCRIPTEN_BINDINGS(basis_codec) { })) .function("isUASTC", optional_override([](basis_file& self) { return self.isUASTC(); + })) + .function("isHDR", optional_override([](basis_file& self) { + return self.isHDR(); })) .function("getNumImages", optional_override([](basis_file& self) { return self.getNumImages(); @@ -1489,63 +1601,63 @@ EMSCRIPTEN_BINDINGS(basis_codec) { .function("getImageHeight", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex) { return self.getImageHeight(imageIndex, levelIndex); })) - // format is enum class transcoder_texture_format + // format is enum class transcoder_texture_format .function("getImageTranscodedSizeInBytes", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex, uint32_t format) { return self.getImageTranscodedSizeInBytes(imageIndex, levelIndex, format); })) .function("startTranscoding", optional_override([](basis_file& self) { return self.startTranscoding(); })) - // format is enum class transcoder_texture_format + // format is enum class transcoder_texture_format .function("transcodeImage", optional_override([](basis_file& self, const emscripten::val& dst, uint32_t imageIndex, uint32_t levelIndex, uint32_t format, uint32_t unused, uint32_t getAlphaForOpaqueFormats) { return self.transcodeImage(dst, imageIndex, levelIndex, format, unused, getAlphaForOpaqueFormats); })) - // Returns low-level information about the basis file. - .function("getFileDesc", optional_override([](basis_file& self) { + // Returns low-level information about the basis file. + .function("getFileDesc", optional_override([](basis_file& self) { return self.getFileDesc(); })) - // Returns low-level information about a specific image in a basis file. An image can contain 1 or more mipmap levels. - .function("getImageDesc", optional_override([](basis_file& self, uint32_t imageIndex) { + // Returns low-level information about a specific image in a basis file. An image can contain 1 or more mipmap levels. + .function("getImageDesc", optional_override([](basis_file& self, uint32_t imageIndex) { return self.getImageDesc(imageIndex); })) - // Returns low-level information about a specific image mipmap level in a basis file. - .function("getImageLevelDesc", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex) { + // Returns low-level information about a specific image mipmap level in a basis file. + .function("getImageLevelDesc", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex) { return self.getImageLevelDesc(imageIndex, levelIndex); })) ; - + // Low-level container independent transcoding of ETC1S and UASTC slice data. // These functions allow the caller to transcode compressed ETC1S or UASTC texture data that is embedded within arbitrary data files, such as from KTX2. enum_("basisu_decode_flags") - .value("cDecodeFlagsPVRTCDecodeToNextPow2", cDecodeFlagsPVRTCDecodeToNextPow2) - .value("cDecodeFlagsTranscodeAlphaDataToOpaqueFormats", cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) - .value("cDecodeFlagsBC1ForbidThreeColorBlocks", cDecodeFlagsBC1ForbidThreeColorBlocks) - .value("cDecodeFlagsOutputHasAlphaIndices", cDecodeFlagsOutputHasAlphaIndices) - .value("cDecodeFlagsHighQuality", cDecodeFlagsHighQuality) + .value("cDecodeFlagsPVRTCDecodeToNextPow2", cDecodeFlagsPVRTCDecodeToNextPow2) + .value("cDecodeFlagsTranscodeAlphaDataToOpaqueFormats", cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) + .value("cDecodeFlagsBC1ForbidThreeColorBlocks", cDecodeFlagsBC1ForbidThreeColorBlocks) + .value("cDecodeFlagsOutputHasAlphaIndices", cDecodeFlagsOutputHasAlphaIndices) + .value("cDecodeFlagsHighQuality", cDecodeFlagsHighQuality) ; - + // The low-level ETC1S transcoder is a class because it has persistent state (such as the endpoint/selector codebooks and Huffman tables, and transcoder state for video) class_("LowLevelETC1SImageTranscoder") - .constructor<>() - .function("decodePalettes", &lowlevel_etc1s_image_transcoder::decode_palettes) - .function("decodeTables", &lowlevel_etc1s_image_transcoder::decode_tables) - .function("transcodeImage", &lowlevel_etc1s_image_transcoder::transcode_image) - ; + .constructor<>() + .function("decodePalettes", &lowlevel_etc1s_image_transcoder::decode_palettes) + .function("decodeTables", &lowlevel_etc1s_image_transcoder::decode_tables) + .function("transcodeImage", &lowlevel_etc1s_image_transcoder::transcode_image) + ; - // The low-level UASTC transcoder is a single function. + // The low-level UASTC transcoder is a single function. function("transcodeUASTCImage", &transcode_uastc_image); function("transcoderSupportsKTX2", &basisu_transcoder_supports_ktx2); function("transcoderSupportsKTX2Zstd", &basisu_transcoder_supports_ktx2_zstd); - + #if BASISD_SUPPORT_KTX2 // KTX2 enums/constants enum_("ktx2_supercompression") - .value("KTX2_SS_NONE", KTX2_SS_NONE) - .value("KTX2_SS_BASISLZ", KTX2_SS_BASISLZ) - .value("KTX2_SS_ZSTANDARD", KTX2_SS_ZSTANDARD) - ; + .value("KTX2_SS_NONE", KTX2_SS_NONE) + .value("KTX2_SS_BASISLZ", KTX2_SS_BASISLZ) + .value("KTX2_SS_ZSTANDARD", KTX2_SS_ZSTANDARD) + ; constant("KTX2_VK_FORMAT_UNDEFINED", KTX2_VK_FORMAT_UNDEFINED); constant("KTX2_KDF_DF_MODEL_UASTC", KTX2_KDF_DF_MODEL_UASTC); @@ -1558,404 +1670,432 @@ EMSCRIPTEN_BINDINGS(basis_codec) { constant("KTX2_KHR_DF_TRANSFER_SRGB", KTX2_KHR_DF_TRANSFER_SRGB); enum_("ktx2_df_channel_id") - .value("KTX2_DF_CHANNEL_ETC1S_RGB", KTX2_DF_CHANNEL_ETC1S_RGB) - .value("KTX2_DF_CHANNEL_ETC1S_RRR", KTX2_DF_CHANNEL_ETC1S_RRR) - .value("KTX2_DF_CHANNEL_ETC1S_GGG", KTX2_DF_CHANNEL_ETC1S_GGG) - .value("KTX2_DF_CHANNEL_ETC1S_AAA", KTX2_DF_CHANNEL_ETC1S_AAA) - .value("KTX2_DF_CHANNEL_UASTC_DATA", KTX2_DF_CHANNEL_UASTC_DATA) - .value("KTX2_DF_CHANNEL_UASTC_RGB", KTX2_DF_CHANNEL_UASTC_RGB) - .value("KTX2_DF_CHANNEL_UASTC_RGBA", KTX2_DF_CHANNEL_UASTC_RGBA) - .value("KTX2_DF_CHANNEL_UASTC_RRR", KTX2_DF_CHANNEL_UASTC_RRR) - .value("KTX2_DF_CHANNEL_UASTC_RRRG", KTX2_DF_CHANNEL_UASTC_RRRG) - .value("KTX2_DF_CHANNEL_UASTC_RG", KTX2_DF_CHANNEL_UASTC_RG) - ; + .value("KTX2_DF_CHANNEL_ETC1S_RGB", KTX2_DF_CHANNEL_ETC1S_RGB) + .value("KTX2_DF_CHANNEL_ETC1S_RRR", KTX2_DF_CHANNEL_ETC1S_RRR) + .value("KTX2_DF_CHANNEL_ETC1S_GGG", KTX2_DF_CHANNEL_ETC1S_GGG) + .value("KTX2_DF_CHANNEL_ETC1S_AAA", KTX2_DF_CHANNEL_ETC1S_AAA) + .value("KTX2_DF_CHANNEL_UASTC_DATA", KTX2_DF_CHANNEL_UASTC_DATA) + .value("KTX2_DF_CHANNEL_UASTC_RGB", KTX2_DF_CHANNEL_UASTC_RGB) + .value("KTX2_DF_CHANNEL_UASTC_RGBA", KTX2_DF_CHANNEL_UASTC_RGBA) + .value("KTX2_DF_CHANNEL_UASTC_RRR", KTX2_DF_CHANNEL_UASTC_RRR) + .value("KTX2_DF_CHANNEL_UASTC_RRRG", KTX2_DF_CHANNEL_UASTC_RRRG) + .value("KTX2_DF_CHANNEL_UASTC_RG", KTX2_DF_CHANNEL_UASTC_RG) + ; enum_("ktx2_df_color_primaries") - .value("KTX2_DF_PRIMARIES_UNSPECIFIED", KTX2_DF_PRIMARIES_UNSPECIFIED) - .value("KTX2_DF_PRIMARIES_BT709", KTX2_DF_PRIMARIES_BT709) - .value("KTX2_DF_PRIMARIES_SRGB", KTX2_DF_PRIMARIES_SRGB) - .value("KTX2_DF_PRIMARIES_BT601_EBU", KTX2_DF_PRIMARIES_BT601_EBU) - .value("KTX2_DF_PRIMARIES_BT601_SMPTE", KTX2_DF_PRIMARIES_BT601_SMPTE) - .value("KTX2_DF_PRIMARIES_BT2020", KTX2_DF_PRIMARIES_BT2020) - .value("KTX2_DF_PRIMARIES_CIEXYZ", KTX2_DF_PRIMARIES_CIEXYZ) - .value("KTX2_DF_PRIMARIES_ACES", KTX2_DF_PRIMARIES_ACES) - .value("KTX2_DF_PRIMARIES_ACESCC", KTX2_DF_PRIMARIES_ACESCC) - .value("KTX2_DF_PRIMARIES_NTSC1953", KTX2_DF_PRIMARIES_NTSC1953) - .value("KTX2_DF_PRIMARIES_PAL525", KTX2_DF_PRIMARIES_PAL525) - .value("KTX2_DF_PRIMARIES_DISPLAYP3", KTX2_DF_PRIMARIES_DISPLAYP3) - .value("KTX2_DF_PRIMARIES_ADOBERGB", KTX2_DF_PRIMARIES_ADOBERGB) - ; + .value("KTX2_DF_PRIMARIES_UNSPECIFIED", KTX2_DF_PRIMARIES_UNSPECIFIED) + .value("KTX2_DF_PRIMARIES_BT709", KTX2_DF_PRIMARIES_BT709) + .value("KTX2_DF_PRIMARIES_SRGB", KTX2_DF_PRIMARIES_SRGB) + .value("KTX2_DF_PRIMARIES_BT601_EBU", KTX2_DF_PRIMARIES_BT601_EBU) + .value("KTX2_DF_PRIMARIES_BT601_SMPTE", KTX2_DF_PRIMARIES_BT601_SMPTE) + .value("KTX2_DF_PRIMARIES_BT2020", KTX2_DF_PRIMARIES_BT2020) + .value("KTX2_DF_PRIMARIES_CIEXYZ", KTX2_DF_PRIMARIES_CIEXYZ) + .value("KTX2_DF_PRIMARIES_ACES", KTX2_DF_PRIMARIES_ACES) + .value("KTX2_DF_PRIMARIES_ACESCC", KTX2_DF_PRIMARIES_ACESCC) + .value("KTX2_DF_PRIMARIES_NTSC1953", KTX2_DF_PRIMARIES_NTSC1953) + .value("KTX2_DF_PRIMARIES_PAL525", KTX2_DF_PRIMARIES_PAL525) + .value("KTX2_DF_PRIMARIES_DISPLAYP3", KTX2_DF_PRIMARIES_DISPLAYP3) + .value("KTX2_DF_PRIMARIES_ADOBERGB", KTX2_DF_PRIMARIES_ADOBERGB) + ; // Expose ktx2_image_level_info structure value_object("KTX2ImageLevelInfo") - .field("levelIndex", &ktx2_image_level_info::m_level_index) - .field("layerIndex", &ktx2_image_level_info::m_layer_index) - .field("faceIndex", &ktx2_image_level_info::m_face_index) - .field("origWidth", &ktx2_image_level_info::m_orig_width) - .field("origHeight", &ktx2_image_level_info::m_orig_height) - .field("width", &ktx2_image_level_info::m_width) - .field("height", &ktx2_image_level_info::m_height) - .field("numBlocksX", &ktx2_image_level_info::m_num_blocks_x) - .field("numBlocksY", &ktx2_image_level_info::m_num_blocks_y) - .field("totalBlocks", &ktx2_image_level_info::m_total_blocks) - .field("alphaFlag", &ktx2_image_level_info::m_alpha_flag) - .field("iframeFlag", &ktx2_image_level_info::m_iframe_flag) - ; + .field("levelIndex", &ktx2_image_level_info::m_level_index) + .field("layerIndex", &ktx2_image_level_info::m_layer_index) + .field("faceIndex", &ktx2_image_level_info::m_face_index) + .field("origWidth", &ktx2_image_level_info::m_orig_width) + .field("origHeight", &ktx2_image_level_info::m_orig_height) + .field("width", &ktx2_image_level_info::m_width) + .field("height", &ktx2_image_level_info::m_height) + .field("numBlocksX", &ktx2_image_level_info::m_num_blocks_x) + .field("numBlocksY", &ktx2_image_level_info::m_num_blocks_y) + .field("totalBlocks", &ktx2_image_level_info::m_total_blocks) + .field("alphaFlag", &ktx2_image_level_info::m_alpha_flag) + .field("iframeFlag", &ktx2_image_level_info::m_iframe_flag) + ; // Expose the ktx2_header_js structure value_object("KTX2Header") - .field("vkFormat", &ktx2_header_js::m_vk_format) - .field("typeSize", &ktx2_header_js::m_type_size) - .field("pixelWidth", &ktx2_header_js::m_pixel_width) - .field("pixelHeight", &ktx2_header_js::m_pixel_height) - .field("pixelDepth", &ktx2_header_js::m_pixel_depth) - .field("layerCount", &ktx2_header_js::m_layer_count) - .field("faceCount", &ktx2_header_js::m_face_count) - .field("levelCount", &ktx2_header_js::m_level_count) - .field("supercompressionScheme", &ktx2_header_js::m_supercompression_scheme) - .field("dfdByteOffset", &ktx2_header_js::m_dfd_byte_offset) - .field("dfdByteLength", &ktx2_header_js::m_dfd_byte_length) - .field("kvdByteOffset", &ktx2_header_js::m_kvd_byte_offset) - .field("kvdByteLength", &ktx2_header_js::m_kvd_byte_length) - .field("sgdByteOffset", &ktx2_header_js::m_sgd_byte_offset) - .field("sgdByteLength", &ktx2_header_js::m_sgd_byte_length) - ; + .field("vkFormat", &ktx2_header_js::m_vk_format) + .field("typeSize", &ktx2_header_js::m_type_size) + .field("pixelWidth", &ktx2_header_js::m_pixel_width) + .field("pixelHeight", &ktx2_header_js::m_pixel_height) + .field("pixelDepth", &ktx2_header_js::m_pixel_depth) + .field("layerCount", &ktx2_header_js::m_layer_count) + .field("faceCount", &ktx2_header_js::m_face_count) + .field("levelCount", &ktx2_header_js::m_level_count) + .field("supercompressionScheme", &ktx2_header_js::m_supercompression_scheme) + .field("dfdByteOffset", &ktx2_header_js::m_dfd_byte_offset) + .field("dfdByteLength", &ktx2_header_js::m_dfd_byte_length) + .field("kvdByteOffset", &ktx2_header_js::m_kvd_byte_offset) + .field("kvdByteLength", &ktx2_header_js::m_kvd_byte_length) + .field("sgdByteOffset", &ktx2_header_js::m_sgd_byte_offset) + .field("sgdByteLength", &ktx2_header_js::m_sgd_byte_length) + ; // KTX2 transcoder class class_("KTX2File") - .constructor() - .function("isValid", &ktx2_file::isValid) - .function("close", &ktx2_file::close) - .function("getDFDSize", &ktx2_file::getDFDSize) - .function("getDFD", &ktx2_file::getDFD) - .function("getHeader", &ktx2_file::getHeader) - .function("hasKey", &ktx2_file::hasKey) - .function("getTotalKeys", &ktx2_file::getTotalKeys) - .function("getKey", &ktx2_file::getKey) - .function("getKeyValueSize", &ktx2_file::getKeyValueSize) - .function("getKeyValue", &ktx2_file::getKeyValue) - .function("getWidth", &ktx2_file::getWidth) - .function("getHeight", &ktx2_file::getHeight) - .function("getFaces", &ktx2_file::getFaces) - .function("getLayers", &ktx2_file::getLayers) - .function("getLevels", &ktx2_file::getLevels) - .function("getFormat", &ktx2_file::getFormat) - .function("isUASTC", &ktx2_file::isUASTC) - .function("isETC1S", &ktx2_file::isETC1S) - .function("getHasAlpha", &ktx2_file::getHasAlpha) - .function("getDFDColorModel", &ktx2_file::getDFDColorModel) - .function("getDFDColorPrimaries", &ktx2_file::getDFDColorPrimaries) - .function("getDFDTransferFunc", &ktx2_file::getDFDTransferFunc) - .function("getDFDFlags", &ktx2_file::getDFDFlags) - .function("getDFDTotalSamples", &ktx2_file::getDFDTotalSamples) - .function("getDFDChannelID0", &ktx2_file::getDFDChannelID0) - .function("getDFDChannelID1", &ktx2_file::getDFDChannelID1) - .function("isVideo", &ktx2_file::isVideo) - .function("getETC1SImageDescImageFlags", &ktx2_file::getETC1SImageDescImageFlags) - .function("getImageLevelInfo", &ktx2_file::getImageLevelInfo) - .function("getImageTranscodedSizeInBytes", &ktx2_file::getImageTranscodedSizeInBytes) - .function("startTranscoding", &ktx2_file::startTranscoding) - .function("transcodeImage", &ktx2_file::transcodeImage) - ; + .constructor() + .function("isValid", &ktx2_file::isValid) + .function("close", &ktx2_file::close) + .function("getDFDSize", &ktx2_file::getDFDSize) + .function("getDFD", &ktx2_file::getDFD) + .function("getHeader", &ktx2_file::getHeader) + .function("hasKey", &ktx2_file::hasKey) + .function("getTotalKeys", &ktx2_file::getTotalKeys) + .function("getKey", &ktx2_file::getKey) + .function("getKeyValueSize", &ktx2_file::getKeyValueSize) + .function("getKeyValue", &ktx2_file::getKeyValue) + .function("getWidth", &ktx2_file::getWidth) + .function("getHeight", &ktx2_file::getHeight) + .function("getFaces", &ktx2_file::getFaces) + .function("getLayers", &ktx2_file::getLayers) + .function("getLevels", &ktx2_file::getLevels) + .function("getFormat", &ktx2_file::getFormat) + .function("isUASTC", &ktx2_file::isUASTC) + .function("isHDR", &ktx2_file::isHDR) + .function("isETC1S", &ktx2_file::isETC1S) + .function("getHasAlpha", &ktx2_file::getHasAlpha) + .function("getDFDColorModel", &ktx2_file::getDFDColorModel) + .function("getDFDColorPrimaries", &ktx2_file::getDFDColorPrimaries) + .function("getDFDTransferFunc", &ktx2_file::getDFDTransferFunc) + .function("getDFDFlags", &ktx2_file::getDFDFlags) + .function("getDFDTotalSamples", &ktx2_file::getDFDTotalSamples) + .function("getDFDChannelID0", &ktx2_file::getDFDChannelID0) + .function("getDFDChannelID1", &ktx2_file::getDFDChannelID1) + .function("isVideo", &ktx2_file::isVideo) + .function("getETC1SImageDescImageFlags", &ktx2_file::getETC1SImageDescImageFlags) + .function("getImageLevelInfo", &ktx2_file::getImageLevelInfo) + .function("getImageTranscodedSizeInBytes", &ktx2_file::getImageTranscodedSizeInBytes) + .function("startTranscoding", &ktx2_file::startTranscoding) + .function("transcodeImage", &ktx2_file::transcodeImage) + ; #endif // BASISD_SUPPORT_KTX2 // Optional encoding/compression support of .basis and .KTX2 files (the same class encodes/compresses to either format). - + #if BASISU_SUPPORT_ENCODING - // Compressor Constants + // Compressor Constants + + constant("BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION", BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION); + constant("BASISU_DEFAULT_ENDPOINT_RDO_THRESH", BASISU_DEFAULT_ENDPOINT_RDO_THRESH); + constant("BASISU_DEFAULT_SELECTOR_RDO_THRESH", BASISU_DEFAULT_SELECTOR_RDO_THRESH); + constant("BASISU_DEFAULT_QUALITY", BASISU_DEFAULT_QUALITY); + constant("BASISU_DEFAULT_HYBRID_SEL_CB_QUALITY_THRESH", BASISU_DEFAULT_HYBRID_SEL_CB_QUALITY_THRESH); + constant("BASISU_MAX_IMAGE_DIMENSION", BASISU_MAX_IMAGE_DIMENSION); + constant("BASISU_QUALITY_MIN", BASISU_QUALITY_MIN); + constant("BASISU_QUALITY_MAX", BASISU_QUALITY_MAX); + constant("BASISU_MAX_ENDPOINT_CLUSTERS", BASISU_MAX_ENDPOINT_CLUSTERS); + constant("BASISU_MAX_SELECTOR_CLUSTERS", BASISU_MAX_SELECTOR_CLUSTERS); + constant("BASISU_MAX_SLICES", BASISU_MAX_SLICES); + constant("BASISU_RDO_UASTC_DICT_SIZE_DEFAULT", BASISU_RDO_UASTC_DICT_SIZE_DEFAULT); + constant("BASISU_RDO_UASTC_DICT_SIZE_MIN", BASISU_RDO_UASTC_DICT_SIZE_MIN); + constant("BASISU_RDO_UASTC_DICT_SIZE_MAX", BASISU_RDO_UASTC_DICT_SIZE_MAX); + constant("BASISU_MAX_RESAMPLER_FILTERS", g_num_resample_filters); + constant("BASISU_DEFAULT_COMPRESSION_LEVEL", BASISU_DEFAULT_COMPRESSION_LEVEL); + constant("BASISU_MAX_COMPRESSION_LEVEL", BASISU_MAX_COMPRESSION_LEVEL); + + // The maximum representable floating point value in a UASTC HDR texture (any larger values will get clamped and a warning issued). + constant("ASTC_HDR_MAX_VAL", basist::ASTC_HDR_MAX_VAL); + + constant("cPackUASTCLevelFastest", cPackUASTCLevelFastest); + constant("cPackUASTCLevelFaster", cPackUASTCLevelFaster); + constant("cPackUASTCLevelDefault", cPackUASTCLevelDefault); + constant("cPackUASTCLevelSlower", cPackUASTCLevelSlower); + constant("cPackUASTCLevelVerySlow", cPackUASTCLevelVerySlow); + constant("cPackUASTCLevelMask", cPackUASTCLevelMask); + constant("cPackUASTCFavorUASTCError", cPackUASTCFavorUASTCError); + constant("cPackUASTCFavorBC7Error", cPackUASTCFavorBC7Error); + constant("cPackUASTCETC1FasterHints", cPackUASTCETC1FasterHints); + constant("cPackUASTCETC1FastestHints", cPackUASTCETC1FastestHints); + constant("cPackUASTCETC1DisableFlipAndIndividual", cPackUASTCETC1DisableFlipAndIndividual); + + constant("UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO", UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO); + constant("UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH", UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH); - constant("BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION", BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION); - constant("BASISU_DEFAULT_ENDPOINT_RDO_THRESH", BASISU_DEFAULT_ENDPOINT_RDO_THRESH); - constant("BASISU_DEFAULT_SELECTOR_RDO_THRESH", BASISU_DEFAULT_SELECTOR_RDO_THRESH); - constant("BASISU_DEFAULT_QUALITY", BASISU_DEFAULT_QUALITY); - constant("BASISU_DEFAULT_HYBRID_SEL_CB_QUALITY_THRESH", BASISU_DEFAULT_HYBRID_SEL_CB_QUALITY_THRESH); - constant("BASISU_MAX_IMAGE_DIMENSION", BASISU_MAX_IMAGE_DIMENSION); - constant("BASISU_QUALITY_MIN", BASISU_QUALITY_MIN); - constant("BASISU_QUALITY_MAX", BASISU_QUALITY_MAX); - constant("BASISU_MAX_ENDPOINT_CLUSTERS", BASISU_MAX_ENDPOINT_CLUSTERS); - constant("BASISU_MAX_SELECTOR_CLUSTERS", BASISU_MAX_SELECTOR_CLUSTERS); - constant("BASISU_MAX_SLICES", BASISU_MAX_SLICES); - constant("BASISU_RDO_UASTC_DICT_SIZE_DEFAULT", BASISU_RDO_UASTC_DICT_SIZE_DEFAULT); - constant("BASISU_RDO_UASTC_DICT_SIZE_MIN", BASISU_RDO_UASTC_DICT_SIZE_MIN); - constant("BASISU_RDO_UASTC_DICT_SIZE_MAX", BASISU_RDO_UASTC_DICT_SIZE_MAX); - constant("BASISU_MAX_RESAMPLER_FILTERS", g_num_resample_filters); - constant("BASISU_DEFAULT_COMPRESSION_LEVEL", BASISU_DEFAULT_COMPRESSION_LEVEL); - constant("BASISU_MAX_COMPRESSION_LEVEL", BASISU_MAX_COMPRESSION_LEVEL); - - constant("cPackUASTCLevelFastest", cPackUASTCLevelFastest); - constant("cPackUASTCLevelFaster", cPackUASTCLevelFaster); - constant("cPackUASTCLevelDefault", cPackUASTCLevelDefault); - constant("cPackUASTCLevelSlower", cPackUASTCLevelSlower); - constant("cPackUASTCLevelVerySlow", cPackUASTCLevelVerySlow); - constant("cPackUASTCLevelMask", cPackUASTCLevelMask); - constant("cPackUASTCFavorUASTCError", cPackUASTCFavorUASTCError); - constant("cPackUASTCFavorBC7Error", cPackUASTCFavorBC7Error); - constant("cPackUASTCETC1FasterHints", cPackUASTCETC1FasterHints); - constant("cPackUASTCETC1FastestHints", cPackUASTCETC1FastestHints); - constant("cPackUASTCETC1DisableFlipAndIndividual", cPackUASTCETC1DisableFlipAndIndividual); - - constant("UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO", UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO); - constant("UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH", UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH); - + enum_("hdr_image_type") + .value("cHITRGBAHalfFloat", hdr_image_type::cHITRGBAHalfFloat) + .value("cHITRGBAFloat", hdr_image_type::cHITRGBAFloat) + .value("cHITPNGImage", hdr_image_type::cHITPNGImage) + .value("cHITEXRImage", hdr_image_type::cHITEXRImage) + .value("cHITHDRImage", hdr_image_type::cHITHDRImage) + ; + // Compression/encoding object. // You create this object, call the set() methods to fill in the parameters/source images/options, call encode(), and you get back a .basis or .KTX2 file. // You can call .encode() multiple times, changing the parameters/options in between calls. // By default this class encodes to .basis, but call setCreateKTX2File() with true to get .KTX2 files. class_("BasisEncoder") - .constructor<>() + .constructor<>() - // Compresses the provided source slice(s) to an output .basis file. - // At the minimum, you must provided at least 1 source slice by calling setSliceSourceImage() before calling this method. - .function("encode", optional_override([](basis_encoder& self, const emscripten::val& dst_basis_file_js_val) { - return self.encode(dst_basis_file_js_val); - })) + // Compresses the provided source slice(s) to an output .basis file. + // At the minimum, you must provided at least 1 source slice by calling setSliceSourceImage() or setSliceSourceImageHDR() (for UASTC HDR) before calling this method. + .function("encode", optional_override([](basis_encoder& self, const emscripten::val& dst_basis_file_js_val) { + return self.encode(dst_basis_file_js_val); + })) - // Sets the slice's source image, either from a PNG file or from a raw 32-bit RGBA raster image. - // If the input is a raster image, the buffer must be width*height*4 bytes in size. The raster image is stored in top down scanline order. - // The first texel is the top-left texel. The texel byte order in memory is R,G,B,A (R first at offset 0, A last at offset 3). - // slice_index is the slice to change. Valid range is [0,BASISU_MAX_SLICES-1]. - .function("setSliceSourceImage", optional_override([](basis_encoder& self, uint32_t slice_index, const emscripten::val& src_image_js_val, uint32_t width, uint32_t height, bool src_image_is_png) { - return self.set_slice_source_image(slice_index, src_image_js_val, width, height, src_image_is_png); - })) + // Sets the slice's source image, either from a PNG file or from a raw 32-bit RGBA raster image. + // If the input is a raster image, the buffer must be width*height*4 bytes in size. The raster image is stored in top down scanline order. + // The first texel is the top-left texel. The texel byte order in memory is R,G,B,A (R first at offset 0, A last at offset 3). + // slice_index is the slice to change. Valid range is [0,BASISU_MAX_SLICES-1]. + .function("setSliceSourceImage", optional_override([](basis_encoder& self, uint32_t slice_index, const emscripten::val& src_image_js_val, uint32_t width, uint32_t height, bool src_image_is_png) { + return self.set_slice_source_image(slice_index, src_image_js_val, width, height, src_image_is_png); + })) + + .function("setSliceSourceImageHDR", optional_override([](basis_encoder& self, uint32_t slice_index, const emscripten::val& src_image_js_val, uint32_t width, uint32_t height, uint32_t img_type, bool ldr_srgb_to_linear_conversion) { + return self.set_slice_source_image_hdr(slice_index, src_image_js_val, width, height, (hdr_image_type)img_type, ldr_srgb_to_linear_conversion); + })) - // If true, the encoder will output a UASTC texture, otherwise a ETC1S texture. - .function("setUASTC", optional_override([](basis_encoder& self, bool uastc_flag) { - self.m_params.m_uastc = uastc_flag; - })) + // If true, the encoder will output a UASTC texture, otherwise a ETC1S texture. + .function("setUASTC", optional_override([](basis_encoder& self, bool uastc_flag) { + self.m_params.m_uastc = uastc_flag; + })) + + // If true, the encoder will output a UASTC HDR texture, otherwise it works in the default LDR mode. + .function("setHDR", optional_override([](basis_encoder& self, bool hdr_flag) { + self.m_params.m_hdr = hdr_flag; + })) - // If true the source images will be Y flipped before compression. - .function("setYFlip", optional_override([](basis_encoder& self, bool y_flip_flag) { - self.m_params.m_y_flip = y_flip_flag; - })) + // Sets the quality vs. encoder performance tradeoff (0-4, default is 1). Higher=slower but better quality. + .function("setUASTCHDRQualityLevel", optional_override([](basis_encoder& self, int level) { + assert((level >= astc_hdr_codec_options::cMinLevel) && (level <= astc_hdr_codec_options::cMaxLevel)); + self.m_params.m_uastc_hdr_options.set_quality_level(level); + })) - // Enables debug output to stdout - .function("setDebug", optional_override([](basis_encoder& self, bool debug_flag) { - self.m_params.m_debug = debug_flag; - g_debug_printf = debug_flag; - })) - - // If true, the input is assumed to be in sRGB space. Be sure to set this correctly! (Examples: True on photos, albedo/spec maps, and false on normal maps.) - .function("setPerceptual", optional_override([](basis_encoder& self, bool perceptual_flag) { - self.m_params.m_perceptual = perceptual_flag; - })) - - // Check source images for active/used alpha channels - .function("setCheckForAlpha", optional_override([](basis_encoder& self, bool check_for_alpha_flag) { - self.m_params.m_check_for_alpha = check_for_alpha_flag; - })) - - // Fource output .basis file to have an alpha channel - .function("setForceAlpha", optional_override([](basis_encoder& self, bool force_alpha_flag) { - self.m_params.m_force_alpha = force_alpha_flag; - })) - - // Set source image component swizzle. - // r,g,b,a - valid range is [0,3] - .function("setSwizzle", optional_override([](basis_encoder& self, uint32_t r, uint32_t g, uint32_t b, uint32_t a) { - assert((r < 4) && (g < 4) && (b < 4) && (a < 4)); - self.m_params.m_swizzle[0] = (char)r; - self.m_params.m_swizzle[1] = (char)g; - self.m_params.m_swizzle[2] = (char)b; - self.m_params.m_swizzle[3] = (char)a; - })) - - // If true, the input is assumed to be a normal map, and all source texels will be renormalized before encoding. - .function("setRenormalize", optional_override([](basis_encoder& self, bool renormalize_flag) { - self.m_params.m_renormalize = renormalize_flag; - })) - - // Sets the max # of endpoint clusters for ETC1S mode. Use instead of setQualityLevel. - // Default is 512, range is [1,BASISU_MAX_ENDPOINT_CLUSTERS] - .function("setMaxEndpointClusters", optional_override([](basis_encoder& self, uint32_t max_endpoint_clusters) { - assert(max_endpoint_clusters <= BASISU_MAX_ENDPOINT_CLUSTERS); - self.m_params.m_max_endpoint_clusters = max_endpoint_clusters; - })) - - // Sets the max # of selectors clusters for ETC1S mode. Use instead of setQualityLevel. - // Default is 512, range is [1,BASISU_MAX_ENDPOINT_CLUSTERS] - .function("setMaxSelectorClusters", optional_override([](basis_encoder& self, uint32_t max_selector_clusters) { - assert(max_selector_clusters <= BASISU_MAX_SELECTOR_CLUSTERS); - self.m_params.m_max_selector_clusters = max_selector_clusters; - })) - - // Sets the ETC1S encoder's quality level, which controls the file size vs. quality tradeoff. - // Default is -1 (meaning unused - the compressor will use m_max_endpoint_clusters/m_max_selector_clusters instead to control the codebook sizes). - // Range is [1,BASISU_QUALITY_MAX] - .function("setQualityLevel", optional_override([](basis_encoder& self, int quality_level) { - assert(quality_level >= -1 && quality_level <= BASISU_QUALITY_MAX); - self.m_params.m_quality_level = quality_level; - })) + // If true the source images will be Y flipped before compression. + .function("setYFlip", optional_override([](basis_encoder& self, bool y_flip_flag) { + self.m_params.m_y_flip = y_flip_flag; + })) - // The compression_level parameter controls the encoder perf vs. file size tradeoff for ETC1S files. - // It does not directly control file size vs. quality - see quality_level(). - // Default is BASISU_DEFAULT_COMPRESSION_LEVEL, range is [0,BASISU_MAX_COMPRESSION_LEVEL] - .function("setCompressionLevel", optional_override([](basis_encoder& self, int comp_level) { - assert(comp_level >= 0 && comp_level <= BASISU_MAX_COMPRESSION_LEVEL); - self.m_params.m_compression_level = comp_level; - })) - - // setNormalMapMode is the same as the basisu.exe "-normal_map" option. It tunes several codec parameters so compression works better on normal maps. - .function("setNormalMap", optional_override([](basis_encoder& self) { - self.m_params.m_perceptual = false; - self.m_params.m_mip_srgb = false; - self.m_params.m_no_selector_rdo = true; - self.m_params.m_no_endpoint_rdo = true; - })) - - // Sets selector RDO threshold - // Default is BASISU_DEFAULT_SELECTOR_RDO_THRESH, range is [0,1e+10] - .function("setSelectorRDOThresh", optional_override([](basis_encoder& self, float selector_rdo_thresh) { - self.m_params.m_selector_rdo_thresh = selector_rdo_thresh; - })) - - // Sets endpoint RDO threshold - // Default is BASISU_DEFAULT_ENDPOINT_RDO_THRESH, range is [0,1e+10] - .function("setEndpointRDOThresh", optional_override([](basis_encoder& self, float endpoint_rdo_thresh) { - self.m_params.m_endpoint_rdo_thresh = endpoint_rdo_thresh; - })) + // Enables debug output to stdout + .function("setDebug", optional_override([](basis_encoder& self, bool debug_flag) { + self.m_params.m_debug = debug_flag; + g_debug_printf = debug_flag; + })) + + // If true, the input is assumed to be in sRGB space. Be sure to set this correctly! (Examples: True on photos, albedo/spec maps, and false on normal maps.) + // In HDR mode, if perceptual is true R and G are weighted higher (2.0, 3.0) than B (1.0). Otherwise the encoder uses equal weightings for each channel. + .function("setPerceptual", optional_override([](basis_encoder& self, bool perceptual_flag) { + self.m_params.m_perceptual = perceptual_flag; + })) + + // Check source images for active/used alpha channels + .function("setCheckForAlpha", optional_override([](basis_encoder& self, bool check_for_alpha_flag) { + self.m_params.m_check_for_alpha = check_for_alpha_flag; + })) + + // Fource output .basis/.ktx2 file to have an alpha channel + .function("setForceAlpha", optional_override([](basis_encoder& self, bool force_alpha_flag) { + self.m_params.m_force_alpha = force_alpha_flag; + })) + + // Set source image component swizzle. + // r,g,b,a - valid range is [0,3] + .function("setSwizzle", optional_override([](basis_encoder& self, uint32_t r, uint32_t g, uint32_t b, uint32_t a) { + assert((r < 4) && (g < 4) && (b < 4) && (a < 4)); + self.m_params.m_swizzle[0] = (char)r; + self.m_params.m_swizzle[1] = (char)g; + self.m_params.m_swizzle[2] = (char)b; + self.m_params.m_swizzle[3] = (char)a; + })) + + // If true, the input is assumed to be a normal map, and all source texels will be renormalized before encoding. + .function("setRenormalize", optional_override([](basis_encoder& self, bool renormalize_flag) { + self.m_params.m_renormalize = renormalize_flag; + })) + + // Sets the max # of endpoint clusters for ETC1S mode. Use instead of setQualityLevel. + // Default is 512, range is [1,BASISU_MAX_ENDPOINT_CLUSTERS] + .function("setMaxEndpointClusters", optional_override([](basis_encoder& self, uint32_t max_endpoint_clusters) { + assert(max_endpoint_clusters <= BASISU_MAX_ENDPOINT_CLUSTERS); + self.m_params.m_max_endpoint_clusters = max_endpoint_clusters; + })) + + // Sets the max # of selectors clusters for ETC1S mode. Use instead of setQualityLevel. + // Default is 512, range is [1,BASISU_MAX_ENDPOINT_CLUSTERS] + .function("setMaxSelectorClusters", optional_override([](basis_encoder& self, uint32_t max_selector_clusters) { + assert(max_selector_clusters <= BASISU_MAX_SELECTOR_CLUSTERS); + self.m_params.m_max_selector_clusters = max_selector_clusters; + })) + + // Sets the ETC1S encoder's quality level, which controls the file size vs. quality tradeoff. + // Default is -1 (meaning unused - the compressor will use m_max_endpoint_clusters/m_max_selector_clusters instead to control the codebook sizes). + // Range is [1,BASISU_QUALITY_MAX] + .function("setQualityLevel", optional_override([](basis_encoder& self, int quality_level) { + assert(quality_level >= -1 && quality_level <= BASISU_QUALITY_MAX); + self.m_params.m_quality_level = quality_level; + })) + + // The compression_level parameter controls the encoder perf vs. file size tradeoff for ETC1S files. + // It does not directly control file size vs. quality - see quality_level(). + // Default is BASISU_DEFAULT_COMPRESSION_LEVEL, range is [0,BASISU_MAX_COMPRESSION_LEVEL] + .function("setCompressionLevel", optional_override([](basis_encoder& self, int comp_level) { + assert(comp_level >= 0 && comp_level <= BASISU_MAX_COMPRESSION_LEVEL); + self.m_params.m_compression_level = comp_level; + })) + + // setNormalMapMode is the same as the basisu.exe "-normal_map" option. It tunes several codec parameters so compression works better on normal maps. + .function("setNormalMap", optional_override([](basis_encoder& self) { + self.m_params.m_perceptual = false; + self.m_params.m_mip_srgb = false; + self.m_params.m_no_selector_rdo = true; + self.m_params.m_no_endpoint_rdo = true; + })) + + // Sets selector RDO threshold + // Default is BASISU_DEFAULT_SELECTOR_RDO_THRESH, range is [0,1e+10] + .function("setSelectorRDOThresh", optional_override([](basis_encoder& self, float selector_rdo_thresh) { + self.m_params.m_selector_rdo_thresh = selector_rdo_thresh; + })) + + // Sets endpoint RDO threshold + // Default is BASISU_DEFAULT_ENDPOINT_RDO_THRESH, range is [0,1e+10] + .function("setEndpointRDOThresh", optional_override([](basis_encoder& self, float endpoint_rdo_thresh) { + self.m_params.m_endpoint_rdo_thresh = endpoint_rdo_thresh; + })) #if BASISD_SUPPORT_KTX2 - // --- KTX2 related options - // - // Create .KTX2 files instead of .basis files. By default this is FALSE. - .function("setCreateKTX2File", optional_override([](basis_encoder& self, bool create_ktx2_file) { - self.m_params.m_create_ktx2_file = create_ktx2_file; - })) + // --- KTX2 related options + // + // Create .KTX2 files instead of .basis files. By default this is FALSE. + .function("setCreateKTX2File", optional_override([](basis_encoder& self, bool create_ktx2_file) { + self.m_params.m_create_ktx2_file = create_ktx2_file; + })) - // KTX2: Use UASTC Zstandard supercompression. Defaults to disabled or KTX2_SS_NONE. - .function("setKTX2UASTCSupercompression", optional_override([](basis_encoder& self, bool use_zstandard) { - self.m_params.m_ktx2_uastc_supercompression = use_zstandard ? basist::KTX2_SS_ZSTANDARD : basist::KTX2_SS_NONE; - })) + // KTX2: Use UASTC Zstandard supercompression. Defaults to disabled or KTX2_SS_NONE. + .function("setKTX2UASTCSupercompression", optional_override([](basis_encoder& self, bool use_zstandard) { + self.m_params.m_ktx2_uastc_supercompression = use_zstandard ? basist::KTX2_SS_ZSTANDARD : basist::KTX2_SS_NONE; + })) - // KTX2: Use sRGB transfer func in the file's DFD. Default is FALSE. This should very probably match the "perceptual" setting. - .function("setKTX2SRGBTransferFunc", optional_override([](basis_encoder& self, bool srgb_transfer_func) { - self.m_params.m_ktx2_srgb_transfer_func = srgb_transfer_func; - })) + // KTX2: Use sRGB transfer func in the file's DFD. Default is FALSE. This should very probably match the "perceptual" setting. + .function("setKTX2SRGBTransferFunc", optional_override([](basis_encoder& self, bool srgb_transfer_func) { + self.m_params.m_ktx2_srgb_transfer_func = srgb_transfer_func; + })) - // TODO: Expose KTX2 key value array, other options to JavaScript. See encoder/basisu_comp.h. + // TODO: Expose KTX2 key value array, other options to JavaScript. See encoder/basisu_comp.h. #endif - - // --- Mip-map options - - // If true mipmaps will be generated from the source images - .function("setMipGen", optional_override([](basis_encoder& self, bool mip_gen_flag) { - self.m_params.m_mip_gen = mip_gen_flag; - })) - - // Set mipmap filter's scale factor - // default is 1, range is [.000125, 4.0] - .function("setMipScale", optional_override([](basis_encoder& self, float mip_scale) { - self.m_params.m_mip_scale = mip_scale; - })) - - // Sets the mipmap filter to apply - // mip_filter must be < BASISU_MAX_RESAMPLER_FILTERS - // See the end of basisu_resample_filters.cpp: g_resample_filters[] - .function("setMipFilter", optional_override([](basis_encoder& self, uint32_t mip_filter) { - assert(mip_filter < g_num_resample_filters); - if (mip_filter < g_num_resample_filters) - self.m_params.m_mip_filter = g_resample_filters[mip_filter].name; - })) - - // If true mipmap filtering occurs in sRGB space - this generally should match the perceptual parameter. - .function("setMipSRGB", optional_override([](basis_encoder& self, bool mip_srgb_flag) { - self.m_params.m_mip_srgb = mip_srgb_flag; - })) - - // If true, the input is assumed to be a normal map, and the texels of each mipmap will be renormalized before encoding. - .function("setMipRenormalize", optional_override([](basis_encoder& self, bool mip_renormalize_flag) { - self.m_params.m_mip_renormalize = mip_renormalize_flag; - })) - - // If true the source texture will be sampled using wrap addressing during mipmap generation, otherwise clamp. - .function("setMipWrapping", optional_override([](basis_encoder& self, bool mip_wrapping_flag) { - self.m_params.m_mip_wrapping = mip_wrapping_flag; - })) - // Sets the mipmap generator's smallest allowed dimension. - // default is 1, range is [1,16384] - .function("setMipSmallestDimension", optional_override([](basis_encoder& self, int mip_smallest_dimension) { - self.m_params.m_mip_smallest_dimension = mip_smallest_dimension; - })) + // --- Mip-map options - // Sets the .basis texture type. - // cBASISTexTypeVideoFrames changes the encoder into video mode. - // tex_type is enum basis_texture_type - // default is cBASISTexType2D - .function("setTexType", optional_override([](basis_encoder& self, uint32_t tex_type) { - assert(tex_type < cBASISTexTypeTotal); - self.m_params.m_tex_type = (basist::basis_texture_type)tex_type; - })) - - .function("setUserData0", optional_override([](basis_encoder& self, uint32_t userdata0) { - self.m_params.m_userdata0 = userdata0; - })) - - .function("setUserData1", optional_override([](basis_encoder& self, uint32_t userdata1) { - self.m_params.m_userdata1 = userdata1; - })) + // If true mipmaps will be generated from the source images + .function("setMipGen", optional_override([](basis_encoder& self, bool mip_gen_flag) { + self.m_params.m_mip_gen = mip_gen_flag; + })) - // UASTC specific flags. + // Set mipmap filter's scale factor + // default is 1, range is [.000125, 4.0] + .function("setMipScale", optional_override([](basis_encoder& self, float mip_scale) { + self.m_params.m_mip_scale = mip_scale; + })) - // Sets the UASTC encoding performance vs. quality tradeoff, and other lesser used UASTC encoder flags. - // This is a combination of flags. See cPackUASTCLevelDefault, etc. - .function("setPackUASTCFlags", optional_override([](basis_encoder& self, uint32_t pack_uastc_flags) { - assert((pack_uastc_flags & cPackUASTCLevelMask) >= cPackUASTCLevelFastest); - assert((pack_uastc_flags & cPackUASTCLevelMask) <= cPackUASTCLevelVerySlow); - self.m_params.m_pack_uastc_flags = pack_uastc_flags; - })) + // Sets the mipmap filter to apply + // mip_filter must be < BASISU_MAX_RESAMPLER_FILTERS + // See the end of basisu_resample_filters.cpp: g_resample_filters[] + .function("setMipFilter", optional_override([](basis_encoder& self, uint32_t mip_filter) { + assert(mip_filter < g_num_resample_filters); + if (mip_filter < g_num_resample_filters) + self.m_params.m_mip_filter = g_resample_filters[mip_filter].name; + })) - // If true, the RDO post-processor will be applied to the encoded UASTC texture data. - .function("setRDOUASTC", optional_override([](basis_encoder& self, bool rdo_uastc) { - self.m_params.m_rdo_uastc = rdo_uastc; - })) - - // Default is 1.0 range is [0.001, 10.0] - .function("setRDOUASTCQualityScalar", optional_override([](basis_encoder& self, float rdo_quality) { - self.m_params.m_rdo_uastc_quality_scalar = rdo_quality; - })) + // If true mipmap filtering occurs in sRGB space - this generally should match the perceptual parameter. + .function("setMipSRGB", optional_override([](basis_encoder& self, bool mip_srgb_flag) { + self.m_params.m_mip_srgb = mip_srgb_flag; + })) + + // If true, the input is assumed to be a normal map, and the texels of each mipmap will be renormalized before encoding. + .function("setMipRenormalize", optional_override([](basis_encoder& self, bool mip_renormalize_flag) { + self.m_params.m_mip_renormalize = mip_renormalize_flag; + })) + + // If true the source texture will be sampled using wrap addressing during mipmap generation, otherwise clamp. + .function("setMipWrapping", optional_override([](basis_encoder& self, bool mip_wrapping_flag) { + self.m_params.m_mip_wrapping = mip_wrapping_flag; + })) + + // Sets the mipmap generator's smallest allowed dimension. + // default is 1, range is [1,16384] + .function("setMipSmallestDimension", optional_override([](basis_encoder& self, int mip_smallest_dimension) { + self.m_params.m_mip_smallest_dimension = mip_smallest_dimension; + })) + + // Sets the .basis texture type. + // cBASISTexTypeVideoFrames changes the encoder into video mode. + // tex_type is enum basis_texture_type + // default is cBASISTexType2D + .function("setTexType", optional_override([](basis_encoder& self, uint32_t tex_type) { + assert(tex_type < cBASISTexTypeTotal); + self.m_params.m_tex_type = (basist::basis_texture_type)tex_type; + })) + + .function("setUserData0", optional_override([](basis_encoder& self, uint32_t userdata0) { + self.m_params.m_userdata0 = userdata0; + })) + + .function("setUserData1", optional_override([](basis_encoder& self, uint32_t userdata1) { + self.m_params.m_userdata1 = userdata1; + })) + + // UASTC specific flags. + + // Sets the UASTC encoding performance vs. quality tradeoff, and other lesser used UASTC encoder flags. + // This is a combination of flags. See cPackUASTCLevelDefault, etc. + .function("setPackUASTCFlags", optional_override([](basis_encoder& self, uint32_t pack_uastc_flags) { + assert((pack_uastc_flags & cPackUASTCLevelMask) >= cPackUASTCLevelFastest); + assert((pack_uastc_flags & cPackUASTCLevelMask) <= cPackUASTCLevelVerySlow); + self.m_params.m_pack_uastc_flags = pack_uastc_flags; + })) + + // If true, the RDO post-processor will be applied to the encoded UASTC texture data. + .function("setRDOUASTC", optional_override([](basis_encoder& self, bool rdo_uastc) { + self.m_params.m_rdo_uastc = rdo_uastc; + })) + + // Default is 1.0 range is [0.001, 10.0] + .function("setRDOUASTCQualityScalar", optional_override([](basis_encoder& self, float rdo_quality) { + self.m_params.m_rdo_uastc_quality_scalar = rdo_quality; + })) // Default is BASISU_RDO_UASTC_DICT_SIZE_DEFAULT, range is [BASISU_RDO_UASTC_DICT_SIZE_MIN, BASISU_RDO_UASTC_DICT_SIZE_MAX] - .function("setRDOUASTCDictSize", optional_override([](basis_encoder& self, int dict_size) { - assert((dict_size >= BASISU_RDO_UASTC_DICT_SIZE_MIN) && (dict_size <= BASISU_RDO_UASTC_DICT_SIZE_MAX)); - self.m_params.m_rdo_uastc_dict_size = dict_size; - })) + .function("setRDOUASTCDictSize", optional_override([](basis_encoder& self, int dict_size) { + assert((dict_size >= BASISU_RDO_UASTC_DICT_SIZE_MIN) && (dict_size <= BASISU_RDO_UASTC_DICT_SIZE_MAX)); + self.m_params.m_rdo_uastc_dict_size = dict_size; + })) // Default is UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO, range is [01, 100.0] - .function("setRDOUASTCMaxAllowedRMSIncreaseRatio", optional_override([](basis_encoder& self, float rdo_uastc_max_allowed_rms_increase_ratio) { - self.m_params.m_rdo_uastc_max_allowed_rms_increase_ratio = rdo_uastc_max_allowed_rms_increase_ratio; - })) + .function("setRDOUASTCMaxAllowedRMSIncreaseRatio", optional_override([](basis_encoder& self, float rdo_uastc_max_allowed_rms_increase_ratio) { + self.m_params.m_rdo_uastc_max_allowed_rms_increase_ratio = rdo_uastc_max_allowed_rms_increase_ratio; + })) - // Default is UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH, range is [.01f, 100.0f] - .function("setRDOUASTCSkipBlockRMSThresh", optional_override([](basis_encoder& self, float rdo_uastc_skip_block_rms_thresh) { - self.m_params.m_rdo_uastc_skip_block_rms_thresh = rdo_uastc_skip_block_rms_thresh; - })) - - // --- Low level options - - // Disables selector RDO - .function("setNoSelectorRDO", optional_override([](basis_encoder& self, bool no_selector_rdo_flag) { - self.m_params.m_no_selector_rdo = no_selector_rdo_flag; - })) - - // Disables endpoint RDO - .function("setNoEndpointRDO", optional_override([](basis_encoder& self, bool no_endpoint_rdo_flag) { - self.m_params.m_no_endpoint_rdo = no_endpoint_rdo_flag; - })) - - // Display output PSNR statistics - .function("setComputeStats", optional_override([](basis_encoder& self, bool compute_stats_flag) { - self.m_params.m_compute_stats = compute_stats_flag; - })) + // Default is UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH, range is [.01f, 100.0f] + .function("setRDOUASTCSkipBlockRMSThresh", optional_override([](basis_encoder& self, float rdo_uastc_skip_block_rms_thresh) { + self.m_params.m_rdo_uastc_skip_block_rms_thresh = rdo_uastc_skip_block_rms_thresh; + })) - // Write output .PNG files for debugging - .function("setDebugImages", optional_override([](basis_encoder& self, bool debug_images_flag) { - self.m_params.m_debug_images = debug_images_flag; - })) + // --- Low level options + + // Disables selector RDO + .function("setNoSelectorRDO", optional_override([](basis_encoder& self, bool no_selector_rdo_flag) { + self.m_params.m_no_selector_rdo = no_selector_rdo_flag; + })) + + // Disables endpoint RDO + .function("setNoEndpointRDO", optional_override([](basis_encoder& self, bool no_endpoint_rdo_flag) { + self.m_params.m_no_endpoint_rdo = no_endpoint_rdo_flag; + })) + + // Display output PSNR statistics + .function("setComputeStats", optional_override([](basis_encoder& self, bool compute_stats_flag) { + self.m_params.m_compute_stats = compute_stats_flag; + })) + + // Write output .PNG files for debugging + .function("setDebugImages", optional_override([](basis_encoder& self, bool debug_images_flag) { + self.m_params.m_debug_images = debug_images_flag; + })) ; #endif // BASISU_SUPPORT_ENCODING - + } diff --git a/webgl/transcoder/build/basis_transcoder.js b/webgl/transcoder/build/basis_transcoder.js index b42d977..6f02a4a 100644 --- a/webgl/transcoder/build/basis_transcoder.js +++ b/webgl/transcoder/build/basis_transcoder.js @@ -1,22 +1,19 @@ -var BASIS = (function() { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; +var BASIS = (() => { + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + if (typeof __filename != 'undefined') _scriptName ||= __filename; return ( -function(BASIS) { - BASIS = BASIS || {}; +function(moduleArg = {}) { + var moduleRtn; -var Module=typeof BASIS!=="undefined"?BASIS:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime;if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(typeof WebAssembly!=="object"){err("no native wasm support detected")}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":157,"maximum":157+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0||i==maxBytesToRead/2)return str;++i;str+=String.fromCharCode(codeUnit)}}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var DYNAMIC_BASE=5552064,DYNAMICTOP_PTR=309024;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":2147483648/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_ceil=Math.ceil;var Math_floor=Math.floor;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="basis_transcoder.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}__ATINIT__.push({func:function(){___wasm_call_ctors()}});var structRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>2)+i])}return array}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);var args=[rawConstructor];var destructors=[];whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}destructors.length=0;args.length=argCount;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0||i==length){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(HEAP[currentBytePtr>>shift]==0||i==length){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_methodCallers=[];function __emval_call_void_method(caller,handle,methodName,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);caller(handle,methodName,null,args)}function emval_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i>2)+i],"parameter "+i)}return a}function __emval_get_method_caller(argCount,argTypes){var types=__emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+"_$"+types.slice(1).map(function(t){return t.name}).join("_")+"$";var params=["retType"];var args=[retType];var argsList="";for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}var minHeapSize=16777216;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(minHeapSize,requestedSize,overGrownHeapSize),PAGE_MULTIPLE));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}function _roundf(d){d=+d;return d>=+0?+Math_floor(d+ +.5):+Math_ceil(d-+.5)}function _setTempRet0($i){setTempRet0($i|0)}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var asmLibraryArg={"u":__embind_finalize_value_object,"J":__embind_register_bool,"y":__embind_register_class,"x":__embind_register_class_constructor,"d":__embind_register_class_function,"k":__embind_register_constant,"I":__embind_register_emval,"n":__embind_register_enum,"a":__embind_register_enum_value,"B":__embind_register_float,"i":__embind_register_function,"j":__embind_register_integer,"h":__embind_register_memory_view,"C":__embind_register_std_string,"w":__embind_register_std_wstring,"v":__embind_register_value_object,"c":__embind_register_value_object_field,"K":__embind_register_void,"m":__emval_as,"s":__emval_call_void_method,"b":__emval_decref,"z":__emval_get_global,"t":__emval_get_method_caller,"r":__emval_get_module_property,"e":__emval_get_property,"g":__emval_incref,"q":__emval_new,"f":__emval_new_cstring,"l":__emval_run_destructors,"p":_abort,"F":_emscripten_memcpy_big,"G":_emscripten_resize_heap,"H":_fd_close,"D":_fd_seek,"A":_fd_write,"memory":wasmMemory,"o":_roundf,"E":_setTempRet0,"table":wasmTable};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["L"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["M"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["N"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["O"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["P"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["Q"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["R"]).apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return(dynCall_v=Module["dynCall_v"]=Module["asm"]["S"]).apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return(dynCall_i=Module["dynCall_i"]=Module["asm"]["T"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["U"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["V"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["W"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["X"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["Y"]).apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return(dynCall_iiiiii=Module["dynCall_iiiiii"]=Module["asm"]["Z"]).apply(null,arguments)};var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=function(){return(dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=Module["asm"]["_"]).apply(null,arguments)};var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=function(){return(dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=Module["asm"]["$"]).apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return(dynCall_viiii=Module["dynCall_viiii"]=Module["asm"]["aa"]).apply(null,arguments)};var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=function(){return(dynCall_iiiiiii=Module["dynCall_iiiiiii"]=Module["asm"]["ba"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiiii"]=Module["asm"]["ca"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiiiii"]=Module["asm"]["da"]).apply(null,arguments)};var dynCall_iiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiiiii"]=Module["asm"]["ea"]).apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return(dynCall_viiiii=Module["dynCall_viiiii"]=Module["asm"]["fa"]).apply(null,arguments)};var dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=function(){return(dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=Module["asm"]["ga"]).apply(null,arguments)};var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=function(){return(dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=Module["asm"]["ha"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["ia"]).apply(null,arguments)};var dynCall_viiiiii=Module["dynCall_viiiiii"]=function(){return(dynCall_viiiiii=Module["dynCall_viiiiii"]=Module["asm"]["ja"]).apply(null,arguments)};Module["asm"]=asm;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);var ret=fs.readFileSync(filename);return ret};readAsync=(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return new Promise((resolve,reject)=>{fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)reject(err);else resolve(binary?data.buffer:data)})})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response)}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="basis_transcoder.wasm";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["L"];updateMemoryViews();wasmTable=wasmExports["P"];addOnInit(wasmExports["M"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}get_exception_ptr(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var __abort_js=()=>{abort("")};var structRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function readPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var InternalError;var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}};var __embind_finalize_value_object=structType=>{var reg=structRegistrations[structType];delete structRegistrations[structType];var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var fieldRecords=reg.fields;var fieldTypes=fieldRecords.map(field=>field.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>getterReturnType["fromWireType"](getter(getterContext,ptr)),write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,fromWireType:ptr=>{var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},toWireType:(destructors,o)=>{for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError(`Missing field: "${fieldName}"`)}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:rawDestructor}]})};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{};var embind_init_charCodes=()=>{var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes};var embind_charCodes;var readLatin1String=ptr=>{var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret};var BindingError;var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}return sharedRegisterType(rawType,registeredInstance,options)}var GenericWireTypeSize=8;var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},argPackAdvance:GenericWireTypeSize,readValueFromPointer:function(pointer){return this["fromWireType"](HEAPU8[pointer])},destructorFunction:null})};var shallowCopyInternalPointer=o=>({count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType});var throwInstanceAlreadyDeleted=obj=>{function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")};var finalizationRegistry=false;var detachFinalizer=handle=>{};var runDestructor=$$=>{if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}};var releaseClassHandle=$$=>{$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}};var downcastPointer=(ptr,ptrClass,desiredClass)=>{if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)};var registeredPointers={};var getInheritedInstanceCount=()=>Object.keys(registeredInstances).length;var getLiveInheritedInstances=()=>{var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv};var deletionQueue=[];var flushPendingDeletes=()=>{while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}};var delayFunction;var setDelayFunction=fn=>{delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}};var init_embind=()=>{Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction};var registeredInstances={};var getBasestPointer=(class_,ptr)=>{if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr};var getInheritedInstance=(class_,ptr)=>{ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]};var makeClassHandle=(prototype,record)=>{if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record,writable:true}}))};function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}var attachFinalizer=handle=>{if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)};var init_ClassHandle=()=>{Object.assign(ClassHandle.prototype,{isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;other.$$=other.$$;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right},clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}},delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}},isDeleted(){return!this.$$.ptr},deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}})};function ClassHandle(){}var createNamedFunction=(name,body)=>Object.defineProperty(body,"name",{value:name});var ensureOverloadTable=(proto,methodName,humanName)=>{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}};var char_0=48;var char_9=57;var makeLegalFunctionName=name=>{if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return`_${name}`}return name};function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}var upcastPointer=(ptr,ptrClass,desiredClass)=>{while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr};function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle||!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(()=>clonedHandle["delete"]()));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}var init_RegisteredPointer=()=>{Object.assign(RegisteredPointer.prototype,{getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr},destructor(ptr){this.rawDestructor?.(ptr)},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,fromWireType:RegisteredPointer_fromWireType})};function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistent public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var dynCallLegacy=(sig,ptr,args)=>{sig=sig.replace(/p/g,"i");var f=Module["dynCall_"+sig];return f(ptr,...args)};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var dynCall=(sig,ptr,args=[])=>{if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr)(...args);return rtn};var getDynCaller=(sig,ptr)=>(...args)=>dynCall(sig,ptr,args);var embind__requireFunction=(signature,rawFunction)=>{signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};var extendError=(baseErrorType,errorName)=>{var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return`${this.name}: ${this.message}`}};return errorClass};var UnboundTypeError;var getTypeName=type=>{var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var __embind_register_class=(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor)=>{name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);upcast&&=embind__requireFunction(upcastSignature,upcast);downcast&&=embind__requireFunction(downcastSignature,downcast);rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError(`Cannot construct ${name} due to unbound types`,[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],base=>{base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(name,function(...args){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[args.length];if(undefined===body){throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${args.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`)}return body.apply(this,args)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);if(registeredClass.baseClass){registeredClass.baseClass.__derivedClasses??=[];registeredClass.baseClass.__derivedClasses.push(registeredClass)}var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i>2])}return array};function usesDestructorStack(argTypes){for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns||isAsync?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`constructor ${classType.name}`;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`)}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`,rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf("(");if(argsIndex!==-1){return signature.substr(0,argsIndex)}else{return signature}};var __embind_register_class_function=(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual,isAsync)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);methodName=getFunctionName(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`${classType.name}.${methodName}`;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`,rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context,isAsync);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})};var __embind_register_constant=(name,type,value)=>{name=readLatin1String(name);whenDependentTypesAreResolved([],[type],type=>{type=type[0];Module[name]=type["fromWireType"](value);return[]})};var emval_freelist=[];var emval_handles=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){emval_handles[handle]=undefined;emval_freelist.push(handle)}};var count_emval_handles=()=>emval_handles.length/2-5-emval_freelist.length;var init_emval=()=>{emval_handles.push(0,1,undefined,1,null,1,true,1,false,1);Module["count_emval_handles"]=count_emval_handles};var Emval={toValue:handle=>{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:"emscripten::val",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var enumReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?function(pointer){return this["fromWireType"](HEAP8[pointer])}:function(pointer){return this["fromWireType"](HEAPU8[pointer])};case 2:return signed?function(pointer){return this["fromWireType"](HEAP16[pointer>>1])}:function(pointer){return this["fromWireType"](HEAPU16[pointer>>1])};case 4:return signed?function(pointer){return this["fromWireType"](HEAP32[pointer>>2])}:function(pointer){return this["fromWireType"](HEAPU32[pointer>>2])};default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_enum=(rawType,name,size,isSigned)=>{name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,fromWireType:function(c){return this.constructor.values[c]},toWireType:(destructors,c)=>c.value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:enumReadValueFromPointer(name,size,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)};var requireRegisteredType=(rawType,humanName)=>{var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(`${humanName} has unknown type ${getTypeName(rawType)}`)}return impl};var __embind_register_enum_value=(rawEnumType,name,enumValue)=>{var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(`${enumType.name}_${name}`,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value};var embindRepr=v=>{if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}};var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 8:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:value=>value,toWireType:(destructors,value)=>value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,fromWireType:fromWireType,toWireType:toWireType,argPackAdvance:GenericWireTypeSize,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:decodeMemoryView,argPackAdvance:GenericWireTypeSize,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var __embind_register_std_string=(rawType,name)=>{name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=readLatin1String(name);var decodeString,encodeString,readCharAt,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;readCharAt=pointer=>HEAPU16[pointer>>1]}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;readCharAt=pointer=>HEAPU32[pointer>>2]}registerType(rawType,{name:name,fromWireType:value=>{var length=HEAPU32[value>>2];var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||readCharAt(currentBytePtr)==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_object=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor)=>{structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}};var __embind_register_value_object_field=(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})};var __embind_register_void=(rawType,name)=>{name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,argPackAdvance:0,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var emval_returnValue=(returnType,destructorsRef,handle)=>{var destructors=[];var result=returnType["toWireType"](destructors,handle);if(destructors.length){HEAPU32[destructorsRef>>2]=Emval.toHandle(destructors)}return result};var __emval_as=(handle,returnType,destructorsRef)=>{handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,"emval::as");return emval_returnValue(returnType,destructorsRef,handle)};var emval_methodCallers=[];var __emval_call=(caller,handle,destructorsRef,args)=>{caller=emval_methodCallers[caller];handle=Emval.toValue(handle);return caller(null,handle,destructorsRef,args)};var emval_symbols={};var getStringOrSymbol=address=>{var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol};var __emval_call_method=(caller,objHandle,methodName,destructorsRef,args)=>{caller=emval_methodCallers[caller];objHandle=Emval.toValue(objHandle);methodName=getStringOrSymbol(methodName);return caller(objHandle,objHandle[methodName],destructorsRef,args)};var emval_get_global=()=>{if(typeof globalThis=="object"){return globalThis}return function(){return Function}()("return this")()};var __emval_get_global=name=>{if(name===0){return Emval.toHandle(emval_get_global())}else{name=getStringOrSymbol(name);return Emval.toHandle(emval_get_global()[name])}};var emval_addMethodCaller=caller=>{var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id};var emval_lookupTypes=(argCount,argTypes)=>{var a=new Array(argCount);for(var i=0;i>2],"parameter "+i)}return a};var reflectConstruct=Reflect.construct;var __emval_get_method_caller=(argCount,argTypes,kind)=>{var types=emval_lookupTypes(argCount,argTypes);var retType=types.shift();argCount--;var functionBody=`return function (obj, func, destructorsRef, args) {\n`;var offset=0;var argsList=[];if(kind===0){argsList.push("obj")}var params=["retType"];var args=[retType];for(var i=0;it.name).join(", ")}) => ${retType.name}>`;return emval_addMethodCaller(createNamedFunction(functionName,invokerFunction))};var __emval_get_module_property=name=>{name=getStringOrSymbol(name);return Emval.toHandle(Module[name])};var __emval_get_property=(handle,key)=>{handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])};var __emval_incref=handle=>{if(handle>9){emval_handles[handle+1]+=1}};var __emval_new_cstring=v=>Emval.toHandle(getStringOrSymbol(v));var __emval_run_destructors=handle=>{var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)};var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var _fd_close=fd=>52;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};InternalError=Module["InternalError"]=class InternalError extends Error{constructor(message){super(message);this.name="InternalError"}};embind_init_charCodes();BindingError=Module["BindingError"]=class BindingError extends Error{constructor(message){super(message);this.name="BindingError"}};init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var wasmImports={K:___cxa_throw,G:__abort_js,s:__embind_finalize_value_object,C:__embind_register_bigint,I:__embind_register_bool,w:__embind_register_class,v:__embind_register_class_constructor,d:__embind_register_class_function,m:__embind_register_constant,H:__embind_register_emval,o:__embind_register_enum,a:__embind_register_enum_value,A:__embind_register_float,i:__embind_register_function,l:__embind_register_integer,f:__embind_register_memory_view,z:__embind_register_std_string,u:__embind_register_std_wstring,t:__embind_register_value_object,c:__embind_register_value_object_field,J:__embind_register_void,F:__emscripten_memcpy_js,n:__emval_as,q:__emval_call,p:__emval_call_method,b:__emval_decref,x:__emval_get_global,j:__emval_get_method_caller,r:__emval_get_module_property,g:__emval_get_property,k:__emval_incref,h:__emval_new_cstring,e:__emval_run_destructors,D:_emscripten_resize_heap,E:_fd_close,B:_fd_seek,y:_fd_write};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["M"])();var ___getTypeName=a0=>(___getTypeName=wasmExports["N"])(a0);var _malloc=a0=>(_malloc=wasmExports["O"])(a0);var _free=a0=>(_free=wasmExports["Q"])(a0);var ___cxa_is_pointer_type=a0=>(___cxa_is_pointer_type=wasmExports["R"])(a0);var dynCall_jiji=Module["dynCall_jiji"]=(a0,a1,a2,a3,a4)=>(dynCall_jiji=Module["dynCall_jiji"]=wasmExports["S"])(a0,a1,a2,a3,a4);var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; - return BASIS.ready + return moduleRtn; } ); })(); if (typeof exports === 'object' && typeof module === 'object') - module.exports = BASIS; - else if (typeof define === 'function' && define['amd']) - define([], function() { return BASIS; }); - else if (typeof exports === 'object') - exports["BASIS"] = BASIS; - \ No newline at end of file + module.exports = BASIS; +else if (typeof define === 'function' && define['amd']) + define([], () => BASIS); diff --git a/webgl/transcoder/build/basis_transcoder.wasm b/webgl/transcoder/build/basis_transcoder.wasm index bc74770ef06b6eddebc5632d7ce34733b135f8e6..bc64682561438128604ac550da774f8cc6617460 100644 GIT binary patch delta 239491 zcmdqKdz>Z5b>G+B_ujcP_c3$lxwAX_sBSEP0rr8#YXQvSu|2>puvjcWij)LNqy)*5 zMcr9aoWW|$#2|V^LNp~=5{QKZ+LjYI@#iC1F=ED664~+tQY_oDEgK|7Td^H$McFdr zI1=PIwqjF6zQ0r5ef!Sb*TDztE=i%)u~gbPMtdS`rL2t|5vZLEcni6KNto< z5dMqW@n^y;%$|ud{noP52^16%89Y-b6sI9aQ2rwi#~%dG1UO?B4`9=O2(h}-LP7VhF)cMpu-IqX@=bsO#_j8ITGerV3Oa;jKVVsJ zn&*!MhY0$J0sR-j1mFKW#RTg^l`T7*5o>^;#_iHVmR(y%{zd(=$nJEV^MV z45QZJ*=8eXMcr077Pechs9tN|Si5O_ra2LYVXa;pySYJ;wWvncV_^{1muo@umRfJD z7Bt41QL{PGtw#;Y49A0dBWMJ-9*NrRdZXRQdUI3)UJvG5L8BQ2wV=}(ACJbyq99s` zg30F5J;7qLIo_NQ(D1(ra;(uP^-#HzZF}n2RJhn|H-d?=s20{|yFqgznusEmK&?I; z{*V0EXole@qOGlHY&?V+(yf2Fr`^19JbWSw!VAIog--^5I}D!+z7U4*qAu?aZVJC4 z_y=M5p5X6>6Mvno(y;xR@b8C@KKysW@Bg{*m%{%g{Hx)GzY>1%f%{KAasGb}&H10? zT>M|di@zBDLil?4v*F(i|3>)N!@nH|4{To^wZ(TqmM;Dh`R;wTj5v2-w%H( z{Bro8!~YcizkK~(_#dMD-@E?Vr5AXYj;Tz%S!uvj}=)V_!Jp5(;TEG2oCby#d!zfEb7a;4>@WN6Y z)=o#KUD&%l3A#c0=5Nj}M?n&u=>{&EZqYZ|Z5N!WpYA;q@X>xF3LBXV>Ze_h*4L7n zfa`JSYH>u!_?r9yU(c^6!J|MCx|T%CQ9TJA&Un%|8I8M!3r|K_9VF`gIBdHbZW1VM zjj&putnny4f%ODHB@L96BqyV~qeM#?DJM{MVfx&<((w^)SWuLyL?M*~>07}C!@0JZ zhHF&H1>c*+6qX)vwYAN({;aE|(WSNYw}U=`ZymbO4fdrE@p;hVBgKcr|D6Ct34Z9Q zrFIgg^-JV^<)6*=g_9`oCBCgD9@oe)0eQz)J^j*e&g$=$TCf_rEPU+~FWgfL+UQCd4kqgW&*DG(y0wLBX1OTcCcSOY>d@fl25cuFQ~ zX>I-TYt5UEC{j4qQ;V$0H%@!tP$6iS(>Lv`UH(e*i0hRBbLH1!`L%!T^11Q-&D9^= z+S=+pfBA#sw?}U6@~h+V5f@BBb7~aVqSM0uSulXDb9z=Jc!TH_5Pu1XwAc4Q zaH`Kv?C$E*HJZqJgSug@caunG4Fd%!rA^XTqyAxNn*PeI>B%%qUwnO<1ie2Qs-Nb* zn98U8_0G|~eayfAktjNuHJ^t{SLm3tqEh<8r`^o4AW&Ij>HJ!}L^5P#JWow030z7$ zmv8MP*%FQ8Y8PqDDL3z?mf{-$m{78II&~fz+~`{A>*2*d{?5gI(n=Tm@!hVq9PLl0 z+>xgMJmT)AGpIT4=6fm)`|iluw4MgNTNG1|;S$_{sOVB3P6cR<&)&`ZTt*VOvJJ1& z5KAf-BK?IhZoApkWW(%ga1UwQWIyZLU=bF1OQ<=1>LBGaZo5{IF|d{|ZW?Z$j5<_n z3<;Kwoh7Fu)P*Lz|4c>=@5fua)Q=x%19PM0=OR@slFur3Bi}7mEXoUSLl^aaLG+Rq z;a#XMD0N2y=X@47rX3QEOxuG2mNUd-%LT5rl-xvFsz2^r(&8%(<7M)!DbP5)?i&60 z22UW@>c?l@B=RdhffHSdPeQSketZwk-TnAcYWvakGx1|?#&zAy5)Ms%ZYjAvzBdix zW&S$+W%FqiKUg~rx7FRf?%uTi|ym?C}{@9G)*e8f%02^n{5r@_4o4A`$ia%j@QPeUCGqBuq>5dTm{%tMI7_#q!K zFQyAf4@bBg&JkOOi{*p*F?=$gj`!mRj4*%6bvEJ-0Zp-9Bc3ORt0wGi#PcL<_=GB6 z^j~(J^sVN)5L53Yi^s?gCcGZ@pDpj}dfqtToEEe5SzhA>y_o4TaehRcOZtRr`#()K!-{g;i_wR6Rqv ztWu&~kYH+qf}qJp8}z0qEN!TyskE^fi{+=%o+L8lsSg!_--^hoS)&dGU8#L-Rl2Sk^(biT{&klb@!r`w4OeMSCB5Fb%rJ2+{7FE>N?*-dhsskf6wy}l6RNQx2c^%Ieorddp{_9wIIsY{_ z)E~s-o-G>2-1NfzmyGw+;m|=ILME3o#vM%Sn=3)&4#tE?w_Lwe3}hHDKc<4Fb}0jYw>Z!QQM0nN?;J685r>q5_g{Ij=QdY9?{Th!WxCF zQ_IJ13vl-pqB1Y)IA!)W+en0m%T(_8Ddu%SJmcol=+Q2+1(gC39?x{ZjB*;4BHFiw zL3~_TP&Q?4%SKt8brb9H3~fbgodVNS8Zu6i8(1{U4m-AAMstCpFO6C%WM z)YEVxD~;F%TX@KYuH5cmTH_>913O7Qk*@cTXZLi*_vueoeA=t`0EE+yYr z#P3qny+u(k4~iODQWj`-_Erc3?o!m z?e4C#-B}l!3XrtjN?*Jm&(QUjP)*uyQgfF*Zi%@Z(*=SxO`1_t(naV#>50CoN(b3Q z-AbeE(ng}Gg-lj+nq_hs~A!po43TEy~;F7yTft}f} znrE}O!?Z(8__gtD_I8+dBqs%Li)XQg(G7j?yKbg^2YEJoJ52jFcy^}X+14=6W{gzB zOp8z&#k4ld&zTmUZI?XDm+|bJ<14y8KAmX`9e1?vzPX9%jJ!{=OoU#Ja@?8r!qw#M zb~!3hjOaw#F?j6|rWL-teER8y%*z$h1l!Y8B*1`}m^e%jNy2YWFf)qhm_&@Fi)WL? zrS#B6^bEm_Z(@rA!F21*%b$6={ur{~?Tp|03Wk#L&5cuGF8+pu@~E;@p$9yES4Dm| zL>HGX|LLdqUK5>CnqEV2zcc7$*P>1?vZvfaT8Q_n)PBnCUi*J)SH2n~f1z!eaF+#t3FAj1m|{%TZ!c9ge>lcc^}v(Zct% zq}BJM#iDE3P(dC{2k9UHVAkC*fK21bP6&n@8RXCi`pJx2@B_x2%%#`LT(jd7nkEg6 zD_CUjKhvFY_xEn<(06UXwywzZx#)|Gh6L5sV_SvhGm4Qr6_sZus~~ z8|5{OGZHskwnqa!71mgOX#?d{VYvre}flp%r+rx)k{^0%iALE-4!Z|I%Nhl_)VQ=EnMwGAn4{b+ zWgYYv%A-JxUj;%vZ6lPd_y!U5V zfh8=mFuD_(PFge72z?mMDU6p0W%?qDung8k&w+~dvx4?w~{)f z$-_)Pb8US}d9*JfGbp%&nv{<-kdHno2E}x==U6aK^WjV+Gp4W|3&4;swRb*2n3`lN z5MifCYiXdabe5%pw03q0jsRH&q+xa`W}V0~1`CMHqUBwHK2Hk%%|W&U45LfwexGsOXmlt?E=+Ue;9HoXAPURERjM_n z3bLUrt5%oO@0mj;<#bY@r_-@uY#W)FKbF{5$mEk$$rKfs49GNQ`Icm2S-MK5%-Ydl zM5m?|JRlQG*JZ&KGWk5KWMav;1RRj5X=N8=sujo?nVMq%SyOwwG$@5LJ!~BTO%J<< zbY2OrPdcvzxpXdNb1B7HIjM}2D?u)uOW9lkZi72v;~l-jCQI}X&4AR;F0rJCR}&+f z38^>bU8d+sZsu&+duac3z0!k-GkJ)lh%6WhU>VftqUd3MhSg3dU_DQAr5F?6sWUcg zDaSh2*rsAa_3eCGmVOMTCQdy?adqM{i&P-e+zL`xagB}iCHjh~h)K)ywCte94NBWo ziRvwupS8V$Sy|M8e21ToIuK@jDtq=S|j zB8U=M^nf546lqHIs}G2W(%__8G7V0FhUV1P4?LR{3Iokt10@KwF-mt(gBRS_X`u}< zd$~_*{w$AgAAqyL2>jY^L-1>>Z-pOUUHruEi8#Kc){(tJE*TZ z+gRfspjucN(u@jfpo1B$c4&Z5Xk2kJp83IwmM-dRvSFlFonHCnj(T3&LY)5|GZu2T zvb>oAj7GtOZAc};r2Mh1k4W|DOq9*fzMY-TpJt^3_6O1YLDBqWlgp&w z+q|TfHQEls4-w}O1bZxY*U`So0Rvt1pgX44ts#@*g27s+Lth(W#G&E~D@?rSDh(I! zRpc&~LQ^AU?PaIkG+I1jg4tk;Ig?sRMz%qZFe7=-5gEx!ENezVE3?6E?;RsqG}gKW zYWtvXF;0;(`%0+k1l*Xjuw)%7B!7<+_*u_;9n|c-B?#k&+ml}Te97}tF##_7pI~#3 zG`_kVD*V5^yq@&xS8Z!6F zKeCd+G5?Z)-j`na!T?!@AP=NL&iaIK9OU3T3oAQKf}`M^V0{(n9Y`(vt2- z4RFCN7Q-#Z3wlc4CrbIfGBDBaQdDW7-=$L0Av5OY4LX1t7JHMA>3q~4nCed30L!-Jhi(26I4#0PpnQdJY$jP`@(9IZ)UQ5 zpI@EN@UQ}g=ke7W7^IVP#@6nfZLDNz@~z;7Rrg6T^8vAHkT9)WXYyGo`*D?Y-pY8= za(`lVo@}2|hVH`EvXuTuUto%j2BZxjwP$Hrim@?!-5of)gr+I`0~mWHQ$aAZ5Ay1$ zf*5)8Fmx*gAb5O8LyDh5x;cpSCh2<$n_x-9($T}pz;+%69ySbl(5VtK&u_jA800ry zh7Gct9b_jZJ}-HX5B)xxD9`UenRbxh-ZE^E-_oTGNOlM_+%L-Dpv|#OThMVL;HLOV z%;J{tHc{a(u~h->_VQPbAIz2F?9REH63DSvlJZ+|9DeZw}haISx@fOPX zh4i=nnHg;?e69?iOMffNBW4PazHERC=@;|xx$5OO_FpNpFTQ5d{A*P9AN%K?;&W;7HB)?5bI(Ld5$6*neDO6?g!M548fDJO28RO3 zafOad;S2tQ3Az7hpa{*RSKjJrRaQb6A!01;?Uc6%q52!F!9dgUzU<>BkC}ZI>4yrRdg@YEKvwe9;NX*2^3>=soTtW> zJWoGf_&haWc)&`Q8XtCK$pGQb4Cl$%@{W%g&8kA|)msh;NXwNWgGQU6X>rEmxvOip z(u*}P<|YlMgHuSzWXkKi?5!Uq|I3w`sY3l6y`EOC%qZ90R%WUTGlHuw%xu>XPe!@z zPsSQ=rcjr43wLumXW{msqdD&Cmo+RO`gn34Z48@W!>kz^>S5W}UU*QTl!Na6+Ul*J zNY0U(*~G$~LBmojF`C!MlgD3J&3s2#aE;ei@A!l}_rj|0BYD5jYL3*g1^2i#w*?e2 zM<41)r;?9Sh6>gGfuhhUjyi#V1ESpXNxl+bxD5XasUMW+6S9%ntzNf6bPKJd}fnF)Ib&y;sQ>a(U zD*1V(Y&bu!lok2;?7UKD+2u-^vhzw=B|G}f`*K_c_<5ylI6o<6EmIkOW1y7H)YL9R zO4+cg(5k8mjFH+ZOuo5NhN@umVf6;jYXxIU^5wl{RNtU8jcvYW9BGU=_3@nJ8dCE; zzj;=Ztk1UIgw=|cH#QisMTcI#8*e`WQefr{d9VJGX)>@I$Bfjz7yIliK&?rC>Q}T7e6SnUBbl8BIlGV+6Iwck2ol1{gk0Ur5dkkOYM<=7m^`>KF$LAY<#Bw%Ca@ z0!JE4@}%1sO4S@@T=gM2z|HI?}Io`Se|PWIAjTZVGP?ht-*XB-V`1f+tAVS@%IT zAJiu3L>|=eL0y7g#{@4p&Gankw2E9bKoof&Hmk5JES4GI<=?$)?x-e%2ESKvdCn;D zK5)qbl{YEoF5iCl?49p4*N+ViE4HCg%b+%_7#TUJYNJciM($PCKpR7ApsZD}21?&6 z)<6{iS+xW@13@#EBc>_~pz!Ih7kr8>S_f4csq9|xsgGdy1ga$dFXG2ihaya)dg+lb zj=r{f_!EeWT$ov)KTW}csDe#eT5u<$43u?+j{P6t2b-jM70LU&8U@GLlvwzoUUuquS^pA zT9(V3udN=lOsY8hy~a&OJ1a4-qZoL7!;i{XL}Vv=CK_CoTw)WR9m!es`x zh_A<2$N3twuO45r7(Twb$XDIIGziu@Fw;!>vqzW1;3RvtX40QKYTHssW($v0+QcXe z5&4jh{6exaIooBDyR{-V(D4TjHlAW#v9e^p51|lah>2U#Y1h*R7U%X=thO!MB4m4u z+4M5(DMSw0dkd8(VwSv3Cu)t7^CzRD-aa_cfp&pg_HbIR%ypn4!*^lOJ{cVz09KVC zxU6a=I~h6P9P^ifJ=xdX7-k|qB)%Ds7u9X+7_q4MSp~IVrSPn_xJ#|7og*T;Ag@sj z2@O?Of^YH8H+$zBz4IRLyxTiZdFO(6&U@#acOLc58Sgyoozy!IdFKI_SxMRw{e#h| z;H2g`l?G`E?U`-ur)?NAz9$U?k5pP1%Fc6B6E&;$lM_#s&UVReR-5JNe?V!g#r+o{ ze#vfEvd`Lh2|Zdi*@qG*E&|H9sXcjD7*6SVnit}G{f9%pHv{V?bhDWt3qi%GD#(?9 z8Zs9E7n>W}c5m~SlZ};t+FKBvEGxh;`VvN7Qt$k{W+i}Kk=9z}S_x=>4e> zh*=DeF~%Pw@=74G&K?Vn4MMa>zLr{hO8hb6@pl$WwfIO8jr7ENdO{&$DId~VPdf^c z9o>gWz$rw0rjVS>WS8aniDx}*k)PPthZOmVlYK~$pO{)9sqj>OgsZqW2&_b;aTQ)GLScQwQ}SMRxB|ck(;sx5+WdW82n|<>w8qD%Y;L z>n@jT8cVJ^x68$v;Bv9Hi~K{bfjE-Q>~k{BVW6bPeZImem>mnR*n~}DYF-?*JB}Cv zN1TGArovGh;;3v=h}D7kY;lT}vqa)V=*7(h0`9GDVk(tlWj z7hj7-m=#NdSHVA5f`2Z{KNr(Ha8&mHxP&jh7SsG|RQCV01TVf8)BI~k?y~6pixR&0 zS}ejwW&gzzy!cv7^RFG*llyO#;KkQs5r*Ya`WK|}rbk=0`vu@NqRg!XERrGMH0mf| z#-dU+n&`UMOOLP$Yw~!?00R;>+zj=J-IWlCyKnPW8>4?vigRdS$$I_ zt1QRZh!?ll5}wDRkN zO7aj2shNKalZasL=2Pep!3l@r+w+C!Bl3mrBeI3`MYaRQBqLv_zdc_XU_`#O!H9fm zh9ciVLy#>ku{~QFV_UXa03;1EBH#Cx`pRB6SLiE&E0hy;P#QuC%h587_EQ@XR;o2g z-h5TXM%(DrveJK&GBGWyRtNBS8AhYuP3InTG3L@0PqkapORJsMhR(9f%0^mv@?L7n zLRR)rxA-U;lJQO|y@~}=3o+KQ5Mv!5r~_PH*RXEt1C4KhEcwO<8`}(JX2ERA8dXKDQ6v#jYXe^F6mj_o-ZYi!Tqy=Cn& zpBnB@8?UHun#}eMnTuxHTHP0R5o^F9)_pw!0UO^?tKFis(_z{xWC!gPxP$fz96@^p z57S;D721nVnJ;<=?FBl5_6i=Ry+U@-UV%GkufQSNi}ZQ1!J3-ybAWTmIyf6NrAVSxgc z8Z~l(LiJP|4MQA?;gSo}6r_J3c%)qAfgJk2 z9HfOD>1{Yt&2XfS;jFaXK3yj^&ZfWDnG-cr?Tp%&vU9qILr8@4i=V`<6VOo8vR3Wm zgVSefHhN;c_dd23x<{cqpS9C~e+Byu1YgsN!C()~l)FcoVEW0eX}M5wY+XCwgE9p> z(|0Co??_h9lQFGiBSz{T&9v;N=UlNjc8B47S2djXp!Y1dON#%bHEUylH$aLX{6>M50J{=a9xCl8v1h$? zchR(CJlLCv&R1LTLre3U{)%5VT}$rgt%S&+TPBw^H>;+XEm!^`y$rdQ-mAW(e|I%K zRx1NHy_`syZ>z~MXZhrQS_Fg)w`K9~kw^CbB0aXPq4eLVAq88{d31)sG~v+MXZ?WS zC-TnxD5^G%^iu>2(qJJFugqJJ29C(;~m$ZU9xR@sfsIzb5R}bQ?GhOGNGIaSs;ZXjToo0q z)U~8)v0`g;G}};s)|z?Et5J3vf6MSaQJs)4|Iw2ueN4k_gNqH+<;=o%dt7Dn4eN;) zX^O#oj00P-j)pS*v(3};vq82;M|?f6`#aDBL6(bs^jA60>TyXaY6pjM%>C_jbfZZC zU9Pj3T}wg!?=DZ6$Z@1+L0hUu;l698SIbiuKAZX=Hb@$G4^PL9JFa~n#N`iv``k?@ zeLmM%oH9_fH?dKdC**a*c~*>FY(Z1=MVf64`xxQt~;*zP+wz2fWhCH zOFU$h7CC6FVFeEFCg`@chPQA@UhK+37(~M@W*WW+))pPgyw=NtR-2QZJ1_v=+lOi!aYMKlK z&t09v^8&A%$=|60uba`|i2}31bxfgWb|$vEj%iVw%9so$3%dEIxQ+=Wlezh%ThMh( zOd4d5ik(bf{B66A3FDCDCk8L)=45SGE^Ib)x}=v2#%(Jjw|QbC+(@nqcv!w4@Ru|# zRxW9xrOP6xb}16o$=}z+cCdcJeOmq^z>uqUt!j(ao2CxrRcqxpO`$Anx@^_rh`<57 z#l3`;yNpaV)Us6{2=+Y?)O}a6Pk|7b)9x&v~?B#T70i=+3zQJy4q9mva7i}t<20Vi+&GvgNW)wfU$Ip zlfOY2=?bTD{%&(MY=yz&m}A0tjE5n5Yw_VUOP!07gB%l1PJZtiI^W49o;z`($69j2 zLQX6tfeT!Cekoan2Fb%Z0~qf^2^84_i^u>=&8-sA%Y%~1|&uy$1 zLAp>NKE#C$BwceS*4@F2B5$J0rIT8^Z!_h7ms&b6x6en(K9quF32T$T`_6wwF9N;nl zqXIBWM*;R+=rarpxNsy~(>>x&s>k{(RDJ!fQoS0DvnR7NA@#gc^`cVsZIx;OyVpS5 zIcU28)e8lxT~V*l>UHgE@yJzP|9Vlc`pA0KS%or!a%a1zV|yfAKpU@ax`!{BK)MA! zt8weEZl3MN6c*3B9`^}P#x>VKR83^`?i$(7 zh&sn{%Ql9EcQ=v=HlrUzcIJQVJ@cV1U3Ou$*UiGlTKho1g8 z?3Tq`-E{A!?u|+&(-%K6Eqc?DXI1I+#TUKtzniwV`D;}_=N(x0>+;@EhfF8amy2u& z8Mlz1tc28Ec9?rvCeu&*K!CVcIOS?nKUBe^Gi@sAlURsj+~ z+&-JI#x5p{h^BcPEs~qpgvi7iwT9sRBv$-1S3`5ckZ}MK+o!VOlB6FBeM%GI}zb>ld*KGZn#kR4-b)Jo|?LzDhY?PlQ!uMNTIE@kXv!Ad=r;V zxSr?$ZAFIOb}}#noh-A2x|WnprUeGQ;!0!1+Z$_aWMgsGhLbsgQS82KJO9*q zdM8i&^Gr0MT#0tengk+Qy`|oVQxZfX4UsTFqd%D>|M&azVgp zDvHa60rmQ^AyKp>al^RiMed+f$8BvFUFe#9bi!+w&Fz=fvR`@X)o{Ll*ipUV;y6cg z5e0m~J=&+tqMGAt49r~jc9AOH>>le=YCmbJw&P12MhhI@Ye{nrmw+aKkEi=oBA=4} zGnb$Fp?StBWXLcz%_ie3WvN*-xpb|J=c*Y~LPX~x}5DYf`sODs83e%#vrpri+% zYI}WH6J^p&ZqvNsHh0k7;^#{(vYN6_ZGsA8UQtBX*YgGONqf{FzK03S5#}tPVOFyL zFgiJ+TT>Z7f6-j!sLfT5`q>M+DAtk{3t1V=ULK^6WXVG|eYw{i)$1#~k#=A0v^xWQ zj6{o@c$$RrKIQ)OFnbXnK>2`jE9*RQW_-e{lmT&X@_uBkpXi3yI$3$)ht&j5(AiME zM^tEgag5g{1So&mbU!}G7=ae6>vR}Y)6bw0s@}F%nENdaS7H|4gT!`pV`}<$z5ZCF zC**ZPY_aX2R@~-YjMML%3TO`i30)@dU|Zv1UNW+$X&QdyGJVuav$>b|<_HEw4Lo+t z{R?zdqs4(&*zMn}peD0`)oTY{nMcg%rV;qs6nke0mWhVDQmjWscykB-qFui(gkq=W zby7-%>KS|8XSzy-QUkt;d1|HPEhrU>wbUE~_VbNL605lQPiZQ=rN$iQEoH#EbtLBU}TK+$VJt&(S~6r0C;o(etFQ~v>@3AK_{EJ20GbZ^iQsj4j3RvUSo zgbZ9C4sdEpJ7mx?o5}v==mfJuoDb_=(G0CU&?R+Erit}95DI5NZOCqMX6JNKc8gQ) zjC*j?J#>kAH6@k`K->|Lzh{=tFF~BZs--qnJcOCByzV13D zJb6yj;Er3)r@;$|$s@T8)GT;^`o^yZdU-8CE6-=bz0@YG%#%@`ho{1wZBt>cn<#~+ zwW{<1OoAO!k}9-^m zInyJygZ@z&#PSRZkqiLRgr`Yqb(wkOaJz31?*&(Em)cF*9l~fJOJc)FSEvt!jxg#L zV$9H4r2JwK6FwCIqof1zqk)UAX(-(65n2L?1MU$M#)k?T9jemkCN|eqXq1XZj<5=i zGEh2HC6dxqh?L?T7RGr7C5`6Y>3)o1Sld13fi{XccM}NfRh(3a8`@{V_t18taV^B5 z3WZ{oS0SPU}stM%9Ons>ced9;=WnzR4Y{64|JFny>+-g|Q{ciDXGCjF=Le6E(}#CuJ}o zdpkaWA4(o(vw*jn?MJ@d(@&0rV{$tW7|7yJ*W%W!TiuN^kK9oN25yY&7MY02T;mS< zIa+Vc40xS2vSB1c!4^Ow{Xg~)9oKtI1|#?y7z{=RO90}}+s*Wzs%g*qkoKHhWZ$VqY#dM0x;%^0?{EV&z%gMfKdN%CXDNRkq*1;U9JJ>02FJJh!S|rU7 z3fk6_T%$B>XC179+e&*qx1Fgx7{4sfzH>ToXDmC#p}&!PpF69)mI*Ml#rNSsg)z?_vJ#jt3V zcyvco0;^TGpoBhhN^Ip;s|-ZwHc{e+yUiF9#QJnjlUu|JRW!7qajmkkWQ{Dluw?D$ zisXVf76%<D{^2=8e_G}W&pcJ znHa!EmZ=2|Zvaz~V)D#aopbw@GPO^4XPbA1+I*MVVhS5wvh}s1x9L7zrGnWQ>YRHml1JXZb+z0@ls6_qJdf{M=6#5>TLENL;*7EVq5)ZJ+u4N>#r zP8hIdY(HTP*xKF=F||z;45$xdKpCozpx$Tk5vOaOYfMBN%s$7MYX%gn#nMT4gP$eq zEz}o6*!18@8e+feon$hKJ99ERjng?9F%{J-rg!0VPcpm3oj4hN1ZVza^cYTy+Y#Hi zp)NJt?^qB0uncSc_atXrTcr?*0k3~Jz&sbo;5ZV zycM3e!Z{A?YP};ev~5Mg;)_S4r7V2j7r}+T7^8kE;7R2)m}+BdJh8@9q>;Y*tAXu~ z!7!OpCz;#1!u;WL>~CZWqF z(&ky-`L=3?%7g}hY$Sz!l=h|~?KT8LP^jxM=OGj<^&wLKai99gHB!HKm*g+{d3kA)eAQ9KClXsW=419^o9Fjxzs8 zeD8cR*5#C}+=e~6dUwD}0WdbCTcRjW0GOWN30yBwVJs1S0`xjFW|pMBjlh$Q43DD z>9gqLVi@b4gzFq}Q3LhP9&nNH7w)u9ji5AYV`9NvsRo-&Tj#x;G;Ff;W4HCS8<34= zpd%)kmK~5Q+gAd;2g%N`x0EsKhama7Z(nU~G4G1{38NKhTZ%pN4we*U8$20H=+(N*=w18wDOdB!V9%6PBs6q_{B)$nk zQFyo*8#&@8KE$oVIOpIkq+ZJE9B+uEbU8kC7@QTQy>8;7MigBJS>x(CuCC?Qn|M}* zX<-WODgA4gv9KRVAw}&py2>nTrh6YvYD-8H?6qfjnQAGn!3qsVyZveHJk9~CAn{tX zl&#}fOYPH3>s^cvP!Mg6VmPL}mh3xE#{!C-o}3-oXs}k%PC>#h=hv{0X`JRG5rT-z zfgff3b7OH!oEXGh&p!v-vGEN963Murk^OuN#EkLBsz+SoPtQHhP)vao+t+jUncYMj za4(`tm;s^LwJe!^98m3~ce9t=I8sa3&90MI8`ze(yrCbf%A~5IDv!ZDECjL@MAw~; z@n7dd2|pLtz=>Q)${N|4A|V|#&{64{>cm@NRwu^(i}5743cvWPJS6WMUf*syjm$>P zb^{H{YSGCd{ocMIr0Y8G2GFy)cEH?LCi~1i{Wd^| zK1zpxShrBf;#vl+G*BNzAFd8Nx*FHNVHNjH2P%1!l_gIw?UnAMGfqfjuuR2lqX60G?IQX$Zby@ceps-+Kq}74R{Ej~O_>9^7~Ak>E{% zHw~O$4}RQb>MA4Q#|1xb@cepsFAhe6PY8U%!1?vyUQ&z%Zwb70c7wT!91riM$Vm9M z;M*2jv+6M2zCj~xf;QV@UFR@B+ z&yptnccK@NE~#@?rC-=THZwP@pJrkHe&#Q(?!eYRCij7%rya1$H#)^;VSS zKqq|a?0THIl%;RHfl8+2%$7_G7=t8>?A9{_K9&enr%Qcl1(*R)I&vS!8RSLNvdG+9 zAA*gBe3a@z`&3SUtuSv!2 zo65%wnd7{s;MGwuM&#P?siBc_<+73h9Z>tmx@ku{ol-6>C{@L2=7o~UR9{*RUTBVL z%!}LTQ>Mj510^Rq?K+~7a#9WaCEFODtQu>|cS`LQ5)vK@mI+yIN2gszs&GdtmJ4%0 z-Ox9jG$e#^%*u;)rWBE{FR|FA!^Wx#wtffhbroG7QM4?>*Ogea6Hh1T4`FGIUfN)_ z1vXQHW zRBSEbP{6sRfiMBiJjy>9)?9A>=(jAc`E7F|pPBX)l zIV8cRHQAZonSN$O`XafKVE!twWEm9)r===lwaq zrp5f1tSqRw`C~UOVEc1`;0hUs}(KF4{MAJ#xSnNN^D1)!ptn17*-~Y zP*xKf;`elz1CzAdyL4&IP_$%5&7Oawo?%>dw?bL=on&wMQ92o>MCZCtxwhyXo;#MU z3lk>Qj(z|&;G%7Ci1)Av>g|cLCh~o%pJ**gw%Q1$DlCYYIj|MZruDcfA_6i_NG+a~ zkCP8ibTN3I>1v_Zc97?0F41+0+S*Gno*pxo5^fzF&_mniv82Mk1Y$fJki-*tkNP+r zRXU3bYjRZE&3=#ryA+B#VXP)oofO6_kbI~5G^(4uh=ADRcg&5;GR2Y-1+e9>NweXf z#Q=nxhEFW@miK8~!OYmjCeP2&zMJm750oi;(j6>Hr~Sw^)!rdVPrQB3mp56JV0+he znqlcNPeK?`x1d$=P!Oi0`5eO%K?nui=*8T!eKFxN*vGJhS>Zj-F64+F7=@@dR!+c$ zIB>C?ahb|k<>L(Q0XNU%r22;K_*`UnD~8;4m+-+^(M@y{_V7(_iXiy*@><3fzavcb zS_fSc(0f>e3#p&Xz+&gF1e9IqK=rb?-+>TaM=NW7JhV>dSJph+l#PKMjxk+fRVE zg2KMW!W=DMn{03jyjI7G+DfrlB2KLu*yLGkUNd1)_J4Y?M4>UOuZ#!N9Z8eO0b4Sf zvHg$?Xp;szU0h=+^B}r=)1T$g6*=1q{4#(GhJF;?<2=PkWb#yB+NNrMn&9O8hHr0EnLYG#v;qI+W) zv*}`ahsvh4m_D87T*)*iW1eX~xcN*O!-`B9+>|MUn{h;*>7??U+?i+In0cO)LNr4l z8>aM>BGXBq>7>t;2L8aqiH4K*8%$bhV{LM> z7TLdA6yS!4JoxBXaC7?c3~56}Rssem1udr^FG83wE990z2(uxD+&T!!GdeN|VNesy z(Lo6PLm|foAxtY3a-5JXFP`b5f^HiC^?b;QLCCZZxqT1#+Ck;fFQOot_bn72)Cr%ks5~mC)iBpD@#3@5c;*=q5t+&G1MPC$F zQl|_liBpD@#3@5c;*=pJamtXAIAzEj3Y@Bb*P!^4Iwep}9QkFE^TZi&%t}xYVNBu1-w-OYUS_z8EtOP|RR)PX~ZBFnwuLK3ID*-sB zCvAP$qnEx~kh5g$GNeFPFnRkIcn^{l_zyygdJIB}`V2zKwkr!OsyBcss%atq5tyRB z1E8YbgOH;BgOGv_gOGwAgOI%KgpN+ftOR>HtnzcAf`$S}m9ZGFttqb`RY#Dj+D%Wd z#k#}jE+zvw%R2SZ)LiTijXehaw+uQyj&TJ&fT3!Z+tZoV-hpVdOE>f?roDAHwUNun zv`_(!sX-%_r%Nb6CM%H(nQ-4crr)ey;TIVJMY)9eUISSwGQOL}BDf#NyfP*`R zf)s`!Hh6c=22Ve{y!N3dX$h}MX*-&y`-YrDo_>i2H~e7w_p&&|vJgk7;#sWl`6s77icfAm zDL$v!@}C3DyYulA*jjS$l(q;_Aj$!~@I9}5_O@vDTX#cSeMeKnCDOkI#*`JHo)32| zX5*EvCC-k|7x}-}@_+impyOPqb{usL<$n-#Eq}T%`49J;O8)em3+}?pMeg5Zxqru# zgWR92<}RjJ?#$wS?pRgGeYj6la)&9ObWgqaQQGP2zo zTY9a^xYgb2%ixZ1$h9wLQbpVAGDTw-OnTv^m%bf4m5w%77_`EbB`Z#gK{L<7^Xd%# zbD_$etn$ye6o8eFf%+BEYKv1hVmMGHR;Neyx#G!iI@gi%(N&(_sBP2>0OBS-n<@OxZboQ#f_FCizsNg3>KJ0 z(wpBQUHj_nodt!?d2L;L8+$XmHDz*#E-B8%J~LU)fd`-P2_3mIv#xU$XY-YqIr)7o zDpY$yE}QOUi*p_`(hi{H`IO$0kF*F_Ou^7)##kq`^q_SW(}B(5#A!ZHPxcVOu7Cv` z9nsAv>&d*P>*}L>QBP5#y;_{1^3X45#WUCr$0X1Ax-G2h`FQJ?OODuC#YT$d>$Z?h zBeKqGdS8PNyenm#Y&hn~GB;otkwt6!Vye%Lik?(egT!f!IA+2b?vQ0=ODbxVQ$H(X zWK9tjUwtf^Z}`vY^JXJ4vK76ogue>e_Ne2Lok%3=gwH0kq6(KcU>MD*!dFg}DaWV) zqvQnPDTX^lMn{pm2?=5I-9A{yR z{rhrLO<`~AnvJd)6f$IhEOlxts8C9CJ@2?Y+*L5jamRqR?3!~cj#z3a$=yEgF7KSg zvDPj6)Jkxq2+Bu^SALo^1sQ$0mn^VxzJeQTC6xh-%irZMPz9F-W_6U0Mo__la2j)4 z7)!_2lNRV1e$cm$!tm5reK@XSd6(l>URHrL6VMt9P{NV5$Yh2Eb~mHV>$*aIxO4>m zjxb6GSr+M3QV(mgFLN+5^I8fuE93?=Fw0^gVVGNRzQC6rolT~(bt|`NmdB=e6=g?p zhQgpx+P+jyDqH!g1Pg5(P!yt6#0-&{St6?#flxWvLQ;{w5CeLW%~0TWy9;13!~>rG zgW?-*YJh?1TiTJRZC2I(r1~$f1gy@gpj%2k>(-TEuMfl2lbca6_3ZOu$4W!c@s(i7 zhuv11gifpkoJ&-Gx0lADJ63`NKJ3oYOoVcEFgH})y;6)~Xjg|k;60`3=-!pU`LO#+ zBht!B5c{xGr8(*Tl|YwqQ1AogVE5okaDxwfs5CL1UI}zXD{v`7D7UVxt^_ywz=vgb zvgk+jgrR+%LFw~fJbHAq9v$hz94w$Pj`KPjdTQZa#tS(M?=5(-OcmZ+@j}?bdnCgT zc?ZHH={R1fUBupo7wc8wJ%Jax7v9_PV#zAJci^Q33h$kGwGAlCD{&Y8 zgM;Y1@nYgCpiknZRSNGtc%{bXY462L`xM^$@FK4Y?+RX8s_>q|i$+p-v-|POES2Z= z0A5UDh4(?cG+*I;2ruTb!h0Go4Ow_oyfkLvUByd_7T$;PN`cM`dIT?R%WK7{wc;84 zv~c0oGoUwX*>tCte_R5aLE1E(VUaF-8sob3qhya%hZhW(F_KmA1+$@P!$BeRQ9NIH z>w%~}E?KQj2c|K$B*M)fnZGHikN=f-KN#(8_|Na>vq;r2r~_W&YaHGB>4w|0`7De5 z6zdCp<#!*5_Oy-`8HcZY>i%e<$RID~SYFJZT`7zCn|u~fzL@0|gW{@G3StiW<=T4s z4>)GUGC9|0Ag&g4KPH2|FY&~nMCLFHIrjhXp|S)D+tYj?FPY-@wC*U9_yV&B@vE2p zfoRJ+mE{b1Raj(8S%J99C4@}|VG}TX76k?!@mK%ctX;TH$c93ut0C(OnW=_+SRu1T z2&c^BR%9!4c{VJhzL9^@JuxbM!iZ>rpDzN% zXJDz@YX*>FwjxlF-jXfl!YWh+y|oO=vt$jlyZVD4d*PEWzWVxBsCPW!R=t5Y6q*~# zpVj^;R=ga}5nG+{3z^2?=e)9w21EHG(MI|?s6gMT)TPD+1RLq+i}12KKD>l4YqSl% ztkX7lX;*pUk$*NQKs}5IwX+H?3pi2@&C$_z7@gyP#5<>z)T+DsLqGEJPrvc%FMOAZ>?Kq#y11jMSS2nNi4WxS2Q4&fihxsD zB=+(wPhHM5j$%u!ZTJOYj|81z7>QT@%3V>L<=oL3_^AyzBaMeAJzBT6H0;$MjyYPy z6ua(Abo>;G+-lp>WL6c+uGpJjCR(Hp%?&h7)8l1#)8>CTwS?F|dK$_V{Y*SEF zagVDp7M}H;0F^WIYsZ=);={xEqb-4c0?D*0pEKE)&6&`k*VBLl+hM#=wWz&4gPOEN zbiQI4tW?&}`SRY3&R48q^!BDAld-G65Q*9LIvH&H;!bIX3Gk)k=CTAwf}g+r5=(aGumS2ZQM^MXYv1eHn zC%#qAH^jHed3SuLoOi`k=veUm@y&8R6yGH0gYgkL7a1~e*5cdc^y9nad|%96T*rbB zWbsM4-y7c}=MTqF=veSQ@qKc>J6@6VhvHLmzAJt}&UeNS%6TTfpNc=fo;;S;AC1rP z{U$_+A2(uaGalwN*R0!}2@W|$L)ys|Yw9;X%fuGuQI{{Zf#(p5N#v%p0F!PnEV4maz|( zvCJT|@3d%a0Xn0u#1E9wOf|pDVmb3x#GWc+Ppt%h$YQyqu83VJW0}N$x5aY8uZX>` zjAgR>Jr+Ag|0|;JEu)zg|6z+}6JHT~PZ`VX`Fkyvjps$|$ubtT^#c|=F^Ijpj77cu zK8r>Fvb36|-&IC4Z|_?)YHyMC?PV-;{xys33}U(3ASX3TLKiKTaiK_iq>RPZ@Ii}3 zUKg=95sNrbJKeMre8{4)iWJc|mx&R5->+LwPp@HJGJX-)Nx@lW*#%oKaVIdwu-B9T z?S8~eEr-dBj-|0d2+olj z^EDPg?sZA^A}ib5ZN)ro=w^QRtth~;54x3<0!*1HN8!^S&lQ0scF}6!c&BQOzEX_m zS-eC+oLA+Nm?ho}(226?^h+Ac_V95<9}61PBw!$+-mpUq@x|JIJWGsLNn%|g&p!9F z$v(}y^a#8LusugPGOISjM7`K2aHs-%b(IUdne%qrTTp_lY;*~Z+HEiGw%51YUf*s+ zsoiKew`)-cb`;gKE0&9rxMf`uPaM+A)>s`=Q9X+4`J%X?S1iJ1xmJ|SL0ZdNGWJA- ziR0|FN_v-9)Tr}-qA?2g5clLwZt{|e0P=E1M=!*zmo~7{>XX)ImZ(!nY>nn#8|JuT zyji_a&UDDm9~ry{kI)EpGF3goO$smVr&(}Q%$Bq_S-gVHo?@&OrJtdLHa}v|_e_vnsL?9|TXG8oVZkdw5HY8RS8bo6&E9+`%23upPOqWQA)Biwbhl zJB1u?s=q^mMh)sISKB~G@RZBj6!~E^RNJae&5r`vj(O1%4pQ54m<#ev4%!x3c}?BR**=>GAXJK6ETM8s;q zI@*8%%ye-z5|{G#dPa+q0qCh4c3r&Z&TC+}$L$q&?ltb@x8TmbkT)BaiQC!ptDtWM zIk;239X^<5V|~$wMqn7G#irB0iv`2z zmCQ<^nqH1RW0cXfhSR@4&xNq0(r8iM6i@ar=0t>nWv|LZ_ca-AjLt3tNncY#5ogc2P%$d8poBqk1AELu)Tn za>D+49%gCiE6v{Xis7&!XU3UWpu_1hTsO<1{OM|oab_Iqa-mPR(q!1KSZuK-Lp`D_ zTB4F*yxmY^c08skts zwFWGTeaW{5hB0DA3u_Jb75J8bsl>N5h?MW?q9t^)m738KTm?g$Wcm!19;6HU8bvs} zZ#1Uet!cW}G#16-(=JUzih}wC0B@AX4(%!5%_%?A?TnNrCML37#YTRK0A=OZ2*}lm ztF5rp9wD4~f6(qK7%hbI+$=9LFlMdY!u;RnT8__grdu6uZA8Ikir(bZ1q7cQNRR|+ zT$O)$$8Y8xzggiTJGaeJF&&>Xh&jiKd|ZGnxl&$%kW6PMLz>Cof{@Id3Uv)nc@IK| zoA7gZuKEnsvjCYKfQ(ziX;qrO)3gRMJk;lVCtz7HR`Gas6@#E@e%!Bp6n>=yq0h@VKQn9u+$QIX5=tfo4cOEd%vPw+D$5VE^M2F?)=;(De0ozTK z31()KCNi^V?Eo?}6WC++=O~@J$UTc1ea1Ig2jOCIKHm)2Wt^@Rkz!jepW@fFf<1_r zJXsN=TP3g5)|s$ui`e=~u)g6IHjMGH>1d>5p2x%?gYg}!ZC!UG=n`x%GM1IYYGW0cp_;AXYKG}UzBamN0HYK$ne@s-R+mUSQdQA1ik-w;Z}R3VoA`dC z9?oZW_k&`F~i?i4(g5E8z$0Qds z0nRwjtV7CFbPYKGe5rTyJ|?N;!^yE;`fFVH)wIjXpwvaXHKzut_n@uBdV@rLw3mK~ z>ab}lAa8D3i6Ba-yx-ueDU>01b;6#80fOD&U5G-gbW@Gh0GxrGaZvE>+HS~c-WZpkXzQ8HfFRtGWdo)k!yBIa)c)$ zm}cvxybsW4V{*hZQ0^%A-dq%!5-lr3s~S1r)moz-1F^?JY0beaWOUx@>sAwZ2M=4p zwf;S>kjqu_7aX~tKxuf?qIk$mX$Egu!K7jF+LgcBM9pU%M7Mx8+-T1bdFbQjX~sLxeNS5nEE^KDX2({W2WOuAht#zUsY ze0OZ;yvmDyYNZORNhlic446}`T5wvXXKIZVDy$~X8-A@$Z9O2fR!EJ30u>Lf5^GqhoLvyPJu*nUT5g z0z7n_VM6uF-g=Afo!2$hJxMmWRS3W*H^^eAoIb1l5##Qbb-eq1H|KJUYC&7TcD zjMTK3r|8-2ZKW{YjqwW2vV?9jW86Doa#L?SaMj*G>TxYzRd8xxhO846mKOV3lHyrF zC8@~G7T#g*Rr&#YD>aPDwl>%#i}hjC zj3ZWF<#8oFO)C_~)2tX=MB;%Av;-9j3b_FV_4+`U1+MrAmNT%toe9cKeLBt!-~+~H zxbDX{dD`A(^t{dJ*)0ZZ?VC{}c=@Nj-4*(3=XZs^1-6!^U^*qK&{s(+^wmc5As%eA z{e`R8HX-HV)IUXu;dPJ8_~jfFyVUeEha{DT#R~wu@W39-i?0!1!T=3CFT#gu~bX2QCG>kI}QkGnw}0q;jQuuRNBVQlSCG ztmFt2fMwv~;~<196!ZZK{Ux;6{N+iCy+LIs`ay;s3tWzcy|TFi<+jm*gU}a~Q|>+s zKdk!yf4sd7kX^@h-+4dYd-LXf%)A*4fB^=;^t<@r00an-gg}r4$+@6J0)#}$Dy_?# z$c}d9ij;X1TNpwxlSsUy5Mr2EWlN-f-tF7nw?9vxK7G#Vb8h$jC!F`62;cwa z`ujf{?#O1-RZcuA{099T($7Kt;1=F`tgVL&v?wI$aTlkw@#RE`No*5fqgq$w-Qs7U zpne8wm#m9Rju9Dm@wucm$DYF$={ShR1E!FOm^=@p(7VhSVU2+T-l?2-D@iNn)D#X= zXeH`rHg6P;OBnZPz$dryE%uI^dNj`^%s`PpN?9;6OQOGb51V0bBxA;2 z@i(~L=aNHnNkUPCai%h$8AR;1>dlQL!Amu&Pu70vA8ymaV~fSYjDC*k=V&?D%;pX5 zfV+LkwV8KcXELD20ws4h>O;WxB1t!@+M9i~g!5{N@YUiqGC{Y*CR>5L)2p3yHCyHA zs#@9Lu}`F*oAq-dZv+;g7;ozZE+j8uXu#ZvQXON8kwuJ#Q{C)}kZ}|_jk1bW zr$A9%;V6>gZ&Mwo_{oAdDR?rkPD~JiuQ+H}IK)*8z)cjZAMy6NWY+shC5*wc0el}K zv_Kw6@#&(|u2rf)QRylxZM9fy_o}Y5`bqV}(7n?Z+Z~*bVOVKd z8|0*zK$nuf)rOpla{KupSoNw6mylZzaOo0~((h3fckAaaSUSf7dSL^M^>v%q%IFG7 zYhGWYllX(&vXiT;v3j|h?;96X+XMPJub*>EOPN*7xtV$jywQ=vWVFOAsv}e}=}`sY z990nEQ3cK*4OMKw6jV8M21!j1sk#UC^EUmwHSh32AUp7cz?*VHKp;G;8NY$49pW*_ z0{F+G^}1DBPaAuMRLO~}y#-|>vZY(4RFuC$scgp=c7;^w??*qZAofI^h&Cz6D4Nqn zPJM{yYm5n=AUBVRj`vtXSVF&dj59}ra|W)jaNEXFg7b|F`Vr*$9)I+ae>Zsc=m($T zu)z~f%X507_x*kzIDN#-me+MlK;zck);OPEJR-joqYHBvz7pHI!kzks$-K59ZFu}NV2EH1u-rpJ1ejI zjQiMxKgBr^l80C*ZC)8Ks1jm167b4lkv)-EgeSamMr6k#7L33v=S}twVo^7d#+_bI zWkkbxCD|ysJBa3x#;Z|xcN2@o2Cqi(oh5eKZR6Fb(EFqT<#zDOiI#Ou><+hwS0hg! zBzC*o1Ml)KrB3VAj_NZQu5qrQLCDk_Qn~6Q@j`8Z0`X*wXJ4R+BUv4LMuX7hNwnHV~ zMf9xOOR~{ZsciMQ-F$5HH!AZ9Vh_0+`PPVnlf>TWZszr*Qcn|mvpdPF?cryLJ?Y-Wt2Xu^TO|5T?iBB~ z+rOFUQ|>liPb>KxvA4O?yq?kPTZujG&cLBQ1HF2u5VZQJKeEijDB#aRM+hCU&~ZY? zEp#g(^>Ci9@n@mz27)(O@DQOx7P^s;x-(D1`LobTLh8gkt>w=`rwFO#^R$sa3!NrJ zdpR>+EP3HA1V-ORUI*amk9^xX1oC%&E+e>$;4X`tBP8J44w&(0p#?$$x$OWKe-=7Q zNPxE89U~+d+YWH?XCW+5yS)~gB{XZH-Gl^A+W{Q@EOeMq1{967ReXCef&R$E*^W@n zLUlq2CWwQ<=7bI4@DLIr2wC#{S*Sxu%U|}6__I)#P}f2egtXkzW*{{6KU;8`pjNqz zgY##h9fY*D<>Z&YqM1X10(TK?kaM2>-PJeo?a$;9YghZTc%~5I4_w1Gm`E>3ZR`c? z4x1hdz_|6Ys3wj**XPhPHIDr*&#{+sL9*Xs_N!T7eVQlhKFNY{>{+T(t>l1~3QZpd zH#fn}2N|#F{TD&kMo_?U;+fReI`2D}!6YM@g55B~QO?uiGe>@B=lEf~2@Y%=$=TUu z`e-?w{{d~9=|0JjP?E3&0>%kgLfTflT;>aW9WwYbtmT+$!GLPA{^5TSI!X2-6*kTz zFDxnw6T_-33|BWkU%kjz-!dO+sy6-=<|OCBt(cSZ?!dzO3+v&2v>n}1^}Lh!yi@eN zv!UmcoNZ{VSXFsra~>0CplV~=?wHD($jh53%ESE4$ViTJe%OcY_Abx7z)sOCaZbwK zvsI~Lxp2($;fBm!qc6Fbgy^kKXWcXK!t+RdT=s+;*?uwcPB-3f^}pEF8dAD?ub^URp>NjV=g z^%%TdQPkVSB1ItWdyq3q#{r`40$|T5W#mi7&`4@c4i7$oh1 zVG1aE>^F0`fi{@%>2rv;&nFI|B9-wp{EHj+hzMiGP&HrX{1^pvbW5>QLT+}35oVCu zfRUml_Eb1*(0d&HjTdCKbG1Mm0FcyDf@%h9QN{7dZaSYF@hq9PyD4ug5%}?d83c*r z&y5P?=f)u~$hPUeS^^tL^~)RpTdo-;qV}@yPVq-LUh5dS7v!1j_Fdjf|MNZ*TP8Q0z$X2`Jvb+Tq#OFZ+n%2a^fGsUl-e;FGp#<2pCsLt{FDOy;15 z67lcE6yXK0x&sg&s7tFa=Q@c8N_Cy}mp>bBe-DV_tguC@A2>{^;U@UgIe*DlVvL9* zkYLjVic~$=~Jf)^k zm4;7&VzySRJSERg(rCg>QYYI$yBkMkr81U6^TPhG(J{D5TXt*%H|YV@c3wX)l2qk5 zLfA4mB}BP=9UIpvNSvDnNp zS5ue^FVM{#b4ip|!FAJsCv$$Im^cQ<*2ryZUs*{qzB;ZApko_==7MlO7i<8Yn+R`b z^IV9xgPAm3c|$&U7S0ZM1V&!NB9JPUxjG9xhvj9d9P3v6g!E2VBPk$Hv}?b=Eu3Ea z$^VsYK$2LXo(FEET_h5YaK}f8uUq`RidD=6}3=_I_aZM zz>+EpJLBU{!wyRMpl}P1yU4WmkQ{);G9*4h$}`?Oytd!ml?8fR>8iPrmorRWU`Dek zqnDiO1O?HL-!xd!u#aKq;!qQg70hgDS*7tsgqe7N^@dcD#e>o>z%h%`M=tbdC=34y zm(QC^qq-PY>^r(ShW|I_3=LK}t>=IP_f7#G(hgKAQRqhGQPTIasHltziOMW4F5~L7 z-jwz8+=a;zsZi%pg>jHOf`;3!vy?BlFhL@9>O6`=R9^d-v;t@B;8k1cOV5yts1V0p zr0g-OO{g+)fKbEn%~=KoWe5>?AN`h1^-z_Qg zwJHrVbu=w+P>O4NTH#C=P6QF|FV_^;$8WcE(6RGxTMPt%3KHrC_oG-y? z+RR|953+W)!s_%xgY1SVG_-4AMII=<=3Ue>riW}pP4$l>rS-2hNI#7Ev~id1SO%gL z<{n(pEp-Fc5tS4!Lxc0g#c44R014)^aDVE0I=kf=qdX&a$%>5B?4~PO;yepJON%V= zdub>5M0yLlhShX4y4%ZIbRAS@nNSZl`Dn7nHB|=t?ez0kQSX&?612fxELUF*(Hbk1 z#n!k2CIeLfBpQmf@A~w1wr7nE+!S>TO=L9edUM(^iB+E^mmlM-rg*e_he;tx3`da^ zRg$E&Dnu<{j?9-vi_CE>$7Q*T8IddL z3%8oj5DTxq$?h9k_~ql=mV{CE{5L**Bcg-4G`vo!8_!Su)ThG?*4eROQb1BBwCx;y zhP>%Bk~p+~v=)tJ(W7azUsLVC6?-6@p^M#+mfU}VM=fRZOPd#xvAKRNed!OkVOJq( z(u1bjx|DwKBG0DzW`4zdg%L}i25W!(#DOTiXYI?49a-qmz<+42okUlkNXE|w?=WmT z?#BOqGX4ZR)uW)>@n%0qnY55 zsmY>4?^J9H7q$L87a3876oly~YZt+@J+AH!gT5 zm^0O~Lu~$x7_G7nfkHfXgb?A5dwRl+%`Npl7Sa|uU=7qg!G#S?`QPFaZQ!E1|) zxls|f|L-`gXULMcLmor>z{eAb!^{r!#JYM%aWGLdY%w+0l%Nq~88j1y5MIzx+Q@6o zh9J^%!#+|!px8x(KNK5s75_kxN@p}cftwK~Eh8}^k=O_MCXyok9{)JtA4mOThH;?E z9^k-SA@OrIi57W=EFade@(*)&CrPx{Y3xwMM^zo~2aFhv#$(`Ahw6BRXxlTF^)VV8 zS<74_iMn}v)uf`n^iyA$@-*Kh2h9dXAGw1)X%0fOZq^XFd(G|7y1$H4Gkc4gUvksqRPXhDU;v? zm{uiFJ}%$}g^0wlWSg3BOvKtl_G`7ipa# z8z7vwL+yD;t3;93ltr~Zvhc7S#elV6ibDDNQjb_m&hny>JhTXge?wFotbOY9`}OvJVo8&?`n4M~c=bRR)M3#6O`5Mscrn0DofZZIl?D&c zaiEmxU@2>N8OCt?mY6-2m^~s^>A*}9rxThO!aZA4J|r|mRE@RCqmwi;Wvcb<3Yu^S zn+`H8e{0HV%!=UH?C(2eK2w&D5yn))+SmFmG+wN zDm;wK37d~>L}G8giCgyc+Ba(=DVCUuv5OU&P`AW1$OwZ33#Wb8LGv1j1^;mVF&izC z3GKn{+!p+ohW)u(xJSEyeanR`VN*^qX$M{-2XAg82~%f>bqBG-34up1iNIkbM+2d; zG3heMIWT*U+R*@Eam|CO7^4{|#9j$)`S8R(tp??;VN5!PC;Bz5Q6Nbp<}tNKEGBLt z15}wc#t4W5#5}B^gom!Q4HJSH%|T?~N+Z~E-~!kT2y#ofRcVw0#N|K*Ic0FGQnW(o z-vNN)74%M_eGC(zw8DWdZBZzxC;GK`5kQSEL;J^+?d#G77tV#W9wR{nZVGiq2+lD# z>XrmwWE9wPG6uiW3TZ3mt4GCY?mcMt-b%x{6Gds7XFv!m1`Uc~WHqi)IyJ~Q11(IT zFLO1)w*huBtRB8Kn(Dm{Ee78#Fo;=g$xX>c27WMO08X3m%v#!@{5M>| zSXseXSph3|DQ){M0Z8beMA8J0(rvnpWw>TTm$DpGURR%@vdYM+q;D7LkcTecoxkdE zaf{rK*T(L|*wMd;E9W*N%9_^#O(G#B)}!tmif6zdiVZ*weFZbz*Nt}*SD9TMF@Pji zzoC2bgJ@Vv`jW+spa(U1*J8!CS>@OZ2B2DELJkpt@UeO~43vga*6%#93ir2=NRhQcikogu8{bpu716ZR}>LTqDom z>f^3-TkAzY9AtpQc9LrZ5`5 zs+Jf}ot8K}5);#5yOzxx>=GT>u1d6;-UD$U&I*Isy#lu+5_W-VO>3jglzO#i^ifoHY3e(ee50+VK3G*9` z#KGpdKiAx`Amf-G&{^9?CCHB-Ug~p};?B9IRAwp#rVrH~HTIV3VgRgdnaxL-H*TV6 z9LzT6fvRZ>3s@@a#!u6*jJ;Nw`4r!+?rthkjJrNVX^oDtqFXdkr`s(6<*xH6$(5z3 zegTxaP_$8}iw(`xF4Q>_aP)TFGeMxYv!|ap6HHp@1R?ms#4S9Loe8=YbVPP6G)u?| zINKxCvbZLpaY9`yX3Rn=reUE4LfXW;XH|+wp6*$dqJv`BN{K9_Qo?qF_JGw^!55Fl znUU0X4(`2^xfON|p}v@O&}PVI!P(Yo5}j>5`k`mj6J|fayaE?J zYonTf8Z&dPAK>WPS{~$I#_9M42k~kjh3(0}tu1`H?1f%$U9FKZg`$ND=Zvg6rlLv7u zXcbSEX}+W@{R8-_g2LzfyS#TyR4V#2KIo0uMMokQ)UKyp^Z8`w+WMnMqXU`g@`ARG zZ~&Qg|DE-t$64xwmEF~3zOP}b&u zFRuZ0)83Z7fI_n>_H9wczF`&nwyI*vs+cM}VJ@0BbwWnsnlQ;xyS2Gkzj!PPtL*Do_mb1Qy|8(sL$LkeT z^Hl$i@?#H0fRovY5IBtkPHoX<=%o9{tYbmNixky@>~f*#=jVk}AexW?1GwbN?tOYq z%EV7U1-$PhCuh?+LbElh=H)D7ZhLSNK<6UA(tW+K2;+r-W1)CFX^=h{_HKZoDtOwh{LUxpu zM%7BAN~KY?(x_5tG*YSL+aeyGrBv#T%D&QnD2`|OU3lVIi~a9hGna|*1hGZU#8NRv z_Nq0*SuFb;SNj}S`W#pL4DnbFbUf1M6VW2wntbf-@MyYce;{&cy+ZtV;_m{;yJuHtALH*G(1YExyBLmF?%{+540JAYH0qu`#PHQG;(_g+`*^$c ziDdHZEBAbtNxLv2f*GUup)Pk|pJkWj?QPvyToFpGJ@$5vlUhasM{VXlq$j)fouR}g z;hmv)UlV6fP)mGg*s_a6=Z#WpZ*0y+UUHuYhhb#W6kHrKCHY&~)_I6$zYS(xBZ3x%&V5XfP3nQ2^jcroA|zq*{7ZLguJ<3Qr=uI?i8u zGiLMfMQr{urDJRw$B#N<36*xGEEQodz^S~f)IS~|$tpvsmXpm(Z^o>IC8-(+0EVAfu9N3{EWMJ~O zP8?(k^P?qnR`UxZagIm1@&i^rY=z;<5B!2^pN${8J95??&`bJ*>3bMiyok2u9I&}G z07SVeuX@-9K&xWU2OctEoPZP9n&`STeXRRR)ck8vN9Y)E24jc-KuV)QbUlHU%DCI* z4nP^(h&tPkz9YICNk_RRf6w4&!!-;k3nq&uTjI__EeZTvt!lI)2GhP{b1~S2hvb@` zYz@7sRvFKUMA`#G zw#tpazHc*I1)d>BlKFCKa+=nMB+y@3E=YxbPc|7-l44(S{wqoAEIyoC;{nNh{!3SY$5FeyYU+dz7 zR2m96Seru60`b!HG-t*KT32|ZjPvVe^IfCvMIA#^a;aWO*+0`CSKmPG=|M{cKyw>gY!>cvD zjOm4EoIklpp!ZA{6DD<8tj=}-+n$AcagNhbgD^6l`;yKa>Q_J<29tCPSo(wnw14%; z2*Wp6X6~k}*Z^TNa12&WqUHIp<&Nv=s*H1dba%+>@e#dbl|o-``4kz+M~$=!e4xa>=9P%3EJs>|{QTCufs zdf0|xv23iaquouc!aax-MME?$tAUXfWjE)Oz%dexxf)nYcUValSC*7-eqfcBCKNn* z0Z(2`;yA>NxMM9-s_csc+)`8;r;L~jk#vDP+U>80Va%Qjs0stkE<-1R1OtI2IlC)bt&=`y2mz!L$n&g{p6V8w)> z5biEEpU=RkYGzZ=(MC+-aVexgR2&b$J%OtqQqX))0_(@cl|LSgFO!s_Qwg!w{^d?I zokeSZ^UEh{@O3Y&eT=}EYhPIVl`k*uMhTf~&|GCb7IfH-dF)Aa;k|odZSM=aYm=DV zT)XpykJN}czxIU}?z-hDvreuBbVzx)K6kOWZVhG3<3zus$4PDg@;EKa2wZ1ayY(yY zjb8rd+P>eotNFq=1CbmnYd`UoI~Di)U%9(m#3^%g?N5H=*67JUUi*pPxJ!>0f8%WQ z+#jzU__ud$f9{X%(-b?KFc!qG30!;arhj|uc%I^V_V%RD=O*keFWhx`J2{otzOr&P z*?x8wLE1>3Y2|79JZ{pGio&+(?fdeIR`~wxfyb{TGo1U+1d?>jm{fxa;IK!ugd(E* zX3k2S5nE{X3Ag8r;Ur7FWE3ysA#a1)xa zyteeZ(-^ibUTp#t%S}FBZOrG1Mc8v;?T+8t{e7HZiMN@#kx4~EmsgvN-ig3IR~Hl#M5raQ@z`g9YZGSj!$>ie&@F*Gmbj2x>UQa3$scZpgLLStV<1J{sTN$ z5$ozyj*MMLs~`0xUq2fIPqt6IRyHQYVa@C5*UCr#F`9ARMwyCl`qXQc!UWT(k8jMj zsgIB-LK?yXoui%D}`A_pbxg!1pV6@-=|ZKsE25 z0|49C=Hnw-?a^2=pBE{YnL1P4+fr)fQPeQ9`P5S6~ z8LjeJ#dC+oR=20T6x zlC1`gQiNpZLCksnEQD0gEI!0wI{qwf2t7z^vEG7|C*}$vf0n$BkZd}@-6Aw*p&3Fm z7J`#z1|edsQSe7x*DEq%{&2Tpr(lR1gAzCDw9o9a+|s%xDT$ zq*%1X=ZID##yL1tL0>iM*yC56z^xj$oj8G7HE#Uz z?27qOszx3mqoAxBw~sh;!BnYtnm98ITZwBBC*Z1ndjoL-tZLjGae^w8oQEBmBvLR{ z%@`9WfU3r6KR#x=u(sP{wlj-Ffbldej4l7z6>hadN0pJx!tmv6=kY67lI)n@)o(Hl z1#RTVY$Mk|AG6I}x{SKTl}_5mmfU=A5d3QT3HGU5hWpelRbij7>g0n0qBsrT%65Dz zS}aS@=byCCZ`S8o@Q~z8H^18VZTTqg$gtEo|9GqG(3ZyYuKRp)^ICGty+60Fe$UhH zW^JCg4jXmr#zOrz0=qrmACm2-vgqwr*e&<|i_bNRGOT6SY1pPRdZ(gy(kvd|;~(#G zZLaJioSWn>HYjCuZcu@(1VF~Lsu!!%Y7H9M)rvk{Fw46#G=QJ_o4aGN2N&0Vy* zmGjaYEQim*R8^-p<=LPFM;>l( zl{v&Qz%;~$!nx)}6lDniYr`-ysP!;bB=kLmh~`7qg7iH-fB;wHiW~_xRYvo$?Qh7F zLWxvM;XeMx98e-$GUBXj0Kkre7P?xls!XF#jmf*K%~Xxy;w|ELP3z3{{c(#5O3)l#XKtR0 zBcqFWxXuiC{e%^Z$d(x=yJDT8RlRYAY+7gd6xx_)!#Z<2H|Jm=3c%GB&Db3*`;wKN z8C_>C*}M{7=Q?wHHh;==4i{1Ec9l7@aur{Honen;(<&NWXKw#%t+TC`8Riv|Oq`q!CT*m9j=o@3Jjp!N9z&9oHVfz7LEbe-XtYEvPj>r95UUuB)CmVKLZ2>%U_ z1PzDzrHzG*t~0Eozv?=JROAvk3(;TQ>0-ZvB~iQ_L3C2S9A08m$$XN0Pw8d|Y}_U8 zWt-KL;#DS2kPH{E(=cjKLoZ%2(s^Eib99V&dKuQ?t~}6Uz`3G_5GrxO6_r-+r!?EgzXQ( zbdDAw%mOKMm?!p-X1-L&?Z-PPlb76><6{Ex;FdgDs0}_(-a=u`U(&v8B3^p0}IE6bqxQuK$pe4!*ap*2| z@qNPGKt(it5q2>Oh7H?5e3?Ze*0?Trd8AA}IMupNpe!6-B`Riq4R;UhEX!8qKLUK> zO9M^GqFQm_xVrh2P(mjWJeJ5L|12Bc99ZAF4^?>_y6%6uSaX zM!0E|K$eC_X{1wZ2vLi?6|G`53-Kz-$&8bgwl$R z)t2D)jk&4E=WH{a=$Zqmv}LtFVl>ab1)B zYJKf@%KmKG+e*6c@4N}v^D&|$Uy#ihYhO0#b8Bwv&h+b*j#DGu-g=Cxy%u8iJw~9t z+j=b9Skc@H{XKvrBy3i@Yudw;f1N!Z?QphXvfn_DfhMk;RC=AyGhO!ceAYeQ?jKaw zTd;Qvm=-``EPeHiIv-S~JCMo_x4cTw?gyG~eQ9?UOW=-j;I5<>(;W!J{Z~}tr#lun z_Q65b*_QUWaW?jS`VCDt^%!C+r+nD?t7lKp??WkfW*AjrDpq8KYVc}yzn0oP8j*}; zp7)&`8XMV32F%Fxeb`nT&CN=AmCSwTT%V8p*JTylTrWQIqc7{a^LY&!;eBpiU!{M7 zIq}aGci=$FM3~`=e-sXSpA3_IpU{%O=cyk_k|FOVsqk+45~=hlZr@YO)a?A)-DO^Wscmq*&^bUMXqLV%IZvG=1VacPAw=|$PR5s)6PO*|E> z^aU7=Slb2H9@s9j$m>4YqXzfHR~l0-KH?Y>g@2@XfK+d@_3Ll7Hz$a+O;c3Y_32`wRQf6x%c_D5fU*!#OwL??jM zTJNELUx5aJc?FsTl4#NO?*%S`??ndO&tdQT*s%@3`uo~s0NC;j^EpJ988R4VmfG)= zF)1@938iWclqK~I|2ja#Ily%uNaIf-0q*>(0PcJV8JhuD_!j^a4Hd=F=dv;A!*9F znonZ=$x>xr&QbDBDlE%*$#|||3e#~sR}&+E^4PIJ>``;&QRd;sN}dPBu`(AIane8g zf2j=}n{?tlW(s~!l$2@GHE`jXW-Q0H6jbQ?3154(>6?Ft5y|2kloC<(qaR*5lh00G z@3Y?*t2D0)eMbKoIuyRP)Am`0+TzA0{=tUt+6>q_=SiLUYqM)Vpzr$#q~8G zH7*x(f%M@}foP;BmeU`5!43iD+_DxgqCLa40pkvL-)0qG%Rn=r9mGD07P6tiI$XBx zn8pnf?q@A04ag<<)Rg!oUt))f&UlSR72KlWaVxluhCV%dCZ=3Bjcd73Iz4V0Z6An) z4V5(R|66vX5j)U-GbvTd9`0wT(8oSU^Cr_LBVt7aphk%|z}ki0nw@P*eg*qHFVBk^DU{XVvSIxXeb-K3xG&bn^FK z#C*Zu19>-~0IjWD&O5#(MZOahjh*{=Aluk@xTtRg?E`m>=1bW@iPV zHU}uppl$J*L~hEnGjel%i8X51J6r?o*Xq+aY92S6HXO&BYPBL6EroD;$hGz~{D28b zFh#1M96>fVK(Ea<%``wLr_}~XN#fRSOk$jsgnrMaB*tDzC1m9VW&$nU_aqJVpG}`J z@=6j@Yhz_W4jeIE(y;j9t}%+XVo*8LiU9}!b^*a=I0L(71)y=Yg+j&{C>{-PD32WM ztoRr!f{M$*Zc5=2>;zn@jQatqY!vV&Du9QIu|Z;71$uc-^^!8hKh(Bhz1^y0Gztp9E8#R>heM13DCBU8f<%!$ zBF^A+3OL35?2;@l>lzZU)^<}&SKLS6wgpbEG2Rn>v#V18thh(OwSjKS4BHD}3(ysu zb6;0lgQM_K1O4z3)iFAh;CCEY!qd0bU^<$8&FNd~K3De~uFZ9Qo(4Vp4 z>`gc=Mt&Z2xRBwC7X@^U+X_rkGhN+dJJ+T3JMl$qKtVomaIxzer0r807c7b2r}Ipk z+1y-xUavMNst28>ugrr1;ANvJ?RPxJf4X$LA2B|u%~J#jJFHOF`J7jd;9o6Qu-Q>>Tq z^p1;IgkN#nB)?Bz{4b`jnY1qHaxeo*{>CMB@t%w1p23==Ys0mW;tOW^xA7qj<-(ev z{u*|5RN|c%=T=sDA{fU*r`5KN52+k`%@=8M)7M)|Ugilc3ZO155sM0@ z3N-}pte0T?(p`e%)J+2j)6xb~FP7ER#bgIYdnj-IB42C7+%CS}?t7|El3C(|c;Lth zt&z@C)?F8|@O{x`tSNF*1)Iw@|M_@&%=*$2-Pq_i#i))JDHrqobBu9xnbAPxott)& zJ+X%0ZLq>dka--11x>qQ@OhS6gM#?e$^bky{{RHL%!V{uP=XdHkqt?5GWj_3FTvi*9vFk!JPCp*fz5{1l*=nYdJiT4 zZou`19XMywfNsA$;$JxWlgrSbs7e^tOz9>H446G(sF-g*{;fgeJ$BqS_l3+3fZw!cSu_Z}N zy~ujT9O>FA80Q*n87plLdxrV?W+AY=Nhg5vzGxM8k=YKkjAA&h(ppb^HP}e?GHz$- z3OEvPYS_ZR;0U1{G2mXAXZ{(@a0&36q^n5$Q|AyKH31mitGOt38qU^WuLSLx&C6XF z2kV5k|7n*gn%C}Nw9#6suH}cX;W2|f&l1sJ@rN;4t%CaUBgMn)RFS1PifA}dR`=v$ zV9SzZJ{A_TATqU75zRua$CajdhMj zC2SiHbjW6iYY>OFsn`Q{`sI+tsaXs;H2DA?SPWc1O{4QU<6wbZU`jF{-E8l0%j~RL zNd`7sie5^;{o7vj2eHP|U(#*bwj9B5PL>(b8sE#BC`ca?p3jyr5SoGBCez>J1l`gZ z-4`z<)uw6ewwIa9Yv7;(myW<8h`9|r;XEF=Sgpw}DwQvL@j*>l5%hr5F(OTINjn>; z&K|8mh}&9O2KsrQ0Xy*CUh%fF!LCLwc~*@*6o6N= z>T}d+p>Z54;j;9S&?Lkdh6*A$(p&{y1&AH_NaEJ@>USnDBG}D{Wh1j#E@e>zk>Wi* zEZG1Am+&%(BYg!13JfCdlP%+^dLUDr+HB190I~69jeKd9z?ht7U^AQNRf!b8lmv z%~+FqHjzUhGU`YzVwm&Wu=z+J3}GZ_5x1djBs`F-MKEjC5NnJ!K|eMuGR8)CJ%)`b zUhkXJLb4R}T*tg451>Ik%bRa@i>)K%=;b+zzT1df4hxZEI?vHwS^x$)v<4~; ze@4)BMwg?ACngAGkSmSA*>Wo-R3twLU4=AQ)aTP>2q>Gd43y?Gw4rq{$TNmP9;9f% zFx#1dC1^{rwIUX4=TNGGV$mn0AZ76R>FabA^tpq?@mNG3*pLla*wBOr5?^F;j-nXA zo&M5n#P*hI5)-LxSo=*{0&c*jWPuumF2(HyUCP{r*o`1_y2b`p;zwg(d&cSlT{HYB zrX&^(3_t2-jxufTpGZA6JAedWU+q*K%@)4?E2S`JOJBsex~ zt&0?zVlcLNREBSGpUoAf0^f46A#G+j*9GseDrWI(1)|MnIPT`H;~~mHo0_Kn(Ibd6{4iq9KCoZnhU> zZouDce9r zTS6AG3PC%Ge(%%f!XVRs+9V|rAkgIJ*h-$mm5J6{j|qi!M^CnFs87%!POKB2&nM5>X1dv+Zr}8 zV3bpv5pb0KXwGgG#U-N|46$Y`T>0(s3m3kaspWa1Vg&QXT2M4f3#!1pUULcF-gPkV z>(En^Rn@AcM^hF7+euYW3m0Xzq2`jG`)&E$iyDQ?G^FRC>SXPvAm@Z>+*EBb7FlPs zny^=Yig;)>b%!Ht#u*k8PLOOo8V<^{oCW}03OR`Lbj*w;C z5D{~yAj>jQGnhcg<;97?9Sqskka?Cn9p+pw+>I_Msv$+j`M;pZD1zLW{U3g+&1S== zLt;#y3YW0{R6XB{`YWq7rtrpU*#&`qT{UgOO))yGVV}-cKiyMQD_>MbLvA3!B25!S zEc93hCpiIZ9C{%k8m0E9Y`TUtbv{qSY0?aV0YJ#Tvjrx9<1>Ng?c879Budk=ZWF_DZLf!6jADa|#=Xy!R8hH3ZG$}eI|L9fMAI_e@g4RL*E%%@WrS;hZYRaE;*J;X|a6xaYw&uA8h z8cvTF|B%8$5tijRAPYL8?{kq5X(2sEE`-QLav@29aC%&qy#}N}le(TPDUb}PiS^7= zjPn>NP?q%IZHt~Or9k8Iog9l%OiN%CkHIJgV~AU=S$LZXf+El&%p9|X5~ICZ3WDNX z5EO&O=w#6q69lo&F!`hPsmc)qMROV26M3ewBEbYfV_p!1vMi<07Ve@If*|ZcNj&hr<3Zhm(0OoU=8e^1%=w6K`SY?LOVa&8 z&$zFoVemtr0q2{N#1OC&;Roxiw6R#(8zbHL#apGb6-yOXfxtVi5Jvu@r8)?%%Qcv{RfwB#h77U2_-A5EH1@M%jt|6MdEiMz-rRP zx7-mNZo7K>e+=Wb$rn#%iFv3Bd*91KW}t*-oXm#8*I|LyxNz70%|?hxR63siPJsPh zjCOrb60lOSXV2WD&iZZ_OVR0jSnCVX_m8I02&H|$rM=(M$b`Lc?w@nMUF1sRANtC?B(sYzH(sKBryysfltfj%? zucjUKX$LIr#Aw=SpLW91vNNNJZ}y3JL8QWSqiJvVY3D5Moug^*@@en1w0DoDz0aq; z+tRT7S#9XO+{se!mo4#;(ZtozCq80{SHjU$X4pQxvi`z1!yV&Hsl7hA{wI26-t6_q z)+hcr-0{BW^4Cu@-}LOW8_N1zp8Q#@Ri+tW?*}=sJu^NEJD=u!t|mWYN;bir;d4Z! zOytjuw?DP^AOG|$!aBN05zLW6GB@zcn4=bRx)O8RV%}Vdd9%g5y%O_wi+NWi=3N%^ zzDmsdECwW=m6ctxs8!&sj9O&?SX>{i#(mVseX<(&NgwyAYTTz3r*8dB*nX@5k-%lE zC%MyZm#tjwD&AJy_|*?)a_xwGKW)kh$;SUKn3$^t`X2-}Jwn`h64HCU7RK$g*Pnos zlGb>@5{h^*D>yV!<-6g1rJ)O;D6ajZ)7*%|*@!d=aNw=YM#8yvHn%K<9Elwhq*K^s zM(PUB4i$A0(1gvUmueXqcHmO97Q|6lZ>Lv2ISmEz7C1f1tPQnwq08Aq9At~t4;llq zp$5~PTDF+jwhXZ`ONl}7O^R@tm z9r(!b>Uo{jtA%>X5__#l5*Eq?H=1y|OgNzgHmgP5Q_+_+8{Goah!pD7D7Iw84y<*( zR`3b-1=T+Z03dO^i8vbqf04jD;FLEg?LtUZ84fZ#I)U()LCHG3@5aV3qd$^iUzx$D zGbwpeMn?vkRdz-EjhyqXR{s#cq~I`1yGF1>hsyw~QC@FiyQW0r$!Lv}>4Pa!)Z zq2LQ^v4SsoEe7(^eFH3tpkoJ>#-oNhlTKw2!VpWCIZJD34`3V3ghU9Kbi$ocY1`@f zwA;&@eD*6U$Aaxt& z?>$J60ovwf;60^`BcwFri}e#ovP?tIEAlj9iS1^L*nrT^X_Siz2(#YHxN$&)%F=yf zt|{~un0LxSb-6_gEyBXC5mxSOXs&Ya#ndP@oLuUAML^Yun zQ^qXb#aLL@iNYT|jqzHL`Lz3)I9E{BEZ{OCn&`%rRr z5#v62cj2xS-KEnt{@60?h+zHYPzO;s0Swqka4iX`Ik3>pJB~ay@3@7m=AbHz998EpGq|CvSj-)Bug~u2&mk z#(%@oVjE|DYEu{L+L43j5MzuW4BDB4VvcZk_~wGq2CxN%L8mpj)A`oKTyebvOx$jN zvB8aW@b8co5h>E7#DLjJn`qH!3@-g0?=x6jKOdB*1@w1Gj~xM z+(jAh^*Y^&$zBhu$-ND`YrvkM-4*RuR%@?!T&66m`*-+S8Dwu^q=al^5r|bsb8O6@ zjVUi8jnjak4<^2F=x z(Y8v~Eqk=1l3~mC&W>i-V$^nx=GZ)HdpBn2PqUob-?%B7_5Qt143Y*k3`@bmIK$r= zBuKEpeTF#QcR76lQ?!szcLc|YhAD)mQyJw%3u2{tB=RPU#L{&&=P`@Kc5^lIs6}GD zxf*$+Mb3;y9Z!E){eGIN`mxv~WjR|Vvfl+x=6VRyhT1%k#80JLw#1z5~ zRUYCpQyv2Ti)41YJQ9i^4{;#ML*SJ>geH6*>XoU0Zyq;Yrp}b9+so7)W$J8^ngzSc zWK_TMV)hit!QL_z(mzjiWoo}nP0G{*W$M8)^-!6*P^KQXRBVqN3yze@N6X}6<;ORb zsVBYK{cQ)TMuGWGT{^$y%r<$XF+Cf`*i-|e75g|`$M96+B0U}!L z!7#$jQ5?jM?9K7_0LIEe>G+^=xWS{wNz_xQu&4cc7jzsqey~ZW&2xKhNC%k^8kv{L zv?~vhFAt#~-3LqeC;1aK+@-~^`bk%drw~d-Zg#*vJVjgGE>x@`c6Ly`#h_n3NT!H^ zo(AbCt%tj_Y3VItHE{;gQE?neNL4-=;-h8k{fw)KjLzUQ7&F-U{JkGuUA^<^Wd3RT z)gsQh?q?L25jlr3WqToveMQvVK9eL*KlN0y-;sZxBi*^lqKN*}u2nz^^W!dNU zDBs?v-As{npHFtAP+FqW_ABcFM$Vq;CZ#?uV&qSRTd@RNmenmQ4qje6MUfSih{%{mi#*?uY659=DI=J@*Ddu=s97 zGXI~>Ltn$mL;4w0%YbT1e=0QBKoXT=73kxioE9n z9D*)=GXDY(9G1BiC^s%JKRLbj%wNuB=Bi2rF8pcEYN9X9P>LwFxNpud>giVl6gzl@ z{sgt%0SH03NrO#N6ATwMmrn(dYn0J6Cv>D*NM1Y;^3T!3)i=96pJ3*bJwrnhdp_M+ z|MH1woI7LW+RLb~Upo=aj!~E65BrkOj@HCWLJ%0 z7$miGoTlgp))bV$Q)%{v3XwldcLi53Cg=x z;uN|(RwP0~pOXb4-9MH#$N%wj5=2?f?RiFV@U8A0WaI{%mOXrebI7E8#$9XE}6+QzA4XmQWVynNla=Q&RoMczTiofJ6Zc8_GdE6;eQ$apsy+bWNY=XCrBm9f6kdDM?VYv_(& z#&I;iM;!6^l-d}tXatZx8XSDt#p|vf?uVVzImZI@P#1Fx@d2@l?Ba&lKK@kz1b3o% z6_`|B1q_u}&3NTi^ICb;>{VVL)ErgbH4~Lrjd$f$gIamj&{bX;p!HrOoZYKMEtOUE zvN9Szdi^bpu%BHd|+4xIvuljazqyER~NPr z1i$=oe@}vwwd6v>tt%4g3?Ygp&+|#2um#u$BD!n(J%}8apI;OH`k`OH@s{sRc0%Sg zz-)`~+&%#|2e<8|{^zyl?LkTCqil3;OzJy}i%+}xwS;})G{PY)`DtU?!~Vio7O8tK zd*xr3cvH2^zvxpa-{9HEf793IaXRW)_KD{cwy%0o!QM3(5t-%RWBEy(_xXEtu5l!q zp()sGk-VO_CU4oj*jn*KErL6tOpXljUt`Sh;S~T33R4FLubH#uwIkM$SuyP>6}uq- zaEDZL@-UNhG6xxC)?i7VCE8nfHO~<^4dPWc;LWdu6YtFIYnn@l1H^(NNi~-c3#Cg4 zbLnxESRkBcnM;ThAS-Yhnaw4{Nn*iVymGpv;?qO};p9dXhwBf}%aoaRpHbiRM^>?= z__NR$A$1btJcMMu7iC65>KZQ138_>Co45(sqqb+TPJg>yJ*_!O=-OoMeR~51X}PqqBDN=&Ze|oHd)Y z+eatut~WGk*&CX*|Mp3<70SZQ+FDvh(Ul9WH#%o1!Dx=SPM6P_O<8Mn$|gpqYjqvU{}n zUgttHEO|PD=e84!$hnET@$0>@@Nb8^)_=0WV|M+Ac>ABW<8e7Bw>>S*&ccOEqqaT$ z-M90Z?0@Imj>$f$-qqk##{2axS3uB6q{=oy(N(MJJ2ieaXc$u`0*>!n=u}f1j)$3yGxUMzjrO#ODD4NkO z3ZPkp(6ylyYJ%dGTB&Z5314==y@&)M0eX-TDSIz$Wji+No+4M?IJBUHix!yFrW0-a zL}PJEHs3hS_-Hc-ia^_YD8_>9sbGDvg=PvR%APDfnRG5;Zy(SC8JP9w74744f?b|c z#LeM_hVgekVN^NNM8hahHJ_?1f0#kOn;&q{?>QFSM9+8}=bXgjXdjA?=P~Ai#}SAU z9yc;%JQko>cpL_BcpQSez~ct^0Xz;cR6GuHm}d_-7P#~`J-bdX{o)1Eg=^i%f~1VV zXSO2tml0V5XW6?rs?lru5T~6o4Rs@yFxf47)nI4syzhlUt0kN<*uonL|bC z)(FB9g&*B-lILHl#3h1Wq#vb2FiT1rO?uO{HsDnc;(EkL2POY(CRYk7Ka0?IhJ?z$ zgG$K1o6&dDi?ZsZ4x|@A$CqYr%1WDfNOwyP3)}xZ_NIOjQ*y9f%3*mR$Ai%lnN8Cw zgb6fwn^dyUWtO!Ao=qv6*|ljYra=j#_Nn~jq+aAHGMfNbOV$1EDHL5DhA6bJJK30n&XSZXiqa(K$Z~fw%ebY zk}uFlfur6anH3Y=)vqSIT<5B5U;QAGC_`iuS6%n&2i>mko-@(Zc8WzbwU+()e&jj+ zzlohV+^gXdJMDaJjhXEduGQcxo5qaT%bb4LZm_qq+z;K(bT`A5637*2(014<)fm&_ zKpj!aGUxK#$inz?22{)W8Kc~s_&MxKZw4qpD$AV9h`sEz$za6&t|wb1ATP-=33S)e zznIH*PD}-ja4c%p>v3(o+ikVmvV6vnsv0-|sKscjWSjTG>2VR>AmhNz^p5m*$ZS(J zb0o&)bu$|~X;?Bhc3!P$>;YAa#{1H%v;#G-Sz9|^rB4o+0f!Li15GeP;eBb%96p*R zB|kN`o#+tv2+75jcMvYtrj;3>Q^hsY0<=-6uYc=?aPK>g_?2K$lD1=nK@H+hQu};h z3};XgV*@vcg@FHhG#b#tlxd!#Kl*&!ZC`));c(~Nkpx-mm_r|6tjr*f87(s0Ooo`U z)_;5fdd$Ic0TkZ>xwAF?zf8x-nVL{+9?9Mv^q!!S z9d`z(vsw<$Uyd{mT8>yb$KlK_-IYjCl&dRD(0NF$&Bay?%sImSN3*p{O_6*VNz$+Qz84mSa0y$r@w2_Dwz3g$I9riKs4S<61 zeGPoah}K0^izhClr8|T_< zHURxNKZar|nTP_|_m^x;`e6413TV)90eF74HC|Y(A+0)ItScL@9U3oGv5QXyNN8+W z+B{!M%@qy_9>xqG*=rGo$c`PNfGaS{2?EGOA&p-N0*a;m{Us6 z5|`N|aFVx4c(n%PlK^K*pGvsZZXaNBc}43_uhNh6BjvG@MrtMp+|-7%I?$ah7Ca!8 zV?x6kz8K94nQc}MX~3o9n4?tEs8VXx!zy>CHCyQ|s*Ka^^>jyjy>~R+^*8k`8hAxs zfzWKai%nqyLj@64Uk@#Z!;iMAkdLjx4i$#!?s~chWN6LpQl(I7Pr4dA*1vQ#d?0>u zb!vV0vG8A>L~zOtJG-!ezhtgjFF~uBIj>abo{!l2mOTSVpruqb^(_KghsZtN|EJMo1GGGVmSp$(#x(DN`X3^hF^6 zXRKUY&A0SnvK0b+q7tQKKX%H*ol1UXO+{oqH35i9r}T}g@+M7 z*L@zw2SlO5RHKM`St;WZe)?sbh-DGFjfXX-N{-sU5~8~t3F$y(<5XE1i%`S8e;#&y z6q#gQrZzxhm&L^FDdNCX#GMEOGrgjpji+m`$Qc@^85$Lw3_YsZZ;4!HWT28uPsgHb z^MXV)pN9(LXgcUy@iYETjAvdmY~nqKIESVIYK;paTKS!!66q7w+Vud;*Z!|j7-sAJ zz2UZ#(W3tkrpD}AES+XX19Y1H96sKJks!`#TN256{IW%@KfE`*FKY>paJYuh1tGUI zAuWBUJW!NGxwdqzJL#@-ENhesB|_A#CGa0EKKlAhH2XD^_(kcrUwH-R;(%{IiZu+Y zFw^O~sA>9a_|ieXHm@S#rS0GYOt+%z}1&%if;xNpuO2|01|(8Nt%kH{cZqx z0LdlE0Q`w1KQ+yMhmtU)^H$~*?Zvlt!+3H13;V*w@cepxKD?kMtMdq_+guCQLb(zw z?o%h%FV2VWn3$A^feTQ=q2WX8Uzrd0Wf*2+2WM;tl!7r9=0MX(Oq~l`%oJ!HHUSNk z3`m3={!KX6V2s6%P(Tn0%qMsIDU8#A{`F28*tU=t>ZB6@Vs>!RO-z(tC9%K`k9yPM zgSW0f&JDhuFMQqv8kEdcAxU952Bt56e!bQYZwg!MxAKVE!TMAZ?x?lWsq;VkXg@p< z=I!rFqT6o&LOty0B+Us(s?dup&@l~62dX)S!7l)?voV03E^8EMD43x4o`iObht6-1 z{$m`r_Hz#mqzT-VIU|pn)tj4F7Y=^H5J67YVp&2QrjODs^xXE7rB+2)PDmg(W~%oE&m}arKdv_i+b#mQ!oI zNLdG#`m`5uqK?hr@FhDI4ZyTI($1r!=f>LHt_s*J zmFN#KDgtv;MbgQ+i*+oHzPf#`J|V2Wpn5M@>o85h>Z3!NUc@WcsbBMMhG97O+jV4& zOAW-#9VET;v>z?;fr(Va7C_fSnID{!>%s|{`kAD^SP54H(QuYVuI7XO14d|jLOi8{ zP%X|BmL2OR8P|=I@iY>;aBlp)Nn^m+lZ)G-XeDa_&@n1vo8(@w_3r~)^>5fciCL_J zBg6Zk#@A+F=mP(M((R;yh)RHqx94z?x(Bqr)$W17L)0ub9pVox3I8%Wa-0eBsQ>K$ zo`nA;?0z)_tCIUUZhn3L`oB65em>KQFSNU9?Z3nRq04YL%XJhm_}MQ`sn8&O(E{mr zW_strkKLu-L0}LRC0US;fBvD?ac69ae4rd^Sg=K!KKW~TG0*+lRQmC-2lwVhuBCX+ z)Q%*!1;q!bOxnc(Xeiuo{C!>lyPq^;=U0KGrq5ge1cXK zUw>406C$v-jP>CAPkb7}v$hipqx-kI&(cX4D3WKAF=Y(>E~dSJ70YEt6YuenHXn0$ z!8l;2L9h>t4})o9v2h?1O4dn}ITp?nHKZL6jsiQDW=Nm+-~{Poc1D(&|CkhpbM2r0 z{+`;8CShmoU;XjH45FJ1yrQesrAABF3U0hp2Sw#yvcZ8))B}k zEW_g0&w9hAA(AMBEbtZ4N<57J(zmu{DuZu(xC1T5K$C>6M*CD-F?GC|^~t?*2u`zz z8JVagZLuqo_;x!AQsZStpN?v?v{AvH9@qz5_pkytg-|d?eA!u7vi5!xaT(RSW-$RO z#hR@9H0=6fY*K_wM9UW)dm<5VvyfApt%+7l`wAt@h~ZUx(~~l2nCMPe(o4tL$b2st z_He_nBQvOudk!^8M{5GjBR}o}pM2Z}K%?UhSp}rzW2a%qaB@EEQ0^M`$aZnn!xAvc zV9a1f6S?+(eXHT;fR?R@W$ED%JA%VG&>(ZwabyYrw+F$|EtWN@zv?MjgiDuAM8q60 z!(c}|0c#HM7+lT)UqS%4b&TN4Z=tdwOGn%NC~X{{zmDPQj*QRRwQtS5t`T{9s}YHc z5qahfj7VM3t`U&k6vk$&mHF2KA#1<|_B2ab(VhN(t!fe!)deBrV%StC8s0$#WVQ%*9r2@!25=$z*V z=xuem;?3cJ$oxZaqL7{m@H`GEV`v3lwWSef{!0vI*^qQ0P&`|lZF&4HWe@GJ!rvG# zB}6Wf6vE$pCG>4K`8jgcjW*JTz4o1#_8$eQfXh!fxdw?B{KNSNn!$>cs;y|j;DNP= zzWIY0m+NfB*VFd0<^fX4RvQ?o={H=Y!U8dmkqxXs{BY;|wgmuESiWsFgmvg8->yK{ z*>~D}E@2s7+ZMRLK%ivN{II4OHx$BjE(1Y{wTnd61dce12`{c_(4+KG*Zd(8L2DR! zY^7iQW)0LDusd-S=V*RM!1kzANJKMueA&k$5UiHoaxK0}|BR2|Tu7Nd6Ej`ks}j`K z#Xr$;&gyBG^+5H>ZwW4k5%E?k!N&37cQb? zy`d6iprgtFk25ddx@en9b*MDlG7G}FxELs3F3qyzGnWO5kz!BAn&wF1%7x{Zy!D(* znMRH)#%?Uet@pq2Asd3f(dJo^wwlu436}u2o)JC(qg^`FjL&d$Pms+)LZAqN1#EgC z1GeN2Qd=S9DbpQgJN1d}cR92fUG!48_S4@wni&}75jhz7wWxh*BP4l1@=zr55Gdlb zr4iZyMbL&eyNz;efZvT!1Y59SV`C%lXSRS)8} zI{BD&m3~4^m zYuJh&;Dw!;I3Y6z;QEL%E)XSSc3nh?^(B(G#*|3TtoY5Ca)>BVlPD3TuV)B@n-C?& z;#JoOqRetkSyc9Fn9{x%ro0ZKwDheJWl=m|YaIt`2j4EAiZYn%=AR>W8v=f$uA++OCJIwQZ?%CeoJ(fQp0O4_ffWuWf_l zr36CCrQpj1p9(QE5~TmR$o>Ns9L-KX<$3ORx1~S#bql`q^=;`9;@bDX)9}2x2v&!2 zB%}uRg0jJ(VC~{eS-4AzE2thAdC_BWu=BzkX}=JMSxY6n*cc>j<3`ZoWn>vW-K^D_ zz6M`U%L&XgNPi1aM2nHigR)-FZS7@*z?9DNs!I{uMNn`Z$vGxqKKta$d$W*Ktu+l!z zK18j8{ws#}cPJ{ztAW`To}4XWw%tnHKo}KTp#;XTPldw)WahthMKB`X0w4pnFQ5N9TYLnz_FkNQa^~o zOS*jGYZj06M(HkzxkM1ILqTZUp3Mo}I%Qc#1#HXFvt=wGkO9{$i+_7apB|J!>6wYDoV88 zhUraROq)~5zS_lfFB%WNI~09;^Yj@n{WC>dSG;m$1&A*ddHk=HN_p<5LLT2(q54Y) z{))p`s_7S2$io^4Kx`Ag@R40hL)~x_xR40f#R)R396U3i)QQljMQJo+@H5n;JryL5JTC?;p zl$#6U{VPCN;{X6%Uj^(#eo#&sy4J3UE`h$W+s(XhYONFDZ>5|Zu3*xs|$is>SfQG#Ojm1+F5@KE7QvQvm4ou^3E@`v%%neS34Uj(rwHd!TD?LtQnkN z-RJNt zw!nNW+mH#B_3WEE1mZ&#=q&KHQ$2xg3;eG&Sv5OO`uq8HvNJ63PbYdx+GK&>VLPZ) z{FxT`W$r&`?3+Ds;9_E*1 zi*Fjs&dzS;Zxa6g=V}{B=d@O5044!8Q^g4_#1UcwZ&Ii~v56+j3*`QbGVm)(&K7#Y^H;-js;^!&!g9UMVLOtPSxDO@J zsDRV#p8*vqe>llLl0c<(qd&D@s?LvEy#@I-Y>;IS1AOaS#mA_*{_zNY46|9; zZGhgv?-MJ4e=>s88xz@aKo|dj`OUyFoCgKGWlc7o9V75zeh(zsr!`9I*>7*5>bKtM z<;=fMvcK`cC)V@^|E&)`4&eQ(0&eB`n7AFwBAl;TXTx01Z?3mt{>lxSx2|H@>Hljr zv(Ne<^PhOZPC{NcZ9o?CTnqW!`ff;)2xh4qvRxscwAueEpRa{{x0Fxv@Rh(Eb3UI? zzLI^8%00y4J);eIUg@VeIq#b`t|sTn8KV+8Z|T_7Am?YCwN=hHcauHrVzN*AIZyx} z@N=M?Z^>tv1e5HRKOD>MV-nSxgi?}&d<$4hA;MIe}A)0x&pp`)+Sv!|H9d%dmQI)tumR9`zczT zd^TB8j1llZ)rDMRY=0*zlSgvQ=axSGk#uIgKu)d*@|BOLGaCf*os~cmlUxj@BwzNH zlq^Zqv!Y4@WiQOqZ+s%u=6Abd>N1dz6d<1;T&YdlJ{EE*$)(G3dD15XNJ%hV2J+@2 zm+y2X(`6ukL@v27QxZ)-FZ>p==@*icptwam*f09bse~no^>hgVLDc&=fDb}}bl4Yt zcYmqd-P??r_-xH7=)1a0r!SZL`|o{!3*^<^wd67o>u-U)t=kE`Afdkn^NnsVEQhiF z7R=vvrP*E>-`@hcXQgbGtiJ{F-W5TtzXkHn6+x`O1@d<*Hrx7JAn)m}ca~LG{k>iw zuU!cLU zZ!PA?f9RbfZ(d`Z6>DGA=HUo_ zyRyIME-y~~+X}V$_Xz%7ZunHQcLA@)erpBzZ%6nyY31+$;3xV0#|q%ziQsS63T7qL zTjkaM{}tg+YH{*`Lz@GyCUlIKGevqE} zUIe$L$31zV%ay49zazXYLLP6Bd_RKUqBYCofj=tK>1d)ERJLAvJorUU#CY)cX%+l< zJ@wKE{sFCxP6wWshxp4P{BLUYb~^Yn_{|ag@1;|HJn&m0_-nhh$&nCOAmf)u_*b0$ z17!b-2!3MA4*>p351xbiKg6u?<95}pG5hxpYcFF8Bt0Va0D!^~M8+`@8 zUt12ILoi~0uZi$17W=c~z^7WkhaFyCd;-T%At@SG-?l4=lclKPQ0~?dMccYKlV_D z0(b?@0^t7>b_Gjsz>pogd01uA%lBLmvP(gA>^)?#NbSC17vd<_mF20hQw{)tTuwNO zSpnXnzK(Zq8k`j6qRJsCl8v(?og}+ckG;cUIH}Bb*Ad5R{`dO)9S4~V5@>I<6xJAe5%|Eb3(CGQf@<7 zVs`p{;wp*x?aRR*1QQxyFzSikmwGyqD(v)M3OS8HAstQ~u*+}ZT&6K{WWT#Ds!Vn2 ziFjQ&vCgr0ZnX@iYqanE05^GRo2a|a>E)OB?{@#0^&jUySdFl=eEvft&r1!J8xHFg z+w;=8@QMecQ|G1jjuIYj17O@d#IP-ePw-_+*r z2M4=!OR2h3#-qX|By-s%q<(0Hw)bcM=1qcNi*psK{uY$*un(c92CipIe%$fl>c2i* zjMt|RBW`@K{IAatT!b_EJ992K*6k8Xoz3t;lJ=9Xk3>~c4EZz9wG7kvY{ioV7s)a_ zS>c((Ggo+?jOWRP=PEo`6`rf{TwQo};n^h*w{Es2yYcNVqW0j~Q+W2`*;{z_;n`Ps z_T%9SjjzuEJO>KTHF&NmJlEp6w(wks=Q`ItNT_ptzIBQ2`_>ytbUP zWgN(zIm}f>%9r@hcK?}m)m)*@d#C(|vyTeY@pPltjo0fk0HL0i@eZi!=H&sh>vg=H z92CpFpzCEoWRv$|fav;;HQr*e5_G-Hkz7bD#9hC*x(D;qp3b3oPB87{JV9ONs;l&C zN^f}=F`nWSjK@=4@OX*~9#3(><0&q9JjDf%CpdX>vhx%dqCCX~kEgic@e~(4p5lVX zQ(W+PiVGf3aWF#PY8nsfbwg7a0#Vp(;CP!yCs@Vy6jQw@A;F>k=fmwJ4tPKh-hrH& zHvatPv~oq>cM}xHX|<%&|C+Os=8f>+qa?Z)e}H z%%wkuFH79Mx%5{%`{vxOZr?3@Tj5&|-&*)q!Z!`y?;{Y8{={%?o!fU8nK!t~hW^8f zbt4#91&P&l?hIYtJXYn)2)&)JYTrIjuM?doYarBYfpcFC0633zM^&TVV+{cj`RqJu z@0)UQwlh2a&|vHQ4ySc##)LEu-}`#%CKz9pZ_ANs{qz0@<-&1a;ds~ALdZQ2!Ndjq zw~CVEp2G1}1AZw_GLrKC5L&&ph`zIMe6=X>jsoVk2Xz(k?DmCj%;gxBhNtNtY=!&V z4huyjneMFDvCfOzXGz+f$Zq{Q=c&|$6JNv8#&J7VK(63>Z2NrsO1}3zK*VJ@?uJg= zJ8@v*B2$D?T#n-*IWEF+T$w#VnOEVzqM7U^hq4F$_P+Pplh%;iUfydute6^d=P&Ia z?$c6*nV*BHSk-nTm^Qp1yEWHs+NQfeMm>k!1q)F1dhS{3VA=-!S7vBq= zNnVtok=8w2-=TXZr#ovq+<&tB=@QBhNnk$iZ~byH3M6p~zIiA+5iSA~;0|@huAX-+ zv5w+9k?cJL8V!BWKUvJHkiH7IXzz1vVJ7h(=RZ^a)AFA>O&aNpIV?kR|BcC!ag(ld z&Gxueb4(_Fc5}K-{fYsyyT9@7U)Vj&&1gLkjY;WoH-cE%aC*V1v)0W2cN;K|CB0?U zU#sd*QvFF)e{HD#TKd_o<+gODu!4Ga4_DS@JXl6kAtB1VD5&Q=!w`Y$)nTo#`~Fn7en^c8g)*RD;ww6y-Ielc**c6H4IH|6F6E2ChoSjC>rR3Op}_ zRme-DPhsM#g5#*+h)$rlM=LOY|Bt#TS29f+bGe%|Hl{@9C%pRW(?20e<`yeA7DZe{ zjOCn<%p+zt+WW!CsOE7)47O<9e!~^GY>PDsd;8r!ksnB`LkWwEb^QDE{mJPoG%2l3s`O>^9&PLHNTc}%l_AYzj8so zZ>|mBe)-&|KKnQC{_79D{qu7-f$8-Y^q=4Q^1uDgcYf#Xs}-bK;N^F5ol-f0BqRwT zD%?#387bvW+I!8qu8FJGSuK|H&JVx$D>tcX_y}^NJPL%Jg7HJviMd!1u|_qAiS1P67(p*{#PA%Kn^)j{PE{V}FM z2{>2{ACtpP?#L@32$x3+Gtq;wHbRoshB)ylJ)NFCm&d$(Wlw%Br7D*4p|1;))9)~` z5vn#Z_n+T*;DHA}^5(C8g+YFIm>H_a%n=cNarO4Ea~*hM?z8{&vTuIlzhCtqCjq{# z0A?m|PY{oA{xju2E&r+ek5QL3jG`OvEO+62d(K_tF2XdM8@u;LahPE@wt#fN^DN@u zXIanj3ew);e%Cw?#YpE#t|^^Di#r4C5*%f^KG?p%J;|2faJ2S%Lq1w25q~m(j5N|- z-@tG(xh!;^yk8l?+}a!691j~5(;P^$B$brI)YzAx0_*n<4>9I-=WIQHn8Zh#Ifron zEN^n_Y^~eq*2{#)djFQ8C4uz~`XoTXn(Eh)g(akKNdYsVcQ@NH>ZTdI-heEA0yINt8tl(_s z6`7(N4{@yMIXRsg?5d+;9X<`OLz5pYfJsWxS)a<4zK181hqKj3xsoPh%N(rdaRnGC zjcR5u?bk@8-iRcOD$q8`sGZE-_h^EFIvk6&c|EU^G|bQ-M;@emBjb5YWukz55H35c z^vpSSRS)RJF-$Fx6~@ST9c|Ak5rrb+CNmXtQ!#T68<*r*OwJR(ZcM0~1ikQ8 z2LHg_K&wcHyAO%af|ZLTB3e_-Mup zPA}90+YOq*k!n4vA%5MSLB1SEVX%;G&TiBJG~MF1a)mazzDFP<4351labfY*~Jz|amB8jPkH z(Au7gEu%?0yG?=w)f}~qjZvPT{DE4-Z=T<+s znmDJ1r3Q@+Pceh~QOx2q3G631g9K}`*JBi>p*N)|;*S5z6zm7#UblNEFIYez+!-e5 zHXnrR^}#iLa9-<{P|a+y)%s$nDc9q*gm7cmnHaaMq98^Cz1zAx2*@!JQsMH}9fRXZ z>}i-RU182;$+&1UIRdAx90I%Qpx$|yiPL3fu9(T$@XDe=;u+>RWm+dm%)(AGrB8k_ zhM_F9?lwuzt-zhvFK6aq?$b<`5|1o@RPES!9`a31e42@%XnsR7-}S}jYJ3@y;Bzdh;5&L<5I0XKiJHsqy7FsW5} zh^e<7u$13eTtq165-L^Id?a@2rw3~V<4Z$i9&1A*r;tXy;DubmGft8hR!KPK#IcbHqj=g6JUz1OhEH_Z7(<1) z4#Lhgh0#BIFc*e+lV*$Gw^>XQiiRMwGgfva@uXC`ek4E4v|@bkkJLWHgHXkuz9JG8PfFvIqW%V-tVO(aZaI{9v|n ziv&8Gf+2d(06J@0&+E*1Tp<6&JXz`k!NoETLra7}=UgY(8P&tGzU>}1Q}5;Xu2Zuv zdVDH{kQo+&l` z>ujrZlhm1LCsSgR48UX`ay_$`l7K~&6wF2@NoxKqM6;LX2sKZmuUu9;zz1a1y&jAS ziY0_yaYKJ(k_$MX9lYPEA+~zI<~{#Dmm59`p9>In2L{N6MKivnuv+WMDTo{ zihwLTP$$+sR_A)|>m1NaFe7ljz1^*4a&)R9i;%CS?M-r^FlcX;17!kY$3zC>QO}ZH zb{`rUQ&v3Jyi(9~c9_QEnFMf~=tX?ke|Z6)F*m)?Ideyai3Ke2f?2)`-O4H{m@mTD_q9y_=kchzzNN*1`O6N%Lb=8i_ zRlW^%-v$J**oM*5wxPA7vWG7Fk(z+~|G(V^YXUDwwYNbCpF=BnZqXRlqz8Os=nHiS zqbfEA$(!w#Q+j0cj>=O)m$W?zj)RvSm8Zcz1Kq?PQjc`7!?iuM!S~iE^Q@;;(@hzz zN-AXdHJL^b{?%rmYp!hZNvaBhwDlo^wDqAnuIM+>1D#rAugqZqMNUt{Wkp#(km)vP zj32Ke%vfRVT@F6=9JU1cJX7y~(`mUV4%^(G;;cQ?-M5FHH|nE68+#ggs_m$!KcZ2i zTmKD9Ob52Zh!zDleeDUN_T~Jn_AxUQIjABSTf9f4d8^4ZG}GRosr@R~A@MwH1l>#P z*1I}S)MH5Pj@#un7ZLj{;!=y)?5<{8Eu^>xZOvVf^nSjf%dRol)%KziyPN7*d+;!y z1qqkHJ*od%Ef*O>M>2`S&4tbux@FjH;YEhk3rBISUg(^Eq`jLIO}APCqK(;zJsx6L z9T=}g7r`UIndeq5XrT70N}~mB4M>H zeV@)x=uvUrnzT(H!p}8cY&OO8a#S~(@Ki5xg2gpED$mt-^^S^WF~<0F+!#Y=HLJh7 z$ZS7#`rg3JbIDUdT)^t30nt#$W^_#rswMh!9lV-~k-JZ!7}mdZs3#d47bPSRBW1~Q zk|`)g>5#B(zy)^Uk$DQy7;AxOnpB-paaZSj=1PFu1%uPxMqG@uj2o zi0(b5Fi=&i9^RqKb~#n4S;h-B4$2MDSQptq|Kb_emR{yzbl#I;cU&nqn1}I>Ys4F9 z!z|4I;bh)zU~wl+AAHfBInNkoq)Or-VDl-{m&-RpN=(EKHi9va`HtpeKsh?OY_>*( z^N{BUNKF)Oi{pJw#2T0ctI>t_7E*_aFpeV)@W@G*bxyvOD0b zcVfq0>giYm50x2f;Nb+#C$nLUta4lwTh6q} zI!D^)YpjWxv3NG+hp_P7UFJTWh zX4q4%q9JvM1|SpkY92&#>_(LdptF?}H_*sWhxCTn>&M@$e*oa|S zr0upM43fto244`F{D8zzAgLgRRa=mLuBCnA?K$6TFRnaCm0zQUS(t2o5+|MYOd35N zFeuq+HQ)-?bPy&7Mcb6Y-FxmHLnzgm5oP*i7-1Un=H+>o6L^5W+<|;*-59b zY<7}0>o9l4iHT&-33F3#MLcgWPfJ#;_0*OwC+Csp?#wjh@)=D{G`1Nw0Sg9i>bBTX z#@u0De$MoB~Ls2mxlS=tv z(-S;M)03Z^U@l!?562iA5m$$mdAO%A9d4b^F3&Du@OGG;v}+0LTZR-b|DO&s1!8)p zZ)$dlxQBXJI5EzmUZsZ(CpMY;9`?+nz=IfD%&H+LYz6!eYmyE?XP(k7H7U%uw#c-h zMJ4WM|2EF|Xo{HfJ2ToI1rKMs?OIBsIMRxbcf`qm-fdPGY-rw{!#oWaQ|U8X@(Sm} zoH;pTQJo^$Ib_UayDGaM<=S>;_pNSI>-nAlcm!Co1v%UHzZ+#&TMAWl)jDaG)Il(B zB}vw^pq4b3=9;=VnIfvSklBI0Q5{?1HS?SrwbxWhr5pfHybJKUcR6KYv9rozR0&4O z3ByRt7L>$pht`Dzu5t)EXmy%sSvb6+KEk~fYw!bzDVyjfv@eJbYmj9$i!|LD&K$}d zyaagZsI)<}2ErSaRrpaPMmMe1>WDXBOXr66n#&H0w$vUKNoq|Xe3~@J0IWIYvgVk} znqw|&4hK`MJqVUCPby7&;Dbh|-Wa?a-R3tiNQBl>2A<5tgL``0kFe^ciO%PUU^%ur zl11C}Hu#d7#XRiKsemSNYoL8g(0^d8*JN|G0E|ir0!8aHx{!@x_nzhu5L&JXP#w+) ztsy1I)1GjIFjv40FCZjjDW-dRq-bB5te0V>7bz-)PL?K8E4>*O6tnYgHRk4^M9pG# zK8QRuJ}A<<0-LtH$HZ;68}*U}>PiGR-kx{c7CIX+yPkU~t|etaX>g$q3c_?4T>k6< zgRB@_1k@lTsENVVI^EzJ*`l%4f+}$_wxr9|*h0bE9b3r1ad0slG`Psw53cbzxNr%f zP{n95xCjb^3zrQphEy0_<6&@#v{r+64qb$?WiBH|bGeJT80Vvn8Ux-}ix^oPd%VZN zHS_p`3yF=f83q@wFt#KEiMFUdJFgmB<6&$;e~&S^U?qNVk^Dy(T)kv;+Od`Y$b)NK z(=>yNt#KZHFtz6L!G%awj4c|#I#PqGcWmW!Pj~3_4zBUX99&4$k2kn}fU%XUkTAHs z4rEd`s-^8`=xF8BVe!E69bk62bHhPATo9=Sp3Ox_AYSc{&P5sr%`hB7aAVqQ6c28p z0I_%fbU;M!?x8kkrGrME{zrgBCx}tM_9$mJ9_HEr#{6AN+IA`GnH!%2iK3=w38p|( z(<9z68k{6n)?Z?2#Pq1^&pC~{o=m&y`U5H>w*!@(?bfiX*f&LUau6O#61x<=j!NkymcdssA=%A=` zV6H&=Ft;n96CEgGy`lZfF^_1(PY>z|!8Swa?%b^r9}{)8viB$K(isT|)jJvfC^&X# zfWf7BiWTG|nHQ^nua`d4lmlB8V=$K&(O!4ZvFL4z1_e6x-lL;t|Lru&12!vrln0Yu zc|dZ#Z9mKkD5K3Zh?4}9ZcWe~u%EWjIrm6=GZg_l5PHv|Ti7E9$EFmYSwDu+zxV~X zDBmN^wj0PEw1}+$y9t&y?iDenOJFzwTPR}W*7{CsIuWo$`;c2HE7R72#g=_PyC56Hs6*IX^p+GgSqVYk`j&Dz!hX`A$ zKHF}4iVV6H3K|8^?8_PjQW$o6Gz!W_D(__q1ppagD<~8gf2zlh$^o&&-in}6SktTM zwqm31C&)D0=&`8l-s-kRg@WJlDijLlBZJ=lg8xH+V#yRQ5l0;c1!=C3mbctt^pDpp z_^cpu-$xqha;xv84m2w4X1P2+n$?Voh1?YQ)-H`JcP5nB6tfw2TR9!RouNi?*yk~*Fo$|4{n+wZQ81^VXo*@Sw^r71Y<2TIl?u@? zbW}f>joVu0scIc#GXX_ggPH)Y<<$hp-wgaRv}+yd}&T0QCea?-1cPRmdx z)t#Z1<2tQSjK3a!!trOdnT&EjKTg6#XtdyMf;?TL#b*4_Q(g@@#kFbGHd^J8z3r5i zs1Yz>-`WcShq#{0hsodtd~$~Di-Ifyo}NQ@Ff~oO8LvWMHOz+6yxSq~ILiW7PC+s@f++hETM;uT56-dmjVZ91i*%qAi7+l~M)J6_X%;IRV#CS? zm#u7ARfm-gYXuSKm{v9;OiI)?tZd9>D;sm!g3?^Ju+j3GbST6mfDZ?m*R5X2357-_ zV{(>r!L63oVA!4GT?kMnz({!@rGlpIk+8lIw=C8-xFN5m7B-rF!I`0#voB;S?y%Y` z5KtV4rkjg3U5=K+FLH*pMxt(Np;w3$O=IC?h>$`Amo?2?<)#INNNJISB&OvuC51JP zxlDmzE>j?&eqwd83= zJpus%0g3?k`Dy{IHpK@+0YyR=#9ZJ=D6+K<&#wM&<3_3#sy_pp)XoC>2d~*8td}$Y z|HGK`GN;!;4%@PIj5VJ1>x@jd9oids18OJ+4tv)8k#H|^<56_fR`_(9n-fdL!Ug7R z9nZ1V5U4eP+Gjl{(I>17vV%GKTIeP&^)yiTO@$>MuCT--<#TixmV;fR3~889)3|_f z2wUMn1U)M}G-lYB)_qDhs^`(MK5VZ|PNJMrZMFX6p^UF{lAQBbP{BI4PB#`t?8btv zveq#v!wFfIjAa|u8r^<^+Sbiy=zbta-4qaz&U4%Pk1%0p7}#}!K`lcUQ{4iRvB=c{ z$r)B$oidZzrC-0HvVI7+YS41)mY#P*rBgTG6uw`>*D#+G_)Y`Q9TgZ}FqYDwSHxT- zPQsNm;K|6f_vtg$-f!8quhFO8J^;tkP%d4z;X>2g##ha~^0(jdj@$q2?|=7A`AsAR zrd5X7zYGST{Q|0&fv#BwbQ7g&u$5sBoC0&eYEO?2Yi|=YaP5eu>RJ-*ch`u&uX6`r z?pl6ws5f=%a^D3soEzL=SIJnQ?mM9B6-O0U8Cv%)7f2!NZ z<&Coz?s@7V4w69%c9$lbZ(jiWtLZ=+VO*+__^7^w=Ndgg{*#rP+%Ax*e4I9^aJM@9 z=LTM7DDGS{m%i#oIj1@Y=9=E=I@ivv!g);z6(D`--7l%EoBq8&_|tFP{70{S^>>qB zMb?X#b8b2(Z$xy|oi>g`=?v1kY&%q} znXR|$mJx|=Y)$u&&0MJzvKwQl!B{ykc}*_m4O|bg3PnbT1LWlH$IJ*9)XKD{Y}dT1 z+=h4uj5;b4GSngaaRwqKu$ED-^w2nB0o^Qiz;(E8^SH5>zkIIIQ&m+D$)2nI+znQa zT&z-y&ri~FLj1iMEzf7UpL|hXh+4+I!b-Cj<^NDO+;;2Pcc@TgjD80))S4u$V=7itfJKklsg_F3c*FZt%Wn_!0Nk zd4^i}Kd<4=O2Rd zQ9xSUjN-!Tk$K0*4Tm<7_KvhOu4||xP#P3mZmOEe=I-44Yr=`Z&1T|53+sNu?mpQL0%8j>o{wn-A+~fHoezX z?{$@XfAuHuRL}unKZq5J77$o8!ITA$lc;NyJz@cmfROvseeS0R;K`t5TXK9*kZ#B| zTF;=HgvGrLx3}@G6r)UPluQ!6C&5aPgMzthypz1`$!e=>UFu>LS7j`_bQc8ATW*%F z?eT+g1>NKa!r$b_$tDdiq&!Pdts={cruPJEGHr}hC}u)A%gvouOw5#WZndF_Dx~gG zRrE-^nqhybx|6g6ywOVo zDu}#Tv0-cNAo$>`2SqTX!Fg!Z5|2eO+m^itDBKT!4Dg|Obw0Ffhz~rnpU;q*P@`QISNFaFpP=9SXqR%~`lujjSO1Ioa+^|K->&O@ z)AVQzmp#>^X{XOft53vCcdXPbA&6EA3*yo^MTxcSrd?`r8d_ZRUvqf4*%;~@9vPzl z2I;o?0R6}R)?6B>itt6IsbV znXsV7j#lLmA2`cLL6;;xY}G&>-@3(arsJ+;nwS+@%RZrpp0Kc%)NwM(_rLD)Pp->t zhNBT<>MgcPkLb&G=8?mPl^+9sHpw~-WL4bQ>Ke}098}q9=uSGU#gjkwFGLj2!;pAO_4P6f_U;5Rn(v4^Kb$eLz2^_sYbTBm-kTA;wS4$6E zm7bLY3O`AC^7s-0<Iz`)~=ECAo z)4K-s$oG_D8(;!z)&?UYgp_wo>QLfAseVaC$LJPX-_mQIoNk!{W!n0(@L5ic!BQIk zRZRyBKLf%~-svmhr{?ifTY$*?0HKfO+dM)Q@iWM*sG$Mb+R)(ZhX#(sh6awR$An-vxNr9SXuUqYW7c)OMR&};|)u{adn!#ZvF!kX_d~{usQW)+U`*uNWG$bOj)7JvuYnhh+B^d&XkgG)6>qm|1hb`Mu+D@VNh&>rz#4Rb@Q#f2m( zurOF?1~zdP#yD{n#yD{n#yD{n#yD|Km@!VIBM3`6sXF`}{;BfXvY#@*DO~2ZYyxiD zhXGQep{#N9F<}YR*TW68UZMwK{Z1lRe=!4?J&bJzY&x24t-h>!Q0T$(8u8)x^OQdq9d1naX^SSb7uMV;OD7i8%mvilmT$XP2 znQ{mANC&IGD3c z)jR`F9?fcQQdD79^GtaPvzq8M&Pxlknwyz;cP?-ur=PViX9oCeVy(?*roB#|32t}q zta60FC0mlqb*$4|S4o@CQ)8Ue_-*Svcf5MmJ*?4&@@oTR03JZ^w}3 znnig-h9SyZD-0fQtuT1JO~T;uHVNxG+(o5^sKx*_=%ZdTS^%473wbaa5}m>Qtzc9X zvpTBJbselw=Vm!0Z8Lke5o=f?HZ{4no8&kkh7wBi78!%bTVxC#Z+9_xyxqm%@x~Q{ z#~W7+9&bWXo_r7#T}R=(oJrwBD7~oNqzso#vZzfto-OONLkk`5wjiUq$pd@_6hENr zE^-fX10TVXpr#KRa!o-sSrg9`c0Jb#@DQ>OSsW6HaErddEf7wCQOX)CWniH*K& zeFDH-;N~u%I8Y_j%L`YbUPmRKwhh#j;c30umDrCJC!iu&YawIv6 zL!Dehb)qnOz?U+pz~(+H*y_@+8>WmloebN`2WgH$CmUy*_+WUHvFFxFK)|r8gol1z z{GQ;$S%2A&MR;i9Lx#fwtf6MTDxG%{o%kV$(s41aaSh;-@xXpGx!y$SNP87>e|t5i zCnPa#%vfO{N%y-|k5MglcptM`FqK?fC55Y`o>!!PtUp{eGow?&i0W^_ylP4?ViMXi z$7jL^*DRPbfwTDeI3JA3T%g%=-in`(gb8Cl3La8RQw($FAl1T|O$Z0cm*eMiAs-mX zRkC4fuFEfmsjy(!iN$Ff;7V>_)-zVL%AhFKfNHCLRFm36=!vlcxyZw_0(o+Lo)?5D z&kBOavx4C9tRQ$iD+nHA1@=Debv=~}O;Jn1OTdG$MCAewb5QK-3vpfDP7+{x7OvsbEA*m0!q8q}??t;0p8=_?oAv?Pv6731e zx*<|&5;B+Nv9Nw0^yDtkfDgH<8=~bF$*%5(4Em5=-H;(4vb!4+8n&k!qQx5d?9J}T zi?$B?pnYAS5g)R@8#1bcvzGGm?6-=95lJy5A}NMMB*l;dNqIM;h@}V=u@plhl43|i zQVfYmiXjn6F(e`>k3kVjF(hIshD0RAkcgxhGAe~+K+HBqAw>L?p$K0!eu{>xiWY6tNUTB9dZAL{bciNQxm5Nik$p>RKTwXS}`g z6fDJ%NJ=pzA}NMMB*l=3q!<#B6hi`%@+WtTk64O81(v!n5lImyA}NMMB*l=3q!>~l zDeq<-u@r$uwTKI(bn_`liXjn6F(e`>hD0RA5RW9DEy-d~#8M22q!dFUl43|iQVfYm ziXjn6F(foB-_tEVVkrU@Sn9$=Bt;lI$sUljcnXqYNJLT$F(h$2;>s)rMJ&aTNJ=pz zA}NMMB*l=3q!<#B6hl0c@?=-H_=u$l6iF$DL?p$Kh@==2krYGhN)$-iQbD{hj?IBq z9eI#kNCwh-FeOT9i82cn0&1}=jhc|z?BxC9_P_&rO*Zirh4{Z3!D=TvM4J)>P!@7r zY1C&sA{zl5FOu>jP16MVUh6#BkW?^hJ#rXTSU%HEfn_s!A;Sb$!d#7lB*`ZH4#23z zRS6+Ns`aee9?o=P%_2-clV)RzkR_!tBFL+clRm(Y^1+VeaAvKiuvnJQZ-h@yMKD#V z6$oc&rOoEm2R>Pa;AVs887dhjN9h?ItV5nS%<7?{BMc)z)(*F&A8a0GHDnqTR!OUh z=UiAV(bnDCmM!$vm7V@ym9IZLoO7&z^&y%|LPlB6K^Cp2s5)jUD&c&?AZx67ewQYf z6KMX_`=34fOHg^CUaIDD*So=9zhn?zzhq9+ zFL|Ak>f6u$Va2U7RgqV3jyu?BBZO1qq8WtI49XDYp3)3cEUAe6|4134_EX9*HIvug zt=tUSe`-6>Q~!YNFs;+$mGM|bpcgtM{CQk0YX<{IXU{OY#gdTK5`%51U1vQ=kPL3H z?<46w?XwNxvUGaiDHA~qNg-Wi-zzc;$u&;mbQyu-L=Z#bL=Z#bL=Z#bL=Z#bL=Z#b zMBqd8Y*U;rBT$?OVo00_Vo00_Vo00_Vo00_Vn`Ickh|Uil8W1bhLa~*kg<-4B>`DT zL{bciNQxm5NiifMDTYKOS%~33VkrVeEX9zBq!<#B6hk7CVn{?%42ekcA;N#eQUods zUT-fD5EnWzBqAw>L?p$Kh@==2k)#lh|A?gs6tNUTB9dZAL{bciNQxm5NiifM$wCbO z5lay$Vkw41B*l=j;C1&YNQxm5NiifMiIChASHw~Tidc#v5lJy5A}NMMB*l=3q!<#B zq!5q)h@}V=u@plhl43|iQVfYmiXkfsUO~~F*U(AX<4`}$`%#ti(jDRXC+F~77(8ux zE(o48YJi`7m zgt6meVQ9~?`$HJ}H5PV0VgECPvE5=}7ZCOrA&kuu3wr`#e;&fL`K>ZgyJhbpO#P3v z;sY-t@SOpW*~I{N5cX#wY&3*jOxT}>Fa#Hala}ee5Vk6WJ&~|K31QfdF}OIUEn6NaLXENg$U^i5b1`wUuoMd+m#ZN)l~1_(#9ipiF(g zVVo50D_nX4iJf;ioETPvgL! zqMk0#Pas6g^9*^OiEJp(v*h_nH)@_|%fp2h^Zb-NKaK1qu%D6VxvpWJ=gISY4znoc zXXSYTCp+Z%IeC5_>v-mSp?ohw#jdDdkY^qdNFG)tyW0oZ#FXd7@?4Mb!InY0-*$i4 zDCZcnc7M!ecR8vO7K`1V|AD77>NkHzZJVV166b6eXp~)`+(v_cZEeW4^`ctBUJxJc z1o27P2jZh$AU=I=vp#hyWiI7$$q z>a1p(l)?#Vm*(U(NLj-aq}5IznT}K11c&F4Z0n?Hl4el%4gehogoov9+h^Rpguz2W zhxAzwX|kgZR@{}W);NE#6ZN&W@HrgM89FW4cKV1cL|je;^N(UOA2SzXE{jR#e8iJO z#HBIf$v)z$5b?wqag~p_Iz(I&BUBfvwJStiY!SIi*Lxkr><%$IViK(riP#e&E{YM_ zL?L2th`2CD=%^ME`$EJMVubcsh}a(@E(j6aPTlWg4uqKVV-oH9kmQ;Wu{}oU3DvhGB!y1D6EQsyY33euVpOkrW1G%o!wkkVVhuUi>1^&o}p_RhaO)2aj z_9;sSj?#}QzV1Sh70i~b0tYnI+1nHp2XAC7k3x9&WF4X8zE)ZIt>HnJv*YYb@w>Lm zN*Q&;b7sdEY+3f9uOqPTOR<7$+9A}#kZjB%e`&XNmJb`VoA|J8==f~VUYtGj$cZmq zj-BAsz&bC-JKZ+z+Sc6v(5@}dOj2vxwGErLH8saJZROJT?S))o?7l0>p#Y5BwAmc0 zYSXqFHf?LVb-H4;c*2lsXA^>?_%Wk`j&O2d6w_srYlvZ^z=yzuo+t zmgC(^#b024HaoX^|AppfOO{s`6~Dv$w&#mq_kpW>6ocfDYq!?~<$4g5+wICudZ3Wu z#7;(-WOe>S$0pDv8s8aWP>jRDS2HlgUdGy-+=Ul4+CyS9oI>^0rxijI*idDuvycL= zX86z|o{g)@sDWxqh4rW;h*CRfj_?ImF6U!A)#KD-HT76UJ;tcVDEzOXEA-W3>Te_D zo6Op2Y(=mhMfPMARJ+1JmBoRR9F4+RQbA5*0Zq{x7NCWAV4xDO1E`0rba*KtWLk&| z2DxfEWVN$8LKgCaL9Q-AGXGFKw!*g2 zx-}W;xCmJYKL+WRLymG3t|-2ch73~czix+C*?;W6S`;ec*XXx17B)_bhgAt=3~87! zTzIWWD*??>JZ5f$?Ik5!qm+WfG;ZsdQgE2cu~Hr~!8(g_3G=zFflAvVuud8~~iru^yar~{4r8|;@q{l9ml1U5ilOMCII~~R= zw|AvyQuJjOjiiVjQ2_Ph+FaGW^UhuAEouJD#;fY-h|d<4)k&Y*AkV{VuK<5q% zeDpuQx}Ez)%>K;VKJ&Id*EcPLgW!Z->znSNoHq<1fM-bY(?S`0MD%R^sF0-A%2kD8 z`f^v-mLp*vh?12UY^pn`4(RDW4WZC~A`~uHC^`}fR=m1|A|!D=qZ=eeb1kcugK{aB z**h$UNwHkZ=%;QODL04Vca3Gz|Sw|J& z!#9MK%_5|617yhSQkN!nYs=STsE8db;0KD3{s_;>KbkUn0|Y>;F6E-kYd5Dex z^f;^u56s@z1NGh#R8v{4x2)dN19YMUG%O$%9bDZ(ZAfcVw1zZC$K0uK$|`~?r7R>U zlv524J+9fXW^j zz5dcjlpR*g9$yiennu`U*P8-dYb4%KEJ#> z+jeze4PWldKnsXg8o2bFs9lnZK4{_e!RCcN zn1#>>Q}g=RVX(!t%|!+7a9+wev_TI2lU}+z2P}4|{eR2J!;ki!vFT^$2wMg zu-)DZ%Z5;7BW#Uu7!G^S+-Qc=qm@ZozeEOuT)vYCD@2xgK{Z>(3p|^z_Hcu0R^|pJ zV)Fce1DTpus#(Dh#1Bf;ROSfPtjrNg)KumP)vU}DO2ky=3e~LO3dVm*)Knhy)vP?| zOVkv(ht<5yJZwVzVJ3l`Y*Q4mHhcUC)TF5co?}Er$Mp~qE5zQ;F7@>Yup%N9VqwO3 z3@RFaJSr+>jGBzvG(G*Kq90iX;R5JUswqLXjoF96ZAl%8BX>hNXCrTvU}-`!;X}HV zB!BhVX)YA^XEz?0#y4{`s~?(YH?w-=Fh)3(gdI!dYLX0g`nySV4ZkNzza^Td;wb72s|lDs0&;SRCSSr#?piNl~UvxI7};a(u_@Ye~Ea=pQn<%?GUg`2-kT@ z1Q3o;ijm3wA2NjOp&%+Tw8U~{h)D0A>!K7#FX04yt0+e+Vn;#^jw(`mMWR?0Ed4S| z0>Ua>(8MAot=d2B`VR{u946yv2y{eL^+zOVrDv$c%!GGRku*Mg*XPGTrCmO z`BOQ17~Uw9@<$%-c*!#)j}EWa^X!-DknALN=(Bh=QMF%OY#$WS_?9W;MC%~rV}h)R zp0$RC&H$(aJ!Cn0h_Jdoa8f>kBrrGiLEk&*tV%<6 z(04(g>|+V3>I}?fGql%c?@SNMF_rD$tS^pr*|=;T$T?X=P85-=EpiC+6p9}!;#)=h zD#cSGL}xk76cOtMYWZ&v2xlrd4-FNwVACkaP>&W|155w%ymZ64>~ihZ=G0#7)VTh= z^Vyewb4>CUs^0V{km(V2o=~fd9ARSiY0g|RP0P}-9v*OOE&F^$P_`hHef@A}mBI5M z2D5gWeY0{_iB9@Nj1X zlL&$qXm_9w`$L3yvB% z$srh={g%gyt(3VB@_?jQlLrLm^T44zJk9wmR-`#}f64-Sm?8@#M4yG(f$@0|_BeT< zdRHF(1(g_efOl=U8CD~4*nvB1ucB0G?F%^-O(q4EKo_~M1}@(c=9mT>gGL|&$Pr|O zSiwHGE%m?>rp!76`%gQpWD`O}+jsadi-{(jjFRxz@HY`-l6ImS#HbA}O>~5mH_?yg zD2#Aoq4x-Xg5LEorx?hr4lRdm#1_~=1qC)Yq}hfG5x%3QU)hEL{RXuBp^MRExc^C0Rw z-E`~AzHFxFR0!ZoBaJ1I6xEk~!6F-oY7Rz9Kd-xge8{6);@0{;D?hCU?!c z(H@V-*x)2BWz2# z(A{hTsIRK?jfSC>p(!Is&D}ECs@_Yrn6?KHxkkmlrzd_EPmexI$ANo{*Hj3lVKSvu zY5jDE@tCq&pr6wl9Q!$NfAzEYMNdE5OTxaB9d@1Q)S{Q6&D?i0bS;^N`(82@nlw%= zUPYG*AJmZ_r2Aj&)NjzL3H`hZ*XZz0%QMOX{HK-*DCcJiZ~@gQ7RyD(b} zl60{P3}HBuTriL%qLu~Hq_OdhDUdpWaZzQbC2 z(uYRVEf;ZgKln9Xh{g!gJO@SaDYqSs#sN%gk|%~kRsB0ZIM%vg>5bQ=o#$^=2q`dA zAlpSrYik=StTc|2z;fzTwe!uIP6t;=tlf5U)iD%HcnQ1kqsFiVKA}ICSfwpbTuWEC z(oH#(Yc*;Nk%}r%P~%;dv|rpDqf6CI>@TYfS)Jut*B+~9Wr1-;chY3G2(!vBD!58| zi1`<_hp5$tG%=i7Vq-v~LH(Pm_pt?|PQ>u=0Ipp2)>w-R=>sghpbJKjKy(97$3t1m zbB_%VHorvN=GC9Ng$01R`b}rDIOqk9`>GtF76?5Wi(I?3s!$nfM)iDUD%gUxqH23B z%XUR*r@^Y9QW$lrPO6STYE&4(j4D}wSP+CHSxpx~8@E@WFTbxMgH<$Iry;PwrEX$O zs+(B%sj_VCVd$bxT~jbwZ9Pks3&kYDOCM|g4n-v$1%n;bd$ikpB3}5kK7Q-?6#qa;!iMoLj`TBKz>L)c&>yBN z4WFu|D4Ghu7-9uTB;Q1-0)Qu)!vLpGEsNF@%-WX)NaSH2Q_ihtExqF@>6#qZt984# zNFsnvt@Q*TWs(*OG|O`gOjl*BS9Xd9=nSikutW_oG6u>JeuOf{2_Z@;Sa}N4l~em^ zyXb5(Rr6{bF|-5_Gnse;c$SF68wL0C_92z4wP_cp&&3?@L-A;as?7xc3>6FQSd4qm zs&sHAqExNQ|7`AdsYidOHqzhUpVVwRl=+a;bO5S}o({lwN(V@gDWwjb;ZfgumI*dR zbS_@yJImsQbr>;SVw2?>-k;QT%Yrv@D9{Sw35n34ID{X+hI-@@8RW8Y1%eXoc^gad zePBc`#L|a#C9ZJ9jjjOFy3isR0=|zdWBMp0K#vl;$kHgnm;+h)F7RA|2Kvf|yWdt> zBP0=}%nF)zTotVvM^fRcsS#6AQyVFX(N8-ewKtxr)DqaJsM*&} zG{+WCAQ15^A-3WtlXO=nuM`IN%&M41Cv?oo)06=k>7wGN0zR4wY*bXeQ9(+kEM4lD zZ@r54FsByu7>Ei!k*Wb?hgBoB9fsfR)X;a(jk)zBwRS@R3B=YrYA137tuUurNGbYQ zVk?#MZ1OQi;s0ID&o5PIM%stmcBi>FtY#mr@ zXywKBYN^irCN`%uC`jl@kl{MC^l&>NJK9d4x{7AI1~Z2K)Ww()hA1GUskZ49<}1&< z)et$`AUZKSStvJcMxmNE>!>CJTXG9W}m_inPeSlHhO;%y7 z>3zBaRJ1@3fCoy#I=f|RyvJ9>id1<5BhmwQ5;GA`xF5+-O$jp^%z&arGa0Dm-`Co%YPO8DDsgYUWKA8M^QHTOqj;%t=C#2-&LZ7(A$3c{JTD+D%Q#5p0>{COr5sKr0FgcPkK_9BgwI^+ zD);8ExJ5R1SfEi|Nrp5??^#)U?SsgyjH-fwILQ%28MOKb9D4-$9F$Rk1Hl9&3eMIN zLQ)q1B%Qq+OS+LOEXnLfz*3sAA^XD4(o06twHJet6pYk7Mwog6MpA+eBg`OLiFPqU zo4+`|bYg__em#v(@3ppPW^S0|4zuQ|^h9>ya9KmLv_YkyG^UaBJ6?gnpzSxYNxdtB zlJ&jQdhH6DbgA}L>y7``@(Y^0^%G-s2*d^fav1EFWmv_3tH@5!Wi=BIs9ZB`lHrxi z#z!;*B(3#2Wc;Nsj%VA!RF*?E%1lEGaP@yKYNe;R)(+)mHi*44!Q2(-K0Eo3;}qY) z&NG6gMm&w=We*V}gk&_29egPl%#BW$qK)4}Pl}*&WFXSsmL#?uFwWEgOe4a}7@k7Z z#po#t3aOyi@TA^i`AwaD#t5Y%Ct_hWs-LZ0<)3d*TFgSTUJt>j-HdXpkMO=Sy;S|6 zk`&|zRm$<1VpNHS1i+|57C0>pRU-{iA3v%zl>J~Z{HyJ1&azPz2+M}|?#Az^!t^R^ zY7K^n=<7tiATrl-HaiY+zT;_?D_3jurP<<63>lxO?w0d-^}0h#eNV4kFcjjjV7;{S z>6P6%eoqzLrh_VA3`Vrz3Z)&M#+&*o{Wqx`(>Fw#Yr!R`j!PN;OvikNKn>)3;utV_DM^F;{_b8(iu02?JkV=uqz)y6N zX$na0b+sEwr~F;tEl)v3i(Lw8ro`Q<6q(kj)ZC+H-C{8N{wq@^U++~t)eH``cj_FN zaOh0+<~a+MITP@!6ozyeGCGmm;sC2@M3ao)d;(E?;a>2=nF!bS3fe|zRP>-5N4a_4jkY9~8M7rW^18KMB`-Vti#nJ} zDi81qqQO9?LSD#Cu5xQT7pb_aI5)GD%!#Te)g|g!&~E)g3A_~nCFyBB{!HC6mpt_l z&lwfyrHgL)5&Fng@&eQKm!H17^u9vsrG|k5c5yMknX)f@#VxLK%U?aQnlxTDRb7>* zH&$D-9Ib>! zzLrQa#@hz7U*qKu$@Z;j;9FO7_miyF7FBrU(d6cm`^Uu6Ge;9zNDM3@IjHgIuN-P^ zb9!Q})jEgRw~S|Rn1KsA%*;<`pP$UWi!axK<@EW}S=C^agAy;ENNyl8a)1K%a1KYb z&hx3fDOd6Ghm4hPoo~G%?U2E-PI^@m{(C-kY4YYUcIwc%FX);hg>qmZ`wCCBmDz^4UcRjwBbP|smXuU|*PE>sKlh1GWN#_A$cxw%Atllv z6d{!}h8k2;*=rz(O$~P2X~6pHrrFD)4ooqKk#*#ASG~7A&45@-)iCmGL_2!3>%T~= zhUr(_*x_Nwxy9H2)0e7?P>MNj`qe97Z>YO14=rH|kf)KKEo16#EihWzpaSpoOYLLu ztPE@qM&~(&T1j;XK3iQsjjU$LJ~D%E`JIZqk*%HA%Rel6N8L#F^<-Cj6>XudmJYZ< z8Z<v24AW)mB4UK#0Qn+lt3X>z8lO0fstH~S$ViSB9uO$Ja>%Pp+ zVI1y!a+~8hzJIjBfk^ep5NU$oqs`c>(%c5EfEyv<$t#27;llCAm9%kU*K`QSE9{__ zAq?ll-s!gHfJv~c_e8R7+Af-UqptbCk$mmMCxX=KP2f!d*IK--j{)E(g zMNzhZ1CXXLYAo^})PmC!yoD=2p+gu7X&-$ZLx&|3WWB6=AGddNB{D>+BXyDp($SdG zvnTayKyxvyw7DdlsXIgg5>~l7bf`TjE>LCTm=Vy(QrFP=(ds^eeq|pf8aXY=iHj`H zZgRMJTu3*w>O^qn;FsDt6S5lu9bv)N8G-nr4NgBo!Xw$xON=V}5n7;2LLd$3a){?c zUn4rO4llLn~@82q+!^@O)l$D@>qK z(6}ih}QnelVFlC5A} z@uWymNh2G)cAA3tES{#BO3qKJ(swS<~UyTFNo~DT|761?q)$!`>#vW@70d1**K^}ud9FV%B zV26fy2noX+*{b;r+O^Kt%h;nJTWXz##+5+84xKFs`5#+A8i(@N9pT_YHh73*nl!SS zHR#~1>8c<#FwpHg+f($&l)U1<+jqVNUg@zz&0Kw30uvR+#6jKEn~%XpMIy#Lr`{}{ zios43ut>IS>@3GLBwvx?TnT>aBneyaIt?I>=j7Swe9s`_^pYP$#@l?~_^G_pC#mXp zLL*LQKT8GEw^6T5E1+N2iJ^zzXGcZdFjob|>j&QH1uEah6nxkoKQ?9{6$bh4;XEO* zpN_1;6ZjNTTar8vUJLlSI^fPuJQ5lR2!$uf^FfqYl4nTtI45rDdIZ1)iwNM=jRaXRYO0Z=n7!?-s4qmTQ&T z>h)E{_x+7I*WUa5-D(F1MUeNZY>I!I6MFIct6F zkCyuT`gtl>s_l=yI^5b$Ulaas+%AjRs%v1W70T{eae%sk?Iysj~u5Qw)&{B zPmZvsU&w(D#BjI$Ar^sgZ%ZJB9&-}+;bfuKkEI?z-m*jjP2(Lb*dP;5JhD5d8qY{S+%R7-^qu z{CHDIlqtK5c=*Y}gzdjDd*>q-!3|s}sh-DxzAIq|QYSzt9~R{k@h`4j?JX#*)Jb`E zCNtlxGF1<$#vk~q1*EbyNt}^E5E(R+K$Zn!EK+efc?`)BX9jKwLg211%>f--pc_J0 z*7Xdy;ab!hupM9{)fCH(HYQm8sD+ay)WkhCt{-`OC9%E{zI7QkH&>k?G^A;i6#{2B z?+8>KFUmh3LLn@ELT=QIjs=;$DOJ{`@>(NK5LWI&?sfI!e&g18tFlm>Ixa_HiC zw**~Kbm$g1(j&q-086#x<{xA2aFPmBN6+*4;L-m|737t!aWtPBBFbYpWMSQIUoW>t zvUTv=Fr5$~l(QdTdD^?5U_M4%+9nvu&gEv#zxtT-vS)B-GbxQ$J#~wQvS|qtT+GOQ zo3t%*b(nEYIhv1VYOWh$r9yKR^}-CclO6Fktz+N=OsL7U6g6+RK~){@8escOCiQW0 z2&f3#h~0pdK}T^Ir$ah|!x78usLU2a+7{)1Y=1rf+gndk;!%Aq?u@`b#4#Tf1rX&p zO7_KIcCb~N@c%U@`YO$4bE2a6s2opB^iPBn6D8ZyDrX-jbG129pCAt%QqKMYmzR2j zFj$pM@wV0^P~q7ra>4zg2cq2yG7=sdtOa7Q>&lgNl)%YOxA_E(>E4&M#ml|epc-q6 zHv)<`rivF9v&Llcq8hk2$yH~C#_R0VZV8*P_uzCL+L=s-kc(l#!*o=z@6f<7Uqx(?+OW4U z6#WF(s_}2ArLnE)hUZ!``6{5R&%(_+utBem4!8zcdlR;%kd;$5TFx%PE(*m37ka7% zdT0RjK6$1tBCqolTj)&Pc&grF7U&{&O+jDIW~tA|T(!~Q{@9R7>2kyGGPxqeId;{z z9m9MHt3c4ejXOK~*0&wI85_8M+*Ju;ODdr1y~0Y{p^-z;yaWW}w+;+7DN_}K>nuH` z3)FQ*u|#iU1bwU#A$^oH{r$5zelRd(cVKsVlnc39lXgM0Mv;DCWHoV;AWLwXM?z_C zvB8#--GGx!zLYHi9lgWO0)yEmhMbhSMnI*sG&`e2T~au9Ck~X?o5#bHO7{&gPz*zP zR?Cl+Yt&E{Uh0uKECivKfB+-24~Ay#^O^SHaHg~>CMvD44g;rKp z;Y5L0U)DAs@`sb(I_9!&~0MN1hs2BJmwc5p`N$}AWd-`o3$bQUi5NsI_U0Av$ zG2gN<2|7amff51%6zdb7eA#a%AqMDHz^r3O4ndS?e1Yw4hDnq?RmJ#>2wQ9tyaTg+ zVKaa7ykj4urh5H--mMg$W#_lX26zLZ_AYopjNl$?TkH<`qx~3}@J>B&TqSItkz(@M z9$n1)oqX7!2ur-biUM)=8qzx|7?S zCO%DtpMu9QE0y6>uw#qb#3t(dkWr-GuzzCG-jf@^71MBQN)A`__<^{drHnW;C6x-6SrQ-OnZwY?Cw5du_ z)hbOf-=DTAF+xMCIQ|P0!9fM2_yT?p)TmQ`4-ltC1us)Us$3je4;zpjFy z{_n$3wl_B3_c6ZVY$7+CeeHMrb9g?itp3sAuxctz3A%|0Taco@TgU;ZOI0I9==hHm zn*v-s5g;%|K?kBVge JWe@Bcb5fO;|!9433*B)v7=x|=JBo962(L}s3pS-YLzT! z@43^JR3tTF2rWxK;(VxDR7q)3`~zP;cS?pu$$5+kVRqbA1DwY@pwNyb=Ru$tXY)+P z-|_DKNes_pI85J`knlO?Qx>-9d$yU8QPqX^hR97md2L2mJjkKBSth^CwV^X_Sg=G(ki9jzi4QzbnoEM z45t)V8KCUAD?OhQn}C6>cE}1%U=?!k@D|{*yR>S?#h@W-JPjBYVQoIOd+25Mp@$_q zX}sgkSkna>OawxWHD8m8$sNk1PrO13f!s*69N10)Z#JeH-Le~9o=|>E^0AZ88Ka65 z3h}MbSb;$2S5@dx&)3GGtg&~RiP!V}f}Zc&(6so@A;fO^@t*G=3on}H0HA`YxyH*q zjY}h;ecw0?YftZk``&FF`_!Vw-S=+eTno}^T;IT)C?p-&aOX3`bAudix~TDJ zN#pK&w{dJSiyC*|yNyRZjq4kY6EUUJIO|%`>l_1Z zp2n-TIO8B@Q&Rl%o)JmxvWCh4SI!9)AjXE5*e)zH_=A@+LK9`xj5v%L>@_1`nsGj5 z(4HAt%GuZdt~9eXl(krFxaU)tef`gB_Ni24nvsWTIs2+F5@uiRg=;V5$lgp=($;IBmxu>!}tzu@$zSYV8txk5IMs`Gabcbp;`*%9ozvHtL8^b4B z_0j@+@_(^^OV02zkq{v4kI8+9?-$7x$kp^p6bWGr%JNiP@43NV2_8fK3J ztg>00P6pvCt{A-CKNS^FBKt~DW_E*GS@X-6O(b-Vhy_OrqYv&`EN}2i)<%leJFDOjrX;ACL;KmuheooK z_l)2=29CxYg{0?-diOUZ8l%y>zai1)zTW)}iPie=uM5xcC&}uZ^XD{sv>Rbnn+b$& zCo(u^*S1Ou;fFmT4o=MIexvauMoPCOTnoX2x!W}+nB@#EC2XeS(!Di|TBl*#W@<{4 zCJS3$p}ZVYj4Sep!rn5lF<>(sJ6-vjZ2e*L~bWX6md%)m})eY%b$6mD8Uc=m_^=&|yg8 zqDetFDCkCkt}5tq1FtFYMm>1YV*wuNk)Ru$Z;b*EV<6~8F$7}E@HGoM^|2sq5+4r; zW$|_pR;?Q?=m84-FyUeVkB!`-^ZMD!F!*o-j4+!3-;m%N1HM|P_l5=Dm$tuX-d;Ek~(Br~C_c&Z1yVcd?UuA%(`JWQ!|9o-}5X)-?B{Ed)Fcw2rEbfSYu zSWu#j5I3i4SZ7-6)qgXsgb@_Wh+)M?q!Nuw5S`K=-3Ebzy&=O3>U4<;Ymp76Fq(}c zOvucXoHm=SKg3MpwAC0srs#PlLc&H>9IM9y-o{qqs zUK|9;2*?wGi=UVXTrs&ulj_R3PI0+f;MqvV5{9r-SKd=u>av{yM`#dHkH7()Y(2R) zx?Cdwwr(cfZ2a#o0Ao3Hp&IH8POxkjA5|1-AU==n4wWYVfI#=K4qc+l2cLevzVx+ zrol@`jgNGua-ejAU}?%x9)B`$Z|UaRX$lV}>s?_W7yFPttipb#Dbk}Wj3E`oTNs;@ zWIu)t>`S?Ha%J{pui%j`Gsn+nAfJikd1TFEY??4#!kS_GX!1P4o62#~!Y+mxKCwps~6N#tafDp*q~Ib9ojBgwk?grI4s_Sd-!~ZZ;5;qtb5u=V&U|+@M|?QwXr) z<_H&b*c^f1Yh9ohOtEF$0h$vcAUqBmX-#y{SP}j;&j|myvx0xkD)6rn{1dNO9scn% z0IdUl0h-E~A5CZKSK5`iFwG|nbYNz*a2Djpvj&eg6O9FvbdYvo+*vHuHT0cnrt39^ z37ui7DLILThizKBx>YxvQyR{3>kjBz!wEM(0<8xvLabE%cn&5_jVG7mBu(}o$U$Y$ z{cO_Qj~g0x2tS-k^AjQIyFhHV7|yDO)3GfLryICpVxu)_;4m_Yts!{`3l4&;mJtH? znGmP^2v2E*gAQiPQ0fDviKoLT0;9+HLsfOw95t*JHN@6+LrJd4iG1*Z<@YJxjpazGT zN2!aEr~yyn)iL5?=^>E=DB;V~;a5Zg?VuEEzV{c@up&yuN`%DGfz+)?9Y|G$QA207 z_SBFUYz_I<#!>r5jvDBpf*Rn|qK2h~ms5jv7QDec%ZY&FsKKXpsG%lmKrm^hYR^se&w|AIG)7;-mVIAZrm2)T6v#bfgHmTLFKat+&L*)D2{Mz4 zGIFTr%ru=2)It|%W#dajr*3WW>SF=ZGEa-0nNsvCh86Xzi2;1q8#Aq&uV669+MYtJ z8O$R#9P(Rg$swYiY!JcpN4rV!XmhdPGvm$td`7&-0e#%?hLXlRc(al&!CP1pOHO-^ z@c=elVJ#uC2k~ctke>lm3E5trI87S1i{ed}mEKL%6?uU(L)gU%C@(d@ zX&E6?fa9u3XgZ6X(Nm3Tq?C0kSILl0GGB79&P0%zR|f5)DKx|wl)E`Kn0-e|S3INh zBW7@(DH_$PIbyx&QH7ZYQiWMywxS8w zoF>f8NL~{z^h=W;a#MxZun|ryaZ`oYGa)+4CKr}@z?LYRxO_Ne({#->bb#iS{-k~*9?J-7wRXecS8sCm#)hbIykE^J)F8y{xU)3QPxj$68g zb|9Is<9b<;tT%O-@EB5uaZ46!z_{+TVSXB|4a#hV;#OW~?P;*G^(`c8Ip&Pw2+@Sn zn6wO4@}G0pxOCl97iH?SACiOi zr5H~y%F$9h7FUh(00dT)blu`ST}YG%NW7Np!71w=5i}$$q~;!iGUHZAjBp{5&07(~ zG$_q-H;O4Il3aufH_SWvYtx0p`_)?O}lc4I<}gdTB^H|N#|lS z3UXtxlwWLJNh&2aA|R#D?1?qNV&WR9;#FR#ud+d-zS?qIAzfPHY&xYSpI0sN8^nIm z^RhrbTmu=h$pD5JepsIQ$y+@LCzYuj;^Ah z>CO`Iw7N=vM{_Nk{^E3%apvv>)nWE^PKy18ugUkC@7;l`Y2YLq@z7yMpjz0jgpoYE z$ia_|o2PHKJ!^}{4H?IzZ8tfE4RP$f>h&*1XY3OCuiuRuQb{pxOL6JJg!94ZpTI3Z zI}+tsXV8r8`axTSV!)QJ*q_FXIa!PuVjJis$ojLbF&i`ZiLmUL8x)1bjaf4p(Ol#F zBu^c41Jc`UGO|A{^$eQQ{F(_{A5(qufoHOnx{u<&-7zbOSU@O!aqW#9W@Yw@q=iY zyc(!%XlmXPs0qVRq6RXQg&GLEcIuEVauun8$bZ}si3a4@zoO;H9MB!6*bOCSrOr?i zNk{0j|LXD7C#I+%P<9jak+a1@wYDIkcqE+~=$WYDoCp7_kk-0xD5F0J-_tZ*OSy)= zGwc$N9IUG&S4arPi#RVT^gzY2Tvc08!n3Ii{loNeEl8@1W%x9sjKvyTHkaTi0il>K z#sllS)7qFEXlG1e{=!4}>ohnP0iIb$(c18%sQ9=^MB|WOl0wKj1+D$OTf^xnoNa&X zP2of?X-YeL`X5^9)gw#_t`OVWL^qRyITx!p)F>}vJ3$z&2?^LJ4V_7%huf)PAKElI z)^FJ(r1;H95~mK^8RC|2lWke$XIr%_&|z>kcB;&L2Tn-`Cq(*UnPS`WAu+kc@KG}` zCCMcE$_x@{iDDq_Ct`xR;mle{S90j)7uPz(T+=keQA;sx@Q$=+J!(H0La4fBQyiGF zhW7nTu+MUfUNuixh!DgAl${*<$FsJV{sUpB-Vkn_!C4VG`1DVJRsSW}_R6Af`JmMt zYg+*&Y0wTO`riu@thR!;BS`dns#bA$gYOZ@1q=&O9-cruUXHL+W@dRvqGQcjyd%T>{1@9A(jTw4Yjg;+^5pChoQ4ofv$B76H_V5Xt=&%IAoDaG zZol%K++{e7dWLJ~53A;nN>}bCPN39gdG^KJ?E;aMc$YaC5&9Ocd4c8VY%pFQksL=@ zNkeoiJBGstOce8J-98NPp{|oR>J8Z@^pzVfYW7uzgBpJG?7;MV=HiOQwQA^*(CH_w z+B!XMn@~gia0FV1hOvx+Q4RSYDX0rvr2`x>v8{P6_#%E+kuNf(47Lo5M{`QokGah1^@vji%!g!^rE$ZD~KRPt%3=;0XBl< ztPk9sIRa`NI?^#qH#i6cMu-ezUxqUxW5p$qTxrE^in(% zU55Y$hj(C%zS*$b?23(Yc$!8Pe#&su1Qu?&ki%V-j_RYSrN~8m2@E;h4|RnM#EmSs zB67m1nv5w6crU`r&=oRTd2AL-H$;Gl@?LCWuu(fbtt`PsD4@<63W5!7wNIUcbLZRwqCp<34ma)(5!Qklt&32VTri1DG`@-l~5vYkfbod zjx0t5%EE*b*1d?>MzWd)d}dqGFk`NU;Sk=}iS|SHs;dDUS{jU%(c)}+E9^l_)P=pQ zsGUhDkrCU6rjLf8#qk-}Bu9SLWCwB(016<_mr|6**LrOQ&^xfQxZ4nDmKHOF9R!`p zgQo`B4>^CvRUi{2L0%dTHs7+d_jCPfpJr#Yn^$HS{BNB0q>rhqdM5&Q4GA`kmz}kZ zs6(OpBN92o1q*M%2{UmapB<1j8q}Zu_I%;W4hSo>f zs*mdYPG%0~q-(gT#Y+i{3dca}Va6rAn2K4R6Z zcF@zU`nDRlwHi1g+oZMTIQQn8laA?|gUjm0nuAzdBPN?BBPg2eJ)A&#uF_%EEZ4E7 z8l9qW$@~GNs^lgiovuknnpe^pNKN!tpKVKKmog44<_+Y#%0+Z8&zw$x7MV@=?P31i zcPmQ^9_&=mxOY!<>n*qJso%2ambdTuTJ%%c`m{a4@UKnEbT?sZ8xo|D{id_8A*Zq` zXRomX_xJ?jh^`jO_c?I50ck-k^xt>uEqiLW5D6>0H0jS8?8PaZGu()akXY1GF3V!& zL#jg}TF`BNII7u3M1m;G`Z%c07|q1`2|(l1Y*wz7g1wM7N(dLA9 zSisaH(iSNIFx)SVf65VEPcRtoGv zmr{Kn#>=QO!&^g4NA@*ltWid0z&{Zr%0CU@{g}JY7^XUjqn#&agdnDx!Qx4rk6UtS z58>Oz=TckADUSPf8{`5k*?Ewyl=BqFtXg|GYjWH1yG|S>eq<{-HCc}VkEpoHR8A6Q zO4iY9wq%Ii4}ioZoj!2L2#^Dtj;V-FxXK%=Ki3u6Cs>WGs)lGup!M3Rq#)-+}{=zuU{fRTTfXW48GwEQWQYL1r z7Ez}|WPmQg9ap5M>O3~nf?Jh}IdX1M%_3-OzNs6aICeq$F#*U=H#Kr!d~N6kskxfIw>-zKyj6=VFX1Ln~^mMQCxexJ<1={g?dsJ zwnq<@Y{_tYlcbJNmFx^;d%$vOM}(JqB^YxWkl_66K*JTWkXU6d7koG6AnLtV8*TS& zSHhFc5K<>1kCoYy2WAVY)BL?GWY(nH4=u^a!X=@;_U@kL_UL{KtqHRRj;SMlfBSx< zQtJw#mffwuOxeAr167(Y=lT7lu#oC`BW^$fXOU=Xeriy@5ZAv+<0m-@#y&YDds@~*FfMi@@YUalJa7>0pcA!t7UeO zg+RomuV7~1hdbX*fn3O7*|SH?uBbc8uz<@3L+Y?n8%6}E{Br-dUZ}WGrXDAGd?Jw` zi~xE8prlt}MxXiINGw87nLK{@){O7(*pXBLrE`ZLpJXC|jG&ymMQlVaH*z9m#ryS6 zC`{jNchp!_~$ zej;=ygr{KwIP1pY@B-t;mf`YB5I@*c zln4q5UW7VIO?TPf_d7(fj0w@Q#=+r9N{qbY@stB+7g55a^MPJ9G!^ZD1-3vFn=H;k zFcb=aX1{(5G_?gP)?|IhZoJ{l02$5|kFyp5%77`=i&W7?%x0ul&I@nijpQ5!?z`5E}K@niThXAX=n8=r*fNB*a7JfEyD3-h#%v07UzyX+k!%Dh=Mf_diwXAdC>NOj5EvLzLYa}xt_N4JOdo{ zd|FGp`d6MNa1&!d;^JnN;v#0v3XU!1eNU4Ulcv`l9Kk;q+9sLe33MN<-n?M@&ju-||Vt41+N z+~iL1c!f*%h{F4+Eh$|?1?vx^gHQ__HCe)XXhkzLasn!#21w9O;{jeMm%x=~xD&hn zOW_NL`&>KNWe`hnj_hw=@=M|N{4<0fBP=`y7q+WnFi~_U?qA8iKH99NVY7mvlPG=S z$YB#Ijoofml->3z;^Jb4X%4XZW7=<|@@5U2EICouw;ut!e12g6DZF{{?8BRvf0zEx zf_m$97Bn$Z&2*P}$vRJ4bB(2^*rC{)VQ+12VlSU-VX)}};0%-*;#RMCG(6$8D#+|o ztsf1Br?o%$e74P`B)VGpN-5$2c2b(yJkSKBAu}oOclXIQWCa*W^4G;C=1%Zwl%zn1GD5ZQ62iqFs&CT5iH4Sz&>i` z3aCZf!r_9$jZHBk!=cMz#S8dLDr8lOcPCgsW<*qF`QT&yRu-z3=t?{cK=K1Fm{ay} z2xTftGUsAsS#BOWrqEHClFU0(fft68?HgYh6754bV7VC!D_~E8DbT>I;exzjowtb~mP@mJHU)gt zDG|SRbCC-VwcuT?T7*tPJUp`>*@>pU?1$`w$o8Ynn|@}NBr2?y5(Dfv=fU09D^0v_6Kb%cae{~Bo(uo$;bsyE?-}!vlZkqI}LE* zhTWJ4PK*ExHpvIXS`ffBt91*2fo=8{yJAWrrvl7Tfj6Ono|UO)KPI4}ifP+5tHZ2#uuKN2sf?jG=pxQX263sq;(zTgofEzg++<#>V4pKLeGrOe zLqq>G-~_EThXIQvO#2>n8lsa0k9t_mK@`4cuq+u+kdQV|;HAr9&=$Xkp_$vdVoaD* zBIwovM@V#-u$Z}VVfBxWlJIJoFdj%}HrJJg!HgeL7Luu^cc3?R1WfyJ>u30auS z7qpM<#J=~rkPu!yOSrm#8`O{`WF+B5d&j)$W)V3=AYoV3=`FkwC~s4j7*Gw~wC3`oCA%?b6otSv#QZMJw14`EDA}mnEo9Cc)?jW9 zhTMi0n3Qz$xLd4;>dmX$cm6@RGn{Kb@(1BdIG0O2xG#@N4v+%`J3WDwH}PVT6k=1Q? z<-Dxk0j@fWn+a%gS?vPlE%Md1D(+p{L5PWM_qhdiHa3I>Df;?3LDF zz!0|Ze9+ZTqxuP2V+^SnO~AhjO)(>Z^&>wBfC^W|{`*?v+y*tqRT?F_Op$&|*?Hm; zB;0qKl8G_7mhFxc45RKV8abvpf-i+#YqUo+!gW_fkY&nh__38>ZQhe7lKrq2#SQl=;Xpj+nn)_v#cR5u}6nwI*D}^ek3RM-)Fn?W$bcL=ap_Kca~V zPZMYics?Q}dZK7{hysSF)!Jxc0JN*1%s9>zIE$SSbjXtj2e)nX`xHHjY^u-5f)zyc zqTC#A=*{CPLp~Zgt^xyYY3!25@}_!;#5J^tIBX}Wf)R(^i6mmS?D=uHj7ml|f`&>s zL+@&8rX#u_)pf58_?V5RE(_aJ%&P7f_Dn~OXwP(HGQNEm$jeE~F>-UG5nh_9k){Cd zo7c;hl*voFL&$kS$wV7pOv}VIv4tXXObFICBqoHjo-Ps*xx`{PB-FDv8xtC2>q}__ z(_BKl{TjuBfT?i6d26uJXy5z9&zt90TJdD}ufmA%qg8+K(@S*dtQJ6C>oFtWxR9&n zFmu_3QDq5BpasqROJ`N@q$;qht~jakpKw-52(wwmPcMSRLNNsWr1Jhpp`1vJgJ^eB zldCC)%L?ft^fI3o%`WWsbJ*i(xCZ9hBn+1?8=}*?hizPW&;{SLR9ZA z&*k>ne;Dq_-^)db7#p(3O2`x?TdC8Ktjs!zquS!6%1@P=XDAl!!zHcm?!!q$iLiNh z812r!`6XT9Bw1flPWD%_Q^eRQB65`dSA^1R9p1uWbBGY(flFR{ zY^iw*gJIh*<(QNAF2${>qO&{M|Qe5PSPpqef|s7OmMq?NWV%&S_g) z8>911mb@hjF%ws#ndU*eCAMC#1lfcCak$YZOWA5stGsa(9eU_U3)wj9KZ1Kd-MyYkP8ZmX z2wZ0yW)lf_?4oIOM;8#dm_esm#tq=M7Dv2`9H!9Mz6)M zii>oCN8aJ~UA;xtBBlNXsRnBMA?SMYhy~cRLg)`#jba6&M>l4!@lCr6jKqbCQM}$| z2(w?*ot}DS%~0HIaz3dWTA;q*T`voQqZi$AJhi9blAjSc_lRIjS*Ujl%-TWI(uXJz zyy)o)2&TMwgbJcV@RX3|j@I_3A#sNoBklxISXV%pih*g+pWMCGb?8pD@PZg^Dh;aDve?v+>g4}ti-lUUH zykjS?R`gK4Kj1-C?$@`6|Nd_Fu=H*1{zLV(`nL8Jiq!;L&hC7#Z4sfR*6Vk~5#hvT zZ{=`(Z9@?CGBi^=*0I!I&LqHb8aZ}srukBa58Z!CERR{`O|xQox;v=L@~kxXZ)IY6 zHIyf~-l$4)t2D!6OmBec)Be`yLb#qzlq3VffcNg#1Mxu*QC$>+Iq22ly=kEPok>z6UyM&ojL{& z=A<3xM&rH>K`eElF~{_H{KfbTqXKKb;Iy87R)FR5@1-R%GhsI4JYqtErb2b^nr(3iSCZ#-C3;_^Q6|Po{mAm);~fm6Weh% zW2p1#BcyO66!xYTy`2Rzd|)0!g2dqo!smFJ-FzNNfZ}{WA!4$jy^uZr60pfI!`qdY zXx18U^VnGi3;;CbCEp8ERY4wmf#M2DfHIf{o-0hutDZ)!hggv5sFEDK%wrmlbZ4Qn zI7jH~S-wrOk@)CW0&b6%_a;H`*mJ>+jL&@Km{;fPA^HNHoQ4)y0m&0Ri#+ku<;i_T zrKii}^OT=Op31YxQ|-xYF}T9>kIT7-|tk9#Tkexw<299GROr zoJHbMN5ez&q85Nnku|CV8S^~|#&PYLjJ;V95L-lVmQu))q8}pYLoCpZIG5yrL*ivQmfcvc;Ore)RM!AjrHp9wMrF#a$l#WnN)S#%vbYei zB0o$%vKyM};SUJ`h^ZcGyth@wtyews(Doz1M9XATESZw9jf~s6Hw0O zx|Cy|Z5j_?moJ)b1*~JzOen$|hke+z;6VpIK{RG^2{`q*tTp}(MSp?5`ir~q+;uz4 z*`s=vJWq$6)N_Ol*#b4`nqrr$FXAmm*WuIjOXXMJjVgAiYW{7ME zF$clb#@+C-(ambAP}njOQvtou{p3d$t17KK6a(EOqiu>}uu&E{X(Iyzci-wlESab zWyk*<=S9Hf4f9PYd+%8@n}dMrDT+;6&%zM_0;SJv)CKBC1zWznk2R+sM83qkl{qK3t_rLcRL4EYezyA@kRGgI&P7Y^pJzA3F zRMiW=IN94Th7W$jZ1_kLD!p=qVXP>GHfav6^X97UNSMLx%tC$?sRaRoFt++xo8)oUIHIEP+BqtQrf~l~(&DVIPEr+hlES{W z&#G2v!?FfP2%Upn!?MyY%^zu1+lYLBK&(@bm1cMq%yDXeHokDog9L!urcWvH28pmn7{{a_XEMu4~Bzego$z zqWURwijh+yR5tJX6L1nXjDgnh#nrI z?g>5oKAFe$@L4{M>EYdfJep1E;UD-ksfR!P*l4!K+W$OBYn24}~ztdAF%6`wib-~QTEke=yt%@{qwR8c*1?iS7`lPoia;1;5(~+`QEBu{(03ePw_>*rz?Q)wnZIq z>uMeF*DH6xM|_hS=s)T--|au6fIqem?8q+f{!ezwEbV}YSN-ytRlhvC>X*;|0>P73 z?tm}%6pFI{?%ui>6cq5)l{?_QzO*{vmpe6ei(3c$sy?htf4|--v$O+#bJZ`uz3P|W zS@p~B{X*_Yb@>?leovt&`>=cKVo-FzS61$TC*Ike0^jn_%cj70_^=B7eXmnyX$SoC zs$ZU3^~>9Oa0wUjnp^W#Km9__7Z}-U9q{TX1-EbkB$NwnlGH^7h+$o7UUk^7cO7?m9(p zkMkx3?^>_7FY@*eyghCWp5*N-db9REmGk&+Uxi#J}5K4}ep^AR@R>2(%vWE%{Xf5Fut{(kpXoCPg?kz$nH^=Lk7HVK6= zz>?~9L}~sZc@&F6h6wU4&L(B>MDT{Jb`w6rka8(oe^XjIY#!2b0Y*4Sp5OONr+0eym5pKHIC*+ z)oK_2h#n*s7gF%xl6ft=&=*z;oH5vWSYsziIt@GN-}A};_?O@N(GP#{b35W|c{}zi zkACe-5B!fWe>C3_zn=F$zT?jx{V(7A@*n&Fud~Z|KYIMciTB+7@SQK(5x)v#oMgqA z=$1Q~s`D0P7MT**&rO}kr`i`b!Am2c%U6`@Tm}FINthGX*XxQ`Z6MI?wZlnmmZ8Gt zqP+xC;=|yGj+%WfxE>)`*s+0QBjLIxR@b-zA$WN2h`1MQyb3PUF)DaN4^VT58vqCF zUU{Gw0l2tpJ3Xtt<}g`lSQ0Lp0X^FaUwJHxvJ$J^kov)KkkTV&5-Lcipxl0Z)iK!P zhKSyQ`o|B}H`U=OLY{LZp?`K#QErOVZX$t(7ALxZ7f`>tjS-SPJkte+w(-z2m>e8m zK9(dd9?JY*aV$Mh#q4q*7EF1C!Q`gF78eaJ8O;L3pI|WQ^yfO1xh9&2bm?HSC4SF{ zTR-l(XQaD++`&t+eq`?_i)VJ)=*5@>yZCWaaAco-!bU(R$mRE3%I@E+^m7B9E|0UX zkWImRd-HLXQ%^n}iHx(aF0YR0u|3)PE!$r&$%bin$UYRUiqq8=j7~JSQQnW}qCxa; zLUBXJf~}=JA<-=U)I<6$?uCme>ajjWc1 zZkgxV>eID^Oh#)htK`m)jIs|=)}0zdtF}x8_i$f5@AfP((wvKQeRWXJ-u)-V3jc}T z6`q&Q2z|Q9^5CEJWVxFcvg9TOWZ(RRTe7ly$*kc7oZQ?kD+F zB@dB|Y04+pNnWpHouO%Vk{cu^N|rrsxRX3Ua!d1H9(b~h`C0}^PnC=nG#TwA50QMD zl5s92hP86bq|HC+hCOK_S8{vA&wwD|_4Ougx%F5gYU@oK&q)-m^(OX_CPM2? zJCig~S#R2@q>03O(?&=Wef6eQNE2=Krkz2W26`L};d`pBlFwJC<(P6{rtS-!paFu7C-iw7>F~(fBJ$ zA4=j6rJHVVotacW)H;iW+6iK;aq{*(5pgXD@D7E@Ws=zg|c}Rv)wX7HD@yNx9mNP{`$d1!0^q_Oyw4r?|LeCMH63N#$WZ7MX%wg@yj!!2=+NJTopE`;Vd6fUZ^@0@X> zAF%zi5(272fEnTGS(?gXX_?(aW-f)o=Tb<@MT`(BR#sFHJ*NtgIsv4&eEgis>rN86 zY4iY4dQKH!mR|w@n<&q|+p_X}3jT`#U=!#$RKOO-lJeE(RK7ZYUbg~I7ItQzTIY~? zAU)GS-Jzk(Jn!MNoN|}og{08mZaf~n^mVpSCd9f9_ooq;)@+R49f{^df<1}HBU-bi zuP5=2m2%!m&h~FS&L-#5I__Gjj=NW?8EQRGKZC6^U}oXj z?c4u6x)!J0vxCMS&nGv)>^yUPUUJ5sRoLL`zsfE-0+1ZavOss~WDoqwaPtLtP}ZkO zmY@bJX>OLV1*2eKnmQyu2xR^*qh0{(;#-EbqQe<19XEU8u)Q2X6b6|mf+vv%hw*LM+fs7qT4T(-LbLV?3_4( zEIaJ`gtA*K)N|2^G6uODmS6kTcDVS+X|us7vtS&=1Gm4j*C~sXZPOyha`m zc(aDcVbRSSLV_H6&yIC)qMnBQ1-TReo0tH<0Q4|6D4%c$;Op8(e9WLXW$1Syo-H)*9jVOjl19!Sb9OK;*SAEeg=X|8Jq*5J_;mY?P*oHTk0Z_ z)ZL#{50giOt1r!4Lo*)L9q_Tw5lTwZ5E!@&m%vqCLov=i`w7)!!&V`tMW-6^M8~~H^K3T2L>CSb-71GQH z+}$aOdm=pku0P!-*Qs=5kn0kpuDp~2(5 zz?L_z9e{XA$@j{sS*Id!LdPNg?D{<+CqYGam)iMU5uJ2HI#u4Xsu9V^DIxGX<`H~= za8}KYfa`oVxL(@M5ZEia3U)#ZgMfg?|7OCsQs~~zyjx619<{RgVkH7d*jWgy4(dc& z-kdU`+&!yd9>W9gHKCmAH%7bA-8i@!a9$()KoagrZuNpSuI(&o|0cBB$_c&Hx|4u}Ve(J*qI;K9G+UtY>H*wGb>W+ki61t!mD5m(~ z%-XB~8-uQKE5l;isus@P1|1!YO^ua-2cl9;r6mszwKCfc9y)}`(@d*a{i&&xR&+%O z&I~#%tZ#INIlO5!Y8T->BF&HP#pZx3!L-bp&~adg%EPRYp@G`Xtoj z+-=CV)#78)L3rQWiD8ZFE(Yl{HnRi`wPL5kts&;M{4?mmJn1jG zuqEG;Itr?JixeeJ#~(kORr;BO)KAd_5W;qFU@AnC;o3MAnI zZhSV&QL?r-)Toxx(3CU$k6I17*Ll)Gl}Bdk)_a)sF*o`y9RRrcA?S?*M}$4ZwKkEEJA25O3)&v9A>QmkPYs9-FQ6@{IA2b3VSS)O2 zl%ve2V0=2V*J|V-3NS|b0>JPl?oRy>bG~*FbNiV-dt&vyLKEg8`}B3%x?=srt!dVs zz!K7Sh1M{~!nI&P@UYvz_1N^Z;*=7&7d{JTsV^jh7N?X2I;q{h@&9d&y0{g;+YHx> zE6YMxZGZbP*QF#dpeOBA-Zz8h84OEe=9UpfG=^_yk8vb<0($O7WrjWT*0jqkS_J!a zN7o4_#mNzl*sBbYlqdPUhu=Ytt1#+Q0zMhRcuX`QkO;9Akj%nUNwJ{L@}bP!;DH#1 zP?2+07T<)ygp8FD7MJxhs8po`&Ky^`MQ!)#K8z-HVuqI5Fs=Khbk+sx%ME*A98 zl@>&%l%=^JuQuJCNjdI$EIwU=;cvXoLxFg{F~!GULpdOh#S@8)W@~UxM@qw8S&qu}_PW3W=8R z&epgWh8?6^Ho4r;sSDVb;H&F-tOOdpC>fhUp+uTM3Jhq&y#fL?aj1r&05#$TIMkp$ z1=i3RP`cOZCXzAU_!x_U2}k@HLhlJ`(ZA6n(FqxS7^Ne3Imw?R`;bNqys!@2WiD~f zk_(2?c41{~ib%>R9}!gAt%01hg}5vo;#@HuLS2?Fxt#_To1D?=go_5y((b2g-zF%0 zRb5DC*A<>dNA;!^TfNX4P|!Yvt!>2qG?VnEXycCf9{-r^i0|@`cuL&qA91!g&Lfti zO%YqwM}2Z_M|>MLYxQ<^H|!&&g^}6TX{;T9Kg>B;Sk$lY2D zAJ(BUen1+gkim4QV$vd7GX-?Ah!`_#X1Rz{cV5c;-Z~Y2CL5&K2m8*(KA^&ZWLo?s zrH(bpX*R87v(#XP#$zzou|Pr>Yc#kiVk14EHML|Np!*GY0{?C93G_F*C$LZKDUZOI z$Y9DyHxN`^(+Wf6dH{gj6r$Xs;#-U9C~Sb%ira#?pWDg<&!7k^KkXCBRN z=BOztTCO-dVyJNw`}R;G3_q+4{Ny3K_;S*j9A?(VVx1QtsAnz5?R#HJpu*U8N+(gl9o<zG;&F>H)B|dNvL{d>Eai!@|pI}{B^W7Ul8j954B>h zJv|42Tb38Wk}szo%4#~qNKBhK?%bg#Q5tTsV+vXA71N{;(4#kHP9d)()N>#?wJ3$a zBSK?ufcSEl`L9o03^$`b_$gryn&$`hp8`u3&pxnZ^LJHcP;VK8mtzFj zjr{|qemPcDtN;iGbq}0(^uT%C1wfF+Ad9lceE@_~MjqSN&&VKb=~>tw;b1mK18h`+(gV_?!z_?_O9Qe6C z;j8sHuqS+TI)EW6892so)Bo1|Z^{2g{x|f$PceaperkYS4=T7N9r!?o&#vjQ2?BAI$&!r`Jw6+|-WeBQR>4Lz&_Gf@Po?dF zOmRHbwg-|ad1`DAkVf@HkLSAo8WDwe{Xj!hrVfxaIEFN+MZ+>bhf1ka)sJltFx}~C zYI`u{p4M#-SgDnkY!4D-8$E8=9&7-NjSh^BD2++ktq(3_!1H7dV=IagVTiX!$01w> zXFJ1YZYak?^yx7zEB)9eHHe-p)M+ww-|wVj*1!O9OA-iVBJ|R{OxGx?9lz)=N@giy z(AB;;sO++>SY=%4q9nbnk?GAY!I`nj9KXwWGoB1#XSM{$i}WJL=ho7 zS0TAbN7TWl17b14^SRUy6RNi_|C?y{WHqRNBg6*?B^;L<=Ot5e3nIF>f@0JAbYauh zM797oY9DZ{#i+sm5jAYxD{)fJuX`mectixzQY0ZS>s|2Zg}J$wbG2}*l_a9xa23>} zMGE5{M{4MCw;IuZetp8wVC$1l=~r*%890bAPG4w;DcwV{>Yo=WY}Z$z&PU){d$8__Nz zx71$+IKAvrZ`Vf40S6#U+-WzHEd9sOxXHYAE&}C!GB?? z=vI5Ej$p(4LkI#r={aFY+=mAjf9Rw?uuA&?KpMuFg~L33Kl^4*PR3Sd$^1buFAvi^nqhO1 zc+6#R>)n=w_RQphSF&vYi+C!%yq&sXDR1OO*Y zk=wt~ev5U1Hug}O%kAy|Bifk9tUHon6{?eo7|?vmv1wVZMQ0;Fy-< zB6eGou>ev#Fw`E^?-mb>c1OF#8NJwILbcqbjklAobKg_UGjz7NxgMVe7ljm4iIt38 z6w=5=A#IO-GkVFkb1bqpCKwh=AjC4H9tk`(-Mokppo6si58sGJo5paOuYurgGT+ty zt#3xBS1py`=wd)Qp@eoB1A+i{ZI1}^lSG@Mb9TTs>}m53V@jlXro@wHN<4X{#FJ-A zJe4>+0)iF^EvWxhNS8`kv7WUC^hWLa+1P&l-=j7}Q&PyFS9bqwXF*Si#YETB25m*! z*NwJMrZku(yM=nfv>+DA(>Z?k4uxrZl(;l-+TfmcJN8Px^S4KvUE03wg5;$te6ici z<>^wOtk=&3pxz;LUJe_hxq|ALTp3PPP~NM*740e!FzZF__k1f#bENkZFihe1AS;}t z)#hspR{Du0tn`CvJdTu0Xt+=HF~5e~)?fo-8Zx6FKagsqXC#qGl_GiIfXzOX3mC_i zS$3OZuxEG2+O|fzCiBfM?~U%~TKDsM_j4J(w6DcFNH#U|AeQX$q(O{1wRvvviN2^e zG?Q3}i#4a1_;M*R;oV~5v&*A8$`*L3LDZ#5E{zpkhs+F%h_9$+2waor2lk&7m*Uwg zE|Z1gQl)2mg3*;HacuKUHn0vK8dYn8A!~D$1Dbh*X6qqy{CZ1CdGO zEJBW!@r2^iPF&Ojac8D7F|x9g?QcI8Uzi1OZ56>83r6B4~EIa2Uw?A1grAW z0guaCWq|BgpH<0OhEDp)fge442~((poPau1mgymGf9uzxiJh#>n}Vipi)O`hnifBZ z#8P;0G&dRtwX|eMkZ9H46l~lPY;;fCb_9}iN!z(2 z*y)~j?+BnRrS01h>~l}A(uKN~cG->qPAGc=xCHu5y$%MEF^GBDP8=kI+oRVf?4oXu zE|Ut#WdfIL@Ss5HN?08N^$p6tezs8uRDca@3VWK)P%-RAi_PpA23bW$_cWz@yU?<+5kXe=(&PszUv_y5DU8M? z1(d>^cqj@-Mvx@|?`w#Fw6s>Wv1`5$t(1vmN~NpByN)btpFPiR`}RWdi_ubhL693A zsO-WNvUzrJI0zU27ic;w!%hwa+C)*0<&l{`WHHel5@<~9fURSfDrv6C3k z#f|3p!47zpK)Tk%Hm1JycHk~bG1hf0e4y?r;3}~;cI8xJ7Zj3np8>;c$nEkR>wIvu z1VeS_tT80At<%D+{0&YGOtDRNFVu+5+D-^;M~SgFqN6AQ=9;DHSYbyY{9?3io3SVDX<)&=qc;<5R|{!)V#>vRoI+ zj+6{+3AS2}2QBC!%BX#}U#rhoA;44#u*B$Uc~;&_EbaTvjiy_OPJNm}MHyCQ<`H|Y zDVIX*PD>Z4SIL$)z(MhGZs1LvBb7QA{cu9HW`3Cvbw zzF-}=dFx=o?bk6}o7~PH#l~M2VMd6GsRp|N57f-Vv#WDyl~jW}TAeVsRy+Qq>Jite zM8VVkcgEGY%}r|5kSe=I<*cbLH}{@cy@>|r%9^FVL_w-#qr$z)gN}}t4u`a&8HeE+ zRP_Y+H+@dPQ4yzgR8a$*q^Ob)j@DZlDl0;ytBmt!zOu&B%KEhADQX-)G1CMYrYxaH zXh6Hhj=%U5io+x`wUjsV`)!T7sepV4?0e7|7(#{ZW{OUPb@v;=ioeO_8ZaOz4+tb>ML zQeVy)oa#Z$J&m?#L7ff2^o=j0ZpeZpCvlc%`bb9=v#A^1!hs(q^Z+-J`BbAWYX&4i zXW!_0T&q00|J-oHe*f4k&T}{c%mOVA0{BDH!8#ij(diX9BM#oUkZ3kQdp0Sw;?llJ zX|~rJxwZ2(48e2gKy~Dj{wuj<6Y0s_Clj$~G6&-X&Zz!?*XT#ka3_OyT~Pp_5#HsY zQr)6M!hE+Jd`rz+h|Z9s6l(;rmR)Au#WhQAO}Gkp6Y*A+q_M0qc)K{kL0_O*X)0oq zqBFY^8zQRc@DNsEmRQ6GHom*!1MBp^tQRUB=>fiAtzy{Tm!b`o**BBGiC|6p`Zcc$ z!ZdLDP(;BHIVu1xKJ(YZ&48JcH0!Q9!6q!9kpb0r0bvL5Nti_sgVz~9(&CszEJl#u zpeA`H0YW|;&=gxt$X_?M0*E{kz1R{YlU4TVHBDk&Lw@FvtTB*UgpetfW=vjf&ayuy z{Y)yjERpgjr4`~RbL3teIZXb zB2}{jvBDrcF3NnF*U$N;RUH@h?D79J+&=x=(e|_67UCW5WQ9?zHRk+{cWdDiV7sH7 zQq_C=@VBEaTQH@w_lsL}k12zM#qI%w5|ewt2iqV0cJ$K8299(7QXsC;)*@iwt-0c#U z7_vC<^ODBIN^@_j$ru$wb+n{~)mmse_;7Zm3A`?0 z@Vn5o{hDl@IBu;v0ejqHbK3|sMDF&92}DNjTm!H6TfdE)h0JF&$w>1*h&+;sX4V=5 zBNO%1vdM8O(xG4BE1&dajH3azRmG`*i1)}zbCEg`>6~{=elL|3gi|}zP7Znz8RHrS zT+uTkQ~MMDfDmze*#6uOBPr}SQR() zSicQU_5;{bLk5A#u1m^puIn<7w$^ys+5YH1MjN-rti0AlyeXP;J8(QTU1L1aEQ^+- zilBaHd+eXk+pVqUn_NqhuU$(#VQy4QJYnZnOFSjcy3G?}UQ=mXg3af$i)~L^&JD&T zt7#{({zlgqoLX~KXPctd6}@Ks%l<9w`0uTUeeDNNMwjOzp7R~a?@Em1&oQqIxF;7- z#Nwj5=t9`rJ~nZZe;gBA<4>HdUSUyYc#b|5v%Pvmp;FnjB~+^PMR}@)ge>GrJ$@St zhgbJ?Hk;0tyYR^_b$TMn8pRPX`~o|W6K{5yQPomNi6 zX|cUMxA!7<9tks~mo6hC`2wlAf7 zp@(QwM5B&l@J83xq|~6zWG!12YKikoTY@znskI&{ndLxgy9p<9rD{?qkEju! zDb@T5>~IwrzdD&(h^Vk781YrHEHV!8Qts`79kN>^k1xhkfbPXUAGAOCz3|L@<#I4O zlr2OSZnBqXgG;SbGt3`+BNA6XLo7elV3<(`Jvaer=a7a&{nh|}Eb|#p2<_ScENuz; za2U{UzpmvFJ&?-S;4Wp!4VT<-#rjeT!fI7TUERiV4)E1Ek%O9r(6N4M*hx1Yt-6^g zkiGhV-^h38234~qKsdw&LKTi{6fBLH!6Aq5x4Ac7I8np<+4QP?U!gunAuDvY9Jg6k z;Pzl7R{`cV#(8U6LLUhVu%Vu@Yy$U%%i&dF3TDI9m+3^T%-9&by)%Eg-ro60^k?B~ z+MB-{tzi|c6{{eFr8N&39Bg!VMlcL{qAx98=ydQ0&iJ8fRCY2B%#o!o+6_BdE4mbW zbQkJq&hvH>4lEWWGGnD<(+2aC{*2A!&GRo%Ch1cgI}oR1Tt%T>A4?gQmin65;z&-d zmN)^*^Q7WDPvo<_$n%6e9B{-b%$yi;JJ+rcD?V$(MJ1fxwe<4N@v$B!M%Ax7xB0~Y z;M9Pc2|1)p!RPp~i#+Km7!rrhmLsa797EFWw(?5vYu;?S^CIt;yyFtuGHfs=N}cxZ zngFL|zcwcmfx|Y7XBN9{3XsK#J)SY%bCbdBMY@A?l|vUxk>-YIsswU}bk*rT&wwV~ zcfHU=#0Z)<*E!f^zMfIn*HcTAsTp=-R^*mJlaAOHF8vQmnbor!Pm2KeqjG;7qNKu zTc(X-%hUkGstye;^Y!dt#Rj6m+ymtbuAVVa=2_J7^^6z$dP*0S5(*bEU(YV2Y$MW3 zyG+n6Eu)QCedd4^yv|Kj{5;(pw3*6#KjXJHnLd*L4Qrpqk5^z9DzBJ@At0GKANOBzB!c%Mw z&bUyUF&m@PQI?S#^hQH3kxVT?kmnbrxW0=S(QNx&{}`?hqxSFqV>q2tiMpH2{svs0 zH>DWYVps45X;sgXBCVRf*^7A9$ErQ4#)>^*>r_sf1|Zlrh7`>5fWtFq1LNkkMN?3` z>XMdnP@*Y?)*jO!o9&f(@o z&$O@$_Ck8|C!Y^)A`IUCvd@f)$bfCdY0=U4G%-R=jFMnX!dVcToV&zsJdAAg&pw4_GODZ zO$#*tbY#{)+yvy?&$+_DzVwEL19SB7;o$n4-f+S7SKW969}l;0AE|D;_|m=h_0oek zFWfYL&=t0PuRS<-@XCc7<`1j(i`Dt=N&RIRE_P3RedSGWu$T6Uk?O{LL9JPD91gC# z{KtG&+@Mmwj#>hgAEq=S;(wCk6TI<5|4<5eK z9=bXAp6{L)4*cxg!NZqaeK;c(!($3uI#{qo`J+8yebz31Clz4pKx zZUkGO?NUQMm|eK}1y@{k^%Ym%Fn7cJ6*tab_l5)W*Bw0E4%bxIoW=lIbB6;P9RJLG z%Y^%D=dQc*VEgMM)eY0MvX@zKSVZ{$S9UG%QB>#t>^yd|I|)h11BeI#qqP$9B19A) zT}XJ80BMq1Yi-v&Hj*|ZX%ZB#_jflG)T&s6+I!Sm2|g+cZIg-)t?f0zwqgku6l<;6 z(u%FU1&mlL4>A4!&&(tX*8c82$vNkHpYMF;Ty%dn<= z1pGsY(KATRomVtB#@a+@SL4MO$5uDQ z+Pj+DT4isBHQ`ERe91g6&X3%;qI<6`d0m|HoR(634`v{8;An_?hzg9Ho^PES@9e7U=<+j#g3V1Gbt~02 z>P-~K5e~H`f9p`2Mr|8+5YZHCY^X0PDr%yu*aNPpYgrXzvWc!6+Fihnh@vIPh=!K7 z&KR7MC)2Dc!7JKYR;`T5KTNPDR;}u+ighfY4?-Q*Jb2V1E1o0wYJ7uqKf5iQ8laD+p&|!8by=Z z5f^uUzO|ukWqU`gvlGM{7PK_Cw*&Bo0OT)&N=t4fuJ5CH8E;WUh;bHU0;8C3V2q`7 zeJviHoH7oT1*=*cgd6sv#s;C{U(`_V)4*|QAk{N&b*;@S%csaCTBc=L6XbiDR;FyvvaHPNYFJoQUOgIR!19Jn>uh^jWSMB7 zR@ox?!z?Q&q>$Os>V-0zWlfY@v#iWZl=0}og$u>vWeX@?y>MQ1QKZs`BQB!6Qh5=b zSGj!tl4#B1t138^N#kplR@GLh+=^oE%a$*zkOi66t6S%bJ46TinrUT*33^UpNZ$Xo(`~(bCn*D_5ArL_*aS)wT0WT)&lsB6t(= zY|a|BiJ6qR2pyGKSyr|@IuncbTE2CgY%4(a?3`)k$t^RjX>wcvnnN@3W71`%vbeyS zY^o~@f|tpBGTZX4De}^pR>i^JI>v*zNo&wXjHQ3Ov$2u;o!X5 zlA@9#L2W7*2?DB!0&#xps+N{d|6eW?E{^BAS01@tZEd+Nbsg8n!a~<@3EeXTH>-pY z0imH4xN9kNVgWD>0b)Q82vdLM<=k{$!CI#=I~ewjv^n z<)Y)-^zj45b`ps!_yX}_yH*B<&581!NHMQwfMF*vo(97F8V)l} zm1B|hm&=|J?H}e{gTnqVKUrGz@9YpVIiP=9-v!{pfPRs={yBWBnCv;OWu~ZwR_U|- zIU(-}=y_QO!L{8b2ZI4U_MC8b1@!F!{psh0bCa&$Y3M_Hgp-}5-x1LN__C0XhV)r_ z?>-@a7t-%78+b)v(Y+#)Rlz#pqkad$8UM|xLiC{aq7I-6ybJ08KR-w;3D}7*)dv z7+vvo;H1Hm0Ja`AGI}*C4jVNf_bF58aWxVraJtJvgguwxHsCS0;kv@Ob^jKrBHfg?(8KrpS$1Q9Ql`~8GCo8XF80K(qZK+EyHmYYQhHM zKNj!ry(8@9NeB>3VYhYz3S0&9-!9|7i^XljuxhC!a4lP~=r32C2-hodt(XL-Wr=6r zTQfH~j=<~}sEtS|hcN^*h0(&)~9Pl}75 zXdLQenf>%pVc$q+;yhxw*8VWeS9pF}PE(Mx`G4f~zf5Z+WB^AcDh{rX-V^pYp?Jc9 zit{sbGJut5!k}m3K=e<4r)YvCPsU-KA`oWu_#R41+K~L^`)5e1yidg^Cn=fgrFtqP z`~D&9HGyu7j~#NfuIUB><9=P!&3$vMdVEhl5FpOt$rB%whuWAt5D)j{mE4+mH-6;t z17V*>FGjUp;RNe00sP3{AY4Y5T+^Opf@yloLcR}scx3A_VL!?7eLVtq^O_Q^w^307_Q3__#b7q$+s|p{zlrRyTsb`rl3el6=pb97?zzXQuX9uNTg~hda@ZNWY~dmW>`xBY#>ifR0E9_2`(H;Lx}l(ep_O@M@F}@-Obr5^P#QRb*OF z(@>&l$VNk&cQH#y>5|64!5cI#%|kqsGz)|7#1#mXa+lKtRsz7I>=CR|A%crB&tTq`-p3knDPo*lx4#(L5Eg+eE@3W zq+w9y5CBC(L;EyDCTSGI{^JP)AQ6~bfUuCJKsM9`g)|>=Z4#q{pWMQ~q1GEC3%t_DYkXY8;}cz^(^pu;i*aE9AYCIJ=Y4fG zi)(K~=jFX&=;~Dimk>(0{)G`50}D)gue{drVgV57{KEih2DpI03kSFg8a{->0dQ@B z>t0;k2Mn~J>l{HP0Q|wl6<=GxDOC8txT*j^37!juF8C^awi289K#xLuj9FLRs0MEjWhb54v<7bQBmyg+WXt z9KwT0oTCW1V3G@(nx$z;iV85G1zmvv-WG5La3JI~Alp!cuU)1Y0ipj{qSVH|5;65 z*`^Qan+7%KQ|gTF#Q ze8OqnrBBJx`+jK1JKxfG>%IMkjQ$xw&y$8M{0o5YrwlnlVEAc6{`zeI2euo|#=q*7 zleE2ma}H|;X0`V*(;3P&UO!vg`=)&SGGj;^e9O81as#v5yD=!Qz1kSk2R8+svM(El zCTn|NmwEqT?A8X~kngeY|AVvRM&s03`d(?t9g?#5S#ra@0Q$dU$!qQd(EDA>DZJmn zr1rinFMEpGugH|Asr{>(NUX}BT+&vSh^8(KesFA+A)9qJ-i2`I$P+g&;$9aTRZY;FU zl3NR`3#@w@4e{H>hJ2^MiYO%avkI9Yzfx!wD9Q?-@)Mu34U~~WYnoz55zBb31+R>Lv0)pWEwmn|R9rn2`K6hfJysX%>{FzF3+~n0h zcZE;6!Kd_i6uZf%Y_F8xf`vH!JWz?}>+uyJ_N>yShG0zsb-2M0%ZiI)D?1xHn%lc# zt+TGHYw>253z>D`QIsd_KpT7NoJOm&qeJxH(05-7-TI7rBl!@m{az z;AYUP&R|T88Dao*mhI#(IbDGK1E4c6$!8QOy9Y1>+YSN)Ngl!zSDq2!EZEaizefz4 zu__Oy+gXWZccSgh;0=S~O=b~>%ty26{!CO(2HE!mU zzYnyk1R|H@ZO~W_khdg(2^#rEjk{#z{~eW4preGD@9Y_cgnptD8uAo;;YVt`-TFsU z@t~aA1R7x*XyT}k4 z=VMABB(93w{TxhW!W8-}-2GLzfZ;0c_o1K#Z#QMKMdUT~CoFXbQ8gjn;Zyhd02CFM z%qpE-cHx|hBJ<{#S1gblW?6Y*Zfc_55JNHf>@4d%g%<(OtC#Qi_%$v*wbbMH0AE)x zmzP=>DER@GzqZsWIhXeSuK4cJ)`jG`4?f(F`W@5DucjMi=H-mQGFYm06&EKFzO?yEC!AX$~}sjDEB?!kD+ds z)n#6c_rpBRvTXCrKMvSedqQ!9sDjBYfVZN4AGN0IqS5F6D8h~PGmv5VPxKqm{{Z!e zs5M>1#Vu{u;_0|pM+crr3`BoJ7^hE0GNyubx6kHtI^-r$7CvTOi{M+n)#=Ca)VuzR`j z{r*mM_rL$6k?ka~vghC3)u&FKI(6#QsZ*z_|6;>^>~HpD!2=I|RTu<8`0epk_lH@S z-5+K7Z*YH{*?pM#+u;5nxW7i40P4Ex#u9@3Ik>-J>EsA_mp^dV^vTMwJ-^lEoxk3F z=MVQf?K0_|Kf9}4zy=q7F}&)XKh%kX`@0wJ2@ht`!^$6LTpqr^Q|6(t{`i4ABln@; z{$4eeoRd%_OjiN8C#jJ=q(qhTuw7uv!}o`83Ey&mX8d?4`iJmf_(1qTQ0MoRL5<&k z9W3zss$h=auLweZzY>-{5Wd>pzQ!P58+1t-1s#5ugT4HowYOgtT*>|Gf;PWj9US2I z^+AK*m7vM*s^NLi-ezlt`VE%toT2*~L;Xg(e^aoB3}0&*Qp>z#Z(kBbq~95|_&s5H zPX;mfcNyd<`#o(icN=kMbl>=@ulTC3UVT#(u1D+ZJlEGAcx86>E1>PW!uZ#tUyXuV z9Jk}?C}?)-;r=k*9@aXwAg;}&deGR8>tQsQ3R+-}8;v$HmOlAkKNfYH-x4l_FAe@W3hxR2QyAVG+#22& zd}|cGEcn(i%)TV}oiO~;;A3I<&w{TGUmlFYe;#}^4F5%NPx!wDPle$tg5M6qFAIJv z4F6^Dn_>8W1iul62ZCP@qX!-cel3h%`9SciVf3#b2!17uUiCom%VG2t4+I|xqpy4* z_;47#`hnn=!ss;*1iu(YuYDl+`7jzi5d1>e-k<_$*nMC416lOF(N{kazAim}$9?yH zAhgTB)8(EY3h#M5{80FV;SYr0AAVo>{_yO-4Zk=1p73J0{BOeL?+(8!d|&vP=)Xjt zj{Yk8RP>k8C!@cJ{yh4#=ue|hL{CS568&-XN73lx(SMHqF#1o?cZPou{m1C{qaO}O zD=WVjSurZ}ceChsqO%{1J{o;T_*C@U(Qk46O`v}x`t|77qW6Zs8vRQ2%h5-;`*8G2 z(Jw~75dD1gWb|{!O9B>bg$O{RhVFY$pvkVmM0vC=b0Cab$ti`C7)O2a(NLsEYB%zDJ&~=fEk3@ls z(}z}Eq>S8V4=O2&vMXH#9*9eV^qJruqdh*CW+Uq5f>#eIE#2!j9!bJo;>SK0E}u)I z2VIzkYs={`2g-K`FYY+K&`sjBw#M^2KDliq0#xhwaIcC6Mw@C!v5;!@OyBc2+w^yJ z94tZY07D^ zk&Du%2c+g>1o4G?nzvr7B#~50+XkbjmZQmxe%Rt)N9o$=!VfpEb+0cI&X#wtDeqo2 zy6``nds<0-$vx`o=P&GS-5A|Jy702rFx-7%rM0jvO2boP@h~#>rt!*!_q7&xy7<0+ z2%YgtpXyU@wN+C4(LZiQXimuz?R)ydceQq3h&x|?slJpwbm2Xn!`TNACnPSUymY;l&ZJ@bsqdVjc?NIxLM&NR zb4hB>CgI>ENqho|ktWY3H%i}yd<|aI6QGwYfZir2n|IR-!v#Rv z%Ggb(&(IhPt^-~gxtsRRj*?C~KN=o%oyBNR(sftg2O#&(T@Akf*K-85PorGY?}xg8wb?K&>I`be|~Hl5%_eF0=t>qFtN9lkH0ZJ;8NA zz8&yR8hXszg^{0HQlRaO(E^Foc9kOy&%sTq)JPv*NgF4@b2arqgWYz5%H5Xn7_W_n zFO;w?2w%rVsucIMh$^)}!+>YxA}hM91a%4^27*4>m)LQ0#%G(&5u`n`Y>{)|<%+D- zD_cl*Qj+-1bvEg6XM!73GRki>JnUKGI-}u@ZVF{HJj5kh8{Pts*3o}ctHbN_+urK% zru??PIy~muY4{-j4{xXXd(I4B$`2)0g@0U4B4NCE6J@Akl`IX-l}5sa2#Co zZfdwMR%e_C%BqLt^LQ)$Aaf2C>s&wH?P|kmw=JDU^~TEAMIsNY0j7~;J*me6({)|9 zZO!#phtQw4P7mw4jE37>T}ngjT6F#NndXWF4mm+Yvb$+)UfeRQr=8(6wd=d-bBI|c ztdv_h;z?`NP2a2< zPN(&ARC_v|UU6>CbywkwOBXa+xwJMKI$jM{`i#WtZlf*xuZek z_6&C;^RxqG?Lpzvvm@|G`22t3$nsQ#{n&N${kYfT0)6{W^t;m8ZOXKMJ@1Z;3QpIJ z7sI`b+JkfA5zrksZ$GrN8t=FmIjsygguyV|TV<`=dn^pZ?SC9mpk}oBOD_=y*&V!i z1;UV3q@f2{xiIveMHs02WXrp~Bdi(gz%6uQ-E~hdEW?9M;?PA<$5LcfrT?eVNq4(i zj1F+VJ=+vjS??D==A!$vk@|K`FfIy1hc$ zx({Y~X6w!r$X()Up+TfI*4*AzWr0I40`oowApRJDriEgVTmev*k!6P-YsswJYvcDu zxEgK0@Urh;$QsgGd*;HqXfCeR>y2h>&i`w7d!2rN%3F7odDX}@F=*;;F>RvxQR}F{ z{nTXt=>_iMwbf)XeI{HHP1m3x1yW0TX?<-~tm5@G={)xs9%yb}>?e7Dc6uT0kV;xO z#-~iC8cAxNOaC5hH&g0raco9KSbPhhzz-u(Q5j4xanp>Go(XARhFT47UDtCvR);dMI&M~KF!Qk7+&$bOSjaQjx|$SmMRIa{ zJ;5Nbp#;)kdfoH~F#gcnDBv{!Kk`X}9BO5ObN;m`jTt4MHw;P2Z-$`^a0*x6U33 z)U>dt?k8xp7^*=$QJW$gdfJ{IUskb$!=g3H7;v^93hq_Ed-{hxmw3Jhg-XItlzbxX zr4<-of4cOcV5yR<=k(H?$15N{C(=dZh-WQU>&stI8n)ccqKi|`x+g&e7~de{^!Co3u$9*)g!0ydZqBNS~zNwrlfGn&O}<6 zP8RL~#)XIJWa0k(xbQF?7p`{{-l!C=`EgnEMx}7d&Vp!D;T~XIc(kc-|9)I}R4H8V zD7;xIJgyeroGd)RIWbvt4=^q~-c-1MKQ2736yB7+6K7FUQn;h^>7SmFl1e*glOCO= zzJ~rsuLYy@_Or40gDFSKajYzpiDk z>IKjUeFX_0%d>RTkChO48W6Lm69hW_Lx3_N?xufOLMf3npmrhgvu+NVKb_2KTK&f* z(myW2^EANcoMjk;|7i*SrzLovX4vP1p9y7w{*xvACrkJ|Z7cMjF2O%tg6C;t^keLQ zQ-c3Z2~Jv;SN0O>|F(qx+Y&xc+Y0@EFTwwN37)5oMmc8~ry0v=b&V-ckpWT2&{OI9 zXBl9zP2{e~(^u6wHI_XEIw=oEWCn~*`ca<`3Cr&a1dQS7M=QXXG+v)2=p*TJC7{7_ zUEX69KzU`nsM{@`O=pAgv}@H+*XqcqMcf?HH&Xvds~jREFf16xJfkL+hAj;kc>w5E z2MTh|rmeN~;!`u}#h;mh23axEh*T^KyuPx8P&Ga3OBO)npVh1Fee9o`z1a!Ff@;aI zVC<4%!3ZzIqJv$*5H&sSjk(ESJrG7?FfdeQmskuo!ZU^z76aq#5o${z((ZPlifM2x zXowC91I@|)ltvd?B|OvLrpq$JbtipTO-hovc9u`{x8tyw?QPc(?O$bpGak*75H9y; zdfU40HZw4jIVc>t9XAH`rNu{et>K(JubalwVQ$7Yo-_;cf@opmJ-+lz__n2a57}J0 zjhnH-SjXt&4?&c{gu(cDX5a&$jEe!}<~HTnEG%=W9B&pf@=utBRw_8Kz$WZMPfg4G z!(x0y!B}~SBIV1<%Vc+stv48<)*J4k>C~vSUXob5QoB)U_2sm7)rdF_&OsFpohwGk zbZ)Cn%T~kF5z6YcmSlRs5Wb4FcATotS_Uk@Y{FXXDF=o?-u4D6d00tqkg-^?6-`R$ zUAp$d-KJ|^gOyCF~x0Vr872T9SFfmwV zIT znlY2a7wuRP&^ePjW*C`>BPcC zrn5YgO@OS!(6hFQ(eWl^*kHhKFrBW=gxw6{$>6t(LG6Yx(xf=S zRLk1K1RR}l}@~7!3J*Dhd_@9dhb*Z_u(xvDp(W;z{WXL;OYfZiKTYcy1 zk%8>_D=c|8m!(g=v+R;xsNUsXIHLG&`p$<(=|G-RD8XSn?xU3sN^h-i)mzu;t)gR` z^_#5_LHj!fWXgEzLN=z1exJXCGVAwphV*8tV{J0G6yF-R+}zT|b^G_QmOIp5e)w&B z1>Rx~MPj6xCk^JO^YXLUXqjPKrlG2~E6wtOl0jhyRb)`06R3IR4e&E{8^SfZP3Zqp z1U5DPrAnU(zgPP7rc1Pa22qph{@E41n}exL$G0ha2e*K3fP;pl;(rnU5 zS#H+mq|-K`F2Vm;cNtUhdTO^e0iU&bSqTdsg}qqh5C&_XqsCN-f2Cc05bIq z#t1!5C~TlnbAeaYK>G)@^jI$^sZ>#{K^Lp57#DJMfvFcm-qEYg$U~1jLkC&mD(X_~ zRFOp$be&e_Q1rrd?V~O=jU`{Q>gfII0fKDZRCQ)a9W#Ntp~F@zLCys|TCepWQd{^U zmD)JxlWfL7iYcx#Zz{#*0V^d)QC)&lnrafIbevL5ca2d>d66uur-Bo0btz71t4W+v zbUDsgmZ7g=Dh1{ND=4L~d}5{QXe^(2ysSFP?%9;s7ox)mqo}Nfptxi+87JD_bdt>k zUzh}H+GysHcO%HemKS5f1X6wlrC}*)M$NK^H-R%8HKqNJ2F-0?#`|e%_qdzAI&LjJ z^fqLsMH)}Yvj2x+GOgkIC{ma%-Sp^^H}G(G3tDy{gvgo`lVv@ivv+F{av3!vyh3&!W;YKu z&XMRkOc6KooYul1^YDUWN$THOC;;!^cSD2zkJ-Whn3k$V{^^>Nax@krrffM_FEe*q@)DD&&g03Qxl|#rAIo9P2`cr^ zvRY&1oHWGBkP)d6usg}?USgemNdjpy*Mm5s&2kzLsRzj-fqT%aCfH<4gGUYpF&I5+ zG%WMo^&ZRjUY|2OS((_PylCX<*t{3cF5Q%Y5PpW|M3o0z3Ww{@+oC(~eb7f(f94Lq(^S;C_2MTPkbp7ZmflV~SXIqP5a3qYl{ks(FAYV;CGS8fTrFna zwqUXeiri?PTeP5<|%xS`60{3tXoTCVJlMvAAUN9Z+Izzj3RnU@M2=B0ub!%PY5_=*UD zp)LcmRQP*n zK=IyeGmdZDjAJ9mfh-kdeCGs?@7avvyEdcvH#rJFB{Wk1ttF+6%va_6{o}YQ-{%v? zRrx@u={)1s(LlhuejvXJR?otzs|eCn#p)`0bQRgUzBj+BW~{9r4OC}c#T#A4SY5?F zUBy>j#eVt!kA;tl7St6sfVUV~t$*-n@D2c^#Kb5|_=Y0ESH#l3rASk4vmEf7d?NT1 z`9}jA=z9v#0^hregbKcIFVZ~sEFrQ zg71R`WP$H{i-Zcge^;bc(7it_29<0V=I&7x{w_9a5bVZUgu)qir9b~zbPV&HiFi80 z$UuzQI!hP-I3t0u3gaW;F#AVF`PR>qNZeefi0RmB6ey^C+vkb$xiOv}WBg*rzkfJc-K7|_;JGZ6%QQ}I>ku-nIA_gMN{a_+9UThj`UGaI zc(X?_<>*g`CD`?&yGBGtJ%xOwT4tTo{9?8`NNTy2kYz6Ir0xS~0NP}1&nhT`Ma^Ph zoEU!0dqdRN#PD;R5o@{}7&C0(=gxDd<*8WO&zFWFcQ?%xAB)KS+vlR z=%uJvy1(gnuBP9)nttbM`kkxkcdn-2xtf0GYWkh4>36Qu@4{#5ovW#LuBP6(O1%^E zn(KG2HoTgpbcHM>Mqy2kFaF6ktxibk`+420kF=%DW!PhOsEru6^<=r{+^jd#4iOl8 z@z1s)4U8Usj3>-?ob+|lziFHrhJc1Zk+Mvck2Ff3mGZVEquM8VO=_t&H2GAob1l^d zE~P?PSV3zX@X$Hh%yY}9Rqz_md};-+aa5_`jVgGJ^B%e&*BZ$uRnS^f`BaZKGkUEh zl?>k4+ZmQ_EpF*08%#KSQU$Mxh)=DMi_Jh>G1E(Nfkt6*$^tg87<+KDi+^MbSoGkI zg@F=8aQLj)&aTD!D82YmYdx)O@bm;*b#qaW#Cj(`Vk|2_jprNM#7JRH-g)l@4zqy1 zDkr4}GSjT?GM3TCiE2#%^HwXeOP(!zk=JavP58`AQ(6U`*>Z+Xja8sCdrgo+hyL>& zXES|j5=*P#GsDjCsgVkNX1kGER?TcXB~+@bzO0&6$@@M`y6m68rjx1md`-H{Y`RAx zGwD!S_!AXmV%?Y!6bqO~pZkRIj0?ShTThxnO{wGBFzbyx5A)dJ85}5E%n`6zEh}jD8_E4=%puU$}f>hrh)Rg9i>>g5Nnh{;l$j|A`tL0;Uu#Op&5cq49(W#ihXD4W)Jdg zh9_4uExDRG$<^DR+?b)u)ofX=X1{VZdzY&j)?CeY=4$3L*Kg3QfM!d)O2&N7^)PoW z)G?Q~SJUGbRcjs!j(aUE{!?q4J(K#re#{*j~^ zNuH$c$^65T#n?RAt5r)Cn=RGmC1bp5u1$E=QWd;8TD9k;Xw|woTDBaZdJB3bC!6qo z$2iGrb|XxJbSYkmRgTwu<3*h%hBnX(-dM8^ik%)mUVUZT zMDk4_-86qisD%8PKavA>%DZlH2ZTkV)YG3Tfr`7X(#BgJ@RN?iQR?Y`DB+8{ZjlC3 zjCwg%i|~?q`U@p^an~)<0LS*31pi0@o~6ZYx47F1{jU}9X>r#r?zTezTP1jL*G==g zP1rMnV^}aN;fp&Wdwkkf=zqTiFYX8xD!_Bj_-GVnH`D3A=aqUP+8gyN2b%0SrA!~q z{6J?;@YxcQ0o_#kYzax%_g!2|QvXjV z{OUN7>v&jYaU~VUleZ=-jwhcm>3H&K6OO0c49zw>o;+y9@#GUG9Zx=O((&ZeHanht zs*V5NFXj`ZLof%4udv?l6DJ){K5et($){EvPd-8V#PC(nnK7a=Odol;_vd;8jcuaP z%L)rCZ*f}Q+L>mYROOdp{c=9YGKf%;H_%D5QP!uG6p`$8x`F0IVSkYBwL0mh)#b1g zxxBD}b`x%|*C%TWs8{S&+=js`c8}Wo0&~v z;aC%Xk1unG%xg(FRzAcEasC{0Ol<7ZV}t(adKVyY?hY(iXqN+BB^|pq1prVtTVK2{1`oF6sr}#v zjU>B(^i^98VFgt_G(sQbLnF&AKG0A{EVwJpuf`5=f+Ku^9<9g5LaoZfab3YD>Ev}r zX&pAb`a+sM(b5pcB3Z?GRM;EiWUW^k6**;|3R_)QC5Tg|>2U-Z2Rd+8EsHCUQ%$sY z?ZAjf?GcCSIk>=95@U<@k&n5ObPA>@B4*5#g!O3VxtL1OAHq4FabfxA$UjGV-imFk zU&|Fp~2+NLZrdMpk$#d3zy(IjtTNnB~Du2Gj@#xk#o=4>$D=YsETjRLX zUH{yb|0b(^M&%WgD|3MU#|91Gs5;|>NC$pt)RVqXwki_Nxo^Hta)6U*CWXnf9n89< zx~RIO*Gpc)S%IhPnT{fhc?H$kZbQxrCDn6>z=a|tZ8ld@oba}(vsp8}HN5b$*UdH5 zz_iNGy>_SFJ`!GVuiMcZiy@*`fWi0z?Cm93&TOQq0E4#$*w>d}cY1+DTnaFlSAc!9 zfn{ShH7jgtR@uZ^4HJr>V3UIN@M96a%~+&R1p=ZgjB>MD^q`#-*EFG?I${_Rs$!Ve zPxSBR)*OR3?|AL(m}B#H3m@O{+8r0}e{HK>3U3K#Ec0+MvVbcEw1hLBc{n&(z~xMX zJw>_3G!F+WbGR%Qu11AxjVjmd=!-8*xSm6{8sgOK#MqPTfD1Q%-%rnmZcI_E68%YuuV~{K>C7e6!Z@&r)K4BQ#l1`nd16A1)30y%V%_jFX_{S zLHdmL+Ebu&ZSqt&Q7<^5^F9hrP{T1NqO!Px6E^*bAdtNWplFB{qOf7vw%~;Dm7IvY zkE`H>&y;f_p5#Qs+(88=ngu6heRWefQN~TfJmZ9rQB_Vx&3#3(Gsc`yMteQMi6%#C zrLiK=QQI^zq-y;q53l0@hxDW0W&2Pt412QIpYo6Fy^vceUEk+5lw3R?;}uE^JA`rq zZ%M{y&#}Jy_|hRxDMca`DNc$4XZH|@ZfVw_mMp*_!RLasN?587faRTDs4YF_*A=L* z$#dkm8*Ay4F~CXc!4*%Fzv2`s!=NagJSkpFZ(CV?{QT_!$8&8ecpFr%e>PZo+=1%C zM^Eg~JWwk*C9ww|rI@9~$8M+p^aMrIR9jN@gTzswhQEPEcSTT+@Y1lcg zlRovAT^plw1NmeAk*R~)lZt&wUU8(#g5Y}UKXfN`_8e$TpK(^^u0*oM`a6Bs!k|li zLzWA}gR|O1gP}{KYIq4p&BFx(QYWEc~g5$U{+XmFH*WnJg+Fi%DWe9TnlV0%sXQq|Ll`sYyUp-X8*SMh5_=>@^hu*-Up!+zrc({*wBLn}uQ-A@p%NHo|1v)l$ zlSNa>IRO#;VN=byx!n#_5{S?XM*ZA~+;UQPoyvjCjq zB`LF(!j{OI<1A;+CAnT!+)WCW=ZIfUIo51^crArF{uVJ|7Rff0V@AfY=I|)U?ddJ} zHDBnOcuJj{<+SXxyx{az9Y^P_!BNt1H4sK?8}ICeS03|kWVhhps6#MjHLT&B9bHG< z>|24%+Bp~4wD4@Y|8>d(mW_Ay!UMM)i3V`}dFC4^pS#wI&Imkz{y80WlnG`liky9% zhFW>^2mK*o>rdJsp(9?-rJsA|ndy}xN#}M9uXKy<`g884wc%B8tfmtYUy*UbE!R^R zyUj<+x@-i_yEoA?#d?&J$s)>pMbD4dtpR zIbClb4t2S0ctDq1hKFgP-f+t8)v!BkImP#OhwM;mf^T}*wsU273}KG;{zJz+G=)s1 zuXMFb>!a;}H74jQNJv>p*+5Olk=LARyqosFdWFZDuk)(Xkw&FowF(E3h%wbxt}j*_N*V(m+5Q;<;TSk*@!ijodtUH$5}AAHN@IxKH|= zqt0eB&cZ!kpdn>ZDOvhWl_XfDbB)u-d>TNGzQ^HAsU(-ZXw5@GJ=tTnAGghf(o`Aojn#}kp2@XjewmFI?D+t20jUz;egv5Q zc8yM67T}!gpGpocB=eNc{W3YBj)Xq?>TcKu25#5xUa*_~*}E6gIE@NgIjffu12wcy zQ!TJ;B2p$ni(WrBa#Qj|<%I27c6%7w+63e$2kCnDYM)3+7N|O>YL=vsV5E>Cr$aZQ zgF|W>>3Xdog|dHnf~`a`(usp3oq_AQVuiQ$asmIDy}M?VSn0brmrjCb1o8J< z5kR4Xf&f}*k^nX}orTk!xY9n$nMN%hN6F1FqM&4InYj;QdN#R^W&-FC%_5*%V96+% z5<~V#cLu-}Z9{@5sk4R#&3U35&y&NcD+oe*YQWYq-$Xn%V6NI}YI8d=TH&$civT7! z&1ET8?UE;Hp9@YU@Bs}>vjoe)P%a5rG)M@RZWEa@3DJ$G;z`b|C%oSabk;W!(Yem6 z5U@!^cDlp#ax@;wTDm`3P$#4~ub-QRer|4|pOd}Td<(caeP8x@`bD0;<;foLY~rB`n%`Wm(HS+;2;iFG7j z`u=55NEUIZAm`V?w-J&I0f#&R+>3w=CXnI@n7RxBtQ)MCDv)mVs}p^BPLfzD^`M@& zD5_c#r{emmzGhQh4^vdxN$9ncMQQ()+c!#D#$njElTJy}ZfV(;wQJkjwY3b4YpGe) zweL>1ZS30_&VMDuuaC6?PrtsYDrla8+c7dx@ujqv(S--4k{WU!N<8OP7Dq9vEbjBN zNbqINTUi&r@oT%UHff<6lf~?Sq@?ZG>~V8Zm%%dS;`Kh8FaVF-Eu&8Wh5P zUI+=kklkz0!>xp+vGIu=;f|~j%}JhV`)krLh8at=DG}riL#|fkei;DJS!v?d>>9jl zc;vb%BvDFzeXQ2e7nQPJ8p+i34OA(QuL4*DJx7sqlSN+m?Qa=ZXp(#TEZ_|ja$F}q z207m9&jS4J8}ju`^7vc^df|8$H^ml0iXddl^7-kf0&v?sT8% zGuU3ng{}9;xq#&5T-X44Cl_#8Ou&vKSf@OL^A%h;-TYJ+ zgO@R4(N9GbmlJEM5sarAH`&DECXN>^=NgNav^bt?Tus+XuC=+wVLPL2c#R!IHcZ@2 z`OM>H%x3!B@cQ_;yIwO7+Ig#)M@uu0#fgarc5KaMH|5O<8K_ik@@Kp`$FQ4T#Gd3J z^nAu)<|VdwKB4fBItx&hvn+fc;)x;))4KwLvM_lr9%p&P@eS}#%3fuyt1BB`Yf+l% zG~71%D%jqJ74G_6Mk8!abt66w(S&Ars3p{9VbU6jHqMP{Vsa4pG0)OOVzZ<`Rhlmd zf@7j+&pA&{p!M`1oh@E-e!Ju!_o~gp#Y=fOC>V^B6`g<+_3lf9c!AK3)kY;NnDQLSX=k$>d-BRYh%Dw|&LDw3uw6-kre zRV0n3&GYAiYEH3CBF37Q2sKG_GWb&5 ze21z?Tc)ge-!OuVV{9%R)3eq5`g%&O&NJ!zTh6bqbJx48&$(;$k((KmM+TkXR=+hIW~Kp9FyzB-NGDG<5f-TV9bO;&TTYY zunG5dyuGA?ns9I1#0WIzDyDfc;pU?ceC~?z+?X()aM#=+KjF@>l3r*Qlg6@Q!mWX3 zlsI+jS~1~nl+)tcrU`d#(}bIIvM-%*^N}^SB>jmz?)4Te?cRla4<+(11BYKn#8=_6EfFeQ2g=8QH5II%G36?FKp(vW z8DOa0=5Dg-Si@|RS}~Y0RV#J*@E|BEDrOIlSw+Wa1D3k4Cj?(F45A;YWOm3q3;WyY*&j6l)M2i4qAFNS08O_$u8WYlmVYSjQX3pUvm zwfdHmw_PULV}w?EqmSn{882=LTE|kgIVS z@pUP;SIN`H@D~`v2ZaC*sti8p1{K~8i8rJD_mDUiQdMD4<*@RM`AIa|U=zdh{Kcp? zJjy(hkT<4g?n+~*>Vf3xIEfm$5zf8ts475ZaCYvo3N!dw1qNPb_m*5&ffXZRzql@% zCb_=1;G+>Z7D^g?P!(C_91AqgRz8nYdJ~!bUE?^O373)>jPu1uoB0`tlYeM$k!1eF zA!D)JgjcxTGL;WF!b;>OTv#?Ir_F}tNK9^JUMRpDyyNjk`~U`cW#$%6C0A*-AJE_n z%VcF@Ljrz7rXA55^J#81?a+;;9ckfEgj{{-3m`?xc_R6GPMM&%v)NH{<%r2RKoeA9 zkGuXTxr%SKc~9dp5pugHg!`Nj5{!^bsi?XWAq0Mf0xb)-NgFJy%aKv0Y7ZZR4BMza zQj%mt&#D8_v>xVdnGu()3Hn|aRg-@eow*=P;N5*EZ{m6r10xVgSWS6 z3Ekv$tjAK2*dGNUV+Q1Oj1z|N0+J5{Ig)xk?FFs3TK-X%z1B zj!c4eWPSXqs!_6%A!9cm6zndf!AdTbo>uM=|76xnh3P7DChbwpXRYRa%H@6;Am%mH zT%8MVA0IzdKT}`TP2LU}$CA+!>wa0l*FBcU{*t;klR+i*N~sEBD7^PCr^hWj=dRM5 z9k?V-N(-vo)>O^YAg&;bn+uP8?T*)(X!a*Kz?kP1hb>af;<-gnB~8x;E7lx{3l!^a z$8vW~dB?jllAog- ze1_w4D6o+I^@`6>1%G9w`{yN(rC)A5wRyGhn$l=<)&fiisGi*C^+X5wdg4H=mY+Ki zDG`||^^Fxcs3c6~KKr~tQ*V262jd^-^;0pKhT_t z&N~%>GN0mZ?N#74(B@O*oTKwu?kJQ~amqUtK_aIjzC}3|!DUWG9FOKy1gD&e`^>3G z@WCj#-a8fb(NL!GyZ9c<2_hP98(d{;;P_MY7}z5bID9tQ?drZD46`frZDhU*PC}&b zGBVrkG17&0$JIrAVK;w>=nw~j?%&2yBa0s9^pRS0+`d)L7sT;0@_kLN%;8f$bvvx( zU)oN*doJcn;C#Z3aYNt1-SqMAjdMwOKu)}U?vn3)6U6QKv+sRB{#ep_*$I8Q7I$y! zYm?SvIR74Yv1@%mpX{dZMfL@7=uJeqz6_o;6yFYI)c#*`WLiUYs}VfG#lB#!tIpKO zYCzFSif@k6cPp#DRj%1TU$B;7D5L*IbSx2xU2`dXOboAlR~%{{|N6J-h)Q0*y_>X_ zf-hCviT~{Qut}JcYrg3N=I;)Tz#-U0wH#Oq3^@X!!Cr# zo2h^(A^<-eKmy3>>C=ZtBqvDbYh-+_rN6X80%C_D_S2RQ1qdCs68;W2CQZ)WCSP5@EFG^2)g!lj}+_~ymvexb^vKAzW zuT1P%^k6TNvS0g!WH)_5n@WSRE3G9cu5|dgyxeKFE+-?1dNl z?_TUa^I?`|#n_~F;rP2>n0X%i7Elk=_A%T4N2%2oU@DfsOIm6HlRl2XrR#G~8)S}j zlS`wb?ixBX*E2p&<{wD{j9kkqC4`1Y}O%%C_x&UxT{>YA)-MEi4lR-AQE!f zu8&FBze2`1?Sn)87VQLE`h0mdZR@imjFMa6i&d#fbTM6p2sfO;wq8ZxAQ*MPiwW9! zb7$2-{Pd0L$tn#YpN@{(f0=%HIXIKlP(To{mcIM#wUraKYm`hBUAT3{jF7Z$Rl6|! z_Sq~x60sJX^1*D#9!`sZq6Ws!CGfV;7gIHvBrs59bD z(oOqmQ#6K5;?6QCY&+9$!_>yv^cOlKeLEQ4r}VvN`eHWeZ*42!br@?oPT#B{PA_D< z?<+JgPP=FLCNI*qJk_o9FXq2`y#}!G_)HxSq9VE@eGbSl?4PREn1IV%25RR_rPnT8 zv$2~GQ&SQZQv;#4353UgsYLFz%&5VL!5`DkGVw`z4lA4`v7fHrq}J1LZBIM>Q=m8V zrlIBb;B$!6XYsAm*lao6&Gn)Ia?VQcYCe}I~A+m7FHD5QZVNl0sl9_%)C|J|A7g$i>JKKy>NssRU zFC*XjAaP3xRC6s$f90dBCvuF$FpiI-6t{tl?}-ju$RKwNXt;(H4yWY;`qfy3c9smC zKZmu($HGT66LU|n%r7hS;55AgC=MrHb8Wgrn{OsLzUaqCWi*--6)?)s3AC-Kx0T`^ z-3C&|_3VcXyM@%6f6t_rPto$J4h0)*rTwvWEt@fTdZnpdlUM_U z2nlR6(C;Y7h<*FjWqNhpZZJ{Vrw$L>)}{DP)?s|l`Uc+aTw(AS%SMWsbf(!;vzlti zbWPte7>P>MSNVE28TP+Qp;*4pZZBUv(PKGU9bB^#+Mr3zpq8(3rC3_7d15)i zdZGBDVcKPFJLfX08{<7ex8`RJ$7&!zLb20Vn8wG-qt{@49mGU|tHhS6!cqzA4BHfu zJ{dsTlUl=~9dkPJBFh5tSc6NPWs{+LPe!SP?-1Z&1w8JWk3Z@b&a=L!-bpJX_>|^i z7}!5hY?1bYOVhI8$fb$F zty`qswnf?tw@5p>McT0~(r&l3Y?9S4+5+&!Tcl}5cw8>|$?U-vpy?KAOJ!O%Zu*y$ ziQ}|8w@5otrWNgU(v%CD8M%MtF$@rmow+nJ(`^>=xOD8X53nF|)bo7lR-W$DqqWP@ z&G}1fxuqNOCu`fKYx5^-{iTEXlgY=@75S4%(1n+O_g7@n5?l2INxkn0sD+BqTTj@; z$}gfLWWg8G6AEU2@f~54Og(!~D2hFzHuOwGQKJ8%q;W#mAZgh(Oxh>d@X}c*S`*d8 zYB($2LJ^ZmW3zlm*~wJ~SO zdT`%P6X01vPEGJNgXh=7du28OUx3#IUN>-lJ-F9%TY@(P-Y{@}J-9V|W}LZ%`ljHU z2G6gD_v&#=^eut644hvN?ltF@;BA4o4LsxG;k_(v3EvSs+g@oYZGN?u^7?j5@UFnS z2F|Ys_p10(a15%nC-|Ph^XuWgn!Xes@V>zN2F|Ys_j0=>_>{n>44hvN?v=a1Gh@A% zve+cEolcwWsNaU}5z8a8GzbpY$m${t1cvMwy9*bG!udJG)wbi~g%5G&wNbd(B265= zY}>r}=NKaq85-vOi)8e>U1t-9>VU=LSU!G@`FcUGSk*(GHj4srr-|VBa)xCgAv>JQjWwtHnw-E?jlHRleoaAVmjaU@7VXEQGnXES6Lohq|~l zW#ff<3$-%;IW@!1t{Xq%J8Lk_saPG_HK%>}y^(5!-wv}w&c(=-J)_T|;NUU`WgWz5 zmIYNn+H0KkQL23+@__+HfS#bDO;D=)mVjy;U$94q`M5P8e#}jfT9DhSY;C`rKv};G zO3yM?IxkzR=38OJTb}Z5)(T|vGLS5sPL{3Ms;y9JYBzzgeHn~8OF@A65pyazr*=z} znqN$yRBXXkW%o7%_AUe1uK>!AriL99~hr>J^HqcE{X>V`jt<hZpnkVgubIqZ|~8aNNObZzLz^Tl2b; z;x$fHRtt0~Z)GVP?j;_U4EH8swYM+f?Mn*KJ9)U%K*!>G4TDMX{six3Fk8-(Je-sU z#^v4Y{@5U#-ne5vT)^+FiE6RdQrzJ}&C`129Z_g`+H848tXZB$6kdMk%DV&Q-C}un zU3tf*Ef*=+<4AN%nRr`yce}b*AkUf9y#k57^9;=&q)(b3%`cM_9ygqwym=%08PW!; zTunbbP-SFK!|1dY9QDV2hcUc)ddL|Pv4+;Ri^`$3uOSW{#^`yL05#5oj}?9+4LOz8 zR);eTgAp(cK&;xbAtGXn3W;_6=yH`hHd#7=a5&Eu7Q)}0g2en!f z;byDyP39$0fInqQg_gISyM_c1g9(=47y?i3bg@II#J+Lmb()L3ZB&+(hqAKmjGDAr z&%+C<9jN0Pz%He;EM27?hWONp8o^FaJg#O9BsmO+V~z1?$2n)vX+yeQ>i)ub3IB91 zK%`Ih@O>>^LVuA513op(6-o8R)xpIE!Rf`D%!4{jV7F5TQN@u;?Nlv?!`n+&%2bTxM2d&-a|`c1SvIJjFz zDePuz@j0|eDNW{V!lCul;q-lPr;BNVEuU6|yD@!>2HG0@6F()4%Tu)|ibAr3*Zb8p zBi21$G*#d3&2bi{KbJkeGskH5B|+khvBL&!22pY-V>_}!B+P3`QyjKLR$WM>xx9!8 z4l{T$8Y}=Io(J?_T#2N}X^TB5CR7sf=VJab?n*6M2SaIk7DSLItpy$tS*FW0hNKr`t=0cjJ#1nSP*4)8St8F6f?x6t@AyAvh%A(zV4IGbwb%VX z6xI}^a-4#QQBi~n?0U$QF6GCJwj{xgNQ>yRTt4$XGdkr0iO|{@w6KZ>n^5oR{3s35 zgXkHsv!Ez3q3zOOa1B+AQXp;cXT21FAmxqI9eLa! zQ@sKO>|s8sYDKfc$1gJ2M<|nZIk8FmU|u`2KOBL5^aA=2=c;@gzR(LfFNkqyA1Ua9+!9kP^uV zu00gE+qttur2{+b+QV(}@hJb#4XtWy?6G`1FMML#Zcb~`fUqx&;#$4mZ#4S-W?%nW z?S8-0?{>NEO)*r&Q28m&aG=o!*HeCfF?vc0vL#;B^!U51S$QDWAKajk3V6(~>A|;z zd|niKrh3~qBVus>d@$WT#)@1Cu`PH{^|l#)sGJ^rT?olD|^MfKV9a%sH*0^4YCn$MU0R;jDSg6qYg#i;EO2zwo+q4zB(;@& zI&w^U;G5ky>fpbI^89!(%IXh39qRbh0$e&{LQ2F|_Nxs3BGe(VWH3CnLH5VWXNaJ& z$X*B;FSh25m~8b<*LU0Dj~pIXeAIS&{83vd+N#=|#vyt{13L*Mp?8aT-*PGA{Y*XR zwLDdx8BoUCf*PIMQ#4`H8$8r+P$}x5wZfv8RO)}Jkf1nP(*5%;TTs|o8#f|dxTbql zDnY6|vhM_(ELZZ|iPgyz)SB3orin_@9*9KC+mgu|E)^^-o%+cj;h%L9F3++m?Y*6f zY{rxJpkX|9+|Eqa6K~mT#9*bwrrV`7Y|FkDf~S1*$bgvP7~og-U$HqE&$p+^9u5zJB6@LX^sbYO%1-F=t~{+RokORe3CH`HEwN zKFj$h3So+hGh18A*RnHPla}Yl4&zs*H%fqg3W?oG-Fs2c4Z6m0Qa^8s%0joIs3bS1 zD5Ln*Ns_jph}NhPq)ij$?Pg8ngE77Up{vMTHX(FH8+oCdf&~ivHBqys=twL2U5{)( z%^Qp#3iCG_UdI^ykuFsI6K$3LdIcW64T89*x2h&bKc~R z%`etJr*D7n)fs7EZWGqyu_tZvEYmvqxm8Mj=gr7yeTvV6QsG{{QO5Z%% zxcVA=XTWgOYHwAoFulL z4z%%DTh?4#%0<4qq3MKn`qi4qg$gs}!h8jI30Y_q z>g-IN=_>-f+`a{9(S;Y{oZ3_&m`yE1ijYX%y@u=bIZ7QD%36sb#PK6h)nUlaz!PyFnV@- z0m5+r(>Rq*-dqLTC3qTSRk_Y->-D;${}c8`f9wvvstdBN)>C<4Q;GyW3212BlcK&c z@ibrAu+m^u(I^vjKNE4zBFtiZ!MfsRj)7$40yPxxan3lV++la)wFkpjMA>NL7Y~Nl z>iXG(;lb#k(Z;UD@CrS@criSx=dWE1ug#!6SN7fi(vGIH##h_hVt8n@SyFq=Rdk8;smUB zyY`PHa~EC`1i>Bew%>OpJHK&ba5UV#nBdl4WrEqeo47U2of2Hq1hM7_;vB);w;v6! zSxjaGJW~OlIU1-lm8I2GS`N&te3kjc7&GqeT_rG>pB0$zIn9*7)Pv~S%VXyAhmsFZ z2AH1}xO+6am6;fC z?6MAnm5XP46-gX(frWtW6t4pVRtRzjN;gyI*iVrq+cmk=^zzb|ntiq~+_rinhlU+K zvI(KS+ud?ATjWWa){(Hda(pT>GdiXTW|at8B)<@PYM@YW=#7kll}u%xSX>B(JN;$O zUltsl4e^w8k?BY2*f@0M&_=QV$zJmA3ml|5_wIKM7j)PjpKliw3lf(C?DV}Mbiqlj z8bPB}2xe&j-X*be`@ZecjrWoPSdH3`ljztT6*Vd)%hpo-)EJQVOLa~?o*DA-M> zA%taH3Bu5((s&=aokJD~=G?9?Ps0aQuwm4>%QGc7I_Xd_0}>q{UKFEYs9QeiplXjX zbaU*K!+Hx{8#|-h{gyBcrC&Cl{>td+#s^;+&4$s&&%QF+eWlEhU@=G&RL_0fQ+F0z z(w%4TlY^$);O*e53!`^l+la7u{TPOG@@>xVfG zPI&BgcTxZnlRDeC0dBbWWxKoG17(e3^gT9sz8MkBf5%daul6t3!(Ps_uJMdhcV)M9 zy?MwH*DQy)+F&u;ot_mfpjTqr8oW56U|gMa2DtL|+35ulA5crx%QQTyVsH@e;>%gN zVOS(wO1t0K;eld9a@dC=rh;F`Ml&tajz-2;&WKG3qvoJe7|b#-n~fMWTzxIU6{^)0 zhF1PC&9ul8ACHa`=?~F0g1R+x@T!XC75+6Jd<{j;!~PfmR`$%h&EXyD@+{dX?7ep; zX>eQ*BvLSoGk7j_4zwdNIH$D}{$+2h;@eqDpbp~WfJXM5C^LtQ#Ah{%Vl8vKg1EY= z`}z^WsMu923kGRnJAMNbCx@?=-msgLR#IOs3-1b>=+S1cF1h;|R)P8`7ag}GpRnwN zj^e)u7zw*oByYg3h5h!ag=Ng5ewVe}X?hNmb!tn7hQ5BnvlxJJZ+`m}HL*;7GHbw; zTc@or^Rkkvv%5pre07@be=w=7VG?U9IK-W46;m&>ig8@*8H&cLwTe-lykbggv0IU< ziL0tu;{KxM+LmrqfE@)Hz1qK!l)e% z$at`E-7Vp@C*K-J^(=hI?2e?Sbjjmy{?%YmPvQXG(cNH z*4WeceR?q14ihc?g9u9xZ$-tCH=ui#rYc5 zrP)DHPd^0bBhPu3f<5QO1ThgVH{N?^VE>-p_|VC4M#stLyo+<*jgdi7`hM!P3to!% z2)#9hSOIQvizDo1p=%Y338oC}IDO*NJQhq74wg)f1w+VBpQ!NfiNDBl27bsG_%j6q z0UE$SQuAVq@)T?nq~e^F;5kS2w74YJxw!kTd?D^4i%ZhZXiZTTX!j-r=s&AQ5+QwA zG&sceLAWmwkY9yRgmTIU z>-p@nMWOhWD6~?h#T1o=R!SV0!dHo!g;FA@L^c>iCwILh^d-^-ti(9IXihGc+I>Af z^_?>iHn?jr9dv&q^fM9xA5p&W5KEY0#=^XUA$a0wr8NS_Z4pl55~S!c4FTc}N^vJq zeb_AQMkSzCen!A`6RgUI&kbV@+ZwgB#tek{y?3hEx)25d){cHyLbK91MuF0ZDY^$* z;8|Wka6^C`p~oC|_;}+>xg@9)D?g{Ia-_e!NyXj^>`hVf@!x6pzV6RosWrdFv97L zEAI*4UIXsT#t+>SzUZdghiJ4z!ELNJa=B$lYa9v=bA|(#>oj*e6fENNH5p}g-g+AKeEw%S@@#sK05|nO<1YWh=sj{`3f_*lUJ8s>%zy~_Kle@32*KT z^$Vh4Y5vjkZrYN%A|+4Sc*mE7FX%rtPH;WJ+%h*#NoMWaFN|Yuc4J!L1bP0eF)zY9ap=)Cc%+b`4z@)Z zmACPoUrPKVE;<^Cknuyo_C)i$7LOf0?j)6Y7?0LQN+ryRM{Ab-r1o5wM-<|r;0jVP zba=G3J4kBZKDJ>kdM&B!(dDf*;ti~AOuH!_2Si>T3T`HOfOO;%b!#$Ux;)^~TK*Vv zw$07(XrgonseIz#^v3!>3%?_)tKUUTfYy)N(pxlMdW*`XH*|rGKj*`Q6D@G&?^~hc z)bO=QM(8y4A9dS*l*vAWs=nZcEkPIhonHz@*I`vQmw$u~^dIvlZ8iLnZ(~yZuEA6? zxA9Fc5BKPsa`2V-KP)@Ux&3dz<3R6iXeP0sshKUt)zjbiI4%#y=0b}4z2^e!7})O? zVA~=IM$b}RB^Rr zMQqA6bUQvkV{k^17IZMq_2K52lm4+;>tsvnoF)9AHH5SuE>i3Ql53cmO2$qniSZt> zU|(u)E0Aam!jy6=h`0)YzPz-US{0(R6-0gYOi2mbmbU_FRFNrz-rTE z%%L{H>5c#KFT#J7A+3jaflQ~*9CP&rZ&R0x%45myzPBEAI0XcB?7(D!kPt@HJ)xPh z#kl@=Bjmo=PmFu^%~!gJ*}*CE%X{K ztvVBBsliuWzkSz`l0^^ALz#a4@9^z3Bz+?94=CM7cZrwuo(6?<_B%Yvs= zt(}LIp^rBzJP_{4Ou(DMEe;S)LC}K2NX>^FUg4rwr}sYyMnC>3&=oDl8BEI_f(-&2 zfApq!c&ueC{_`lTYm)E0u^DS_Kkw{b2;QDZ;l+Z6ASG@5&p!$|yOD#tM}wPX zj6ssqRZD&(v#wMm-&sli^I#1Ano9a(;W+)9WE4^&;hcL=ZDh zFvGYJXW$R>ABI9f`aXjRMz^6Ac*EM9lqD8{Ek^F)UicXC?5tu<0XSjdG>r^4t=ZDR zQicyQofL2_?c?2_hqo;K+`&hmjzk{{sbjEl{hx$WZKgUr%>=>5H@_y_zw>b!?~o5e z{*{Zc4edVIc;-FfjxQ%QSY(jV`75-rGux50JxqSMILtl_c}WK|DVgdRyXtcm(ko{} zo-yI@B#bVZoh%TN%HNrdmG_2gF9@#lg_vz=g+ynWa-PMFlFpu$V9F1Xao7%9)2=4s zto!A7-sZm}yv2@U3)!30D86-fZ= zam&F-xO2ZhXyz3*-+k5OyR-h?tL)wD?Hvd>O{$iG(-&e<*zm8X{q4*uS;OFoV8rr? z<;w(M$*(37uZMdqb@)mhn-RB_^0xWocJFY;`BM&7dj zSbn9&?fLy&)1N_HU(WTh#%Sf;*H!?wWXbvw?mz?$ULet6O;NG%hApFL zZxoue_DV9t0Vc6fLB(fS+3}0VM$*u9KDQqaMX&0^5Y?9ArR!^M*BRF@VOYs)nDMTy z&hOpjdQ+(<<+5JNhb2_!lr>}lGjCS^$Eu{5J8>OV){tR_UqeP?>&s`dg_y{3)U;|~ zi*p(nR>U=1L$;9!)$A9MEpCB1r_Q~=P0i^yTBl>MaINK>Fkv%#IJg2U!1WL+ZR6ZN zvekY}bP}94Zq)1`mnkUV%(n=(<-a_qhb^3oFF0_v|G>^O`bXvJ^JgkcrW0Hh+kPgz zgsFF9Hgq%$E=IqCqvg4{YQ{v#R7@Hs!({zT2ntR`mMadEMB=0E9un!Q{9se(@`LP~ z{K#z2VuvEhR<-i`cEh)+yFc0Zz~ zCc+mn_N=Dt6d;H~@D6j|A`)Z6Iu z=z+X1X=7Ih^B4EC_Rs{5z;<2oC_aAx@uvPos~-bX6=(V>kqBG+8>0N)G^P7hB|_0n8^F9uc~&@Sa7GcKTrgo$%`6kCZY+No#`#HXD1{S;Ua3Lja~ySzMGp92aCI z{5R9Ukrr4OMd+kOaXNj*%B*uH4omnt-zLG9uN13NnQHL0XF{@6Ec00v+ZA0DYpGio z``cD5p^8>4p*TgcvO4pscBra9A@6H0SFr!sD&_n776n`K)&<|80Y_i@Eeh<73v5>k zWW=>iiGpA}k((}=oNivy)gut9Yl9?n3`V^Im8m~Ob>+b8zOoqrqq&gZU zK!89-D+)rm1O-AgV3Ys>28sA%5rzxF<-PW5z8;(a%h>a#!A z{$6|Swbx#IZC)oQv=3RcQY`x-rj|2IRati8>1GFfkjK<){4fyei)1FCzQB}RWrA3! zLzuoYi)bpF%7!&6Q;qkH6xN`;ISQSUJGV{&_MLYSNJOxJ~{002^U*{)5*NkIEoV zEHo`ZLQMA=X6RfLf;-;7jP|paNh`=0A!CrmUP3j6WEp!YMu;QGwb{#S+osUJI*Vz9 z8n)dNYU)M-M!f7uq(G=M>Qxmn5k^#d6w_(6iGe?bgfPlI3SvY9DF^#%6+{j}D)bN1 zQwTL!nIT8j2zB{1gj)8}4E-(7)d}^AVl@LKKVCtoIdu_@bF)r_8l5!mU#>~0-MS>J zX0|Y8gu1vettgmDz+Lv7P-ES{SD>a`R$w;ecv_>6PzMDHlM(9wt~`4r28tl!Um(=c zLcMuSAC;CCj<#V4Y_bij`NsQv)m$sE`&<7IeklA-_Y=Rv7THwF1CempEI63mTu*gj zY-}?%b8J=+b^gjIshMNSfv9KuG|K1M7V^B6z*1L#o<+T|5Y@3Vl+g<WGMp7vx+zPhI^E>LZapPIN7cI3#om5Otg^dZk;>yeVf~dQ69uJT z`R@LNYbIQzhSTEI0&Aeo7%0NB7W20iGSx#(Z}`>JK9{${nd@*$OCSkn+ORP#w(YuO z20al^3;C2H-EGq*d8lX!!XU8Zu*d+@x1y_#(2qioay}?+d>}#xAvsGC0>u-oEuw*d zOp^zz=7VTWxK2Nym^X@i(hPN``BdP_PX^cVHLN(mm2Fi^q$?t`s_1spD76VS3J4a; zFTQt5h2CK$J7QbB^mgk=Ish8$(^L_-`7{-m=0~hceWLVrpO4-`wN>tZ`o3@nPd=xZUzj0>5ZhWa zAgVU9X{i-N2O^LoOrw^r{DV%YM~6r+?c#q@ZUwra z!Zp4blTr`QAP#(vv%pl*0h7!FObd)eqnB!UsSH$W z&1Pe0c%<2E4%W$@Ee2aLt`s5AR+q3Dt5KNF1xK4_+W}qyAUqWyzdbvooa~k?#(
IM2(99aD=XH^>23MC3mEripRfgb8hIC%~U#!coQ5Rjge(H7M z8l&r3ZeLs1>I}wrZA#NY82-dFY3I~VMk1PnvaFv9Aa)|l3-vJpYoCWuwhMrY-(*>3DM$O`B?pf z?e2%)9Zq8nDv;8cICAJ1pGr$Oj6-k7z)alyXMy%AvIWJ7pEiMc$ZkR!eK5N$qzE%d z2zN#b`J7=P9!7ii3xcf#akr}gw8cV-86||+8*9bDGcC~A!CtlI34{(AAC%X1rvvk`WKZK2Gu;lTtZwwRbsK?P6zdOcTi^=FR@!Nq9#hDwh`fnU*s4bdW9dHk`+@^YdY&dF)so%bgM*JK*k@QQbGw$l z8#5os(4llJ|17^>zhhKWh4l(rZg-hlh9tw`|VX+!G)Q)CgS+t>y^pwu>e}c%IE+8@?kf2%? zRJS$IEZ49G^jT!F%VuKlILfXr?GH-g2tqxp)9y6e4UV-3C354+ZM|J;*IMgi1e@$m z;T3fd&O1I>5#Gmv*s7H9-XC@z?8!8|y=9)8A{bBIt0ta$4uk2U_H)c2964*17ZyqH{Ir zJN4fPKc1g6n@{L7Boo-WW>>O)v5k>IG$fcR5M1>At9W5zbOl8*JSt8M77ID?#oUsG z4I}ntsuDK7YR#lKC<4F-0$}@ByUwSRqVe}V>-y#83y-xEI<2wzzIN+avMvk5mImt6 z?`v;7)_G$xmW9sJQ8A&LkG-)?vSZv8A<=Lay(QUr?2XAt=G~MCZfi0_;H&^QS^Pj2 z-?I3P$t+Ntm0KIoWNWeo_>IXXLU~zH<+lMLoDjlWgu66WgUw2_t&oPtoq*e{B->6& zviUXC$BIb`Nw&NO+ac8Rr+IA66_)f;{#bkVHSJBbbd#c=6$HV7tGHbPm-{ao&o83@ zoW4(oWOV5)(aXJEr-wQ)+ zI&q~XPE19UWJD7VQO9OIf2N^=L>@cmZyga_o9-etKSKyVhc z8iFDmY{SAE;06!KfxH8p22fYWFhGHp-of^8$3t%Pkh2-&CLo8%5Dh+F5j)r(^MEZ6 zh`|?^Wg9?@YcNB`P~|(=UgrU~dBCk1;C2AT>!a9*lHbAhxB#^l?eLIu8RSkN$H;J9 zGR~`bdLYg!@4q7{x5HrFlg-p zGOrK_z|1Q&DR_kp1+PZD;MKSmyc)fN_lGn_1;0k3;8lMYyz10~S6x@|(m~xf{82cy zkvj<2Nd<+!$jkEHaKYVI-yO~#tfa|8^I8m|q*2O(r+qYk(Qeieh5W20+TdYQ0umuj zn1o9&Z0fiTac?NuihDcvH$NQyd^pklt$X>b@4gt{3%I+1kq%qP-6G8rg_Q;Dq+}~Q z>lDW0j-sXJSAN#aQnrw@xHYtniz8rpj50UGs{5Lcgu5|sviTsY=3GwL8I`(MeI(pA zR7;SnaMqT15OFS79 z!%vSsDAL|K-WiRnusKX=QJTFeemPp${D2)=kU0(@>$7 zwNk2HVge`zYEoyV=cE(zht(D+C%Wf0Oz;e>-<-d~a>*P9j8S}qTwsT&ptKt}D8v3RxprsjN@ox1|1)o-9e&S<@(&_ zGP8CBQ#pQz+A*#7oDc!{d^#bR*8_LyBn;ZqV(T^^oXNQInWwQ8HZQwjQtKsyiM)I|YX@_@=w z?!gYg3(^6q`n67neKZH)#=*c5FxKav4wAz}?n4b4t~84qwh>^SDI19a>Uk6o!7xaJ zxqpm=HRtODK{}4NoJX#=e3~vFZH}9H6tDc)U}r^6ldzP>&f?=$Ki3uMrlUuABi$;4 zu?+-jx*l|MXewl_Fgg$k8REls_ax~4{ENdq?y3V=gdR4i^dJBJiwiv84nzA=S)w$> z04GX~P{tkMkVgmdx}g&ZB}2y6ba=pwV6p!G(5d5bd!mT~8S;A0qni(gL*NZTY~syS z#UeNaT9RYpE>mtDjZu4}a?$SK3Oiy+u+~CZT>g@R90LWyqR|XVNVPMPIDkOqr?hP* z%pu^=Bw1`3xG9rLZBaK9(OJ>Zgj{~G}9!6F?Uj7U7}PHsK`r__*%~1sY6Lx z)2Ksoh;G+b%IV8FQ;e0X?n6Uhj{# z*3r}iImrS{)^Z07!N8y+D(Mowrr|6|2a)am+uhOD4&ZtEa-fS;FSA^%QE~Gs&{2jL ztzmk`i+*hGcFhDWbu$^75H6S~FD6ETc53KiBE?XBVw_??o+efd2gKZ4CI@;LRnz)U z=Vdo9WVo$2m7_{#-mc7_fnOtkdfoE3>~&LDCm8iR%B&T{- zC4hmJtB(wMXgt&`+SevjOQ|X*nxbl}?uUjX5eGXj9YSr!lzPhw29!WQ7@Qak=&pv6 zQd|&7j1Q_%1^%Fvq$URdBkkbmSwvSvC?P5&cOB@E6w;C`59SHkx+ZJ$PV5m6R!NS0JD!&GurSfOrJJ68j5e?_)hkpZf2 zLVPs2Q))5jEf^vsyb`~ZheTY#1CXJ#sEf>CJox*wmXIS9MUw^57U+^Il-_FxRE2hO zVO8z-y{`E~tq8Y4aDzh_eNyLzbUKYvkj$$6`0O6P^?1Gexle~byzsy%rclCHpb30} z+a=|#R918OO2+3ri7U$K`3O+pd_!TY&>4;SWpe6{v)MzCmk7}vj)>`^bsl#Tt~N+kNnVtU_7wJ5Dtw}Ih5o~cb{shQbM9D zca!_`7SchDu5wGavZf}X3$_%asb4l(B3TG1ogS%>93UC!zKZR4x>@#VFne#!N2)-5 zut$=<>a)CC=|+yqi*ZE(o7yLXyo+k3^fI8uw4<0(&7qv(bf@N<#Dpl!6)S8VyrR}T z5YC!?{1voGi=VY5hHqL(mw%b%qZ6=~3E>=B0d4sk9h#s$vNz8}q!{B0Sl_`jOAkJ^ z=v5U(1M1cRuy*K_hABKAuLv_3%f|y6q{f%i2ha<@A>^6}m;w%2X9M4=s>}3rM|!4p zvBp&mb3Ga5qmVT!&WD1{*eQ)dU8>h8=_Cp}n1C7|<}aq|x&3RzU1Yx39ML7Mxt78j zg|>txQsr%sG(uT31m;^{8$gC=jJ7mv@G&gDkUs4SN^%L?JnVg?#Yn=}l0wW{?UU&d!ybk4{RPlfDa?v%D+l?ow%LA^@e)3p--e zF%M`%8YWyhmK7F#N2&9HMT(4?zskJ~Rhkz@nOsl&61E^fIUA+J9Y`NZ8|io6G>WVe zQ+wc7$F3}f>CYTan09uTk#~ebNnpbCov@q3X~NMhl?4SgUTQh$ZDzc}^z&R;MvN); zlyVP<+9Aze9FEt8>&ylz6-^V625Q=Ap0D9y2y{~hy1XMk@C;Z+EecgI?tn1G+!(P^ z8%20*ec^R3)9cd;kkp#LE?xZq`5Ds{mBeGTrEO^7d0 zMTo65dF~FHqax@*J_zEdysh3^&a5~pk{8DD9{m`C_X(rn!k?ZMNQ6d}0RPZHP(Vgu@y~2n=Z2bHo1^HewyNH%jtX%aukWYSbDHIE5iv z6L7vf%6TwzIi!Qc!FrQ(n#Aw`LKP}1Yybv?75U)|fIWjMA|jx`+7&}1qz_?CEPhZt zdoMTXNYZ^NZBDt=+iGB~Sk2!>8U&7@6;xofrB3A3SRF_i-+vS2Mc0F?&3_KtAz(F@ zwHd}`Q1q9fS=0z|(M&dL9S%G_IFA}tlXa3BKuTEpg&JH^?)P{>$xgFkclH z_DcUAoNn?Cp9Ou_g3?FcG^$vlSXCM`=&oBv818+X^A-;4(kdhw^B*V))U zrz%(!67@smL*vpaR4sj+)@7N{+~jccG3DekVlP8ApNE1e#=gnFncw zP@|WFc6t_LiF_}##yhHFotZyQk9?nYWHf@I$CWlpl zXib#>>pRfN^&G_1AwK6g>QhOWxqpaY2=l&Dm518l5k1uW2Y*JAM)T>Q6nAkHh;~&; zb439hL#BZNfd~eaWI#5dG*i-m{$c^u1US^qFO~d$+CGzAt9m-O{ z>I`s=G~M)b;l}YAd{w%{AWCwIzzAKGxcidNg_m|}c2s6JPANsN^Co8h6JXp5G81=5 zoHob`4N3|}wGV{=GZ9)5(;|WllcjNCs-%h;W^VrgUV9j1Vt)(uc}6=*ZN{pHS(lts(NMr32bFpl42ls6W;c+7BTe+x;MO_h9$A4~AEi z#7lPH@?ba{4tGEFVE7}$!_o^awZK`*eNK1gp>UJgVU~Yru@yjp8ZWN( z_Fyd`-~YZZgj+*@ADCMoV8Z*~`jznC!lBQHww<&~azEew-LHioeP%$*WaqH{ znPJ(T5mU_x;N;eT4rtt&)J^rOy#eJb#*^Qj$q+#sp3lwJ)N5ny={|8EgFlt2V69K4 zO#Lb@@h^@``b3nB3#V|gEFu%h0Gsqu=nOCvrL4?L`kpoxKp4~K1O%x%7VHYzSoAjQ zWWrnDBp5wls#sGz4zH>v4VaD+8rd_rnv(5eqCqD)T;|m|4dE~mI)!DFE=!tDaSNOL zR`q5j9EhsCs9usO{(8LuzJS!KEg8TAAX-E~%utAA)TkNHgcCB}+|`=Uf>H#IBspIb zSW9m&=T54p1=h}*u`EERmD2(<1t-O>RFg^FgrR~h(46tcNFG$5dxj-UElp~^0cql} zEn18zpRQfRsplvF25VKW4No%E{f|$C8!z7_yzv!>Dy9RjDx@uRiC8Cf36%5_p0wx6 zsR(~DSuI)L-TTRKa%NY1;u7}XP5sFLI7~|i0SEzz$)N2OtLKbbW$Bgl&MJnIw{v3?6;=8f{F> zVg+PlngL-5UBkM=p9}}5c2Q4*lYm2Lp*{dDtT7#7K}B1jrsvc&5Eq6eHy&_%VmVR1 zVwENF*bI_6yT?bjuV{mv0jLqAWuVj!TzkUOT1^pOU`v)7CL&X83&>@isp_-N5>>1| zh-%eeuj(@yvy^I@QfizwlTw$ju)h!|O~V059_`myW!YQ%%bMs|buTtNf+NO-k;eFF_^*24zz%egv6#Wgffy*|FqlLGckQBmI(#>5} za@_YpYAq?Yv9SsYYp>{LwM_w+jXDHi>yT-678{3^#Z0Cp>*{HWA-Y)3M2c<(V{YjW zDLspI1|ae>m2Q9z4f7I9MDc5p8OFA+(C(uTgd0^{VbE36>2y}bMONGp#fdDKg|~_B zMV|^UkC#8v?7sR_;XC%3G8bIU04J+h6XaN;BHj@F|C+hW(g1_ai4_HZBx}*#pZj!p zq%#n3qaP~S&}d04#`XUCUKSg-oJ4Q|oH~gV8OABPMG#AQlf}{1Ca8aUIBYA$GLrEU zNyw<=Bo<5~>e5rD*I-Dj3${x#xInS+Vwur)hMq-o4s!^^YeSkvOW}N0lY-f&{Q^9_ zgqkKJhL@JePYsZeM%S=qiO$u*iqjHa@1EQhKc~BAcYK8;#R=A;NF-)1NFxV6EB$EV zunB<}UeuH=@FGtCxQ}edGc_cChd(0Sa;O-ps-Luhh^@p2=&{PeJZv83Y_!f9IIK4m z8s>Chu7lu8a&D@nSpfTMvjE}RJto$hi|$6SBN5&)S~%a^ zw58(vW|`6Fdus@v&G%Ty2_N5^C3oR_laxC7-WVceDPBWQz-A3CsK_dTEfw zq;Ln@dEHs)SmrfrdwNL1#gZOi_eLOTWn}_+K^Cib6Jx#V=YSLQHk=oUl%7yz4bGzH z%v;I4yUmO70GD{Lc~OaS-hJjp-@th}5+PavC1 zYwojM=zSsj5;^EW7kGb&ZbTk&ycaDiV6 z+gRD)c*_<4LKlkZf{i`Ut6bp85Cx(<{fk`S!y!sfdEnJ9@S9;f=>;yiK+FoXdV$xt zz(+$gu$24^YyD9d`n|Bdr3d;_7x;LH(o@_$yeA$n3FEu3+!MEE5DOdAgfJ1_%xk@i zg~CSI$M(dV*<7&u&=j`WE4F2jO%Tg^q&YEYa{{4_*2HQ)8(?BI4VVr#x2krlnh*}v z7$@#5XqI3g69yX*P)(AoYC6d5Cw{q#lpZg~y~sDQ$AjmnnW^Dzq5uF*xf)IryTn=> z(bCh*W&7%LhH}I|n+{%w zhzL7cTscdsNZgSfh+e?0Anld}vqU*Y-=>J$m@N(EG>kXova zS_$n`Zx$sS_3di)U_jVQcBn{!VAfqvuOygS80joeF%5`HX-2@k!TJqxfy5bN8esom zSTiVUh+Iq5P)8HXW+E}JU(9lpKE1iE9T>stUhvQ1zM3suh%o-6d*bYPDvaO%t+V6L zg%Q_GKCmy|G6FZ5M)elkNF6WMx_`efo{7`=PlG&=S`R zSy+Yw3k`O=`@As+XeQO;v|TIo9ENQe0v2c)wvpi*3c)~1t6}R=urHOV5cn#x!{VWg z$+U;r0!mYpFK;98fE39gErapX$#m#bFF{6@+Vn@5 zH1ABJJAXL|@BC3bAUG4gO!io#qCP&u&I_W6;pdC#Vel~lFkb&a_l5s0`g7!U4PdKF z!164&mWibWHveF$HV6 z>4_8e{FT&f+$O@kgIWK`fP@?zCZV3x8aUg8kGLd-gj6AyOJ8B9ZNX(NR^dw|3!xYF z;sTUwBV(aQ;UrW-wzjeRA1{nHb|6v#*bq{ycA2hLt);HvG!*bj83A^je=)X(Bjn06 zVkWuqYG))R_O_U^XOtO=CzuvUA808YGYMcXL-eX-m_ekJh^TFl77-BfGm)9{ENe$Q z2}8mids{8Ti3 zsWt=Lr-IpGo=K~T_UQyuHkd_Rh*BffK-zO~Mh%Kw*ZmSiAf2Y`(pPl<@hG+lH6n|{ z(}RPhp<%Y}LskAC(93!}u!ju7 zMa@InsV0;pgp-eUDV?>;Zs`9H8ukmWZBj|`V;Ab!kQUHD9fo+$(-cXB(1g)6m_9dl zB5(9jD*g~USxR4VshS)NvbEKofm4&Mtu~ZuvbELracZ)))r7;v zCS$XxR%o(eQABgur<$}b@x%$g83If~{;9$2tPX->pcv>U9e?lcYdB%`FPHRA?0`v^ zjQvedG6SKuttRU&ml)6`5h0ro{v6W?+T!@4+*2D4H&cIysA@&KO()3-^TKRQm%gJgo#5?~#d2ze==3|jPqU5FgU z-Z)*P3y}kQEz|CIkPm1sW4e@E(Rs135anvf5(*oOIBowywM~yoa({$Fj3IA=1FM4% zq$l&L(tI#TpYUYIyz-n68fiyfU&VHSEnhR^D_U;rhxBTZ8(s#(1QW-#x#u(988}wU zM>!J_Zv)@)q(!Nul1ktY0v8*Fx#v<2TqGx^rF2qFLQR{(N0ldaU|LBt!&f52&TAT9 zns6e3jQ;8t=USunx5wT9T@r#f-Oh`miu8sPd>u~Ua5#Y@!wI)2 zIAM}dqI>+mN0V#~w8AqBBm#!|ict+))$UvV&uEIZ%JK&dSj8|icRmn>GQl71!Y>G( zMmQzON{haO(rc7qI}1gkYM~7midmi{G~3E-y5)jlZ8%p=DrXq+12O2PC~3iAZRJa) zX7x!**j-KpOApFmPS~xyDB7`;K7fd+d$-CQnOo?2pB}PN|4@u3QFMTT%zN?jQ+kmh zdeUBmcM;cSiC0?54%o zdtl}aER!U}wgz$eZcdHt{?N}w+Zh9^T|Nei@?mXgOFjlW)NVfpd<$cM&&GgnVGJ}U zOz>e7!;Jx9H67j~`qvl;FQyq1jREpnjRD=LF<>dGf1;cIe3W*lUmPv|q|lN@y7$h9 z>g?Y6_*|?vx8UurW*LppbPHJ3)068LKv6IwJ^oHRM}P(d=^0u#)r%)5ExNPt{*V6# z+x^au*S}xo2@A^xuH-fsU1O)GHcKV^NP64DPOqDugEy(9yj3N8{-6yYQWEch=*T2W zpSgtcqORBf0$M;QZ%Z8!MQ50iNZR~a93ENG*^G@_Y}wk|GgOffbfL4GTzaliY-J%! z@>dxyOOUsiB_0KkW6V8wx-~9lCQd||sX?xRxBTkI*9}t1%~X<9-Dln!ZAe#Cy02>e z)pxZo7Gd@6zL{*!P{=4R-m2XF5Q#hOyd}ll>usL8QXiWpw|gXr zGhpNzobhwaeBE>Irt}syy4eUJ%Q_ z!eD!QVIpeilof-pFh>v!RSyb-Y6L+_dqL7W=2@0vkjNr>@5P`Yf*7AOtV&YK1ib~s zjlDdpYuUE=;NiYtDX=^6pi$8?r31 z4blA#PHV4}na9onz?fgnpVX}K&N}LUr2~$^`-SQHzlLEX@$N|ux=p-Gf8GyafTZii z;s_pDvPv{Ms)n#c-vi|)Gn*p*x#7^A{qQJ42$s47ARg1aFjUj1Y7Z8PE}Fg}qJX4) zVL0q6MiH1OwVYk?s6pyO4AJJnN&ag}< zn(XfD(&`n8={)G;o}GvLGCR2GHDnIjLjX3v1kLq8sZFJuk0eNzU8(JI)$*j=?WB(! zKz*mXuB{F0r7C704L$3WI+k?`UGhgT8$o?h4`PDYP-RJ#u%||jkV@h*ZHQEnwKdu` zq#Kh6HTIIjxyAGmG!Hln+RWN7DfuRgMadoV)l+h3h8DEkqg>0K#z@PZ{-s#I3|mdq zTx)|@eMdX(;t)~8uiv1P(olS3{YoT8pa#MX8lHaV?W4`J+zT9NZo3|%UAFg_>%Q)8 zOq1^vBn`yWFn>7v+}WZBqxz4Kk;476uneizPMFY$1Uy%S@;pNUQIygp7aXW7h{0bH zONm;PM+)=mJB~F*Ye9XGf~XWl)Z-wme==f|8aNm>O~E>V*;Tp;{9ZYhwZ7}x74Io8!y!r6J9LUY^~Ja?&cuP&;z!7 zeo^O<=$z5B{r`wV;!q2t8m3;#6$Fai))%8a-M{-{w6puNFGh{-^S&6ppe8&FMj6m< z^-EE^bGcpTp=!H>z!XRwBdhUkhlDxO0N<*rvy`L=uYiN-66+Lyo!VYhzc*&&Jyq2? zn@Z}Zs-P286;*t78drZl6n0=a!5y6@hY9O{=sp(6!Ey@i(gpvRVFCVwG*LH4vMc@s zeZYb$*=0aoTO;%y3mwP+#j42CKSa>q^k>PpoBkjQDF(7|2Ut?|N;)uqi1w#&0{jL* zFFsIK*prr#U@QQL(xRx;=F*6Qg($}Q72(1jz*#PiG!LoK_lD|Kbve}iWlBuohkJn# z)8_x<<^d?s{Bg-CJ4~g>FAZ^hj6qYg*(*}>u=#Ic{nc76p2DCqspz%dc)=(=mGSEQ zR|o8=k5}q#DxG%3AcjviWZD(kkcp>c$O@Rsh$$`~F%!M@k3{H3g1NBj_;pqeQRs$9 z{fak2zoX2lPmwpB0SErDv(r}(SsC57DH$@k9|KLs0i)J4^ z+o&qWGKB5olX+Z5AB_KX_r96^iVY82yf}URImVFb-IF+do%7fUws?I>-{SPOMUb0% zASHod8yJw+6hU6y0~r*E4Ex9Fs|p~U^u``cRWK;_0`tlOO#16RkcL2H0V_^_tq5{M z4@3%=oO%o7SBoIO(gV>A5zfN_>7>^eVU~L^LxP#m)8-*+YqT(IP0FHf*uwsdJ{uA$ z6SfeD>w`56eP$EVg{_TB7qz(Nrw;}e^g%00pQ_TKzN>T*r=?1W7N!zL9OXbu_0TKN z^{|DhBOb&i1{ok2lQKJC3+}(A^amV?>pF7!_{c9@5J&-kJvv}^Z9kd8oW@2EDT7k| zu&5SuEF&Xk9lc@1c`j-^?!QxktLYPex>*d()e>z%Lfyr5F%|?aGxeE?N6C?UOfaBE zz~l6-#cq8|uUidO95($9p&eFLhjDN2!5FSMbb3=Uo8Rt%7^*mQ`mG|!tvwJ!6^BjT zBFJy{K*}oLqtkB`VUG1+3|AaF-BJX3V-Lho#n35zLlNZW9!Tu4$Vskvn_n?-CCs1>kDAao=8Wk*|_J;8LgstgKib?iulgb|Xk za=E)Lx|lu^EeWxM^gFUnBZ`;Gx=QVgBt8UD3l0&8ka!`z)1BGsl-tZplM%wBBi;Es zqGT7a?3;n*K(zqNi8rup4%#D#Rg|E5`UGf^DgoP^QJt)4)ZD=j}-hus3pYKp8xN$Az?C*KuKsuJR|b?#m47fHe; zSj0XIdNnl`5PH?@&Pz$)aH8I#D-I{>1)6v`QR}F>nLJJ?_;8{!wcSmW1&YDxfP|g0 z@T+O1apqJH<-(7>E83)28BQ~rY%;VSjv6xHXgXxTHD<`bVb^KK7jE2jCh)B+izLsY zO%_rYTB`=!%v4_>#L)>Md7PEyu{Y1-Y^w%4+SR)g{_Hvtf+KBNmr%p0(K@g^8;$Ot zzbjhL(+s3X=)iF3+@pumh7)y=xjpeDJ+WpM2<=scG7s6fEKcnSo<=!+GYl(ilii0E z8Xdz5AuPRhI8jH@=EI4aYgnOrQw4`Y1*}*nIRX0mAV<9pMbK^yIf!8e2LD&@&cNCN zR_Ue`p2G=MfGvWY=;mK^8CpRQJN6J#C6N^&*$zQn21z+8q(8uzdLy0U#G!c|B1Lgb z_CD`lhe7(l?W5^kuODr0O&`7;68A^1ry2YUnp>K$i<+;Enm0ww*F?=%N6lA7%^RcU zE2HMGN6lZ0nm0u0ecx}UZ@qc6Ih)@2o1^I+<~oV1lsR?|8##^R;36Nj^7WrQsj>z9vj>e&cBK)nR%MpI3$HLws)JE_c+t zK1z?@VhK+2!Cv$A#|-{|@&W!nKEQv25Ae%T^NFzjl}+ImNxb58@DO4T1P^;K+c=?5 zfI2;Ae~8`ppeM3^fmtyu7%iFUJ-W4zfO&z{w6q8HsaZ1(2v%~F8-*Cm%*h-Flv;1* z@;W;wTPgQfImQpz<0oYvU^|l5Z1NkMhH|m=VwhPvS>m(E0WTNuSqn@}Z{P^ZPk1m6 zg^>VsG**<5R@fC-u4EJ=Cfu=rK1#B_S6M0U&B(IeBumWttfG^?mZ%p}OX4L_;@pf{ zjwIDWEoWrBld$zpeaEUP%^j*aQch;H62WYYV5<Cq!D!Hc&I% zu4WrBih63zCi0q98DNlMnEPp$AfL1gb{*9HUCl6fmJKeJUgBxy`;8r`Zw=F8y`0Tv zW>}SB6?giU)=kr8MOtO1sSIvc86Hwzkz*2DPYwI}XobK!;jr32ZtX{L)(=gcna;w_ zQ-@$NyIH5M)`pXOLZL%~l3~gD@9%;e^f@zSWJp;1A!+ZnW^wM7d+48`JMEVe;ht~W>ntaw1Uqo}o2OcIy# z6B&qN@QQ$&Jm4k)P9=O|Hhdy}(-5X!j-7VmArnEi55kuxfnb7QB)U^%Ga;WUHuTAxZ2@G0q=#5hd9|#XFl8Q0}$rCp<1UwPqStovaOQ z-S@MGBrVypT%{OQpPE?`I#TtN8JuQ1C=Jt?b_P!9&_Rze)#C%6hQP)W#}fpa=cpEw z3*Z&fLQGv+I!9?|xKZJf`iV_aqAaO4#8axkIwe9(#f)Ji>%jeF102&M9fOyuyVNdsC%@|}3%!5+*=EtImPTPkW3W~s697cDyp6-6R=|G7XX`Xkpw>RZ86l9^-IeiWb#T=>lj%>RSE9u&q-; zEPm|b0>3-b;MwXJp<}24rDH)7!q^1~-ntP%9=?R@@MW^k{z0hv@TX(5WW5lG>vWzN z28KXPCG{;kG&ao418vqE0*z|tti{m6M-yGg9^`z6rVcXSlmev$!V#k{CNqcH1G2tn z7!=uzL^}{Ij0!6)_D(={TF$#~{2Vcj3{e8t$*>qkb&)YcTBN%nddqQ-weobJOtuV+ zRy&+hrKqi|JSZV{K<$8`Nu()MY&l~8Z0baL%c-QArnvq#GEMv}8MHPsOMDxxiQJra z^Q5?51b$`FE43okR9J1K;^;E?_6g;g49NbZ+g5Uj)SrpN5ub-oDN%>ZjUFpyNCsUI zlJ$~zjwZ-+*TS+qFJT!gg|JK)w^zfm!6KGb`?1WBY*y>WBbx78M_6p1Nwv5Lz zz4W5;)(OkROISE&OzD=Y!!j%|SPDjfaKp06ek>Cq2g}xhFXHDmKv-$HLo&AzJIv{< zz%uR(=UBEON1xMTnY2e7GSX^?WvUdlb(I(4ajrfja}7u0kzpA~owwYuY+Z(Bg*IZr z)?*nLeQ6_DR&1kT*$AnN%!Y4bhGf*&kPNfeNwi}nmLYqk4;+^DWzs$Q?0XN#S96hbgOzbl#*7q#}@7&=%4m04ORhBQ`R_EU?Go|UPBVJ zLwy&H3wbtY$TOadLB1Led04nD1*;S5HWKK?Wb6=ThI=GR%Q?t1js#4|Gwl{@I(3NW z%ND7_(1iS}sQgOBx$=g?UaJ!m!v5F8r>Ee>v`H!|c=rKqi|ypYGa z40$>kiSjKsVj@Bgn)1m=%^EbFpsErgz%MnNe zZAr%lrtd84C3mcU!#$uA!N$#G9g#>r`U98HX=&J!d>5NNk;ER2R4)nw&OtX&?IFQ| zA3F9)2Bl&!$fX*V2TH#TMii-rboYmBm7$gtsHtp_)TP=EEjM(}xQ{~jw=o<8OTtJ? ze}U3XZGk-kP75EAiUCZC#>u2*Ncbd(k@Cgu}jsDAR9hg&k!rpaku19+W$mF=PGE^{rcDb}zNT9ZHRN=iJ~$;{;L&1$)FO-O`Zt5jY}r-iQ~>sDy9>{V(u zP&=Zz^WyWJD>*OT>s(Xk#dFTpJTFe13!4oX*j0+EUYH*Q6R^m#*xEoh4a5ghwSgf_ zxUc9K!mtgAs$$OnD94bH5NxJ3C?B!D#AXZaX$^Zs$Aa|Q_;Tc!Y%nQ{dg*f6rt_o?6h+2bl(j?%V(t?$`wmNq90*9Gbt&%UCm#H9w90dK>$Nq`5!LQORC!V@E)X zu-mQ9Fz`~`Q6GtFaOc?iNJ54-cZy~fIa$;!bGfx=RW^92+X^!az2YUkKz5Tfj#xdK zNA%=&UWc(l9Y!_yoQ{ralnnt&$%MBo1LgHxxlv&{T-0o}R+h-!_Yit^w9uxnP|hX` zhr-I9@fO)IBf45FAS%}{zw|I11+vw2IpRtHb(w6Hk&#s(M@|9prkRij#t$&Pin2Yn zZ<6iRB-?|dlx%NsfxS7+Nou(`%0zqYbtT%HG0|Qvlm5s!PoHQ?CTv*ZhLOyGe^9rA z)T~N>62#+uhIOKCtI78IMSF!3Bs^sEhPJIqglby3Otgp9re0-b;blS+fQ~GJb9SfQ zvE%?wf`&OZWP1QefHYzPr1eRyP|FF`lH=4r_MPI$a zPF_Eb#`F4BxcqLiJ&Y^3nq|VbL8}>aPc?JrEOw&3?$;YEW||C8YF>0*Ie1e&QQlNh zlsBdANiH0ucr>_e;5gv4;zcd7mEV(OPC2P4qF@R9O_ImGEO49)VzF+eN|dL2@^%HD z8}Gy{v^PnV*A_+F$U-&CW^OtY<;|EVk0%G1tBvN2 zmd}n=C)q5?Wg$C*Q2Ne!q^#xVeG0(FL{Go%k>T+ExYQM)^J$Z5LXZ?Q@5nIF3uRqIP2Vs}gu4h|{K+3PAx) z5XZY9e($H#tYPi_{Af^_AlaaWW}KgpJ(sl!*$r)k>~5evgs^ZeFmzgkhQ9OYSTYft zkD*7p1%^16mH2k$Vn)o2`Yo7iSJoz)QIIX3+9X}^=ryS$ktG$LelBN7m;=*pt~_LS zjC)gA)@o>-=}zf+I2<;W1D4Ddjdkpf-<*`q{2v+G4$At-5d@zL9F#E2c4NT>v>$Xr zE!2(`rRzRztFj;YTK~v%OI@!wnJjKr2r!)^01Q};0!#^^01H_r>Ztjy8qsgqb&-@e_iVOf=qIOmx(wPQ zMS7Kw7l&5?(+QA+6N~O9l0a$rA@M%Gz2It4zy;qx3DCVPM}l_E{t+#dYKP+1YEZ4$ zppI`5{Rk<4F1I3*0Yd_IJa#d=N3MPI*o(r~1C7J5AQl$T3Ro6e=&=BTre$h2$AXOL zugHbN0H2N0L+X?pg0$Hp7UZH-H`gUPX0ex^d9rbBEZ}KBVZkb5Rc}9xT+kU#20;U` zV31r*pc+{A!h+F$EHDx&k-QUi!7&uEV6qbK^}ekw1VgyrXLGBE8y4c+}gCs$2a>2LIBCr5TyebxCD{}w%ab)A0$1$xI z1D2LPEI^j395Y&QN-iDWOIbEb&vK>Qu)Va=uwdmJ_q3r7u6gm4mu+gbvH4K3rAGK6 z*(MX7$AjRI(bh5>3VvatW5zmIRPur;PA9zVT(X=@s%e6$DXmqKYF79)*x{WzlXdLa zoA5x`o!(RELJtf{03(f!bO&1RNu|~ymD1`|obkSe`B>BOe#WnJW9^R9)TGr~B!;lR zMRe*AXG$C$U6NE*%=nDA>K|(=>c?8Q?WwmJeJsp)7A$3%jrEh|VrP8+O-u!2O+vRD zliVni7cs&n7mAb7K6w%Q1@qT@JS(R8wGeu-(aCaH?cURf&xkOH0i%r(i&a?ciaXtr zQb7e4TT7EE6`-NQ5lOZKD+`B~ICk%6vtc6wM}$o00PdPKMcRsNGh$=j?CuK^m_ddZ ziw3Q_$K3pAalrU!-LQ-`=HP2x^o-+7cn)w!2k!Z*#{NO{%oqS&;*h|`5q&+wp}Hix zw4)aeAZJ>D?0ivbIPpT#eamoM=~Q*2!vvESEYnAD{f6UURMKGZk}5xDAiSR#;#y(t z*A$lV*MBd&^ z?BG^JhZ5IGzlu*a{ZTdxAOg7cFuZ|=7K0H888g{toGynZ+Z^#$ga;+tY)C~n;D!~_ zQEC7u+5ON6CvlBj6eF2N0xYLJ;E$dc3xr}Z!nIb7kdRiY*O6dVOoD}$Da*8z3!+Re zi6E)C`%{HQ9dI?+&Wen+Lk7(%$kCu_w1f>-p#jDE z=Ovp;eQqtyb(6Koi>)F@-mpuB5F(9W?m!D@1Bx7J=V7wsEj*fO8U#p+?U5%0Y;9hz zFkVt!q48c zDtcpOh~%tMh83|!0i9R4jOmUQ8E2J;n@JICnrdOzhA|KnBrq%6Y--emmR2BWr)$Dk zp$XPvi8{5ZGA=zCJui@5L_TP}*jIWdc-2OjJT_87046HttyKY=#IC`SuFt6hb*>Qb zP6Ijn&I4^*!cwac(m%xW5|pP4RA<^U75veS%!197TEC{)15?$}BOkQHN zElZY9O#=H^_h>7o0ywL+O0uz0apFOlsG7OM&>c-#w2K`!j>t64AogP<%q-QvFPkk$ zuH3Stw`vI8jUdyEAfPsW04XWg(hsm<{uP;vyH55o;fu_wc{RNrG#p5mBRl_lxdJWi?Ac?!ZqVZFvy|-kbVjpxf+0qKf_c}A>hiDPN_8C z7PSZ1G7O05b)UH-zHmPtD$Uqr1-2_>itbfi;sw?cG)CnH?~BvT*S2+)fo`NioRpNhm7Vc9qY@$;k>aZz zP_29U&Uk<4J?7;qeH2t~U9RxqGJ3pm6;3U$Zt^*}%hmZ?`aw+Bjc4$HH z&$G!w08#Oxv!BXI52%2oQ}^w@vpsy8&fJ#uOx4yPf{3eEB+3LNI{JUA?ku_5 zd84JQ&r9u^Y67Z(gcv21O>B-l0z}AsN=_A<8q|_?i)5op0Bn_r)z7kv*TP^AZhp9* z#-MzO{qY41ZY??hJ|PlcYF&tTogvq{M~(S{N{t>A#uYNRwZmq zVfX1>YkM&w872%WH6Pp`64x}iF~aD!`QU+&xM>S(5{5;$`QU^spUzm=bcaA}zRm{^ z%JS)~1}iX+q6)S!0VDq5#48)N)(t{_A155Bw}lS+9btP9 z%+MZEZ&moa!uH-|YqA&rHu>+Q{acf5$yNd;74Y7Wh{6utEhhXtRHb{+ zgl|mN<7fHRy-JktW_ z2|QbYp9qOO+rrKy>>P!CG9>OC3p<;zeG2<@NZdXPJBP4y752H1xN|LRA7T3y_JxqR z{T6mEVdp9AD$ zqn~~o&8J0LeONc26#wKKHQ#pc+it!yyzdP2%{gBunKSPWAGyPPJH2nG`F45VuKsqI zMF9jJkVC)*(5vQWE}5sVm`eujM$E;jc`{_Kaa`l(VioULbuk-eY8l?5lKBusTimeu z#=LLLeCWSgT+@8h-ZyPNEb>|0jQM80Z`OP*?`!2P>13pf17|zTUH+Bjm)hP3bFF&g z`)Oi_j9o&H;e7M30>S-ZTrXh(g0E@4c#-9*HPfCT1eSfFy~jfK=w+h`Y&W623zyd3 zdK9gS7UYP3b$V9;#klWr<35p>)5>W#kTzB!(7)( zHyv)*;J1?6kp((#Dc$@FN<%i5!MQSb_mtB$l`ffcWn(WqdFn|Mnn{my3Bo#=rCnP@ zH*-Q(mgCI@RJ;fnxGw$AC!QGL#a$Pqack{B-*fME$=0K-o%A3p8gJ!vIJf3|HD{=N zu+h%SX|~um=zCN<)4AwHvaCKAT_d5@Tyzy06MV4aZuZ!3w-YwA=g#tNcH7Oq`wLsp zd#nVvAn|k2kG9TYkOsH_GY&6}{ncay)^noOVd*Eob!_A+l(GROwlTCIr>MuUG;o+! zD_9coMFob0RZ8p%f1B_lFncg}J6NPo=>c8*v$Y#E%e#dG)FW^sa9rND>-NKVXI(e( z0CK`(F4(@QBs-7j%8rDp5FTL;_$i}_=trg16x5mzY%Qj1Fj={_Ihc=1uXhVoGOdd zhX5o|OP5m>GLTRT>!orGEuk_4Yw7A_e2^{pO;;xbTnGT#=%QlXo*C2e^-wh?*cG6p zxqd;W?upx^lDD{$ar=@9u#!(L7Bvs-oxsbg58C=;98%&+=G1VB^EtYMW^rNP^+2aR zq@t^etS<g0rr$vp{^v#%$6O z4Q+1}@=|Y6Ii88GWMr-)GRN82bzBk4$XuJtkSK*Nz#+I~oTD0X9L`b=ua-(EjG)Hh zxCXeAPFu1{I^k$48enp;4R-Vt{H7qzS%y92a0ZD6ktN9h5tWcP*Fz4rN8$cyGj2{{ zuo;^W&}7gqPb*ZK8E4Z%4mTdlC)t%9XD_IcFc!6A%Sf;N3Jy}7>{8w$~UJCL^Z+xvWy!%}LN{JC%LfK8U&-$&S#}c4L zjAz-#QJ({tOjzk^Vg0l_a&=WcXQq4dl?(2JuPSw!Xi>TR!tT>&MHL`yu@~=!zJo zA2rnq?SW~sAQUnVws}caBPHbwhb9ELk(%uABm1NK^sVgY zp&Pzq`=k5y<+a=!L*!Zlyh{OCR=!PN63Disq(issONQ6*nb;p)#fNN=$tAGIFXBUH z_XuVKy3YENsa{Q)+8l z?6$&f(1XWGcI8`P3|C14-XsS)Q`4A3hvi73Z|2)|93iB)eVXS8kx)1ym@dnUfe%L; zomU8?6L(88a5%k7FxV?cgxt$QX{tT1ZUr>1<5W7m2WT+4E^}ixIe1!cV^SeV#-IYE znL5qDa+CUU00ywNo+|s(llAb8t`aKF_)1?VNlKU|Jj)=C(E?S+^?hxc>aWo3by;mJ z<#-+|%ySY0DmPK6oJ~z%Idx>O3p@WC`tX0D3-g|nI$)veBm#P>UH8AG=Q|eHa9$&=cB3R88;5xXOjEB_xuu#RuQ0C<)u3}lROOinP8ki~ zY-A1964zgF`aNVT;u5sA58sUN>oR(VYaN>qJruG81$X02*X=78R%Qs%`I@?iDOMEUOp4q?>c^23P3dY57BBRcuEaWLu{dQd%^NDQjxA=; z$n*u7xC==*XGED;r<|PW6sD~=dSab&a<&)i46?Rt_v8>xg2K)vSNeV^*=Bp@sau}8 zyuM>}ag-&wfUIm*iga<((?y-riqaWfRFVR+DoKGXvg7E-)p~0yLCo9{DuUXNj*LgN zS$6Y*8#e_4hbB8j56-(l2{k=NGSot(R!$2zDb42s5-Md6Me8jLz%eZ_?=h~=I5n6` z_Ss~uQ@&d#Fw2w^SWu{5>;TEwS_xsjr9{=K7dt>n3LP+uw|}zw^uGV2Tp3#dP(zvQ}8mFcY) zEvrAQ){5>d)14i+Fe*WzKUMoee=2FAKUIyg)rM;DzO$;a$vX8Mzv1wG+J{u|f2;JV z6ixa_U>{Z~O<$+3z^YaPKo2R^siV68J!xI1p3~(9nIhSw%a4YDW7cn3XLeM3C}j~Z z$MSv@A{F})Z((gt{Ja>;(Ngez-B`p!t8A}VH6u{8$Yrf|4%#PhH8~0zj7w}$oWyk# z!an#WnX+N`pY0}1s3J)#N0?lcMZVYK2nslEIyyL}%fa@bld$0STTBAVT%BU?7D@8q zMGadDEXv>}oaBZ5kvW$hVOD!JfIT?erp@uIrR=7}LnuENX|!-^nRf z8X(Ee$|t~;&l#65Tn;Y>>B(K~6tqwHYUP`N6+0KKfe2W2ztXm@gNtNWkuc;8B*GRq zr%fI;*x+h_+xNhR8MNK42jGNPt3*%wico$&=o7)ZPLLdAhD8nOs)j|<)idajtTwep zc4Ly?F&Gm9+Ckj}w3DtusUKo!BO?V*?)er*2B^zn>5)?UzLCTAO)i7AbNxO+tRER( zaz)YbM(S8Y~gbG$5qO(;BEJ$MQ2)a)kYelj-ILai0Q1rx7RDD%98L-%M6SfRhy=`eYBUe(ubeE9>ax zqU`fo>gqlLsBdLuiPP}SP6FyqI-Dpp-06l1K(Pm4 z@+wa1G70EqDzr}wYK3lO2x%1p>oc;`6)ThC6hrt<9UJ$G#J#delY>&a6ZmEaD$C2c z928mCd~l)upp!HoWWrFZ0A}D&xi!4Df+ysEk^)T{x=Mk|MQP|WRg@En{+OJ|M6JNO zRs}}4P^RRSkgX>x)?}i+Vl$cO70SI&FlyzLxv`_USty4aMizuwse|oxZU}Mv{v^N+ zp-D!2<>a$SxSQ>;Q0)xQtnj|aeZ4Dc0cxkc%u8-55@z7$3q0_ z_4+;^xT#I`&`T^e_hT0?D#5;BbX~0&Bk~u7K`A0MreR}eb>J3%N zDpcw&KO;VGxDljZD>b(v)_!MH-_pG@jc12mY(nmOB}h+vr`i3@G`?WZJI~f*Ie+t6 zn5OhT?4jPzFGf$Znx4e<&xC)IZ`r~t&578^U<)2?`RO$o1px;~*&vakW3)2ez4cI{dEzN zbp&z@kPL%#_cp^IUOmV$hy$w(gUqRPZ#iu`An2+00QWB7)KjC@Q)5l|0mDjEc)E{2 z9u933(1#24)OEmYVvf5$6UhB*f>@sk%98`+~eN;HQb#E@A)pCA@6<+_poSz-iIh)SNQdD7}qX^~&Zn zX-;|!Z)w&js}q2uiTO@o?&8-5!Goq2EK%nz8PpdH>TaLW);^$Z8PH!F(7hgLdmqpl z8PK;^&58D_ytxeOF`(k~KC(K&Z%1ENJ2RjgzM{T53BaTLcJ%@6&Vb%{8ld?M=xrUK zc!28>NDjX<`?A`TL46dUC|$i1WH8J1CqUKoHgY-6@2tL@&dz}T%5r)D0FBEz2?lz5 zoxU%F`g@?_^g*E13Fr1@wLb%T93VOYAa%ld9_Z$OfWCe;!%F$yf=}2d_i@E|_anHg zP2M^kE={mlvcLf^Sug z?8Q&lLxqa|d%!E{qk!D_kInQVU*C>{dPWBIZ$QQA%|NK>&-73Z=r|_2TwW(=`*?aA zP>=Ha7(AkN<17CHLX+P7Pf%2T9}m($37DvFA~Z}NCq#9-FG&AXq3?5{onG)K6nxu1 zH`7lMLC0TofS^Aq23=)AUsX`2 zmr`K=SOg39D(IDeRm|Ulezz~^(Pskn@xGuy3Gb)EUnAHxMZSN)r>4mLs*^^DI_7yh z9^r)|K8#xgSMD$3&Jz4n!F|)$EwRD;9_}pd$8c*|QQEKJ)~fP7-2WmNavCzBw2_no*^oZO$lofY>NxCgSdxV4}O<_!JsD8igw%gn(5bZi#7N&n!)G(z_U@C75P0PGhY4Ag?1TF@JSw2WH~pW zCr$$-w!na1{f)JA5@TRMMXqgSabl+o=v$v(J0~$zn^f^*YZll2ZaJDYnBQI-=BHv0 zQ{({qYt;Rjiiat(fGc1=ljZZawafZ!mQRrh{D0Ni85j6KH!Vf8Hd;l7uOB8b=83k$ zJl#tV+)0TV*H5`|{d7LAioB;#ozE1<^@JZ+0e$Q=KsK%d`s8VVY+MEO&}o2dTm|&? z(*W7H3g|m)0=aP&%wucA*tiPj`oHZVQGW-xaTUx>Ys1*M3g+!=!`QeA=Dlmf3=TxI zn+5aHHDQ9Tc2}DO^rTge2m-1$3!z1f3(AzRAaiuc7F&T(tE z19lgS*q8djzMO;IXt}+|=k}F;u&?G|w*VHWcLR2!Lv~;5hx>~h?zb(w<378;><9a+ z9PD<>?tW!QZYTS}zMg~Kv0CNO&~t75>m2SL%kFF6ciH_-e|8V&U>`NGZ+ftA^n?9v z4)z(qP)2;r@kxKz5BANVBc4Jd@zvF8msRdtd3Fz<4(!`G*dwO{`}-X1vA^qR_}3V) z@8odTfAch8-_5~Zb2_j`axllQJDj8Z6-f6FIoxkpc5C3~qdAz{Bdh`Tk2%=ytXesq zBsV_spK`e0Ulq=S{c{fXC#M7ZUJmw!(}Dd+u|{`z_mmuF-Y>n!~-7?8@oQ;IMWn|JIMg|DJ<=$iVLMU_a;w`;Q##ZE(-nl?4n= zyp#TCKim^JoZI%Sft$-=HgUv^52lZj-K~$akRUvT(~IjRgfj?J*%R?RTZ+M<`m72X zJ%mYwCq5%V=Mzs197aPcJZ!?*LB(Fn*}|dvHmM_WS5TI(#!%)=zwyUo2EX|*)^lW+ zO)}q24r)T$o&hHw=}Df?Ly+vFKM+Nsvk|ZtW$Ud$bRfO$8#`dEDfysqnv(t+kNBn98# z2|Nr%)a&2%4|U&+`ROtOaeCr1b+DdO(m#pDt8Gpbqb`&*YVx7dg*2-!w`t&C8l29K@(oIfp`Vo!K7Abi`dzROy7TP>Dam8O0R3 z58+&3Z~Lh50g?pOR+VwlX^D+X&}`d~F-A-c7sEM>hDsfQIV));q83XOXo>Y9dLRk! zY}bD2;_!#f+6T{UT-{bB-0lZMJu00 zkI9(U2qCfyjU5-X0@W3&uMT!NgVIFcP)HL&V9s_%Fc<7gBQ(t!UK>!sFb6PI(tKkC zWxz;@a7WeW42iR=G_?Hc-!4Tp>oXfC{&0TG#S{z!>8v3917x|3!3|b zn?kw*u;s8FYVPB_0W0O+c_Y>(%(*9cx&OYxN8M!Rm8cgf_Ug}W{h7md5H*sSjin{r z<4ah3(y=L*9f^M46_~A}nGESM3S@RsI`A@(LfEZ1h4eg~460WcbcRUQj&$oZy0bm# zMrk@3)DR77hz4)q%MjU@A+j$+WM78Jz6{Zz8zQD6_LAs#YF1}fnZ;#FzM1}`$WRlD zV#j&s6ht+nRg4Z;w?EJr;41A8FxDeib$?)Id~-o#f6#DY^eA$ATH6AI4_KK`GL^yG zH7pMl;-(q%i#CHS`>BEEU9_K$F}iUxHnEfe=dPSbCJ~8TJy|iVUSON*DFc#Kk7smd zFdy87{p>&$Yzm>lK6N99gX+jS7RQ71Uh|W)hycT~jGvWCLvO=$W7xb>c~CV5-o^_U zd0qiIHn`^hVK!;%Z_r7u$_3{=X6(bH3#iM9s6y|fPo2B@hhP{&w~)S}n(wXIpa&@Q zYZ8*{T*}zUCFC#*F|NfWs2c`s)LPcCG&)Rkg=4CHdt%uCIPu;%C$ zZY%-@7eWfE$f}kRC^NN%N^hebXM>Cnz}(jnf?u!8qh;eGW6zTmxm!F&6H_x1(v?F-&l9o~}N7H}V+Tr^I$UQFz~&HYYodVa zRINEQ+1WL>B(8KQqAE%6#_81y>C`ojID(EW4_JJzKNN=*X%F0`XClPixPQum$4 zJ=FC)Lm$MqZdGLP-cJhm_M*uKnT z`!bK~ZXQ!-V=*X_9)QI#Y=I7`(;0LjpQ_UW^#-VeNRxr0?F#L@fEOR2RaW7MXdy~X z_oZYjn2%Y10A6&~hFPG^c1bje+#OFv5RcxAr^3~62Gv4l7$9VsvsBh*hNi!*o&Q2( z>Bd7tsQjoHX6UopJgq9zolG%3Dnpyct$s#nu&xQ=U=$p+U?R=bSb`x%X0X_I$1R7<0@q#~5?WF{x)8mQdj3m^{)E-7dr?tX>wo z>dQ!6d6f~u;L0xaU&}|sjNz@IO;kmBZR^nuUAx{0_ONK7n4%(DUKk21`=+DiJNX5%?H9zh-^vj#t|9SS-~ ztJfRx);wxi<-1eJvSu+DXB)T>j4hN!Y3-fHg+Z{1YG3kh45=6vv)a2fg*t7abFi{%do)QS#jADq7ARuxrKmIWL2xlY64n|>^9!R0MpQ+#y zKD-XbCT-I>)kX~znjIYrOaIFVL%%71Ay_6<07PKC?}m-aJcE)-&tBDyt#!i)t+}oz z0_5$3S$9Ld*=37uhbV{$h}RV1TYwjS{ud&~Qh33ZE4*N-(j@kWkO5Yp)*4f@j~~|g z&DK>(K*H*jmYqaJa&U=AAt`2_sQJGcQecd)&6wr{+O2}fQgoltWuEtSdyrBtob_uC zx6bR?PWc%TvD_MrN zsg9qmXm{indmP6$Nn#q_p|8XAl0Dsc7py&z3b#hgU=vn2rOrvS=A?*(LF>f%R^k!c zYS@=8-+tdA#@H(8l8Vizs*d;Yr@H5Ws)yW(i)cS$R1SzAw7oZH=3mpPP#}zVi!^90 z3j6QWL<7ZNX2nswu{TRIznTJBp(IDmJ*hDa+f|%fskkN3_jlZnsRyPU^-J8{33+h2P#o}kAMWPAx4Zc`5iY7(M`8a+mYwxxEcJ#OC9C;}fG~V^X&-8(Ha-&9uiyVyWz-&B>IDtNaihJ)Si4;v0`~0m+KXo|@OO zY19=*mPs$+y*Pd@)CIaA-R|BC+=fFsVq0|MFi59#;}69)*Xq{so6K;THAvU-1~xzJ z)a&^{ZIbZA<@pXj!!w;OKe&iKiyyf04S*4LJ_3Vn*1FsjJ9~2!0E8egc=0Onj7!Ka z{lPT6RaV{1u+24d&YeCzM%iUGB=YoGBk3&5#3_?GSw+;vWr@m&MU-1sIdbk;imt8U zB%;d|Uz`xBOarB~n%k}YWeTOJqDKqRHg~~G)cjp9j{T`ClJ`cKS?OZttiSmpw|6)?0pIxk|@vA*G-Nmsblpc*T2aaM_8RGurEoa_K>6j5PUl3>g6Xk9;tO^qhYdT1H4-8bf-@zrB-U9nMZx zytjLfLuj7SQAnE!bLdu;T`-{Ytv_jm$g}}NH6;dtn2S5+z=1H{b?tPdzMl{4ayOfW z`&Alm&-nj8a6r2^Ti5NW=s=z818KY$G(7-CYT{a2+fUVQ_o_sl639vM!SurY2UyxT z4CO1Tk?J?r-Or+)*y@SNso`295ua2`*GtG+eP-pmZlo8LZW5DTh?trV!T1L{7@qU83 zG(W0w5auSi9PzRr0~32m@pe_pQsgmh#@IOI1OicTu^+HN0-{3n6*v=;oR84Vt0^vz zkk6|eYIOu(t_W5#*I9y9HwHq%ffjrPH>GPVZ6+^8voNU(<8ZW@PFl zHC{t4cg@s|MbBcjie}(hduC7cJX_DiDhg(zHMMM4Ai6=>H*KT20Qd;r+n`4d!gLw zuxc$&HQ1|-e7~t%PmoLbVk)?Rt;xcyBv*HJR#_FI4GXE6x`imBtiXE7csXUF4*Don zA&QJj`@8bC#Ng9W>02nyzREcU4;C23F&F`klx57MFy9}cSgm!U5!MArK4{-=g|wry zIKLiuLhMn^y?zDy&3w%LXS^R;b1TS>kFoEl5g@f;u8^t+Z-w#=AH22WHUY>C%LNRT zo{EzRmCSB6&qvxo5ZY3>vq)K{9E;{(cXPBlOIPnp|0FQQm*ru@Y^8viv`VB2-uy9m z^XuR(?WL8+rkj_0RsALjAXa{>%AcqC;rD!-pB>RUSL!19w6*dt+`(b?#r6UB>#ld7 zuDEUf2yafQhV{ADT%+q?}9imH{EyF6fv9u%x;t z-QM2hj~y@MS8OyYU-fUbB)=_`bKffo*RorKHNO9AegC(q_*B3xzn8htSv#WZl4$;& zzaFmyWjGp{|G>+mHD^jt|zHb0cXm7*|zO%n@Clig2M~uN)gv+TnqPceymIZ zs+iqE<#*Vn4(oM1uzIM=hiw;bb-4hE3Q@|yeI`!QHv1jxM6*V^rqS8}JGINXB^Y@S zZE$&}skh3xi?hY0!KN^C+lt7c^h_l@Pt`0^S2vzN`EsyR6KU5Sk%bUSOj8Rz(N}EP z^2bc4_9F26VvEl-0o5$jG!PesT>&}9sygEgud8yK@ea(3Fbfi@~Dkt z4KzyK5QQhi?>$NUp6TSSJ0Tsx_*#S@bbI%;aTmw}RTGTEz7}CrJ3~qj#w+dvU%nc&zRylBwH&WTk(Z%WL@RUk{Aa!pU6y^f?pU7q z$};URe4L`_It+(2(+OBt5#F!GC??@cCh0@)Vpz9>c23z&&>Xh(VFD4L07{sXn7r8K zjjZ(#QpQBPW#YouZu^p^l18+5aE-gdAqmk;X8?T83PnImDl$EynCve2u~RSoO7X?k zrcH0Q>j*F12ex7K5kY#p_UNw%Ru_ykBNjUsy%L;_(le5H_E1{66}B%r zIGd$kk>ZutRM1&-9-f|Q*^#nC-YWhu2R{+FCir*NWQ!oT+__Eh`DI4yrFy%EFsJ46 zRV^77GRSb$WkQwop06y^zfEy4EwsPuPHen1-X!3Vk)oNjuZ&B&I~%wC^v119D9>U8 zLX_95dj_dkqoX2gPO#v)6kuU-gQq?MSPKexV411cRK&qK(1K?%XrZ;sp%uPThZaC9 za?pwdEdv&X9k4=xrCfjoqIh710E>SDRw!Ua1+cW47_b>%cLkaf{tPkQ%9Hn>jGNV(Fa%6ORj z_|TG74?`J(*1$*h$v}T3IP^Ni=^p=Ss^!M!NMok`!+u0zI&?4}7SqSHBG@qL2Urd7 zd_r$`BB-z$PAD9~Z7JGcwNv7zD>ZUz<^3c6ejgRVvc+^Y!fbY*G&nLp3rGNR5c(k9 zyl*D09pW$z0u{>Z1$;SPB(Lh$CObeLqCfz-0vsU_`)23==_Nc~E&&$4?^hndGce2} z8(jJ>h3(<9T6#j^_~KBelk|dyBkPHwKzgoqXQX`BU#UaCR_f5bd52&_nHPz09$s{ej^GfJj)ruSe2M0@LkE06YrdbxCrgA^ zmhUDe4M+_8_#+z1YfBD*74=nSCIsjq&?X>|3nkJyS8x56q+}(8;;Tj_pDzG&D8! z5WIc+lc5Ug3p2rh;ZsDtHj?S6zQR{c+5st=_qbJ~PwlO(7lyGN4TvCx>G2GbP1T~} zZZipuFzGZ$W3a)WG>e3ETl=+ZTWd*mG`-s1te)G}T4~?VYVBMqi@u4jb*+1XFmTpB z$SL=D#@ak4NpOj3HOQ^O3#5$EQMhCfme&iExSi>-*mgRKPj894o>^-D01H&#b(_+G zP>$l=)`5;>VYE9u7Qz~lu7@LeAu{UG8i+)(9dWTN@cf47o!^d^nq0Bn_^xL7|%wEm3TH z>o11G0&G7y0~O|_G2(xX)43$GSEawBrZYZ<2(*irvj-nZrIo4SPdcm|K0{0PQii+NNP z6Gd18H`#KL&A?!K6I9RHtsR`(O+{M_czyi@pcVdUH|0I11c#sdx?|R7ZiuMUJV8RI zN68!0_Q1ITon~G%H`eK-h8V2%%fhD)e!zda!MHgj*zXoDux;;8R-#RDs?my~EuzSj zhkz40`T8MNpkiy-G#~s^UIbwdX$ie|-M)kCM0qTC)r{K0BRE%;sVsA1wpPLiz;*g7 zZp^JX{3*pC0se*Dl55EoH~JmUDg<=!0m)*ER-%ZrAlY_on&PYn$Te}X;KYFh43t;K)u>r&EOFHI- z8;W+vpbFHgAvKNPSEXPFaw%((ZJpM3j06-?v)YOI-7bxnBiy!Ovt~PW{=xkf8#jjw z;ZFAA8s#iin>V{T8wivUf&)Z4amvy}m`AjVQKq43Vviq*=Fj|bo&^>2;d`wPu?4iR z1d7H>pxLlds015omHugsz#KYLYR0`m=3+LdHUtEJ8<(p_y35B{pC@A=s>9hb z>;`|Jvv5KRvL$J&4#WsLm1E8oxooN4Sx>2}M%sLp?~r5;!Wbq|e}O3d@~@~ZXW?$; z+IKiJvQNig)LHnl*bRs_F!lNmC)CLfsQ|UWwE@@E5 z6|PIYWGjQRU&>l`2Q7Hp(6ZDQHJ@A;1>e8uVD4jEDcPL*
    ~s8x1n?7pa%@BzPB8s-{x^o@6Dd#sq`Pxs2Oym& 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 AA^-pY