From 3e3a7650e85f4bed9bd55013cb11157ddf721a47 Mon Sep 17 00:00:00 2001 From: mduval76 <9343789@etu.cegepsth.qc.ca> Date: Fri, 1 Dec 2023 13:48:48 -0500 Subject: [PATCH] Push options Volume et Resolution de base --- SQCSim-common/define.h | 7 - SQCSim2021/define.h | 7 + SQCSim2021/engine.cpp | 583 +++++++++++------- SQCSim2021/engine.h | 13 +- SQCSim2021/media/textures/Buttons/check.png | Bin 0 -> 2256 bytes SQCSim2021/media/textures/Buttons/checked.png | Bin 0 -> 10058 bytes .../textures/{Bouton => Buttons}/effets.png | Bin SQCSim2021/media/textures/Buttons/fhd.png | Bin 0 -> 10301 bytes .../textures/{Bouton => Buttons}/gameplay.png | Bin .../{Bouton => Buttons}/graphiques.png | Bin SQCSim2021/media/textures/Buttons/hd.png | Bin 0 -> 13200 bytes .../textures/{Bouton => Buttons}/musique.png | Bin .../textures/{Bouton => Buttons}/options.png | Bin .../{Bouton => Buttons}/principal.png | Bin SQCSim2021/media/textures/Buttons/qhd.png | Bin 0 -> 12231 bytes .../{Bouton => Buttons}/resolution.png | Bin .../{Bouton => Buttons}/sensibilite.png | Bin SQCSim2021/media/textures/Buttons/uhd.png | Bin 0 -> 12383 bytes .../textures/{Bouton => Buttons}/volume.png | Bin 19 files changed, 386 insertions(+), 224 deletions(-) create mode 100644 SQCSim2021/media/textures/Buttons/check.png create mode 100644 SQCSim2021/media/textures/Buttons/checked.png rename SQCSim2021/media/textures/{Bouton => Buttons}/effets.png (100%) create mode 100644 SQCSim2021/media/textures/Buttons/fhd.png rename SQCSim2021/media/textures/{Bouton => Buttons}/gameplay.png (100%) rename SQCSim2021/media/textures/{Bouton => Buttons}/graphiques.png (100%) create mode 100644 SQCSim2021/media/textures/Buttons/hd.png rename SQCSim2021/media/textures/{Bouton => Buttons}/musique.png (100%) rename SQCSim2021/media/textures/{Bouton => Buttons}/options.png (100%) rename SQCSim2021/media/textures/{Bouton => Buttons}/principal.png (100%) create mode 100644 SQCSim2021/media/textures/Buttons/qhd.png rename SQCSim2021/media/textures/{Bouton => Buttons}/resolution.png (100%) rename SQCSim2021/media/textures/{Bouton => Buttons}/sensibilite.png (100%) create mode 100644 SQCSim2021/media/textures/Buttons/uhd.png rename SQCSim2021/media/textures/{Bouton => Buttons}/volume.png (100%) diff --git a/SQCSim-common/define.h b/SQCSim-common/define.h index 405ab0f..4e7b0b0 100644 --- a/SQCSim-common/define.h +++ b/SQCSim-common/define.h @@ -45,13 +45,6 @@ enum ANIM_TYPE { STILL = 0, SHOOTING = 8, JUMPING = 16, JUMPINGSHOOTING = 24, DE enum ANIM_POS {FRONT, QUARTER_FRONT_LEFT, QUATER_FRONT_RIGHT, PROFIL_LEFT, PROFIL_RIGHT, QUARTER_BACK_LEFT, QUARTER_BACK_RIGHT, BACK , POS_LAST}; typedef uint64_t Timestamp; -enum Resolution { - HD = 0, // 1280x720 (High Definition) - FHD, // 1920x1080 (Full HD) - QHD, // 2560x1440 (Quad HD) - UHD // 3840x2160 (Ultra HD) -}; - #ifdef _WIN32 #pragma comment(lib,"wsock32.lib") // Pour pouvoir faire fonctionner le linker sans le vcxproject diff --git a/SQCSim2021/define.h b/SQCSim2021/define.h index e268b20..28168bb 100644 --- a/SQCSim2021/define.h +++ b/SQCSim2021/define.h @@ -37,4 +37,11 @@ #define MENU_ITEM_PATH "./media/menu_items/" #define BOOSTER_TEXTURE_PATH "./media/textures/Booster/" +enum Resolution { + HD = 0, // 1280x720 (High Definition) + FHD, // 1920x1080 (Full HD) + QHD, // 2560x1440 (Quad HD) + UHD // 3840x2160 (Ultra HD) +}; + #endif // DEFINE_H__ diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 4f61b3e..de7b994 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -13,7 +13,6 @@ struct Notification { float displayStartTime = 0.0f; }; - // Use a queue to manage notifications //std::queue notificationQueue; // Use a vector to manage notifications @@ -29,6 +28,234 @@ Engine::~Engine() { m_world.GetChunks().Get(x, y)->~Chunk(); } +void Engine::Init() { + + GLenum glewErr = glewInit(); + if (glewErr != GLEW_OK) { + std::cerr << " ERREUR GLEW : " << glewGetErrorString(glewErr) << std::endl; + abort(); + } + + uint64_t seed = SEED; + + glDisable(GL_FRAMEBUFFER_SRGB); + glEnable(GL_DEPTH_TEST); + glEnable(GL_STENCIL_TEST); + glEnable(GL_POINT_SMOOTH); + glEnable(GL_BLEND); + //glEnable(GL_CULL_FACE); + glEnable(GL_TEXTURE_2D); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + gluPerspective(45.0f, (float)Width() / (float)Height(), 0.1f, VIEW_DISTANCE); + glShadeModel(GL_SMOOTH); + + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + glDisable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_SUBTRACT); + + if (m_istarted) + return; + else m_istarted = true; + + // Objet de skybox avec sa propre texture et son propre shader! + m_skybox.Init(0.2f); + // Objet de musique! + //m_audio.ToggleMusicState(); + + // Array pour les balles. + for (int x = 0; x < MAX_BULLETS; ++x) { + m_bullets[x] = nullptr; + m_whoosh[x] = nullptr; + } + + char* ch = new char[2]; + + std::cout << "Jouer en ligne? [o/N] "; + std::cin.getline(ch, 2); + std::cout << std::endl; + + if (*ch == 'o' || *ch == 'O') { + char* input = new char[32]; + std::string playname, srvname; + + while (playname.size() < 1) { + std::cout << "Veuillez entrer un nom de joueur: "; + std::cin.getline(input, 32); + std::cout << std::endl; + playname = input; + if (playname.size() < 1 || playname.size() > 32) + std::puts("Nom invalide."); + } + while (srvname.size() < 1) { + std::cout << "Veuillez entrer une adresse de serveur: "; + std::cin.getline(input, 32); + std::cout << std::endl; + srvname = input; + if (srvname.size() < 1 || srvname.size() > 32) + std::puts("Adresse serveur invalide."); + } + delete[] input; + + if (!m_conn.Init()) { + if (!m_conn.Connect(srvname.c_str(), playname)) { + // setup jeu en reseau. + std::cout << "ID recu du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl; + std::cout << "Seed recu du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl; + m_player = Player(m_conn.getOrigin().position); + + for (auto& [key, player] : m_conn.m_players) + m_players[key] = new RemotePlayer(player); + + seed = m_conn.getSeed(); + m_networkgame = true; + } + else std::cout << "Erreur de connexion." << std::endl; + } + else std::cout << "Erreur de creation de socket." << std::endl; + } + delete[] ch; + + m_world.SetSeed(seed); + + // Init Chunks + m_world.GetChunks().Reset(nullptr); + + m_startTime = std::chrono::high_resolution_clock::now(); + + m_remotePlayer.SetPosition(Vector3f(.5, CHUNK_SIZE_Y + 10., .5)); + // Gestion de souris. + CenterMouse(); + HideCursor(); +} + +void Engine::DeInit() {} + +void Engine::LoadResource() { + LoadTexture(m_skybox.GetTexture(), TEXTURE_PATH "skybox.png", true); + //LoadTexture(m_skybox2.GetTexture(), TEXTURE_PATH "skybox.png", true); + LoadTexture(m_textureCrosshair, TEXTURE_PATH "cross.bmp", true); + LoadTexture(m_textureFont, TEXTURE_PATH "font.bmp", true); + LoadTexture(m_textureGun, TEXTURE_PATH "gun01.png", false); + LoadTexture(m_texturePovGun, TEXTURE_PATH "GUN.png", false); + LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); + LoadTexture(m_textureSoloText, TEXTURE_PATH "single_player.png", false); + LoadTexture(m_textureMultiText, TEXTURE_PATH "multi_player.png", false); + LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); + LoadTexture(m_textureTitle, TEXTURE_PATH "title.png", false); + LoadTexture(m_textureOptions, TEXTURE_PATH "Buttons/options.png", false); + LoadTexture(m_textureVolume, TEXTURE_PATH "Buttons/volume.png", false); + LoadTexture(m_textureMusique, TEXTURE_PATH "Buttons/musique.png", false); + LoadTexture(m_textureGraphiques, TEXTURE_PATH "Buttons/graphiques.png", false); + LoadTexture(m_textureSensibilite, TEXTURE_PATH "Buttons/sensibilite.png", false); + LoadTexture(m_textureResolution, TEXTURE_PATH "Buttons/resolution.png", false); + LoadTexture(m_texturePrincipal, TEXTURE_PATH "Buttons/principal.png", false); + LoadTexture(m_textureEffets, TEXTURE_PATH "Buttons/effets.png", false); + LoadTexture(m_textureGameplay, TEXTURE_PATH "Buttons/gameplay.png", false); + LoadTexture(m_textureHd, TEXTURE_PATH "Buttons/hd.png", false); + LoadTexture(m_textureFhd, TEXTURE_PATH "Buttons/fhd.png", false); + LoadTexture(m_textureQhd, TEXTURE_PATH "Buttons/qhd.png", false); + LoadTexture(m_textureUhd, TEXTURE_PATH "Buttons/uhd.png", false); + LoadTexture(m_textureCheck, TEXTURE_PATH "Buttons/check.png", false); + LoadTexture(m_textureChecked, TEXTURE_PATH "Buttons/checked.png", false); + + + // Pourquoi on load 3 fois la meme texture? + LoadTexture(MenuTitleTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); + LoadTexture(MenuBGTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); + LoadTexture(MenuBGOptionTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); + LoadTexture(MenuBGFlouTexture, TEXTURE_PATH "BackgroundMenuFlou.png"); + + LoadTexture(SplachScreenTexture, TEXTURE_PATH "sc2.png"); + LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png"); + LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png"); + LoadTexture(MenuStartTexture, MENU_ITEM_PATH "BasicPlay.png"); + + TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal3.png"); + TextureAtlas::TextureIndex texIceIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal2.png"); + TextureAtlas::TextureIndex texGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "grass.png"); + TextureAtlas::TextureIndex texMetalIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "dirt.png"); + TextureAtlas::TextureIndex texGreenGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "greengrass.png"); + TextureAtlas::TextureIndex texBoostHeal = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterVert.png"); + TextureAtlas::TextureIndex texBoostDmg = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterRouge.png"); + TextureAtlas::TextureIndex texBoostSpd = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterBleu.png"); + TextureAtlas::TextureIndex texBoostInv = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterJaune.png"); + + + //AJOUTER LES TEXTURES DANS L'ORDRE DE L'ÉNUM + + //JUMP + //TextureAtlas::TextureIndex JumpBack = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueBackJumpRight.png"); + //TextureAtlas::TextureIndex JumpFront = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueFrontJumpRight.png"); + //TextureAtlas::TextureIndex JumpQuarterBackLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftBackJumpLeft.png"); + //TextureAtlas::TextureIndex JumpQuarterBackRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightBackJumpRight.png"); + //TextureAtlas::TextureIndex JumpProfiltLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilJumpLeft.png"); + //TextureAtlas::TextureIndex JumpProfiltRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilJumpRight.png"); + //TextureAtlas::TextureIndex JumpQuarterFrontLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftFrontJumpLeft.png"); + //TextureAtlas::TextureIndex JumpQuarterFrontRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightFrontJumpRight.png"); + + //STILL + //TextureAtlas::TextureIndex StillBack = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueBackRight.png"); + TextureAtlas::TextureIndex StillFront = m_animeAtlas.AddTexture(ANIME_PATH_STILL "BlueFrontRight.png"); + //TextureAtlas::TextureIndex StillQuarterBackLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftBack.png"); + //TextureAtlas::TextureIndex StillQuarterBackRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightBack.png"); + //TextureAtlas::TextureIndex StillProfiltLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilLeft.png"); + //TextureAtlas::TextureIndex StillProfiltRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilRight.png"); + //TextureAtlas::TextureIndex StillQuarterFrontLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeft.png"); + //TextureAtlas::TextureIndex StillQuarterFrontRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRight.png"); + + //SHOOTINGSTILL + //SHOOTINGJUMP + + if (!m_animeAtlas.Generate(TEXTURE_SIZE, false)) { + std::cout << " Unable to generate texture atlas ..." << std::endl; + abort(); + } + + if (!m_textureAtlas.Generate(TEXTURE_SIZE, false)) { + std::cout << " Unable to generate texture atlas ..." << std::endl; + abort(); + } + + float u, v, s; + m_textureAtlas.TextureIndexToCoord(texDirtIndex, u, v, s, s); + m_blockinfo[BTYPE_DIRT] = new BlockInfo(BTYPE_DIRT, "Dirt", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texGrassIndex, u, v, s, s); + m_blockinfo[BTYPE_GRASS] = new BlockInfo(BTYPE_GRASS, "Grass", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texMetalIndex, u, v, s, s); + m_blockinfo[BTYPE_METAL] = new BlockInfo(BTYPE_METAL, "Metal", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texIceIndex, u, v, s, s); + m_blockinfo[BTYPE_ICE] = new BlockInfo(BTYPE_ICE, "Ice", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texGreenGrassIndex, u, v, s, s); + m_blockinfo[BTYPE_GREENGRASS] = new BlockInfo(BTYPE_GREENGRASS, "GreenGrass", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texBoostHeal, u, v, s, s); + m_boostinfo[BTYPE_HEAL] = new BoostInfo(BTYPE_HEAL, "Heal", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texBoostDmg, u, v, s, s); + m_boostinfo[BTYPE_DAMAGE] = new BoostInfo(BTYPE_DAMAGE, "Dmg", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texBoostSpd, u, v, s, s); + m_boostinfo[BTYPE_SPEED] = new BoostInfo(BTYPE_SPEED, "Spd", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texIceIndex, u, v, s, s); + m_boostinfo[BTYPE_INVINCIBLE] = new BoostInfo(BTYPE_INVINCIBLE, "Inv", u, v, s, 1); + + m_animeAtlas.TextureIndexToCoord(0, u, v, s, s); + + std::cout << " Loading and compiling shaders ..." << std::endl; + if (!m_shader01.Load(SHADER_PATH "shader01.vert", SHADER_PATH "shader01.frag", true)) { + std::cout << " Failed to load shader " << std::endl; + exit(1); + } + + if (!m_skybox.GetShader().Load(SHADER_PATH "skybox.vert", SHADER_PATH "skybox.frag", true)) { + std::cout << " Failed to load shader " << std::endl; + exit(1); + } +} + +void Engine::UnloadResource() {} + void Engine::DrawSplachScreen() { glDisable(GL_LIGHTING); @@ -79,8 +306,6 @@ void Engine::DrawSplachScreen() m_gamestate = GameState::MAIN_MENU; } - - void Engine::DrawMenu() { static const int sTitle = 400; @@ -351,6 +576,13 @@ void Engine::DrawOption() glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + if (m_selectedOption == 0) { + DisplayAudioMenu(centerX, centerY); + } + else if (m_selectedOption == 1) { + DisplayGraphicsMenu(centerX, centerY); + } + glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); glEnable(GL_STENCIL_TEST); @@ -363,229 +595,134 @@ void Engine::DrawOption() glPopMatrix(); } -void Engine::Init() { +void Engine::DisplayAudioMenu(float centerX, float centerY) { + glColor4f(1.0f, 0.5f, 0.0f, 1.0f); + m_texturePrincipal.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.215); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.025, centerY + Height() * 0.215); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.025, centerY + Height() * 0.25); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.25); + glEnd(); - GLenum glewErr = glewInit(); - if (glewErr != GLEW_OK) { - std::cerr << " ERREUR GLEW : " << glewGetErrorString(glewErr) << std::endl; - abort(); - } + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, 0); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.165); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.3, centerY + Height() * 0.165); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.3, centerY + Height() * 0.2); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.2); + glEnd(); - uint64_t seed = SEED; + glColor4f(1.0f, 0.5f, 0.0f, 1.0f); + m_textureMusique.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.09); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.05, centerY + Height() * 0.09); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.05, centerY + Height() * 0.125); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.125); + glEnd(); - glDisable(GL_FRAMEBUFFER_SRGB); - glEnable(GL_DEPTH_TEST); - glEnable(GL_STENCIL_TEST); - glEnable(GL_POINT_SMOOTH); - glEnable(GL_BLEND); - //glEnable(GL_CULL_FACE); - glEnable(GL_TEXTURE_2D); + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, 0); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.04); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.3, centerY + Height() * 0.04); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.3, centerY + Height() * 0.075); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.075); + glEnd(); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); + glColor4f(1.0f, 0.5f, 0.0f, 1.0f); + m_textureEffets.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.035); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.075, centerY - Height() * 0.035); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.075, centerY - Height() * 0.00001); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.00001); + glEnd(); - gluPerspective(45.0f, (float)Width() / (float)Height(), 0.1f, VIEW_DISTANCE); - glShadeModel(GL_SMOOTH); + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, 0); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.085); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.3, centerY - Height() * 0.085); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.3, centerY - Height() * 0.05); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.05); + glEnd(); - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - glDisable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_SUBTRACT); - - if (m_istarted) - return; - else m_istarted = true; - - // Objet de skybox avec sa propre texture et son propre shader! - m_skybox.Init(0.2f); - // Objet de musique! - //m_audio.ToggleMusicState(); - - // Array pour les balles. - for (int x = 0; x < MAX_BULLETS; ++x) { - m_bullets[x] = nullptr; - m_whoosh[x] = nullptr; - } - - char* ch = new char[2]; - - std::cout << "Jouer en ligne? [o/N] "; - std::cin.getline(ch, 2); - std::cout << std::endl; - - if (*ch == 'o' || *ch == 'O') { - char* input = new char[32]; - std::string playname, srvname; - - while (playname.size() < 1) { - std::cout << "Veuillez entrer un nom de joueur: "; - std::cin.getline(input, 32); - std::cout << std::endl; - playname = input; - if (playname.size() < 1 || playname.size() > 32) - std::puts("Nom invalide."); - } - while (srvname.size() < 1) { - std::cout << "Veuillez entrer une adresse de serveur: "; - std::cin.getline(input, 32); - std::cout << std::endl; - srvname = input; - if (srvname.size() < 1 || srvname.size() > 32) - std::puts("Adresse serveur invalide."); - } - delete[] input; - - if (!m_conn.Init()) { - if (!m_conn.Connect(srvname.c_str(), playname)) { - // setup jeu en reseau. - std::cout << "ID recu du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl; - std::cout << "Seed recu du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl; - m_player = Player(m_conn.getOrigin().position); - - for (auto& [key, player] : m_conn.m_players) - m_players[key] = new RemotePlayer(player); - - seed = m_conn.getSeed(); - m_networkgame = true; - } - else std::cout << "Erreur de connexion." << std::endl; - } - else std::cout << "Erreur de creation de socket." << std::endl; - } - delete[] ch; - - m_world.SetSeed(seed); - - // Init Chunks - m_world.GetChunks().Reset(nullptr); - - m_startTime = std::chrono::high_resolution_clock::now(); - - m_remotePlayer.SetPosition(Vector3f(.5,CHUNK_SIZE_Y + 10., .5)); - // Gestion de souris. - CenterMouse(); - HideCursor(); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } -void Engine::DeInit() {} +void Engine::DisplayGraphicsMenu(float centerX, float centerY) { + glColor4f(1.0f, 0.5f, 0.0f, 1.0f); + m_textureResolution.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.215); + glTexCoord2f(1, 0); glVertex2i(centerX, centerY + Height() * 0.215); + glTexCoord2f(1, 1); glVertex2i(centerX, centerY + Height() * 0.25); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.25); + glEnd(); -void Engine::LoadResource() { - LoadTexture(m_skybox.GetTexture(), TEXTURE_PATH "skybox.png", true); - //LoadTexture(m_skybox2.GetTexture(), TEXTURE_PATH "skybox.png", true); - LoadTexture(m_textureCrosshair, TEXTURE_PATH "cross.bmp", true); - LoadTexture(m_textureFont, TEXTURE_PATH "font.bmp", true); - LoadTexture(m_textureGun, TEXTURE_PATH "gun01.png", false); - LoadTexture(m_texturePovGun, TEXTURE_PATH "GUN.png", false); - LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); - LoadTexture(m_textureSoloText, TEXTURE_PATH "single_player.png", false); - LoadTexture(m_textureMultiText, TEXTURE_PATH "multi_player.png", false); - LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); - LoadTexture(m_textureTitle, TEXTURE_PATH "title.png", false); - LoadTexture(m_textureOptions, TEXTURE_PATH "Bouton/options.png", false); - LoadTexture(m_textureVolume, TEXTURE_PATH "Bouton/volume.png", false); - LoadTexture(m_textureMusique, TEXTURE_PATH "Bouton/musique.png", false); - LoadTexture(m_textureGraphiques, TEXTURE_PATH "Bouton/graphiques.png", false); - LoadTexture(m_textureSensibilite, TEXTURE_PATH "Bouton/sensibilite.png", false); - LoadTexture(m_textureResolution, TEXTURE_PATH "Bouton/resolution.png", false); - LoadTexture(m_texturePrincipal, TEXTURE_PATH "Bouton/principal.png", false); - LoadTexture(m_textureEffets, TEXTURE_PATH "Bouton/effets.png", false); - LoadTexture(m_textureGameplay, TEXTURE_PATH "Bouton/gameplay.png", false); + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + m_textureHd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.125); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.05, centerY + Height() * 0.125); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.05, centerY + Height() * 0.15); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.15); + glEnd(); - // Pourquoi on load 3 fois la meme texture? - LoadTexture(MenuTitleTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); - LoadTexture(MenuBGTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); - LoadTexture(MenuBGOptionTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); - LoadTexture(MenuBGFlouTexture, TEXTURE_PATH "BackgroundMenuFlou.png"); + m_textureFhd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.075); + glTexCoord2f(1, 0); glVertex2i(centerX, centerY + Height() * 0.075); + glTexCoord2f(1, 1); glVertex2i(centerX, centerY + Height() * 0.1); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.1); + glEnd(); - LoadTexture(SplachScreenTexture, TEXTURE_PATH "sc2.png"); - LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png"); - LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png"); - LoadTexture(MenuStartTexture, MENU_ITEM_PATH "BasicPlay.png"); + m_textureQhd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.025); + glTexCoord2f(1, 0); glVertex2i(centerX, centerY + Height() * 0.025); + glTexCoord2f(1, 1); glVertex2i(centerX, centerY + Height() * 0.05); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.05); + glEnd(); - TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal3.png"); - TextureAtlas::TextureIndex texIceIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal2.png"); - TextureAtlas::TextureIndex texGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "grass.png"); - TextureAtlas::TextureIndex texMetalIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "dirt.png"); - TextureAtlas::TextureIndex texGreenGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "greengrass.png"); - TextureAtlas::TextureIndex texBoostHeal = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterVert.png"); - TextureAtlas::TextureIndex texBoostDmg = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterRouge.png"); - TextureAtlas::TextureIndex texBoostSpd = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterBleu.png"); - TextureAtlas::TextureIndex texBoostInv = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterJaune.png"); + m_textureUhd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.025); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.015, centerY - Height() * 0.025); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.015, centerY); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY); + glEnd(); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - //AJOUTER LES TEXTURES DANS L'ORDRE DE L'ÉNUM + float heightRatioBottom = 0.125f; + float heightRatioTop = 0.15; - //JUMP - //TextureAtlas::TextureIndex JumpBack = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueBackJumpRight.png"); - //TextureAtlas::TextureIndex JumpFront = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueFrontJumpRight.png"); - //TextureAtlas::TextureIndex JumpQuarterBackLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftBackJumpLeft.png"); - //TextureAtlas::TextureIndex JumpQuarterBackRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightBackJumpRight.png"); - //TextureAtlas::TextureIndex JumpProfiltLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilJumpLeft.png"); - //TextureAtlas::TextureIndex JumpProfiltRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilJumpRight.png"); - //TextureAtlas::TextureIndex JumpQuarterFrontLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftFrontJumpLeft.png"); - //TextureAtlas::TextureIndex JumpQuarterFrontRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightFrontJumpRight.png"); + for (int i = 0; i < 4; i++) { + if (static_cast(m_resolution) == i) { + m_textureChecked.Bind(); + } + else { + m_textureCheck.Bind(); + } - //STILL - //TextureAtlas::TextureIndex StillBack = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueBackRight.png"); - TextureAtlas::TextureIndex StillFront = m_animeAtlas.AddTexture(ANIME_PATH_STILL "BlueFrontRight.png"); - //TextureAtlas::TextureIndex StillQuarterBackLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftBack.png"); - //TextureAtlas::TextureIndex StillQuarterBackRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightBack.png"); - //TextureAtlas::TextureIndex StillProfiltLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilLeft.png"); - //TextureAtlas::TextureIndex StillProfiltRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilRight.png"); - //TextureAtlas::TextureIndex StillQuarterFrontLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeft.png"); - //TextureAtlas::TextureIndex StillQuarterFrontRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRight.png"); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX + Width() * 0.075, centerY + Height() * heightRatioBottom); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.09, centerY + Height() * heightRatioBottom); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.09, centerY + Height() * heightRatioTop); + glTexCoord2f(0, 1); glVertex2i(centerX + Width() * 0.075, centerY + Height() * heightRatioTop); + glEnd(); - //SHOOTINGSTILL - //SHOOTINGJUMP - - if (!m_animeAtlas.Generate(TEXTURE_SIZE, false)) { - std::cout << " Unable to generate texture atlas ..." << std::endl; - abort(); + heightRatioBottom -= 0.05f; + heightRatioTop -= 0.05f; } - if (!m_textureAtlas.Generate(TEXTURE_SIZE, false)) { - std::cout << " Unable to generate texture atlas ..." << std::endl; - abort(); - } - - float u, v, s; - m_textureAtlas.TextureIndexToCoord(texDirtIndex, u, v, s, s); - m_blockinfo[BTYPE_DIRT] = new BlockInfo(BTYPE_DIRT, "Dirt", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texGrassIndex, u, v, s, s); - m_blockinfo[BTYPE_GRASS] = new BlockInfo(BTYPE_GRASS, "Grass", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texMetalIndex, u, v, s, s); - m_blockinfo[BTYPE_METAL] = new BlockInfo(BTYPE_METAL, "Metal", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texIceIndex, u, v, s, s); - m_blockinfo[BTYPE_ICE] = new BlockInfo(BTYPE_ICE, "Ice", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texGreenGrassIndex, u, v, s, s); - m_blockinfo[BTYPE_GREENGRASS] = new BlockInfo(BTYPE_GREENGRASS, "GreenGrass", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texBoostHeal, u, v, s, s); - m_boostinfo[BTYPE_HEAL] = new BoostInfo(BTYPE_HEAL, "Heal", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texBoostDmg, u, v, s, s); - m_boostinfo[BTYPE_DAMAGE] = new BoostInfo(BTYPE_DAMAGE, "Dmg", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texBoostSpd, u, v, s, s); - m_boostinfo[BTYPE_SPEED] = new BoostInfo(BTYPE_SPEED, "Spd", u, v, s, 1); - m_textureAtlas.TextureIndexToCoord(texIceIndex, u, v, s, s); - m_boostinfo[BTYPE_INVINCIBLE] = new BoostInfo(BTYPE_INVINCIBLE, "Inv", u, v, s, 1); - - - - m_animeAtlas.TextureIndexToCoord(0, u, v, s, s); - - std::cout << " Loading and compiling shaders ..." << std::endl; - if (!m_shader01.Load(SHADER_PATH "shader01.vert", SHADER_PATH "shader01.frag", true)) { - std::cout << " Failed to load shader " << std::endl; - exit(1); - } - - if (!m_skybox.GetShader().Load(SHADER_PATH "skybox.vert", SHADER_PATH "skybox.frag", true)) { - std::cout << " Failed to load shader " << std::endl; - exit(1); - } + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } -void Engine::UnloadResource() {} - void Engine::InstantDamage() { m_player.InflictDamage(0.10f); @@ -1022,10 +1159,6 @@ void Engine::DisplaySingleOrMultiplayerMenu() { ShowCursor(); } -void Engine::DisplayAudioMenu() { - -} - void Engine::DrawHud(float elapsedTime, BlockType bloc) { // Setter le blend function, tout ce qui sera noir sera transparent glDisable(GL_STENCIL_TEST); @@ -1459,7 +1592,6 @@ void Engine::KeyReleaseEvent(unsigned char key) { break; case 2: // C - Toggle crosshair m_displayCrosshair = !m_displayCrosshair; - std::cout << "DISPLAY CROSSHAIR " << (m_displayCrosshair ? "enabled" : "disabled") << std::endl; break; case 3: // D - Stop droite m_keyD = false; @@ -1607,8 +1739,33 @@ void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { else if (x > leftGameplay && x < rightGameplay && y > bottomGameplay && y < topGameplay) { m_selectedOption = 2; // Gameplay } - else { - m_selectedOption = -1; + + float leftChk = centerX + Width() * 0.075f; + float rightChk = centerX + Width() * 0.09f; + + float topChkHD = centerY - Height() * 0.125f; + float bottomChkHD = centerY - Height() * 0.155f; + + float topChkFHD = centerY - Height() * 0.0725f; + float bottomChkFHD = centerY - Height() * 0.1f; + + float topChkQHD = centerY - Height() * 0.025f; + float bottomChkQHD = centerY - Height() * 0.05f; + + float topChkUHD = centerY + Height() * 0.025f; + float bottomChkUHD = centerY; + + if (leftChk && x < rightChk && y > bottomChkHD && y < topChkHD) { + m_resolution = HD; + } + if (x > leftChk && x < rightChk && y > bottomChkFHD && y < topChkFHD) { + m_resolution = FHD; + } + if (x > leftChk && x < rightChk && y > bottomChkQHD && y < topChkQHD) { + m_resolution = QHD; + } + if (x > leftChk && x < rightChk && y > bottomChkUHD && y < topChkUHD) { + m_resolution = UHD; } } else if (m_gamestate == GameState::SINGLEMULTI) @@ -1629,7 +1786,6 @@ void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { if (m_mousemx >= buttonPosX && m_mousemx <= (buttonPosX + buttonWidth) && adjustedMouseY >= buttonSinglePosY && adjustedMouseY <= (buttonSinglePosY + buttonHeight)) { - std::cout << "Single Player button clicked" << std::endl; m_soloMultiChoiceMade = true; m_gamestate = GameState::PLAY; } @@ -1637,7 +1793,6 @@ void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { else if (m_mousemx >= buttonPosX && m_mousemx <= (buttonPosX + buttonWidth) && adjustedMouseY >= buttonMultiPosY && adjustedMouseY <= (buttonMultiPosY + buttonHeight)) { - std::cout << "Multiplayer button clicked" << std::endl; m_soloMultiChoiceMade = true; m_gamestate = GameState::PLAY; } diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index a4b778d..bd82167 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -61,7 +61,8 @@ private: void DisplayHud(int timer); void DisplayInfo(float elapsedTime, BlockType bloc); void DisplaySingleOrMultiplayerMenu(); - void DisplayAudioMenu(); + void DisplayAudioMenu(float centerX, float centerY); + void DisplayGraphicsMenu(float centerX, float centerY); void DrawHud(float elapsedTime, BlockType bloc); void PrintText(float x, float y, const std::string& t, float charSizeMultiplier = 1.0f); void ProcessNotificationQueue(); @@ -94,8 +95,13 @@ private: Texture m_textureResolution; Texture m_texturePrincipal; Texture m_textureEffets; - Texture m_textureGameplay - ; + Texture m_textureGameplay; + Texture m_textureHd; + Texture m_textureFhd; + Texture m_textureQhd; + Texture m_textureUhd; + Texture m_textureCheck; + Texture m_textureChecked; TextureAtlas::TextureIndex texBoostHeal; @@ -132,6 +138,7 @@ private: Texture OnOffBtnTexture;//TODO Texture BackBtnTexture;//TODO + Resolution m_resolution = HD; float m_scale; float m_time = 0; diff --git a/SQCSim2021/media/textures/Buttons/check.png b/SQCSim2021/media/textures/Buttons/check.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3968ba1bd73a9887dd19e44befe7f5b39a5185 GIT binary patch literal 2256 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 HB{Ts5(>}du literal 0 HcmV?d00001 diff --git a/SQCSim2021/media/textures/Bouton/effets.png b/SQCSim2021/media/textures/Buttons/effets.png similarity index 100% rename from SQCSim2021/media/textures/Bouton/effets.png rename to SQCSim2021/media/textures/Buttons/effets.png diff --git a/SQCSim2021/media/textures/Buttons/fhd.png b/SQCSim2021/media/textures/Buttons/fhd.png new file mode 100644 index 0000000000000000000000000000000000000000..0e78428a47a1b35d47da913434f8ff77dc93dc43 GIT binary patch literal 10301 zcmeAS@N?(olHy`uVBq!ia0y~yVD4mKV2I^lV_;z5$W;Ewz`(#*9OUlAuNSs54@I14-?iy0XB4ude`@%$Aj3=Ha*JY5_^D&pSGjele2T6(;) zdbwI0$I8qn{o?;RV;a`ZYGO@da`WXei_wtSqp>6=ghlwjN^aM(3rAQ~HJRcvp0F*x z!X4D%X}CwFEl5!_%uv(q3zO@mj0xRpCzk%LtFNAB^Zxx^%k;AHwD~t{_svf+I{$g! z`TVr9@^j}bjnmJ~QEU-#;vkinY>~KAz=@+!;LpeY`aRq?OFh=x{%SWqx8vuLPT}~i z=Y1Q@;=0}}_IU4LCH|7vBVFn3r|KosC)D+RabA-D$f~Y&k7R+Yyz{rjCEFD?{&l|Y zSl9f8>(coN^W3uDMfEjj?-sq;>QUpi-qA`rbGp64-i9O3zldBaFZBK27^8DUDrN4B zJ@*@~oIW{w!Y{M$Z%&<9tQ*HJSyAqK{gcVMr`&&zhfQ1~y+hDk(X`Q2llzZN*7wcd zF7ItB3&~eMRk1-^>tyq{%V`d?!#@7`#=3t0ZeGv4P4nN$X8Q~MzNr)7bLIH+4@yGs z%`bbZTr1TUni@Ni^WF7IkMqjB2diu5{Vg$!P``9J=YZj?3G!Q--|ptuEWKY;!IZha zcIww?>o~Vr%=1O3ZccNkwg@}B(`;XO#*U7z2Xf}RuUT?uYQKNeEVDRc%3IkjkM)*V zUU%A=_422Q@@t*vD~=@k-8%oO`IJ&>t>GHa$Oq3?8yH>ad-c{u(n!dh4eZJk6+QQS zn@a^TcP>P7?=W}fl6u&%dxv1N)z7|#g;q!6p0a-pj!c<9Z&eS^!QcB=eCqgB(Z9I- zs>qK!-?DTT{qvsa6(>FQW!k;l(M{h)S9(UiceKusnKq?-pZzx@xrK331}lHtvYxtm zPi+th3?pF&QZR;0(@q2=8TgazdFV>Z*pUTU-RJQg(oSE+HBe#Co*u`~+1l{}juR=9i zwa?tVqZU*Djdk68<7FWcZ9g>GcKP3YzG{K2`|9E!KMaCSCEV4{kmuF*GrJO$v9e`T zeps=))6Ec{j3-5pmY9XynYYnOoUzolv4^Wxcik4NBQ6F1XH73n`a3PxX5aj^B0AsW zRxj6D(L6cYbbV`p*$%GlCyofbifmr9U%vCVeE;F{zqU)?PwjD0Y|&tjzhu%Uces02 zo+A76uB_{SmcF~4S>RlMszQhB*1@ZrrB)ZaKB#qCv}r?2qO0EaUtLMxf7UHg4bS~y zGd-wfr&m$n_qAH$S1at=8@?V)OWn)!KI z6MEuTr{0X~vUj&%eo*~m;k#tX6csK-m&z4?ijOYdwK_hzputO%Z~HBVaNc|QOT<5J z-10j(Q_fLp@dN{*2mTW)>VLazSC+cBGr)48cBo*0*wnat&kcEEk5Bf{6kjE>S1Bg< zs$6RD#M7~=56{@GfB2*HV^#6Qg%(VAR&PCFb=#}?t?}LMIydrf)R+Ah{(b!d*Cm0g zJg!qb{U;h0*{ewR-`f8)=xTt=&efAjdlvVwoUXPw!m6?R-oM;3h9znn)KVMguUGoO zc`I=5Tn*>OY%@r@pT*gb@YXZQel}~@&GZMeHWr+J^ekMou(!H%U)v^cmfA?4x&ZOT zPoGYBy07Q|d*#k&K~JIr{nqiwy}jwmmCCR`(O`w)^`O)khn+jGAN#&(^@NB2cjjlG z`Mqjh)Api*{4mwmEMGUCwS0SaYWXRTJeI(9eWJ`ypT=>YoX9)PT&=G}onDd0 z?|-_tw2Ad&o!CW7KWlYC*5HO6FU?ukKGiRmf6bI_`I~1(PuYK_r+d%Zz3)}M)oGQ% zQk56Wzp$_W#&flZ)1PmP@30SP+tYjH?3}+X+jg}n+_L;#bFIhj+|0f2OXSrr?q>Yt zv*gOoyyOR6=hX{ecC+S03fb`Ud7M|^U8_{|>}yR-^~F$^D<{j3nR=+kw1`cV-!fDC zwB_axb5!@$ow0Sk8KSqpSLAHRX8nEH?>?WHa`61(c^A`L7v`*MsA1JiFZ&<8;<50z zO0zKYyG*t>mcMt{doz7^Z-rgxlhm^h?ydE^R(+w2?NaAA&!W=5rwq@_JiVl?kp4f$ zuvY(b)Qx(1hq*V6I*Tmp0-hDkd!MVZ`^3zy73Ehq^;Ko0TzXs1@$Ucgoqef}OIOES zblkmVQpSRw3^ix%PVMIF_wTl;$hgctaBK3BIx}vO%^C9Um2VZzNN%Fb>^S4fF*?&H=bGEL$&SLFXCO_6` zT{<7=cW$f5Y*Td&?Wm)GvUqu^ z5&IOuml-M7B-;0%-6^+ALYy&mZQQkw-{<8;>|4M2!n!vqMndTgWhXpj7;+~~d~x9Q z`#fhM$Z!{Y%PIvF}aakapWiQY&DVO=ms5M0o9AG4 zeK2!Tc1uoXuRlRP3U*slW&aeK7KFJ{hjmu?9;N-{1dO9 z`o%XzKYupU_Pp4;wR8A>3HOUU+FET8a7xFSC9)(>;cis={@?(%*yP0v%w)>dH>*av z%a%O%XWeKieBJ8wf@u>qS_Fh2a!Yk`{XFZjbE4WxhQj@aUL9mOGV}42PX}xTyWjq` zWb5U67rRqnW$WJ9i9!c#uP;5{zenz*@w#;eshN5qWjog|J5?85UH850{-im%U2kMo zoT)tKxiLNEyVlYhUk$tx4b5-yUY@n)`=6;#HTT7A*gI!Mw^~q9&r}ifh!UDrDdQ0wvx@v7byR+8+K(woju-aY~9#6l; zOFasjciv!-U8__yL7!{geB(25A(2|1#Uk!b%pZlWgoawW{|vdIr21p=H2>DdKpQXn z#V0!SKh|vX3*K~(dFJz1z1zEfsN9OlVbXQJ=9#jk%H?3zJdK}x8>)q6H4WY6%vE2P zy$?P=Kh^(TwvkY)z#@j4K;^>FiCx}&;Z8Fn-u`phVjJZuBYU+-&E$f<^IrLlj+;dn z9h}dVytevi`V&p{;yc?UUT)acxWoBLQ2Dy2i#P6*(fsNY!|mh0!|_=UEG`Q zIDR%eeZ6CQ&=23!(-(wG=<1oPt8b8 zJXdHX_dltUYv-JKUavR#DXZMt?;d{aQSNplW#=dPy7JxCEF!PgZCv|czmES$tJB9f zc}5;Lez4m@bV0@^uchG1kSFejiAZsb|NXAUM&pLnOu5f`O1uOY357Uk-e~=8pV_fr zveb07fmHs+nhyH~Z@0!iReHK)OLnO4q6D$x4|iVH#jmzs9P=)`>&`2_yH87eH~B64 zTYZ1~9=3~OZRJsMlkV*OvG~M) zp8{K_C}=73FdWdBm9Dt;Rn|AHG@oKI^P~E@>)SNd=be7}TQ`5MR&_=0q+``?_8a$z z*>ATwx?9&?B~1Ob^`E6rHI=qsuym1=DY2X@{otjAe&juy=;@^=I=0U`lWt$-6a@6hP+*)c1k>cKj;TVB&=T*=W1Kj!8B(uV12P~;w_PPg+>6^oy0PUE`%zv-#- zoZQOGGiE(JnI$IRQ;b`nOm3kQ-D3aMdt9`(-}rF zy*;1!|NdOl)-zSgpU+$Hs-fzG?(_+jZXZ*O)coqxe@d9?zh2RNTRiA|_w&@gTi?MJ zyqY9@a^11GiBT1e5&IH%o>1mG7tj?SZRgQew7dMmv8ag+cc;pq&VGFDv90`{`^_GL z-*2ApZr(Ki-71eyYyN%_=um52^!byQz*R%l1CyV39b z3$sb9NJ;-yOz&Q$qmI(H;lX*o;ulxnP!!N~2n}QA65jc)ugu=LzK_TM`VKvhkn`0# z_Pi%#np0e>=dU-qsoSNwB~C%$U2Cj&!V;l9H$RDZ&*_!EDkz(7=wedmda!DlfMn-l zrHp*XYwizxuk~4FIfLTqin_by3d0N2j?Hdev-f5EmE=#7&D=to{=s+7>ut0-D)g@L zNxiQB$Ewr8E~}YK_}3Te_=?Q@&Ny4eTEvFAXL82X=Jye@7Z1Ko{<-U^rd>*E(5D&0A^?*~xR= z`x{}zmGMN*>eN!f^Ap?lZQnj`o-K-SoD*h6$g&v1ie5vl9z< z&U_{j=e^T-(#3VxC0(jtuRm-%`e zf4fihVWG7uQ}UhOCp&fJX3f^@OnH-fdb&cvT{rP#7xdAzeJ{kkG33rth&Ns07mTz#}%S6<1efq&|W*36YxAAgUUx9Dr=8~^Be zkJzX6ALX``XKl{p(`buH>`eJsJk9^my})_de-wAkob)22Q}d!lbo1)N^I`(#WoY!3 zWpAr1)t_Yk^Mme}wJQ%^G*f*&bIGy!ZyYMYK4tW2?9Qk>dOVnCy49(~&=i}`*ONB% zh1Gj~C_5eO!h2%su!(u`Si_xes8r^`u`c*oeB%`mMK?U z{G_^~=nC7t^qAb=7L#u8pCEVcZSs%1l^*IJKl-V>xBZfG^kn*#I7wxRH`WMGa7sfA|@WVIp zyx|d%pVqtbJ=NaIAHM%#kL&rj-v#daR9_SLvod|t?A^BaUr*SxvFF&m-WU4%N^?{0 z-+i0^qek=6S`YsRuZ=w>{?<dI!%$nyuH_nv#j3=RUzJ1dIUHaT`P*LYdp zS+&|v^WW`HBH|DKiFI399_XF6p6`zMIyaZ!>5CeqG#3?%PvjZ7+mgP#dp^UFdBWwa8#8l&Cm#IaE(+jK=-{!fAEj$7fg=S)46ZI~f$IpG$M%en-&buniXyG}p$ zxH!>ZdywbW^T8j~?7lgEyvlP&eph{!_TQ4yb2tA#admn6QMvt1+O5kzEe~cE8FIb0 z4_9{mWW`oxf2VJg_s)m;ao1#R9^d^eVC4iV9XmMkTZ>Pws9nwCCH=krsmqq+4egQI zUCXu@PWkhy>FR>FdmAOT&RzK7Ih*$|_d_y#uGiW>s4Y93@d}ifoP3rwY^u|EBFA)A^l17-H`g79 z->=+a7?q$krN*;-!=o8WGm;gq@wD!@ELgvz{LR95w-xRr~(P@2Uwq@UXH{P4RtH1flnxe47>-radDCRk$$`qNyb;o$u)XK>$*CXm=^dorh z`Z$-HZq!v+J*VT*tKxH~G@H-cbRPMB{;YLpwZzYSo~p;J;jbQ6Ka8vP?PPh6@!{wB!YS1eH~+=L#3Jb@ zUrVP%?)yGr->%8~68;~Xy5{r59qHCm-aqOlER2};A;({`(-WCw}NGo~EqicsFfB7#u_w3Mn=bP5&r<|J;$|>1leDLq$=pT#k zZg;FuIri?Je*XGJV9R?apHO0+*d|vxal7KjHRlBW^a%#pw;uUhc>mQu(@vhFAOGC= zr07(e(lzk}bMWeky$F24IW%z|nDExi9XI@F+8OC|b1slhh8az}IWGTuafla(b|Rnm^n3N!q8%OYXDn zyz}Jmu6M5$ii~B`*8i^R|M+~`@`|IM1dNX@`W%+25SR2fTTG*Qa@3ppd({))_buk^ z_2Kio<_)fs#2A`$&%MbrZa&PHza>V5jY}~7oPEa;2EL^Ukj6Qe>^_#8YZP z>#8-U`o%RXJ(prWUo522F3cWR|M^?{sk0^0HtCgoaUYbNlGk-K-bk)}^L}@}=P%CQ zvll1zoCH+{sTKR5dM;^@m8*F6zwrnI-*m-`tfj9`DT&sv+Y{SS(sd|pHKSZ;xTDX^ z)1~@L6^qV&%)Y^#7|BOg(bQL37c@6CMrg4_~))vH5)@V1hJT$AkZYok=MN%pbqc zkXaUXPwDBuDJQ0>HZGd^I_?(x-i)IHkyab#sN zn45j#tIUqOpG0~BCy6ddQ@SS?Rn#cCsrcraHRoMH1(43++q(W6Gd>7h)C<{@p`&Q% zr4W9#uUJgz|9dVKH@2R%Pqs@x@=Mm+b7~aybj)}hcPjKkq@(_^O)0T6D}GPuau+=I z_3~BA@+7akWrn)4@g?h?Y8K7kUA~2Hp>~$(o4q1CAJt#{q|&bUx_H9G8*(?LyIKWa zA4s!aJavkEl%7lGy~Lja`VnzFU&`Ov*NDk4?&ye7P55%@a!iV}LR7CN+xzLYK7rY# zis2{!cRfwAny53S=gs zvz<@knYJXwBUU>OeiHHK-4VL@a|9m#JM8gsk@VZr7vHxon*Pk- z$*JA^O5(TgN5;+CztJYiN9CmR)6CP+2Vy;2&ODXr7Rc?_u-j?Ea!YD0)4a_0b2^-- zfA!2c=HcSr6{9FNTazPWsjO4S(;pL_YAQ{iwRhsmfDX5fGqdyWXo|_nl^R+cKkRXF zl_m2R1Eoj%VkKhF%f_7d{kG9;VqCx-hJ#x#idt0p+2$X8|92A+*WU=*bD=J6?}_&3C#jDqokC{p8D2=V@P0=A8BDv8v||yu2u2_r;tk0!gtk z$(3FArw3j6?(oj5<%aydi`uSX8;p5f-fg|Pz4~S0BF~#k!|L}`z37U|F_k~xHTmhh z?CLCkk@;)y_|@9TPRW~iRb0!crzt*4PLOqWlr+2gYsr@1^4rr?+#KVl-LaT+Xztv| zjhi%DEZEp`c4g!yif)|xS0>3OuI12io%ubQ`@Snwda3^AUp#%An4JoB_A6K=2c=jIlDztQICcO82ZzQAiIBd75TzN^18Yodg%y8cVy zI;o1CmqHh}NH+*9D)hOx{?$I!hgwPA+S;0vgbT{%E^_>kvxuWrbx~N*&riop*M$}R zPt3mP{rm5>dpT95;wCoA>kd_&UvZ-@^)>&!B?rHn1-`wix&5+N?b(CM`LMpI?OD8FYqH|)Nv)?N7|VkFdhgW=n}pJqW%Hf^4^x8vS}S;8g` zZ`xPu%0F6O%xnIoSnkk!&2XEX-A5nmmK8Q9J&@Wvb*oU#jZY%++iS$W`Tg?wo+~h~ z^~Ua9A9GHN)GR;wwq(ZpsCkd{b=IGZ){#%@5qu<@hxZg;eJ`SNXhPHV=UwY9wOH`jFBer&TbhxPALH(R}&Hmgba z-R58C#Wwza=DT8UZc#9+anYX6lZK9gi4ZG6yqxg)*u0Iu?-tqIF5=m-(?zc0=5L+tdapTyR&ThdazHTJM5s9L zOQ~8wcf&4=1#ZS7n-`zqRQ$%A@+WA?^N)td9cqM{ud2WKti{3h&~)zdt(7;#CstOU z_hRw>)K|Lj(zQc{!O0!R?!SHXMiPvKK0K_1KpsY21qU>^gl^Z-@WI6cI^j!IIOP>bT1O2f4gE;+}KP zV~h0LJU`Z&#J-Pb=k=8KWpvi-3i7oI9B=5kJoRvcOhFTrKeNe zmXzl|DXX&jpI6zH?Gx6WkQ#fjR=UOQ#EQpPjY?li6>U8IT<5!lsprPfNdE^%xhu{U zP1jwgGHH(Vx!&uc?8d@(j!#_VyFI(JK%>P#;l8<|ZFm25rAlT8{@yie{Y)pGJfFrd z=$a>XT7cDOmaGnEtsPh2Lspy2nUkk2*C_kKd}?9fQ`WzdYp=+wFXm%A#bGP;L0XFY z;@*k3U#|S4JSn?FVQP02;iW%X)v)z^IYQsN|TPRY6C zu|-<$Y{P`^4-E6&w9FP?PENh#aOUNcC|8jrRflcwofZ{Vs0Tgay1coJd1A%$3;S*t zZDhB&7cu|Kow+Nw#NDr*<683WTGU z`43iizdIaw#c$_asc-Z8c_yANJfF6E?joLbRh7pMq$nRLxt#G{>ggl7EsJNEcit60 zzv0!)T?aNvM)H5?b3Qrg`r36WlkS{o6j>+#FtKXi?!^v~b24k$G>`vX^KGY&Q-`F( zyq)(av^^B|(0@GtMcveF86m%jwRas@qeY*${P{RYxc-1x}JX!_vN6_ z@3=b-uGw#&Uwg;CE8o*%nSEciooD5i{oQ-IB|OsJoni`KxyMRwZh-re)hFJ53DKB7 zv9VP7-OUu|i~pw0(~&D)obmj{iZ|K(i)}aG&(&x?wpD!Q&h$@Ar;nx73S9Az^jWKS zxm)42ZSA2?;Tzk}NPZHTGqqxNZJtyNx9-z9H#_9Cito?A^)W!6b=t%kMWSl^R@mBq z@=S^OKH0;2=Z=38*Cn*nB>(nl8{RaYZ~RmD)}4?io_FNe303@km9}N)sncmX8L#Ev zK32$hp80<6#*lZ9zdU}vkuRi8((YFEN%xS6A8Q+bpL<}l^5pu{1#4A%COk^{GTrq_ zy1SVK&y(53uUrD>?A$M_X&y02+(J?M%5SAjOMDj0yZLFae?e`W{QHL$Um|0&zF9OD zSsuG+dainYLFwa~Db_bHY^&O{v7|^=W48Oliq&BucIP*quV&26ak|EN%ZXY0xJNZd z?kT=+Ek&6P1xgP-Ew1-4UUf%gMSoj#NI3uTd*>J53rudjyL!L#DcSt>ZnB%dm|WSJ z75UvkddHzTvm9pJ)2}G>kP8V5XTE*gv|2=8`6BOEN0od0%fhE$`Z#l)?ce>M&HucO zxM8`vVbjfJVGp>iS@w7Tx;x3_`th5~)@6GB2+CrD&E$L6)^O}|HhZqxkZo02QhN9b zPl5sW7Ts6+-6#65Zav-Yv1fVY*T>~D)jL+%rky!yn_QEU zNB?i;|G3?eWTkd0Y43UYsk8X+2j*m7;uZbxesc%E=JTpDO`~fI=3G5h#d7NVyz5^? z>;DukS+oAE$DB($vk!msi8^$SG4-^^oc5k0k`dLDZk$hROo}oSTK%Rtk1=Jo+U-WHv?8dXkrvnb&58f%uEPD3t^K15- zV_2u039AWoGpRJF&T*Ese1C86&bf=;sio{?|LS|u@n^N&>3^~Z&L^LGuzS&#JLj)1 z{at?hN_nLJ#fHfm`BOK&Yy9+cO;EwEE)%PD!k`IhXit zvy-IdTV1938tOrxzMCbs?3z8{Yiz*tNmd%YQ?=ZzPTk$EC(Ft_i{(`8)HUu4_|~0U zCK3978uRr%T|fWCHMzvUtaY+~u>I;MM=_^2tnX5v*@>Sj6aMX_{aN^Q`;LP}8|`;o ze;WOw+x45mJ0{lT$=XkxAN(^kb3A*Z*>>}M(Rtjx`(N+M_gqmw<(9F`&QqGVUh?gD zznAaS-(1tgpYkrXp-EbAVvb+hWpY2WeDOc6-@gOjWu@3o{vK&}WJLrod!mX^Szfip zc12gg;8LylUu9v;m>km%N2$^ z-zT1WeAXi*$osI-O7STbVLVBX=1xBTJ#?d}N%eihACuY_&3)HU9d`Rb($1bmv8ELg z>zP+xUz&a5XyLE&TT2=y?Tq-DJ)u;5wt*Mx<3yJmfxAu}l<2hG;n-vGMNdV}F6wr~ zlEM==`-_j+NhrD$7i@S`-5hxJoYO9*l_xXinI1GPo@QmLT&Kpi^6c(A=Nf8Pu<3j^ zvyt|TkcpYUhVz~J@pqpmdTD*1laQ2h_+}O3liuI67j?YazG&SgIiDT{Da|WZDfR4j z%u6nHi|Vwqoj58wuTbcUYwWC|gN7U15|5Tgy*PMgy#9~)p1AjlV1lOIy} zG*a?^+E0P&5qf^aiOhV%y-2ZZqeNMux zwHI!C#g_QRP2GHB&EJQS#Tkq5`1Lnde`i&BHD4w^NH|YWX88_|gPfuA2a+Hx}@!KUeWN(59Jp;vyO^7J}u)K8Q@m2w+9049Hp7wcG(p~@0Nk)Jcc7?D!UR&Pd{x#XWMZl>e z_`rk3S6via1d{p__FUCkB;eFhcHn{VTD7bKAtw$+t;WKz)g4Y8ino}XFVxZ+hjzbAGwl{ec5i&tBH*-zn{Czd{wiYyb?W!M zn}vnM9ZZB-A{B%q8u}(Q92O8>S7~aP5y7#3BJbqFg&b-NIyn>K3=ADTp3LVyyP=U` zmqO!=J$pXR5=doJdtos>#UL)dk@-l5o}SMI)%V|jf61(Q_qpWi%6IElt$TO>`{a;U z*Ux|cT^e3~eSYxrbCzHA6k7zGIH*9}c--+c>F}Pv-){f!c=Om}y29M{FL~bY-MKzW zpZ?$UMeEZ132{zUzfMe4-tVf{BH+{^%KY;|TFP|Azq*%p{*ktje!1n{W6eL3FMHoT z-d)%F#ooid#plE3z56*fI$m(=Q{27F`p^;18^@12-dyMWO>@cTiRWCb4u5Li)8|q- z@9j5>OZ&IzoaVoCoqZzTp-L}%_ez=XpPBz{bS(I z-j6Kf(n2QB^ONqs-Y2(&b0_E1AMQ)sBjv=jgr^vPOJUl5CTRgr@~c~qp5E=Bs@YMS zJNd!4bkdrQ*#-?D#y;fsK(a9sb zig_>jdVF8}ZbIC`(|j8w4|;Mu&bo4Xu6V=Is*U@;n%4Z$y!3oxn~vu)C(C4iwF9OW zjL%#&e;q$I69T8kZNJkaO&+>z1F3{$U-Z@lWLWVw;^2w~uZ8xz6vA^3xc*=PN(h z2Kzm;@!s^YFX3x?aqip=a<}*1?Kc5=@=i-};Xey+JNu$1C#FyQyTsax<>~)5R(zWG z%^0*}mvz~Qnq`?WWUZflX-)Ul3)&@`D*_6V(!E~u`1ZJH-^tu5u=?Pyi*-T~&Jz!C z8mM1b|6tcz?S~rLg+A+2?@A9Z7F-Aw9}%mtf_zI zczu?$tM)sS=^3sK09=7${~GS?VU|C*IpJ*Qc7PWmsYGUut;Ua>b*}{e_xz4`9O#U{}--!(vay@Q2Xa3|T7j~cL6@B9>T3}(H8XWcEYQUXKmp!<4ls#;dT)g4? z&Xe2x3V5T0ufK>--&(qP)4uiARxJ0=8s9x$>G5-$(G8C^Lf56Xv}CYq&3ZX$*R%?! zq}g|}cMAAA{$!BU)z4Zpr@u8Xc>e~YZEUTt>R;M*N!^f;D|)*8sbiqz^y}`6F0E}j z{WvGUEUNobXbn$K|92xH^^V#qLCq&#qKoEF5s!Sc<+)v&(m7ea_IKUiXL}j4%A7mB z>yJfHmaNn+dAZN;S9&mBSKDuS=_tQ9+xx=JxpO0Sdxv^$e*fH7X3zSpT-o>ikApP+ z-9GwlUz+06+g%&P?MxZo{5$tAZ%Oo=E8$gUO@_=(0!tSz_+xXcS!co#p*`}Y{e{{s z8Emilm!D!6sR(}B949ePNj%_WXzJ2hCZ1Jm4429oYWM#>!=z|kaeQy}%heudHSd0# zD0Qgy?Kj0GpFf;A=eUdI<>lX(L_Ne6WDl0#*mkol_(Ac>brX(l?vJ#VYf0TJ=W5TL z`C{L>ga6k%arsW+Kjc}-*(#bWw(QI9jlUm$jQnFSbU%};$5}Oh!nTBHnbT^wtsMXQ zgl-AGUSQr;x9jfVgTG(hwtCtxa^u=_jg$X4HB}y;xwoQI|Al~srnUPnot6b@-Ec?^Art({*(GI_o>cW`h50TH9rax~mbT$4bbLo4)p80S8rYh~Q)0Wa!{<|=< zQAB7~ntgsucj23)cU!hUkmA4b+%^`=e65j#h7P5WXm7(_1ZLE4cE5-DJtzae?2|etqRwQ$627GVSZ?V8@NCzf8RM z`Jm~fU*>b#9v^@6eQSTjUNy_xX+gga+v=&AKfJZ~QErb?W9ba9j`xdWCO^u0xNFXj zTE>@?JrrjqaK!ySw(@%K#1C>wd-{w5PsFoKsWtxO!t-2KG*f+tTI!4cttQqX-o4)& zK2;?vs9%eB4s`2xv@rk89aXUWL_+^VsmMF^g|U6iJ(*9xiq83Rul2QBf1-u?Z>6aD zmEWh7zByL9Q{eg0jf>VC?RB2?+j`FQ+$Yfd< zUZ7Lr*nQB;R@ypT;CGZ@!LQ`Ip_39Ds><#hJ@E78zf-RZ+Ase-Q+LmTJ-Pa*Mpb?? zth(G@wfnebrSG=HcX?J*m6m-kd#CViYnr2A_~m|imelM;@#PV3etx_aE7+6*ttzi> zJk7pweJJbn*d==(?vd%{?>lVxXW>xNogYm3rT30DtyMT8o*zTU`a({+VA zIB4J7!~3>z1>AAHZF|n&v8_3}YeV6LH;3Bins?N$jSM()^~+;+$D2_vt_QPyySY(* zS;Olv^blBk?_R;Vja}y7)<;gwV?X#)-o;BdI4p7ggPMEQ9y0|}f*E=j?yiyeeQVXh z+#|of#r(CpeKcf;p~sfK8>wAQr+I9bzj?@4;CFBR@tmJr&mY7bd@a7|3%f^uKyV?f_BZNcCF zrajo4xMqXU?)^o54^KwT-&n)9U9qzE>UHC<{yhDU?+V|2s@}Zo%&t?uDNY}Lm6*;g zwf|uo8#@10U(=kzxLK4nRTv>U%i%0X*hr9fJ*n#%N%`?a*vudCYyzx z1`9$p1fd;FgvDuN=|;_4de7ZCnRzf7pH2odG{Z@ksA3+W4HSH z-ug42R{qI9?JRTp>$w8CbF23p%hVU2*L@n@9C0*#fp34@3cX7Ktr0?3vZD?ePI!}iH$En1qr#@9 zU&l{2r2jqEXnTFtasj;+`CC5q`m$AND97w<>1oI=5^O!VJXoaQ`h$6!j@Ne|`1b1U zwW_xw3!`|F&l{zD{igQnlo0p!IRUmU*_X4IxLWSY-|sqgl7+qcp?R)n(sk#b`Z=xr z1JmaIqtcUCrp&mq@1ym(i%HfNo9v#4J*k?VTzJr-`+RDL~fK%(*?V@KFjT}6D^n%QE{Pl8{6{R#y|7QC0dMTtcm(8 zxVh^0{%O~n{#xGGUF*~JX4<^Q#~!A)*Ka>jvhL|(!=(Wwe$Bsq?!7f&tl-?u zQuwF3&UvrOns8>vZe78+<1%?|q$i%WCSqjdy!?D(6g_+g2@fdslkp z>w~|!&NBD)P5r;LCYxuEgBIVOwHG28_l0a+$hA>p#cPo>`|io^Jdx!1B;owh^DM09 z&$uS7(R1ZZ^6Hs)Ern&*f-0_@s6|&gqPLiD++e7BbXDj^m-M8^g*w-6zrB0>(TAwL zmwFR}W=&lfX|Fx~{qt$($P6 zTOJw2Z>iyk+Iu$aUjCZ3)nWNJMK2#K*Wouj{q@Q{|BUA$r;-=zyk1h1&9Pb{Zi3UH z1xq$n2wSthvQeMAalvxiHyrM>8My_SO8c)(zsK@0>&wF;d(oo~e;2WOdUS4_fAe5Z zaZ=Ok+Pi@w{srfKy%@4`R~gOES85eG*3%nW^~m$I_pa%eUTw@=db?>#P{Yy(ktM!I zyIGH(HFay;*YNJ6;putPxv%N_d(Kskn{MzyXQzZn_4Vx78Jah*B|kJ+u|~(p{BWh_ z`wFpdlVkmR|0n+xSezoRdH+_EA^#rH+;_)RjyB!!4EVnD)D$7-j4hHI1o+}&I6sA+ zZq;ZMKQW`=)Ac#pvZtmbWrmerx0|Brs(IqM?&@omHJ3gqdPQ;;DjloX82-@KcvR9~L__s_vkrXMU%JO8=y=}koaQ%#9y$6gE7t1b&Txy|telSt-kiQPMY$V~SC zcllG$pIe^IS(-= zywhqIc%Q($etWZ2_`K}#wPDyK})8reYLJO<9Z0!sa0DAzTI)U zrW_)Y-uvIV;2ise6$QH&9{IVQW8P)GDCU3tPm?=#J$Y!E)*EYnpguw_sqgdxgA4hU zVfmVI7QR6n*2d>nc3d(H+536<8@~5~liyEXdw)qyc6+r>zhY|Bjmn${AGV!Vo4+xp zLubLe!jFfeE1#X~E&404({p3hV($3Or`WV-r|;ZzWL>Rh*xIG)SEE(U6fZg*&HLbe z+IdQlMCHfL%Xi#AdM@&C>Gk5Jb7gem=Nt-Kd(Z2U=CW?P%`KnLhwXbPHHFzJ@6&YW zGS5#tCVg7V_$IY7EdP$8OX0m1h79f!#gC6#H2$?}IG$4KxO2rNZ_iN{t^R8XbDy%h zsomeOhfBhLg-D5c=)nr5)Qc5Ph7JF6ge5OBthn8i8pe_xZ}{|^(`~CmsP4{ z?^N?iYCf}@ouZ=pG+Np~V(szkI^s?x71s8GNB0XvHhwtmDsX1%a1uP^dP#_>+kP7M}~+A0_9Fg#G z_`)(JTXDjPPeD%uV&RAyNr&{y8MBw{r+G4B;fe8>#VA+cD$Zk+TD|ve-*#elU>|; z!7F6V(L>g2ZoN9Iaq-&vEjBKNs{&Mw`Vmu-$G`m&rFTnhr+&&!T;u#H zY|GPE3P%_(Fcw|C6m9#xMOAUxBhKX_54I_+=zRK7OfbW6!?Fz`_czmJ!6;S zY{l&-SDE%sIITHotaoRR^_MvOKdF+}MqBCnF823Is%394w*2l(+W&pci>Lx~)s3=#nO~3n z+MV^m&TH$}@@PAczJJQBF~>LCeHH2Vd|+j`SmV1?&_3P%?Th{vpKcXkcVM59v`o(Q zpm>s&TELPW^RpJ|EfeaVy_NmdL#fzAo9ioeoIZ)<#CYBeaSdCWn8bZrvpa2(T-=_m znjbGZ1zZ&3{^9@qviLHM+7HsZn(tqcW&Js+_jd9}oy}RSQ_gcvov`ufVVODnZt~MRU00)5Zja=?p!6o-bn4Iw>Ry0SHQ~7rMRu> z`o`);ht?U~tUmd_|5+>k$ylU!>{Hxn=QW`}rwPqY-PjrV=*X1r<=G`ab-R2&IdPxf zs^+G|dw$bP*DbAUq&Xkdl-&Gero2e??B5mM>lJOgO1hNzj$c=_?I@9HzvFpz^OU8J za{HK$-d5bCI%#d&N1vdi>wa77KHn=8ez$Ce^PA_%Vfn{(;;mh8S>0Y#8^fxRzpl05 zo2}xab@zkz>2^QoQ&)85kUwAR*|EqW;i1dj=(EcUw!3|I*r>D7lksQs)742`6XItd z>C`k2of!Ih<&l`B*I&%r?irB(GV8f!*1ojLunXH(aO{>o8NFqZP@h_3mZgb))~)<2S!ImR~;gZrPKn)9nw6BWwTneGlBU zcK`WL0?}_j*XR5c2wdF1@|3yR5jBU%B(=3kv*#Fb=yy(af1?n_>a~dTZdZfC$*VQz z|9+9$b3JseP}k8;HY2v^u(T}#>y1-`MI*P)^Ewl1^=y^0R^sCey>|mA%uk5XUZ%3$ zaB`|f>fY03)wOI#qq)>|<7F%CG`rj5x7tjNaQKyW$Jh5=xYH@O+fk|-SAA=yBXC|WIAvWTyZ(p-}Jb$2kcl+Lr z#XMUg{&JkZFPqo5hRfSVJ^$l}zbnkQ%qu$heV&`x<{Npb<-tPTU){PQ>aHzXx-D+v zEbd7QKfW=k{?_dAbDPe+u5AK`+z;)^VB**i!&$w`n#)OX+U`x9ieV0ij!ZEy*tsUk zI%$)x`m-d(9H$e#cWlbP?GAXqI^xd)pO9C7m?v##yeqNJp-RDwQLZyxCvdiqWT-ud77-s6k!G6bR`Ocx4l-E_=MVZqht&kqHiZtPxl@mh3ud&K2SdTFBaTi#9i zl-urj*rqXr>7A8Ii-0wI%M9rWm0Sx7t*@c})pAAx}1*-Pe?@5}9L}b1&kMi0{Uu&UV4;;|eCX zP7vB^%Dp;2LN00RwKG$1?-J)PJbfhT-MrMFic4yQoj4RfJz_OjR-k2Wsu z7Dw*y^%Ywc8C(?+yP!0s!`xV7so24HYiDlTSD2)??%<8(LHjrrTLdH<9S)18y!T+;n5q`O8!T`zQ@_tFcW_tceZC{GcQ(@$ z)oYF&xkcT3{~g`5Jem)LHawS% zwn^E0>+rnPoXM?ecYHZdc^^$Yb9bh+?iw|-)Wx~A;Xjr>b!K_&a_W;Whho`eaBiH- z+TSpl-G67Y>Atgu4ir!RmeBJpY zMJ6>#qD>@x2loWEw+5Z}|6Y67s<+ZGqECHy|LUhar@cSro^F4@bU60g%=1P|zGR-g zJLSlldnd|u^5==&u43ME{nI0#x2u=bM2qFGe!;CP?$q+}*2(oc;)|>#<^@P_SP_l-1XuX?j6bhS8}lL*UWkM~v2GJ+`1XTvHJt6u#ykZbM9iH4_j&;K>!v~kxuE0M2%MEvdDHWB-?J7>?DBN`mCx9_*# zrX4Y}+HO^?>CUIX72qs zcW>nf9kK9rUO%_#%nN$ZJWae&bOLXY*QQ{OjT&kem8)g+BlV6bMa+M>mM^aNm(KU# zLV@#6|6)#GXVZ0Byx^{hY&rW=?~Pe|OBV~*T;y00pB!_3p5tEIDmGVLwxdh4Y4*L0MAlqe zmx9NQPDl1E+_bHCC8&Vj7;98zm%UTqk%9bHo0jyc3NE5PD?Z0uxW~`9Ix^gPBgb)F z{=!+lTGx*KoYtO^xBRl=g>}JZp%X(_pWu5Xa(7;E%=r}-KRYx7S0(;{*T$GTO(wIgW}%wHN`MHdW)T3^!)g=<3FZ6%|67v zdgH9#q6_OX6CbQyQC+yc#e?ZFbF$ss1Md04%;)rX9DbqZaZhcUL1bqTCxc5!maXl`oATd zrsXH~|KDcgveirb$Seo-*_&4Vsy*GB(fWGg9#`?5D?4o!JeKQRI;tjmwsGI=Q>p9U z|6BMp`{3qz3tP|XMQmMnD5-F5#O=g0>iKyNtN%-1tQWa|*5uIrNV!GVmKD#t8g=*WZ=Tz{J|@EbIcv>^weIF^hyGrxyh{()&4*T&!l%FnwdY`@+AJWJt-l0(3v>gMGEJFmUkDPX_d#%*2f@2n4or=9;S zf10hF8a%aH_r9y&_L!a{YL9ug$ptrjS(hHJqS4)z^fZ>Y^Hk%Cq@9l{WP`s;2YT@PD3S1g_Lt*rk1subTh=6s4zZy#E4 zv7q$2@%24-toRjOj@wQ8-8nHOw}CP%B!^ zBc3pM!4%(6r?9or_Z3demgr;@QhyxsOYd#fw)x*9_o?nFGc)d7k$d+>?3^r`Bw`j=4{8OKA6j_wPxQ2I*#obzo=ywGx45U*(uBqM=k+a$Gr@5P%>!p3W#G9-Oj9N2} z{{5nL+S%k`(XLP1-q{|G;?_@(wrdejuIJi#*1zfF(Z%4SdTwV1^hm}qoHuZ7!VW7gd#%d}oxPSOiVkI=jHaEaNo zG>=s7WV@{osd9IX;L}j*KlrX^xWNy9=Qqv zNxTMrQ_KVFH~rQq6aA98Wkna~_9b6sO@l@JR^LxJm9lG!Z|Jpzl@_f5wx!IsyZ0yM zTAF44<$ZNaHSB)WF4}1@3-dTx^;1yifO{LpM2T!=v6V7+U|5nnnGOqq|Kh1wJ>28jojk;Ek)5dKach6@Xm5}CrRo^A_V)3-; zYELbfYIWFnm+J4kk+NoehvxlFIU&i{e}ix(#sr*a+*AHJwe|dDH%wLi7}J@(p>>;|jd=3=Sf67lJu|{XymJ0(vN&r# zn9C}zu%srN`~2UI4bC+YlMOa%FIcx+>)sBj>zCfyJM|nCUh{I((%y2HuCLau7u2R$ zsjar@6Pb19tBmviy(Q>TCHle!=2Y;RCOn&v=#S<{sTFwAedIZ2AR( zYyT@I|4X^T2Kk?{Ok<{gTWUJ%+d9T{;E<4lE^2z(E#q=HG z`fL%J*(*{4j;-BNdW}(wBl+6B<&l524w~!m2OfGlg(X=j%C2KdK5wGv^=@IOADia8 zt4?F`%MrVluX3!yJ8;j%ERD2nx-OSze0ZhlGpj^XDY{XLl->!+w5 zzRv%J{E8)=Ul(sSUv18}w7#V)W;h51TgBvl59~f4Dfj65H2srdx2pP| zADdkptRZc^{zV^K;+{QkxO|rD?N9uv5VX&fP0Pb;j=&+m8C({=M~*z(;P+PCBd*8% zQ0R%<7s{?BOw)A{5Z+?*{qpXKedY2;`yRbrcJpvVW4Fcw9|ga_JrngK_l4T5Z@ah3 z^x3+dYDphApW7DG(ithIyDC7Q^X`Q`bzQX~6DxVnd8b~w_)g>0+iA-`$)0wevSaxT zC6oDud`rc2FDG@KT2Z?19huy%uGzKy__llXkN@p> zRky~P%W0?nw&Gh^8-7VfxjcBXdd2F8vkq=vXd^${W1X7Yf~(CU$xT6qTDGY|l6y~f ze+{2!x?23dmZXiembT6HBZ1!wCbVS#Ir7e$Yo9aoq#K)8KB~+5s%iCa!J6*2k2iv% z?HkOm#dcSpH)4BWGsQG1&VNgl_SbpIU6(U>>NW369kB{r$5O5B*24RpFXX`Eom!jO z*9H4_i0@{6b>*x_$gYbimPc>(dVEwfYv<&;_sn`_u1k){YW4n7cfC0+dz$RF{cw_9 z=eT;g`othHe~XX3I}LN$?xc5xzMgig^i7<7_D+j4s?*v%?oQn-8e|rj`2UN~xt*;i zCmW^)oxkE6XOk^;Z1e2goh`)yJ3stD?v-cnm|vCpVajsT8&T2k zAMWmbslQ@-g-mHeSoQY%_IG4iHB-O3o!eg1@nZMnPiq5x7CPMjEy60ZknLM!$gyM( z*C_>SUU;ktSYJ{vm?RZ8{hd=%t!=0M#Y?$ojx7Xv*YX2!O8hXbpbklr^P;+h29j}SP?%xN{_F2;nU^?XU}XZSjBtFd-Zt{ zZn<-b5?<-o{;=*}o>R#rAN<5q>%aQZrbF*{{CF7o^=#4aUFTLw;pHb2@Mcka14hwSk0i_PDk9MOG4N#6XScGB0hT;r6j z9yir~z3Yppd?v^+#Zd#a;h;(N&{rDX@4VxH&zw%}N2_(SJ;lKzaj z`DaW@IrzA?DDAqwn#Hi7HmrcF=Z>9qTGGz>kzbjwKRF;7y>S=obNy5|tFEQ5TsaH0 z<90vy+V)&Xyy^Yt7!|hYXV=bXzVlGrk@WSWn?!c@v$2;%@0Q#?>yCXy?QgY9TRk*u1;w}989kF?KWMsAqekrHZn@{l z*L(KJ?`o|2ZnRtfaOs|Z8JA4o)Eazo@Ue6Xzcyt?&EkV!_x>s~U*{`+^QeQQ`ORz9 zLiZRK>KvGH_vB~kIn$GE?#Hgl+bF-2F}HrDk9UpcZrat79Jlzt{QQ^P9)IqNq+R9zx6j&F zz-$ll0!rNpOKq1YT+eR3n9H^Qp$A92&rb5yL~@%?V0z6XO4!2gz2)zvb0urOcr4{f`e z7WVhS``wpWCVpDWppkdVVUNg~-=VEv-)%Z;u*>(M`RbR)`I|O*{$vYa*>$03Zis;9 zeXZuxdiU-X@ak>Y+9TdkX|}@+?6J%>TfrU+lkdLXx^h8I(7vNHP5wP9PZlj;e^~wU z@|@2$8Lp?8&Y71ze5@k$zOjf;xL$s3G4q*8?H{X8iRrla+$<71_wcUx=?SHVY|lUc zy1xC*>h7e}%(;=J4Ey~<{l0IA-Fz-!;kj)GYjUd3@16Zh^TD4SYsE>grX}rL+oC*| z|L;_fIE8mh7p{E1zg)g`25&60oYPySi2NqfF-oWfJ4 zT|Y$%4Wpzh_)0kQW2c=y_+3Z-k@K`}*@G!N3^%UfcM5-C*UNjNE-irMLmTb{oBr&9H1rbw^%WsdWac1OZ>#APjYdS|hh{!jOK{vi33 z-U`bHPAul(8n0{{KNmmxA5lIdTTP+7pWSemSj?dmX>?^;UtC3-0}4=(N5X$Qgc1 zYw_}Uhn)_!l`_?KTko9?x|8=)K>YnA)(#8NEA?6m>zuT%vQ^w$T`+gCN9Z$+9ekn; zmg2T6A{MyvJFmacm7^C@aV+LX#oin5mM`9z{$AJQNs0Z}n2PvKF(E8p8y??v^{~8c z{k-4g-%8c&n!}$I|6MH-2QB~AlARhK`@?r<)7@77%^(^V9e7W5W8H7LKYSH{qH)nm&k3;xdT(h}CQTba&&{!nA1 z|GPwYK~J;r*O>QONC4RI~|=i$(KX1<%YlnL5bpSY0E&n9TV!A)0KH6-2xuGWe)w%)md0PZ+eY_ zjgQ#g{nl12v868#Djtzr=I~QT=(ox@-}i1(MPC;!dZ+L4ru&BaUxCt)Sj0cV2&tgix(tJ0-^aS@eQ|QKq2sxjil)q{%0!g6>HIuH+hG#v;ZS~V(`WM++ zL~isvEl~3I;k$At4#gvj5^SutnH%wb-ckz+PmnFQnkP@oduMdQ@b@eMCytFA65Z=w zw=Hq>yLBDvyG5}Em6dB}ALc2V3)ZxP@7Tf{5=(iTpz?2%#kwtsoDJkP90haXCA&=rdS@F zC$eM$2Sjhj*T$1P>ehFjmT>r$ZTY=Yz^UU=!k)^+{3nvn^uR6!1>72bpR5>%HlJTzPsSea+UiYqKK1 z|7V}PbH4d^TjT6&HL>!>#d8ImI22n*CvFH%*I9RNef{6p+ZC(W4@nE;IaPGFN(&zQ zp?PS%z(3iC&pG;Ica^-XR}^#NP-Ho9=a-htd-n%-entJ0uIN2_{EyJXbdEW}^-Ujm z&#e5_z5!awaTL=Hc-{r2^&W2Bvp$Vx7Kg$=dF8}5I&yRptL=jME!Fm<`JS0+wX@2t%g z^iX?s-TOgBZAN>)l7W8T)3aX=%Q@8U<$7q@Vi<8;q%G~>eWijNkEQduPapig`&Uhu z&0@RQ$!CvqPicJre&yy%I?eAV{4JSU-ce)0UR3v}#*}?uIak&qr4`A2g2``J|NhD{ zukr2qqx){LYUHUX+a|}yiaxpR6Q6FCuG#l_MeSPKfF0X6HgFVc7jnJ%FuSDS$?Yv0 zDjS|kbWKjlUTBe?_@$+`wm4wgET=*i@dGjoEG%+Xi9|`;Z?>(2nA`ma@9k`Rw=bQa$%yF}I(dxxTZ& z?sc3)w%|2wr&aZ(vClQ^e+S&CfAjim^P*>KG{Z%^CdN;$mCY=;J8_Y&t2EaUFP^RD zQy-j;-nv-Xp7SWT&jsp4L3g9XDd0#`4|FJ@)D`>!&3`E1&&dZ8lvw_nh(8jHI<&*aN1= z1iRj2-^+b8vUq;&-pYV0G7pPQ7fMu`-n~B2ZPmUs?b-c5dArk_odU9*FMoZ^v3<_p z$G-~xUt!i@XJ?Mo`}J_KnEM`)_o3bIx(ob|R}0Q_{TraD`aNtT>w5Pe3b*9dRrMnL zPIW)Dsi@PldN1>D*8zV0*j--~f6w8)^hD-2!=bO~{{#5nSwGpGbIf{qdBF4-<&Ads zjRC*^iXK08u5y`J`KrCThi^%+_T?)U*xXaC@pGBpzW*2d`NKPt-u!9z-B5Rj4)M32#kz}k98NOi6Ag-YyuDoP z?UGiZjgoVwXz9puA$!MpZ< zN*T3e%Q^FZGMS&SRC*DShZyDy2L5`%?9G{nwN++ z*1f)?JeBLshnO4Bf81Wa!t8+3+l+W;VJFMeh9c@G)tmP4_!@bff<^PPW&t}y48yYQI zV0rb3-`Ydl1?}vegX`Enr9Qnly(a6PztZ{Wx5b75a()i;uDud`@>}os9!cG4m!)2B zJ{&*!NBNYmY`^z#YFMj_RCz2}uMBwMzh-CU?YF6!bM#>B^m3t1vU*!xE_nT1UhyUN zUU&ERgNAQ2TMV@ge?NHr;mzdd`xfYK^xNN4lK%B=k6B5>&pm~HKZ6zW%Vk{Sx__St zW66Cev5i~H+iuU2yovI<88-7D+fO+6``o`mMvwkOKf~MhPulS2yRv;$&ZZ4Tb)1T` zE~kB;zBlRb(|$p(9ox&w{R`7(?_sk^-ki)a?|Gt2@V9sWB>Iat*Xp^wua*57p!Xz_ zH~GUKzI&@<_(c*{mG;kST@`qdTiE^%o;o7%C5q%3SJj3+WKYj7r{<$wk zeRkHwiS;QDHP&5po^@vO`;RxY45qHT8xdF++12l0wEA22lH-Nbmp|WBf6mr%dUDw| z(>3ZJV(#6s*!}+I`}2pZbUxKh^jqh;xuiNN+RJhJg*?Zf#m8Qz?Ntw0x8l#{--dPN z+uY}MvV?s8^qTbw#m zEzy=({6+}m-r3)>mz=LNNasHC#&cWf2b+5{He}drFzI`EBl1fQ>yqO~%UuE;MPF9F z-Tq1Pf)C%=)V=TAeLl~gAoqh^EqnI{J%8wwY09hdsVnY{;n6ic9^OtLc_zef zVR-z%U+nhm%o`KGFLV0H_~h`xw)bVPp6pz?v{p}Jd&?u`2|mJqrG6GT&C-(DeD+=1 z!S3{x%T{hP;R^}oPPLKTXTG{>IMR-$>$Ea95Rn1f4P>T0+ zvpmGOKiFk~la;TImohjdTodcs%ld`;+guOM!+#}aH|&`$(8aG{&!rk1)4fZ?BOs0Q zsJp_UW0y}w4>Lu_Zr&NnXOsAnoGOp-sFHcw%xm*ZC9Dabku8Y@||?XrN8g3`(;(1 zo!Mik`F4)>OuPKTBhJ&!tRlF6e!9?5EwCf=b~AhYhaUwSW$zvRWWVJ{zOLU#zixlI zEq~uDePC$Q=ld^o$nJyrVRyw-3CSO%1uG7O^O+|t%5o~)A@F|Q$)NIpqP*D03-;tk z%~|y1tK#|%6+QBicX+Q&+k5y$#e?UMoHuA4Zk}UvFTYT8#=Pxmk7JH9A90admtGkV z_)XDcZ-brd^}AOb8|I|fnbo{uw&9en6aJLX9?XU|#o`*LMY&yH+R?HE~Q`ZM!*?cDQIqyEQjD;Jm~(q+u{i}`GZLm*$) z=_0X||96u%>Xk>>u&s}_+PCg$VRvxNk)*_k-~VrX2tN_Kv$;he*ui?q@ql#+bE1BH zX-MbPd(_*wD<*ei%bpzqix{RK5es<~mC^cP%HHn_^P5TI5N@m-K zbJzH0<^&kVOxPGBx5Xsv{$kZQmak`P*UbBU_q&dr!}i+quU4KcV%bu!cR^0-Us2-y zb7h)>NnB=p&vyh}&R%Hk$ep^Z)!KAk;OG0<_kXn>jsCP=?0ZwX&5NbF6}M-t*s$&s zkH_?`4;g#QUg=#42?<=Wi}UN&?8F&2q6||*|7y!Npmx}&?v)P6bJtG;VX zWg1m(FLmjV3`msnZCY~W-fh#5Hlh1+3;WloPN?F#Bp-dpM#6rvuA?Q_Dc^&}0h&*3 z5A*A+JGwt&&ZF1;W$N#X`6{^$#kqg_X>4ivP~{ zfv0z&=E57o2`64j^-2EOc~oxpoN2XLHyoblzWG1v==B8V1>29WU48V+tQ!flix)lI ztt+<3;#zz09x=PjLjHh>Q=(qXd2@Hw^0u?K^N!ArzEJgGt5|CNTucKS|U+tU^M{VQihQS)nA%QVeC7KusKYP{v&s578$aqiwW|Hc@>j01^Qh*(n~zj?$VJKO z*4@whC=pnl&$Q+F3$HC(zs+#}x##2~?ge|F$gGQcx{Y8fwxf%`7=6Efj78`C z)$?<&OFddEw*1G$qg#L0i!J}*+a2t3jF(Hpb)BcR`xD*+ubZ!=%lJfi&o#R{H;D24 z;ltm9x`gJ<-+Xo3*}Y%B3S2RqdRbH7^Sbj7sf9PB(w|t}?asd3=#ea~$#}%bCbw!` z_stjc9xHD#w_$uWJ#6|4{yn#n6jvquwFwHS5}O|OLBwM#zvfD=XZ2C9g0JyzYO9XD z;ufVCwc@(KfvgW+-N9>~2L0?8Ti)@_sYvk5VSC)N*3GM5H=8xh zTfVYzx%Segt?R4X_PgD@WLzpRa+o;vBuN5=R1%8J@e>V z<>sTw7o@Iqb60F(h&{~_bVzr8SJw-kUZvOJv-S7>Uis8)F5|0-Z?(6&y$M|T;BEJ^ z+h3;L&i;1gdhrkT?&BU+9P`Dyl)D9`GtFn;?cKlq#^digVyPeBeNu^RzZ5aMn`QS2 z-``VywjGsw#k|NYP`+=^6tkmKYF4uPt9n#_Aa6im>T(cJGWnc-MK~ zwJQFfF4qoRSbYAJRPNG8y`rjopC10bJTJWU&NAjVws$Q5ls3xUU8Whb?AFU^d6(JC zE?+Npu$w2IWz_%Ksjx)mTa?}NqYg)(WTY+Hz59rbP5FtH?U!7l)|5x-oLgw8Af;F| z+e&9j)X~pNx>)`#bKHCR(^EMK5gj8x-u#DRS{^sf?d))?U;~XD{P;i5p+Z8@N+n(I z-mLZN5C8FO39QO?sr^_VVZ*(r`$d87PG9x~d@pZ)zxi-|U{&$#Z!9&J4mIxE{p$71 zB{7F4%N+`CeY9NXUGItTf2m^KP74lx+`#BRc~-I3r_db7XK&4umGdhd_nN+9P72OB zC{@^eRQHi?i*w`t!he?@iDYyB-QQa{=g@=C9GYJ0Id&);}m;Bg}OoJ6H7A)T7yfS^mneuSRQskaAk* z|Ll=w`xCRd?EH(o*YfWU(u%16!t!VB-DSluwyt-tXuEUqty6ew(w-Z0JeN)v7CkTg z*0|GbLHEl$iG^MJw^eXmlzU>oEh0um>dO`OBT^OJp`X~gqg8f3w+w!eFLdT_h+5V4 zXA|e_URM0^+qS}mK8Y8Km)h5~H!@vd7nD0*9FVc(LS(eVzw=_tf0%c#Z!)@g`DGzX z)su=-N&MG1S)VMQc<)hl`9wF}*Ttd%_jHz;|5Cc^@Lv9(R}ufE*=u4pRDHj-?9MXg zfcAN_3;VrT{SV|H%&pp9Ys-9og0&UDY;@OQ+g91~Z}X#d!WejGbx*poz|I(WcDye729Tuye^oe#9exJ z-=tku9Vc?F7)nprz5Lp$J-5d+{XwM?<9^odnVW9!lY1apSMwW zj+88Fd~jRL|B#q;ob?lz>!%b{u03V+3GhvLD){@*(5J8pLJU@qHo2_c(+|=zSM=YyVElYzt{xp`R7Q#(bnuv=odQ| z>KGfm^1)8Y{{q>2_-{UccJQ+cligmnsPfr%7pmjsRRcEkRMp9HADwvnmcGuri7)s>yG@yh5-lld$6*7cd9)KXpM>V&n;ye%JIlxlaE_Xd=+2PE|@nQ-FoO1Z6f9QXcQ z$QIL4FK~WNwf;XLzT3?ES_C+ch_G1b*%yh-+fqOKP|U#_!C!J53$v$gjXyv6vDlU9 zzS(=XA8q*UrpjQspikcQiRQic(L3~Fq~pHMdUZdfXRF$S_xsjcS9Ja0mP-)oa?QM# zSlH#-zBTc|5;HR^&aacjxD{PEZMeUE7AtS$JYqBFR5N#HhK@cbt2kG4T*RwoevB(x z66V+x^eXVbGxpi(Q+&|p;diq$spblIdOoaMT(J7@ZPl9RmpOJWuPbi+SNWv&;HQTh z+J7%9?${QxvzD>ctDoyUYh3g;nVdZz*VR0EdFHN6NJetUbve7X=b63-?5FOtYg^v2 ze?xAB(?*Rp-xKq?1>dXb6<$~M|M+Fc)g;B16<+DwyJQ+?G~J#b7IWincY*LF`)B0> z8a!2v_ZM!ckY-|a%j@pC^YOg%!HSjIThker9hkF8Xycyshm`|<@W$qToV(xQ!8WsN z;eAdG++Xwj9oMtIn(*6dWrxSdSs}AGnD&086)%@x@bE6uD_Od3D|@+5LfYJW*-z*Gx$}cp z{ARxEg6z^Gb1Tep<*nFXO=z0F+`%*U`3u=~SC5ohuWc&xXgw6KSdn)uyK1q{p<_Jx zf8KZX7VMgq;eT>TqjSg1J1K=+?>GI`^?chr zH)~~#te&6Xyo1MI1gw3Ev2yFKTFBHDw+7Tqgal~c0tjdm7Dqc ztsHG!e|~+TTvENC>t7$=^+~t4@NYj=`J8>ri!>Xq;{h%<7W%H?O#616YW>>L@~H8d zxY^of$L1)L{Q0a~SE-6eU%Z!cFH)!XXZM?0e@w_jJ(m_N5~=Z=e)G_jb-}yR++U0C>hQlAT_Y6n`$L}6Ls8%3U!O&?J~eyW zP}ReC?bo8c{c#`ot|`5F9?S7V{e*qA&9T<6Cqx$Rcz)C;MfLU1T`R+WbR5h(wPcjM>eAfv)QaN~N%CzVl=-7`xy+;g^yU`pa(rL8?`q3hTgUKY9+_U*g=@=CJFBkd@bj21 zw$0;3|Fh&vQSsgDUi~ufPEUUO=ikHifqC1_9?J5mrdBhpwmyHzkM+*o!^giJ{OnS` zGx)&&3AK4MC%=AOY$?{|d{#@!W4)fG{$`7#v&22$^KIeIVzbR=d9SvvaO2;sD8*Zk&_z*2--rrkp`R-DS7+)OY7VGWy)yrhMU(Jt* znWY~c)14nZN6B5|9oL@AO4lrwIO`kd=bL@+TXxO3XtrO&#&)K{E$_EUv(8zYy?6JW z$_>-*D9sbRZmVf9GrV< zjfe5~elhOA?hgt=x)#ry>+Fuk{>r;j$}iS;^TE#|omCUr&&E_ZJNX{^;_JAn)aAH8Gk$12<>57%;jNS^!oZj<->Mb;?WLVfs@Un=P0GiudrZ0Zr&18o_Vfx z%e6UOpBlqoRXmBfvfSzXidEh9-uAEbz31n?El#n?U$&@yVbtH+(jVH=JAIcwbPU;j zqr7|LlH=Ij&AKd z*H~ctB*1*Frju>{vPbO;AN{Pn5xh>xFYhwvh5AL!E2?gmpH5%M_|%(Y-kE}>+qV_G zs;%V;ZhaIUeMh)HrI1UmqtK|kMR3|X)wd4~R+mTDtopO=sOG<;ppL+)lP6X`me&!J zT;R9!d9PS+MmCH1Kbu%95rJ|ql^;HLjpcN2&D*rYY@(2+mAC4mHqlxUVKTTK+%#D6YdV@z1`a!JRE9qu48amOiUZu$48r5WQR1wWQv}R`rRPTGnU3?%;~$ z2lKdox%W=~oZftt|E}oX;6Tp1OW(WREHwzInUL1^q2f%`yNlTmxPC}-zYTKf>U?yq z+(vrsoQVP@4Njb`Y9E#E&N(&z@&Hkf&xzv1}K*h-|DQ>gAMCBP~ z=g0U9MslXVUG8@G66>Mj*_pkQt*zwWcj&FYX#H#6QKt~bw-fUAU9<@K%{4n}jn%ou zdYS_6wZ9(dtv&qt)rRGJ-(TGKWa}L*<)cT+b@Z5i39>eyuE^hNbUFTivyj!`N|1Kr*znv=Hb7|eT zJyba~-(j;X;e_`oz!W`;#6lcGEAKJFm7r@7yBh)QHovi6X0+ z&j;C++nZMIKB`&4@_&`W`3ymUyUX`Te|Wd^zIv3y=a3W2Vw{iebFf}=`k~yKBeUNf z-&ED}%lP=6)88VW7@v&gFO|_Om?l>c+68gXs_dUJHcx9yuAL2$bM)x-j1j(g*r4^! z3fJ{>lH%3PBW#Yf8h&aD=wY1yn|m?qfv*x0QQLR9h8exv8I`4)9h)pOcaQC9-ZL!g zPB?99W&Jc;Z25zhGOc(1mS6ur7vm0;d7WL(Td%rs>W=oyHj{sE%<9+ln13oXpa0{- zT}y4}bwxG3&^l?!o?Mx|WUJWpiMx|4Bs6aMY)M_W%X{fsb(^QP8$Yv65NC}$AMvR! zxT>P^RBu$t@s(e{D&I>e6ic3#^vSf__T52dH}~v(rc*~H}Gy)9`+&aLoe z4V$XI#-5!kl&lXzPfuhvpFiy36>+j?OY6kYtzug`s={W?Kev*( z`hMK5I~x0!O2=>UpR?}&RdJo@g!jiT7s&5uDqqrE;Uap0ub8i8(dqZJpZ~T&@o(zqwV#;lQ7*i=UBLKeZM^)$r(*F8wRN{jmsE7fbZf8m z^X1{uIQ}ZkXo+Z~+R3EVUqmLzuRStxY5lZP=Kb9|WwWdK7w}9}tuB-Ncw0^P=n3=X zZzub{Z0ncbd|i z%*-U-F|l<w9MZ@k-RwIo5}Y_m6COV6H{MeB~t zJ{_&&XINU-f6ee{zRbbj4`pgzf4Ht;?%78QvB`Rq);}$Cyygd_|9ya@~Av8 zdd61!)g~J5ezIq_PBBl`bc@sRK6kHvQ{;ag##4IWz?Sqj{8S~On9if}#qL#*Vrr^? zV94p-FA>Y-HVIiTs9Uk5^VXB3^=eB5d-oqbuDV3>>)*&?fjaT4;eqe@mW1D3)M>KF z=1}^f@}gTo#>LvFg7(HmGn`lS{^&E|-n(DFBs{Lqc7MKp;)ll>j#Uk!u}8nmWBTc; z_LEthFGz#+Qg7Uk##N=wUzE)kGH(_u_z}B>;X&OyHHS#0>;EJ3{D0hi=4ANkfy&(1 z%e-!=?Go+aJf*+z2ZxGqujSR&q$daWO|UkfkjI+Tw5ht-_u@v`mz9sNXLW6tbNm|+ zDBJr#Wup>vrVH24MX&jmOf^1!UW)tU?hK#AeXdjNJ=B9@^z$BjD4$ZU=52WIR(iQd z+Vs?>PKHfp6?~v+%c|Y4UTaR+_FT(uzx;#aJFi_}*73M{l>bt?>vNx)C947&wk*Hm zKlP~ArL!}2PR3{#ZdT9jZ`|ZEP0VQLo*!q^oD46e-3x9>4BGm3J?lJ2r;majX~qjB zGJ^$XDDg~Q$C}jisha6R((1>C)6%-qrt}9p?6j;44ZWuDH>Pn%gsjq9kI0xMZ;g3d zG}hnz%wIQqb6?~iojLmwgl{%z3*M) zmc8jQW@^ffF$-Ta>_2@jvP7}v%d)7GC#0?`KjBDZzcI6W=WWHc83Hy3%8g#vJ}3{I ztH0~j3KI=}>*OO(T6O9+&kE?-@`ESD?ShjiuTJs@^Sj(fSk5bg0v;@7@hnK;iG)Ea zpT&Xl@DjNjOg7A~61oR0xk3BX1^4xQ`k1iBGh%KH+rzmW7Za7(?Q+@OeGYx9D*K_$ zslTs&dTk!ll-aW9tdr(lcdrz$j%Ua$a;i-Dku4&Z_I2mO$0;|;;yMe2nffR8uM_+H zK=tkW1E1eMGMLx1uk`(#x)A0mSLaR$Jm>lNoy3WzritYlw{G4rs+n_Uwm`+%3)zA< z_==BDH>}9Lkox_w@H-Uo0nMK@$ALTN`z6V!ts5@?#&vZ)SEbrMfQ@sxq@5*MfdHkrd z%=d%MyG}cQ@+ne)n2VgZcQ`?|k*K3+~8t^(>3(>0c-|{Tf@=rWK{hJ65$m zc)qxPxmfe9eKK!fNa#Gi^?P>YKg-hM72Fp)^JY9>kECtaNKBn{)7LMyBDiD942-+jCkK5o+q5yzx>Maq@_Za zI;N;}w{kBz_`Lf@j-1=Qz@I82<{hHeuA&QPD7@ACy^Hvn| zU$Eb7iLhpxnX!mMKIhQ``>yeZy%D+ElGOBN_p8@}Ck}tkEB*YRw_DxWzJTSO=x*`G z>gK3Nn=3w?WikD{_dhesuSfZ;f4}Z*uXtIvuRr3=$HMODC&6OXHJ2XUOW6N--cM

y{6KUbS&u3WM|T(?<1!sZyePTZj-#e6N?$33>44L#=mAy78+PDZ3eM(b3e(>r_1Wacty{@i zeJe%lnVnV!2P_uWm*2i4bzfRx*XxgKbmh5R`kRjnWc;j`JhYZ$dBQ~DT*vMY${gj3 z|6a6yXyl}M+S~lW%uHUNO2$H+n@1OIX4*2RP;L$H=Len-a^{DwSs{2vym9%_X>t4? zZ~kM*+@Jqrv)zgAV&3azs`q7|8_%=ZT_NXOzqmANl;}&%C3rn;W}sm1Jctmy>#UaLbHmGQMtCoz03IB>B|6o@GcBC(gZ4zi-D; zwoJEM;rrTsbw65e=t*Dt_2j0C$JJZc$X-d=yian)OWQdv_iFyGYrNX+Zrs!XUADSx z+R_=1IbY987Ww?3LRIm-OqjmrG`Sp!tzXqPJo00+U#d3$arDWpjIVn#&CKIA`Ecau z7th}=xt?blW8*xp;%fIq$Hn`de^K zv$1RG4~Zu?L*maf{w!Sc^_28E{?&ILr?M_Q`lYNTT;apJRnrxgygR-~>|Z#?l@0%7 z8fUewmp7@McCTDu*&R-w8SmyR%vD<>UBSoa=laTpL-B~!4Vf<{PNya>J2CfYwfaUg zg_S$!e!j0SU?KkL-Jf;O9BuT)JMWbL%VM#6eWUo2a`Soj^Xu~;+}!k@J(jyV|Gj&K zG1L2N^1ILf*^u^Akm$h5Chg-&#Nl zLYRuzh+Gz2(X#X1l{E*Zy9Foj3%WejeJr|BvPGS)kS2Tn#&~?q2?<^7kwYHc{j2b7#%ow)CMmMAhX8 z`y8-YN1P1SSII?LxkPd(w%lOyIdo^+WGlwt>e(Q_G9}o3wP}>!x}H<9MIedWK(hK> zOwnS{YHqQHogtss2sm+Ew3;zx@8uPxAKC?+I1HK3Ec|l9Yp3sJW$)W@puh+_aOBUG zng7p2p{}&vUx)Ai*E{wEdq;F4J_Sn<-FAg8EABH&(8-pd93>OYyjCTc2MQ7 zS<98P>>@Kt-_93s;t*{3dFi(MpO#u*4r11-%dFe|?mx4s(gFkRGy9$}FfcH9y85}S Ib4q9e0E}w%+yDRo literal 0 HcmV?d00001 diff --git a/SQCSim2021/media/textures/Bouton/resolution.png b/SQCSim2021/media/textures/Buttons/resolution.png similarity index 100% rename from SQCSim2021/media/textures/Bouton/resolution.png rename to SQCSim2021/media/textures/Buttons/resolution.png diff --git a/SQCSim2021/media/textures/Bouton/sensibilite.png b/SQCSim2021/media/textures/Buttons/sensibilite.png similarity index 100% rename from SQCSim2021/media/textures/Bouton/sensibilite.png rename to SQCSim2021/media/textures/Buttons/sensibilite.png diff --git a/SQCSim2021/media/textures/Buttons/uhd.png b/SQCSim2021/media/textures/Buttons/uhd.png new file mode 100644 index 0000000000000000000000000000000000000000..696a558ad1dc2d66a6a5eda6328b2de7be64b429 GIT binary patch literal 12383 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 literal 0 HcmV?d00001 diff --git a/SQCSim2021/media/textures/Bouton/volume.png b/SQCSim2021/media/textures/Buttons/volume.png similarity index 100% rename from SQCSim2021/media/textures/Bouton/volume.png rename to SQCSim2021/media/textures/Buttons/volume.png