From 4c1f38a89e77f70ce86a1f46de7dd8da71d76b28 Mon Sep 17 00:00:00 2001 From: 27justin Date: Tue, 31 Oct 2023 18:30:50 +0100 Subject: [PATCH 1/2] add example for deferred rendering/shading --- examples/Makefile | 3 +- examples/Makefile.Web | 3 +- examples/README.md | 9 +- .../shaders/glsl330/deferred_shading.fs | 54 +++ .../shaders/glsl330/deferred_shading.vs | 11 + .../resources/shaders/glsl330/gbuffer.fs | 22 ++ .../resources/shaders/glsl330/gbuffer.vs | 24 ++ examples/shaders/shaders_deferred_shading.c | 318 ++++++++++++++++++ examples/shaders/shaders_deferred_shading.png | Bin 0 -> 90692 bytes 9 files changed, 438 insertions(+), 6 deletions(-) create mode 100644 examples/shaders/resources/shaders/glsl330/deferred_shading.fs create mode 100644 examples/shaders/resources/shaders/glsl330/deferred_shading.vs create mode 100644 examples/shaders/resources/shaders/glsl330/gbuffer.fs create mode 100644 examples/shaders/resources/shaders/glsl330/gbuffer.vs create mode 100644 examples/shaders/shaders_deferred_shading.c create mode 100644 examples/shaders/shaders_deferred_shading.png diff --git a/examples/Makefile b/examples/Makefile index 5af5a559072e..82198b76e8b2 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -562,7 +562,8 @@ SHADERS = \ shaders/shaders_mesh_instancing \ shaders/shaders_multi_sample2d \ shaders/shaders_write_depth \ - shaders/shaders_hybrid_render + shaders/shaders_hybrid_render \ + shaders/shaders_deferred_shading AUDIO = \ audio/audio_module_playing \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index 9c2cadc37ef3..f956ff7ce7bf 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -468,7 +468,8 @@ SHADERS = \ shaders/shaders_mesh_instancing \ shaders/shaders_multi_sample2d \ shaders/shaders_write_depth \ - shaders/shaders_hybrid_render + shaders/shaders_hybrid_render \ + shaders/shaders_deferred_shading AUDIO = \ audio/audio_module_playing \ diff --git a/examples/README.md b/examples/README.md index 82e4b782521d..8ecd7741e630 100644 --- a/examples/README.md +++ b/examples/README.md @@ -176,6 +176,7 @@ Examples using raylib shaders functionality, including shaders loading, paramete | 114 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | shaders_mesh_instancing | ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) | | 115 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | shaders_multi_sample2d | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) | | 116 | [shaders_spotlight](shaders/shaders_spotlight.c) | shaders_spotlight | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | +| 117 | [shaders_deferred_shading](shaders/shaders_deferred_shading.c) | shaders_deferred_shading | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) | ### category: audio @@ -183,10 +184,10 @@ Examples using raylib audio functionality, including sound/music loading and pla | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------| -| 117 | [audio_module_playing](audio/audio_module_playing.c) | audio_module_playing | ⭐️☆☆☆ | 1.5 | 3.5 | [Ray](https://github.com/raysan5) | -| 118 | [audio_music_stream](audio/audio_music_stream.c) | audio_music_stream | ⭐️☆☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | -| 119 | [audio_raw_stream](audio/audio_raw_stream.c) | audio_raw_stream | ⭐️⭐️⭐️☆ | 1.6 | **4.2** | [Ray](https://github.com/raysan5) | -| 120 | [audio_sound_loading](audio/audio_sound_loading.c) | audio_sound_loading | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) | +| 118 | [audio_module_playing](audio/audio_module_playing.c) | audio_module_playing | ⭐️☆☆☆ | 1.5 | 3.5 | [Ray](https://github.com/raysan5) | +| 119 | [audio_music_stream](audio/audio_music_stream.c) | audio_music_stream | ⭐️☆☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) | +| 120 | [audio_raw_stream](audio/audio_raw_stream.c) | audio_raw_stream | ⭐️⭐️⭐️☆ | 1.6 | **4.2** | [Ray](https://github.com/raysan5) | +| 121 | [audio_sound_loading](audio/audio_sound_loading.c) | audio_sound_loading | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) | ### category: others diff --git a/examples/shaders/resources/shaders/glsl330/deferred_shading.fs b/examples/shaders/resources/shaders/glsl330/deferred_shading.fs new file mode 100644 index 000000000000..64de325ff3af --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/deferred_shading.fs @@ -0,0 +1,54 @@ +#version 330 core +out vec4 finalColor; + +in vec2 texCoord; +in vec2 texCoord2; + +uniform sampler2D gPosition; +uniform sampler2D gNormal; +uniform sampler2D gAlbedoSpec; + +struct Light { + int enabled; + int type; // Unused in this demo. + vec3 position; + vec3 target; // Unused in this demo. + vec4 color; +}; + +const int NR_LIGHTS = 4; +uniform Light lights[NR_LIGHTS]; +uniform vec3 viewPosition; + +const float QUADRATIC = 0.032; +const float LINEAR = 0.09; + +void main() { + vec3 fragPosition = texture(gPosition, texCoord).rgb; + vec3 normal = texture(gNormal, texCoord).rgb; + vec3 albedo = texture(gAlbedoSpec, texCoord).rgb; + float specular = texture(gAlbedoSpec, texCoord).a; + + vec3 ambient = albedo * vec3(0.1f); + vec3 viewDirection = normalize(viewPosition - fragPosition); + + for(int i = 0; i < NR_LIGHTS; ++i) { + if(lights[i].enabled == 0) continue; + vec3 lightDirection = lights[i].position - fragPosition; + vec3 diffuse = max(dot(normal, lightDirection), 0.0) * albedo * lights[i].color.xyz; + + vec3 halfwayDirection = normalize(lightDirection + viewDirection); + float spec = pow(max(dot(normal, halfwayDirection), 0.0), 32.0); + vec3 specular = specular * spec * lights[i].color.xyz; + + // Attenuation + float distance = length(lights[i].position - fragPosition); + float attenuation = 1.0 / (1.0 + LINEAR * distance + QUADRATIC * distance * distance); + diffuse *= attenuation; + specular *= attenuation; + ambient += diffuse + specular; + } + + finalColor = vec4(ambient, 1.0); +} + diff --git a/examples/shaders/resources/shaders/glsl330/deferred_shading.vs b/examples/shaders/resources/shaders/glsl330/deferred_shading.vs new file mode 100644 index 000000000000..d6bd88d1c1a6 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/deferred_shading.vs @@ -0,0 +1,11 @@ +#version 330 core + +layout (location = 0) in vec3 vertexPosition; +layout (location = 1) in vec2 vertexTexCoord; + +out vec2 texCoord; + +void main() { + gl_Position = vec4(vertexPosition, 1.0); + texCoord = vertexTexCoord; +} diff --git a/examples/shaders/resources/shaders/glsl330/gbuffer.fs b/examples/shaders/resources/shaders/glsl330/gbuffer.fs new file mode 100644 index 000000000000..c86e20a9e313 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/gbuffer.fs @@ -0,0 +1,22 @@ +#version 330 core +layout (location = 0) out vec3 gPosition; +layout (location = 1) out vec3 gNormal; +layout (location = 2) out vec4 gAlbedoSpec; + +in vec3 fragPosition; +in vec2 fragTexCoord; +in vec3 fragNormal; + +uniform sampler2D diffuseTexture; +uniform sampler2D specularTexture; + +void main() { + // store the fragment position vector in the first gbuffer texture + gPosition = fragPosition; + // also store the per-fragment normals into the gbuffer + gNormal = normalize(fragNormal); + // and the diffuse per-fragment color + gAlbedoSpec.rgb = texture(diffuseTexture, fragTexCoord).rgb; + // store specular intensity in gAlbedoSpec's alpha component + gAlbedoSpec.a = texture(specularTexture, fragTexCoord).r; +} diff --git a/examples/shaders/resources/shaders/glsl330/gbuffer.vs b/examples/shaders/resources/shaders/glsl330/gbuffer.vs new file mode 100644 index 000000000000..7d264ba64558 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/gbuffer.vs @@ -0,0 +1,24 @@ +#version 330 core +layout (location = 0) in vec3 vertexPosition; +layout (location = 1) in vec2 vertexTexCoord; +layout (location = 2) in vec3 vertexNormal; + +out vec3 fragPosition; +out vec2 fragTexCoord; +out vec3 fragNormal; + +uniform mat4 matModel; +uniform mat4 matView; +uniform mat4 matProjection; + +void main() +{ + vec4 worldPos = matModel * vec4(vertexPosition, 1.0); + fragPosition = worldPos.xyz; + fragTexCoord = vertexTexCoord; + + mat3 normalMatrix = transpose(inverse(mat3(matModel))); + fragNormal = normalMatrix * vertexNormal; + + gl_Position = matProjection * matView * worldPos; +} diff --git a/examples/shaders/shaders_deferred_shading.c b/examples/shaders/shaders_deferred_shading.c new file mode 100644 index 000000000000..1aacd88eff51 --- /dev/null +++ b/examples/shaders/shaders_deferred_shading.c @@ -0,0 +1,318 @@ +/******************************************************************************************* +* +* raylib [shaders] example - deferred rendering +* +* NOTE: This example requires raylib OpenGL 3.3 or ES 3 versions. +* +* Example originally created with raylib 4.5, last time updated with raylib 4.5 +* +* Example contributed by Justin Andreas Lacoste (@27justin) and reviewed by Ramon Santamaria (@raysan5) +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2023 Justin Andreas Lacoste (@27justin) +* +********************************************************************************************/ + +#include +#include + +#include "raylib.h" +#include "rlgl.h" + +#include "raymath.h" + +#define RLIGHTS_IMPLEMENTATION +#include "rlights.h" + +#if defined(PLATFORM_DESKTOP) + #define GLSL_VERSION 330 +#else // PLATFORM_ANDROID, PLATFORM_WEB + #define GLSL_VERSION 100 +#endif + +typedef struct { + unsigned int framebuffer; + + unsigned int positionTexture; + unsigned int normalTexture; + unsigned int albedoSpecTexture; + + unsigned int depthRenderbuffer; +} GBuffer; + +int main(void) { + // Initialization + // ------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - deferred shading"); + + + Camera camera = { 0 }; + camera.position = (Vector3){ 5.0f, 4.0f, 5.0f }; // Camera position + camera.target = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera looking at point + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 60.0f; // Camera field-of-view Y + camera.projection = CAMERA_PERSPECTIVE; // Camera projection type + + // Load plane model from a generated mesh + Model model = LoadModelFromMesh(GenMeshPlane(10.0f, 10.0f, 3, 3)); + Model cube = LoadModelFromMesh(GenMeshCube(2.0f, 2.0f, 2.0f)); + + // Load geometry buffer (G-buffer) shader and deferred shader + Shader gbufferShader = LoadShader("resources/shaders/glsl330/gbuffer.vs", + "resources/shaders/glsl330/gbuffer.fs"); + + Shader deferredShader = LoadShader("resources/shaders/glsl330/deferred_shading.vs", + "resources/shaders/glsl330/deferred_shading.fs"); + deferredShader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(deferredShader, "viewPosition"); + + + // Initialize the G-buffer + GBuffer gBuffer = { 0 }; + gBuffer.framebuffer = rlLoadFramebuffer(screenWidth, screenHeight); + + if(!gBuffer.framebuffer) { + TraceLog(LOG_WARNING, "Failed to create framebuffer"); + exit(1); + } + rlEnableFramebuffer(gBuffer.framebuffer); + + // Since we are storing position and normal data in these textures, + // we need to use a floating point format. + gBuffer.positionTexture = rlLoadTexture(NULL, screenWidth, screenHeight, RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, 1); + + gBuffer.normalTexture = rlLoadTexture(NULL, screenWidth, screenHeight, RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, 1); + // Albedo (diffuse color) and specular strength can be combined into one texture. + // The color in RGB, and the specular strength in the alpha channel. + gBuffer.albedoSpecTexture = rlLoadTexture(NULL, screenWidth, screenHeight, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); + + // Activate the draw buffers for our framebuffer + rlActiveDrawBuffers(3); + + + // Now we attach our textures to the framebuffer. + rlFramebufferAttach(gBuffer.framebuffer, gBuffer.positionTexture, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0); + rlFramebufferAttach(gBuffer.framebuffer, gBuffer.normalTexture, RL_ATTACHMENT_COLOR_CHANNEL1, RL_ATTACHMENT_TEXTURE2D, 0); + rlFramebufferAttach(gBuffer.framebuffer, gBuffer.albedoSpecTexture, RL_ATTACHMENT_COLOR_CHANNEL2, RL_ATTACHMENT_TEXTURE2D, 0); + + + // Finally we attach the depth buffer. + gBuffer.depthRenderbuffer = rlLoadTextureDepth(screenWidth, screenHeight, true); + rlFramebufferAttach(gBuffer.framebuffer, gBuffer.depthRenderbuffer, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_RENDERBUFFER, 0); + + // Make sure our framebuffer is complete. + // NOTE: rlFramebufferComplete() automatically unbinds the framebuffer, so we don't have + // to rlDisableFramebuffer() here. + if(rlFramebufferComplete(gBuffer.framebuffer) != true) { + TraceLog(LOG_WARNING, "Framebuffer is not complete"); + exit(1); + } + + // Now we initialize the sampler2D uniform's in the deferred shader. + // We do this by setting the uniform's value to the color channel slot we earlier + // bound our textures to. + rlEnableShader(deferredShader.id); + + rlSetUniformSampler(rlGetLocationUniform(deferredShader.id, "gPosition"), 0); + rlSetUniformSampler(rlGetLocationUniform(deferredShader.id, "gNormal"), 1); + rlSetUniformSampler(rlGetLocationUniform(deferredShader.id, "gAlbedoSpec"), 2); + + rlDisableShader(); + + // Assign out lighting shader to model + model.materials[0].shader = gbufferShader; + cube.materials[0].shader = gbufferShader; + + // Create lights + //-------------------------------------------------------------------------------------- + Light lights[MAX_LIGHTS] = { 0 }; + lights[0] = CreateLight(LIGHT_POINT, (Vector3){ -2, 1, -2 }, Vector3Zero(), YELLOW, deferredShader); + lights[1] = CreateLight(LIGHT_POINT, (Vector3){ 2, 1, 2 }, Vector3Zero(), RED, deferredShader); + lights[2] = CreateLight(LIGHT_POINT, (Vector3){ -2, 1, 2 }, Vector3Zero(), GREEN, deferredShader); + lights[3] = CreateLight(LIGHT_POINT, (Vector3){ 2, 1, -2 }, Vector3Zero(), BLUE, deferredShader); + + const int MAX_CUBES = 30; + const float CUBE_SCALE = 0.25; + Vector3 cubePositions[MAX_CUBES]; + float cubeRotations[MAX_CUBES]; + for(int i = 0; i < MAX_CUBES; i++) { + cubePositions[i] = (Vector3) { + .x = (float)(rand() % 10) - 5, + .y = (float)(rand() % 5), + .z = (float)(rand() % 10) - 5, + }; + cubeRotations[i] = (float)(rand() % 360); + } + + enum { + POSITION, + NORMAL, + ALBEDO, + DEFERRED_SHADING + } activeTexture = DEFERRED_SHADING; + + rlEnableDepthTest(); + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //--------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera, CAMERA_ORBITAL); + + // Update the shader with the camera view vector (points towards { 0.0f, 0.0f, 0.0f }) + float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z }; + SetShaderValue(deferredShader, deferredShader.locs[SHADER_LOC_VECTOR_VIEW], cameraPos, SHADER_UNIFORM_VEC3); + + // Check key inputs to enable/disable lights + if (IsKeyPressed(KEY_Y)) { lights[0].enabled = !lights[0].enabled; } + if (IsKeyPressed(KEY_R)) { lights[1].enabled = !lights[1].enabled; } + if (IsKeyPressed(KEY_G)) { lights[2].enabled = !lights[2].enabled; } + if (IsKeyPressed(KEY_B)) { lights[3].enabled = !lights[3].enabled; } + + // Check key inputs to switch between G-buffer textures + if(IsKeyPressed(KEY_ONE)) activeTexture = POSITION; + if(IsKeyPressed(KEY_TWO)) activeTexture = NORMAL; + if(IsKeyPressed(KEY_THREE)) activeTexture = ALBEDO; + if(IsKeyPressed(KEY_FOUR)) activeTexture = DEFERRED_SHADING; + + + // Update light values (actually, only enable/disable them) + for (int i = 0; i < MAX_LIGHTS; i++) UpdateLightValues(deferredShader, lights[i]); + //---------------------------------------------------------------------------------- + + // Draw + // --------------------------------------------------------------------------------- + BeginDrawing(); + // Draw to the geometry buffer by first activating it. + rlEnableFramebuffer(gBuffer.framebuffer); + rlClearScreenBuffers(); // Clear color & depth buffer + + rlDisableColorBlend(); + BeginMode3D(camera); + // NOTE: + // We have to use rlEnableShader here. `BeginShaderMode` or thus `rlSetShader` + // will not work, as they won't immediately load the shader program. + rlEnableShader(gbufferShader.id); + // When drawing a model here, make sure that the material's shaders + // are set to the gbuffer shader! + DrawModel(model, Vector3Zero(), 1.0f, WHITE); + DrawModel(cube, (Vector3) { 0.0, 1.0f, 0.0 }, 1.0f, WHITE); + + for(int i = 0; i < MAX_CUBES; i++) { + Vector3 position = cubePositions[i]; + + DrawModelEx(cube, position, (Vector3) { 1, 1, 1 }, cubeRotations[i], (Vector3) { CUBE_SCALE, CUBE_SCALE, CUBE_SCALE }, WHITE); + } + + rlDisableShader(); + EndMode3D(); + rlEnableColorBlend(); + + // Go back to the default framebuffer (0) and draw our deferred shading. + rlDisableFramebuffer(); + rlClearScreenBuffers(); // Clear color & depth buffer + + switch(activeTexture) { + case DEFERRED_SHADING: + BeginMode3D(camera); + rlDisableColorBlend(); + rlEnableShader(deferredShader.id); + // Activate our g-buffer textures + // These will now be bound to the sampler2D uniforms `gPosition`, `gNormal`, + // and `gAlbedoSpec` + rlActiveTextureSlot(0); + rlEnableTexture(gBuffer.positionTexture); + rlActiveTextureSlot(1); + rlEnableTexture(gBuffer.normalTexture); + rlActiveTextureSlot(2); + rlEnableTexture(gBuffer.albedoSpecTexture); + + // Finally, we draw a fullscreen quad to our default framebuffer + // This will now be shaded using our deferred shader + rlLoadDrawQuad(); + rlDisableShader(); + rlEnableColorBlend(); + EndMode3D(); + + // As a last step, we now copy over the depth buffer from our g-buffer to the + // default framebuffer. + glBindFramebuffer(GL_READ_FRAMEBUFFER, gBuffer.framebuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + rlDisableFramebuffer(); + + // Since our shader is now done and disabled, we can draw our lights in default + // forward rendering + BeginMode3D(camera); + rlEnableShader(rlGetShaderIdDefault()); + for(int i = 0; i < MAX_LIGHTS; i++) { + if(lights[i].enabled) DrawSphereEx(lights[i].position, 0.2f, 8, 8, lights[i].color); + else DrawSphereWires(lights[i].position, 0.2f, 8, 8, ColorAlpha(lights[i].color, 0.3f)); + } + rlDisableShader(); + EndMode3D(); + DrawText("FINAL RESULT", 10, screenHeight - 30, 20, DARKGREEN); + break; + case POSITION: + DrawTextureRec((Texture2D) { + .id = gBuffer.positionTexture, + .width = screenWidth, + .height = screenHeight, + }, (Rectangle) { 0, 0, screenWidth, -screenHeight }, Vector2Zero(), RAYWHITE); + DrawText("POSITION TEXTURE", 10, screenHeight - 30, 20, DARKGREEN); + break; + case NORMAL: + DrawTextureRec((Texture2D) { + .id = gBuffer.normalTexture, + .width = screenWidth, + .height = screenHeight, + }, (Rectangle) { 0, 0, screenWidth, -screenHeight }, Vector2Zero(), RAYWHITE); + DrawText("NORMAL TEXTURE", 10, screenHeight - 30, 20, DARKGREEN); + break; + + case ALBEDO: + DrawTextureRec((Texture2D) { + .id = gBuffer.albedoSpecTexture, + .width = screenWidth, + .height = screenHeight, + }, (Rectangle) { 0, 0, screenWidth, -screenHeight }, Vector2Zero(), RAYWHITE); + DrawText("ALBEDO TEXTURE", 10, screenHeight - 30, 20, DARKGREEN); + break; + } + + DrawFPS(10, 10); + + DrawText("Use keys [Y][R][G][B] to toggle lights", 10, 40, 20, DARKGRAY); + DrawText("Use keys [1]-[4] to switch between G-buffer textures", 10, 70, 20, DARKGRAY); + EndDrawing(); + // ----------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadModel(model); // Unload the models + UnloadModel(cube); + + UnloadShader(deferredShader); // Unload shaders + UnloadShader(gbufferShader); + + // Unload geometry buffer and all attached textures + rlUnloadFramebuffer(gBuffer.framebuffer); + rlUnloadTexture(gBuffer.positionTexture); + rlUnloadTexture(gBuffer.normalTexture); + rlUnloadTexture(gBuffer.albedoSpecTexture); + rlUnloadTexture(gBuffer.depthRenderbuffer); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + diff --git a/examples/shaders/shaders_deferred_shading.png b/examples/shaders/shaders_deferred_shading.png new file mode 100644 index 0000000000000000000000000000000000000000..44129f0ff0ecb67f96e04d841e6e23c220f21dc8 GIT binary patch literal 90692 zcmeEtbx<8m*XKnN2p%jza1ZY85`bNck@-;wD)-4m?%P6`!?00{&Fp~^^0D1$(7q#zJX2O=zRCkcix z6S$0lHDyd?WavPMzz={D1|9?hlt|%#;@{;C;07!V90<4t3It9}p!`JhbP~Wk`*RHg z%CG+}#{p&9ziFOYVugVPp#s-5;A8{J*uWJ6oEBgIYO4h(KOKmF{-lA@6X$&eC({GtXzET+-5 zceFFLum*!bZfV}pg3_HLgx&f&dCGJ|d!*z^*?hCz%!F1rA&O*^NTqy9x;M`h2x72b zNwwGf`qgVR)!wb8fuJFZaR+j6aZq-S#(Ye~*6wn%Ux;+QBz8Rn`Bn|6R?)x|rhrY9 zWylisaXyzJ8p6NqVqs)e$;9gB5a^u|^zv#BJ!Lp_@{RDxGhl0@!JtX9)$DrR#h#il z;-1MfFc2f=^-jQc>{&2LJyYXdPyKp%rrFzYYtsxKS%$a<%>yHKF4fgHt4TSQafhSz zCH70JCF;8+-tQke>_v67Hu;7Pzm*431!0ipMj%1TF$&Zux+MZHVu>HfdYNP7s5PF2 z5h53gep$b2fBfZIXX@bCp@2l=xAbcM0q@!8Mv-E}`Q_f)MLrnV(YE;M2^h{n4--_ub@2K5v)f5T4umjit=%c#;&LizGD2E`t!h zwrK`e&Im3o&MeNin$6wcgPuh=uG|~d9RW7zW}&L-tf?T+XKZJ~WN2b%1ZHxxv42t+ zNI=-l-q6?z>`ZC|HnXr5BtL9yB`38o5hT~(RA5oC7YCbLNP9SfRXpCQ8hcn7^O}$g z3n2-(@c|5Mz|MxGZZ_7oPJC{Hu~$1DbJBmvXJfCR@K5%( zPJg2S;KA%>XwS^b#KLT2!~E|xoSY>;0!;oE=>J&5N!8sR%&ZJ{vU71X21|Yf+d5PH zI|~!zf7Z8makT!^9TQ__ur=5QAaw#-W&MvPpFHlLHJ%_av#_!MQwsq5KPa6oO#cPe zf5`Uq(f&otzDAjloZ>0Om{<03TCU zUUow^Zc|2fLk>1Z4ij!(Mk6jT3!{;tA&)5w50{A{kMX~;c<*QdSf!!$zf1MR$^>A= z!OqId%E8UaXw1#Z#mHgIW6H>5%x27JWXj9S!OF$T!fj&ohn0yj-&;FJ8$&>y7B+@v zU}k$;vp)}>0Ou1`lo2FnV`BN&9Yt$HXH%epAi2DSt&7{g9;jN_fK{9gpU`CG;^pDy z0uEL{XdX`Pe-WvJ9i0G6eB${hcK&(tq!vD)GXSuLPj(70_;VlV3!k_n*wER|QPs}Q zT9EvoQTLyZ6##cKF?2SRFmwh3O#c~&RsRu(=~-C$SpE|KiJgL-iG`{A|Bd>|c}N8S zdO+pU7EVC>?tgCmqP_}g6nao^(qU?!R0e?0!y#s9|^0M`F)m2k{zt_BwXXld^*=)3e?-v8N7t+6`Q(#+Q6yyp_mTH;%9Ds?|b0aw^2@n?O zC5Xm!pYCa*{lZ>a%LxQR#(FwoKq+Z>z)b{a83jp%EhG|jDw@ulJ8=+*6eJ@ds_Hhk z*X-&=I91s7-8b zOzm>QZ(Wzo+%N2ya^S@snR~DY^XF9I^7~?RDUC}%7NlK9&ZYxLa=K0B!0G)FYw>KA zndwMc^7Zhc`v^YhGb!T#vwzw*zt5@QlE~_DUxN76KqTO^rk%^ygge!u zYBlQx1L(KL3K3@=Tb0u+lJL1_T$-Nd-+Uy$C}I6+P89o>I`L^;X`iF})1`9`x%qBBx!d&mQo<%;!X!SR!QNT%He-0ph;vXg}P(Xi#R+pT6 zQJL^Va2J7O!e>((v#P%)TJQ($RudEoEwihODn83z1bwT1vJRsmM26KYLd-6iSZcDI zUxpw1-ZWh5FDL^}l#{^|cci_EK2r=iyqg{&<8bPSFO))$lr^HIyR`I@39OdisZV?g>iZT_^i{bl z>dA86Qe%@7;(u-D4WWHk2j8 z&-a#2!5FpT0iD2<@JE>??57fjKT7tKr0nZ$VT&L<$wQTT*zU-5X+CyDbjXB!PQGi| z67Tw?h*0GI)Yj^+h2^3bA#(2S_1D*JesHrcG2o*tN|_!6vH%DqLQWo6{=?XH?1(*W zi6tb*qWGZoe75;E?3L#0{=@sxn$Vv@y9w(JHcPi^3v+*>0X*&s_Vy=zbJszb0mQ?})Caj-B)GeREZWC=rIZ zS_<>c1dzzP`ORki?$Yo-hQittb;pBhdntTq7Yfxg;P_4y)Q30WBDkACVMK`;4aNtR z9K1T%AkXYkH8WZK~@{;x>!T&vG(s zBqG-Zhb2#KX`4>>1*vzDbO#A0(+O7hJ_C`^(`Z0>S#6a!ti*Nl04N72sPhd-y<>#L zI<`MG0$-Tis6il>DG6Gs`4)lQ@wAa8e7gIE(3`I}FC}R4toe68=R&MZzYK=cvN#sq z6qb>$CC{7oac+%7FR*kL;}H-HG!#6W=1S}JUOy}BsO!=e2jF?VMFDuq5rq;KA)(=* z=2B}ZirSLRpew>yJ$%nRVHG1a4fr9$5Tzd>SCkD^W z%Z^nhzEqZWM|Q@^I9O5K1(Ee=Qewh<(rf$(#$~w^%d#g1nxMteT)O5?UK?2$Sg-r= zc;2`Xv9A4|%*1!!pw<&I1P+$t@&kLt^HuA@!o$P2@ve+DinD@5daP0(a+O~#j^5F9 zd4|QPzZwYPyc~4V2cbp#gN~FOgLQ1aU?6=VoNqm%P?H|c+dUQX1v^u&eMcs{EByF4 zZ)}4v3=Z+s1uR+GfC^eb{0|ve=az?_9jmk|J!f;2ax5)~;t#+lWElG1mu>Ch*3nSK z#M`*!8pN4mSik|JvxwzFgBvaH1(15ec^%Oe@I z9Lk!6B_AZ#+~1$^9fmW1Gkv^gv`Q8j$!~8L?fhQ(_Blm#kSp}t<9nq3$-|F}bxfC4%EWPyxs&Vo5a`eU5rH~$HCJmBvHIuRzdYuM1gm~3EB*JSj zD&C060d9*;osXXoLBhh;(Uf6BWnKAXpCYb6zc7NHzsc$+c)lJi#l*qo@*_twCEvxx zrF-qz=)9o=J#(~0HIA(wn$F5)G5&36BrHfxO|90jKo@;M-Hw277t; zy7L+9!E7@4WN?HvbCBD1!92o<-spbmRyhbE*1hu-D;VxmpbRSd(%mmfn^))P=VdLf zH99e#YTxN5HpC>7(?rMFPWP*jpC0d;KKFs=?1uVON?g*YBpg9O>COQMo2%C201X62f|DsunEVJuN8bp zB&)nJ^Vutw21{&KmOd9(g%JT4V!kZyP{aC+)l~AVO_B8H$BS#TCC{ycY*9rF5z<6z z?$W)b>ZM7|?i0VXJthu$X03Pf%FKh6lrp{k*V&b#!fm!VwcF8N&T8j5M=KT(oE;1skZq^R$73>^cH-G%6}`mB_-iot>wY*^`i?nK zMff{(yW^(KvNJMPBf7bkJ2<{gurM=T#^H6|@iI>lz=?_P_My@9Yv2+wyoxc-Hzbj< zBDE`(_KEkxL`YxQIMsLJ<7Cz#rKOC7XyPa7azSogFQu%Pns_4};5ywofsq5=A?%>T zTf#aEM_E}@`LUm2x~V&MWRF50$7Ry^o8aVRHicUysoA31He8q@v}lS}NX7 zP0~;6`6Z=BPLb^E-#1PL3Z)kA2`j@!1zepefyg88iNu#{bpd+~m3FO7http{8Jq;f_zc@PAe(>1N)2cGn3a5V!2M3q@6vtto%E*PrZV9e%D9_g;;nw6;!8IFOE{5!BK&BHI9FRHhE0&sX_}tG zijGqnW1j$7nf*Nss4xX$9+I39@0=7i7^Q`mzmoBpuwOG{h7-D;ijWZP+ixK&m6dQ|Jcayp$ z4+&a5x-qj(mX?+Y3|f^R_vhr-2CP}v#9ds@b0kAQ_*{dnRIU~>N(N8)BW2TVWPnkk zV_V7dFcS6`vX787qvq9~im+s&ldH8zGli*>pCczHCu@;u0eB*tvl>Y>#mw=0TU!@lr2y5vQi6To+vu zrQ}uA)FhSO@vH=t>eMCVNZ~XK-)_qhgG)H)$p^z&?JU5xN!MCRahsc)fNI}F+Ke3P zzRpNg00!q_9tiXWNqR~H>o+>PCq{bTk&9?f`&*it7HqVoBMI;-fw3M$e5#LSqR3G& zZMy>*2Ix<|0{Fa`aG-#mF<8!Ol=pC`(U(8>I+a=QTnhcsly+Mij7A&~Caf}toDG2t zRO{$oO2-6Xh#~g+D~Aws-jS0!>21cCa}WeeP|C2y%+5gdcJZ*PYm#c16*2^PXS7a` zg=eJ2o}?>dJ<>WY4x_n()i7)xCSCm|6YG`lC>LWgk||VYYrDmmK0TW~E|2Ui9JXzn zpeBufkjTloG}}_Co>Lr>pMKpqFYI-FSk_cCg~&Xo8^WvnOXDkHa+)I9bt{L(mp6G| z-j48}+{{Vt`x<1JhFNqn=+s)T^@Qg_nMG@@zm?phzASi`J~uhJo-}mu)tqB)e0+R% z7C*B0YxW}+5aNP&={QC6xmB`W8^-L~h1)0P(28M24+JsvVZp?Iv!2Gd&$S3PjakW>i>Kh7J#FT*Q36 zXD1ev%x(tNsbeBU+scN5ND0wgot-(jxX|7|(g5%ICc7`j2`i&${l?Erp2fa$UK+JKsNEXT-y$K-L11HR zyHss4QMfDj<+3h6KOglqmq|E^M;7hCKs-H($8WOEE`rU6_kiCBMfc33p+7Q8OjIu| zeRw3GKb{kvAIj-g?nu(``v%i9Hh<#0*a^$6AMXJ%GN`kMS&Mq!E=0?{;AD>W`HVEeopJFK@le5PN!NxixgOn7e%r!U8M>Y%; z`cJAl&@Oa6u?6U)!Z$4S<6(!gzZvSg!z0|6g-@!J;mscWFz0B^e2oQ+5?qwzfKVFM zMj%B%Kiopsoz(87vRE~z0V{&l;DShIs)Gs(Lex_$WWS<0w04zLDwzmZ{<}ui&kqG_ zV0|3#Ap>u30qCA|NCE1;!eh2L%GSi0#RSHaVC@w zO_%CyO^+zZ5C8h+qN>nbvR`>$aSvi4<1rjgwz@NCP*Y*P?F8R`y?|>A7z^MuD?2V5 zDv7@uvhfuU*8A>)#b+%9E22Ppl>45`(S&Qi`wO%X2@VD{UB`q;oaEPWzB}W|p$%BA zjm`eS!N|G7DBy)%_J|AsZAQ@^(tC{7Ma0!nb<4(XnpMalmEKR@5!-zPqtQ&F3`b6*k6jv@$|LPsv@MZxAnDp}!xHt9FT&TdKF&I+EC8LVYf zy)a@xWazYl0io0M?9b=ua|YVzeaYRuQF$-O$-&|Ls|`l#y;Wx*YPRC7ZE~%-Nv4Nc< zBxOobgDc)(PP?|u$g<>gc4RX&m1aiXwiUYg5V5s>@Oo$9Y9a{F)Tj#{>uZ7>=#x;) zQfVt&P)`n{Mh!L_r#LhrtT!}maB#4=xH$AD7E)2R=6!ja2OHcM1S;yJ?U{!2>lF(% zZmHqh?)lDK$-pfnt_El%h5BQ8%~EGWIXOgxA`9(96n70cI#uW)MksbdqQY2%zM;|8u4-z)286@#DQ_?+S=??ayZtCy6&-DFXr0miqv#cOnvGUG!y5OluWF2Z~f{tm+o2pow zGD(r$BdRwEuZl=?+1!9hv9kuk#DHvH$?kl3e8SxIVdOB%DlJs(NWG>vOOodkGq_JXw7#4 zs5HNiwELP}inLcJq?7gip6-y?2cs+po^_g#;jlpbknO>V)B4hGo}w)CW^v@Yn$=e5 zBJaD2(0+6EX`T&X#x?F6+Kjt8GIw zlaa$iGm4TItc5de;+Llmf7RlMhVlD7JD9~=dLMPYVVU$^?=`nANAE69h0me)n}&vy z5hC7}6*sbg96H#5~vmWfaik#kn7El1QA1g)np2@cJ{|2?0Ll!`lQU-6JKy& z&9e54t*H~S=UxSu*~~3LQtvrL(`?NCgX9aNFys=$HZNUvVK?E@2z($JkYV5dB6>jj z7Ihz___Bod295)i=DwJms=v6GG%qBuzqed8Fq%g@O^j2_c{j-}u+|~#;N`^05>kU| zi!bfd!g&4>_e7_Tp?HW7*{ZopAI)Czh;Za+*nJW3-{cK6$>sDd-P|d5#8s`Hn2?zLuc`VCqHoTI0 z#A%Y7(W^IJ`e?ZMLzY6Vyku1i)XpsZrr;N3AG~h6SLZY+TB+nb3f`2H;94v((t~&UpUH zzmmB-POBz%-p(4~Qx~n6Zw}oq%y|+gDc=XUK^Vq-f>1Xfsf62{d(1!GYG<^ zI|cG9*Y2IO>JQvKe5PXwdKop3=v(#j7ye|8>qB0@9rk` z`?#(~zxH|MS3j`K%vvq%RQHzvlbcQ6;RYx@ggihbFeLw*yY@TvgdDmCsAqMsPAEzO!w7%#U6)r4=B@pD@7_>est;IY1{BX zJ)0eov?%WId?p(9v2tDFR$lw_c&kA6H)eMhb~s|+yW^66T;h4H4&kXro=)g| zOJAke)yh}6HXs(~&?1c$J0f-z_{XaZL21E`_oXiG74PQ6b{srw2TQ7swmj=2gf4wnr{|BO-2{DEMlN3oBjzCgh_ zbWewY=(U2Z|NHlE(5LC?>5L5Gc`9gevDKBn$UBT&af5JH*>rvIYwj(#q7#+;sFUPY zZ4TGymmD0+@YWdNk~&b^ZI9B>cW|FcPqHd1Dspov2+`o$Zq9f2N9`c8kWf-TNo+>; zEbP&C_g0&ktD}YDQBL1FcgOwp3lgfWVKGJ3yz`yuk?{1|B7BT!Hp(ES5Z9T!2t8*! zEWMp>epPVVnbk_?`U3zx?vwb9isF>l56~7DRQq zCW=#G1;*~uO#|g$H5l7tyrhWD7g@&wN9Dr21bNg67Z-~^Eqbw7SX*1$ z*^P#w+_wmOQ$eEJ5s?kQTD_9VQ$Ki#U3+HoEX^WTe(ex0=xYxlG--XyH ztuoLW9xwJMm{{_!L~u_8U00Nc@C+bD>^vZ&SsY3oL?&(Ua?M}WYfQ(K>}#K45K0tG z`L}V*<}$%tdU49CAcsDlw1oi7@;@?Mq8Ub_^W_wS=+2sk+_MZ{uD>}T-R&aHu5J4cd1ueS+)c)gZnBOWMUZP zh%WE75zA>Af9+{1%y`zl78Q@t>PqV7c_qKgjTwA)aS`E89|}m_fiA5ef`|3pEE1hs ztK2};%&g!TmTlhOLd?Q@>!hXm)ARgx4*G_&?Z_l5vkB1D_+WF4C4e;{xRU z1i%q}X`#XW^prz76|b4+If9_c^iSy_HYm;}2@}IV_5$2q?B~J*i-3NTaqHx%QqFBT z)jqkjvQAE?`3k9ptih}$Q0oSGw6|SRa2)U*nv=To4aR78x%hu{uXLs(H+^NGo<|kX z_l8ymgJK7Ug2n~>fD|am8cM;$Sf*WPQXe2GxJaGgz_bgCK{`VZ(~a-~Q?rYQoTfBZ z#Vd-bvWrJpzX_~fgjGebe$Vk_cMgR_Zr-|?qRoe zGNV7A12NIVTI=t~q9*kcY6lR-E70hV3C2Ogi1ue=3$Ey2IT49oi%eSc%@b2wD{DDH zDWZQ8xaBDMPV`vRXhBFjuCHYkBsU0|i{SfUByU=B?^M98K8fv4R4>CoLE)`g^9q>U zllSCT&(&CI*x8j~kQWc-0Nvez{NAx#RMJPJL0G_<>7uKprl^nvR-A%>TztO816bWp z5fDc*j^i96idM$IgWN9z!2p@`%q6C`kh87*vMMR*2>p}wP%=?h!Yrp1k`Aj3HQrV! zv%aAk%8OVchC7;=xZzCi)RtO)Gh6PF6FReyN23J)gy>EjBbpH)HG+F$f%HRKj z)1U(O3t`1Ow4Btq0fn5r2Nf4RlH*vHmtBZ{o9zUHcrug?3~)LE*=3Z*&^sWM5j0BxCGVBQPeMK8SJ%70!6-;Zc|Fd z4$1uF6|$avMcc5{u)?g@omvt~+QYSO5Wbz8Doy_K7>;Dm?Lr76g|c5RLEmd{dq(x$ zhu=2l$uB#%CkmE551YjhC6!L*Q2^m{k4oMMq59b?>*ZOcp^y|GiIBm`w*;{)lV+*3 zXZ-f#;njp+L3b?g>G%I0dk^m!8+V#DJ}3u<%@<-pBmvCSW?%|2e zz-K+d`aq4l$US*DIL5|e!>BjY*wD};<25$7*KT0nA44@NbZgCkn`_HEm%;Ba+ch`; z%9pP#iMmVDt~Dw%J{}Q`Nh<@F@N9gcgASaNGIz4R?1=i3K;x6R_(r4;7dpZqvgAzS z{r*Gvy`YvH+b8^(uurgE@6@v4<&Dx(h$i8U_k$cieE4u+hD*ZO(%QNeo?;OiB@+RQ z98Jd7b6p*nkN?%nb`ojaoGC!Fp|!{?EC1gFwp}^tL)${1CGK! zM@fmbt?k2U=HuPC9P|Fq3geR6Hcd$cH)h<$+PcHIB6j~U#50r- zp7n&rR>fvEur+`sB_-3b1&pU@zOSU=Smb=v3%b>xZ(#q}rlUO^x1Q{GMD>-Z-grSU=~$RnQdY{>y5&^lW^9>R#Xxx>T5ZxQ41^cav5TshJ)Hq&5!lRA?zx!ry# zb33cEpAH zU%H=I2k+hxl{Md;jQJThYLd3WXB?qjSP@w8uNsK*Y8rN=!%xDUs2Srg9Ib&&HQf+Mf{Pj%d;jp$l zlW8ptE*5Wr>#`4d*~hRhza^28zL*T-L*058%N8+TABB1$QnTmJ{4-}SLaf?6z{#e4 z?_6g@GDEA8RAo=xWh}t6GKg$G4`j%PZu@yYYVPmDck>n^U!+lpBpr{ArVL`Zka0EL zevHJV34a>@Af0QRcyxa)stEI9faxeNkvJK*di)gTur8J9T+gbueH!^d$MxOLdXOQL zxuB|u-v8$2Mub$PN;Qm672`eH9v3Gr7M{u7NMLsZ#;c}g7eM4)@+uw?2{bCqdBM-y zBLv8~Pf=pIL1-y<*%X<~!_yNz{X+&LBCVsM9xTilS9oJ~F-Dehj0Q<%6ossLX2#ML zf8VU+SEB3}4!0MHALtm_eb#hJbVahZ{A-{8cu~knQwPV!cbhFv#=X#F|G%FYFo??ka=W>?$+Um z8*2^Isi-D537S-=>rSLjBP}O+6)c?AulK#FD<};=zR2DMOq`-MOzQSa zA0~GiQ~xW%kL#J(gp=LB8q0is3yu8F8f2Do>5k@}^zG<~QOn zJQo+oG!V)3dZ;7}K)}qSE8ydjj)l5gQ_K3lT z(nb%isu(k}a3ts{fop0oPvfXp10(Mo&Fz;JAJL?eIrUy118cJ$52VPl6m*~$iUemly z8V&V3(vsaHAWUkb64#c&Pb7Hdw^7amXu{U_Skjk(9s`l#L(|pps}FIU`&TGcbOpQV zkljbpKmOpzA0k;^25cf2gBA)XFzCQ!TQ!VjdS1P{C$Slx)C_Ek!Az8%BxQZJ#`o;` zGenRRaZq(I-)5_^Jgl>Ae1(iYNLjhn^Hzk4j0+NocrIggs@Ip90{MupCQQgTEDR$ zrg`OLvLHFjWBH~|E{42ITg}%}M?-h`Wb()4s!;gRh0?zTb3Fg-&eWa1(sdcT88fKNc%s1V4g1n$XU zloas$caT7vfdh5|n{KS-^HKiEjsx@(K^BqzjxG`ziY|ATzTO>m?-tIK6AB`XBY7|S zX)-3A&jal;7Ee0{bAHW;{T4%P3;xfwWHJL6^R}qR8PpYsn<`xP@ zG^+^;Z{(03kA=_LH}_EYER^~%T_(x-0o{aphGRm6dA>#1u!?|5Jt^j%td41gNN?BE z)*J|RSbqh`83qf<6it?O+LZVEgakzX z+;RtwGj_mqMEHISJU%G}_WAA3ltggmK+q3pv>eN@vbg*Gqt`W^7T_)9zsA$~5#SL&H8(I>J8}O!pceb4 zpvoAKU6J8?_3Adw=!>m=CyE#kJ*d6toSuK$`;`CH#r|xf*2$Qb3P|Kr(Ba|!+>Ma{ zF>^@4)cHG&U1psbU%O_84cbN3Prfi-Li;O{2^$v|A44!BV8UxSKZ=B)X0&ej+UegV zgL*-Zzz5|lz*ptS(E`udsLiDrrEg_{R}GC+Ljx>Gg!)-0jqhW`NM;82S^I0!00sJ- zd4DXn`i6HYn%?6sbxurvB1|%*A{vhT?@_~Dj3b0_$?40|Ew60ASeDSn6XIYw5Uuly z{t}SGC^?p{@b?FS2(>76-#E#L!Hc|DsZC~w5q)XD?a6=p58$0G2<8yP<; z8odWyWnGFO#!|dVm_~)1(>}xV;Z{wv) zamo%|d74*9m)I~Fh6H;=1Xc2RSKEQ_@|mVLi?h_48En|IPcN|fND-S`4?71Miu#fY zdMYRLcNhH;Rw*9ye!+@-B1Fk_oFYmW7JR?h`hNS6^Q%ZsY?qjXxOVzg=R9vBs-9Y( zT(0=ak&Ey5%lxWJD+U#fc!k3Hiyco&Q~6{+Wyb>)NsU4pEMVRo87lqbsmrJvv2!h6 zrCrJv5}4$q(m{2@DMg45+as5k$Yh|49WkDI^<-biH|6W!4h1idm@mAm!E{?@%vbQ2 z3wuL{m@*p&eU%G8KGx;XcC&?GQcvUTf|<6`N(%X#wqi{QiR1{ZtoDrGd^FgYh@3*` zbmj8N4|56>16eiz0ew7AT~$pdTeLx$MiH z90P9U>gRMh3E06ZYfYD7d#~^!!RPJdG{QHLX#v;No`#E-xSkGqr7wuE1Ju*HPA(lK zF=4KyNYeLm7@e?!%8{G?8n9Ab)n#etJVr?s^QI$BzSAY1ro(C7S_*Rv9OP7xaVAq( z(058^-t7~}n@|{hxgs%VWmR|Cw=yvy=GfimZts2H`_$=QB?@8<24Qk>DbMvL#c1gm zkq8ToT`od>Q7yG~XIv;03$5-Og=MuFpnCI)8tKnQJvard-Ai|eNUG^V$bkl)eO|#4 z{+?@nBhYo`#UN47rOf5|P}J&S&>iW+{Iz3YilJPb;|ai|0bPLMCxQwAxK(?;}|q|h)L)KGMv_mt2zW>j+!qvf8|_GFxP~nr0ZW(i)$rT;!6l)LqG@`9Lk^!n72xQj*<( zbo2|6kwUf*PwTY)Ls{>%rWkzTW)mN8JeT2wrd~xP3CVB%r}&uyLDU2NZa|whk(5)R zYgoEj*MA$`!1g8j7!f=YPKVG*^TA1KcIets&)aR}PQ~Z6O-A@#gL*PW*y-F1@KM8b zSsfid{&BYb)lH36*`v~UQOtUY7Cb!bkYXfZJW8?mhJA5OKLf`@v(2>pCkdvzPZ*wG zSl7o6EGz_$COgzJeTo!9_WK)B+Tv~=x1jv>hjIlFNW+Kf#QvUhx6zh`+yGdSXIJ{4 zz!wz(R=`%H7O!jeQ33Xy$thJ{w}CWw(9u`~x3HqoIvS6g0O^x*1|}k>0SDsrsSOi< zJcy*TDlnlo4o~U&SO8@#u}FYjH@Nz?>x&MC1uZ(3BJm-t9Run9UP~$&ShTE-%5!+u zG$BOJ_Cf*c&SdY6t#E9a@ObI*6wcF(S#~q04}+SF#whTxSs11{Z{rXi>{jR)HI4O< z8z%Sk_1=Vx&&|zEO{sO6vgQO_>*liO1pF{}o`R?W`;zeUc4UE^(_S3!Y5ud%oF?FU z^Ac!wB+237?ZxJkU&x2+#8kvAiaa^`V4<|NtD=Ss7QG7-;xFCRm?0;&s4jaO)~EcG z&dgwDuS^A-$rB$Yj!k*KMRi-1W0)n=*AkqQ2N6)Tg z%X0O^0k(XrzRZk_j8(J=xlqha52BfgNi{h+IWx1Z!q<|T-Syefur+elk2h)8^smv< zsS#w1>-$T35pG)U&M20>9x@SD^LxZp^uk+yW&Ifb0yU?j1Sd3a-Ogsetel{1dK$%? zveNet<-|^VU#FB4(ix@aXS?i{Xt|DNaE6`|u!{o&RC%A(K0BfMD_us-*bB7n=m1_a z^^sTRfUUw&me%|zgkof+$uZ~+vr7b5sB8_T;v!a5zB%h*lnSqL|GnmWcIj<(DvaK> z)_5y~Ax1f=Hd?5v0V?09f!a|bV1}ek#^W)?Q%Eble9Dd4x#d-qVYavL)#R*k@y5%( zcEK~R?^gbh%=CrEC7EZZvdOeeiCxBeB2Tmr+1PA-_2?fGl8}O{Pxj zg&@foj)D@0Wbm6GQn`!;bzwWdvQit^9!4ePjrOXqGj)%yovi5dV>%qCe~SrJwc5!S z(hEW%5k&`D0q>x*+Ei-VupSo|U7Q{Tuu9tIDS&;*)e&n`0&=wFKqeq2aI(EVM1Fwt`|o`@+mLyU_h!0Huo0Ah928u zhaQbqlX?TC?V`d&V$*9hdsighmgoNbAALzRcKsJgY4^b>l}|QumzB4l5D{YkGtFUA zwD(H7L0MH&Z8G7o#@XgIE=}+a1)w8)<178JHF}|-S>0l5ZTf3ji-*+NDpfLQhaJ<; zJ00leY3*hXI+;8#MgpxNIX-<+;gcX*#pii^d||RmU@9wn7KdMqhgV>aF!qb?Yvf1P z%gGj+!@1^1|7c$+7N~CnEQO|OH(q{pZ5Cx4OziP+Gv312sJT0)A;MX) zha_IHRA5UgsnwjbwT=&D0lR`Wb{UC?h*s=*5ZYCLqMSVCOPdruZXwd+jE!7!trP{x zCWSA~nb98^h+nrwbDy{FZb27siC1Umn<2|DJpKLt?;AT&HAy=YdviDSi#PQ;5MDnc$MDlcHo+x;xPS- zl~rf9VlQ)RDebbkg@yZ7rXKLYnPX+8$%vW4yWxjlKd*-+QKIEAH%~AyfBE6asaNaI z+fq*T>n2duuiZpUzXsrqir>&M_P)PmBof}GMgEEf_oDON=bk9_#7&A)AOp)JE2o4b z{tS{b=V4=YnPE#H_O!|h0tH|I%ZuHpFR9INQ9Y0#tMX&NZevO_W7c z9Qwi1^398_Zn3)T4go>IMXm7&D{UnV zR7yf>3|6Zb^ugPKtTjZ~)20;?z<@fkk8VmR>#W=H5}x@6!7Ul&9|@IrG6e&#C(i~KuTY|lF|mxXeNNb9VKkeQ|Q{B7iYhL za1tKzClZJv{+OTFVZbWRZfe<=6FxehYu81^XjPlF8&jg1uDtL}ZLI5d!2u;f?yfT5 z->r0ERrPr9?C#Fb&%+qRz1!qgzDb5ZwlM^*yh&7 zgNMt^!W1(3dvoUzXn+mX(=IDcjl+}0aY5pZLr4gnyS_~yreaqp8wAa!G?%TmuOz=x z0(%N;KTOU|%;X|B@5blI(3^$h$Xk@eK^hxs%v{Gya^R#0_d@AdEolcNatXCm7C%Rn zJt!K*OeOW%)3cdi@cqQcf5sr(FTdu{Z?D1OvO&V+`TP7aG&D^L{W+{(PY)2Cc6JC{ zV%;MOk=s>ylYnnIP|%2duDx9m7CX5ikT?(P~i__DaWyUXJ4EH1&_U4jLN0Kwf|g9k$3kmvo*{GXkk zp6aT*tFG$(gK;1gUEZ~})#=i(2Qrv*Ap?GQcNg zvUu#4jTjiDQiVQcFSz}_vS+I|?0CvCzv|ABHsby`+q?rJwyOYXo8gBXe=1})B!kRd zCz#89Kzs+b8(~lZZnRm0fc-=e9h{){ICFsKBWi!Ur({`G(7lA}zFvwx3I zccZpS8t~YUn?G(I*mGC>>!hs6AJ}oy)m_^iim@N+?CjLh)rHtm5vxt3qAKNKaD+rH z+{Ypa%>!)=;N8+Sc{1?;T8MqvM7BfGctK)d0o4EMk4#T!>8`DHY<0#VaJ>{G;Pa}a z&!qk0X4R8JJ!(Lp>buV`{Au;B8s9H2BJT8Rofez3#hQ%xLb@)G3ywf5lW5Mec(i2d zz@y=Z6BMG2aq7?L;REOl<6kVC!D002TQgdp^8H-Y)p5q&tMQEz6a%Vq0U^lD55V{o zw-Zoioe0-y4#)vyTN3q~Li%@+t<09I+fQ@w=34>fI@ z(BOCbA;{H4ygtl!)C7SnYkz%v+~kbOoL^XY$2|D6%(4LboP*ZQJMSm*{qI}=a)CUo zhwZPPiZd^h7s_7)g0tU2En?wEKG)k7@0&0Qs&4|J;vaG-5~RM|rgH>%_%v3-*GbN4m1&B1%4D&9QHx|{ zcJ(Q(Vr`>D?G<|B_7mX&-j@kq8~8%0rC^(>i4M0@yYJ&JnxIO|gsUwWfMJHpcff?D zQrC^>o7>`wWx9k0-UXNVrb<4`6x&)DCe%38Og}#-Np%ES!17xEIIBYPzgqO5)vOi@ z1FdJk#nFx!+g`iiR4?E=8;qt#)X#ZTs@rHb{eN$nH;Ao$#p8aT@Yna*{Ucz&YBFG` zY%2HmVa+jtOBFbHJ8_sp*#D#YPnYcy%d8eGdtL!awW{)B6fuX(8v8_u?@y`rGh!FI zHvd6Nz$VBfaO?We+Vzk#e6fSL`aKm{816GO&%5bmYL{x&@M=-T)rcv^r59E0S;EEE?M$D88Yn;+Z@&d{%U4uE z@{jLfhrf)J;LFnbFVo}IGU&yFw69BHUh_%!3m5lyx@2uKo73+wU4Pt#<=I)c<`r{X zhgRN%UB{E=ao@F03;~K6JTkutwcd$?;ZueQ?roaM6sM8&f)>gOs0h~dWe}5FDxRF& z5=yGG6Z;aoL_7K%?yHy#3;$}Uv;jpSKaI+w3%Co z#WA^}o$PF?WvMCI)0*pCIv0zs!uX3$Z604Yifcdfg*OM=!5kpUoYGEq6d$laCf>)y zK1G3G`+kqVzwi52an$*j(JRJ9Kx#%|MU6c!3CYLP@rzu}(1a!^{uHPr3qtCDHbJmI zy2}5U`|2O%EUk_wTxGg1`dxUWAv6un%rK79UHXeEV(|PssPNv(UuAdVeLLvOY77Rb z7^==~`n+=i{%~gt%z1Y#kIpik#;8S_*k$U@5b?OmO=)@S}Oz#ETBiT zuR6gLiy)1*w)G4|BFa^n4{6ljg`rkJRJ!=&rm^$D9Vyz$*UhB>6h-)(|0o>p{@<9o zYsvCwetQR>?(w)UYVaE%POb9EJETAp=Jye5(3O14P{T{)l!GbWNBLh@M+pQ|w^wwU zvehBktCoEb_36MZgvVvg+9o`yx>i;P4`@~(hKmZz&G2t;Eo;a97Qii8T~}`X_Wa{% z7&Di1ot}>`+2JpnH@0Fn{52mN{95bnsf`*)+RlKdp_+$1Ad%!hs_2VY@epQUn}E6P z-;p0D71#VzI}Vdfs~$9P2r`k)S^PLXH|D>682#qspfYn^9n6mY6xT+7_8+Qd1Z~DE zYGMVcqvQV@LL^toedRSjxckX-%N%@!2WaDPV+UI1I<3u3hPx4M_{t^?sd%X4BiaFo>a$3oSuojC! zNg#sXg7n|yy`(NO4j%z-4h4I2F?Dfl)~4Ix06MF+=YFPpUM+QOB$deU6Cw-k!R)S| z9i;$bGw#>#1b);|VcITBn;igvNnZF<_z8()N<4XcN5<(@=;7ryDd?};66=LCZ#X9M zyZ**}U%Z9OCJHt^dnE5dDZqZcvZ^vlJ)Ojz!xS~{vBW6L$ON0`qkrdLdkI8q1-2Fq z#Oq1dz!E z9c-fiZ?NfHwcE+D)@2zL8IwcS&?rB(9gQVSPbd|H$3(+k?>OJ^hy?&(#6km9MLm^; zIR)eXS&nx#YnbnnvFuIn#sAH^<_A1SW8`<19pw_u>sthUkp!IobXPO+7A||Y zF*b=%#J(U}BAS1`QykaF7cHVvvcHi=CO3KXZh9!U5e|W!O4Euy$RI356W@e#a1;)n zK=)&2P@1Ceq=wBHMi!>$-Q_x~8wOTdkK$btIgHV0<-h`xwK-Rk5Qhm2o#Y1A%p)Zt zO@bi;bkI=D2gi+0ZqfvlMlqy+4@B*47I-dKCommt2jZKLG9e^|pl6K$ElNh<)i?1< z-;gSDSi`|2_B48M_%hvAvxhoV57bzL%aGDV+sRePMuuIBn?*ls_VHpJt06_mrjKpX?XwvZ4 zAPLM0tftzHK99Gi4`K5g^^+XV?uU&lfl79nIvK!SEVg)fBzC%#2}p%p;+Q-PQ8j$! zQy=IGhUHTl81oMr`Vvdgnl@GmoeIdjR>Y2hy4{&Qu_*Up|kH` zCuU38t_lRd3808vUYnY8^YFB`wN1E4l#ewk%E$cYJFKrv7a((K0jCIFUj*rGzRu}Wi>Jx<$=g#wo2rzewe`8EgEaRstLf<`hQ?55cZPK8HYxW>S?M+b)f4ZtJS1R-!{zc& z%B><=#;dj^$5LtzjRt8Y+AIOa0{%~O^0eWfYUde>L5|-fbE#I%L_W9 z{;TU^x9JW3YI80!c6&G8bb>QP-ERhnW3C%h_aYHyhL~ zo%YnFhiAZ2QJ4gWL937(5sF^Ag6L#y;~Q0$7DmXrt(~0mx6tVZ`|^18;0VW6RP)De z9%0gj6|2R_RSXUDzcW)?TfMhaU)q-Cbe(-F>_25jkxFvOYI>6OUn$5=>q5 zpOZA}`mm(&Mf6a;jLLKvCEGs?T3Co7Vcy-BrMoIzp>Et-BEk)X>OXv6zg&spAH%lw z0OY|tVC2itcQH2`?g(W2w5m*3GdM+l{FRCW;fPI}-IBk=3N9`1U<3f2vmb;0BF?{@ zZ+mojGk7D98L@KCK62+F`tA~*CmmnTGA(iS%WM(;g-OJtE@ka@T3jYki!p087ku~x z74r5&)gVcw&JCDbtgEJ|2s`8cyUa?0->y+Y*!4NoDXw-b`F9U?94!8*rP*xb6nuzz z6`+85;Ac}4lV>(qsPc;Exi~b|5mmky(%THK07}y`|7!$PE`1Q$ z+ge;m2$HYejxpy=Q(Y*gujeD$aQN}fzrE)>qZ|%W=l;7)Q)Wt;x#8I9bGWWS$Z5(y zxs+(ou}2KgzEuC!ol5oCTL%8;NFikyE>>fCX16`F*c+M90_4jac&;2g*o8=V%q|uq zbFiIHu}`9aV-1Yl7e%Z_l@i@op@2>eN-PH8WNp8Hv?nYu8$*WHusMImh;>orDQQ?b zaJsFc_OI_2gN1ZGy~imdLu?=o{#{T zowXvbk7P1)vrl1j0nwpEYi%L(1pmx>_-nI($Jogzf#fAO+l*~HnOUit`E@?|AK5;= z@4+WTF$b09FSwIbA{o-6PfZn#o$5U92cP(k3pQu;^-D@twFfiVHhBjL4x14ODO8|( zUfEiupqUW9k+uKwWSS6j3P%(=iH-_2z%gM%25mO3EGIW&c0D8y#S=}mssIb@4wppY zY2A`La`i?hdcD3?X2epLTZc6y$$K_&CY8_n0~HaJ5DOTjKYg*+DcZuB=+E zBt)_vYCroe@+(CiLJ_WKmbSDGa=!k8VM7uSU-8@PF}-fPZ_oXj_$F8BN70BzDw=(W}I8?auYMyqd59t%`MfkV_^%JcGyDqqY^M|CaJRS81JmA9=&3 zJWLnHvfcNU!R|73XoO=yt#i2XxYZ8D9uk5%Ox9Uj+MHEiJLNWtjpF{r|E58=DCBRe z2abfF&@WOX*5LOo4&81D+@i)0K8LXnaoPkNSNF$Hmf@$tlXjJp=U#Ww&-}9GiZTpT zZpUV}B_HUX_tNvXKRi2CcW*IYv`&`!hl%{HX(r?)U&277Ylp3Xb;AW4@oAwpPHG0V zHs9yOM}7}g=ZH-4ew17_lZi7gufjW*ltTo>0|rPotQNzd0W;Oa%n}Gt%#??HiLxn% z8S}asTJcstd973xGH}HZ!_8?q@O5BSo+WV8FaYFy=^N1R_cGM;rNoP#%yNYxNFdI* z-;a$roLvM&{YS--N0ZmYYQOI)?ml$zql7fE!fnc(9Sd|~&K(Z9d9f>fMq}XtdgxBL z&Qln|O;%uH^Qk3J9+{&=X z85(aKWtEBvGP7Zl{I1P~Pb)8oTsJSlg<8qgU=Gr+5Tiy$_>%VY2|3=S6NfewFjX?m z+Iw8kyU`rDh2F{Yugjwlah8D_MG{@^Y@6$NTA#C{yL&}f!kqq!YVG4k#l~P}#yfqE zH3>I7RenTzW$ptbL;erH1kWH%osAu?171M%LNT#nmEY_q=Xv-(RSads%@Lv^6D(|$i)Fzyw20N^D~Cwy@3|hn_g!DYK#gCkZy|xi;zYcUXzp5RPs}1rEqb`ihxmBRB*C z(cnasK!l}3*)!7Mji#R6pX1gHUuWk^lfKI!V!Tg@<$uKW#3zUgUsaEf8;bp~1nAxFVIsZHDHABS%OMFXWg1^Dg^iPC+Befkw>Q0Chdrj8 z;n&Z)%%G@rllc;Lainzc(}0xuU=F2>S*nRAT&Wj(w6p5y$MPR|WVD>wWt0gg8MkD< zsj;h*0osH+j|j(&B?DQ9uJ3=G)>}g(q$HcB%yOOM369LT%@u{CJK8lfC857HwVc;NTw4X9 z!NXqYBEZ@-;H&$ytmC7xVUXjW@l9sGFRPaowX>hGjb`yIFmp@=nzNSgU;Jy$crX1RA2_^Fr9{z*yE?#8zy*I5TP2e8q4N#FMAXgyaNO0 zJr*lFH*zrxrpl1q-*ex(o;6qgn@2*9evDWsNPS@j~kf}SAK@mS}6Za*c`np*&kUc;j1iG zz2mE-57KU7IfJ)9Y zQQF753}_i_2ZXZ#lpk?1`Fd_h>ipCE9deBB>5Pmx-Y9bYY^jAZz+w4jMvomCOKCT} zxLSd?y8&;*p4X0@&wN~z)PIq1eY^xagp_l;VQ`hBtEWfXOdpkYu zP4P^DMbOnY8s8;AbI%st_h9uz_B`(Oh0=LrV{sJ)ExIy|js|P4mfqvQRaEi%MX0zx z($;wIyVBu8hPa}vg@$k6iv3F1zf|mg1=gvZ=t93AH;mZ_PRgo~e=ubdb?uYZD(=4T zm#SfUf+}H}@-o+yP{dMlP5mEmZi7|)o(%KW>iJ>GODfBM zrF_=6aG$2J&2;~c4$H6>+*5Mp`O$y9?DfxPU3CRP6%n2hu!tzjX<=jGb`eJDaJ>yl zw&OX48Awqkay-)~&j<`_5ha%HI0X-zNv5*27uDAz%E*gplxc-`@G{`o>y);+5xOJi z5T`Pu%f~|Kwa5WU*3(&Itd`W#sdw-d__S{^U6Z0S#F`mlJLn>8R7RJNnrAJFP^caa&e=AzDZe0mH|3(S) zJF;xE3ut{-tNEXeFzJ1}=u)9E+D1`ppD2ao{6EudQCdr&cQ- z)_@C28`M(&vkYh1JuVGuOues2n0g&=OLsiSs4;MdbWS!`#wRIQt1piQn@>xD`#MCO zcjtp%&83X*7j)tpVi`&chyw4e7UqO&JZF_01%KtLB1>W?Cr({88YueQj?*I{)h$cl ztEI`+%0nk6qlTecQNz*aqU3=wEM`)Ed_-_607p(H&Gsd0z%gg_lb!+kCN(0t2BA{#X9d^OCctV_u+U0p zdmnNd6e#p*)bItZddCvpoEa(Mjqj?PlB1BGiALbPqfp0W6rS9Q4l3=!NJfME2)0}= z#ch{Fc)8kJ07iE zDOURlb~-J-@iXLB)|B28ohX`%3z`GQC4b0mYnAJLakXkG^@;^?vMmb*zR+DV57Xr8 zR$>pDjXHW0Dc^ORiajgA7Cls7>X_GNL>Z*G%4+`XWzKRMS>n3os(N*qETe^=xvO8Z zyD3t)1I6VVMl1tGT9>gVozP*ZGV9YcYtQe2B1k;&pUb?CmaK}}nCtAK?YRJ}^F7We zhBdnZLa{yERXEobT5YD*YHDCJP1`uczw`<+!zwVCybEaB8r6bXtKFtyJvovg9`ouw zl}aM5#WjZqJjGKW_B>IxDT@(A@w-c3+NlSq6fSt*W*U0yUL>S+Iu`&gRkAn=D6gaH zly_sg6AI{;vGBVPtm1J%!V^rbsZF=TRFA(bl}CvYNW=mNKoc?j!j+kkVFh&>t!+Mb z#e0ufUcUYmeRT9GeeU^hU3d)@;F&UE*RH3)#$24LtbWT&KQvm%5x}iw3a_-|mmz4n z$)OzD$;fj$>U7TZS~f=b-gpC)=?ZqaDEaAfMK{MOzVGzOce|Uh5vqm(U+ttUKDLJ+ z;38u=V}UL&2WpInDfUu>4y8}oUJpF4T9SEts90KgB3s$B<*nXqrWwtMD*TN}-`-El zu`;Q(NFO9XYP?@ETT25y?-;`_t8NodJm@uEz`a`qaoeoqGe z-LG7z3NU2X-}ngX_%1EOsF^u|4t7<`YI2P) z4mHkX*lDG$SG{t=-PM%&FhXZY^Hxk+O{b4bcv|ZZlewQojt|#=x^Ef6Jj=tGOhTtH zrskO<)f{5im&Ji367W3OFbCxF`zdg7ZR?QR>y)?zIj>4hp__`GF=L2|yQyn|Ko^-8 z{x+9uod+^zH$qtc1S~mU{a*hj+F^5FDZ}u;km|*c0&@AH5(C2w!kJf!?=;;oDPb_S z@I+vwqd++bts=qjRif225LW#qfFU!^h8F*DFt$`ye<$oVqf>_CE0~6;c%|1P@#_<< zHezOQ=qf6b>mg-UaE=QY_M`XaSV2G%72GDR9zDYc_obb^GS7q$`cX;4Sz$-lA2hoy z_ZHenTvSuM9h5jWKw~Y)@GEAY>_yo@+A-mpzk-)1AfuoY;pc#*>rVlfWpB>rL+=^@ zP({Sb+kBc7%Gjj;wFVI}7w^@jXjuVSga2DjOeo_7Y#*gE-YN!wIXOe@YRrG@+ZLIF zv9YP(s8Z4RN9HCD-t9_Bj=`w|MiiB2;oU@Ks9Wp{WT?d1Np$8)2}bC`7O4tHsRI#m z9&H7j=14Ak6pc1tmlVV%Oei{%^rjF3>uP;3gLXH5EMqp@G9^rkLk>+H0j_!aA1IEH zTx_%Erz#F|NjV8lZw08j$cD?8HWVI5pU!8c+JDi>OS=G%V>qcR+Ho<1|NpZ9V5178 zVD57{M-Hv2zP!0C%mxj;uBy`rZ|_Tf9gss~2#ZO9(fR;V3DHhm)eO){_gwLu0k>A5 zU8|L>HEk4bvIrN*0W0Ra`XPp6QX{MuwP`i(Auz}FKyE3Z zK$C0^iL$WD=)?ufJ&3kE$!f?kAVRGq2}ji~Vu^rphhnVNeDRN20m{CBk;O8H7h{mJ zd|uw~cp-!AWzLpfj&4v3rYS;6)rmi6g23;q!$~jh1ddwj6WSD{)OwY~!4R%A zoP842(PP@NPpK~A;_<}N-bXHGbip*?Tyn6G5U~<-G53{LOF&{1PRiZSd0Cn*p@WK? z!JkYj5UBIk2WMtm4UF?fs8B|84OX9m00_+qIj_mQW)B==p4P4O?XILkL`>nhmz5;N z0n&~>*CS%TU%%IAH~1RxjmI>505kOirQ8)Pw+Su*nAr_?)>CbhEOkZ9J5ZKCH-278 zcI!FTF~j3mit=7SodqI=sU0raj#QTp)&V0TC2kG>S-y|Ya6hFlHela$G#+p;F^<6h zH*rGOLbXp0hMs;Cq?5lX|HNjwg|#AFMaBjgUS9u(ZqQ_LvfUR0e7542N7odFTUh=% zW25$Xms>h1^wOs;bjiNI;#sRftH4@{3r+670X^PvItx_W_tDhXXidFRSS7YXwbcH6 z#8Jt9iMZ;#x-A#&ur#~BAmmB-bAH?F!kd`2#9Anng=9~jWco2%QhXw%u6Rv04w0RK zgFUKBV*m=SX*bpb5I&wiPt*5QW@onnIA7ubSVZ|)I_LQL(NJAFu8h}ytGK>GVYTHB zQJq=n3_A)_03l*SgAt*7+xU&!^1BZPz)Qt+-otGEof&B&(_n4NlO&p`-zPt5i2;;C*` zq6#8#h&Xw+ax~kj=@t=e6Xyv-a~&xscYvvg!Dsb`Y*?WjJE1<=C~uKR!@?nEmb}P zfi!n@lBJOE>qQ@Pzv&0)@~r)s-g3Sy{oD)SDX=^WBkM*BvMwO)JY49o0j2)@3Mg?8 znRhO(OKmGV&sC1fjPkNKV$}cht=^!hN$J+hW!R}d?cH@5dIi`H;qN@Qe#`5^=<5E# z2WXk0BG<4x|Jt6*Mcl=aje)&}PtAW0hK<4^rPN(Wb?~^}rACZGLn-!pyt@<=$eS;QWG(J$&SdifE&dm~d(oS-RyP)0wX!B_tqF&vk2J)& zr$2J%mdupbwvLaT#Bq)v#NRW_>~6$R5>H|>d1II!LfGx%KVFiIn10&3`MrKGZWYmg zblJJBe3p+%4KNbmfHp$JU(-VB6^00QN-RrM+0cB1(*`BGD8zO>N&!ND;B)JGZ9EP{ za(CJ|SwQO|_TemJ#|>w>ve@*{;gk8>$2gN)ageH_RC-ZA%`taF2se>1lQbsfJ7nOC z==EQ6+NNrKNdQ8_LS!OOt>0>&e$0NMvLCBLPyS#q+~xKy?38+vl6-qz^dyz_<&SWB zt7q3L?u5o2MZ9E1avoF~?9scpVglY-lKJvew`X;iJGp!pdv(#Aq zNCu#wOrl1iFs5XM8gA6~GmO-B%~!0BUOHRnESVC$Ud+VOFFDtGeClw_ef+T{BuElU zb)k|}1h7+wGoR#GXmJyueKJ^*E7QBVdel>U*EhrW2sYf6?3)7%JI)-wwPo^Dq;%CV zIz!Yo4+uKPbok{aA8j?#av3A^c^u|VPF+xpEaG84?7Amx4GtK8SI{``cgZS|UoM#J zI&(uV@NdfkR|F&#piF-pX5FJm%@8Hn7|3tFuaB92?vDVW*UDbTUA3NxUj@8j5Ii!w zg_U4UH#APpx8&GI%2!iMKF{(h{E*9xs;t6a%NUgH3d`FtfmF*q%S~*SPP)--sB9(Q zeH=dfb9%lPajvRtnGS{ZOjL#UNBnE;C+$CUhmg-@3R%*^J9Yj9zHP|JF zT4^WfeE5DxC6jz74c2C|zOjhqjZCdE`&5l@ADId_JVMh;J&!z>EQI`hF&pz=YYg5FY7JduB$dHFsK9}k~1K#OXdn&t`V z+-83$CG=OW-3*STNV=Pl{2>E%kS(E;PwLSMW$JhJZR>eA<{db#u1#*JRHc7+!xW)a z-#JHs#y8OW>2R)zL$G7=`}hnk6syYUW&(%ACCE zraKavU+-CNnV!$Iu%TANZom9UWjKH3*Pk|aqB}N6^qdKNzi<=&2qFE2NeobwPji$O zOE#6F2~aB%rz!b_<~k+stftpeD;gv{0^KFA@l~Jyo*@x^xDpiP(;Q7&8m*RSu0|Z3 zMkt&m@@cTkfaj|Cr~Rs`nB?olErzkv_R5;$Uoav}mlN>w2(&C~4c$v8NX&$!45sGqf&zAeRAZs>{{ne>L4-q677?%#H@#!p6IzHup z0jH?%jMr;b43(4U0+n>dRC1NKr^Y#4nlKY(70+|ox?3_|{8$LjW~`6ta6cs-cJ0+% z1{@&IU&bYh{_T9cxLy82fId-(cxmLAI_1vf<{-)dqe)>=Ql}t>n@pbVC4n1{T7zK2 zdDd2?yIANFz(k0a%Z_G-(>xPtod~kA#Vuj5)y>dp(Lh2@NoBZLEx*n`9g%-jOxzfs zX%<_}UKDR=8y0c-bthoyUB_I3Qki;xEqNGl);8_n0Q7oO58SlkdP3RlVvz6Yd$*q8P8xhaU5UT1V(if$^Y`0MM8K`@&n0$lvd;?p0D& z(m9${Z%;?0ui3rYeFPJ?M&g&!8h?QnTiGPUX)CES%K*Da#M5hVfrYgQvpY-)2=d}8 zuA0R@od5}#g(x=^FFq`+Xd@`s`7%wrK|)Fh6to@Ji>@%L5HKllZETr0@@VSPc>t4s zIClxWxM2Sg z@_|7K_ay0?wJuGG4Yxmak^zI8WA09X%8vMyc-fj!D*HWezP^tlXH<{REte)2mCeF2 z@_ydBom*DCtfy(F@Vr)0+N%Mn!qmCucK(j3pLunVLw>>_R7W9w;}+UuR_C~gHex~% zmo30tdb?ct5!Yw8n!+@Qg>~vYPCSSrKBL$DyYPUKwA`)Qrnra!OVc!aW?`x!Gnake zXPWq%1w#BUxKZ~kNhQ6sAoUe}L~K}c*_XrXp&Fz1pQOptY3=0v>&j||F2_9&Tc6+_6ud?KV~X4D}yiWt6~-%#bE8$K2nlA0-bBq9eVR|u~X z(6<(ilg`5w3i+FUU3yD>dx4|wQzt$W*O z`ul@?yn1OoX(ia#U*q`hTdn#By`JN=rX|PUuJ`@_rRkT$2Ntjpawa>DEa;`V>5|4A zQi}SxB{3C`(#WA;DWbN78rt!=0J4%*u=T%14WIg1{U3aZ7g1>`76tg-znW^7(Cg+) zJFRp~Mo^jJfG;H_s)QBz_2(vZ+J}`|ks_fBr)zvl4MT5kn>r|K2~WP5V&xE`85LzCY2z$ z@z!xYrSk8Z?+KuReWE{Qy%+bGe8g{_4jX%xz2=uof%h7cqizt=N(s=|-prDW%v9#m z9H+hHzna7+Lz(xY1cH_OZ>UeVzU(0(Sr%8NR2iMWX3fy5>3{r{P2mSUa^t z6`@$`n*q8HVTYg)$0fzozAlIM3S(rZlVq#4H>aXBQE7~aU3_&u+MQ-KG{8fy`WIIT zL_1eI9EW!h@+RlJgW)iaFG>zXvLXSil&;W>Eot_*4PA%6h+u zH?gdKI_C%*sz8ohEtY5u*D?1rtHTIZWnn5ZrD>DXloG(lET}M*6Gp^=LPEkK2*agx zshvg}bpDmfn?(ikfBG&-yrifYtl4N*_uF9ChlcL#;$CX&%;zzf@lx;Q$^8GyJF)3b z?oxIZp7p5|<_8_s>%Ed75m=)4=3qFunc|8S3;|o(A#eYP6ELjai7F zq`HLUcg7Mr=8UCWl`pajDvIt8MdE4vD`>Lq{{1H<0qSXM^$FJ>TI2j65^0!0BmQU& zciSplGvk9yB^Z>5@S^_AcJ?sw08|)M7&MqzqbBW;(k+{|O9NiSLLk+3{6=Y+yCloK zfYNs?vGFf6{9|TJVI#>A>U~<*I@Z#wI1$Ckg|PGBJt9IQP;B4|fHf8eWsrSlGJfAF`{Hy`#HO88gMFvY8l z=l{LoYT2E|$x=pbhO=D!GTfkIP0*vW-U)#5bhKPI{JNpT=G=1kHqZoKNSddU?8dw9)m(Ugcv7jrYj}c#03V9q z6vi=woFTez&F0(6y6|b}sOQ|?YIm@WT!iBBp(^UseUXU(w&#oGG>Bisxob_tv4wNL zTEF1g*UWAhxO%*lhn$AX>F>&-+}8R2NeOHGj3tcX(A`lfkNi+cgvM^OBWgaL<_F&V zj5L4P1~?V2&bDqOAge0x%c^|1Jgh28hQz6H#D9UPBxgdydc4{5sH?hfRY3V+N?il_ zrI)NN7#zN|pExvvCle2-_61aC=;Q z`BpyWqDF(oj%+4-P$~5!XB(S*UNWkEl1J42VCc*IOUh~eV~pj?Mwd_^iIOgdzG`@~ z+(N?qFLmI|Y*j>bqqNv)$J?cPUHe|`v}o_kYo*HXaS>I`BBCO(s^>u}biPdXVM5P( zTwHflCa#*0CM*gtc~B(1PFz?OS40ro@dZ4#fV=;Ph% zhk3t#*Q~pjjQ!A#`1ta-jh%p{#wcjv=v9qgt9#!&fN<8{lQ&;Yq!r; z)u!LgNn6AGsRQ$y@vxfq1hK{2Exq3rtK+sYW4R}m(e@HPsfUiJ_k1v#z0#Mjv|@Kl zv{r58R$|MA^=P;NByv?5DRQ!3`eEdEk3sFeBk0_D!BQ zSNNueF4B5>hEagW^`6at&xbBRLgMW>iNobkbsn0ue47+V zkEFGoC#ywTUp?4l3Z;o1?0$G7T1Nuv+XXari~veGuMUL`zn`iHKF1S(eqrfa8n>ev z1$en6eR{h&-wmzzKAm>h6=w|ij0w}L)CYaZ>bGJ2H&~sR2R3I_j2SE@HUs{OWQ-yO zprn>}Ifl*=H5eFCns3AgE!Zk_wvbxj1bx@ za(UBbeOmNBe z&doV87s_SK^h1K7G!`u1{7A&F($Iu#Un(T%e<76^gt|DSJtLmCNIU|q4`u=cTk6Zd zNUyIJXJ4(U-ENbiAKzmFz?@8+MfE>PI-V8C40>M@w6eqRPqeObozEeCd>o`P%7`{j z=^B5U@X>0_rL5zPe^kBw4Q6!gIViGSdaDqK`d53i;R~yx!r;rK830<(;l&!7vlYRu z_bjST?;YvC_S6~Ph5WE>t$ZriAt_JtC^jtx?z_rsj&H`&A$X(IxF$v!B8qhrhZuj@ zjWxA`;m>a0j=#3hG}IfcdRVrN1xmoPW&0ws#d*I8_!^RB=BL_9yLH;57kVs}Te3?f zB?QT_5j5zCsQ6>c+_ft3=q+o*rRheoV#bsDGtD}mX<3rN~LChR1j zgrNpN;|iDt#iZG(qd@Sd_@_lq(o3Quh&;x8;Z`~pkSp+JfApRq6ca@R@_n6Fm}deJ zSQqiT+<%x}Zuel$=CT}i2Ep6{5DArol_6Z-fb3p*8irWH1@nby!il|Z%iU&o;>x?9 z|7yV;L^%tGKUT>AX)J+UOv3pr%I&*(c|?^83exhx2#C1w8vVU~3~hcyckD+c@R4&`($~GF@J~XDkZ%ZRT@2^MgCw(+#<>Hq_tsP(>*RNh>pHTpnU$Yfe} z((AV&8v%o3oQqd|tgakufl*81ft~WF!kGS zPDJ5rZvL5NjCUkk-1V7dNiyW(BAY~_%W{}CzKb@p`m(e^p9RH5uJI93@A1rrQ8{5FmRU{m6%F8~^P75Q#+Y1(p-JT#*L77XT^6lyZ7u%OjO zpz^Ge@DQS`l5!A|DNS#$*JFxkV5}i zOfr)9g%L8Lw{RlSwehu$L{oYAFUqwQGf-l-hEBxA1@|nZ7AfEmB^{lN*&2%j>=H;fVV8=~<7CXidY^0Dsq$!_fM6k*wLT&PFGr6Fp@V^C>na;Wl#&V{K)lpGwV|W` zyf_6O^D%^lR}GqFC2W>VyriOF!+;?-Gq@;D@aL4m2p$cA9ZY2r_)3YDF@La4ks433 zFcxxn7UT25+FnM!vKvo)%%A*%4L{LK0|&NAm9xUHjCmRL3OWCP={WYl*-=gTUDBJ! zRZ6u>y5dPL@@kLJ!)~u5%z=wMoY{F1r3Fz#VtQXU5%TLns8~+vJ%sNn727hFVhNGX zu)@W68LfnttoP;_FPQxK04E0FGf!-KFn8eV|D)*}M{B zv2EK)W7}vN+ezbR|Mx!k&A$Jg&&=%1cg~sfPNk6guh;mK8kD>nF<%b%8)TPahfAM# zptK#t>CbV5lE$0wR4(Bhmu&CSB4@-oa%5;G0}rdFPXFq`li^Ol_`_;Gq2*eD=?os_ z2tR9ZdtYvY%h#Mjw4o5Dk`8a$p-IDrG%v3WOaPlQAtwK3`M!~H-&2hlWitNScoO~{ z=zQe#tB-oAGE9#%)PVc}h+Z)I8za!$+~GXP;2(!Vu#a71RsMK435mb2zB4R9JP05P zC}|P@`9%f1DK`*KZLTimz+_?&D#(cgmBAFtxZr$rO(}MKzT;!|bX|0dOB9DC(M_@Y zCjpT+drjJE&<3Hq*?cGVqxbbR?tal6C`Q={A!Y=E6y{-dH zw(MHSs_PY#-Y@oh2<0LLuizWbEsKFSH_<9fs>}(FaV^7vZkvMZRrq>>Ixo$LR7Nf z);=N$-@#J3is*5Bb+?PSq>x(_~d3!^6cVsXvIA7nnAuea~6fDS@cs1 z1hICd6PbnS2JwbnWa^G8=HD=4G#L%ni4W1m)}ifPO-TgN{Rfv5N(PG}p=y;pWeJ`v z=oE@bfm(6LO-O6G&$?APHkec+JLeD&_yM)QnsnQIv`DLwT+>b?7aqS!&H0U6FH<^< zgF-M0X`KY}!AUh`cMXk=)Oxd7)7Hn_eC9su7hH{r;A#SFjRKxzFPw zsKgoL1h^}LvKK10a{V3|UI&9l3HQ7G250?i@Mz%cpXBG>LnIpC+&V7n7Dfez3}2?? z+QZnlEs?)WWyFDNZ+SkS(Vk5%2U*Gw?KB`B&Tv;K?W`$81zgO0fi5(g2Z3dtE`|aXxiA$)Kj+BNOpezkO5obzjI$Tg$Ql94`t#n`hxr_Q$AvOt_3?no6BX6vV=| zXLoxwyV-nS+v=Wtyqsq(?_|Xf&fH;H%+O``qukOE}#NKM(U* zQS$6it0$%nYOK@X>wSHF3x5u+B*tYyYkk?CO2Axuk%PO=7^Dxo`b-*(<2|;M(|=!Q`SoMUVd|v7Tiuk)D9)-4|7Yt!ygLUS3kKpO#R-MD8*Y z9-z>>A|Y7%AIcG9Sdt72IG6B^k44kk*KX{j4C9&!tZ^g}qo426b$rFShg^$TCrd!X zDdO*>Lww4Dy!+EM>~QreLt4+6_3Q~rc#|8FiAz;cNr#A8jP+9J3aT``z!3Z+C#yd= zscX1fyugwISqEXDvG7sIQDUrc`UTe;;p^a88N>e!y(~;7!{1*@gO{I0o)%&9+MoY? zC_S{31Vji>ReIxLaZT>;oIeTub255cvCj4DUd9*0%bK9oJmSt&E2-3lRaE7)v35scv%FoG*uZ+d?RLyQY$4ky<4wvJ({fGcSyBr!sSavpOT}nNEHGlBc>>rUb;C zNi;pjg)588wNAltIGu)z0J2jwS7`URP?Z)?o|X#cjG}kvmr!|9)uynh;1SWzz%v~S zdNnwyM2O19X^n;nX#EK3L-d9*GM7V)q-gbWqmpzaN)2$^fnfDU%F-!OutNgT7u(|K zX+Ti+?dp}=NhPSq1aTP^ZYrIHUH(cg6JRRn2KpZrNIZ$40r<=(^m`)<6=+ra>qKzaoxW(!zEliI~pO7H)UEVjI#CQ&bsY1cSVI5qi?^JkCm+@ww-4 z+j)P_{;;llASzA`1L;xzHq=JgsvE}G9r)Z!4l2T1p zFjHZuO&HyB24#ns(0tc&=};M_OU|hF)f84*x3GS0a( zsx4ygxQ@D8RuZ_h@GwGv&og@Y17*xt3)uAX;|ODv`F@)WfM3(Z`ja?JbtMJNedZZ ze)$uL+_8Xs1ENr<{bKJL9Pms%wRSBOMTnOso?qOdaVu12Xh3_OOXHOAZy3&mfgOM= z{?zh6e~jh~sosT102kWsL)l5;!XySLfI5##&cUr3H=l~HubfY1G-IX~XPOFWqJ5~g z$gvuGs;rtcR9Gy;FpmC|zUx>d-88Ax4Jq%Pc8tzkDqakXV#T6@e^kg@Vw+HARTQ}F zPb*Qi)EdfmjEGwfIah=vld5nu7tFV zG8_4=P;C;VMxEd7ad)CjAFZV^Ed%k@Vzq=?rh)8*A4dd+V*RAVq^a>5rU04n7FtWRuVI#J94<&^Hcz z=7|A-d18a7o9V4AR=2)qz#EXKih|hAUPD;ded`YUv(w^Swz_wEa!7IE*>S=DT@do zlk7cUB2nwzl5!pj6)_Q0P}7G^`1sp$jU*9YEDjutk~gj9tPrzeOh}8n;#=q*|7V2J zDNoL{Rd3m?w!ryqvTxyyQKXs-L_jRcSA#>piaD~7kR%tU7#%R*c~kEBn<^mk{0+Eq z;|f%$EHi=8sP|mAOk-aMLwtG9fH87?V#L#s%0Y_Fc-EdK?$4%5#?i%sBi6A2<#5A0KJ*q?n_Kpi5*TJ z?kkLwNduf&?UROwD#c{-hXZwpTt=bKHli2`g(8QP7z(?GMVQswcux&OtcFvK&A0$m z511K)jYg~{Xb-T4wp`s;?R}GM%>Q3WNXzcA84Pn2{X^V+lujNz!6pqY&1j7jlUZ^n z-_aY^8l>n3VK^YyhT4kEho%iCj?&0cc6~(#F-BR{93WfJDh7~U`ggxTWu5c!gdU3p zx!1g26rq^*8=6|0VyEQfO6F^$Yb{Mju7#s%FM}%e*`p4VGE86Xn?3$+%ODULr`#C!~`qr*>FV&t#{bI*zZ7<~G3kFq=T0mrd>V`PB{ zNOWn|L`4IH2S1%R)WoYvWqtK*gpIeCv!O}IL+n#h=CU)o=FxQQLDh#92HQkIIaZgK#$%qSK1b0Q?sm+f zHIkro2@gP&ufwEM$2Dr zRTrsM3WBM&zlO^sqtqZFk-A#uKEl9 z&CLvl1LR7B;=<>E8vB$8#{^d)KC*cmWwQzpWAI&q$0cyE`eTP+mdD*jJBl-|L3pGt zr>AXpPT}H4JnYxU)mQivTyaNx_NW@vs}`kMM=e!Ar3sjoly5@$W0J_}X;Cfq77Rc< zUQ!NE|LmarM2CBUyanH;HyIvpvWCibla!9wEh8C~aRMCzRaFo4H0k_UxeEbap$-lg zM0VAAevYR5^A_Gd@jtIAWgkF-xKOo6Kuc` za*d?3g{WJ**LHS*f9#w*9yu;v4mMPd1*Z)``h%?!R!Rw@iZ07QwQM8!9gUFNfo6zb z$jkV-%xgStNAg8AQ(Io}Qcd{L1K%T*G>m+Dtfi-_`(0C)6T@QyA zHFZk~Q2k?%ZJ`T?`ebCSw$7J`9HJ0$kP}^_-_Gw7wpF-BE1IFq-6q3c=l-lL&v&>D zJHXxp#0LSb-~y*@9$N~S;&d9t4Z&T8b=P_ObEJZxhQ$KZ@Xnk|bq5mOvNxz=Cn3$N z(a`}a`xPa_vEi1F#UWMo>WmE4BB|015WygA*p_9$VO1IHwtaDa?mA-ldsR6O?h zphdnXwjbNsFCedjWEeO!J>>$ZI|8tR;ZsMSj(M}+;&MZ-Y^l_i!5R|~qLqr&qIZ6| zLTB;=f&k2^CO0hHgyLkazc=I+YEg3T=~-p)?s)902YO2$iVD%TqJTu)BUL{vIloTw zO!$L5E_mh0fwSdb5CDm%O6{IhHkL#2<>OkyQ2gim=?sNQ-0^s-U7}wWr*=8rouHn| zue5f(Uy91?zXC&K>O51XoM)uNoILm4qCAkYNk6p`q7q}tO#-hUO-?UAay>`?mOj}2 zbgFGy|JIH;mXy|QNFL8|DVY|SAuqG!{rz-yR?oXRu3?aLi4F!h1oK?fD0H{*H~BIm zOpIX#z(s)Nul8+)nc@#?0YpfN%xojO6?n(%D7tJ zo~ys~WRg|uoe$l0TYjS~Z>z|yGT<30TMm#MuI&2jHgJXV_k^skSbDx93?|l>AJr|3 zXk)K5v)SzJnbECeL0Dr_+{^=ljdHcfJdQ@Ue<0kJnE6dne;ofML3-p#@x)t6XQ*k2 z*!h5NHsVoP5|_EOx3Nt!Zxv3t&OuuS@rf6hWXw!_6h$A-3qDOZsE^6e73YaJZ2t_C z5Z+yZCZ#UuP|1fuw?3-*iPP8E8T%%-5>v4JqkD;c$x4IDNAPQG!^J#-SB0!2A|`L7 z1nYpD`7wRx+VR(CDux!WFj3noyb9~Qj$GE%lm`*nHZt}N@KOiorI@>xVh?Ca(gxRQ z5>ZG(Jh%eR@kCS+VZD-%_y)Z3N7aj*_ezakb%xTB2l=Fp>xB2N!g`P9od%gc9LQ1V zaqx|mb0nWBE8%jkv%Ty-$Ik)=ZILG1Nd%1+y8qr_WA|}~F~!q<3#C@id~MwH!-5qP zdm2(S3ak`-d*atQt|)NuELiNeM9oSLW3||6YTDs;da3ha-CFP1Dm28>gxmLqh39^> zONNKb=h_mdDgs0B+jqC0nusyXe;=!wPlW}RnPwyENIm0n3l90yAOQs&tL%FG@l#u# zR?!QYTLL|8v}IeyL9F(R8--|^lKyfzW2IW51S)n0tk{HDV2bVv?8A*Jw(yq*8<7SaCu(7W2(ct&3(5q@wT~#wUrXBU#=k3 zQBTluc$lTT(6*_`Jsjbug~4Y3TGx%7G5lm8MpT#4@~TNt*Pu$F!Rmw$_w+%W91Y`t zLysRJGX5Kp)7#J*p9MBqkVm0(of!*|HnZ?777xo210JU6n*5%qL)W9DJ)#dpCxh>^ z9^Oksy_d?i3)kIl#jT`_9ar?K@23udX605H25t8TwHqD8Q)%S-fM&lZz9o*Y*!;#P z7f3)0XQ}mZeQuVwfy0>&u0d}?9vxF&NOoj`O?od{N#d$ZEmUV)stU9jz}oFTG-s*) za`UjN1{L2;+a+&p2Ky9=D$~MmMKeWJ*YcFC{nI?jMWd$-aXHpt4?ffWB21 z^sUG^KiR^yypEyAffgL*1%_$jv;smZ;)R7KUXSEh@@9PJ^WJ~>z8oXjyas1tl-`@u z6fq`aFB`xV!hUUgnXeHiy#dZx914gtBDIE@|D~dOL{y$4j9-%lE^Pc}#^3XRM4eLJ zI@hD`QT*2!R-H=9#JZDjVIR4c_-@@h_d=f9t-M~v)G@hVl@jacQJFuSbhy+^+sYn| zN-O!`&Y;O=KMrftU&i0l0O7GZp?sKUnb3(bLBgwHU>EC`Orzx2z~24Eg#wbB1xnd0 ztDg&5d~W)E@A0VXn&~2SX_v8C#zKND?yG5&l>9%Er1WtOyYCO*$3uRN# z=Dyxxec|#@{t1;Vr8Ofd_>2vO?(xUCBh5G%_GP3+jLvIm39TT56&JjA-HQk*8IhVV z;`q~q)OK-rB?KbUF3<-n^$OAUBlPavQo!n!C1kW4CCB&WT^EL}x_aS12D$^E@AqVs zjW=h>nZzE;JPNR&sH?!&G{32h$D=GqR&yP7y^=*X@?&Vc$$LbMvg|9aXkR{_HQc^@1Hd?K@7iQ{W z-q?C+Ck9bWH#6g&2|{%3_6Rg%Ja3OM-uMN7n&y+iqu5LMIVkG4CeXo4L3(2@QPJ;I zilOAS&Vn&DP_v ztbzr)!^Ay9NxlrN5EuMtdu#E7mou24j{R+fa$Rm zjnN6)5x+hhnsDYa%%a=PNmUpW!?u^V6d-~A90r`Cl6-Kc7x$3Q*j7p}JK zp346Pi>+`OWZR5qUa>5MUW?nPL#2g<5rGI6$&CauJu~5Hg*cFG$g<5#$iu1J)i<3K zFMFIIKR$_IRTn`>Z?k{e^JD%pCPob2J~JXU11gM6)Y?1XzMtA!GjHzKAF04nfu2S@ zyM7g2%SX^xoyJLAH4E4kzqR7Rss_x>)mo4-RiK#JQZ2Bh)vwtBvq--uw$u6zE?O{X zRxB8~Gl4NgmfyKdP#c_r%hF@C5;S4wO=f=Zb`L;9hW$QA1w^dQ_I$VlFdui0aSSm2 z89oW2W3G>I`1$3C>w99iqEF_Ct7;V6Mms-der=ks_KmA(U85tV_IttDqZKc5=J1u9 zw8gKJbXi3;6*-PW3Y!ZZ``-=OR{t+F4IEmy5$CIQyXLDI(awju3?9B|B9rKtExo~N zj$We`+gRDQcF{$bWHb>=-#yyOxB;SL-Ih(rc|Gres58o^GOHPnN<&Mw3!nckL=98X>;J@P4bB7kNl4KeGV3cQn%}N%Qwr?PW{mNQ&^7L zn2MOO5I?-E=9NW>$>ARLgXHRmJ3>ZjpcGEgV`(W?ADUzo8omCBd_3g=3iO1BUDbpPOmAKhHCe71J(#fJ%Mw*5hhx$(upR%!M^oAd3QB~lB;#tE_NN!g zEk77)9ZQ}cBU>&ejLdGu2(&&QI8Z%maNfR@sw25do;Ip>6B)XiHebwcn5M_TDl*$5 ziP+2$ra0RqB7`H460vMz4u@|7IMXS70Nd zA)U+!k4V??U$?ZL`^>qz;}{-UtK*Z4?cs`PDg7=tf^i}Ij^tY)pmfCQH~Z==w|SGnkA+pcX(~9_`lIDp9p{(07#813 zv+BM^3|}r!%Fc}vujis2e{k#UVF!u10g08T0B&=ERJPWlxZ3(}zSu_*0&A|4Y`asn z*BD59^6LAjs6jE#PmRWnCgmC!q6)5Ul|8ro0Msfe1E{E!ZbCgF4XoRxohf*zqKzW9 z7`(Jxu9k|X!6}<#w&i6V%r`dEP(k6QSQ*Qfx&vj?v z<~4h7%->LSa{rUIuMJ20W}*VBh3y}}iH{Slf6dPzqw+AoALS4VW``AO?u53cQ$rhv zdN`%=bv;~`?upm9npsgY0CfnS*N;NC&WR^HrHr-HPhhr|X;d_a@K!7d^;tstQhF5WGSXIjpRF2q$ zRl&*ho-G85uPd9j=%DtHJu`#(gPp;h2a9@``d47 z@|q488tM5|m!69LO{I=rlSHG95fpj2FeM<>UrSMgv~Qc97X4ZX_KUb??l`kSMV0QH zRUDIf6bHr1iM3dke=dZy-n9~BcH4cg!soj>9>dn@!(W_!oFkg2&fv zmC{f&l6WkQ>H@%tM;S8P*Yx+%)K#e{D($UwdM?`a51AEWFs$fFeY{XX2n?Pd)a?|%p0Gb8tI=#qF^8MU_98$m5W<<5 zP_{9$W6d_;QmC?YZCZ|M5O*qk^jmt@!>N|8W`57L^y@Ky>E0K=La<0_4qduaihJ-} zB6gLDE-KPtp<%<%Qk~y97%COCq@a9V=>%rAMuNp$&}e~^4Mtvf(b=Qm%tWNg^HLFX zt<7X?bcMrnD}fG$&}boGhEv8ZP9et`!*Zx_(%3CU5h$8-Gl3NZk*|R;TR%D;$sSSm zzi;BW=9{(qwU(qbT|LjJjv2+0;K&RD04rL$~sCD@#I8MjJsy--q5Wt_;=kEc)m2YBKRSMu^704EPJ*_jaf zmHF}>$dMI~b&gyu9o7E4njZ`)0hF$P+N(#&$%!kRjDMUqdoFg8lHc}yciG~73t zuzu7mI3*qGB>-war#?R}?$hNAq*b|hPV%bJCj)Ly683+sy!B8<%@oUgfo^GIMT=~`}DLV!S^W6OErN+xv zM`9l@dT8|;F%Wc!08y)2GkpAw^B}d*pi0N)=tumhDN|^C~g)f=A_5D^bN?CQA z0jU*1qjNpHb^yj1#xLJRIO6AOv6B<&{4LvnKe?_pEk>ryKROa8wcwYA@i`*5FAxpM zJdHFBV=phbff`|ydIqmT zv=TC@LbWV5t+;)7Njchx?#>wP=D;y{t@AQ`KgI&$*+miqVeAADw7YWLZ@PAW^heVf z7W^K!_?x(_r5RE?x9kc1;5ePMIO(a5m(RF&akVpL6*mROY}I7V2*o-DHTM3v#1xnJP29@N$xd5JsOVdk1{fp5?zJ_XtgYrKbw%XzgF|M(GRv8m|2L3e&=}v!S_-os>XI+(N?CN#wk2vkr*@nl#N-<-`D?Fu&O;s==&CF+ zfKF@7f?Qd9IY99MI$34|gwr1N+v0&DaMrKxM{_eNAen4bKw)q!Rv)u4X${r7W@G8x zK2oEfRcWO_Q84`;|#q(4?b3|@QkY`grMJkv4b&L$fw7_V_ z9EuaPDwPkNPji{a_g6$|_v7`Efr4O#n(fnyu|oKS&~z?=vYahiCm!fyi=1JV|Jp5E zF#?88|7-kxN{&#I|3E+I%NQo5L!4ls6<#7Uo zu&z%z?EFK{p`6Wl?_YP7X6ThHi)0}}vcZHQB9xuR`&e7AFYntLZDwKvft1|G2^&MA z+F6d)V<;X}%Yh=Q@mLq{{m2yUBysNtzl1QQWq@$QTQ7h#s<-8pMW1eq_cI-+{mB8b zCDx*IxD4r_#5h?)7%r~hnaRM;6z4L_=uf8_JWmW$9K|^4``9uO#;Z{a1^2Etl+;H6 z+otQG-DD~khy9o)!TNMSAlwNWNg7OsDis=>+q<2q`ucHssKJqP0e5kiDt|`Vy(hsW zit%P##U=t04c;vr0&FPlE4nY)b~ZU4!zVxl#T5pl_B%#?^flS4gwDIz%UUCTEw-to zM$6N_{lB;}UPNs~I|a?As&nP@H09m5g!0W6sW@SYS9FGN9BH)vQNAmp8`BA`2O6o11eLn`WCwf^K zc?=b|C)8Co=YDn`I(?LT)kVkZ^u77aDttAOAy3U|yW@~TpbVqLp5z4&U`~f>5_R}R zaTpJtFJ!qiqxSPR!T7r&Wf8Pv6CJ#*X>BYv*3Iknvj|S?H&k%YJ)W-yrv~RCrR|P? z;Tfl~NyOomsFtt4T``(qVYe3%nQ)lO4*+!dP+=Wx2tZlh=~#~y0hSKaTdKgy|NaN~jZ3mpH|T1$|mIBx#UBr+rcs;d`DGD-@wWE*E(5yb(f zKYgo%=CpmZ2Vw?1$PG*!zE1xRIB?WIlIUSRP~EXDz{J1j54v&4XAFxLAs#jmWmt43 zIke!pleoF9()6%dijPe1Z%#x1O~{4+M=(e8b|(9GIgeE|>rDW*S^)cy70U-)qW{*< z8;Yc~bPY4q6QRa0KF{BLU^shO#C^iQSx)C+>lA!~eDUTn3#+BQtH`BVPZ3O#CmxRG z%r%>`(@Va7j`^gmbie8%FoW>H`E34M@E^s>S88sVxu=WhqjX<)MNK8fNQGvKFMYg_ zOxK!79N85}$}NG|#JM&=xHVt~JyAfyn3Tr9&$M)&u0yK}C-!$H(vip(1tKUyi{AWW zn>@7P;!HLA#%q#HRYPx(+^anNOUW-DnAoi5F zJAQpg{$oD`Po$W{*psK?P$Nv&ag5FtUnrb;$E?Gx!}5fAA(rK!CbO#QYe6G|Hngpr zCA*(NSK=9SfOCZ~h@2h2FDZVO+xb+?0)Fp);k*;-ac2@?9OA+b2Mb7m+()_kf-7P& zfp&n^DYLA6S!4SFvZQulu|mQFKDuoL1kOfcI2~``frhT4kR-m zI;LWRy3gDRnm3ypVzUkri(In&DK{eTTr9YzGtIkO)KbRIUtfp1>bgM4_@naf%DV&~ z7KF(U)&*iu7vP8vN&CUIW5sDJvAp9G1M|dVWJD!%NNd)Dz~Ki z@t$!-uGePa(fsd^jfw4%!RI5CWEpBvHfC_e<~qMVv-IN>Y2}1!&vIMfqAxt#G8bh) zr$pJzD~`ub9E>D2PS>}k^cszg(2B?Y-RSx-{1xs!9jYqb_IdgzWlFZ}7wkf*-b*gC zj=5B=bPr5ALbb62K$_$ER7B^MpIfZ(LhJ9%R$AFM=oD|%)8fq7)32U9R2H`7ZR0!b zOqd%v0b^Sz$i=uujN8p>OL_Qj+Dnnl;z4X`EM~@;9COw(lEv$!es}Qx&do4R{Wy`~I=z zztYZ|(MfDy{|axDU!8a^>0#bTuF$kn_0wxE)96eW%Anol5PhH`{&|y01;WUlE?U=5 zdF^FKo#piD%oRHlfG8(;^QWd}BsE0~lh7VTE-nbwA)T3LbLE7dFuA`JyPuzhb(|2?_{Saz5+xd$LVp&h?#72>dZ?wBUu0bO`3~gFw+sR#;ELH+q zETwk9GQ|$rBZ;|Rh5^v!c$|Gr|B@(sp5#{uVm0&G| z3>}UXqw~|nQ+R|uQo>i6vX+X~%-RyZb2Z83dlP@l*A=;tDh829{$4w1Vpv~}qm41Y-`Et`y2uDrk8r!ngOee3nn z{12=J0Z>_oX4j2q*(NIx4@M_kEIUO&&FAVLqV2)o1U}= z1&WD{{vzg|JgvP+Ed&7~FN{wtB>#)f?NF84i@X)dbmx^$DSKvWa+O8Lc&XKTF$;N2 zrsXjEItQ@IDzR8Y_j#@%lPWP8@%us2T(kLDA684qQQLnci1S0S|0W>M2ZCSLPpKh) zre2l;&kFau@V5Ixa)>-8IN3N$^2rUFuBPFgR}9ym)m4xPZ-Z>|?=dgH zCBMV6Cs>#8HlNPTDR4BL_!yiO@+l~NPR&HA&p7M7wD*L(IVux#FksaTJ*N^I9&AH` zRAwi%avNyM80hM~WZ5r>v;#VZ1MH{EGHk$Yz3c67*gokx$0*`92W4PfnNiss5Tm$1 zX-w3F-av!YrUDM$1cF7qrE!T+(@?f7Z|kf;VtQh;RCJo2Mp9Q)F?r75XXa01Nx&Rp zrg7)v*2GOOMeM|ZFo@LkozCW8%lxNQ`7+wwj~8*H^%+HN=1Bkf0I@4M2!po4nKD!} zkVaIym%>d!AC(-F5?kcXiDCd249O!(%Tl_g>ZzBd``qu#-_NeTBnu>IbAWUE<)2vX zhVWBOPQf_V4gb-ugf3FP-|tRGcEsQuxkyNo`5(fsH-FlYx{r&P&}lGm9g#+EezK{{ z+}@La_ktr3{q2mffFvK|4L3n9Rt6|}95Oj=(fo4rHZluW!2>}mWQrFNxZr0)h=F>p zsNj&Am%WXOJtDfCkCGOA$?>sRT~;7|MUZcv7*mzu3VA#PIoTi@E?`6073G>bkUq_vJwyIt%>)LH&x+8P3|asTPrZR7 zIb-}=hncyfxi#Tvx`}n^cXWa<2S<4@u~boJH?Aa6{OMJ)qxL-C5sU4TQSZq^<7?47)U&Hiu1EYsuxvjLig!y(N(R5WIo> zc2=V--Ty>yegNucZ2z9E01+VAkCwta3xkMY+1jIO*Wwo8y!Hr0+xwYx#@2o{FZ2eJ z31~m|U-D$L99@5%IAv$%ZJ`(dKfJ9j_YhDng<1*H%{6_^!b`Qpg*XR8pSeM*a?>sO z77S$8l0f+CR*U8#8e-@R)s1?&FOBqcD@6`FE>N%Q+O&ZzVfHN5z+G#bG;(DTPAGA5)Z4pLI2209mT#*iFLCr>^^&+ zbzHZpgxymjK3iQ{DW=RWYx=XPgb0cc1v*f$FHd+NZ?MY}s%%Mm_NPY!-)R2LSA>hF zV$22{#0Pd-oU(SJyCiDG2c-A=uj8j!kHA|IDF)Nk%@ZnFx+!dLcL+C z!Nc9F({1Cg^=F|^VDgLD3;|rI)@5pa@f33ml-GZqevJ_(+;zc;~`&*Le0EgW%Epa<{$Etwf|=iq%Et($A-+#Sh9r z8`_+}#EyfGN#JHk(?qL%$j~DL>(JC-Xg>44CBTwuq_fpcFGG)kG_^jmMrK_B>*s&Y z*SwyZVe1qxMGPzYIpE{BRHo6<^9Q!pVK*M@2$ilh>Db%p--?GU2ZePb+ z+_cC8eo)Jh&h_g$ND{IhR8IuPp}aOTuNzQ2{G>$k zmXlY^u}g_2{89g_S%QNTnsw0pZ}QRK_c>&K^E9$$Nih;ASZ)gZn5W9)v~ zuJ>h)1Bvhc6Ld(~jso(=&pE7buT}mRhs1*$2Cc4?or7|`kX1huwPNXJ@}N<&MNh)r z?}mN|c`~oP2aiu<|hH45Sx~<7SX) zeM4Gbf5SEYk)l8q-nL~~h%o&2l1~MmhfXXep*e6`NubP*tP}IUPxrlGlNS!Z7w*1* zWcd8|QG~*YAMGf{4KstTbkK@P)Fl(l9M_1*LbJOmB!<3v@F)vRw>`c4NN z(9I!9-%hQEst`F@2-=4iPGU^DwWG2_Vy57`-Qcd`NupfoIOrf`}0xE=$dfmbUCZ*1>IKYGPLhzO;JSpl5syTQ&-YJZpx5P zbMW>sXni39+1IkE!#WY_g=W%9Y$n>dWHv$hw9qyd6U*>hn+=3mkKJ#Uuazuh_;47+ z6+SToU3E_s>`7cqpG=9nf2MnlkYXzV#Ty{avN1f;j1MRkIK`^S5@^ypG-$F zAkkmj6Y=i7F3&JJ)q8?golG|Nu~a_gpwCufVbrT;>{x(Jl=+atsf7)hT$rJ>Rqmpy z`L0oIjPWJ2&vlafPJ@p;rzhPJyXUlbNw5gk&@!)HW0-XCo2d9ry8Z8L7Y&~(6LJ&f zOa!WzxOlc%KDv^S?Dc|blZB>XzIAPuo{cAwrPL^!72zL~zhaQWF$>N_3l_|S53p@Q zlAGlgs~LZu3@Z9i>`_YA6QMBdO2N!W6{Ovr25X5exO!s<)Akk{a%vtCdn!LE?JOR) zIa_=FYpMGjH~y^QAu*|@IjrO3g+$dO>ihH8nz-*BxVqz7p0k|KfV=_GVyK_g8ds5Y*IOT%K<*31>I4xd+oKBd91)le# za!)3)b%8yRS>i>WRl|bfQeR>|)qqra-ol+gYISzaI?2dw{_Q`x zM}}u7rrqu@V)?sfW3rbhst>D7mnE;z5jx9F`8#Y2!Mm4LS6upC$`|@05uR@3V2{S0 zb`tfwX|P3VYJNe1_YLi@12^WLzkeov^qb@`aSagE_LL}+Lv6DI{uaa*wrufgToH!- z%E%E);;1f5W4ZfAC|)baiB%_MrYYpz$hu_h8VT)pB}Kjf~093l`F~_`40f zjH2r>;rf1qR52?YD_{fDtI58Uja3Y7Z>;pMoCq$Qc$D9C2g+7MSXVe`X;zxBGm_Y-|}iGIh< zB?W`1%%$1!;FwE4DdbkoZ9pOWgDBDNAu(JC7v|+Fs*;wH;)rHVNTz}})u3%8L>5fz-0p6v35<0d zKW865R8cW?Nq0txaNl#%5tou2_9Q!GWvGKF#bQn>_T^$HwpC@>hR-jzfWo6I!sJ7m zbhEIM55pHnnk$3R=R@Y8I8demA}kLZne@yC6+;&Mto)$DWtK3cgP;8#z8}eas$m+; z(gTL7E;=<2M1_=tHe6Rs;&0K%SW-d61f%Nu)i^BA9zF;W>j9|GrTlw_wHvUg;3UAA z1qKc`yh95(kle~o18nKaxBsNAT&OGfgE@-@RunPRS~zOK&U^Javp)Tp6L z9~ly>?dpvM)Fht*xP)5%oWeq(jD!hgN2g5)- zzhZ-;Dk!Ug+)^tWDk}$GiuAGz;S%pv>fuzvZ&8XY$s(%$YqJ7jIbs{v7t3iGR*ck+ z`lF#(s|4AkHvlYx5s6@VR<^PoP@r%Mpeq+S3Hd}+^c2gpB;Q2n@a*vGUj38Lx#U2M z^~C)>r8QVgeC&ebM-N|k!!@@YN+JbAE+NQlj@tv>K5TZnw~fD6DPxB*&hzsP$#H2X z5a8@{NCeHU_CaD*e6^EqYu^p#N_6#}H@$E7v0cWrlc$|RUQ?L*GJ{BdwEdPnGobaL z!W(kZGnhZE6;S~hR?_{K?v(PKCVhOXESg+jmCs+BV5zq-Zk`WFW0xYOqAt~bm@XXu zPc0;^sbbD;K1WxiELVq=(2B9pibpn4D-=-kpy&V{bj~8{zLjnhEJ+e(a+|MYHAjG@ zl5Nsg1?jY)y;Evir8G$^)C;6bx-rl-yUIHRLwS~&VQQ46)Mn5ff(z6!FnQzt1Pft10(i;7f*pu$)gY|Vf_{(u8Z>yKGxiuXD(XS zIXU2lL&&8j$<=77wpLg`SKZ>hAAR>@yWiZ#cY_WKE#~ve`e1U`9+wEkuV&gJpm>Ev zpK~%=uG~&YvsU8n)GJ~FbyrD5MXqiPQCx+UHSLrVQ9ZtpY;!PRQcTR2j2x9Fs7U&c zIG=!wE2s5G($rK^&yw^|C)L1S<3%22B}siyFBH4J z@mc~?C7D+fB#H!BWU7iT?=@@M*Z!@4a!@Ed09gAAt&U%C;+e;vb>p?S9BK~@fz1dc zajuujeHlDB#WBNVU=usVI3(?|LA4alBqq8l*e|Aa5f6oS4BOJHl`~5$(d+Jn?!J<;Va=qnKig(kn7er1;S#7xK&G%)5P?XnDd=Ztv>SW!v zXyposmM>80ua`n7cNJd#jiTHhlYZi4uD~GY8rA62XE8;EAtE(y=o*n+-1HtLI#51rISW51qliw)mP*6pgIjlN4bwJ->KF8y9Aenf%0 zunBU&w^QhBLtJyZ=8E$=2R9#5TH<-QTkG>+eZg6T`Acaz&BhcKY}}X6k?p&-P!F;Q zDKS_ln*d!1H_Rih1LyZ}U!va~u!Hx_;_V1|H1+P@nVYB_YQ>-^%y#NFv{7YB94&AS9jIr>V!O2yKK_2--qr?&(sWn%IAO;PwUCNN~%*V3wED^l| zu*Gun3bPf&_j8Zj+l_-c2qo0YDgy3PN~Isv6s}$s z=yWBOK3I%n3NLOB#8~_M_mm(Bmo>o?7hZDXwYSXLS(6HmJ?p8!mjM*%nBDqaZEztw z&J3Jq_HkBW1O}yyh$RQFuv5I_aG^&;ft|3~3pvj3miFQbCM*=`4}M~?yMX*n1uFyio*~6g z9h|jDtZd~P5(~0cDnM{8)+$@s;m@kbw(LE+GbcCd(fyc`U$H~VGK}Li5e|NTF*7=k zFbGN*mNSDp2lil4)#m4LPLq5YRCO&%ZuXl8gZiUaup=mMr)qS?vA-xx z_~FXlLs*W%6&Xf~FLZ@2ln5&U))HD>+P2?++2t?4@c1=HFPd@FfB@h!#+vWWKl!0g zcDoCVpTdA@uS7KoZNQa7kc4rG26Gw}f#T+LeC9x+y5gX-GJ=xexVf;*+oZns4dItc zi!ydCJ+d)1LRMN&#>9I5Zyb#=kIMn%g3BS&Vh2KzH7SjNlw1t6D*+9@I1Dzynk%Bra{tktyJrhVy)zT?3!e(nHc z9RRE?5?2JXZ31+~uI(p4S84);Ss!c75Cq_O@^<|$9BwSsMR`C93a|iZQ!&gD?WDm6 z*#I9+hWS_xTw=R!@v%Su*sc$-259vUF1!5NqsM04Fmt0dW!QGrVywk{@t&V~&*_Ix z2Xu}HH4-Re>7RPsldoJ$V%6X?%~~mtRKuUe$TGr_;EhkD2AwZbB^4Tc?Kxn4>sTvB zf&um+)e1i`;=24Z--wpjqpv(%#Xhvsuqh>4D1={R;gL2Vg-}d$IYmxOZAcJ;XuKl% zl*A*n2#+96A73515`uF3DI6HVxI^^T^bu~G*#X8n09flot6Q(X_||u^f8un@~8jqPZnpo;)Nf9p0&uEH9=Bb zP2+vRXAU}?gpi`$xmeb%PI?7OLTwg=640w|cw*Ly0R{?+gSZ075FT-b29f=8;nd5sO zOT`kwVF9V(ln_a=^Vj`8YY~O`85fv3h9FLhhjN+$^pXxaS^?H9)28B2! zDb$?k+3`FlSd0>lOYrW7C4>2Ao~b1Jpasz6W0#oyDGNN4WM6MXQFx}MP{U3}(oW_n+jTOxOuVM_C}dF6_b*Ah z^3ZyswA;g)iFKy{J-F{ss)g#V->I-b(Y>gVd#Sr10ehx@*Hg;H_-mv)OONfMO_IG3 z$*h^3xbTt#!TSM&RY6=GK5^n{m)v;m&9ipK%t6hLCc0kfnqnqACr=$k5V)`dn^+|S zy7kAP_&9(j-|T=Y_n&_Fv_s3eM2@Gq-a3h;R$fE@RIURSbo#NkLNNKbDmtM! zIJHlL@Ml+PXoBxg*htzTWfd0(9sC1Nfx&A?=7kG|(-^EQSg;({ZnzetPdDp`7mJ=J zQ;8#EauiEmvCj}%loMKHqN4JuA0V`-NJLo{&64p!Pt5y@d!}Y1vj?^Pp#m1?5UqXdWal9J+|x zTy+#gKYGk!AtuC96H0`OfBlF5`kTAoIK~YTUC7P%UHZ(1N6Lz-L#9{zZVv;D)gIn^ z(e2!{I~QHB40ztOCg>LC)~ocb(`;DMKW()Q5Z4MT0p*&-!NBsW471$+52CORPN74d zUV$;;?cWR>w-kG-{+-c^RCFwl0MV6p<8klU+?)=O<|L?ba@}WOI;IR$> zmOl3!JG`_Hy?L1*SAnj~d60cCs|s`llLVT7u`l}3j}9l(b?h^q6&n8 z08^R7+5qBU_0k$$dut#(HK0N^Rb7XUN2tT30+jEvUl3+lgh$qljVpL%2Wg=jJi<*f zL|BRCF0MbNi?c}$(n>8ti_W5ij6)HYGH#{fzNCOfzTA!wIE$KBrP78}p{oozAx}{c za!o*2l3JP;&{gIsYMo$3#LQ5L=*;}go8R@1AN=P-uu^E%Gy`!(E*Qd zm{wU0a-H@tS+mb(XYa~esA&Ovw6vmS==7~i9ux!$i3NGN&Plv)g;iN0^^$cW?e$Dd zY$pJ|#>tU_VyR?`!-NwjQsF`0MEL}U0W;&x#1S+dVbpJB61dT2G?O|BXFObw&3siD2-ET{&IqG)-_>V{2z|P9Ur;;rZSA#`POfp%~l_a_@VDgzf&81z?hBTe$s2G#{Y2+zN zN{j`~NXaO)()Z=7uhNMnhluR7?W?3-oi(!)2kxT>3|3MTeCCbU+}t#6!wpSwUZ60x z*^cBTHxo>2W*@|JpaH8VgRaT}0o%mrTwKOu)E+FzB+Y91L=Qx=R{@Zf-J^bCfTzKPZh zh2kcnzBcO|gwCQ4qr8S&3gDf%in4Mn9O6^ALvhLELSYIt3;dQScFV6A3c`anZ^xm6 z{BogU$pF~{w@R6z{8fop&PXXxE(Fy{#9fsMt!#YBUpJ%|4Ezzq(upCoR)xY(JoG0A z80)DEuoB|xrdfLkVv%PObo} zIHoPcP`#d=LdORYx7ye=>YC~)ri;a?utEpRRR#Mi4=BXStq`xQZHwTjY-6_$@Fp|+(Z=oGDR`C zFSQje7lz4$82!ZM!ZPHtDlSl|L_1Xxhg2JtnC@tIe&(J3_N|}z^8<|almu7_an&^3 zKnZvtDv!|>YBIzS%1t43&!kcFASTH|hOCAji%b!H1xdAVzD_mosN>@S%UG%c7*U1) zyGNM>n9s9I^*aYky?cnnB3J58G?7EX(+Ed!2&A?3^;P;UT1VvWq=v8AIq0>rVxV98 zd6Er*AXE_M0$=4x+qr0bRoN0I6$|U1MlsJqKBBS^2P3u;vn91sEi}GihA0nvRx1PI z3gNQ?y7Dzr8!aq}t9V}?2vTBf0s32P`lLQE#=NzUoJyqJB$F=EJ!CDemw_bn870uKR$=C;L=n}s zF>)!O8Z&L6bFfkclcf*q4c1RhiJF7{$vYT26a&l;Dx=t}JI=97A z-sr&cij2pVcF7t>5V3EW$cxj-Jg&%dz0Z%8dt{P1G~8Tw?HQZBz-Ns9RL?K==yC~;F10Y3{Ek>y% zkgsqkb%RGDJ-c6U^Z<B2D!sUB|f!3fBrLjn0>$ zAZ`O;&s0%prWz++o*)khg`T7xhMhBv%T(d)XAgXtlrRrzxl07VEV4<3ROGXTrGTg? zkC6soO92QWfP_Zq03pTD`-#wrh+P>57lt`J2>pnCF9K#RYDx|Q6F5T&!k&p7K-ot@ zA7HF)pqF!`CfF;kG-X1bYiQ82N1?S9)fivJF7PqBqFCNebxlb{htf&;&@K|HQn*vS zK;G40P1Unc<->gN#}lzyg`YSEYN7brHO#D_ps3C~9lqtjhKf7`_l=#a%8K=>{X%$W zVPy#YePLE5y&CkOtZ~}$s(tJ~;z{TE;8MAv63c%{#6Bttu+j&DoI>-hlw6&(X;#sR zltSq`1(JEU%P-%v=-E~%<*kBhf>Iv#7?NjO3WwUApLx@7yzzm*{M-RlTJP`d)nN5v z_L~M51|MBf30m#$AHmw;<1V30=O#(ZOIXR6gJ!NFt^2f_qVcedv%TBj;Od8!9zDkzD$yHIe?kEONR-r_N*ja%=vyP_r%J*ta@%B6LR(QA*Gkn8^X-NB?-Ztvj{50FdLJV zhHR`5AuBA&HlsYjkOoQv{J4eTCrmkM>=oUX(YFQZTr#!ER`0S7D_P$>RO z#y3kZ$C|3u5zduZB89C=N-QMm;vTHP{Q_YYo{VVmnV2j^$5_iTz7k}qCFJBAwg+OY z^RGnM*90$Kx-g`DJyo9U0A0nsJY;+8>W!}otwYQ%vH^WSYuy>c+iR+APAoK;SG5XK zjf9I)EoGtxt60~g8h?j1+7FA&2bZSmk!ovI%GRmSP26w(?#Rp7p~{%WSV}eNAP^|9 zdekFr$pkClXz?8ud!@nfJjCcek;#wA$@iEQ2f0wJh?Q9J#_aQB=oU+;98gH9u*tc( z%9jW#0^+J48bP2|$-G1hxc0cx%_Xq7O3UGW*MorHCRlbNhdvJv8z~Ti?`S(x!7@zaAjDzPCRD8eMy!ev=kz$vK(H} zXktdNm~2EL&Q`u~UeL}QcCQ5kA&@lr0dz!6o5L70{zn&H`iVHiU+=Q zfU(YTfW^ee4xhMqMO-b#?2Jo$3{EBKsnW$yM7)9V6*fxn@C`a|va>I)2{NndAFOQj zqpDs%LhkD1IHQ)`-iyNFB2KENo#22~N-1+8uO^?up{g9SDm3+#PVO5~N7b9GfsN{5 zB~6mPk<+_CPUB}KYh~PE@t2drb`z@2jL(1SFzuPM7M!>yh>5O1{9e;S7*ko!V<8V? zNgbkEtsL|rD%m(5O+hOUlZ9P@2G&S5ai!ma+OJ~Qkdj?YFQKQk#~hnbz;8h$+W)t0 z+Uu@-`N!`6<3~J%nEvBAB||l!r4{a{-i{I zrr<{hH@2!Svu~ueGLQ9YlCER*QuaZe3@dZnvVtm7##Cfd4sCX!(L9;K#nDTNBcBpr z<%RYeJT1tor2kQ*(k@EqLk|Nc!fT>_L-#XJbEfmynxOAe&O-+sJ@wGYMC*vPrJ( z7FGE*kQ;LpeMS8$c0j2Tw0Q6+D|L!s!Y#)AtGIHPSN+%n=GMMp6XL3#yHb_J>f12M z>wxRXu*eZqk>e4C3VehdAIjbhROO77uu!1ZsrD<1z(WPi3Z0ge_$~7It?}qJ%rCw2 zG0-BCa#VhJ$&?rt8Y5AbY|y}8S;&$XdPS8BI2RgDL$}?k9@YOO}6Ta4vw2V zQ>YOssB}3jK0<`Fi3W=bjr3G92(3YE>zI_{l)ZkmMK{0i^B?JC4nKmXnZ5XVFK2G! zp_q9URgN?J*3dsuYzi7{)i>5Zxn;`rk_0P15wE&eCBTBn5^PTOK3HMeI#F5oiEolB zPTE|v)Vftz$hPtl3@OUP$ybxgtxDbvjtvC$b_f-5I@ss| zA){?lo;p$g5P1`PA7~;em z3SC3X=!&9b8?HfhM!dD2*rH-z)hW(|Q=+Gb7&;m-upFwz^2VR}R_SI!0^oyVW->iNDMz-H_6KKOJwiT@jJuG3hEq4DQ z0ZG!1&GHDN!lb-A7vNu~b#3TXD8?5tU5DSokH0H?c8-6eksm z|584t=dGnc5<(u?|DzPY@vY@s2^g~sZoD+7OCIx24oBi+~0z(>Sx%APpZ!{(J1V9Va5@^pa?n^lhZT zpQeFL*%v6ifLre?xTNwaJKPup+=ew+1hrODA;U^}7%b{iu2d%AFL9#EXD*)GR=<@n zc@iu0s?@LS>#?BCl^9Kxwb25HPRv$h5*x>F#jI&hTzH~+xH%xPYW|*34c5|`{o)HR zzU8{xu6Xv9vt|~fE3QRXPP3s$HxVqYRXHa3J7rwD!}qE6?hJ94V!1`J=;0nJNZh8X zdJR@g2~_47RyZ|y>{qb^k>YR_SW4?;@#TjiJ3Q|P`Va=^0irVHp5Zaq;`}8 zQYS(uWB-8TL)eojzRQ%|MWDyZ_v`AhNK355HE}3SK%8SP%*}OIy!^ofG1l1zuzE53 zZA*izhB>CdEm&}kub3yItH?W)eBUWDdJD%lp|*dJiXKX@eBBE#JNCw3dE3t6ozMQq z`?}plQ6paxQEeE@Lu=~0`m+O!Rs3t7Fyd;dxSF-IzEM!S6-P2p zudGMVmVGL^vNvj6mecEYsb`^*NmVBAr>+7 zPmhwiu%(XSV$zF+C5!1@uETvy@Ayyrm-3D4%$-kWy%ZoURlcv1m#3m;z2j{clqNBi{v7 z0(c}ve3r*iD>pA9EeICgKJtG8%>JavJuPP3z4)ofTDuGeH6K;V)j`(BPVGq zx;T|q;CS_bOj<7o8o{fQ_m#I5eyJ8waV?^n3Z8hg6*dM{AWPVLY}aR_!q)2uG1ntD zoekW{{8L}}$fBEr_YQRPf|KSXU=3xNHE`tkMJsegG&?%mJGpDxz_7AA*+qUNt)rs@Ns4qN@Y>JAl*86i(0NO_Aa6* zmKVJy$Z{s5Lq~R|qV}5#(j6_i00lZt$&)sN1gds*K*SN<3*k8GVPe^6ZPT8(@Ztl( zd+@hk8Z4!_B3R~&N>%K&zB|=3U>s_)Xli#I*qH`yTLm+S3Nx)*6%-YNoT)a)(6Oqb zl2VG4ccOU(ZH)$drLAaWXNj6>eB9*0IO)^Ic!%~%tSYjq4;3b&=mC|onaK+xlu5UFPMIE* z(IvVal2G2BSHUa@Lrkz4K_K;Owd9psN&X&{V$6uQs78-PVK7cgU)5wt6JW*6Y7O&s zFMQd780!fw5h}%1!wn-sr~q+jGjtVJvI2Grh3$mY7WuZJc&jM^v1@TulOAurayWkx(;h*__Z3TLCYAVoHAG%bv2isZt>8 zf||K_Wc5TT3Ard%U%C3H%_@TuiMmX&QUnyY#45um)#YSz9~oV~MF|CXmi-C8oJgML|3DWdmw)*CF}g)3EC23a!do_~r7$vz^!9@uOEg z`#_Af{{U-%R)cjE5lNx z)i5h8C0Uo&QcBg3u!2WS2v;SqB6QV+=&I3*E}+~}wAT0&Ggyiv{3I^XHICNfqyn6x zMEa&aEDPhZ1#D)LLn}hiit>8~B*xO73xbF!E8+4x6W5R5Ne&tepLW^|%^Sy|)XA*^ zKIQ^>x(+u|01$0F)G(PZTr()=hODYkSG$*HwtB`UfX%!W2_z6@;7xi`(I`Y9ZGos>zjSu?Z(OGAv07QU#gUin$WG@1c+M zwxV2zbt||n6aIYkl4Ezj{Vj(txIpQ&z_-!5dcs5D#7n0uV~f!m=~W)mOx}h-l7;+5 zsakzSsho>^mr+6jtRZ`Mu>K^Z>rxW~0<2+WcBa9}r@$)*QBH7G_L!(pyi>nf_R3|> z0~rAC3ZrU)j`t1CGlPLPEB#tJ;wlNqTxSp*R9!F{?XUV0c#WdF9+mx^(y>^xC3+g; z^zs^CkOQ6VUGV)UvQAYI)Y!H(y~9ZjRF%FBD8O)9HcprxmLIr}?jwVh)dXiV2VKGI zL_ySU3xC!8liyv)_1qFyuNff{zg>|dscH?Pnn-=E&6#b9$CAmAOF-k>zBCw0G@vBK zL5_zAHMtb?Tg*p~KW)kT8u}_P#_6k0P#3ckC^ApmsP5@998L6AFh>w0k~ zV4B?q2{y%t5v&Z7qO5dx*x02X)C7B;Ng6|6HAD?@OVlzoOf6A6EJ^+?*BlNr5~+8X@PdMyg42#tZ%gP)#tcKLVOcz_|j@jcP+ZAYi9fG^7CjY-~{^ zhJ2f@@eyY~3a`#cuv<{omnm~XL9~{L%czl~*23x6fW9(LU0JJj+q8Gye)m<+e#t?h zQ2lKxa$gcxx4iVWD=xpHZQB87SS%Ggr;|+#_E1jj+s-~aMUiDZ@Bl^XDVLyPA04vq z$PlRMy`V!!^ff8Uu+9q}(REnl9(cZEB|b2kM?tyP%928zduZLh=H`oTe&0j)&R4dg zkxP3>f^sp$>FA}$-}o=ywzIRNu4dB710Vj({N$b|*bl|#gmVLZQ~TJ5eQF4x*LL9e zi*6`#r-DOi-It_j5E>j$&YkEJnktpC^WYJhz$xxw7We3ilNulMh_|>&H>@ZKHaU`G zCf4rFuAJQbS1Jqifz6wLLzO+LYC4tx^Leg#f~O~Vki75*b?&M_Z-9%y{aV)*rOFSA zeFSh}$;C9=i|-Ln6E*Jx#=8EBmpyPGc;6O-WyS1K)vv@JO+r^(Nmf;q>Zn>xRYF%( zLRSTfWmDsZwP>o%S6-tyNYhJ)r5Yj-WmA1w!rw(F-F;uUcW>{^qzwy9m3fIn`l_9^ zue|%!v!jR9P|8l)d*e)zip%G*2+~np=CORrs(xE47?w&TpGui95x}ldEWi?1=Puq` z<6PuEXp>V1Q5G@W6(F$`chwTL%xzCx&4^o~8PSZXUH#+X-;8KCo%6girP=4B@}$n)obQAb6o5?G-p6A zgD|0-8|%+IjPAniU2O+D2gNIb!#5I5xECiKz2x{C{`p&0&4Wtw!hIv5pdVPS_#vpf zDyX0+l3qc-BrCn58aFI*v|J=2jMP^`W_jjcl`EovsB3&XWAbz0fQ1EE#zSiyBoAgr z^1eZC75(GHoq;vW#X+E#|NT$TY%5eEl(+qfFeM8!9g;XV29dFo{{SIuy+Z7X1#ePH zN-RP;DsA{=Z-k5ympJ*>!a`b2m98LYKx1m9hZVufCxPqxLDWEtCXrezkcg3)t>Dn; zwrP(aJrHAUz+f$Ff_J>^Rj<6}rjfYfu$c(wC7NQE8X zw@GVZ4Y1paW^0p$n`GutEW;|(RWj-EqT9Rgp?lNL!EKqyo8Ji^J!a^uXm+JFBp|fb zYTS!xC!GnCEtg^!VM#z1TCq#?c5pADWR?vPnkV_OW=Bm8izRw&$)! zwuz~wLC|VLpHp<^{7b%X4J|n>N;oa<_oAt+9^^@5&9r2&ZwP+!36K+Q!XExSBPAAL zlFW`Vl40&H^4D>vA^6a969;ivt7KcGR3jUQ;E-XeJrJ&MxbTb>(=>lXYZ0<+04^B5 zIhoL`Y45!K4F_VZbpTdh6MV)ESKoN3Jv1Ic1}UK$+;FUU2ezU#A-l$cGm1B__r7wd zrn18p`xj)-2cazA=NjBo-MYvd@mm{L45bco39c+e*hMI`D6DxP(tYZod-sOSL77nU z^IsIW?C2%O-tf=fGJ0Q;R=9Wb1&~*V$dV`HBzy|qZfTEDA+C`9NBwEl62RBXM{F= zfbLfA=~P=Sq#-=WB?}AZ1uHRxfSp*s=Hc0)1B^8pU@`HxjKtL;1YFp~Ivl1oJI!=v zgo1Co8r&zVieZH=O!N)6iuPB<0;2!k$}NQ9-b)Z{?MmXd76zcIv>LiUoA4Lm09nUY zw1%=W;u7W~$DXz_zCz^GV!rqfZ~M*p$-T)~hiID;sI|700AnF4O9F^i_6Qw6yu9<> zYj5-^s~D^Kgq;1LS%e%1QO#g6w@RI#c-{9TRxhIuh%3lrF{d;b6EE4aS>KJA^e5(Q z7I|!zp9Wn5QtTqGlzakCS_U6$n^3gte1UnAokK)e1pQ_`gd`T3VQ57fT4mTMB*PGv zQtnn_X)w^cEe@@Ph4W(6b&$tWx-O!X80!tsyZCtr0BcrpZCEO&qA3$urU6o9YBj({b_H0Ouhod6cr+4YS%Mj* zz7if91DVnXjj90>p$;)LOn{F> z7FpU-OTBAz5L^!}qplM{Zv<)JRx+;xF;6OcbR?wg> zvgo?Sbf&Z7bgy1os;_+dYVXYM2jBL8%}?%b&;z(G7d35L=!Ui4t|b|=tiBR3a-rrZ z{$mu%J>s2RBsN{fyec`5WqpWd%^)x*|Ni*? zSOn-gM26+3R`Ei#N8VYzU884-15>}UwHWy zv!-pB6|Avt>S5p@zTt`^1uaAhb8m{?S7<25f0VtQkc|&4+Fy}95}xA&``L!PUZ7!N zU-f2JAk?_%r^U#@*v`)Q(_+d%Y2uh!!%x@1c**7khOfOTmpq+!)J5 zboA2W|I<6(zRY#DQqskI@xg!g{?mW?I8hqUbCDzDq|P{1>0S3EWbu1u|%S4LJ$D=idpLkZ}~_^JUF(Fm=mzB1UO zD22?_m`TlXaLFR=@|DW10KsD_N2%hcOtRq%kob3Q!7Y*PhDrMCLpeExcbIf zJ8MS-3NQYkBM-4j%!NvnlZu0%R(oF+y&)!&6SW)|M}a^kZi(xer0trs7Y5;JL|0wK zkfQTfz&S}RQ$=2z403Ppq`U8-kB-{*dRl6YwFml2Fn!g{7kj66Q`v{d2C=y$l)0$M z99Wg~$_YrRaIPYXO{WA?S>)@w5~4}q^u*|LNQvb|%>+r)a^#Vz+H)Sua#x&TH;ArW zMAhVv)jznJBE#5FSxl>b!(JK2*u~T&DyC*mV!tm+3-7DTQ=Ui)*6kw}Nx3nX4`Y>4 z4Q8c+7bEJ62@aBB8blgpHU|hbj%s%%_|qfoGOv~U3FH-5kdA3E7eYzcMQC86(Baw6 zowwihyc5rR$}(6pNL<};^~&H1m;A!0X4pU%-`~4Pg-aNyBKL;YbjE^4x4(b>_-_9GYQhuiR*S?>#`B3c+nkDqSc9$!Yn~ELBhggJKv@~}Rrb39xrB)@ zD|NHNDlR>U)`#&RvEr4^iz$u<_CU8@6HC6#Iy-h)iKagmDq7Xb%C>TZ63?1{8KDU>3x2$p#z z=nXkhjS4EYVRB&c$kxJ&^U^s;W5ffFa`o_C167unTDXcSeB>!A#%gln>exVB<><=2 zjA3+DW~wGsTWZNFRHO?Buc5(;n2BRN1O{QAL>)~{A>5WD{5~M9k|TqZ?9MArzJ^+# z;PBo__sNIu-COK+BI&;pEwv8&ee~jEKl%%AyPV7nAnRJhnv^M z_EGLHSh2ZCXu^)!rfiLZs7uc+ZT!pGw3;@+e$u&$%UVFVjG%~NWF@z5&%6(sq!LG* zRy2*f6(F&ioR@0c5@FLsuPPF2EJ2Q6n$(mlwU{^Yg_23KAf1za6_prkiXJQRMde_% zOnX!`bEixth9{t&i6x41yVh)joERe{8WWS8BSCUbwt`z~^!c;NehskJ>D33aroy&q z?!4{Jt1iFlsVT;q(W+1IqN9h8e&Bon)bha_KW-b4g7&LJdwm=K6?D3nd%zR^ws-%`U+A$MJ9>X>H(xl4(w^aow88R z8!1&+V|wh-1o9Ca6Lz-;FdL-zg15bdqI}rG$wXF|kX@K^W zHexI`B$fhOluPpbFF#YtOZjwC{w`K+fy<4#88=^%SWWU@1wNp!I^!0)>KhfAvhp-; zOqr_tlvQCsMf{+CK*GI~oV5cQ)@nr&37$DYM|JqtKue>YEjg1{-yTC>Ih0$!=FV*A zuG{ar=XdV;_+Nbdsm5c?RyDzw+|aa5!)<|-;tHmUE3j12`(Q%t&kf_5h`lPs^_2+H zLxAgWNa1Sh8nsUpRP8sX71b62L~DPQ zi`)GEOx+czSC3wN?C!TF)(ob;*DV%%r}n@kh4vX^tzPPvRixZ3Swp{ED4FAqlaoVK zVb(CZH1uW-nF&Dvvxdr`#*sY@$VIqj2T9>y_TH8cmNmijzoVWBhg_%xW`+zCW7mfC zu_W((sQm@D2?L^HgRxjxs9o-Pu)Wn73jqWS9ZWS!7rZtjiA|V{J=>^iW;Mcd0(pAu z$gzIjukI10#uET1G%H3 zpFR9%Pc4A;jEkP}oiDjzHk*}As_IZh1-hzsa0oEaH2h?904Mr2FdaQ{^yDL_6g54$ zq*%6MFI$p6VJ=yQ#O7++Nn&|O0CXnMR}y;V*JH2br3()od1Ut+>KuJKNz1W+r@Orm ze&J7p_qfx{zVkU(r7V{a)zDXF&S3^3Z5d<5n+xd}z8Zv-Z>I%MgT2?dl9FAeK#dR| zwiIS@#(ND|5l~{ez)Qomg2+r*c=WsKUjp2f4B<1qCc`^%qzsnTq>s&pOt|AVc`Et0 zit*(eDEFkNzPLXKBF(TN6Ul(CWaP0V)qDwQJyxd60k~?4!3rRWCvjsFaaA;+0fvV6 zav84*do3)J#pdjr%$P4!lMg zBQfjS9swZs_TmOZm!faXP#ks?nukX&KJw%L^G|&8-cNADJ4bhRjx7HjK6GSf__wos zaCGO;1&8Km_8ev|LXC_?{dw~`x#^3@J;4ne-JS;g650BPs>p)wLNW~wvKRgH2IuDEUh!<2#}J7B1Y*diTgc{D+N%7W&D ztQ?#aYD=oA!HJ*>QyXQGnT)IAs#Rr4Fcgz8H`l*l>Dus>r;cmGtZ5pbg@PXEo1iP$ zKE_-sUKJyvYk994bY(8s^KSmfU;5K_*8bQ#-&l3I-J8GT?zf-%=4n6_ac2B>`jL|( z`^ppeq{;%^ChM2@E#ZR!n;S_y!&wJ;O z??zpLn1!-T595;Jlo3#^&`PhewmWeR-&n%4w4RmE);C0vvBSP-j;6bTz7nnFXmbwdehA%RpRg=Ic6 z9fd9zfeaka&K{!4fN;^}Xmrl|T# zryn_WHWdojfMT2I+@%69{RaMjYzgvx#miPk-bgCtoD5sih%k-t%~Kb#=26_gouS4nY@ z>too{EN7MO>=g*i;vsRQ_u@@M5@QHgl?988JF`P~-S+x> z{{1_iA{cAN?q!K_VF{cQD(w}h?BL)kk}4fR3n7N}&>=-vkDhsyh`#olZ33%xh?xeBN zN@$-n0A@tjs%a_^cu^+C*CKa^TFWsO=go?gH>fg|!YM&cy%*S=+c$XUIp)L>z}jLh z|8)RBWSsyqg2sM?CV79H5p|RvaD}v_Qo3H?dx14(s2()=}BG zLxm{=yLJX=U7UER&h2f}o;Z5qso;#&6wnn{n2U0KQ=!3S7(4-_G?@&W$fem)x~@Aj zQS7{bf9q0KQOR`cF*}ARA{^&ZJroql`pyngw_03`klFsou+qOpxA@xEzm_-p(B7Hd z-@E5Mdnb3p*;ZgIa35cVvC4yp1AGi)k)HHDpr&3HJ;?Z6^jI=1(<`r5H!EilPXr=1 z$)a=8i(DmKn0N@OubtV>UAMmeyvJBg9mIi&&MI8^yIx^wrdb62mVd?|LM;sx;_10^Q^6psWiI9pNWT_r8<~&lh{9 zI7pQktDb_2FqVMRb^#uh2T68o2r9uNhNK#JQzChenqtK~HcOl=orD-0S*eWo@-S9H zVkPS=6Onl`jvufN=?B^gcRYFdVghav}S&$P4@4!wmHC8R4O*;r zN^zYU#HsX^B~vaq&gyL*FiP}N;$F`Lk$f(jrRtA@-W`#tLz3kAFPRKW)kHGFpvH{} zHykPlhs0bg&DHVLR7xPP9JBNT$~+?oSKL|iSi*X`S|P_0;3SV@k{C|u3`t#c^lsPk zaKm_301^pe<%Roi5Rhu=YCxdtDt=EYR9UbrXxzEH9}7TBZnaTL1p&ln$?{}-o{O=X z3glGIZ>GQ^i(P5_TERG5BCF03bX9|X%Jj(kAWUf6J`UU1+{JmNZDTHET)*Y!X@`zp zymS2Go#U4z|1RD+wk>As{?Fh4n%Av#?%jNmcMf`!4B$~M>m$f)kS4+-(Ibh8Y9^&l za?5!S&y3zn-0R|Jz4?{qen1cH@U9Iy($H_r-kifnR#}{N!%kp^&`azZ7>v zZeWg-j#xHM*?`JUhLn+2Z_#OE{Kk|VV~91{h3Z`8B$2Qx_!(J0C?nHl{B!zhZi|%~ zXr&XkZW@wD&7>Zl`K>`5`Bc1R$o$rg>8Ogjv>)uSh*c-v)bCWmR24y65wWdhh{Y99Z@!p+ z=(7>J%Djut5){R?2x$ss#p`S+Ri0xTR1&jmSnLfNzdE$-dpUzYJVB`R7M@%tRdRsbN+BmU7 z%^Y9zy-OGfO`gpWP+xKOegs-Hg@D6UrKN(RFAX<=DU_o0o~j{HHeg^km0%7LXXOB0 z_4vsRaxNT%zzs{hS-DH95A|w=CC2*c_rK}{EiPr_@IHed{~w{+AE`nO4_Pavuxvv!b@T{UkCBI z;7D4Gg%%cXWmJ(yMdf7Ji}L&&6RI;@KsmplNcS&4{BIuHJ9$B~v)EhA zPwiGyK6T}}X=E7rq?aL?lDe)g^9AG?S!?(Z7zG&7BcEh2P1lC&L0XRMG7!icrvfT8XZn+`plba19hy(HOYCw-%Sq{#>D~ zs>Q?Zt$%q(mN+4?!t0b5rwX%tHJHVHeD0#Fty4{#jVaqS%96rX>zcp2zwWxeVwvoE zDwQXi9x-#%Hf_sIuWc{2H&(fylW{)}PW=)R1QqW~yvg~#Q^x8b@m;T+Rc6p7dVbh? zw8j=o4X8%TBta@Ir$5w^O>0;tk{Qnna$U;t)5R^&Up*Snaa)z-Bz zHTT%rsWmd$^5b`we>=0CyKeoF=biW~=M96^DEL#T(1BV{WsZ$m5>ZnC6BX+?Q&sTi z9J*SgAh@r-S^J~J5@-ZfG~$X-0^YWKBWi#D>ZHSEtX4apg0TW=hxIyaBsRB6k{p;A!IWoxBBNK+)0uH?YiXqzE=IaPC!*mQ#p27 z#;{bV5Y8j|_{Zoi2shOD&>BsF^^4&-m?f&W+Okev`8wDQ%SPYW%tW-WigdzZK5f&S zPtI5k22%dQGS9>`H7k1Erb3=*pmh#&SG?8Lri>%o4u`HsB>Q^ALPlrW(}?=6Hk~44 zeZC+3)1+~z6y98AVTG~<385k?=H7@otb#zB<;JWnR+N^5ZLu^!lN@~ZQxX}HqEn0` zqDibQ{>3~M2UOXAgdQkNHj-hv_o=9N?|sju;^!u;PZ##o5o8%zHb@+{$z!LC^Mk0b zVNKj&ksFhW%p5=55GxEks|5_LOt!SW)eQKj3K!D~3)32MtBw*&nJr?HwrTIY<%h3& z){D;%jMW%+h+WQ@%Z3ZJ<;5u;T2pI_ak26otqfjp(FG7qu3^ovZE1Y5Xee9mH1zYZ z;1z<&FLgzZ#&tXtc!RP5#tM}UTfC1>>m{Mv=2kF=u zVm3>s<)mJvlrlz=*t#e7?vmgzk(>`ym++Lt3UL)VD|nAna!b@+0-zHZ&p z%=zKsZ)O2%7*i>OB=Hh*DiRMRwU!OZDzG5fOEKIKext2Hw6N>c0C9{2#R1>N)J6(| z+?zF7F@K5rrY#GF=Lg1Ws?_MjjJy&!L{3x=;eq=4%2FWgP2=LV{9Hs=v)SzX-}1T( zDiR5|$o5Z0W8wi9eCA;vuS{l-%$?A>Z?|s0lVbj+y@e8*DO~y12SznlTrs+3W9d$@ z8@s7I63|hJucH!*D~1+D87UQM@fKpUaso_p-IpZS$$$NkHPNL$H5mR=;8a$ZgB3%g(=hYsPha{I#p6IGHbHBt+6@snC{0tw`mfZH zReGKwuA=I2!{jSwQOH!A_$YpdiXDX;a92SNG?hK#mAlB!Z0D|9fA~BQV>LxV6$KSK zuqBtNsT$IyT>GoA=Qdz%u|ikhIJZ8e`F#Gbe*9mYezex6K_Sh2wavnFqRyB40-_5P zN}+@``*Lvxmv_CssH?;<6^^HD4veN?EDMY*U4$qEpL|k!afOO#5|uS>At7k9im^Pi zC$CXTr0P`~d@+n#o|}{F=0^=yj96GeiA^dI>JdZox79?DsppjqztMILO-s(5i!2k6CE?TMqu&vg>3slY(Iaj3I$#Kvq>Xlui@0*EZ69GU`O9tCLk zr?l$1j!G;yMwwjQZqi?zqdrHYn(s?|dS$P9V8mD>((3mr)FqS)R;-Wzy48O*s0!dz zhaPvB(*iOt(jqXS?6Klz@Rz{=0)ZG_bA_fuGXDfqP*p|$N=8#f;H^NF8A%-c^^4Cl z`9znHBX}*M4wU%e0&)p1%5(AAQHEM^9BEo;83`g;&;8G$s=vV3koqeJf&&SGa!H zTO_g8s5wr-SX1bt^)Xh^ib&vGZ;EjsOd})4aK(`PH!JqCCr~o4TP8(3=q5OnI(y4W zZ(FLeO7vJVzSJd+aGe;$DHO`sA;uDtj=C=4u{uL*3Bq9=5XDD4mJ&`$NXba@3xWkl zDz*?NUxNhXIbTr8m?d8(B?hsLn>gpVX#vvk@RWpE5eJ5$6_@Ya63nD!7*bc=GrYb4 zdMU$d5}fv9SZZXB!O;3?hOruKTin$$E$4~HSf{^v zTG3aPh-yFB7!QF>RI-DL15cRRwp$TPoKU6r6;G5&$yD?Ppw9N;T8@eYqoSbVAQHMe z0u&`gCI2c*QK*dtF(1lg%alPy%%ys~^oyagNNmAW@^>wX<||V?btIigQYg&JLzt0* z#8sD|Dh%369rePwRdMCns@Wx-%@4pNlD9D%omseW)HaVrj(ULG16ii3SQn|rS7<%vuIYi@|mB-?Zf9N7EhzKKE01fp$h2w=r%+1yMx zU*_r#!lVgIFHgK7oCcj5uBXApy}i5n=8o}#$vm^&E7y1xfVj-O$+8rO6hjnBxJ)t> zVPO&CPK237q+{ac!Xe6;a;J2L2)OI-fs+Tq#7vw&U40pPs|0<9PW`zOUJz1QB#|AL zdhA*`C<&jb+`8yLx^V&k&)jBII?<)Ar6m{m8e5hkbi-#qab1Nc<>wGE<2P1e78QMv6XuyohAJ7`R zXWW>1dkG)msP8Eg^pI(c)P|8J&B#lDDtwh8;;K)UB2{dh^v& zRoYX;l^7nYqb@HRcBW$3b(jgGgyo{nsT-1U@XEhtshPbPw4)3u#Bikp-qW0ugJk-H zZaW7{zd`{%TkelEBFP9%btB4(v`vF6%o3GOAwD*exRs*0-IDg~EmdW`yfN50hVEoQB)XD5w+|S}~;PuaoZgKl}fjyXcA%dHWiO zY6JC^Y{NIJ=$u{$iGl)u;a+u0@vca}t$~WXr&0`^MU}+0q+Q~PW&%Gg?Pw6!8eH?L z6u5wPKLV~lS+UKp7-s&RYTlHIs6cam=sqf96z<3ti&oV|F*!S<%V_G?kYg-aVl3;TrQM4{X6PJ)AUtVDNK)|05~qz`y@fH)?AMA&f@7`s!6b28aJj#)!y*@bqk9VJ}%QAs8PY``S1 zmW`S<$(!G(>!t2fFqWdAa%EL#9;6tnLmI3uWws0@7C4vU%3xM)%o7+BComwx5{=5- zG#K0UN#uv*h(=V%%^rLYee0~TouR@4UU#{=#25N0)M?(!qs9LC>SS9Rap&07kR8E;FGAPZwo1}rdJrb7Rm+emwuJ$9RFL=SG;}tYBR_s>(W|| z?{i2Rmod#0*tg;OG7)@k;#uYFCX84vG5LBRiLjD(*WGk-+gQt{6fW)7Y#b z|9@08lxgmxl1)Z(xRn(T6CO*lAiW+}Woq{TW2OHTVCrffEL;++L)Av<%C4lMN`#Ww z*5_y|V^Bo}Ws6}cb1W-C_gzWM@&vx#-`E}1b{+x5@B0lqB6X@Ne34RK`;T27`uu5=Q zMV9k9kF2&xU)9n-(`$k?+HWa=@46Ml&sGxuxp;kvKsL@bZ>vH%UOFbRxL)bc9bI{H zF64rIp3>>*^?e2XfI*nqKek3Kj&%2#>bzIFCz}Z8lT0^}M9(3#nhOxBuLSy(e+KvDc+7EkQ-fy#>kMufRUR`iF-K3w4jOL5#J@HDyJ4oGo9Xc^DmG8?rNjnTb%7(d* z$#DLy#O&$;g(7zg`i+?a=UPHb-1f&T2BQ#)!h7HSLL`Cz?ke zI#&emjmIZddJauUw(&=r0xUkNExi9y?d^^DkbN1=>sId>T&^=;=Mp&5t@;9PM9=hBBtc+ z4sS3;Z<1C`(c#a8agvjT4jrU9Dk0>>P@`B(oc2YgxNYS>-@HL!Rtga$jR?}Z{;~R%x_%{5 z*hVc!o}GHGs<)kkQeDVT{Y%BQozjz$(7C-3yOZI;NLddT6fL#tlwL>_re#>7*erA7 zD&qA0iMpk)=__N! zoSYUw1fsC|9;>o6;e;X-1$lF4ml8qEi78J88M`r;nEOaAwNcg>YxBOs96UBRzUXfpX)o9&%6LN3au)OX z(!Ko&pszMSQ!;hGg{{`C5{4^OkywQj3W82st0dM9Sf~|NLZYx(AQH4G0q1Qo_FNDM z#y0T;+5=6qqF^frho(vi530g&f=u3FWMNt{q|6aM;YI|f=yXZBFhN%YFqSPBN+3%& zY?kNL&~;fWVrL!RyUZbi@@O4PWu=RZOGRRBFM_ZxYCa&J&HC2Ik}dt0LMtjK^V2fSKAK$8%!_bNKAnJ~!{S28kYhHS6KmV1-zAD?%5bw+1tb#F`gs!Lt zT^06$$*K~%+Na7`zQ<=1-}=B8f9G$1FY|;}fU4s_B-{wMpE-8rO1A|u#HI|0)jn=^s!1SHihxtb1<*PNL4JA(eip{+5G=;^!u zR(*{^#N+tmR?F0!Bo#7$bI--V{L^|eXDSJ=4E>}0?yxa$gP|HITqxy7Y1Ymuy z;+T_@VZ!uQU%;2tV4LKDhEUEzA?a0GnE*?%Stc0JfmQ)zk_tps*Ev!^C1tfF+PODN zDdHEY##IhX;fjXFm~--(eArY-PG=&(bLECX53!MF_M*4lneE(p^AG*v@BQ+}zj)tS z+f+CU*sD#Woy%KQr|y)D9wsLqu7$4tN;`Y))1R|LJpbZXi~9=oVi_*%xFsUt*{7fW z?F;7ak<;wIf#8krORaEwAS}H~PjV^anjL}HrIS`F7 zEz#AU(@+2Qj+ux%u9C#npoAyb7RzJHs;6P$!32236(km|Lt=%jRaHFmG-6C7 zk2B84)Y#0yLs<&4#aB7?!#-})HdraJ%B`mW;gl&?4dJB6wS1X{P+4pXmL#H%r0L_GJL0CNvbqFg3THyF<4)J;RYgD_K&bn1ZLMhcGlTMEL9MAf#N2! zvu9rr6G@H;YLXZ$(#k@dU|61}7)z(mbz?I4T{&+g5O`@lmi~3bA}9E1qK`7482fL( zFk7ogqd??0NkQm;d*KZtBWr2B3pEo?J`E(=8+BSnx~7C%oanjyKnu3;BlxeBn%%4+ zdk!1~0W2D|QmfSJp&hd4t2#|q<&Tq&27zsZG~hRcx2n*U%dk{HF)8dtC;(bP$r8>% zs)(_QGGe(IfPB7hgiy|Q-t;66H)Dhjt7M~+>m!<9aaxw-!N*F5m$2fy<8*UmyQ zR(tL9uig^6B42goYvDOWY3MxZCgh;GZ4R)O=;{Zb{;h|brqVLZbpq#Bxapdm&wR^E zzVftZE}B-D#atHIKRf}z@~%MDV8tBE62glF>F5gqFU$nB$y}Z@JKq6DzG?Mp_if@f z_GQ-lO1F<&Yztx zAiJL`fY_joidR=M1G91flr2eNmS{w!JIDliXasCl@9Bl1l@4bd4OdmyC4h<|fqa?bwI2=mx%ph^e#B0+&IE#J{(M5X`A-?7hHRG zVk`}?3dZYw%~V}3iK9TpRQTf}V;UcloYj|o57`r}hc zk4=FEgVL!m?TJ!C=C@q)A_Z=d_r-o+B!@NJ~9X zJeK(B#}0{=^H^QdGuRPzBiL?n}Kd5C`>OmE&G^vHKObSUAqH?8DLbV%( z43kWQR#NkRst2s?PXtg*B7Bx=#R?Rc8^Qrhx!R_={sq^3?7>eyeEQL|3SiBqqAMz* zt2$C=iY%Q=D^$#28|aG0?jRzlc~LChjoW9&7?{}zm?9%Lb#!zhEUzpC%Fy^>BfMnT}!fvOdz1!2AJ!|)%iGItbZ$# z^dG{5o;D{!VOB0qCn6n^=!6v#lGrs@fpWS}NxTQ9P{#?E}&k8G{gsh&vG` zYM6h39U79YZ-)duHoXqkAiN!%w2iFrhqaEA}zNLSTruCk_VuK57&oQ4Az3WsJ=&I z0?zcC6N?M;Il)juyYTE3W3|`5;2Mu%s-&+N-0OzpAnjGCsb?y-E265@@;ta6gT+M8 z>CqKW0d>o+K;foq4t@GtuKLQ;p0!k23Fao;B3f|UZ3!0kkAz#K!^}aExd9V!*9m;2 zT#9b8sS=T2l?l1A66>}`O_Oi|u434ja3U*mD$_Q+EyAhRZ)}Pv4YRX>8JP1khcsmP zou_JT7Gw~!gT#u40y$mmM13jYR^Fz`hSSOc3a{?*RJ2>lLgmFl@ffVIGcOTKbqHe( ztW|GIN}c3;5+wwaM1!Rvf=6PR{y{0DrJAQwMq>fhQ&Gx`;F_ra)i7T5tQDu+UTlCpQQU;mI6QX^sByn(X+-g{6 z1BLkZpj#d5wjCdH=mK6QoY+4ITP2+8Mf#ISGJo3m%g>I=6Omyhnks}@a7XMwSopye zZ(e$Q!~jC4#8rx+l5pJ-zHoLQk8p^no-T8-*ZJSFl3R`9su5RBfL4j*UI;nI=l`v4 z9;A|Jol1@jRAcB+2OcUt;)QCi_~qbvc_N_|;V%wjU{u0Dif^S-z9D4Y#1X|0fQFmv zo`2299{j{3XNMST=Cd*ZUqrN_>1d^A6>c=F0!iaLY-Tt8)&K6d|H}tXEl$^?s~v7e zDF<1XMj9w9;r26^y|`muK3&fvl&W8%YHik&EzA<<8kzhigRem>$6Dvr8mldhi?oyc(Da+w%fsqIMUH zt3<+h9G_m>087=vDF;AJOx-Eiih7QzB2{~=c)ilz%cz<*Ag-X}Xlx~#zGrBxWt`<* zQ}|iao;Y&0h_Tw2_8P1JO_idZaTzaCYq8IP=^+XUITZHO4X;1=@E3|CR*J4-TqxXj z+=!v97~6lV3kgiIiq2wIj9tE|#Ms3;)GXcdsiAIJ}@EK4m53Y3TCiyuCKF(@P; zh&otOC6-z+2^dIXqE5n0CW%N8W`<-YnL+M7r}y$lpYGm|wf0`SyYHPjbu+oQPxs#4 zeNONF?QebSTLMk04}nQe5RfyJf}Dw$-ct(Hr2|1zJrI(%Td=u43-U*-BY9Bfs2D02 z)Y-C-h=#L$CDdub7Xx!_7C|Z|9IxC7z2C|I-KDZt(5FK=PG#MQ)be(2Qv%yOLFgGQ z+vf?UtgRwpI|Hi7;c}SBAXj`4WT|@zmMWBOkq(li<>dqTDu9xFN62aDwa`k}Cb5fF z%yD4aiy{(|@u^@V0W@U_FTVVd(<4yWi`qALL#VX{Ot!;gXXa^8#g1br3EDttzY3X8{ULM^kVd zGG-8! zC`Din#MmOaVXNvi!B`%^(v)`I9Qq0b)mJ8C5hdOyx*}uD#pgcjp~oI!GYVaF#a?Es zUcdD4SwDDmrCvAbGyqJ&K2e`k1hAA=SV|rU3YAid=~E$v83W*Oln-iYekD%Va`v1@ z%Df=w=2c=6mh&FdBo;s_HBWW&SuzY1DTLw|lD$^|Nl1qv6I#jDVw%k&Ox*?tT498) zTI7T-U?LYy$n zp#WN?O&+F$Rstl#44xE>8+e(Q)K1DV%iUO+>WYhZ{re;Tacad_GXXYJK!~B;Th5@!Hsc{at;d14!WAB zNSWqKycz*fyg>GaS;(B8YlxLN$)q-`?+*H6i@jLPRbICDqCGcs>KJw&RZP`FaBGoz zV$Rhm0Rmz>-!yWnl}@V>Y&ko0Y#9QyqN`QI=&bcoT)Z+f7db2d`PQW}HARkk-S=Yf zaaEi)2vO!B%Vtf0rP`A(0Z;4>Wg_}Ku94vt6;oi8gfu$wyKkUCNe>9jQFXp#N)}gz z-ti39LrUXHLJsdCP<0xJu>zZhM7&KlTws|EIkgRxa`>cA0VGQhvP)Zo7?W5Hy1H@4 zMQbY;&@LyZp{!nVc>9X70+h|_BY8%eoI_cK#ybZTvPYoPxM*Ua#*D-fFea5L;m;zdo4wSs&Y4RQ`)LK09@gnh8i|k zT)gYl1`17zJDC_=m25%XAy`KCG$fY0<>_c{JpZDOyRv93n%b;Au;bDPcKqC&mq_uP4;^DQ3*#KwPPx&W!~g^F*ORO`%Sl0q z9kipZ9@|iI<^+xe9Mh5u+JkZLvp z)ho#q)kHOsC8(j<-fe{LUFpaAzqJ2$g7>apvP4ASxHeFC=Iv$n=g*@nqVCEm`tp$Q zyL(r|K&A6TG#Fh)EeDU3R5d#)@|dcSNI`mK;t};rMv~O241-dP9VNj~!VoKAH!6km zBvh0rM_8h2PtHjQur^z}`KR9g(jVAq(3~;`E9s&xGfXL9B>*f`REf?Mcm`G&mT^Eu z#}@0nXFb~5Vj;kes(QtlPXjY+yw|_J>al@RLsNp!OOC zP;f9H$e-hztPwN8@N_?r%D}-y>4Y%Q`+Hd9L%2PilpZ!k=>-{S9cJ#EGQ$9L#lk^M z62zR5Rq`>ZZM~?M@BY$l_(uKjnv{pMeL#;%=54n9<`FM*X|VM@dax#G~VIhm$# zp)^QPL};~JTqDuI0t*8)<2q>(2M0p&R)jJbHC52KlQ2iDyOr+%CEB$^&Rle$5koQ} zm8qN~lVrLzYmiKsTT5y@;FWqL@Ozf+F5l2^#cEoD(y(nBN0diJhI z4xbtx%e86HhTd}Y6^ODP#1st%LVzbhZ)E~@4B|0po^$TAAA0PO+Ae>nn!W9UXPRp5 zz>b$3+5Q7Zd+&7wHSS5wtdR6afL!hBO!m=a01Na|dWE>SJb|kWU_q%SeS~Gh@W!*y zFyC^nHgnbpl%4)zi0mCSsf(cXz6UOlDu30}cD3B|&_JtqeeuJ4AN=AszIV7Ld&agi zcE5J_e7<(U&gUID_z(ivx<GPP#$mfpbG%fUJUuPK^P*yq7u9XNhUcD$V4T+5=?1x4i$NYR1j#;AR$G|TD#HA zT^`aJg^z^LNF%%K1@G%yEqI?5g{2a^<KkYm9a8G#0EOO?>UEf^hCkM>T+QNIU*bXWi0oN;aI zrM2(*(npSOocPZAG26%XXt`X@XY<*7ZP)eJT3g?H>t4IQuD z&~7)iLFDQpR~7)fJyBw@I{vAyy1tAxkXL<$-CAQ2u(``KL>sAov2EEJ3rXK80H~Zj z(+rle2HQQ2H8Gio0M<}Q!cx@eLN3S{r%X{4(MGRk)t;CcW_XA_N))%tSdz56~IK&x(ez4FCZ z-uC|6X7gEdn6w9nAOY4ieg;}6g!As>Ade~G3t!M(ECVDhbe*d%|1d(b_rs6dvfmg~=EZqgk zz?bA|+=+BZlBN30nGhvfBj5nN5Lx!lY-73c2VeM;d%wMZD>2qA@t&>hKfL(f?_r(T z=M0+t?EcFL;O}?-`$_Dx^UkE%&+gv^0H51=4**=Ve;2k`!9`blFS#24uDSnZ0I>Ix zyH+g-6xen{x{1ffHBE~}mr)0CRu#1UEtmJ{& zf;TbwB(p&P87qd-R1-X&Y$iXKcwcJ!&+xqC^M_0OP1RyY`GF7$fhHI^@@BKsvvm#<_ zRR{-!qCK!8BB5od+U;FCZ9SgmCiOSknOa;s3-7V(X)3p|ReNnCEko8=Lb#6Dek8Zd zSzMk+bEqqWsM7lGA*Ku<$d`umTRHNK#zX*lFjZjgSxi}#vR31WEB0;VZyMhqiZ_@6 zeJMu?fAiXG?dGe0`S-u@C--e3#+oJQD+Kr+){mRzIW&{1g$5z0$8iY&Pp4UTZ6|Sw z@=WbwvXi)c%q-8P85>i043}LVzzQK@u`?C|oHWa$xHymI?6F62(Ir-%Fw3L3IA7S) zeVs6iBe>W>^K{qEp3=JnaH2(i@YtN=^Bhf za4HN}7AQ;}FE+);*%apxJ8MN_LjawWo?Z~)!BqS1`E#*IkZi*|z~NLT#IlCS!#O@E ziNv6^wb}gUt8aSO-+l1mH1X>^nqPn5s;V|YB*s?uFQ0#h zyXW~d-+l0vRc+#65VXO>ChE6?=D&3CRh6wI$$z)!R4-%An;-shp97;myZE00;HHOv zvWZB7A0jM-L?zTwo}(hv)|H-+#2QSJu>dYll5qr&3Lp}HfATJ%oY;%I+Q{IPEzd06 zCYCCTa1wP@k2ytG$fg1BO4`5$^rjYM%4icIY%CY=-M6QS31(HkhrV@a_iyaJ?R~e+ zW;1Uv#ub}&*)Lve>-xTr?_E6cy|!QQ6k0vZ;!ercuJt~=)OO->SFKf}H=qy&gq8wn zfdjTMV78nkDEXt7a{5&S4Z*eW)a}n=sf;`3r>*W!ks*SPjPy2gSGXckL&&oQ7w12ug z2Rj5mMQ5(`xN1(L`)NQGdfTz$dM^(AWhxb@AIqU^x=J`fW6os4_BH-hsj-@;5HeFC z1y?|P`;;0f`(^}dD9Xn*gi(@p;UPi)5gHoBr&QZ|eX;T0eIGsWp{WbHm&+tFC$d{~jdjj8J6IONxj!zc_m*Cfvq0SF0Fhrof z{2%p>Pu8nf)3{Rghqtu|9eb+A&Waj)tyNczfmZzEI!XmwZ0BCZyn?$3Lctu*D$DhP z2x>=D)�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 Date: Tue, 31 Oct 2023 20:00:46 +0100 Subject: [PATCH 2/2] adapt convention --- examples/Makefile | 2 +- examples/Makefile.Web | 2 +- examples/README.md | 2 +- .../shaders/glsl330/deferred_shading.fs | 63 +++++++++--------- .../shaders/glsl330/deferred_shading.vs | 4 +- ...ed_shading.c => shaders_deferred_render.c} | 27 ++++---- ...hading.png => shaders_deferred_render.png} | Bin 7 files changed, 52 insertions(+), 48 deletions(-) rename examples/shaders/{shaders_deferred_shading.c => shaders_deferred_render.c} (97%) rename examples/shaders/{shaders_deferred_shading.png => shaders_deferred_render.png} (100%) diff --git a/examples/Makefile b/examples/Makefile index 82198b76e8b2..fe0ee9fbd1a8 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -563,7 +563,7 @@ SHADERS = \ shaders/shaders_multi_sample2d \ shaders/shaders_write_depth \ shaders/shaders_hybrid_render \ - shaders/shaders_deferred_shading + shaders/shaders_deferred_render AUDIO = \ audio/audio_module_playing \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index f956ff7ce7bf..c57453ab366c 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -469,7 +469,7 @@ SHADERS = \ shaders/shaders_multi_sample2d \ shaders/shaders_write_depth \ shaders/shaders_hybrid_render \ - shaders/shaders_deferred_shading + shaders/shaders_deferred_render AUDIO = \ audio/audio_module_playing \ diff --git a/examples/README.md b/examples/README.md index 8ecd7741e630..0fed8acd03a7 100644 --- a/examples/README.md +++ b/examples/README.md @@ -176,7 +176,7 @@ Examples using raylib shaders functionality, including shaders loading, paramete | 114 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | shaders_mesh_instancing | ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) | | 115 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | shaders_multi_sample2d | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) | | 116 | [shaders_spotlight](shaders/shaders_spotlight.c) | shaders_spotlight | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) | -| 117 | [shaders_deferred_shading](shaders/shaders_deferred_shading.c) | shaders_deferred_shading | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) | +| 117 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | shaders_deferred_render | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) | ### category: audio diff --git a/examples/shaders/resources/shaders/glsl330/deferred_shading.fs b/examples/shaders/resources/shaders/glsl330/deferred_shading.fs index 64de325ff3af..c9c6a313fb14 100644 --- a/examples/shaders/resources/shaders/glsl330/deferred_shading.fs +++ b/examples/shaders/resources/shaders/glsl330/deferred_shading.fs @@ -9,11 +9,11 @@ uniform sampler2D gNormal; uniform sampler2D gAlbedoSpec; struct Light { - int enabled; - int type; // Unused in this demo. - vec3 position; - vec3 target; // Unused in this demo. - vec4 color; + int enabled; + int type; // Unused in this demo. + vec3 position; + vec3 target; // Unused in this demo. + vec4 color; }; const int NR_LIGHTS = 4; @@ -24,31 +24,32 @@ const float QUADRATIC = 0.032; const float LINEAR = 0.09; void main() { - vec3 fragPosition = texture(gPosition, texCoord).rgb; - vec3 normal = texture(gNormal, texCoord).rgb; - vec3 albedo = texture(gAlbedoSpec, texCoord).rgb; - float specular = texture(gAlbedoSpec, texCoord).a; - - vec3 ambient = albedo * vec3(0.1f); - vec3 viewDirection = normalize(viewPosition - fragPosition); - - for(int i = 0; i < NR_LIGHTS; ++i) { - if(lights[i].enabled == 0) continue; - vec3 lightDirection = lights[i].position - fragPosition; - vec3 diffuse = max(dot(normal, lightDirection), 0.0) * albedo * lights[i].color.xyz; - - vec3 halfwayDirection = normalize(lightDirection + viewDirection); - float spec = pow(max(dot(normal, halfwayDirection), 0.0), 32.0); - vec3 specular = specular * spec * lights[i].color.xyz; - - // Attenuation - float distance = length(lights[i].position - fragPosition); - float attenuation = 1.0 / (1.0 + LINEAR * distance + QUADRATIC * distance * distance); - diffuse *= attenuation; - specular *= attenuation; - ambient += diffuse + specular; - } - - finalColor = vec4(ambient, 1.0); + vec3 fragPosition = texture(gPosition, texCoord).rgb; + vec3 normal = texture(gNormal, texCoord).rgb; + vec3 albedo = texture(gAlbedoSpec, texCoord).rgb; + float specular = texture(gAlbedoSpec, texCoord).a; + + vec3 ambient = albedo * vec3(0.1f); + vec3 viewDirection = normalize(viewPosition - fragPosition); + + for(int i = 0; i < NR_LIGHTS; ++i) + { + if(lights[i].enabled == 0) continue; + vec3 lightDirection = lights[i].position - fragPosition; + vec3 diffuse = max(dot(normal, lightDirection), 0.0) * albedo * lights[i].color.xyz; + + vec3 halfwayDirection = normalize(lightDirection + viewDirection); + float spec = pow(max(dot(normal, halfwayDirection), 0.0), 32.0); + vec3 specular = specular * spec * lights[i].color.xyz; + + // Attenuation + float distance = length(lights[i].position - fragPosition); + float attenuation = 1.0 / (1.0 + LINEAR * distance + QUADRATIC * distance * distance); + diffuse *= attenuation; + specular *= attenuation; + ambient += diffuse + specular; + } + + finalColor = vec4(ambient, 1.0); } diff --git a/examples/shaders/resources/shaders/glsl330/deferred_shading.vs b/examples/shaders/resources/shaders/glsl330/deferred_shading.vs index d6bd88d1c1a6..f2b1bd7c4ec0 100644 --- a/examples/shaders/resources/shaders/glsl330/deferred_shading.vs +++ b/examples/shaders/resources/shaders/glsl330/deferred_shading.vs @@ -6,6 +6,6 @@ layout (location = 1) in vec2 vertexTexCoord; out vec2 texCoord; void main() { - gl_Position = vec4(vertexPosition, 1.0); - texCoord = vertexTexCoord; + gl_Position = vec4(vertexPosition, 1.0); + texCoord = vertexTexCoord; } diff --git a/examples/shaders/shaders_deferred_shading.c b/examples/shaders/shaders_deferred_render.c similarity index 97% rename from examples/shaders/shaders_deferred_shading.c rename to examples/shaders/shaders_deferred_render.c index 1aacd88eff51..58d4b1dd9795 100644 --- a/examples/shaders/shaders_deferred_shading.c +++ b/examples/shaders/shaders_deferred_render.c @@ -48,8 +48,7 @@ int main(void) { const int screenWidth = 800; const int screenHeight = 450; - InitWindow(screenWidth, screenHeight, "raylib [shaders] example - deferred shading"); - + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - deferred render"); Camera camera = { 0 }; camera.position = (Vector3){ 5.0f, 4.0f, 5.0f }; // Camera position @@ -70,12 +69,12 @@ int main(void) { "resources/shaders/glsl330/deferred_shading.fs"); deferredShader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(deferredShader, "viewPosition"); - // Initialize the G-buffer GBuffer gBuffer = { 0 }; gBuffer.framebuffer = rlLoadFramebuffer(screenWidth, screenHeight); - if(!gBuffer.framebuffer) { + if(!gBuffer.framebuffer) + { TraceLog(LOG_WARNING, "Failed to create framebuffer"); exit(1); } @@ -93,13 +92,11 @@ int main(void) { // Activate the draw buffers for our framebuffer rlActiveDrawBuffers(3); - // Now we attach our textures to the framebuffer. rlFramebufferAttach(gBuffer.framebuffer, gBuffer.positionTexture, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0); rlFramebufferAttach(gBuffer.framebuffer, gBuffer.normalTexture, RL_ATTACHMENT_COLOR_CHANNEL1, RL_ATTACHMENT_TEXTURE2D, 0); rlFramebufferAttach(gBuffer.framebuffer, gBuffer.albedoSpecTexture, RL_ATTACHMENT_COLOR_CHANNEL2, RL_ATTACHMENT_TEXTURE2D, 0); - // Finally we attach the depth buffer. gBuffer.depthRenderbuffer = rlLoadTextureDepth(screenWidth, screenHeight, true); rlFramebufferAttach(gBuffer.framebuffer, gBuffer.depthRenderbuffer, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_RENDERBUFFER, 0); @@ -107,7 +104,8 @@ int main(void) { // Make sure our framebuffer is complete. // NOTE: rlFramebufferComplete() automatically unbinds the framebuffer, so we don't have // to rlDisableFramebuffer() here. - if(rlFramebufferComplete(gBuffer.framebuffer) != true) { + if(rlFramebufferComplete(gBuffer.framebuffer) != true) + { TraceLog(LOG_WARNING, "Framebuffer is not complete"); exit(1); } @@ -139,7 +137,8 @@ int main(void) { const float CUBE_SCALE = 0.25; Vector3 cubePositions[MAX_CUBES]; float cubeRotations[MAX_CUBES]; - for(int i = 0; i < MAX_CUBES; i++) { + for(int i = 0; i < MAX_CUBES; i++) + { cubePositions[i] = (Vector3) { .x = (float)(rand() % 10) - 5, .y = (float)(rand() % 5), @@ -161,7 +160,8 @@ int main(void) { //--------------------------------------------------------------------------------------- // Main game loop - while (!WindowShouldClose()) { + while (!WindowShouldClose()) + { // Update //---------------------------------------------------------------------------------- UpdateCamera(&camera, CAMERA_ORBITAL); @@ -205,7 +205,8 @@ int main(void) { DrawModel(model, Vector3Zero(), 1.0f, WHITE); DrawModel(cube, (Vector3) { 0.0, 1.0f, 0.0 }, 1.0f, WHITE); - for(int i = 0; i < MAX_CUBES; i++) { + for(int i = 0; i < MAX_CUBES; i++) + { Vector3 position = cubePositions[i]; DrawModelEx(cube, position, (Vector3) { 1, 1, 1 }, cubeRotations[i], (Vector3) { CUBE_SCALE, CUBE_SCALE, CUBE_SCALE }, WHITE); @@ -219,7 +220,8 @@ int main(void) { rlDisableFramebuffer(); rlClearScreenBuffers(); // Clear color & depth buffer - switch(activeTexture) { + switch(activeTexture) + { case DEFERRED_SHADING: BeginMode3D(camera); rlDisableColorBlend(); @@ -252,7 +254,8 @@ int main(void) { // forward rendering BeginMode3D(camera); rlEnableShader(rlGetShaderIdDefault()); - for(int i = 0; i < MAX_LIGHTS; i++) { + for(int i = 0; i < MAX_LIGHTS; i++) + { if(lights[i].enabled) DrawSphereEx(lights[i].position, 0.2f, 8, 8, lights[i].color); else DrawSphereWires(lights[i].position, 0.2f, 8, 8, ColorAlpha(lights[i].color, 0.3f)); } diff --git a/examples/shaders/shaders_deferred_shading.png b/examples/shaders/shaders_deferred_render.png similarity index 100% rename from examples/shaders/shaders_deferred_shading.png rename to examples/shaders/shaders_deferred_render.png