From fcbd1fb1b13e1c4eb3a08642ab539e903ace93bc Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Mon, 25 Mar 2024 13:05:47 +0800 Subject: [PATCH 001/179] Fix worst local variable style offenses Removed member prefix m_ used for local variables. Removed all b, c, i hungarian notation prefixes for boolean, const and integers. Fixed local variables using lower_snake_case instead of UpperCamelCase. Renamed all ``float wSearch = TextRender()->TextWidth..`` to ``float SearchWidth = ..``. --- .clang-tidy | 2 +- .../client/backend/opengl/opengl_sl_program.cpp | 4 ++-- src/engine/shared/demo.cpp | 6 +++--- src/game/client/components/menus_ingame.cpp | 4 ++-- src/game/client/components/menus_settings.cpp | 16 ++++++++-------- .../client/components/menus_settings_assets.cpp | 4 ++-- src/game/client/components/players.cpp | 6 +++--- src/game/client/gameclient.cpp | 8 ++++---- .../client/prediction/entities/character.cpp | 6 +++--- src/game/editor/mapitems/layer_game.cpp | 8 ++++---- src/game/server/entities/character.cpp | 6 +++--- src/game/server/gamemodes/DDRace.cpp | 14 +++++++------- src/game/server/teeinfo.cpp | 12 ++++++------ 13 files changed, 48 insertions(+), 48 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 3c7bbbd94a7..a8ac9036b36 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -102,5 +102,5 @@ CheckOptions: - key: readability-identifier-naming.LocalConstantCase value: aNy_CasE - key: readability-identifier-naming.LocalVariableIgnoredRegexp - value: '^(p|a|s_|FT_|TB_|s_|ul_|v|[xy]i$|[zijklxyhmrgbacwestnduvqf]$|[dmpwsitcf][xy]$|(ch|skel)[0-2]?$|it$|tw$|dt$|th$|ls$|func$|res$|shader$|len$|maxLength$|length$|offset$|offpos$|result$|bg$|sp$|url$|Tickdelta_legacy$|index$|ctxt$|key$|null$|logger$|LAST_MODIFIED$|GfxFsaaSamples_MouseButton$|teleNr$|target$|id$|hit$|hsl[0-2]?$|rgb[0-2]?$|dir$|tmp$|cData$|sub$|ret$|rendered$|(lower|upper)(16|26|24|32)|size$|wSearch$|bAlreadyHit$|isWeaponCollide$|zerochar$|dist$|sound$|match$|best_skin$|best_matches$|m_aClient$|matches$|nohook$|through_cut$|btn$|savedLayers$|l[hw]$|evilz$|sec$|min$|to2$|delay$|m_TileF?Index$|mode$|maxModes$|numModes$|iLogLength$|[xy]Fract$|[xy]Int$|imgg[xy]$|skip$|localPlayer$|fdratio$|[rgbat][0-2]$|[xy][0-3]$|x[rl]$).*' + value: '^(p|a|s_|FT_|TB_|s_|ul_|v|[xy]i$|[zijklxyhmrgbacwestnduvqf]$|[dmpwsitcf][xy]$|(ch|skel)[0-2]?$|it$|tw$|dt$|th$|ls$|func$|res$|shader$|len$|maxLength$|length$|offset$|offpos$|result$|bg$|sp$|url$|index$|ctxt$|key$|null$|logger$|LAST_MODIFIED$|teleNr$|target$|id$|hit$|hsl[0-2]?$|rgb[0-2]?$|dir$|tmp$|sub$|ret$|rendered$|(lower|upper)(16|26|24|32)|size$|isWeaponCollide$|zerochar$|dist$|sound$|match$|best_matches$|matches$|nohook$|btn$|savedLayers$|l[hw]$|evilz$|sec$|min$|to2$|delay$|mode$|maxModes$|numModes$|[xy]Fract$|[xy]Int$|imgg[xy]$|skip$|localPlayer$|fdratio$|[rgbat][0-2]$|[xy][0-3]$|x[rl]$).*' diff --git a/src/engine/client/backend/opengl/opengl_sl_program.cpp b/src/engine/client/backend/opengl/opengl_sl_program.cpp index 8da5498c369..0ad2e2ed378 100644 --- a/src/engine/client/backend/opengl/opengl_sl_program.cpp +++ b/src/engine/client/backend/opengl/opengl_sl_program.cpp @@ -58,8 +58,8 @@ void CGLSLProgram::LinkProgram() { char aInfoLog[1024]; char aFinalMessage[1536]; - int iLogLength; - glGetProgramInfoLog(m_ProgramId, 1024, &iLogLength, aInfoLog); + int LogLength; + glGetProgramInfoLog(m_ProgramId, 1024, &LogLength, aInfoLog); str_format(aFinalMessage, sizeof(aFinalMessage), "Error! Shader program wasn't linked! The linker returned:\n\n%s", aInfoLog); dbg_msg("glslprogram", "%s", aFinalMessage); } diff --git a/src/engine/shared/demo.cpp b/src/engine/shared/demo.cpp index 4a2b6e69995..1673472b399 100644 --- a/src/engine/shared/demo.cpp +++ b/src/engine/shared/demo.cpp @@ -493,15 +493,15 @@ CDemoPlayer::EReadChunkHeaderResult CDemoPlayer::ReadChunkHeader(int *pType, int if(Chunk & CHUNKTYPEFLAG_TICKMARKER) { // decode tick marker - int Tickdelta_legacy = Chunk & CHUNKMASK_TICK_LEGACY; // compatibility + int TickdeltaLegacy = Chunk & CHUNKMASK_TICK_LEGACY; // compatibility *pType = Chunk & (CHUNKTYPEFLAG_TICKMARKER | CHUNKTICKFLAG_KEYFRAME); int NewTick; - if(m_Info.m_Header.m_Version < gs_VersionTickCompression && Tickdelta_legacy != 0) + if(m_Info.m_Header.m_Version < gs_VersionTickCompression && TickdeltaLegacy != 0) { if(*pTick < 0) // initial tick not initialized before a tick delta return CHUNKHEADER_ERROR; - NewTick = *pTick + Tickdelta_legacy; + NewTick = *pTick + TickdeltaLegacy; } else if(Chunk & CHUNKTICKFLAG_TICK_COMPRESSED) { diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 1f808e4d1a8..ffb63f93072 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -677,10 +677,10 @@ void CMenus::RenderServerControl(CUIRect MainView) TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); Ui()->DoLabel(&QuickSearch, FONT_ICON_MAGNIFYING_GLASS, 14.0f, TEXTALIGN_ML); - float wSearch = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); + float SearchWidth = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); TextRender()->SetRenderFlags(0); TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - QuickSearch.VSplitLeft(wSearch, 0, &QuickSearch); + QuickSearch.VSplitLeft(SearchWidth, 0, &QuickSearch); QuickSearch.VSplitLeft(5.0f, 0, &QuickSearch); if(m_ControlPageOpening || (Input()->KeyPress(KEY_F) && Input()->ModifierIsPressed())) diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 0413df63906..f26e7d03f31 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -394,8 +394,8 @@ void CMenus::RenderSettingsPlayer(CUIRect MainView) TextRender()->SetRenderFlags(0); TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - float wSearch = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); - QuickSearch.VSplitLeft(wSearch - 1.5f, nullptr, &QuickSearch); + float SearchWidth = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); + QuickSearch.VSplitLeft(SearchWidth - 1.5f, nullptr, &QuickSearch); QuickSearch.VSplitLeft(5.0f, nullptr, &QuickSearch); QuickSearch.VSplitLeft(QuickSearch.w - 10.0f, &QuickSearch, &QuickSearchClearButton); @@ -919,10 +919,10 @@ void CMenus::RenderSettingsTee(CUIRect MainView) TextRender()->SetFontPreset(EFontPreset::ICON_FONT); TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); Ui()->DoLabel(&QuickSearch, FONT_ICON_MAGNIFYING_GLASS, 14.0f, TEXTALIGN_ML); - float wSearch = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); + float SearchWidth = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); TextRender()->SetRenderFlags(0); TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - QuickSearch.VSplitLeft(wSearch + 5.0f, nullptr, &QuickSearch); + QuickSearch.VSplitLeft(SearchWidth + 5.0f, nullptr, &QuickSearch); static CLineInput s_SkinFilterInput(g_Config.m_ClSkinFilterString, sizeof(g_Config.m_ClSkinFilterString)); if(Input()->KeyPress(KEY_F) && Input()->ModifierIsPressed()) { @@ -1635,16 +1635,16 @@ void CMenus::RenderSettingsGraphics(CUIRect MainView) bool MultiSamplingChanged = false; MainView.HSplitTop(20.0f, &Button, &MainView); str_format(aBuf, sizeof(aBuf), "%s (%s)", Localize("FSAA samples"), Localize("may cause delay")); - int GfxFsaaSamples_MouseButton = DoButton_CheckBox_Number(&g_Config.m_GfxFsaaSamples, aBuf, g_Config.m_GfxFsaaSamples, &Button); + int GfxFsaaSamplesMouseButton = DoButton_CheckBox_Number(&g_Config.m_GfxFsaaSamples, aBuf, g_Config.m_GfxFsaaSamples, &Button); int CurFSAA = g_Config.m_GfxFsaaSamples == 0 ? 1 : g_Config.m_GfxFsaaSamples; - if(GfxFsaaSamples_MouseButton == 1) // inc + if(GfxFsaaSamplesMouseButton == 1) // inc { g_Config.m_GfxFsaaSamples = std::pow(2, (int)std::log2(CurFSAA) + 1); if(g_Config.m_GfxFsaaSamples > 64) g_Config.m_GfxFsaaSamples = 0; MultiSamplingChanged = true; } - else if(GfxFsaaSamples_MouseButton == 2) // dec + else if(GfxFsaaSamplesMouseButton == 2) // dec { if(CurFSAA == 1) g_Config.m_GfxFsaaSamples = 64; @@ -1662,7 +1662,7 @@ void CMenus::RenderSettingsGraphics(CUIRect MainView) { // try again with 0 if mouse click was increasing multi sampling // else just accept the current value as is - if((uint32_t)g_Config.m_GfxFsaaSamples > MultiSamplingCountBackend && GfxFsaaSamples_MouseButton == 1) + if((uint32_t)g_Config.m_GfxFsaaSamples > MultiSamplingCountBackend && GfxFsaaSamplesMouseButton == 1) Graphics()->SetMultiSampling(0, MultiSamplingCountBackend); g_Config.m_GfxFsaaSamples = (int)MultiSamplingCountBackend; } diff --git a/src/game/client/components/menus_settings_assets.cpp b/src/game/client/components/menus_settings_assets.cpp index df2e5428848..c631547e416 100644 --- a/src/game/client/components/menus_settings_assets.cpp +++ b/src/game/client/components/menus_settings_assets.cpp @@ -608,10 +608,10 @@ void CMenus::RenderSettingsCustom(CUIRect MainView) TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); Ui()->DoLabel(&QuickSearch, FONT_ICON_MAGNIFYING_GLASS, 14.0f, TEXTALIGN_ML); - float wSearch = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); + float SearchWidth = TextRender()->TextWidth(14.0f, FONT_ICON_MAGNIFYING_GLASS, -1, -1.0f); TextRender()->SetRenderFlags(0); TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - QuickSearch.VSplitLeft(wSearch, 0, &QuickSearch); + QuickSearch.VSplitLeft(SearchWidth, 0, &QuickSearch); QuickSearch.VSplitLeft(5.0f, 0, &QuickSearch); QuickSearch.VSplitLeft(QuickSearch.w - 10.0f, &QuickSearch, &QuickSearchClearButton); if(Input()->KeyPress(KEY_F) && Input()->ModifierIsPressed()) diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp index 0e8401c28c5..0f2dac30669 100644 --- a/src/game/client/components/players.cpp +++ b/src/game/client/components/players.cpp @@ -832,13 +832,13 @@ void CPlayers::OnRender() } // render spectating players - for(auto &m_aClient : m_pClient->m_aClients) + for(auto &Client : m_pClient->m_aClients) { - if(!m_aClient.m_SpecCharPresent) + if(!Client.m_SpecCharPresent) { continue; } - RenderTools()->RenderTee(CAnimState::GetIdle(), &RenderInfoSpec, EMOTE_BLINK, vec2(1, 0), m_aClient.m_SpecChar); + RenderTools()->RenderTee(CAnimState::GetIdle(), &RenderInfoSpec, EMOTE_BLINK, vec2(1, 0), Client.m_SpecChar); } // render everyone else's tee, then either our own or the tee we are spectating. diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 407da99c29b..9177b3d1dd4 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2469,9 +2469,9 @@ int CGameClient::IntersectCharacter(vec2 HookPos, vec2 NewPos, vec2 &NewPos2, in if(i == ownId) continue; - const CClientData &cData = m_aClients[i]; + const CClientData &Data = m_aClients[i]; - if(!cData.m_Active) + if(!Data.m_Active) continue; CNetObj_Character Prev = m_Snap.m_aCharacters[i].m_Prev; @@ -2479,8 +2479,8 @@ int CGameClient::IntersectCharacter(vec2 HookPos, vec2 NewPos, vec2 &NewPos2, in vec2 Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), Client()->IntraGameTick(g_Config.m_ClDummy)); - bool IsOneSuper = cData.m_Super || OwnClientData.m_Super; - bool IsOneSolo = cData.m_Solo || OwnClientData.m_Solo; + bool IsOneSuper = Data.m_Super || OwnClientData.m_Super; + bool IsOneSolo = Data.m_Solo || OwnClientData.m_Solo; if(!IsOneSuper && (!m_Teams.SameTeam(i, ownId) || IsOneSolo || OwnClientData.m_HookHitDisabled)) continue; diff --git a/src/game/client/prediction/entities/character.cpp b/src/game/client/prediction/entities/character.cpp index a2f910955c3..8ce77b67e7d 100644 --- a/src/game/client/prediction/entities/character.cpp +++ b/src/game/client/prediction/entities/character.cpp @@ -160,13 +160,13 @@ void CCharacter::HandleNinja() return; // make sure we haven't Hit this object before - bool bAlreadyHit = false; + bool AlreadyHit = false; for(int j = 0; j < m_NumObjectsHit; j++) { if(m_aHitObjects[j] == pChr->GetCid()) - bAlreadyHit = true; + AlreadyHit = true; } - if(bAlreadyHit) + if(AlreadyHit) continue; // check so we are sufficiently close diff --git a/src/game/editor/mapitems/layer_game.cpp b/src/game/editor/mapitems/layer_game.cpp index fb20bb1e11a..14dfd27e146 100644 --- a/src/game/editor/mapitems/layer_game.cpp +++ b/src/game/editor/mapitems/layer_game.cpp @@ -17,8 +17,8 @@ CTile CLayerGame::GetTile(int x, int y) { if(m_pEditor->m_Map.m_pFrontLayer && m_pEditor->m_Map.m_pFrontLayer->GetTile(x, y).m_Index == TILE_THROUGH_CUT) { - CTile through_cut = {TILE_THROUGH_CUT}; - return through_cut; + CTile ThroughCut = {TILE_THROUGH_CUT}; + return ThroughCut; } else { @@ -38,8 +38,8 @@ void CLayerGame::SetTile(int x, int y, CTile Tile) } CTile nohook = {TILE_NOHOOK}; CLayerTiles::SetTile(x, y, nohook); - CTile through_cut = {TILE_THROUGH_CUT}; - m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, through_cut); // NOLINT(bugprone-parent-virtual-call) + CTile ThroughCut = {TILE_THROUGH_CUT}; + m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, ThroughCut); // NOLINT(bugprone-parent-virtual-call) } else { diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index de6a54bced5..4fa42231dcb 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -290,13 +290,13 @@ void CCharacter::HandleNinja() return; // make sure we haven't Hit this object before - bool bAlreadyHit = false; + bool AlreadyHit = false; for(int j = 0; j < m_NumObjectsHit; j++) { if(m_apHitObjects[j] == pChr) - bAlreadyHit = true; + AlreadyHit = true; } - if(bAlreadyHit) + if(AlreadyHit) continue; // check so we are sufficiently close diff --git a/src/game/server/gamemodes/DDRace.cpp b/src/game/server/gamemodes/DDRace.cpp index 3ab91ec0d13..c44ba5b23b8 100644 --- a/src/game/server/gamemodes/DDRace.cpp +++ b/src/game/server/gamemodes/DDRace.cpp @@ -32,8 +32,8 @@ void CGameControllerDDRace::HandleCharacterTiles(CCharacter *pChr, int MapIndex) CPlayer *pPlayer = pChr->GetPlayer(); const int ClientId = pPlayer->GetCid(); - int m_TileIndex = GameServer()->Collision()->GetTileIndex(MapIndex); - int m_TileFIndex = GameServer()->Collision()->GetFTileIndex(MapIndex); + int TileIndex = GameServer()->Collision()->GetTileIndex(MapIndex); + int TileFIndex = GameServer()->Collision()->GetFTileIndex(MapIndex); //Sensitivity int S1 = GameServer()->Collision()->GetPureMapIndex(vec2(pChr->GetPos().x + pChr->GetProximityRadius() / 3.f, pChr->GetPos().y - pChr->GetProximityRadius() / 3.f)); @@ -50,7 +50,7 @@ void CGameControllerDDRace::HandleCharacterTiles(CCharacter *pChr, int MapIndex) int FTile4 = GameServer()->Collision()->GetFTileIndex(S4); const int PlayerDDRaceState = pChr->m_DDRaceState; - bool IsOnStartTile = (m_TileIndex == TILE_START) || (m_TileFIndex == TILE_START) || FTile1 == TILE_START || FTile2 == TILE_START || FTile3 == TILE_START || FTile4 == TILE_START || Tile1 == TILE_START || Tile2 == TILE_START || Tile3 == TILE_START || Tile4 == TILE_START; + bool IsOnStartTile = (TileIndex == TILE_START) || (TileFIndex == TILE_START) || FTile1 == TILE_START || FTile2 == TILE_START || FTile3 == TILE_START || FTile4 == TILE_START || Tile1 == TILE_START || Tile2 == TILE_START || Tile3 == TILE_START || Tile4 == TILE_START; // start if(IsOnStartTile && PlayerDDRaceState != DDRACE_CHEAT) { @@ -88,23 +88,23 @@ void CGameControllerDDRace::HandleCharacterTiles(CCharacter *pChr, int MapIndex) } // finish - if(((m_TileIndex == TILE_FINISH) || (m_TileFIndex == TILE_FINISH) || FTile1 == TILE_FINISH || FTile2 == TILE_FINISH || FTile3 == TILE_FINISH || FTile4 == TILE_FINISH || Tile1 == TILE_FINISH || Tile2 == TILE_FINISH || Tile3 == TILE_FINISH || Tile4 == TILE_FINISH) && PlayerDDRaceState == DDRACE_STARTED) + if(((TileIndex == TILE_FINISH) || (TileFIndex == TILE_FINISH) || FTile1 == TILE_FINISH || FTile2 == TILE_FINISH || FTile3 == TILE_FINISH || FTile4 == TILE_FINISH || Tile1 == TILE_FINISH || Tile2 == TILE_FINISH || Tile3 == TILE_FINISH || Tile4 == TILE_FINISH) && PlayerDDRaceState == DDRACE_STARTED) Teams().OnCharacterFinish(ClientId); // unlock team - else if(((m_TileIndex == TILE_UNLOCK_TEAM) || (m_TileFIndex == TILE_UNLOCK_TEAM)) && Teams().TeamLocked(GameServer()->GetDDRaceTeam(ClientId))) + else if(((TileIndex == TILE_UNLOCK_TEAM) || (TileFIndex == TILE_UNLOCK_TEAM)) && Teams().TeamLocked(GameServer()->GetDDRaceTeam(ClientId))) { Teams().SetTeamLock(GameServer()->GetDDRaceTeam(ClientId), false); GameServer()->SendChatTeam(GameServer()->GetDDRaceTeam(ClientId), "Your team was unlocked by an unlock team tile"); } // solo part - if(((m_TileIndex == TILE_SOLO_ENABLE) || (m_TileFIndex == TILE_SOLO_ENABLE)) && !Teams().m_Core.GetSolo(ClientId)) + if(((TileIndex == TILE_SOLO_ENABLE) || (TileFIndex == TILE_SOLO_ENABLE)) && !Teams().m_Core.GetSolo(ClientId)) { GameServer()->SendChatTarget(ClientId, "You are now in a solo part"); pChr->SetSolo(true); } - else if(((m_TileIndex == TILE_SOLO_DISABLE) || (m_TileFIndex == TILE_SOLO_DISABLE)) && Teams().m_Core.GetSolo(ClientId)) + else if(((TileIndex == TILE_SOLO_DISABLE) || (TileFIndex == TILE_SOLO_DISABLE)) && Teams().m_Core.GetSolo(ClientId)) { GameServer()->SendChatTarget(ClientId, "You are now out of the solo part"); pChr->SetSolo(false); diff --git a/src/game/server/teeinfo.cpp b/src/game/server/teeinfo.cpp index 250d776231a..90432fbeb28 100644 --- a/src/game/server/teeinfo.cpp +++ b/src/game/server/teeinfo.cpp @@ -119,8 +119,8 @@ void CTeeInfo::FromSixup() } // find closest match - int best_skin = 0; - int best_matches = -1; + int BestSkin = 0; + int BestMatches = -1; for(int s = 0; s < 16; s++) { int matches = 0; @@ -128,14 +128,14 @@ void CTeeInfo::FromSixup() if(str_comp(m_apSkinPartNames[p], g_aStdSkins[s].m_apSkinPartNames[p]) == 0) matches++; - if(matches > best_matches) + if(matches > BestMatches) { - best_matches = matches; - best_skin = s; + BestMatches = matches; + BestSkin = s; } } - str_copy(m_aSkinName, g_aStdSkins[best_skin].m_aSkinName, sizeof(m_aSkinName)); + str_copy(m_aSkinName, g_aStdSkins[BestSkin].m_aSkinName, sizeof(m_aSkinName)); m_UseCustomColor = true; m_ColorBody = ColorHSLA(m_aUseCustomColors[0] ? m_aSkinPartColors[0] : 255).UnclampLighting(ms_DarkestLGT7).Pack(ColorHSLA::DARKEST_LGT); m_ColorFeet = ColorHSLA(m_aUseCustomColors[4] ? m_aSkinPartColors[4] : 255).UnclampLighting(ms_DarkestLGT7).Pack(ColorHSLA::DARKEST_LGT); From 6f75087d9f6f421330b03336058c8260d03ce5ee Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Thu, 9 May 2024 10:13:43 +0800 Subject: [PATCH 002/179] Refactor `goto_tele` Fixes a bug of some teleporters being skipped. Improves performance by only iterating all teleporters instead of every tile in the map. --- src/game/client/components/camera.cpp | 74 ++++++++++++++------------- src/game/client/components/camera.h | 1 + src/game/collision.h | 48 +++++++++++++++++ 3 files changed, 87 insertions(+), 36 deletions(-) diff --git a/src/game/client/components/camera.cpp b/src/game/client/components/camera.cpp index 4837be0ba3e..69dba64edbb 100644 --- a/src/game/client/components/camera.cpp +++ b/src/game/client/components/camera.cpp @@ -3,7 +3,9 @@ #include +#include #include +#include #include #include #include @@ -304,54 +306,54 @@ void CCamera::GotoTele(int Number, int Offset) { if(Collision()->TeleLayer() == nullptr) return; + Number--; + + if(m_GotoTeleLastNumber != Number) + m_GotoTeleLastPos = ivec2(-1, -1); - int Match = -1; ivec2 MatchPos = ivec2(-1, -1); + const size_t NumTeles = Collision()->TeleAllSize(Number); + if(!NumTeles) + { + log_error("camera", "No teleporter with number %d found.", Number + 1); + return; + } - auto FindTile = [this, &Match, &MatchPos, &Number, &Offset]() { - for(int x = 0; x < Collision()->GetWidth(); x++) + if(Offset != -1 || m_GotoTeleLastPos == ivec2(-1, -1)) + { + if((size_t)Offset >= NumTeles || Offset < 0) + Offset = 0; + MatchPos = ivec2(Collision()->TeleAllGet(Number, Offset).x / 32, Collision()->TeleAllGet(Number, Offset).y / 32); + m_GotoTeleOffset = Offset; + } + else + { + bool FullRound = false; + do { - for(int y = 0; y < Collision()->GetHeight(); y++) + MatchPos = ivec2(Collision()->TeleAllGet(Number, m_GotoTeleOffset).x / 32, Collision()->TeleAllGet(Number, m_GotoTeleOffset).y / 32); + m_GotoTeleOffset++; + if((size_t)m_GotoTeleOffset >= NumTeles) { - int i = y * Collision()->GetWidth() + x; - int Tele = Collision()->TeleLayer()[i].m_Number; - if(Number == Tele) + m_GotoTeleOffset = 0; + if(FullRound) { - Match++; - if(Offset != -1) - { - if(Match == Offset) - { - MatchPos = ivec2(x, y); - m_GotoTeleOffset = Match; - return; - } - continue; - } - MatchPos = ivec2(x, y); - if(m_GotoTeleLastPos != ivec2(-1, -1)) - { - if(distance(m_GotoTeleLastPos, MatchPos) < 10.0f) - { - m_GotoTeleOffset++; - continue; - } - } - m_GotoTeleLastPos = MatchPos; - if(Match == m_GotoTeleOffset) - return; + MatchPos = m_GotoTeleLastPos; + break; + } + else + { + FullRound = true; } } - } - }; - FindTile(); + } while(distance(m_GotoTeleLastPos, MatchPos) < 10.0f); + } if(MatchPos == ivec2(-1, -1)) return; - if(Match < m_GotoTeleOffset) - m_GotoTeleOffset = -1; + m_GotoTeleLastPos = MatchPos; + m_GotoTeleLastNumber = Number; SetView(MatchPos); - m_GotoTeleOffset++; } void CCamera::SetZoom(float Target, int Smoothness) diff --git a/src/game/client/components/camera.h b/src/game/client/components/camera.h index ae8798d8632..067e8367f2b 100644 --- a/src/game/client/components/camera.h +++ b/src/game/client/components/camera.h @@ -72,6 +72,7 @@ class CCamera : public CComponent int m_GotoTeleOffset; ivec2 m_GotoSwitchLastPos; ivec2 m_GotoTeleLastPos; + int m_GotoTeleLastNumber = -1; }; #endif diff --git a/src/game/collision.h b/src/game/collision.h index 0d24ee96b79..0bc94b88f38 100644 --- a/src/game/collision.h +++ b/src/game/collision.h @@ -113,6 +113,54 @@ class CCollision class CLayers *Layers() { return m_pLayers; } int m_HighestSwitchNumber; + // Index all teleporter types (in, out and checkpoints) + // as one consecutive list + // + // @param Number is the teleporter number (one less than what is shown in game) + // @param Offset picks the n'th occurence of that teleporter in the map + // + // @return The coordinates of the teleporter in the map + // or (-1, -1) if not found + vec2 TeleAllGet(int Number, size_t Offset) + { + if(m_TeleIns.count(Number) > 0) + { + if(m_TeleIns[Number].size() > Offset) + return m_TeleIns[Number][Offset]; + else + Offset -= m_TeleIns[Number].size(); + } + if(m_TeleOuts.count(Number) > 0) + { + if(m_TeleOuts[Number].size() > Offset) + return m_TeleOuts[Number][Offset]; + else + Offset -= m_TeleOuts[Number].size(); + } + if(m_TeleCheckOuts.count(Number) > 0) + { + if(m_TeleCheckOuts[Number].size() > Offset) + return m_TeleCheckOuts[Number][Offset]; + else + Offset -= m_TeleCheckOuts[Number].size(); + } + return vec2(-1, -1); + } + + // @param Number is the teleporter number (one less than what is shown in game) + // @return The amount of occurences of that teleporter across all types (in, out, checkpoint) + size_t TeleAllSize(int Number) + { + size_t Total = 0; + if(m_TeleIns.count(Number) > 0) + Total += m_TeleIns[Number].size(); + if(m_TeleOuts.count(Number) > 0) + Total += m_TeleOuts[Number].size(); + if(m_TeleCheckOuts.count(Number) > 0) + Total += m_TeleCheckOuts[Number].size(); + return Total; + } + const std::vector &TeleIns(int Number) { return m_TeleIns[Number]; } const std::vector &TeleOuts(int Number) { return m_TeleOuts[Number]; } const std::vector &TeleCheckOuts(int Number) { return m_TeleCheckOuts[Number]; } From 257a0bacc8c49b19afb194506b706b1362bbf2eb Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Thu, 9 May 2024 11:19:02 +0800 Subject: [PATCH 003/179] Store all tele types in vectors --- src/game/client/components/camera.cpp | 6 ++- src/game/collision.cpp | 50 +++++++++++++++++++ src/game/collision.h | 70 +++++++++------------------ 3 files changed, 77 insertions(+), 49 deletions(-) diff --git a/src/game/client/components/camera.cpp b/src/game/client/components/camera.cpp index 69dba64edbb..b95d3dd3049 100644 --- a/src/game/client/components/camera.cpp +++ b/src/game/client/components/camera.cpp @@ -323,7 +323,8 @@ void CCamera::GotoTele(int Number, int Offset) { if((size_t)Offset >= NumTeles || Offset < 0) Offset = 0; - MatchPos = ivec2(Collision()->TeleAllGet(Number, Offset).x / 32, Collision()->TeleAllGet(Number, Offset).y / 32); + vec2 Tele = Collision()->TeleAllGet(Number, Offset); + MatchPos = ivec2(Tele.x / 32, Tele.y / 32); m_GotoTeleOffset = Offset; } else @@ -331,7 +332,8 @@ void CCamera::GotoTele(int Number, int Offset) bool FullRound = false; do { - MatchPos = ivec2(Collision()->TeleAllGet(Number, m_GotoTeleOffset).x / 32, Collision()->TeleAllGet(Number, m_GotoTeleOffset).y / 32); + vec2 Tele = Collision()->TeleAllGet(Number, m_GotoTeleOffset); + MatchPos = ivec2(Tele.x / 32, Tele.y / 32); m_GotoTeleOffset++; if((size_t)m_GotoTeleOffset >= NumTeles) { diff --git a/src/game/collision.cpp b/src/game/collision.cpp index 0b796e8becf..c0522515ac4 100644 --- a/src/game/collision.cpp +++ b/src/game/collision.cpp @@ -139,6 +139,10 @@ void CCollision::Init(class CLayers *pLayers) { m_TeleCheckOuts[Number - 1].emplace_back(i % m_Width * 32.0f + 16.0f, i / m_Width * 32.0f + 16.0f); } + else if(Type) + { + m_TeleOthers[Number - 1].emplace_back(i % m_Width * 32.0f + 16.0f, i / m_Width * 32.0f + 16.0f); + } } } } @@ -156,6 +160,7 @@ void CCollision::Unload() m_TeleIns.clear(); m_TeleOuts.clear(); m_TeleCheckOuts.clear(); + m_TeleOthers.clear(); m_pTele = nullptr; m_pSpeedup = nullptr; @@ -1260,3 +1265,48 @@ int CCollision::IsFTimeCheckpoint(int Index) const return z - TILE_TIME_CHECKPOINT_FIRST; return -1; } + +vec2 CCollision::TeleAllGet(int Number, size_t Offset) +{ + if(m_TeleIns.count(Number) > 0) + { + if(m_TeleIns[Number].size() > Offset) + return m_TeleIns[Number][Offset]; + else + Offset -= m_TeleIns[Number].size(); + } + if(m_TeleOuts.count(Number) > 0) + { + if(m_TeleOuts[Number].size() > Offset) + return m_TeleOuts[Number][Offset]; + else + Offset -= m_TeleOuts[Number].size(); + } + if(m_TeleCheckOuts.count(Number) > 0) + { + if(m_TeleCheckOuts[Number].size() > Offset) + return m_TeleCheckOuts[Number][Offset]; + else + Offset -= m_TeleCheckOuts[Number].size(); + } + if(m_TeleOthers.count(Number) > 0) + { + if(m_TeleOthers[Number].size() > Offset) + return m_TeleOthers[Number][Offset]; + } + return vec2(-1, -1); +} + +size_t CCollision::TeleAllSize(int Number) +{ + size_t Total = 0; + if(m_TeleIns.count(Number) > 0) + Total += m_TeleIns[Number].size(); + if(m_TeleOuts.count(Number) > 0) + Total += m_TeleOuts[Number].size(); + if(m_TeleCheckOuts.count(Number) > 0) + Total += m_TeleCheckOuts[Number].size(); + if(m_TeleOthers.count(Number) > 0) + Total += m_TeleOthers[Number].size(); + return Total; +} diff --git a/src/game/collision.h b/src/game/collision.h index 0bc94b88f38..91f0f0eed4c 100644 --- a/src/game/collision.h +++ b/src/game/collision.h @@ -113,57 +113,28 @@ class CCollision class CLayers *Layers() { return m_pLayers; } int m_HighestSwitchNumber; - // Index all teleporter types (in, out and checkpoints) - // as one consecutive list - // - // @param Number is the teleporter number (one less than what is shown in game) - // @param Offset picks the n'th occurence of that teleporter in the map - // - // @return The coordinates of the teleporter in the map - // or (-1, -1) if not found - vec2 TeleAllGet(int Number, size_t Offset) - { - if(m_TeleIns.count(Number) > 0) - { - if(m_TeleIns[Number].size() > Offset) - return m_TeleIns[Number][Offset]; - else - Offset -= m_TeleIns[Number].size(); - } - if(m_TeleOuts.count(Number) > 0) - { - if(m_TeleOuts[Number].size() > Offset) - return m_TeleOuts[Number][Offset]; - else - Offset -= m_TeleOuts[Number].size(); - } - if(m_TeleCheckOuts.count(Number) > 0) - { - if(m_TeleCheckOuts[Number].size() > Offset) - return m_TeleCheckOuts[Number][Offset]; - else - Offset -= m_TeleCheckOuts[Number].size(); - } - return vec2(-1, -1); - } - - // @param Number is the teleporter number (one less than what is shown in game) - // @return The amount of occurences of that teleporter across all types (in, out, checkpoint) - size_t TeleAllSize(int Number) - { - size_t Total = 0; - if(m_TeleIns.count(Number) > 0) - Total += m_TeleIns[Number].size(); - if(m_TeleOuts.count(Number) > 0) - Total += m_TeleOuts[Number].size(); - if(m_TeleCheckOuts.count(Number) > 0) - Total += m_TeleCheckOuts[Number].size(); - return Total; - } + /** + * Index all teleporter types (in, out and checkpoints) + * as one consecutive list. + * + * @param Number is the teleporter number (one less than what is shown in game) + * @param Offset picks the n'th occurence of that teleporter in the map + * + * @return The coordinates of the teleporter in the map + * or (-1, -1) if not found + */ + vec2 TeleAllGet(int Number, size_t Offset); + + /** + * @param Number is the teleporter number (one less than what is shown in game) + * @return The amount of occurences of that teleporter across all types (in, out, checkpoint) + */ + size_t TeleAllSize(int Number); const std::vector &TeleIns(int Number) { return m_TeleIns[Number]; } const std::vector &TeleOuts(int Number) { return m_TeleOuts[Number]; } const std::vector &TeleCheckOuts(int Number) { return m_TeleCheckOuts[Number]; } + const std::vector &TeleOthers(int Number) { return m_TeleOthers[Number]; } private: class CTile *m_pTiles; @@ -171,9 +142,14 @@ class CCollision int m_Height; class CLayers *m_pLayers; + // TILE_TELEIN std::map> m_TeleIns; + // TILE_TELEOUT std::map> m_TeleOuts; + // TILE_TELECHECKOUT std::map> m_TeleCheckOuts; + // TILE_TELEINEVIL, TILE_TELECHECK, TILE_TELECHECKIN, TILE_TELECHECKINEVIL + std::map> m_TeleOthers; class CTeleTile *m_pTele; class CSpeedupTile *m_pSpeedup; From 4f4f32615aac97edc1ff44bae5bf4f3291165917 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Fri, 10 May 2024 15:07:45 +0800 Subject: [PATCH 004/179] Keep respawned players in multi view list on pvp servers Assume every server that does not have ddnet or race in its gametype to be a pvp server. This allows spectators to follow multiple players during a fng/ctf/gctf/ictf round. Related issue #7509 --- src/game/client/gameclient.cpp | 4 +++- src/game/client/gameclient.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index d41cd9607c6..ff8b0a3a06f 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -944,7 +944,8 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker, int Conn, bool Dumm } // if we are spectating a static id set (team 0) and somebody killed, and its not a guy in solo, we remove him from the list - if(IsMultiViewIdSet() && m_MultiViewTeam == 0 && m_aMultiViewId[pMsg->m_Victim] && !m_aClients[pMsg->m_Victim].m_Spec && !m_MultiView.m_Solo) + // never remove players from the list if it is a pvp server + if(IsMultiViewIdSet() && m_MultiViewTeam == 0 && m_aMultiViewId[pMsg->m_Victim] && !m_aClients[pMsg->m_Victim].m_Spec && !m_MultiView.m_Solo && !m_GameInfo.m_Pvp) { m_aMultiViewId[pMsg->m_Victim] = false; @@ -1256,6 +1257,7 @@ static CGameInfo GetGameInfo(const CNetObj_GameInfoEx *pInfoEx, int InfoExSize, Info.m_EntitiesVanilla = Vanilla; Info.m_EntitiesBW = BlockWorlds; Info.m_Race = Race; + Info.m_Pvp = !Race; Info.m_DontMaskEntities = !DDNet; Info.m_AllowXSkins = false; Info.m_EntitiesFDDrace = FDDrace; diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h index 553cf8bc58d..69322c7e3bf 100644 --- a/src/game/client/gameclient.h +++ b/src/game/client/gameclient.h @@ -87,6 +87,7 @@ class CGameInfo bool m_EntitiesFDDrace; bool m_Race; + bool m_Pvp; bool m_DontMaskEntities; bool m_AllowXSkins; From c4f68f50eaeece4bc9e1853bc38c178e0f9ef635 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Mon, 6 May 2024 12:32:49 +0800 Subject: [PATCH 005/179] Remove unnecessary object creation in emplace_front Fixes ``` /home/chiller/Desktop/git/ddnet/src/engine/client/updater.cpp:186:27: error: unnecessary temporary object created while calling emplace_front [modernize-use-emplace,-warnings-as-errors] 186 | m_FileJobs.emplace_front(std::make_pair(pFile, Job)); | ^~~~~~~~~~~~~~~ ~ ``` --- src/engine/client/updater.cpp | 2 +- src/game/editor/editor.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/client/updater.cpp b/src/engine/client/updater.cpp index 97cb4a1157d..a5a0af2ef07 100644 --- a/src/engine/client/updater.cpp +++ b/src/engine/client/updater.cpp @@ -183,7 +183,7 @@ void CUpdater::Update() void CUpdater::AddFileJob(const char *pFile, bool Job) { - m_FileJobs.emplace_front(std::make_pair(pFile, Job)); + m_FileJobs.emplace_front(pFile, Job); } bool CUpdater::ReplaceClient() diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 0425bf8e82a..a8471b5d0d8 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -8475,8 +8475,8 @@ void CEditor::OnMouseMove(float MouseX, float MouseY) continue; CTile Tile = pTiles->GetTile(x, y); if(Tile.m_Index) - m_vHoverTiles.emplace_back(CHoverTile( - g, l, x, y, Tile)); + m_vHoverTiles.emplace_back( + g, l, x, y, Tile); } } Ui()->MapScreen(); From 0a505c25d73a178eb388a380e766f408ade92f03 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Mon, 6 May 2024 12:33:56 +0800 Subject: [PATCH 006/179] Don't return from void methods --- src/engine/client/backend_sdl.cpp | 2 +- src/engine/client/graphics_threaded.cpp | 4 ++-- src/engine/client/input.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 1de4f34c27a..41020b61d61 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -423,7 +423,7 @@ const SGfxErrorContainer &CCommandProcessor_SDL_GL::GetError() const void CCommandProcessor_SDL_GL::ErroneousCleanup() { - return m_pGLBackend->ErroneousCleanup(); + m_pGLBackend->ErroneousCleanup(); } const SGfxWarningContainer &CCommandProcessor_SDL_GL::GetWarning() const diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index ec2642fd649..4d7ab860afc 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -2784,12 +2784,12 @@ int CGraphics_Threaded::WindowOpen() void CGraphics_Threaded::SetWindowGrab(bool Grab) { - return m_pBackend->SetWindowGrab(Grab); + m_pBackend->SetWindowGrab(Grab); } void CGraphics_Threaded::NotifyWindow() { - return m_pBackend->NotifyWindow(); + m_pBackend->NotifyWindow(); } void CGraphics_Threaded::ReadPixel(ivec2 Position, ColorRGBA *pColor) diff --git a/src/engine/client/input.cpp b/src/engine/client/input.cpp index 96f5f42ccb8..bf8bb179a62 100644 --- a/src/engine/client/input.cpp +++ b/src/engine/client/input.cpp @@ -216,7 +216,7 @@ void CInput::CJoystick::GetJoystickHatKeys(int Hat, int HatValue, int (&HatKeys) void CInput::CJoystick::GetHatValue(int Hat, int (&HatKeys)[2]) { - return GetJoystickHatKeys(Hat, SDL_JoystickGetHat(m_pDelegate, Hat), HatKeys); + GetJoystickHatKeys(Hat, SDL_JoystickGetHat(m_pDelegate, Hat), HatKeys); } bool CInput::CJoystick::Relative(float *pX, float *pY) From 64505273a9dff09e59946e972fecab13da7031a6 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Mon, 6 May 2024 17:42:14 +0800 Subject: [PATCH 007/179] Remove redundant casts --- src/engine/client/backend/backend_base.cpp | 4 ++-- .../client/backend/vulkan/backend_vulkan.cpp | 16 ++++++++-------- src/engine/client/client.cpp | 4 ++-- src/engine/client/graphics_threaded.cpp | 2 +- src/engine/client/text.cpp | 12 ++++++------ src/game/client/components/menus_demo.cpp | 4 ++-- src/game/client/prediction/gameworld.cpp | 2 +- src/game/collision.cpp | 2 +- src/game/editor/editor.cpp | 10 +++++----- src/tools/map_replace_area.cpp | 2 +- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/engine/client/backend/backend_base.cpp b/src/engine/client/backend/backend_base.cpp index 451373ba083..37d3b317841 100644 --- a/src/engine/client/backend/backend_base.cpp +++ b/src/engine/client/backend/backend_base.cpp @@ -17,10 +17,10 @@ bool CCommandProcessorFragment_GLBase::Texture2DTo3D(uint8_t *pImageBuffer, int int DepthIndex = X + Y * SplitCountWidth; size_t TargetImageFullWidth = (size_t)Target3DImageWidth * PixelSize; - size_t TargetImageFullSize = (size_t)TargetImageFullWidth * Target3DImageHeight; + size_t TargetImageFullSize = TargetImageFullWidth * Target3DImageHeight; ptrdiff_t ImageOffset = (ptrdiff_t)(((size_t)Y * FullImageWidth * (size_t)Target3DImageHeight) + ((size_t)Y3D * FullImageWidth) + ((size_t)X * TargetImageFullWidth)); ptrdiff_t TargetImageOffset = (ptrdiff_t)(TargetImageFullSize * (size_t)DepthIndex + ((size_t)Y3D * TargetImageFullWidth)); - mem_copy(pTarget3DImageData + TargetImageOffset, pImageBuffer + (ptrdiff_t)(ImageOffset), TargetImageFullWidth); + mem_copy(pTarget3DImageData + TargetImageOffset, pImageBuffer + ImageOffset, TargetImageFullWidth); } } } diff --git a/src/engine/client/backend/vulkan/backend_vulkan.cpp b/src/engine/client/backend/vulkan/backend_vulkan.cpp index edc9eda4d33..36c6d171d08 100644 --- a/src/engine/client/backend/vulkan/backend_vulkan.cpp +++ b/src/engine/client/backend/vulkan/backend_vulkan.cpp @@ -218,7 +218,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase else { // check if there is enough space in this instance - if(bool(SMemoryHeapQueueElement::SMemoryHeapQueueElementFind{}(*m_Elements.begin(), std::make_pair(AllocSize, AllocAlignment)))) + if(SMemoryHeapQueueElement::SMemoryHeapQueueElementFind{}(*m_Elements.begin(), std::make_pair(AllocSize, AllocAlignment))) { return false; } @@ -1984,7 +1984,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase if(IsVerbose()) { - VerboseDeallocatedMemory(BufferMem.m_Size, (size_t)ImageIndex, BufferMem.m_UsageType); + VerboseDeallocatedMemory(BufferMem.m_Size, ImageIndex, BufferMem.m_UsageType); } BufferMem.m_Mem = VK_NULL_HANDLE; @@ -2081,7 +2081,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase m_pStagingMemoryUsage->store(m_pStagingMemoryUsage->load(std::memory_order_relaxed) - FreeedMemory, std::memory_order_relaxed); if(IsVerbose()) { - dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (staging buffer)", (size_t)FreeedMemory); + dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (staging buffer)", FreeedMemory); } } FreeedMemory = 0; @@ -2091,7 +2091,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase m_pBufferMemoryUsage->store(m_pBufferMemoryUsage->load(std::memory_order_relaxed) - FreeedMemory, std::memory_order_relaxed); if(IsVerbose()) { - dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (buffer)", (size_t)FreeedMemory); + dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (buffer)", FreeedMemory); } } FreeedMemory = 0; @@ -2102,7 +2102,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) - FreeedMemory, std::memory_order_relaxed); if(IsVerbose()) { - dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (texture)", (size_t)FreeedMemory); + dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (texture)", FreeedMemory); } } } @@ -3285,7 +3285,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase else { Scissor.offset = {0, 0}; - Scissor.extent = {(uint32_t)ScissorViewport.width, (uint32_t)ScissorViewport.height}; + Scissor.extent = {ScissorViewport.width, ScissorViewport.height}; } // if there is a dynamic viewport make sure the scissor data is scaled down to that @@ -3401,7 +3401,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, VertexPushConstantSize, &VertexPushConstants); vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformTileGPosBorder) + sizeof(SUniformTileGVertColorAlign), FragPushConstantSize, &FragPushConstants); - size_t DrawCount = (size_t)IndicesDrawNum; + size_t DrawCount = IndicesDrawNum; vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, 0, VK_INDEX_TYPE_UINT32); for(size_t i = 0; i < DrawCount; ++i) { @@ -6333,7 +6333,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase } { - mem_copy(pMem + Offset, pData, (size_t)DataSize); + mem_copy(pMem + Offset, pData, DataSize); } NewBuffer = Buffer; diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 4eefceb12cc..08c17e6c9e5 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -4419,7 +4419,7 @@ int main(int argc, const char **argv) delete pEngine; }); - IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_CLIENT, argc, (const char **)argv); + IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_CLIENT, argc, argv); pKernel->RegisterInterface(pStorage); pFutureAssertionLogger->Set(CreateAssertionLogger(pStorage, GAME_NAME)); @@ -4529,7 +4529,7 @@ int main(int argc, const char **argv) // parse the command line arguments pConsole->SetUnknownCommandCallback(UnknownArgumentCallback, pClient); - pConsole->ParseArguments(argc - 1, (const char **)&argv[1]); + pConsole->ParseArguments(argc - 1, &argv[1]); pConsole->SetUnknownCommandCallback(IConsole::EmptyUnknownCommandCallback, nullptr); if(pSteam->GetConnectAddress()) diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index 4d7ab860afc..1e40d81a765 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -2022,7 +2022,7 @@ void *CGraphics_Threaded::AllocCommandBufferData(size_t AllocSize) if(pData == nullptr) { char aError[256]; - str_format(aError, sizeof(aError), "graphics: failed to allocate data (size %" PRIzu ") for command buffer", (size_t)AllocSize); + str_format(aError, sizeof(aError), "graphics: failed to allocate data (size %" PRIzu ") for command buffer", AllocSize); dbg_assert(false, aError); } } diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index c2872bd169c..8c16fe2890c 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -1838,13 +1838,13 @@ class CTextRender : public IEngineTextRender } if(pCursor->m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_SET) { - if((int)pCursor->m_GlyphCount == pCursor->m_SelectionStart) + if(pCursor->m_GlyphCount == pCursor->m_SelectionStart) { SelectionStarted = !SelectionStarted; SelectionStartChar = pCursor->m_GlyphCount; SelectionUsedPress = true; } - if((int)pCursor->m_GlyphCount == pCursor->m_SelectionEnd) + if(pCursor->m_GlyphCount == pCursor->m_SelectionEnd) { SelectionStarted = !SelectionStarted; SelectionEndChar = pCursor->m_GlyphCount; @@ -1854,7 +1854,7 @@ class CTextRender : public IEngineTextRender if(pCursor->m_CursorMode != TEXT_CURSOR_CURSOR_MODE_NONE) { - if((int)pCursor->m_GlyphCount == pCursor->m_CursorCharacter) + if(pCursor->m_GlyphCount == pCursor->m_CursorCharacter) { HasCursor = true; aCursorQuads[0] = IGraphics::CQuadItem(SelX - CursorOuterInnerDiff, DrawY, CursorOuterWidth, pCursor->m_AlignedFontSize); @@ -1936,13 +1936,13 @@ class CTextRender : public IEngineTextRender } else if(pCursor->m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_SET) { - if((int)pCursor->m_GlyphCount == pCursor->m_SelectionStart) + if(pCursor->m_GlyphCount == pCursor->m_SelectionStart) { SelectionStarted = !SelectionStarted; SelectionStartChar = pCursor->m_GlyphCount; SelectionUsedPress = true; } - if((int)pCursor->m_GlyphCount == pCursor->m_SelectionEnd) + if(pCursor->m_GlyphCount == pCursor->m_SelectionEnd) { SelectionStarted = !SelectionStarted; SelectionEndChar = pCursor->m_GlyphCount; @@ -1957,7 +1957,7 @@ class CTextRender : public IEngineTextRender pCursor->m_CursorCharacter = pCursor->m_GlyphCount; } - if((int)pCursor->m_GlyphCount == pCursor->m_CursorCharacter) + if(pCursor->m_GlyphCount == pCursor->m_CursorCharacter) { HasCursor = true; aCursorQuads[0] = IGraphics::CQuadItem((LastSelX + LastSelWidth) - CursorOuterInnerDiff, DrawY, CursorOuterWidth, pCursor->m_AlignedFontSize); diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 2201be2c92b..6aaae19b404 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -461,7 +461,7 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) else { static float s_PrevAmount = 0.0f; - float AmountSeek = clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (float)(SeekBar.w - 2 * Rounding), 0.0f, 1.0f); + float AmountSeek = clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (SeekBar.w - 2 * Rounding), 0.0f, 1.0f); if(Input()->ShiftIsPressed()) { @@ -494,7 +494,7 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) if(Ui()->HotItem() == pId) { - const int HoveredTick = (int)(clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (float)(SeekBar.w - 2 * Rounding), 0.0f, 1.0f) * TotalTicks); + const int HoveredTick = (int)(clamp((Ui()->MouseX() - SeekBar.x - Rounding) / SeekBar.w - 2 * Rounding, 0.0f, 1.0f) * TotalTicks); static char s_aHoveredTime[32]; str_time((int64_t)HoveredTick / Client()->GameTickSpeed() * 100, TIME_HOURS, s_aHoveredTime, sizeof(s_aHoveredTime)); GameClient()->m_Tooltips.DoToolTip(pId, &SeekBar, s_aHoveredTime); diff --git a/src/game/client/prediction/gameworld.cpp b/src/game/client/prediction/gameworld.cpp index ec5f6234a01..cecffb9b8f3 100644 --- a/src/game/client/prediction/gameworld.cpp +++ b/src/game/client/prediction/gameworld.cpp @@ -640,7 +640,7 @@ CEntity *CGameWorld::FindMatch(int ObjId, int ObjType, const void *pObjData) case NETOBJTYPE_CHARACTER: { CCharacter *pEnt = (CCharacter *)GetEntity(ObjId, ENTTYPE_CHARACTER); - if(pEnt && CCharacter(this, ObjId, (CNetObj_Character *)pObjData).Match((CCharacter *)pEnt)) + if(pEnt && CCharacter(this, ObjId, (CNetObj_Character *)pObjData).Match(pEnt)) { return pEnt; } diff --git a/src/game/collision.cpp b/src/game/collision.cpp index 0b796e8becf..9fb53ce4fcf 100644 --- a/src/game/collision.cpp +++ b/src/game/collision.cpp @@ -1155,7 +1155,7 @@ int CCollision::IntersectNoLaser(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 for(int i = 0, id = std::ceil(d); i < id; i++) { - float a = (int)i / d; + float a = i / d; vec2 Pos = mix(Pos0, Pos1, a); int Nx = clamp(round_to_int(Pos.x) / 32, 0, m_Width - 1); int Ny = clamp(round_to_int(Pos.y) / 32, 0, m_Height - 1); diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index a8471b5d0d8..767c8a6f71b 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -986,7 +986,7 @@ void CEditor::DoAudioPreview(CUIRect View, const void *pPlayPauseButtonId, const } else { - const float AmountSeek = clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (float)(SeekBar.w - 2 * Rounding), 0.0f, 1.0f); + const float AmountSeek = clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (SeekBar.w - 2 * Rounding), 0.0f, 1.0f); Sound()->SetSampleCurrentTime(SampleId, AmountSeek); } } @@ -6491,7 +6491,7 @@ void CEditor::RenderEnvelopeEditor(CUIRect View) if(Value / m_ZoomEnvelopeY.GetValue() * View.h < 40.0f) UnitsPerLineY = Value; } - int NumLinesY = m_ZoomEnvelopeY.GetValue() / static_cast(UnitsPerLineY) + 1; + int NumLinesY = m_ZoomEnvelopeY.GetValue() / UnitsPerLineY + 1; Ui()->ClipEnable(&View); Graphics()->TextureClear(); @@ -6536,7 +6536,7 @@ void CEditor::RenderEnvelopeEditor(CUIRect View) if(Value.AsSeconds() / m_ZoomEnvelopeX.GetValue() * View.w < 160.0f) UnitsPerLineX = Value; } - int NumLinesX = m_ZoomEnvelopeX.GetValue() / static_cast(UnitsPerLineX.AsSeconds()) + 1; + int NumLinesX = m_ZoomEnvelopeX.GetValue() / UnitsPerLineX.AsSeconds() + 1; Ui()->ClipEnable(&View); Graphics()->TextureClear(); @@ -8390,8 +8390,8 @@ void CEditor::HandleCursorMovement() } // update positions for ui, but only update ui when rendering - m_MouseX = Ui()->Screen()->w * ((float)s_MouseX / Graphics()->WindowWidth()); - m_MouseY = Ui()->Screen()->h * ((float)s_MouseY / Graphics()->WindowHeight()); + m_MouseX = Ui()->Screen()->w * (s_MouseX / Graphics()->WindowWidth()); + m_MouseY = Ui()->Screen()->h * (s_MouseY / Graphics()->WindowHeight()); // fix correct world x and y std::shared_ptr pGroup = GetSelectedGroup(); diff --git a/src/tools/map_replace_area.cpp b/src/tools/map_replace_area.cpp index 7ad30c9ba84..8dbe9dd9c88 100644 --- a/src/tools/map_replace_area.cpp +++ b/src/tools/map_replace_area.cpp @@ -634,7 +634,7 @@ bool GetLineIntersection(const float aLine1[2], const float aLine2[2], float aIn std::min(aLine1[1], aLine2[1])}; if(aIntersection) - SetInexistent((float *)aIntersection, 2); + SetInexistent(aIntersection, 2); if(aBorders[0] - aBorders[1] > 0.01f) return false; From 59cb7ef5a9a2a84d2034f93c398948cf8ba0b4fa Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 11 May 2024 13:58:23 +0800 Subject: [PATCH 008/179] Fix clang-analyzer-unix.StdCLibraryFunctions ``` /home/chiller/Desktop/git/ddnet/src/base/system.cpp:1989:10: error: The 1st argument to 'connect' is < 0 but should be >= 0 [clang-analyzer-unix.StdCLibraryFunctions,-warnings-as-errors] 1989 | return connect(sock->ipv4sock, (struct sockaddr *)&addr, sizeof(addr)); | ^ ``` --- src/base/system.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/base/system.cpp b/src/base/system.cpp index 514c92d5b60..a7e6a2b884d 100644 --- a/src/base/system.cpp +++ b/src/base/system.cpp @@ -1987,6 +1987,8 @@ int net_tcp_connect(NETSOCKET sock, const NETADDR *a) { struct sockaddr_in addr; netaddr_to_sockaddr_in(a, &addr); + if(sock->ipv4sock < 0) + return -2; return connect(sock->ipv4sock, (struct sockaddr *)&addr, sizeof(addr)); } @@ -1994,6 +1996,8 @@ int net_tcp_connect(NETSOCKET sock, const NETADDR *a) { struct sockaddr_in6 addr; netaddr_to_sockaddr_in6(a, &addr); + if(sock->ipv6sock < 0) + return -2; return connect(sock->ipv6sock, (struct sockaddr *)&addr, sizeof(addr)); } From c1a5e59d9fcb7de7ab847386f4890764b6947f46 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Mon, 6 May 2024 17:42:34 +0800 Subject: [PATCH 009/179] Exclude enough checks to pass with clang tidy 19 --- .clang-tidy | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.clang-tidy b/.clang-tidy index d070405c517..ea3c8076ff5 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -31,6 +31,10 @@ Checks: > -bugprone-suspicious-include, -bugprone-unhandled-self-assignment, -bugprone-suspicious-realloc-usage, + -bugprone-switch-missing-default-case, + -bugprone-casting-through-void, + -bugprone-multi-level-implicit-pointer-conversion, + -bugprone-unchecked-optional-access, clang-analyzer-*, -clang-analyzer-optin.cplusplus.UninitializedObject, -clang-analyzer-optin.cplusplus.VirtualCall, @@ -50,6 +54,7 @@ Checks: > -misc-static-assert, -misc-unused-parameters, -misc-use-anonymous-namespace, + -misc-include-cleaner, modernize-avoid-bind, modernize-concat-nested-namespaces, modernize-deprecated-headers, @@ -85,8 +90,11 @@ Checks: > -readability-simplify-boolean-expr, -readability-suspicious-call-argument, -readability-uppercase-literal-suffix, + -readability-use-std-min-max, + -readability-avoid-nested-conditional-operator, performance-*, -performance-no-int-to-ptr, + -performance-enum-size, portability-*, WarningsAsErrors: From 4e552d0f986a0b36e9682a4f94f3b0b4e853e94b Mon Sep 17 00:00:00 2001 From: furo Date: Sun, 12 May 2024 00:14:52 +0200 Subject: [PATCH 010/179] Add `/practicecmdlist` --- src/game/server/ddracechat.cpp | 32 ++++++++++++++++++++++---------- src/game/server/gamecontext.cpp | 1 + src/game/server/gamecontext.h | 1 + 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index e6ddfa178d5..ff679fc553a 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -695,20 +695,32 @@ void CGameContext::ConPractice(IConsole::IResult *pResult, void *pUserData) { Teams.SetPractice(Team, true); pSelf->SendChatTeam(Team, "Practice mode enabled for your team, happy practicing!"); + pSelf->SendChatTeam(Team, "See /practicecmdlist for a list of all avaliable practice commands. Most commonly used ones are /telecursor, /lasttp and /rescue"); + } +} - char aPracticeCommands[256]; - mem_zero(aPracticeCommands, sizeof(aPracticeCommands)); - str_append(aPracticeCommands, "Available practice commands: "); - for(const IConsole::CCommandInfo *pCmd = pSelf->Console()->FirstCommandInfo(IConsole::ACCESS_LEVEL_USER, CMDFLAG_PRACTICE); - pCmd; pCmd = pCmd->NextCommandInfo(IConsole::ACCESS_LEVEL_USER, CMDFLAG_PRACTICE)) - { - char aCommand[64]; +void CGameContext::ConPracticeCmdList(IConsole::IResult *pResult, void *pUserData) +{ + CGameContext *pSelf = (CGameContext *)pUserData; - str_format(aCommand, sizeof(aCommand), "/%s%s", pCmd->m_pName, pCmd->NextCommandInfo(IConsole::ACCESS_LEVEL_USER, CMDFLAG_PRACTICE) ? ", " : ""); - str_append(aPracticeCommands, aCommand); + char aPracticeCommands[256]; + mem_zero(aPracticeCommands, sizeof(aPracticeCommands)); + str_append(aPracticeCommands, "Available practice commands: "); + for(const IConsole::CCommandInfo *pCmd = pSelf->Console()->FirstCommandInfo(IConsole::ACCESS_LEVEL_USER, CMDFLAG_PRACTICE); + pCmd; pCmd = pCmd->NextCommandInfo(IConsole::ACCESS_LEVEL_USER, CMDFLAG_PRACTICE)) + { + char aCommand[64]; + + str_format(aCommand, sizeof(aCommand), "/%s%s", pCmd->m_pName, pCmd->NextCommandInfo(IConsole::ACCESS_LEVEL_USER, CMDFLAG_PRACTICE) ? ", " : ""); + + if(str_length(aCommand) + str_length(aPracticeCommands) > 255) + { + pSelf->SendChatTarget(pResult->m_ClientId, aPracticeCommands); + mem_zero(aPracticeCommands, sizeof(aPracticeCommands)); } - pSelf->SendChatTeam(Team, aPracticeCommands); + str_append(aPracticeCommands, aCommand); } + pSelf->SendChatTarget(pResult->m_ClientId, aPracticeCommands); } void CGameContext::ConSwap(IConsole::IResult *pResult, void *pUserData) diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 1db4324cea7..efa8f3e4f82 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -3656,6 +3656,7 @@ void CGameContext::RegisterChatCommands() Console()->Register("mapinfo", "?r[map]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConMapInfo, this, "Show info about the map with name r gives (current map by default)"); Console()->Register("timeout", "?s[code]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConTimeout, this, "Set timeout protection code s"); Console()->Register("practice", "?i['0'|'1']", CFGFLAG_CHAT | CFGFLAG_SERVER, ConPractice, this, "Enable cheats (currently only /rescue) for your current team's run, but you can't earn a rank"); + Console()->Register("practicecmdlist", "", CFGFLAG_CHAT | CFGFLAG_SERVER, ConPracticeCmdList, this, "List all commands that are avaliable in practice mode"); Console()->Register("swap", "?r[player name]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConSwap, this, "Request to swap your tee with another team member"); Console()->Register("save", "?r[code]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConSave, this, "Save team with code r."); Console()->Register("load", "?r[code]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConLoad, this, "Load with code r. /load to check your existing saves"); diff --git a/src/game/server/gamecontext.h b/src/game/server/gamecontext.h index dc1c658a674..45492e002b9 100644 --- a/src/game/server/gamecontext.h +++ b/src/game/server/gamecontext.h @@ -431,6 +431,7 @@ class CGameContext : public IGameServer static void ConMapInfo(IConsole::IResult *pResult, void *pUserData); static void ConTimeout(IConsole::IResult *pResult, void *pUserData); static void ConPractice(IConsole::IResult *pResult, void *pUserData); + static void ConPracticeCmdList(IConsole::IResult *pResult, void *pUserData); static void ConSwap(IConsole::IResult *pResult, void *pUserData); static void ConSave(IConsole::IResult *pResult, void *pUserData); static void ConLoad(IConsole::IResult *pResult, void *pUserData); From f762e2364f1d48802767488a077ef85c28cbae84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 1 Jun 2024 21:30:16 +0200 Subject: [PATCH 011/179] Fix language file being loaded twice when starting Ignore language file config variable being set initially in the conchain (i.e. when `GlobalTime` still returns zero) and check whether the value changed before reloading the language. --- src/game/client/gameclient.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index d41cd9607c6..88191208206 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2414,9 +2414,13 @@ void CGameClient::ConKill(IConsole::IResult *pResult, void *pUserData) void CGameClient::ConchainLanguageUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { + CGameClient *pThis = static_cast(pUserData); + const bool Changed = pThis->Client()->GlobalTime() && pResult->NumArguments() && str_comp(pResult->GetString(0), g_Config.m_ClLanguagefile) != 0; pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - ((CGameClient *)pUserData)->OnLanguageChange(); + if(Changed) + { + pThis->OnLanguageChange(); + } } void CGameClient::ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) From 9492ca574bc21d95122e5a42dc4c932fdbe9e8cd Mon Sep 17 00:00:00 2001 From: Louis Geer Date: Tue, 28 May 2024 23:16:32 +0900 Subject: [PATCH 012/179] Add confetti particles on finish Add confetti particles on finish added common base to finish netevent review fixes change netevent to ddnet.org --- datasrc/network.py | 5 ++- src/game/client/components/effects.cpp | 54 ++++++++++++++++++++++++++ src/game/client/components/effects.h | 1 + src/game/client/gameclient.cpp | 5 +++ src/game/server/gamecontext.cpp | 11 ++++++ src/game/server/gamecontext.h | 1 + src/game/server/teams.cpp | 4 ++ 7 files changed, 80 insertions(+), 1 deletion(-) diff --git a/datasrc/network.py b/datasrc/network.py index ca49148787b..f028337d170 100644 --- a/datasrc/network.py +++ b/datasrc/network.py @@ -1,7 +1,7 @@ # pylint: skip-file # See https://github.com/ddnet/ddnet/issues/3507 -from datatypes import Enum, Flags, NetArray, NetBool, NetEvent, NetIntAny, NetIntRange, NetMessage, NetMessageEx, NetObject, NetObjectEx, NetString, NetStringHalfStrict, NetStringStrict, NetTick +from datatypes import Enum, Flags, NetArray, NetBool, NetEvent, NetEventEx, NetIntAny, NetIntRange, NetMessage, NetMessageEx, NetObject, NetObjectEx, NetString, NetStringHalfStrict, NetStringStrict, NetTick Emotes = ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"] PlayerFlags = ["PLAYING", "IN_MENU", "CHATTING", "SCOREBOARD", "AIM"] @@ -328,6 +328,7 @@ NetEvent("Spawn:Common", []), NetEvent("HammerHit:Common", []), + NetEvent("Death:Common", [ NetIntRange("m_ClientId", 0, 'MAX_CLIENTS-1'), ]), @@ -344,6 +345,8 @@ NetIntAny("m_Angle"), ]), + NetEventEx("Finish:Common", "finish@netevent.ddnet.org", []), + NetObjectEx("MyOwnEvent", "my-own-event@heinrich5991.de", [ NetIntAny("m_Test"), ]), diff --git a/src/game/client/components/effects.cpp b/src/game/client/components/effects.cpp index f3b38db8cc8..f6389e92403 100644 --- a/src/game/client/components/effects.cpp +++ b/src/game/client/components/effects.cpp @@ -231,6 +231,60 @@ void CEffects::PlayerDeath(vec2 Pos, int ClientId, float Alpha) } } +void CEffects::FinishConfetti(vec2 Pos, float Alpha) +{ + ColorRGBA Red(1.0f, 0.4f, 0.4f); + ColorRGBA Green(0.4f, 1.0f, 0.4f); + ColorRGBA Blue(0.4f, 0.4f, 1.0f); + ColorRGBA Yellow(1.0f, 1.0f, 0.4f); + ColorRGBA Cyan(0.4f, 1.0f, 1.0f); + ColorRGBA Magenta(1.0f, 0.4f, 1.0f); + + ColorRGBA aConfettiColors[] = {Red, Green, Blue, Yellow, Cyan, Magenta}; + + // powerful confettis + for(int i = 0; i < 32; i++) + { + CParticle p; + p.SetDefault(); + p.m_Spr = SPRITE_PART_SPLAT01 + (rand() % 3); + p.m_Pos = Pos; + p.m_Vel = direction(-0.5f * pi + random_float(-0.2f, 0.2f)) * random_float(0.01f, 1.0f) * 2000.0f; + p.m_LifeSpan = random_float(1.0f, 1.2f); + p.m_StartSize = random_float(12.0f, 24.0f); + p.m_EndSize = 0; + p.m_Rot = random_angle(); + p.m_Rotspeed = random_float(-0.5f, 0.5f) * pi; + p.m_Gravity = -700.0f; + p.m_Friction = 0.6f; + ColorRGBA c = aConfettiColors[(rand() % std::size(aConfettiColors))]; + p.m_Color = c.WithMultipliedAlpha(0.75f * Alpha); + p.m_StartAlpha = Alpha; + m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); + } + + // broader confettis + for(int i = 0; i < 32; i++) + { + CParticle p; + p.SetDefault(); + p.m_Spr = SPRITE_PART_SPLAT01 + (rand() % 3); + p.m_Pos = Pos; + p.m_Vel = direction(-0.5f * pi + random_float(-0.8f, 0.8f)) * random_float(0.01f, 1.0f) * 1500.0f; + p.m_LifeSpan = random_float(0.8f, 1.0f); + p.m_StartSize = random_float(12.0f, 24.0f); + p.m_EndSize = 0; + p.m_Rot = random_angle(); + p.m_Rotspeed = random_float(-0.5f, 0.5f) * pi; + p.m_Gravity = -700.0f; + p.m_Friction = 0.6f; + ColorRGBA c = aConfettiColors[(rand() % std::size(aConfettiColors))]; + p.m_Color = c.WithMultipliedAlpha(0.75f * Alpha); + p.m_StartAlpha = Alpha; + m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); + } +} + void CEffects::Explosion(vec2 Pos, float Alpha) { // add to flow diff --git a/src/game/client/components/effects.h b/src/game/client/components/effects.h index adc0a374b39..c88b691efe8 100644 --- a/src/game/client/components/effects.h +++ b/src/game/client/components/effects.h @@ -31,6 +31,7 @@ class CEffects : public CComponent void PlayerDeath(vec2 Pos, int ClientId, float Alpha = 1.0f); void PowerupShine(vec2 Pos, vec2 Size, float Alpha = 1.0f); void FreezingFlakes(vec2 Pos, vec2 Size, float Alpha = 1.0f); + void FinishConfetti(vec2 Pos, float Alpha = 1.0f); void Update(); }; diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index d41cd9607c6..944fe539844 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -1140,6 +1140,11 @@ void CGameClient::ProcessEvents() CNetEvent_HammerHit *pEvent = (CNetEvent_HammerHit *)pData; m_Effects.HammerHit(vec2(pEvent->m_X, pEvent->m_Y), Alpha); } + else if(Item.m_Type == NETEVENTTYPE_FINISH) + { + CNetEvent_Finish *pEvent = (CNetEvent_Finish *)pData; + m_Effects.FinishConfetti(vec2(pEvent->m_X, pEvent->m_Y), Alpha); + } else if(Item.m_Type == NETEVENTTYPE_SPAWN) { CNetEvent_Spawn *pEvent = (CNetEvent_Spawn *)pData; diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 77cbee25dda..5df6d4cc5fe 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -347,6 +347,17 @@ void CGameContext::CreateDeath(vec2 Pos, int ClientId, CClientMask Mask) } } +void CGameContext::CreateFinishConfetti(vec2 Pos, CClientMask Mask) +{ + // create the event + CNetEvent_Finish *pEvent = m_Events.Create(Mask); + if(pEvent) + { + pEvent->m_X = (int)Pos.x; + pEvent->m_Y = (int)Pos.y; + } +} + void CGameContext::CreateSound(vec2 Pos, int Sound, CClientMask Mask) { if(Sound < 0) diff --git a/src/game/server/gamecontext.h b/src/game/server/gamecontext.h index d7ae913410a..b8423e66912 100644 --- a/src/game/server/gamecontext.h +++ b/src/game/server/gamecontext.h @@ -239,6 +239,7 @@ class CGameContext : public IGameServer void CreateHammerHit(vec2 Pos, CClientMask Mask = CClientMask().set()); void CreatePlayerSpawn(vec2 Pos, CClientMask Mask = CClientMask().set()); void CreateDeath(vec2 Pos, int ClientId, CClientMask Mask = CClientMask().set()); + void CreateFinishConfetti(vec2 Pos, CClientMask Mask = CClientMask().set()); void CreateSound(vec2 Pos, int Sound, CClientMask Mask = CClientMask().set()); void CreateSoundGlobal(int Sound, int Target = -1) const; diff --git a/src/game/server/teams.cpp b/src/game/server/teams.cpp index e6f70a944b4..75a8e4d308e 100644 --- a/src/game/server/teams.cpp +++ b/src/game/server/teams.cpp @@ -848,6 +848,10 @@ void CGameTeams::OnFinish(CPlayer *Player, int TimeTicks, const char *pTimestamp { Player->m_Score = TTime; } + + // Confetti + CCharacter *pChar = Player->GetCharacter(); + m_pGameContext->CreateFinishConfetti(pChar->m_Pos, pChar->TeamMask()); } void CGameTeams::RequestTeamSwap(CPlayer *pPlayer, CPlayer *pTargetPlayer, int Team) From 94325cdf78dfa0e33cae2482561b1ee24e8e2e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 1 Jun 2024 21:35:38 +0200 Subject: [PATCH 013/179] Improve error handling for invalid translation files Fix crash when reading a translation file that ends unexpectedly after a context line. Make error messages about malformed translation files more detailed. Fix incorrect line numbers in the error message because context lines were not counted. Use `log_error` for error messages. --- src/game/localization.cpp | 62 +++++++++++++++------------------------ 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/src/game/localization.cpp b/src/game/localization.cpp index 1b3feb33b73..f6471bb8326 100644 --- a/src/game/localization.cpp +++ b/src/game/localization.cpp @@ -3,6 +3,8 @@ #include "localization.h" +#include + #include #include #include @@ -24,9 +26,7 @@ void CLocalizationDatabase::LoadIndexfile(IStorage *pStorage, IConsole *pConsole IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); if(!File) { - char aBuf[64 + IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "Couldn't open index file '%s'", pFilename); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "Couldn't open index file '%s'", pFilename); return; } @@ -45,16 +45,12 @@ void CLocalizationDatabase::LoadIndexfile(IStorage *pStorage, IConsole *pConsole pLine = LineReader.Get(); if(!pLine) { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Unexpected end of index file after language '%s'", aEnglishName); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "Unexpected end of index file after language '%s'", aEnglishName); break; } if(!str_startswith(pLine, "== ")) { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Missing native name for language '%s'", aEnglishName); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "Missing native name for language '%s'", aEnglishName); (void)LineReader.Get(); (void)LineReader.Get(); continue; @@ -65,16 +61,12 @@ void CLocalizationDatabase::LoadIndexfile(IStorage *pStorage, IConsole *pConsole pLine = LineReader.Get(); if(!pLine) { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Unexpected end of index file after language '%s'", aEnglishName); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "Unexpected end of index file after language '%s'", aEnglishName); break; } if(!str_startswith(pLine, "== ")) { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Missing country code for language '%s'", aEnglishName); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "Missing country code for language '%s'", aEnglishName); (void)LineReader.Get(); continue; } @@ -84,16 +76,12 @@ void CLocalizationDatabase::LoadIndexfile(IStorage *pStorage, IConsole *pConsole pLine = LineReader.Get(); if(!pLine) { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Unexpected end of index file after language '%s'", aEnglishName); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "Unexpected end of index file after language '%s'", aEnglishName); break; } if(!str_startswith(pLine, "== ")) { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Missing language codes for language '%s'", aEnglishName); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "Missing language codes for language '%s'", aEnglishName); continue; } const char *pLanguageCodes = pLine + 3; @@ -108,9 +96,7 @@ void CLocalizationDatabase::LoadIndexfile(IStorage *pStorage, IConsole *pConsole } if(vLanguageCodes.empty()) { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "At least one language code required for language '%s'", aEnglishName); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "At least one language code required for language '%s'", aEnglishName); continue; } @@ -137,9 +123,7 @@ void CLocalizationDatabase::SelectDefaultLanguage(IConsole *pConsole, char *pFil char aLocaleStr[128]; os_locale_str(aLocaleStr, sizeof(aLocaleStr)); - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Choosing default language based on user locale '%s'", aLocaleStr); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_info("localization", "Choosing default language based on user locale '%s'", aLocaleStr); while(true) { @@ -199,9 +183,7 @@ bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, ICon if(!IoHandle) return false; - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "loaded '%s'", pFilename); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_info("localization", "loaded '%s'", pFilename); m_vStrings.clear(); m_StringsHeap.Reset(); @@ -225,31 +207,35 @@ bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, ICon size_t Len = str_length(pLine); if(Len < 1 || pLine[Len - 1] != ']') { - str_format(aBuf, sizeof(aBuf), "malformed context line (%d): %s", Line, pLine); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "malformed context '%s' on line %d", pLine, Line); continue; } - str_copy(aContext, pLine + 1, Len - 1); + str_truncate(aContext, sizeof(aContext), pLine + 1, Len - 1); pLine = LineReader.Get(); + if(!pLine) + { + log_error("localization", "unexpected end of file after context line '%s' on line %d", aContext, Line); + break; + } + Line++; } else { aContext[0] = '\0'; } - str_copy(aOrigin, pLine, sizeof(aOrigin)); + str_copy(aOrigin, pLine); char *pReplacement = LineReader.Get(); - Line++; if(!pReplacement) { - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", "unexpected end of file"); + log_error("localization", "unexpected end of file after original '%s' on line %d", aOrigin, Line); break; } + Line++; if(pReplacement[0] != '=' || pReplacement[1] != '=' || pReplacement[2] != ' ') { - str_format(aBuf, sizeof(aBuf), "malformed replacement line (%d) for '%s'", Line, aOrigin); - pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); + log_error("localization", "malformed replacement '%s' for original '%s' on line %d", pReplacement, aOrigin, Line); continue; } From cc7d6c393ddc284eba5174f979b3d8cfeb1dedb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 11:50:11 +0200 Subject: [PATCH 014/179] Fix truncated scoreboard recording notification, refactoring With some languages the buffers for the scoreboard recording notification were not large enough when recording all 4 types of demos at the same time. Reduce duplicate code. Avoid unnecessary, slow `str_format` for concatenation. Use UI functions for drawing the background and text. --- src/game/client/components/scoreboard.cpp | 63 +++++++++++------------ 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp index e6e83bdd7f6..ad2c0752b29 100644 --- a/src/game/client/components/scoreboard.cpp +++ b/src/game/client/components/scoreboard.cpp @@ -523,47 +523,42 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch void CScoreboard::RenderRecordingNotification(float x) { - char aBuf[64] = "\0"; - char aBuf2[64]; - char aTime[32]; + char aBuf[512] = ""; - if(m_pClient->DemoRecorder(RECORDER_MANUAL)->IsRecording()) - { - str_time((int64_t)m_pClient->DemoRecorder(RECORDER_MANUAL)->Length() * 100, TIME_HOURS, aTime, sizeof(aTime)); - str_format(aBuf2, sizeof(aBuf2), "%s %s ", Localize("Manual"), aTime); - str_append(aBuf, aBuf2); - } - if(m_pClient->DemoRecorder(RECORDER_RACE)->IsRecording()) - { - str_time((int64_t)m_pClient->DemoRecorder(RECORDER_RACE)->Length() * 100, TIME_HOURS, aTime, sizeof(aTime)); - str_format(aBuf2, sizeof(aBuf2), "%s %s ", Localize("Race"), aTime); - str_append(aBuf, aBuf2); - } - if(m_pClient->DemoRecorder(RECORDER_AUTO)->IsRecording()) - { - str_time((int64_t)m_pClient->DemoRecorder(RECORDER_AUTO)->Length() * 100, TIME_HOURS, aTime, sizeof(aTime)); - str_format(aBuf2, sizeof(aBuf2), "%s %s ", Localize("Auto"), aTime); - str_append(aBuf, aBuf2); - } - if(m_pClient->DemoRecorder(RECORDER_REPLAYS)->IsRecording()) - { - str_time((int64_t)m_pClient->DemoRecorder(RECORDER_REPLAYS)->Length() * 100, TIME_HOURS, aTime, sizeof(aTime)); - str_format(aBuf2, sizeof(aBuf2), "%s %s ", Localize("Replay"), aTime); - str_append(aBuf, aBuf2); - } + const auto &&AppendRecorderInfo = [&](int Recorder, const char *pName) { + if(GameClient()->DemoRecorder(Recorder)->IsRecording()) + { + char aTime[32]; + str_time((int64_t)GameClient()->DemoRecorder(Recorder)->Length() * 100, TIME_HOURS, aTime, sizeof(aTime)); + str_append(aBuf, pName); + str_append(aBuf, " "); + str_append(aBuf, aTime); + str_append(aBuf, " "); + } + }; + + AppendRecorderInfo(RECORDER_MANUAL, Localize("Manual")); + AppendRecorderInfo(RECORDER_RACE, Localize("Race")); + AppendRecorderInfo(RECORDER_AUTO, Localize("Auto")); + AppendRecorderInfo(RECORDER_REPLAYS, Localize("Replay")); - if(!aBuf[0]) + if(aBuf[0] == '\0') return; - float w = TextRender()->TextWidth(20.0f, aBuf, -1, -1.0f); + const float FontSize = 20.0f; - // draw the box - Graphics()->DrawRect(x, 0.0f, w + 60.0f, 50.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_B, 15.0f); + CUIRect Rect = {x, 0.0f, TextRender()->TextWidth(FontSize, aBuf) + 60.0f, 50.0f}; + Rect.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_B, 15.0f); + Rect.VSplitLeft(20.0f, nullptr, &Rect); + Rect.VSplitRight(10.0f, &Rect, nullptr); - // draw the red dot - Graphics()->DrawRect(x + 20, 15.0f, 20.0f, 20.0f, ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f), IGraphics::CORNER_ALL, 10.0f); + CUIRect Circle; + Rect.VSplitLeft(20.0f, &Circle, &Rect); + Circle.HMargin((Circle.h - Circle.w) / 2.0f, &Circle); + Circle.Draw(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f), IGraphics::CORNER_ALL, Circle.h / 2.0f); - TextRender()->Text(x + 50.0f, (50.f - 20.f) / 2.f, 20.0f, aBuf, -1.0f); + Rect.VSplitLeft(10.0f, nullptr, &Rect); + Ui()->DoLabel(&Rect, aBuf, FontSize, TEXTALIGN_ML); } void CScoreboard::OnRender() From 37abc9039a5fe879edca45dea35b0f93a389cf33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 12:57:15 +0200 Subject: [PATCH 015/179] =?UTF-8?q?Consistently=20use=20`=E2=80=A6`=20inst?= =?UTF-8?q?ead=20of=20`...`=20in=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/languages/arabic.txt | 14 +++++------ data/languages/azerbaijanese.txt | 18 +++++++------- data/languages/belarusian.txt | 16 ++++++------- data/languages/bosnian.txt | 14 +++++------ data/languages/brazilian_portuguese.txt | 16 ++++++------- data/languages/bulgarian.txt | 10 ++++---- data/languages/catalan.txt | 14 +++++------ data/languages/chuvash.txt | 8 +++---- data/languages/czech.txt | 16 ++++++------- data/languages/danish.txt | 14 +++++------ data/languages/dutch.txt | 12 +++++----- data/languages/esperanto.txt | 12 +++++----- data/languages/estonian.txt | 14 +++++------ data/languages/finnish.txt | 22 ++++++++--------- data/languages/french.txt | 16 ++++++------- data/languages/galician.txt | 16 ++++++------- data/languages/german.txt | 16 ++++++------- data/languages/greek.txt | 10 ++++---- data/languages/hungarian.txt | 22 ++++++++--------- data/languages/italian.txt | 20 ++++++++-------- data/languages/japanese.txt | 8 +++---- data/languages/korean.txt | 16 ++++++------- data/languages/kyrgyz.txt | 10 ++++---- data/languages/norwegian.txt | 14 +++++------ data/languages/persian.txt | 14 +++++------ data/languages/polish.txt | 16 ++++++------- data/languages/portuguese.txt | 12 +++++----- data/languages/romanian.txt | 10 ++++---- data/languages/russian.txt | 16 ++++++------- data/languages/serbian.txt | 16 ++++++------- data/languages/serbian_cyrillic.txt | 12 +++++----- data/languages/simplified_chinese.txt | 24 +++++++++---------- data/languages/slovak.txt | 20 ++++++++-------- data/languages/spanish.txt | 16 ++++++------- data/languages/swedish.txt | 16 ++++++------- data/languages/traditional_chinese.txt | 22 ++++++++--------- data/languages/turkish.txt | 18 +++++++------- data/languages/ukrainian.txt | 22 ++++++++--------- src/game/client/components/hud.cpp | 2 +- src/game/client/components/menus.cpp | 2 +- src/game/client/components/menus_settings.cpp | 2 +- src/game/client/components/menus_start.cpp | 2 +- 42 files changed, 295 insertions(+), 295 deletions(-) diff --git a/data/languages/arabic.txt b/data/languages/arabic.txt index 7980bfd2268..dae5e5c0358 100644 --- a/data/languages/arabic.txt +++ b/data/languages/arabic.txt @@ -71,8 +71,8 @@ Client Connecting to == ﻰﻟﺍ ﻝﺎﺼﺗﺍ -Connection Problems... -== ﻝﺎﺼﺗﻻﺍ ﻲﻓ ﻞﻛﺎﺸﻣ... +Connection Problems… +== ﻝﺎﺼﺗﻻﺍ ﻲﻓ ﻞﻛﺎﺸﻣ… Console == ﻞﺴﻧﻮﻜﻟﺍ @@ -608,8 +608,8 @@ Show other players' key presses System message == ﻡﺎﻈﻨﻟﺍ ﻞﺋﺎﺳﺭ -Updating... -== ...ﺚﻳﺪﺤﺘﻟﺍ ﺭﺎﺟ +Updating… +== …ﺚﻳﺪﺤﺘﻟﺍ ﺭﺎﺟ Overlay entities == ﻥﺍﺭﺪﺠﻟﺍ-ﺐﻛﺍﺮﺗ @@ -845,8 +845,8 @@ Zoom in Disconnect Dummy == ﺔﻴﻣﺪﻟﺍ ﺝﺍﺮﺧﺍ -Update failed! Check log... -== ...ﺕﺎﻗﻮﻠﻟﺍ ﻦﻣ ﺪﻛﺎﺗ !ﻞﺸﻓ ﺚﻳﺪﺤﺘﻟﺍ +Update failed! Check log… +== …ﺕﺎﻗﻮﻠﻟﺍ ﻦﻣ ﺪﻛﺎﺗ !ﻞﺸﻓ ﺚﻳﺪﺤﺘﻟﺍ Markers == ﺕﺎﻣﻼﻌﻟﺍ @@ -1260,7 +1260,7 @@ Join Tutorial Server Skip Tutorial == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. diff --git a/data/languages/azerbaijanese.txt b/data/languages/azerbaijanese.txt index 6516ee98dd7..995490905f2 100644 --- a/data/languages/azerbaijanese.txt +++ b/data/languages/azerbaijanese.txt @@ -75,8 +75,8 @@ Client Connecting to == Bağlanmaq -Connection Problems... -== Bağlantı Xətası... +Connection Problems… +== Bağlantı Xətası… Console == Konsol @@ -612,7 +612,7 @@ DDNet %s is out! Downloading %s: == Endirilir %s: -Update failed! Check log... +Update failed! Check log… == Yeniləmə zamanı xəta baş verdi! DDNet Client updated! @@ -891,8 +891,8 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s Nəşr olundu: -Updating... -== Yenilənir... +Updating… +== Yenilənir… No updates available == Güncəlləmə mövcud deyil @@ -1033,10 +1033,10 @@ Warning == Xəbərdarlıq Quitting. Please wait… -== Çıxılır. Zəhmət olmasa, gözləyin... +== Çıxılır. Zəhmət olmasa, gözləyin… Restarting. Please wait… -== Yenidən işə salınır. Zəhmət olmasa, gözləyin... +== Yenidən işə salınır. Zəhmət olmasa, gözləyin… Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. == Sazlama rejimi aktivdir. Onu söndürmək üçün Ctrl+Shift+D düymələrini sıxın. @@ -1059,8 +1059,8 @@ Team %d Uploading map data to GPU == Uploading map data to GPU -Trying to determine UDP connectivity... -== Trying to determine UDP connectivity... +Trying to determine UDP connectivity… +== Trying to determine UDP connectivity… UDP seems to be filtered. == UDP seems to be filtered. diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt index 86e416264be..9511e255b85 100644 --- a/data/languages/belarusian.txt +++ b/data/languages/belarusian.txt @@ -80,8 +80,8 @@ Client Connecting to == Падлучэнне да -Connection Problems... -== Праблемы з падлучэннем... +Connection Problems… +== Праблемы з падлучэннем… Console == Кансоль @@ -615,8 +615,8 @@ Browser Ghost == Прывід -Trying to determine UDP connectivity... -== Спроба вызначыць UDP падлучэнне... +Trying to determine UDP connectivity… +== Спроба вызначыць UDP падлучэнне… UDP seems to be filtered. == Здаецца, UDP фільтруецца. @@ -1400,8 +1400,8 @@ DDNet %s is available: Update now == Абнавіць зараз -Updating... -== Абнаўленне... +Updating… +== Абнаўленне… DDNet Client updated! == Кліент DDNet абнаўлён! @@ -1476,8 +1476,8 @@ DDNet %s is out! Downloading %s: == Спампоўка %s: -Update failed! Check log... -== Абнаўленне не атрымалася. Праверце логі... +Update failed! Check log… +== Абнаўленне не атрымалася. Праверце логі… Restart == Перазапуск diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt index 29e75a6d05a..6e7b0baaf66 100644 --- a/data/languages/bosnian.txt +++ b/data/languages/bosnian.txt @@ -79,8 +79,8 @@ Client Connecting to == Konektovanje na -Connection Problems... -== Problemi sa konekcijom... +Connection Problems… +== Problemi sa konekcijom… Console == Konzola @@ -618,8 +618,8 @@ DDNet %s is out! Downloading %s: == Preuzimanje %s: -Update failed! Check log... -== Ažuriranje neuspješno! Provjeri log... +Update failed! Check log… +== Ažuriranje neuspješno! Provjeri log… DDNet Client updated! == DDNet Klijent ažuriran! @@ -876,8 +876,8 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s je dostupan: -Updating... -== Ažuriranje... +Updating… +== Ažuriranje… No updates available == Nema dostupnih ažuriranja @@ -1143,7 +1143,7 @@ Join Tutorial Server Skip Tutorial == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index 254df1c4a4e..a49018a230f 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -105,8 +105,8 @@ Client Connecting to == Conectando a -Connection Problems... -== Problemas de conexão... +Connection Problems… +== Problemas de conexão… Console == Console @@ -663,8 +663,8 @@ DDNet %s is available: News == Novidades -Updating... -== Atualizando... +Updating… +== Atualizando… Overlay entities == Sobrepor entidades @@ -828,8 +828,8 @@ Reload Time == Tempo -Update failed! Check log... -== Atualização falhou! Verifique o log... +Update failed! Check log… +== Atualização falhou! Verifique o log… 1 new mention == 1 nova menção @@ -1237,8 +1237,8 @@ Speed: Angle: == Ângulo: -Trying to determine UDP connectivity... -== Tentando determinar conectividade UDP... +Trying to determine UDP connectivity… +== Tentando determinar conectividade UDP… UDP seems to be filtered. == UDP parece estar filtrado. diff --git a/data/languages/bulgarian.txt b/data/languages/bulgarian.txt index 02e1c4cdb6a..6d41c862142 100644 --- a/data/languages/bulgarian.txt +++ b/data/languages/bulgarian.txt @@ -76,8 +76,8 @@ Client Connecting to == Свързвам се с -Connection Problems... -== Проблеми с Връзката... +Connection Problems… +== Проблеми с Връзката… Console == Конзола @@ -798,7 +798,7 @@ Show DDNet map finishes in server browser transmits your player name to info.ddnet.org == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. @@ -1710,7 +1710,7 @@ DDNet %s is available: Update now == -Updating... +Updating… == DDNet Client updated! @@ -1780,7 +1780,7 @@ DDNet %s is out! Downloading %s: == -Update failed! Check log... +Update failed! Check log… == Loading race demo files diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt index a8c2be718ef..5fff77766b6 100644 --- a/data/languages/catalan.txt +++ b/data/languages/catalan.txt @@ -72,8 +72,8 @@ Client Connecting to == T'estàs unint a -Connection Problems... -== Problemes de connexió... +Connection Problems… +== Problemes de connexió… Console == Consola @@ -647,8 +647,8 @@ Enable long pain sound (used when shooting in freeze) DDNet %s is available: == DDNet %s està disponible: -Updating... -== Actualitzant... +Updating… +== Actualitzant… Overlay entities == Entitats superposades @@ -839,8 +839,8 @@ DDNet %s is out! Downloading %s: == Descarregant %s: -Update failed! Check log... -== L'actualització ha fallat! Mira el registre... +Update failed! Check log… +== L'actualització ha fallat! Mira el registre… Markers == Marques @@ -1353,7 +1353,7 @@ Videos directory Video was saved to '%s' == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. diff --git a/data/languages/chuvash.txt b/data/languages/chuvash.txt index cf5fdeb7353..b2300808c70 100644 --- a/data/languages/chuvash.txt +++ b/data/languages/chuvash.txt @@ -76,7 +76,7 @@ Client Connecting to == Çыхăну -Connection Problems... +Connection Problems… == Çыхăну проблемасем Console @@ -801,7 +801,7 @@ Show DDNet map finishes in server browser transmits your player name to info.ddnet.org == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. @@ -1710,7 +1710,7 @@ DDNet %s is available: Update now == -Updating... +Updating… == DDNet Client updated! @@ -1780,7 +1780,7 @@ DDNet %s is out! Downloading %s: == -Update failed! Check log... +Update failed! Check log… == Loading race demo files diff --git a/data/languages/czech.txt b/data/languages/czech.txt index 6e7f1162e48..ac034076f33 100644 --- a/data/languages/czech.txt +++ b/data/languages/czech.txt @@ -80,8 +80,8 @@ Client Connecting to == Připojuji na -Connection Problems... -== Problémy s připojením... +Connection Problems… +== Problémy s připojením… Console == Konzole @@ -883,8 +883,8 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s je k dispozici: -Updating... -== Aktualizace... +Updating… +== Aktualizace… No updates available == Nejsou k dispozici žádné aktualizace @@ -1070,8 +1070,8 @@ Editor Play == Hrát -Update failed! Check log... -== Aktualizace selhala! Zkontrolujte log... +Update failed! Check log… +== Aktualizace selhala! Zkontrolujte log… [Graphics error] Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. @@ -1226,8 +1226,8 @@ Press a key… Main menu == Hlavní menu -Trying to determine UDP connectivity... -== Pokus o zjištění připojení UDP... +Trying to determine UDP connectivity… +== Pokus o zjištění připojení UDP… UDP seems to be filtered. == Zdá se, že UDP je filtrován. diff --git a/data/languages/danish.txt b/data/languages/danish.txt index 0f8073bc089..9ab783c7a76 100644 --- a/data/languages/danish.txt +++ b/data/languages/danish.txt @@ -77,8 +77,8 @@ Client Connecting to == Forbinder til -Connection Problems... -== Forbindelsesproblemer... +Connection Problems… +== Forbindelsesproblemer… Console == Konsol @@ -949,8 +949,8 @@ DDNet %s is available: Update now == Opdatere nu -Updating... -== Opdaterer... +Updating… +== Opdaterer… DDNet Client updated! == DDNet Klient opdateret! @@ -1010,8 +1010,8 @@ DDNet %s is out! Downloading %s: == Downloader %s: -Update failed! Check log... -== Opdatering fejlede! Tjek log... +Update failed! Check log… +== Opdatering fejlede! Tjek log… Restart == Genstart @@ -1268,7 +1268,7 @@ Join Tutorial Server Skip Tutorial == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index c1a284844a9..5fb7d2d3783 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -89,8 +89,8 @@ Client Connecting to == Verbinden met -Connection Problems... -== Verbindingsproblemen... +Connection Problems… +== Verbindingsproblemen… Console == Console @@ -625,8 +625,8 @@ DDNet %s is out! Downloading %s: == Downloaden %s: -Update failed! Check log... -== Update fout! Check log... +Update failed! Check log… +== Update fout! Check log… DDNet Client updated! == DDNet Client is geüpdate @@ -900,7 +900,7 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s is beschikbaar -Updating... +Updating… == Aan het updaten No updates available @@ -1396,7 +1396,7 @@ Videos directory Video was saved to '%s' == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. diff --git a/data/languages/esperanto.txt b/data/languages/esperanto.txt index 233e67e5227..da7f37334db 100644 --- a/data/languages/esperanto.txt +++ b/data/languages/esperanto.txt @@ -27,8 +27,8 @@ Game paused Warmup == Trejnado -Connection Problems... -== Konekta problemoj... +Connection Problems… +== Konekta problemoj… Please balance teams! == Bonvolu ekvilibrigi teamojn! @@ -456,8 +456,8 @@ DDNet %s is available: Update now == Ĝisdatigi nun -Updating... -== Ĝisdatiĝas... +Updating… +== Ĝisdatiĝas… Check now == Kontroli nun @@ -778,7 +778,7 @@ Show DDNet map finishes in server browser transmits your player name to info.ddnet.org == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. @@ -1762,7 +1762,7 @@ Can't find a Tutorial server Server executable not found, can't run server == -Update failed! Check log... +Update failed! Check log… == Loading race demo files diff --git a/data/languages/estonian.txt b/data/languages/estonian.txt index 47acd23c016..5c6b4a74ffa 100644 --- a/data/languages/estonian.txt +++ b/data/languages/estonian.txt @@ -79,8 +79,8 @@ Client Connecting to == Ühenduse loomine -Connection Problems... -== Ühenduse Probleemid... +Connection Problems… +== Ühenduse Probleemid… Console == Konsool @@ -955,8 +955,8 @@ DDNet %s is available: Update now == Uuenda nüüd -Updating... -== Uuendamine... +Updating… +== Uuendamine… DDNet Client updated! == DDNet Klient on uuendatud! @@ -1007,8 +1007,8 @@ DDNet %s is out! Downloading %s: == Allalaadimine %s: -Update failed! Check log... -== Uuendus ebaõnnestus! Vaata logi... +Update failed! Check log… +== Uuendus ebaõnnestus! Vaata logi… Restart == Taaskäivita @@ -1205,7 +1205,7 @@ Press a key… Main menu == Peamenüü -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP-ühenduvuse määramine UDP seems to be filtered. diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt index be02cf50943..1899fbf7361 100644 --- a/data/languages/finnish.txt +++ b/data/languages/finnish.txt @@ -79,8 +79,8 @@ Client Connecting to == Yhdistetään -Connection Problems... -== Yhteysongelmia... +Connection Problems… +== Yhteysongelmia… Console == Konsoli @@ -955,8 +955,8 @@ DDNet %s is available: Update now == Päivitä nyt -Updating... -== Päivitetään... +Updating… +== Päivitetään… DDNet Client updated! == DDNet-asiakas on päivitetty! @@ -1007,8 +1007,8 @@ DDNet %s is out! Downloading %s: == Päivitetään %s: -Update failed! Check log... -== Päivitys epäonnistui! Katso loki... +Update failed! Check log… +== Päivitys epäonnistui! Katso loki… Restart == Uudelleenaloitus @@ -1173,7 +1173,7 @@ Following == Seurataan Loading commands… -== Ladataan komentoja... +== Ladataan komentoja… Position: == Positio: @@ -1203,13 +1203,13 @@ Loading menu themes == Ladataan valikon teemoja Press a key… -== Paina näppäintä... +== Paina näppäintä… Main menu == Päävalikko -Trying to determine UDP connectivity... -== Yritetään selvittää UDP-yhteyden toimivuutta... +Trying to determine UDP connectivity… +== Yritetään selvittää UDP-yhteyden toimivuutta… UDP seems to be filtered. == UDP näyttää olevan suodatettu. @@ -1435,7 +1435,7 @@ Unable to delete the folder '%s'. Make sure it's empty first. == Ei voitu poistaa kansiota '%s'. Varmista että se on tyhjä ensin. Loading… -== Ladataan... +== Ladataan… Loading ghost files == Ladataan aave-tiedostoja diff --git a/data/languages/french.txt b/data/languages/french.txt index 371db2c50b9..b444c199c7b 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -100,8 +100,8 @@ Client Connecting to == Connexion à -Connection Problems... -== Problèmes de connexion... +Connection Problems… +== Problèmes de connexion… Console == Console @@ -681,8 +681,8 @@ Show entities Replay feature is disabled! == L'option de replay est désactivée -Updating... -== Mise à jour en cours... +Updating… +== Mise à jour en cours… Use high DPI == Utiliser un DPI élevé @@ -699,8 +699,8 @@ Are you sure that you want to disconnect? Deactivate == Désactiver -Update failed! Check log... -== La mise à jour a échoué ! Vérifier les logs... +Update failed! Check log… +== La mise à jour a échoué ! Vérifier les logs… %.2f KiB == %.2f Kio @@ -1234,8 +1234,8 @@ Speed: Angle: == Angle: -Trying to determine UDP connectivity... -== Tentative de connection UDP... +Trying to determine UDP connectivity… +== Tentative de connection UDP… UDP seems to be filtered. == UDP semble filtré. diff --git a/data/languages/galician.txt b/data/languages/galician.txt index 564f16584b6..b1391df980e 100644 --- a/data/languages/galician.txt +++ b/data/languages/galician.txt @@ -76,8 +76,8 @@ Client Connecting to == Conectando con -Connection Problems... -== Problemas de conexión... +Connection Problems… +== Problemas de conexión… Console == Consola @@ -613,8 +613,8 @@ DDNet %s is out! Downloading %s: == Descargando %s: -Update failed! Check log... -== Actualización errada! Comproba o rexistro... +Update failed! Check log… +== Actualización errada! Comproba o rexistro… DDNet Client updated! == Cliente DDNet actualizado! @@ -883,8 +883,8 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s está dispoñible: -Updating... -== Actualizando... +Updating… +== Actualizando… No updates available == Non hai actualizacións dispoñibles @@ -1202,8 +1202,8 @@ Speed: Angle: == Ángulo: -Trying to determine UDP connectivity... -== Tratando de determinar a conexión UDP... +Trying to determine UDP connectivity… +== Tratando de determinar a conexión UDP… UDP seems to be filtered. == UDP parece estar filtrado. diff --git a/data/languages/german.txt b/data/languages/german.txt index 7fd9eba5ac0..a234113bd0d 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -95,8 +95,8 @@ Colors of the hook collision line, in case of a possible collision with: Connecting to == Verbinden mit -Connection Problems... -== Verbindungsprobleme... +Connection Problems… +== Verbindungsprobleme… Console == Konsole @@ -650,8 +650,8 @@ System message DDNet %s is available: == DDNet %s verfügbar: -Updating... -== Aktualisieren... +Updating… +== Aktualisieren… Overlay entities == Overlay-Entitäten @@ -899,8 +899,8 @@ Zoom in Disconnect Dummy == Dummy trennen -Update failed! Check log... -== Update fehlgeschlagen! Siehe log... +Update failed! Check log… +== Update fehlgeschlagen! Siehe log… Markers == Markierungen @@ -1266,8 +1266,8 @@ Speed: Angle: == Winkel: -Trying to determine UDP connectivity... -== Versuche UDP-Verbindungsfähigkeit festzustellen... +Trying to determine UDP connectivity… +== Versuche UDP-Verbindungsfähigkeit festzustellen… UDP seems to be filtered. == UDP scheint gefiltert zu werden. diff --git a/data/languages/greek.txt b/data/languages/greek.txt index c0798ce6c8d..1ad00fedeab 100644 --- a/data/languages/greek.txt +++ b/data/languages/greek.txt @@ -76,8 +76,8 @@ Client Connecting to == Σύνδεση με -Connection Problems... -== Προβλήματα Σύνδεσης... +Connection Problems… +== Προβλήματα Σύνδεσης… Console == Κονσόλα @@ -804,7 +804,7 @@ Show DDNet map finishes in server browser transmits your player name to info.ddnet.org == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. @@ -1710,7 +1710,7 @@ DDNet %s is available: Update now == -Updating... +Updating… == DDNet Client updated! @@ -1780,7 +1780,7 @@ DDNet %s is out! Downloading %s: == -Update failed! Check log... +Update failed! Check log… == Loading race demo files diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index a2fd14b7a84..0e93b25ddc7 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -76,10 +76,10 @@ Client == Kliens Connecting to -== Csatlakozás... +== Csatlakozás… -Connection Problems... -== Csatlakozási problémák... +Connection Problems… +== Csatlakozási problémák… Console == Konzol @@ -112,7 +112,7 @@ Disconnected == Lekapcsolódott Downloading map -== Pálya letöltése... +== Pálya letöltése… Draw! == Döntetlen! @@ -639,8 +639,8 @@ Enable long pain sound (used when shooting in freeze) DDNet %s is available: == DDNet %s verzió elérhető -Updating... -== Frissítés... +Updating… +== Frissítés… Overlay entities == Entitás láthatósága @@ -712,7 +712,7 @@ Search == Keresés Connecting dummy -== Másolat válasza... +== Másolat válasza… Clan plates size == Klán felirat mérete @@ -876,8 +876,8 @@ Converse Use high DPI == Magas DPI használata -Update failed! Check log... -== Frissítés sikertelen! nézd meg a log-ot... +Update failed! Check log… +== Frissítés sikertelen! nézd meg a log-ot… Toggle dyncam == Dinamikus kamera @@ -1210,8 +1210,8 @@ Speed: Angle: == Szög: -Trying to determine UDP connectivity... -== Próbáljuk meghatározni az UDP kapcsoltatot... +Trying to determine UDP connectivity… +== Próbáljuk meghatározni az UDP kapcsoltatot… UDP seems to be filtered. == Az UDP szűrve van. diff --git a/data/languages/italian.txt b/data/languages/italian.txt index ec988ac60bb..758ef089dee 100644 --- a/data/languages/italian.txt +++ b/data/languages/italian.txt @@ -83,8 +83,8 @@ Client Connecting to == Connessione a -Connection Problems... -== Problemi di connessione... +Connection Problems… +== Problemi di connessione… Console == Console @@ -556,8 +556,8 @@ Length Downloading %s: == Scaricando %s: -Update failed! Check log... -== Aggiornamento non riuscito! Controlla registro... +Update failed! Check log… +== Aggiornamento non riuscito! Controlla registro… Filter connecting players == Filtra i giocatori in conness. @@ -979,8 +979,8 @@ DDNet %s is available: Update now == Aggiorna ora -Updating... -== Aggiornamento in corso... +Updating… +== Aggiornamento in corso… DDNet Client updated! == Client DDNet aggiornato! @@ -1111,10 +1111,10 @@ Sending initial client info == Inviando le informazioni del client Quitting. Please wait… -== Uscendo. Perfavore aspetta... +== Uscendo. Perfavore aspetta… Restarting. Please wait… -== Riavviando. Perfavore aspetta... +== Riavviando. Perfavore aspetta… Position: == Posizione: @@ -1134,8 +1134,8 @@ Team %d Uploading map data to GPU == Caricando dati mappa alla GPU -Trying to determine UDP connectivity... -== Provando a determinare l'UDP connectivity... +Trying to determine UDP connectivity… +== Provando a determinare l'UDP connectivity… UDP seems to be filtered. == UDP sembra essere filtrato. diff --git a/data/languages/japanese.txt b/data/languages/japanese.txt index 72536852d8b..8371af4437a 100644 --- a/data/languages/japanese.txt +++ b/data/languages/japanese.txt @@ -76,7 +76,7 @@ Client Connecting to == 接続先 -Connection Problems... +Connection Problems… == 接続中に問題が発生 Console @@ -981,7 +981,7 @@ DDNet %s is available: Update now == 今すぐ更新 -Updating... +Updating… == 更新中… DDNet Client updated! @@ -1045,7 +1045,7 @@ DDNet %s is out! Downloading %s: == %s をダウンロード中: -Update failed! Check log... +Update failed! Check log… == 更新に失敗しました!ログを確認してください。 Restart @@ -1300,7 +1300,7 @@ Join Tutorial Server Skip Tutorial == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. diff --git a/data/languages/korean.txt b/data/languages/korean.txt index bcbf7fc55ec..fa58fe3d0c6 100644 --- a/data/languages/korean.txt +++ b/data/languages/korean.txt @@ -88,8 +88,8 @@ Client Connecting to == 연결 중 -Connection Problems... -== 연결 문제 발생... +Connection Problems… +== 연결 문제 발생… Console == 콘솔 @@ -1011,8 +1011,8 @@ DDNet %s is available: Update now == 지금 업데이트하기 -Updating... -== 업데이트 중... +Updating… +== 업데이트 중… DDNet Client updated! == DDNet 클라이언트가 업데이트되었습니다! @@ -1075,8 +1075,8 @@ DDNet %s is out! Downloading %s: == %s 다운로드 중: -Update failed! Check log... -== 업데이트 실패! 로그를 확인해 주십시오... +Update failed! Check log… +== 업데이트 실패! 로그를 확인해 주십시오… Restart == 재시작 @@ -1222,8 +1222,8 @@ Speed: Angle: == 각도 -Trying to determine UDP connectivity... -== UDP 연결 확인 시도 중... +Trying to determine UDP connectivity… +== UDP 연결 확인 시도 중… UDP seems to be filtered. == UDP가 필터링된 것으로 보입니다. diff --git a/data/languages/kyrgyz.txt b/data/languages/kyrgyz.txt index 70ca725c433..56e138982cf 100644 --- a/data/languages/kyrgyz.txt +++ b/data/languages/kyrgyz.txt @@ -72,8 +72,8 @@ Client Connecting to == Туташтырылууда -Connection Problems... -== Байланыш көйгөйлөрү... +Connection Problems… +== Байланыш көйгөйлөрү… Console == Консоль @@ -795,7 +795,7 @@ Show DDNet map finishes in server browser transmits your player name to info.ddnet.org == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. @@ -1701,7 +1701,7 @@ DDNet %s is available: Update now == -Updating... +Updating… == DDNet Client updated! @@ -1771,7 +1771,7 @@ DDNet %s is out! Downloading %s: == -Update failed! Check log... +Update failed! Check log… == Loading race demo files diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index 82b9cdd014d..fc52daca531 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -78,8 +78,8 @@ Client Connecting to == Kobler til -Connection Problems... -== Tilkoblingsproblemer... +Connection Problems… +== Tilkoblingsproblemer… Console == Konsoll @@ -614,8 +614,8 @@ DDNet %s is out! Downloading %s: == Laster ned %s: -Update failed! Check log... -== Oppdatering mislyktes! Sjekk logg... +Update failed! Check log… +== Oppdatering mislyktes! Sjekk logg… DDNet Client updated! == DDNet-klient oppdatert! @@ -890,8 +890,8 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s er tilgjengelig: -Updating... -== Oppdaterer... +Updating… +== Oppdaterer… No updates available == Ingen oppdateringer tilgjengelig @@ -1269,7 +1269,7 @@ Join Tutorial Server Skip Tutorial == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. diff --git a/data/languages/persian.txt b/data/languages/persian.txt index 03c3512f3bf..1525f38a80d 100644 --- a/data/languages/persian.txt +++ b/data/languages/persian.txt @@ -76,8 +76,8 @@ Client Connecting to == ﻪﺑ ﻥﺪﺷ ﻞﺻﻭ -Connection Problems... -== ...ﺪﺷ ﻪﺟﺍﻮﻣ ﻞﻜﺸﻣ ﺎﺑ ﻁﺎﺒﺗﺭﺍ +Connection Problems… +== …ﺪﺷ ﻪﺟﺍﻮﻣ ﻞﻜﺸﻣ ﺎﺑ ﻁﺎﺒﺗﺭﺍ Console == ﻝﻮﺴﻨﻛ @@ -738,7 +738,7 @@ Background Update now == ﻦﮐ ﯽﻧﺎﺳﺭﺯﻭﺮﺑ ﻥﻻﺍ ﻦﯿﻤﻫ -Updating... +Updating… == ﯽﻧﺎﺳﺭﺯﻭﺮﺑ ﻝﺎﺣﺭﺩ No updates available @@ -775,8 +775,8 @@ Play Downloading %s: == %s :ﺩﻮﻠﻧﺍﺩ ﻝﺎﺣﺭﺩ -Update failed! Check log... -== ... ﺪﯿﻨﮐ ﮏﭼ ﺍﺭ گﻻ!ﻖﻓﻮﻣﺎﻧ ﯽﻧﺎﺳﺭﺯﻭﺮﺑ +Update failed! Check log… +== … ﺪﯿﻨﮐ ﮏﭼ ﺍﺭ گﻻ!ﻖﻓﻮﻣﺎﻧ ﯽﻧﺎﺳﺭﺯﻭﺮﺑ Restart == ﺩﺪﺠﻣ ﯼﺯﺍﺪﻧﺍ ﻩﺍﺭ @@ -869,8 +869,8 @@ Uploading map data to GPU The audio device couldn't be initialised. == .ﺩﻮﺷ ﯼﺯﺍﺪﻧﺍ ﻩﺍﺭ ﺪﻧﺍﻮﺗ ﯽﻤﻧ ﯽﺗﻮﺻ ﻩﺎﮕﺘﺳﺩ -Trying to determine UDP connectivity... -== UDP... ﻝﺎﺼﺗﺍ ﻦﯿﯿﻌﺗ ﯼﺍﺮﺑ ﺵﻼﺗ +Trying to determine UDP connectivity… +== UDP… ﻝﺎﺼﺗﺍ ﻦﯿﯿﻌﺗ ﯼﺍﺮﺑ ﺵﻼﺗ UDP seems to be filtered. == .ﺖﺳﺍ ﻩﺪﺷ ﺮﺘﻠﯿﻓ UDP ﺪﺳﺭ ﯽﻣ ﺮﻈﻧ ﻪﺑ diff --git a/data/languages/polish.txt b/data/languages/polish.txt index d1aaceb55a9..1e8b0bf01db 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -81,8 +81,8 @@ Client Connecting to == Łączenie z -Connection Problems... -== Problemy z połączeniem... +Connection Problems… +== Problemy z połączeniem… Console == Konsola @@ -653,8 +653,8 @@ DDNet %s is available: Update now == Aktualizuj -Updating... -== Aktualizuje... +Updating… +== Aktualizuje… DDNet Client updated! == DDNet Client został zaktualizowany! @@ -755,8 +755,8 @@ Loading DDNet Client HUD == HUD -Update failed! Check log... -== Niepowodzenie aktualizacji! Sprawdź logi... +Update failed! Check log… +== Niepowodzenie aktualizacji! Sprawdź logi… Friend message == Wiadomość od znajomego @@ -1389,8 +1389,8 @@ Videos directory Video was saved to '%s' == Film został zapisany do '%s' -Trying to determine UDP connectivity... -== Próba określenia łączności UDP... +Trying to determine UDP connectivity… +== Próba określenia łączności UDP… UDP seems to be filtered. == Protokół UDP wydaje się być filtrowany. diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt index dadd7c70c56..9f7e46d66d9 100644 --- a/data/languages/portuguese.txt +++ b/data/languages/portuguese.txt @@ -80,7 +80,7 @@ Client Connecting to == A ligar ao endereço -Connection Problems... +Connection Problems… == Problemas na ligação! Console @@ -120,7 +120,7 @@ Disconnected == Desconectado Downloading map -== A sacar o mapa... +== A sacar o mapa… Draw! == Empate! @@ -632,8 +632,8 @@ System message DDNet %s is available: == DDNet %s está disponível: -Updating... -== A atualizar... +Updating… +== A atualizar… Messages == Mensagens @@ -1088,7 +1088,7 @@ Skip Tutorial Show DDNet map finishes in server browser == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. @@ -1794,7 +1794,7 @@ DDNet %s is out! Downloading %s: == -Update failed! Check log... +Update failed! Check log… == Loading race demo files diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt index c9fd93397a1..a77e356d1b7 100644 --- a/data/languages/romanian.txt +++ b/data/languages/romanian.txt @@ -82,8 +82,8 @@ Client Connecting to == Conectare la -Connection Problems... -== Probleme la conexiune... +Connection Problems… +== Probleme la conexiune… Console == Consolă @@ -810,7 +810,7 @@ Show DDNet map finishes in server browser transmits your player name to info.ddnet.org == -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == UDP seems to be filtered. @@ -1716,7 +1716,7 @@ DDNet %s is available: Update now == -Updating... +Updating… == DDNet Client updated! @@ -1786,7 +1786,7 @@ DDNet %s is out! Downloading %s: == -Update failed! Check log... +Update failed! Check log… == Loading race demo files diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 90f1c5665d4..ae3df54f4cb 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -92,8 +92,8 @@ Client Connecting to == Подключение к -Connection Problems... -== Проблемы со связью... +Connection Problems… +== Проблемы со связью… Console == Консоль @@ -626,8 +626,8 @@ Remove chat System message == Системное с. -Updating... -== Обновление... +Updating… +== Обновление… Messages == Сообщения @@ -731,8 +731,8 @@ DDNet %s is out! Downloading %s: == Скачивание %s: -Update failed! Check log... -== Ошибка. Проверьте логи... +Update failed! Check log… +== Ошибка. Проверьте логи… Restart == Рестарт @@ -1200,8 +1200,8 @@ Speed: Angle: == Угол -Trying to determine UDP connectivity... -== Попытка определить UDP соединение... +Trying to determine UDP connectivity… +== Попытка определить UDP соединение… UDP seems to be filtered. == Похоже, что UDP фильтруется. diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt index 0928b7bd0f2..3e82a6a96e3 100644 --- a/data/languages/serbian.txt +++ b/data/languages/serbian.txt @@ -80,7 +80,7 @@ Client Connecting to == Povezujem se na -Connection Problems... +Connection Problems… == Problemi sa internetom Console @@ -925,8 +925,8 @@ DDNet %s is available: Update now == Unapredi sada -Updating... -== Unapređujem... +Updating… +== Unapređujem… DDNet Client updated! == DDNet klijent je unapređen! @@ -980,8 +980,8 @@ DDNet %s is out! Downloading %s: == Preuzimanje %s: -Update failed! Check log... -== Ažuriranje nije uspelo! Sačekajte log... +Update failed! Check log… +== Ažuriranje nije uspelo! Sačekajte log… Restart == Ponovo pokreni @@ -1082,7 +1082,7 @@ Angle: Uploading map data to GPU == Slanje podataka mape G.J.O.~u (GPU) -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == Pokušavam da odredim K.D.P.(UDP) povezanost UDP seems to be filtered. @@ -1420,10 +1420,10 @@ Initializing components == Иницијализација компоненти Quitting. Please wait… -== Излазим. Молим вас да почекате... +== Излазим. Молим вас да почекате… Restarting. Please wait… -== Поновно покрећем се. Молим вас да почекате... +== Поновно покрећем се. Молим вас да почекате… Multi-View == Мулти-поглед diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt index a57e747ce3e..38b99e172ef 100644 --- a/data/languages/serbian_cyrillic.txt +++ b/data/languages/serbian_cyrillic.txt @@ -76,7 +76,7 @@ Client Connecting to == Повезујем се на -Connection Problems... +Connection Problems… == Проблеми са интернетом Console @@ -924,8 +924,8 @@ DDNet %s is available: Update now == Унапреди сада -Updating... -== Унапређујем... +Updating… +== Унапређујем… DDNet Client updated! == DDNet клијент је унапређен! @@ -979,8 +979,8 @@ DDNet %s is out! Downloading %s: == Преузимање %s: -Update failed! Check log... -== Ажурирање није успело! Сачекајте log... +Update failed! Check log… +== Ажурирање није успело! Сачекајте log… Restart == Поново покрени @@ -1081,7 +1081,7 @@ Angle: Uploading map data to GPU == Слање података мапе Г.Ј.О.~у (GPU) -Trying to determine UDP connectivity... +Trying to determine UDP connectivity… == Покушавам да одредим К.Д.П.(UDP) повезаност UDP seems to be filtered. diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index 5b58376d127..90b6b537e70 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -112,8 +112,8 @@ Client Connecting to == 正在连接到 -Connection Problems... -== 连接中断... +Connection Problems… +== 连接中断… Console == 控制台 @@ -688,8 +688,8 @@ DDNet %s is available: Update now == 现在更新 -Updating... -== 更新中... +Updating… +== 更新中… DDNet Client updated! == DDNet 客户端更新成功! @@ -701,7 +701,7 @@ Check now == 检查更新 Loading DDNet Client -== 加载 DDNet 客户端中... +== 加载 DDNet 客户端中… Browser == 浏览 @@ -883,8 +883,8 @@ Zoom in 1 new mention == 1 条新被提及消息 -Update failed! Check log... -== 更新失败!请检查日志... +Update failed! Check log… +== 更新失败!请检查日志… Pause == 暂停 @@ -1250,8 +1250,8 @@ Speed: Angle: == 角度 -Trying to determine UDP connectivity... -== 正在尝试检测 UDP 连接... +Trying to determine UDP connectivity… +== 正在尝试检测 UDP 连接… UDP seems to be filtered. == UDP 疑似被过滤 @@ -1797,7 +1797,7 @@ Following == 当前 Press a key… -== 按任意键... +== 按任意键… Are you sure that you want to restart? == 确定要重新开始? @@ -1842,7 +1842,7 @@ Error saving settings == 保存设置错误 Loading commands… -== 正在加载指令... +== 正在加载指令… Main menu == 主菜单 @@ -1854,7 +1854,7 @@ Friends == 好友 Loading… -== 正在加载... +== 正在加载… Loading demo file from storage == 正在从硬盘中加载回放文件 diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt index 88072f67ff4..479dcd95255 100644 --- a/data/languages/slovak.txt +++ b/data/languages/slovak.txt @@ -77,8 +77,8 @@ Client Connecting to == Pripojujem sa k -Connection Problems... -== Problémy s pripojením... +Connection Problems… +== Problémy s pripojením… Console == Konzola @@ -611,10 +611,10 @@ Warning == Varovanie Quitting. Please wait… -== Ukončovanie. Prosím, čakajte... +== Ukončovanie. Prosím, čakajte… Restarting. Please wait… -== Reštartovanie. Prosím, čakajte... +== Reštartovanie. Prosím, čakajte… Loading skin files == Načítanie skin súborov @@ -709,8 +709,8 @@ Settings Editor == Editor -Trying to determine UDP connectivity... -== Pokus o zistenie pripojenia UDP... +Trying to determine UDP connectivity… +== Pokus o zistenie pripojenia UDP… UDP seems to be filtered. == Zdá sa, že UDP je filtrovaný. @@ -1681,8 +1681,8 @@ DDNet %s is available: Update now == Aktualizovať teraz -Updating... -== Aktualizácia... +Updating… +== Aktualizácia… DDNet Client updated! == DDNet Klient aktualizovaný! @@ -1751,8 +1751,8 @@ DDNet %s is out! Downloading %s: == Sťahovanie %s: -Update failed! Check log... -== Aktualizácia zlyhala! Skontrolujte log... +Update failed! Check log… +== Aktualizácia zlyhala! Skontrolujte log… Loading race demo files == Načítanie záznamov závodov diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index 347feee2fca..fb2b1ca3d24 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -95,8 +95,8 @@ Client Connecting to == Conectando con -Connection Problems... -== Problemas de conexión... +Connection Problems… +== Problemas de conexión… Console == Consola @@ -634,8 +634,8 @@ DDNet %s is out! Downloading %s: == Descargando %s: -Update failed! Check log... -== ¡Actualización fallida! Comprueba el registro... +Update failed! Check log… +== ¡Actualización fallida! Comprueba el registro… DDNet Client updated! == ¡Cliente DDNet actualizado! @@ -907,8 +907,8 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s está disponible: -Updating... -== Actualizando... +Updating… +== Actualizando… No updates available == No hay actualizaciones disponibles @@ -1226,8 +1226,8 @@ Speed: Angle: == Ángulo: -Trying to determine UDP connectivity... -== Tratando de determinar la conexión UDP... +Trying to determine UDP connectivity… +== Tratando de determinar la conexión UDP… UDP seems to be filtered. == UDP parece estar filtrado. diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index c0008295381..0261ddebb82 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -81,8 +81,8 @@ Client Connecting to == Ansluter till -Connection Problems... -== Anslutningsproblem... +Connection Problems… +== Anslutningsproblem… Console == Konsol @@ -687,8 +687,8 @@ Max CSVs Zoom in == Zooma in -Update failed! Check log... -== Updatering misslyckades! Kolla logg... +Update failed! Check log… +== Updatering misslyckades! Kolla logg… %d new mentions == %d nya nämningar @@ -846,8 +846,8 @@ AntiPing: predict grenade paths Best == Bäst -Updating... -== Uppdaterar... +Updating… +== Uppdaterar… Clan plates size == Klanskylt storlek @@ -1240,8 +1240,8 @@ Team %d Uploading map data to GPU == Laddar upp bana data till grafikkortet -Trying to determine UDP connectivity... -== Försöker att bestämma UDP anslutning... +Trying to determine UDP connectivity… +== Försöker att bestämma UDP anslutning… UDP seems to be filtered. == UDP verkar vara filtrerad. diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index f29c5c99149..b596de128e8 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -101,8 +101,8 @@ Client Connecting to == 正在連線到 -Connection Problems... -== 連線中斷... +Connection Problems… +== 連線中斷… Console == 控制檯 @@ -677,8 +677,8 @@ DDNet %s is available: Update now == 現在更新 -Updating... -== 更新中... +Updating… +== 更新中… DDNet Client updated! == DDNet 客戶端更新成功! @@ -872,8 +872,8 @@ Zoom in 1 new mention == 1 條新提及 -Update failed! Check log... -== 更新失敗!請檢查日誌... +Update failed! Check log… +== 更新失敗!請檢查日誌… Pause == 暫停 @@ -1239,8 +1239,8 @@ Speed: Angle: == 角度 -Trying to determine UDP connectivity... -== 正在嘗試檢測 UDP 連接... +Trying to determine UDP connectivity… +== 正在嘗試檢測 UDP 連接… UDP seems to be filtered. == UDP 疑似被過濾 @@ -1786,7 +1786,7 @@ Following == 當前 Press a key… -== 按任意鍵... +== 按任意鍵… Are you sure that you want to restart? == 確定要重新開始? @@ -1831,7 +1831,7 @@ Error saving settings == 儲存設定錯誤 Loading commands… -== 正在載入指令... +== 正在載入指令… Main menu == 主選單 @@ -1843,7 +1843,7 @@ Friends == 好友 Loading… -== 正在載入... +== 正在載入… Loading demo file from storage == 正在從硬盤中載入回放檔案 diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index 0313a942882..804acab1dfa 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -87,8 +87,8 @@ Client Connecting to == Bağlanılıyor -Connection Problems... -== Bağlantı Hataları... +Connection Problems… +== Bağlantı Hataları… Console == Konsol @@ -624,7 +624,7 @@ DDNet %s is out! Downloading %s: == İndiriliyor %s: -Update failed! Check log... +Update failed! Check log… == Güncelleme sırasında hata oluştu! DDNet Client updated! @@ -903,8 +903,8 @@ Show tiles layers from BG map DDNet %s is available: == DDNet %s yayınlandı: -Updating... -== Güncelleniyor... +Updating… +== Güncelleniyor… No updates available == Güncelleme mevcut değil @@ -1045,10 +1045,10 @@ Warning == Uyarı Quitting. Please wait… -== Çıkılıyor. Lütfen bekleyin... +== Çıkılıyor. Lütfen bekleyin… Restarting. Please wait… -== Yeniden başlatılıyor. Lütfen bekleyin... +== Yeniden başlatılıyor. Lütfen bekleyin… Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. == Hata ayıklama modu etkinleştirildi. Devre dışı bırakmak için Ctrl+Shift+D tuşlarına basın. @@ -1071,8 +1071,8 @@ Team %d Uploading map data to GPU == Harita verisi GPU'ya yükleniyor -Trying to determine UDP connectivity... -== UDP bağlantısı belirlenmeye çalışılıyor... +Trying to determine UDP connectivity… +== UDP bağlantısı belirlenmeye çalışılıyor… UDP seems to be filtered. == UDP filtrelenmiş görünüyor. diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index d3b35dda64e..96ee374a577 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -40,8 +40,8 @@ Chat Connecting to == Підключення до -Connection Problems... -== Проблеми зі з'єднанням... +Connection Problems… +== Проблеми зі з'єднанням… Console == Консоль @@ -549,8 +549,8 @@ DDNet %s is out! Downloading %s: == Завантаження %s: -Update failed! Check log... -== Помилка оновлення! Перевірте логи... +Update failed! Check log… +== Помилка оновлення! Перевірте логи… DDNet Client updated! == Клієнт DDNet оновлено! @@ -885,8 +885,8 @@ Show tiles layers from BG map DDNet %s is available: == Доступний новий DDNet %s: -Updating... -== Оновлення... +Updating… +== Оновлення… No updates available == Немає доступних оновлень @@ -1213,8 +1213,8 @@ Team %d Uploading map data to GPU == Завантаження даних карти на GPU -Trying to determine UDP connectivity... -== Намагаємося визначити UDP-підключення... +Trying to determine UDP connectivity… +== Намагаємося визначити UDP-підключення… UDP seems to be filtered. == Зачекайте, фільтрація UDP @@ -1223,7 +1223,7 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo == Здається, що IP-адреси UDP і TCP відрізняються. Спробуйте вимкнути VPN, проксі або мережеві прискорювачі. No answer from server yet. -== Сервер ще не відповів... +== Сервер ще не відповів… Getting game info == Отримання ігрової інформації @@ -1583,10 +1583,10 @@ Loading sound files == Завантаження звукових файлів Quitting. Please wait… -== Припинення гри. Зачекайте будь ласка... +== Припинення гри. Зачекайте будь ласка… Restarting. Please wait… -== Перезавантаження. Зачекайте будь ласка... +== Перезавантаження. Зачекайте будь ласка… Multi-View == Дінамічний перегляд diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index e68dc9df454..433c3731fdc 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -541,7 +541,7 @@ void CHud::RenderConnectionWarning() { if(Client()->ConnectionProblems()) { - const char *pText = Localize("Connection Problems..."); + const char *pText = Localize("Connection Problems…"); float w = TextRender()->TextWidth(24, pText, -1, -1.0f); TextRender()->Text(150 * Graphics()->ScreenAspect() - w / 2, 50, 24, pText, -1.0f); } diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 4c2156410d3..42ffa472596 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -1776,7 +1776,7 @@ void CMenus::RenderPopupConnecting(CUIRect Screen) case IClient::CONNECTIVITY_UNKNOWN: break; case IClient::CONNECTIVITY_CHECKING: - pConnectivityLabel = Localize("Trying to determine UDP connectivity..."); + pConnectivityLabel = Localize("Trying to determine UDP connectivity…"); break; case IClient::CONNECTIVITY_UNREACHABLE: pConnectivityLabel = Localize("UDP seems to be filtered."); diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index aaf825f7c3f..5c8f53ff102 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -3418,7 +3418,7 @@ void CMenus::RenderSettingsDDNet(CUIRect MainView) } } else if(State >= IUpdater::GETTING_MANIFEST && State < IUpdater::NEED_RESTART) - str_format(aBuf, sizeof(aBuf), Localize("Updating...")); + str_format(aBuf, sizeof(aBuf), Localize("Updating…")); else if(State == IUpdater::NEED_RESTART) { str_format(aBuf, sizeof(aBuf), Localize("DDNet Client updated!")); diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index 258a98c92bb..4b3421d1d58 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -225,7 +225,7 @@ void CMenus::RenderStartMenu(CUIRect MainView) } else if(State == IUpdater::FAIL) { - str_format(aBuf, sizeof(aBuf), Localize("Update failed! Check log...")); + str_format(aBuf, sizeof(aBuf), Localize("Update failed! Check log…")); TextRender()->TextColor(1.0f, 0.4f, 0.4f, 1.0f); } else if(State == IUpdater::NEED_RESTART) From 05d97cafb2ee8050d53943d2003cbef314c0d52c Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Mon, 4 Dec 2023 15:00:32 +0100 Subject: [PATCH 016/179] Stop demo when gameworld is reset Currently the per tee demos are only stopped when a character dies. But the Reset() method in the gameworld destroys characters without killing them. This allows to do world resets without calling gamecontext shutdown while sv_player_demo_record is active. Which is nice for round based game modes. ```C++ void CGameWorld::Reset() { // reset all entities for(auto *pEnt : m_apFirstEntityTypes) for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Reset(); pEnt = m_pNextTraverseEntity; } RemoveEntities(); GameServer()->m_pController->OnReset(); RemoveEntities(); m_ResetRequested = false; GameServer()->CreateAllEntities(false); } ``` --- src/game/server/entities/character.cpp | 7 ++++++- src/game/server/entities/character.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 7f8b5e0295d..4d72e66389d 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -48,6 +48,7 @@ CCharacter::CCharacter(CGameWorld *pWorld, CNetObj_PlayerInput LastInput) : void CCharacter::Reset() { + StopRecording(); Destroy(); } @@ -932,7 +933,7 @@ bool CCharacter::IncreaseArmor(int Amount) return true; } -void CCharacter::Die(int Killer, int Weapon, bool SendKillMsg) +void CCharacter::StopRecording() { if(Server()->IsRecording(m_pPlayer->GetCid())) { @@ -945,7 +946,11 @@ void CCharacter::Die(int Killer, int Weapon, bool SendKillMsg) pData->m_RecordStopTick = -1; } +} +void CCharacter::Die(int Killer, int Weapon, bool SendKillMsg) +{ + StopRecording(); int ModeSpecial = GameServer()->m_pController->OnCharacterDeath(this, GameServer()->m_apPlayers[Killer], Weapon); char aBuf[256]; diff --git a/src/game/server/entities/character.h b/src/game/server/entities/character.h index e9ff63dad91..a2263d3dc8d 100644 --- a/src/game/server/entities/character.h +++ b/src/game/server/entities/character.h @@ -194,6 +194,7 @@ class CCharacter : public CEntity int Team(); bool CanCollide(int ClientId); bool SameTeam(int ClientId); + void StopRecording(); bool m_NinjaJetpack; int m_TeamBeforeSuper; int m_FreezeTime; From a7229e989224261ba4b8dcb1fe39aa7e9139b122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 21:39:19 +0200 Subject: [PATCH 017/179] Use array of size `NUM_DUMMIES` instead of two variables Reduce duplicate code and improve clarity. Remove unnecessary casts to `void *`. --- src/game/client/components/controls.cpp | 82 +++++++++++-------------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index ab7e6ae1a71..136e7496ab2 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -2,6 +2,7 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include +#include #include #include @@ -65,8 +66,7 @@ void CControls::OnPlayerDeath() struct CInputState { CControls *m_pControls; - int *m_pVariable1; - int *m_pVariable2; + int *m_apVariables[NUM_DUMMIES]; }; static void ConKeyInputState(IConsole::IResult *pResult, void *pUserData) @@ -76,10 +76,7 @@ static void ConKeyInputState(IConsole::IResult *pResult, void *pUserData) if(pState->m_pControls->GameClient()->m_GameInfo.m_BugDDRaceInput && pState->m_pControls->GameClient()->m_Snap.m_SpecInfo.m_Active) return; - if(g_Config.m_ClDummy) - *pState->m_pVariable2 = pResult->GetInteger(0); - else - *pState->m_pVariable1 = pResult->GetInteger(0); + *pState->m_apVariables[g_Config.m_ClDummy] = pResult->GetInteger(0); } static void ConKeyInputCounter(IConsole::IResult *pResult, void *pUserData) @@ -89,22 +86,16 @@ static void ConKeyInputCounter(IConsole::IResult *pResult, void *pUserData) if(pState->m_pControls->GameClient()->m_GameInfo.m_BugDDRaceInput && pState->m_pControls->GameClient()->m_Snap.m_SpecInfo.m_Active) return; - int *v; - if(g_Config.m_ClDummy) - v = pState->m_pVariable2; - else - v = pState->m_pVariable1; - - if(((*v) & 1) != pResult->GetInteger(0)) - (*v)++; - *v &= INPUT_STATE_MASK; + int *pVariable = pState->m_apVariables[g_Config.m_ClDummy]; + if(((*pVariable) & 1) != pResult->GetInteger(0)) + (*pVariable)++; + *pVariable &= INPUT_STATE_MASK; } struct CInputSet { CControls *m_pControls; - int *m_pVariable1; - int *m_pVariable2; + int *m_apVariables[NUM_DUMMIES]; int m_Value; }; @@ -113,10 +104,7 @@ static void ConKeyInputSet(IConsole::IResult *pResult, void *pUserData) CInputSet *pSet = (CInputSet *)pUserData; if(pResult->GetInteger(0)) { - if(g_Config.m_ClDummy) - *pSet->m_pVariable2 = pSet->m_Value; - else - *pSet->m_pVariable1 = pSet->m_Value; + *pSet->m_apVariables[g_Config.m_ClDummy] = pSet->m_Value; } } @@ -131,58 +119,58 @@ void CControls::OnConsoleInit() { // game commands { - static CInputState s_State = {this, &m_aInputDirectionLeft[0], &m_aInputDirectionLeft[1]}; - Console()->Register("+left", "", CFGFLAG_CLIENT, ConKeyInputState, (void *)&s_State, "Move left"); + static CInputState s_State = {this, {&m_aInputDirectionLeft[0], &m_aInputDirectionLeft[1]}}; + Console()->Register("+left", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Move left"); } { - static CInputState s_State = {this, &m_aInputDirectionRight[0], &m_aInputDirectionRight[1]}; - Console()->Register("+right", "", CFGFLAG_CLIENT, ConKeyInputState, (void *)&s_State, "Move right"); + static CInputState s_State = {this, {&m_aInputDirectionRight[0], &m_aInputDirectionRight[1]}}; + Console()->Register("+right", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Move right"); } { - static CInputState s_State = {this, &m_aInputData[0].m_Jump, &m_aInputData[1].m_Jump}; - Console()->Register("+jump", "", CFGFLAG_CLIENT, ConKeyInputState, (void *)&s_State, "Jump"); + static CInputState s_State = {this, {&m_aInputData[0].m_Jump, &m_aInputData[1].m_Jump}}; + Console()->Register("+jump", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Jump"); } { - static CInputState s_State = {this, &m_aInputData[0].m_Hook, &m_aInputData[1].m_Hook}; - Console()->Register("+hook", "", CFGFLAG_CLIENT, ConKeyInputState, (void *)&s_State, "Hook"); + static CInputState s_State = {this, {&m_aInputData[0].m_Hook, &m_aInputData[1].m_Hook}}; + Console()->Register("+hook", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Hook"); } { - static CInputState s_State = {this, &m_aInputData[0].m_Fire, &m_aInputData[1].m_Fire}; - Console()->Register("+fire", "", CFGFLAG_CLIENT, ConKeyInputCounter, (void *)&s_State, "Fire"); + static CInputState s_State = {this, {&m_aInputData[0].m_Fire, &m_aInputData[1].m_Fire}}; + Console()->Register("+fire", "", CFGFLAG_CLIENT, ConKeyInputCounter, &s_State, "Fire"); } { - static CInputState s_State = {this, &m_aShowHookColl[0], &m_aShowHookColl[1]}; - Console()->Register("+showhookcoll", "", CFGFLAG_CLIENT, ConKeyInputState, (void *)&s_State, "Show Hook Collision"); + static CInputState s_State = {this, {&m_aShowHookColl[0], &m_aShowHookColl[1]}}; + Console()->Register("+showhookcoll", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Show Hook Collision"); } { - static CInputSet s_Set = {this, &m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon, 1}; - Console()->Register("+weapon1", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to hammer"); + static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 1}; + Console()->Register("+weapon1", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to hammer"); } { - static CInputSet s_Set = {this, &m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon, 2}; - Console()->Register("+weapon2", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to gun"); + static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 2}; + Console()->Register("+weapon2", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to gun"); } { - static CInputSet s_Set = {this, &m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon, 3}; - Console()->Register("+weapon3", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to shotgun"); + static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 3}; + Console()->Register("+weapon3", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to shotgun"); } { - static CInputSet s_Set = {this, &m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon, 4}; - Console()->Register("+weapon4", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to grenade"); + static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 4}; + Console()->Register("+weapon4", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to grenade"); } { - static CInputSet s_Set = {this, &m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon, 5}; - Console()->Register("+weapon5", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to laser"); + static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 5}; + Console()->Register("+weapon5", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to laser"); } { - static CInputSet s_Set = {this, &m_aInputData[0].m_NextWeapon, &m_aInputData[1].m_NextWeapon, 0}; - Console()->Register("+nextweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to next weapon"); + static CInputSet s_Set = {this, {&m_aInputData[0].m_NextWeapon, &m_aInputData[1].m_NextWeapon}, 0}; + Console()->Register("+nextweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, &s_Set, "Switch to next weapon"); } { - static CInputSet s_Set = {this, &m_aInputData[0].m_PrevWeapon, &m_aInputData[1].m_PrevWeapon, 0}; - Console()->Register("+prevweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to previous weapon"); + static CInputSet s_Set = {this, {&m_aInputData[0].m_PrevWeapon, &m_aInputData[1].m_PrevWeapon}, 0}; + Console()->Register("+prevweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, &s_Set, "Switch to previous weapon"); } } From b7579b0f0f1940a88b4bc3b1df32f482b92a3f72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 21:50:41 +0200 Subject: [PATCH 018/179] Ensure last input send time is reset when disconnecting Reset send time when disconnecting so input sending should always behave consistently like on the first connection. --- src/game/client/components/controls.cpp | 9 +++++---- src/game/client/components/controls.h | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 136e7496ab2..2bfb8b06ea6 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -35,6 +35,8 @@ void CControls::OnReset() for(int &AmmoCount : m_aAmmoCount) AmmoCount = 0; m_OldMouseX = m_OldMouseY = 0.0f; + + m_LastSendTime = 0; } void CControls::ResetInput(int Dummy) @@ -188,7 +190,6 @@ void CControls::OnMessage(int Msg, void *pRawMsg) int CControls::SnapInput(int *pData) { - static int64_t LastSendTime = 0; bool Send = false; // update player state @@ -224,7 +225,7 @@ int CControls::SnapInput(int *pData) m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)m_aMousePos[g_Config.m_ClDummy].y; // send once a second just to be sure - if(time_get() > LastSendTime + time_freq()) + if(time_get() > m_LastSendTime + time_freq()) Send = true; } else @@ -328,7 +329,7 @@ int CControls::SnapInput(int *pData) Send = true; // send at at least 10hz - if(time_get() > LastSendTime + time_freq() / 25) + if(time_get() > m_LastSendTime + time_freq() / 25) Send = true; if(m_pClient->m_Snap.m_pLocalCharacter && m_pClient->m_Snap.m_pLocalCharacter->m_Weapon == WEAPON_NINJA && (m_aInputData[g_Config.m_ClDummy].m_Direction || m_aInputData[g_Config.m_ClDummy].m_Jump || m_aInputData[g_Config.m_ClDummy].m_Hook)) @@ -341,7 +342,7 @@ int CControls::SnapInput(int *pData) if(!Send) return 0; - LastSendTime = time_get(); + m_LastSendTime = time_get(); mem_copy(pData, &m_aInputData[g_Config.m_ClDummy], sizeof(m_aInputData[0])); return sizeof(m_aInputData[0]); } diff --git a/src/game/client/components/controls.h b/src/game/client/components/controls.h index 67323a12a3e..f8ce75d713e 100644 --- a/src/game/client/components/controls.h +++ b/src/game/client/components/controls.h @@ -23,6 +23,7 @@ class CControls : public CComponent int m_aAmmoCount[NUM_WEAPONS]; + int64_t m_LastSendTime; CNetObj_PlayerInput m_aInputData[NUM_DUMMIES]; CNetObj_PlayerInput m_aLastData[NUM_DUMMIES]; int m_aInputDirectionLeft[NUM_DUMMIES]; From 178a0dabfa17a9a6b4eca119e9cc6f104b60a1c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 21:53:15 +0200 Subject: [PATCH 019/179] Remove dead code and unused variables --- src/game/client/components/controls.cpp | 10 ---------- src/game/client/components/controls.h | 5 ----- 2 files changed, 15 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 2bfb8b06ea6..027a6726218 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -19,9 +19,6 @@ CControls::CControls() { mem_zero(&m_aLastData, sizeof(m_aLastData)); - m_LastDummy = 0; - m_OtherFire = 0; - mem_zero(m_aMousePos, sizeof(m_aMousePos)); mem_zero(m_aMousePosOnAction, sizeof(m_aMousePosOnAction)); mem_zero(m_aTargetPos, sizeof(m_aTargetPos)); @@ -34,7 +31,6 @@ void CControls::OnReset() for(int &AmmoCount : m_aAmmoCount) AmmoCount = 0; - m_OldMouseX = m_OldMouseY = 0.0f; m_LastSendTime = 0; } @@ -42,7 +38,6 @@ void CControls::OnReset() void CControls::ResetInput(int Dummy) { m_aLastData[Dummy].m_Direction = 0; - //m_aLastData[Dummy].m_Hook = 0; // simulate releasing the fire button if((m_aLastData[Dummy].m_Fire & 1) != 0) m_aLastData[Dummy].m_Fire++; @@ -54,11 +49,6 @@ void CControls::ResetInput(int Dummy) m_aInputDirectionRight[Dummy] = 0; } -void CControls::OnRelease() -{ - //OnReset(); -} - void CControls::OnPlayerDeath() { for(int &AmmoCount : m_aAmmoCount) diff --git a/src/game/client/components/controls.h b/src/game/client/components/controls.h index f8ce75d713e..0f792df5ea3 100644 --- a/src/game/client/components/controls.h +++ b/src/game/client/components/controls.h @@ -18,8 +18,6 @@ class CControls : public CComponent vec2 m_aMousePos[NUM_DUMMIES]; vec2 m_aMousePosOnAction[NUM_DUMMIES]; vec2 m_aTargetPos[NUM_DUMMIES]; - float m_OldMouseX; - float m_OldMouseY; int m_aAmmoCount[NUM_WEAPONS]; @@ -29,14 +27,11 @@ class CControls : public CComponent int m_aInputDirectionLeft[NUM_DUMMIES]; int m_aInputDirectionRight[NUM_DUMMIES]; int m_aShowHookColl[NUM_DUMMIES]; - int m_LastDummy; - int m_OtherFire; CControls(); virtual int Sizeof() const override { return sizeof(*this); } virtual void OnReset() override; - virtual void OnRelease() override; virtual void OnRender() override; virtual void OnMessage(int MsgType, void *pRawMsg) override; virtual bool OnCursorMove(float x, float y, IInput::ECursorType CursorType) override; From 950bbf31af3c5a15adb1b25522f135bbb3fb3223 Mon Sep 17 00:00:00 2001 From: Andriy <113429882+EGYT5453@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:24:31 +0300 Subject: [PATCH 020/179] Make "Tee" tab name localisable --- src/game/client/components/menus_settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 5c8f53ff102..f4a93cf3955 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -2037,7 +2037,7 @@ void CMenus::RenderSettings(CUIRect MainView) Localize("Language"), Localize("General"), Localize("Player"), - "Tee", + Localize("Tee"), Localize("Appearance"), Localize("Controls"), Localize("Graphics"), From 2904c4a2e8caf3c38f324a3a266f2c29ee1bced7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 22:07:22 +0200 Subject: [PATCH 021/179] Restructure input send checks without `if`s --- src/game/client/components/controls.cpp | 38 +++++++------------------ 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 027a6726218..54fca856c77 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -180,8 +180,6 @@ void CControls::OnMessage(int Msg, void *pRawMsg) int CControls::SnapInput(int *pData) { - bool Send = false; - // update player state if(m_pClient->m_Chat.IsActive()) m_aInputData[g_Config.m_ClDummy].m_PlayerFlags = PLAYERFLAG_CHATTING; @@ -196,8 +194,7 @@ int CControls::SnapInput(int *pData) if(m_pClient->m_Controls.m_aShowHookColl[g_Config.m_ClDummy]) m_aInputData[g_Config.m_ClDummy].m_PlayerFlags |= PLAYERFLAG_AIM; - if(m_aLastData[g_Config.m_ClDummy].m_PlayerFlags != m_aInputData[g_Config.m_ClDummy].m_PlayerFlags) - Send = true; + bool Send = m_aLastData[g_Config.m_ClDummy].m_PlayerFlags != m_aInputData[g_Config.m_ClDummy].m_PlayerFlags; m_aLastData[g_Config.m_ClDummy].m_PlayerFlags = m_aInputData[g_Config.m_ClDummy].m_PlayerFlags; @@ -215,8 +212,7 @@ int CControls::SnapInput(int *pData) m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)m_aMousePos[g_Config.m_ClDummy].y; // send once a second just to be sure - if(time_get() > m_LastSendTime + time_freq()) - Send = true; + Send = Send || time_get() > m_LastSendTime + time_freq(); } else { @@ -303,27 +299,15 @@ int CControls::SnapInput(int *pData) } #endif // check if we need to send input - if(m_aInputData[g_Config.m_ClDummy].m_Direction != m_aLastData[g_Config.m_ClDummy].m_Direction) - Send = true; - else if(m_aInputData[g_Config.m_ClDummy].m_Jump != m_aLastData[g_Config.m_ClDummy].m_Jump) - Send = true; - else if(m_aInputData[g_Config.m_ClDummy].m_Fire != m_aLastData[g_Config.m_ClDummy].m_Fire) - Send = true; - else if(m_aInputData[g_Config.m_ClDummy].m_Hook != m_aLastData[g_Config.m_ClDummy].m_Hook) - Send = true; - else if(m_aInputData[g_Config.m_ClDummy].m_WantedWeapon != m_aLastData[g_Config.m_ClDummy].m_WantedWeapon) - Send = true; - else if(m_aInputData[g_Config.m_ClDummy].m_NextWeapon != m_aLastData[g_Config.m_ClDummy].m_NextWeapon) - Send = true; - else if(m_aInputData[g_Config.m_ClDummy].m_PrevWeapon != m_aLastData[g_Config.m_ClDummy].m_PrevWeapon) - Send = true; - - // send at at least 10hz - if(time_get() > m_LastSendTime + time_freq() / 25) - Send = true; - - if(m_pClient->m_Snap.m_pLocalCharacter && m_pClient->m_Snap.m_pLocalCharacter->m_Weapon == WEAPON_NINJA && (m_aInputData[g_Config.m_ClDummy].m_Direction || m_aInputData[g_Config.m_ClDummy].m_Jump || m_aInputData[g_Config.m_ClDummy].m_Hook)) - Send = true; + Send = Send || m_aInputData[g_Config.m_ClDummy].m_Direction != m_aLastData[g_Config.m_ClDummy].m_Direction; + Send = Send || m_aInputData[g_Config.m_ClDummy].m_Jump != m_aLastData[g_Config.m_ClDummy].m_Jump; + Send = Send || m_aInputData[g_Config.m_ClDummy].m_Fire != m_aLastData[g_Config.m_ClDummy].m_Fire; + Send = Send || m_aInputData[g_Config.m_ClDummy].m_Hook != m_aLastData[g_Config.m_ClDummy].m_Hook; + Send = Send || m_aInputData[g_Config.m_ClDummy].m_WantedWeapon != m_aLastData[g_Config.m_ClDummy].m_WantedWeapon; + Send = Send || m_aInputData[g_Config.m_ClDummy].m_NextWeapon != m_aLastData[g_Config.m_ClDummy].m_NextWeapon; + Send = Send || m_aInputData[g_Config.m_ClDummy].m_PrevWeapon != m_aLastData[g_Config.m_ClDummy].m_PrevWeapon; + Send = Send || time_get() > m_LastSendTime + time_freq() / 25; // send at least 10hz + Send = Send || (m_pClient->m_Snap.m_pLocalCharacter && m_pClient->m_Snap.m_pLocalCharacter->m_Weapon == WEAPON_NINJA && (m_aInputData[g_Config.m_ClDummy].m_Direction || m_aInputData[g_Config.m_ClDummy].m_Jump || m_aInputData[g_Config.m_ClDummy].m_Hook)); } // copy and return size From f94053bd66e4816232fe68442a11eded236051ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 22:08:08 +0200 Subject: [PATCH 022/179] Rename variable `w` to `Weapon` --- src/game/client/components/controls.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 54fca856c77..0aed43552d2 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -336,16 +336,16 @@ void CControls::OnRender() m_pClient->m_Snap.m_pLocalCharacter->m_Weapon != WEAPON_HAMMER && m_pClient->m_Snap.m_pLocalCharacter->m_Weapon != WEAPON_NINJA) { - int w; - for(w = WEAPON_LASER; w > WEAPON_GUN; w--) + int Weapon; + for(Weapon = WEAPON_LASER; Weapon > WEAPON_GUN; Weapon--) { - if(w == m_pClient->m_Snap.m_pLocalCharacter->m_Weapon) + if(Weapon == m_pClient->m_Snap.m_pLocalCharacter->m_Weapon) continue; - if(m_aAmmoCount[w] > 0) + if(m_aAmmoCount[Weapon] > 0) break; } - if(w != m_pClient->m_Snap.m_pLocalCharacter->m_Weapon) - m_aInputData[g_Config.m_ClDummy].m_WantedWeapon = w + 1; + if(Weapon != m_pClient->m_Snap.m_pLocalCharacter->m_Weapon) + m_aInputData[g_Config.m_ClDummy].m_WantedWeapon = Weapon + 1; } } From 01be442280953968d6d9866fe289ffe2b5c7f4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 22:09:46 +0200 Subject: [PATCH 023/179] Rename variable `MDistance` to `MouseDistance` --- src/game/client/components/controls.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 0aed43552d2..9dcca38ffd4 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -414,18 +414,18 @@ void CControls::ClampMousePos() float MinDistance = g_Config.m_ClDyncam ? g_Config.m_ClDyncamMinDistance : g_Config.m_ClMouseMinDistance; float MouseMin = MinDistance; - float MDistance = length(m_aMousePos[g_Config.m_ClDummy]); - if(MDistance < 0.001f) + float MouseDistance = length(m_aMousePos[g_Config.m_ClDummy]); + if(MouseDistance < 0.001f) { m_aMousePos[g_Config.m_ClDummy].x = 0.001f; m_aMousePos[g_Config.m_ClDummy].y = 0; - MDistance = 0.001f; + MouseDistance = 0.001f; } - if(MDistance < MouseMin) - m_aMousePos[g_Config.m_ClDummy] = normalize_pre_length(m_aMousePos[g_Config.m_ClDummy], MDistance) * MouseMin; - MDistance = length(m_aMousePos[g_Config.m_ClDummy]); - if(MDistance > MouseMax) - m_aMousePos[g_Config.m_ClDummy] = normalize_pre_length(m_aMousePos[g_Config.m_ClDummy], MDistance) * MouseMax; + if(MouseDistance < MouseMin) + m_aMousePos[g_Config.m_ClDummy] = normalize_pre_length(m_aMousePos[g_Config.m_ClDummy], MouseDistance) * MouseMin; + MouseDistance = length(m_aMousePos[g_Config.m_ClDummy]); + if(MouseDistance > MouseMax) + m_aMousePos[g_Config.m_ClDummy] = normalize_pre_length(m_aMousePos[g_Config.m_ClDummy], MouseDistance) * MouseMax; } } From 1fcb8a54695d6ea37573ddc2e062f5abcd153d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 22:12:21 +0200 Subject: [PATCH 024/179] Add `GetMinMouseDistance` function, remove variable `MinDistance` --- src/game/client/components/controls.cpp | 10 +++++++--- src/game/client/components/controls.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 9dcca38ffd4..672105b6c3f 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -410,9 +410,8 @@ void CControls::ClampMousePos() } else { - float MouseMax = GetMaxMouseDistance(); - float MinDistance = g_Config.m_ClDyncam ? g_Config.m_ClDyncamMinDistance : g_Config.m_ClMouseMinDistance; - float MouseMin = MinDistance; + const float MouseMin = GetMinMouseDistance(); + const float MouseMax = GetMaxMouseDistance(); float MouseDistance = length(m_aMousePos[g_Config.m_ClDummy]); if(MouseDistance < 0.001f) @@ -429,6 +428,11 @@ void CControls::ClampMousePos() } } +float CControls::GetMinMouseDistance() const +{ + return g_Config.m_ClDyncam ? g_Config.m_ClDyncamMinDistance : g_Config.m_ClMouseMinDistance; +} + float CControls::GetMaxMouseDistance() const { float CameraMaxDistance = 200.0f; diff --git a/src/game/client/components/controls.h b/src/game/client/components/controls.h index 0f792df5ea3..ce6bc664dd1 100644 --- a/src/game/client/components/controls.h +++ b/src/game/client/components/controls.h @@ -12,6 +12,7 @@ class CControls : public CComponent { + float GetMinMouseDistance() const; float GetMaxMouseDistance() const; public: From 4ec5b04a2eba8da2df0188ecd457029bdb00dc3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 2 Jun 2024 22:19:06 +0200 Subject: [PATCH 025/179] Use `vec2` instead of two separate variables --- src/game/client/components/controls.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 672105b6c3f..b143b909f47 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -219,13 +219,11 @@ int CControls::SnapInput(int *pData) m_aInputData[g_Config.m_ClDummy].m_TargetX = (int)m_aMousePos[g_Config.m_ClDummy].x; m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)m_aMousePos[g_Config.m_ClDummy].y; - if(g_Config.m_ClSubTickAiming && m_aMousePosOnAction[g_Config.m_ClDummy].x != 0 && m_aMousePosOnAction[g_Config.m_ClDummy].y != 0) + if(g_Config.m_ClSubTickAiming && m_aMousePosOnAction[g_Config.m_ClDummy] != vec2(0.0f, 0.0f)) { m_aInputData[g_Config.m_ClDummy].m_TargetX = (int)m_aMousePosOnAction[g_Config.m_ClDummy].x; m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)m_aMousePosOnAction[g_Config.m_ClDummy].y; - - m_aMousePosOnAction[g_Config.m_ClDummy].x = 0; - m_aMousePosOnAction[g_Config.m_ClDummy].y = 0; + m_aMousePosOnAction[g_Config.m_ClDummy] = vec2(0.0f, 0.0f); } if(!m_aInputData[g_Config.m_ClDummy].m_TargetX && !m_aInputData[g_Config.m_ClDummy].m_TargetY) @@ -365,9 +363,9 @@ bool CControls::OnCursorMove(float x, float y, IInput::ECursorType CursorType) if(CursorType == IInput::CURSOR_JOYSTICK && g_Config.m_InpControllerAbsolute && m_pClient->m_Snap.m_pGameInfoObj && !m_pClient->m_Snap.m_SpecInfo.m_Active) { - float AbsX = 0.0f, AbsY = 0.0f; - if(Input()->GetActiveJoystick()->Absolute(&AbsX, &AbsY)) - m_aMousePos[g_Config.m_ClDummy] = vec2(AbsX, AbsY) * GetMaxMouseDistance(); + vec2 AbsoluteDirection; + if(Input()->GetActiveJoystick()->Absolute(&AbsoluteDirection.x, &AbsoluteDirection.y)) + m_aMousePos[g_Config.m_ClDummy] = AbsoluteDirection * GetMaxMouseDistance(); return true; } From 248225c7c43f5a0d34ef9e459029d4568367c78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 21 May 2024 19:56:22 +0200 Subject: [PATCH 026/179] Refactor client input event handling Add `IInput::ConsumeEvents` function accepting a consumer `std::function` to replace the duplicate usage of the `IInput::NumEvents`, `IInput::GetEvent` and `IInput::IsEventValid` functions. Use an `std::vector` to store the current input events to support any number of input events per client update instead of at most 32. Use full `uint32_t` range for input counter instead of only using the range 0..0xFFFF. If the range is artificially reduced, then this can result in inputs being handled multiple times with high refresh rates, so the increased range should add future proofing for extremely fast devices. Split `CInput::AddEvent` function into `CInput::AddKeyEvent` and `CInput::AddTextEvent` functions for readability and to make it easier to add additional input events (i.e. touch events). Ensure double-click state is cleared at the end of each frame to prevent the double-click from being stored when no UI element consumes it. Move member variables from `IInput` interface to `CInput` implementation. Remove separate `CEditor::DispatchInputEvents` function. --- src/engine/client/input.cpp | 79 ++++++++++++++++++++++------------ src/engine/client/input.h | 19 +++++--- src/engine/input.h | 30 +++---------- src/game/client/gameclient.cpp | 9 +--- src/game/editor/editor.cpp | 24 ++--------- src/game/editor/editor.h | 1 - 6 files changed, 77 insertions(+), 85 deletions(-) diff --git a/src/engine/client/input.cpp b/src/engine/client/input.cpp index bf8bb179a62..63931295ad4 100644 --- a/src/engine/client/input.cpp +++ b/src/engine/client/input.cpp @@ -33,19 +33,25 @@ // for platform specific features that aren't available or are broken in SDL #include -void CInput::AddEvent(char *pText, int Key, int Flags) +void CInput::AddKeyEvent(int Key, int Flags) { - if(m_NumEvents != INPUT_BUFFER_SIZE) - { - m_aInputEvents[m_NumEvents].m_Key = Key; - m_aInputEvents[m_NumEvents].m_Flags = Flags; - if(pText == nullptr) - m_aInputEvents[m_NumEvents].m_aText[0] = '\0'; - else - str_copy(m_aInputEvents[m_NumEvents].m_aText, pText); - m_aInputEvents[m_NumEvents].m_InputCount = m_InputCounter; - m_NumEvents++; - } + dbg_assert((Flags & (FLAG_PRESS | FLAG_RELEASE)) != 0 && (Flags & ~(FLAG_PRESS | FLAG_RELEASE)) == 0, "Flags invalid"); + CEvent Event; + Event.m_Key = Key; + Event.m_Flags = Flags; + Event.m_aText[0] = '\0'; + Event.m_InputCount = m_InputCounter; + m_vInputEvents.emplace_back(Event); +} + +void CInput::AddTextEvent(const char *pText) +{ + CEvent Event; + Event.m_Key = KEY_UNKNOWN; + Event.m_Flags = FLAG_TEXT; + str_copy(Event.m_aText, pText); + Event.m_InputCount = m_InputCounter; + m_vInputEvents.emplace_back(Event); } CInput::CInput() @@ -53,6 +59,7 @@ CInput::CInput() mem_zero(m_aInputCount, sizeof(m_aInputCount)); mem_zero(m_aInputState, sizeof(m_aInputState)); + m_vInputEvents.reserve(32); m_LastUpdate = 0; m_UpdateTime = 0.0f; @@ -60,8 +67,6 @@ CInput::CInput() m_InputGrabbed = false; m_MouseDoubleClick = false; - - m_NumEvents = 0; m_MouseFocus = true; m_pClipboardText = nullptr; @@ -342,11 +347,29 @@ void CInput::StopTextInput() m_vCandidates.clear(); } +void CInput::ConsumeEvents(std::function Consumer) const +{ + for(const CEvent &Event : m_vInputEvents) + { + // Only propagate valid input events + if(Event.m_InputCount == m_InputCounter) + { + Consumer(Event); + } + } +} + void CInput::Clear() { mem_zero(m_aInputState, sizeof(m_aInputState)); mem_zero(m_aInputCount, sizeof(m_aInputCount)); - m_NumEvents = 0; + m_vInputEvents.clear(); + m_MouseDoubleClick = false; +} + +float CInput::GetUpdateTime() const +{ + return m_UpdateTime; } bool CInput::KeyState(int Key) const @@ -424,24 +447,24 @@ void CInput::HandleJoystickAxisMotionEvent(const SDL_JoyAxisEvent &Event) { m_aInputState[LeftKey] = true; m_aInputCount[LeftKey] = m_InputCounter; - AddEvent(nullptr, LeftKey, IInput::FLAG_PRESS); + AddKeyEvent(LeftKey, IInput::FLAG_PRESS); } else if(Event.value > SDL_JOYSTICK_AXIS_MIN * DeadZone && m_aInputState[LeftKey]) { m_aInputState[LeftKey] = false; - AddEvent(nullptr, LeftKey, IInput::FLAG_RELEASE); + AddKeyEvent(LeftKey, IInput::FLAG_RELEASE); } if(Event.value >= SDL_JOYSTICK_AXIS_MAX * DeadZone && !m_aInputState[RightKey]) { m_aInputState[RightKey] = true; m_aInputCount[RightKey] = m_InputCounter; - AddEvent(nullptr, RightKey, IInput::FLAG_PRESS); + AddKeyEvent(RightKey, IInput::FLAG_PRESS); } else if(Event.value < SDL_JOYSTICK_AXIS_MAX * DeadZone && m_aInputState[RightKey]) { m_aInputState[RightKey] = false; - AddEvent(nullptr, RightKey, IInput::FLAG_RELEASE); + AddKeyEvent(RightKey, IInput::FLAG_RELEASE); } } @@ -461,12 +484,12 @@ void CInput::HandleJoystickButtonEvent(const SDL_JoyButtonEvent &Event) { m_aInputState[Key] = true; m_aInputCount[Key] = m_InputCounter; - AddEvent(nullptr, Key, IInput::FLAG_PRESS); + AddKeyEvent(Key, IInput::FLAG_PRESS); } else if(Event.type == SDL_JOYBUTTONUP) { m_aInputState[Key] = false; - AddEvent(nullptr, Key, IInput::FLAG_RELEASE); + AddKeyEvent(Key, IInput::FLAG_RELEASE); } } @@ -488,7 +511,7 @@ void CInput::HandleJoystickHatMotionEvent(const SDL_JoyHatEvent &Event) if(Key != HatKeys[0] && Key != HatKeys[1] && m_aInputState[Key]) { m_aInputState[Key] = false; - AddEvent(nullptr, Key, IInput::FLAG_RELEASE); + AddKeyEvent(Key, IInput::FLAG_RELEASE); } } @@ -498,7 +521,7 @@ void CInput::HandleJoystickHatMotionEvent(const SDL_JoyHatEvent &Event) { m_aInputState[CurrentKey] = true; m_aInputCount[CurrentKey] = m_InputCounter; - AddEvent(nullptr, CurrentKey, IInput::FLAG_PRESS); + AddKeyEvent(CurrentKey, IInput::FLAG_PRESS); } } } @@ -582,8 +605,8 @@ int CInput::Update() } m_LastUpdate = Now; - // keep the counter between 1..0xFFFF, 0 means not pressed - m_InputCounter = (m_InputCounter % 0xFFFF) + 1; + // keep the counter between 1..0xFFFFFFFF, 0 means not pressed + m_InputCounter = (m_InputCounter % std::numeric_limits::max()) + 1; // Ensure that we have the latest keyboard, mouse and joystick state SDL_PumpEvents(); @@ -621,7 +644,7 @@ int CInput::Update() for(int i = 0; i < Event.edit.start; i++) m_CompositionCursor = str_utf8_forward(m_aComposition, m_CompositionCursor); // Event.edit.length is currently unused on Windows and will always be 0, so we don't support selecting composition text - AddEvent(nullptr, KEY_UNKNOWN, IInput::FLAG_TEXT); + AddTextEvent(""); } else { @@ -636,7 +659,7 @@ int CInput::Update() m_aComposition[0] = '\0'; m_CompositionLength = COMP_LENGTH_INACTIVE; m_CompositionCursor = 0; - AddEvent(Event.text.text, KEY_UNKNOWN, IInput::FLAG_TEXT); + AddTextEvent(Event.text.text); break; // handle keys @@ -806,7 +829,7 @@ int CInput::Update() m_aInputState[Scancode] = 1; m_aInputCount[Scancode] = m_InputCounter; } - AddEvent(nullptr, Scancode, Action); + AddKeyEvent(Scancode, Action); } } diff --git a/src/engine/client/input.h b/src/engine/client/input.h index 00fd15c8e4a..7cef8f81625 100644 --- a/src/engine/client/input.h +++ b/src/engine/client/input.h @@ -92,14 +92,17 @@ class CInput : public IEngineInput std::vector m_vCandidates; int m_CandidateSelectedIndex; - void AddEvent(char *pText, int Key, int Flags); - void Clear() override; - bool IsEventValid(const CEvent &Event) const override { return Event.m_InputCount == m_InputCounter; } + // events + std::vector m_vInputEvents; + int64_t m_LastUpdate; + float m_UpdateTime; + void AddKeyEvent(int Key, int Flags); + void AddTextEvent(const char *pText); // quick access to input - unsigned short m_aInputCount[g_MaxKeys]; // tw-KEY - unsigned char m_aInputState[g_MaxKeys]; // SDL_SCANCODE - int m_InputCounter; + uint32_t m_aInputCount[g_MaxKeys]; + unsigned char m_aInputState[g_MaxKeys]; + uint32_t m_InputCounter; void UpdateMouseState(); void UpdateJoystickState(); @@ -122,6 +125,10 @@ class CInput : public IEngineInput int Update() override; void Shutdown() override; + void ConsumeEvents(std::function Consumer) const override; + void Clear() override; + float GetUpdateTime() const override; + bool ModifierIsPressed() const override { return KeyState(KEY_LCTRL) || KeyState(KEY_RCTRL) || KeyState(KEY_LGUI) || KeyState(KEY_RGUI); } bool ShiftIsPressed() const override { return KeyState(KEY_LSHIFT) || KeyState(KEY_RSHIFT); } bool AltIsPressed() const override { return KeyState(KEY_LALT) || KeyState(KEY_RALT); } diff --git a/src/engine/input.h b/src/engine/input.h index 87740c2fa2a..2e9c56ce78b 100644 --- a/src/engine/input.h +++ b/src/engine/input.h @@ -6,6 +6,9 @@ #include "kernel.h" #include +#include +#include + const int g_MaxKeys = 512; extern const char g_aaKeyStrings[g_MaxKeys][20]; @@ -23,23 +26,10 @@ class IInput : public IInterface public: int m_Flags; int m_Key; + uint32_t m_InputCount; char m_aText[INPUT_TEXT_SIZE]; - int m_InputCount; }; -protected: - enum - { - INPUT_BUFFER_SIZE = 32 - }; - - // quick access to events - size_t m_NumEvents; - CEvent m_aInputEvents[INPUT_BUFFER_SIZE]; - int64_t m_LastUpdate; - float m_UpdateTime; - -public: enum { FLAG_PRESS = 1 << 0, @@ -60,19 +50,14 @@ class IInput : public IInterface }; // events - size_t NumEvents() const { return m_NumEvents; } - virtual bool IsEventValid(const CEvent &Event) const = 0; - const CEvent &GetEvent(size_t Index) const - { - dbg_assert(Index < m_NumEvents, "Index invalid"); - return m_aInputEvents[Index]; - } + virtual void ConsumeEvents(std::function Consumer) const = 0; + virtual void Clear() = 0; /** * @return Rolling average of the time in seconds between * calls of the Update function. */ - float GetUpdateTime() const { return m_UpdateTime; } + virtual float GetUpdateTime() const = 0; // keys virtual bool ModifierIsPressed() const = 0; @@ -81,7 +66,6 @@ class IInput : public IInterface virtual bool KeyIsPressed(int Key) const = 0; virtual bool KeyPress(int Key, bool CheckCounter = false) const = 0; const char *KeyName(int Key) const { return (Key >= 0 && Key < g_MaxKeys) ? g_aaKeyStrings[Key] : g_aaKeyStrings[0]; } - virtual void Clear() = 0; // joystick class IJoystick diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 64164b41da4..cedf9297107 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -385,18 +385,13 @@ void CGameClient::OnUpdate() } // handle key presses - for(size_t i = 0; i < Input()->NumEvents(); i++) - { - const IInput::CEvent &Event = Input()->GetEvent(i); - if(!Input()->IsEventValid(Event)) - continue; - + Input()->ConsumeEvents([&](const IInput::CEvent &Event) { for(auto &pComponent : m_vpInput) { if(pComponent->OnInput(Event)) break; } - } + }); if(g_Config.m_ClSubTickAiming && m_Binds.m_MouseOnAction) { diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 767c8a6f71b..f14cf5d7278 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -8482,17 +8482,6 @@ void CEditor::OnMouseMove(float MouseX, float MouseY) Ui()->MapScreen(); } -void CEditor::DispatchInputEvents() -{ - for(size_t i = 0; i < Input()->NumEvents(); i++) - { - const IInput::CEvent &Event = Input()->GetEvent(i); - if(!Input()->IsEventValid(Event)) - continue; - Ui()->OnInput(Event); - } -} - void CEditor::HandleAutosave() { const float Time = Client()->GlobalTime(); @@ -8624,21 +8613,16 @@ void CEditor::OnUpdate() m_pContainerPannedLast = m_pContainerPanned; // handle key presses - for(size_t i = 0; i < Input()->NumEvents(); i++) - { - const IInput::CEvent &Event = Input()->GetEvent(i); - if(!Input()->IsEventValid(Event)) - continue; - + Input()->ConsumeEvents([&](const IInput::CEvent &Event) { for(CEditorComponent &Component : m_vComponents) { if(Component.OnInput(Event)) - break; + return; } - } + Ui()->OnInput(Event); + }); HandleCursorMovement(); - DispatchInputEvents(); HandleAutosave(); HandleWriterFinishJobs(); diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index 0801c1f04d0..e9172ebb0fa 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -465,7 +465,6 @@ class CEditor : public IEditor void HandleCursorMovement(); void OnMouseMove(float MouseX, float MouseY); - void DispatchInputEvents(); void HandleAutosave(); bool PerformAutosave(); void HandleWriterFinishJobs(); From 0d9f673b03b06babec4a9887ba5c552da0eff800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Mon, 27 May 2024 18:59:33 +0200 Subject: [PATCH 027/179] Include `types.h` instead of `system.h` in `input.h` --- src/engine/input.h | 3 ++- src/game/client/component.cpp | 11 +++++++++++ src/game/client/component.h | 17 ++--------------- src/game/client/components/voting.cpp | 7 +++++++ src/game/client/components/voting.h | 4 ++-- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/engine/input.h b/src/engine/input.h index 2e9c56ce78b..d1d92660424 100644 --- a/src/engine/input.h +++ b/src/engine/input.h @@ -4,7 +4,8 @@ #define ENGINE_INPUT_H #include "kernel.h" -#include + +#include #include #include diff --git a/src/game/client/component.cpp b/src/game/client/component.cpp index 0d085f42831..c682d7457d8 100644 --- a/src/game/client/component.cpp +++ b/src/game/client/component.cpp @@ -2,6 +2,8 @@ #include "gameclient.h" +#include + class IKernel *CComponent::Kernel() const { return m_pClient->Kernel(); } class IEngine *CComponent::Engine() const { return m_pClient->Engine(); } class IGraphics *CComponent::Graphics() const { return m_pClient->Graphics(); } @@ -27,6 +29,15 @@ class IUpdater *CComponent::Updater() const } #endif +int64_t CComponent::time() const +{ +#if defined(CONF_VIDEORECORDER) + return IVideo::Current() ? IVideo::Time() : time_get(); +#else + return time_get(); +#endif +} + float CComponent::LocalTime() const { #if defined(CONF_VIDEORECORDER) diff --git a/src/game/client/component.h b/src/game/client/component.h index be49eb99108..639c8b140ad 100644 --- a/src/game/client/component.h +++ b/src/game/client/component.h @@ -104,25 +104,12 @@ class CComponent class IUpdater *Updater() const; #endif -#if defined(CONF_VIDEORECORDER) /** * Gets the current time. * @see time_get() */ - int64_t time() const - { - return IVideo::Current() ? IVideo::Time() : time_get(); - } -#else - /** - * Gets the current time. - * @see time_get() - */ - int64_t time() const - { - return time_get(); - } -#endif + int64_t time() const; + /** * Gets the local time. */ diff --git a/src/game/client/components/voting.cpp b/src/game/client/components/voting.cpp index f25dedf99dc..0c2fbb57ed8 100644 --- a/src/game/client/components/voting.cpp +++ b/src/game/client/components/voting.cpp @@ -2,6 +2,8 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "voting.h" +#include + #include #include @@ -139,6 +141,11 @@ void CVoting::Vote(int v) Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); } +int CVoting::SecondsLeft() const +{ + return (m_Closetime - time()) / time_freq(); +} + CVoting::CVoting() { ClearOptions(); diff --git a/src/game/client/components/voting.h b/src/game/client/components/voting.h index 3e5531a6a78..2d3d36d15bd 100644 --- a/src/game/client/components/voting.h +++ b/src/game/client/components/voting.h @@ -57,8 +57,8 @@ class CVoting : public CComponent void Vote(int v); // -1 = no, 1 = yes - int SecondsLeft() { return (m_Closetime - time()) / time_freq(); } - bool IsVoting() { return m_Closetime != 0; } + int SecondsLeft() const; + bool IsVoting() const { return m_Closetime != 0; } int TakenChoice() const { return m_Voted; } const char *VoteDescription() const { return m_aDescription; } const char *VoteReason() const { return m_aReason; } From 97623c3002d76e514de6c64dba739d3d97205919 Mon Sep 17 00:00:00 2001 From: Andriy <113429882+EGYT5453@users.noreply.github.com> Date: Tue, 4 Jun 2024 23:28:45 +0300 Subject: [PATCH 028/179] Remake Ukrainian l10n --- data/languages/ukrainian.txt | 2467 +++++++++++++++++----------------- 1 file changed, 1237 insertions(+), 1230 deletions(-) diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index 96ee374a577..9bb1270fe66 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -3,1845 +3,1852 @@ # .ua and Ivan. REWORKED BY SwiatoslaW#2927 (09.12.2021) #modified by: # 404_not_found 2011-07-30 19:50:58 +# EGYT5453 (15.05.2024-04.06.2024) ##### /authors ##### ##### translated strings ##### -%ds left -== залишилось %d сек. - -Abort -== Відміна - -Address -== Адреса - -All -== Всі - -Are you sure that you want to quit? -== Ви дійсно бажаєте вийти? +%.2f KiB +== %.2f КіБ -Blue team -== Сині +%.2f MiB +== %.2f МіБ -Blue team wins! -== Сині перемогли! +[Demo player duration] +%d min. +== %dхв -Body -== Тіло +%d new mentions +== Нових згадок: %d -Call vote -== Голосувати +%d of %d server +== Сервери: %d з %d -Chat -== Чат +%d of %d servers +== Сервери: %d з %d -Connecting to -== Підключення до +%d player +== Гравців: %d -Connection Problems… -== Проблеми зі з'єднанням… +%d players +== Гравців: %d -Console -== Консоль +[Demo player duration] +%d sec. +== %dс -Controls -== Управління +%d/%d KiB (%.1f KiB/s) +== %d/%d КіБ (%.1f КіБ/с) -Current -== Поточний +%ds left +== залишилося %dс -Custom colors -== Особистий колір +%i minute left +== Залишилося: %iхв -Delete -== Видалити +%i minutes left +== Залишилося: %iхв -Demos -== Демо +%i second left +== Залишилося: %iс -Disconnect -== Від'єднатись +%i seconds left +== Залишилося: %iс -Disconnected -== Від'єднанно +%s wins! +== %s перемагає! -Downloading map -== Завантаження карти +(paused) +== (призупинено) -Draw! -== Нічия! +1 new mention +== Нових згадок: 1 -Dynamic Camera -== Динамічна камера +9+ new mentions +== Нових згадок: 9+ -Emoticon -== Емоція +A demo with this name already exists +== Демо з цією назвою вже існує -Error -== Помилка +A folder with this name already exists +== Тека з цією назвою вже існує -Error loading demo -== Помилка при завантаженні демо +[Graphics error] +A render command failed. Try to update your GPU drivers. +== Помилка в команді відмальовування. Спробуйте оновити драйвери відеокарти. -Favorite -== Улюблений +A Tee +== тії -Favorites -== Улюблені +Abort +== Скасувати -Feet -== Ноги +[Ingame controller mode] +Absolute +== Абсолютний -Fire -== Постріл +Activate +== Активувати -Folder -== Папка +Activate all +== Активувати усіх -Force vote -== Форсувати +Add +== Додати -Fullscreen -== Повноекранний режим +Add Clan +== Додати клан -Game -== Гра +Add Friend +== Додати друга -Game info -== Інфо по грі +Address +== Адреса -Game over -== Гра закінчена +Adjust the opacity of entities belonging to other teams, such as tees and nameplates +== Налаштуйте непрозорість сутностей інших команд, як от тії та ніків -Game type -== Тип гри +AFR +== АФР -Game types: -== Типи гри: +Aim bind +== Прив'язка -General -== Основні +All +== Усі -Graphics -== Графіка +All combined +== Усі разом -Grenade -== Ракетниця +Allows maps to render with more detail +== Дозволяє мапам відмальовувати більше деталей -Hammer -== Молоток +Alpha +== Альфа -Has people playing -== Сервер не порожній +Always show chat +== Завжди показувати чат -High Detail -== Висока деталізація +Always show other players' hook collision lines +== Завжди показувати лінії зіткнення гака інших гравців -Hook -== Гак +Always show own player's hook collision line +== Завжди показувати власну лінію зіткнення гака -Invalid Demo -== Невірне демо +[Graphics error] +An error during command recording occurred. Try to update your GPU drivers. +== Виникла помилка під час запису команд. Спробуйте оновити драйвери відеокарти. -Join blue -== За синіх +Angle: +== Кут: -Join red -== За червоних +AntiPing +== АнтиПінг -Jump -== Стрибок +AntiPing: predict grenade paths +== АнтиПінг: передбачувати траєкторії гранат -Language -== Мова +AntiPing: predict other players +== АнтиПінг: передбачувати інших гравців -MOTD -== MOTD +AntiPing: predict weapons +== АнтиПінг: передбачувати зброю -Map -== Карта +Appearance +== Вигляд -Move left -== Вліво +Are you sure that you want to delete the demo '%s'? +== Ви дійсно хочете видалити демо '%s'? -Move right -== Вправо +Are you sure that you want to delete the folder '%s'? +== Ви дійсно хочете видалити теку '%s'? -Movement -== Переміщення +Are you sure that you want to disconnect? +== Ви дійсно хочете від'єднатися? -Mute when not active -== Відключити звуки, коли гра неактивна +Are you sure that you want to disconnect and switch to a different server? +== Ви дійсно хочете від'єднатися й приєднатися до іншого сервера? -Name -== Ім'я +Are you sure that you want to disconnect your dummy? +== Ви дійсно хочете від'єднати свого даммі? -Next weapon -== Наступ. зброя +Are you sure that you want to quit? +== Ви дійсно хочете вийти? -Nickname -== Нік +Are you sure that you want to remove the clan '%s' from your friends list? +== Ви дійсно хочете прибрати клан '%s' зі списку друзів? -No -== Немає +Are you sure that you want to remove the player '%s' from your friends list? +== Ви дійсно хочете прибрати гравця '%s' зі списку друзів? -No password -== Без пароля +Are you sure that you want to reset the controls to their defaults? +== Ви дійсно хочете скинути налаштування керування до значень за замовчуванням? -No servers found -== Сервера не знайдені +Are you sure that you want to restart? +== Ви дійсно хочете перезапустити? -No servers match your filter criteria -== Не знайдено ні одного сервара, який би відповідав вашим фільтрам +ASI +== АЗІ -Ok -== Ок +Assets +== Текстури -Password -== Пароль +Assets directory +== Тека текстур -Password incorrect -== Неправильний пароль +AUS +== АВС -Ping -== Пінг +Authed name color in scoreboard +== Колір авторизованих у таблі -Pistol -== Пістолет +Auto +== Авто -Player -== Гравець +auto +== автоматично -Players -== Гравці +Automatically create statboard csv +== Автоматично зберігати статистику у CSV-файл -Please balance teams! -== Будь ласка збалансуйте команди! +Automatically record demos +== Автоматично записувати демо -Prev. weapon -== Попер. зброя +Automatically take game over screenshot +== Автоматично робити знімки екрана кінця гри -Quit -== Вихід +Automatically take statboard screenshot +== Автоматично робити знімки екрана статистики -Reason: -== Причина: +Axis +== Осі -Red team -== Червоні +Background +== Фон -Red team wins! -== Червоні перемогли! +Background music volume +== Гучність фонової музики -Remote console -== Консоль сервера +Best +== НКом -Reset filter -== Скинути фільтри +Blue team +== Сині -Score -== Бали +Blue team wins! +== Сині перемогли! -Score limit -== Ліміт очок +Body +== Тулуб -Scoreboard -== Хід гри +Browser +== Браузер -Screenshot -== Скріншот +Call vote +== Голосувати -Server info -== Інформація +Can't find a Tutorial server +== Не вдалося знайти сервер-посібник -Server not full -== Сервер не заповнений +Cancel +== Скасувати -Shotgun -== Дробовик +Change settings +== Змінити налаштування -Show chat -== Показати чат +Change the skip duration +== Змінити інтервал перемотки -Show name plates -== Показувати ніки гравців +Chat +== Чат -Sound -== Звук +Chat command +== Команда в чат -Spectate -== Спостерігати +Chat command (e.g. showall 1) +== Команда (наприклад, showall 1) -Spectators -== Спостерігачі +Chat font size +== Розмір шрифту чату -Stop record -== Зупинити запис +Chat sound volume +== Гучність чату -Sudden Death -== Раптова смерть +Chat width +== Ширина чату -Switch weapon on pickup -== Взяти в руку підібравшу зброю +Check now +== Перевірити -Team -== Команда +Checking for existing player with your name +== Перевіряємо Ваш нікнейм на доступність -Team chat -== Командний чат +CHN +== КИТ -The server is running a non-standard tuning on a pure game type. -== Сервер запущено з нестандартними налаштуваннями на стандартному типі гри. +Choose default eyes when joining a server +== Очі, які відображатимуться за замовчуванням -Time limit -== Ліміт часу +Clan +== Клан -Time limit: %d min -== Ліміт часу: %d хв +Clan plates size +== Розмір назви клану -Try again -== Спробувати знову +Click to remove this clan from your friends list. +== Натисніть, щоб прибрати цей клан зі списку друзів. -Type -== Тип +Click to remove this player from your friends list. +== Натисніть, щоб прибрати цього гравця зі списку друзів. -Use sounds -== Використовувати звуки +Click to select server. Double click to join your friend. +== Натисніть, щоб вибрати сервер. Натисніть двічі, щоб приєднатися до свого друга. -V-Sync -== Вертикальна синхронізація (V-Sync) +Client +== Клієнт -Version -== Версія +Client message +== Повідомлення клієнта -Vote no -== Проти +Close the demo player +== Закрити програвач демо -Vote yes -== За +Colors of the hook collision line, in case of a possible collision with: +== Кольори лінії зіткнення гака, якщо він може зіштовхнутися з: -Voting -== Голосування +Communities +== Спільноти -Warmup -== Розминка +Config directory +== Тека налаштувань -Weapon -== Зброя +Connect Dummy +== Приєднати даммі -Yes -== Так +Connected +== Приєднано -You must restart the game for all settings to take effect. -== Перезапустіть гру для застосування змін. +Connecting dummy +== Приєднуємо даммі -##### needs translation ##### +Connecting to +== Приєднуємося до -Sat. -== Контраст. +Connection Problems… +== Проблеми зі з'єднанням… -Internet -== Інтернет +Console +== Консоль -News -== Новини +Continue anyway? +== Все одно продовжити? -Laser -== Лазер +Controller +== Контролер -Join game -== Приєднатися до гри +Controller jitter tolerance +== Мертва зона -Sound volume -== Гучність звуку +Controls +== Керування -FSAA samples -== Семплів FSAA +Converse +== Приватний чат -Your skin -== Ваш скін +Copy info +== Скопіювати -Hue -== Відтінок +[Graphics error] +Could not initialize the given graphics backend, reverting to the default backend now. +== Не вдалося ініціалізувати заданий графічний рушій, повертаємося до рушія за замовчуванням. -Miscellaneous -== Додатково +[Graphics error] +Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. +== Не вдалося ініціалізувати заданий графічний рушій, можливо тому що ви не встановили драйвери на вбудовану відеокарту. -Reset to defaults -== Скинути налаштування +Could not save downloaded map. Try manually deleting this file: %s +== Не вдалося зберегти завантажену мапу. Спробуйте самостійно видалити цей файл: %s -Round -== Раунд +Count players only +== Рахувати тільки гравців -Lht. -== Яскравість +Countries +== Країни -UI Color -== Колір інтерфейсу +Create a random skin +== Створити випадковий скін -Alpha -== Прозор.. +Created +== Створено -LAN -== LAN +Current +== Поточні налаштування -Record demo -== Запис демо +custom +== власний -Successfully saved the replay! -== Повтор збережено +Custom colors +== Власні кольори -Replay feature is disabled! -== Функція повтору вимкнена +Cut interval +== Інтервал -Game paused -== Гра призупинена +Cut length +== Тривалість -Free-View -== Вільний перегляд +Date +== Дата -Server best: -== Найкращі сервери +DDNet +== DDNet -Personal best: -== Твоє найкраще +DDNet %s is available: +== Доступний DDNet %s: -Learn -== Вчитися +DDNet %s is out! +== Вийшов DDNet %s! -Browser -== Браузер +DDNet Client needs to be restarted to complete update! +== Потрібно перезапустити клієнт DDNet, щоб завершити оновлення! -Ghost -== Тінь +DDNet Client updated! +== Клієнт DDNet оновлено! -Loading DDNet Client -== Завантаження DDNet Client +DDRace HUD +== HUD DDRace -Reconnect in %d sec -== Перепідключення через %d сек. +DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. +== DDraceNetwork — кооперативна мережева гра, ціль якої — дістатися разом зі своєю групою тії до фінішної прямої. Новачкам варто почати із серверів "Для новачків" (Novice), на яких є найпростіші мапи. Зважайте на затримку, коли вибираєте сервер. -Delete demo -== Видалити демо +Deactivate +== Деактивувати -Rename demo -== Перейменувати демо +Deactivate all +== Деактивувати усіх -Render demo -== Почати рендер демо +Deaths +== С -Replace video -== Замінити відео +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== Увімкнено режим налагодження. Натисніть Ctrl+Shift+D, щоб його вимкнути. -File already exists, do you want to overwrite it? -== Файл вже існує, ви хочете його перезаписати? +default +== за замовчуванням -Remove friend -== Видалити друга +Default length +== Звичайна тривалість -Sound error -== Звукова помилка +Default zoom +== Звичайний масштаб -The audio device couldn't be initialised. -== Не вдалося ініціалізувати аудіопристрій. +Delete +== Видалити -Are you sure that you want to disconnect? -== Ви впевнені, що хочете відключитися? +Delete demo +== Видалити демо -Disconnect Dummy -== Відключити даммі +Delete folder +== Видалити теку -Are you sure that you want to disconnect your dummy? -== Ви впевнені, що хочете відключити свого даммі? +Demo +== Демо -Welcome to DDNet -== Ласкаво просимо в DDNet +Demofile: %s +== Демо-файл: %s -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork кооперативна онлайн гра, де Вашою головною метою і метою вашої команди є досягненням фінішу карти. Новачкам рекомендовано починати свій шлях на Novice серверах, на яких стоять легкі карти. Також враховуйте пінг щоб вибрати найближчий до вас сервер. +Demos +== Демо -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Рекомендується перевірити налаштування, щоб підлаштувати їх для комфортної гри перед тим, як приєднатися до сервера. +Demos directory +== Тека демо -Please enter your nickname below. -== Будь ласка, введіть свій нікнейм нижче +Desktop fullscreen +== Стільничний повноекранний -%i minute left -== Залишилася %i хвилина +Disconnect +== Від'єднатися -%i minutes left -== Залишилось %i хвилин +Disconnect Dummy +== Від'єднати даммі -%i second left -== Залишилася %i секунда +Disconnected +== Від'єднано -%i seconds left -== Залишилось %i секунд +Discord +== Discord -Unable to rename the demo -== Неможливо перейменувати демо +Door Laser Inner Color +== Колір лазерних дверей -New name: -== Нове ім’я +Door Laser Outline Color +== Колір контуру лазерних дверей -Show ingame HUD -== Показувати HUD +Download community skins +== Завантажувати скіни спільноти -Video name: -== Назва відео +Download skins +== Завантажувати скіни -Show DDNet map finishes in server browser -== Показувати пройдені карти DDNet в браузері сервера +Downloading %s: +== Завантажуємо %s: -transmits your player name to info.ddnet.org -== передає ваш нікнейм на info.ddnet.org +Downloading map +== Завантажуємо мапу -Search -== Пошук +Draw! +== Нічия! -Exclude -== Виключити +Dummy +== Даммі -Count players only -== Рахувати тільки гравців +Dummy copy +== Повторювати рухи -Show friends only -== Тільки з друзями +Dynamic Camera +== Рухома камера -Strict gametype filter -== Строгий фільтр режимів +Editor +== Редактор -Server address: -== Адреса сервера +Emoticon +== Смайлик -Player country: -== Країна гравця +Emoticons +== Смайлики -Filter connecting players -== Лише підключені +Enable controller +== Увімкнути контролер -Indicate map finish -== Показувати фініші карт +Enable game sounds +== Ігрові звуки -Unfinished map -== Не пройдені карти +Enable ghost +== Увімкнути привида -Countries -== Країни +Enable gun sound +== Звуки пострілів -Types -== Типи +Enable highlighted chat sound +== Звук виділеного повідомлення -Remove -== Видалити +Enable long pain sound (used when shooting in freeze) +== Довгий крик болі (при стрільбі у заморозці) -Clan -== Клан +Enable regular chat sound +== Звук звичайного повідомлення -Add Friend -== Додати друга +Enable replays +== Повтори -DDNet %s is out! -== Вийшла нова версія DDNet %s! +Enable server message sound +== Звук повідомлення сервера -Downloading %s: -== Завантаження %s: +Enable team chat sound +== Звук повідомлення команди -Update failed! Check log… -== Помилка оновлення! Перевірте логи… +Enter Password +== Введіть пароль -DDNet Client updated! -== Клієнт DDNet оновлено! +Enter Username +== Введіть логін -Update now -== Оновити зараз +Entities +== Сутності -Restart -== Перезавантажити +Entities background color +== Колір фону сутностей -Remove chat -== Видалити чат +Error +== Помилка -Demofile: %s -== Демофайл: %s +Error loading demo +== Помилка завантаження демо -Parent Folder -== Батьківський каталог +Error playing demo +== Помилка відтворення демо -%.2f MiB -== %.2f MiB +Error saving settings +== Помилка збереження налаштувань -%.2f KiB -== %.2f KiB +EUR +== ЄВР -Demo -== Демо +Exclude +== Виключити -Length -== Довжина +Existing Player +== Гравець вже існує -Date -== Дата +Export cut as a separate demo +== Експортувати фрагмент як окреме демо -Fetch Info -== Отримати інформацію +Export demo cut +== Експортувати фрагмент демо -Connecting dummy -== Підключення даммі +Extras +== Додатково -Connect Dummy -== Підключити даммі +[Graphics error] +Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. +== Помилка під час ініціалізації. Спробуйте змінити gfx_backend на OpenGL чи Vulkan у settings_ddnet.cfg у теці налаштувань і спробуйте ще раз. -Player options -== Опції гравця +Failed saving the replay! +== Не вдалося зберегти повтор! -Change settings -== Змінити налаштування +[Graphics error] +Failed to swap framebuffers. Try to update your GPU drivers. +== Помилка зміни буферів кадру. Спробуйте оновити драйвери відеокарти. -Kick player -== Викинути гравця +Fat skins (DDFat) +== Товсті скіни (DDFat) -Move player to spectators -== Перемістити гравця до глядачів +Favorite +== Улюблений -Vote description: -== Опис голосування +Favorites +== Улюблені -Vote command: -== Команда голосування +Feet +== Ноги -Add -== Додати +Fetch Info +== Зчитувати все -Reload -== Перезавантажити +File '%s' already exists, do you want to overwrite it? +== Файл '%s' вже існує, бажаєте перезаписати його? -Deactivate -== Вимкнути +File already exists, do you want to overwrite it? +== Файл уже існує, бажаєте перезаписати його? -Activate -== Увімкнути +Filter connecting players +== Не врах. тих, що приєднуються -Save -== Зберегти +Fire +== Вогонь -Switch weapon when out of ammo -== Змінювати зброю коли закінчились боєприпаси +Folder +== Тека -Show only chat messages from friends -== Показувати повідомлення тільки від друзів +Folder Link +== Ярлик теки -Name plates size -== Розмір ніків +Follow +== Слідування -Use team colors for name plates -== Розфарбовувати ім'я гравця кольором команди +Following +== Слідування -Show clan above name plates -== Показувати клан над ніком +Force vote +== Форсувати -Clan plates size -== Розмір панелі клану +FPM +== У/хв -Client -== Клієнт +Frags +== У -Automatically record demos -== Автоматично записувати демо +Free-View +== Вільна камера -Automatically take game over screenshot -== Автоматично робити знімок результатів гри +Freeze Laser Inner Color +== Колір заморожуючого лазера -Max demos -== Максимальна кількість демо +Freeze Laser Outline Color +== Колір контуру заморожуючого лазера -Max Screenshots -== Максимальна кількість скріншотів +Friend message +== Повідомлення друга -Refresh Rate -== Частота оновлення +Friends +== Друзі -Automatically take statboard screenshot -== Автоматично робити знімок результатів +FSAA samples +== Вибірка FSAA -Automatically create statboard csv -== Автоматично створювати статистику csv +Fullscreen +== Повноекранний -Max CSVs -== Максимум CSV +Game +== Гра -Vanilla skins only -== Тільки базові скіни +Game info +== Інформація про гру -Fat skins (DDFat) -== Товсті скіни (DDFat) +Game over +== Кінець гри -Skin prefix -== Префікс скіну +Game paused +== Гру призупинено -Hook collisions -== Колізії гака +Game sound volume +== Гучність ігрових звуків -Pause -== Пауза +Game type +== Тип гри -Kill -== Самогубство +Game types: +== Типи гри: -Zoom in -== Приблизити камеру +Gameplay +== Ігролад -Zoom out -== Віддалити камеру +General +== Загальне -Default zoom -== Стандартний масштаб +Getting game info +== Отримуємо інформацію про гру -Show others -== Показувати інших +Getting server list from master server +== Отримуємо список серверів з головного сервера -Show all -== Показувати все +Ghost +== Привид -Toggle dyncam -== Включити динамічну камеру +Ghosts directory +== Тека привидів -Toggle dummy -== Переключити даммі +Go back one marker +== Перемотати до попередньої мітки -Toggle ghost -== Переключити тінь +Go back one tick +== Перемотати вперед на один тік -Dummy copy -== Повторення рухів даммі +Go back the specified duration +== Перемотати назад -Hammerfly dummy -== Політ з даммі +Go forward one marker +== Перемотати до наступної мітки -Converse -== Розмовляти +Go forward one tick +== Перемотати назад на один тік -Spectator mode -== Режим спостерігача +Go forward the specified duration +== Перемотати вперед -Spectate next -== Спостерігати за наcтупним +Grabs +== З -Spectate previous -== Спостерігати за попереднім +Graphics +== Графіка -Statboard -== Статистика +Graphics card +== Відеокарта -Lock team -== Закрити команду +Grenade +== Гранатомет -Show entities -== Показувати текстури +Hammer +== Молот -Show HUD -== Показувати HUD +Hammerfly dummy +== Гаммерфлай -may cause delay -== може спричинити затримку +Has people playing +== Має гравців -Screen -== Екран +High Detail +== Висока деталізація -Use high DPI -== Використовувати високий DPI +Highlight Color +== Колір виділених повідомлень -Play background music -== Запускати фонову музику +Highlighted message +== Виділене повідомлення -Enable game sounds -== Включити звуки гри +Hook +== Гак -Enable gun sound -== Включити звуки зброї +Hook Collisions +== Зіткнення гака -Enable long pain sound (used when shooting in freeze) -== Включити звук тривалого болю (при стрільбі в фрізі) +Hook collision line +== Лінія зіткнення гака -Enable server message sound -== Включити звуки повідомлення сервера +Hook collision line opacity +== Непрозорість лінії зіткнення гака -Enable regular chat sound -== Включити звуки чату +Hook collision line width +== Товщина лінії зіткнення гака -Enable team chat sound -== Включити звуки повідомлень в команді +Hook collisions +== Зіткнення гака -Enable highlighted chat sound -== Включити звуки виділених повідомлень +https://ddnet.org/discord +== https://ddnet.org/discord -Map sound volume -== Гучність звуку на карті +https://wiki.ddnet.org/ +== https://wiki.ddnet.org/ HUD == HUD -DDNet -== DDNet +Hue +== Тон -DDNet Client needs to be restarted to complete update! -== Перезапустіть DDNet для активації оновлення! +Indicate map finish +== Позначати пройдені мапи -Use DDRace Scoreboard -== Використовувати DDRace табло +Info Messages +== Інфо-повідомлення -Show score -== Показувати очки +Ingame controller mode +== Режим контролера у грі -Show names in chat in team colors -== Виділяти кольором повідомлення гравців в командному чаті +Ingame controller sens. +== Чутл. у грі -Show kill messages -== Показувати список вбивств +Ingame mouse sens. +== Чутл. у грі -Show votes window after voting -== Відображати вікно голосування після вашого голосу +Initializing assets +== Ініціалізуємо текстури -Messages -== Повідомлення +Initializing components +== Ініціалізуємо компоненти -System message -== Системне повідомлення +Initializing map logic +== Ініціалізуємо логіку мапи -Reset -== Скинути +Internet +== Інтернет -Highlighted message -== Виділене повідомлення +Invalid Demo +== Недійсне демо -Team message -== Повідомлення команди +It's recommended that you check the settings to adjust them to your liking before joining a server. +== Перед тим як приєднатися до сервера, рекомендуємо змінити налаштування до ваших уподобань. -Friend message -== Повідомлення від друга +Join blue +== До синіх -Normal message -== Звичайне повідомлення +Join game +== Приєднатися -Client message -== Повідомлення від клієнта +Join red +== До червоних -Save the best demo of each race -== Зберігати краще демо кожної гонки +Join Tutorial Server +== Приєднатися до сервера-посібника -Default length -== Стандартна довжина +Jump +== Стрибок -Enable replays -== Включити повтори +Kick player +== Вигнати гравця -Show ghost -== Показати тінь +Kill +== Смерть -Save ghost -== Зберігати тінь +LAN +== Локальна мережа -Gameplay -== Ігровий процес +Language +== Мова -Overlay entities -== Накласти текстури +Laser +== Лазер -Size -== Розмір +Leak IP +== Витік IP -Show text entities -== Текстові текстури +Learn +== Вікі -Show others (own team only) -== Показати інших гравців (Лише для комманди) +Length +== Тривалість -Show quads -== Показувати quads +Lht. +== Світл. -AntiPing -== Антипінг +Lines %d - %d (%s) +== Рядки %d—%d (%s) -AntiPing: predict other players -== Антипінг: прогнозувати інших гравців +Loading… +== Завантаження… -AntiPing: predict weapons -== Антипінг: прогнозувати снаряди +Loading assets +== Завантажуємо текстури -AntiPing: predict grenade paths -== Антипінг: прогнозувати шляхи гранат +Loading commands… +== Завантажуємо команди… -Show other players' hook collision lines -== Показувати лінії колізій гака інших гравців +Loading DDNet Client +== Завантажуємо клієнт DDNet -Show other players' key presses -== Показувати натискання кнопок інших гравців +Loading demo file from storage +== Завантажуємо демо-файл зі сховища -Show tiles layers from BG map -== Показувати шари з тайлами з фонової карти +Loading demo files +== Завантажуємо демо-файли -DDNet %s is available: -== Доступний новий DDNet %s: +Loading ghost files +== Завантажуємо файли привида + +Loading map file from storage +== Завантажуємо файл мапи зі сховища + +Loading menu images +== Завантажуємо зображення меню + +Loading menu themes +== Завантажуємо теми меню -Updating… -== Оновлення… +Loading race demo files +== Завантажуємо демо-файли забігів -No updates available -== Немає доступних оновлень +Loading skin files +== Завантажуємо файли скінів -Check now -== Перевірити зараз +Loading sound files +== Завантажуємо звукові файли -New random timeout code -== Новий випадковий тайм-аут код +Lock team +== Замкнути команду -Time -== Час +Locked +== Заблоковано -%s wins! -== %s переміг! +Main menu +== Головне меню -Follow -== Стежити +Manual +== Вручну -Frags -== Вбивств +Map +== Мапа -Deaths -== Смертей +[Demo details] +map not included +== мапу не включено -Suicides -== Самогубств +Map sound volume +== Гучність мапи -Ratio -== Співвідношення +Mark the beginning of a cut (right click to reset) +== Позначити початок фрагмента (права кнопка миші, щоб скинути) -Net -== Мережа +Mark the end of a cut (right click to reset) +== Позначити кінець фрагмента (права кнопка миші, щоб скинути) -FPM -== FPM +Markers +== Мітки -Spree -== Спрей +Match %d of %d +== Збіг %d з %d -Best -== Найкраще +Max CSVs +== Найбільше CSV-файлів -Grabs -== Захоплень +Max demos +== Найбільше демо-файлів -1 new mention -== 1 нове згадування +Max Screenshots +== Найбільше знімків екрана -%d new mentions -== %d нових згадувань +may cause delay +== може спричинити затримку -9+ new mentions -== 9+ нових згадувань +Menu opened. Press Esc key again to close menu. +== Відкрито меню. Натисніть Esc, щоб його закрити. -Manual -== Ручна +Messages +== Повідомлення -Race -== Гонка +Miscellaneous +== Різне -Auto -== Авто +MOTD +== Повідомлення дня -Replay -== Повтор +Mouse +== Миша -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Ширина або висота текстури %s не ділиться на %d, що може викликати візуальні помилки. +Move left +== Вліво -Warning -== Небезпека +Move player to spectators +== Зробити гравця спостерігачем -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Включений режим відлагодження. Натисніть Ctrl+Shift+D щоб виключити його. +Move right +== Вправо -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Натисніть k для самогубства,q щоб зупинитись і спостерігати за іншими. Дивіться в налаштуваннях для інших налаштувань. +Moved ingame +== Рух у грі -Existing Player -== Існуючий гравець +Movement +== Рух -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Твій нік %s уже хтось використовує (%d очків ). Ти всеодно хочеш його взяти? +Multi-View +== Мульти-камера -Checking for existing player with your name -== Провіряється наявність гравців з твоїм ніком +Mute when not active +== Приглушувати, якщо вікно неактивне -Are you sure that you want to disconnect and switch to a different server? -== Ти впевнений що хочеш відключитися і перейти до іншого серверу? +NA +== ПНА -Speed -== Швидкість +Name +== Нік -Theme -== Тема +Name Plate +== Ніки -AFR -== АФР +Name plates size +== Розмір ніків -ASI -== Азія +Net +== Різн. -AUS -== Австралія +Netversion +== Версія -EUR -== Європа +New name: +== Нова назва -NA -== Пн.Амер. +New random timeout code +== Новий випадковий код тайм-ауту -SA -== Пв.Амер. +News +== Новини -CHN -== Китай +Next weapon +== Наст. зброя -Getting server list from master server -== Отримання списку серверів з головного сервера +Nickname +== Нікнейм -%d of %d servers -== %d З %d серверів +No +== Ні -%d of %d server -== %d З %d сервера +No answer from server yet. +== Сервер ще не відповів. -%d players -== %d Гравців +No controller found. Plug in a controller. +== Жодного контролера не знайдено. Підключіть контролер. -%d player -== %d Гравець +No demo selected +== Жодного демо не вибрано -Leak IP -== Розголошувати IP +No login required +== Без логіна -Markers -== Марки +No password +== Без пароля -Demos directory -== Каталог демо +No results +== Немає результатів -Smooth Dynamic Camera -== Гладка динамічна камера +No server selected +== Жодного сервера не вибрано -Skip the main menu -== Пропускати головне меню +No servers found +== Не знайдено жодного сервера -Themes directory -== Каталог тем +No servers match your filter criteria +== Немає серверів, що відповідають вашим критеріям -Download skins -== Завантажувати скіни інших +No updates available +== Немає доступних оновлень -Skin Database -== Бази даних скінів +None +== Немає -Skins directory -== Каталог скінів +Normal Color +== Колір звичайних повідомлень -Chat command -== Чат для команд +Normal message +== Звичайні повідомлення -Dummy -== Даммі +NOT CONNECTED +== НЕ ПРИЄДНАНО -Windowed -== Віконний +Nothing hookable +== нічим, за що можна зачепитися -Windowed borderless -== Віконний без рамок +[friends (server browser)] +Offline (%d) +== Офлайн (%d) -Desktop fullscreen -== Повний робочий стіл +Ok +== Гаразд -Game sound volume -== Гучність звуку гри +Online clanmates (%d) +== Онлайн клановці (%d) -Chat sound volume -== Гучність звуку чату +Online players (%d) +== Онлайн гравці (%d) -Background music volume -== Гучність музики заднього фону +Only save improvements +== Зберігати лише покращення -Assets -== Текстури +Opacity +== Непрозор. -Use old chat style -== Використовувати стиль старого чату +Opacity of freeze bars inside freeze +== Непрозорість смуги заморозки в заморозці -Preview -== Попередній перегляд +Open the directory that contains the configuration and user files +== Відкрити теку яка містить файли налаштувань і користувацькі файли -Show local player's key presses -== Показувати рухи гравців поблизу +Open the directory that contains the demo files +== Відкрити теку, в якій зберігаються демо-файли -Background -== Задній фон +Open the directory to add custom assets +== Відкрити теку текстур, щоб додати власні -Use current map as background -== Використовувати поточну карту як задній фон +Open the directory to add custom skins +== Відкрити теку скінів, щоб додати власні -Entities -== Текстури +Open the directory to add custom themes +== Відкрити теку тем, щоб додати власні -Emoticons -== Емоції +Open the settings file +== Відкрити файл налаштувань -Particles -== Частинки +[Graphics error] +Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. +== Недостатньо відеопам'яті. Спробуйте видалити власні текстури (скіни, сутності і т.п.), особливо ті, що мають високу роздільну здатність. -Assets directory -== Каталог текстур +Overlay entities +== Накладати сутності -Discord -== Діскорд +Parent Folder +== Батьківська тека -https://ddnet.org/discord -== https://ddnet.org/discord +Particles +== Часточки -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ +Pause +== Пауза -Website -== Вебсайт +Pause the current demo +== Призупинити -Settings -== Налаштування +Password +== Пароль -Stop server -== Зупинити сервер +Password incorrect +== Неправильний пароль -Run server -== Запустити сервер +Personal best: +== Власний рекорд: -Server executable not found, can't run server -== Виконуваний файл сервера не знайдено, неможливо запустити +Ping +== Пінг -Editor -== Редактор +Pistol +== Пістолет [Start menu] Play == Грати -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Помилка під час ініціалізації. Спробуйте змінити gfx_backend на OpenGL або Vulkan у settings_ddnet.cfg в каталозі config і спробуйте ще раз. +Play background music +== Фонова музика -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Не вистачає Відеопам'яті(VRAM). Спробуйте видалити користувацькі ресурси (скіни, ентіти тощо), особоливо ті, які мають високу роздільну здатність. +Play the current demo +== Відтворити -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Виникла помилка під час запису команди. Спробуйте оновити драйвери вашої відеокарти(GPU). +Player +== Гравець -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Не вдалося виконати команду рендеру, спробуйте оновити драйвери вашої відеокарти(GPU). +Player country: +== Має гравця з: -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Під час подання команди рендеру відбудаля помилка, спробуйте оновити драйвери вашої відеокарти(GPU). +Player info change cooldown +== Затримка зміни інформації про гравця -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Помилка під час обміну фрейм-буферу. Cпробуйте оновити драйвери вашої відеокарти(GPU). +Player options +== Налаштування гравців -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Невідома помилка. Спробуйте змінити gfx_backend на OpenGL або Vulkan у settings_ddnet.cfg в каталозі config і спробуйте ще раз. +Players +== Гравці -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Не вдалося ініціалізувати заданий графічний бекенд, повердаємося до бекенду за замовчуванням. +Please balance teams! +== Будь ласка, збалансуйте команди! -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Не вдалося ініціалізувати заданий графічний бекенд, ймовірно, пов'язано з тим, що ви не встановили драйвер інтегрованої відеокарти. +Please enter your nickname below. +== Будь ласка, введіть нікнейм нижче. -Could not save downloaded map. Try manually deleting this file: %s -== Не вдалося зберегти завантажену карту. Спробуйте видалити цей файл вручну: %s +Please use a different filename +== Будь ласка, назвіть файл по-іншому -The format of texture %s is not RGBA which will cause visual bugs. -== Заданий формат текстури не є RGBA, що може викликати візуальні помилки +Position: +== Позиція: Preparing demo playback -== Підготовка демо-відтворення +== Підготовлюємо відтворення демо -Connected -== З'єднано +Press a key… +== Натисніть клавішу… -Loading map file from storage -== Завантаження файлу карти з бази даних +Prev. weapon +== Попер. зброя + +Preview +== Передперегляд + +Quads are used for background decoration +== Квади використовуються для декорацій + +Quit +== Вихід + +Quitting. Please wait… +== Вихід. Будь ласка, зачекайте… + +Race +== Забіг + +Ratio +== У/С + +Reason: +== Причина: -Why are you slowmo replaying to read this? -== Чому ти уповільнюєш реплей? Хочеш це прочитати?:) +Reconnect in %d sec +== Переприєднання через %dс -Initializing components -== Ініціалізація компонентів +Record demo +== Запис демо -Initializing assets -== Ініціалізація ресурсів +Red team +== Червоні -Initializing map logic -== Ініціалізація логіки карти +Red team wins! +== Червоні перемогли! -Sending initial client info -== Надсилання початкової інформації про клієнт +Refresh Rate +== Частота кадрів -Position: -== Позиція: +Regular background color +== Колір звичайного фону -Speed: -== Швидкість: +[Ingame controller mode] +Relative +== Відносний -Angle: -== Кут: +Reload +== Оновити -Team %d -== Команда %d +Remote console +== Віддалена консоль -Uploading map data to GPU -== Завантаження даних карти на GPU +Remove +== Прибрати -Trying to determine UDP connectivity… -== Намагаємося визначити UDP-підключення… +Remove chat +== Прибрати чат -UDP seems to be filtered. -== Зачекайте, фільтрація UDP +Remove friend +== Прибрати друга -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Здається, що IP-адреси UDP і TCP відрізняються. Спробуйте вимкнути VPN, проксі або мережеві прискорювачі. +Rename demo +== Перейменувати демо -No answer from server yet. -== Сервер ще не відповів… +Rename folder +== Перейменувати теку -Getting game info -== Отримання ігрової інформації +Render complete +== Обробку завершено -Requesting to join the game -== Запит на приєднання до гри +Render cut to video +== Обробити фрагмент -Cancel -== Скасувати +Render demo +== Обробити демо -File '%s' already exists, do you want to overwrite it? -== Файл '%s' вже існує, чи хочете ви хочете його перезаписати? +Renderer +== Графічний рушій -Join Tutorial Server -== Приєднатись до серверу з навчальним курсом +Replace video +== Замінити відео -Skip Tutorial -== Пропустити навчальний курс +Replay +== Повтор -Loading menu images -== Завантаження зображень в меню +Replay feature is disabled! +== Повтори відключено! -Copy info -== Скопіювати інформацію +Requesting to join the game +== Запитуємо приєднання до гри -Online players (%d) -== Друзі онлайн (%d) +Reset +== Скинути -Online clanmates (%d) -== Товаришів по клану онлайн (%d) +Reset controls +== Скинути керування -[friends (server browser)] -Offline (%d) -== Не в мережі (%d) +Reset filter +== Скинути фільтр -Click to select server. Double click to join your friend. -== Натисніть, щоб вибрати сервер. Натисніть двічі, щоб приєднатися до друга +Reset to defaults +== Скинути -Click to remove this player from your friends list. -== Натисніть, щоб видалити цього гравця зі списку друзів. +Restart +== Перезапустити -Click to remove this clan from your friends list. -== Натисніть, щоб видалити цей клан зі свого списку. +Restarting. Please wait… +== Перезапуск. Будь ласка, зачекайте… -None -== Нічого +Rifle Laser Inner Color +== Колір лазера гвинтівки -Are you sure that you want to remove the player '%s' from your friends list? -== Ви дійсно хочете видалити '%s' зі свого списку друзів? +Rifle Laser Outline Color +== Колір контуру лазера гвинтівки -Are you sure that you want to remove the clan '%s' from your friends list? -== Ви дійсно хочете видалити клан '%s' зі свого списку друзів? +Round +== Раунд -Add Clan -== Додати клан +Run on join +== Запускати при приєднанні -Play the current demo -== Відтворити поточне демо +Run server +== Запустити сервер -Pause the current demo -== Призупинити поточне демо +SA +== ПДА -Stop the current demo -== Зупинити поточне демо +Same clan color in scoreboard +== Колір співклановців у таблі -Go back one tick -== Повернутися на один крок назад +Sat. +== Насич. -Go forward one tick -== Перейти на один крок вперед +Save +== Зберегти -Slow down the demo -== Уповільнити демо +Save ghost +== Зберігати привида -Speed up the demo -== Прискорити димо +Save power by lowering refresh rate (higher input latency) +== Зберігати енергію зниженням частоти кадрів (вища затримка вводу) -Export cut as a separate demo -== Експортувати виріз як окреме демо +Save the best demo of each race +== Зберігати найкраще демо кожного забігу -Go back one marker -== Повернутися на один маркер назад +Saving settings to '%s' failed +== Не вдалося зберегти налаштування до '%s' -Go forward one marker -== Перейти на один маркер вперед +Score +== Бали -Toggle keyboard shortcuts -== Перемикання комбінацій клавіш +Score limit +== Гра до -Loading demo files -== Завантаження демо-файлів +Scoreboard +== Табло -Open the directory that contains the demo files -== Відкрийте директорію, яка містить демо файли +Screen +== Екран -Are you sure that you want to delete the demo '%s'? -== Ви впевнені, що хочете видалити демо '%s'? +Screenshot +== Знімок екрана -Unable to delete the demo '%s' -== Не вдається видалити демо '%s' +Search +== Пошук -Loading ghost files -== Завантаження файлів привидів +Searching +== Шукаємо -Menu opened. Press Esc key again to close menu. -== Меню відкрито. Натисніть клавішу Esc ще раз, щоб закрити меню. +Sending initial client info +== Надсилаємо початкові дані клієнта -Save power by lowering refresh rate (higher input latency) -== Економія енергії за рахунок зниження частоти оновлення кадрів (більша затримка на вході) +Server address: +== Адреса сервера: -Settings file -== Файл налаштувань +Server best: +== Рекорд сервера: -Open the settings file -== Відкрити файл налаштувань +Server executable not found, can't run server +== Виконуваний файл сервера не знайдено, запустити сервер не вдалося -Config directory -== Каталог конфігурації +Server filter +== Фільтр серверів -Open the directory that contains the configuration and user files -== Відкрити каталог, який містить конфігураційні та користувацькі файли +Server info +== Інформація -Open the directory to add custom themes -== Відкрити каталог, щоб додати власні фони +Server not full +== Неповний сервер -Loading skin files -== Завантаження файлів скінів +Set all to Rifle +== Встановити так, як у гвинтівки -Download community skins -== Завантажити скіни спільноти +Settings +== Налаштування -Choose default eyes when joining a server -== Вибір очей за замовчуванням під час приєднання до сервера +Settings file +== Файл налаштувань -Create a random skin -== Створити випадковий скін +Shotgun +== Рушниця -Open the directory to add custom skins -== Відкрити каталог для додавання користувацьких скінів +Shotgun Laser Inner Color +== Колір лазера рушниці -Enable controller -== Увімкнути контролер +Shotgun Laser Outline Color +== Колір контуру лазера рушниці -[Ingame controller mode] -Relative -== Relative +Show all +== Показувати всіх -[Ingame controller mode] -Absolute -== Absolute +Show chat +== Показувати чат -Ingame controller mode -== Режим контролера в грі +Show clan above name plates +== Показувати клан над ніками -Ingame controller sens. -== Чутливість контролера в грі +Show client IDs in scoreboard +== Показувати ID клієнта в таблі -UI controller sens. -== Чутливість контролера в меню +Show DDNet map finishes in server browser +== Показувати пройдені мапи DDNet у браузері серверів -Controller jitter tolerance -== Чутливість до вібрації контролера +Show DDRace HUD +== Показувати HUD DDRace -No controller found. Plug in a controller. -== Контролер не знайдено. Підключіть контролер. +Show dummy actions +== Показувати дії з даммі -Status -== Стан +Show entities +== Сутності -Aim bind -== Прив'язка до цілі +Show finish messages +== Показувати повідомлення про фініші -Mouse -== Мишка +Show freeze bars +== Показувати смугу заморозки -Ingame mouse sens. -== Чутливість миші в грі +Show friend mark (♥) in name plates +== Показувати позначку друга (♥) біля ніків -UI mouse sens. -== Чутливість миші в меню +Show friends only +== Показувати лише з друзями -Controller -== Контролер +Show ghost +== Показувати привида -Reset controls -== Встановити контроль за замовчуванням +Show health, shields and ammo +== Показувати здоров'я, щити й набої -Are you sure that you want to reset the controls to their defaults? -== Ви впевнені, що хочете відновити налаштування за замовчуванням? +Show hook strength icon indicator +== Показувати графічний індикатор сили гака -Windowed fullscreen -== Повноекранний в вікні(без рамок) +Show hook strength number indicator +== Показувати числовий індикатор сили гака -Allows maps to render with more detail -== Дозволяє рендерити карти з більшою деталізацією +Show HUD +== Показувати HUD -Renderer -== Рендеринг +Show ingame HUD +== Показувати HUD -default -== за замовчуванням +Show jumps indicator +== Показувати індикатор стрибків -custom -== користувацькі +Show kill messages +== Показувати повідомлення про вбивства -auto -== авто +Show local player's key presses +== Показувати власні натискання клавіш -Appearance -== Зовнішній вигляд +Show local time always +== Завжди показувати місцевий час -Name Plate -== Табличка з іменем +Show name plates +== Показувати ніки -Hook Collisions -== Колізія гака +Show names in chat in team colors +== Фарбувати ніки в чаті в кольори команд -Show health, shields and ammo -== Показувати здоров'я, щити та боєприпаси +Show only chat messages from friends +== Показувати лише повідомлення від друзів -DDRace HUD -== DDRace HUD +Show other players' hook collision lines +== Показувати лінії зіткнення гака інших гравців -Show client IDs in scoreboard -== Відображати ID гравців на табло +Show other players' key presses +== Показувати натискання клавіш інших гравців -Show DDRace HUD -== Показати DDRace HUD +Show others +== Показувати інших -Show jumps indicator -== Індикатор показових стрибків +Show others (own team only) +== Показувати інших (лише з власної команди) -Show dummy actions -== Показувати дії вашого даммі +Show own player's hook collision line +== Показувати власну лінію зіткнення гака Show player position -== Показати позицію гравця +== Показувати координати Show player speed -== Показати швидкість гравця +== Показувати швидкість Show player target angle -== Показати кут націлювання гравця - -Show freeze bars -== Показати індикатор фрізу - -Opacity of freeze bars inside freeze -== Непрозорість індикатора фрізу всередині фріза - -Hook collision line -== Лінія колізій гаків +== Показувати кут прицілювання -Hook collision line width -== Ширина лінії колізій гачків - -Hook collision line opacity -== Непрозорість лінії колізій гаків +Show score +== Показувати рахунок -Colors of the hook collision line, in case of a possible collision with: -== Кольори лінії колізій гака, в разі можливого зіткнення з: +Show text entities +== Текстові сутності -Your movements are not taken into account when calculating the line colors -== Ваші рухи не враховуються при розрахунку кольору лінії +Show tiles layers from BG map +== Показувати тайли з мапи фону -Nothing hookable -== Нічим, що можна було б зачепити +Show quads +== Показувати квади -Something hookable -== Чимось, що можна зачепити +Show votes window after voting +== Показувати голосування навіть після голосу -A Tee -== Tee +Size +== Розмір -Normal Color -== Звичайний колір +Skin Database +== Сховище скінів -Highlight Color -== Колір при смерті +Skin prefix +== Префікс скіна -Weapons -== Зброя +Skins directory +== Тека скінів -Rifle Laser Outline Color -== Колір лазера +Skip the main menu +== Пропускати головне меню -Rifle Laser Inner Color -== Колір обводки лазера +Skip Tutorial +== Пропустити посібник -Shotgun Laser Outline Color -== Колір лазера дробовика +Slow down the demo +== Сповільнити -Shotgun Laser Inner Color -== Колір обводки лазера дробовика +Smooth Dynamic Camera +== Гладка рухома камера -Door Laser Outline Color -== Колір лазера-дверей +Some map images could not be loaded. Check the local console for details. +== Деякі зображення мапи не завантажилися. Деталі у локальній консолі. -Door Laser Inner Color -== Колір обводки лазера-дверей +Some map sounds could not be loaded. Check the local console for details. +== Деякі звуки мапи не завантажилися. Деталі у локальній консолі. -Freeze Laser Outline Color -== Колір фріз-лазера +Something hookable +== чимось, за що можна зачепитися -Freeze Laser Inner Color -== Колір обводки фріз-лазера +Sound +== Звук -Set all to Rifle -== Всі кольори на колір лезера +Sound error +== Помилка звуку -When you cross the start line, show a ghost tee replicating the movements of your best time -== При перетинанні лінію старту, відображати tee-привида, який буде повторювати рухи вашого найкращого часу +Sound volume +== Гучність -Opacity -== Непрозорість +Spectate +== Спостерігати -Adjust the opacity of entities belonging to other teams, such as tees and nameplates -== Налаштування непрозорості об'єктів, що належать іншим командам, таких як tee та її імена +Spectate next +== Наст. гравець -Quads are used for background decoration -== Квади, яки використовуються для декорування фону +Spectate previous +== Попер. гравець -Tries to predict other entities to give a feel of low latency -== Намагається передбачити інші об'єкти, щоб створити відчуття низької затримки +Spectator mode +== Режим спостерігача -Run on join -== Виконати команду при підключенні до серверу +Spectators +== Спостерігачі -Chat command (e.g. showall 1) -== Команда чату (наприклад, /say hi) +Speed +== Швидкість -Unregister protocol and file extensions -== Скасувати реєстрацію протоколів та розширень файлів +Speed up the demo +== Пришвидшити -Extras -== Додаткові +Speed: +== Швидкість: -Loading assets -== Завантаження ресурсів +Spree +== Комбо -Open the directory to add custom assets -== Відкрити каталог, щоб додати власні ресурси +Statboard +== Статистика -Tutorial -== Туторіал +Status +== Статус -Can't find a Tutorial server -== Не можемо знайти сервер з туторіалом +Stop record +== Зупинити запис -Loading race demo files -== Завантаження демо-файлів рейсу +Stop server +== Зупинити сервер -Super -== Супер +Stop the current demo +== Зупинити -Loading sound files -== Завантаження звукових файлів +Strict gametype filter +== Жорсткий фільтр типів гри -Quitting. Please wait… -== Припинення гри. Зачекайте будь ласка… +[Graphics error] +Submitting the render commands failed. Try to update your GPU drivers. +== Помилка у відправці команд відмальовування. Спробуйте оновити драйвери відеокарти. -Restarting. Please wait… -== Перезавантаження. Зачекайте будь ласка… +Successfully saved the replay! +== Повтор успішно збережено! -Multi-View -== Дінамічний перегляд +Sudden Death +== Раптова смерть -Rename folder -== Перейменувати папку +Suicides +== СГ -A demo with this name already exists -== Демо з такою назвою вже існує +Super +== Супер -A folder with this name already exists -== Папка з такою назвою вже існує +Switch weapon on pickup +== Змінювати зброю при підхопленні -Unable to rename the folder -== Неможливо перейменувати папку +Switch weapon when out of ammo +== Змінювати зброю коли закінчуються набої -(paused) -== (пауза) +System message +== Повідомлення системи -No server selected -== Жоден сервер не вибрано +Team +== Команда -Mark the beginning of a cut (right click to reset) -== Позначте початок відрізка (натисніть праву кнопку миші, щоб скинути позначку) +Team %d +== Команда -Mark the end of a cut (right click to reset) -== Позначте кінець відрізка (натисніть праву кнопку миші, щоб скинути позначку) +Team chat +== Чат команди -Close the demo player -== Закрити програвач демо +Team message +== Повідомлення команди -Export demo cut -== Експорт відрізку з демо +Tee +== Тії -Cut interval -== Інтервал відрізка +The audio device couldn't be initialised. +== Не вдалося ініціалізувати звуковий пристрій. -Cut length -== Довжина відрізкa +The format of texture %s is not RGBA which will cause visual bugs. +== Формат текстури %s — не RGBA, що спричинить візуальні дефекти. -All combined -== Все разом +The server is running a non-standard tuning on a pure game type. +== На сервері застосовані нестандартні налаштування ванільного типу гри. -Folder Link -== Посилання папки +The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. +== Ширина текстури %s не ділиться націло на %d, або її висота не ділиться націло на %d, що може спричинити візуальні дефекти. -Are you sure that you want to delete the folder '%s'? -== Ви впевнені, що хочете видалити папку '%s'? +Theme +== Тема -Delete folder -== Видалити папку +Themes directory +== Тека тем -Unable to delete the folder '%s'. Make sure it's empty first. -== Неможливо видалити папку '%s'. Спочатку переконайтеся, що вона порожня. +There's an unsaved map in the editor, you might want to save it. +== У редакторі є незбережена мапа, можливо ви бажаєте зберегти її. -Axis -== Вісь +Time +== Час -Graphics card -== Відеокарта +Time limit +== Обмеження по часу -Moved ingame -== Перемістився в грі +Time limit: %d min +== Обмеження по часу: %dхв -Go back the specified duration -== Повернутися на вказаний проміжок часу +Toggle dummy +== Перемкнути даммі -[Demo player duration] -%d min. -== %d хв. +Toggle dyncam +== Рухома камера -[Demo player duration] -%d sec. -== %d сек. +Toggle ghost +== Привид -Change the skip duration -== Змінити тривалість пропуску +Toggle keyboard shortcuts +== Перемкнути скорочення -Go forward the specified duration -== Перейти вперед на вказаний проміжок часу +transmits your player name to info.ddnet.org +== передає ваш нікнейм до info.ddnet.org -Render cut to video -== Відтворити вирізку відео +Tries to predict other entities to give a feel of low latency +== Намагається передбачувати інші сутності, щоб створити відчуття низької затримки -Error playing demo -== Помилка відтворення демо +Try again +== Спробувати ще раз -Some map images could not be loaded. Check the local console for details. -== Деякі зображення мапи не вдалося завантажити. Перевірте локальну консоль для отримання деталей. +Trying to determine UDP connectivity… +== Намагаємося визначити UDP-з'єднання… -Some map sounds could not be loaded. Check the local console for details. -== Деякі звуки мапи не вдалося завантажити. Перевірте локальну консоль для отримання деталей. +Tutorial +== Посібник -Loading menu themes -== Завантаження тем меню +Type +== Тип -Render complete -== Відтворення завершено +Types +== Типи -Videos directory -== Директорія відео +UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. +== Здається, адреси UDP й TCP IP відрізняються. Спробуйте вимкнути VPN, проксі чи прискорювачі мережі. -Video was saved to '%s' -== Відео було збережено в '%s' +UDP seems to be filtered. +== Здається, UDP фільтрується. -No demo selected -== Демо не обрано +UI Color +== Колір інтерфейсу -Created -== Створено +UI controller sens. +== Чутл. у інтерфейсі -Netversion -== Версія мережі +UI mouse sens. +== Чутл. у інтерфейсі -[Demo details] -map not included -== карта не включена +Unable to delete the demo '%s' +== Не вдалося видалити демо '%s' -Ghosts directory -== Директорія привидів +Unable to delete the folder '%s'. Make sure it's empty first. +== Не вдалося видалити теку '%s', тому що вона не пуста. -Activate all -== Активувати все +Unable to rename the demo +== Не вдалося перейменувати демо -Deactivate all -== Деактивувати все +Unable to rename the folder +== Не вдалося перейменувати теку -Enable ghost -== Увімкнути привида +Unfinished map +== Непройдені мапи -Only save improvements -== Зберігати лише поліпшення +[Graphics error] +Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. +== Невідома помилка. Спробуйте змінити gfx_backend на OpenGL чи Vulkan у settings_ddnet.cfg у теці налаштувань і спробуйте ще раз. -Regular background color -== Звичайний колір фону +Unregister protocol and file extensions +== Розреєструвати протокол і розширення файлів -Entities background color -== Колір фону об'єктів +Update failed! Check log… +== Оновлення не вдалося! Перевірте журнал… -Failed saving the replay! -== +Update now +== Оновити -Saving settings to '%s' failed -== +Updating… +== Оновлюємо… -Error saving settings -== +Uploading map data to GPU +== Вивантажуємо дані мапи до відеокарти -Loading demo file from storage -== +Use current map as background +== Використовувати поточну мапу як фон -Searching -== +Use DDRace Scoreboard +== Використовувати табло DDRace -Enter Username -== +Use high DPI +== Високий DPI -Enter Password -== +Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. +== Натисніть "k", щоб умерти (почати спочатку), "q", щоб спостерігати за іншими гравцями. Інші скорочення дивіться у налаштуваннях. -NOT CONNECTED -== +Use old chat style +== Старий стиль чату -Match %d of %d -== +Use sounds +== Звуки -No results -== +Use team colors for name plates +== Фарбувати ніки в кольори команд -Lines %d - %d (%s) -== +V-Sync +== V-Sync -Locked -== +Vanilla skins only +== Лише ванільні скіни -Following -== +Version +== Версія -Loading commands… -== +Video name: +== Назва відео: -Press a key… -== +Video was saved to '%s' +== Відео було збережено до '%s' -Main menu -== +Videos directory +== Тека відео -Are you sure that you want to restart? -== +Vote command: +== Команда голосування: -There's an unsaved map in the editor, you might want to save it. -== +Vote description: +== Опис голосування: -Continue anyway? -== +Vote no +== Проти -No login required -== +Vote yes +== За -Communities -== +Voting +== Голосування -Server filter -== +Warmup +== Розминка -Friends -== +Warning +== Увага! -Please use a different filename -== +Weapon +== Зброя -Loading… -== +Weapons +== Зброя -Player info change cooldown -== +Website +== Вебсайт -Info Messages -== +Welcome to DDNet +== Ласкаво просимо до DDNet -Show local time always -== +When you cross the start line, show a ghost tee replicating the movements of your best time +== Коли ви перетинаєте лінію старту, показувати привида, який повторює рухи вашого найкращого забігу -Always show chat -== +Why are you slowmo replaying to read this? +== Чому ви переглядаєте це у повторі? -Chat font size -== +Windowed +== Віконний -Chat width -== +Windowed borderless +== Віконний без рамок -Show friend mark (♥) in name plates -== +Windowed fullscreen +== Віконний повноекранний -Show hook strength icon indicator -== +Yes +== Так -Show hook strength number indicator -== +Your movements are not taken into account when calculating the line colors +== Ваші рухи не враховуються при розранку кольору лінії -Authed name color in scoreboard -== +You must restart the game for all settings to take effect. +== Щоб налаштування набрали чинності, перезапустіть гру. -Same clan color in scoreboard -== +Your nickname '%s' is already used (%d points). Do you still want to use it? +== Нікнейм '%s' вже зайнято (%d балів). Все ще хочете використовувати його? -Show own player's hook collision line -== +Your skin +== Ваш скін -Always show own player's hook collision line -== +Zoom in +== Наблизити -Always show other players' hook collision lines -== +Zoom out +== Віддалити -Show finish messages -== +##### needs translation ##### From e9d568db5b8f0531620c21ae6fe23952ee85b789 Mon Sep 17 00:00:00 2001 From: Learath Date: Wed, 5 Jun 2024 18:01:42 +0200 Subject: [PATCH 029/179] Fix console search highlighting. Close #8451 --- src/engine/client/text.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index 8c16fe2890c..b7c228221f8 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -1667,7 +1667,7 @@ class CTextRender : public IEngineTextRender while(pCurrent < pBatchEnd && pCurrent != pEllipsis) { - const int PrevCharCount = pCursor->m_GlyphCount; + const int PrevCharCount = pCursor->m_CharCount; pCursor->m_CharCount += pTmp - pCurrent; pCurrent = pTmp; int Character = NextCharacter; From 60f3b5fb551764ee5130d8c254b5fd18ed8b7cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Fri, 31 May 2024 21:41:06 +0200 Subject: [PATCH 030/179] Unify editor UI mouse handling with `CUi` Remove separate handling of UI mouse position and delta in the editor and use the UI directly for this like in the gameclient. Raw cursor movements are redirected to the UI with the `CUi::OnCursorMove` function. The editor separately updates its world positions and delta after the mouse position was changed. The mouse world position for the editor is passed to the UI with the `CUi::Update` funtion as before, whereas the world position is unused in the gameclient. Use `vec2`s for mouse positions and deltas instead of two separate floats. --- src/game/client/ui.cpp | 36 +++----- src/game/client/ui.h | 35 ++++---- src/game/client/ui_rect.cpp | 4 +- src/game/client/ui_rect.h | 6 +- src/game/editor/editor.cpp | 171 +++++++++++++++--------------------- src/game/editor/editor.h | 21 ++--- 6 files changed, 112 insertions(+), 161 deletions(-) diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index 8b9458c3f15..3fb5490d383 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -113,13 +113,6 @@ CUi::CUi() { m_Enabled = true; - m_MouseX = 0; - m_MouseY = 0; - m_MouseWorldX = 0; - m_MouseWorldY = 0; - m_MouseButtons = 0; - m_LastMouseButtons = 0; - m_Screen.x = 0.0f; m_Screen.y = 0.0f; } @@ -181,16 +174,7 @@ void CUi::OnCursorMove(float X, float Y) m_UpdatedMouseDelta += vec2(X, Y); } -void CUi::Update() -{ - const CUIRect *pScreen = Screen(); - const float MouseX = (m_UpdatedMousePos.x / (float)Graphics()->WindowWidth()) * pScreen->w; - const float MouseY = (m_UpdatedMousePos.y / (float)Graphics()->WindowHeight()) * pScreen->h; - Update(MouseX, MouseY, m_UpdatedMouseDelta.x, m_UpdatedMouseDelta.y, MouseX * 3.0f, MouseY * 3.0f); - m_UpdatedMouseDelta = vec2(0.0f, 0.0f); -} - -void CUi::Update(float MouseX, float MouseY, float MouseDeltaX, float MouseDeltaY, float MouseWorldX, float MouseWorldY) +void CUi::Update(vec2 MouseWorldPos) { unsigned MouseButtons = 0; if(Enabled()) @@ -203,14 +187,14 @@ void CUi::Update(float MouseX, float MouseY, float MouseDeltaX, float MouseDelta MouseButtons |= 4; } - m_MouseDeltaX = MouseDeltaX; - m_MouseDeltaY = MouseDeltaY; - m_MouseX = MouseX; - m_MouseY = MouseY; - m_MouseWorldX = MouseWorldX; - m_MouseWorldY = MouseWorldY; + const CUIRect *pScreen = Screen(); + m_MousePos = m_UpdatedMousePos * vec2(pScreen->w / Graphics()->WindowWidth(), pScreen->h / Graphics()->WindowHeight()); + m_MouseDelta = m_UpdatedMouseDelta; + m_UpdatedMouseDelta = vec2(0.0f, 0.0f); + m_MouseWorldPos = MouseWorldPos; m_LastMouseButtons = m_MouseButtons; m_MouseButtons = MouseButtons; + m_pHotItem = m_pBecomingHotItem; if(m_pActiveItem) m_pHotItem = m_pActiveItem; @@ -243,7 +227,7 @@ void CUi::DebugRender() bool CUi::MouseInside(const CUIRect *pRect) const { - return pRect->Inside(m_MouseX, m_MouseY); + return pRect->Inside(MousePos()); } void CUi::ConvertMouseMove(float *pX, float *pY, IInput::ECursorType CursorType) const @@ -524,9 +508,9 @@ EEditState CUi::DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, m_MouseSlow = true; if(pX) - *pX = clamp(m_MouseX - pRect->x, 0.0f, pRect->w); + *pX = clamp(MouseX() - pRect->x, 0.0f, pRect->w); if(pY) - *pY = clamp(m_MouseY - pRect->y, 0.0f, pRect->h); + *pY = clamp(MouseY() - pRect->y, 0.0f, pRect->h); return Res; } diff --git a/src/game/client/ui.h b/src/game/client/ui.h index 8560ef61fb9..9dbaec29548 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -331,13 +331,13 @@ class CUi const CScrollRegion *m_pBecomingHotScrollRegion = nullptr; bool m_ActiveItemValid = false; - vec2 m_UpdatedMousePos = vec2(0.0f, 0.0f); - vec2 m_UpdatedMouseDelta = vec2(0.0f, 0.0f); - float m_MouseX, m_MouseY; // in gui space - float m_MouseDeltaX, m_MouseDeltaY; // in gui space - float m_MouseWorldX, m_MouseWorldY; // in world space - unsigned m_MouseButtons; - unsigned m_LastMouseButtons; + vec2 m_UpdatedMousePos = vec2(0.0f, 0.0f); // in window screen space + vec2 m_UpdatedMouseDelta = vec2(0.0f, 0.0f); // in window screen space + vec2 m_MousePos = vec2(0.0f, 0.0f); // in gui space + vec2 m_MouseDelta = vec2(0.0f, 0.0f); // in gui space + vec2 m_MouseWorldPos = vec2(-1.0f, -1.0f); // in world space + unsigned m_MouseButtons = 0; + unsigned m_LastMouseButtons = 0; bool m_MouseSlow = false; bool m_MouseLock = false; const void *m_pMouseLockId = nullptr; @@ -423,17 +423,20 @@ class CUi void SetEnabled(bool Enabled) { m_Enabled = Enabled; } bool Enabled() const { return m_Enabled; } - void Update(); - void Update(float MouseX, float MouseY, float MouseDeltaX, float MouseDeltaY, float MouseWorldX, float MouseWorldY); + void Update(vec2 MouseWorldPos = vec2(-1.0f, -1.0f)); void DebugRender(); - float MouseDeltaX() const { return m_MouseDeltaX; } - float MouseDeltaY() const { return m_MouseDeltaY; } - float MouseX() const { return m_MouseX; } - float MouseY() const { return m_MouseY; } - vec2 MousePos() const { return vec2(m_MouseX, m_MouseY); } - float MouseWorldX() const { return m_MouseWorldX; } - float MouseWorldY() const { return m_MouseWorldY; } + vec2 MousePos() const { return m_MousePos; } + float MouseX() const { return m_MousePos.x; } + float MouseY() const { return m_MousePos.y; } + vec2 MouseDelta() const { return m_MouseDelta; } + float MouseDeltaX() const { return m_MouseDelta.x; } + float MouseDeltaY() const { return m_MouseDelta.y; } + vec2 MouseWorldPos() const { return m_MouseWorldPos; } + float MouseWorldX() const { return m_MouseWorldPos.x; } + float MouseWorldY() const { return m_MouseWorldPos.y; } + vec2 UpdatedMousePos() const { return m_UpdatedMousePos; } + vec2 UpdatedMouseDelta() const { return m_UpdatedMouseDelta; } int MouseButton(int Index) const { return (m_MouseButtons >> Index) & 1; } int MouseButtonClicked(int Index) const { return MouseButton(Index) && !((m_LastMouseButtons >> Index) & 1); } int MouseButtonReleased(int Index) const { return ((m_LastMouseButtons >> Index) & 1) && !MouseButton(Index); } diff --git a/src/game/client/ui_rect.cpp b/src/game/client/ui_rect.cpp index 435613229d3..347477ad2aa 100644 --- a/src/game/client/ui_rect.cpp +++ b/src/game/client/ui_rect.cpp @@ -161,9 +161,9 @@ void CUIRect::HMargin(float Cut, CUIRect *pOtherRect) const Margin(vec2(0.0f, Cut), pOtherRect); } -bool CUIRect::Inside(float PointX, float PointY) const +bool CUIRect::Inside(vec2 Point) const { - return PointX >= x && PointX < x + w && PointY >= y && PointY < y + h; + return Point.x >= x && Point.x < x + w && Point.y >= y && Point.y < y + h; } void CUIRect::Draw(ColorRGBA Color, int Corners, float Rounding) const diff --git a/src/game/client/ui_rect.h b/src/game/client/ui_rect.h index 9d155818808..54d7b178955 100644 --- a/src/game/client/ui_rect.h +++ b/src/game/client/ui_rect.h @@ -111,14 +111,14 @@ class CUIRect * @param pOtherRect The CUIRect to place inside *this* CUIRect */ void HMargin(float Cut, CUIRect *pOtherRect) const; + /** * Checks whether a point is inside *this* CUIRect. * - * @param PointX The point's X position. - * @param PointY The point's Y position. + * @param Point The point's position. * @return true iff the given point is inside *this* CUIRect. */ - bool Inside(float PointX, float PointY) const; + bool Inside(vec2 Point) const; /** * Fill background of *this* CUIRect. diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index f14cf5d7278..40e19692435 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -353,10 +353,7 @@ SEditResult CEditor::UiDoValueSelector(void *pId, CUIRect *pRect, const cha { if(Ui()->MouseButton(0)) { - if(Input()->ShiftIsPressed()) - s_Value += m_MouseDeltaX * 0.05f; - else - s_Value += m_MouseDeltaX; + s_Value += Ui()->MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); if(absolute(s_Value) >= Scale) { @@ -1412,8 +1409,8 @@ void CEditor::DoSoundSource(int LayerIndex, CSoundSource *pSource, int Index) float CenterX = fx2f(pSource->m_Position.x); float CenterY = fx2f(pSource->m_Position.y); - float dx = (CenterX - wx) / m_MouseWScale; - float dy = (CenterY - wy) / m_MouseWScale; + float dx = (CenterX - wx) / m_MouseWorldScale; + float dy = (CenterY - wy) / m_MouseWorldScale; if(dx * dx + dy * dy < 50) Ui()->SetHotItem(pId); @@ -1433,7 +1430,7 @@ void CEditor::DoSoundSource(int LayerIndex, CSoundSource *pSource, int Index) s_Tracker.Begin(pSource, s_Operation, LayerIndex); } - if(m_MouseDeltaWx * m_MouseDeltaWx + m_MouseDeltaWy * m_MouseDeltaWy > 0.0f) + if(m_MouseDeltaWorld != vec2(0.0f, 0.0f)) { if(s_Operation == ESoundSourceOp::OP_MOVE) { @@ -1499,7 +1496,7 @@ void CEditor::DoSoundSource(int LayerIndex, CSoundSource *pSource, int Index) Graphics()->SetColor(0, 1, 0, 1); } - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWScale, 5.0f * m_MouseWScale); + IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&QuadItem, 1); } @@ -1533,17 +1530,17 @@ void CEditor::DrawAxis(EAxis Axis, CPoint &OriginalPoint, CPoint &Point) const Graphics()->SetColor(1, 0, 0.1f, 1); if(Axis == EAxis::AXIS_X) { - IGraphics::CQuadItem Line(fx2f(OriginalPoint.x + Point.x) / 2.0f, fx2f(OriginalPoint.y), fx2f(Point.x - OriginalPoint.x), 1.0f * m_MouseWScale); + IGraphics::CQuadItem Line(fx2f(OriginalPoint.x + Point.x) / 2.0f, fx2f(OriginalPoint.y), fx2f(Point.x - OriginalPoint.x), 1.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&Line, 1); } else if(Axis == EAxis::AXIS_Y) { - IGraphics::CQuadItem Line(fx2f(OriginalPoint.x), fx2f(OriginalPoint.y + Point.y) / 2.0f, 1.0f * m_MouseWScale, fx2f(Point.y - OriginalPoint.y)); + IGraphics::CQuadItem Line(fx2f(OriginalPoint.x), fx2f(OriginalPoint.y + Point.y) / 2.0f, 1.0f * m_MouseWorldScale, fx2f(Point.y - OriginalPoint.y)); Graphics()->QuadsDraw(&Line, 1); } // Draw ghost of original point - IGraphics::CQuadItem QuadItem(fx2f(OriginalPoint.x), fx2f(OriginalPoint.y), 5.0f * m_MouseWScale, 5.0f * m_MouseWScale); + IGraphics::CQuadItem QuadItem(fx2f(OriginalPoint.x), fx2f(OriginalPoint.y), 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&QuadItem, 1); } @@ -1557,7 +1554,7 @@ void CEditor::ComputePointAlignments(const std::shared_ptr &pLayer, bool GridEnabled = MapView()->MapGrid()->IsEnabled() && !Input()->AltIsPressed(); // Perform computation from the original position of this point - int Threshold = f2fx(maximum(5.0f, 10.0f * m_MouseWScale)); + int Threshold = f2fx(maximum(5.0f, 10.0f * m_MouseWorldScale)); CPoint OrigPoint = m_QuadDragOriginalPoints.at(QuadIndex)[PointIndex]; // Get the "current" point by applying the offset CPoint Point = OrigPoint + ivec2(OffsetX, OffsetY); @@ -1742,7 +1739,7 @@ void CEditor::ComputeAABBAlignments(const std::shared_ptr &pLayer, // This method is a bit different than the point alignment in the way where instead of trying to aling 1 point to all quads, // we try to align 5 points to all quads, these 5 points being 5 points of an AABB. // Otherwise, the concept is the same, we use the original position of the AABB to make the computations. - int Threshold = f2fx(maximum(5.0f, 10.0f * m_MouseWScale)); + int Threshold = f2fx(maximum(5.0f, 10.0f * m_MouseWorldScale)); int SmallestDiffX = Threshold + 1, SmallestDiffY = Threshold + 1; std::vector vAlignmentsX, vAlignmentsY; @@ -1858,12 +1855,12 @@ void CEditor::DrawPointAlignments(const std::vector &vAlignments // We don't use IGraphics::CLineItem to draw because we don't want to stop QuadsBegin(), quads work just fine. if(Alignment.m_Axis == EAxis::AXIS_X) { // Alignment on X axis is same Y values but different X values - IGraphics::CQuadItem Line(fx2f(Alignment.m_AlignedPoint.x), fx2f(Alignment.m_AlignedPoint.y), fx2f(Alignment.m_X + OffsetX - Alignment.m_AlignedPoint.x), 1.0f * m_MouseWScale); + IGraphics::CQuadItem Line(fx2f(Alignment.m_AlignedPoint.x), fx2f(Alignment.m_AlignedPoint.y), fx2f(Alignment.m_X + OffsetX - Alignment.m_AlignedPoint.x), 1.0f * m_MouseWorldScale); Graphics()->QuadsDrawTL(&Line, 1); } else if(Alignment.m_Axis == EAxis::AXIS_Y) { // Alignment on Y axis is same X values but different Y values - IGraphics::CQuadItem Line(fx2f(Alignment.m_AlignedPoint.x), fx2f(Alignment.m_AlignedPoint.y), 1.0f * m_MouseWScale, fx2f(Alignment.m_Y + OffsetY - Alignment.m_AlignedPoint.y)); + IGraphics::CQuadItem Line(fx2f(Alignment.m_AlignedPoint.x), fx2f(Alignment.m_AlignedPoint.y), 1.0f * m_MouseWorldScale, fx2f(Alignment.m_Y + OffsetY - Alignment.m_AlignedPoint.y)); Graphics()->QuadsDrawTL(&Line, 1); } } @@ -1881,15 +1878,15 @@ void CEditor::DrawAABB(const SAxisAlignedBoundingBox &AABB, int OffsetX, int Off // We don't use IGraphics::CLineItem to draw because we don't want to stop QuadsBegin(), quads work just fine. IGraphics::CQuadItem Lines[4] = { - {TL.x, TL.y, TR.x - TL.x, 1.0f * m_MouseWScale}, - {TL.x, TL.y, 1.0f * m_MouseWScale, BL.y - TL.y}, - {TR.x, TR.y, 1.0f * m_MouseWScale, BR.y - TR.y}, - {BL.x, BL.y, BR.x - BL.x, 1.0f * m_MouseWScale}, + {TL.x, TL.y, TR.x - TL.x, 1.0f * m_MouseWorldScale}, + {TL.x, TL.y, 1.0f * m_MouseWorldScale, BL.y - TL.y}, + {TR.x, TR.y, 1.0f * m_MouseWorldScale, BR.y - TR.y}, + {BL.x, BL.y, BR.x - BL.x, 1.0f * m_MouseWorldScale}, }; Graphics()->SetColor(1, 0, 1, 1); Graphics()->QuadsDrawTL(Lines, 4); - IGraphics::CQuadItem CenterQuad(Center.x, Center.y, 5.0f * m_MouseWScale, 5.0f * m_MouseWScale); + IGraphics::CQuadItem CenterQuad(Center.x, Center.y, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&CenterQuad, 1); } @@ -2018,13 +2015,13 @@ void CEditor::DoQuad(int LayerIndex, const std::shared_ptr &pLayer, if(IsQuadSelected(Index)) { Graphics()->SetColor(0, 0, 0, 1); - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 7.0f * m_MouseWScale, 7.0f * m_MouseWScale); + IGraphics::CQuadItem QuadItem(CenterX, CenterY, 7.0f * m_MouseWorldScale, 7.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&QuadItem, 1); } if(Ui()->CheckActiveItem(pId)) { - if(m_MouseDeltaWx * m_MouseDeltaWx + m_MouseDeltaWy * m_MouseDeltaWy > 0.0f) + if(m_MouseDeltaWorld != vec2(0.0f, 0.0f)) { if(s_Operation == OP_SELECT) { @@ -2116,10 +2113,7 @@ void CEditor::DoQuad(int LayerIndex, const std::shared_ptr &pLayer, } } - if(Input()->ShiftIsPressed()) - s_RotateAngle += (m_MouseDeltaX)*0.0001f; - else - s_RotateAngle += (m_MouseDeltaX)*0.002f; + s_RotateAngle += Ui()->MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.0001f : 0.002f); } } @@ -2287,7 +2281,7 @@ void CEditor::DoQuad(int LayerIndex, const std::shared_ptr &pLayer, else Graphics()->SetColor(0, 1, 0, 1); - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWScale, 5.0f * m_MouseWScale); + IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&QuadItem, 1); } @@ -2305,7 +2299,7 @@ void CEditor::DoQuadPoint(int LayerIndex, const std::shared_ptr &pL if(IsQuadPointSelected(QuadIndex, V)) { Graphics()->SetColor(0, 0, 0, 1); - IGraphics::CQuadItem QuadItem(px, py, 7.0f * m_MouseWScale, 7.0f * m_MouseWScale); + IGraphics::CQuadItem QuadItem(px, py, 7.0f * m_MouseWorldScale, 7.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&QuadItem, 1); } @@ -2341,7 +2335,7 @@ void CEditor::DoQuadPoint(int LayerIndex, const std::shared_ptr &pL if(Ui()->CheckActiveItem(pId)) { - if(m_MouseDeltaWx * m_MouseDeltaWx + m_MouseDeltaWy * m_MouseDeltaWy > 0.0f) + if(m_MouseDeltaWorld != vec2(0.0f, 0.0f)) { if(s_Operation == OP_SELECT) { @@ -2412,11 +2406,11 @@ void CEditor::DoQuadPoint(int LayerIndex, const std::shared_ptr &pL // 0,2;1,3 - line x // 0,1;2,3 - line y - pSelectedQuad->m_aTexcoords[m].x += f2fx(m_MouseDeltaWx * 0.001f); - pSelectedQuad->m_aTexcoords[(m + 2) % 4].x += f2fx(m_MouseDeltaWx * 0.001f); + pSelectedQuad->m_aTexcoords[m].x += f2fx(m_MouseDeltaWorld.x * 0.001f); + pSelectedQuad->m_aTexcoords[(m + 2) % 4].x += f2fx(m_MouseDeltaWorld.x * 0.001f); - pSelectedQuad->m_aTexcoords[m].y += f2fx(m_MouseDeltaWy * 0.001f); - pSelectedQuad->m_aTexcoords[m ^ 1].y += f2fx(m_MouseDeltaWy * 0.001f); + pSelectedQuad->m_aTexcoords[m].y += f2fx(m_MouseDeltaWorld.y * 0.001f); + pSelectedQuad->m_aTexcoords[m ^ 1].y += f2fx(m_MouseDeltaWorld.y * 0.001f); } } } @@ -2513,7 +2507,7 @@ void CEditor::DoQuadPoint(int LayerIndex, const std::shared_ptr &pL else Graphics()->SetColor(1, 0, 0, 1); - IGraphics::CQuadItem QuadItem(px, py, 5.0f * m_MouseWScale, 5.0f * m_MouseWScale); + IGraphics::CQuadItem QuadItem(px, py, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&QuadItem, 1); } @@ -2549,7 +2543,7 @@ void CEditor::DoQuadKnife(int QuadIndex) CQuad *pQuad = &pLayer->m_vQuads[QuadIndex]; const bool IgnoreGrid = Input()->AltIsPressed(); - float SnapRadius = 4.f * m_MouseWScale; + float SnapRadius = 4.f * m_MouseWorldScale; vec2 Mouse = vec2(Ui()->MouseWorldX(), Ui()->MouseWorldY()); vec2 Point = Mouse; @@ -2752,14 +2746,14 @@ void CEditor::DoQuadKnife(int QuadIndex) IGraphics::CQuadItem aMarkers[4]; for(int i = 0; i < m_QuadKnifeCount; i++) - aMarkers[i] = IGraphics::CQuadItem(m_aQuadKnifePoints[i].x, m_aQuadKnifePoints[i].y, 5.f * m_MouseWScale, 5.f * m_MouseWScale); + aMarkers[i] = IGraphics::CQuadItem(m_aQuadKnifePoints[i].x, m_aQuadKnifePoints[i].y, 5.f * m_MouseWorldScale, 5.f * m_MouseWorldScale); Graphics()->SetColor(0.f, 0.f, 1.f, 1.f); Graphics()->QuadsDraw(aMarkers, m_QuadKnifeCount); if(ValidPosition) { - IGraphics::CQuadItem MarkerCurrent(Point.x, Point.y, 5.f * m_MouseWScale, 5.f * m_MouseWScale); + IGraphics::CQuadItem MarkerCurrent(Point.x, Point.y, 5.f * m_MouseWorldScale, 5.f * m_MouseWorldScale); Graphics()->QuadsDraw(&MarkerCurrent, 1); } @@ -2936,7 +2930,7 @@ void CEditor::DoQuadEnvPoint(const CQuad *pQuad, int QIndex, int PIndex) } } else if(s_Operation == OP_ROTATE) - pEnvelope->m_vPoints[PIndex].m_aValues[2] += 10 * m_MouseDeltaX; + pEnvelope->m_vPoints[PIndex].m_aValues[2] += 10 * Ui()->MouseDeltaX(); s_LastWx = wx; s_LastWy = wy; @@ -2990,7 +2984,7 @@ void CEditor::DoQuadEnvPoint(const CQuad *pQuad, int QIndex, int PIndex) else Graphics()->SetColor(0.0f, 1.0f, 0.0f, 1.0f); - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWScale, 5.0f * m_MouseWScale); + IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); Graphics()->QuadsDraw(&QuadItem, 1); } @@ -3146,9 +3140,9 @@ void CEditor::DoMapEditor(CUIRect View) s_Operation = OP_NONE; if(s_Operation == OP_PAN_WORLD) - MapView()->OffsetWorld(-vec2(m_MouseDeltaX, m_MouseDeltaY) * m_MouseWScale); + MapView()->OffsetWorld(-Ui()->MouseDelta() * m_MouseWorldScale); else if(s_Operation == OP_PAN_EDITOR) - MapView()->OffsetEditor(-vec2(m_MouseDeltaX, m_MouseDeltaY) * m_MouseWScale); + MapView()->OffsetEditor(-Ui()->MouseDelta() * m_MouseWorldScale); if(s_Operation == OP_NONE) m_pContainerPanned = nullptr; @@ -3274,10 +3268,8 @@ void CEditor::DoMapEditor(CUIRect View) for(size_t i = 0; i < pQuadLayer->m_vQuads.size(); i++) { const CQuad &Quad = pQuadLayer->m_vQuads[i]; - float px = fx2f(Quad.m_aPoints[4].x); - float py = fx2f(Quad.m_aPoints[4].y); - - if(r.Inside(px, py) && !IsQuadSelected(i)) + vec2 Position = vec2(fx2f(Quad.m_aPoints[4].x), fx2f(Quad.m_aPoints[4].y)); + if(r.Inside(Position) && !IsQuadSelected(i)) ToggleSelectQuad(i); } } @@ -3467,8 +3459,7 @@ void CEditor::DoMapEditor(CUIRect View) Pos += MapView()->GetWorldOffset() - MapView()->ProofMode()->m_vMenuBackgroundPositions[MapView()->ProofMode()->m_CurrentMenuProofIndex]; Pos.y -= 3.0f; - vec2 MousePos(m_MouseWorldNoParaX, m_MouseWorldNoParaY); - if(distance(Pos, MousePos) <= 20.0f) + if(distance(Pos, m_MouseWorldNoParaPos) <= 20.0f) { Ui()->SetHotItem(&MapView()->ProofMode()->m_vMenuBackgroundPositions[i]); @@ -3505,8 +3496,7 @@ void CEditor::DoMapEditor(CUIRect View) Pos += MapView()->GetWorldOffset() - MapView()->ProofMode()->m_vMenuBackgroundPositions[MapView()->ProofMode()->m_CurrentMenuProofIndex]; Pos.y -= 3.0f; - MousePos = vec2(m_MouseWorldNoParaX, m_MouseWorldNoParaY); - if(distance(Pos, MousePos) > 20.0f) + if(distance(Pos, m_MouseWorldNoParaPos) > 20.0f) continue; if(i < (TILE_TIME_CHECKPOINT_LAST - TILE_TIME_CHECKPOINT_FIRST)) @@ -3550,13 +3540,13 @@ void CEditor::DoMapEditor(CUIRect View) { float PanSpeed = Input()->ShiftIsPressed() ? 200.0f : 64.0f; if(Input()->KeyPress(KEY_A)) - MapView()->OffsetWorld({-PanSpeed * m_MouseWScale, 0}); + MapView()->OffsetWorld({-PanSpeed * m_MouseWorldScale, 0}); else if(Input()->KeyPress(KEY_D)) - MapView()->OffsetWorld({PanSpeed * m_MouseWScale, 0}); + MapView()->OffsetWorld({PanSpeed * m_MouseWorldScale, 0}); if(Input()->KeyPress(KEY_W)) - MapView()->OffsetWorld({0, -PanSpeed * m_MouseWScale}); + MapView()->OffsetWorld({0, -PanSpeed * m_MouseWorldScale}); else if(Input()->KeyPress(KEY_S)) - MapView()->OffsetWorld({0, PanSpeed * m_MouseWScale}); + MapView()->OffsetWorld({0, PanSpeed * m_MouseWorldScale}); } } else if(Ui()->CheckActiveItem(&m_MapEditorId)) @@ -3621,8 +3611,8 @@ void CEditor::SetHotQuadPoint(const std::shared_ptr &pLayer) void *pMinPoint = nullptr; auto UpdateMinimum = [&](float px, float py, void *pId) { - float dx = (px - wx) / m_MouseWScale; - float dy = (py - wy) / m_MouseWScale; + float dx = (px - wx) / m_MouseWorldScale; + float dy = (py - wy) / m_MouseWorldScale; float CurrDist = dx * dx + dy * dy; if(CurrDist < MinDist) @@ -8222,10 +8212,6 @@ void CEditor::Reset(bool CreateDefault) m_SelectedSound = 0; m_SelectedSource = -1; - m_MouseDeltaX = 0; - m_MouseDeltaY = 0; - m_MouseDeltaWx = 0; - m_MouseDeltaWy = 0; m_pContainerPanned = nullptr; m_pContainerPannedLast = nullptr; @@ -8372,29 +8358,11 @@ void CEditor::PlaceBorderTiles() void CEditor::HandleCursorMovement() { - static float s_MouseX = 0.0f; - static float s_MouseY = 0.0f; - - float MouseRelX = 0.0f, MouseRelY = 0.0f; - IInput::ECursorType CursorType = Input()->CursorRelative(&MouseRelX, &MouseRelY); - if(CursorType != IInput::CURSOR_NONE) - Ui()->ConvertMouseMove(&MouseRelX, &MouseRelY, CursorType); - - m_MouseDeltaX += MouseRelX; - m_MouseDeltaY += MouseRelY; - - if(!Ui()->CheckMouseLock()) - { - s_MouseX = clamp(s_MouseX + MouseRelX, 0.0f, Graphics()->WindowWidth() - 1.0f); - s_MouseY = clamp(s_MouseY + MouseRelY, 0.0f, Graphics()->WindowHeight() - 1.0f); - } - - // update positions for ui, but only update ui when rendering - m_MouseX = Ui()->Screen()->w * (s_MouseX / Graphics()->WindowWidth()); - m_MouseY = Ui()->Screen()->h * (s_MouseY / Graphics()->WindowHeight()); + const vec2 UpdatedMousePos = Ui()->UpdatedMousePos(); + const vec2 UpdatedMouseDelta = Ui()->UpdatedMouseDelta(); // fix correct world x and y - std::shared_ptr pGroup = GetSelectedGroup(); + const std::shared_ptr pGroup = GetSelectedGroup(); if(pGroup) { float aPoints[4]; @@ -8403,19 +8371,20 @@ void CEditor::HandleCursorMovement() float WorldWidth = aPoints[2] - aPoints[0]; float WorldHeight = aPoints[3] - aPoints[1]; - m_MouseWScale = WorldWidth / Graphics()->WindowWidth(); + m_MouseWorldScale = WorldWidth / Graphics()->WindowWidth(); - m_MouseWorldX = aPoints[0] + WorldWidth * (s_MouseX / Graphics()->WindowWidth()); - m_MouseWorldY = aPoints[1] + WorldHeight * (s_MouseY / Graphics()->WindowHeight()); - m_MouseDeltaWx = m_MouseDeltaX * (WorldWidth / Graphics()->WindowWidth()); - m_MouseDeltaWy = m_MouseDeltaY * (WorldHeight / Graphics()->WindowHeight()); + m_MouseWorldPos.x = aPoints[0] + WorldWidth * (UpdatedMousePos.x / Graphics()->WindowWidth()); + m_MouseWorldPos.y = aPoints[1] + WorldHeight * (UpdatedMousePos.y / Graphics()->WindowHeight()); + m_MouseDeltaWorld.x = UpdatedMouseDelta.x * (WorldWidth / Graphics()->WindowWidth()); + m_MouseDeltaWorld.y = UpdatedMouseDelta.y * (WorldHeight / Graphics()->WindowHeight()); } else { - m_MouseWorldX = 0.0f; - m_MouseWorldY = 0.0f; + m_MouseWorldPos = vec2(-1.0f, -1.0f); + m_MouseDeltaWorld = vec2(0.0f, 0.0f); } + m_MouseWorldNoParaPos = vec2(-1.0f, -1.0f); for(const std::shared_ptr &pGameGroup : m_Map.m_vpGroups) { if(!pGameGroup->m_GameGroup) @@ -8427,14 +8396,14 @@ void CEditor::HandleCursorMovement() float WorldWidth = aPoints[2] - aPoints[0]; float WorldHeight = aPoints[3] - aPoints[1]; - m_MouseWorldNoParaX = aPoints[0] + WorldWidth * (s_MouseX / Graphics()->WindowWidth()); - m_MouseWorldNoParaY = aPoints[1] + WorldHeight * (s_MouseY / Graphics()->WindowHeight()); + m_MouseWorldNoParaPos.x = aPoints[0] + WorldWidth * (UpdatedMousePos.x / Graphics()->WindowWidth()); + m_MouseWorldNoParaPos.y = aPoints[1] + WorldHeight * (UpdatedMousePos.y / Graphics()->WindowHeight()); } - OnMouseMove(s_MouseX, s_MouseY); + OnMouseMove(UpdatedMousePos); } -void CEditor::OnMouseMove(float MouseX, float MouseY) +void CEditor::OnMouseMove(vec2 MousePos) { m_vHoverTiles.clear(); for(size_t g = 0; g < m_Map.m_vpGroups.size(); g++) @@ -8459,8 +8428,8 @@ void CEditor::OnMouseMove(float MouseX, float MouseY) float WorldWidth = aPoints[2] - aPoints[0]; float WorldHeight = aPoints[3] - aPoints[1]; CUIRect Rect; - Rect.x = aPoints[0] + WorldWidth * (MouseX / Graphics()->WindowWidth()); - Rect.y = aPoints[1] + WorldHeight * (MouseY / Graphics()->WindowHeight()); + Rect.x = aPoints[0] + WorldWidth * (MousePos.x / Graphics()->WindowWidth()); + Rect.y = aPoints[1] + WorldHeight * (MousePos.y / Graphics()->WindowHeight()); Rect.w = 0; Rect.h = 0; RECTi r; @@ -8612,6 +8581,15 @@ void CEditor::OnUpdate() m_pContainerPannedLast = m_pContainerPanned; + // handle mouse movement + vec2 CursorRel = vec2(0.0f, 0.0f); + IInput::ECursorType CursorType = Input()->CursorRelative(&CursorRel.x, &CursorRel.y); + if(CursorType != IInput::CURSOR_NONE) + { + Ui()->ConvertMouseMove(&CursorRel.x, &CursorRel.y, CursorType); + Ui()->OnCursorMove(CursorRel.x, CursorRel.y); + } + // handle key presses Input()->ConsumeEvents([&](const IInput::CEvent &Event) { for(CEditorComponent &Component : m_vComponents) @@ -8649,14 +8627,11 @@ void CEditor::OnRender() ms_pUiGotContext = nullptr; Ui()->StartCheck(); - Ui()->Update(m_MouseX, m_MouseY, m_MouseDeltaX, m_MouseDeltaY, m_MouseWorldX, m_MouseWorldY); + Ui()->Update(m_MouseWorldPos); Render(); - m_MouseDeltaX = 0.0f; - m_MouseDeltaY = 0.0f; - m_MouseDeltaWx = 0.0f; - m_MouseDeltaWy = 0.0f; + m_MouseDeltaWorld = vec2(0.0f, 0.0f); if(Input()->KeyPress(KEY_F10)) { diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index e9172ebb0fa..17637030dcc 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -370,10 +370,6 @@ class CEditor : public IEditor m_OffsetEnvelopeY = 0.5f; m_ShowMousePointer = true; - m_MouseDeltaX = 0; - m_MouseDeltaY = 0; - m_MouseDeltaWx = 0; - m_MouseDeltaWy = 0; m_GuiActive = true; m_PreviewZoom = false; @@ -464,7 +460,7 @@ class CEditor : public IEditor void ResetIngameMoved() override { m_IngameMoved = false; } void HandleCursorMovement(); - void OnMouseMove(float MouseX, float MouseY); + void OnMouseMove(vec2 MousePos); void HandleAutosave(); bool PerformAutosave(); void HandleWriterFinishJobs(); @@ -705,17 +701,10 @@ class CEditor : public IEditor char m_aMenuBackgroundTooltip[256]; bool m_PreviewZoom; - float m_MouseWScale = 1.0f; // Mouse (i.e. UI) scale relative to the World (selected Group) - float m_MouseX = 0.0f; - float m_MouseY = 0.0f; - float m_MouseWorldX = 0.0f; - float m_MouseWorldY = 0.0f; - float m_MouseWorldNoParaX = 0.0f; - float m_MouseWorldNoParaY = 0.0f; - float m_MouseDeltaX; - float m_MouseDeltaY; - float m_MouseDeltaWx; - float m_MouseDeltaWy; + float m_MouseWorldScale = 1.0f; // Mouse (i.e. UI) scale relative to the World (selected Group) + vec2 m_MouseWorldPos = vec2(0.0f, 0.0f); + vec2 m_MouseWorldNoParaPos = vec2(0.0f, 0.0f); + vec2 m_MouseDeltaWorld = vec2(0.0f, 0.0f); const void *m_pContainerPanned; const void *m_pContainerPannedLast; char m_MapEditorId; // UI element ID for the main map editor From ca89162b06e0b989d79e166213c5c0ce124353d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 5 Jun 2024 21:04:03 +0200 Subject: [PATCH 031/179] Fix wrong file extension being removed in demo cut popup The `.demo` extension is supposed to be removed from the target filename when slicing demos, but anything after the last dot was being removed instead, e.g. `test.abc.def` was incorrectly replaced with `test.abc`. --- src/game/client/components/menus_demo.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 6aaae19b404..9f75ea3c615 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -830,13 +830,15 @@ void CMenus::RenderDemoPlayerSliceSavePopup(CUIRect MainView) static CButtonContainer s_ButtonOk; if(DoButton_Menu(&s_ButtonOk, Localize("Ok"), 0, &OkButton) || (!Ui()->IsPopupOpen() && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) { + if(str_endswith(m_DemoSliceInput.GetString(), ".demo")) + { + char aNameWithoutExt[IO_MAX_PATH_LENGTH]; + fs_split_file_extension(m_DemoSliceInput.GetString(), aNameWithoutExt, sizeof(aNameWithoutExt)); + m_DemoSliceInput.Set(aNameWithoutExt); + } + char aDemoName[IO_MAX_PATH_LENGTH]; - char aNameWithoutExt[IO_MAX_PATH_LENGTH]; DemoPlayer()->GetDemoName(aDemoName, sizeof(aDemoName)); - - fs_split_file_extension(m_DemoSliceInput.GetString(), aNameWithoutExt, sizeof(aNameWithoutExt)); - m_DemoSliceInput.Set(aNameWithoutExt); - if(str_comp(aDemoName, m_DemoSliceInput.GetString()) == 0) { static CUi::SMessagePopupContext s_MessagePopupContext; From f8e84216fc2c2ecc6652a5de9708aa41931545bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 5 Jun 2024 21:48:52 +0200 Subject: [PATCH 032/179] Fix Ok-button of warning popup not being localized --- src/game/client/gameclient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index cedf9297107..25004699cc5 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -703,7 +703,7 @@ void CGameClient::OnRender() { if(pWarning != nullptr && m_Menus.CanDisplayWarning()) { - m_Menus.PopupWarning(pWarning->m_aWarningTitle[0] == '\0' ? Localize("Warning") : pWarning->m_aWarningTitle, pWarning->m_aWarningMsg, "Ok", pWarning->m_AutoHide ? 10s : 0s); + m_Menus.PopupWarning(pWarning->m_aWarningTitle[0] == '\0' ? Localize("Warning") : pWarning->m_aWarningTitle, pWarning->m_aWarningMsg, Localize("Ok"), pWarning->m_AutoHide ? 10s : 0s); pWarning->m_WasShown = true; } } From 3bb60267f9e3979f639d3cc3db4cf3be3199e3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 28 May 2024 22:39:04 +0200 Subject: [PATCH 033/179] Consistent value selector behavior, support double-clicking Make value selector behavior consistent with the generic button logic. Consistently check for completed mouse clicks on the value selector UI element instead of handling some mouse down and mouse up events separately. Fix text mode being activated when moving the mouse over value selectors with held down mouse button. Fix text mode being deactivated immediately when the mouse leaves text area while holding down the mouse button, which is inconvenient when selecting text. Remove unnecessary usage of `CUi::MouseButtonReleased` function. Support double-clicking value selectors to enter text edit mode in addition to right-clicking. This feels more intuitive to use and also makes it usable without a second mouse button. Select all text when entering text mode also in the editor, which was previously only a feature in the menus. Fix value selector edit state being `EDITING` by default instead of `NONE` in the editor and fix maps being marked as modified immediately when a value selector text input is activated. The map will now be marked as modified only when the editing operation is completed, which should be synchonized with the undo history action being added. Use the `CUi::ConsumeHotkey` function instead of checking the enter keys manually. Remove unnecessary and unused `CUi::m_ValueSelectorTextMode` variable and its accessors as well as the equivalent `s_TextMode` variable in the editor. This separate flag is unnecessary as we can use the existing `s_pLastTextId` variable instead. --- src/game/client/ui.cpp | 99 ++++++++++++----------- src/game/client/ui.h | 4 - src/game/editor/editor.cpp | 92 +++++++++++---------- src/game/editor/editor_props.cpp | 8 +- src/game/editor/mapitems/layer_quads.cpp | 2 +- src/game/editor/mapitems/layer_sounds.cpp | 2 +- src/game/editor/mapitems/layer_tiles.cpp | 17 ++-- src/game/editor/popups.cpp | 49 ++++------- 8 files changed, 132 insertions(+), 141 deletions(-) diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index 3fb5490d383..a4afa9fae7c 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -990,88 +990,91 @@ int64_t CUi::DoValueSelector(const void *pId, const CUIRect *pRect, const char * SEditResult CUi::DoValueSelectorWithState(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props) { // logic - static float s_Value; + static bool s_DidScroll = false; + static float s_ScrollValue = 0.0f; static CLineInputNumber s_NumberInput; - static const void *s_pLastTextId = pId; - const bool Inside = MouseInside(pRect); - static const void *s_pEditing = nullptr; - EEditState State = EEditState::NONE; + static int s_ButtonUsed = -1; + static const void *s_pLastTextId = nullptr; + const bool Inside = MouseInside(pRect); const int Base = Props.m_IsHex ? 16 : 10; - if(MouseButtonReleased(1) && HotItem() == pId) - { - s_pLastTextId = pId; - m_ValueSelectorTextMode = true; - s_NumberInput.SetInteger64(Current, Base, Props.m_HexPrefix); - s_NumberInput.SelectAll(); - } - - if(CheckActiveItem(pId)) + if(HotItem() == pId && s_ButtonUsed >= 0 && !MouseButton(s_ButtonUsed)) { - if(!MouseButton(0)) + DisableMouseLock(); + if(CheckActiveItem(pId)) { - DisableMouseLock(); SetActiveItem(nullptr); - m_ValueSelectorTextMode = false; } + if(Inside && ((s_ButtonUsed == 0 && !s_DidScroll && Input()->MouseDoubleClick()) || s_ButtonUsed == 1)) + { + s_pLastTextId = pId; + s_NumberInput.SetInteger64(Current, Base, Props.m_HexPrefix); + s_NumberInput.SelectAll(); + } + s_ButtonUsed = -1; } - if(m_ValueSelectorTextMode && s_pLastTextId == pId) + if(s_pLastTextId == pId) { - DoEditBox(&s_NumberInput, pRect, 10.0f); SetActiveItem(&s_NumberInput); + DoEditBox(&s_NumberInput, pRect, 10.0f); if(ConsumeHotkey(HOTKEY_ENTER) || ((MouseButtonClicked(1) || MouseButtonClicked(0)) && !Inside)) { Current = clamp(s_NumberInput.GetInteger64(Base), Min, Max); DisableMouseLock(); SetActiveItem(nullptr); - m_ValueSelectorTextMode = false; + s_pLastTextId = nullptr; } if(ConsumeHotkey(HOTKEY_ESCAPE)) { DisableMouseLock(); SetActiveItem(nullptr); - m_ValueSelectorTextMode = false; + s_pLastTextId = nullptr; } } else { if(CheckActiveItem(pId)) { - if(Props.m_UseScroll) + if(Props.m_UseScroll && s_ButtonUsed == 0 && MouseButton(0)) { - if(MouseButton(0)) + s_ScrollValue += MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); + + if(absolute(s_ScrollValue) > Props.m_Scale) { - s_Value += MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); - - if(absolute(s_Value) > Props.m_Scale) - { - const int64_t Count = (int64_t)(s_Value / Props.m_Scale); - s_Value = std::fmod(s_Value, Props.m_Scale); - Current += Props.m_Step * Count; - Current = clamp(Current, Min, Max); - - // Constrain to discrete steps - if(Count > 0) - Current = Current / Props.m_Step * Props.m_Step; - else - Current = std::ceil(Current / (float)Props.m_Step) * Props.m_Step; - } + const int64_t Count = (int64_t)(s_ScrollValue / Props.m_Scale); + s_ScrollValue = std::fmod(s_ScrollValue, Props.m_Scale); + Current += Props.m_Step * Count; + Current = clamp(Current, Min, Max); + s_DidScroll = true; + + // Constrain to discrete steps + if(Count > 0) + Current = Current / Props.m_Step * Props.m_Step; + else + Current = std::ceil(Current / (float)Props.m_Step) * Props.m_Step; } } } else if(HotItem() == pId) { - if(MouseButtonClicked(0)) + if(MouseButton(0)) { - s_Value = 0; + s_ButtonUsed = 0; + s_DidScroll = false; + s_ScrollValue = 0.0f; SetActiveItem(pId); if(Props.m_UseScroll) EnableMouseLock(pId); } + else if(MouseButton(1)) + { + s_ButtonUsed = 1; + SetActiveItem(pId); + } } // render @@ -1094,23 +1097,21 @@ SEditResult CUi::DoValueSelectorWithState(const void *pId, const CUIRec DoLabel(pRect, aBuf, 10.0f, TEXTALIGN_MC); } - if(Inside && !MouseButton(0)) + if(Inside && !MouseButton(0) && !MouseButton(1)) SetHotItem(pId); - if(!m_ValueSelectorTextMode) - s_NumberInput.Clear(); - + static const void *s_pEditing = nullptr; + EEditState State = EEditState::NONE; if(s_pEditing == pId) + { State = EEditState::EDITING; - - bool MouseLocked = CheckMouseLock(); - if((MouseLocked || m_ValueSelectorTextMode) && !s_pEditing) + } + if(((CheckActiveItem(pId) && CheckMouseLock()) || s_pLastTextId == pId) && s_pEditing != pId) { State = EEditState::START; s_pEditing = pId; } - - if(!CheckMouseLock() && !m_ValueSelectorTextMode && s_pEditing == pId) + if(!CheckMouseLock() && s_pLastTextId != pId && s_pEditing == pId) { State = EEditState::END; s_pEditing = nullptr; diff --git a/src/game/client/ui.h b/src/game/client/ui.h index 9dbaec29548..5325041dd92 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -349,8 +349,6 @@ class CUi std::vector m_vClips; void UpdateClipping(); - bool m_ValueSelectorTextMode = false; - struct SPopupMenu { static constexpr float POPUP_BORDER = 1.0f; @@ -565,8 +563,6 @@ class CUi // value selector SEditResult DoValueSelectorWithState(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props = {}); int64_t DoValueSelector(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props = {}); - bool IsValueSelectorTextMode() const { return m_ValueSelectorTextMode; } - void SetValueSelectorTextMode(bool TextMode) { m_ValueSelectorTextMode = TextMode; } // scrollbars enum diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 40e19692435..a665bae6e88 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -296,71 +296,67 @@ void CEditor::RenderBackground(CUIRect View, IGraphics::CTextureHandle Texture, SEditResult CEditor::UiDoValueSelector(void *pId, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool IsDegree, bool IsHex, int Corners, const ColorRGBA *pColor, bool ShowValue) { // logic - static float s_Value; + static bool s_DidScroll = false; + static float s_ScrollValue = 0.0f; static CLineInputNumber s_NumberInput; - static bool s_TextMode = false; - static void *s_pLastTextId = pId; + static int s_ButtonUsed = -1; + static void *s_pLastTextId = nullptr; + const bool Inside = Ui()->MouseInside(pRect); const int Base = IsHex ? 16 : 10; - static bool s_Editing = false; - EEditState State = EEditState::EDITING; - if(Ui()->MouseButton(1) && Ui()->HotItem() == pId) + if(Ui()->HotItem() == pId && s_ButtonUsed >= 0 && !Ui()->MouseButton(s_ButtonUsed)) { - s_pLastTextId = pId; - s_TextMode = true; Ui()->DisableMouseLock(); - s_NumberInput.SetInteger(Current, Base); - } - - if(Ui()->CheckActiveItem(pId)) - { - if(!Ui()->MouseButton(0)) + if(Ui()->CheckActiveItem(pId)) { - Ui()->DisableMouseLock(); Ui()->SetActiveItem(nullptr); - s_TextMode = false; } + if(Inside && ((s_ButtonUsed == 0 && !s_DidScroll && Input()->MouseDoubleClick()) || s_ButtonUsed == 1)) + { + s_pLastTextId = pId; + s_NumberInput.SetInteger(Current, Base); + s_NumberInput.SelectAll(); + } + s_ButtonUsed = -1; } - if(s_TextMode && s_pLastTextId == pId) + if(s_pLastTextId == pId) { str_copy(m_aTooltip, "Type your number"); - - DoEditBox(&s_NumberInput, pRect, 10.0f, Corners); - Ui()->SetActiveItem(&s_NumberInput); + DoEditBox(&s_NumberInput, pRect, 10.0f, Corners); - if(Input()->KeyIsPressed(KEY_RETURN) || Input()->KeyIsPressed(KEY_KP_ENTER) || - ((Ui()->MouseButton(1) || Ui()->MouseButton(0)) && !Inside)) + if(Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || ((Ui()->MouseButtonClicked(1) || Ui()->MouseButtonClicked(0)) && !Inside)) { Current = clamp(s_NumberInput.GetInteger(Base), Min, Max); Ui()->DisableMouseLock(); Ui()->SetActiveItem(nullptr); - s_TextMode = false; + s_pLastTextId = nullptr; } if(Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) { Ui()->DisableMouseLock(); Ui()->SetActiveItem(nullptr); - s_TextMode = false; + s_pLastTextId = nullptr; } } else { if(Ui()->CheckActiveItem(pId)) { - if(Ui()->MouseButton(0)) + if(s_ButtonUsed == 0 && Ui()->MouseButton(0)) { - s_Value += Ui()->MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); + s_ScrollValue += Ui()->MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); - if(absolute(s_Value) >= Scale) + if(absolute(s_ScrollValue) >= Scale) { - int Count = (int)(s_Value / Scale); - s_Value = std::fmod(s_Value, Scale); + int Count = (int)(s_ScrollValue / Scale); + s_ScrollValue = std::fmod(s_ScrollValue, Scale); Current += Step * Count; Current = clamp(Current, Min, Max); + s_DidScroll = true; // Constrain to discrete steps if(Count > 0) @@ -369,24 +365,30 @@ SEditResult CEditor::UiDoValueSelector(void *pId, CUIRect *pRect, const cha Current = std::ceil(Current / (float)Step) * Step; } } - if(pToolTip && !s_TextMode) + + if(pToolTip && s_pLastTextId != pId) str_copy(m_aTooltip, pToolTip); } else if(Ui()->HotItem() == pId) { if(Ui()->MouseButton(0)) { + s_ButtonUsed = 0; + s_DidScroll = false; + s_ScrollValue = 0.0f; Ui()->SetActiveItem(pId); Ui()->EnableMouseLock(pId); - s_Value = 0; } - if(pToolTip && !s_TextMode) + else if(Ui()->MouseButton(1)) + { + s_ButtonUsed = 1; + Ui()->SetActiveItem(pId); + } + + if(pToolTip && s_pLastTextId != pId) str_copy(m_aTooltip, pToolTip); } - if(Inside && !Ui()->MouseButton(0)) - Ui()->SetHotItem(pId); - // render char aBuf[128]; if(pLabel[0] != '\0') @@ -406,20 +408,24 @@ SEditResult CEditor::UiDoValueSelector(void *pId, CUIRect *pRect, const cha Ui()->DoLabel(pRect, aBuf, 10, TEXTALIGN_MC); } - if(!s_TextMode) - s_NumberInput.Clear(); + if(Inside && !Ui()->MouseButton(0) && !Ui()->MouseButton(1)) + Ui()->SetHotItem(pId); - bool MouseLocked = Ui()->CheckMouseLock(); - if((MouseLocked || s_TextMode) && !s_Editing) + static const void *s_pEditing = nullptr; + EEditState State = EEditState::NONE; + if(s_pEditing == pId) + { + State = EEditState::EDITING; + } + if(((Ui()->CheckActiveItem(pId) && Ui()->CheckMouseLock()) || s_pLastTextId == pId) && s_pEditing != pId) { State = EEditState::START; - s_Editing = true; + s_pEditing = pId; } - - if(!MouseLocked && !s_TextMode && s_Editing) + if(!Ui()->CheckMouseLock() && s_pLastTextId != pId && s_pEditing == pId) { State = EEditState::END; - s_Editing = false; + s_pEditing = nullptr; } return SEditResult{State, Current}; diff --git a/src/game/editor/editor_props.cpp b/src/game/editor/editor_props.cpp index 0cc2cb2bf29..ca09167bc34 100644 --- a/src/game/editor/editor_props.cpp +++ b/src/game/editor/editor_props.cpp @@ -19,7 +19,7 @@ template SEditResult CEditor::DoPropertiesWithState(CUIRect *pToolBox, CProperty *pProps, int *pIds, int *pNewVal, const std::vector &vColors) { int Change = -1; - EEditState State = EEditState::EDITING; + EEditState State = EEditState::NONE; for(int i = 0; pProps[i].m_pName; i++) { @@ -42,7 +42,7 @@ SEditResult CEditor::DoPropertiesWithState(CUIRect *pToolBox, CProperty *pPro str_format(aBuf, sizeof(aBuf), "%d", pProps[i].m_Value); auto NewValueRes = UiDoValueSelector((char *)&pIds[i], &Shifter, "", pProps[i].m_Value, pProps[i].m_Min, pProps[i].m_Max, 1, 1.0f, "Use left mouse button to drag and change the value. Hold shift to be more precise. Rightclick to edit as text.", false, false, 0, pColor); int NewValue = NewValueRes.m_Value; - if(NewValue != pProps[i].m_Value || NewValueRes.m_State != EEditState::EDITING) + if(NewValue != pProps[i].m_Value || (NewValueRes.m_State != EEditState::NONE && NewValueRes.m_State != EEditState::EDITING)) { *pNewVal = NewValue; Change = i; @@ -102,7 +102,7 @@ SEditResult CEditor::DoPropertiesWithState(CUIRect *pToolBox, CProperty *pPro State = EEditState::ONE_GO; } - if(NewValue != pProps[i].m_Value || NewValueRes.m_State != EEditState::EDITING) + if(NewValue != pProps[i].m_Value || (NewValueRes.m_State != EEditState::NONE && NewValueRes.m_State != EEditState::EDITING)) { *pNewVal = NewValue % 360; Change = i; @@ -241,7 +241,7 @@ SEditResult CEditor::DoPropertiesWithState(CUIRect *pToolBox, CProperty *pPro auto NewValueRes = UiDoValueSelector((char *)&pIds[i], &Shifter, aBuf, CurValue, 0, m_Map.m_vpEnvelopes.size(), 1, 1.0f, "Set Envelope", false, false, IGraphics::CORNER_NONE); int NewVal = NewValueRes.m_Value; - if(NewVal != CurValue || NewValueRes.m_State != EEditState::EDITING) + if(NewVal != CurValue || (NewValueRes.m_State != EEditState::NONE && NewValueRes.m_State != EEditState::EDITING)) { *pNewVal = NewVal; Change = i; diff --git a/src/game/editor/mapitems/layer_quads.cpp b/src/game/editor/mapitems/layer_quads.cpp index 24c6a944aed..2afeec56770 100644 --- a/src/game/editor/mapitems/layer_quads.cpp +++ b/src/game/editor/mapitems/layer_quads.cpp @@ -231,7 +231,7 @@ CUi::EPopupMenuFunctionResult CLayerQuads::RenderProperties(CUIRect *pToolBox) static int s_aIds[(int)ELayerQuadsProp::NUM_PROPS] = {0}; int NewVal = 0; auto [State, Prop] = m_pEditor->DoPropertiesWithState(pToolBox, aProps, s_aIds, &NewVal); - if(Prop != ELayerQuadsProp::PROP_NONE) + if(Prop != ELayerQuadsProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) { m_pEditor->m_Map.OnModify(); } diff --git a/src/game/editor/mapitems/layer_sounds.cpp b/src/game/editor/mapitems/layer_sounds.cpp index e279dd4a5bd..039d0259599 100644 --- a/src/game/editor/mapitems/layer_sounds.cpp +++ b/src/game/editor/mapitems/layer_sounds.cpp @@ -178,7 +178,7 @@ CUi::EPopupMenuFunctionResult CLayerSounds::RenderProperties(CUIRect *pToolBox) static int s_aIds[(int)ELayerSoundsProp::NUM_PROPS] = {0}; int NewVal = 0; auto [State, Prop] = m_pEditor->DoPropertiesWithState(pToolBox, aProps, s_aIds, &NewVal); - if(Prop != ELayerSoundsProp::PROP_NONE) + if(Prop != ELayerSoundsProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) { m_pEditor->m_Map.OnModify(); } diff --git a/src/game/editor/mapitems/layer_tiles.cpp b/src/game/editor/mapitems/layer_tiles.cpp index d2e4cc7b5e0..380af7d8fc5 100644 --- a/src/game/editor/mapitems/layer_tiles.cpp +++ b/src/game/editor/mapitems/layer_tiles.cpp @@ -1070,7 +1070,7 @@ CUi::EPopupMenuFunctionResult CLayerTiles::RenderProperties(CUIRect *pToolBox) s_Tracker.End(Prop, State); // Check if modified property could have an effect on automapper - if(HasAutomapEffect(Prop)) + if((State == EEditState::END || State == EEditState::ONE_GO) && HasAutomapEffect(Prop)) { FlagModified(0, 0, m_Width, m_Height); @@ -1251,13 +1251,16 @@ CUi::EPopupMenuFunctionResult CLayerTiles::RenderCommonProperties(SCommonPropSta s_Tracker.End(Prop, PropState); - if(Prop == ETilesCommonProp::PROP_WIDTH || Prop == ETilesCommonProp::PROP_HEIGHT) + if(PropState == EEditState::END || PropState == EEditState::ONE_GO) { - State.m_Modified |= SCommonPropState::MODIFIED_SIZE; - } - else if(Prop == ETilesCommonProp::PROP_COLOR) - { - State.m_Modified |= SCommonPropState::MODIFIED_COLOR; + if(Prop == ETilesCommonProp::PROP_WIDTH || Prop == ETilesCommonProp::PROP_HEIGHT) + { + State.m_Modified |= SCommonPropState::MODIFIED_SIZE; + } + else if(Prop == ETilesCommonProp::PROP_COLOR) + { + State.m_Modified |= SCommonPropState::MODIFIED_COLOR; + } } return CUi::POPUP_KEEP_OPEN; diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index ab488f2674e..d92e321e16e 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -640,7 +640,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupGroup(void *pContext, CUIRect View, static int s_aIds[(int)EGroupProp::NUM_PROPS] = {0}; int NewVal = 0; auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != EGroupProp::PROP_NONE) + if(Prop != EGroupProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) { pEditor->m_Map.OnModify(); } @@ -790,7 +790,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupLayer(void *pContext, CUIRect View, static int s_aIds[(int)ELayerProp::NUM_PROPS] = {0}; int NewVal = 0; auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != ELayerProp::PROP_NONE) + if(Prop != ELayerProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) { pEditor->m_Map.OnModify(); } @@ -979,15 +979,10 @@ CUi::EPopupMenuFunctionResult CEditor::PopupQuad(void *pContext, CUIRect View, b static int s_aIds[(int)EQuadProp::NUM_PROPS] = {0}; int NewVal = 0; - auto PropRes = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - EQuadProp Prop = PropRes.m_Value; - if(Prop != EQuadProp::PROP_NONE) + auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); + if(Prop != EQuadProp::PROP_NONE && (State == EEditState::START || State == EEditState::ONE_GO)) { - pEditor->m_Map.OnModify(); - if(PropRes.m_State == EEditState::START || PropRes.m_State == EEditState::ONE_GO) - { - pEditor->m_QuadTracker.BeginQuadPropTrack(pLayer, pEditor->m_vSelectedQuads, Prop); - } + pEditor->m_QuadTracker.BeginQuadPropTrack(pLayer, pEditor->m_vSelectedQuads, Prop); } const float OffsetX = i2fx(NewVal) - pCurrentQuad->m_aPoints[4].x; @@ -1053,12 +1048,10 @@ CUi::EPopupMenuFunctionResult CEditor::PopupQuad(void *pContext, CUIRect View, b } } - if(Prop != EQuadProp::PROP_NONE) + if(Prop != EQuadProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) { - if(PropRes.m_State == EEditState::END || PropRes.m_State == EEditState::ONE_GO) - { - pEditor->m_QuadTracker.EndQuadPropTrack(Prop); - } + pEditor->m_QuadTracker.EndQuadPropTrack(Prop); + pEditor->m_Map.OnModify(); } return CUi::POPUP_KEEP_OPEN; @@ -1120,7 +1113,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSource(void *pContext, CUIRect View, static int s_aIds[(int)ESoundProp::NUM_PROPS] = {0}; int NewVal = 0; auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != ESoundProp::PROP_NONE) + if(Prop != ESoundProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) { pEditor->m_Map.OnModify(); } @@ -1202,7 +1195,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSource(void *pContext, CUIRect View, static int s_aCircleIds[(int)ECircleShapeProp::NUM_CIRCLE_PROPS] = {0}; NewVal = 0; auto [LocalState, LocalProp] = pEditor->DoPropertiesWithState(&View, aCircleProps, s_aCircleIds, &NewVal); - if(LocalProp != ECircleShapeProp::PROP_NONE) + if(LocalProp != ECircleShapeProp::PROP_NONE && (LocalState == EEditState::END || LocalState == EEditState::ONE_GO)) { pEditor->m_Map.OnModify(); } @@ -1230,7 +1223,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSource(void *pContext, CUIRect View, static int s_aRectangleIds[(int)ERectangleShapeProp::NUM_RECTANGLE_PROPS] = {0}; NewVal = 0; auto [LocalState, LocalProp] = pEditor->DoPropertiesWithState(&View, aRectangleProps, s_aRectangleIds, &NewVal); - if(LocalProp != ERectangleShapeProp::PROP_NONE) + if(LocalProp != ERectangleShapeProp::PROP_NONE && (LocalState == EEditState::END || LocalState == EEditState::ONE_GO)) { pEditor->m_Map.OnModify(); } @@ -1282,16 +1275,11 @@ CUi::EPopupMenuFunctionResult CEditor::PopupPoint(void *pContext, CUIRect View, static int s_aIds[(int)EQuadPointProp::NUM_PROPS] = {0}; int NewVal = 0; - auto PropRes = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - EQuadPointProp Prop = PropRes.m_Value; - if(Prop != EQuadPointProp::PROP_NONE) + auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); + if(Prop != EQuadPointProp::PROP_NONE && (State == EEditState::START || State == EEditState::ONE_GO)) { - pEditor->m_Map.OnModify(); - if(PropRes.m_State == EEditState::START || PropRes.m_State == EEditState::ONE_GO) - { - pEditor->m_QuadTracker.BeginQuadPointPropTrack(pLayer, pEditor->m_vSelectedQuads, pEditor->m_SelectedQuadPoints); - pEditor->m_QuadTracker.AddQuadPointPropTrack(Prop); - } + pEditor->m_QuadTracker.BeginQuadPointPropTrack(pLayer, pEditor->m_vSelectedQuads, pEditor->m_SelectedQuadPoints); + pEditor->m_QuadTracker.AddQuadPointPropTrack(Prop); } for(CQuad *pQuad : vpQuads) @@ -1335,13 +1323,10 @@ CUi::EPopupMenuFunctionResult CEditor::PopupPoint(void *pContext, CUIRect View, } } - if(Prop != EQuadPointProp::PROP_NONE) + if(Prop != EQuadPointProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) { + pEditor->m_QuadTracker.EndQuadPointPropTrack(Prop); pEditor->m_Map.OnModify(); - if(PropRes.m_State == EEditState::END || PropRes.m_State == EEditState::ONE_GO) - { - pEditor->m_QuadTracker.EndQuadPointPropTrack(Prop); - } } return CUi::POPUP_KEEP_OPEN; From ef7bebc73ec635dd075b1b476d7a7d01cf973846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 29 May 2024 22:15:17 +0200 Subject: [PATCH 034/179] Remove `CUi::MouseButtonReleased` function Replace the last remaining usage of the `CUi::MouseButtonReleased` function with `!MouseButton(...)`. The `pMouseSelection->m_Selecting` flag is only set to `true` when the mouse button is already pressed down, so the additional check of `MouseButtonReleased` is unnecessary in this case. In general, this function is an anti-pattern in our UI, as only checking for the mouse button to be released does not guarantee that the mouse was also pressed down over the respective UI element. The `DoButtonLogic` function or similar code should be used instead of only handling the press or release of a mouse button. --- src/game/client/ui.cpp | 2 +- src/game/client/ui.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index a4afa9fae7c..8af76a26e37 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -807,7 +807,7 @@ bool CUi::DoEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize if(pMouseSelection->m_Selecting) { pMouseSelection->m_ReleaseMouse = MousePos(); - if(MouseButtonReleased(0)) + if(!MouseButton(0)) { pMouseSelection->m_Selecting = false; } diff --git a/src/game/client/ui.h b/src/game/client/ui.h index 5325041dd92..046a9236708 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -437,7 +437,6 @@ class CUi vec2 UpdatedMouseDelta() const { return m_UpdatedMouseDelta; } int MouseButton(int Index) const { return (m_MouseButtons >> Index) & 1; } int MouseButtonClicked(int Index) const { return MouseButton(Index) && !((m_LastMouseButtons >> Index) & 1); } - int MouseButtonReleased(int Index) const { return ((m_LastMouseButtons >> Index) & 1) && !MouseButton(Index); } bool CheckMouseLock() { if(m_MouseLock && ActiveItem() != m_pMouseLockId) From 112e34fefef97a5c2d72729f5179dfd1adee2556 Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Sat, 8 Jun 2024 00:31:08 +0800 Subject: [PATCH 035/179] Add cl_showhud_time_cp_diff --- src/engine/shared/config_variables.h | 1 + src/game/client/components/hud.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index c53136b379f..c87739589bc 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -49,6 +49,7 @@ MACRO_CONFIG_INT(ClShowhud, cl_showhud, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, MACRO_CONFIG_INT(ClShowhudHealthAmmo, cl_showhud_healthammo, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Health + Ammo)") MACRO_CONFIG_INT(ClShowhudScore, cl_showhud_score, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Score)") MACRO_CONFIG_INT(ClShowhudTimer, cl_showhud_timer, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Timer)") +MACRO_CONFIG_INT(ClShowhudTimeCpDiff, cl_showhud_time_cp_diff, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Time Checkpoint Difference)") MACRO_CONFIG_INT(ClShowhudDummyActions, cl_showhud_dummy_actions, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Dummy Actions)") MACRO_CONFIG_INT(ClShowhudPlayerPosition, cl_showhud_player_position, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Player Position)") MACRO_CONFIG_INT(ClShowhudPlayerSpeed, cl_showhud_player_speed, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Player Speed)") diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index 5f18f40c09c..b4756676d30 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -1571,7 +1571,7 @@ void CHud::RenderDDRaceEffects() } TextRender()->TextColor(TextRender()->DefaultTextColor()); } - else if(!m_ShowFinishTime && m_TimeCpLastReceivedTick + Client()->GameTickSpeed() * 6 > Client()->GameTick(g_Config.m_ClDummy)) + else if(g_Config.m_ClShowhudTimeCpDiff && !m_ShowFinishTime && m_TimeCpLastReceivedTick + Client()->GameTickSpeed() * 6 > Client()->GameTick(g_Config.m_ClDummy)) { if(m_TimeCpDiff < 0) { From 2498d392dbf1ef496e647f8bdbbb406e22f7fe62 Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Sat, 8 Jun 2024 09:01:55 +0800 Subject: [PATCH 036/179] Update languages for upcoming 18.3 --- data/languages/arabic.txt | 12 ++- data/languages/azerbaijanese.txt | 19 ++-- data/languages/belarusian.txt | 20 +++-- data/languages/bosnian.txt | 12 ++- data/languages/brazilian_portuguese.txt | 12 ++- data/languages/bulgarian.txt | 12 ++- data/languages/catalan.txt | 12 ++- data/languages/chuvash.txt | 12 ++- data/languages/czech.txt | 12 ++- data/languages/danish.txt | 12 ++- data/languages/dutch.txt | 12 ++- data/languages/esperanto.txt | 12 ++- data/languages/estonian.txt | 12 ++- data/languages/finnish.txt | 27 +++--- data/languages/french.txt | 12 ++- data/languages/galician.txt | 12 ++- data/languages/german.txt | 12 ++- data/languages/greek.txt | 12 ++- data/languages/hungarian.txt | 12 ++- data/languages/italian.txt | 12 ++- data/languages/japanese.txt | 12 ++- data/languages/korean.txt | 12 ++- data/languages/kyrgyz.txt | 12 ++- data/languages/norwegian.txt | 12 ++- data/languages/persian.txt | 12 ++- data/languages/polish.txt | 113 +++++++++++++----------- data/languages/portuguese.txt | 12 ++- data/languages/romanian.txt | 12 ++- data/languages/russian.txt | 12 ++- data/languages/serbian.txt | 12 ++- data/languages/serbian_cyrillic.txt | 12 ++- data/languages/simplified_chinese.txt | 12 ++- data/languages/slovak.txt | 12 ++- data/languages/spanish.txt | 12 ++- data/languages/swedish.txt | 12 ++- data/languages/traditional_chinese.txt | 12 ++- data/languages/turkish.txt | 12 ++- data/languages/ukrainian.txt | 6 +- 38 files changed, 400 insertions(+), 181 deletions(-) diff --git a/data/languages/arabic.txt b/data/languages/arabic.txt index dae5e5c0358..9816e72e973 100644 --- a/data/languages/arabic.txt +++ b/data/languages/arabic.txt @@ -620,9 +620,6 @@ Messages %.2f MiB == %.2f MiB -Use DDRace Scoreboard -== ﻝﺎﻤﻌﺘﺳﺃ DDRace ﺩﺭﻮﺑ ﺭﻮﻜﺳ - Loading DDNet Client == ﻞﻴﻤﺤﺘﻟﺍ ﺭﺎﺟ DDNet Client @@ -1272,6 +1269,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1617,6 +1617,9 @@ Graphics card auto == +Tee +== + Appearance == @@ -1668,6 +1671,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/azerbaijanese.txt b/data/languages/azerbaijanese.txt index 995490905f2..562c414955d 100644 --- a/data/languages/azerbaijanese.txt +++ b/data/languages/azerbaijanese.txt @@ -795,9 +795,6 @@ DDNet DDNet Client needs to be restarted to complete update! == Yeniləmənin tamamlanması üçün oyunu yenidən başlatmaq lazımdır! -Use DDRace Scoreboard -== DDRace xal lövhəsindən istifadə edin - Show score == Xal göstər @@ -1761,9 +1758,6 @@ No demo selected Created == Yaradılmışdır -map not included -== Xəritə daxil deyil - Loading… == Yüklənir… @@ -1841,3 +1835,16 @@ Always show own player's hook collision line Always show other players' hook collision lines == Digər oyunçuların qarmaq toqquşma sərhədini həmişə göstər + +%d/%d KiB (%.1f KiB/s) +== + +[Demo details] +map not included +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt index 9511e255b85..13b887d5007 100644 --- a/data/languages/belarusian.txt +++ b/data/languages/belarusian.txt @@ -518,10 +518,6 @@ LAN Name plates size == Памер таблічак з імёнамі -Submitting the render commands failed. Try to update your GPU drivers. -== Адпраўка каманд рэндэрынгу не выканана. Паспрабуйце абнавіць драйверы відэакарты. - -[Graphics error] Failed to swap framebuffers. Try to update your GPU drivers. == Не атрымалася выканаць падпампоўку кадравых буфераў. Паспрабуйце абнавіць драйверы відэакарты. @@ -1172,9 +1168,6 @@ Show votes window after voting DDRace HUD == DDRace HUD -Use DDRace Scoreboard -== Выкарыстоўваць табло ачкоў DDRace - Show client IDs in scoreboard == Паказваць ID кліента ў табло ачкоў @@ -1730,6 +1723,10 @@ An error during command recording occurred. Try to update your GPU drivers. A render command failed. Try to update your GPU drivers. == +[Graphics error] +Submitting the render commands failed. Try to update your GPU drivers. +== + Failed saving the replay! == @@ -1787,6 +1784,9 @@ There's an unsaved map in the editor, you might want to save it. Continue anyway? == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1805,6 +1805,9 @@ Loading… Player info change cooldown == +Tee +== + Info Messages == @@ -1814,6 +1817,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt index 6e7b0baaf66..dd75c27bd19 100644 --- a/data/languages/bosnian.txt +++ b/data/languages/bosnian.txt @@ -786,9 +786,6 @@ Map sound volume DDNet Client needs to be restarted to complete update! == DDNet Klijent mora da se restartuje da bi završio ažuriranje! -Use DDRace Scoreboard -== Koristi DDRace tablicu bodova - Show score == Prikaži bodove @@ -1155,6 +1152,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1554,6 +1554,9 @@ Chat sound volume Background music volume == +Tee +== + Appearance == @@ -1614,6 +1617,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Use old chat style == diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index a49018a230f..1dd109b2961 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -687,9 +687,6 @@ New random timeout code Suicides == Suicídios -Use DDRace Scoreboard -== Usar o placar do DDRace - Record demo == Gravar demo @@ -1872,3 +1869,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == Sempre mostrar linhas de colisão do gancho dos outros jogadores + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/bulgarian.txt b/data/languages/bulgarian.txt index 6d41c862142..3484b8d2257 100644 --- a/data/languages/bulgarian.txt +++ b/data/languages/bulgarian.txt @@ -810,6 +810,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1392,6 +1395,9 @@ Map sound volume Background music volume == +Tee +== + Appearance == @@ -1431,9 +1437,6 @@ Show votes window after voting DDRace HUD == -Use DDRace Scoreboard -== - Show client IDs in scoreboard == @@ -1470,6 +1473,9 @@ Show names in chat in team colors Show only chat messages from friends == +Show only chat messages from team members +== + Use old chat style == diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt index 5fff77766b6..822146ae6e7 100644 --- a/data/languages/catalan.txt +++ b/data/languages/catalan.txt @@ -692,9 +692,6 @@ Max CSVs %.2f KiB == %.2f KiB -Use DDRace Scoreboard -== Utilitzar la taula d'estadístiques DDRace - Best == Millor @@ -1365,6 +1362,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1644,6 +1644,9 @@ Allows maps to render with more detail Graphics card == +Tee +== + Appearance == @@ -1695,6 +1698,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/chuvash.txt b/data/languages/chuvash.txt index b2300808c70..7e20561344d 100644 --- a/data/languages/chuvash.txt +++ b/data/languages/chuvash.txt @@ -813,6 +813,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1392,6 +1395,9 @@ Map sound volume Background music volume == +Tee +== + Appearance == @@ -1431,9 +1437,6 @@ Show votes window after voting DDRace HUD == -Use DDRace Scoreboard -== - Show client IDs in scoreboard == @@ -1470,6 +1473,9 @@ Show names in chat in team colors Show only chat messages from friends == +Show only chat messages from team members +== + Use old chat style == diff --git a/data/languages/czech.txt b/data/languages/czech.txt index ac034076f33..45b3ab6fdfb 100644 --- a/data/languages/czech.txt +++ b/data/languages/czech.txt @@ -790,9 +790,6 @@ DDNet DDNet Client needs to be restarted to complete update! == K dokončení aktualizace je nutné restartovat klienta DDNet! -Use DDRace Scoreboard -== Použít DDRace tabulku výsledků - Show score == Zobrazit skóre @@ -1849,3 +1846,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == Vždy zobrazit čáru kolize háků ostatních hráčů + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/danish.txt b/data/languages/danish.txt index 9ab783c7a76..32bc6d57451 100644 --- a/data/languages/danish.txt +++ b/data/languages/danish.txt @@ -844,9 +844,6 @@ Assets DDNet Client needs to be restarted to complete update! == DDNet Klient skal genstartes for at fuldføre opdateringen! -Use DDRace Scoreboard -== Brug DDRace resultattavle - Show score == Vis score @@ -1280,6 +1277,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1625,6 +1625,9 @@ Graphics card auto == +Tee +== + Appearance == @@ -1676,6 +1679,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index 5fb7d2d3783..1959c038a78 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -807,9 +807,6 @@ DDNet DDNet Client needs to be restarted to complete update! == DDNet Client moet herstart worden om de update te voltooien! -Use DDRace Scoreboard -== Gebruik DDrace Scorebord - Show score == Laat score zien @@ -1408,6 +1405,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1681,6 +1681,9 @@ Cancel Graphics card == +Tee +== + Appearance == @@ -1732,6 +1735,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/esperanto.txt b/data/languages/esperanto.txt index da7f37334db..450fecbd557 100644 --- a/data/languages/esperanto.txt +++ b/data/languages/esperanto.txt @@ -790,6 +790,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1426,6 +1429,9 @@ Map sound volume Background music volume == +Tee +== + Controls == @@ -1468,9 +1474,6 @@ Show votes window after voting DDRace HUD == -Use DDRace Scoreboard -== - Show client IDs in scoreboard == @@ -1504,6 +1507,9 @@ Show names in chat in team colors Show only chat messages from friends == +Show only chat messages from team members +== + Use old chat style == diff --git a/data/languages/estonian.txt b/data/languages/estonian.txt index 5c6b4a74ffa..051d3bc9b6a 100644 --- a/data/languages/estonian.txt +++ b/data/languages/estonian.txt @@ -859,9 +859,6 @@ DDNet DDNet Client needs to be restarted to complete update! == DDNet Klient peab taaskäivitama, et uuendus lõpetada! -Use DDRace Scoreboard -== Kasuta DDRace punktitabelit - Show score == Näita punkte @@ -1846,3 +1843,12 @@ Always show other players' hook collision lines Net == Võrk + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt index 1899fbf7361..39834c4fea6 100644 --- a/data/languages/finnish.txt +++ b/data/languages/finnish.txt @@ -859,9 +859,6 @@ DDNet DDNet Client needs to be restarted to complete update! == DDNet-asiakas täytyy käynnistää uudelleen latauksen viimeistelemiseksi -Use DDRace Scoreboard -== Käytä DDRacen tuloslistaa - Show score == Näytä pistemäärä @@ -1503,9 +1500,6 @@ No login required Player info change cooldown == Pelaajan tiedon muutos viive -Converse -== - Always show chat == Aina näytä chatti @@ -1676,9 +1670,6 @@ Chat font size Chat width == Chatin leveys -Show hook strength indicator -== Näytä koukun voimakkuus mittari - Show local player's key presses == Näytä paikallisen pelaajan näppäimistönpainallukset @@ -1841,11 +1832,23 @@ Auto Loading sound files == Ladataan ääni tiedostoja +Moved ingame +== Liikui pelissä + +%d/%d KiB (%.1f KiB/s) +== + +Converse +== + +Tee +== + +Show only chat messages from team members +== + Spree == Grabs == - -Moved ingame -== Liikui pelissä diff --git a/data/languages/french.txt b/data/languages/french.txt index b444c199c7b..612b7ec67e4 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -576,9 +576,6 @@ Show other players' hook collision lines Filter connecting players == Filtre les Tees se connectant -Use DDRace Scoreboard -== Utiliser le tableau des scores de DDRace - AntiPing: predict grenade paths == AntiPing: prédit la trajectoire du lance-grenade @@ -1708,6 +1705,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1813,6 +1813,9 @@ Axis Graphics card == +Tee +== + Info Messages == @@ -1822,6 +1825,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/galician.txt b/data/languages/galician.txt index b1391df980e..071991f1a3b 100644 --- a/data/languages/galician.txt +++ b/data/languages/galician.txt @@ -793,9 +793,6 @@ DDNet DDNet Client needs to be restarted to complete update! == Utilizar o marcador DDRace -Use DDRace Scoreboard -== Utilizar o marcador DDRace - Show score == Mostrar puntaje @@ -1679,6 +1676,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1784,6 +1784,9 @@ Axis Graphics card == +Tee +== + Info Messages == @@ -1793,6 +1796,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/german.txt b/data/languages/german.txt index a234113bd0d..9060bda1284 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -662,9 +662,6 @@ Messages %.2f MiB == %.2f MiB -Use DDRace Scoreboard -== DDRace-Punktetafel benutzen - Loading DDNet Client == DDNet-Client laden @@ -1862,3 +1859,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == Immer Hakenkollisionslinie anderer Spieler anzeigen + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/greek.txt b/data/languages/greek.txt index 1ad00fedeab..b22af59507b 100644 --- a/data/languages/greek.txt +++ b/data/languages/greek.txt @@ -816,6 +816,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1395,6 +1398,9 @@ Map sound volume Background music volume == +Tee +== + Appearance == @@ -1434,9 +1440,6 @@ Show votes window after voting DDRace HUD == -Use DDRace Scoreboard -== - Show client IDs in scoreboard == @@ -1470,6 +1473,9 @@ Always show chat Show names in chat in team colors == +Show only chat messages from team members +== + Use old chat style == diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index 0e93b25ddc7..f6439c597ee 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -693,9 +693,6 @@ Max CSVs Strict gametype filter == Szigorú játékmód szűrő -Use DDRace Scoreboard -== DDRace pontszámtábla használata - Best == Legjobb @@ -1659,6 +1656,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1789,6 +1789,9 @@ Axis Graphics card == +Tee +== + Info Messages == @@ -1798,6 +1801,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/italian.txt b/data/languages/italian.txt index 758ef089dee..213822d6c8c 100644 --- a/data/languages/italian.txt +++ b/data/languages/italian.txt @@ -877,9 +877,6 @@ Assets DDNet Client needs to be restarted to complete update! == Il Client DDNet deve essere riavviato per completare l'aggiornamento! -Use DDRace Scoreboard -== Usa il tabellone segnapunti DDRace - Show score == Mostra punteggio/tempo @@ -1510,6 +1507,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + Loading menu images == @@ -1761,6 +1761,9 @@ custom auto == +Tee +== + Appearance == @@ -1779,6 +1782,9 @@ DDRace HUD Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/japanese.txt b/data/languages/japanese.txt index 8371af4437a..0c9914d2ad9 100644 --- a/data/languages/japanese.txt +++ b/data/languages/japanese.txt @@ -870,9 +870,6 @@ Assets DDNet Client needs to be restarted to complete update! == アップデートを完了するには、DDNet クライアントの再起動が必要です。 -Use DDRace Scoreboard -== DDRace スゴアボードを使用 - Show score == スコアを表示 @@ -1312,6 +1309,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1636,6 +1636,9 @@ Graphics card auto == +Tee +== + Appearance == @@ -1687,6 +1690,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/korean.txt b/data/languages/korean.txt index fa58fe3d0c6..f11307e58fb 100644 --- a/data/languages/korean.txt +++ b/data/languages/korean.txt @@ -891,9 +891,6 @@ Assets DDNet Client needs to be restarted to complete update! == 업데이트 완료를 위해 DDNet 클라이언트 재시작이 필요합니다! -Use DDRace Scoreboard -== DDRace 점수판 사용 - Show score == 점수 표시 @@ -1671,6 +1668,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1801,6 +1801,9 @@ Axis Graphics card == +Tee +== + Info Messages == @@ -1810,6 +1813,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/kyrgyz.txt b/data/languages/kyrgyz.txt index 56e138982cf..de28fc3303c 100644 --- a/data/languages/kyrgyz.txt +++ b/data/languages/kyrgyz.txt @@ -807,6 +807,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1386,6 +1389,9 @@ Map sound volume Background music volume == +Tee +== + Appearance == @@ -1425,9 +1431,6 @@ Show votes window after voting DDRace HUD == -Use DDRace Scoreboard -== - Show client IDs in scoreboard == @@ -1461,6 +1464,9 @@ Always show chat Show names in chat in team colors == +Show only chat messages from team members +== + Use old chat style == diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index fc52daca531..96dbce76571 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -797,9 +797,6 @@ DDNet DDNet Client needs to be restarted to complete update! == DDNet-klienten må restartes for å fullføre oppdatering! -Use DDRace Scoreboard -== Bruk DDRace-poengliste - Show score == Vis poeng @@ -1281,6 +1278,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1626,6 +1626,9 @@ Graphics card auto == +Tee +== + Appearance == @@ -1677,6 +1680,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/persian.txt b/data/languages/persian.txt index 1525f38a80d..651a74029a3 100644 --- a/data/languages/persian.txt +++ b/data/languages/persian.txt @@ -702,9 +702,6 @@ Background music volume Sound == ﺍﺪﺻ -Use DDRace Scoreboard -== DDRace ﺕﺍﺯﺎﯿﺘﻣﺍ ﯼﻮﻠﺑﺎﺗ ﺯﺍ ﻩﺩﺎﻔﺘﺳﺍ - Show score == ﺯﺎﯿﺘﻣﺍ ﺶﯾﺎﻤﻧ @@ -1638,6 +1635,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1774,6 +1774,9 @@ Axis Graphics card == +Tee +== + Info Messages == @@ -1783,6 +1786,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/polish.txt b/data/languages/polish.txt index 1e8b0bf01db..6fe9a203503 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -605,9 +605,6 @@ Team message Normal message == Wiadomość standardowa -Use DDRace Scoreboard -== Użyj tabeli wyników z DDRace - Show kill messages == Pokazuj wiadomości śmierci @@ -1214,23 +1211,6 @@ Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in s Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. == Brak pamięci VRAM. Spróbuj usunąć niestandardowe zasoby (skiny, entities, itd.), szczególnie te z dużą rozdzielczością. -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. == Wystąpił nieznany błąd. Spróbuj zmienić gfx_backend na OpenGL lub Vulkan w settings_ddnet.cfg w folderze konfiguracyjnym i spróbuj ponownie. @@ -1305,9 +1285,6 @@ Enter Password NOT CONNECTED == NIE POŁĄCZONO -Match %d of %d -== - No results == Brak wyników @@ -1317,9 +1294,6 @@ Lines %d - %d (%s) Locked == Zablokowane -Following -== - Loading commands… == Ładowanie komend… @@ -1332,9 +1306,6 @@ Speed: Angle: == Kąt: -Multi-view -== Multi kamera - Some map images could not be loaded. Check the local console for details. == Nie można załadować niektórych obrazów mapy. Sprawdź konsolę, aby poznać szczegóły. @@ -1524,9 +1495,6 @@ Export demo cut Cut interval == Przedział cięcia -Cut lenght -== Długość cięcia - Render cut to video == Wyeksportuj cięcie do pliku wideo @@ -1536,25 +1504,15 @@ Please use a different filename Loading demo files == Ładowanie plików demo -All combined -== - No demo selected == Nie wybrano demo -Folder Link -== - Created == Utworzono Netversion == Wersja -[Demo details] -map not included -== - Open the directory that contains the demo files == Otwórz katalog zawierający pliki demo @@ -1650,9 +1608,6 @@ Axis Status == Status -Aim bind -== - Mouse == Mysz @@ -1662,12 +1617,6 @@ Ingame mouse sens. UI mouse sens. == Czułość myszy w menu -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - Cancel == Anuluj @@ -1692,9 +1641,6 @@ Show health, shields and ammo Show local time always == Pokazuj czas lokalny -DDRace HUD -== - Show client IDs in scoreboard == Pokazuj ID klienta w tabeli wyników @@ -1848,5 +1794,64 @@ Loading race demo files Loading sound files == Ładowanie dźwięków +[Graphics error] +An error during command recording occurred. Try to update your GPU drivers. +== + +[Graphics error] +A render command failed. Try to update your GPU drivers. +== + +[Graphics error] +Submitting the render commands failed. Try to update your GPU drivers. +== + +[Graphics error] +Failed to swap framebuffers. Try to update your GPU drivers. +== + +Match %d of %d +== + +Following +== + +Multi-View +== + +%d/%d KiB (%.1f KiB/s) +== + +Cut length +== + +All combined +== + +Folder Link +== + +[Demo details] +map not included +== + +Aim bind +== + +Reset controls +== + +Are you sure that you want to reset the controls to their defaults? +== + +Tee +== + +DDRace HUD +== + +Show only chat messages from team members +== + Moved ingame == diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt index 9f7e46d66d9..7f6420db645 100644 --- a/data/languages/portuguese.txt +++ b/data/languages/portuguese.txt @@ -659,9 +659,6 @@ Show score Max CSVs == CSVs máximos -Use DDRace Scoreboard -== Usa a tabela de pontuações de DDRace - Best == Melhor @@ -1100,6 +1097,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1532,6 +1532,9 @@ auto Enable long pain sound (used when shooting in freeze) == +Tee +== + Appearance == @@ -1586,6 +1589,9 @@ Opacity of freeze bars inside freeze Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt index a77e356d1b7..31435822c33 100644 --- a/data/languages/romanian.txt +++ b/data/languages/romanian.txt @@ -822,6 +822,9 @@ UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or netwo No answer from server yet. == +%d/%d KiB (%.1f KiB/s) +== + Getting game info == @@ -1401,6 +1404,9 @@ Map sound volume Background music volume == +Tee +== + Appearance == @@ -1440,9 +1446,6 @@ Show votes window after voting DDRace HUD == -Use DDRace Scoreboard -== - Show client IDs in scoreboard == @@ -1476,6 +1479,9 @@ Always show chat Show names in chat in team colors == +Show only chat messages from team members +== + Use old chat style == diff --git a/data/languages/russian.txt b/data/languages/russian.txt index ae3df54f4cb..d9c83251714 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -500,9 +500,6 @@ Enable team chat sound Enable highlighted chat sound == Звуки выделенных сообщений -Use DDRace Scoreboard -== Использовать DDRace табло счета - Show kill messages == Показывать сообщения о смерти @@ -1833,15 +1830,24 @@ Loading… Loading demo file from storage == +%d/%d KiB (%.1f KiB/s) +== + No login required == Player info change cooldown == +Tee +== + Always show chat == +Show only chat messages from team members +== + Show friend mark (♥) in name plates == diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt index 3e82a6a96e3..bb8c47fb1c3 100644 --- a/data/languages/serbian.txt +++ b/data/languages/serbian.txt @@ -832,9 +832,6 @@ Assets DDNet Client needs to be restarted to complete update! == Potrebno je ponovo pokrenuti DDNet klijent da biste dovršili ažuriranje! -Use DDRace Scoreboard -== Koristi DDRace tabelu rezultata - Show score == Prikaži bodove @@ -1733,6 +1730,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1796,6 +1796,9 @@ Deactivate all Player info change cooldown == +Tee +== + Info Messages == @@ -1805,6 +1808,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt index 38b99e172ef..bcd5bb72294 100644 --- a/data/languages/serbian_cyrillic.txt +++ b/data/languages/serbian_cyrillic.txt @@ -831,9 +831,6 @@ Assets DDNet Client needs to be restarted to complete update! == Потребно је поново покренути DDNet клијент да бисте довршили ажурирање! -Use DDRace Scoreboard -== Користи DDRace табелу резултата - Show score == Прикажи бодове @@ -1539,6 +1536,9 @@ Videos directory Video was saved to '%s' == +%d/%d KiB (%.1f KiB/s) +== + No login required == @@ -1753,6 +1753,9 @@ Cancel Graphics card == +Tee +== + Info Messages == @@ -1762,6 +1765,9 @@ Show local time always Always show chat == +Show only chat messages from team members +== + Chat font size == diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index 90b6b537e70..b07a8a2e77b 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -604,9 +604,6 @@ LAN Name plates size == 昵称大小 -Use DDRace Scoreboard -== 使用 DDRace 计分板 - Show score == 显示分数 @@ -1885,3 +1882,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == 始终显示其他玩家的钩索辅助线 + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt index 479dcd95255..92719dcefc6 100644 --- a/data/languages/slovak.txt +++ b/data/languages/slovak.txt @@ -1423,9 +1423,6 @@ Show votes window after voting DDRace HUD == DDRace HUD -Use DDRace Scoreboard -== Použiť DDRace tabuľku výsledkov - Show client IDs in scoreboard == Zobraziť ID klientov vo výsledkovej tabuľke @@ -1846,3 +1843,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == Vždy zobraziť čiaru kolízie hákov ostatných hráčov + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index fb2b1ca3d24..a7a457a093a 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -814,9 +814,6 @@ DDNet DDNet Client needs to be restarted to complete update! == ¡El Cliente DDNet debe reiniciarse para completar la actualización! -Use DDRace Scoreboard -== Utilizar el marcador DDRace - Show score == Mostrar puntaje @@ -1864,3 +1861,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == Siempre mostrar la línea de colisión del gancho de otros jugadores + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index 0261ddebb82..d3467ed6aa6 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -867,9 +867,6 @@ DDNet %s is out! Highlighted message == Betona meddelande -Use DDRace Scoreboard -== Använd DDRace poänglista - AntiPing: predict weapons == AntiPing: predicera vapen @@ -1848,3 +1845,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == Visa alltid andra spelares hook kollisions linjer + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index b596de128e8..e30076b3586 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -593,9 +593,6 @@ LAN Name plates size == 暱稱大小 -Use DDRace Scoreboard -== 使用 DDRace 計分板 - Show score == 顯示比分 @@ -1874,3 +1871,12 @@ Always show own player's hook collision line Always show other players' hook collision lines == 始終顯示其他玩家的鉤索輔助線 + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index 804acab1dfa..7ba614ae67e 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -807,9 +807,6 @@ DDNet DDNet Client needs to be restarted to complete update! == Güncellemenin tamamlanabilmesi için oyunun yeniden başlatılması lazım! -Use DDRace Scoreboard -== DDRace skor tablosunu kulan - Show score == Skoru göster @@ -1854,3 +1851,12 @@ Always show other players' hook collision lines [Demo details] map not included == harita dahil edilmemiş + +%d/%d KiB (%.1f KiB/s) +== + +Tee +== + +Show only chat messages from team members +== diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index 9bb1270fe66..7f3075053a7 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -1746,9 +1746,6 @@ Uploading map data to GPU Use current map as background == Використовувати поточну мапу як фон -Use DDRace Scoreboard -== Використовувати табло DDRace - Use high DPI == Високий DPI @@ -1852,3 +1849,6 @@ Zoom out == Віддалити ##### needs translation ##### + +Show only chat messages from team members +== From 4773930e959987c2adc530c07aa0c6abd7a9ceeb Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Sat, 8 Jun 2024 09:03:02 +0800 Subject: [PATCH 037/179] Update German translations --- data/languages/german.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/languages/german.txt b/data/languages/german.txt index 9060bda1284..8bf049603d7 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -1861,10 +1861,10 @@ Always show other players' hook collision lines == Immer Hakenkollisionslinie anderer Spieler anzeigen %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== Nur Nachrichten von Teammitgliedern anzeigen From 62f0849ca74303e501e6afa1d4f5743c687c21b3 Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Sat, 8 Jun 2024 10:11:03 +0800 Subject: [PATCH 038/179] Update credits --- src/game/server/ddracechat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index 080e7b067a3..6941eb35f22 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -54,7 +54,7 @@ void CGameContext::ConCredits(IConsole::IResult *pResult, void *pUserData) pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "chatresp", "Teero, furo, dobrykafe, Moiman, JSaurusRex,"); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "chatresp", - "Steinchen & others"); + "Steinchen, ewancg, gerdoe-jr, BlaiZephyr & others"); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "chatresp", "Based on DDRace by the DDRace developers,"); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "chatresp", From 56fe2a930c9a0ac1f7be5341e10e2b7d4d122015 Mon Sep 17 00:00:00 2001 From: Andriy <113429882+EGYT5453@users.noreply.github.com> Date: Sat, 8 Jun 2024 12:06:12 +0300 Subject: [PATCH 039/179] Update Ukrainian l10n (18.3) --- data/languages/ukrainian.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index 7f3075053a7..abcdf8a3eb0 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -1465,6 +1465,9 @@ Show names in chat in team colors Show only chat messages from friends == Показувати лише повідомлення від друзів +Show only chat messages from team members +== Показувати лише повідомлення від членів команди + Show other players' hook collision lines == Показувати лінії зіткнення гака інших гравців @@ -1849,6 +1852,3 @@ Zoom out == Віддалити ##### needs translation ##### - -Show only chat messages from team members -== From f5de30ee88818d6e1345119e277b0def65a2a030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 8 Jun 2024 12:42:03 +0200 Subject: [PATCH 040/179] Fix wrong context value being used for translation lookup The trailing `]` was not being removed from the context anymore due to an off-by-one error introduced in #8430. Closes #8464. --- src/game/localization.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/localization.cpp b/src/game/localization.cpp index f6471bb8326..7d65b442682 100644 --- a/src/game/localization.cpp +++ b/src/game/localization.cpp @@ -210,7 +210,7 @@ bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, ICon log_error("localization", "malformed context '%s' on line %d", pLine, Line); continue; } - str_truncate(aContext, sizeof(aContext), pLine + 1, Len - 1); + str_truncate(aContext, sizeof(aContext), pLine + 1, Len - 2); pLine = LineReader.Get(); if(!pLine) { From 74441a1f96f8b531e4b0f14c2a2f7cecb3e7c472 Mon Sep 17 00:00:00 2001 From: ByFox <84133700+ByFox213@users.noreply.github.com> Date: Sat, 8 Jun 2024 18:16:22 +0500 Subject: [PATCH 041/179] Update russian.txt --- data/languages/russian.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index d9c83251714..8a20199be33 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1828,40 +1828,40 @@ Loading… == Загрузка… Loading demo file from storage -== +== Загрузка демо-файла из хранилища %d/%d KiB (%.1f KiB/s) -== +== %d/%d КиБ (%.1f КиБ/s) No login required -== +== Вход не требуется Player info change cooldown -== +== Информация об игроке изменяет время ожидания Tee -== +== Тии Always show chat -== +== Всегда показывать чат Show only chat messages from team members -== +== Показывать только сообщения в чате от членов команды Show friend mark (♥) in name plates -== +== Покажите знак друга (♥) на табличках с именами Show hook strength icon indicator -== +== Отображение индикатора крюка Show hook strength number indicator -== +== Отображение индикатора силы крюка Show own player's hook collision line -== +== Отображать линию столкновения собственного крюка Always show own player's hook collision line -== +== Всегда показывать линию собственного крюка Always show other players' hook collision lines -== +== Всегда показывайть линии крюков других игроков From 660d953a80c20cda4feeeb6c10df2177fac3f9a0 Mon Sep 17 00:00:00 2001 From: ByFox <84133700+ByFox213@users.noreply.github.com> Date: Sat, 8 Jun 2024 19:44:04 +0500 Subject: [PATCH 042/179] Update russian.txt --- data/languages/russian.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 8a20199be33..743bf825dee 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1834,34 +1834,34 @@ Loading demo file from storage == %d/%d КиБ (%.1f КиБ/s) No login required -== Вход не требуется +== аутентификация не требуется Player info change cooldown -== Информация об игроке изменяет время ожидания +== Кулдаун смены информации об игроке Tee -== Тии +== Ти Always show chat == Всегда показывать чат Show only chat messages from team members -== Показывать только сообщения в чате от членов команды +== Показывать сообщения только от членов команды Show friend mark (♥) in name plates -== Покажите знак друга (♥) на табличках с именами +== Показывать знак дружбы (♥) в имени друга Show hook strength icon indicator -== Отображение индикатора крюка +== Показывать индикатор вида крюка Show hook strength number indicator -== Отображение индикатора силы крюка +== Показывать индикатор номера вида крюка Show own player's hook collision line -== Отображать линию столкновения собственного крюка +== Показывать собственную линию коллизии крюка Always show own player's hook collision line -== Всегда показывать линию собственного крюка +== Всегда показывать собственную линию коллизии крюка Always show other players' hook collision lines -== Всегда показывайть линии крюков других игроков +== Всегда показывать линию коллизии крюка других игроков From 13fea24da3287763ac3bae4ccf085e25baa48e91 Mon Sep 17 00:00:00 2001 From: Emilcha <79055013+Emilcha@users.noreply.github.com> Date: Sat, 8 Jun 2024 16:57:33 +0200 Subject: [PATCH 043/179] Sort Compare Not Case Sensitive --- src/game/client/components/menus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index f07231d7326..55457fa9035 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -403,7 +403,7 @@ class CMenus : public CComponent bool operator<(const CFriendItem &Other) const { - const int Result = str_comp(m_aName, Other.m_aName); + const int Result = str_comp_nocase(m_aName, Other.m_aName); return Result < 0 || (Result == 0 && str_comp(m_aClan, Other.m_aClan) < 0); } }; From 475681e1fa145f882dd666b120986ad840580d97 Mon Sep 17 00:00:00 2001 From: ByFox <84133700+ByFox213@users.noreply.github.com> Date: Sat, 8 Jun 2024 20:19:23 +0500 Subject: [PATCH 044/179] Update russian.txt --- data/languages/russian.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 743bf825dee..1d0f36dce50 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1828,7 +1828,7 @@ Loading… == Загрузка… Loading demo file from storage -== Загрузка демо-файла из хранилища +== Загрузка демо из файлового хранилища %d/%d KiB (%.1f KiB/s) == %d/%d КиБ (%.1f КиБ/s) @@ -1865,3 +1865,5 @@ Always show own player's hook collision line Always show other players' hook collision lines == Всегда показывать линию коллизии крюка других игроков + +#### need translate #### From f62980b00728d836a07de9ef9931f8a04ae39db2 Mon Sep 17 00:00:00 2001 From: ByFox <84133700+ByFox213@users.noreply.github.com> Date: Sat, 8 Jun 2024 20:20:14 +0500 Subject: [PATCH 045/179] Update russian.txt I mean you wrote '.../s' instead of '.../c' ops --- data/languages/russian.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 1d0f36dce50..403d62a1ec3 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1831,7 +1831,7 @@ Loading demo file from storage == Загрузка демо из файлового хранилища %d/%d KiB (%.1f KiB/s) -== %d/%d КиБ (%.1f КиБ/s) +== %d/%d КиБ (%.1f КиБ/с) No login required == аутентификация не требуется From eb8cd8c7b2708931bcd702bf09c65546bf1e13c1 Mon Sep 17 00:00:00 2001 From: furo Date: Sat, 8 Jun 2024 18:45:18 +0200 Subject: [PATCH 046/179] Update Swedish translations for 18.3 --- data/languages/swedish.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index d3467ed6aa6..0fd3e6c99bf 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -7,7 +7,7 @@ # 3edcxzaq1 2020-06-25 00:00:00 # cur.ie 2020-09-28 00:00:00 # simpygirl 2022-02-20 00:00:00 -# furo 2024-04-20 00:00:00 +# furo 2024-06-08 00:00:00 ##### /authors ##### ##### translated strings ##### @@ -1847,10 +1847,10 @@ Always show other players' hook collision lines == Visa alltid andra spelares hook kollisions linjer %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== Visa bara chattmeddelanden från lagkamrater From 24ea8d8977296e295a4e35cc64c2faf5500a678e Mon Sep 17 00:00:00 2001 From: Emilcha <79055013+Emilcha@users.noreply.github.com> Date: Sat, 8 Jun 2024 19:28:06 +0200 Subject: [PATCH 047/179] Consistancy, #8468 --- src/game/client/components/menus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index 55457fa9035..dae2b20de31 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -404,7 +404,7 @@ class CMenus : public CComponent bool operator<(const CFriendItem &Other) const { const int Result = str_comp_nocase(m_aName, Other.m_aName); - return Result < 0 || (Result == 0 && str_comp(m_aClan, Other.m_aClan) < 0); + return Result < 0 || (Result == 0 && str_comp_nocase(m_aClan, Other.m_aClan) < 0); } }; From 253fd92639e10981e2dde7fb2017a860e2aada47 Mon Sep 17 00:00:00 2001 From: Emilcha <79055013+Emilcha@users.noreply.github.com> Date: Sun, 9 Jun 2024 11:29:59 +0200 Subject: [PATCH 048/179] new french translation --- data/languages/newfrench.txt | 1877 ++++++++++++++++++++++++++++++++++ 1 file changed, 1877 insertions(+) create mode 100644 data/languages/newfrench.txt diff --git a/data/languages/newfrench.txt b/data/languages/newfrench.txt new file mode 100644 index 00000000000..b4e3258f9ff --- /dev/null +++ b/data/languages/newfrench.txt @@ -0,0 +1,1877 @@ +##### authors ##### +#originally created by: +# +#modified by: +# lordskelethom 2010-05-30 14:01:11 +# Ubu 2010-05-30 18:41:43 +# Choupom 2010-10-11 00:32:54 +# Choupom 2010-11-21 14:07:30 +# Choupom 2011-01-05 22:13:44 +# clecle226 2011-02-09 12:28:39 +# clecle226 2011-02-12 23:43:59 +# Choupom 2011-02-13 12:24:15 +# Choupom 2011-04-02 19:53:54 +# Choupom 2011-04-03 23:00:57 +# Ubu 2011-04-04 21:09:05 +# Choupom 2011-07-02 19:23:49 +# SunnyPistache & Pipou 2020-07-09 21:09:00 +# SunnyPistache & Pipou 2020-10-03 09:29:00 +# SunnyPistache & Pipou 2020-11-07 11:30:00 +# Chairn 2021-05-31 20:00:00 +# T tee 2021-06-01 00:39:00 +# T tee & NRK & Chairn 2022-03-23 20:52:52 +# Nouaa 2022-05-14 23:00:00 +# Chairn 2022-06-16 19:00:00 +# Sucre 2022-07-19 20:36:00 +# archimede67 2022-08-15 13:02:00 +# Nouaa 2022-10-25 18:00:00 +# Sukya 2023-05-20 19:38:00 + +##### /authors ##### + +##### translated strings ##### + +%ds left +== %ds restantes + +%i minute left +== %i minute restante + +%i minutes left +== %i minutes restantes + +%i second left +== %i seconde restante + +%i seconds left +== %i secondes restantes + +%s wins! +== %s gagne ! + +Abort +== Annuler + +Add +== Ajouter + +Add Friend +== Ajouter aux amis + +Address +== Adresse + +All +== Tout le monde + +Are you sure that you want to quit? +== Êtes-vous sûrs de vouloir quitter ? + +Automatically record demos +== Enregistrer les démos automatiquement + +Automatically take game over screenshot +== Prendre une capture d'écran de fin de partie automatiquement + +Blue team +== Équipe bleue + +Blue team wins! +== L'équipe bleue gagne ! + +Body +== Corps + +Call vote +== Voter + +Change settings +== Changer les options + +Chat +== Chat + +Clan +== Clan + +Client +== Client + +Connecting to +== Connexion à + +Connection Problems… +== Problèmes de connexion… + +Console +== Console + +Controls +== Contrôles + +Count players only +== Seulement les joueurs + +Current +== Actuellement + +Custom colors +== Couleurs personnalisées + +Delete +== Supprimer + +Delete demo +== Supprimer la démo + +Demofile: %s +== Démo : %s + +Demos +== Démos + +Disconnect +== Partir + +Disconnected +== Déconnecté + +Downloading map +== Téléchargement de la carte + +Draw! +== Égalité ! + +Dynamic Camera +== Caméra dynamique + +Emoticon +== Émoticônes + +Error +== Erreur + +Error loading demo +== Erreur pendant le chargement de la démo + +Favorite +== Favori + +Favorites +== Favoris + +Feet +== Pieds + +Fire +== Tirer + +Folder +== Dossier + +Force vote +== Forcer le vote + +Free-View +== Vue libre + +Fullscreen +== Plein écran + +Game +== Jeu + +Game info +== Info. jeu + +Game over +== Fin de la partie + +Game type +== Type de jeu + +Game types: +== Types de jeu : + +General +== Général + +Graphics +== Affichage + +Grenade +== Lance-grenade + +Hammer +== Marteau + +Has people playing +== Au moins un joueur + +High Detail +== Tous les détails + +Hook +== Grappin + +Invalid Demo +== Démo invalide + +Join blue +== Rej. Bleus + +Join red +== Rej. Rouges + +Jump +== Sauter + +Kick player +== Expulser un joueur + +Language +== Langue + +MOTD +== Message du jour + +Map +== Carte + +Move left +== Aller à gauche + +Move player to spectators +== Déplacer un joueur vers le mode spectateur + +Move right +== Aller à droite + +Movement +== Mouvement + +Mute when not active +== Rendre muet en cas d'inactivité + +Name +== Nom + +Next weapon +== Arme suivante + +Nickname +== Pseudonyme + +No +== Non + +No password +== Pas de mot de passe + +No servers found +== Aucun serveur trouvé + +No servers match your filter criteria +== Aucun serveur ne correspond à vos critères + +Ok +== Ok + +Parent Folder +== Dossier parent + +Password +== Mot de passe + +Password incorrect +== Mot de passe incorrect + +Ping +== Ping + +Pistol +== Pistolet + +Play background music +== Jouer la musique de fond + +Player +== Joueur + +Player country: +== Origine des Tees: + +Player options +== Options des joueurs + +Players +== Joueurs + +Please balance teams! +== Équilibrez les équipes ! + +Prev. weapon +== Arme précédente + +Quit +== Quitter + +Reason: +== Raison : + +Red team +== Équipe rouge + +Red team wins! +== L'équipe rouge gagne ! + +Remote console +== Console serveur + +Remove +== Retirer + +Remove friend +== Retirer des amis + +Rename demo +== Renommer la démo + +Reset filter +== Filtres par défaut + +Score +== Score + +Score limit +== Limite des scores + +Scoreboard +== Tableau des scores + +Screenshot +== Capture d'écran + +Server address: +== Adresse du serveur : + +Server info +== Info. serveur + +Server not full +== Pas de serveurs pleins + +Shotgun +== Fusil à pompe + +Show chat +== Afficher le chat + +Show friends only +== Seulement les amis + +Show ingame HUD +== Afficher l'interface du jeu + +Show name plates +== Afficher les pseudonymes + +Sound +== Son + +Sound error +== Erreur de son + +Spectate +== Mode spec. + +Spectate next +== Suivre le Tee d'avant + +Spectate previous +== Suivre le Tee d'après + +Spectator mode +== Option mode spec. + +Spectators +== Spectateurs + +Stop record +== Arrêter l'enregistrement + +Strict gametype filter +== Types de jeux exacts + +Sudden Death +== Mort Subite + +Switch weapon on pickup +== Sélectionner l'arme ramassée + +Team +== Équipe + +Team chat +== Chat d'équipe + +The audio device couldn't be initialised. +== Le périphérique audio n'a pas pu être initialisé. + +The server is running a non-standard tuning on a pure game type. +== Le serveur utilise des paramètres non standards sur un type de jeu standard. + +Time limit +== Limite de temps + +Time limit: %d min +== Limite de temps : %d min + +Try again +== Réessayer + +Type +== Type + +Unable to rename the demo +== Impossible de renommer la démo + +Use sounds +== Jouer les sons + +Use team colors for name plates +== Mettre votre pseudonyme aux couleurs de votre équipe + +V-Sync +== V-Sync + +Version +== Version + +Vote command: +== Commande de vote : + +Vote description: +== Description du vote : + +Vote no +== Voter non + +Vote yes +== Voter oui + +Voting +== Vote + +Warmup +== Échauffement + +Weapon +== Arme + +Yes +== Oui + +You must restart the game for all settings to take effect. +== Les changements prendront effet au prochain redémarrage. + +##### needs translation ##### + +New name: +== Nouveau nom : + +Sat. +== Saturation + +Miscellaneous +== Divers + +Internet +== Internet + +Max demos +== Nombre maximum de démos + +News +== Infos + +Join game +== Rejoindre + +FSAA samples +== Échantillonage FSAA + +Sound volume +== Volume du son général + +Max Screenshots +== Nombre maximum de captures d'écran + +Laser +== Laser + +Hue +== Teinte + +Record demo +== Enregist. démo + +Your skin +== Votre skin + +Reset to defaults +== Réinitialiser + +Round +== Round + +Lht. +== Luminosité + +UI Color +== Couleur du menu + +Alpha +== Alpha + +LAN +== LAN + +Name plates size +== Taille des pseudonymes + +Enable game sounds +== Activer les sons du jeu + +DDNet Client needs to be restarted to complete update! +== Le client DDNet a besoin d'être redémarré pour finir la MAJ ! + +Toggle dummy +== Basculer vers le dummy + +No updates available +== Pas de mise à jour disponible + +1 new mention +== 1 nouveau message + +Save +== Sauvegarder + +Fat skins (DDFat) +== Skins enrobés (DDFat) + +Automatically take statboard screenshot +== Prendre une capture d'écran du tableau des stats automatiquement + +Clan plates size +== Taille du clan + +Zoom out +== Dézoomer + +Show other players' hook collision lines +== Montrer la ligne de collision du grappin des autres joueurs + +Filter connecting players +== Filtre les Tees se connectant + +AntiPing: predict grenade paths +== AntiPing: prédit la trajectoire du lance-grenade + +Size +== Taille + +Enable team chat sound +== Activer les sons du chat d'équipe + +Browser +== Navigateur + +DDNet +== DDNet + +Show all +== Montrer tout le monde + +Vanilla skins only +== Skins par défaut + +DDNet %s is out! +== DDNet %s est disponible! + +Show ghost +== Afficher le fantôme + +Friend message +== Message d'ami + +AntiPing: predict other players +== AntiPing: prédit le déplacement des autres joueurs + +Are you sure that you want to disconnect your dummy? +== Êtes vous sûrs de vouloir déconnecter votre dummy ? + +Reload +== Recharger + +Server best: +== Meilleur score du serveur + +Personal best: +== Meilleur temps personnel + +Skin prefix +== Préfixe de skin + +Date +== Date + +Suicides +== Suicides + +Check now +== Vérifier + +Enable regular chat sound +== Activer les sons de chat par défaut + +Enable server message sound +== Activer les sons des messages du serveur + +Enable gun sound +== Activer le son du pistolet + +Welcome to DDNet +== Bienvenue sur DDNet + +Max CSVs +== CSV maximum + +Statboard +== Tableau des stats + +Show text entities +== Afficher le texte des entités + +Connecting dummy +== Connection du dummy + +Render demo +== Convertir une démo + +Save ghost +== Sauvegarder le fantôme + +Game paused +== Jeu en pause + +Team message +== Message d'équipe + +DDNet Client updated! +== Le client DDNet est à jour! + +Show entities +== Afficher les entités + +Replay feature is disabled! +== L'option de replay est désactivée + +Updating… +== Mise à jour en cours… + +Use high DPI +== Utiliser un DPI élevé + +Default zoom +== Zoom par défaut + +System message +== Message du système + +Are you sure that you want to disconnect? +== Êtes-vous sûrs de vouloir vous déconnecter ? + +Deactivate +== Désactiver + +Update failed! Check log… +== La mise à jour a échoué ! Vérifier les logs… + +%.2f KiB +== %.2f Kio + +Reset +== Défaut + +File already exists, do you want to overwrite it? +== Ce fichier existe déjà, voulez-vous l'écraser ? + +Grabs +== Grappins + +Update now +== Mettre à jour + +Follow +== Suivre + +Converse +== Converser + +Hook collisions +== Collision du grappin + +Frags +== Éliminations + +Indicate map finish +== Indiquer les cartes finies + +Show names in chat in team colors +== Colorer les pseudonymes dans le chat selon la couleur de l'équipe + +Messages +== Messages + +Fetch Info +== Afficher les détails + +Show only chat messages from friends +== Ne montrer que les messages des amis + +Remove chat +== Desactiver le chat + +Pause +== Pause + +Deaths +== Morts + +Length +== Durée + +Normal message +== Message normal + +Dummy copy +== Copiage du dummy + +Demo +== Démo + +Map sound volume +== Volume des sons de la carte + +Time +== Temps + +Exclude +== Exclure + +Disconnect Dummy +== Deconnecter le dummy + +Show clan above name plates +== Afficher le clan au dessus du pseudonyme + +Downloading %s: +== Téléchargement %s: + +Toggle dyncam +== Activer la dyncam + +Show other players' key presses +== Montrer les touches que les autres joueurs appuient + +Toggle ghost +== Activer le fantôme + +Enable highlighted chat sound +== Activer les sons du chat en surbrillance + +Overlay entities +== Afficher les entités + +Net +== Net + +Show HUD +== Afficher l'interface + +DDNet %s is available: +== DDNet %s est disponible: + +Search +== Chercher + +Activate +== Activer + +Hammerfly dummy +== Hammerfly du dummy + +Switch weapon when out of ammo +== Changer d'arme lorsqu'il n'y a plus de munition + +Save the best demo of each race +== Sauvegarder la meilleure démo de chaque course + +may cause delay +== Peut causer du délai + +Show others +== Montrer les autres + +%.2f MiB +== %.2f Mio + +Unfinished map +== Carte non terminée + +Default length +== Durée par défaut + +Highlighted message +== Message en surbrillance + +Successfully saved the replay! +== Le replay est sauvegardé avec succès! + +New random timeout code +== Nouveau code de time-out aléatoire + +FPM +== FPM + +Enable replays +== Activer les replays + +Loading DDNet Client +== Chargement du client DDNet + +Zoom in +== Zoomer + +Ghost +== Fantôme + +Show kill messages +== Afficher les messages d'élimination + +Markers +== Marqueurs + +HUD +== Interface + +Refresh Rate +== Taux de rafraîchissement + +Show score +== Afficher les scores + +Replace video +== Remplacer la vidéo + +Show tiles layers from BG map +== Utiliser les tuiles de la carte de fond + +Show votes window after voting +== Afficher la fenêtre de vote après avoir voté + +%d new mentions +== %d nouveaux messages + +Learn +== Guide + +Restart +== Redémarrer + +AntiPing: predict weapons +== AntiPing: prédit le comportement des armes + +Automatically create statboard csv +== Créer un tableau CSV des stats automatiquement + +Video name: +== Nom de la vidéo + +Show quads +== Afficher les quads + +Best +== Meilleur + +Ratio +== Ratio + +Lock team +== Verrouiller l'équipe + +Screen +== Écran + +Spree +== Série + +AntiPing +== AntiPing + +Enable long pain sound (used when shooting in freeze) +== Activer les sons de douleur du Tee (utilisé lorsqu'un Tee tire depuis le freeze (gel)) + +9+ new mentions +== 9+ nouveaux messages + +Kill +== Tuer + +Types +== Types + +Countries +== Pays + +Gameplay +== Jouabilité + +Connect Dummy +== Connecter le dummy + +Reconnect in %d sec +== Reconnexion dans %d sec + +DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. +== DDRaceNetwork est un jeu coopératif en ligne dont l'objectif est, pour vous ainsi que votre groupe de tees, d'atteindre la ligne d'arrivée d'une carte. En tant que nouveau joueur, il est préférable que vous commenciez sur les serveurs Novice, qui sont constitués des cartes les plus simples. Prenez en compte le ping afin de choisir un serveur proche de chez vous. + +It's recommended that you check the settings to adjust them to your liking before joining a server. +== Il est recommandé d'ajuster les configurations à votre goût avant de rejoindre un serveur. + +Please enter your nickname below. +== Veuillez entrer votre pseudonyme ci-dessous. + +Show DDNet map finishes in server browser +== Afficher les cartes de DDNet terminées dans le navigateur + +transmits your player name to info.ddnet.org +== transmet votre pseudonyme à info.ddnet.org + +Warning +== Alerte + +Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. +== Appuyez sur "k" pour mourir (recommencer) et "a" pour vous mettre en pause afin de regarder les autres joueurs. Allez dans les configurations pour voir davantage de raccourcis. + +Speed +== Vitesse + +Theme +== Thème + +%d of %d servers +== %d sur %d serveurs + +%d of %d server +== %d sur %d serveur + +%d players +== %d joueurs + +%d player +== %d joueur + +Demos directory +== Répertoire des enregistrements + +Skip the main menu +== Passer le menu principal + +Themes directory +== Répertoire des thèmes + +Download skins +== Télécharger des skins + +Skin Database +== Base de données de skins + +Skins directory +== Répertoire des skins + +Background music volume +== Volume de la musique de fond + +Assets +== Assets + +Client message +== Message du client + +Show others (own team only) +== Montrer les autres (de sa propre équipe uniquement) + +Use current map as background +== Utiliser la carte actuelle en tant qu'arrière-plan + +Entities +== Entités + +Emoticons +== Émoticônes + +Particles +== Particules + +Assets directory +== Répertoire des assets + +https://wiki.ddnet.org/ +== https://wiki.ddnet.org/wiki/Main_Page/fr + +Website +== Site web + +Settings +== Configurations + +Stop server +== Arrêter le serveur + +Run server +== Démarrer le serveur + +Server executable not found, can't run server +== L'exécutable du serveur est introuvable, le serveur ne peut donc pas démarrer + +Editor +== Éditeur + +[Start menu] +Play +== Jouer + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== Mode développeur activé. Appuyez sur Ctrl+Maj+D pour le désactiver. + +Existing Player +== Joueur existant + +Your nickname '%s' is already used (%d points). Do you still want to use it? +== Le pseudonyme '%s' est déjà pris (%d points). Voulez-vous tout de même le garder ? + +Checking for existing player with your name +== Vérification de la disponibilité du pseudonyme + +Smooth Dynamic Camera +== Caméra dynamique fluide + +Game sound volume +== Volume des sons du jeu + +Chat sound volume +== Volume des sons du chat + +Use old chat style +== Utiliser l'ancien chat + +Manual +== Manuel + +Race +== Race + +Auto +== Auto + +Replay +== Replay + +The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. +== La largeur de la texture %s n'est pas divisible par %d, ou la hauteur n'est pas divisible par %d, ce qui peut causer des bugs visuels. + +AFR +== AFR + +ASI +== ASI + +AUS +== AUS + +EUR +== EUR + +NA +== AN + +SA +== AS + +CHN +== CHN + +Getting server list from master server +== Obtention de la liste des serveurs depuis le serveur maître + +Leak IP +== Fuiter l'IP + +Chat command +== Commande de chat + +Dummy +== Dummy + +Windowed +== Fenêtré + +Windowed borderless +== Fenêtré sans bordure + +Desktop fullscreen +== Bureau plein écran + +Preview +== Prévisualisation + +Background +== Arrière-plan + +Discord +== Discord + +https://ddnet.org/discord +== https://ddnet.org/discord + +Are you sure that you want to disconnect and switch to a different server? +== Êtes vous sur de vouloir vous déconnecter et changer de serveur? + +Show local player's key presses +== Montrer les touches appuyées des autres joueurs + +Settings file +== Fichier des paramètres + +Config directory +== Répertoire de configuration + +Windowed fullscreen +== Plein écran fenêtré + +Run on join +== Exécuter en rejoignant + +Chat command (e.g. showall 1) +== Commande du chat (ex: showall 1) + +The format of texture %s is not RGBA which will cause visual bugs. +== La texture %s n'est pas au format RGBA, ce qui causera des bugs visuels. + +Join Tutorial Server +== Rejoindre un serveur de tutoriel + +Skip Tutorial +== Passer le tutoriel + +Choose default eyes when joining a server +== Choisissez les yeux par défaut lorsque vous rejoignez un serveur + +Allows maps to render with more detail +== Permet de rendre les cartes avec plus de détails + +Renderer +== Moteur de rendu graphique + +default +== défaut + +custom +== Personnalisé + +auto +== Automatique + +When you cross the start line, show a ghost tee replicating the movements of your best time +== Lorsque vous franchissez la ligne de départ, montrez un fantôme reproduisant les mouvements de votre meilleur temps + +Opacity +== Opacité + +Adjust the opacity of entities belonging to other teams, such as tees and nameplates +== Ajustez l'opacité des entités appartenant à d'autres équipes, telles que les tees et les noms des joueurs + +Quads are used for background decoration +== Les quads sont utilisés pour la décoration de l'arrière-plan + +Tries to predict other entities to give a feel of low latency +== Essaie de prédire les autres entités pour donner une impression de faible latence + +Tutorial +== Tutoriel + +Can't find a Tutorial server +== Impossible de trouver un serveur tutoriel + +Super +== Super + +Team %d +== Équipe %d + +Position: +== Position: + +Speed: +== Vitesse: + +Angle: +== Angle: + +Trying to determine UDP connectivity… +== Tentative de connection UDP… + +UDP seems to be filtered. +== UDP semble filtré. + +UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. +== Les adresses IP UDP et TCP semblent différentes. Essayez de désactiver les VPN, proxy ou accélérateurs réseaux. + +No answer from server yet. +== Aucune réponse du serveur. + +Download community skins +== Télécharger les skins de la communauté + +Enable controller +== Activer la manette + +[Ingame controller mode] +Relative +== Relatif + +[Ingame controller mode] +Absolute +== Absolu + +Ingame controller mode +== Mode manette + +Ingame controller sens. +== Sensibilité manette (jeu) + +UI controller sens. +== Sensibilité manette (menus) + +Controller jitter tolerance +== Tolérance gigue de la manette + +Status +== Statut + +Aim bind +== Touche visée + +Mouse +== Souris + +Ingame mouse sens. +== Sensibilité souris (jeu) + +UI mouse sens. +== Sensibilité souris (menus) + +Controller +== Manette + +Show dummy actions +== Afficher les actions du dummy + +Show freeze bars +== Afficher la barre de gel + +Show player position +== Afficher la position + +Show player speed +== Afficher la vitesse + +Show player target angle +== Afficher l'angle de visée + +Opacity of freeze bars inside freeze +== Opacité de la barre de gel dans le gel + +Normal Color +== Couleur normal + +Highlight Color +== Couleur surbrillante + +Extras +== Extras + +Connected +== Connecté + +Initializing assets +== Initialisation des assets + +Getting game info +== Obtention des informations de la partie + +Requesting to join the game +== Demande de rejoindre la partie + +Loading skin files +== Chargement des fichiers de skin + +Appearance +== Apparence + +Show health, shields and ammo +== Monter la vie, bouclier et les munitions + +DDRace HUD +== HUD DDRace + +Show DDRace HUD +== Montrer l'HUD DDrace + +Show jumps indicator +== Montrer l'indicateur de sauts + +Hook collision line +== Ligne de collision du grapin + +A Tee +== Un Tee + +Loading assets +== Chargement des assets + +Loading sound files +== Chargement des fichiers sonores + +Preparing demo playback +== Préparation de la lecture de la demo + +Loading map file from storage +== Chargement de la map depuis le stockage + +Why are you slowmo replaying to read this? +== Pourquoi rejoues-tu en slow-motion pour lire ça? + +Initializing components +== Initialisation des composants + +Initializing map logic +== Initialisation de la logique de la map + +Sending initial client info +== Envoi des informations initiales du client + +Uploading map data to GPU +== Transfert des données de la map vers le GPU + +Loading menu images +== Chargement des images de menu + +Loading demo files +== Chargement des fichiers de demo + +Loading ghost files +== Chargement des fichiers de fantôme + +Name Plate +== Plaque de nom + +Hook Collisions +== Collisions du grappin + +Show client IDs in scoreboard +== Afficher les IDs des clients dans le tableau des scores + +Hook collision line width +== Largeur de la ligne de collision du grappin + +Hook collision line opacity +== Opacité de la ligne de collision du grappin + +Colors of the hook collision line, in case of a possible collision with: +== Couleurs de la ligne de collision du grappin, dans le cas d'une collision possible avec : + +Your movements are not taken into account when calculating the line colors +== Vos mouvements ne sont pas pris en compte lors du calcul des couleurs de la ligne + +Nothing hookable +== Rien d'accrochable + +Something hookable +== Quelque chose d'accrochable + +Loading race demo files +== Chargement des fichiers de demo de course + +Play the current demo +== Jouer la démo en cours + +Pause the current demo +== Mettre en pause la démo en cours + +Stop the current demo +== Arrêter la démo en cours + +Slow down the demo +== Ralentir la démo + +Speed up the demo +== Accélérer la démo + +Export cut as a separate demo +== Exporter la coupe comme une démo séparée + +Toggle keyboard shortcuts +== Basculer les raccourcis clavier + +Menu opened. Press Esc key again to close menu. +== Menu ouvert. Appuyez à nouveau sur la touche Éch. pour fermer le menu. + +Weapons +== Armes + +[Graphics error] +Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. +== Échec lors de l'initialisation. Essayez de changer gfx_backend à OpenGL ou Vulkan dans le fichier settings_ddnet.cfg dans le dossier de configuration et réessayez. + +[Graphics error] +Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. +== Mémoire graphique insuffisante. Essayez de retirer des ressources personnalisées (skins, entités, etc.), spécialement celles de haute résolution. + +[Graphics error] +An error during command recording occurred. Try to update your GPU drivers. +== Une erreur pendant l'enregistrement des commandes est survenue. Essayez de mettre à jour vos pilotes GPU. + +[Graphics error] +A render command failed. Try to update your GPU drivers. +== Une commande de rendu a échoué. Essayez de mettre à jour vos pilotes GPU. + +[Graphics error] +Submitting the render commands failed. Try to update your GPU drivers. +== L'envoi d'une commande de rendu a échoué. Essayez de mettre à jour vos pilotes GPU. + +[Graphics error] +Failed to swap framebuffers. Try to update your GPU drivers. +== Échec de l'échange de tampons d'images. Essayez de mettre à jour vos pilotes GPU. + +[Graphics error] +Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. +== Erreur inconnue. Essayez de changer gfx_backend à OpenGL ou Vulkan dans le fichier settings_ddnet.cfg dans le dossier de configuration et réessayez. + +[Graphics error] +Could not initialize the given graphics backend, reverting to the default backend now. +== Impossible d'initialiser le moteur de rendu spécifié, nouvel essai avec le moteur par défaut. + +Cancel +== Annuler + +File '%s' already exists, do you want to overwrite it? +== Le fichier '%s' existe déjà, voulez-vous l'écraser ? + +Are you sure that you want to remove the player '%s' from your friends list? +== Êtes-vous sûrs de vouloir retirer le joueur '%s' de votre liste d'amis ? + +Are you sure that you want to remove the clan '%s' from your friends list? +== Êtes-vous sûrs de vouloir retirer le clan '%s' de votre liste d'amis ? + +Go back one tick +== Reculer d'une image + +Go forward one tick +== Avancer d'une image + +Go back one marker +== Aller au marqueur précédent + +Go forward one marker +== Aller au marqueur suivant + +Open the directory that contains the demo files +== Ouvrir le dossier contenant les fichiers démo + +Are you sure that you want to delete the demo '%s'? +== Êtes-vous sûrs de vouloir supprimer la démo '%s' ? + +Unable to delete the demo '%s' +== Impossible de supprimer la démo '%s' + +Save power by lowering refresh rate (higher input latency) +== Économiser la puissance en diminuant le taux de rafraîchissement (augmente la latence d'entrée) + +Open the settings file +== Ouvrir le fichier de configuration + +Open the directory that contains the configuration and user files +== Ouvrir le dossier de configuration et des fichiers personnalisés + +Open the directory to add custom themes +== Ouvrir le dossier pour ajouter un thème personnalisé + +Open the directory to add custom skins +== Ouvrir le dossier pour ajouter des skins personnalisés + +No controller found. Plug in a controller. +== Aucune manette détectée. Branchez une manette. + +Reset controls +== Réinitialiser les contrôles + +Are you sure that you want to reset the controls to their defaults? +== Êtes-vous sûrs de vouloir réinitialiser les contrôles aux valeurs par défaut ? + +Rifle Laser Outline Color +== Couleur fusil laser (contour) + +Rifle Laser Inner Color +== Couleur fusil laser (intérieur) + +Shotgun Laser Outline Color +== Couleur fusil à pompe (contour) + +Shotgun Laser Inner Color +== Couleur fusil à pompe (intérieur) + +Door Laser Outline Color +== Couleur porte laser (contour) + +Door Laser Inner Color +== Couleur porte laser (intérieur) + +Freeze Laser Outline Color +== Couleur laser gelant (contour) + +Freeze Laser Inner Color +== Couleur laser gelant (intérieur) + +Set all to Rifle +== Copier les réglages du fusil laser à tous + +Unregister protocol and file extensions +== Désenregistrer le protocole et les extensions de fichier + +Open the directory to add custom assets +== Ouvrir le dossier pour ajouter des ressources personnalisées + +[Graphics error] +Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. +== Impossible d'initialiser l'interface graphique, tu n'as probablement pas installé les pilotes de ta carte graphique. + +Could not save downloaded map. Try manually deleting this file: %s +== Impossible de sauvegarder la carte téléchargé. Essayez de supprimer ce fichier manuellement: %s + +Copy info +== Copier les infos + +Online players (%d) +== Joueurs en ligne (%d) + +Online clanmates (%d) +== Membres du clan en ligne (%d) + +[friends (server browser)] +Offline (%d) +== Hors-Ligne (%d) + +Click to select server. Double click to join your friend. +== Cliquez pour sélectionner ce serveur. Double-cliquez pour rejoindre votre ami(e) + +Click to remove this player from your friends list. +== Cliquez pour retirer ce joueur de votre liste d'amis + +Click to remove this clan from your friends list. +== Cliquez pour retirer ce clan de votre liste d'amis + +None +== Aucuns + +Add Clan +== Ajouter clan + +Create a random skin +== Créer un skin aléatoire + +Error playing demo +== Erreur durant la lecture de la demo + +Failed saving the replay! +== Erreur durant la sauvegarde du replay ! + +Saving settings to '%s' failed +== La sauvegarde des paramètres vers '%s' à échouée + +Error saving settings +== Erreur durant la sauvegarde des paramètres + +Loading demo file from storage +== Chargement du fichier de la demo à partir du stockage + +Quitting. Please wait… +== En train de quitter. Veuillez attendre… + +Restarting. Please wait… +== Redémarrage. Veuillez patienter… + +Searching +== Recherche + +Enter Username +== Saisir le nom d'utilisateur + +Enter Password +== Saisir le mot de passe + +NOT CONNECTED +== NON CONNECTÉ + +Match %d of %d +== Match %d sur %d + +No results +== Aucun résultat + +Lines %d - %d (%s) +== Lignes %d - %d (%s) + +Locked +== Verrouillé + +Following +== Suivi + +Loading commands… +== + +Multi-View +== Chargement des commandes… + +Some map images could not be loaded. Check the local console for details. +== Certaines images de carte n'ont pas pu être chargées. Consultez la console locale pour plus de détails. + +Some map sounds could not be loaded. Check the local console for details. +== Certains sons de carte n'ont pas pu être chargés. Consultez la console locale pour plus de détails. + +Loading menu themes +== Chargement des thèmes du menu + +Press a key… +== Appuyez sur une touche… + +Main menu +== Menu principal + +Rename folder +== Renommer le dossier + +Render complete +== Rendu terminé + +Are you sure that you want to restart? +== Êtes-vous sûr de vouloir recommencer ? + +There's an unsaved map in the editor, you might want to save it. +== Il y a une carte non enregistrée dans l’éditeur, vous voulez peut-être l’enregistrer. + +Continue anyway? +== Continuer quand même ? + +A demo with this name already exists +== Une démo avec ce nom existe déjà + +A folder with this name already exists +== Un dossier avec ce nom existe déjà + +Unable to rename the folder +== Impossible de renommer le dossier + +(paused) +== (en pause) + +Videos directory +== Dossier des vidéos + +Video was saved to '%s' +== La vidéo a été enregistrée dans '%s' + +%d/%d KiB (%.1f KiB/s) +== %d/%d Kio (%.1f Kio/s) + +No login required +== Le login n'est pas requis + +Communities +== Communautés + +No server selected +== Aucun serveur sélectionné + +Server filter +== Filtre de serveur + +Friends +== Amis + +Go back the specified duration +== Saut en arrière de la durée spécifiée + +[Demo player duration] +%d min. +== %d min. + +[Demo player duration] +%d sec. +== %d sec. + +Change the skip duration +== Modifier la durée du saut + +Go forward the specified duration +== Saut en avant de la durée spécifiée + +Mark the beginning of a cut (right click to reset) +== Marquer le début d’un cut (clic droit pour réinitialiser) + +Mark the end of a cut (right click to reset) +== Marquer la fin d’un cut (clic droit pour réinitialiser) + +Close the demo player +== Fermer le lecteur de demo + +Export demo cut +== Exporter le cut de la demo + +Cut interval +== Intervale de cut + +Cut length +== Longeur du cut + +Render cut to video +== Rendu du cut vers une vidéo + +Please use a different filename +== Veuillez utiliser un nom de fichier différent + +All combined +== Tout combiné + +No demo selected +== Aucune demo sélectionnée + +Folder Link +== Dossier Lien + +Created +== Créé + +Netversion +== Netversion + +[Demo details] +map not included +== carte non incluse + +Are you sure that you want to delete the folder '%s'? +== Êtes-vous sûr de vouloir supprimer le dossier '%s'? + +Delete folder +== Supprimer le dossier + +Unable to delete the folder '%s'. Make sure it's empty first. +== Impossible de supprimer le dossier '%s'. Assurez-vous d’abord qu’il est vide. + +Loading… +== Chargement… + +Ghosts directory +== Dossier des fantômes + +Activate all +== Tous activer + +Deactivate all +== Tous désactiver + +Player info change cooldown +== Délai de changement des informations du joueur + +Axis +== Axe + +Graphics card +== Carte graphique + +Tee +== Tee + +Info Messages +== Messages d'information + +Show local time always +== Toujours afficher l’heure locale + +Always show chat +== Toujours afficher le chat + +Show only chat messages from team members +== Afficher uniquement les messages des membres de l’équipe + +Chat font size +== Taille de police du chat + +Chat width +== Largeur du chat + +Show friend mark (♥) in name plates +== Montrez l'icone d’ami (♥) dans les pseudonymes + +Show hook strength icon indicator +== Afficher l’indicateur de force du grappin + +Show hook strength number indicator +== Afficher le nombre de force du grappin + +Authed name color in scoreboard +== Couleur des nom authentifié dans le tableau des scores + +Same clan color in scoreboard +== Couleur des membre du clan dans le tableau des scores + +Show own player's hook collision line +== Montrer la collision du grappin du joueur + +Always show own player's hook collision line +== Toujours montrer la collision du grappin du joueur + +Always show other players' hook collision lines +== Toujours montrer la collision du grappin des autres joueur + +Show finish messages +== Afficher les messages de fin de course + +Enable ghost +== Activer le fantôme + +Only save improvements +== Enregistrer que les améliorations + +Regular background color +== Couleur de fond + +Entities background color +== Couleur de fond des entités + +Moved ingame +== Déplacé en jeu From e0ce7228e8b1cf64f23d234cbc11d64ef168dd72 Mon Sep 17 00:00:00 2001 From: Emilcha <79055013+Emilcha@users.noreply.github.com> Date: Sun, 9 Jun 2024 11:32:33 +0200 Subject: [PATCH 049/179] merge into translation file + credits --- data/languages/french.txt | 179 ++-- data/languages/newfrench.txt | 1877 ---------------------------------- 2 files changed, 90 insertions(+), 1966 deletions(-) delete mode 100644 data/languages/newfrench.txt diff --git a/data/languages/french.txt b/data/languages/french.txt index 612b7ec67e4..0571122a00f 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -26,6 +26,7 @@ # archimede67 2022-08-15 13:02:00 # Nouaa 2022-10-25 18:00:00 # Sukya 2023-05-20 19:38:00 +# Emilcha 2023-06-09 11:31:00 ##### /authors ##### @@ -1604,274 +1605,274 @@ Create a random skin == Créer un skin aléatoire Error playing demo -== +== Erreur durant la lecture de la demo Failed saving the replay! -== +== Erreur durant la sauvegarde du replay ! Saving settings to '%s' failed -== +== La sauvegarde des paramètres vers '%s' à échouée Error saving settings -== +== Erreur durant la sauvegarde des paramètres Loading demo file from storage -== +== Chargement du fichier de la demo à partir du stockage Quitting. Please wait… -== +== En train de quitter. Veuillez attendre… Restarting. Please wait… -== +== Redémarrage. Veuillez patienter… Searching -== +== Recherche Enter Username -== +== Saisir le nom d'utilisateur Enter Password -== +== Saisir le mot de passe NOT CONNECTED -== +== NON CONNECTÉ Match %d of %d -== +== Match %d sur %d No results -== +== Aucun résultat Lines %d - %d (%s) -== +== Lignes %d - %d (%s) Locked -== +== Verrouillé Following -== +== Suivi Loading commands… == Multi-View -== +== Chargement des commandes… Some map images could not be loaded. Check the local console for details. -== +== Certaines images de carte n'ont pas pu être chargées. Consultez la console locale pour plus de détails. Some map sounds could not be loaded. Check the local console for details. -== +== Certains sons de carte n'ont pas pu être chargés. Consultez la console locale pour plus de détails. Loading menu themes -== +== Chargement des thèmes du menu Press a key… -== +== Appuyez sur une touche… Main menu -== +== Menu principal Rename folder -== +== Renommer le dossier Render complete -== +== Rendu terminé Are you sure that you want to restart? -== +== Êtes-vous sûr de vouloir recommencer ? There's an unsaved map in the editor, you might want to save it. -== +== Il y a une carte non enregistrée dans l’éditeur, vous voulez peut-être l’enregistrer. Continue anyway? -== +== Continuer quand même ? A demo with this name already exists -== +== Une démo avec ce nom existe déjà A folder with this name already exists -== +== Un dossier avec ce nom existe déjà Unable to rename the folder -== +== Impossible de renommer le dossier (paused) -== +== (en pause) Videos directory -== +== Dossier des vidéos Video was saved to '%s' -== +== La vidéo a été enregistrée dans '%s' %d/%d KiB (%.1f KiB/s) -== +== %d/%d Kio (%.1f Kio/s) No login required -== +== Le login n'est pas requis Communities -== +== Communautés No server selected -== +== Aucun serveur sélectionné Server filter -== +== Filtre de serveur Friends -== +== Amis Go back the specified duration -== +== Saut en arrière de la durée spécifiée [Demo player duration] %d min. -== +== %d min. [Demo player duration] %d sec. -== +== %d sec. Change the skip duration -== +== Modifier la durée du saut Go forward the specified duration -== +== Saut en avant de la durée spécifiée Mark the beginning of a cut (right click to reset) -== +== Marquer le début d’un cut (clic droit pour réinitialiser) Mark the end of a cut (right click to reset) -== +== Marquer la fin d’un cut (clic droit pour réinitialiser) Close the demo player -== +== Fermer le lecteur de demo Export demo cut -== +== Exporter le cut de la demo Cut interval -== +== Intervale de cut Cut length -== +== Longeur du cut Render cut to video -== +== Rendu du cut vers une vidéo Please use a different filename -== +== Veuillez utiliser un nom de fichier différent All combined -== +== Tout combiné No demo selected -== +== Aucune demo sélectionnée Folder Link -== +== Dossier Lien Created -== +== Créé Netversion -== +== Netversion [Demo details] map not included -== +== carte non incluse Are you sure that you want to delete the folder '%s'? -== +== Êtes-vous sûr de vouloir supprimer le dossier '%s'? Delete folder -== +== Supprimer le dossier Unable to delete the folder '%s'. Make sure it's empty first. -== +== Impossible de supprimer le dossier '%s'. Assurez-vous d’abord qu’il est vide. Loading… -== +== Chargement… Ghosts directory -== +== Dossier des fantômes Activate all -== +== Tous activer Deactivate all -== +== Tous désactiver Player info change cooldown -== +== Délai de changement des informations du joueur Axis -== +== Axe Graphics card -== +== Carte graphique Tee -== +== Tee Info Messages -== +== Messages d'information Show local time always -== +== Toujours afficher l’heure locale Always show chat -== +== Toujours afficher le chat Show only chat messages from team members -== +== Afficher uniquement les messages des membres de l’équipe Chat font size -== +== Taille de police du chat Chat width -== +== Largeur du chat Show friend mark (♥) in name plates -== +== Montrez l'icone d’ami (♥) dans les pseudonymes Show hook strength icon indicator -== +== Afficher l’indicateur de force du grappin Show hook strength number indicator -== +== Afficher le nombre de force du grappin Authed name color in scoreboard -== +== Couleur des nom authentifié dans le tableau des scores Same clan color in scoreboard -== +== Couleur des membre du clan dans le tableau des scores Show own player's hook collision line -== +== Montrer la collision du grappin du joueur Always show own player's hook collision line -== +== Toujours montrer la collision du grappin du joueur Always show other players' hook collision lines -== +== Toujours montrer la collision du grappin des autres joueur Show finish messages -== +== Afficher les messages de fin de course Enable ghost -== +== Activer le fantôme Only save improvements -== +== Enregistrer que les améliorations Regular background color -== +== Couleur de fond Entities background color -== +== Couleur de fond des entités Moved ingame -== +== Déplacé en jeu diff --git a/data/languages/newfrench.txt b/data/languages/newfrench.txt deleted file mode 100644 index b4e3258f9ff..00000000000 --- a/data/languages/newfrench.txt +++ /dev/null @@ -1,1877 +0,0 @@ -##### authors ##### -#originally created by: -# -#modified by: -# lordskelethom 2010-05-30 14:01:11 -# Ubu 2010-05-30 18:41:43 -# Choupom 2010-10-11 00:32:54 -# Choupom 2010-11-21 14:07:30 -# Choupom 2011-01-05 22:13:44 -# clecle226 2011-02-09 12:28:39 -# clecle226 2011-02-12 23:43:59 -# Choupom 2011-02-13 12:24:15 -# Choupom 2011-04-02 19:53:54 -# Choupom 2011-04-03 23:00:57 -# Ubu 2011-04-04 21:09:05 -# Choupom 2011-07-02 19:23:49 -# SunnyPistache & Pipou 2020-07-09 21:09:00 -# SunnyPistache & Pipou 2020-10-03 09:29:00 -# SunnyPistache & Pipou 2020-11-07 11:30:00 -# Chairn 2021-05-31 20:00:00 -# T tee 2021-06-01 00:39:00 -# T tee & NRK & Chairn 2022-03-23 20:52:52 -# Nouaa 2022-05-14 23:00:00 -# Chairn 2022-06-16 19:00:00 -# Sucre 2022-07-19 20:36:00 -# archimede67 2022-08-15 13:02:00 -# Nouaa 2022-10-25 18:00:00 -# Sukya 2023-05-20 19:38:00 - -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds restantes - -%i minute left -== %i minute restante - -%i minutes left -== %i minutes restantes - -%i second left -== %i seconde restante - -%i seconds left -== %i secondes restantes - -%s wins! -== %s gagne ! - -Abort -== Annuler - -Add -== Ajouter - -Add Friend -== Ajouter aux amis - -Address -== Adresse - -All -== Tout le monde - -Are you sure that you want to quit? -== Êtes-vous sûrs de vouloir quitter ? - -Automatically record demos -== Enregistrer les démos automatiquement - -Automatically take game over screenshot -== Prendre une capture d'écran de fin de partie automatiquement - -Blue team -== Équipe bleue - -Blue team wins! -== L'équipe bleue gagne ! - -Body -== Corps - -Call vote -== Voter - -Change settings -== Changer les options - -Chat -== Chat - -Clan -== Clan - -Client -== Client - -Connecting to -== Connexion à - -Connection Problems… -== Problèmes de connexion… - -Console -== Console - -Controls -== Contrôles - -Count players only -== Seulement les joueurs - -Current -== Actuellement - -Custom colors -== Couleurs personnalisées - -Delete -== Supprimer - -Delete demo -== Supprimer la démo - -Demofile: %s -== Démo : %s - -Demos -== Démos - -Disconnect -== Partir - -Disconnected -== Déconnecté - -Downloading map -== Téléchargement de la carte - -Draw! -== Égalité ! - -Dynamic Camera -== Caméra dynamique - -Emoticon -== Émoticônes - -Error -== Erreur - -Error loading demo -== Erreur pendant le chargement de la démo - -Favorite -== Favori - -Favorites -== Favoris - -Feet -== Pieds - -Fire -== Tirer - -Folder -== Dossier - -Force vote -== Forcer le vote - -Free-View -== Vue libre - -Fullscreen -== Plein écran - -Game -== Jeu - -Game info -== Info. jeu - -Game over -== Fin de la partie - -Game type -== Type de jeu - -Game types: -== Types de jeu : - -General -== Général - -Graphics -== Affichage - -Grenade -== Lance-grenade - -Hammer -== Marteau - -Has people playing -== Au moins un joueur - -High Detail -== Tous les détails - -Hook -== Grappin - -Invalid Demo -== Démo invalide - -Join blue -== Rej. Bleus - -Join red -== Rej. Rouges - -Jump -== Sauter - -Kick player -== Expulser un joueur - -Language -== Langue - -MOTD -== Message du jour - -Map -== Carte - -Move left -== Aller à gauche - -Move player to spectators -== Déplacer un joueur vers le mode spectateur - -Move right -== Aller à droite - -Movement -== Mouvement - -Mute when not active -== Rendre muet en cas d'inactivité - -Name -== Nom - -Next weapon -== Arme suivante - -Nickname -== Pseudonyme - -No -== Non - -No password -== Pas de mot de passe - -No servers found -== Aucun serveur trouvé - -No servers match your filter criteria -== Aucun serveur ne correspond à vos critères - -Ok -== Ok - -Parent Folder -== Dossier parent - -Password -== Mot de passe - -Password incorrect -== Mot de passe incorrect - -Ping -== Ping - -Pistol -== Pistolet - -Play background music -== Jouer la musique de fond - -Player -== Joueur - -Player country: -== Origine des Tees: - -Player options -== Options des joueurs - -Players -== Joueurs - -Please balance teams! -== Équilibrez les équipes ! - -Prev. weapon -== Arme précédente - -Quit -== Quitter - -Reason: -== Raison : - -Red team -== Équipe rouge - -Red team wins! -== L'équipe rouge gagne ! - -Remote console -== Console serveur - -Remove -== Retirer - -Remove friend -== Retirer des amis - -Rename demo -== Renommer la démo - -Reset filter -== Filtres par défaut - -Score -== Score - -Score limit -== Limite des scores - -Scoreboard -== Tableau des scores - -Screenshot -== Capture d'écran - -Server address: -== Adresse du serveur : - -Server info -== Info. serveur - -Server not full -== Pas de serveurs pleins - -Shotgun -== Fusil à pompe - -Show chat -== Afficher le chat - -Show friends only -== Seulement les amis - -Show ingame HUD -== Afficher l'interface du jeu - -Show name plates -== Afficher les pseudonymes - -Sound -== Son - -Sound error -== Erreur de son - -Spectate -== Mode spec. - -Spectate next -== Suivre le Tee d'avant - -Spectate previous -== Suivre le Tee d'après - -Spectator mode -== Option mode spec. - -Spectators -== Spectateurs - -Stop record -== Arrêter l'enregistrement - -Strict gametype filter -== Types de jeux exacts - -Sudden Death -== Mort Subite - -Switch weapon on pickup -== Sélectionner l'arme ramassée - -Team -== Équipe - -Team chat -== Chat d'équipe - -The audio device couldn't be initialised. -== Le périphérique audio n'a pas pu être initialisé. - -The server is running a non-standard tuning on a pure game type. -== Le serveur utilise des paramètres non standards sur un type de jeu standard. - -Time limit -== Limite de temps - -Time limit: %d min -== Limite de temps : %d min - -Try again -== Réessayer - -Type -== Type - -Unable to rename the demo -== Impossible de renommer la démo - -Use sounds -== Jouer les sons - -Use team colors for name plates -== Mettre votre pseudonyme aux couleurs de votre équipe - -V-Sync -== V-Sync - -Version -== Version - -Vote command: -== Commande de vote : - -Vote description: -== Description du vote : - -Vote no -== Voter non - -Vote yes -== Voter oui - -Voting -== Vote - -Warmup -== Échauffement - -Weapon -== Arme - -Yes -== Oui - -You must restart the game for all settings to take effect. -== Les changements prendront effet au prochain redémarrage. - -##### needs translation ##### - -New name: -== Nouveau nom : - -Sat. -== Saturation - -Miscellaneous -== Divers - -Internet -== Internet - -Max demos -== Nombre maximum de démos - -News -== Infos - -Join game -== Rejoindre - -FSAA samples -== Échantillonage FSAA - -Sound volume -== Volume du son général - -Max Screenshots -== Nombre maximum de captures d'écran - -Laser -== Laser - -Hue -== Teinte - -Record demo -== Enregist. démo - -Your skin -== Votre skin - -Reset to defaults -== Réinitialiser - -Round -== Round - -Lht. -== Luminosité - -UI Color -== Couleur du menu - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Taille des pseudonymes - -Enable game sounds -== Activer les sons du jeu - -DDNet Client needs to be restarted to complete update! -== Le client DDNet a besoin d'être redémarré pour finir la MAJ ! - -Toggle dummy -== Basculer vers le dummy - -No updates available -== Pas de mise à jour disponible - -1 new mention -== 1 nouveau message - -Save -== Sauvegarder - -Fat skins (DDFat) -== Skins enrobés (DDFat) - -Automatically take statboard screenshot -== Prendre une capture d'écran du tableau des stats automatiquement - -Clan plates size -== Taille du clan - -Zoom out -== Dézoomer - -Show other players' hook collision lines -== Montrer la ligne de collision du grappin des autres joueurs - -Filter connecting players -== Filtre les Tees se connectant - -AntiPing: predict grenade paths -== AntiPing: prédit la trajectoire du lance-grenade - -Size -== Taille - -Enable team chat sound -== Activer les sons du chat d'équipe - -Browser -== Navigateur - -DDNet -== DDNet - -Show all -== Montrer tout le monde - -Vanilla skins only -== Skins par défaut - -DDNet %s is out! -== DDNet %s est disponible! - -Show ghost -== Afficher le fantôme - -Friend message -== Message d'ami - -AntiPing: predict other players -== AntiPing: prédit le déplacement des autres joueurs - -Are you sure that you want to disconnect your dummy? -== Êtes vous sûrs de vouloir déconnecter votre dummy ? - -Reload -== Recharger - -Server best: -== Meilleur score du serveur - -Personal best: -== Meilleur temps personnel - -Skin prefix -== Préfixe de skin - -Date -== Date - -Suicides -== Suicides - -Check now -== Vérifier - -Enable regular chat sound -== Activer les sons de chat par défaut - -Enable server message sound -== Activer les sons des messages du serveur - -Enable gun sound -== Activer le son du pistolet - -Welcome to DDNet -== Bienvenue sur DDNet - -Max CSVs -== CSV maximum - -Statboard -== Tableau des stats - -Show text entities -== Afficher le texte des entités - -Connecting dummy -== Connection du dummy - -Render demo -== Convertir une démo - -Save ghost -== Sauvegarder le fantôme - -Game paused -== Jeu en pause - -Team message -== Message d'équipe - -DDNet Client updated! -== Le client DDNet est à jour! - -Show entities -== Afficher les entités - -Replay feature is disabled! -== L'option de replay est désactivée - -Updating… -== Mise à jour en cours… - -Use high DPI -== Utiliser un DPI élevé - -Default zoom -== Zoom par défaut - -System message -== Message du système - -Are you sure that you want to disconnect? -== Êtes-vous sûrs de vouloir vous déconnecter ? - -Deactivate -== Désactiver - -Update failed! Check log… -== La mise à jour a échoué ! Vérifier les logs… - -%.2f KiB -== %.2f Kio - -Reset -== Défaut - -File already exists, do you want to overwrite it? -== Ce fichier existe déjà, voulez-vous l'écraser ? - -Grabs -== Grappins - -Update now -== Mettre à jour - -Follow -== Suivre - -Converse -== Converser - -Hook collisions -== Collision du grappin - -Frags -== Éliminations - -Indicate map finish -== Indiquer les cartes finies - -Show names in chat in team colors -== Colorer les pseudonymes dans le chat selon la couleur de l'équipe - -Messages -== Messages - -Fetch Info -== Afficher les détails - -Show only chat messages from friends -== Ne montrer que les messages des amis - -Remove chat -== Desactiver le chat - -Pause -== Pause - -Deaths -== Morts - -Length -== Durée - -Normal message -== Message normal - -Dummy copy -== Copiage du dummy - -Demo -== Démo - -Map sound volume -== Volume des sons de la carte - -Time -== Temps - -Exclude -== Exclure - -Disconnect Dummy -== Deconnecter le dummy - -Show clan above name plates -== Afficher le clan au dessus du pseudonyme - -Downloading %s: -== Téléchargement %s: - -Toggle dyncam -== Activer la dyncam - -Show other players' key presses -== Montrer les touches que les autres joueurs appuient - -Toggle ghost -== Activer le fantôme - -Enable highlighted chat sound -== Activer les sons du chat en surbrillance - -Overlay entities -== Afficher les entités - -Net -== Net - -Show HUD -== Afficher l'interface - -DDNet %s is available: -== DDNet %s est disponible: - -Search -== Chercher - -Activate -== Activer - -Hammerfly dummy -== Hammerfly du dummy - -Switch weapon when out of ammo -== Changer d'arme lorsqu'il n'y a plus de munition - -Save the best demo of each race -== Sauvegarder la meilleure démo de chaque course - -may cause delay -== Peut causer du délai - -Show others -== Montrer les autres - -%.2f MiB -== %.2f Mio - -Unfinished map -== Carte non terminée - -Default length -== Durée par défaut - -Highlighted message -== Message en surbrillance - -Successfully saved the replay! -== Le replay est sauvegardé avec succès! - -New random timeout code -== Nouveau code de time-out aléatoire - -FPM -== FPM - -Enable replays -== Activer les replays - -Loading DDNet Client -== Chargement du client DDNet - -Zoom in -== Zoomer - -Ghost -== Fantôme - -Show kill messages -== Afficher les messages d'élimination - -Markers -== Marqueurs - -HUD -== Interface - -Refresh Rate -== Taux de rafraîchissement - -Show score -== Afficher les scores - -Replace video -== Remplacer la vidéo - -Show tiles layers from BG map -== Utiliser les tuiles de la carte de fond - -Show votes window after voting -== Afficher la fenêtre de vote après avoir voté - -%d new mentions -== %d nouveaux messages - -Learn -== Guide - -Restart -== Redémarrer - -AntiPing: predict weapons -== AntiPing: prédit le comportement des armes - -Automatically create statboard csv -== Créer un tableau CSV des stats automatiquement - -Video name: -== Nom de la vidéo - -Show quads -== Afficher les quads - -Best -== Meilleur - -Ratio -== Ratio - -Lock team -== Verrouiller l'équipe - -Screen -== Écran - -Spree -== Série - -AntiPing -== AntiPing - -Enable long pain sound (used when shooting in freeze) -== Activer les sons de douleur du Tee (utilisé lorsqu'un Tee tire depuis le freeze (gel)) - -9+ new mentions -== 9+ nouveaux messages - -Kill -== Tuer - -Types -== Types - -Countries -== Pays - -Gameplay -== Jouabilité - -Connect Dummy -== Connecter le dummy - -Reconnect in %d sec -== Reconnexion dans %d sec - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDRaceNetwork est un jeu coopératif en ligne dont l'objectif est, pour vous ainsi que votre groupe de tees, d'atteindre la ligne d'arrivée d'une carte. En tant que nouveau joueur, il est préférable que vous commenciez sur les serveurs Novice, qui sont constitués des cartes les plus simples. Prenez en compte le ping afin de choisir un serveur proche de chez vous. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Il est recommandé d'ajuster les configurations à votre goût avant de rejoindre un serveur. - -Please enter your nickname below. -== Veuillez entrer votre pseudonyme ci-dessous. - -Show DDNet map finishes in server browser -== Afficher les cartes de DDNet terminées dans le navigateur - -transmits your player name to info.ddnet.org -== transmet votre pseudonyme à info.ddnet.org - -Warning -== Alerte - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Appuyez sur "k" pour mourir (recommencer) et "a" pour vous mettre en pause afin de regarder les autres joueurs. Allez dans les configurations pour voir davantage de raccourcis. - -Speed -== Vitesse - -Theme -== Thème - -%d of %d servers -== %d sur %d serveurs - -%d of %d server -== %d sur %d serveur - -%d players -== %d joueurs - -%d player -== %d joueur - -Demos directory -== Répertoire des enregistrements - -Skip the main menu -== Passer le menu principal - -Themes directory -== Répertoire des thèmes - -Download skins -== Télécharger des skins - -Skin Database -== Base de données de skins - -Skins directory -== Répertoire des skins - -Background music volume -== Volume de la musique de fond - -Assets -== Assets - -Client message -== Message du client - -Show others (own team only) -== Montrer les autres (de sa propre équipe uniquement) - -Use current map as background -== Utiliser la carte actuelle en tant qu'arrière-plan - -Entities -== Entités - -Emoticons -== Émoticônes - -Particles -== Particules - -Assets directory -== Répertoire des assets - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/fr - -Website -== Site web - -Settings -== Configurations - -Stop server -== Arrêter le serveur - -Run server -== Démarrer le serveur - -Server executable not found, can't run server -== L'exécutable du serveur est introuvable, le serveur ne peut donc pas démarrer - -Editor -== Éditeur - -[Start menu] -Play -== Jouer - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Mode développeur activé. Appuyez sur Ctrl+Maj+D pour le désactiver. - -Existing Player -== Joueur existant - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Le pseudonyme '%s' est déjà pris (%d points). Voulez-vous tout de même le garder ? - -Checking for existing player with your name -== Vérification de la disponibilité du pseudonyme - -Smooth Dynamic Camera -== Caméra dynamique fluide - -Game sound volume -== Volume des sons du jeu - -Chat sound volume -== Volume des sons du chat - -Use old chat style -== Utiliser l'ancien chat - -Manual -== Manuel - -Race -== Race - -Auto -== Auto - -Replay -== Replay - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== La largeur de la texture %s n'est pas divisible par %d, ou la hauteur n'est pas divisible par %d, ce qui peut causer des bugs visuels. - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== AN - -SA -== AS - -CHN -== CHN - -Getting server list from master server -== Obtention de la liste des serveurs depuis le serveur maître - -Leak IP -== Fuiter l'IP - -Chat command -== Commande de chat - -Dummy -== Dummy - -Windowed -== Fenêtré - -Windowed borderless -== Fenêtré sans bordure - -Desktop fullscreen -== Bureau plein écran - -Preview -== Prévisualisation - -Background -== Arrière-plan - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Are you sure that you want to disconnect and switch to a different server? -== Êtes vous sur de vouloir vous déconnecter et changer de serveur? - -Show local player's key presses -== Montrer les touches appuyées des autres joueurs - -Settings file -== Fichier des paramètres - -Config directory -== Répertoire de configuration - -Windowed fullscreen -== Plein écran fenêtré - -Run on join -== Exécuter en rejoignant - -Chat command (e.g. showall 1) -== Commande du chat (ex: showall 1) - -The format of texture %s is not RGBA which will cause visual bugs. -== La texture %s n'est pas au format RGBA, ce qui causera des bugs visuels. - -Join Tutorial Server -== Rejoindre un serveur de tutoriel - -Skip Tutorial -== Passer le tutoriel - -Choose default eyes when joining a server -== Choisissez les yeux par défaut lorsque vous rejoignez un serveur - -Allows maps to render with more detail -== Permet de rendre les cartes avec plus de détails - -Renderer -== Moteur de rendu graphique - -default -== défaut - -custom -== Personnalisé - -auto -== Automatique - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Lorsque vous franchissez la ligne de départ, montrez un fantôme reproduisant les mouvements de votre meilleur temps - -Opacity -== Opacité - -Adjust the opacity of entities belonging to other teams, such as tees and nameplates -== Ajustez l'opacité des entités appartenant à d'autres équipes, telles que les tees et les noms des joueurs - -Quads are used for background decoration -== Les quads sont utilisés pour la décoration de l'arrière-plan - -Tries to predict other entities to give a feel of low latency -== Essaie de prédire les autres entités pour donner une impression de faible latence - -Tutorial -== Tutoriel - -Can't find a Tutorial server -== Impossible de trouver un serveur tutoriel - -Super -== Super - -Team %d -== Équipe %d - -Position: -== Position: - -Speed: -== Vitesse: - -Angle: -== Angle: - -Trying to determine UDP connectivity… -== Tentative de connection UDP… - -UDP seems to be filtered. -== UDP semble filtré. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Les adresses IP UDP et TCP semblent différentes. Essayez de désactiver les VPN, proxy ou accélérateurs réseaux. - -No answer from server yet. -== Aucune réponse du serveur. - -Download community skins -== Télécharger les skins de la communauté - -Enable controller -== Activer la manette - -[Ingame controller mode] -Relative -== Relatif - -[Ingame controller mode] -Absolute -== Absolu - -Ingame controller mode -== Mode manette - -Ingame controller sens. -== Sensibilité manette (jeu) - -UI controller sens. -== Sensibilité manette (menus) - -Controller jitter tolerance -== Tolérance gigue de la manette - -Status -== Statut - -Aim bind -== Touche visée - -Mouse -== Souris - -Ingame mouse sens. -== Sensibilité souris (jeu) - -UI mouse sens. -== Sensibilité souris (menus) - -Controller -== Manette - -Show dummy actions -== Afficher les actions du dummy - -Show freeze bars -== Afficher la barre de gel - -Show player position -== Afficher la position - -Show player speed -== Afficher la vitesse - -Show player target angle -== Afficher l'angle de visée - -Opacity of freeze bars inside freeze -== Opacité de la barre de gel dans le gel - -Normal Color -== Couleur normal - -Highlight Color -== Couleur surbrillante - -Extras -== Extras - -Connected -== Connecté - -Initializing assets -== Initialisation des assets - -Getting game info -== Obtention des informations de la partie - -Requesting to join the game -== Demande de rejoindre la partie - -Loading skin files -== Chargement des fichiers de skin - -Appearance -== Apparence - -Show health, shields and ammo -== Monter la vie, bouclier et les munitions - -DDRace HUD -== HUD DDRace - -Show DDRace HUD -== Montrer l'HUD DDrace - -Show jumps indicator -== Montrer l'indicateur de sauts - -Hook collision line -== Ligne de collision du grapin - -A Tee -== Un Tee - -Loading assets -== Chargement des assets - -Loading sound files -== Chargement des fichiers sonores - -Preparing demo playback -== Préparation de la lecture de la demo - -Loading map file from storage -== Chargement de la map depuis le stockage - -Why are you slowmo replaying to read this? -== Pourquoi rejoues-tu en slow-motion pour lire ça? - -Initializing components -== Initialisation des composants - -Initializing map logic -== Initialisation de la logique de la map - -Sending initial client info -== Envoi des informations initiales du client - -Uploading map data to GPU -== Transfert des données de la map vers le GPU - -Loading menu images -== Chargement des images de menu - -Loading demo files -== Chargement des fichiers de demo - -Loading ghost files -== Chargement des fichiers de fantôme - -Name Plate -== Plaque de nom - -Hook Collisions -== Collisions du grappin - -Show client IDs in scoreboard -== Afficher les IDs des clients dans le tableau des scores - -Hook collision line width -== Largeur de la ligne de collision du grappin - -Hook collision line opacity -== Opacité de la ligne de collision du grappin - -Colors of the hook collision line, in case of a possible collision with: -== Couleurs de la ligne de collision du grappin, dans le cas d'une collision possible avec : - -Your movements are not taken into account when calculating the line colors -== Vos mouvements ne sont pas pris en compte lors du calcul des couleurs de la ligne - -Nothing hookable -== Rien d'accrochable - -Something hookable -== Quelque chose d'accrochable - -Loading race demo files -== Chargement des fichiers de demo de course - -Play the current demo -== Jouer la démo en cours - -Pause the current demo -== Mettre en pause la démo en cours - -Stop the current demo -== Arrêter la démo en cours - -Slow down the demo -== Ralentir la démo - -Speed up the demo -== Accélérer la démo - -Export cut as a separate demo -== Exporter la coupe comme une démo séparée - -Toggle keyboard shortcuts -== Basculer les raccourcis clavier - -Menu opened. Press Esc key again to close menu. -== Menu ouvert. Appuyez à nouveau sur la touche Éch. pour fermer le menu. - -Weapons -== Armes - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Échec lors de l'initialisation. Essayez de changer gfx_backend à OpenGL ou Vulkan dans le fichier settings_ddnet.cfg dans le dossier de configuration et réessayez. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Mémoire graphique insuffisante. Essayez de retirer des ressources personnalisées (skins, entités, etc.), spécialement celles de haute résolution. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Une erreur pendant l'enregistrement des commandes est survenue. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Une commande de rendu a échoué. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== L'envoi d'une commande de rendu a échoué. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Échec de l'échange de tampons d'images. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Erreur inconnue. Essayez de changer gfx_backend à OpenGL ou Vulkan dans le fichier settings_ddnet.cfg dans le dossier de configuration et réessayez. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Impossible d'initialiser le moteur de rendu spécifié, nouvel essai avec le moteur par défaut. - -Cancel -== Annuler - -File '%s' already exists, do you want to overwrite it? -== Le fichier '%s' existe déjà, voulez-vous l'écraser ? - -Are you sure that you want to remove the player '%s' from your friends list? -== Êtes-vous sûrs de vouloir retirer le joueur '%s' de votre liste d'amis ? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Êtes-vous sûrs de vouloir retirer le clan '%s' de votre liste d'amis ? - -Go back one tick -== Reculer d'une image - -Go forward one tick -== Avancer d'une image - -Go back one marker -== Aller au marqueur précédent - -Go forward one marker -== Aller au marqueur suivant - -Open the directory that contains the demo files -== Ouvrir le dossier contenant les fichiers démo - -Are you sure that you want to delete the demo '%s'? -== Êtes-vous sûrs de vouloir supprimer la démo '%s' ? - -Unable to delete the demo '%s' -== Impossible de supprimer la démo '%s' - -Save power by lowering refresh rate (higher input latency) -== Économiser la puissance en diminuant le taux de rafraîchissement (augmente la latence d'entrée) - -Open the settings file -== Ouvrir le fichier de configuration - -Open the directory that contains the configuration and user files -== Ouvrir le dossier de configuration et des fichiers personnalisés - -Open the directory to add custom themes -== Ouvrir le dossier pour ajouter un thème personnalisé - -Open the directory to add custom skins -== Ouvrir le dossier pour ajouter des skins personnalisés - -No controller found. Plug in a controller. -== Aucune manette détectée. Branchez une manette. - -Reset controls -== Réinitialiser les contrôles - -Are you sure that you want to reset the controls to their defaults? -== Êtes-vous sûrs de vouloir réinitialiser les contrôles aux valeurs par défaut ? - -Rifle Laser Outline Color -== Couleur fusil laser (contour) - -Rifle Laser Inner Color -== Couleur fusil laser (intérieur) - -Shotgun Laser Outline Color -== Couleur fusil à pompe (contour) - -Shotgun Laser Inner Color -== Couleur fusil à pompe (intérieur) - -Door Laser Outline Color -== Couleur porte laser (contour) - -Door Laser Inner Color -== Couleur porte laser (intérieur) - -Freeze Laser Outline Color -== Couleur laser gelant (contour) - -Freeze Laser Inner Color -== Couleur laser gelant (intérieur) - -Set all to Rifle -== Copier les réglages du fusil laser à tous - -Unregister protocol and file extensions -== Désenregistrer le protocole et les extensions de fichier - -Open the directory to add custom assets -== Ouvrir le dossier pour ajouter des ressources personnalisées - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Impossible d'initialiser l'interface graphique, tu n'as probablement pas installé les pilotes de ta carte graphique. - -Could not save downloaded map. Try manually deleting this file: %s -== Impossible de sauvegarder la carte téléchargé. Essayez de supprimer ce fichier manuellement: %s - -Copy info -== Copier les infos - -Online players (%d) -== Joueurs en ligne (%d) - -Online clanmates (%d) -== Membres du clan en ligne (%d) - -[friends (server browser)] -Offline (%d) -== Hors-Ligne (%d) - -Click to select server. Double click to join your friend. -== Cliquez pour sélectionner ce serveur. Double-cliquez pour rejoindre votre ami(e) - -Click to remove this player from your friends list. -== Cliquez pour retirer ce joueur de votre liste d'amis - -Click to remove this clan from your friends list. -== Cliquez pour retirer ce clan de votre liste d'amis - -None -== Aucuns - -Add Clan -== Ajouter clan - -Create a random skin -== Créer un skin aléatoire - -Error playing demo -== Erreur durant la lecture de la demo - -Failed saving the replay! -== Erreur durant la sauvegarde du replay ! - -Saving settings to '%s' failed -== La sauvegarde des paramètres vers '%s' à échouée - -Error saving settings -== Erreur durant la sauvegarde des paramètres - -Loading demo file from storage -== Chargement du fichier de la demo à partir du stockage - -Quitting. Please wait… -== En train de quitter. Veuillez attendre… - -Restarting. Please wait… -== Redémarrage. Veuillez patienter… - -Searching -== Recherche - -Enter Username -== Saisir le nom d'utilisateur - -Enter Password -== Saisir le mot de passe - -NOT CONNECTED -== NON CONNECTÉ - -Match %d of %d -== Match %d sur %d - -No results -== Aucun résultat - -Lines %d - %d (%s) -== Lignes %d - %d (%s) - -Locked -== Verrouillé - -Following -== Suivi - -Loading commands… -== - -Multi-View -== Chargement des commandes… - -Some map images could not be loaded. Check the local console for details. -== Certaines images de carte n'ont pas pu être chargées. Consultez la console locale pour plus de détails. - -Some map sounds could not be loaded. Check the local console for details. -== Certains sons de carte n'ont pas pu être chargés. Consultez la console locale pour plus de détails. - -Loading menu themes -== Chargement des thèmes du menu - -Press a key… -== Appuyez sur une touche… - -Main menu -== Menu principal - -Rename folder -== Renommer le dossier - -Render complete -== Rendu terminé - -Are you sure that you want to restart? -== Êtes-vous sûr de vouloir recommencer ? - -There's an unsaved map in the editor, you might want to save it. -== Il y a une carte non enregistrée dans l’éditeur, vous voulez peut-être l’enregistrer. - -Continue anyway? -== Continuer quand même ? - -A demo with this name already exists -== Une démo avec ce nom existe déjà - -A folder with this name already exists -== Un dossier avec ce nom existe déjà - -Unable to rename the folder -== Impossible de renommer le dossier - -(paused) -== (en pause) - -Videos directory -== Dossier des vidéos - -Video was saved to '%s' -== La vidéo a été enregistrée dans '%s' - -%d/%d KiB (%.1f KiB/s) -== %d/%d Kio (%.1f Kio/s) - -No login required -== Le login n'est pas requis - -Communities -== Communautés - -No server selected -== Aucun serveur sélectionné - -Server filter -== Filtre de serveur - -Friends -== Amis - -Go back the specified duration -== Saut en arrière de la durée spécifiée - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sec. - -Change the skip duration -== Modifier la durée du saut - -Go forward the specified duration -== Saut en avant de la durée spécifiée - -Mark the beginning of a cut (right click to reset) -== Marquer le début d’un cut (clic droit pour réinitialiser) - -Mark the end of a cut (right click to reset) -== Marquer la fin d’un cut (clic droit pour réinitialiser) - -Close the demo player -== Fermer le lecteur de demo - -Export demo cut -== Exporter le cut de la demo - -Cut interval -== Intervale de cut - -Cut length -== Longeur du cut - -Render cut to video -== Rendu du cut vers une vidéo - -Please use a different filename -== Veuillez utiliser un nom de fichier différent - -All combined -== Tout combiné - -No demo selected -== Aucune demo sélectionnée - -Folder Link -== Dossier Lien - -Created -== Créé - -Netversion -== Netversion - -[Demo details] -map not included -== carte non incluse - -Are you sure that you want to delete the folder '%s'? -== Êtes-vous sûr de vouloir supprimer le dossier '%s'? - -Delete folder -== Supprimer le dossier - -Unable to delete the folder '%s'. Make sure it's empty first. -== Impossible de supprimer le dossier '%s'. Assurez-vous d’abord qu’il est vide. - -Loading… -== Chargement… - -Ghosts directory -== Dossier des fantômes - -Activate all -== Tous activer - -Deactivate all -== Tous désactiver - -Player info change cooldown -== Délai de changement des informations du joueur - -Axis -== Axe - -Graphics card -== Carte graphique - -Tee -== Tee - -Info Messages -== Messages d'information - -Show local time always -== Toujours afficher l’heure locale - -Always show chat -== Toujours afficher le chat - -Show only chat messages from team members -== Afficher uniquement les messages des membres de l’équipe - -Chat font size -== Taille de police du chat - -Chat width -== Largeur du chat - -Show friend mark (♥) in name plates -== Montrez l'icone d’ami (♥) dans les pseudonymes - -Show hook strength icon indicator -== Afficher l’indicateur de force du grappin - -Show hook strength number indicator -== Afficher le nombre de force du grappin - -Authed name color in scoreboard -== Couleur des nom authentifié dans le tableau des scores - -Same clan color in scoreboard -== Couleur des membre du clan dans le tableau des scores - -Show own player's hook collision line -== Montrer la collision du grappin du joueur - -Always show own player's hook collision line -== Toujours montrer la collision du grappin du joueur - -Always show other players' hook collision lines -== Toujours montrer la collision du grappin des autres joueur - -Show finish messages -== Afficher les messages de fin de course - -Enable ghost -== Activer le fantôme - -Only save improvements -== Enregistrer que les améliorations - -Regular background color -== Couleur de fond - -Entities background color -== Couleur de fond des entités - -Moved ingame -== Déplacé en jeu From 3a1c30153f5fcbeb119f2af4acdd9d5423c0cf02 Mon Sep 17 00:00:00 2001 From: Emilcha <79055013+Emilcha@users.noreply.github.com> Date: Sun, 9 Jun 2024 16:15:14 +0200 Subject: [PATCH 050/179] Changement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ( proposées dans les reviews de la pull request ) --- data/languages/french.txt | 62 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/data/languages/french.txt b/data/languages/french.txt index 0571122a00f..8df5bb2298e 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -26,7 +26,7 @@ # archimede67 2022-08-15 13:02:00 # Nouaa 2022-10-25 18:00:00 # Sukya 2023-05-20 19:38:00 -# Emilcha 2023-06-09 11:31:00 +# Emilcha 2024-06-09 11:31:00 ##### /authors ##### @@ -1611,16 +1611,16 @@ Failed saving the replay! == Erreur durant la sauvegarde du replay ! Saving settings to '%s' failed -== La sauvegarde des paramètres vers '%s' à échouée +== La sauvegarde des paramètres vers '%s' à échoué Error saving settings -== Erreur durant la sauvegarde des paramètres +== Erreur de sauvegarde des paramètres Loading demo file from storage == Chargement du fichier de la demo à partir du stockage Quitting. Please wait… -== En train de quitter. Veuillez attendre… +== En train de quitter. Veuillez patienter… Restarting. Please wait… == Redémarrage. Veuillez patienter… @@ -1638,7 +1638,7 @@ NOT CONNECTED == NON CONNECTÉ Match %d of %d -== Match %d sur %d +== Correspondance %d sur %d No results == Aucun résultat @@ -1653,16 +1653,16 @@ Following == Suivi Loading commands… -== +== Chargement des commandes Multi-View -== Chargement des commandes… +== Multi-vues Some map images could not be loaded. Check the local console for details. -== Certaines images de carte n'ont pas pu être chargées. Consultez la console locale pour plus de détails. +== Certaines images de la carte n'ont pas pu être chargées. Consultez la console locale pour plus de détails. Some map sounds could not be loaded. Check the local console for details. -== Certains sons de carte n'ont pas pu être chargés. Consultez la console locale pour plus de détails. +== Certains sons de la carte n'ont pas pu être chargés. Consultez la console locale pour plus de détails. Loading menu themes == Chargement des thèmes du menu @@ -1683,13 +1683,13 @@ Are you sure that you want to restart? == Êtes-vous sûr de vouloir recommencer ? There's an unsaved map in the editor, you might want to save it. -== Il y a une carte non enregistrée dans l’éditeur, vous voulez peut-être l’enregistrer. +== Il y a une carte non enregistrée dans l'éditeur, vous voulez peut-être l'enregistrer. Continue anyway? == Continuer quand même ? A demo with this name already exists -== Une démo avec ce nom existe déjà +== Une demo avec ce nom existe déjà A folder with this name already exists == Un dossier avec ce nom existe déjà @@ -1710,7 +1710,7 @@ Video was saved to '%s' == %d/%d Kio (%.1f Kio/s) No login required -== Le login n'est pas requis +== Pas d'authentification requise Communities == Communautés @@ -1725,7 +1725,7 @@ Friends == Amis Go back the specified duration -== Saut en arrière de la durée spécifiée +== Saut arrière de la durée spécifiée [Demo player duration] %d min. @@ -1739,28 +1739,28 @@ Change the skip duration == Modifier la durée du saut Go forward the specified duration -== Saut en avant de la durée spécifiée +== Saut avant de la durée spécifiée Mark the beginning of a cut (right click to reset) -== Marquer le début d’un cut (clic droit pour réinitialiser) +== Marquer le début d'une coupe (clic droit pour réinitialiser) Mark the end of a cut (right click to reset) -== Marquer la fin d’un cut (clic droit pour réinitialiser) +== Marquer la fin d'une coupe (clic droit pour réinitialiser) Close the demo player == Fermer le lecteur de demo Export demo cut -== Exporter le cut de la demo +== Exporter le découpage de la demo Cut interval -== Intervale de cut +== Intervale du découpage Cut length -== Longeur du cut +== Longeur du découpage Render cut to video -== Rendu du cut vers une vidéo +== Rendu du découpage vers une vidéo Please use a different filename == Veuillez utiliser un nom de fichier différent @@ -1791,7 +1791,7 @@ Delete folder == Supprimer le dossier Unable to delete the folder '%s'. Make sure it's empty first. -== Impossible de supprimer le dossier '%s'. Assurez-vous d’abord qu’il est vide. +== Impossible de supprimer le dossier '%s'. Assurez-vous d'abord qu'il est vide. Loading… == Chargement… @@ -1821,13 +1821,13 @@ Info Messages == Messages d'information Show local time always -== Toujours afficher l’heure locale +== Toujours afficher l'heure locale Always show chat == Toujours afficher le chat Show only chat messages from team members -== Afficher uniquement les messages des membres de l’équipe +== Afficher uniquement les messages des membres de l'équipe Chat font size == Taille de police du chat @@ -1836,28 +1836,28 @@ Chat width == Largeur du chat Show friend mark (♥) in name plates -== Montrez l'icone d’ami (♥) dans les pseudonymes +== Montrez l'icone d'ami (♥) dans les pseudonymes Show hook strength icon indicator -== Afficher l’indicateur de force du grappin +== Afficher l'indicateur de force du grappin Show hook strength number indicator == Afficher le nombre de force du grappin Authed name color in scoreboard -== Couleur des nom authentifié dans le tableau des scores +== Couleur des noms authentifiés dans le tableau des scores Same clan color in scoreboard -== Couleur des membre du clan dans le tableau des scores +== Couleur des membres du clan dans le tableau des scores Show own player's hook collision line -== Montrer la collision du grappin du joueur +== Afficher la ligne de collision de son propre grappin Always show own player's hook collision line -== Toujours montrer la collision du grappin du joueur +== Toujours afficher la ligne de collision de son propre grappin Always show other players' hook collision lines -== Toujours montrer la collision du grappin des autres joueur +== Toujours afficher la ligne de collision du grappin des autres joueurs Show finish messages == Afficher les messages de fin de course @@ -1866,7 +1866,7 @@ Enable ghost == Activer le fantôme Only save improvements -== Enregistrer que les améliorations +== Enregistrer uniquement les améliorations Regular background color == Couleur de fond From e993434163c95b985f0ed58b2c6c3d9fa3cc41b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Talha=20Ayg=C3=BCn?= <128845803+GokturkTalha@users.noreply.github.com> Date: Sun, 9 Jun 2024 18:49:06 +0300 Subject: [PATCH 051/179] Update Turkish translations --- data/languages/turkish.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index 7ba614ae67e..10d3de2fcdc 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -241,7 +241,7 @@ Mute when not active == Aktif değilken sessizleştir Name -== Sunucu ismi +== İsim Next weapon == Sonraki silah @@ -1853,10 +1853,10 @@ map not included == harita dahil edilmemiş %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== Sadece takım üyelerinin mesajlarını göster From a0125f7df5c4a6da592c7fc1587bc0718923ab0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Talha=20Ayg=C3=BCn?= <128845803+GokturkTalha@users.noreply.github.com> Date: Sun, 9 Jun 2024 18:50:43 +0300 Subject: [PATCH 052/179] Update Azerbaijanese translation --- data/languages/azerbaijanese.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/languages/azerbaijanese.txt b/data/languages/azerbaijanese.txt index 562c414955d..652ce068fa2 100644 --- a/data/languages/azerbaijanese.txt +++ b/data/languages/azerbaijanese.txt @@ -1837,14 +1837,14 @@ Always show other players' hook collision lines == Digər oyunçuların qarmaq toqquşma sərhədini həmişə göstər %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) [Demo details] map not included -== +== xəritə daxil deyil Tee -== +== Tee Show only chat messages from team members -== +== Yalnız komanda üzvlərinin mesajlarını göstərin From da25863cd27665a56768acafdb7835cccbaf0653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 9 Jun 2024 21:25:45 +0200 Subject: [PATCH 053/179] Fix percentage not being used for console command progress spinner The percentage of received console commands was not being shown with the progress spinner because the variable `ProgressProps` was not passed to the `RenderProgressSpinner` function. --- src/game/client/components/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index c0bfc39050c..c815b53cec4 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -1310,7 +1310,7 @@ void CGameConsole::OnRender() float Percentage = Client()->GotRconCommandsPercentage(); SProgressSpinnerProperties ProgressProps; ProgressProps.m_Progress = Percentage; - Ui()->RenderProgressSpinner(vec2(Screen.w / 4.0f + FONT_SIZE / 2.f, FONT_SIZE), FONT_SIZE / 2.f); + Ui()->RenderProgressSpinner(vec2(Screen.w / 4.0f + FONT_SIZE / 2.f, FONT_SIZE), FONT_SIZE / 2.f, ProgressProps); char aLoading[128]; str_copy(aLoading, Localize("Loading commands…")); From 72f98c5d668aa25961da4bc508a77349d09d77be Mon Sep 17 00:00:00 2001 From: dobrykafe Date: Sun, 9 Jun 2024 23:34:43 +0200 Subject: [PATCH 054/179] update czech translations for 18.3 --- data/languages/czech.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/languages/czech.txt b/data/languages/czech.txt index 45b3ab6fdfb..d8bf2739649 100644 --- a/data/languages/czech.txt +++ b/data/languages/czech.txt @@ -6,7 +6,7 @@ # Petr 2011-04-02 23:02:33 # Medik & Petr 2011-07-02 19:37:05 # TeeWorlds-org 2011-07-15 00:34:19 -# dobrykafe 2024-04-20 00:00:00 +# dobrykafe 2024-06-09 00:00:00 ##### /authors ##### ##### translated strings ##### @@ -1848,10 +1848,10 @@ Always show other players' hook collision lines == Vždy zobrazit čáru kolize háků ostatních hráčů %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== Zobrazit pouze zprávy od členů týmu From bb378a5f2d9167571c34d67b56a50d01a48a050c Mon Sep 17 00:00:00 2001 From: dobrykafe Date: Sun, 9 Jun 2024 23:36:10 +0200 Subject: [PATCH 055/179] update slovak translations for 18.3 --- data/languages/slovak.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt index 92719dcefc6..3ab8d45c0c1 100644 --- a/data/languages/slovak.txt +++ b/data/languages/slovak.txt @@ -3,7 +3,7 @@ # Limit and Petr #modified by: # LimiT 2011-07-02 20:24:44 -# dobrykafe 2024-04-20 00:00:00 +# dobrykafe 2024-06-09 00:00:00 ##### /authors ##### ##### translated strings ##### @@ -1845,10 +1845,10 @@ Always show other players' hook collision lines == Vždy zobraziť čiaru kolízie hákov ostatných hráčov %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== Zobraziť iba správy od členov tímu From 3184ea12d809b2270c237be7db6ba9a31b8f70c1 Mon Sep 17 00:00:00 2001 From: By <130899529+By622@users.noreply.github.com> Date: Mon, 10 Jun 2024 16:57:24 +0800 Subject: [PATCH 056/179] Update simplified_chinese.txt --- data/languages/simplified_chinese.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index b07a8a2e77b..f07dde90124 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -39,6 +39,7 @@ # 2024-01-15 By # 2024-03-03 Bamcane # 2024-04-21 By +# 2024-06-10 By ##### /authors ##### ##### translated strings ##### @@ -416,7 +417,7 @@ Show name plates == 显示昵称 Show only chat messages from friends -== 只显示好友消息 +== 只显示好友聊天消息 Sound == 声音 @@ -1884,10 +1885,10 @@ Always show other players' hook collision lines == 始终显示其他玩家的钩索辅助线 %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== 只显示队伍聊天消息 From cbf11fcd3451781e921f8487203dce9dd5178530 Mon Sep 17 00:00:00 2001 From: By <130899529+By622@users.noreply.github.com> Date: Mon, 10 Jun 2024 16:57:32 +0800 Subject: [PATCH 057/179] Update traditional_chinese.txt --- data/languages/traditional_chinese.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index e30076b3586..57733afb9a0 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -28,6 +28,7 @@ # 2024-01-15 By # 2024-03-05 By # 2024-04-21 By +# 2024-06-10 By ##### /authors ##### ##### translated strings ##### @@ -405,7 +406,7 @@ Show name plates == 顯示暱稱 Show only chat messages from friends -== 只顯示好友訊息 +== 只顯示好友聊天訊息 Sound == 聲音 @@ -1873,10 +1874,10 @@ Always show other players' hook collision lines == 始終顯示其他玩家的鉤索輔助線 %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== 只顯示隊伍聊天訊息 From cef994d688bba39547350921cf81c5ec43f9f840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Mon, 10 Jun 2024 18:42:50 +0200 Subject: [PATCH 058/179] Fix demo seekbar tooltip not showing correct hovered time Regression from #8318. --- src/game/client/components/menus_demo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 9f75ea3c615..1efead6874a 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -494,7 +494,7 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) if(Ui()->HotItem() == pId) { - const int HoveredTick = (int)(clamp((Ui()->MouseX() - SeekBar.x - Rounding) / SeekBar.w - 2 * Rounding, 0.0f, 1.0f) * TotalTicks); + const int HoveredTick = (int)(clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (SeekBar.w - 2 * Rounding), 0.0f, 1.0f) * TotalTicks); static char s_aHoveredTime[32]; str_time((int64_t)HoveredTick / Client()->GameTickSpeed() * 100, TIME_HOURS, s_aHoveredTime, sizeof(s_aHoveredTime)); GameClient()->m_Tooltips.DoToolTip(pId, &SeekBar, s_aHoveredTime); From c451289254bba3cac6e672c21047d9a64b7db8e6 Mon Sep 17 00:00:00 2001 From: Tyler Stocks Date: Mon, 10 Jun 2024 21:25:07 +0100 Subject: [PATCH 059/179] Readd is not a word, I think it meant re-add but Reload better fits its usecase --- src/game/editor/popups.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index d92e321e16e..b6724d28efc 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -1686,7 +1686,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupImage(void *pContext, CUIRect View, static CUi::SSelectionPopupContext s_SelectionPopupContext; static CScrollRegion s_SelectionPopupScrollRegion; s_SelectionPopupContext.m_pScrollRegion = &s_SelectionPopupScrollRegion; - if(pEditor->DoButton_MenuItem(&s_ReaddButton, "Readd", 0, &Slot, 0, "Reloads the image from the mapres folder")) + if(pEditor->DoButton_MenuItem(&s_ReaddButton, "Reload", 0, &Slot, 0, "Reloads the image from the mapres folder")) { char aFilename[IO_MAX_PATH_LENGTH]; str_format(aFilename, sizeof(aFilename), "%s.png", pImg->m_aName); @@ -1785,7 +1785,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSound(void *pContext, CUIRect View, View.HSplitTop(5.0f, nullptr, &View); View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ReaddButton, "Readd", 0, &Slot, 0, "Reloads the sound from the mapres folder")) + if(pEditor->DoButton_MenuItem(&s_ReaddButton, "Reload", 0, &Slot, 0, "Reloads the sound from the mapres folder")) { char aFilename[IO_MAX_PATH_LENGTH]; str_format(aFilename, sizeof(aFilename), "%s.opus", pSound->m_aName); From 544f564044d009e84c991f498a8ad8106d186021 Mon Sep 17 00:00:00 2001 From: Tyler Stocks Date: Mon, 10 Jun 2024 23:08:06 +0100 Subject: [PATCH 060/179] Changed var name to match --- src/game/editor/popups.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index b6724d28efc..404580a3092 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -1632,7 +1632,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupImage(void *pContext, CUIRect View, CEditor *pEditor = static_cast(pContext); static int s_ExternalButton = 0; - static int s_ReaddButton = 0; + static int s_ReloadButton = 0; static int s_ReplaceButton = 0; static int s_RemoveButton = 0; static int s_ExportButton = 0; @@ -1686,7 +1686,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupImage(void *pContext, CUIRect View, static CUi::SSelectionPopupContext s_SelectionPopupContext; static CScrollRegion s_SelectionPopupScrollRegion; s_SelectionPopupContext.m_pScrollRegion = &s_SelectionPopupScrollRegion; - if(pEditor->DoButton_MenuItem(&s_ReaddButton, "Reload", 0, &Slot, 0, "Reloads the image from the mapres folder")) + if(pEditor->DoButton_MenuItem(&s_ReloadButton, "Reload", 0, &Slot, 0, "Reloads the image from the mapres folder")) { char aFilename[IO_MAX_PATH_LENGTH]; str_format(aFilename, sizeof(aFilename), "%s.png", pImg->m_aName); @@ -1754,7 +1754,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSound(void *pContext, CUIRect View, { CEditor *pEditor = static_cast(pContext); - static int s_ReaddButton = 0; + static int s_ReloadButton = 0; static int s_ReplaceButton = 0; static int s_RemoveButton = 0; static int s_ExportButton = 0; @@ -1785,7 +1785,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSound(void *pContext, CUIRect View, View.HSplitTop(5.0f, nullptr, &View); View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ReaddButton, "Reload", 0, &Slot, 0, "Reloads the sound from the mapres folder")) + if(pEditor->DoButton_MenuItem(&s_ReloadButton, "Reload", 0, &Slot, 0, "Reloads the sound from the mapres folder")) { char aFilename[IO_MAX_PATH_LENGTH]; str_format(aFilename, sizeof(aFilename), "%s.opus", pSound->m_aName); From 7e9769c2c7da77c9f1b1e64a753ed5c042361f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 9 Jun 2024 21:24:14 +0200 Subject: [PATCH 061/179] Fix UI issues when switching between menus and editor Fix button logic being stuck when holding mouse button on UI elements with button logic in the menus/editor, switching between menus and editor with Ctrl+Shift+E, then using a UI element with button logic in the editor/menus and switching back. Fix value selector text mode of color picker popups being deactivated when switching between menus and editor while the color picker popup is open in both. Only update progress spinners once per frame in `CUi::Update` to ensure consistent rotation speed. Progress spinners in menus and editor now rotate independently. In general, all `static` non-`const` variables in `CUi` are replaced with member variables, as the `static` variables are shared between the two `CUi` instances of the menus and the editor, causing the above issues. --- src/game/client/ui.cpp | 128 ++++++++++++++++++----------------------- src/game/client/ui.h | 16 ++++++ 2 files changed, 73 insertions(+), 71 deletions(-) diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index 8af76a26e37..a12720250fa 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -214,6 +214,9 @@ void CUi::Update(vec2 MouseWorldPos) m_pActiveItem = nullptr; m_pHotScrollRegion = nullptr; } + + m_ProgressSpinnerOffset += Client()->RenderFrameTime() * 1.5f; + m_ProgressSpinnerOffset = std::fmod(m_ProgressSpinnerOffset, 1.0f); } void CUi::DebugRender() @@ -381,16 +384,16 @@ int CUi::DoButtonLogic(const void *pId, int Checked, const CUIRect *pRect) // logic int ReturnValue = 0; const bool Inside = MouseHovered(pRect); - static int s_ButtonUsed = -1; if(CheckActiveItem(pId)) { - if(s_ButtonUsed >= 0 && !MouseButton(s_ButtonUsed)) + dbg_assert(m_ActiveButtonLogicButton >= 0, "m_ActiveButtonLogicButton invalid"); + if(!MouseButton(m_ActiveButtonLogicButton)) { if(Inside && Checked >= 0) - ReturnValue = 1 + s_ButtonUsed; + ReturnValue = 1 + m_ActiveButtonLogicButton; SetActiveItem(nullptr); - s_ButtonUsed = -1; + m_ActiveButtonLogicButton = -1; } } else if(HotItem() == pId) @@ -400,7 +403,7 @@ int CUi::DoButtonLogic(const void *pId, int Checked, const CUIRect *pRect) if(MouseButton(i)) { SetActiveItem(pId); - s_ButtonUsed = i; + m_ActiveButtonLogicButton = i; } } } @@ -416,7 +419,6 @@ int CUi::DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRe // logic int ReturnValue = 0; const bool Inside = MouseHovered(pRect); - static int s_ButtonUsed = -1; if(pClicked != nullptr) *pClicked = false; @@ -425,33 +427,34 @@ int CUi::DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRe if(CheckActiveItem(pId)) { - if(s_ButtonUsed == 0) + dbg_assert(m_ActiveDraggableButtonLogicButton >= 0, "m_ActiveDraggableButtonLogicButton invalid"); + if(m_ActiveDraggableButtonLogicButton == 0) { if(Checked >= 0) - ReturnValue = 1 + s_ButtonUsed; - if(!MouseButton(s_ButtonUsed)) + ReturnValue = 1 + m_ActiveDraggableButtonLogicButton; + if(!MouseButton(m_ActiveDraggableButtonLogicButton)) { if(pClicked != nullptr) *pClicked = true; SetActiveItem(nullptr); - s_ButtonUsed = -1; + m_ActiveDraggableButtonLogicButton = -1; } if(MouseButton(1)) { if(pAbrupted != nullptr) *pAbrupted = true; SetActiveItem(nullptr); - s_ButtonUsed = -1; + m_ActiveDraggableButtonLogicButton = -1; } } - else if(s_ButtonUsed > 0 && !MouseButton(s_ButtonUsed)) + else if(!MouseButton(m_ActiveDraggableButtonLogicButton)) { if(Inside && Checked >= 0) - ReturnValue = 1 + s_ButtonUsed; + ReturnValue = 1 + m_ActiveDraggableButtonLogicButton; if(pClicked != nullptr) *pClicked = true; SetActiveItem(nullptr); - s_ButtonUsed = -1; + m_ActiveDraggableButtonLogicButton = -1; } } else if(HotItem() == pId) @@ -461,7 +464,7 @@ int CUi::DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRe if(MouseButton(i)) { SetActiveItem(pId); - s_ButtonUsed = i; + m_ActiveDraggableButtonLogicButton = i; } } } @@ -474,8 +477,6 @@ int CUi::DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRe EEditState CUi::DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, float *pY) { - static const void *s_pEditing = nullptr; - if(MouseHovered(pRect)) SetHotItem(pId); @@ -484,9 +485,9 @@ EEditState CUi::DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, if(HotItem() == pId && MouseButtonClicked(0)) { SetActiveItem(pId); - if(!s_pEditing) + if(!m_pLastEditingItem) { - s_pEditing = pId; + m_pLastEditingItem = pId; Res = EEditState::START; } } @@ -494,9 +495,9 @@ EEditState CUi::DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, if(CheckActiveItem(pId) && !MouseButton(0)) { SetActiveItem(nullptr); - if(s_pEditing == pId) + if(m_pLastEditingItem == pId) { - s_pEditing = nullptr; + m_pLastEditingItem = nullptr; Res = EEditState::END; } } @@ -990,66 +991,61 @@ int64_t CUi::DoValueSelector(const void *pId, const CUIRect *pRect, const char * SEditResult CUi::DoValueSelectorWithState(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props) { // logic - static bool s_DidScroll = false; - static float s_ScrollValue = 0.0f; - static CLineInputNumber s_NumberInput; - static int s_ButtonUsed = -1; - static const void *s_pLastTextId = nullptr; - const bool Inside = MouseInside(pRect); const int Base = Props.m_IsHex ? 16 : 10; - if(HotItem() == pId && s_ButtonUsed >= 0 && !MouseButton(s_ButtonUsed)) + if(HotItem() == pId && m_ActiveValueSelectorState.m_Button >= 0 && !MouseButton(m_ActiveValueSelectorState.m_Button)) { DisableMouseLock(); if(CheckActiveItem(pId)) { SetActiveItem(nullptr); } - if(Inside && ((s_ButtonUsed == 0 && !s_DidScroll && Input()->MouseDoubleClick()) || s_ButtonUsed == 1)) + if(Inside && ((m_ActiveValueSelectorState.m_Button == 0 && !m_ActiveValueSelectorState.m_DidScroll && Input()->MouseDoubleClick()) || m_ActiveValueSelectorState.m_Button == 1)) { - s_pLastTextId = pId; - s_NumberInput.SetInteger64(Current, Base, Props.m_HexPrefix); - s_NumberInput.SelectAll(); + m_ActiveValueSelectorState.m_pLastTextId = pId; + m_ActiveValueSelectorState.m_NumberInput.SetInteger64(Current, Base, Props.m_HexPrefix); + m_ActiveValueSelectorState.m_NumberInput.SelectAll(); } - s_ButtonUsed = -1; + m_ActiveValueSelectorState.m_Button = -1; } - if(s_pLastTextId == pId) + if(m_ActiveValueSelectorState.m_pLastTextId == pId) { - SetActiveItem(&s_NumberInput); - DoEditBox(&s_NumberInput, pRect, 10.0f); + SetActiveItem(&m_ActiveValueSelectorState.m_NumberInput); + DoEditBox(&m_ActiveValueSelectorState.m_NumberInput, pRect, 10.0f); if(ConsumeHotkey(HOTKEY_ENTER) || ((MouseButtonClicked(1) || MouseButtonClicked(0)) && !Inside)) { - Current = clamp(s_NumberInput.GetInteger64(Base), Min, Max); + Current = clamp(m_ActiveValueSelectorState.m_NumberInput.GetInteger64(Base), Min, Max); DisableMouseLock(); SetActiveItem(nullptr); - s_pLastTextId = nullptr; + m_ActiveValueSelectorState.m_pLastTextId = nullptr; } if(ConsumeHotkey(HOTKEY_ESCAPE)) { DisableMouseLock(); SetActiveItem(nullptr); - s_pLastTextId = nullptr; + m_ActiveValueSelectorState.m_pLastTextId = nullptr; } } else { if(CheckActiveItem(pId)) { - if(Props.m_UseScroll && s_ButtonUsed == 0 && MouseButton(0)) + dbg_assert(m_ActiveValueSelectorState.m_Button >= 0, "m_ActiveValueSelectorState.m_Button invalid"); + if(Props.m_UseScroll && m_ActiveValueSelectorState.m_Button == 0 && MouseButton(0)) { - s_ScrollValue += MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); + m_ActiveValueSelectorState.m_ScrollValue += MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); - if(absolute(s_ScrollValue) > Props.m_Scale) + if(absolute(m_ActiveValueSelectorState.m_ScrollValue) > Props.m_Scale) { - const int64_t Count = (int64_t)(s_ScrollValue / Props.m_Scale); - s_ScrollValue = std::fmod(s_ScrollValue, Props.m_Scale); + const int64_t Count = (int64_t)(m_ActiveValueSelectorState.m_ScrollValue / Props.m_Scale); + m_ActiveValueSelectorState.m_ScrollValue = std::fmod(m_ActiveValueSelectorState.m_ScrollValue, Props.m_Scale); Current += Props.m_Step * Count; Current = clamp(Current, Min, Max); - s_DidScroll = true; + m_ActiveValueSelectorState.m_DidScroll = true; // Constrain to discrete steps if(Count > 0) @@ -1063,16 +1059,16 @@ SEditResult CUi::DoValueSelectorWithState(const void *pId, const CUIRec { if(MouseButton(0)) { - s_ButtonUsed = 0; - s_DidScroll = false; - s_ScrollValue = 0.0f; + m_ActiveValueSelectorState.m_Button = 0; + m_ActiveValueSelectorState.m_DidScroll = false; + m_ActiveValueSelectorState.m_ScrollValue = 0.0f; SetActiveItem(pId); if(Props.m_UseScroll) EnableMouseLock(pId); } else if(MouseButton(1)) { - s_ButtonUsed = 1; + m_ActiveValueSelectorState.m_Button = 1; SetActiveItem(pId); } } @@ -1100,21 +1096,20 @@ SEditResult CUi::DoValueSelectorWithState(const void *pId, const CUIRec if(Inside && !MouseButton(0) && !MouseButton(1)) SetHotItem(pId); - static const void *s_pEditing = nullptr; EEditState State = EEditState::NONE; - if(s_pEditing == pId) + if(m_pLastEditingItem == pId) { State = EEditState::EDITING; } - if(((CheckActiveItem(pId) && CheckMouseLock()) || s_pLastTextId == pId) && s_pEditing != pId) + if(((CheckActiveItem(pId) && CheckMouseLock()) || m_ActiveValueSelectorState.m_pLastTextId == pId) && m_pLastEditingItem != pId) { State = EEditState::START; - s_pEditing = pId; + m_pLastEditingItem = pId; } - if(!CheckMouseLock() && s_pLastTextId != pId && s_pEditing == pId) + if(!CheckMouseLock() && m_ActiveValueSelectorState.m_pLastTextId != pId && m_pLastEditingItem == pId) { State = EEditState::END; - s_pEditing = nullptr; + m_pLastEditingItem = nullptr; } return SEditResult{State, Current}; @@ -1133,7 +1128,6 @@ float CUi::DoScrollbarV(const void *pId, const CUIRect *pRect, float Current) Handle.y = Rail.y + (Rail.h - Handle.h) * Current; // logic - static float s_OffsetY; const bool InsideRail = MouseHovered(&Rail); const bool InsideHandle = MouseHovered(&Handle); bool Grabbed = false; // whether to apply the offset @@ -1156,14 +1150,14 @@ float CUi::DoScrollbarV(const void *pId, const CUIRect *pRect, float Current) if(MouseButton(0)) { SetActiveItem(pId); - s_OffsetY = MouseY() - Handle.y; + m_ActiveScrollbarOffset = MouseY() - Handle.y; Grabbed = true; } } else if(MouseButtonClicked(0) && !InsideHandle && InsideRail) { SetActiveItem(pId); - s_OffsetY = Handle.h / 2.0f; + m_ActiveScrollbarOffset = Handle.h / 2.0f; Grabbed = true; } @@ -1177,7 +1171,7 @@ float CUi::DoScrollbarV(const void *pId, const CUIRect *pRect, float Current) { const float Min = Rail.y; const float Max = Rail.h - Handle.h; - const float Cur = MouseY() - s_OffsetY; + const float Cur = MouseY() - m_ActiveScrollbarOffset; ReturnValue = clamp((Cur - Min) / Max, 0.0f, 1.0f); } @@ -1204,7 +1198,6 @@ float CUi::DoScrollbarH(const void *pId, const CUIRect *pRect, float Current, co Handle.x += (Rail.w - Handle.w) * Current; // logic - static float s_OffsetX; const bool InsideRail = MouseHovered(&Rail); const bool InsideHandle = MouseHovered(&Handle); bool Grabbed = false; // whether to apply the offset @@ -1227,14 +1220,14 @@ float CUi::DoScrollbarH(const void *pId, const CUIRect *pRect, float Current, co if(MouseButton(0)) { SetActiveItem(pId); - s_OffsetX = MouseX() - Handle.x; + m_ActiveScrollbarOffset = MouseX() - Handle.x; Grabbed = true; } } else if(MouseButtonClicked(0) && !InsideHandle && InsideRail) { SetActiveItem(pId); - s_OffsetX = Handle.w / 2.0f; + m_ActiveScrollbarOffset = Handle.w / 2.0f; Grabbed = true; } @@ -1248,7 +1241,7 @@ float CUi::DoScrollbarH(const void *pId, const CUIRect *pRect, float Current, co { const float Min = Rail.x; const float Max = Rail.w - Handle.w; - const float Cur = MouseX() - s_OffsetX; + const float Cur = MouseX() - m_ActiveScrollbarOffset; ReturnValue = clamp((Cur - Min) / Max, 0.0f, 1.0f); } @@ -1327,11 +1320,6 @@ bool CUi::DoScrollbarOption(const void *pId, int *pOption, const CUIRect *pRect, void CUi::RenderProgressSpinner(vec2 Center, float OuterRadius, const SProgressSpinnerProperties &Props) const { - static float s_SpinnerOffset = 0.0f; - static float s_LastRender = Client()->LocalTime(); - s_SpinnerOffset += (Client()->LocalTime() - s_LastRender) * 1.5f; - s_SpinnerOffset = std::fmod(s_SpinnerOffset, 1.0f); - Graphics()->TextureClear(); Graphics()->QuadsBegin(); @@ -1354,7 +1342,7 @@ void CUi::RenderProgressSpinner(vec2 Center, float OuterRadius, const SProgressS } const float FilledRatio = Props.m_Progress < 0.0f ? 0.333f : Props.m_Progress; - const int FilledSegmentOffset = Props.m_Progress < 0.0f ? round_to_int(s_SpinnerOffset * Props.m_Segments) : 0; + const int FilledSegmentOffset = Props.m_Progress < 0.0f ? round_to_int(m_ProgressSpinnerOffset * Props.m_Segments) : 0; const int FilledNumSegments = minimum(Props.m_Segments * FilledRatio + (Props.m_Progress < 0.0f ? 0 : 1), Props.m_Segments); Graphics()->SetColor(Props.m_Color); for(int i = 0; i < FilledNumSegments; ++i) @@ -1370,8 +1358,6 @@ void CUi::RenderProgressSpinner(vec2 Center, float OuterRadius, const SProgressS } Graphics()->QuadsEnd(); - - s_LastRender = Client()->LocalTime(); } void CUi::DoPopupMenu(const SPopupMenuId *pId, int X, int Y, int Width, int Height, void *pContext, FPopupMenuFunction pfnFunc, const SPopupMenuProperties &Props) diff --git a/src/game/client/ui.h b/src/game/client/ui.h index 046a9236708..7b46bef2e93 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -331,6 +331,22 @@ class CUi const CScrollRegion *m_pBecomingHotScrollRegion = nullptr; bool m_ActiveItemValid = false; + int m_ActiveButtonLogicButton = -1; + int m_ActiveDraggableButtonLogicButton = -1; + const void *m_pLastEditingItem = nullptr; + float m_ActiveScrollbarOffset = 0.0f; + float m_ProgressSpinnerOffset = 0.0f; + class CValueSelectorState + { + public: + int m_Button = -1; + bool m_DidScroll = false; + float m_ScrollValue = 0.0f; + CLineInputNumber m_NumberInput; + const void *m_pLastTextId = nullptr; + }; + CValueSelectorState m_ActiveValueSelectorState; + vec2 m_UpdatedMousePos = vec2(0.0f, 0.0f); // in window screen space vec2 m_UpdatedMouseDelta = vec2(0.0f, 0.0f); // in window screen space vec2 m_MousePos = vec2(0.0f, 0.0f); // in gui space From 71b3c8a35bcdeb9287df9c7e1801c2021daf5ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 11 Jun 2024 22:11:50 +0200 Subject: [PATCH 062/179] Force default `char` to be `signed` on all architectures We assume that `char` is `signed` in various places in the code. In particular, the `Str.StrToInts` test will fail when `char` is not `signed` and names containing special characters will be displayed incorrectly on servers. Therefore, the compiler flag `-fsigned-char` is set unconditionally instead of only for ARM and ARM64, as we expect `char` to be `signed` on all architectures. A static assertion is added to ensure at compile time that `char` is `signed` independently from the flag added in `CMakeLists.txt`. This is necessary at least for ARM, ARM64, PPC, PPC64, and PPC64LE. According to some sources, `char` may also be `unsigned` by default when compiling for Android, although this could not be confirmed with the current Android NDK using Clang. For the PowerPC architectures, Compiler Explorer can be used to confirm that `char` is not `signed` by default by checking whether the static assertion compiles (see https://godbolt.org/z/9rn5Mrf59) and that the assembly is different with the `-fsigned-char` flag (see https://godbolt.org/z/138zTj3Wa). Closes #8386. --- CMakeLists.txt | 9 ++++----- src/game/gamecore.cpp | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a10762c3239..71e625e5421 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -291,11 +291,10 @@ if(NOT MSVC AND NOT HAIKU) add_cxx_compiler_flag_if_supported(OUR_FLAGS -ffloat-store) endif() - # This is needed to get the server to correctly display special characters - # on ARM systems. - if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64") - add_cxx_compiler_flag_if_supported(OUR_FLAGS -fsigned-char) - endif() + # We assume that char is signed in various places in the code. In particular, + # the Str.StrToInts test will fail when char is not signed and names containing + # special characters will be displayed incorrectly on servers. + add_cxx_compiler_flag_if_supported(OUR_FLAGS -fsigned-char) # Don't insert timestamps into PEs to keep the build reproducible. if(TARGET_OS STREQUAL "windows") diff --git a/src/game/gamecore.cpp b/src/game/gamecore.cpp index fad18b7ac32..0f37382b0f9 100644 --- a/src/game/gamecore.cpp +++ b/src/game/gamecore.cpp @@ -9,6 +9,8 @@ #include #include +#include + const char *CTuningParams::ms_apNames[] = { #define MACRO_TUNING_PARAM(Name, ScriptName, Value, Description) #ScriptName, @@ -63,6 +65,8 @@ float CTuningParams::GetWeaponFireDelay(int Weapon) const } } +static_assert(std::numeric_limits::is_signed, "char must be signed for StrToInts to work correctly"); + void StrToInts(int *pInts, size_t NumInts, const char *pStr) { dbg_assert(NumInts > 0, "StrToInts: NumInts invalid"); From fd4e34fd1e4aa7be6c0d30d8bf1e817b76241264 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Tue, 11 Jun 2024 22:43:59 -0300 Subject: [PATCH 063/179] Update brazilian_portuguese.txt --- data/languages/brazilian_portuguese.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index 1dd109b2961..8b30c7735d7 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -32,6 +32,7 @@ # Rafael Fontenelle 2023-12-05 17:01:00 # Rafael Fontenelle 2024-03-02 16:20:00 # Rafael Fontenelle 2024-04-30 14:52:00 +# Rafael Fontenelle 2024-06-11 22:43:00 ##### /authors ##### ##### translated strings ##### @@ -1871,10 +1872,10 @@ Always show other players' hook collision lines == Sempre mostrar linhas de colisão do gancho dos outros jogadores %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== Mostrar apenas mensagens de chat de membros do time From 9a29c029a5ffdf127199a6c7a44290af818587e5 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 11 May 2024 11:03:17 +0800 Subject: [PATCH 064/179] Fix in game menu buttons overlapping on team based gametypes The ddnet buttons kill and pause do not fit in anymore if there is also a join red/blue button. This commit fixes that by hiding the buttons if there is not enough space anymore. Related prior work https://github.com/ddnet/ddnet/pull/2720 --- src/game/client/components/menus_ingame.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 1f808e4d1a8..251803e9823 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -41,6 +41,7 @@ using namespace std::chrono_literals; void CMenus::RenderGame(CUIRect MainView) { CUIRect Button, ButtonBar, ButtonBar2; + bool ShowDDRaceButtons = MainView.w > 855.0f; MainView.HSplitTop(45.0f, &ButtonBar, &MainView); ButtonBar.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); @@ -180,7 +181,7 @@ void CMenus::RenderGame(CUIRect MainView) } } - if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS) + if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS && ShowDDRaceButtons) { ButtonBar.VSplitLeft(5.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(65.0f, &Button, &ButtonBar); @@ -194,7 +195,7 @@ void CMenus::RenderGame(CUIRect MainView) } } - if(m_pClient->m_ReceivedDDNetPlayer && m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pGameInfoObj) + if(m_pClient->m_ReceivedDDNetPlayer && m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pGameInfoObj && ShowDDRaceButtons) { if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS || Paused || Spec) { From fbb2243a0500544eed51357ff9aae71f8d0e779c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Thu, 13 Jun 2024 20:52:27 +0200 Subject: [PATCH 065/179] Fix tiles being handled in same tick for dead tees in some cases The `CGameControllerDDRace::HandleCharacterTiles` function can kill the tee if the conditions for starting the race are not satisfied when touching a start tile. In this case, no further tiles should be handled in the `CCharacter::HandleTiles` function, else the effects of those tiles being handled may incorrectly be applied after the tee has respawned. --- src/game/server/entities/character.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index de9299376fe..c35e99a3a6d 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -1488,6 +1488,8 @@ void CCharacter::HandleTiles(int Index) m_TeleCheckpoint = TeleCheckpoint; GameServer()->m_pController->HandleCharacterTiles(this, Index); + if(!m_Alive) + return; // freeze if(((m_TileIndex == TILE_FREEZE) || (m_TileFIndex == TILE_FREEZE)) && !m_Core.m_Super && !m_Core.m_DeepFrozen) From 249c8572ae9871a397647b7b09b0b0273443309e Mon Sep 17 00:00:00 2001 From: Tyler Stocks <162745945+TylerStocks1@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:04:19 +0100 Subject: [PATCH 066/179] Update popups.cpp --- src/game/editor/popups.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index 404580a3092..069ad2083c0 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -1632,7 +1632,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupImage(void *pContext, CUIRect View, CEditor *pEditor = static_cast(pContext); static int s_ExternalButton = 0; - static int s_ReloadButton = 0; + static int s_ReimportButton = 0; static int s_ReplaceButton = 0; static int s_RemoveButton = 0; static int s_ExportButton = 0; @@ -1686,7 +1686,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupImage(void *pContext, CUIRect View, static CUi::SSelectionPopupContext s_SelectionPopupContext; static CScrollRegion s_SelectionPopupScrollRegion; s_SelectionPopupContext.m_pScrollRegion = &s_SelectionPopupScrollRegion; - if(pEditor->DoButton_MenuItem(&s_ReloadButton, "Reload", 0, &Slot, 0, "Reloads the image from the mapres folder")) + if(pEditor->DoButton_MenuItem(&s_ReimportButton, "Re-import", 0, &Slot, 0, "Re-imports the image from the mapres folder")) { char aFilename[IO_MAX_PATH_LENGTH]; str_format(aFilename, sizeof(aFilename), "%s.png", pImg->m_aName); @@ -1754,7 +1754,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSound(void *pContext, CUIRect View, { CEditor *pEditor = static_cast(pContext); - static int s_ReloadButton = 0; + static int s_ReimportButton = 0; static int s_ReplaceButton = 0; static int s_RemoveButton = 0; static int s_ExportButton = 0; @@ -1785,7 +1785,7 @@ CUi::EPopupMenuFunctionResult CEditor::PopupSound(void *pContext, CUIRect View, View.HSplitTop(5.0f, nullptr, &View); View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ReloadButton, "Reload", 0, &Slot, 0, "Reloads the sound from the mapres folder")) + if(pEditor->DoButton_MenuItem(&s_ReimportButton, "Re-import", 0, &Slot, 0, "Re-imports the sound from the mapres folder")) { char aFilename[IO_MAX_PATH_LENGTH]; str_format(aFilename, sizeof(aFilename), "%s.opus", pSound->m_aName); From ec42dea161603c57ce45ea516fc32be4fac65151 Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Fri, 14 Jun 2024 12:32:25 +0800 Subject: [PATCH 067/179] Version 18.3 --- src/game/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/version.h b/src/game/version.h index ed5c9275c48..e64ce8f691e 100644 --- a/src/game/version.h +++ b/src/game/version.h @@ -3,11 +3,11 @@ #ifndef GAME_VERSION_H #define GAME_VERSION_H #ifndef GAME_RELEASE_VERSION -#define GAME_RELEASE_VERSION "18.2" +#define GAME_RELEASE_VERSION "18.3" #endif #define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION #define GAME_NETVERSION "0.6 626fce9a778df4d4" -#define DDNET_VERSION_NUMBER 18020 +#define DDNET_VERSION_NUMBER 18030 extern const char *GIT_SHORTREV_HASH; #define GAME_NAME "DDNet" #endif From 264df1f03596054e8435b2c50fa0137c06aab652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Fri, 14 Jun 2024 23:15:00 +0200 Subject: [PATCH 068/179] Improve envelope editor double-click handling Only handle the double-click on the envelope editor when the second click is released instead of when it is pressed down already. Remove unnecessary UI element `s_BoxSelectId`, the temporary activation of which was causing the tooltip to be missing for one frame when clicking the envelope editor. --- src/game/editor/editor.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index a665bae6e88..3be764b2aab 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -6334,8 +6334,6 @@ void CEditor::RenderEnvelopeEditor(CUIRect View) ResetZoomEnvelope(pEnvelope, s_ActiveChannels); } - static int s_EnvelopeEditorId = 0; - ColorRGBA aColors[] = {ColorRGBA(1, 0.2f, 0.2f), ColorRGBA(0.2f, 1, 0.2f), ColorRGBA(0.2f, 0.2f, 1), ColorRGBA(1, 1, 0.2f)}; CUIRect Button; @@ -6389,6 +6387,8 @@ void CEditor::RenderEnvelopeEditor(CUIRect View) m_Map.OnModify(); } + static int s_EnvelopeEditorId = 0; + static int s_EnvelopeEditorButtonUsed = -1; const bool ShouldPan = s_Operation == EEnvelopeEditorOp::OP_NONE && (Ui()->MouseButton(2) || (Ui()->MouseButton(0) && Input()->ModifierIsPressed())); if(m_pContainerPanned == &s_EnvelopeEditorId) { @@ -6438,6 +6438,16 @@ void CEditor::RenderEnvelopeEditor(CUIRect View) { // do stuff if(Ui()->MouseButton(0)) + { + s_EnvelopeEditorButtonUsed = 0; + if(s_Operation != EEnvelopeEditorOp::OP_BOX_SELECT && !Input()->ModifierIsPressed()) + { + s_Operation = EEnvelopeEditorOp::OP_BOX_SELECT; + s_MouseXStart = Ui()->MouseX(); + s_MouseYStart = Ui()->MouseY(); + } + } + else if(s_EnvelopeEditorButtonUsed == 0) { if(Input()->MouseDoubleClick()) { @@ -6462,14 +6472,7 @@ void CEditor::RenderEnvelopeEditor(CUIRect View) RemoveTimeOffsetEnvelope(pEnvelope); m_Map.OnModify(); } - else if(s_Operation != EEnvelopeEditorOp::OP_BOX_SELECT && !Input()->ModifierIsPressed()) - { - static int s_BoxSelectId = 0; - Ui()->SetActiveItem(&s_BoxSelectId); - s_Operation = EEnvelopeEditorOp::OP_BOX_SELECT; - s_MouseXStart = Ui()->MouseX(); - s_MouseYStart = Ui()->MouseY(); - } + s_EnvelopeEditorButtonUsed = -1; } m_ShowEnvelopePreview = SHOWENV_SELECTED; From 4852dc435d125625fb81a952ca160f41c61ee398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Fri, 14 Jun 2024 22:50:29 +0200 Subject: [PATCH 069/179] Move double-click handling from engine input to UI Instead of relying on SDL to determine when a click is a double-click, implement double-click handling specifically for the UI, as double-clicks are only supposed to be used there. This allows us to ensure that double-clicks only activate UI elements if both clicks were performed on the same UI element. Previously, only the position of the second click was considered, so UI element would incorrectly activate when double-clicking close to them as long as the second click starts and ends on them. Implementing double-clicking handling separately is also necessary to support double-clicking in the UI with touch events, as SDL does not provide the double-click information for touch events. The newly added `CUi::DoDoubleClickLogic` function should be called after a UI element has been clicked. It will return `true` if the current click should be interpreted as a double-click, i.e. if the same UI element was clicked, the click was within 0.5 seconds of the previous click (the default duration for SDL and Windows) and the distance from the previous click is within 32 screen pixels (the default distance for SDL). --- src/engine/client/input.cpp | 19 ------------------- src/engine/client/input.h | 2 -- src/engine/input.h | 1 - src/game/client/components/menus_browser.cpp | 2 +- src/game/client/ui.cpp | 17 ++++++++++++++++- src/game/client/ui.h | 9 +++++++++ src/game/client/ui_listbox.cpp | 9 +++------ src/game/client/ui_listbox.h | 1 - src/game/editor/editor.cpp | 6 +++--- 9 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/engine/client/input.cpp b/src/engine/client/input.cpp index 63931295ad4..528fc4e82ba 100644 --- a/src/engine/client/input.cpp +++ b/src/engine/client/input.cpp @@ -66,7 +66,6 @@ CInput::CInput() m_InputCounter = 1; m_InputGrabbed = false; - m_MouseDoubleClick = false; m_MouseFocus = true; m_pClipboardText = nullptr; @@ -307,16 +306,6 @@ bool CInput::NativeMousePressed(int Index) return (i & SDL_BUTTON(Index)) != 0; } -bool CInput::MouseDoubleClick() -{ - if(m_MouseDoubleClick) - { - m_MouseDoubleClick = false; - return true; - } - return false; -} - const char *CInput::GetClipboardText() { SDL_free(m_pClipboardText); @@ -364,7 +353,6 @@ void CInput::Clear() mem_zero(m_aInputState, sizeof(m_aInputState)); mem_zero(m_aInputCount, sizeof(m_aInputCount)); m_vInputEvents.clear(); - m_MouseDoubleClick = false; } float CInput::GetUpdateTime() const @@ -743,13 +731,6 @@ int CInput::Update() Scancode = KEY_MOUSE_8; if(Event.button.button == 9) Scancode = KEY_MOUSE_9; - if(Event.button.button == SDL_BUTTON_LEFT) - { - if(Event.button.clicks % 2 == 0) - m_MouseDoubleClick = true; - if(Event.button.clicks == 1) - m_MouseDoubleClick = false; - } break; case SDL_MOUSEWHEEL: diff --git a/src/engine/client/input.h b/src/engine/client/input.h index 7cef8f81625..5ff04b06cb6 100644 --- a/src/engine/client/input.h +++ b/src/engine/client/input.h @@ -77,7 +77,6 @@ class CInput : public IEngineInput char *m_pClipboardText; bool m_MouseFocus; - bool m_MouseDoubleClick; #if defined(CONF_PLATFORM_ANDROID) ivec2 m_LastMousePos = ivec2(0, 0); // No relative mouse on Android int m_NumBackPresses = 0; @@ -145,7 +144,6 @@ class CInput : public IEngineInput void MouseModeRelative() override; void NativeMousePos(int *pX, int *pY) const override; bool NativeMousePressed(int Index) override; - bool MouseDoubleClick() override; const char *GetClipboardText() override; void SetClipboardText(const char *pText) override; diff --git a/src/engine/input.h b/src/engine/input.h index d1d92660424..fec0b71c264 100644 --- a/src/engine/input.h +++ b/src/engine/input.h @@ -93,7 +93,6 @@ class IInput : public IInterface virtual bool NativeMousePressed(int Index) = 0; virtual void MouseModeRelative() = 0; virtual void MouseModeAbsolute() = 0; - virtual bool MouseDoubleClick() = 0; virtual bool MouseRelative(float *pX, float *pY) = 0; // clipboard diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index bf966f04de4..5670d0fd7b7 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -1551,7 +1551,7 @@ void CMenus::RenderServerbrowserFriends(CUIRect View) { str_copy(g_Config.m_UiServerAddress, Friend.ServerInfo()->m_aAddress); m_ServerBrowserShouldRevealSelection = true; - if(Input()->MouseDoubleClick()) + if(Ui()->DoDoubleClickLogic(Friend.ListItemId())) { Connect(g_Config.m_UiServerAddress); } diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index a12720250fa..a08545c4368 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -475,6 +475,21 @@ int CUi::DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRe return ReturnValue; } +bool CUi::DoDoubleClickLogic(const void *pId) +{ + if(m_DoubleClickState.m_pLastClickedId == pId && + Client()->GlobalTime() - m_DoubleClickState.m_LastClickTime < 0.5f && + distance(m_DoubleClickState.m_LastClickPos, MousePos()) <= 32.0f * Screen()->h / Graphics()->ScreenHeight()) + { + m_DoubleClickState.m_pLastClickedId = nullptr; + return true; + } + m_DoubleClickState.m_pLastClickedId = pId; + m_DoubleClickState.m_LastClickTime = Client()->GlobalTime(); + m_DoubleClickState.m_LastClickPos = MousePos(); + return false; +} + EEditState CUi::DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, float *pY) { if(MouseHovered(pRect)) @@ -1001,7 +1016,7 @@ SEditResult CUi::DoValueSelectorWithState(const void *pId, const CUIRec { SetActiveItem(nullptr); } - if(Inside && ((m_ActiveValueSelectorState.m_Button == 0 && !m_ActiveValueSelectorState.m_DidScroll && Input()->MouseDoubleClick()) || m_ActiveValueSelectorState.m_Button == 1)) + if(Inside && ((m_ActiveValueSelectorState.m_Button == 0 && !m_ActiveValueSelectorState.m_DidScroll && DoDoubleClickLogic(pId)) || m_ActiveValueSelectorState.m_Button == 1)) { m_ActiveValueSelectorState.m_pLastTextId = pId; m_ActiveValueSelectorState.m_NumberInput.SetInteger64(Current, Base, Props.m_HexPrefix); diff --git a/src/game/client/ui.h b/src/game/client/ui.h index 7b46bef2e93..f9a802e83c3 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -333,6 +333,14 @@ class CUi int m_ActiveButtonLogicButton = -1; int m_ActiveDraggableButtonLogicButton = -1; + class CDoubleClickState + { + public: + const void *m_pLastClickedId = nullptr; + float m_LastClickTime = -1.0f; + vec2 m_LastClickPos = vec2(-1.0f, -1.0f); + }; + CDoubleClickState m_DoubleClickState; const void *m_pLastEditingItem = nullptr; float m_ActiveScrollbarOffset = 0.0f; float m_ProgressSpinnerOffset = 0.0f; @@ -526,6 +534,7 @@ class CUi int DoButtonLogic(const void *pId, int Checked, const CUIRect *pRect); int DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRect, bool *pClicked, bool *pAbrupted); + bool DoDoubleClickLogic(const void *pId); EEditState DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, float *pY); void DoSmoothScrollLogic(float *pScrollOffset, float *pScrollOffsetChange, float ViewPortSize, float TotalSize, bool SmoothClamp = false, float ScrollSpeed = 10.0f) const; static vec2 CalcAlignedCursorPos(const CUIRect *pRect, vec2 TextSize, int Align, const float *pBiggestCharHeight = nullptr); diff --git a/src/game/client/ui_listbox.cpp b/src/game/client/ui_listbox.cpp index 3abf38d8548..87620a9d44f 100644 --- a/src/game/client/ui_listbox.cpp +++ b/src/game/client/ui_listbox.cpp @@ -93,7 +93,6 @@ void CListBox::DoStart(float RowHeight, int NumItems, int ItemsPerRow, int RowsP m_ListBoxRowHeight = RowHeight; m_ListBoxNumItems = NumItems; m_ListBoxItemsPerRow = ItemsPerRow; - m_ListBoxDoneEvents = false; m_ListBoxItemActivated = false; m_ListBoxItemSelected = false; @@ -174,13 +173,11 @@ CListboxItem CListBox::DoNextItem(const void *pId, bool Selected, float CornerRa ItemClicked = false; // process input, regard selected index - if(m_ListBoxSelectedIndex == ThisItemIndex) + if(m_ListBoxNewSelected == ThisItemIndex) { - if(m_Active && !m_ListBoxDoneEvents) + if(m_Active) { - m_ListBoxDoneEvents = true; - - if(Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || (ItemClicked && Input()->MouseDoubleClick())) + if(Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || (ItemClicked && Ui()->DoDoubleClickLogic(pId))) { m_ListBoxItemActivated = true; Ui()->SetActiveItem(nullptr); diff --git a/src/game/client/ui_listbox.h b/src/game/client/ui_listbox.h index 1c24f098508..26ecc71710b 100644 --- a/src/game/client/ui_listbox.h +++ b/src/game/client/ui_listbox.h @@ -24,7 +24,6 @@ class CListBox : private CUIElementBase int m_ListBoxNewSelected; int m_ListBoxNewSelOffset; bool m_ListBoxUpdateScroll; - bool m_ListBoxDoneEvents; int m_ListBoxNumItems; int m_ListBoxItemsPerRow; bool m_ListBoxItemSelected; diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 3be764b2aab..2d82e3fbfdb 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -312,7 +312,7 @@ SEditResult CEditor::UiDoValueSelector(void *pId, CUIRect *pRect, const cha { Ui()->SetActiveItem(nullptr); } - if(Inside && ((s_ButtonUsed == 0 && !s_DidScroll && Input()->MouseDoubleClick()) || s_ButtonUsed == 1)) + if(Inside && ((s_ButtonUsed == 0 && !s_DidScroll && Ui()->DoDoubleClickLogic(pId)) || s_ButtonUsed == 1)) { s_pLastTextId = pId; s_NumberInput.SetInteger(Current, Base); @@ -3907,7 +3907,7 @@ void CEditor::RenderLayers(CUIRect LayersBox) Ui()->DoPopupMenu(&s_PopupGroupId, Ui()->MouseX(), Ui()->MouseY(), 145, 256, this, PopupGroup); } - if(!m_Map.m_vpGroups[g]->m_vpLayers.empty() && Input()->MouseDoubleClick()) + if(!m_Map.m_vpGroups[g]->m_vpLayers.empty() && Ui()->DoDoubleClickLogic(m_Map.m_vpGroups[g].get())) m_Map.m_vpGroups[g]->m_Collapse ^= 1; SetOperation(OP_NONE); @@ -6449,7 +6449,7 @@ void CEditor::RenderEnvelopeEditor(CUIRect View) } else if(s_EnvelopeEditorButtonUsed == 0) { - if(Input()->MouseDoubleClick()) + if(Ui()->DoDoubleClickLogic(&s_EnvelopeEditorId)) { // add point float Time = ScreenToEnvelopeX(View, Ui()->MouseX()); From b05620d1eb69829a7d88be2ffffbf1d769cb014e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?melo=C6=9E?= Date: Sat, 15 Jun 2024 04:14:53 +0200 Subject: [PATCH 070/179] update practice help text --- src/game/server/gamecontext.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index d590b25af4c..0d1fae675c2 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -3666,7 +3666,7 @@ void CGameContext::RegisterChatCommands() Console()->Register("dnd", "", CFGFLAG_CHAT | CFGFLAG_SERVER | CFGFLAG_NONTEEHISTORIC, ConDND, this, "Toggle Do Not Disturb (no chat and server messages)"); Console()->Register("mapinfo", "?r[map]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConMapInfo, this, "Show info about the map with name r gives (current map by default)"); Console()->Register("timeout", "?s[code]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConTimeout, this, "Set timeout protection code s"); - Console()->Register("practice", "?i['0'|'1']", CFGFLAG_CHAT | CFGFLAG_SERVER, ConPractice, this, "Enable cheats (currently only /rescue) for your current team's run, but you can't earn a rank"); + Console()->Register("practice", "?i['0'|'1']", CFGFLAG_CHAT | CFGFLAG_SERVER, ConPractice, this, "Enable cheats for your current team's run, but you can't earn a rank"); Console()->Register("practicecmdlist", "", CFGFLAG_CHAT | CFGFLAG_SERVER, ConPracticeCmdList, this, "List all commands that are avaliable in practice mode"); Console()->Register("swap", "?r[player name]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConSwap, this, "Request to swap your tee with another team member"); Console()->Register("save", "?r[code]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConSave, this, "Save team with code r."); From ede5fe55d64ab1b0bad94f6d787c873051133f3e Mon Sep 17 00:00:00 2001 From: noKetchup <93238471+n0Ketchp@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:09:59 -0400 Subject: [PATCH 071/179] Update spanish.txt --- data/languages/spanish.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index a7a457a093a..fd74e057235 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -1863,10 +1863,10 @@ Always show other players' hook collision lines == Siempre mostrar la línea de colisión del gancho de otros jugadores %d/%d KiB (%.1f KiB/s) -== +== %d/%d KiB (%.1f KiB/s) Tee -== +== Tee Show only chat messages from team members -== +== Mostrar solo los mensajes de miembros del equipo From 6df4ff3a44c32da3aa668fad80383985c0ae9de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 12 Jun 2024 20:30:24 +0200 Subject: [PATCH 072/179] Move `CGameConsole::Dump` function to `CGameConsole::CInstance` Avoid the `int Type` parameter by making `CGameConsole::Dump` a member function of `CGameConsole::CInstance`. Use `log_*` functions instead of `IConsole` for logging. --- src/game/client/components/console.cpp | 54 +++++++++++++------------- src/game/client/components/console.h | 2 +- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index c815b53cec4..10f51e954c3 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -783,6 +783,30 @@ void CGameConsole::CInstance::UpdateSearch() } } +void CGameConsole::CInstance::Dump() +{ + char aTimestamp[20]; + str_timestamp(aTimestamp, sizeof(aTimestamp)); + char aFilename[IO_MAX_PATH_LENGTH]; + str_format(aFilename, sizeof(aFilename), "dumps/%s_dump_%s.txt", m_pName, aTimestamp); + IOHANDLE File = m_pGameConsole->Storage()->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); + if(File) + { + PumpBacklogPending(); + for(CInstance::CBacklogEntry *pEntry = m_Backlog.First(); pEntry; pEntry = m_Backlog.Next(pEntry)) + { + io_write(File, pEntry->m_aText, pEntry->m_Length); + io_write_newline(File); + } + io_close(File); + log_info("console", "%s contents were written to '%s'", m_pName, aFilename); + } + else + { + log_error("console", "Failed to open '%s'", aFilename); + } +} + CGameConsole::CGameConsole() : m_LocalConsole(CONSOLETYPE_LOCAL), m_RemoteConsole(CONSOLETYPE_REMOTE) { @@ -1388,32 +1412,6 @@ void CGameConsole::Toggle(int Type) m_ConsoleType = Type; } -void CGameConsole::Dump(int Type) -{ - CInstance *pConsole = Type == CONSOLETYPE_REMOTE ? &m_RemoteConsole : &m_LocalConsole; - char aBuf[IO_MAX_PATH_LENGTH + 64]; - char aFilename[IO_MAX_PATH_LENGTH]; - str_timestamp(aBuf, sizeof(aBuf)); - str_format(aFilename, sizeof(aFilename), "dumps/%s_dump_%s.txt", pConsole->m_pName, aBuf); - IOHANDLE File = Storage()->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(File) - { - pConsole->PumpBacklogPending(); - for(CInstance::CBacklogEntry *pEntry = pConsole->m_Backlog.First(); pEntry; pEntry = pConsole->m_Backlog.Next(pEntry)) - { - io_write(File, pEntry->m_aText, pEntry->m_Length); - io_write_newline(File); - } - io_close(File); - str_format(aBuf, sizeof(aBuf), "%s contents were written to '%s'", pConsole->m_pName, aFilename); - } - else - { - str_format(aBuf, sizeof(aBuf), "Failed to open '%s'", aFilename); - } - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); -} - void CGameConsole::ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->Toggle(CONSOLETYPE_LOCAL); @@ -1436,12 +1434,12 @@ void CGameConsole::ConClearRemoteConsole(IConsole::IResult *pResult, void *pUser void CGameConsole::ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData) { - ((CGameConsole *)pUserData)->Dump(CONSOLETYPE_LOCAL); + ((CGameConsole *)pUserData)->m_LocalConsole.Dump(); } void CGameConsole::ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData) { - ((CGameConsole *)pUserData)->Dump(CONSOLETYPE_REMOTE); + ((CGameConsole *)pUserData)->m_RemoteConsole.Dump(); } void CGameConsole::ConConsolePageUp(IConsole::IResult *pResult, void *pUserData) diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index 101cc3e16c8..a4f9c9cd1bc 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -110,6 +110,7 @@ class CGameConsole : public CComponent int GetLinesToScroll(int Direction, int LinesToScroll); void ScrollToCenter(int StartLine, int EndLine); void ClearSearch(); + void Dump() REQUIRES(!m_BacklogPendingLock); const char *GetString() const { return m_Input.GetString(); } static void PossibleCommandsCompleteCallback(int Index, const char *pStr, void *pUser); @@ -142,7 +143,6 @@ class CGameConsole : public CComponent static const ColorRGBA ms_SearchSelectedColor; void Toggle(int Type); - void Dump(int Type); static void PossibleCommandsRenderCallback(int Index, const char *pStr, void *pUser); static void ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData); From 908ebc65eed9adafd98f3a7114e25d9ee3ece8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 18 Jun 2024 21:45:52 +0200 Subject: [PATCH 073/179] Remove `Spectate` label from HUD, show `Following {player}` instead --- src/game/client/components/hud.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index a820c562529..da9a5a0a037 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -1384,7 +1384,18 @@ void CHud::RenderSpectatorHud() // draw the text char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Spectate"), GameClient()->m_MultiViewActivated ? Localize("Multi-View") : m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW ? m_pClient->m_aClients[m_pClient->m_Snap.m_SpecInfo.m_SpectatorId].m_aName : Localize("Free-View")); + if(GameClient()->m_MultiViewActivated) + { + str_copy(aBuf, Localize("Multi-View")); + } + else if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW) + { + str_format(aBuf, sizeof(aBuf), Localize("Following %s", "Spectating"), m_pClient->m_aClients[m_pClient->m_Snap.m_SpecInfo.m_SpectatorId].m_aName); + } + else + { + str_copy(aBuf, Localize("Free-View")); + } TextRender()->Text(m_Width - 174.0f, m_Height - 15.0f + (15.f - 8.f) / 2.f, 8.0f, aBuf, -1.0f); } From 6153a8dc76391254f2c9acd29987d28257a55405 Mon Sep 17 00:00:00 2001 From: Sedonya_ <115283299+Sedonya@users.noreply.github.com> Date: Thu, 20 Jun 2024 03:19:23 +0500 Subject: [PATCH 074/179] Update russian.txt --- data/languages/russian.txt | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 403d62a1ec3..85fcb0477cf 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -11,14 +11,15 @@ # gerdoe 2020-07-01 22:04:21 # gerdoe 2020-09-14 20:53:53 # gerdoe 2020-09-17 22:49:22 -# Vy0x2 2021-06-08 15:48:25 +# Vy0x2 2021-06-08 15:48:25 # Anime.pdf 2021-06-13 13:08:50 -# banan 2022-06-12 11:36:50 -# ban 2023-01-5 10:22:50 -# unban 2023-03-10 21:50:50 -# eblan 2023-08-07 14:27:00 -# kaban 2023-9-21 19:00:00 -# ByFox 2023-11-14 11:24:00 +# banan 2022-06-12 11:36:50 +# ban 2023-01-05 10:22:50 +# unban 2023-03-10 21:50:50 +# eblan 2023-08-07 14:27:00 +# kaban 2023-09-21 19:00:00 +# ByFox 2023-11-14 11:24:00 +# Sedonya 2024-06-20 03:18:10 ##### /authors ##### ##### translated strings ##### @@ -1744,7 +1745,7 @@ Saving settings to '%s' failed == Не получилось сохранить настройки в '%s' Searching -== В поиске +== Поиск Enter Username == Введите имя @@ -1774,7 +1775,7 @@ Are you sure that you want to restart? == Вы уверены, что хотите начать заново? There's an unsaved map in the editor, you might want to save it. -== Вы не сохранили последнюю отредактированную карту, возможно, вы хотите ее сохранить. +== В редакторе есть несохраненная карта, возможно, вы хотите её сохранить. Continue anyway? == Все равно продолжить? @@ -1834,10 +1835,10 @@ Loading demo file from storage == %d/%d КиБ (%.1f КиБ/с) No login required -== аутентификация не требуется +== Без логина Player info change cooldown -== Кулдаун смены информации об игроке +== Задержка смены информации об игроке Tee == Ти From e7bd56544bf61de4c09c1dd0fbdd3d9ed71547e9 Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Thu, 20 Jun 2024 13:10:51 +0800 Subject: [PATCH 075/179] Fix indentation --- data/languages/russian.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 85fcb0477cf..7373c5735b7 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -11,14 +11,14 @@ # gerdoe 2020-07-01 22:04:21 # gerdoe 2020-09-14 20:53:53 # gerdoe 2020-09-17 22:49:22 -# Vy0x2 2021-06-08 15:48:25 +# Vy0x2 2021-06-08 15:48:25 # Anime.pdf 2021-06-13 13:08:50 -# banan 2022-06-12 11:36:50 -# ban 2023-01-05 10:22:50 -# unban 2023-03-10 21:50:50 -# eblan 2023-08-07 14:27:00 -# kaban 2023-09-21 19:00:00 -# ByFox 2023-11-14 11:24:00 +# banan 2022-06-12 11:36:50 +# ban 2023-01-05 10:22:50 +# unban 2023-03-10 21:50:50 +# eblan 2023-08-07 14:27:00 +# kaban 2023-09-21 19:00:00 +# ByFox 2023-11-14 11:24:00 # Sedonya 2024-06-20 03:18:10 ##### /authors ##### From efa069ef800c94bb7ac1d950e3af0d9d78459ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 18 Jun 2024 22:53:36 +0200 Subject: [PATCH 076/179] Ensure sample indices are initialized also with sound disabled The assertion of #8262 can be reproduced when sound is disabled or failed to be initialized, as the sample indices where not being initialized properly in these cases. It is still necessary to initialized them so sounds can be loaded in the editor also when sound is disabled. The potential thread-safety issues of the `CSound::AllocSample` function are not yet resolved so the issue remains open. --- src/engine/client/sound.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/engine/client/sound.cpp b/src/engine/client/sound.cpp index 3bfb8294e15..9c9881b12f6 100644 --- a/src/engine/client/sound.cpp +++ b/src/engine/client/sound.cpp @@ -207,6 +207,18 @@ int CSound::Init() m_pGraphics = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); + // Initialize sample indices. We always need them to load sounds in + // the editor even if sound is disabled or failed to be enabled. + m_FirstFreeSampleIndex = 0; + for(size_t i = 0; i < std::size(m_aSamples) - 1; ++i) + { + m_aSamples[i].m_Index = i; + m_aSamples[i].m_NextFreeSampleIndex = i + 1; + m_aSamples[i].m_pData = nullptr; + } + m_aSamples[std::size(m_aSamples) - 1].m_Index = std::size(m_aSamples) - 1; + m_aSamples[std::size(m_aSamples) - 1].m_NextFreeSampleIndex = SAMPLE_INDEX_FULL; + if(!g_Config.m_SndEnable) return 0; @@ -228,7 +240,6 @@ int CSound::Init() // Open the audio device and start playing sound! m_Device = SDL_OpenAudioDevice(nullptr, 0, &Format, &FormatOut, 0); - if(m_Device == 0) { dbg_msg("sound", "unable to open audio: %s", SDL_GetError()); @@ -243,15 +254,6 @@ int CSound::Init() #endif m_pMixBuffer = (int *)calloc(m_MaxFrames * 2, sizeof(int)); - m_FirstFreeSampleIndex = 0; - for(size_t i = 0; i < std::size(m_aSamples) - 1; ++i) - { - m_aSamples[i].m_Index = i; - m_aSamples[i].m_NextFreeSampleIndex = i + 1; - } - m_aSamples[std::size(m_aSamples) - 1].m_Index = std::size(m_aSamples) - 1; - m_aSamples[std::size(m_aSamples) - 1].m_NextFreeSampleIndex = SAMPLE_INDEX_FULL; - SDL_PauseAudioDevice(m_Device, 0); m_SoundEnabled = true; From 91cf20ced40f369897936c14c1ec05d2950046fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 18 Jun 2024 22:54:57 +0200 Subject: [PATCH 077/179] Faster map loading with sound disabled, fix map sound warning Fix map sound loading warning being incorrectly shown when sound is disabled. Make map loading faster in this case by not unpacking the sound data and sound sources from the map at all if sound is disabled. Closes #8450. --- src/game/client/components/mapsounds.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/client/components/mapsounds.cpp b/src/game/client/components/mapsounds.cpp index dca22a37ee7..c15280799fd 100644 --- a/src/game/client/components/mapsounds.cpp +++ b/src/game/client/components/mapsounds.cpp @@ -23,6 +23,9 @@ void CMapSounds::OnMapLoad() Clear(); + if(!Sound()->IsSoundEnabled()) + return; + // load samples int Start; pMap->GetType(MAPITEMTYPE_SOUND, &Start, &m_Count); @@ -64,7 +67,6 @@ void CMapSounds::OnMapLoad() } // enqueue sound sources - m_vSourceQueue.clear(); for(int g = 0; g < Layers()->NumGroups(); g++) { CMapItemGroup *pGroup = Layers()->GetGroup(g); @@ -239,6 +241,7 @@ void CMapSounds::OnRender() void CMapSounds::Clear() { // unload all samples + m_vSourceQueue.clear(); for(int i = 0; i < m_Count; i++) { Sound()->UnloadSample(m_aSounds[i]); From 31966d52a63f9cb2f03708897a31d0f42a43afff Mon Sep 17 00:00:00 2001 From: MilkeeyCat Date: Wed, 19 Jun 2024 23:48:45 +0300 Subject: [PATCH 078/179] feat: trim strings in search & exclude inputs --- src/engine/client/serverbrowser.cpp | 38 ++++++++++++-------- src/game/client/components/menus_browser.cpp | 6 ++++ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index d5b177f9d38..718eaa7e013 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -484,22 +484,26 @@ void CServerBrowser::Filter() const char *pStr = g_Config.m_BrFilterString; char aFilterStr[sizeof(g_Config.m_BrFilterString)]; + char aFilterStrTrimmed[sizeof(g_Config.m_BrFilterString)]; while((pStr = str_next_token(pStr, IServerBrowser::SEARCH_EXCLUDE_TOKEN, aFilterStr, sizeof(aFilterStr)))) { - if(aFilterStr[0] == '\0') + str_copy(aFilterStrTrimmed, str_utf8_skip_whitespaces(aFilterStr)); + str_utf8_trim_right(aFilterStrTrimmed); + + if(aFilterStrTrimmed[0] == '\0') { continue; } auto MatchesFn = matchesPart; - const int FilterLen = str_length(aFilterStr); - if(aFilterStr[0] == '"' && aFilterStr[FilterLen - 1] == '"') + const int FilterLen = str_length(aFilterStrTrimmed); + if(aFilterStrTrimmed[0] == '"' && aFilterStrTrimmed[FilterLen - 1] == '"') { - aFilterStr[FilterLen - 1] = '\0'; + aFilterStrTrimmed[FilterLen - 1] = '\0'; MatchesFn = matchesExactly; } // match against server name - if(MatchesFn(Info.m_aName, aFilterStr)) + if(MatchesFn(Info.m_aName, aFilterStrTrimmed)) { Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; } @@ -507,8 +511,8 @@ void CServerBrowser::Filter() // match against players for(int p = 0; p < minimum(Info.m_NumClients, (int)MAX_CLIENTS); p++) { - if(MatchesFn(Info.m_aClients[p].m_aName, aFilterStr) || - MatchesFn(Info.m_aClients[p].m_aClan, aFilterStr)) + if(MatchesFn(Info.m_aClients[p].m_aName, aFilterStrTrimmed) || + MatchesFn(Info.m_aClients[p].m_aClan, aFilterStrTrimmed)) { if(g_Config.m_BrFilterConnectingPlayers && str_comp(Info.m_aClients[p].m_aName, "(connecting)") == 0 && @@ -522,7 +526,7 @@ void CServerBrowser::Filter() } // match against map - if(MatchesFn(Info.m_aMap, aFilterStr)) + if(MatchesFn(Info.m_aMap, aFilterStrTrimmed)) { Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; } @@ -536,36 +540,40 @@ void CServerBrowser::Filter() { const char *pStr = g_Config.m_BrExcludeString; char aExcludeStr[sizeof(g_Config.m_BrExcludeString)]; + char aExcludeStrTrimmed[sizeof(g_Config.m_BrExcludeString)]; while((pStr = str_next_token(pStr, IServerBrowser::SEARCH_EXCLUDE_TOKEN, aExcludeStr, sizeof(aExcludeStr)))) { - if(aExcludeStr[0] == '\0') + str_copy(aExcludeStrTrimmed, str_utf8_skip_whitespaces(aExcludeStr)); + str_utf8_trim_right(aExcludeStrTrimmed); + + if(aExcludeStrTrimmed[0] == '\0') { continue; } auto MatchesFn = matchesPart; - const int FilterLen = str_length(aExcludeStr); - if(aExcludeStr[0] == '"' && aExcludeStr[FilterLen - 1] == '"') + const int FilterLen = str_length(aExcludeStrTrimmed); + if(aExcludeStrTrimmed[0] == '"' && aExcludeStrTrimmed[FilterLen - 1] == '"') { - aExcludeStr[FilterLen - 1] = '\0'; + aExcludeStrTrimmed[FilterLen - 1] = '\0'; MatchesFn = matchesExactly; } // match against server name - if(MatchesFn(Info.m_aName, aExcludeStr)) + if(MatchesFn(Info.m_aName, aExcludeStrTrimmed)) { Filtered = true; break; } // match against map - if(MatchesFn(Info.m_aMap, aExcludeStr)) + if(MatchesFn(Info.m_aMap, aExcludeStrTrimmed)) { Filtered = true; break; } // match against gametype - if(MatchesFn(Info.m_aGameType, aExcludeStr)) + if(MatchesFn(Info.m_aGameType, aExcludeStrTrimmed)) { Filtered = true; break; diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 5670d0fd7b7..566b12b30c2 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -502,6 +502,9 @@ void CMenus::RenderServerbrowserStatusBox(CUIRect StatusBox, bool WasListboxItem QuickSearch.VSplitLeft(5.0f, nullptr, &QuickSearch); static CLineInput s_FilterInput(g_Config.m_BrFilterString, sizeof(g_Config.m_BrFilterString)); + static char s_aTooltipText[64]; + str_format(s_aTooltipText, sizeof(s_aTooltipText), "%s: \"solo; nameless tee; kobra 2\"", Localize("Example of usage")); + GameClient()->m_Tooltips.DoToolTip(&s_FilterInput, &QuickSearch, s_aTooltipText); if(!Ui()->IsPopupOpen() && Input()->KeyPress(KEY_F) && Input()->ModifierIsPressed()) { Ui()->SetActiveItem(&s_FilterInput); @@ -528,6 +531,9 @@ void CMenus::RenderServerbrowserStatusBox(CUIRect StatusBox, bool WasListboxItem QuickExclude.VSplitLeft(5.0f, nullptr, &QuickExclude); static CLineInput s_ExcludeInput(g_Config.m_BrExcludeString, sizeof(g_Config.m_BrExcludeString)); + static char s_aTooltipText[64]; + str_format(s_aTooltipText, sizeof(s_aTooltipText), "%s: \"CHN; [A]\"", Localize("Example of usage")); + GameClient()->m_Tooltips.DoToolTip(&s_ExcludeInput, &QuickSearch, s_aTooltipText); if(!Ui()->IsPopupOpen() && Input()->KeyPress(KEY_X) && Input()->ShiftIsPressed() && Input()->ModifierIsPressed()) { Ui()->SetActiveItem(&s_ExcludeInput); From c4b9924b281b83f2d94a472fd8232c7e7f196f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 23 Jun 2024 13:46:22 +0200 Subject: [PATCH 079/179] Use named `enum EUpdaterState` instead of `int` --- src/engine/client/updater.cpp | 7 +++---- src/engine/client/updater.h | 6 +++--- src/engine/updater.h | 6 +++--- src/game/client/components/menus_settings.cpp | 2 +- src/game/client/components/menus_start.cpp | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/engine/client/updater.cpp b/src/engine/client/updater.cpp index a5a0af2ef07..78295678586 100644 --- a/src/engine/client/updater.cpp +++ b/src/engine/client/updater.cpp @@ -98,13 +98,13 @@ void CUpdater::Init(CHttp *pHttp) m_pHttp = pHttp; } -void CUpdater::SetCurrentState(int NewState) +void CUpdater::SetCurrentState(EUpdaterState NewState) { CLockScope ls(m_Lock); m_State = NewState; } -int CUpdater::GetCurrentState() +IUpdater::EUpdaterState CUpdater::GetCurrentState() { CLockScope ls(m_Lock); return m_State; @@ -164,8 +164,7 @@ bool CUpdater::MoveFile(const char *pFile) void CUpdater::Update() { - auto State = GetCurrentState(); - switch(State) + switch(GetCurrentState()) { case IUpdater::GOT_MANIFEST: PerformUpdate(); diff --git a/src/engine/client/updater.h b/src/engine/client/updater.h index 746c81b0275..4127ca5e3c6 100644 --- a/src/engine/client/updater.h +++ b/src/engine/client/updater.h @@ -52,7 +52,7 @@ class CUpdater : public IUpdater CLock m_Lock; - int m_State GUARDED_BY(m_Lock); + EUpdaterState m_State GUARDED_BY(m_Lock); char m_aStatus[256] GUARDED_BY(m_Lock); int m_Percent GUARDED_BY(m_Lock); char m_aClientExecTmp[64]; @@ -80,12 +80,12 @@ class CUpdater : public IUpdater bool ReplaceClient(); bool ReplaceServer(); - void SetCurrentState(int NewState) REQUIRES(!m_Lock); + void SetCurrentState(EUpdaterState NewState) REQUIRES(!m_Lock); public: CUpdater(); - int GetCurrentState() override REQUIRES(!m_Lock); + EUpdaterState GetCurrentState() override REQUIRES(!m_Lock); void GetCurrentFile(char *pBuf, int BufSize) override REQUIRES(!m_Lock); int GetCurrentPercent() override REQUIRES(!m_Lock); diff --git a/src/engine/updater.h b/src/engine/updater.h index 8a3be8651fa..3de864091c2 100644 --- a/src/engine/updater.h +++ b/src/engine/updater.h @@ -7,9 +7,9 @@ class IUpdater : public IInterface { MACRO_INTERFACE("updater") public: - enum + enum EUpdaterState { - CLEAN = 0, + CLEAN, GETTING_MANIFEST, GOT_MANIFEST, PARSING_UPDATE, @@ -22,7 +22,7 @@ class IUpdater : public IInterface virtual void Update() = 0; virtual void InitiateUpdate() = 0; - virtual int GetCurrentState() = 0; + virtual EUpdaterState GetCurrentState() = 0; virtual void GetCurrentFile(char *pBuf, int BufSize) = 0; virtual int GetCurrentPercent() = 0; }; diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index a14191a47e2..00be5dd4923 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -3402,7 +3402,7 @@ void CMenus::RenderSettingsDDNet(CUIRect MainView) #if defined(CONF_AUTOUPDATE) { bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); - int State = Updater()->GetCurrentState(); + IUpdater::EUpdaterState State = Updater()->GetCurrentState(); // Update Button char aBuf[256]; diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index 4b3421d1d58..f32af9ff807 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -206,7 +206,7 @@ void CMenus::RenderStartMenu(CUIRect MainView) #if defined(CONF_AUTOUPDATE) char aBuf[64]; CUIRect Part; - int State = Updater()->GetCurrentState(); + IUpdater::EUpdaterState State = Updater()->GetCurrentState(); bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); if(State == IUpdater::CLEAN && NeedUpdate) { From 51b37aa2407419ed11e4dfd789eaf4cb397f0323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 23 Jun 2024 16:03:53 +0200 Subject: [PATCH 080/179] Fix HTTP progress values being above 100 if total size is unknown If the total download size is unknown (i.e. zero), return 0% instead of returning a very large value above 100%. --- src/engine/shared/http.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/shared/http.cpp b/src/engine/shared/http.cpp index 6b72e980dcc..c69da07dcda 100644 --- a/src/engine/shared/http.cpp +++ b/src/engine/shared/http.cpp @@ -308,7 +308,7 @@ int CHttpRequest::ProgressCallback(void *pUser, double DlTotal, double DlCurr, d CHttpRequest *pTask = (CHttpRequest *)pUser; pTask->m_Current.store(DlCurr, std::memory_order_relaxed); pTask->m_Size.store(DlTotal, std::memory_order_relaxed); - pTask->m_Progress.store((100 * DlCurr) / (DlTotal ? DlTotal : 1), std::memory_order_relaxed); + pTask->m_Progress.store(DlTotal == 0.0 ? 0 : (100 * DlCurr) / DlTotal, std::memory_order_relaxed); pTask->OnProgress(); return pTask->m_Abort ? -1 : 0; } From 635f91be12eec054836be2d95a76085f25b32019 Mon Sep 17 00:00:00 2001 From: MilkeeyCat Date: Sun, 23 Jun 2024 17:54:18 +0300 Subject: [PATCH 081/179] fix: add context to translations & add removed translations --- data/languages/belarusian.txt | 5 +++-- data/languages/polish.txt | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt index 13b887d5007..1f256f164bd 100644 --- a/data/languages/belarusian.txt +++ b/data/languages/belarusian.txt @@ -518,6 +518,7 @@ LAN Name plates size == Памер таблічак з імёнамі +[Graphics error] Failed to swap framebuffers. Try to update your GPU drivers. == Не атрымалася выканаць падпампоўку кадравых буфераў. Паспрабуйце абнавіць драйверы відэакарты. @@ -1717,11 +1718,11 @@ Out of VRAM. Try removing custom assets (skins, entities, etc.), especially thos [Graphics error] An error during command recording occurred. Try to update your GPU drivers. -== +== Адбылася памылка падчас выканання каманды запісу. Паспрабуйце абнавіць драйверы відэакарты. [Graphics error] A render command failed. Try to update your GPU drivers. -== +== Каманда рэндэрынгу не выканана. Паспрабуйце абнавіць драйверы відэакарты. [Graphics error] Submitting the render commands failed. Try to update your GPU drivers. diff --git a/data/languages/polish.txt b/data/languages/polish.txt index 6fe9a203503..2ba9abb67c9 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -1211,6 +1211,7 @@ Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in s Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. == Brak pamięci VRAM. Spróbuj usunąć niestandardowe zasoby (skiny, entities, itd.), szczególnie te z dużą rozdzielczością. +[Graphics error] Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. == Wystąpił nieznany błąd. Spróbuj zmienić gfx_backend na OpenGL lub Vulkan w settings_ddnet.cfg w folderze konfiguracyjnym i spróbuj ponownie. From cdfe451880665d91f822ecd0cda4b9531fd68337 Mon Sep 17 00:00:00 2001 From: MilkeeyCat Date: Sun, 23 Jun 2024 20:31:20 +0300 Subject: [PATCH 082/179] fix: correct arguments highlighting after removing entry --- src/game/editor/editor_server_settings.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/game/editor/editor_server_settings.cpp b/src/game/editor/editor_server_settings.cpp index 5c2e6bf9c66..b8c374c01df 100644 --- a/src/game/editor/editor_server_settings.cpp +++ b/src/game/editor/editor_server_settings.cpp @@ -84,7 +84,10 @@ void CEditor::RenderServerSettingsEditor(CUIRect View, bool ShowServerSettingsEd s_CommandSelectedIndex = m_Map.m_vSettings.size() - 1; if(s_CommandSelectedIndex >= 0) m_SettingsCommandInput.Set(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand); + else + m_SettingsCommandInput.Clear(); m_Map.OnModify(); + m_MapSettingsCommandContext.Update(); s_ListBox.ScrollToSelected(); } From 93bf7cbc59d42350e14e82127f3aab6ba0d1f7f4 Mon Sep 17 00:00:00 2001 From: furo Date: Mon, 24 Jun 2024 18:21:42 +0200 Subject: [PATCH 083/179] Don't check `sv_max_team_size` for teams in practice --- src/game/server/ddracechat.cpp | 2 +- src/game/server/teams.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index 6941eb35f22..96f11984fbc 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -1050,7 +1050,7 @@ void CGameContext::AttemptJoinTeam(int ClientId, int Team) "This team is locked using /lock. Only members of the team can unlock it using /lock." : "This team is locked using /lock. Only members of the team can invite you or unlock it using /lock."); } - else if(Team > 0 && Team < MAX_CLIENTS && m_pController->Teams().Count(Team) >= g_Config.m_SvMaxTeamSize && !m_pController->Teams().TeamFlock(Team)) + else if(Team > 0 && Team < MAX_CLIENTS && m_pController->Teams().Count(Team) >= g_Config.m_SvMaxTeamSize && !m_pController->Teams().TeamFlock(Team) && !m_pController->Teams().IsPractice(Team)) { char aBuf[512]; str_format(aBuf, sizeof(aBuf), "This team already has the maximum allowed size of %d players", g_Config.m_SvMaxTeamSize); diff --git a/src/game/server/teams.cpp b/src/game/server/teams.cpp index 75a8e4d308e..daeeb7c5429 100644 --- a/src/game/server/teams.cpp +++ b/src/game/server/teams.cpp @@ -1106,6 +1106,15 @@ void CGameTeams::OnCharacterDeath(int ClientId, int Weapon) if(Count(Team) > 1) { + // Disband team if the team has more players than allowed. + if(Count(Team) > g_Config.m_SvMaxTeamSize) + { + GameServer()->SendChatTeam(Team, "This team was disbanded because there are more players than allowed in the team."); + SetTeamLock(Team, false); + KillTeam(Team, Weapon == WEAPON_SELF ? ClientId : -1, ClientId); + return; + } + KillTeam(Team, Weapon == WEAPON_SELF ? ClientId : -1, ClientId); char aBuf[512]; From 2974e5197e09af1dfd547b6ec50bbd5b6e21da94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Mon, 24 Jun 2024 21:22:06 +0200 Subject: [PATCH 084/179] Fix browser not refreshing if `ui_page` is changed in start menu When changing `ui_page` via the console while the start menu is active, the browser tab was not refreshed when clicking the Play-button, leading to the old server list being shown for the new browser tab. --- src/game/client/components/menus.cpp | 2 +- src/game/client/components/menus_start.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 42ffa472596..1dce1d64d4e 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -2354,7 +2354,7 @@ void CMenus::SetMenuPage(int NewPage) if(NewPage >= PAGE_INTERNET && NewPage <= PAGE_FAVORITE_COMMUNITY_5) { g_Config.m_UiPage = NewPage; - if(!m_ShowStart && OldPage != NewPage) + if(OldPage != NewPage) { RefreshBrowserTab(false); } diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index f32af9ff807..f04337ce3ef 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -285,8 +285,8 @@ void CMenus::RenderStartMenu(CUIRect MainView) if(NewPage != -1) { - m_MenuPage = NewPage; m_ShowStart = false; + SetMenuPage(NewPage); } } From 3947ba40b12b79fb93e9f7b6a5fde19a5f68b4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Mon, 24 Jun 2024 21:37:03 +0200 Subject: [PATCH 085/179] Refresh LAN tab after starting/stopping local server After starting/stopping the local server from the main menu, refresh the LAN tab on its next activation, so it immediately shows/hides the started/stopped server without needing a manual refresh. This is not a perfect solution, as the server would not show up when activating the LAN tab immediately after starting the server, because the server needs some time before it will respond to server info requests, but this works well enough unless the hotkeys are used. --- src/game/client/components/menus.cpp | 10 ++++++++-- src/game/client/components/menus.h | 1 + src/game/client/components/menus_start.cpp | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 1dce1d64d4e..0eb85a9057a 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -2354,9 +2354,15 @@ void CMenus::SetMenuPage(int NewPage) if(NewPage >= PAGE_INTERNET && NewPage <= PAGE_FAVORITE_COMMUNITY_5) { g_Config.m_UiPage = NewPage; - if(OldPage != NewPage) + bool ForceRefresh = false; + if(m_ForceRefreshLanPage) { - RefreshBrowserTab(false); + ForceRefresh = NewPage == PAGE_LAN; + m_ForceRefreshLanPage = false; + } + if(OldPage != NewPage || ForceRefresh) + { + RefreshBrowserTab(ForceRefresh); } } } diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index dae2b20de31..67cf1a40827 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -170,6 +170,7 @@ class CMenus : public CComponent bool m_JoinTutorial = false; bool m_CreateDefaultFavoriteCommunities = false; + bool m_ForceRefreshLanPage = false; char m_aNextServer[256]; diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index f04337ce3ef..46875a33d0d 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -155,6 +155,7 @@ void CMenus::RenderStartMenu(CUIRect MainView) if(str_find(aBuf, "/") == 0 || fs_is_file(aBuf)) { m_ServerProcess.m_Process = shell_execute(aBuf, EShellExecuteWindowState::BACKGROUND); + m_ForceRefreshLanPage = true; } else { @@ -297,6 +298,7 @@ void CMenus::KillServer() if(kill_process(m_ServerProcess.m_Process)) { m_ServerProcess.m_Process = INVALID_PROCESS; + m_ForceRefreshLanPage = true; } } } From 5f9d97a2aa827f9e098870851dd50cd076b32426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Fri, 21 Jun 2024 21:31:21 +0200 Subject: [PATCH 086/179] Extract `CUi::RenderProgressBar` function --- src/game/client/components/menus.cpp | 4 +--- src/game/client/components/menus_start.cpp | 8 +++----- src/game/client/ui.cpp | 8 ++++++++ src/game/client/ui.h | 3 +++ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 0eb85a9057a..1983ce4568b 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -1915,9 +1915,7 @@ void CMenus::RenderPopupLoading(CUIRect Screen) Box.HSplitTop(20.0f, nullptr, &Box); Box.HSplitTop(24.0f, &ProgressBar, &Box); ProgressBar.VMargin(20.0f, &ProgressBar); - ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 5.0f); - ProgressBar.w = maximum(10.0f, (ProgressBar.w * Client()->MapDownloadAmount()) / Client()->MapDownloadTotalsize()); - ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), IGraphics::CORNER_ALL, 5.0f); + Ui()->RenderProgressBar(ProgressBar, Client()->MapDownloadAmount() / (float)Client()->MapDownloadTotalsize()); } CUIRect Button; diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index 46875a33d0d..cd5142ffe5a 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -263,13 +263,11 @@ void CMenus::RenderStartMenu(CUIRect MainView) } else if(State >= IUpdater::GETTING_MANIFEST && State < IUpdater::NEED_RESTART) { - CUIRect ProgressBar, Percent; - Part.VSplitLeft(100.0f, &ProgressBar, &Percent); + CUIRect ProgressBar; + Part.VSplitLeft(100.0f, &ProgressBar, nullptr); ProgressBar.y += 2.0f; ProgressBar.HMargin(1.0f, &ProgressBar); - ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 5.0f); - ProgressBar.w = clamp((float)Updater()->GetCurrentPercent(), 10.0f, 100.0f); - ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), IGraphics::CORNER_ALL, 5.0f); + Ui()->RenderProgressBar(ProgressBar, Updater()->GetCurrentPercent() / 100.0f); } #elif defined(CONF_INFORM_UPDATE) if(str_comp(Client()->LatestVersion(), "0") != 0) diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index a08545c4368..e29646fa37c 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -1333,6 +1333,14 @@ bool CUi::DoScrollbarOption(const void *pId, int *pOption, const CUIRect *pRect, return false; } +void CUi::RenderProgressBar(CUIRect ProgressBar, float Progress) +{ + const float Rounding = minimum(5.0f, ProgressBar.h / 2.0f); + ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, Rounding); + ProgressBar.w = maximum(ProgressBar.w * Progress, 2 * Rounding); + ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), IGraphics::CORNER_ALL, Rounding); +} + void CUi::RenderProgressSpinner(vec2 Center, float OuterRadius, const SProgressSpinnerProperties &Props) const { Graphics()->TextureClear(); diff --git a/src/game/client/ui.h b/src/game/client/ui.h index f9a802e83c3..7ee062aea6e 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -599,6 +599,9 @@ class CUi float DoScrollbarH(const void *pId, const CUIRect *pRect, float Current, const ColorRGBA *pColorInner = nullptr); bool DoScrollbarOption(const void *pId, int *pOption, const CUIRect *pRect, const char *pStr, int Min, int Max, const IScrollbarScale *pScale = &ms_LinearScrollbarScale, unsigned Flags = 0u, const char *pSuffix = ""); + // progress bar + void RenderProgressBar(CUIRect ProgressBar, float Progress); + // progress spinner void RenderProgressSpinner(vec2 Center, float OuterRadius, const SProgressSpinnerProperties &Props = {}) const; From d1516a14a5c98e4e5beced9bb7a13ed982af985a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 23 Jun 2024 15:21:54 +0200 Subject: [PATCH 087/179] Refactor client loading screen rendering Use `CUi::RenderProgressBar` function also for client loading, which means the filled progress bar background will also be rendered while loading. Replace static variable `s_LastLoadRender` with member variable. Encapsulate menu loading state in class `CLoadingState`. --- src/game/client/components/menus.cpp | 48 +++++++++++++++------------- src/game/client/components/menus.h | 10 ++++-- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 1983ce4568b..9fe01f0b0e4 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -734,17 +734,16 @@ void CMenus::RenderLoading(const char *pCaption, const char *pContent, int Incre { // TODO: not supported right now due to separate render thread - static std::chrono::nanoseconds s_LastLoadRender{0}; - const int CurLoadRenderCount = m_LoadCurrent; - m_LoadCurrent += IncreaseCounter; - const float Percent = CurLoadRenderCount / (float)m_LoadTotal; + const int CurLoadRenderCount = m_LoadingState.m_Current; + m_LoadingState.m_Current += IncreaseCounter; // make sure that we don't render for each little thing we load // because that will slow down loading if we have vsync - if(time_get_nanoseconds() - s_LastLoadRender < std::chrono::nanoseconds(1s) / 60l) + const std::chrono::nanoseconds Now = time_get_nanoseconds(); + if(Now - m_LoadingState.m_LastRender < std::chrono::nanoseconds(1s) / 60l) return; - s_LastLoadRender = time_get_nanoseconds(); + m_LoadingState.m_LastRender = Now; // need up date this here to get correct ms_GuiColor = color_cast(ColorHSLA(g_Config.m_UiColor, true)); @@ -756,27 +755,30 @@ void CMenus::RenderLoading(const char *pCaption, const char *pContent, int Incre RenderBackground(); } - CUIRect Box = *Ui()->Screen(); - Box.Margin(160.0f, &Box); + CUIRect Box; + Ui()->Screen()->Margin(160.0f, &Box); Graphics()->BlendNormal(); - Graphics()->TextureClear(); - Box.Draw(ColorRGBA{0, 0, 0, 0.50f}, IGraphics::CORNER_ALL, 15.0f); + Box.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); + Box.Margin(20.0f, &Box); - CUIRect Part; - Box.HSplitTop(20.f, nullptr, &Box); - Box.HSplitTop(24.f, &Part, &Box); - Part.VMargin(20.f, &Part); - Ui()->DoLabel(&Part, pCaption, 24.f, TEXTALIGN_MC); + CUIRect Label; + Box.HSplitTop(24.0f, &Label, &Box); + Ui()->DoLabel(&Label, pCaption, 24.0f, TEXTALIGN_MC); - Box.HSplitTop(20.f, nullptr, &Box); - Box.HSplitTop(24.f, &Part, &Box); - Part.VMargin(20.f, &Part); - Ui()->DoLabel(&Part, pContent, 20.0f, TEXTALIGN_MC); + Box.HSplitTop(20.0f, nullptr, &Box); + Box.HSplitTop(24.0f, &Label, &Box); + Ui()->DoLabel(&Label, pContent, 20.0f, TEXTALIGN_MC); if(RenderLoadingBar) - Graphics()->DrawRect(Box.x + 40, Box.y + Box.h - 75, (Box.w - 80) * Percent, 25, ColorRGBA(1.0f, 1.0f, 1.0f, 0.75f), IGraphics::CORNER_ALL, 5.0f); + { + CUIRect ProgressBar; + Box.HSplitBottom(30.0f, &Box, nullptr); + Box.HSplitBottom(25.0f, &Box, &ProgressBar); + ProgressBar.VMargin(20.0f, &ProgressBar); + Ui()->RenderProgressBar(ProgressBar, CurLoadRenderCount / (float)m_LoadingState.m_Total); + } Client()->UpdateAndSwap(); } @@ -867,10 +869,10 @@ void CMenus::OnInit() // setup load amount const int NumMenuImages = 5; - m_LoadCurrent = 0; - m_LoadTotal = g_pData->m_NumImages + NumMenuImages + GameClient()->ComponentCount(); + m_LoadingState.m_Current = 0; + m_LoadingState.m_Total = g_pData->m_NumImages + NumMenuImages + GameClient()->ComponentCount(); if(!g_Config.m_ClThreadsoundloading) - m_LoadTotal += g_pData->m_NumSounds; + m_LoadingState.m_Total += g_pData->m_NumSounds; m_IsInit = true; diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index 67cf1a40827..7bd0e7303a6 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -186,8 +186,14 @@ class CMenus : public CComponent const CMenuImage *FindMenuImage(const char *pName); // loading - int m_LoadCurrent; - int m_LoadTotal; + class CLoadingState + { + public: + std::chrono::nanoseconds m_LastRender{0}; + int m_Current; + int m_Total; + }; + CLoadingState m_LoadingState; // char m_aMessageTopic[512]; From ab729e0346345b39a42fbb872daab83b49bfbcc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 23 Jun 2024 15:25:28 +0200 Subject: [PATCH 088/179] Minor refactoring of client loading Avoid duplicate `Localize` calls while loading. Start component counters at 1 instead of 0 since the value was always incremented by 1 before being used. Extract variable `NumComponents` and also use it for the special loading message, so it should consistently be shown only for the first component (i.e. the last component being initialized) also when more components will be added. --- src/game/client/gameclient.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index ee21b1e2a66..8e0a77a4610 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -265,20 +265,23 @@ void CGameClient::OnInit() Client()->UpdateAndSwap(); const char *pLoadingDDNetCaption = Localize("Loading DDNet Client"); + const char *pLoadingMessageComponents = Localize("Initializing components"); + const char *pLoadingMessageComponentsSpecial = Localize("Why are you slowmo replaying to read this?"); + char aLoadingMessage[256]; // init all components - int SkippedComps = 0; - int CompCounter = 0; - for(int i = m_vpAll.size() - 1; i >= 0; --i) + int SkippedComps = 1; + int CompCounter = 1; + const int NumComponents = ComponentCount(); + for(int i = NumComponents - 1; i >= 0; --i) { m_vpAll[i]->OnInit(); // try to render a frame after each component, also flushes GPU uploads if(m_Menus.IsInit()) { - char aBuff[256]; - str_format(aBuff, std::size(aBuff), "%s [%d/%d]", CompCounter == 40 ? Localize("Why are you slowmo replaying to read this?") : Localize("Initializing components"), (CompCounter + 1), (int)ComponentCount()); - m_Menus.RenderLoading(pLoadingDDNetCaption, aBuff, 1 + SkippedComps); - SkippedComps = 0; + str_format(aLoadingMessage, std::size(aLoadingMessage), "%s [%d/%d]", CompCounter == NumComponents ? pLoadingMessageComponentsSpecial : pLoadingMessageComponents, CompCounter, NumComponents); + m_Menus.RenderLoading(pLoadingDDNetCaption, aLoadingMessage, SkippedComps); + SkippedComps = 1; } else { @@ -293,6 +296,7 @@ void CGameClient::OnInit() m_HudSkinLoaded = false; // setup load amount, load textures + const char *pLoadingMessageAssets = Localize("Initializing assets"); for(int i = 0; i < g_pData->m_NumImages; i++) { if(i == IMAGE_GAME) @@ -309,7 +313,7 @@ void CGameClient::OnInit() g_pData->m_aImages[i].m_Id = IGraphics::CTextureHandle(); else g_pData->m_aImages[i].m_Id = Graphics()->LoadTexture(g_pData->m_aImages[i].m_pFilename, IStorage::TYPE_ALL); - m_Menus.RenderLoading(pLoadingDDNetCaption, Localize("Initializing assets"), 1); + m_Menus.RenderLoading(pLoadingDDNetCaption, pLoadingMessageAssets, 1); } m_GameWorld.m_pCollision = Collision(); From e135145363df5e99a71378cf8154acc0d90ccb65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 23 Jun 2024 15:31:39 +0200 Subject: [PATCH 089/179] Ensure logged time covers whole `CGameClient::OnInit` function Get start time as soon as possible and log time for gameclient initialization at the end of the `CGameClient::OnInit` function so this time measurement should cover the entire function. Use `log_trace` and change spelling for consistency (`initialisation` -> `initialization`). --- src/game/client/gameclient.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 8e0a77a4610..6e6f2aab81e 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -203,6 +204,8 @@ void CGameClient::OnConsoleInit() void CGameClient::OnInit() { + const int64_t OnInitStart = time_get(); + Client()->SetLoadingCallback([this](IClient::ELoadingCallbackDetail Detail) { const char *pTitle; if(Detail == IClient::LOADING_CALLBACK_DETAIL_DEMO || DemoPlayer()->IsPlaying()) @@ -236,8 +239,6 @@ void CGameClient::OnInit() m_UI.Init(Kernel()); m_RenderTools.Init(Graphics(), TextRender()); - int64_t Start = time_get(); - if(GIT_SHORTREV_HASH) { str_format(m_aDDNetVersionStr, sizeof(m_aDDNetVersionStr), "%s %s (%s)", GAME_NAME, GAME_RELEASE_VERSION, GIT_SHORTREV_HASH); @@ -345,11 +346,6 @@ void CGameClient::OnInit() } } - int64_t End = time_get(); - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "initialisation finished after %.2fms", ((End - Start) * 1000) / (float)time_freq()); - Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "gameclient", aBuf); - m_MapImages.SetTextureScale(g_Config.m_ClTextEntitiesSize); // Aggressively try to grab window again since some Windows users report @@ -368,6 +364,8 @@ void CGameClient::OnInit() int Size = m_vpAll[i]->Sizeof(); pChecksum->m_aComponentsChecksum[i] = Size; } + + log_trace("gameclient", "initialization finished after %.2fms", (time_get() - OnInitStart) * 1000.0f / (float)time_freq()); } void CGameClient::OnUpdate() From 877096f97708ebcf83467a5c222862e1c8969794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 23 Jun 2024 16:05:19 +0200 Subject: [PATCH 090/179] Fix alignment of progress bar while updating client The progress bar was positioned relative to the updating message. Now the progress bar is always right-aligned with the other buttons. --- src/game/client/components/menus_start.cpp | 80 ++++++++++------------ 1 file changed, 35 insertions(+), 45 deletions(-) diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index cd5142ffe5a..ec505159b0b 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -199,16 +199,42 @@ void CMenus::RenderStartMenu(CUIRect MainView) // render version CUIRect VersionUpdate, CurVersion; - MainView.HSplitBottom(20.0f, 0, &VersionUpdate); - - VersionUpdate.VSplitRight(50.0f, &CurVersion, 0); + MainView.HSplitBottom(20.0f, nullptr, &VersionUpdate); + VersionUpdate.VSplitRight(50.0f, &CurVersion, nullptr); VersionUpdate.VMargin(VMargin, &VersionUpdate); + Ui()->DoLabel(&CurVersion, GAME_RELEASE_VERSION, 14.0f, TEXTALIGN_MR); + #if defined(CONF_AUTOUPDATE) - char aBuf[64]; - CUIRect Part; - IUpdater::EUpdaterState State = Updater()->GetCurrentState(); - bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); + CUIRect UpdateButton; + VersionUpdate.VSplitRight(100.0f, &VersionUpdate, &UpdateButton); + VersionUpdate.VSplitRight(10.0f, &VersionUpdate, nullptr); + + char aBuf[128]; + const IUpdater::EUpdaterState State = Updater()->GetCurrentState(); + const bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); + + if(State == IUpdater::CLEAN && NeedUpdate) + { + static CButtonContainer s_VersionUpdate; + if(DoButton_Menu(&s_VersionUpdate, Localize("Update now"), 0, &UpdateButton, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) + { + Updater()->InitiateUpdate(); + } + } + else if(State == IUpdater::NEED_RESTART) + { + static CButtonContainer s_VersionUpdate; + if(DoButton_Menu(&s_VersionUpdate, Localize("Restart"), 0, &UpdateButton, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) + { + Client()->Restart(); + } + } + else if(State >= IUpdater::GETTING_MANIFEST && State < IUpdater::NEED_RESTART) + { + Ui()->RenderProgressBar(UpdateButton, Updater()->GetCurrentPercent() / 100.0f); + } + if(State == IUpdater::CLEAN && NeedUpdate) { str_format(aBuf, sizeof(aBuf), Localize("DDNet %s is out!"), Client()->LatestVersion()); @@ -235,53 +261,17 @@ void CMenus::RenderStartMenu(CUIRect MainView) TextRender()->TextColor(1.0f, 0.4f, 0.4f, 1.0f); } Ui()->DoLabel(&VersionUpdate, aBuf, 14.0f, TEXTALIGN_ML); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - - VersionUpdate.VSplitLeft(TextRender()->TextWidth(14.0f, aBuf, -1, -1.0f) + 10.0f, 0, &Part); - - if(State == IUpdater::CLEAN && NeedUpdate) - { - CUIRect Update; - Part.VSplitLeft(100.0f, &Update, NULL); - - static CButtonContainer s_VersionUpdate; - if(DoButton_Menu(&s_VersionUpdate, Localize("Update now"), 0, &Update, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) - { - Updater()->InitiateUpdate(); - } - } - else if(State == IUpdater::NEED_RESTART) - { - CUIRect Restart; - Part.VSplitLeft(50.0f, &Restart, &Part); - - static CButtonContainer s_VersionUpdate; - if(DoButton_Menu(&s_VersionUpdate, Localize("Restart"), 0, &Restart, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) - { - Client()->Restart(); - } - } - else if(State >= IUpdater::GETTING_MANIFEST && State < IUpdater::NEED_RESTART) - { - CUIRect ProgressBar; - Part.VSplitLeft(100.0f, &ProgressBar, nullptr); - ProgressBar.y += 2.0f; - ProgressBar.HMargin(1.0f, &ProgressBar); - Ui()->RenderProgressBar(ProgressBar, Updater()->GetCurrentPercent() / 100.0f); - } + TextRender()->TextColor(TextRender()->DefaultTextColor()); #elif defined(CONF_INFORM_UPDATE) if(str_comp(Client()->LatestVersion(), "0") != 0) { char aBuf[64]; str_format(aBuf, sizeof(aBuf), Localize("DDNet %s is out!"), Client()->LatestVersion()); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); + TextRender()->TextColor(TextRender()->DefaultTextColor()); Ui()->DoLabel(&VersionUpdate, aBuf, 14.0f, TEXTALIGN_MC); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); } #endif - Ui()->DoLabel(&CurVersion, GAME_RELEASE_VERSION, 14.0f, TEXTALIGN_MR); - if(NewPage != -1) { m_ShowStart = false; From 313f44ffbd028b2231538db005dea515fd4e04b2 Mon Sep 17 00:00:00 2001 From: Yacinello-droid <136171795+Yacinello-droid@users.noreply.github.com> Date: Wed, 26 Jun 2024 02:42:29 +0500 Subject: [PATCH 091/179] Update russian.txt --- data/languages/russian.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 7373c5735b7..8932a589792 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1297,7 +1297,7 @@ Quads are used for background decoration == Квады используются для украшения фона Tries to predict other entities to give a feel of low latency -== Пытыается предсказать другие объекты, чтобы придать ощущение низкой задержки +== Пытается предсказать другие объекты, чтобы придать ощущение низкой задержки Extras == Доп. From b138cc9f134a2a14c4c58820c5ad629a696b9df2 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Wed, 26 Jun 2024 20:36:52 +0800 Subject: [PATCH 092/179] Add tests for snapshot crc overflow --- CMakeLists.txt | 1 + src/test/snapshot.cpp | 85 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/test/snapshot.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 71e625e5421..1c93656fb87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2804,6 +2804,7 @@ if(GTEST_FOUND OR DOWNLOAD_GTEST) secure_random.cpp serverbrowser.cpp serverinfo.cpp + snapshot.cpp str.cpp strip_path_and_extension.cpp swap_endian.cpp diff --git a/src/test/snapshot.cpp b/src/test/snapshot.cpp new file mode 100644 index 00000000000..6c818f57ecf --- /dev/null +++ b/src/test/snapshot.cpp @@ -0,0 +1,85 @@ +#include + +#include +#include +#include + +TEST(Snapshot, CrcOneInt) +{ + CSnapshotBuilder Builder; + Builder.Init(); + + CNetObj_Flag Flag; + void *pItem = Builder.NewItem(CNetObj_Flag::ms_MsgId, 0, sizeof(Flag)); + ASSERT_FALSE(pItem == nullptr); + Flag.m_X = 4; + Flag.m_Y = 0; + Flag.m_Team = 0; + mem_copy(pItem, &Flag, sizeof(Flag)); + + char aData[CSnapshot::MAX_SIZE]; + CSnapshot *pSnapshot = (CSnapshot *)aData; + Builder.Finish(pSnapshot); + + ASSERT_EQ(pSnapshot->Crc(), 4); +} + +TEST(Snapshot, CrcTwoInts) +{ + CSnapshotBuilder Builder; + Builder.Init(); + + CNetObj_Flag Flag; + void *pItem = Builder.NewItem(CNetObj_Flag::ms_MsgId, 0, sizeof(Flag)); + ASSERT_FALSE(pItem == nullptr); + Flag.m_X = 1; + Flag.m_Y = 1; + Flag.m_Team = 0; + mem_copy(pItem, &Flag, sizeof(Flag)); + + char aData[CSnapshot::MAX_SIZE]; + CSnapshot *pSnapshot = (CSnapshot *)aData; + Builder.Finish(pSnapshot); + + ASSERT_EQ(pSnapshot->Crc(), 2); +} + +TEST(Snapshot, CrcBiggerInts) +{ + CSnapshotBuilder Builder; + Builder.Init(); + + CNetObj_Flag Flag; + void *pItem = Builder.NewItem(CNetObj_Flag::ms_MsgId, 0, sizeof(Flag)); + ASSERT_FALSE(pItem == nullptr); + Flag.m_X = 99999999; + Flag.m_Y = 1; + Flag.m_Team = 1; + mem_copy(pItem, &Flag, sizeof(Flag)); + + char aData[CSnapshot::MAX_SIZE]; + CSnapshot *pSnapshot = (CSnapshot *)aData; + Builder.Finish(pSnapshot); + + ASSERT_EQ(pSnapshot->Crc(), 100000001); +} + +TEST(Snapshot, CrcOverflow) +{ + CSnapshotBuilder Builder; + Builder.Init(); + + CNetObj_Flag Flag; + void *pItem = Builder.NewItem(CNetObj_Flag::ms_MsgId, 0, sizeof(Flag)); + ASSERT_FALSE(pItem == nullptr); + Flag.m_X = 0xFFFFFFFF; + Flag.m_Y = 1; + Flag.m_Team = 1; + mem_copy(pItem, &Flag, sizeof(Flag)); + + char aData[CSnapshot::MAX_SIZE]; + CSnapshot *pSnapshot = (CSnapshot *)aData; + Builder.Finish(pSnapshot); + + ASSERT_EQ(pSnapshot->Crc(), 1); +} From 04b37f2db73786a14d4c486392700a75f00c25fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 26 Jun 2024 21:53:50 +0200 Subject: [PATCH 093/179] Extract `GenerateTimeoutCode` function to reduce duplicate code --- src/game/client/gameclient.cpp | 37 +++++++++++++++------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 6e6f2aab81e..1614252db8e 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -202,6 +202,20 @@ void CGameClient::OnConsoleInit() Console()->Chain("cl_menu_map", ConchainMenuMap, this); } +static void GenerateTimeoutCode(char *pTimeoutCode) +{ + if(pTimeoutCode[0] == '\0' || str_comp(pTimeoutCode, "hGuEYnfxicsXGwFq") == 0) + { + for(unsigned int i = 0; i < 16; i++) + { + if(rand() % 2) + pTimeoutCode[i] = (char)((rand() % 26) + 97); + else + pTimeoutCode[i] = (char)((rand() % 26) + 65); + } + } +} + void CGameClient::OnInit() { const int64_t OnInitStart = time_get(); @@ -324,27 +338,8 @@ void CGameClient::OnInit() // Set free binds to DDRace binds if it's active m_Binds.SetDDRaceBinds(true); - if(g_Config.m_ClTimeoutCode[0] == '\0' || str_comp(g_Config.m_ClTimeoutCode, "hGuEYnfxicsXGwFq") == 0) - { - for(unsigned int i = 0; i < 16; i++) - { - if(rand() % 2) - g_Config.m_ClTimeoutCode[i] = (char)((rand() % 26) + 97); - else - g_Config.m_ClTimeoutCode[i] = (char)((rand() % 26) + 65); - } - } - - if(g_Config.m_ClDummyTimeoutCode[0] == '\0' || str_comp(g_Config.m_ClDummyTimeoutCode, "hGuEYnfxicsXGwFq") == 0) - { - for(unsigned int i = 0; i < 16; i++) - { - if(rand() % 2) - g_Config.m_ClDummyTimeoutCode[i] = (char)((rand() % 26) + 97); - else - g_Config.m_ClDummyTimeoutCode[i] = (char)((rand() % 26) + 65); - } - } + GenerateTimeoutCode(g_Config.m_ClTimeoutCode); + GenerateTimeoutCode(g_Config.m_ClDummyTimeoutCode); m_MapImages.SetTextureScale(g_Config.m_ClTextEntitiesSize); From 872052b5b2056f26557e091368b1beaa64d88cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 26 Jun 2024 22:01:29 +0200 Subject: [PATCH 094/179] Avoid magic numbers for generating timeout code --- src/game/client/gameclient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 1614252db8e..2e52b3d2943 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -209,9 +209,9 @@ static void GenerateTimeoutCode(char *pTimeoutCode) for(unsigned int i = 0; i < 16; i++) { if(rand() % 2) - pTimeoutCode[i] = (char)((rand() % 26) + 97); + pTimeoutCode[i] = (char)((rand() % ('z' - 'a' + 1)) + 'a'); else - pTimeoutCode[i] = (char)((rand() % 26) + 65); + pTimeoutCode[i] = (char)((rand() % ('Z' - 'A' + 1)) + 'A'); } } } From 905047dd16957ba64be53de0a1ad87db09774d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Thu, 27 Jun 2024 21:19:41 +0200 Subject: [PATCH 095/179] Add `sv_dnsbl_ban_reason`, increase maximum ban reason length Add `sv_dnsbl_ban_reason` config variable with size 128 to specify the ban reason for `sv_dnsbl_ban`. Increase the maximum size for ban reasons on the server from 64 to 128 to support this new config variable. Adjust buffer sizes for formatting ban messages accordingly. Additionally, increase the size of the buffer for unpacking the connection closed message from 128 to 256. Due to this limitation, old clients will see truncated disconnect messages if the entire message is longer than 127, which can now happen with long ban reasons as the ban message additionally contains the duration (e.g. `You have been banned for 10 minutes (Reason)`). Closes #8518. --- src/engine/server/server.cpp | 7 ++++--- src/engine/shared/config_variables.h | 1 + src/engine/shared/netban.cpp | 4 ++-- src/engine/shared/netban.h | 2 +- src/engine/shared/network_conn.cpp | 6 +++--- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 6a9fdde9f52..85278f82eeb 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -2888,9 +2888,10 @@ int CServer::Run() } } - if(m_aClients[ClientId].m_DnsblState == CClient::DNSBL_STATE_BLACKLISTED && - Config()->m_SvDnsblBan) - m_NetServer.NetBan()->BanAddr(m_NetServer.ClientAddr(ClientId), 60 * 10, "VPN detected, try connecting without. Contact admin if mistaken"); + if(m_aClients[ClientId].m_DnsblState == CClient::DNSBL_STATE_BLACKLISTED && Config()->m_SvDnsblBan) + { + m_NetServer.NetBan()->BanAddr(m_NetServer.ClientAddr(ClientId), 60 * 10, Config()->m_SvDnsblBanReason); + } } } diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index c87739589bc..f9df0aad14d 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -395,6 +395,7 @@ MACRO_CONFIG_STR(SvDnsblHost, sv_dnsbl_host, 128, "", CFGFLAG_SERVER, "Hostname MACRO_CONFIG_STR(SvDnsblKey, sv_dnsbl_key, 128, "", CFGFLAG_SERVER | CFGFLAG_NONTEEHISTORIC, "Optional Authentication Key for the specified DNSBL provider") MACRO_CONFIG_INT(SvDnsblVote, sv_dnsbl_vote, 0, 0, 1, CFGFLAG_SERVER, "Block votes by blacklisted addresses") MACRO_CONFIG_INT(SvDnsblBan, sv_dnsbl_ban, 0, 0, 1, CFGFLAG_SERVER, "Automatically ban blacklisted addresses") +MACRO_CONFIG_STR(SvDnsblBanReason, sv_dnsbl_ban_reason, 128, "VPN detected, try connecting without. Contact admin if mistaken", CFGFLAG_SERVER, "Ban reason for 'sv_dnsbl_ban'") MACRO_CONFIG_INT(SvDnsblChat, sv_dnsbl_chat, 0, 0, 1, CFGFLAG_SERVER, "Don't allow chat from blacklisted addresses") MACRO_CONFIG_INT(SvRconVote, sv_rcon_vote, 0, 0, 1, CFGFLAG_SERVER, "Only allow authed clients to call votes") diff --git a/src/engine/shared/netban.cpp b/src/engine/shared/netban.cpp index 71b9f589b03..204ad7ccdbe 100644 --- a/src/engine/shared/netban.cpp +++ b/src/engine/shared/netban.cpp @@ -231,7 +231,7 @@ int CNetBan::Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, c { // adjust the ban pBanPool->Update(pBan, &Info); - char aBuf[128]; + char aBuf[256]; MakeBanInfo(pBan, aBuf, sizeof(aBuf), MSGTYPE_LIST); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); return 1; @@ -241,7 +241,7 @@ int CNetBan::Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, c pBan = pBanPool->Add(pData, &Info, &NetHash); if(pBan) { - char aBuf[128]; + char aBuf[256]; MakeBanInfo(pBan, aBuf, sizeof(aBuf), MSGTYPE_BANADD); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); return 0; diff --git a/src/engine/shared/netban.h b/src/engine/shared/netban.h index 1b1157daa05..876892534a1 100644 --- a/src/engine/shared/netban.h +++ b/src/engine/shared/netban.h @@ -77,7 +77,7 @@ class CNetBan enum { EXPIRES_NEVER = -1, - REASON_LENGTH = 64, + REASON_LENGTH = 128, }; int64_t m_Expires; char m_aReason[REASON_LENGTH]; diff --git a/src/engine/shared/network_conn.cpp b/src/engine/shared/network_conn.cpp index 2689f8808c1..32b16a06957 100644 --- a/src/engine/shared/network_conn.cpp +++ b/src/engine/shared/network_conn.cpp @@ -321,10 +321,10 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr, SECURITY_ m_State = NET_CONNSTATE_ERROR; m_RemoteClosed = 1; - char aStr[128] = {0}; + char aStr[256] = {0}; if(pPacket->m_DataSize > 1) { - // make sure to sanitize the error string form the other party + // make sure to sanitize the error string from the other party str_copy(aStr, (char *)&pPacket->m_aChunkData[1], minimum(pPacket->m_DataSize, (int)sizeof(aStr))); str_sanitize_cc(aStr); } @@ -455,7 +455,7 @@ int CNetConnection::Update() if(Now - pResend->m_FirstSendTime > time_freq() * g_Config.m_ConnTimeout) { m_State = NET_CONNSTATE_ERROR; - char aBuf[512]; + char aBuf[128]; str_format(aBuf, sizeof(aBuf), "Too weak connection (not acked for %d seconds)", g_Config.m_ConnTimeout); SetError(aBuf); m_TimeoutSituation = true; From a17f7b5c2f22c84b4b73178f3fee5fe492ef8c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 4 Jun 2024 00:00:04 +0200 Subject: [PATCH 096/179] Rewrite and fix line reader, read entire file into memory Read the entire file into memory immediately when the line reader is initialized instead of using a fixed size buffer of size 32769, which leads to broken line reading for larger files (closes #8431). Replace the `CLineReader::Init` function with the `CLineReader::OpenFile` function, which additionally checks whether the file contains any null bytes (indicates that the file is likely not a text file). As the file will be read into memory entirely in the `OpenFile` function, is can also be closed immediately, since using the `io_read_all_str` function should ensure that nothing more can be read from the file. This also simplifies the usage of the `CLineReader` class, as manually closing the file is inconvenient and error-prone. In fact, the file handle for the `ddnet-serverlist-urls.cfg` file was previously not closed properly. Benchmarking on Windows did not show any noticeable performance impact of this change both for smaller files (config and language files) and larger files (synthetic ~10 MiB files). Let the `CLineReader::Get` function return `const char *` instead of `char *`, since users of this class should not modify the internal buffer. Also, since the entire file is read into memory now, the returned strings are now valid until the respective line reader object is destructed, instead of only until the `Get` function is called again. This simplifies the usage in some cases where all lines are handled, since additional temporary buffers are now unnecessary. Remove the `IOFLAG_SKIP_BOM` flag from the `io_open` function, as this flag was only used together with the line reader. This was inconvenient to use, as any use of the `io_open` function specifically for line readers had to be used with `IOFLAG_SKIP_BOM`. Now, the line reader transparently skips the UTF-8 BOM internally. Skipping the UTF-8 BOM never worked with the `IStorage::ReadFileStr` function, because `io_length` is used in the `io_read_all` function, which rewinds the file position to before the UTF-8 BOM that was skipped by using `IOFLAG_SKIP_BOM`. In any case, as the `ReadFileStr` function is currently unused, this has/had no further effect. The respective test cases for `IOFLAG_SKIP_BOM` are removed. Add more test cases for the `CLineReader` class. All test cases are checked both with and without the UTF-8 BOM. Additional tests with mixed new lines, empty lines with different new lines, and internal null bytes are added. Consistently use the construct `while(const char *pLine = LineReader.Get())` to iterate over all lines of a line reader. In this case, the assignment inside the `while`-loop seems acceptable over the alternatives, e.g. `while(true)` with `break` or adding a function `CLineReader::ForAll(std::function Consumer)`. --- src/android/android_main.cpp | 10 +- src/base/system.cpp | 19 +-- src/base/system.h | 3 +- .../client/backend/opengl/opengl_sl.cpp | 10 +- src/engine/client/serverbrowser_http.cpp | 11 +- src/engine/server/server.cpp | 18 +-- src/engine/shared/console.cpp | 14 +- src/engine/shared/linereader.cpp | 137 +++++++++--------- src/engine/shared/linereader.h | 17 ++- src/engine/shared/storage.cpp | 18 +-- src/game/client/components/countryflags.cpp | 13 +- src/game/editor/auto_map.cpp | 11 +- src/game/localization.cpp | 24 +-- src/game/server/gamecontext.cpp | 44 ++---- src/game/server/score.cpp | 10 +- src/test/io.cpp | 43 ++---- src/test/linereader.cpp | 80 +++++++--- src/tools/config_store.cpp | 27 ++-- 18 files changed, 227 insertions(+), 282 deletions(-) diff --git a/src/android/android_main.cpp b/src/android/android_main.cpp index 633c30443e2..558c130d061 100644 --- a/src/android/android_main.cpp +++ b/src/android/android_main.cpp @@ -120,17 +120,14 @@ class CIntegrityFileLine static std::vector ReadIntegrityFile(const char *pFilename) { - IOHANDLE IntegrityFile = io_open(pFilename, IOFLAG_READ); - if(!IntegrityFile) + CLineReader LineReader; + if(!LineReader.OpenFile(io_open(pFilename, IOFLAG_READ))) { return {}; } - CLineReader LineReader; - LineReader.Init(IntegrityFile); - const char *pReadLine; std::vector vLines; - while((pReadLine = LineReader.Get())) + while(const char *pReadLine = LineReader.Get()) { const char *pSpaceInLine = str_rchr(pReadLine, ' '); CIntegrityFileLine Line; @@ -159,7 +156,6 @@ static std::vector ReadIntegrityFile(const char *pFilename) vLines.emplace_back(std::move(Line)); } - io_close(IntegrityFile); return vLines; } diff --git a/src/base/system.cpp b/src/base/system.cpp index a7e6a2b884d..56df4589cca 100644 --- a/src/base/system.cpp +++ b/src/base/system.cpp @@ -251,9 +251,9 @@ bool mem_has_null(const void *block, size_t size) return false; } -IOHANDLE io_open_impl(const char *filename, int flags) +IOHANDLE io_open(const char *filename, int flags) { - dbg_assert(flags == (IOFLAG_READ | IOFLAG_SKIP_BOM) || flags == IOFLAG_READ || flags == IOFLAG_WRITE || flags == IOFLAG_APPEND, "flags must be read, read+skipbom, write or append"); + dbg_assert(flags == IOFLAG_READ || flags == IOFLAG_WRITE || flags == IOFLAG_APPEND, "flags must be read, write or append"); #if defined(CONF_FAMILY_WINDOWS) const std::wstring wide_filename = windows_utf8_to_wide(filename); DWORD desired_access; @@ -313,21 +313,6 @@ IOHANDLE io_open_impl(const char *filename, int flags) #endif } -IOHANDLE io_open(const char *filename, int flags) -{ - IOHANDLE result = io_open_impl(filename, flags); - unsigned char buf[3]; - if((flags & IOFLAG_SKIP_BOM) == 0 || !result) - { - return result; - } - if(io_read(result, buf, sizeof(buf)) != 3 || buf[0] != 0xef || buf[1] != 0xbb || buf[2] != 0xbf) - { - io_seek(result, 0, IOSEEK_START); - } - return result; -} - unsigned io_read(IOHANDLE io, void *buffer, unsigned size) { return fread(buffer, 1, size, (FILE *)io); diff --git a/src/base/system.h b/src/base/system.h index bcb3b46e27f..704e89356f5 100644 --- a/src/base/system.h +++ b/src/base/system.h @@ -222,7 +222,6 @@ enum IOFLAG_READ = 1, IOFLAG_WRITE = 2, IOFLAG_APPEND = 4, - IOFLAG_SKIP_BOM = 8, IOSEEK_START = 0, IOSEEK_CUR = 1, @@ -237,7 +236,7 @@ enum * @param File to open. * @param flags A set of IOFLAG flags. * - * @sa IOFLAG_READ, IOFLAG_WRITE, IOFLAG_APPEND, IOFLAG_SKIP_BOM. + * @sa IOFLAG_READ, IOFLAG_WRITE, IOFLAG_APPEND. * * @return A handle to the file on success and 0 on failure. * diff --git a/src/engine/client/backend/opengl/opengl_sl.cpp b/src/engine/client/backend/opengl/opengl_sl.cpp index c955040d129..a8b16c6af50 100644 --- a/src/engine/client/backend/opengl/opengl_sl.cpp +++ b/src/engine/client/backend/opengl/opengl_sl.cpp @@ -23,10 +23,10 @@ bool CGLSL::LoadShader(CGLSLCompiler *pCompiler, IStorage *pStorage, const char { if(m_IsLoaded) return true; - IOHANDLE f = pStorage->OpenFile(pFile, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); + CLineReader LineReader; std::vector vLines; - if(f) + if(LineReader.OpenFile(pStorage->OpenFile(pFile, IOFLAG_READ, IStorage::TYPE_ALL))) { EBackendType BackendType = pCompiler->m_IsOpenGLES ? BACKEND_TYPE_OPENGL_ES : BACKEND_TYPE_OPENGL; bool IsNewOpenGL = (BackendType == BACKEND_TYPE_OPENGL ? (pCompiler->m_OpenGLVersionMajor >= 4 || (pCompiler->m_OpenGLVersionMajor == 3 && pCompiler->m_OpenGLVersionMinor == 3)) : pCompiler->m_OpenGLVersionMajor >= 3); @@ -81,17 +81,13 @@ bool CGLSL::LoadShader(CGLSLCompiler *pCompiler, IStorage *pStorage, const char vLines.emplace_back("#extension GL_EXT_texture_array : enable\r\n"); } - CLineReader LineReader; - LineReader.Init(f); - char *pReadLine = NULL; - while((pReadLine = LineReader.Get())) + while(const char *pReadLine = LineReader.Get()) { std::string Line; pCompiler->ParseLine(Line, pReadLine, Type == GL_FRAGMENT_SHADER ? GLSL_SHADER_COMPILER_TYPE_FRAGMENT : GLSL_SHADER_COMPILER_TYPE_VERTEX); Line.append("\r\n"); vLines.push_back(Line); } - io_close(f); const char **ShaderCode = new const char *[vLines.size()]; diff --git a/src/engine/client/serverbrowser_http.cpp b/src/engine/client/serverbrowser_http.cpp index dae761de85d..293720587e1 100644 --- a/src/engine/client/serverbrowser_http.cpp +++ b/src/engine/client/serverbrowser_http.cpp @@ -540,15 +540,12 @@ IServerBrowserHttp *CreateServerBrowserHttp(IEngine *pEngine, IStorage *pStorage const char *apUrls[CChooseMaster::MAX_URLS] = {0}; const char **ppUrls = apUrls; int NumUrls = 0; - IOHANDLE File = pStorage->OpenFile("ddnet-serverlist-urls.cfg", IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(File) + CLineReader LineReader; + if(LineReader.OpenFile(pStorage->OpenFile("ddnet-serverlist-urls.cfg", IOFLAG_READ, IStorage::TYPE_ALL))) { - CLineReader Lines; - Lines.Init(File); - while(NumUrls < CChooseMaster::MAX_URLS) + while(const char *pLine = LineReader.Get()) { - const char *pLine = Lines.Get(); - if(!pLine) + if(NumUrls == CChooseMaster::MAX_URLS) { break; } diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 85278f82eeb..b33d6dc0e17 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -3860,18 +3860,18 @@ const char *CServer::GetAnnouncementLine(const char *pFileName) str_copy(m_aAnnouncementFile, pFileName); m_vAnnouncements.clear(); - IOHANDLE File = m_pStorage->OpenFile(pFileName, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(!File) + CLineReader LineReader; + if(!LineReader.OpenFile(m_pStorage->OpenFile(pFileName, IOFLAG_READ, IStorage::TYPE_ALL))) + { return 0; - - char *pLine; - CLineReader Reader; - Reader.Init(File); - while((pLine = Reader.Get())) + } + while(const char *pLine = LineReader.Get()) + { if(str_length(pLine) && pLine[0] != '#') + { m_vAnnouncements.emplace_back(pLine); - - io_close(File); + } + } } if(m_vAnnouncements.empty()) diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index 7d2e565a7d9..29610d79631 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -622,23 +622,19 @@ bool CConsole::ExecuteFile(const char *pFilename, int ClientId, bool LogFailure, m_pFirstExec = &ThisFile; // exec the file - IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ | IOFLAG_SKIP_BOM, StorageType); - + CLineReader LineReader; bool Success = false; char aBuf[32 + IO_MAX_PATH_LENGTH]; - if(File) + if(LineReader.OpenFile(m_pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType))) { str_format(aBuf, sizeof(aBuf), "executing '%s'", pFilename); Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); - CLineReader Reader; - Reader.Init(File); - - char *pLine; - while((pLine = Reader.Get())) + while(const char *pLine = LineReader.Get()) + { ExecuteLine(pLine, ClientId); + } - io_close(File); Success = true; } else if(LogFailure) diff --git a/src/engine/shared/linereader.cpp b/src/engine/shared/linereader.cpp index 9bc62d8bade..ae56cc39f93 100644 --- a/src/engine/shared/linereader.cpp +++ b/src/engine/shared/linereader.cpp @@ -4,97 +4,92 @@ #include -void CLineReader::Init(IOHANDLE File) +CLineReader::CLineReader() { - m_BufferMaxSize = sizeof(m_aBuffer) - 1; - m_BufferSize = 0; - m_BufferPos = 0; - m_File = File; + m_pBuffer = nullptr; } -char *CLineReader::Get() +CLineReader::~CLineReader() { - unsigned LineStart = m_BufferPos; - bool CRLFBreak = false; + free(m_pBuffer); +} - while(true) +bool CLineReader::OpenFile(IOHANDLE File) +{ + if(!File) { - if(m_BufferPos >= m_BufferSize) - { - // fetch more + return false; + } + char *pBuffer = io_read_all_str(File); + io_close(File); + if(pBuffer == nullptr) + { + return false; + } + OpenBuffer(pBuffer); + return true; +} + +void CLineReader::OpenBuffer(char *pBuffer) +{ + dbg_assert(pBuffer != nullptr, "Line reader initialized without valid buffer"); - // move the remaining part to the front - unsigned Left = m_BufferSize - LineStart; + m_pBuffer = pBuffer; + m_BufferPos = 0; + m_ReadLastLine = false; - if(LineStart > m_BufferSize) - Left = 0; - if(Left) - mem_move(m_aBuffer, &m_aBuffer[LineStart], Left); - m_BufferPos = Left; + // Skip UTF-8 BOM + if(m_pBuffer[0] == '\xEF' && m_pBuffer[1] == '\xBB' && m_pBuffer[2] == '\xBF') + { + m_BufferPos += 3; + } +} - // fill the buffer - unsigned Read = io_read(m_File, &m_aBuffer[m_BufferPos], m_BufferMaxSize - m_BufferPos); - m_BufferSize = Left + Read; - LineStart = 0; +const char *CLineReader::Get() +{ + dbg_assert(m_pBuffer != nullptr, "Line reader not initialized"); + if(m_ReadLastLine) + { + return nullptr; + } - if(!Read) + unsigned LineStart = m_BufferPos; + while(true) + { + if(m_pBuffer[m_BufferPos] == '\0' || m_pBuffer[m_BufferPos] == '\n' || (m_pBuffer[m_BufferPos] == '\r' && m_pBuffer[m_BufferPos + 1] == '\n')) + { + if(m_pBuffer[m_BufferPos] == '\0') { - if(Left) - { - m_aBuffer[Left] = '\0'; // return the last line - m_BufferPos = Left; - m_BufferSize = Left; - if(!str_utf8_check(m_aBuffer)) - { - LineStart = m_BufferPos; - CRLFBreak = false; - continue; // skip lines containing invalid UTF-8 - } - return m_aBuffer; - } - return nullptr; // we are done! + m_ReadLastLine = true; } - } - else - { - if(m_aBuffer[m_BufferPos] == '\n' || m_aBuffer[m_BufferPos] == '\r') + else { - // line found - if(m_aBuffer[m_BufferPos] == '\r') - { - if(m_BufferPos + 1 >= m_BufferSize) - { - // read more to get the connected '\n' - CRLFBreak = true; - ++m_BufferPos; - continue; - } - else if(m_aBuffer[m_BufferPos + 1] == '\n') - m_aBuffer[m_BufferPos++] = '\0'; - } - m_aBuffer[m_BufferPos++] = '\0'; - if(!str_utf8_check(&m_aBuffer[LineStart])) + if(m_pBuffer[m_BufferPos] == '\r') { - LineStart = m_BufferPos; - CRLFBreak = false; - continue; // skip lines containing invalid UTF-8 + m_pBuffer[m_BufferPos] = '\0'; + ++m_BufferPos; } - return &m_aBuffer[LineStart]; + m_pBuffer[m_BufferPos] = '\0'; + ++m_BufferPos; } - else if(CRLFBreak) + + if(!str_utf8_check(&m_pBuffer[LineStart])) { - if(m_aBuffer[m_BufferPos] == '\n') - m_aBuffer[m_BufferPos++] = '\0'; - if(!str_utf8_check(&m_aBuffer[LineStart])) + // Skip lines containing invalid UTF-8 + if(m_ReadLastLine) { - LineStart = m_BufferPos; - CRLFBreak = false; - continue; // skip lines containing invalid UTF-8 + return nullptr; } - return &m_aBuffer[LineStart]; + LineStart = m_BufferPos; + continue; } - else - m_BufferPos++; + // Skip trailing empty line + if(m_ReadLastLine && m_pBuffer[LineStart] == '\0') + { + return nullptr; + } + return &m_pBuffer[LineStart]; } + ++m_BufferPos; } } diff --git a/src/engine/shared/linereader.h b/src/engine/shared/linereader.h index 7d5f1c5ab45..4575b765921 100644 --- a/src/engine/shared/linereader.h +++ b/src/engine/shared/linereader.h @@ -4,17 +4,20 @@ #define ENGINE_SHARED_LINEREADER_H #include -// buffered stream for reading lines, should perhaps be something smaller +// buffered stream for reading lines class CLineReader { - char m_aBuffer[4 * 8192 + 1]; // 1 additional byte for null termination + char *m_pBuffer; unsigned m_BufferPos; - unsigned m_BufferSize; - unsigned m_BufferMaxSize; - IOHANDLE m_File; + bool m_ReadLastLine; public: - void Init(IOHANDLE File); - char *Get(); // Returned string is only valid until next Get() call + CLineReader(); + ~CLineReader(); + + bool OpenFile(IOHANDLE File); + void OpenBuffer(char *pBuffer); // Buffer must have been allocated with malloc, will be freed by the line reader + + const char *Get(); // Returned string is valid until the line reader is destroyed }; #endif diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index 44401fbf2a6..14bf3e1974b 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -127,7 +127,7 @@ class CStorage : public IStorage void LoadPaths(const char *pArgv0) { // check current directory - IOHANDLE File = io_open("storage.cfg", IOFLAG_READ | IOFLAG_SKIP_BOM); + IOHANDLE File = io_open("storage.cfg", IOFLAG_READ); if(!File) { // check usable path in argv[0] @@ -140,7 +140,7 @@ class CStorage : public IStorage char aBuffer[IO_MAX_PATH_LENGTH]; str_copy(aBuffer, pArgv0, Pos + 1); str_append(aBuffer, "/storage.cfg"); - File = io_open(aBuffer, IOFLAG_READ | IOFLAG_SKIP_BOM); + File = io_open(aBuffer, IOFLAG_READ); } if(Pos >= IO_MAX_PATH_LENGTH || !File) @@ -151,10 +151,12 @@ class CStorage : public IStorage } CLineReader LineReader; - LineReader.Init(File); - - char *pLine; - while((pLine = LineReader.Get())) + if(!LineReader.OpenFile(File)) + { + dbg_msg("storage", "couldn't open storage.cfg"); + return; + } + while(const char *pLine = LineReader.Get()) { const char *pLineWithoutPrefix = str_startswith(pLine, "add_path "); if(pLineWithoutPrefix) @@ -163,8 +165,6 @@ class CStorage : public IStorage } } - io_close(File); - if(!m_NumPaths) dbg_msg("storage", "no paths found in storage.cfg"); } @@ -565,7 +565,7 @@ class CStorage : public IStorage char *ReadFileStr(const char *pFilename, int Type) override { - IOHANDLE File = OpenFile(pFilename, IOFLAG_READ | IOFLAG_SKIP_BOM, Type); + IOHANDLE File = OpenFile(pFilename, IOFLAG_READ, Type); if(!File) return nullptr; char *pResult = io_read_all_str(File); diff --git a/src/game/client/components/countryflags.cpp b/src/game/client/components/countryflags.cpp index 8de2024eab0..b05778596e2 100644 --- a/src/game/client/components/countryflags.cpp +++ b/src/game/client/components/countryflags.cpp @@ -16,8 +16,8 @@ void CCountryFlags::LoadCountryflagsIndexfile() { const char *pFilename = "countryflags/index.txt"; - IOHANDLE File = Storage()->OpenFile(pFilename, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(!File) + CLineReader LineReader; + if(!LineReader.OpenFile(Storage()->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL))) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "couldn't open index file '%s'", pFilename); @@ -26,16 +26,13 @@ void CCountryFlags::LoadCountryflagsIndexfile() } char aOrigin[128]; - CLineReader LineReader; - LineReader.Init(File); - char *pLine; - while((pLine = LineReader.Get())) + while(const char *pLine = LineReader.Get()) { if(!str_length(pLine) || pLine[0] == '#') // skip empty lines and comments continue; str_copy(aOrigin, pLine); - char *pReplacement = LineReader.Get(); + const char *pReplacement = LineReader.Get(); if(!pReplacement) { Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", "unexpected end of index file"); @@ -84,7 +81,7 @@ void CCountryFlags::LoadCountryflagsIndexfile() } m_vCountryFlags.push_back(CountryFlag); } - io_close(File); + std::sort(m_vCountryFlags.begin(), m_vCountryFlags.end()); // find index of default item diff --git a/src/game/editor/auto_map.cpp b/src/game/editor/auto_map.cpp index ca38934c6eb..8567f7cd658 100644 --- a/src/game/editor/auto_map.cpp +++ b/src/game/editor/auto_map.cpp @@ -49,8 +49,8 @@ void CAutoMapper::Load(const char *pTileName) { char aPath[IO_MAX_PATH_LENGTH]; str_format(aPath, sizeof(aPath), "editor/automap/%s.rules", pTileName); - IOHANDLE RulesFile = Storage()->OpenFile(aPath, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(!RulesFile) + CLineReader LineReader; + if(!LineReader.OpenFile(Storage()->OpenFile(aPath, IOFLAG_READ, IStorage::TYPE_ALL))) { char aBuf[IO_MAX_PATH_LENGTH + 32]; str_format(aBuf, sizeof(aBuf), "failed to load %s", aPath); @@ -58,15 +58,12 @@ void CAutoMapper::Load(const char *pTileName) return; } - CLineReader LineReader; - LineReader.Init(RulesFile); - CConfiguration *pCurrentConf = nullptr; CRun *pCurrentRun = nullptr; CIndexRule *pCurrentIndex = nullptr; // read each line - while(char *pLine = LineReader.Get()) + while(const char *pLine = LineReader.Get()) { // skip blank/empty lines as well as comments if(str_length(pLine) > 0 && pLine[0] != '#' && pLine[0] != '\n' && pLine[0] != '\r' && pLine[0] != '\t' && pLine[0] != '\v' && pLine[0] != ' ') @@ -365,8 +362,6 @@ void CAutoMapper::Load(const char *pTileName) } } - io_close(RulesFile); - char aBuf[IO_MAX_PATH_LENGTH + 16]; str_format(aBuf, sizeof(aBuf), "loaded %s", aPath); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor/automap", aBuf); diff --git a/src/game/localization.cpp b/src/game/localization.cpp index 7d65b442682..5f29840f2d1 100644 --- a/src/game/localization.cpp +++ b/src/game/localization.cpp @@ -23,18 +23,14 @@ void CLocalizationDatabase::LoadIndexfile(IStorage *pStorage, IConsole *pConsole m_vLanguages.emplace_back("English", "", 826, vEnglishLanguageCodes); const char *pFilename = "languages/index.txt"; - IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(!File) + CLineReader LineReader; + if(!LineReader.OpenFile(pStorage->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL))) { log_error("localization", "Couldn't open index file '%s'", pFilename); return; } - CLineReader LineReader; - LineReader.Init(File); - - const char *pLine; - while((pLine = LineReader.Get())) + while(const char *pLine = LineReader.Get()) { if(!str_length(pLine) || pLine[0] == '#') // skip empty lines and comments continue; @@ -105,8 +101,6 @@ void CLocalizationDatabase::LoadIndexfile(IStorage *pStorage, IConsole *pConsole m_vLanguages.emplace_back(aNativeName, aFileName, str_toint(aCountryCode), vLanguageCodes); } - io_close(File); - std::sort(m_vLanguages.begin(), m_vLanguages.end()); } @@ -179,8 +173,8 @@ bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, ICon return true; } - IOHANDLE IoHandle = pStorage->OpenFile(pFilename, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(!IoHandle) + CLineReader LineReader; + if(!LineReader.OpenFile(pStorage->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL))) return false; log_info("localization", "loaded '%s'", pFilename); @@ -189,11 +183,8 @@ bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, ICon char aContext[512]; char aOrigin[512]; - CLineReader LineReader; - LineReader.Init(IoHandle); - char *pLine; int Line = 0; - while((pLine = LineReader.Get())) + while(const char *pLine = LineReader.Get()) { Line++; if(!str_length(pLine)) @@ -225,7 +216,7 @@ bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, ICon } str_copy(aOrigin, pLine); - char *pReplacement = LineReader.Get(); + const char *pReplacement = LineReader.Get(); if(!pReplacement) { log_error("localization", "unexpected end of file after original '%s' on line %d", aOrigin, Line); @@ -242,7 +233,6 @@ bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, ICon pReplacement += 3; AddString(aOrigin, pReplacement, aContext); } - io_close(IoHandle); std::sort(m_vStrings.begin(), m_vStrings.end()); return true; } diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 0d1fae675c2..5a48cf25290 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -3846,21 +3846,17 @@ void CGameContext::OnInit(const void *pPersistentData) m_pController = new CGameControllerDDRace(this); const char *pCensorFilename = "censorlist.txt"; - IOHANDLE File = Storage()->OpenFile(pCensorFilename, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(!File) - { - dbg_msg("censorlist", "failed to open '%s'", pCensorFilename); - } - else + CLineReader LineReader; + if(LineReader.OpenFile(Storage()->OpenFile(pCensorFilename, IOFLAG_READ, IStorage::TYPE_ALL))) { - CLineReader LineReader; - LineReader.Init(File); - char *pLine; - while((pLine = LineReader.Get())) + while(const char *pLine = LineReader.Get()) { m_vCensorlist.emplace_back(pLine); } - io_close(File); + } + else + { + dbg_msg("censorlist", "failed to open '%s'", pCensorFilename); } m_TeeHistorianActive = g_Config.m_SvTeeHistorian; @@ -4064,36 +4060,28 @@ void CGameContext::OnMapChange(char *pNewMapName, int MapNameSize) char aConfig[IO_MAX_PATH_LENGTH]; str_format(aConfig, sizeof(aConfig), "maps/%s.cfg", g_Config.m_SvMap); - IOHANDLE File = Storage()->OpenFile(aConfig, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(!File) + CLineReader LineReader; + if(!LineReader.OpenFile(Storage()->OpenFile(aConfig, IOFLAG_READ, IStorage::TYPE_ALL))) { // No map-specific config, just return. return; } - CLineReader LineReader; - LineReader.Init(File); - std::vector vLines; - char *pLine; + std::vector vpLines; int TotalLength = 0; - while((pLine = LineReader.Get())) + while(const char *pLine = LineReader.Get()) { - int Length = str_length(pLine) + 1; - char *pCopy = (char *)malloc(Length); - str_copy(pCopy, pLine, Length); - vLines.push_back(pCopy); - TotalLength += Length; + vpLines.push_back(pLine); + TotalLength += str_length(pLine) + 1; } - io_close(File); char *pSettings = (char *)malloc(maximum(1, TotalLength)); int Offset = 0; - for(auto &Line : vLines) + for(const char *pLine : vpLines) { - int Length = str_length(Line) + 1; - mem_copy(pSettings + Offset, Line, Length); + int Length = str_length(pLine) + 1; + mem_copy(pSettings + Offset, pLine, Length); Offset += Length; - free(Line); } CDataFileReader Reader; diff --git a/src/game/server/score.cpp b/src/game/server/score.cpp index ed149e8a4f0..60d0efc8c8b 100644 --- a/src/game/server/score.cpp +++ b/src/game/server/score.cpp @@ -79,20 +79,16 @@ CScore::CScore(CGameContext *pGameServer, CDbConnectionPool *pPool) : secure_random_fill(aSeed, sizeof(aSeed)); m_Prng.Seed(aSeed); - IOHANDLE File = GameServer()->Storage()->OpenFile("wordlist.txt", IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ALL); - if(File) + CLineReader LineReader; + if(LineReader.OpenFile(GameServer()->Storage()->OpenFile("wordlist.txt", IOFLAG_READ, IStorage::TYPE_ALL))) { - CLineReader LineReader; - LineReader.Init(File); - char *pLine; - while((pLine = LineReader.Get())) + while(const char *pLine = LineReader.Get()) { char aWord[32] = {0}; sscanf(pLine, "%*s %31s", aWord); aWord[31] = 0; m_vWordlist.emplace_back(aWord); } - io_close(File); } else { diff --git a/src/test/io.cpp b/src/test/io.cpp index e2e488bea42..dde7c22ec66 100644 --- a/src/test/io.cpp +++ b/src/test/io.cpp @@ -3,18 +3,19 @@ #include -void TestFileRead(const char *pWritten, bool SkipBom, const char *pRead) +void TestFileRead(const char *pWritten) { CTestInfo Info; char aBuf[512] = {0}; IOHANDLE File = io_open(Info.m_aFilename, IOFLAG_WRITE); + const int WrittenLength = str_length(pWritten); ASSERT_TRUE(File); - EXPECT_EQ(io_write(File, pWritten, str_length(pWritten)), str_length(pWritten)); + EXPECT_EQ(io_write(File, pWritten, WrittenLength), WrittenLength); EXPECT_FALSE(io_close(File)); - File = io_open(Info.m_aFilename, IOFLAG_READ | (SkipBom ? IOFLAG_SKIP_BOM : 0)); + File = io_open(Info.m_aFilename, IOFLAG_READ); ASSERT_TRUE(File); - EXPECT_EQ(io_read(File, aBuf, sizeof(aBuf)), str_length(pRead)); - EXPECT_TRUE(mem_comp(aBuf, pRead, str_length(pRead)) == 0); + EXPECT_EQ(io_read(File, aBuf, sizeof(aBuf)), WrittenLength); + EXPECT_TRUE(mem_comp(aBuf, pWritten, WrittenLength) == 0); EXPECT_FALSE(io_close(File)); fs_remove(Info.m_aFilename); @@ -22,45 +23,21 @@ void TestFileRead(const char *pWritten, bool SkipBom, const char *pRead) TEST(Io, Read1) { - TestFileRead("", false, ""); + TestFileRead(""); } TEST(Io, Read2) { - TestFileRead("abc", false, "abc"); + TestFileRead("abc"); } TEST(Io, Read3) { - TestFileRead("\xef\xbb\xbf", false, "\xef\xbb\xbf"); + TestFileRead("\xef\xbb\xbf"); } TEST(Io, Read4) { - TestFileRead("\xef\xbb\xbfxyz", false, "\xef\xbb\xbfxyz"); + TestFileRead("\xef\xbb\xbfxyz"); } -TEST(Io, ReadBom1) -{ - TestFileRead("", true, ""); -} -TEST(Io, ReadBom2) -{ - TestFileRead("abc", true, "abc"); -} -TEST(Io, ReadBom3) -{ - TestFileRead("\xef\xbb\xbf", true, ""); -} -TEST(Io, ReadBom4) -{ - TestFileRead("\xef\xbb\xbfxyz", true, "xyz"); -} -TEST(Io, ReadBom5) -{ - TestFileRead("\xef\xbb\xbf\xef\xbb\xbf", true, "\xef\xbb\xbf"); -} -TEST(Io, ReadBom6) -{ - TestFileRead("\xef\xbb\xbfxyz\xef\xbb\xbf", true, "xyz\xef\xbb\xbf"); -} TEST(Io, CurrentExe) { IOHANDLE CurrentExe = io_current_exe(); diff --git a/src/test/linereader.cpp b/src/test/linereader.cpp index 2127c46858b..8efd83e1f90 100644 --- a/src/test/linereader.cpp +++ b/src/test/linereader.cpp @@ -4,45 +4,89 @@ #include #include -void TestFileLineReader(const char *pWritten, bool SkipBom, std::initializer_list pReads) +void TestFileLineReaderRaw(const char *pWritten, unsigned WrittenLength, std::initializer_list pReads, bool ExpectSuccess, bool WriteBom) { CTestInfo Info; IOHANDLE File = io_open(Info.m_aFilename, IOFLAG_WRITE); ASSERT_TRUE(File); - EXPECT_EQ(io_write(File, pWritten, str_length(pWritten)), str_length(pWritten)); + if(WriteBom) + { + constexpr const unsigned char UTF8_BOM[] = {0xEF, 0xBB, 0xBF}; + EXPECT_EQ(io_write(File, UTF8_BOM, sizeof(UTF8_BOM)), sizeof(UTF8_BOM)); + } + EXPECT_EQ(io_write(File, pWritten, WrittenLength), WrittenLength); EXPECT_FALSE(io_close(File)); - File = io_open(Info.m_aFilename, IOFLAG_READ | (SkipBom ? IOFLAG_SKIP_BOM : 0)); - ASSERT_TRUE(File); + CLineReader LineReader; - LineReader.Init(File); - for(const char *pRead : pReads) + const bool ActualSuccess = LineReader.OpenFile(io_open(Info.m_aFilename, IOFLAG_READ)); + ASSERT_EQ(ActualSuccess, ExpectSuccess); + if(ActualSuccess) { - const char *pReadLine = LineReader.Get(); - ASSERT_TRUE(pReadLine); - EXPECT_STREQ(pReadLine, pRead); + for(const char *pRead : pReads) + { + const char *pReadLine = LineReader.Get(); + ASSERT_TRUE(pReadLine) << "Line reader returned less lines than expected"; + EXPECT_STREQ(pReadLine, pRead) << "Line reader returned unexpected line"; + } + EXPECT_FALSE(LineReader.Get()) << "Line reader returned more lines than expected"; } - EXPECT_FALSE(LineReader.Get()); - EXPECT_FALSE(io_close(File)); fs_remove(Info.m_aFilename); } +void TestFileLineReaderRaw(const char *pWritten, unsigned WrittenLength, std::initializer_list pReads, bool ExpectSuccess) +{ + TestFileLineReaderRaw(pWritten, WrittenLength, pReads, ExpectSuccess, false); + TestFileLineReaderRaw(pWritten, WrittenLength, pReads, ExpectSuccess, true); +} + +void TestFileLineReader(const char *pWritten, std::initializer_list pReads) +{ + TestFileLineReaderRaw(pWritten, str_length(pWritten), pReads, true); +} + TEST(LineReader, NormalNewline) { - TestFileLineReader("foo\nbar\nbaz\n", false, {"foo", "bar", "baz"}); + TestFileLineReader("foo\nbar\nbaz", {"foo", "bar", "baz"}); + TestFileLineReader("foo\nbar\nbaz\n", {"foo", "bar", "baz"}); } TEST(LineReader, CRLFNewline) { - TestFileLineReader("foo\r\nbar\r\nbaz", true, {"foo", "bar", "baz"}); + TestFileLineReader("foo\r\nbar\r\nbaz", {"foo", "bar", "baz"}); + TestFileLineReader("foo\r\nbar\r\nbaz\r\n", {"foo", "bar", "baz"}); +} + +TEST(LineReader, MixedNewline) +{ + TestFileLineReader("1\n2\r\n3\n4\n5\r\n6", {"1", "2", "3", "4", "5", "6"}); + TestFileLineReader("1\n2\r\n3\n4\n5\r\n6\n", {"1", "2", "3", "4", "5", "6"}); + TestFileLineReader("1\n2\r\n3\n4\n5\r\n6\r\n", {"1", "2", "3", "4", "5", "6"}); + TestFileLineReader("1\n2\r\n3\n4\n5\r\n6\r", {"1", "2", "3", "4", "5", "6\r"}); +} + +TEST(LineReader, EmptyLines) +{ + TestFileLineReader("\n\r\n\n\n\r\n", {"", "", "", "", ""}); + TestFileLineReader("\n\r\n\n\n\r\n\n", {"", "", "", "", "", ""}); + TestFileLineReader("\n\r\n\n\n\r\n\r\n", {"", "", "", "", "", ""}); + TestFileLineReader("\n\r\n\n\n\r\n\r", {"", "", "", "", "", "\r"}); } TEST(LineReader, Invalid) { // Lines containing invalid UTF-8 are skipped - TestFileLineReader("foo\xff\nbar\xff\nbaz\xff\n", false, {}); - TestFileLineReader("foo\xff\nbar\nbaz\n", false, {"bar", "baz"}); - TestFileLineReader("foo\nbar\xff\nbaz\n", false, {"foo", "baz"}); - TestFileLineReader("foo\nbar\nbaz\xff\n", false, {"foo", "bar"}); - TestFileLineReader("foo\nbar1\xff\nbar2\xff\nfoobar\nbar3\xff\nbaz\n", false, {"foo", "foobar", "baz"}); + TestFileLineReader("foo\xff\nbar\xff\nbaz\xff", {}); + TestFileLineReader("foo\xff\nbar\nbaz", {"bar", "baz"}); + TestFileLineReader("foo\nbar\xff\nbaz", {"foo", "baz"}); + TestFileLineReader("foo\nbar\nbaz\xff", {"foo", "bar"}); + TestFileLineReader("foo\nbar1\xff\nbar2\xff\nfoobar\nbar3\xff\nbaz", {"foo", "foobar", "baz"}); +} + +TEST(LineReader, NullBytes) +{ + // Line reader does not read any lines if the file contains null bytes + TestFileLineReaderRaw("foo\0\nbar\nbaz", 12, {}, false); + TestFileLineReaderRaw("foo\nbar\0\nbaz", 12, {}, false); + TestFileLineReaderRaw("foo\nbar\nbaz\0", 12, {}, false); } diff --git a/src/tools/config_store.cpp b/src/tools/config_store.cpp index dd8fe05a433..f173f6f0171 100644 --- a/src/tools/config_store.cpp +++ b/src/tools/config_store.cpp @@ -8,37 +8,28 @@ void Process(IStorage *pStorage, const char *pMapName, const char *pConfigName) { - IOHANDLE File = pStorage->OpenFile(pConfigName, IOFLAG_READ | IOFLAG_SKIP_BOM, IStorage::TYPE_ABSOLUTE); - if(!File) + CLineReader LineReader; + if(!LineReader.OpenFile(pStorage->OpenFile(pConfigName, IOFLAG_READ, IStorage::TYPE_ABSOLUTE))) { dbg_msg("config_store", "config '%s' not found", pConfigName); return; } - CLineReader LineReader; - LineReader.Init(File); - - char *pLine; + std::vector vpLines; int TotalLength = 0; - std::vector vLines; - while((pLine = LineReader.Get())) + while(const char *pLine = LineReader.Get()) { - int Length = str_length(pLine) + 1; - char *pCopy = (char *)malloc(Length); - mem_copy(pCopy, pLine, Length); - vLines.push_back(pCopy); - TotalLength += Length; + vpLines.push_back(pLine); + TotalLength += str_length(pLine) + 1; } - io_close(File); char *pSettings = (char *)malloc(maximum(1, TotalLength)); int Offset = 0; - for(auto &Line : vLines) + for(const char *pLine : vpLines) { - int Length = str_length(Line) + 1; - mem_copy(pSettings + Offset, Line, Length); + int Length = str_length(pLine) + 1; + mem_copy(pSettings + Offset, pLine, Length); Offset += Length; - free(Line); } CDataFileReader Reader; From 9f698d20c8af44c26724ef8bbf4086c522542e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 30 Jun 2024 15:21:29 +0200 Subject: [PATCH 097/179] Add button and F1 hotkey in editor to open Wiki page for editor Add a question mark-button next to the x-button to open the Wiki page https://wiki.ddnet.org/wiki/Mapping in the default web browser. The link is localized so translators can replace it with the respective translated Wiki pages. The hotkey F1 is also added to activate this button. --- src/game/editor/editor.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 2d82e3fbfdb..997d38be381 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -7674,11 +7674,13 @@ void CEditor::RenderMenubar(CUIRect MenuBar) Ui()->DoPopupMenu(&s_PopupMenuEntitiesId, SettingsButton.x, SettingsButton.y + SettingsButton.h - 1.0f, 200.0f, 92.0f, this, PopupMenuSettings, PopupProperties); } - CUIRect ChangedIndicator, Info, Close; + CUIRect ChangedIndicator, Info, Help, Close; MenuBar.VSplitLeft(5.0f, nullptr, &MenuBar); MenuBar.VSplitLeft(MenuBar.h, &ChangedIndicator, &MenuBar); - MenuBar.VSplitRight(20.0f, &MenuBar, &Close); - Close.VSplitLeft(5.0f, nullptr, &Close); + MenuBar.VSplitRight(15.0f, &MenuBar, &Close); + MenuBar.VSplitRight(5.0f, &MenuBar, nullptr); + MenuBar.VSplitRight(15.0f, &MenuBar, &Help); + MenuBar.VSplitRight(5.0f, &MenuBar, nullptr); MenuBar.VSplitLeft(MenuBar.w * 0.6f, &MenuBar, &Info); MenuBar.VSplitRight(5.0f, &MenuBar, nullptr); @@ -7706,6 +7708,16 @@ void CEditor::RenderMenubar(CUIRect MenuBar) str_format(aBuf, sizeof(aBuf), "X: %.1f, Y: %.1f, Z: %.1f, A: %.1f, G: %i %s", Ui()->MouseWorldX() / 32.0f, Ui()->MouseWorldY() / 32.0f, MapView()->Zoom()->GetValue(), m_AnimateSpeed, MapView()->MapGrid()->Factor(), aTimeStr); Ui()->DoLabel(&Info, aBuf, 10.0f, TEXTALIGN_MR); + static int s_HelpButton = 0; + if(DoButton_Editor(&s_HelpButton, "?", 0, &Help, 0, "[F1] Open the DDNet Wiki page for the Map Editor in a web browser") || (Input()->KeyPress(KEY_F1) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr)) + { + const char *pLink = Localize("https://wiki.ddnet.org/wiki/Mapping"); + if(!open_link(pLink)) + { + ShowFileDialogError("Failed to open the link '%s' in the default web browser.", pLink); + } + } + static int s_CloseButton = 0; if(DoButton_Editor(&s_CloseButton, "×", 0, &Close, 0, "Exits from the editor")) { From e0b62edb0bef96284b94c13729cbbf6f40a6f489 Mon Sep 17 00:00:00 2001 From: heinrich5991 Date: Mon, 1 Jul 2024 21:49:47 +0200 Subject: [PATCH 098/179] mastersrv: Use `libloc` instead of our own CSV format for GeoIP This also makes GeoIP data more precise than our current state, from `eu` to `eu:de` for Germany, i.e. adding country codes for all countries and not only for China. https://git.ipfire.org/?p=location/libloc.git Current location data can be obtained from https://location.ipfire.org/databases/1/location.db.xz. --- src/mastersrv/Cargo.lock | 414 ++++++++++++++++++++++++++++----- src/mastersrv/Cargo.toml | 3 +- src/mastersrv/src/locations.rs | 39 ++-- src/mastersrv/src/main.rs | 2 +- 4 files changed, 367 insertions(+), 91 deletions(-) diff --git a/src/mastersrv/Cargo.lock b/src/mastersrv/Cargo.lock index e5f23279c77..ee42e554b35 100644 --- a/src/mastersrv/Cargo.lock +++ b/src/mastersrv/Cargo.lock @@ -11,6 +11,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -59,16 +74,16 @@ dependencies = [ ] [[package]] -name = "bstr" -version = "0.2.17" +name = "bumpalo" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata", - "serde", -] +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -76,12 +91,32 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +[[package]] +name = "cc" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + [[package]] name = "clap" version = "2.34.0" @@ -95,6 +130,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + [[package]] name = "cpufeatures" version = "0.2.2" @@ -114,28 +155,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "csv" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" -dependencies = [ - "bstr", - "csv-core", - "itoa 0.4.8", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - [[package]] name = "digest" version = "0.10.3" @@ -310,7 +329,7 @@ checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" dependencies = [ "bytes", "fnv", - "itoa 1.0.1", + "itoa", ] [[package]] @@ -357,7 +376,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.1", + "itoa", "pin-project-lite", "socket2", "tokio", @@ -366,6 +385,29 @@ dependencies = [ "want", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.2.3" @@ -389,24 +431,24 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" -dependencies = [ - "serde", -] +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itoa" -version = "0.4.8" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" [[package]] -name = "itoa" -version = "1.0.1" +name = "js-sys" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] [[package]] name = "lazy_static" @@ -416,9 +458,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.125" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloc" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" +checksum = "a2714dc2e1457b05760031b876cf46c7abf11b302278b59ebb7bbd37f8bc9145" +dependencies = [ + "chrono", + "ipnet", + "memmap2", + "yoke", + "yoke-derive", + "zerocopy", + "zerocopy-derive", +] [[package]] name = "log" @@ -437,11 +494,10 @@ dependencies = [ "base64", "bytes", "clap", - "csv", "env_logger", "headers", "hex", - "ipnet", + "libloc", "log", "mime", "rand", @@ -466,6 +522,16 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", + "stable_deref_trait", +] + [[package]] name = "mime" version = "0.3.16" @@ -513,6 +579,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.13.1" @@ -523,6 +598,12 @@ dependencies = [ "libc", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + [[package]] name = "percent-encoding" version = "2.1.0" @@ -546,7 +627,7 @@ checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.92", ] [[package]] @@ -569,18 +650,18 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.18" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -626,12 +707,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-syntax" version = "0.6.25" @@ -667,7 +742,7 @@ checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.92", ] [[package]] @@ -677,7 +752,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f972498cf015f7c0746cac89ebe1d6ef10c293b94175a243a2d9442c163d9944" dependencies = [ "indexmap", - "itoa 1.0.1", + "itoa", "ryu", "serde", ] @@ -689,7 +764,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.1", + "itoa", "ryu", "serde", ] @@ -732,6 +807,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.8.0" @@ -749,6 +830,28 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syn" +version = "2.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "term_size" version = "0.3.2" @@ -817,7 +920,7 @@ checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.92", ] [[package]] @@ -886,7 +989,7 @@ checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.92", ] [[package]] @@ -925,6 +1028,12 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -1009,6 +1118,60 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.68", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + [[package]] name = "winapi" version = "0.3.9" @@ -1039,3 +1202,126 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" diff --git a/src/mastersrv/Cargo.toml b/src/mastersrv/Cargo.toml index 3e1b01406f8..df249c2c543 100644 --- a/src/mastersrv/Cargo.toml +++ b/src/mastersrv/Cargo.toml @@ -16,11 +16,10 @@ clap = { version = "2.34.0", default-features = false, features = [ "suggestions", "wrap_help", ] } -csv = "1.1.6" env_logger = "0.8.3" headers = "0.3.7" hex = "0.4.3" -ipnet = { version = "2.5.0", features = ["serde"] } +libloc = "0.1.0" log = "0.4.17" mime = "0.3.16" rand = "0.8.4" diff --git a/src/mastersrv/src/locations.rs b/src/mastersrv/src/locations.rs index 269384bd694..99870e13087 100644 --- a/src/mastersrv/src/locations.rs +++ b/src/mastersrv/src/locations.rs @@ -1,49 +1,40 @@ use arrayvec::ArrayString; -use ipnet::Ipv4Net; -use serde::Deserialize; use std::net::IpAddr; use std::path::Path; pub type Location = ArrayString<[u8; 12]>; -#[derive(Deserialize)] -struct LocationRecord { - network: Ipv4Net, - location: Location, -} - +#[allow(dead_code)] // only used for `Debug` impl #[derive(Debug)] pub struct LocationsError(String); pub struct Locations { - locations: Vec, + inner: Option, } impl Locations { pub fn empty() -> Locations { Locations { - locations: Vec::new(), + inner: None, } } pub fn read(filename: &Path) -> Result { - let mut reader = csv::Reader::from_path(filename) + let inner = libloc::Locations::open(filename) .map_err(|e| LocationsError(format!("error opening {:?}: {}", filename, e)))?; - let locations: Result, _> = reader.deserialize().collect(); Ok(Locations { - locations: locations - .map_err(|e| LocationsError(format!("error deserializing: {}", e)))?, + inner: Some(inner), }) } pub fn lookup(&self, addr: IpAddr) -> Option { - let ipv4_addr = match addr { - IpAddr::V4(a) => a, - IpAddr::V6(_) => return None, // sad smiley - }; - for LocationRecord { network, location } in &self.locations { - if network.contains(&ipv4_addr) { - return Some(*location); - } - } - None + self.inner.as_ref().and_then(|inner| { + let country_code = inner.lookup(addr)?.country_code(); + let continent_code = inner.country(country_code)?.continent_code(); + let mut result = ArrayString::new(); + result.push_str(continent_code); + result.push_str(":"); + result.push_str(country_code); + result.make_ascii_lowercase(); + Some(result) + }) } } diff --git a/src/mastersrv/src/main.rs b/src/mastersrv/src/main.rs index 8667cf7c86e..ca2d758cd22 100644 --- a/src/mastersrv/src/main.rs +++ b/src/mastersrv/src/main.rs @@ -898,7 +898,7 @@ async fn main() { .arg(Arg::with_name("locations") .long("locations") .value_name("LOCATIONS") - .help("IP to continent locations database filename (CSV file with network,continent_code header).") + .help("IP to continent locations database filename (libloc format, can be obtained from https://location.ipfire.org/databases/1/location.db.xz).") ) .arg(Arg::with_name("write-addresses") .long("write-addresses") From dc56651c3995b44a6499e2a4d79c24853fe1e4c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Tue, 9 Jan 2024 21:08:34 +0100 Subject: [PATCH 099/179] Various improvements to scoreboard rendering, refactoring Scoreboard title - In teamplay, color the title background red/blue for the respective teams (like in 0.7). - In teamplay, swap the score location for the blue team, so the scores line up in the center (like in 0.7). - Use textrender ellipsis instead of cutting the title string manually and potentially creating broken UTF-8. Game over title - Render the game over message in the color of the winning team (or yellow in case of draws). - Adjust size and spacing of the message to prevent overlap. Player list - Add player list size variant for 17-24 players with two columns of up to 12 players. This previously used the variant for 32 players. Goals - Use textrender for alignment and properly center the time limit goal. - Change localization text from `Round` to `Round %d/%d` so the numbers and punctuation can be formatted more correctly in some languages (e.g. right-to-left languages, Korean, Chinese). Spectators - Render spectators title and spectators starting in the same line to use space more effectively. - Render as many lines of spectators as fit instead of only 4 lines. - Render a placeholder text at the end when there are more spectators than fit. Refactoring - Use correct class for `NETMSGTYPE_SV_RECORDLEGACY` instead of depending on the structs `CNetMsg_Sv_Record` and `CNetMsg_Sv_RecordLegacy` being identical. - Use `CUIRect` and `DoLabel` when possible. --- src/game/client/components/scoreboard.cpp | 784 +++++++++++----------- src/game/client/components/scoreboard.h | 22 +- 2 files changed, 403 insertions(+), 403 deletions(-) diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp index ad2c0752b29..fd952c7e86d 100644 --- a/src/game/client/components/scoreboard.cpp +++ b/src/game/client/components/scoreboard.cpp @@ -1,5 +1,7 @@ /* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ +#include "scoreboard.h" + #include #include #include @@ -13,10 +15,9 @@ #include #include #include +#include #include -#include "scoreboard.h" - CScoreboard::CScoreboard() { OnReset(); @@ -24,10 +25,15 @@ CScoreboard::CScoreboard() void CScoreboard::ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData) { - CScoreboard *pSelf = (CScoreboard *)pUserData; + CScoreboard *pSelf = static_cast(pUserData); pSelf->m_Active = pResult->GetInteger(0) != 0; } +void CScoreboard::OnConsoleInit() +{ + Console()->Register("+scoreboard", "", CFGFLAG_CLIENT, ConKeyScoreboard, this, "Show scoreboard"); +} + void CScoreboard::OnReset() { m_Active = false; @@ -41,216 +47,216 @@ void CScoreboard::OnRelease() void CScoreboard::OnMessage(int MsgType, void *pRawMsg) { - if(MsgType == NETMSGTYPE_SV_RECORD || MsgType == NETMSGTYPE_SV_RECORDLEGACY) + if(MsgType == NETMSGTYPE_SV_RECORD) { - CNetMsg_Sv_Record *pMsg = (CNetMsg_Sv_Record *)pRawMsg; - m_ServerRecord = (float)pMsg->m_ServerTimeBest / 100; + CNetMsg_Sv_Record *pMsg = static_cast(pRawMsg); + m_ServerRecord = pMsg->m_ServerTimeBest / 100.0f; + } + else if(MsgType == NETMSGTYPE_SV_RECORDLEGACY) + { + CNetMsg_Sv_RecordLegacy *pMsg = static_cast(pRawMsg); + m_ServerRecord = pMsg->m_ServerTimeBest / 100.0f; } } -void CScoreboard::OnConsoleInit() -{ - Console()->Register("+scoreboard", "", CFGFLAG_CLIENT, ConKeyScoreboard, this, "Show scoreboard"); -} - -void CScoreboard::RenderGoals(float x, float y, float w) +void CScoreboard::RenderTitle(CUIRect TitleBar, int Team, const char *pTitle) { - float h = 50.0f; + dbg_assert(Team == TEAM_RED || Team == TEAM_BLUE, "Team invalid"); - Graphics()->DrawRect(x, y, w, h, ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 10.0f); + const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; - // render goals - if(m_pClient->m_Snap.m_pGameInfoObj) + char aScore[128] = ""; + if(GameClient()->m_GameInfo.m_TimeScore) + { + if(m_ServerRecord > 0) + { + str_time_float(m_ServerRecord, TIME_HOURS, aScore, sizeof(aScore)); + } + } + else if(pGameInfoObj && (pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS)) { - if(m_pClient->m_Snap.m_pGameInfoObj->m_ScoreLimit) + const CNetObj_GameData *pGameDataObj = GameClient()->m_Snap.m_pGameDataObj; + if(pGameDataObj) { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "%s: %d", Localize("Score limit"), m_pClient->m_Snap.m_pGameInfoObj->m_ScoreLimit); - TextRender()->Text(x + 10.0f, y + (h - 20.f) / 2.f, 20.0f, aBuf, -1.0f); + str_format(aScore, sizeof(aScore), "%d", Team == TEAM_RED ? pGameDataObj->m_TeamscoreRed : pGameDataObj->m_TeamscoreBlue); } - if(m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit) + } + else + { + if(GameClient()->m_Snap.m_SpecInfo.m_Active && + GameClient()->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW && + GameClient()->m_Snap.m_apPlayerInfos[GameClient()->m_Snap.m_SpecInfo.m_SpectatorId]) { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), Localize("Time limit: %d min"), m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit); - TextRender()->Text(x + 230.0f, y + (h - 20.f) / 2.f, 20.0f, aBuf, -1.0f); + str_format(aScore, sizeof(aScore), "%d", GameClient()->m_Snap.m_apPlayerInfos[GameClient()->m_Snap.m_SpecInfo.m_SpectatorId]->m_Score); } - if(m_pClient->m_Snap.m_pGameInfoObj->m_RoundNum && m_pClient->m_Snap.m_pGameInfoObj->m_RoundCurrent) + else if(GameClient()->m_Snap.m_pLocalInfo) { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "%s %d/%d", Localize("Round"), m_pClient->m_Snap.m_pGameInfoObj->m_RoundCurrent, m_pClient->m_Snap.m_pGameInfoObj->m_RoundNum); - float tw = TextRender()->TextWidth(20.0f, aBuf, -1, -1.0f); - TextRender()->Text(x + w - tw - 10.0f, y + (h - 20.f) / 2.f, 20.0f, aBuf, -1.0f); + str_format(aScore, sizeof(aScore), "%d", GameClient()->m_Snap.m_pLocalInfo->m_Score); } } -} -void CScoreboard::RenderSpectators(float x, float y, float w, float h) -{ - // background - Graphics()->DrawRect(x, y, w, h, ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 10.0f); - - // Headline - y += 10.0f; - TextRender()->Text(x + 10.0f, y + (30.f - 28.f) / 2.f, 28.0f, Localize("Spectators"), w - 20.0f); + const float TitleFontSize = 40.0f; + const float ScoreTextWidth = TextRender()->TextWidth(TitleFontSize, aScore); - // spectator names - y += 30.0f; - bool Multiple = false; + TitleBar.VMargin(20.0f, &TitleBar); + CUIRect TitleLabel, ScoreLabel; + if(Team == TEAM_RED) + { + TitleBar.VSplitRight(ScoreTextWidth, &TitleLabel, &ScoreLabel); + TitleLabel.VSplitRight(10.0f, &TitleLabel, nullptr); + } + else + { + TitleBar.VSplitLeft(ScoreTextWidth, &ScoreLabel, &TitleLabel); + TitleLabel.VSplitLeft(10.0f, nullptr, &TitleLabel); + } - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, x + 10.0f, y, 22.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = w - 20.0f; - Cursor.m_MaxLines = 4; + { + SLabelProperties Props; + Props.m_MaxWidth = TitleLabel.w; + Props.m_EllipsisAtEnd = true; + Ui()->DoLabel(&TitleLabel, pTitle, TitleFontSize, Team == TEAM_RED ? TEXTALIGN_ML : TEXTALIGN_MR, Props); + } - for(const auto *pInfo : m_pClient->m_Snap.m_apInfoByName) + if(aScore[0] != '\0') { - if(!pInfo || pInfo->m_Team != TEAM_SPECTATORS) - continue; + Ui()->DoLabel(&ScoreLabel, aScore, TitleFontSize, Team == TEAM_RED ? TEXTALIGN_MR : TEXTALIGN_ML); + } +} - if(Multiple) - TextRender()->TextEx(&Cursor, ", ", 2); +void CScoreboard::RenderGoals(CUIRect Goals) +{ + Goals.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); + Goals.VMargin(10.0f, &Goals); - if(m_pClient->m_aClients[pInfo->m_ClientId].m_AuthLevel) - { - ColorRGBA Color = color_cast(ColorHSLA(g_Config.m_ClAuthedPlayerColor)); - TextRender()->TextColor(Color); - } + const float FontSize = 20.0f; + const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; + char aBuf[64]; - if(g_Config.m_ClShowIds) - { - char aBuffer[5]; - int size = str_format(aBuffer, sizeof(aBuffer), "%d: ", pInfo->m_ClientId); - TextRender()->TextEx(&Cursor, aBuffer, size); - } - TextRender()->TextEx(&Cursor, m_pClient->m_aClients[pInfo->m_ClientId].m_aName, -1); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); + if(pGameInfoObj->m_ScoreLimit) + { + str_format(aBuf, sizeof(aBuf), "%s: %d", Localize("Score limit"), pGameInfoObj->m_ScoreLimit); + Ui()->DoLabel(&Goals, aBuf, FontSize, TEXTALIGN_ML); + } - Multiple = true; + if(pGameInfoObj->m_TimeLimit) + { + str_format(aBuf, sizeof(aBuf), Localize("Time limit: %d min"), pGameInfoObj->m_TimeLimit); + Ui()->DoLabel(&Goals, aBuf, FontSize, TEXTALIGN_MC); + } + + if(pGameInfoObj->m_RoundNum && pGameInfoObj->m_RoundCurrent) + { + str_format(aBuf, sizeof(aBuf), Localize("Round %d/%d"), pGameInfoObj->m_RoundCurrent, pGameInfoObj->m_RoundNum); + Ui()->DoLabel(&Goals, aBuf, FontSize, TEXTALIGN_MR); } } -void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const char *pTitle, int NumPlayers) +void CScoreboard::RenderSpectators(CUIRect Spectators) { - if(Team == TEAM_SPECTATORS) - return; + Spectators.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); + Spectators.Margin(10.0f, &Spectators); - bool lower16 = false; - bool upper16 = false; - bool lower24 = false; - bool upper24 = false; - bool lower32 = false; - bool upper32 = false; - - if(Team == -3) - upper16 = true; - else if(Team == -4) - lower32 = true; - else if(Team == -5) - upper32 = true; - else if(Team == -6) - lower16 = true; - else if(Team == -7) - lower24 = true; - else if(Team == -8) - upper24 = true; - - bool IsTeamplayTeam = Team > TEAM_SPECTATORS; - - if(Team < -1) - Team = 0; - - if(NumPlayers < 0) - NumPlayers = m_pClient->m_Snap.m_aTeamSize[Team]; - - float h = 760.0f; - - // background + CTextCursor Cursor; + TextRender()->SetCursor(&Cursor, Spectators.x, Spectators.y, 22.0f, TEXTFLAG_RENDER); + Cursor.m_LineWidth = Spectators.w; + Cursor.m_MaxLines = round_truncate(Spectators.h / Cursor.m_FontSize); + + int RemainingSpectators = 0; + for(const CNetObj_PlayerInfo *pInfo : GameClient()->m_Snap.m_apInfoByName) { - int Corners; - if(upper16 || upper32 || upper24) - Corners = IGraphics::CORNER_R; - else if(lower16 || lower32 || lower24) - Corners = IGraphics::CORNER_L; - else - Corners = IGraphics::CORNER_ALL; - Graphics()->DrawRect(x, y, w, h, ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), Corners, 17.0f); + if(!pInfo || pInfo->m_Team != TEAM_SPECTATORS) + continue; + ++RemainingSpectators; } - char aBuf[128] = {0}; + TextRender()->TextEx(&Cursor, Localize("Spectators")); - // render title - float TitleFontsize = 40.0f; - int TitleWidth = (lower32 || lower24 || lower16) ? 1140 : 440; - if(!pTitle) + if(RemainingSpectators > 0) { - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) - pTitle = Localize("Game over"); - else - { - str_copy(aBuf, Client()->GetCurrentMap()); - while(TextRender()->TextWidth(TitleFontsize, aBuf, -1, -1.0f) > TitleWidth) - aBuf[str_length(aBuf) - 1] = '\0'; - if(str_comp(aBuf, Client()->GetCurrentMap())) - str_append(aBuf, "…"); - pTitle = aBuf; - } + TextRender()->TextEx(&Cursor, ": "); } - TextRender()->Text(x + 20.0f, y + (50.f - TitleFontsize) / 2.f, TitleFontsize, pTitle, -1.0f); - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) + bool CommaNeeded = false; + for(const CNetObj_PlayerInfo *pInfo : GameClient()->m_Snap.m_apInfoByName) { - if(m_pClient->m_Snap.m_pGameDataObj) + if(!pInfo || pInfo->m_Team != TEAM_SPECTATORS) + continue; + + if(CommaNeeded) { - int Score = Team == TEAM_RED ? m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed : m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue; - str_format(aBuf, sizeof(aBuf), "%d", Score); + TextRender()->TextEx(&Cursor, ", "); } - } - else - { - if(m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW && - m_pClient->m_Snap.m_apPlayerInfos[m_pClient->m_Snap.m_SpecInfo.m_SpectatorId]) + + if(Cursor.m_LineCount == Cursor.m_MaxLines && RemainingSpectators >= 2) { - int Score = m_pClient->m_Snap.m_apPlayerInfos[m_pClient->m_Snap.m_SpecInfo.m_SpectatorId]->m_Score; - str_format(aBuf, sizeof(aBuf), "%d", Score); + // This is less expensive than checking with a separate invisible + // text cursor though we waste some space at the end of the line. + char aRemaining[64]; + str_format(aRemaining, sizeof(aRemaining), Localize("%d others…", "Spectators"), RemainingSpectators); + TextRender()->TextEx(&Cursor, aRemaining); + break; } - else if(m_pClient->m_Snap.m_pLocalInfo) + + if(GameClient()->m_aClients[pInfo->m_ClientId].m_AuthLevel) { - int Score = m_pClient->m_Snap.m_pLocalInfo->m_Score; - str_format(aBuf, sizeof(aBuf), "%d", Score); + TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClAuthedPlayerColor))); } - } - if(m_pClient->m_GameInfo.m_TimeScore) - { - if(m_ServerRecord > 0) - str_time_float(m_ServerRecord, TIME_HOURS, aBuf, sizeof(aBuf)); - else - aBuf[0] = 0; + if(g_Config.m_ClShowIds) + { + char aClientId[5]; + str_format(aClientId, sizeof(aClientId), "%d: ", pInfo->m_ClientId); + TextRender()->TextEx(&Cursor, aClientId); + } + TextRender()->TextEx(&Cursor, GameClient()->m_aClients[pInfo->m_ClientId].m_aName); + TextRender()->TextColor(TextRender()->DefaultTextColor()); + + CommaNeeded = true; + --RemainingSpectators; } +} + +void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd) +{ + dbg_assert(Team == TEAM_RED || Team == TEAM_BLUE, "Team invalid"); - float tw; + const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; + const CNetObj_GameData *pGameDataObj = GameClient()->m_Snap.m_pGameDataObj; + const bool TimeScore = GameClient()->m_GameInfo.m_TimeScore; + const int NumPlayers = CountEnd - CountStart; - if(!lower16 && !lower32 && !lower24) + // calculate measurements + float LineHeight; + float TeeSizeMod; + float Spacing; + float RoundRadius; + float FontSize; + if(NumPlayers <= 8) { - tw = TextRender()->TextWidth(TitleFontsize, aBuf, -1, -1.0f); - TextRender()->Text(x + w - tw - 20.0f, y + (50.f - TitleFontsize) / 2.f, TitleFontsize, aBuf, -1.0f); + LineHeight = 60.0f; + TeeSizeMod = 1.0f; + Spacing = 16.0f; + RoundRadius = 10.0f; + FontSize = 24.0f; } - - // calculate measurements - float LineHeight = 60.0f; - float TeeSizeMod = 1.0f; - float Spacing = 16.0f; - float RoundRadius = 15.0f; - float FontSize = 24.0f; - if(NumPlayers > 48) + else if(NumPlayers <= 12) { - LineHeight = 20.0f; - TeeSizeMod = 0.4f; + LineHeight = 50.0f; + TeeSizeMod = 0.9f; + Spacing = 5.0f; + RoundRadius = 10.0f; + FontSize = 24.0f; + } + else if(NumPlayers <= 16) + { + LineHeight = 40.0f; + TeeSizeMod = 0.8f; Spacing = 0.0f; RoundRadius = 5.0f; - FontSize = 16.0f; + FontSize = 24.0f; } - else if(NumPlayers > 32) + else if(NumPlayers <= 24) { LineHeight = 27.0f; TeeSizeMod = 0.6f; @@ -258,121 +264,107 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch RoundRadius = 5.0f; FontSize = 20.0f; } - else if(NumPlayers > 12) + else { - LineHeight = 40.0f; - TeeSizeMod = 0.8f; + LineHeight = 20.0f; + TeeSizeMod = 0.4f; Spacing = 0.0f; - RoundRadius = 15.0f; - } - else if(NumPlayers > 8) - { - LineHeight = 50.0f; - TeeSizeMod = 0.9f; - Spacing = 5.0f; - RoundRadius = 15.0f; + RoundRadius = 5.0f; + FontSize = 16.0f; } - float ScoreOffset = x + 10.0f + 10.0f, ScoreLength = TextRender()->TextWidth(FontSize, "00:00:00", -1, -1.0f); - if(IsTeamplayTeam) - ScoreLength = TextRender()->TextWidth(FontSize, "99999", -1, -1.0f); - float TeeOffset = ScoreOffset + ScoreLength + 15.0f, TeeLength = 60 * TeeSizeMod; - float NameOffset = TeeOffset + TeeLength, NameLength = 300.0f - TeeLength; - float CountryLength = (LineHeight - Spacing - TeeSizeMod * 5.0f) * 2.0f; - float PingLength = 65.0f; - float PingOffset = x + w - PingLength - 10.0f - 10.0f; - float CountryOffset = PingOffset - CountryLength; - float ClanLength = w - ((NameOffset - x) + NameLength) - (w - (CountryOffset - x)); - float ClanOffset = CountryOffset - ClanLength; + const float ScoreOffset = Scoreboard.x + 10.0f + 10.0f; + const float ScoreLength = TextRender()->TextWidth(FontSize, TimeScore ? "00:00:00" : "99999"); + const float TeeOffset = ScoreOffset + ScoreLength + 15.0f; + const float TeeLength = 60.0f * TeeSizeMod; + const float NameOffset = TeeOffset + TeeLength; + const float NameLength = 300.0f - TeeLength; + const float CountryLength = (LineHeight - Spacing - TeeSizeMod * 5.0f) * 2.0f; + const float PingLength = 65.0f; + const float PingOffset = Scoreboard.x + Scoreboard.w - PingLength - 10.0f - 10.0f; + const float CountryOffset = PingOffset - CountryLength; + const float ClanLength = Scoreboard.w - ((NameOffset - Scoreboard.x) + NameLength) - (Scoreboard.w - (CountryOffset - Scoreboard.x)); + const float ClanOffset = CountryOffset - ClanLength; // render headlines - x += 10.0f; - y += 50.0f; - float HeadlineFontsize = 22.0f; - const char *pScore = m_pClient->m_GameInfo.m_TimeScore ? Localize("Time") : Localize("Score"); - tw = TextRender()->TextWidth(HeadlineFontsize, pScore, -1, -1.0f); - TextRender()->Text(ScoreOffset + ScoreLength - tw, y + (HeadlineFontsize * 2.f - HeadlineFontsize) / 2.f, HeadlineFontsize, pScore, -1.0f); - - TextRender()->Text(NameOffset, y + (HeadlineFontsize * 2.f - HeadlineFontsize) / 2.f, HeadlineFontsize, Localize("Name"), -1.0f); - - tw = TextRender()->TextWidth(HeadlineFontsize, Localize("Clan"), -1, -1.0f); - TextRender()->Text(ClanOffset + (ClanLength - tw) / 2, y + (HeadlineFontsize * 2.f - HeadlineFontsize) / 2.f, HeadlineFontsize, Localize("Clan"), -1.0f); - - tw = TextRender()->TextWidth(HeadlineFontsize, Localize("Ping"), -1, -1.0f); - TextRender()->Text(PingOffset + PingLength - tw, y + (HeadlineFontsize * 2.f - HeadlineFontsize) / 2.f, HeadlineFontsize, Localize("Ping"), -1.0f); + const float HeadlineFontsize = 22.0f; + CUIRect Headline; + Scoreboard.HSplitTop(HeadlineFontsize * 2.0f, &Headline, &Scoreboard); + const float HeadlineY = Headline.y + Headline.h / 2.0f - HeadlineFontsize / 2.0f; + const char *pScore = TimeScore ? Localize("Time") : Localize("Score"); + TextRender()->Text(ScoreOffset + ScoreLength - TextRender()->TextWidth(HeadlineFontsize, pScore), HeadlineY, HeadlineFontsize, pScore); + TextRender()->Text(NameOffset, HeadlineY, HeadlineFontsize, Localize("Name")); + const char *pClanLabel = Localize("Clan"); + TextRender()->Text(ClanOffset + (ClanLength - TextRender()->TextWidth(HeadlineFontsize, pClanLabel)) / 2.0f, HeadlineY, HeadlineFontsize, pClanLabel); + const char *pPingLabel = Localize("Ping"); + TextRender()->Text(PingOffset + PingLength - TextRender()->TextWidth(HeadlineFontsize, pPingLabel), HeadlineY, HeadlineFontsize, pPingLabel); // render player entries - y += HeadlineFontsize * 2.0f; - CTextCursor Cursor; - - int rendered = 0; - if(upper16) - rendered = -16; - if(upper32) - rendered = -32; - if(upper24) - rendered = -24; - - int OldDDTeam = -1; + int CountRendered = 0; + int PrevDDTeam = -1; + char aBuf[64]; for(int i = 0; i < MAX_CLIENTS; i++) { // make sure that we render the correct team - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_apInfoByDDTeamScore[i]; + const CNetObj_PlayerInfo *pInfo = GameClient()->m_Snap.m_apInfoByDDTeamScore[i]; if(!pInfo || pInfo->m_Team != Team) continue; - if(rendered++ < 0) + if(CountRendered++ < CountStart) continue; - int DDTeam = m_pClient->m_Teams.Team(pInfo->m_ClientId); + int DDTeam = GameClient()->m_Teams.Team(pInfo->m_ClientId); int NextDDTeam = 0; for(int j = i + 1; j < MAX_CLIENTS; j++) { - const CNetObj_PlayerInfo *pInfo2 = m_pClient->m_Snap.m_apInfoByDDTeamScore[j]; - - if(!pInfo2 || pInfo2->m_Team != Team) + const CNetObj_PlayerInfo *pInfoNext = GameClient()->m_Snap.m_apInfoByDDTeamScore[j]; + if(!pInfoNext || pInfoNext->m_Team != Team) continue; - NextDDTeam = m_pClient->m_Teams.Team(pInfo2->m_ClientId); + NextDDTeam = GameClient()->m_Teams.Team(pInfoNext->m_ClientId); break; } - if(OldDDTeam == -1) + if(PrevDDTeam == -1) { for(int j = i - 1; j >= 0; j--) { - const CNetObj_PlayerInfo *pInfo2 = m_pClient->m_Snap.m_apInfoByDDTeamScore[j]; - - if(!pInfo2 || pInfo2->m_Team != Team) + const CNetObj_PlayerInfo *pInfoPrev = GameClient()->m_Snap.m_apInfoByDDTeamScore[j]; + if(!pInfoPrev || pInfoPrev->m_Team != Team) continue; - OldDDTeam = m_pClient->m_Teams.Team(pInfo2->m_ClientId); + PrevDDTeam = GameClient()->m_Teams.Team(pInfoPrev->m_ClientId); break; } } + CUIRect RowAndSpacing, Row; + Scoreboard.HSplitTop(LineHeight + Spacing, &RowAndSpacing, &Scoreboard); + RowAndSpacing.HSplitTop(LineHeight, &Row, nullptr); + + // team background if(DDTeam != TEAM_FLOCK) { - const ColorRGBA Color = m_pClient->GetDDTeamColor(DDTeam).WithAlpha(0.5f); - int Corners = 0; - if(OldDDTeam != DDTeam) - Corners |= IGraphics::CORNER_TL | IGraphics::CORNER_TR; + const ColorRGBA Color = GameClient()->GetDDTeamColor(DDTeam).WithAlpha(0.5f); + int TeamRectCorners = 0; + if(PrevDDTeam != DDTeam) + TeamRectCorners |= IGraphics::CORNER_T; if(NextDDTeam != DDTeam) - Corners |= IGraphics::CORNER_BL | IGraphics::CORNER_BR; - Graphics()->DrawRect(x - 10.0f, y, w, LineHeight + Spacing, Color, Corners, RoundRadius); + TeamRectCorners |= IGraphics::CORNER_B; + RowAndSpacing.Draw(Color, TeamRectCorners, RoundRadius); if(NextDDTeam != DDTeam) { - if(m_pClient->m_Snap.m_aTeamSize[0] > 8) + const float TeamFontSize = FontSize / 1.5f; + if(NumPlayers > 8) { if(DDTeam == TEAM_SUPER) str_copy(aBuf, Localize("Super")); else str_format(aBuf, sizeof(aBuf), "%d", DDTeam); - TextRender()->SetCursor(&Cursor, x - 10.0f, y + Spacing + FontSize - (FontSize / 1.5f), FontSize / 1.5f, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); - Cursor.m_LineWidth = NameLength + 3; + TextRender()->Text(Row.x, Row.y + Row.h / 2.0f - TeamFontSize / 2.0f, TeamFontSize, aBuf); } else { @@ -380,144 +372,120 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch str_copy(aBuf, Localize("Super")); else str_format(aBuf, sizeof(aBuf), Localize("Team %d"), DDTeam); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->SetCursor(&Cursor, ScoreOffset + w / 2.0f - tw / 2.0f, y + LineHeight, FontSize / 1.5f, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); - Cursor.m_LineWidth = NameLength + 3; + TextRender()->Text(Row.x + Row.w / 2.0f - TextRender()->TextWidth(TeamFontSize, aBuf) / 2.0f + 10.0f, Row.y + Row.h, TeamFontSize, aBuf); } - TextRender()->TextEx(&Cursor, aBuf, -1); } } - - OldDDTeam = DDTeam; + PrevDDTeam = DDTeam; // background so it's easy to find the local player or the followed one in spectator mode - if((!m_pClient->m_Snap.m_SpecInfo.m_Active && pInfo->m_Local) || (m_pClient->m_Snap.m_SpecInfo.m_SpectatorId == SPEC_FREEVIEW && pInfo->m_Local) || (m_pClient->m_Snap.m_SpecInfo.m_Active && pInfo->m_ClientId == m_pClient->m_Snap.m_SpecInfo.m_SpectatorId)) + if((!GameClient()->m_Snap.m_SpecInfo.m_Active && pInfo->m_Local) || + (GameClient()->m_Snap.m_SpecInfo.m_SpectatorId == SPEC_FREEVIEW && pInfo->m_Local) || + (GameClient()->m_Snap.m_SpecInfo.m_Active && pInfo->m_ClientId == GameClient()->m_Snap.m_SpecInfo.m_SpectatorId)) { - Graphics()->DrawRect(x, y, w - 20.0f, LineHeight, ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, RoundRadius); + CUIRect Highlight; + Row.VMargin(10.0f, &Highlight); + Highlight.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, RoundRadius); } // score - if(m_pClient->m_GameInfo.m_TimeScore) + if(TimeScore) { if(pInfo->m_Score == -9999) - aBuf[0] = 0; + { + aBuf[0] = '\0'; + } else + { str_time((int64_t)absolute(pInfo->m_Score) * 100, TIME_HOURS, aBuf, sizeof(aBuf)); + } } else + { str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Score, -999, 99999)); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->SetCursor(&Cursor, ScoreOffset + ScoreLength - tw, y + (LineHeight - FontSize) / 2.f, FontSize, TEXTFLAG_RENDER); - TextRender()->TextEx(&Cursor, aBuf, -1); + } + TextRender()->Text(ScoreOffset + ScoreLength - TextRender()->TextWidth(FontSize, aBuf), Row.y + (Row.h - FontSize) / 2.0f, FontSize, aBuf); - // flag - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS && - m_pClient->m_Snap.m_pGameDataObj && (m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierRed == pInfo->m_ClientId || m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue == pInfo->m_ClientId)) + // CTF flag + if(pGameInfoObj && (pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS) && + pGameDataObj && (pGameDataObj->m_FlagCarrierRed == pInfo->m_ClientId || pGameDataObj->m_FlagCarrierBlue == pInfo->m_ClientId)) { Graphics()->BlendNormal(); - if(m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue == pInfo->m_ClientId) - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagBlue); - else - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagRed); - + Graphics()->TextureSet(pGameDataObj->m_FlagCarrierBlue == pInfo->m_ClientId ? GameClient()->m_GameSkin.m_SpriteFlagBlue : GameClient()->m_GameSkin.m_SpriteFlagRed); Graphics()->QuadsBegin(); - Graphics()->QuadsSetSubset(1, 0, 0, 1); - - float Size = LineHeight; - IGraphics::CQuadItem QuadItem(TeeOffset + 0.0f, y - 5.0f - Spacing / 2.0f, Size / 2.0f, Size); + Graphics()->QuadsSetSubset(1.0f, 0.0f, 0.0f, 1.0f); + IGraphics::CQuadItem QuadItem(TeeOffset, Row.y - 5.0f - Spacing / 2.0f, Row.h / 2.0f, Row.h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } - // avatar - CTeeRenderInfo TeeInfo = m_pClient->m_aClients[pInfo->m_ClientId].m_RenderInfo; - TeeInfo.m_Size *= TeeSizeMod; - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - vec2 TeeRenderPos(TeeOffset + TeeLength / 2, y + LineHeight / 2.0f + OffsetToMid.y); - - RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); + const CGameClient::CClientData &ClientData = GameClient()->m_aClients[pInfo->m_ClientId]; - // name - TextRender()->SetCursor(&Cursor, NameOffset, y + (LineHeight - FontSize) / 2.f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_ELLIPSIS_AT_END); - if(m_pClient->m_aClients[pInfo->m_ClientId].m_AuthLevel) + // skin { - ColorRGBA Color = color_cast(ColorHSLA(g_Config.m_ClAuthedPlayerColor)); - TextRender()->TextColor(Color); + CTeeRenderInfo TeeInfo = ClientData.m_RenderInfo; + TeeInfo.m_Size *= TeeSizeMod; + vec2 OffsetToMid; + CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &TeeInfo, OffsetToMid); + const vec2 TeeRenderPos = vec2(TeeOffset + TeeLength / 2, Row.y + Row.h / 2.0f + OffsetToMid.y); + RenderTools()->RenderTee(CAnimState::GetIdle(), &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); } - if(g_Config.m_ClShowIds) + // name { - char aId[64] = ""; - if(pInfo->m_ClientId < 10) + CTextCursor Cursor; + TextRender()->SetCursor(&Cursor, NameOffset, Row.y + (Row.h - FontSize) / 2.0f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_ELLIPSIS_AT_END); + Cursor.m_LineWidth = NameLength; + if(ClientData.m_AuthLevel) + { + TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClAuthedPlayerColor))); + } + if(g_Config.m_ClShowIds) { - str_format(aId, sizeof(aId), " %d: %s", pInfo->m_ClientId, m_pClient->m_aClients[pInfo->m_ClientId].m_aName); + str_format(aBuf, sizeof(aBuf), "%s%d: %s", pInfo->m_ClientId < 10 ? " " : "", pInfo->m_ClientId, ClientData.m_aName); + TextRender()->TextEx(&Cursor, aBuf); } else { - str_format(aId, sizeof(aId), "%d: %s", pInfo->m_ClientId, m_pClient->m_aClients[pInfo->m_ClientId].m_aName); + TextRender()->TextEx(&Cursor, ClientData.m_aName); } - Cursor.m_LineWidth = NameLength; - TextRender()->TextEx(&Cursor, aId, -1); - } - else - { - Cursor.m_LineWidth = NameLength; - TextRender()->TextEx(&Cursor, m_pClient->m_aClients[pInfo->m_ClientId].m_aName, -1); } // clan - if(str_comp(m_pClient->m_aClients[pInfo->m_ClientId].m_aClan, - m_pClient->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0) { - ColorRGBA Color = color_cast(ColorHSLA(g_Config.m_ClSameClanColor)); - TextRender()->TextColor(Color); + if(str_comp(ClientData.m_aClan, GameClient()->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0) + { + TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClSameClanColor))); + } + else + { + TextRender()->TextColor(TextRender()->DefaultTextColor()); + } + CTextCursor Cursor; + TextRender()->SetCursor(&Cursor, ClanOffset + (ClanLength - minimum(TextRender()->TextWidth(FontSize, ClientData.m_aClan), ClanLength)) / 2.0f, Row.y + (Row.h - FontSize) / 2.0f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_ELLIPSIS_AT_END); + Cursor.m_LineWidth = ClanLength; + TextRender()->TextEx(&Cursor, ClientData.m_aClan); } - else - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - - tw = minimum(TextRender()->TextWidth(FontSize, m_pClient->m_aClients[pInfo->m_ClientId].m_aClan, -1, -1.0f), ClanLength); - TextRender()->SetCursor(&Cursor, ClanOffset + (ClanLength - tw) / 2, y + (LineHeight - FontSize) / 2.f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_ELLIPSIS_AT_END); - Cursor.m_LineWidth = ClanLength; - TextRender()->TextEx(&Cursor, m_pClient->m_aClients[pInfo->m_ClientId].m_aClan, -1); - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); // country flag - m_pClient->m_CountryFlags.Render(m_pClient->m_aClients[pInfo->m_ClientId].m_Country, ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), - CountryOffset, y + (Spacing + TeeSizeMod * 5.0f) / 2.0f, CountryLength, LineHeight - Spacing - TeeSizeMod * 5.0f); + GameClient()->m_CountryFlags.Render(ClientData.m_Country, ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), + CountryOffset, Row.y + (Spacing + TeeSizeMod * 5.0f) / 2.0f, CountryLength, Row.h - Spacing - TeeSizeMod * 5.0f); // ping if(g_Config.m_ClEnablePingColor) { - ColorRGBA rgb = color_cast(ColorHSLA((300.0f - clamp(pInfo->m_Latency, 0, 300)) / 1000.0f, 1.0f, 0.5f)); - TextRender()->TextColor(rgb); - } - str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Latency, 0, 999)); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->SetCursor(&Cursor, PingOffset + PingLength - tw, y + (LineHeight - FontSize) / 2.f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); - Cursor.m_LineWidth = PingLength; - TextRender()->TextEx(&Cursor, aBuf, -1); - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - - y += LineHeight + Spacing; - if(lower32 || upper32) - { - if(rendered == 32) - break; - } - else if(lower24 || upper24) - { - if(rendered == 24) - break; + TextRender()->TextColor(color_cast(ColorHSLA((300.0f - clamp(pInfo->m_Latency, 0, 300)) / 1000.0f, 1.0f, 0.5f))); } else { - if(rendered == 16) - break; + TextRender()->TextColor(TextRender()->DefaultTextColor()); } + str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Latency, 0, 999)); + TextRender()->Text(PingOffset + PingLength - TextRender()->TextWidth(FontSize, aBuf), Row.y + (Row.h - FontSize) / 2.0f, FontSize, aBuf); + TextRender()->TextColor(TextRender()->DefaultTextColor()); + + if(CountRendered == CountEnd) + break; } } @@ -570,140 +538,176 @@ void CScoreboard::OnRender() return; // if the score board is active, then we should clear the motd message as well - if(m_pClient->m_Motd.IsActive()) - m_pClient->m_Motd.Clear(); - - float Width = 400 * 3.0f * Graphics()->ScreenAspect(); - float Height = 400 * 3.0f; + if(GameClient()->m_Motd.IsActive()) + GameClient()->m_Motd.Clear(); + const float Height = 400.0f * 3.0f; + const float Width = Height * Graphics()->ScreenAspect(); Graphics()->MapScreen(0, 0, Width, Height); - float w = 750.0f; - float ExtraWidthSingle = 20.0f; + const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; + const bool Teams = pGameInfoObj && (pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS); + const int NumPlayers = maximum(GameClient()->m_Snap.m_aTeamSize[TEAM_RED], GameClient()->m_Snap.m_aTeamSize[TEAM_BLUE]); + + const float ScoreboardSmallWidth = 750.0f + 20.0f; + const float ScoreboardWidth = !Teams && NumPlayers <= 16 ? ScoreboardSmallWidth : 1500.0f; + const float TitleHeight = 60.0f; - if(m_pClient->m_Snap.m_pGameInfoObj) + CUIRect Scoreboard = {(Width - ScoreboardWidth) / 2.0f, 150.0f, ScoreboardWidth, 710.0f + TitleHeight}; + + if(Teams) { - if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS)) + const char *pRedTeamName = GetTeamName(TEAM_RED); + const char *pBlueTeamName = GetTeamName(TEAM_BLUE); + + // Game over title + const CNetObj_GameData *pGameDataObj = GameClient()->m_Snap.m_pGameDataObj; + if((pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) && pGameDataObj) { - if(m_pClient->m_Snap.m_aTeamSize[0] > 48) - { - RenderScoreboard(Width / 2, 150.0f, w, -5, ""); - RenderScoreboard(Width / 2 - w, 150.0f, w, -4, 0); - } - else if(m_pClient->m_Snap.m_aTeamSize[0] > 32) + char aTitle[256]; + if(pGameDataObj->m_TeamscoreRed > pGameDataObj->m_TeamscoreBlue) { - RenderScoreboard(Width / 2, 150.0f, w, -8, ""); - RenderScoreboard(Width / 2 - w, 150.0f, w, -7, 0); + TextRender()->TextColor(ColorRGBA(0.975f, 0.17f, 0.17f, 1.0f)); + str_format(aTitle, sizeof(aTitle), Localize("%s wins!"), pRedTeamName); } - else if(m_pClient->m_Snap.m_aTeamSize[0] > 16) + else if(pGameDataObj->m_TeamscoreBlue > pGameDataObj->m_TeamscoreRed) { - RenderScoreboard(Width / 2, 150.0f, w, -3, ""); - RenderScoreboard(Width / 2 - w, 150.0f, w, -6, 0); + TextRender()->TextColor(ColorRGBA(0.17f, 0.46f, 0.975f, 1.0f)); + str_format(aTitle, sizeof(aTitle), Localize("%s wins!"), pBlueTeamName); } else { - w += ExtraWidthSingle; - RenderScoreboard(Width / 2 - w / 2, 150.0f, w, -2, 0); + TextRender()->TextColor(ColorRGBA(0.91f, 0.78f, 0.33f, 1.0f)); + str_copy(aTitle, Localize("Draw!")); } + + const float TitleFontSize = 72.0f; + CUIRect GameOverTitle = {Scoreboard.x, Scoreboard.y - TitleFontSize - 12.0f, Scoreboard.w, TitleFontSize}; + Ui()->DoLabel(&GameOverTitle, aTitle, TitleFontSize, TEXTALIGN_MC); + TextRender()->TextColor(TextRender()->DefaultTextColor()); } - else - { - const char *pRedClanName = GetClanName(TEAM_RED); - const char *pBlueClanName = GetClanName(TEAM_BLUE); - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER && m_pClient->m_Snap.m_pGameDataObj) - { - char aText[256]; - str_copy(aText, Localize("Draw!")); + CUIRect RedScoreboard, BlueScoreboard, RedTitle, BlueTitle; + Scoreboard.VSplitMid(&RedScoreboard, &BlueScoreboard, 15.0f); + RedScoreboard.HSplitTop(TitleHeight, &RedTitle, &RedScoreboard); + BlueScoreboard.HSplitTop(TitleHeight, &BlueTitle, &BlueScoreboard); - if(m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed > m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue) - { - if(pRedClanName) - str_format(aText, sizeof(aText), Localize("%s wins!"), pRedClanName); - else - str_copy(aText, Localize("Red team wins!")); - } - else if(m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue > m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed) - { - if(pBlueClanName) - str_format(aText, sizeof(aText), Localize("%s wins!"), pBlueClanName); - else - str_copy(aText, Localize("Blue team wins!")); - } + RedTitle.Draw(ColorRGBA(0.975f, 0.17f, 0.17f, 0.5f), IGraphics::CORNER_T, 15.0f); + BlueTitle.Draw(ColorRGBA(0.17f, 0.46f, 0.975f, 0.5f), IGraphics::CORNER_T, 15.0f); + RedScoreboard.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_B, 15.0f); + BlueScoreboard.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_B, 15.0f); - float TextWidth = TextRender()->TextWidth(86.0f, aText, -1, -1.0f); - TextRender()->Text(Width / 2 - TextWidth / 2, 39, 86.0f, aText, -1.0f); - } + RenderTitle(RedTitle, TEAM_RED, pRedTeamName); + RenderTitle(BlueTitle, TEAM_BLUE, pBlueTeamName); + RenderScoreboard(RedScoreboard, TEAM_RED, 0, NumPlayers); + RenderScoreboard(BlueScoreboard, TEAM_BLUE, 0, NumPlayers); + } + else + { + Scoreboard.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); + + const char *pTitle; + if(pGameInfoObj && (pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) + { + pTitle = Localize("Game over"); + } + else + { + pTitle = Client()->GetCurrentMap(); + } - //decrease width, because team games use additional offsets - w -= 10.0f; + CUIRect Title; + Scoreboard.HSplitTop(TitleHeight, &Title, &Scoreboard); + RenderTitle(Title, TEAM_RED, pTitle); - int NumPlayers = maximum(m_pClient->m_Snap.m_aTeamSize[TEAM_RED], m_pClient->m_Snap.m_aTeamSize[TEAM_BLUE]); - RenderScoreboard(Width / 2 - w - 5.0f, 150.0f, w, TEAM_RED, pRedClanName ? pRedClanName : Localize("Red team"), NumPlayers); - RenderScoreboard(Width / 2 + 5.0f, 150.0f, w, TEAM_BLUE, pBlueClanName ? pBlueClanName : Localize("Blue team"), NumPlayers); + if(NumPlayers <= 16) + { + RenderScoreboard(Scoreboard, TEAM_RED, 0, NumPlayers); + } + else + { + int PlayersPerSide; + if(NumPlayers <= 24) + PlayersPerSide = 12; + else if(NumPlayers <= 32) + PlayersPerSide = 16; + else if(NumPlayers <= 48) + PlayersPerSide = 24; + else + PlayersPerSide = 32; + + CUIRect LeftScoreboard, RightScoreboard; + Scoreboard.VSplitMid(&LeftScoreboard, &RightScoreboard); + RenderScoreboard(LeftScoreboard, TEAM_RED, 0, PlayersPerSide); + RenderScoreboard(RightScoreboard, TEAM_RED, PlayersPerSide, 2 * PlayersPerSide); } } - if(m_pClient->m_Snap.m_pGameInfoObj && (m_pClient->m_Snap.m_pGameInfoObj->m_ScoreLimit || m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit || (m_pClient->m_Snap.m_pGameInfoObj->m_RoundNum && m_pClient->m_Snap.m_pGameInfoObj->m_RoundCurrent))) - { - RenderGoals(Width / 2 - w / 2, 150 + 760 + 10, w); - RenderSpectators(Width / 2 - w / 2, 150 + 760 + 10 + 50 + 10, w, 160.0f); - } - else + + CUIRect Spectators = {(Width - ScoreboardSmallWidth) / 2.0f, Scoreboard.y + Scoreboard.h + 10.0f, ScoreboardSmallWidth, 200.0f}; + if(pGameInfoObj && (pGameInfoObj->m_ScoreLimit || pGameInfoObj->m_TimeLimit || (pGameInfoObj->m_RoundNum && pGameInfoObj->m_RoundCurrent))) { - RenderSpectators(Width / 2 - w / 2, 150 + 760 + 10, w, 200.0f); + CUIRect Goals; + Spectators.HSplitTop(50.0f, &Goals, &Spectators); + Spectators.HSplitTop(10.0f, nullptr, &Spectators); + RenderGoals(Goals); } + RenderSpectators(Spectators); RenderRecordingNotification((Width / 7) * 4 + 20); } -bool CScoreboard::Active() +bool CScoreboard::Active() const { // if statboard is active don't show scoreboard - if(m_pClient->m_Statboard.IsActive()) + if(GameClient()->m_Statboard.IsActive()) return false; if(m_Active) return true; - if(m_pClient->m_Snap.m_pLocalInfo && !m_pClient->m_Snap.m_SpecInfo.m_Active) + if(GameClient()->m_Snap.m_pLocalInfo && !GameClient()->m_Snap.m_SpecInfo.m_Active) { // we are not a spectator, check if we are dead - if(!m_pClient->m_Snap.m_pLocalCharacter && g_Config.m_ClScoreboardOnDeath) + if(!GameClient()->m_Snap.m_pLocalCharacter && g_Config.m_ClScoreboardOnDeath) return true; } // if the game is over - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) + const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; + if(pGameInfoObj && pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) return true; return false; } -const char *CScoreboard::GetClanName(int Team) +const char *CScoreboard::GetTeamName(int Team) const { + dbg_assert(Team == TEAM_RED || Team == TEAM_BLUE, "Team invalid"); + int ClanPlayers = 0; - const char *pClanName = 0; - for(const auto *pInfo : m_pClient->m_Snap.m_apInfoByScore) + const char *pClanName = nullptr; + const char *pDefaultTeamName = Team == TEAM_RED ? Localize("Red team") : Localize("Blue team"); + for(const CNetObj_PlayerInfo *pInfo : GameClient()->m_Snap.m_apInfoByScore) { if(!pInfo || pInfo->m_Team != Team) continue; if(!pClanName) { - pClanName = m_pClient->m_aClients[pInfo->m_ClientId].m_aClan; + pClanName = GameClient()->m_aClients[pInfo->m_ClientId].m_aClan; ClanPlayers++; } else { - if(str_comp(m_pClient->m_aClients[pInfo->m_ClientId].m_aClan, pClanName) == 0) + if(str_comp(GameClient()->m_aClients[pInfo->m_ClientId].m_aClan, pClanName) == 0) ClanPlayers++; else - return 0; + return pDefaultTeamName; } } - if(ClanPlayers > 1 && pClanName[0]) + if(ClanPlayers > 1 && pClanName[0] != '\0') return pClanName; else - return 0; + return pDefaultTeamName; } diff --git a/src/game/client/components/scoreboard.h b/src/game/client/components/scoreboard.h index e45b781cfd2..5532cf988eb 100644 --- a/src/game/client/components/scoreboard.h +++ b/src/game/client/components/scoreboard.h @@ -6,36 +6,32 @@ #include #include +#include class CScoreboard : public CComponent { - void RenderGoals(float x, float y, float w); - void RenderSpectators(float x, float y, float w, float h); - void RenderScoreboard(float x, float y, float w, int Team, const char *pTitle, int NumPlayers = -1); + void RenderTitle(CUIRect TitleBar, int Team, const char *pTitle); + void RenderGoals(CUIRect Goals); + void RenderSpectators(CUIRect Spectators); + void RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd); void RenderRecordingNotification(float x); static void ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData); - - const char *GetClanName(int Team); + const char *GetTeamName(int Team) const; bool m_Active; + float m_ServerRecord; public: CScoreboard(); virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnReset() override; virtual void OnConsoleInit() override; + virtual void OnReset() override; virtual void OnRender() override; virtual void OnRelease() override; - - bool Active(); - - // DDRace - virtual void OnMessage(int MsgType, void *pRawMsg) override; -private: - float m_ServerRecord; + bool Active() const; }; #endif From 20d58e6edb0751926d8d1911782a7cf97d120c82 Mon Sep 17 00:00:00 2001 From: heinrich5991 Date: Mon, 1 Jul 2024 21:57:07 +0200 Subject: [PATCH 100/179] mastersrv: Fix warning about unused `mut` --- src/mastersrv/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mastersrv/src/main.rs b/src/mastersrv/src/main.rs index ca2d758cd22..8bd9a934876 100644 --- a/src/mastersrv/src/main.rs +++ b/src/mastersrv/src/main.rs @@ -408,7 +408,7 @@ impl Servers { }); } hash_map::Entry::Occupied(mut o) => { - let mut server = &mut o.get_mut(); + let server = &mut o.get_mut(); if insert_addr { server.addresses.push(addr); server.addresses.sort_unstable(); From a0da2d0978ec8af2013604f37681f0d0d973a30e Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Mon, 1 Jul 2024 12:17:18 +0200 Subject: [PATCH 101/179] Support new UPNP API See https://github.com/miniupnp/miniupnp/commit/c0a50ce33e3b99ce8a96fd43049bb5b53ffac62f --- src/engine/server/upnp.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/engine/server/upnp.cpp b/src/engine/server/upnp.cpp index c8f4cc3221f..2f0ebe0a07b 100644 --- a/src/engine/server/upnp.cpp +++ b/src/engine/server/upnp.cpp @@ -25,8 +25,14 @@ void CUPnP::Open(NETADDR Address) m_pUPnPDevice = upnpDiscover(2000, NULL, NULL, 0, 0, 2, &Error); +#if MINIUPNPC_API_VERSION > 17 + char aWanAddr[64]; + int Status = UPNP_GetValidIGD(m_pUPnPDevice, m_pUPnPUrls, m_pUPnPData, aLanAddr, sizeof(aLanAddr), aWanAddr, sizeof(aWanAddr)); + dbg_msg("upnp", "status=%d, lan_addr=%s, wan_addr=%s", Status, aLanAddr, aWanAddr); +#else int Status = UPNP_GetValidIGD(m_pUPnPDevice, m_pUPnPUrls, m_pUPnPData, aLanAddr, sizeof(aLanAddr)); dbg_msg("upnp", "status=%d, lan_addr=%s", Status, aLanAddr); +#endif if(Status == 1) { From 22b051ce22e60d43aa216509ec157331b892ab3a Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Tue, 2 Jul 2024 10:36:33 +0800 Subject: [PATCH 102/179] Add winter_main_0.7 mapres ``` $ wget https://raw.githubusercontent.com/teeworlds/teeworlds/a1911c8f7d8458fb4076ef8e7651e8ef5e91ab3e/datasrc/mapres/winter_main.png -O winter_main_0.7.png $ dilate winter_main_0.7.png ``` https://github.com/ChillerDragon/ddnet/issues/8 --- CMakeLists.txt | 1 + data/mapres/winter_main_0.7.png | Bin 0 -> 292122 bytes 2 files changed, 1 insertion(+) create mode 100644 data/mapres/winter_main_0.7.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 71e625e5421..7116b33e238 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1527,6 +1527,7 @@ set(EXPECTED_DATA mapres/water.png mapres/winter_doodads.png mapres/winter_main.png + mapres/winter_main_0.7.png mapres/winter_mountains.png mapres/winter_mountains2.png mapres/winter_mountains3.png diff --git a/data/mapres/winter_main_0.7.png b/data/mapres/winter_main_0.7.png new file mode 100644 index 0000000000000000000000000000000000000000..51564cf4e7235482a2c537d1c6565671485aa55b GIT binary patch literal 292122 zcmYhi1yodDxIR1}9fE`)5`uJhhk&GnLr8;wfV9NWFer_5cS;Q~NOuSV(%lV8r!)*R z|Kso8`>k)SSqm1!+56pZzt4V7#9Iv|LOd!w5C}x5qWoG51i}D*#Q@=80Y9KL96=z^ z3y{idSskye!xhh@4|D$Wwu_Jo17MHv;1oI>r+ltVaaayk%~lA$nD& zt1>WHNlQsdYfDLMdHMb|+MQY$-t|o7X+Wp%$qD;KKJ@+%Pt~8z0qgogC04z=o>h}p z_(h43l=Th^^Q`OH=TwcNrlVbOjIkRb4Cc`)rpFXxX)58LK@me!_^!&cRZL3u&J3se z9jqWurDVXS_Ba2tnms|brM?9dL^(T!dwRI&4KH0hgqJJG!z`E>p!|S=~ClITp3+~LYl z;h1F5f%l5jWCOzkPjC~7uI_>mfA?{=#Ixr#R_B8dhy1|U1s5{ z$u*pjAzv6(Ga1odyiO(jbKZ7ha>9_P;n~WT>EzJ=nAYdS_x9?#b8I=##?0s&DunpW zv(O)(S6UZ3eMNjdkGch;oJ7i4Y%>)3QhORIAZwu*NVyAc%wIOO9|Y2!M68VBF#?HA zlE$oWyB@C1E)9R0Ca9F$u0J9=9qFgF?9kftaBES$gMPm^3-`!?)i^su*%MK}N6k}a z6hm57q~3s&LJV;R#g!0@rxXQ^wi$h&@?YRiTPdTz3g;fM;`h5L3D}1zGW#Su8u*=l z#=f~LjMZ|{%QHsF7ce1+sLa9ItRg}8rJRe15;-De~KLwR9D0c z$>Aw(Gx(6%2P5?G+{tL@#B8fnD3kt?l$BXxY|U6Dy_{@c;V5eL`^nFnK+ zzeT(vg1f7dfaDzV8C8CLn_Bk!t=yPdf4wnax zL{@*nCnlUkik#IauJ2tK7c23Wi5V$4XV$X z^w;vVzfNHEe~zJw;&Fa^XGQ>5WA8O-T<+d@gxvy&mw(`6+0tnXzilD8!JjbWFC*(U ze*8`hsvPLk&RriC2N>L_fExpw7InWU{Hu2P6O|GA zSO1jIa)H0uO#FnTE{$!!sE)nRvXB2nbJ~ALU{)as#S3u~ zv0S3!ewtpTb0>V7h%__kyzZnVfWcgsCJL85E=na+MZzbtj-4ybTcBBt)5fW=tzY4} z#Qv{!$!gLG7TkRnuIFb3QLux}d*rOhccp)ht3Ev_%B&)n!1&xST~HKi?^nB#0`4g{^6JL%hSZrUc<4@NqQRy!LXSEgZJ$6{Q22k>i$9x`RR(PxvJ46PAyzPFy0>JQy5J92p&+Uu=-+gLJN}a@Fc~;`4w*5)l1!Y*sX{_R zrJ!sLt1oZil8N-X+~gFPxl86DRg6lt2R@~d-Jklbm4tiW_AyvhAQC(u;+ix1b!Mz) z%SfyKS{o8E#6*wr8&tYX9Y0ZXe3&`1VSntx0Xi(4Fay+fVUPNX^nCacwCuT)U0T!H zAF5*TPU#1#o62lXLF2(U6K<XA|q~cOY9cr2Tse8M!th-??0P|H7~36NLX;EbW`_W_=1XIZYiJ3>?udybA?+V zcndZ$?OTpK1ZKo#{M@oKJ%|Ld44SD9Tw$iKX7H(gxKbBh81y>)Z*U+X|9s2)d}PH* z(F~lC+^)BYjYi&|f9!2E&0al0rtm|M;9s4puu}5uea}x&2)^#o_k&M&M4P=(kgAGo zTLcPI<&$+rdK}Wx;df28*Pr_Jt_#Bx6Pfzn=yf`m(J2mB2>ddNrcjiGdPJ^-5X>EM z!fgd_h8;p)sD>wEkW=9=-&F;JN=QU^HA_BxxB&3au(|kF)iIGxTvW&oGrag01;axG6^aLZlz@yZCMPM z>v4}Ld;E!?WYrLrG5d3&mi}TtTcqtPQ`jDCD1SoI7jHp#E>Ba>r0>mRxRDVhn`U4D zF6zHrt^jR0UY9*?ez<_z$*z0Pr>JS3TX=5#-Lw^w z`OtRw$qBybvQE+egvHc5nIad(w=2@+ysW?BTHyt(;67JG+Fk0bJ|i61I^s(mS+0hfx1}qSFS6FW*0zb66sI-t3MRjZOt128`mv}eYU;hg;&*UhW@+u? zb4It%J>!~w?%WQUajcp%u`Vg`KD(t8;1?gnru7TYbZU2;Ilu%Dm+g_16uXc@UyJ=Jo3SgkB{hr!W+%TisQLf(>4&a}%IsdOj>9CDxxxu~(7=V^v{N$=UiH2)& zpPQi$HN}wo9IUYJQJS7ZY8r-274v=Z$bxljdY~A)NiDZ1jZ~6i&<7B2-bddHsnbl2 z^AQH=3^G_5ebauLVrxMuu96_g&LzQ}s9mczGJ4u8gG8UBYyKSTw@FGCDNj@HS!7u$ z_IPGevUhkCBK5Rg?!P|eLRfvu>qP3>y-g^4H>-g4gEpILa-_q~OyTVFn@6JXA-|%@ zQWV2oYC&9s<6ppD*|EHlpNvxtE17XSxu#Ru4*$1*4MIA!Zo0h(>XhEyR0eJBIVq`q zvzJ-KR+?x`L_s(&PFg0%lO_4K`+qHt({;#B&Yw>IKSR?dvGE(|N>wti8iYbr!NQ1; z>{o?pCJAp{?6SNbxU8+;%r}gTK@TmLefqQYAorSnC%(I~5f;^fPLv-rLSZne&dQVv zsLfqHN&)J9ZQ|+jAT;OR`t12Oeyrr=5i{poGOG=L#fy}3Ttp(Hd52d1c1z|se|0wJ z%A{t)*#UR@zW~xAD>|FG`Ru^ln>dCDH*)ICwy18}UOL~0bX@&P^+Go9@VaL=u6S|z zdY-(t#d-sSaaR;BmR?R(#-}l=gm0zEN%t=~OALmbvBl&{_T)ZKO~1f<-bbU^669HpGvHU782Ko8g2TdTgHjuaIUzGE{O$Z^Ws?Cjjsqvg9S zTgunNbwlqwp~F?kJ{#qtDVnv>bnOza z-(OMj3kwFJcw(y_Q;=^{Z0u^6Cabg zf4S;&u8th!@sA7&dkpcLa;og3Kt0gaI$y^qf?8Ex&aW^&K&^ttQ3coOp+DL^mnV*_ zajLnD9oLE8UQ2GPGNu1r=_fE@nOmOZiLr#m$j?BE`g(*XQg;k$Fy5&-%wQ!#CK*FVc4r@j~~;CjvrY&G#%ApymEj(e{%Ck zhdQig>z8Y+^vvQUkL3~uIQZq#jpG}CZx1HiK%sbyE@r#6NzO=y0$xTObave^mfQd| z865Ba6;HRZhZANqR_>P7g{l7%%lYz@CTTDl+tPM%VHo8z_B>mv7Pts{u{EgFj>?eZ z<6;+hdbVY_=^3aGTt^JTlKp=AaA+K%r_mN+bj|A?)VStL)VS)xa{t)0mNkxJWbEuB zQSf*4i_3+fO=x4o}-b2mO`yjG~;@ z)VPo%eZ)=+cg&7T-rSZj`)QRgtyMpLT-lnxineae2-kz*!Tmwb+>vzz$L>%qhYF}7 zf)OM<(S5f!%le60L`nS-J9*fSsc0V{AfpQ9vlUtC+(JVL>&VF4a-qo0j~U&c+byZZ zzhn0_32wHY&fsOGL}fVjQJsGCCIFvPc3TtA(=O+TyT#X1Fo$RO&X-KF;mN=JQ2T5! znSUx#8<?d#fj|JpFYO8@ zv^-Y423z4(XvTnIq2nz04LZ=Jx)w1^wfZhAV*VRk;P0$PJae_kL)^vHg|mx~y=$V) zV*h`K1K%f=ygMaRdSXuY1QSh`*mZkZVb$xLn!E(dWf`YV`B$-{N6h0|=P?b=sgD)$ zPBHMhSY(5u`qJFno<8irqr$GrK<5e8Ph?M&p14qJU;B-kWm#DGJTBQT7^fc5)pbo5 z3?n+)TJKni4xHtE8ckLIr88PG)F~cGcZj5DKbn2+v<^3N+Vc<)R%gKlrr&{YTJtIO z`v(*F=-We9Vz(zQBsX7USn-}MF=wl8_?TMWkBT09l)n!9hLcB}sSHkfgQio9LoI0P zg_l>#K1aJe^uym$2POoor)nv%FpTzJSaL2Qe^DO`vd;)zY_M9i#!$m=EMqNoL~|@R zl!%-xm7@#&nW0Fg@WDO%m7bJrxr*7bl;1jwyMn&9sQkCtkbmpqh=Tohf@nhldHmwmD@kOeOzm`%&5g>MmReO)HX4yH=hzx!s<+2E^0(7_Srny}B^oyUs@nfV7E zpD8Y-nD=!|8+Y08gAWdwI_x2{vg1V2*O>hfHi?)h#3e5-LZO7Sr%O;>a?PeeXWzr^ zr|y44(R*9sd8#8Fo#duxWW6rS`W&K6}0hY@+UKFidYgG@H44>n8)IjYZH z`sLoLDiq&e|0jo`f^^V}E;nGPS8@QUfN-i6o??C;*_*D+)zvk@0g;+GBbHidQ@@nX zD(@9YO*MX;u7lhkeXf{&8VG|ee)KH=>+gGSRJi))%WNf%X(Rp~>c=s3Lc*!#Se&38 zr5WoH9aV8F4vZll)al1-J%Z|mX+!2lv$`uW7|4In3*G{!!1;N(SyTGA*o;|Id{G**i&1n5?UvpZndMz{#yL>LUfrTF*U zcgWW>d!Y)be?W>+g+C)?!=|XR%W!FTuN%T`;%$VX!GT%Bp6X0Gfrm6qHS;kFdVSY< ze?+mV3YYMTo7Rnqx_S)v6gAZ;kW(xpsE0$4t&AWpsLmsM>vMjP?JnH0Wv`Kojd zuuMDh=F;arM1OPwP5*waj5RW?N~hGaq=6p0?uxd%7{B-7#+D~yx6C6L00eBB6FZNstP=%){_@E#I>lQAMOG4 zq;fd)Kf79y8TKtJ!SHfl+VemB@eT)bwUcFJw+;f%a_?}yweasa&yhC3;yNw>a!A`=>I(>EG+Ib zvs7?d5VD7y*|+MIP;maJ>p51eb&zq)^BH=g)g-tjZ?Y3b#FzGek9d4KS#=UIADY>R z3?@gaU7vvQ0L*aCWTpMsTL-4=x3H4WvXG)cpQ$j%ltgOJGDbxYD1)Hxq1Dr~71ziK z4#W=WPjQ1{75da3eaq9-pL{}Ng@)w=4KY&tb{-x$J;Zb8pNu_84Vis_Is!b4!}nb= zQh~orr!kZMCk$}LxDj~sFC)rOQTUq?NQ9M5SkAXH_GSlefyl&@5)u`qtwlq_BUWM{yo84cdDWu2-2JkTs2qL z%>5bT;gJ%UjB|<+uZQER^Z#V%^Ef^PR%v4RhnKm2%xE}VBYhELS-{E=W4S5H9L``o zmwfkFirZ?5%(XeD!9A(~XYRbzH;2&=>n+D_qk3YK!LpF)#w8Cf2+&A@W+^Pv(Lg`+ zbFnSZrJ(;*kt6G$mU0Ha2TDBvyf$zO>MH1xk?2#3;d}{f*|~Ilk z(NjfHz+HlAD^(HcQ2ZGi;{gPK(_8%@{Z zwswo-EvlE)i8uKpVF`@5%Du>rVpcrcCFb0b0&ee<=tPXMb1K=+6OkMui}$QBRhZDE zbH@0UnAx@DV2nI5#zBWakbD7SN&!zK41Ex9IW#UC#_x~ek}#PjLbu-DPEXI=xoCD< z_SgbP-XbC!OG?=RxRc!EtzxWpGO84r;0{o(}D}{sw?CZX=kE*YTfJ ziHsWHOga8%Osn2YmA~DZb$N1!KD;Fh(JGn*8#NTpB+$q?Jk`~$R&z5C)&%QP&slY7 z#ZRnCTMObN3`VSsfUv8Fo81L`uXuVP{}OBldv_-CeLLu%aSFnIPukW1Lm%&|Q?r(} zIproMTF%Lq2!{%flD4kel<~acwyKdveOjn2b27u|pHiK29sBxA>KOe(W9BKBQ@UP0 z9%`BD;>$ZQ^?9ORtjpTciJaLVF;JX(2{0H&Zn^u>ErmE5q-lZPIy?zctk!6~m0mLS z6M_b=8gtjZKhPl{;GNIOjaT{_gdLRk15! zU7Jo2KzXGAxp7ngQ?iqZuhtN)|K6JlHV;QPm;3wVEwU!4+@D2dGq#`<`Xn^}>TXY9 z+5G{MEdDq5d{yfHSCqKW9u_g!~{bQ(&B_YTs)pPrG3&hCSiRn&)X!J{E zL~?dDf2ByzO5eMQEH=N;d7Ew6<4Q%J!cQ0!ZxNqeSV-n7<}hR^bfcM3h^#$7CqZ0S zGpf9+XnuJYSMWZa8AwK!5*}}dck~F6g`&keWxRY+(X}BzWH=K+yJ72{3JD;&a8teE zKX2cq3uC=XIQ<(zI;8$1M{9kIETJ>IbP#(}zm*La5%0HdblcUK&_xF(b9$#Nt=w$` zz9HeA33y~qcD5NYC!Uc|%#Md?VAO6dsQ$7ww7+&=w9Rkx_10^KjWrOoE~fS2CFUO@ z()HdgmRX&39v}fj{`#$80kS{H$#G8LAv_6)s`kWw-%67T2#E4CaK2s}*GYC@?t#ZY zQ49-JUbuoqbg{+&Hy&zgn%b2!4T7i61{Z8Anm?dl8PS4?+Xn>+4j(JA*=)bju}{_D zgqY;YZwSb8x6<8|ccF0o@I|qPQwXPco);4hqgSCr(GYLexBh({GDg|b!HYPUwi`|n zzmHO05H7Zb2gp{#5ab?y`Y}8AlGlGZq8Z=o6V`F$6jmZ z3Sgh&rW{7lPs0k4Q_X~6t@^4zD8!;d0*mSSIZUA2 zzqfx(gpV5-K!7x2#QpB^Hw|~f-yZkdBFAZoRvCqVqX*Y%RkSK($W~|T8c;k+?h@E5NlOp4X3O}ZR|k9WDtlGMP45VJ;P_!-r^XRA8HJ|L`&u|K{B=$j1d(3s-}ifUaOY0UAf8LE6@!MoQI zQy&VxxK-Wqm&{a^x{^T=bzV+&Ubc3&KC#J6M*V4&zK?;Pj-h%B>kW@S-@4jBKp=;y z*K>6_Fucx{-~8z@4Hm(Q4`F)?209A2?`Eq|at0z4x)ul))H>Ag$_I6Lo@;h-zINNb zW^}V!`mWt?9r~+UD^_iESW+LR!|JXd%aA$1+c+}D74_l6|PC)>5Y<;X68wHy=G-bA>rnxcYEa3^tI;AGXRQwJ(+vARfQ5KmkZ+QhSmRy%siFg2Qk?K0x(On>86!xDno zRe%45A_}1xU8tMZ&ZRbExdhf|Z*$zdx~uOEY04#0@v!r@VpfqgR7|7iat@^$LivRK>?TmoqDL)9sy6*Dk*jTvqY*pMj%B>g<$7#-uO zm__!i8A#pOGoh!PUnAFvO0lIw66k_YYxAnDiSlP&$S?@k7EuI+cv-s`c<>3!tHoF9GYT+A7^`2HVISUJP0 z$NosBhVeDeq+n(Bkt=(B$4XQJ#@sopZuye%sq?d6nlc7!0nIbCiPxR?D@M~K^caE7 zeMGqq%nvMGn1N74^Vr$gJDfv_%UGFfG30t9wDoe!OE~eiw%&M6|G-_W`bB#m*S_n* zVJBt#u{bK@(fw^n=lQj81r7A(cFp`Ghwm{3o+*3sU8;SvlXa$Z?HorddH4uK$R1%- zAZqR76qA5~lDl}S@S}kf;3#-R$7ubso+C%JUW${})()qrE=k{np{auc8POIYclydC zufi**CT5|Ic20kZ2)TM>kjp#5ZCudPrOxPN)s4Oh8RMZ#@k&!3?vg4O{}!_<6i27& zjeZ-fTQ{nV}tH9)tP<5mR9@CV3T0zw(EI^Q2bU`%$RA+QS^4>70Q`oCvV{fp<_8YUz#x+U6O-XH zYLOKJoj?;$$uFsLHwPAkXtX0~s4$U>*KDXq>y1_JH1w~{!UN?6Ndq0uFhHc;diikAHI%S!hBGnet_~ebFk|bgaxdfp zl35X2CkSD-;`GZ9pkBz__w{*Q6{U)vZD&3YxDWE!Y)zs@y{GHkRVTSIqmj~hYWMI^ zwc-#CXby8|oNx|u{m6#TJ<$Gh`4X`K&IHHtzQ?249zlZR)^m+MkHhu*F)1ZVg>o}n za>!VrR^?{c23Fno>;LiJRmRV#zHxF#^YYH6mIY$^;CXhH1V73fXr_$nDbLTq@Pyw~ zAoabG=ot7)XRd|x*maK2KFkw8Ej@QF@7*P{81jd7z=RRw>6$+5WcGAr@q3ZIb>s7w z07K&k;g-=duhT=*>71dUlw*ELash4S(MHUyl4eTtWo?dbxa zq@V7O&YgSUN{?SkMC9~`Od#Brs*8tJDua-seJqwiRVY_$rGz#Z1FS~I@)7n04%2T@ zT%1}~KBzWx)I?T`{=qTPV$g!s5v**KmcfYe zb1^G7OC6-@f*#lEG>6lW4`~F;g{zAQnN_2CZ2NX@SHlkwhyK@RM|6n5uL&5$au;a0 zh{jObe30?nQE2#&jgTk(+@t(k75;AuF-oWX*&(^LZseevlpi03dq2)H=hnnEb6PN| zB%B_W_nTpTYR7ot`v3>SpK-ZYs+&`5mtpHj(aA)qfZk|78=U{ZRcL=iQn1!0wu+PF zEIm$FBqON4WpmOR+v&B5%WPxavO-NCtWN=mka8@_-F5o5__}t(;yx3y-{x)}${VTI z`6=u_8iS~mcHg*;BEN9q0-3xmzV=!gc!gC15O5HZn?a{VB-bs9M#9-%Eom-lsjX&k zF=a=^6IJSi1_!NhYy?Lmu9FZ6uE+ujT!O`(34kdcB&Fv-A5*#1tFn`AEm70M|&1#m$!N z5cOQyO)Pq6jns73xu@+<;VaZrcX zV%f!M5zZ&9K1=E8cvFdq{(u4a)um65JA+2J7A2Z-0THoZBzeAgqrf9`S z@NQZ(_jwKE??YB6LT6bSZK$Yh<@?|2k}1%uP=#!hkts44O|K@Gr&eza78Um05noi$=X*rq`e0cavddk8AOYw+&U`~L z4t7SvcsN_ZV*Q1`XUoF)ii`8g@xTdhi7ePh7^3XO{zkYG>Vg3(%V}}F@5>oPoK3)A z{`jY67`!AD>xcGL?S02IFWZD^-FoJ?b!I(+;-;poxKn6Sq}u@}!REfHn)c^Tp)Q6& z_J8yp$^-lhH=)?(jKrz+BFVDVRT9>3 z=uL^AF!2?`7AXlkzS1sLT`Aryqncd$|CgFer&BvOlC5tZ9r}sEJqR ziF#_yGb~Q4JH`^JCxfT1`^yju4^NlpMU)<0M7zH0xK0Q#xi&x^LNG)P;C;X7;Ip%HA8vCsTkW0cTKxz@FB~P$2eZ(fe(?Zir z*xGr-sq+3mT8(P+vGc-%aLOr$j=s^R=v0S<3n5I}o&*$D?GSF}~^ zct94JJK=oqd3MeoZlR$z?1EhO=8iG*s<0<6OYI(I^OZI`w{)w+fQC6$^_xp;BaYB19-ds4UP z`mqtA?U&DKw?dM}?GEt>fmZ*>zuVCB>RykSs8839jc3#6 zV?ZsG3rA!5jJo=knoZJ`sjZv(Am8lN7{;p6^w!nOzM%$go8MAwVNaziqwn(IT0)Yy zFN9tYW%UZ3Vw;A0SVU1OOh8!P_N&DpgMH=@7Q`iC{f?fT2cSeI8RzbcDogYbh)oha#26+SqPvr;w07f=q438Bo=MS>I9^foqv-7t}iVR(6@?XeJwG+ux zVIrekzKR12OC?Cztgh#YZa|Xy``a@13DZPw9kRF#zp9%@>MS)DIoqL$;x8`dH7Y;v znc7;e^9}A6$D>hn>3*(#o|Rb+zY%YAkFJ)3QoJYJN+aEJ!-t5qlxeZ^xtuY$)z&sa zC_pAtd}=`s++)9Dz>12B6BmC-VUau1f-O zFK$b50sCNgLPO=#UR;XI+!1^AU0}=Vv%XOtkr+Zp1D7ETASG}D!Jf#X@o7I=q@#*$ zae%A&oLd5*paa;zX`hiZ>-4<9`Ej)9wyb2W9f^=58Jl?F9aT1tfN0vR5rqQ~)v>tiWn=ml$`geP|k zO+WtIK#ReG$t*1?U6*v2pa!F^!Vh6V;C4rkyc@VSvS@qJvi}~+gv(jsJED(;9p)DG zXUc?Ucvf^Tb7}hiqtrH>j$2|d<0s$FX!f7Y=5saUwyvKyqRCq6EjwDC2aGOXtkTm` z6yR|-?(WzU{e4Z_r{-5QqJc1O=?SM5rCENQ0vsOWHMe@&;H(@rH=p7tI1K-dIA=Tf zRw^&aMl`gtmmX8SNJ^|h1&aDF}RVTV0}JP$DC-^DXMv9m!wjT})8+knSF&bbO}f3PZI z{>(x zir}Tk(kLATddp{I+E07yRQT#$Byu?aggvp@fo0{Ip={iSJ`^bqTsC>sbsbw+YbVZt zvrhMW4VXEE_AkZP9%dUOBA_xFST=?Tsm8TY0JkQ?B$IP^23#oz{T;9Jd%E5gMjNm@ z9CXr=>EE-!<@l=T_0i`%~R0 zGU3~^VaAcfu5V|p7=UN3=XkbfO03;#sJWeyF3ds%)fXD33>@XRx<187g*fPa`HtbW zhq#b){ZPn;_l@9@2o85S{>H3b+ubI9o5!JO$*LDk)$yeGo|$`Jy73*e!Ht*!PL1Qx z_H66%X7+Xa*J>%>6x$%VRpHXI0W8_>d_H+r#@L59VHQ=F zg9_Os_FVBNI%(RWUjQhzU|1wTwjQmqGfr1mLpKYqpb5NUh_E- zYr*f;^p<1Ln^Gi*4nMH^L+BEgzzJRH3;Y1t(jLB4^91mzF@ZIdG!N>xw`A30*1SN+ zj1RSJS}7rL`#jd4E^1`GH?prP-<53p{8U-?V`KcL#pcxfAbi}6k~*Y%Zgdtv{vwxu zV1c=;f#%~E)?(V%O|s!zj>Cs_Mb{EZ)eFg*wE~%oaZfz@@xAQf-Cnj2xg#6{X;@*3 z=Kw2QSQ2*|i=HPZvv?o#HTb6<^6*U?WPA7}-x&`&;+77zR{7PbQ{S^q}g~YTY_(8B@eyw2vL7f-5>WL%Yc-?7C=H9-=>5k)#`g8zc*NApqF!!;hEqV7+ zX~=B{O)b6 z3{D5L+!HB`jaLeVSbb&89=`8f-E;scnqe zP(I^M7_%8D*49snn4spn2qIo1Dt%|4#I9Rxv(2WL)yMs;rElfBJrg@%+eX=jyK-#? z;DZc)=xFdM+DpoJdoS95EN4BH2zE)}1(&%vjpiQ;FADQXkG_OnF)e4Dn~^Bo?rw5$ zc67i_LpD!Os{%GtWfa7-u@q$W=%a*@mzC^zCt@{?C)OaHed+$b9r#_lf90m=<_v|| z<{nG#`fz3m2orc^h)?Ui`-kv}4TiF$kQzA#Q57oO@2)fE9v$5Pp=~dn#AVq_rWv^l zUcJu8PF2ToqKNMH6>k0eOtIF!T${A_9|0a9b3e1O7slonO0Jd*t@hi7r9SRe>0VgC za~@5K*bHWjxn0!j9JKG(9A;N_72th*ddY(TAFwZ-2l)m`UG>np?jHi=HNb1a0IyLW zG`r1&HeNpHq57PW+wu}$4eU&R0#%!%zI-v?jXI*X>Q|1R*g$W|FEpjkPp-S`yqvkBK79zp z-_p*a%ProY9)|=GN!}1&FGEo^RbMNtgi|pc4tGsUx?imGbUtw9`22M#;AO~Gt%ja( zUmY!|3_4**+qvNnUoG%PM-WACIn(%7ZUbaI(H(BJO>f!;$8#h$-EVm7iHZB6*wRn@ z!kEa%`>;V^oHV(;2z@GxQ5yCn(JB?c2rtIdmU(>=v(Mr;|kgM{A&hZ{WdY zFIt#6_TIQa4lOOM_YzOQW>vz_P9TQ5uEe5(IhUIHALPNc)2^e(8+4%FjgIQ3m$evC z>0*8!i_P(gJdwF${iB7e@EKqsApKkC+buDs1mEgFHk#Lbklg-+jn>GYE^WIHUFVPb zSc<(55E$eoq3Fwy>lMHCA7)(|3r1ew>;Y$hp}*aw%|^=E z1FDWaxjXjed(jN7y-5nA!oTztm2$zdWITu56RUU84XNr1|=Q&Aq!MSd~9DMF*J#dUxXwoX`5w+7MKrIL zIv49nWCZaYxzs_u;JVX?n`utxHt)xCm2SYvPrv3Om}NZ+de)O+ zZi;UFp)gxNK;3dQ38m@`Zr{n@&v)8TWWe+747VWTKGcRPfx`H*n&-EMirJok&f6?C)Zkn-1)8h+KTE-{F?A=f!Rc?ez1EEJUsSj9P~r zv;Eea;`I|DnQv_$o~|Aa6QC|R%*;Kkg&9<&<5>q&b&Jlf8`kNt7|}qd%R@Zpn-Qe{ zcuocVD(h=>Nx7&?GiU!?0qvI*&H=i}{e`(%d zXg-Y%Xow9|G;fLn;q=6@5{N-v5-eFX6Ne~nlGkod=Bw@Jtd0cg6nS;_KCN9|j_W2@ z6p{Af#!yu35h!YtYlVJ>vtgLGZC-ugXvlBw6SRF-y2@!#UOn1bU(q5c({C1VztncK z?DkXTi=)xuT5Y2J)d_R92AAp;E60WJ8~bhSPi*VXZ$R}Oo2(2t=%zA|m|6;!XG^tV znyBctytl>yon9u|zYH@|aXv;V_YZ4mo||Y~+RYdvdomfkU1Ya9c8Y^N}0qfe`2>e;jcfD^K_*=AggHWvU< zZ8|?X`7KX(`^!q8=jZI#g76cWE7n**tMdz45QzCcHWg! zcOZY&9L)$NXIZU>@YO@G7E-0KS~Lcyg#}9;R*Dalyp}%t=m*MGTO~E?f(N4u{CeK+@oV$>n~vLi zAZwcX9|@MZXJ|g$neB85g~7e30i>&u0KsbDSyS}T;9ych8`=bk?eDy&2{`?^#pu$# zx+2kZ8!E4#5>kBd5!NDl;|!&#bNcT1An^SZp}F`a`)ckLStt<1XPakpWv$XDO(&+( z7x;9&yxf=*p|H3H0@dTb3e@Ogbft)%k?EG`EpV^aMBYtV%BbX$N&uLPGt zoQaHT_~GUygY-!dJs>6!D8~os9g{0Q1H6Gk?-LHViHbL>1X}yBligz7h8$N4koJ5a z6ahuQ8s-;Nt*_+Toi4CvH<)U2IH(3*Wb3#<`N!{-sXRV@zBQW}`#z(uD6#X;mmFOZ zQ03>}LW%#!1z>oqB7ox%9iTW;HZDs{973<#ztPW={qtOs*5`)8`(En0(u<%W-~73c z8+50yZb3s)g$sbx>l6wvGrb!UYSj}M_w2ZWX5Ig~woj~eoctF;LH%?+*N?Q=GGB%f zeFxg0i-uR8<}l}bK~MdLG4iLmm-Tqi`nk{Hi;7*T%wINvR?fp~V_eJIn7*>hbI{exD&QEn~H>6+KnvGR<+$QK#?<5T4hNC)|1PwQ|2Bq1YCHC zB_(MJt{{Cc;*@mc@a7-hqgYu=41AUE8AdxZbE_XLTvJReE&cvhJx~?4K6Oq{uT}51 zh9EALGqGA=Z#(4Zn{S)NnEQG7U0kvNAm(&7U4$M@eM;1QB;dIH+))&Mt_{4;6L82h zn+|$E7!|!FAkUL4>b9lJ(VFrm^QEdjm2P{| zbK|rsr@{Nzl)-A6>YMkpq2?9~!YPjN0}jWdd_}in0jKkplJ^(dH?o1YyVUa%eL~pR z?=!axcJ8|?Qvam1cgd|oixysey1oBVkZ$gX8#sHgc^J|+3=Gq#FzMm;Ynky&F8%uj zplp#+j0s2y^$!0QoYGFr@;x8`Qy1D&iI_sejhx$PC9+!xy{aEtpj(N##y)P3l0m?2 z-cI@2!|^@^nH+&6F5-S^5(AV0gDQ&DK`*N{{k}-~@~CT$=rf1n72R#_U1#==3-O04 z_TqCtKSEASX`W|0`(?oHaUA*PIm$cC<>#;>ZMe<0Trlsgz?q-J-&TG;dat4 zg_(EuLNkfysy`7O@|RNe;V8b`-U!<$Z1Tp=QJzBRL?(O_KGLRa6un-)d1vI|F>NSe zc8T6yTFo_AJ0{snx_0|mqcYSs-57cl0GIlX-99t-|7g0(sHmc~Js>S5T}p>^cMhF` zf`D`hNOy;%w6t^yNDd(#L#MQK44uNz9pB;J`>nf~?`hF{TvM@9AXU6DX=9$(quF5UJ`>yd7LU4)u-} z^&k?P?>TB~N^55Rl(#}9^J}?b&Sz{_%V!ch*=MvzE6t&m2bmHg-8Vc_*S_tlW5oiS zO%ZFgk4+P-3CBjCJ3$vc*Cye{`TI>--9nPQP zg3#~$u6aXMy6YM^1^Ty?;U{Y`2j!LJ#z{&UeVO@qm?(lGBE8bY9Gtu)(z9-OX@90V zltm8VK4a}m=Vzs$W1k!!j8&gO^IMiwhn2N%5f_~l0~S(dq#o1_AUAv3A&uh#f4CAD z!K!{Ol{3mX7E3u`OaQL>KI&q|=SDZBYCF7rlk*s&ZR8to>SQB!;>bI6eT}qp)YS2S zBi1U5xxnG#VSjcCeDJY=PBU&&1wu88-M3(?=Rs`2;H>dE)--=w&bc3OTXgPEdA_~JpwLR*xSyq z%Z7)OKa^-ben3OH&rHi&Z}%C+CEu0S((>(G4ep?ayFZ@5AMH1ae3U?->y>u_N;Jt| zJb38v6vJt-o>q*bK*t_WYhy{U+r)rNRj9=AGz6&oaoj)OYlc5G%gsSH8ri)z9CvPQ zO2IvFRN3!#G`s|-UXR<0u=Ryxmh&rF&-()6h~C=+l&?y?xhtcq)|a}qob!DljvsrE zt3^@1TP*6g`G<#Y@!j6u-7Gmg62*z1AeENBUf{Bpt5!F*u#S(pz*6b%sA2PMjx!eg zGcbTwfWLA5fQs`0`*vtBbtr#qB07-(83l|GSrlU;f=2E6w0w0vUn@ZquabM`Iy$Q6 z^!N|6GZ4DcqMZeY;z)alkYO1+(0x0MK&-YSpLMHdiyEGVSN(48Jf34Rddz}2k5Mxq zipg6`K1 zTz^bmIDb#1!C`r`1$NECKchXNnXE1tQpqd`HeTF1=&Jd*07nfyBR*RD0KF6%HLwyF z`@*Qyi$~ddhYf+AVw|~nXb_;GyvR(?Hg*RxHt!&+C#RQpdUy|qrxaGnU!Xf}lrpsn zfsqQnH+`>-UcU8><~U){kL4&iQ8NW{fe@^H)L71ubig{`1r zEZWrXPdOxL;gq12D|?{5>AEXrnPNC@k7}jOIaB}^5O9S|kEi&K8j$0BT_n&%5J%F> z3<)j1i@|qd54@Cj*ZmpT`Mk1kQ};^Dzt_M1x+bW@Mwbb65e6EL@>Y~6^(r^Emx9wqTmlYXH%}&8}$;l|et&cyfOS}I5dpo+~^0jscZnAy8 zC+1VshUA)D1(P5BttZ@2p?-0lQU4)hC*W>I)&I1cvW8P4uCnyc9~DQ~jc!+-`pB_^ zaGM$NnBj0XJPhi=8^{umphj=9vK&fizmnbWq(7Po4Sy&8z;Y<5o+JC|poy-|ywe8ua_ST`HTXm6CRA{pKzUS5b*K>^G zox5|Rew}G+{-c;UzctAw-1So?z3drl*piKwaFk!ZyuWYCalD!I0p@6=%@3v{VE^5U z<7CUQBTes*?K8(6frLm5t1OO=}8cQijieSuryy(PJi_ zf_h)ESAvG!KY5>4LMl%;DDT+>AO_u(n8&*>h<{{~$WFPP_cg(=>Q->pAIjUVFfY?d zCAHqESDQN?j3O$tkk^%;PPB`w<%sl;?~+JMOP}NPpoJjrrpHNg>STNbsWT^YD$`?x ziZ-8&vpQSeg-=uy)6-O5|pukC@91OozT=@S?eN-0;FCezWWTZOXzxBqJO zq27dA&!D?bOFTMBjOD=PtaozsI;o4*uH=Q`24EvuTb`v=MKww9KZn$v!MIO}- z`%?cNk0mK7rJ1LBk};D469Gzx+iT2js+{5K>h@7!&rxS*fFJ~`Fnl20{DO(oE9l`J zIkDE6PQ9t>K0|WkOVZzUaP!j{lMMcK|3Z%t{BagvzfDNK#2k>SK1=@%(l@@>1-oo? zO)j<>2ild#WwS;b`&%r5l2fil403{EVsb`CNozXgz9ale9#dpJd0*(%CwL_gTI&xS zmJLAHMUKmm>F9v5GNQMduaIo}*A^;TmJD=E-NYgenyHYcYKuMp;ZyE(hErOLYbhW= zOY!1DNFq>J3dN>B4UPm^$Fu*iC5W`$jFygStzpYBEm0^@f5z1&5syZv3+Cadmq7l+ z>_OBKuA4vM=*O45UtMO%m~B=SuX47wEX$8aij<#V{yr~&DokRv8-7)=CmagSR^g7Z zNRt$*0nDI2Ih3?C3febt7s&f^eV zf>YU=8=86jueRdv__aGYRpJ<^fJrA4C+G~tMQNGYpB=5fIr1vekx^4b{IhNz(x~N> z=(pj3_7pa(bk*1r$eNfljh3Wwg`t>5_iS9V2vPoxTr(m>B)db@(vs4GqXI=i8x0ay zO?}IknIO<{3{Zy#F8O^Igcq^d^K8|8W<&^-bf3w2S$>bxYx)RvH3+|>^#1u#5i*ZZ38^ z|GGZfEu;gEgL@b?NgU;}|A%xmQ)F!ZY{%n*tRxaVXT<-0N$IWRu#=OF*JCqS7in_3 z=G6;~FpF9GP(6K})tepvuDan=4T8|TP7-3c*syvlRCM4<(?#8b>mEmB@1xl+MBr`q zGA^>QwoG8D#t#+Cv>YQ7wq!Y5+61P^_w({wtt=QA8PEz2JX2HOkdnbyw*?dFv$gIj zr6}Y4{hPnwUrRwVg7jUyZ1zjpmL^Vw2q8h#?Be&h#iN;K&fd+YuGdVPXPYiUDMUn# zK6ldghAna>nqUort~K0Ro{c|hF{wM=+WtEOt5jblbM43BgrG7MsSB-|!?+jFr9+P| zE$pP;~}dLldd;hQvm@> z^wDeysBD!GtNtu?b$#dQDPTSg)A7#?7S)AD$wnEq|{zlW9D7SYcq>((r6traM0&Qal z34|XP%t#mpT~joLm6@|>6Gu{Ie|<@k?5^Zf?WIJ+#SHs)dBG(p+Os;&xq*)lcoFt` z+vinPY{0BG|0p0zhzA&1QX0p1&tQ_4^@j2N+rv_8vhEW>fP#-+-Ev zP!7M_sTkE=MTAvLNc+%XXsEkDf!%KNs3h-D*q>0UJ*l5-utlVM|67{)EM(9y`bh!w z8dmr82zzv3acFn(vhwqLG3y32BW>r&zu8!cqBODc+#Dy5O78kDsOVFIY0VxpYOixg;>8C(hQ1Okt}ysp*oWWYZ^&W#GxQs zf3Lf~W(7q(TJ8Zb2V?E(1`WwKBuI*84cBjivojEucx+pC!Xg@c+?>i7>?WMSm^}1- zbaQ|hODQa3qcORY+OuD(Q}TNhj>I3ccfOfG5%rselXC8WE9^0eD++;1gBP+Uxe`P2 zM?xdlbBb1Rfoeqf` z>hN=A8vV0LvSB8z7bB)+LHC9c7jp))y-y!ChEPIf)(_FsuL1V!@JRKk8FwAW1_kE+ z^wH2J0x8VoZ*1~GGu?aAZDMU*-DRen0BSV(0^iN`7rvXFs6qj2UG36!wR^nEQ7>6J z*sEKA4=fB}01_=2tM`(8fq_R9zC3yLB6j2Z2;qSFnYpu9 zWG`NkZg#!dC-)n&68nnuxrC9p{0XK+9v+pEKb(9#!+-vnsh%G^$8^2@zUL%dHcnF8E?p9oYTW; z{>0JFMc25U#^I3b->qb)V5ps5YR|dBXWxoqWJaFHzl#6n#a|JoD{O3=V7XtaMoa`s zbnkWX1_^G!B`I6JzRn4Z*}jqC5|<=jB@eW)$(#(rZBik}w=5hkXSY}cTJ$rp{!o`% zm1vv-AF;<4&xYaff1X3Od}l!d_=sQTJH_(WRuH_+T9E%{89~;jNJdw9mu^S^%blhp z#fl^j7tvUkzl>b*{T@Y=Z=UEyKjF2nIO11lb7j$)vE2ba{WvD;s<){Aoo?*pl`O*@#WK`a zU38$LqRPV~GJIb0p=ZOXE1oIdit=k5A+;(rHEfmv@YIfDhn7?)z=D zg$)a7(DqVD%pGJxY!H}-K#{}ExWW|57nV3v3vl0%l8n+{h3#NgzM6aPLfsS#Ax zwN0YT67q3D%+m=lP(n?C2{Z46Q;T)DnHM^WBylOpK6?Y*B=a9sa#Sfq z|5C?4_wGTQpCRL;?@3dRKb zi<$j-ZA%q1M-Faj_VFyMD=Ti}hb<$bCoT0C({I{HCx%yVIF{X4R@nNWJAyHq;J`Mh z?ul*7i6=?y6wpj>g(tq!VT3{bh+uo^U>IEb*;DHoF$*I>ndA5j0m7~1=9AXyTAHdB06lnW6Qg4=kMtYbyHRc zcSChzLxaY-)%o#sk(lPAy)6vEU;iM=`$;Ql!LP!zwJN`l?{q+ogab4nNBqbx8Lh)tz7(@17k%ePsLbCr<*11}dB$0vP_y6zfh%KGVgNI{&+_ z`W@LCu{C4doUw4XAk=gJoVc&;;`gY(0_oyiX`j!=PhwBa4p&~qUBw6BE6-e@g0&L! z5_N;i^u>c)Ud*6Mm~Y;<1K~Nq#=srtCCq{77c9cBrp0#2mA&k=Pb-F;BsMchziOg* zmzLV|)#Q~F7tg!5y=j!=%HPq&a#ti zhYysi%i0&8!ncDYFK&sF{kweZtll{N zJA@U%=SvpkmYqt<_3S(j+e&9-$vcZk_W9P681C#vk47GkkjU;(;C?hAOcIo2cZ+>? zRa%)P8QV2YwG~)af|V;a#TvOKY>UR%+7gR+QmbCSE@G&T9(wOETa%r&${sQo`qWmv{_IKZSu$ z8{Eky>-d?JRMBt=X{){j&SI@J;3KpKJ3=&cZd&F$AoC88Gj<;ocefXvue&7M;N*#3 zTB!cbl`hnH+xKatczdh|%NSW-fgK@Jv^1XvUs!2B4M(&d~iVz~?P9)L?=9>J)VJZVo2`M8&e6pk`HQxI+Uh>^MCJRVv z(KP9!+Y3+logHS&N0cs+x)OT>GL%fM;GdHzpI7pman-5!kwB16ZvJ&kSI_aYsh(K$ zL-*5vuEA@tfqF2mZKRYc$|4qdNd{4RnJ^3ToWXh=T3?ctIqhvX=F-6c}j8 z*BRfhP>xLm6#gsxoB}4<39ULDe{}m$Q~a6t^=>lER$_I*LJ!rTGOgb+imIx~@rDxK zZ0ds1sYad4htuF;q@L4QdII}QJ$NUGlGSCu698EsQ@h)hagPj}pP92J5Oc?EZp|qv z9dZ<1;f?rEoX3Q5qJznp*26opVCgn1i_ax#bKJ@w_2$ITtcCRMju1cNA^U+HYVb5$ zF?(-l^^dYOhwl=h!oE!FllW1LpT@>5R{YBf6^=!Fs2k+-hb-np>r4IJqC04YAUdKX zC$2FSnXK18WXAum1%O$iYeoDdFPU+|0a8s1YJ;2u+h+hFxDmxE{U&z5jzKHy7(lFL zk=$&&So*|T8jdW~@K4i%w#V11NQk!2b`UCJRqZKk?L}7>N-L_}ofHbJrQT8m{@r7I zhfj@6RC3y)ZSjlB_7lWuD9=-XtUmH&14xg}*NkPXY48?Iil&ayX`cd(2);O~Z? zaS=ovij;q-wks|~_7I57Z1c9$k~I+|Vu=FPAI?u-QlE;9Osv#giILnfZV8K^|Gv}z z-TZV&L%ff)@ma%sOQ3G6?Ep@6F?D?-1rHb;bv45VsREv&Tto=i=M&`1IdP<{ZE;GnrP$^(iab6=|Ye$y)f9k;0>}o^MKp$Mhd(`%WSVv>y)V3N{A}sATeUWQH zRgjlrd?@VHs>aIfdIh z5FC|v@K$3RoUVY-eBX4Xr&;Fd@vXwTx)Jv}Jg!aM&k$()Y^BiP#Q1yOd3OzSHd{zC zJa+35Zqob~QBs3|W{vYbObV_h8Y(FA#QI=F zhd&Wr!?B%?jb@(?Eqb$V#l7AsG>5vMpM?88Nt|saqS{Uj=7-{qzm{SmG0%m>eJm;y zj+LI^WFke8qeoTd(BQib_Lr!{-NXoWj<8qMe$J_FH;z6TW`hKHulZ2@E18C5E~FjM zS*@1M=ux3rBT{Wmr}s(=fwTl$IV|A&`B%0rGfxQkEo`ju3b9!QtxxYLvc&7U071Zw zS%=Y2ByThmC>Lf6+;(?TNkMahOumn7IRZHC_8;aQok0TDcyiYI$0T6;?vT9FvDId{ zmc;iJ*otJfv|>MP&#Zb9yuSIGSo}sY@Wn*{Uc^u7xwXgCm8S};*PpbcW_fQ5G{Bv! z^}~&o%D{J}D2Z90mqmi9aH$B;{ziu;m{g@J3{apNeB-_M$#BmKcx@a<(^2SGuSx^# zH$ja2iRw-wVl!m?^noL<@cZqCjE2^2w+ZmiDTVj5Zd@vf;F1s%lErNr;SylF6ekHC z0U9nE(onwwS|l(jD>X4JfcQD|yv;clAe`F0uyF&+M66mA_3Q6M_--N#Y!_dHAn8lK zlI+(u%x~sTjPb4ls7+5k-_;^Oz+f-OXBVN_;!_X{5K>Bt@t?9SiQZBKYiNPB-a%nT z0?YO0B<80#VmP<-hw{%pXbaX8^Kv}09I!z;ya*X*CRZ?aU?A*WIRs}p@w+;j#@RVB zRzWg%1tW%*7W&8N$3Pg=;G*Eic1aSl|dMIvE z_ngo4?yP2A$^eAF7>ZtG5kIo?mb9Qs_~1T?E>(<6HhJvFS)2b9u(R%rg;3O{$O&iNmfl{xB4 z=z;YnQDUV*zv!-Cq9Fb#8XUS6wvQuy05wiNamv`QU6GIfl?6gMdx&@bWyi!4zLTFN!433QVH&<}k_1$34FJ z76L|k@inDL7nqR9p2KLw1kiH$S=py5!U722f)wZyvW*!xU@g%E2y}RZiaXcbpiEz0 zEqVfsSLmVRd=-Um6tnc&Oi5S)r281?;|~Ge!@71Ci)r7rY8h92wWn=pVRM@N&DsJ zCewd#ZxWE`_n_|zbd0gx6!*%{dt?830u_;iSnN8yQk_CW4hCW|zlrc~r>T)-yQ#8< z75|@#EdNhM{9X;r$3ir!cvsZPYloP&KSmNKOc+v7Xy!Nv$&yECh-rxoLr#DFArP6_ zw2FV`K-rGbvrKOGI41pfvsp2`k9zXUaUOReYg4>kdAMupXcwTMZzk!0h_YH=dl0sL zxmFxHzrBIr3kTe`n7J&}Juy*l!N3+k<7d@W_F0r|zPV{{tbUl>syh`Sl=wAWfTc^*;3J6`Kt zEtk+uSsVJEsq!Zbx(gKU05k^_P?RDC?f6eIf1tJTtJPVPZKLi#w45YKVeS7_X!Jmk z3UNxx>SYeX6B)x-@($uS@BV~0J%q=jiW05-+-ybUCNaBE>X$xsU6 z2N}7@xSU!N2viXP8uMk=@Y2o_DFof4EM4t50!i-M|Gnr^c{0S~N$fZ$1sN1rnyQZa zMr5F`5Hwz3uFL?t?YxS!z4M3W#7Ugv?!3zquJOy1VI5vC6o74Bc7a#?<&-baSIMuW_t#;E0|w}(yMx1?Q8j8Jl>&EJ513297S1ypp91`cBK3+_7QkY z3-OT%;b>!u3HT48=n}daesygaeSI1LJ*I9CZ!&X4m|J3OPmr)&Wr+&~cZC;o*Gy8L|KA25?bRsTuh=KV`q9^0hqBjGyzaoF5Vh7I;DrS4_zx5S20?5E~o`9wfEVz3^8C-jC zy!V9Z>Q$`#UkXr=zo7O!@8>-J;Au<#QVIhhVcYz)P7fW1n9SQl}s@F5l52=fe5=)$sc6A!JWH_?|QP}zxbTMkgU*J|rAtx1O z$kPk|vkcsY1Q7sG|9i+S$$)WviSdkrk@So_78isSE#n1PF}nqm?EL-#$rb?-AEw0w z+c8Na$}!OgUWBJXNU6B+U(&~|M0UhqKF9X~ud^RN2+bP(cfFs9<60ySD1uKI6!q6@G469NV9Q9Obp;v;*k-gwUG+E&Ak5y4XLf}DrBN&czVCFepK=Gt!{YiJ3PH@?oyPG4WUJKD%%(RMd#jKT$T zatTMWAORr&hW_wZU=Wa=cbrtG9>azNV845q;;(=AKjKbu7vCT6au_Ry%g_5NdS_`) z^tc<8zfeK&T<=6B-8~TL`KWj~L`%%U&BZ-=^qGQ8OFH0-E5WQA5U@=5=MWOrWU3iC zC^#m6QX9QV{SUur_87#8!tb)#!XLGbU{)>}bcdhmKY%)F4*e=51UWlGc`UJO6%+h` z@$c^>9t9uqzY~lfY~_%=?scMgzn95-8%IJYKFALtmP(xYpXe*jp45$XE(9Rh*tXNP z0UuU2Ujs5es>SHoz!9VCt`-SVVCw0o^!~LxBFKw^ih_oMNT4h?e@&dPhV(tCV=cc6 zE4{THyI`WeUgduuUh|H3Rrv|uHe^jX$tc0lLQK2MSs#QEx}H6o1C%&ByPj8N&57BE$FCnXq}sLB%n0kJPHdMr2Kme zy+!x;8f%DH5XuG}GWGxG(1h=}5RT;UZ|nl!ps zFkoME)@!Kka9XpDXwX;}`x8B)WaCl&fdY0IhW1ITT6Y_zwL{|nkdH3By9%TD5mQaW zU(q|JB?8lM${O+tL@DHs3SbMyrJM46&NSVBN^Q6zPczO#)`^?CQ)1sRo{p@$7oj4t_ zv$^HquA)DosuN(TYP_n9QYQ$(UB1d_1`&>~c`3sGALSy}!MKl?S8EPmpPH6q;wfl7 z_-nR8z7Xp7)5A=GQR6|KI?+~wzM3P66nIxzBB-w64Xq1(rKtf!v>?y6C+EkfiM;Ny zGWZigI~6_A|F9UpzbOFSw|2SWI|Zfe@MrO~vOCr+#e$>Gs`RWMg8x1%#s&^na|L|` z75b%k+7fq42CjLwUN)584MFpm5fx&QUXNUgrC=y&MuLHy)>UwgsZb|v7yDXl^LlPAK%SR%TJhos*5n6 zRa47o`Pio!jj-rfYth0oNyN`7E<56G_hyrv%Z_|9a=|G08`-%KanItUqpqcyr>6^ydUB{I? z6;th#BAp1JZT<$b+FGY!sw-7huRX2^{{u4CA{gUOKI5>XFojqWZ8UZc#ti?4_WGF` z55e6ld~6h)T5E$SK;P2ZlHZBihi#lxa%XB8fAMWSs`ah@29~AzJ_U-!Bn%783zz}c zpj!so+hl^pT~+BFKA9^q&<}SySqRWSe~uc%rJzFGk>bvbcY3P{--ErM-3}TE63#!v z(VNfg62Tg^_n&wC$MpKOQ2+{bzI-}y@@+P}a%xvEm%a0FJZO2-#tJ&t11KUhX@}&B z1ufF3vBMlLGXGl2e62}nMF0LjhepDv$*N|H9+l81Zu-O)@{!?tbZQ+VBU-%U!**(F zG)1@si2MdmV3r4sdLTvRHt5k^z*-N04JLx9*J76KM2|4KPIFz5y0BiWAi}S4)bqic zC%i#%bpo^-*ITf^Z+heb2IeBQHnThm0UPIG(p%vpPA&QCF_QKZmYZWNseW!y zDO4aGzW zV|JN%t(2lV=+0@2I_zGpPdxk3h{X~Nb=|h+ZI4A^tD$tEAL9zV9|+I_dA$T z=ABdqyi7m%>4*E=kuj1WBC7PiY-E7JN{Hepv{HzS$Aag~UfnbroPc;ahecSY=AeSn zcvb0hZ9@Ens~rP91tocRv)+__4SlpU)tZe=Cii47U8UlyTE z#oYrRZA&6Mtnc`VM->UQ=rl+idF|_b@AMaNJ72#2#GjV0xbk~|9NXDi5V5#<}%w0kw)eZPXa>JudhrSN!REQUB?bhsi3vdaPz z!5Mg(OZ^6&TL{vq?ds!^xW zdgXQ+7P=NuFUmgjfqkZllgLtdMJOJW!dCSfwT?TkeIrv5%*oFUru$tNS8b5`zFI+D zjC7+)O%4^mlqme?hGQs|7AK&Jlk~wV6FtJ~3umz`Itp8W(ICY4w?8fKar8j488fuT zavowcSK0B))7V4F`8~h!frF~7#yD_mA#w$`pQM(zGRZII#aNbo(L4Jscrfnefq}z6 zBGn9$2v+62`}VkS5Z(=5gl|NG!Pm{U?Di|a8`~31X`wDmzAS>3#`Jo? z9~Gdeum4#x6Yc%lIrQc3uS;Hz2?!*gh0Lym2kG6N$>G@XYwwaErZMXPNGGKOc}YE(2RTKsx41vt0zO{z4vX=P2rmk=P&lT}E5q>4%`BY$J?w?}Nvt1? zW=q`>I`s7A*B4m|^`QwwjI9#1$oyPpSD76cMkOv^R zlyGL+Jj%X0c?%%xN@HzTL2ZG-$v@(b!wbv?0dD!zXeM3k*^dc-7;BdV#OK_lG(inB zlS?ZDzgtHy%Cv3Z9+9A2)1Rba=t_4;R6uXXq*ux$@?`JB%k=(EK*xcNtoIl%-VL~R z=34#e$u&C#dG^v)&9za!5Do{Xwk&eLj6k0h&@DECdc zC%#Q@b+QbN8;!<28Fn1+1|uLg%Sp~UmI)y+PrtYfKEQBi7W}2o?@Cz6j2Q^tGLk)M zg|I_xz3iDpTzm6PU|STth)E+?L48+*-778kTm>b}@qsHEhFNV?fq*Jz*p$#lVdHgF zT<{`Kt*>u>_oec{MV{K;S4!xi_7wFnWz(aJ=Wwz&4@~of#UCjsqY1h9sx!#xO`QTAtywK|Akvt{+kV#5vrEIj@7<84&uQOc#a|@_gf4=q< z1WX=xw7UBCX6iRndN>PHJ(v&ULXAc*RiSB0kqFc9&N1|?;Dwzs_74HJ)1pudw_PXv zptM27F4eB5JXR1eBu#>ZX3Hu(2`M57y*!CA{vK|^1f}M@eXW1)W^!x-l`u>RR26P$B9q!e0 zc7uc8?e1w~AH%2?ljkwt+F=jY)^dd^eXCK>EL$CyomDFS5YwvOG8d>jLe$inB$#B| z=VQViZ$Y(dS#C5sVMFZIz5YY*9`V_W&>D8aJ>QC>0MO&Y)j08ovx67CS$-Qv(@-~%JZ zf-`|M8;+XU2Q|sM-DB^?f#>#}6M9`A6|P+LZ8w$a>^XRZaJT+BK2_5Z^V^2sXvUi6 z1%9Zwmc5hSwE>6V$^=OP4oic<45yv`Y$xO(`J0xk_fs6&#nbH>TozvbvshU5t#HI# zyMh9%MR)5PvJGpnswu9^19@>iuetI<$r$xxk z@3bgRaFWH$JzVrVZ{Ku{#6{tx;Mv7xF9DYr25G+g9jcT8=F#AQcs{Yzk5z6 z-yg!~B#{b3-;assjGmsJ#>@XmW(^mBmuHh~KqGOhz7L&5=_%{$DIV&?Y<1k_`$_=# z?PcvX%N=(p3A)M@sx7$Iz!3uz2GIR& zGmt(c$|TbrO>$vyLoAy|Oijf$LIO_9l{BNBi$xZ5`Q`a z#8~^c7KUP{G2^ldUEcu1Mjb@`a}OKA-v?5EC~sraS6fo&Y%EN()In+2fP_U=AzGk< zphC6IW(7{=NqmIVInm7gOAmZq`|?8JqMtAgTBayjfRsRMt4_eT>UK20&Ig}^TKYtm z;lcDk=etY0$WX)y$8bV-04^iYZwo{iupb#78jBpsElCQh={>>g=z zuB@GX=b8#R9sWcMC#QIz$Ks>*M@7cOx!4$sPd|zxN=rh()TY&f1!iWMLLMo=#R0z! zguVL-mp;97aRNumWr61xD^{n?kyZsO<#9p9`90Z41jxLyvL6UtRb^-Y;+q}&43ZK7 zXT+h%l5obL@Dk3)OoXx2>XcpddHMfq0fKu&=|85X4(yyIMb|jJ!U+8)lOL@b%_Gj$ zxi?iDae2r#98hoWY)9{Aydm%G+6b;nVf*;{OJvaP&C>I))zk+w6*X0-{eMCz z;Te{wt_!@&zeqjs(!{hxUv*hnm}ED#G&K2G#@h1BKc_wP0lCgo|87Osbv(e?P1_wE z9m^#u{I$716ZK^YMJ4W%z#CX12?G)x2K`5F5;3m^)aK43tI>0^330k4Ku*a zO>}rPyH_U*WsuXq^6;Idfi;4cEV}%usc}WlgG+}viniruX(+w#(Wf}MFcVD&b2V9$ zC3sX-3YKziUm)E3OXL}Ue{P{7p~5}hz)6xgyLo|$jm6_~`zNoy)_i_xe!$t1R(ZVm z)l1}OC<{fDxo>~{8dkqiqrp_2$zGLRMjQ&e-#S2g(Oxq!MUCQGw?EZ=wcKz}Gw+K4 zG>>{c3Y2NP^*IPB?t-1BzkDBf&oJhip`@M33kYCi?L;=`^81pW>0#~0)5kkjR@Q%3 z|C%b5XND3+%+p$YQU#0xvK$40{s7U=0!kkO1DIi&zS>UO>wmP~e{|L8D+(m%IZ=-3 z@|QhbOB5^}g~0QZY}94dR<40){(B zhaz>Dt1+5)Pg{lbD{E}(1VxsguLpXg^jn|&&xvZeIDR_!bR(ou)JW?N69E>!X|=8E zTd-G0y{+@dSQc#;{U&ex$4BJ8e)*eoOYxEOy;`^6BkVM{pu=XL^dQfxZMW>Fo3rvt zJKhIz2jYR9m*o(~MnB8SORo<2PFLGb({;xSm61$2>j|Oyq|wB;X_@42jG4%mPNTVB z6L&i^{U8$Rruo3FNE}0(Hd9+&-&d%d`X!(&vg_YptNGl8!NCu&&Vv)1 z_c@6*+@h?**`hQQ@!BmW_Z?$ySzyp%in0uOeXSk)*P9!!qowwd9;;UO#|2U_{Iv_v z4WJTzWav$oII?lJXXoI%S8TPZQgZ4!s%U2al>K784Eo8{*EOKq{Nqv7s27N+bgKJ#~SnAwyKSB)JyM{TS zGNx@execV18>gd?mG#kZ%F{xKZ|F%xgu(0}IgwYl@a22?Ho(sCAfCChxaau8aa@}t z-aj;X>hJ#Ne!1ljtZjIhqrHPR&M#X2jZcy!Rnpx)qW zBfBg9Iy7LMOW!!*T zgseJ1p9JnZDIZ?piomg=pPQ`N zQ$Y!kHBX@Fn8<$_nrWSaO2Y2y+BR#y+8v{!7yYEyV1K$)E5VQ<)cPwJ=q7D=JU#F| z5`cCDs>_IGb#cxNQ#tY*H zkpp^+=+Jh9@-ASzcIj#Lg-E1R{eiQM*oYtZ|Iu`nQBihXduABAyHf-Nq`SL8y1S7Y z8p)v>X$2$%0qK%%=|+)mMnt-#>${(Kt#7UQ#g7?g?sLvQSL|ySXey?Td{81C*8o;H z1y9xCN6*LQrh}?#_fy=bACinzao!VRNBS3*oj2FhXG4@dA{oI<=}sXx5f1NmGA+(; z9YTtCU@!wT75zX@X4Bwj0)g^Gl|N_`gO*1x6ye)Wyvh z$pDh0af|Kk0lNCrV;hNnUjWz}DeWZx6SCzY@4hhD7-&f5kW6-63OcFn>6g4?e*W0~ zG?fr=zqj!iIdF&a1D3MY7uN2DHhdy?#`K&^Ms5`l)LC+=z2s62wImh}5~J{zPf;z? zZo)lwvCXE4B{**(0RRVpwa&Jdlf&dF zPDK&x4%b`KI@b?HR%vX;Up(bi^5gN656;tR#S<#N{`V8AuW%Ji_%wl11gn=pqjl6& z28HE2=YdGll4nYq8eWU2KmTq>%2(!?b@3xMnq5QAwpBaN?hay^KCf3);3Y)=#Y9Cz z4Tc5*AGV1G^n%ULzSCZ^c1>~5VcNL;BM2Na&lHVi8b_@s-ajmvILeZ#nJ~*A@}qtO z-#+vr@1(B2o_}9ft5A~Q3nvvL!N0BRgB#X-wQ&#b*SSGI7!7!ocU5CiaGmKbHiso2 z=ud!fjGoIKPQnED6Gq^klASzWZj~2~xAQ7a4q+Z;7 z*p{JBu;&T;>E_MTZ-2@zY?%x~^5Y=@lsA(BA?93*wDxoq3`D1&4a6>L4y-#kvW~QQ z*j1wCn{BmO+>(mam%i2uw%PQ~z+2h%cL%O0*4**5&qDn_@QQ=!t+zlDO`l@QsPd0fSjiYMUuq*G zMi2^E{hPHtx3AA{#U8gn4rOE82)B!&%8et&41L}Oq*Y_Jl+m4=1NV>w$vcGP5UrzY z&Z@`hGN<`gm)|;g^PyasPrXuJyO|nLd&B-T%krj;@^!1=z|E5$#5lael&Y(17lLp8 ztm);82-4#|(ZEdmc6NT(ql~sCk6(9RECAsKUgLg`sUTS-{Ow?1a#-~V7Ufjs1~VG+ z;{dAVGBsTuTYX(tk>)GW7m=IHl6UxLeM0FvIwn_5S+A{^H5Q_R-F~aAYS{W>)mLZr z>|x$z$0?GZ;EvzRcz!WV?kI~4O#l)AZek=E>r)rc&3enYCB%9)L&?+^_RDlwFxv3| zv9$gPZLp}XdJr0=B4D-BeEa0rJx=?WE@=;gIj%gG#R8EKT@1xZiQx-9i3rQL(SmM4gs+PJqJB>EDWM{3c9eIhJXOsI)_y6-Q*gMXS z5q2%$t-TO<<6F=ymi01Wn>DS7MCD6sI$+Dck|D;p&${oHACSbYx0SPJOabwvW)F7m z{sw!#ABnwr1_p;c9>)}jU0})8Gc}d5ScdqjjXqUkz=IdK_YI|I`Gyq24L1@QQm3{q z4MLG*;EEFWjuGHB580~to6*^6I+`SzO)|Cj*x3sm(R7R7dM@wXgv$O+G~Kl-K-3hY zVb1SR>m7+C-~Azf_)#E+lXVnQ^e<0v<9lvx4-SazybX^Wn{~MDm`YNEtnnEbxk`rJ zq|aoUX`2y`JbNNy=wsKj-{Vvm@65PX`}Rr;mJqz2lGH@kcS)gNzkHnWw|W z3uXN)Z~R|GTbEplEM@Kxi#;NkwW{Z*$m5If&;z&xxv>gXz*z{j;f=RAg>x5hD|&+OsKT|7Rvr{m|YX1E*_pm)kT4&A03x$^}p&?SO9))zg&9p~A#kQZq8@h`@H)0wtF2nTWJOEuJM1iH= zZ%2yvW;a!(q^_|k={70~$uHiKlu`M6ZRoA4Y0$Me2sF-f^Dp9}ZUt&5`O6ixolK4} zoKyUcMUciHX$vcJTsa6@K>9L0cQhPhu;bcpuJ7KEQy^&_@Y*Fv5z~emDZQ z=z1qN+)&kU!>bXr-0Mh({H;$T9p?uhcI`M$PHC#X(Yj|F7M|tXfOf0Ecs+bVu-|k6 z+g{Q3*L4-RT~s`y4O?D}9NL41$@Iwy=rPJf^wpvLwfQDQN+7qd@r`(rvq4SH%S586 z(-hPT9V`DejmPC(EE~87)mMwd89wZu6~K{3Z=u^TT4IeqD1+YU#hmN*W)bmM6nQ3u z4s<;Dv$ZYn*RZcvRw{>nUFw)@hMm8w*k1t-xL+f36_fF`$I{aJ(CnL!5uqKuR#qa3 zDI2ad&q<-xB)$7LwbRIa*txwg{(5~MY8)XROTqS9y_zTS_4S2$x=p1~Z5x%=s`lSe z8l!o;&l! zxK+_J*x~Otaqo(2t$6E$Mx`;G9JVVodt3WH^xhO{d6Ef+c1ujGUZeSwa3~UweZxe- z+YgnOS;L$Eg_A)(FYbF*1q8bi& zAZKhu21H;NS2t_75Sj_@>ELo(f;Z29(O3DuhH`$&?@QUJbPsIVe@iSr zrz}VCK6Tuk5qCZg<=zEnefD_Enz%*JDFjd#-_WOp@G5|tqvoaXETp$LsGS-jr>vln zIeOyaj_C8+rC5%P8?A1y- zeR$tKxYBa=k5E#9!7A%v1sMlZ$0`w}Ytw(~8=CcgZ0{ZWM~`~dS-v0+(euFuj^MSm zrJ=u$Kwqj)!FAy{$}s-2>?H*nypr;)6d@AEgW}?Vak_ZZoEQl0%}g>JN9ag==zssT zhsu)qcB~P2;!)XJLN1;Bw>o|rT$dMN6m%b_P@}{8Ip~OB#ilhmzh_3}2%IY`4TXX$ z!k{b(1VgCncxKY_8K+yuSS9T|MIC-8o5$Nlo{C?dXUlKno(*fEMdTs^hwR(ifWx@vhF2-AVFQzy0VaA>%8y@cPBqM7@{J3;1z~y+>!h4}M=2n~eLWE&Oo|YS;M0f&Na3i(Ymr4Mo{2T1OhS?EHmA zoOtatRlX>H6=7!2HmaJS2Yg#V78ICIYw6WWRbx8)jr&XvtTGUM3r19^ z=NUy0WfK;k2AJMK-dAEiT!N=Zycg7cFRNOP=~QN69WF}t=U??-UIxBWo91iZ1OlV! z9o%!ae~;^R_O!3)XDZaQGGuew4DdSU3HSa;;n0Wqc%5VgTk8$fhFCG5?xaCO;&5%AP14@z7j;3Bj>{0dWPl12K?I^3@{U|Nferl=7 z5Xk0`zV(LMi^7cYBU_9*FDz5V)o0u8$R?7c=UDdt_O8Oj<_0en%*NN6EZpj$)9O9BJ9|?J%q)M;UY} zJENhyeO9;iR&d#DvL)AI{qn`2Nz3VB`WyOOy(w_PN^)B{mypjCLdfg9GLyg7>Cxm3 zsQmXwZcKG8qE0u|hFgL$Vtk+;2-aFCS~{YIeg0!EtO!oE0{{WiwB!Z5n`uvJ?K61u za1>qbP4c|TT|3L8p#Afa0A=@S_B53v<#?aSH*gF=}n$UN(Jwwr*iAZC=%i`)8FFPXt9@gJ@-Sgm@{#7LLAE?NvK) z}icM6^mYOOJ&Z0QQQA#=RV(l?M(jIq_q@}6B z?236`Qe=LTr5Vw=NmDwz9l7 zM*k;LrAOiMa_zML>rb(p{giAe=+Zpd13L*HPDdPQT^GA6e&y*Kb166 zQS9TEj8Qk4a`+AGF9>jYt#&;S>&?exJAAJY@;ex-= zT(v7Q*kPsBanE6Bq~%JMES_pNf>k{6xbN|=l}ZU%?3eHZVb$5w<*3r3t~0|VIc(J6 z&0p=IW+c^SsPG+rDNR4@uLtxBX>_Utaz5&EvwWp5q+5@~vIMr9^s6H`0otwa=TDyQ zr=(g2BATO-6A&nkaeIF!!T+eKMYH@xWMDdEaSlc{-W>+y`4;KAL3S8Mu zBh$7f3@z$=ol!<}|KoR^mv<)qzkkHk!>+Ilo5d^YOa&4w9=AzbZB9EqMWCPZ zDB-h?zOhVU#lE#qDnG8Xe__$vVaktWFQG|vcO?haCu)~R?&b$jFz^03-Kh;G)-VXn zcvECJm{hp{JL^hNnt%0V7(En$IZH;4^Kt0bJjEGEc>MEQdEB0u)pmnPq=(SP0*=)bkJOF^|BOoK{Nsz8Sp zB%9Sw_U}j(hpZ;J_&f%(dC|@-PBQSbT}I3_XqWm^=wAr5&vfNAP4TlbGyXVneU?iX ziUkrF7R&|~ou&zRP$j)~cSivM1;M@NEIMQZ@h!W-vNQ_D*4NWb$baq3Fs`Ecl_SK? z2%Y35{|)+$m{3nIVt-p?Y=1G}dWyR9_Ad9PdgCelDHT{^m{tc3so>=pZN2Z?Zk}&m zYy$-!+Xn3&rIc$}4YFwTVb3~~`U}XXF7BSFwd7K$RQ=Z!Mf&-DRu{esqpoeEk$aLPf^Er|F5!_$bNrd?}|aq0G5e@Wo+ za9C2Xwa^oQj9K=_iKz?TMWF>i?D79+W5KH zo}%T=sr#~G!mt`6NIfFWE*(Se{<-fK-PFufu|^XDS~W5q0B&|P{-@GGcd6682yuTI zwJb)Ls_JckFEs4*q0Ce%ZeK)rZmyO)`TzP|(7dr$agRE&6dGT|6}mkTCRxldnliv@ zh-l-X1B;+k!?;m42Pp;Jg6_AbCE_j9v#{;7zN0#8soku7#D3T3J^Dzf$*V8!X-$=I zOH1$nIA`pfYt>_ty_tAEbvGe76TqoHd6tPMPRG^sh8~)3LqG5u=187Rg0H)uyP% zr;*FXO8Uz9##!{_JiSFMtlglu0{%A4aY>HLL}+Fm0oV(*X2XYvSR7*B;M6!}*h60u zx1F+#iyvh|i`zEheeGw>I-pG(5;My@jDOnhgWmaP54L#sV9yAW*8;9NH>+hDHcmc- zs?MTJ=`$)NiEOkMeVOlTrSPB=oD(*0-$GubqKS3GcRc7C5^cqzFE9Do*SjNjc8Gt` zI`$050Sj>R-IU8}S!TmGk@cg->3vBMeSB578^_%I5~;=;#4i)( zKe4g52aY{^AbtVeg3fV?I}9&ejWz6OQXL38-kz@>L}{=xtSnRX4#6}2eb=MUi8O^X%frC~zsS%v#s4MdOHh}GDaevHQ<5ZH z0R`qI8rPV5#r=r1y1}9^&weam594!jcip;m$md0V_6_U*KEWc!5u<$NsQpC6_?Nf$ zTW`b|PG!R8?VeVUzYRGEhFESwfmqg_M}_nq9sNq3GX>Dnr0$dEAHV8{@H2lZLHA## z-44vrR*mRcUeb?6bu>eC)B7HpM2<;#`i+*C(kU^e9#6lBBwFjSv@)d7`lds#c!T_c zuzZ^?b;JzX-O=HJ^;jx;_#tK3Au%wQmubN5;b4@?mnSM~q-7`Yx~{Dr3@Vfg!PaC8 zJ-^%lYYINke$yt9nx(@+ipJB`YZUc+j|UQy?LVobPvztnV^$sO_BTx)I`lIGxpZ<= z4RHp))>VX#pk!vGqJ5;I4xc{i&1+&&K^df{hx#3}Z%yUB1Y#4j_t52r7|^hgx6T6k zE+Ayd$g;d&_1V7avwqDO2Q+J?0qe!}^}hXm5!N|zl5Cv7Q?g78M~HX8&7j|jygNJR>%4A&ADWW5>CJa%Pavpqe_2N` zZ7uRwdhzJ*-}*G$@M>?G%2D=sV*GWQx15Z1SU4OM;$$4%_cc$?x{PQY>ND8gd{>P| z?hB77(8@SXo6bHiI=DHZAfO){FXL3qu{H~s9od`yzZXD&o15S6u1c*OLzziD6`dJ$ zESHOFNI`HG*)C*cv${#8=iy1pY_qL3O&v$ z?fR<1>1tz!meLV7H}e>1V8F0p{_fV`W~k)}1lQK*COmX|zR?IP4V&~f_bYAjz*-fc zp`pZWNs39|rGrhRrZWOWAb{`vyCeO(z3GZnvg|sqRMf?l;3v{mFCMl0Cct^nnFsNJ z5-3P>3{-^%s;17>A5$WCqo|s?)~^8@Q)6EC8gvX{rNMyzqfMA5_Xm-H4SBi|Wg%5U zhbmiZ$G4xS!7)+8^gvySg-`1^dpTm^tq@V=D1mI!l(3`MI4E}C6!ad-fmNMX7L!XT zuPkIsv)2?4JZB0)$Qy;u(>MC>{n;{$d$k z@(cxzb7vQQea^)@e*=)5JWQobTW5!oPP=S+rYngEoZRnU7vf?U&_y@$^$gIT#hhV_Jz)?A-f&`!c*Y+$Cvgq*lsYX0Q6fxNd8z&f6L_of2 z8hS-qVg+L{y9$eL#mEQwSanFbKJ0e;rJUcT6x$zGv^Tp{NxRuj#|vmQ@iHaa$nsjS zYdkR5VKZW0yZ&-Ri=vw9zEG;@$e)`lm4MrWKDwn|&A=^M$ z%WU$G6k3}t5Hz>2{O(s=g9t=1IxL&4b2 zc@%(OFhZ|(LvfOwCkGqZRSc6I>ZqoBU&7GZ4^Ks*{)b|VNLW(0D#Y2=$mQ1LXQt>o zOlmFc;{jd9En7`~`s@Bj`}~j3aX&sA<7s}lot?q?Gy4}nOMEOcyq1y z1ay_H#M7eI=|DNc?{+WV0W@>L)^VO_*0hP0g99pO*C_*VLeg}fb9P6MEPmWMux_({ zbE|_j6ZkduXa3LUylU4~T_kZ38tyv}?bo+I!n^K}rA0?1kAkroLG*>>D4*fDRO5xL zDzOTF^{~5)r|uAm4X>SwSC*B-l(jv{xEy9O{vA3=)gx8Ju>Z+UeiSd>YpbRV4^#|5Mn5$w0#|8cIh@_dT{4DmK%p)Hq{ zsVyQN?NLKJ&wQ(xDHA)&;m;MfvRCA)-?->Rh| zw-Im~a{o^PH>ZaRD>|A~+uevnT`#9b!d~|52yw3SbhiJ#YH=*ZZ-Iqs_B3uz4*$h(I4C<*2 za0-)bwl<9xg;3c0;W|$4*(?KLzHEB(y12a=W8w__xI(U$jupI3e}xfM;Io) zhdSF^khn@N3yLlzEh1O%yT;YE-f>mhn$s}yC=ZVIV9h~8b zp(3q^)BESh7}|GGi=e}n*R@HupA$dR&`F{ERcAjgy`tJRf1a$olj%n^*o4^Yp14+B z*12Upf|eCQZwuZymY|Al83M|V93lCaG<$LzT&(_>p&=Th99#~Ip$_+MWGN?~7Jv*v zoh}$Y2|lU}WDR4DaZC`}_OO1H<7TYkaWZB0_{?1l{?hkQpV!xeABZe1^*SA9?}p(X z3L{Kov~l*r^gCG{9BoS<$zZ*H37#3Rh}Pu+HY7JithRw_<>#Iz_2ca~J(nH#p&)r_ z0(qr|#2L*KA5Svh6-qSF2NQZwtePfE=H||t>&t%jolTUcNMB&q3@{RC4WbY(5s5?- zn-*#MInlZ;-nu;8Q%@UP09`H{Zsl0Vhn!W~SH}mfa`3p%zw^GH zraPi9baq1)TP;ZrUge`{Y2+`2k`2C!){Ea3$G8baKkZouK(8uiXKd)%S2!{}Ie&gM*HJCYnOtpUinX zdU_x}_5Kqd8&}?F&$dKeR=YF^QoM93GAFDm#rCJv2mqiF<;?kxT&7lJ6d^50Ze<|R z>9A5F&kDnGh7X)CGTHVuMnE7L*x8yNeuDhj{l=ZXtm-#WQ75cCGCU9xAA?TCp|D0( zZMBu1Q8{jj6GfRuqO>OUdeTy!jR~|ofuJa)Y}`qaFI8H?eI2zX&e^>-0xx`xY52v5 z@vWqd&iT`u%=Z#90=a`N&%e(~FBrUHZLAPvSZx#$6xb#vD&!xBop=|%Q;>}0wZq6ESYaW}O=A9;1pDOR<=1<^ zh8o5jy00oe702c)!}oYu6!P1jpLuzHw}8&~fKDCRw3k7Txf{^&=CbAVs{dAG-Rhb{BMVUP(Fk2I))cEba3 zKpgQUNn7zkdKX6rKh6oVg7)pUyHdy(jt_cLRiJn>z!h;`Zy9k}P<-6cjZ=9~UDe%a zvY7BtIG1>1b=C3|T6uE#(ov2?9?kx}9Ee3(fZVpuSAuC~C`_qC85pT-8-ywa0l95- zMlpw+%8C=Nu?fXtDNY5rruJNYh&l{ z0p2TLwD^=@Y?&DOp?}DAS(~E57wr0F%b2)@DI(Q3`_9Cm(xB;!O=K|Dbi{7c@Vi7D zRM^%p=um$MA$MC-Ta-gV5Ji!reyftWw;Rq3<>DmCHT!#fd3=CO0c*ZBEgO!ROrFY_ zFfscJ9=1)fF^pXP~9^dlzdEs{VpyI~x5ecyVPZvpMoKe>P6HyX&!!~b!NcqEc; zL3XI?XuxVTUt@D>o8js9UXly-87k>R?E9SHdu3pJy=cDU^jg?6LXF2U=Uh4SfCD8vcLJP5d!;J(jJtwW_}sy!O3@ z+QRm%Pc5Evf4N5}cNMx->Noe!ul-9yK^nFCbW+t_yyDnA-L8TF-J7_dFC2;nfZGFP z^+Xbr5_{c5JI|XKST88~(VpL92Uag1hoyzmO3{Ft1q9C?Pacuo@L`et;w+ zG0UzuhvYLVFD~huW=4dx7;W46uX!kS?(ZmR#55?WGgX`9*s9KFHzL9vE$23Z9{Cx! z`HL8cV2H4E1We>GVACDz>GlqNnd^2c5f>4*#C;kqzp=c}Y96?wH+$_Iu>?W_siZmd zWMy0*ugkYpv9}H@Mq4(b-&r?Mz7D0R31+dE2hq*pn|GOFc9Ev3f7x58HJ_W40oM|4 z!BK7cLq6pv!Dp{B@j4&xD6vnl+l~~+yiJ-WD!-1sh%egoSe~T86bKH{@}R?%r48`kDmp- z{%a72++6eLc~N;Q*z%>B;OO1!w-4%l?g0G~6k1!9tqWv+Io}3eo=PCaYwJrC-O_@( znqI9wm@F z)&`^WUlfE-#dFjqgcDa-EC!%)Zm5|Wr;8n%mv^Qy$E;|B{sT43CNdVa(( zAteSy1<|;7ouNEExj*OD(ERMJpFkxJ9|qZ0ZMb6FnE6WU-9-lKf;Wj;qnl?_J>;)B z$9b&dkdE#?|6o6ubc_c@|A+vlqx7d(0^J-}J?#=dEF2uq7G?-)#*LmIVT)3}wG=nz zLt4!p7FR9Zm$b68A1Ne_yOQibtvHwbx#l&#EeSoF+1vAz>~6Yit6&5ePe862s?KdW z9UP|VUqYRtIe^Gz*_l4xV5|oqupf5(p76><^?v&(eZsoMo6e-To25bN5Dhpn$9lJx zwe)Ngb+^VR-?yXrMIt-#61w7w47dM&xo+ZqP;EdZK;vLP?9H?`P)ONO$%G5?fv4LU zIb9U3oAM=HV5Z-k4q=Sx;YZ?io{xXv<`>7#vde9*rP@qKg;>6<@1gS1ajo3*5Z&}# z&Q0Yg z1A*AM^*uNb1+iTDqk}-uJl`t4w}^wA-;qzxZenq%FfXM36Nx8(#g^)Yv+FnFb1SKT zKzTzyAjCewViF=4-GfhXp~GKlIH>eMAmh{daKUD_*Gqo{eeq zApDcAdmNg_!(G_^#9s1MT(y2BVDiFP@9|gukf%sEe}3Wiy|0n%x}$FSdw8g%0#rmBS`gK-T%Cul}D>5j{ z3Krl?b)kcQilcbO`SkZ%ZJO5GoHb(%wtNIzUMX{N5e(;`oKI`I%Hg)m0{P2( z^#mYnURfHKk_*Kv7NxJym}$hf3}T<+b)9iBr*VMk>zT6g|`Bk`8fC?!-d|KAZUM#Ysa_sxV`Jn2}uYTOnB2r?c zkM&d=7STCsjF(<>yB;}^=Ni;!l$p16wWCj%ove#_(a>`wKCQ(~^(s=kv5Z&xk#bVP~*OXrdLF|D(iBa7gPa$08MukPFTt zwZKf`?J|C)UPin;k*Yi}9*1!oeZX2vckG^RUqLp+RLDoh9pA}Mh@v4dJAzD@FdV>x zXFp&ECwq_}95B0j?nu&EoX3|mxWKs)Q%c=bbn^pp?fIlD7CJmuk-N zsA|Mili+=`L3$6W7LS{RtrMLix4ynRBB@+^0b+^&-pq<9d4<7i)6cZ4R~?P>>*-S8 zxbDpYAjf{U0(QrmA;ppm`mHIBpF8JvU%lnR-6@_GW~~c6q=@{mPd4qignv* zNj~)J-4L2`T1xC-YV6?a0!dZ?p-;S#=c4)-p_8|@qNQj;EUznH?{M(U4p2Sz{@^W*@2?rL4VT_MNjJ|FK1UQcLC->`ReDq_wrhD3NM9BH3DU4mee(gkh5&0 ze-QmgJ{S{%CV5gEJVi=_{VvA}!nyEk#%o{-RWc(?N zh58sDWOVRi9cecvj$PYIXByi`j~ftjecL6`i|q@YD2li6=3AOyo3#5ua46sZD5M4W z`5Q5nKufc=()Q_D_P{UIufASBZ&_YY+?h)kCWAiaXU|U$CmoUfabSMEp=e89r^y*Y zzzw)|7I82Cght}2HPheYlC^`pLs{fI#lL#KWT8d^h z*y_ZwzsOUe&s*+5)@Oq)Atyq`0fz17@4T_jP#39`R_|&ZE^UoG?&Xu3Nb$mF3Uqi4 zDiq~~RG6Js1xuPd+u?4&x>L|yAFuzDK`lMsZ+_$_R3F`id_jA>Z*aI4YM*5zp~tWFNm za4;u>tc3qup+yh*oU3t%WwIy(xRB8%pb5DUP&l)LyxP{t$f*bC|1c4hv&ZjX9FnN~ z3WM|}g3-C8RA*uxWVqI%??Mab=kxYuWw%0*$D4;j2y(Ooa#f7+2DvO5(PhCX1sCn9 zPbFVY8Dkh&I2Wtg39Ym42ytOjMYslb5OeI>=d77J?_ zlDZb)dlpaK;tnrjfr-Uvm&B_K-uaWZn_jeWiB`KP)?4p)1Q;q_-iesxluDDKU}Z$f zF;ewb2j;ST7`F^O^asapX*KIg8)fwJVu|^7ADAQmC)g;kTgU)^{j43uf*;!e0*8&IKrtZG@J$NO%(=Np+sv@9z@kpk6RuMN}7VbGgCVS)=Oj#2m#moEcOP}HV zuFtEkBRz|;fdQM_fa$9=uu=koqW^BHk_&A3vs zT=KCR-x{ixB^qLs?~5&c-$Df4HljthBZp=8y1Ain78Mq~3Kj#o3^u)}pfp=u`SLTt zV!+*uop06a!48mx{Tx!8hFG^joA1nx0?Vbl`aAF4V>dUw9{ z?Rxeeeaj9P9E?>Kme!5(7rm^s4{*m}d6p%_? zY;3N|LpKf&P_Jba zuCcWiloj`j-?!mv)>P5{{e7NuRS3|io*M#egF<7E2Pmsf381OGLh(T zp^GM;r^Bbj^QJ}~|JLkC*C0@?*(A~PjWH~hQ7H`?X9f8743qoOreE;=R%FPQYtxo5 z*Osq0R48E$2c_s{=`%s8#^Jk$r|j6$oAfXjR|xM{>~EvkL?sS$Q+fFZi@38KLho?! zYY8dKky=k6?WEzoUMe%oVXmUAe7nzY)73)dGuk=cJpTC*N+}uev^(-)?6keDnLVxA z*qj^i@vFnftz_F+eY)&T($Mt@jjCQYs&{B*$fMI%$)BBix4t;HV;hlMs@d@`-8uAs zyf1EJC~9MHF{MZclQNhaOp_<*y(Hgb3jR}Fn8{nuzB04X%aoc+?yUw#>`D~?gW~8uXc^rSn1kHH7oCMU_9e)x)z)ruoFl-MdWG;J=VrO)s zHlym0FfY+mkrw!Q%L*j)i+=<6BhCB&IB^u@u*ykZxh$Wbv1Djp9tj}rXYBHQRxSOz zzHD)%(OSB%mbFf?UH{(;VDXyX2JK;`gl23f(^7RfFauLa}Qw+L^ zA!`vif62$t>Xa1K`Gy2s;6SQh5g*vc$!Muv#})MlmV?+AlO^ddmE|kTDS-$`w0;)C zbc#>oSV#(4^p$dO_VF?GG+-J-ic(4MgRV$tq?}jEHtwDom z{O-kx5+lj_;dYJ>eIG*0#0!FzfUA2er8=dlUM{eu{CssN6UUo?Xx?GuZ{vF26_l> z=}k48NRrOc{qGK5f?=cOuM!n9s;tXynRAL@41fDBtDz(s1w;R1-7O+FR!rP8Sh*S^D1}l`4Ib_BAXtwx@~Y`4wWa%v0&k4C+cT-WmU9mHlYMDvQ?8W}$$#YLyVG#M4nx1_Qnzx179(?K z(@AHz;ZGxz-a|FKC-}cUv7fA9OTxQ|R}CIm3Z1B;<#9Q$wpM1Q%5-LULg&O+pG?qY zMB|i%pfPLFmy`Y3+yW7)N`=_JbxSqBe~`G}YYs7}1W;{_%K%{6^eEgAPv!J^5OQ_E zX#LhO+q}6E+rYB5tPdd-{dXH9eF*QSrT8)Y@2!9twm#ow*3eJd51zkU3-Kx0`}v?w z%fVVi_4U-l4m9t+Tn*WvwJM6?ps`1sjiN8Q2)LXuys{Sx8NDzYT&iwsz?@N5$K@quypt3S1}IeSd>k zTaN^{W3k;n|An=>%6Sb+4YY~XNCOJp=efV~9?@GaQC(pqsoV&y=YiGVNo5(*w zkN-(Ju1zTXdM5aP0mx66oCw;25b&8C#pl8vLJJ6nlz<7GeUuE_Pa@a+y=hxK?m|(_ zT^BmsyFSs%&*9_3oE%9)hvEsOftF_wgQMoqGGy_6Y;B+s8-&hW2*@eR{&LyC#xFfN zFv-MHv+}3{;xlP&T~kq&%n|tb)oEDH?54_naP!=s+sj%Z)S@vh+!wgRB;J}C0_=dO zAHldE3Af}6X?vrYW#6msUzB3kKhx!MT5tVxdMv+R@;>q^5Q%v{*(>w9InPVpNGnD5x8uKEEqyIaj~S; zTtUHUn@0{*jBDO8;E`-K6`3w#p0-D;;yjHi(Nsi8uev(dvA0*-rSeSE|4pQ<4cnzR|p6ca(#h|1j^EH z$sy2EM3JY@nV_S>Djb}maFu1S_+FBk_u_GW5Qki#X5c;Z%>n@71e*z4o5@d%yFBU{ zXoTo~&-qpbraE|n>{EPj=_B-blGJW!>H$EV;^>Dic(NUHH$fj@e` zcf7nVMo7m;NL8{{miQe3U)i1uO%aP#kmt{vf58b}WxFY3f3%3@(=D_k3R2rkoqUV2 z4_+ahlL{R8Fsfgm)W~K@Vs0Ytj!eufHvDM6z0<0EuKh4^Eh0wpQki*|h*%0Jvh11M zlaF&@5KB1NIJ)!@LjO?^Z&NW!3k>|GuU>+$FKmCjDD1gfv_XCM=sNSy;8jB0*LR%w!LdGo@UELA- zuNIYdJeUK501`}WNH0f3iJ;}{Re(zge*YFoXIJ?>#fsx+v;5&&9(FTF${WR>xenO!{^maEs0&JzQ=r!m z6vg-Kfuq2Y(m)1DeroBO)Z~SP5T8T8{_6G9S`CRZpe_e%;h(-su3K3Pi*Ufd`o`3V zgM|!4PqAiJFytO)V!e;o-?1E~PjW>LeHz|~WFIwL68gsK`G!cv4)FAdwZei1bn98S zi!T>bZJXF-5#Qy|{*R`sjEbrY*JtQ%q`O91TDm($x=XsdN4gP^2I-XUkd_c6q*Fko zMY_Sc=eu{^wOIUtA2WMq@AK{_Zv@&sR9=jCw5Bb?BdKJ2jfcy2sY>HfamSLwhVTIO z1v{15tkZ|pOKN})saUxZ4IKGI*W7O()!(m$f62@HBrj~l{TZ0IB8V^RZ(^6HPy9RD zX?0P6)=g#p`o$cJIxV@10r|N1PF@uYed;0QIyLSW2TaLb{?T58QIwo=_rLR^K33n_ z?s@c6P$#$EWr1?u=775NKYjTACXg93B-mUSKuVU_f1-`J7;fiuJCbe^XlD6k{_ z4X4%%+^MgYf`A{Fox0Y=l?Tu75J_iZ*}1@2B4k03`WcXpfCd5UJj&mC~^(4L_SLkhc)Per%g} zi(lxQ^Z!?%omNd|PM;ph`0e4f5jiLzz?vaQII2T$eN^kFRo=tbcI$X#9yzr2lI=5) zaOWr8ZaJf7xGE$W2mU2;1#cfvtT2ItGF|(|e0>|4JVS~8m!3*4=^r~BgEg8bDQy}8 zQvD<}_e7?Fw>*pOKCfPj&-UW7AUWo0J!OVIO0=Ew-hw_v&?`%GAePE#VH-%%>4d|X zjA<77TlCA#4S6jdu+;vmk}@?bX4q1{(--&L4r|5fMZ{R49g0gP=6iFz9l{+DKz{vU zCHp_+{nz(shPqpn$k8jl_0y=5RoW-n0e=JV!kP@Ft(w=iPplANHbm*!3weCOmMH9_ z;BgV5;%ugZA6Cssm&RooupIDbj52NZ>&UAu0~A8SG};JrmK@l`Zsq+~FO~G7mkVf8 z%()6WAGyWtInxh*@OC>3g$7XHOQUxhL#UHK@22+o6czhm7ef>kKD6&+$lZy$2%Vg8 zVIMOJMWIa3U|XGiyY~-ryXOHhbNX~CJ4G^ARHS}Twh^8FWJbXBeOk5sI`BxRhO+?o zjetXy6GfI*8}6uKzke2@tthB3mKDeywK8#NUgS)8+^EF|tgJe`FJE{>5#(#QXXv|(#vE!COzM1i!Dw3n~%=2G{%OP+8rIf?l72Wp{HRD`Wn zT}n!sW3qYmZSHEUiaGR8Bo0V0WrVBMbW^Qxj9j&bKiwM|TV$(EE(QDksu~&$U9Im4 z2^o}61LCB$PX27Y5ka13Fo4Q1|JEO;H%5q#+eB?24VM*;UZGA=axf_FFsv37b^w?7 zz1kn>7Z(y~8Hm&0uiHK%*T{|%9LBLA;+Ns}@H^JUb-ZYcNa*d+Ug7z<`-TM@iNeUo=lL5WHsk~TKdp6#=>!0fm5@M7Nh!^mwloRD>9!Lf(2n=jJ70pIZ?-y% z7!7!cHlI5Fr)c)SPy)j_;0b}gnO6@dp||^+16Ijx1+r|qa_foZxL2P*Nmvj(5DqJV zUsZ4*!vPTHbU*C5J==ueoSx0?n@I|9tojlltgovVuWv7EL^Jh#5vPe8ZnB>}jxC&$ zRJ6kYDmH$!gJTF4eRX&Pw03l)VRf36+?x1nOGXOH`* zLZ7-)p4SbO@%=L&?)k+U^7BW)ra--hPQuf*VaHzm2zJ7R>ug9NN^WEU_T&sHjov&| zYXKF8$MfF;79!hOb+b>PAtN}$gUZ!6C@~`GzVTmfgitCxLY`#+yf8muRKRUnBzHgr zC*l6q6%tEj>pL#a`j`?i-RH7RDaP}OZd0rCwAT{wmR1CbqBswmg_4GZu z{#VXU*Q)9ArY3G#&36%ZtAS@<6B-i-Ewa>v92BfzE(z0Bz9k~CXCyi>LX^bD>Foqu zZhk9)c7c3-j3&mafiTwd%^iIwnzSV(8MeM)JD~&z9a({jAlLROf)ZC`I;3o4{Gu7| zgRaO8Ei9Es%GniBj7Uojf}2OWOudhsDdLWh%7GCBLa#JlZ2%_AT2dKM_<;%$ zi(8VR<~KY7FE7vD>`?;y+FEpo2e3U|!Lhr=e24~s5329D$#Jd|Ke})w1mr!?*O8G% zNip(7y%ngpEn3~>T*ql?BD2g4XcQdUmk6d-@22W*Wc;PX6dyuF+}}D({51K>7H;$^ zJMf%kngKsPmpbs^&&wwb_|bWilQzAXH2c!3WgK3Z8T`WL%f;u+>&Pq=Q15xw$xTHz zI5^M!qI^(4i*m$^5mvZ~JV0+pD2M+al^t@{6Dlc6?dsP{-R`SRb+Qt&oP=Sa!|#m?!|cLd_4y2 z-T0^2myy7SQp5Q1H=Q+^{Mg+6fLh@QO|~(l;@z4Cpr7J{libH5Qn;aUK!E@Q6yG)7 z4b@Xt+E`47*&JkGeJd}oNa6bE_0plwM)Nmyw;x&5z|JOE7qvC=>!L_p#t6!kO6G=@ zoHBDR%tXQ($ff_nb#w4yHubQvF~#Dk06t+Bwlehm1nr=3G#uNek>{KHJsrR&_Kf5QHkSM-r=Zah*!pUar78zFOf0ec*9i;qNP1 z)0NdW83;YhJ*S2w86aY&WmMYbau>B5l`OF_?8gzU{E!)=eXokMeAgi4T#?3JcEqvI zrXGIVHRmI1kn3nOqRFqh~UK)m9Z=NF|z!W!;(ajbXeGY_6biB?eC z+&D&ZkSMM|2N*m}S@ks8b=>}4NoTfK2b12O^u>J2db9f9dJ$4AYLJAlTiF*#JdJ1e zH(~h{D>2Tl$ONO%A?dkp44J{B`y4J8PjK0Gco;Z)0=3|qBh6=l>v#3=HM4=;KM9B- z?0QZskmvA;O!xcQvQ6=oDWY6LCbn4B(U_{9(%nD{AyKTj@|16Tf${gut%hHeTQQ>N zkX;KX0E9=HinL2lb5b0U^N+=E=`hegOzhnRZ7S0@pYjI~F=E+b#qEyj9MTkQ05ZFq9iPYZ^6i(1oU|C?Qpg{=8GwO8u2nn@Jvpu4^ zQ1sQO`S@8Qh0#LgH4G&jWCW^dI8kD+GH_uV%v)?`ckF0%9sYr2lE-}|H(hq@u|Y-a zWtWZqhl;}KgL@+=fSe8e8Rfs*z6Z<%BleNC$g&sB@LURtyUF^H+RciW7?^28pwn#; zG2|!S)1~2zt6!2HI>M*@Z69Gbhj&Eam$YGlY}VxY&Pwz=oTgacj+#_Qgs60-b0~Yq zoie(A29KvRtm-zXUNMGADU9)3OhOb#V%q~Y=liwhyo7z^?^BbOEae{|4GB$(-)wG~ zv6-^Brd+CP*Bl~#0Q2wK!^`bA3JQ;h-DT||V;<~LVTq8^Wd>&pk;LsSJST+uEXcUW zwDC|atr>LS*hgyXG41!-=N6B*{JQGz9Hc_u6#}H@0AbA$+(v0IE3*1Cm7AdbOV#tF zoVX6$k*N@wP&^>w0MVyUU3rqbEg1t=ZVv{FGNg>NwpNPyy_%;GTPRr~0_Pvse+Lv` zm4{I`dMPjJG{Da3y0sa4YvyY{aWiU)nFmr)&!7$U%y#o3Sk&w0?P!~gppj%-ODMJt z==IPj2$d2%DtU=fp^;!|EmVkln>Sqh&wa>Jx%JwgMyrC$c2$W$vEOYk!8H&*yNA;w`5-aJ|L z4$sT=`P-Wl%9*kAtUbE?x%dHsj!0Zlo_08FFzIz^d#7nHOLfpvEJ3+1c-p(*XRzogV6 zlBGB>cDEJ$;byPO;8f!8enL|+J)j!l~!p<{+9M+dbtMQyZhV%s6-E~NRfUnk2GY0m*$L=Vz= z3oz`Y725B`kb6i5HUt5Z@P6%V%8!$j zu(Sh*7>uq;pEY_f|i1W=S3tM6g z15??q_t@%u|4vNfNVQW2>TDS!%Hn!uGM;9NqkC?d-gi=k|zwR5~cp!l#wyo%|HY zP1sIpv@oBH)&0}!KcjOE%~()p&&IxPquWMeX*a85pi0`YXGG3m09C|&eN%<{wKbCx zs~Khh5v5?A0&ro78o%|br+8W!)NXxOO#l^fcI*aPqpO#mohV(9!fBH}wMHEakbG!0 zEg(^^AcU=D##b|_d4^j!f;bVveI5F=C-cy+o=Gdt$$A@v>Lg*Jf#e5Y~i z)s$7jJO6!OMx9jYnc(M`+wA|vRF)q9>l=fK7DUDfnB59xR8=j|aMUR*$p7A^R`9Gx zm=*ABu#w2=x0Sg6@fWKJW3=@(0_;r{QijbL7d&1f!pP{rEAHg2RT-gc&rR31(YE_) zBOkAe(=W0N9l@K`cV>NBIxc&C#{*+Bhq6T07*q(-?;<1pXNHhp^J( z#R5H%x+%&Q?%g)-U5e^%wR}%^@HVgO-#6Kmb~z(=XNTt&=OV|b=bXl0B7zztj8mdV z4*>v_R|#C*h1F~w?Lpd7Co{>En!-jKu|j&g;(M&d(Ps^BQj4LQL<^oa`gN5qw1@*o zWY*Gv)Zd_7S+=c)H9T}={3WcQz~_~D=>okgunvk!ry#uuI{!8fM~)sCKf!^Rx5r64 z^~0JKTOUG;p)nD{fg8A#o*X{@QS)Cbge#Mhwrea_02qW$(Lv0JLFRcgu!}qeWgK`% zvX`Q|Py4OO#xMfhyu$IwYzoK!wr>B?0p^|}4%QM5Qr5_g*5rK`jmcgCcB7V`@!jx| zAfZ>uee3SoZKcrViFrYd)t~EwMmdInf@favZ?E~RK-z0e07DDnr*ytIfNk&M9^kW zSvUj{wOOq?T{BRNpc>`hI|g|mg!IuoHiBU={6Ir*8;a6L@&Fw0+&X1(w+W^}?X;Xs zq9HQ7dBaW#Bnq~ z8WODhz|Rw_p#kq1^MaM;Fx_Vfd1O5LQ1_>y$aeJd!6xP z@1=iVgwf?7PU*-w;Z~rEaYgUw-H){a)2@&kiL`I#*XOJNzuhZA{x=y<#}sfGipMA- zAo{O{juzs96wo~x6|XWE#R8-K==Qki+<>J$$I+#8)H$(a>ErW)NR8ps_l#g5fbx%u zt;YvqCGN4ru7`>SpwyjR7 z@O$1qvlAPazj=*ajghJ@GdOPj0F~!+D1H6_NQ8|RcphXOXKn1XCy`$eS=e(_^d6|$ zUfzXsg*Gk?9YQUVwQILU_qNLI$>%(qmrVn)1ZK}SxSGHHMg3Z0D>ymA@I0(}m4PAlh9w80zKJNmsd*f%{^3SEQSYYglR~I6 zcI!-FOOvJQqPCR`=me7AD=4?0DW42#mco4g_i$efSDkBNjTWdvF(!(;!ccqHJ zt6A@hmU!q1oteMnS7Czy6%&y^erSEwHejbF{Btb-K_QR_4?tIo^tL!BLIIAl8W1Ff zDCMpFkicsLbtct{Xfo>U-)%kdTLVAQR-;azxPuU)my?M7bCP%^X$K0nMf%cE$}0cO zK{6g=%!gnArYeBTLoTq$_t4twxbGf5W(ZUl2o7Bn14p(V9o~D7?SHqL3xe9Lc8>Up zYiRWd2I2{nQ?aDpXr@|!WF$*1mefK+iy^0_vz_?hDQQJn1&?06W-ed@^Y0h`?F-=f zh@1loA{z;+s#g4MwJ2KG{6AqCjim_vU(h*UsNf;tXJ%+9oF49Mk-tRDDp2Uvm+sYn zqxLEwPiux4xJCeUlL0r%_|2yU4G5qs=)?8`C7MOnWC3|J;{UY(bduNl^oJ7j@6G8C zssf){;_b?pXP(>I+ki^vY|uya7BzI^Ok-lb9m5+Mv^wTf|7~BKs?hb7AoB4-()+i3%n|P7*)Rhch{# zBz8($d43_rKSlhe70J2`d)ZaqK<5neT1}- zsh|K@Xi}^t%5~8W^F*IsB&GEoe4m^SFNS_4IP`FK!_`2MfoRqv^&jB_0Q`XFi5wai z#y;WKP%Rv!$JePE{H?iQ6&;N zAD#uJwMBv~3Dcon2*Okcd3X+u_1wMF>XSb<4V~#n{(hk`(_HEfS z8=XjoyoDQq{(DRk+LuU_G8ECLiMRD(r|*ped~Hc?|E@y-At%bHu-;E00(%dknV)Y0 zv)N*89kvBt5lFT5-(HEjfP*<>t!POBF>wFJIT^j%#KiVc86u6A=R@(cH-NB8wQXld zC;=GN4sU)L4dAMs&MbH5SmXy?P!4CmtN1e z@|9{ayPLN@2p&0x%O<3lZ6BRoz_(7f274;N3w!&<8;Xk>OzZ-WZoWDBwM+{J8rc{` zJefAI$8SE?PPd=DcKo4C*1xRZ`76HJ zPWmW>YRc68|5Cds@~KUcK@ZQuL}sGel_KNvHBW=XS(q@F&@mD~B>jP8DhYq<>535p zEUs+!Ls6L(1u&S3=m?eB-qe4M*nLYwei?Y`1ClHRra|}D>bUhUiKH9y$G67=h$PH5 zhL5Dk4=wE*;AAuIS3Ppfxudcq>7k=0@zJ9!l11y-{SKbC5|-c~_kI;(?qm67N#+nE zv8B{d-%yf1Et>sX&m`1tYD+R0S+eh}%||K$2rrQsXID@MFRn%LqDF`up@RBiHeyw@D;TvP9%NK8^lKZNh}?NMz%sl@oG z`F5?3-B#(z^u7&U_lc&8`{p)x(h|O-|8$lvNNY%&%gKgB5zGEFpd~&qP^mPY|9dPd zmL2aq#C|7%=#{G2Ir#4Yf0OnNF){TJ%LXXrJ>~uR$MV{3=hKUb8PXJLg+05Qqg7n)$L|reeq4`J4;f| zXp@b*_RgAegR7jQ01#7G6c9?zLn&vTANFk2Z}LJ1&|cL!3gp((m1Pp!GrCzcuds@P z!HRh3_bF3*XE%ws!h#(rF}rbokLT3j(1i8^O&&|gh*ALf{u?8U^w?$Xc;_w9JJV2I zioi}Rd!olq0&u&Ut1v-=l=`EmxUSt~H-=AZsDKzOg{^CU_YaB`^01z9=tnhx!rU(?9!Z1rV(*7YoiNRa%YL9|H_dQH^-#h_ZZEJ=P@T%;WfFynTOIOOSkN1MlFl*NM#%=DPPpf+_ z&r?}_|BgL{D6>F?4qx{0(|kh_bL_C?-8pXPd?Ub4ht%hH$?;!+|H$bdfft_IB{~cI zJ%yz&Lyr7GgIuwj4^NJa3>~030eD%}QYRk@5!KdcXnl+d@6j!0{D$3{%@{%H{yiZg z9DvanhaiTnKOc94WBgxcFg^ptR8)kC2eC$qf0_*#+ru!qHK!0~2DpXAA=0mC_XrLk zEF)baf@zQ~H=+5R0k33O^G*5tV(51+cG`^Z(kV80YUOj7D<)9b%LGXq2-Qu(Zj26JYJD}ooN^F9lw^gaQJ2DQ~iKX z=iA|tnTGbWJdpP^weJg%c9|!+n+x^BtWpXF$*xGA?hEpqEAZs zHR*<-)zM(XtFirJ%#{5m_ZwPcxz*tEReP}PXh{KPqbxZbY$F*^Ob&~wC51GxM{5cd zKLA$;mYL(f3-LUvkKvOEf`thB`o;)Q@>nnG|1xn@t82k+hYKcvSjq*vv#s|9;+j1+ zONkqWrXx@A_*uF)Nt<|_PEiFty7tAsy|4oswFH)y&f7QdP)wf&a6uzS z!lpK8suD~(|Ix5&07{Ju1&_#iyHEi=4o~e!zwq4F5CttX=8B4i!eC}I-9HB0Xy!|z zZXN~;cg+Pnv&HLvD`CZBI+N!66{7&)E71|Y5YE?@+R1QhPmHjjdb`mYyuKVqH@9Ow z2!llbxFs64L|5+~((Ls~+gXL+BqzyyR5L|JB<_#3|D(KNbA`*F{%uF4@8)w4wffTe z>g!U6dBrBm_?1qwKc_AfCxE@AiKdtRxq^9y|I*LjSF7Ch2I9Ae$=llx%yCSR;u;vQ zKV@k%GKlw;PV2Xr(jj#+Gj{XI3~hT!r<7eFCH}1h(C9u`BOkA6JsrdE`%VUVsgo|(m}?^{JA&b_TsFI6HG&?r zJNoL|dQD>PjQ&y&#S{3<`u{1tfO?O~K*^FV0<934-bd4-;VIK26(RNNhtYlnv+iio z5R^r6r9_P!vml8@f!O%KuqFP~izRNB;nS9ZDIT3^;_>bG^t)1XUV67;71%1sz;}E~ zt&f_&Rs3$MSOSEKf6k1RTZFjdCsT_{r*OTuG0;ITvu9-}reMiM ztiSJB53Vx3z*5T!L@DUpZoF-SooO~anfly$lSwT*K|Hm0Dn<^P@yo-gotT^XaaYQA zZN3ED+kBmSoe+gcit%vvyOV6)bS0u@(l-_QU!%xy`fZ(gKmdmJ9B&L3?$C*QxYg^A zNYtIi)Qtxa@MhG|+3D_d2m@2??(g0G);ZnSF*9tW95G<(?Tbzy<;5(#&|uH1)Vwmi zI7!vFicJWaYl-I27}>7b=@O#?-IA48nQb?;abaG}iRRof`Cim>MGue~(_*|gf_4>Y z6T4DGyOp!i#gfffd*!2U@E^=S1D@5MMo2;k!FdThrQ`7>20x9A8+j?GCdhsoH7$o( ze>%0>Vo6us2Gdd1h%h2?#3x|9h;+~kCjRpo26|Il9pb66uY5SVuHiFYdN*Pf#Nda7 z#fK;9RWXB$sR&t|UZ6Z(Rm_ z__p_f?d&XIq08J9Z{b!a*9FI8ILaYP1Cgxv-cZxEKiQ5i?v0XW_**J*@oTxi&kJf# zH1MHNd+X+a*ol#_@=8JqZ}}(&bGt6%q*;sa6v#@cDbpmc0_DNBNSq|OuRGFwfltz4 zYJ{az5G86X)(E{6m^xfkh^t|iHC+2hAum9wDX4wyc&u+`j+62;$?jd~8d*K6+w-V^m%?pIiWZ0sRQOCcRvIttbC^vNpuR#1mjcgn z?mb^4;pLw6@BDc>ODYaRYW~G$$zB<@EDeoR!?hGkjSVfZ$YD9~{^;T~yw%c3dftWS zwX)sjNz7cIS_~tx0sr!5m>~83jSL6+niS}W1}kOO|GQ%{u^IvdVf0-6+XwlmMqjnX z0K6ouopUO5h}eCV32Jxa>1#E8A9)Sig;n0<&)_xBzTf6E&HuV;si~ycQ(guFUMt3m zbfra3$;-C?DKa|BMU`wlMjlyJj-=I3-QnhfKbp_IbJONu$`3l6)qzHaQQPPh3B|2u z8o1xm+9D+?Xh2$3r;afp>CT*NbJgEjWqRq9mD_DT@0=Pz>mQ zoB*2NhTn}0CMnLnpPdvaLhpLZ>%JG zy#aVIU0=(|N6~%5X!1XHnf*dt;jZZH;)0+_jCG9tZYl6R?Kd^Do82bRXb`A#u)#-~ zG#oi>5Ah1;-G47k0~->3sZY0W)G3X= z87~RI%if?*hwh6gGIp(Xn)e@Wcf5e5G8SdtUl&e%Lg~=O#^rb6374$^ly%4NMkdI z;?Q{DgTv8lvEIrYy>FUKA+;?5$0X{%{JBL5Ai(cSQE91Ah27(b%3ZQtqgPK8q34Hf z5+Q6I&g>UuXw;xQXODQDD`*gU(2!FUu*n4m# zKJ3H!VHm-x7SQ{r{PIk=2EXALiHxHkpG+6AINM1oA6G4|QeFG__4oMDC<|~W|L0rl z)Y7eSVs0Y6?lk1IKSJ`oA^4D^$Rm3Tf`!JdzatmbJuSV^C`7cr64;C0wr>tf+=qu^ z)Yo^tDf_Y5kuOOk7j)XW-_X~MDl%$r&sx*=v$hy(HdH~22s9?n>GYXYWYYxK<}=Wk z8>p5Cq%ww=2ekK=K{4nuORC9TE#JKeWD{I47m|DbxA@_{#k_N)HRP3Yh3DNmOTo#x zU4R0E!O+V6YY;@yXDyK*>^g|EpAVe99$k4kl&jvvCkV=bWDgDWdfqj>Wi6^yI{Etv zLJX_HBZ}PXrjEEqcI_=3Z@IE_&i#>mdFu*35B`}2IzH%O`y$4DGDJduC$-C+J8+LfybavjaB{gRrdN14{Em8`q8aB;^bn$^yj(<47!dU!qdZd?c^Yq z`>S(rRq5~FKL|p-M#yq=U>M!Bu_0_|gf4e-E7uGzT>QgsV#k@K82amRS}gfwk^|I4 zMaI%CJ0FP-G}Vx^&-V&W)3J}f{~;!u(}67{a&Vc#IH88>wWc;^(t~UPVw~UDHwmvV z?FV=;fJD0qZ`IHY?HG0Gfk9B$<+nc{h$R;3J$&7EdvmkJJpQ8{J2gn;YA$UHPXeK^;9LRpTrN22*&z zsl~58cHvB9%C2u}{Q9L|*^aodthNtg=^OKKJn4q^&nQ4%`RZQWF+QEcVa8BW1sBIw z{_*XHN$d04`cTBa`$#VH`@#FR-lVktOVQrPlT&kFTU3Bsf;wz%S2H|(RkUcDZSOS- z3}4ckV=INX-!e;BplaizHPpjZa8YIy2>|*Jaiz2(>Z%Jg2s5++zya;nB~)KJw3&pRW++>56~f&?S|%2Y7al^ARboJC;&qeg#fWZ= zp3EPNdqQhC1R#oxja9P798P+8JJysy;Y+iP+xxWU9K7zc?J|G}Xc7YeD8Nkm5}H3o zd6b;ZM#QmGHiKywC;ioEE&QEN2u?90L;fTM6A*vj9_&v1w>N`ee@TkW70!kcn=$6(#)|_a`^h<&0p}U`TZ1JE# z6o2NcbN@iylfGN=n3~SB{lcEB-_n%%P>6mEejmVgh)@tj$q2u+tIiWfzrWAPcPj}reTp}#R0`jEb9ub4QCN&f1(Mow}qf+Vi2&SY6u zD+2lroHx5Kf^=<`jf}K-#CXBP6?~Q5796^q?5sBXC6e8|jXIZqt%-dnGtwK&ce#x4 zfJq7G)aPS;_e%{5rZDgI4bzrZc-K}Uc_Z2b!%@VzBq$-z9`=y44?6(a(Kf&HY%2!K=Svtxya}Pc*>r2<(72M~VX{mrJ$&z-6 zEiQ(`+IQ0(Pu){lZV=|R6LtJ3Y4oyk6;~gW#B2Tq%omV@1sj?ZgZVr!FAMF+QP1b` zv-xK_6|;%}yR*R$BJX33>kV>r@?qN97f7U6AlM_awiYuwQP(ZlzJpgfXE3@NmwWzu zo(P~#nW`F1s2Wxk`M^kqOXIpN7<#Sk?Egi*e};&1{o6hdC}fTvdN2K>CHug9k7i~b zr9WF2#E$yy^>$lE`(g zIu3;%yADrEXdb3`5Rjkj{M7hU&T6E;;^YI3fSsnw1T`OwuKmt(*iuFtm^@xeT6g75 z8NQxGL{rNMY>}?kAM8%P{oID^_%YBItd-D@idypI>#)69C{%m@Wq1XheOiM&bl;!4 z-n2KN@99X-9qcB+n_Y42gT{fO_yyaKoBlsFX^?_B+0}6~!xOrS4`ynmb*wLdnRL0t zpD1~BF`u?d=#&YN4kK7+1l)}sy}%Ndt{xM$kWb7Y^asE|KbhwxZx6M+hQ;BCI61f= zjg7CqrfxW+LIqbYU#~@D00m2kpo!0`+-a4M2>SVri|J=$(&wk`n<~C$;aEuF)Yt*k zNkD|4%E_SIW;`d453dluc{GCaDfkH8?ZvcaOEtn7DkAhOj9k=y`a@DQ9+AH{Aql$o zsAqpQHy?8SknW}U+}xbvejF6N_ue%QAzr=)48tdoDgK~%AU*CTJ zFfi>Oc=-kr)AVK=1Th4EA!}>2D`cf=qokZq4e;D!?MN2}^q)N)3}dM5_w~<*&c| z4o^+{3!bAT2GV_hz7j@iO+)oP-RAmtHT@sOO}f+rTZ+ZJ+)I$tkH(TtKu=^$;W?z2xc zWl<(>5o#2KubCWTr+%{ri;pFSLhpRx)L`MCQHSR-N?c@`YYwB*S5&Z<;5hU=({CG9 z0`xPAR}6*-a&oAX<%Sv&PvhzOp4RigHN9*oe#pBbPEiLmux0$IJyoc^DZz}7U;Zhg zxs(yk11oPZUac9+q*dbiKXzZNObeXmzjJ)wsTKSwNuT|G$O6@B)!N(P*J5*ra`>#E zl+dMvxV6ESV?xSVeE!5Y+L5cpG{ zBW$J~)sS~Oy#SjMc|xesQ5|~s1M~n%OoYllBmgNq}?Hb4@s z$uK^z*+pFE^WQ75MxMc~dn1NvmXw05+O8F)@YmxFwkD<~AHGxk{(Ubdz;3tFW852~ z*^ddnG?CW{`IQdREgo=jmyM41xMJ6DhvCDXq6D2{5n}2QJ?cn#K11I=;=wW*iICBe zrKIZ^X@@Y!&TY`o>)F-3E^VkWx!USvvyAis0My5WaS0_@uvtz{7BO)_ADpulji7lC z2-Hb7m6XamTq-U#Zm6C>FuI8PVi-YM%_#n74FW!DyOX0*IgPolG(pev#NWz zzm%*vrzOWHh{~MXs(y#i3v~+2jB-gpF$ZF)^tL_}St@LP`}V)@c|=Xs-4_>@FVuP) zo_`hb`k%x=InE#v2>$tXv?ZR{{fcR1phH>{SzG?OA`r6g(}|Dfw|)Bv!Qds}clduT z0QC3e*e<4GMKj*;&c07{;?S?}X!LZU20!Z;_Gp&q--co%qT~^^XE=4h-G~bw@1g?* za4@RLw>t>dQhvCD{R&vfh|UH^pNMNf$}(pg0my9jc`Tb#=N)C2)5^*%7#$A}1dlTe zx})K^4@nDTN6D+I`D*l|R_dN4e@WySWB^zm=YA;^d?#4A_YE}KyYPDB-UM@~HR;bo zJOH(m9w+A`*Qx=EF(DIeeks)ng%~w%RCF}H#yf72S6GoY3kl=sNgB_7+C<3RKZO20 zN<8dyB-c~$tuE{c8FMZ)R5Qj=)jKmp(CTgBFV-M8fAhZz|6Z~g zCMbqWJ2}wdal(A2;fM+s##W%A0Z4Q6`X_yVN^);WoUdN6TPB)Bp+Gcei}!9`s5MWK zYxDAgL#nlB?YO#JbyI8k|^m87ETJ@S}13Tef z3w;aY7dNRx-lqYAK$1-(x0u7zN%{mAL#CL2tU`MVBf11=A=n9Oac5_ikE#xEri}LY ztVM-*SxM@8F5CvJcXWuxPX}Kpi9Y@&C?6S&dby_rMo)p7p}VhhDnf!1=-opWSVZP&l!uvWlEq z&d%G?YaXCmI~~i!Ta8}$7jcH}`z~^#G#aR<^Kww68gS9(E&L*WZ;uI7%)Q@Td9@P~ zra9OS-^=X?*nQ3@;N5CbUu-p*{a)s|Ps@gMZmpYNs4;`x@AQIvZnf?;)xzVDVWRw6 z05$4p6-29Ojsi_ulRbl$4FlolzsdeK!l=5wLTWOd{V*>9Gx3aReLP7C5*yHcm|}O> z$Y?O2oE$LOJ|0pI+j%$nWl{U_jCqnZY2h6%uuM_FsYLC@8&cPN$ZG zh_@roSy_mByP$wKdCdRTw0_jY=T5Nwl-CCSInlKrraObEQ`Iw+t+@WC+Jt^Bwy(VB{ByJ)~b#3wwnr;AhlBSY^jFyMJ>akA;M zZ*;f+x8K+0rvmFg3PI`6acKM7mRr>yVQb)s`rT#pz)g{3@-5NX7g#E^=q&+&$IXY` zoftl6q0Rg75Lmx-YNNh$d_L*}oH!4!#8nZFAF)M|E-v zEX;U`Ok3w2BBltzh6ndY_YGHX7n{Ot-61x6j1={U+4i87aIEQ#K*^Ejm5M~Ivf51# z2O7bf$T!a-hDgtrpO;LJXBEXnJVHVchKj}$|AhzMo-ar|^McWd)2ypV0)xfKdGN`W zxjg&B_1Bc8^E=vRjQOQlu>bh<2KQ%eW?9GV*0e!~dY#nWB(6K8+NHM8LI9X4w4ji) zfKo~eXP!EsXE4nqIVV|QO~*WMj5y>SySs9&q_?%5STdxD-1yPOg@u&^TkJxuaSCd|t$)SFTE-trK zONYnRK#xwrhD-GHzLe1K(XaYQJ07L05 zW`|zl{QHv(N7{Uz^8GJWtCakp?5NE^<>TCxjNSeEYp_+wk9F=18ECtYq)%2MnQC=) zGbyBs=Pw(=0Kz=7-;V~jCF*;ZqJ%fTH%ALnnr{lUWsj-lco9r}owc&A?>aH`0tp@0 z!Fs+n0?Ov+=k}zZ7F(LK)zE?fq)P!C&LNhJ5g+>2NB%x6eD*txmS{0n2>*QA6Hn7~ zwG(&zZSV?;VA|doD<94bYpu+Ptw%$$6Nd!E0u%1${4XU&-R0H#Kqa;VMW}pVHudS4 zC$<0_aW$cnxKg|#u*U^f+|bw-HOg<8>yz4}`aHXB4y{B1RFC$h$RwTFTi3WlWha#< zG$@MapX9s)0?5I*jg)aq=x@{#xdCDK>;`)j!6tSYJfvl(#HHF(TZ}Bs$HX>2-RK=5 zFuf+SU!PBNbub15z3}o13Sgr)qeqJn>r3WDJkgMrxY1TBC5&A% z+kgfOzAcEHnhx2(p}C(Q>9!jwsPvACM$q)iwnBWvafwtn#)G5<;%vqh(d)W)Ibrk# zf23tw?i(oLPg2W)N}c9_47(OWdD==8i03eYv5Ou{v^6@bb;%Le)^$e%jSAg=IPRsJ zkYVPjYlR0G=1qET@F>>P>#uov`Xd|)z=~fAoh)8)zRJX$B|C!*3aF5vNYrQF zMa@}d{?niT0H#l)uAzr2TRHlOUI9>5F<=7Dg_Frv ze@P43tZ)Lu=DQFMDC&ojjZQjIunv$$K)55Uixd0+ntKv^^brEVbfaz|l8SgH#*3hh zM`Rhg-xzXdLFg_~FWXsZ+}JbL-oILnW=110KRFIoc&+rv58Ai?BPdyo=<5GQ-~zTs zvtU|{HUt2V8+PZH?T>~rsabaX0O{{8>!^4*kT;^hZ zN!P6LW8t5?Y=lul>{3mDoVbfz+@ zuxG;H@O?GG9DB4rHyymZrlcj*Tbr4!sd$p}fr|)YS^MUby5$skWVpDf@frke0CduU z{K?t{B?xGp2?=#@tWw#rWy_Q&soV_ok^^ocfBuK2YYgl2jrYH7EE~(V?d7%XTDEPk zT3-6)TDEO3*D_bjw(C6mpL4FOS9`Im?&rS0{2-TccCV3oW&hVSCw#vs;0;gYo|!?| zf11p+l`zza6a9PYe z-}1?_75aCb%YvGM&_op(-LOA~2F{JwIfrfh25W^S-5KV9)5Z8RA}SjD57c6^>4QYP z@Oyw1?i-;4ZX`5Fy}>9XTIQMmR0r0J+u;S)%YwC>Va2J%tXPgbjgjE2lZow8oKpiw z!xqmEi4`U5^y9;pn8Sy62FSnzFv#hyG&$y!Lkf>-yXhuG5>xrY)A9PXX36Tv?!*;9 z%zKXGJ`eBwto)1x=^y8`Cg@u;+Z2(49ekWoi)n}}AX`Pb{pSBFb+oWR4eHqyEQ_j{ zg{{utUC(0&0i((rA4e;vzLqyAQU2s1p0_7L&*#c!GWi&o@f9)hoWafR8;q_u%>X~s zYZ1Y}{ey$DHH@ls#pj8>8}Q$=wjOmJHzA;O#HZdQ)Z13~7)(%ji;as~H-M@TySCiVpdWQiCk9rqa$5Hk7dYFcsTS1HL+ zT}$9Ao804O^M^lIp#T7ut5ycEU>%KND-*Wq{V>CW_O;G>C`iU0v18obkwO3_2K-$Y zwy-K1j%Ie>(<7`;{A11-&bJ=uZeTR+N-mXujWByo7>M{#x1 zKnR)Ih1d{u6U+u|`R&8Es|RZanu%CtCFN3K&>>Nu1Ox@*LX}y#*UZ-)Euca%y)u0j zL#vY_GL8P`S!u&rfGla8#s1&}hNT!Q8_zOkHEuTc<%O40`HVq@CHK+O z0Az>(%w{msA^q=pgy(J-7vNE2VTPyCS9xauW&=cZ=M|#lzm;rmhNbrCH5HZ@#J|P? zl#b4-VJNxtH;RPVpdI~-9rI{Oc$LoR-Z9~Mrn_la?(~*k#bP_|BS#5{b^d#}gfQh7 z?H_Vff(Cxy2MY(AgcMV7olH2wi>dp$pvu-oe*n($p196XNaMg5BRoKcb;;Lf$==12 zq{vD~kcHO)j zSfG;@)%GV~;ZAYmi$O0r8>Z>qb*I2X284v&IiHmwYHY49Oa=Y7hg-XIB&W^JAHSaQ zBDRqeC~8hjXW)K%+72$V8bOBANy!^w$C3(S93u-2+~sY_L`9df3!{m`_^S{I8*olzI(rGocjSV6Bf*$(4$KKzmD&gfM^&2!k^wF zZqU|b<*FSDFqsFYNg_LfZ0lMbNrMEv_i$Wv4kiP z$3Y7XEqA~)he^@Mge52|#C0%VC~0)7Si}!s&!y&W#vA2Axr$G@XNv zb;UQ3uX18*_h;sa;O;KgfeBd2Yc0i<&HzGqW-@-^J3Z{*>E9P)ryycDfC^pcJ7tc+ zk(|mmWEg-0)pIS?@g8lsRS)1+YgUQ3r0^Gc(9kdW+3+vOT!TeL#p2@`FTR;af7*M* zWT1lSf`)`NK>wBgE_T;Voq`0q&}kYpuP@y*vS9tHN*l@4ctMCyI2hvNK|aQ=#q@PE z@*q`bEKQm{f%nn`;DMk4d?+HMMh7E1%1Sft76M|V8-%11k&;ANDTq8PT4aC<+GBZp z7PauCG-IDGh$bEwIrHbNBNr3hm2U+|dH}dDJ8ST*7lK-*|Hwydq!v67C1s{GA=fTc zHts2+JK!q<4H{U$05lQRxuCvhl@-bbjLEXYy+rvWu@>xhgXlJ6F5#D07sTiyjE-AKemxrH!kDwoj!F`{-JXx z?HGyn&#CVbKy6Udgeg-cH+5DyVP|V+PblKkN%9?4X3Ldd44{XW$PM~-1=@1QX)&Uf zLa;ypi08X@RyHC)tcO$Qx{jzgW!Gvpp!0k0O8}JhzmKE;9fPXV23FC;*A+f)v8nf3 zaKraj-S@4z%V^C|^O~O*2cj6oAOgi+01lBg(I>wGc<=Cu-}7nn$Uco+LWXje$|sFN zi^4;T(P!jBK~eM&Xt9EF&EHPB1)}mzwHG&)675x9f%_BHPU;(I+Xeqj?(xjFD&X;m!0Y(>z}I;sDhjsBGu>PqU> z^V|-pPzPH7)Ir9H5y z;qJF>b(D+9u&-xicWeA3!8WzB!;3o>VS&tD=V*b*kAv_rgCUR>v8wZ3Sor#Js`2$P zDnImo;m*mP^4n!#` z18KmMtyM#j&SWG2E+c@S9yNCvG0(V1o&BQ)E8&kT9pUT9dt#kpcuzasRcC(Keb`B2 z`*!^AD>yY6RoO$z&2gGj57#u+B1O>xJ|C%<<1#r?v_w@8JO)2%Xylg0T)TZQj6@J2 z8`Yg@=BJ7g#t!p56`k$sS8Gy*Gq_4had?m@3atHH`IFASAxn4rwsG<7_%cU)DQ#ri zTvz0@ZJK8?4I`_JDFrXfHtL8ASx%l$e!`!4aO7D5iq+u5O%;e!pS!DZncg0-zGG(kzVmVdAO2F+)R<^yg(y~y z84YNRGztbSU$W{k7wa5Xi*z3n*lfI@9la4+)I5r`t5ulYy2$8Gc?&TkM}z+v|@)Ckw2b@RT-Ju|KN9?>W`h=i=2apwXFQ%s`)kCIDQoS zB3)T=WLVIZxOUFZ-NUL3un|S=s!~gLC|@j9n`}f z?JFitsz}8WC?Lt5n6XS{iuUw9d9qKqt6Vx^QNsHx9sB=)A}W6Tp^1Ub1_7M~CjZA@ zAQ@)2b1T}DLhx|MY^iICTSNHn<*?ZjsrE(v9QmI);K}P8M33Yk?2{w9=rOXRCk4rk zPYth7u*IaZu@`@ELOdKm(NlnOd%!9rc!KFrQUDB_{N16aGBXCQ#^L+ONo`lIm&SYH z?2yBc-;J&}IYTDiK_F?q)Y|a*$>PE=x`L!3AOv5o?2dJk(1S#=U@F!C{`{J(k_9>> zFNsYu=rh(gaWz~wa5!Y6eQ14&m>$gt(sraS=m=0Aeef0jSsxbr%ScZN&N4jwBg4|l z(!fifxO|*uqN(0y)Sq;Kn=9fXt`;ILYimDK%)*Y^UV4;B?-DSZNG6U>rKbh9*%=X# zm^K^s&oI;9XEqpk^|@DJOd()~ifS53D@O^jf`ksIz^a@R8$OCyymH z;5AIFDrnf#;5}JM9CKPiS+!}6X_6&4bp>ll<0$3+Rqo$&ENCK7DBAo5`RVseqrTM3 zP}j3Y6^Y3vwi(A$vLZuirvOG&;{LE=Il6up| zV)Pvkg&lLHaX)SRCPM zNgHY_rr*(^4_hDu2LUZ;&2+c0XRb@aKZXRbh)-KFjA*h#C^3I{-dLDcktNmuiIG**Z#c4m@imifm0!QxwwHV z6mM6`{$Dg@=TS|=j3^QYSId3=adv=c{9z0`&TdflTiI-+IZ{h=>VR&XyOSG5RHs57 z6~{(%z@^Jy=cA6l?tFmS1zviif606Gka1*97n>0(9mF`kcgDKEWd6A$|JF6{hbtd+ z)JK3E#ENzEam%Iu)H$$TT{!m9ym@tgxN*71y3o~oy*uHNXZ|&3-lZ1*-?W>5@485Q zw5(Kvg?Xyad|z~??DDqx{m4eE)u-8FXZP`=LHmp9jzx9zwLfbyj13*=^W=$aKKzjV zupDRDVSMv&!4b)`qIp&<1s>w|Wr6x%BtghG)ZZvJNfLmR(#I?bR|m9UvYrK4j&`8S zn2&)HoMj=~l839mEmlTf=2P3em z_rkX+M`IHaGEbu-SwsO%KdC^C?A77*mRvqZ%wSQ6kg($Do>UHUFu~Qkd#K&p#;wjI z4>BswZSmp+lYMn_!QH2k;eX522*x!#$?gfDPGW|WFX5gSx+kWN3i3{CO6H z{tu#6-F-zbd~K6+zT$XA^}#F2HK&Lcu)HIbm-qq?ud@H_4maA|+;n-idX6VDrHD$n zeCS{HUM(HQmdouwMA=;2c*gU6<89&hZ8-WD=KHeC?BnYW<{ci3cdI$Y_hn0UtwJn^ z|Ehn8;XF83{K|~vK2`uE=(+s@S+(AQ7WNTc5+dMr|NX=JLC!0L@XZZ}J~62ZmhZj8 z8*IAkuM3SxWElE+5q)Bn0AoIwKz~`*=D^XM+`B4LI(Q6rCU?*@0_=Q~_oKKE7K~_e zG#xNqE#a>jiwbU(DYx^f>LA+&s1=l}yl>LLeg)|HcJ^&G^nb6e7fq$Cj%KNkfICJe)Brv-y#uO9{{Zg7aH*5_C z)?qi+X`kVNc#^Oy1^ka4w2gk(Ebvq>2ZOlkQkbCb#jwkSysPlWsiXIDr;5wU(fz#| zv0TNmwbfJirIWiTg|0_)p3SMBWJVM8kg7vDY%oy3o!-NK_*q$|k~5 zm1Tm3r45*aAK7?b`bs+(iVCB<#zGZCoWUV&e^!5!oeG7#Q|7Fbz_j^bO5i}R3 z#XjE~P?OX%yr&d^QHQ?uR8IIH|d6tV}9r{5SGdyQJJaS17el~;ZYn|{kx{rzY0_1J-g1vJmA31 z{Zd`XTn7cr%YlUMK^Li?h*Z%0(@iznreRwPN)@{k*Ly2%GsYBnyk((BzhNfr_XCM) zT5E$mV`TJc2XE|Oz4sGoG#ws8imT){kTEOH?PjksB0wHfv~8J06$32@P%a*shxB4YcKhN_i-v{J(IX|)W}q-D`-TkFyCOYWZskE?e! z;7GTkyWg=HbGoN%UD*5`1NYzd2$!^c^s-rK0ZU(G#<3s!2)Bc-rpUz*V}SGk$!|f! zjTUqHzS>)#Vwf;=+u{|?;gf0I8#mgJsvIq%v7UW(Kahr|=IX{-BuGo>)6VPdYitw3 z_yweYZCmt7-u}|&DinzK0fNNV)y!AQExgcx!;#e2Ol9anI5j+BiQvbY3*v z2miEYgf}$uGplLk#+ulXzHQSo-P?s>t)CcbTp#)d?BAJ1T5j>A-PCtbtuyrA&`}Hp zdqZH7Jv-G%Z&#VaD-t(aYb@cfEQS*LKA-c3@V4Il*nRmX;2>ddBEKfd7)~m9Z}+kq za2-&Z5#Sb@E82VPWa95#vG%(2xph9UKuaD16lgNPGUv)}c2f@*n6b(xDB$9)4r)L2 zof9gy`QuoEFOU~@XL1Wj7b8j;+wz90QKLy|IKH3h3%>qAYkqB=m4eV*xMMr=Fd^S| z$l#Hic)b08EP$wNVr^Yc*-ve`JaL0X)=W3%=^U>5>8RBdsRVOY=FBtA+(YU`T4Xe$D(EwysR%hA760j=- zKSO~?nlbH*`&&lbv7*GM_j?KMRA{j-EKT5Wr9&JYQ`+?!k{dnu26oLQRchMHC$X7} z{c0`%;bASnW10oWLi*B3(Jv0b5Z&kapc=lcZw|hEwOKc*0I6Vg_&&0qt-bX;WC0YN z?KRIZj#n#T`Z7Am@pXrr+$s{Ia&>PNm2O=cBle{mG`wl;n^vOGKvv{$r8aXB%*=he z&PHZ#m{Aph!B5Yx>%>58?v5n&fA>i<)Eek(bxAYS5$7d>=;v-q0RR)<&Q7;yej$>q zb%vZyOkBO>qatG|_72s09z{|)a_jPmmM|nMYxgu}Y1vB^Gl0HOBM^g3qadS#p^GP+ zCG7FV;TJF~=MhPzH9_$COX*OXrY#)YM17qy8D!8cPaD{Rk2iDSk;($(pP{IH(gi<~ z&`?8?gs#zy$?eO31n66~#m@1`M@R`W3}`WmZB@>eG~PvEbQm109W|=I&PKYH4$_|1 z=CIru#6YYF77Lib2n^i2pdVvz;%;W;5ODb`OeH(?e5~T@>5Zq5I>rF7jBOiBDSA8G zJyb@@gFwz3FSCPR*F!dk84lhRHvVL^`6WAZ)qTuw_|*{J+-q z48QEFA~b*Nz9<;iPP#UIczB;B3bV}kGI)m7OW1L zf==T8^goW_@;tL=iDSD_SbRG6j+GkZgJD=6Z3651w9HsOIj$c7xkwLw{mg9*^TGL9 z7sg>H-Xgv^p)Q}5XK5%)PgR)Qj?wYw_~gh6@m}1|Fk7!uWQZklrd`SD$;ngie%bFP zh4=oKj`!|pR%7^C@)~{`>Wh`PyX6NfsD-%D&%^uIv$IP*3bsL7j6;p(nqFJIaOG|K zJVgkqmz=A>5dojK6qQK^|LVBQeta;z^A38^K8Lz@+DjVBh?%^ay=Gw-;@TA~re#MXKBvJ#&MmPX{r=ma@713H=J|M?)W_}}0s0mo zy^d%Fb(hh~Q(J>GKKj17ps}%Y53cvB)GZTX6j4Agr2*ooG$e*0TLx$6f4r4a%-Z;M z_?%2d-U2t-VBPpbZTmZCm5RI0_9zh?W<*O9LGern-=}B}qfRO^LX)Ral6>mri6?mE zxlQmRcFVK^RAcRiDC9AOh$qGeD()};_?$ak{Vru1g`}lPTEx##X4l{>PNGDprr%M= zMxFzkEutjpi5Y6zoj)w$^-J^zx=B=*S;CyPXVirhZaWu1aSInQ) z!N3Y~@xt_KlaX0^U zjNQ-r@V7tC^ZjHwF;=RM@p3Cc82s_iAo!Mj|Gg7$r0OPnOcxOmI{2w~{SLDoE3j@$ zMaTAaWph>5Lxy2Twf=jIGFx-J78cU4Ux5n^ev90JUvYzR?rvQ%B14ID(1#fY^qm_c zs#|UH?4d!=7o5Pzf^xdNfo&3*bDBGoH)}->!VC#?{1FUw4PVRF zi)bgEwdM4XJi>=$i|WS*_x}B&4{Q55Yv9wWKr686)l<>aJYjh6A4JoD^=2*$LqpOcD|X^68Y0vxE!gRe*^xEhU{BwmARj0q z!4_W>CwjxJxj$C1?wqr8cx6Xv5Y&4~YnkAJ&rI|NM+W8>;8 zbIS|kOQu+JoUPuE>@kXpt~{{K1ITqaXDy1G;k)pmw`IA67f-9 zVQFtGext?vU~7%w_MRSDiGy4lq-ZI;k%c$5RG|1wiHo5!T&KRBDZ93LzKi7kHf17R zVkzekyIFJcv|6%gkIYZYU4XVcF*O9RPFq9;aRZ4lbHqpV{{9wV&728MRpP4!+xiFZ-xEjZ&r8)t6-W5ImPS zuiESDL}LuOIAmV_b-@z|VHTTi4cw8xB~o&@zC;xYfvuctszbta;|TAEM%yJXMn`4+ zubM@2o10UIMcyglP)RDH$($}WgoHiMg{05p7`>Rbt}l8L48-%c64PmoC8^Ni-T9Lx zLAnR-ZCzN1DF?c=Mp&z`^kq>ZTgA=oP;;DY$RW1eGTf;&sZ*(*j_E~_AID0fg3IV0 zIt&ECN2UY<#L`iVn(gi1*0V(QToz^Y5kQHQ+Vufa(h)NBh@ivF$<75^+nU8iqjR%4{Q+U7P0#3C#S-#`fS-JJ~8&%I@_$+n6u+=2))|u zpLb2-G~}1*GmG27*gK#}sax8`va%6Ve28;7?1LfkI$^7dm3mY#T#c=C;!#X0H<^jb z5?P40$J2YcQ3a_<6;)Ez*%cDpDisn+tE$M^^Xp_#2p-)#yEtaHva^|+nuaFiyk@2} zag+F7h{a|B&s*)4F+2GaRT2QX4`E1U;Sl0#b%l`4@1z?~c+K+cG#I<7=EYRc4yQ+l zhZab`vT0lW{oB5i=9oV`Kliw8er5UA1V<>FQ;`BX8L%*$5ZAw_sO$7!J(!|`Y^kqY z^JmyzX=lF$EUhHxUZ9d4fwze|%v`llQmZw!)-tT|=a&TeadAg!J`0cfr}T#JWX^nLvS;PcY$$HBEJF)7UkCjDuxe==4rC#O+WR9 zm$R(^OK3y#gqphG4w9G@+J;m12FO0Hbz zydOk)6o8w@POPkH=GRi^B;f!%NN8IeQD0mj!7+T(oqI4-)XeBf@iRYy7cuYe}@R zsAR*oYsduqURHj$sozIC2^S<B+~M zejO;(NoH2{Lc(depQ?1g*MazEt0G@UwGN6R9lA?_UnidUuB1f;59M+G@3j6LZ$7NI zak+!D!GCvg{d-SNY)7wY(C+iBbmrF=Posg>2?U5#^|F3Gc76YWdFNfRF$uV1OSC`) zda~D70LC$`i<_&xr+IA1>synjs{n9quH9i1+-wGB%@|?Ls4>5yVhn(iY8t5Mu#aDi zQRM5dPQBirblShO+duDr)wd+Ed$z#P&o@vtNgHwuZ1s#X{n$IGEV5fWB{ccqi=my! zyRqCLWKsrss23z(z(H9zPiM%cnB+q0ck;5nx@?UQrmIy}i>WOO?YOxG#J^c01m}Q{ zzaCs+3{mDxJuR2mEKtJ5Pma%vI}5TF7Bs-Rx>lB!T8m4wrC4)w9ODYg92{JOuh0GC zgDC{)?JDYFRZY@Q{NM{uK_$epq$v8}0N_(aJEeNc)*%o6_7f20i5Bbr!U$EP`mQ+V zS_i5L3%qh`Z!%8B-NJ!b8!8)=S+$Td-KdOvipq?JYiQ)_TT=T0WW$~weN z5!S8($-v7;N{{05OcDK|>FM|+4NR-0rysJbTx*Q|V!pTe-x6S}6SnZZ5_<$Bp3S#rVyLiV?iF-hmUMPP++p z?Q@NS5ex&xEDvH zsGl2aHb|HK*~(8+S*E=Mkj&CE8)gAC25IF4%IZRyQ}H$q#IGri=by&I33g^Il5oT*18{z+$C)Gfu-@h!zj_P%X-pUXeY4GF7)dBBF@i zwNdK8-llJ7CQ~OseGW(UOZ0i(ia#4lHKbJkyp5{h}TQ z7k4J%cHdy;)4i05lT)W)p^FK1PxFmt*0f&R|8~sq>NMa24V0$$DPeritERY-S!yZR zn3c7&=XD7XimkTje1tr2=^%LWS&1JD)`uMX)0ypP)$zL9xGFf@mS_Bv#a8gqpw@lw38KTkIy*p z(825B&uwQfrx=iw&s=j2ZM|vKQSI1U&WkRZ(!5nmHM8f*Lljzsw;sdPvJV|3;t-^l zreGjgj+obbc8-y()T^ypKfM;=ZwAP=dtY5%9vlLCB2{S~w^O^tTgW?@Ok6nF1;=Gb{YN_6 zq2vvaJh@^?j|%B9ob4}~@(aIFWP*CPz5E}4p&)L)J;l;NUD(jGl^q9)aBx7?{KO%p zpHg~$6-K>rbF`SgYHxWsgjo^b_d4J}({$6*9o^~yu?XH1h2?*ymc^h!y+cQSzzuoV zX=rdNT%(KXn}HI_Y`4|dggsl^T}dv_^xeV&McQV^!P4+95#&|Vsqq;0B_Yw-D^J+T znhy_?`hD^>h5%I;&Cbtk6O})C-rveT?k_cDyM7UJ6Nq1Mvwaa z?9~$-6lYhR<;w+^L@7v2%TN;KHnN2-7Vw3uI@jK+$#x&+Ur_uPzi_pc;N$hC{-C~S z>paILtDHoBYqP6lmdqa0Y;QD!R?9P=+$>HSFjXKl zGIItA=9QJ$#MLykJ?Wb0cmhIHR6+@Asg+kkmfgPSvLB);pqxv=yBs>M zF0i7fQOYWNdMJysy6W{gzus7`Ph(E1-Iz4zUjfTOqTZjpYXr=wW9XP_7d5ge=(<47 zsW2S)0k$p&XNP&Uqelbzgw)N&dw3c0&OZwhQjAXJ{I=7HJc{-s?Ny4yOGoMc70CPN z5Zv_(mH>*n9REpWc{<%r(TFvg3$_<779RiztOCg%|m0VEIPezNpYHd5t;$-jUe z{?GbHw`j;H#y|Jo@DH4j!f1a2;~Yo2wJdac-E^3JDmx^{{o{ZLR+CDL3%NFxJbt7q z2GTP2BlOd+VRxefEkz|T%HFs&yLfm)&T&3Igv5D1aKtg%z#f=ex(9{1rl_tnsUO~V z;vMD^4Eni>1;Ky;i>*N$bmS zJsxEHjh4{~LY~V<-xGnFoa{4$75)`VdnLhafI1V9>{@(+XI|T*bV`Gw` zwe4So(cpYmE4%~LnXGnx{z$J@_uG`kQ2fAv^f713;?6?%7fy)IDF*}|-HO9-;yk@Ft zo@+CY)6ecPHcXc`mDbiR{Z{k=^+{f@5D6yBSB%Dx_A@Qs0X9()mz4AzmS9=i z()K*|Kq}mW{o)~2P{3utSTi|Lg8L+2*%%cX1r#jGI{8(SxRHZe9AHn#X3wvuSMbdF zn?wb>dUoYgJs%RLDy;l!)lz^kz&Agy;1Xk=pFfJcNRzK#on#PMT1t0@ri(h7;20>{ z(@phyJVrMP8BZB+Mr#g{29{<8#bq8?IJ$yoO7X%~yxB%f+1J|qLv$A%c&A3A6j;&4 zHB5(jrvWJ&3ZBqi+Qne^?W4lUhZ0(}vg2?Pib3ymxBK6G7@<=~UFaJkIxSePO1V2tzg&+blDE zzPr>*Qnk^ArbR_q-SL1C@P2sC_(2DFZHvPNYw6$u3Zh)Dzr}P1l}}ztzp&F{i-81? zs5c>ykN7Vi7VCbalm&i?`a%Qp_H-(%0x2G=Vf5*mHpjF<8Qm=x68))Vz>PEgL60ZH z#*WP_=eVh$fyq?UIn(`@;6O#UC>eUiFS*4b>nNz;TNPZ$z!=ODobFJc_SLjlZMtI8 zfC~sT!Ix?9^XNVzKkk|G95#Y;2~)5|MjeE6+hos;V1di1-Eww@vdG)OV`q6~>5aKr zMvcQ7?Sfnz-_oL(j676G0mt|xjiv$wyK9K&8vorqWA?OK*yI9i+Y0ysd+ya{_b;O? z23V$m9Lq>Jdwa4{cP%HYxVtbYSEl^wu1vP^e)v?E2co>$eYzWVW>QGEnD)l4DN)G+ zpD4>62ftIKFYfJlv#vUTG{@^i1(jI1uCS1LEMd$Hn9?Bb3qN^A@}*M(@q*i>rn(>T zEqdR?>$qFTk37ZGr-Xj}bV5M}Hx1mlF}yC|;rTql<8{OnP`{0L-PSvz7o5-v9mP0< zbuqJbjechp+Ck#G@>Dejvu;G5L;)UW&H9w|t5Wfz9ClxXZ+K9dg*V{7foEpzcMUJ$ zNt^jM!n8)!Y!oAg{5y|SI_=J)Q_)Qvn3LR1dzP@)hVGj-U4`UGh{R(7*Vdj*?Hu4! zz%PWgxG%)EVSsWQx|%zw#C!J1lSkP^M5e;7_q|T)bM&v<6pUXEQgWO+8_^6OQquvf`TqZAx83GJK5E6ru~i(kc6plcj{_SKC?N*K(h zGh%XFkB?K0sFkwZ%b7%n`Zh?4H#AFro-b6I+-=O#wck?{D$cheDNVJ8@lL?fl;5 z;eaicL_qw!OIXbfNeXAq)YmtYaIxCyb{4yCxzOqmTn6;bxONi>gX2m0@KmF^seW}h zzv@AzH3Mwwy90S77^9q}Uo)nzb26c{G@xr{P?FLm!RZ5EWq%Znc&fw1y%vmkM(t9C zTP3UPx`iloiSkz`jXD_iobOGZ3IGp;Y5zQMsvjsjqRk!e_O;i>ZNFhF{)`F^q|<#Z zwBxZ7IPhprcD_$FaPv7c*~5V{QWWd>+fan7p!i)_u2-1g+rbTHZ(cyEFq93;$P}@A((g z>odVcrSfb2&10g-a#EntDhu~{P5P)lh@8~7GY!Bc!Uah-u@rgKHrtlF`;Y&66l0zh zy>PYk$Ugbsdkh4)Y0k#C%*<$>WFfnWH4?l*PQ^(-=WI9c^2EnhsR*X0>BhRXsto(Odc zx!&H*&d*E9$iU@Y47GnrE0Sd-F!}16necp%-{KNs>io!9y(Cci1ae4+lx1L@mbN{YVH_*+ct-H9AGs}t4L4!UDRE3Wt1ES>@APf&G zD+`4bF0Pv6RCMhp%V7z$;_r*9B9!`IJfp6b99=K@$+O|>u`qoGzq+fl`>p*3D$Rak z`uujB$W{Rx5m{5bsk=9LmB-%sX28i_L6UD}rooQd`j}j^5JwN_tS*C-HJId6oOZ1_ zO3(bhSuwlk(87XFD`OzhL^~E9>VMAy-ktr{E0vnb9STtN>wj*4 zyaDf~332j{04m>X_-O9p3$%K#pP;&H=tR0h9q4(jb@wrMhT~p{QVGY|kykwMz73 zh6QsL6?pu&YtyD8x#8BWrlHH*nYF`5JmlZMe^^Jte_q&=O)8!zqe)a&%y{2*3s*eS=! zKi1s!O5BG+I8{;tXRp^jRL;_U!utkwbKfvCH&b_j|HXVkOLN#Z^|LH8tydRgyy3aW zka_Bd|897(iY9Qw&*n~y2~{ zB~T$PyUbHNjzzsqT1wl%5<=!>i>^?5RNcXip8XzlbiKgX+VA8k#N}1G(P?AD_W#EM zKspNWwL=GaJ32SLG6Q`8{6pu@S#2O)Oa{EL#fe-(Q@9}D)M+cZH=*Aw#IYF(s%HH- zy`N&fQ$0Vm))zD{f5~}%ah{~BKmz~uS4vr4T$fgs;fPcVPuI$9^#q$zH#?X2(r?|C zaB@LgIz&#RUnKv?`tc*TW%liuDV}k(2{e||%b7!J;TrK7U48p0VJQ}5WmljpF@wa~#BQ=FxO-VHp|2*Dxp#kbk z$X<;vnvj8n0#H3?Vt!YSq~`(NNxovmpGU4=IHsP%a~nsT;f7 zv2!*x`Rn!j1N-!+4)K_lA-c*ZlD{X+q`a7 zd-s-JPbB1?`N6FK6q+k8NA;;1IEy$o+TE=GQ>%uPri~V0A zs`s@_EId|f>V0A&07#eRV0=)OG6^5!kg-(3zP}5Tn?$kEmnK-4fDkeivTJY_bJZjN z;oyv0#lZiIgV?9SFCfg%`c$}y(2M8a`C&^&O%rq84u%D<4hnn^ORICOZYc~ZB|nnv z@8SmZj=Vkt2L%+Et^uh@jViNG)k<-z21bp3U0(=A|9i4`^lmgDUJf5KZIFLX>JFSw zi|<(3vf{u_$Hhs#@4Zhzi_MYZVt-#BBui(Fr2;nc1Mlxeb?c8BG&}g48gn+`F>&}|xPiVuC-LJ}2ZU> zyb&JlVAmh8IiOU^nt|&_#-ILyr|(T%G8dVjTfLu!@!Pp_tga4QU69v0$27a& z-0p4{9k_v|qF$S0f`@XB!S?R->hgHP8#AY3y&TV4>ARZ-n1Z%&Lqz$%g5Y;>TTEt_ zcIQ`|!2B}TCN4H&eWS1DsDYQYPX9(xUAI{d4tDa@{1iD;*V`OZiAsea8^bK#-y!*> z(Lpj<6AH=g0;%v=%o04bC{H|JrdkUWvM5U_=XMW*NGA1Lk$Qk@WU=WL!6J0~qy9ln zP>M6%I6ywFYwx0o5E|U$=xRK7-0FCyYF<up4?ai-Ve0`r@((^B`!akSoT7}c&sJB*K+$pYJ7gB;_yo?gb)=Jig zJ^jkJz5Tt1obzCozHBpK2Or;|U~_kI%-*M^bi0b;<#*>_VW4}LU2~<~u}ZVfc^&)m(!c*$HcW~r zuFYKR+;)+AqyY~fD(&ntdEI_JZU!4WT6kwCv{Jq@8MhGx(_Y0*q&97)u)a|JyrIOVd zH+4jSJX?Od>e&?9^ERj2gwev1B;jw0%e%xsi- zwWXl1E$M#Mx{F??jI{K_VO+q#9B@bvP(cK7p2w`NA-FjKRX^Rdc>7M6F&@zMNw|^&z7)XD$spjCOFR$V@AZ}HJ#`efh3~`8*^S_O z0+~<@Ib?R_^QS4wS>$nB`@2m}WS|zqRRT9|?i&XvKYz{bK#;kW%f@s+cN|4MFl!y~ z$e)etjJ@JEsY2mfW%xk&i*#%tsO=(ai4t28!pScIODYpe=(K?ox|NSt?AIx-F<7tD zHw@59sH^VIks5fXuBXGq^^#qQ`3D38nRe1De}B^^JJKqm7ffbigF3D#(~BY^qe zbKw?WM+7B*F9tZdoQg00q-ey)`!DklSA+h4Q?73|FJc`0lB&+m2;#b)Oxf}MFW0Vt zP|i2?2-xxxAL?#X8&uZ=2ZQVIGxfS1SWjf~uZ=z0K&4S*A;M$_>}hvhub#Ujy8e(#z!qcVW)Rg;-62ksb`nvqbua|DJDOTS{1f6Gx4T+xeq8N^Ie7N}F{q#hnl4qSpy|aV)?*h#;q(-u+;nWI(e+6Z0@aquDo4=mg zl*7OM?}41a9%+DR^D3}J=Q;cGKxm}r`?C|q&V$*1fob#0Utp4poAZPiC-nAE)hd<| zJ?MF6F@+v8$v@@Al^hXwyL0XRnR5d1O`m6r%>J_nV$*xj>Un-E+j#Bk`dSMQtSEEp z&T`J%4+sDK)tmFp?vpl*Wx>c3K`4&v2hQZ8z*OL8C=mA@cAVWJ2|wH%_gi6IIZFp3 zkHZ?H)$`)QZ&4Xtm(o0)tyH+5wCYbR>pbFT?x1@0WbO!lch=M7j0F8I!R}D*^%w>teZ|M}U3q z#P7dYCIu90gf06Ig=)Smb&{I$p+Ju$n4Le9QTQ=R-0i$jioJmlay$$*?+%0l#sys5r=yM80mTKG%f<;p-C5T*~Rpw zzj$6?(i4kbsR#8WpFyUS+q3?SYg7Cu3%vAikWwGEEJSu}0L4}sQct6KH;XHnp?xF( zPz3SWEInSC;_p1XB|V9HZ#jKzKp?_jME=8$NpWf!#&mMs@tS2u01(k}cO|c61W4m% z(wbNE?lbEG8GG0xpOROfY1NpR+OeI@k+D@+KG6*M;McbrdH%oR5ZWnx-nkiFlZ*vP zD%1r|V>Wr;fh}3g@nWmfYg;3Vb`cu}IUX{Gy(J*Kf&mYkwX4`qmL->0G&xI7`jE4SoPeJv!@l&=P(i7nt1W4Qqob^{ z^&h#;db;~|R`q0xSN(&wUe6h<>1h-Lze6)>8tR9u&DVC?V{~6&0;@+qriX2Qz1RfH60tcuIs(*7(A&@{;;8%qdR9 zcRq)w*2d1}*@s%0uH4-xPr%=d6a682u#DThTBfj|H7IuBTe6tC!np_Bo4v}seqXI- zZ27-F1z5buuOopz^UKo{hVR1VGNZ1e2|9P=toA1z58kw;0{W4e5~ZJ8j^S!C5V{`*ZRx z$Jm^8`$TkdJEcoC1vBWTkY&$Y_dWj@%avG4<>35sdU3wb_v4@f=cJyXB6V{IUJZT+ zSk7cgSzZ;`2j>p(NV!eiF+|lZ4b}46-#`D?C5w_R9iG5L^eD=rSvR^q4BvUotf6n+ zP5(4Oh1ZBVWa##cENH#*7w5pHoc&V4nf~7C8?@Iq!YApXZ;R zcnx_2vgaJS!m3#OaoSfi0HpUH(<_+_*6=LpLR4h-Xz9p0X!@O&}= zl~Dz3R>F;^iBv3+;Q-tW0D7<`m-?6tjJyE3AkE5w5>A|M8LF*&V2Naj{EYDAH~GDb ziJxz%bnve9%oZ!*isioo#Hjg;;fH=iMp>>#!_V`H+C_IM(m>hm5l)kyCI6$s#Mn5< zV?%fX$kNVNy>Prv+m!1<>s%9v0Fp$n)i(^7gs|df=w7wuj{r6lg~bKjIajnAi2eaUvvHk9+vI zx~mTeHS*aGHi#}KqRl%MXOjjWPEdbU&jEWsMiZ=R)o^1YtT50Z>$Ds3AS-Ls*Fa$W z5DbCb58xbJ=l+MLuK5lz|_xJyJhUa0~nYs6zd+MILAl1DcAs^hp`-9i^1Pamw4vsAtJj4_RM<6tMvMUuE|sV_xb;0?f?==WdObox|mMeq}Tk8bO`HWnWCRe zF-?{TkAcy`*Bi3yzc00MFwm(b!eV*{l4?CIQO(02OLf_?_LtZG?JX{S34g3u<7PBN zbmZIE^-gDeALEv}8AvmWT<0t;h!894>+_t63V6AKG! zDvqop)zv!!CY&mw_%;)44O4=e&oud@#0ICQr(gN^N7VFpjyn7_VVte%lDr6PF9msE z?ztKU8?1w!`1i!S>o1Z*-F95hiAlAzwGJnb$BrX3@RFs@C{(nm2lmfBFI!dO;)BoU z_W494+Ws`HBsqW-W76HlZSiFih1vd&c?IBMK(Jx`j&o)tA2M5#?>cU`wu(C5Y;@#0 zruLE`Z0$tfwOWn%tc$Q@Kj1a4`A>|Yb@SK`-~c)c!9OEb!W$gRLIPSurzVyV!)8$l z+2VhRvtJ3S#d+|F%XI&_z#unY#Knk?>0#(8B>EKxjkFra8D_%yYC#uQ`0ji0_hNzK zDQAIfd^|k7r$r4zqX(I5$DdC8gr*jVM(1;Ce3*(*XkxT(UXk9QXXxI)46mz($mEbyVOKV(ml}aMs+Gl5!Vo@nTz-*y6 zn*Hj-yxl+KC|g4_Bf(U8yX>>kXKn56TVNElvMk<9F=)hgf*^W+mn-`GAHSbx%G-88w1@L+eDRri_&M94ww66KajKS3s@gwSb zJ;L$~^?w#`fViX~0ROR9wj1$VcOvM=Kly4>^D=+)GI;|WtT1Xme9#dLW|7ndy?QFq zGWoY6j!P{@QHH7)@{>yO;%iclr% zO4(V)^e-6rKs|O?$KOBDFLwT&6$p~DP#`c2(BLCwp}?1zg@C7^n9n5)kY~N_Gs?0= z@EMLe96E7;yYWr8rXMffH^KskWFOw_8-v@j4e=HVD{d=k{UDFnbjh7}98xWlLH}_f z5%dgK(gc(@1ZD5t;J=5zEJvubw`uJtZ8#ek;KZYyP-0=4v%Xb*r@5h8+`u$tED#)i z`gqLXAXxv#f}m?vgK4vffm+Ug=4i15_ZiX?Tm7>!%vz`E+{njcZM)`kg+{#@sZwEA zd*VtGS!ofT=ICfc%5YU{q8X0{s4M&&0{YesdyC2&MdP=2och;J#nw5KJYyHz6);et zwC8n}j95lpMuhe??RVvNU)E$kT*#X9o8u)Vo9Gl_kA4{##p6a#7HW3u)u>V*aRwUnu>KFVJ24~&qLpn z-ub|y)T_(iBUbJ0n9)!jS_%9GOyd2S>&86wpG`Mft;c6po`Qj}EzKm*h?!SNeJasz z%mJvL77_}!khO`GSq#S3xX%l?^Z;Ng9@O$S%$n9|U z>CI|e&&!GL)t~Y#^Nt>?w!CX}7g`Va5bzrCz;=;bUWo8(DXeHjUve&6cV7HQrk@1W zDQsTFxsg99B1=Qc)M%XtyX8Ei^Dmk=U1rN@Z&msn)`?p??enAeP6Xj8!3 zerNIhgUQl7uA3og%MX~@I?unkWd$RPx$hgVD0#jpBqS767>VZRnD_iXWgMFPXtd5@ z>7DtR&Ax|>@q!$*3jG-{;O^F1ma0woch=r1Go+Ah@e6DQ!0qpC&02WE7>a5>v0F9` z2dH&;Xr%%Lbi{R9FoCJl_V#7{k^@B~?%?3eFO*+Y&8XiOzyg70M%r>gH z?ZhE4<2XdB#m@SMpK*ATWNwKKrABssteN%fY6tB-@m0Mc0-9qDy3$-|ZWOoZD;dzH zLk|cQfcf2P%e7FFe3Zd_b+@cO5n!doh)8+}ELAaK0nAZym-~IO54ms*3w7g$h#9QX@iU2kxq2(j77e|umU>;XR9ycxOv$e9-c8#75Dn2>`I?D*W+ ztIGt@HF=EItzO0CMrr>M-j3h@VXJ)Sito z0~mH#$IrA^H{C_hv5i<6cQ<_e1H0$kT8|i@mRoMw)AG#`;3MR$wg_}<3Hg`d_W58r*$nA3AT;tL+ygSSpd)5zA zO%6367GD8Cs3L}!9{>ERm7HGnDHLPJ{>$+Qw?+En^Y2QcsMLJ*zY#+eHwnk4;8tXt zY@KVlFr^bz~*PdXbL2M2L*J^`4 z3ckMZ{n|nNp&SMZO;qxdde!C3aDv{<+@WRkmY5V$b1*wrn-pEu!$Zw(K}gBbs~P z0AB$atjE>Nzv{vXIPP2Zw}P;dTGpHh65vC6VYkDAzPUlJl5r{4Y>DRPF!!GP=@72} z=Gv{@r0^^GsKUf(=;(=SU`x&7HEaUY%5(+w`3q_R>MLYfbxPrqKm?qLsL>nk$U|Ke z3w7iSW=sf+W>xQB+(g@(b8%djAAs6Ir^Tklq-DQ*{|$F{=dC!B%Ii@pS{O78_s=e7 zzz=VuByjk*|Nfz(obSA=2N=Ql6^-mMDK0F_G#Xl)glP8IN5z6v)o`LKy&qj&EOyL` z0XHF3&=J%$+@#?m+J!KEszEkzjkip|c_A?D3)};7M0;ZIPh0_n3ZfFhi6}Y3+}>*C zQqc~TJSHJgFK#%#R-L4q36TOpojW=v>p~GaPHo+|;C<$=tpouDB~3B_oOaMPqrLdq zMFhA=LqWOl>0uIJ_}a=h+iJBGauM2>zX}Nm?daz_c!HD#0y(*Lw4>nR(IT=kpP#n1 z-CPwLjw~2TtCTL2az@ zB5XBx#Lkcm!op%`s<*s?!h=|aVgjG`Z=VxzP~7bWL*yJkECU$#wGV=DZLyAhE!?)G z3brO%jDMxGT%`>(@dpz znibvzfnbtz+#{t;+0eI|Jn>^|<)?fuT1uy`4f5+$(GhS~I1Doko#7i#e1ZYhfh=Tb zWx^w!NM}pAs&9YJVQMQMSY1g?1h*F59QyJYL}+p!h#z1%Lt~pm1Rw3gwu8IeVjh{? z?zuzg-|-fARMeACX`V|Zn8~o@I_M$VH=+^JYC>;|#Tz$r<+yV1>Q~@CH1e_t@<>=h z`d?n7$G%3_yETR;pG*`GKB5K3BO`gLLRTcn{TKF%_d@Nt=J6xxw--soxCW#U<+4)4 zoBe9a>Awp*Xn@;mXzlK;cE^5h6IiNF7-|k=X*uYQKx(>X(I2|W>K*!-_29R}qBqgL zD!_WvN4DwV@(BceN2%1)Qe!`c9T}P`smK4IMRX>FqRC-q(E5v<&xc4D-9Z;R ztUeD$%r(SZb#fg!LuOV#Csi81NsvX+R*J65N0{Rnnd=y&(=sch&}Y zZQc3(>s~Re{trPLSgeydjMsGABzd->ZAXx_KpPmA3=hd9#${$$LO@|~w-N&yQNA6Vd)uPP=FYifV^xKvFf^GUAh(rG={+H-?O zn^JhGGh6+^^3u?5&)DDnKl-N&=|3PClJ9~9aB6A#;ToG;n@Cs7pOgl#Q3GSE6{kc2 z_}hPmxwgU}T`bdw9Zy*->8WxvPZi{;QPQd`mR12Cg|of$)lNpEcd$sWvsITU#A_pm zSDv5O=|Er7X@le3*U0y!x6Gwq3Xw1dTGl-EJ*P|qwbT@59OLIYb_-YRv&)NJL-lVs zhFqVukNxps(&ID{)2Hd>8~o#A=QERdDWuiAacE?W^(yLP#h@^oEMKG>j|xjJbMA=l z_^CTx?}K6w+1y`p@Hnus5bEmmez1eFW$iP+0D-m;Q$(9}*@%QE_MzS6Lo|%2k&mN& zHb2ZbUdu9~Av&INrQ3(Of#+RCi`|7L8*vQ%xp1nEuX`*WXRmwiRE=F9e_)*ebP;@Q z$$(vKlXoI^97n7CZ`~hLPKQZ7v&oHKsz!hbB2$f%CohZ*Gwkh5nb=;Tr#n>DXDFZcX_v=3rnQ0ZdiM1i$nmgFa*!IIg#^mHMnpz~#!E=8%DZ7-Ho zj;62T92Y170(DeW;?j*cG+x+^wV*HRebY7WS5dC77+512fbBoju+OG`TzSeD@OTx7 zz;}Zs<+bC9qO(0yV}F>e@dp}meX>oV3e_qY@cIbTtw70v&ao2b%x zPTKg{A*QKwE0pV)|Ei=v3Wh(CV{K z=woDlV9ll`SFx(y+}(N^yMVtQJQy<;Toq5LLr}h>>8wpD*7l(|A z>nHp$#41g0@;;Of@V=>x4!?0MD|L}hTkh#XyYsIGja9A}LzW;Z2(vR*lg{rMe0_ug z*Ay|0e!Gj0+vYLzk6fDgD=pz$FN*4_=tvbmp?STRuCG81F2YeN?swgP+NnZ#_S>^+ zj5pm$p!e1&YT;>!qO`_Qo4keS>?5HcsWIAmU{1Y^R$m!Ah7<=w4R%-QzfH2k`Z{l6XZ+VfJQVVhgkZQgi}zO2+c9($`N5c>iBshd0HdIS!)HO5{{ge~r=z~^J+D|P0HfsTqd@xAI`mSc|F=nq& zf}_tjL2;v67ingC}Zo_NV#gRQv*DF75IyvQfS&L5jPqC0PIcXw8`T|=*POwY391TtB(hXnaOPq*~# z60q{)U#@C=^OSZGeo(tVKpf`v7oS*{OPVU8VQ)xluzq-9s_Y@i^VG1K0YweH;!@j% z?h|xbwCx55W#nHJWCb%W!&J@=;zp3|mf^p+2J;MVDVc@S0al4|Vv5m@MTxFXs0cRThq=ym?> z=Eh&(OUqQhz_s9(aXC-j8+|TzK7nl&1(vp=5Dc_I7uHF#Ubr=Z;UmO;y-XQDh&8xp zrLd%_2qFj*`wIAwGtKU}{OO!tTcbqeGM5;3mr9mn3M*@eY3Z$jG^ zpG)`DMxbB79p|k)gSwkZx_?YxxX-7=zO;&_i0gLaQdVSp%I1`wsh0XwjM~8?qO-q< z;3rkrfa8@3P3B28{fqHzBUS#ol%>?GfAel>mYp|@ zFL*7`6zKo|s;F1&A!ImeTV_(;ss`TT_5d#ZtHM51-})38+cs{XR?FS^64) zX)q<`vx`9}d&M?DCl<@)In2D0$4nbILLA>g+ap7m2mvo%+LEgWV0#AS(I!6Fib?=< z=c*m8Mj4bXtWNb!PaAwYT$LQ?YN=cf-jDJ>M4=_mfX2B0VJ_kvPB$AuA4))yrOh<> z2vIWo`N8s=-&Zq3F}>C@*O#lv25l*|)>cD7HbeeitA%l=#Rsl+`!w z+aMM+by`%xA#H8}wvPa7CbzQ1m03%JHbz9jUrX`zX<)_rBW!OzJ-Ou=sY;26^R?<)5FiUV_E22qgIMff*1I3fU z(WTVX1e?}ds7x|;{v4+X+JC_g9rX85Bqt&54X>v~>#6LU{f@j)=26%M1F!TsS6iX) zA2~Yg^YemoFq5Hx?S~Cugpan|(0R5WaNsCSiY^C6qO|a*zVYE}_7+q&q$iy@fL%C> z)~4RzFRgF)X*4!A9?g?z9}GImYVetbKasA?3{Q$3?*D1hb<}e_3^r1K6-E|>>4hdY z#kaZh54kc1d*jvC_LqMxY3aU8GYwUhUx# z;bJAkD1eoF*2DK?fz~Zjq+Ty9cs)8}8drLl>>GEo0t(6Wq|s-z5xWiWN1G!o0>dl< zP1HNYxR+?W(kQMC*&DbH+n^#V;S?#3WMsbXu3{A%ZYr1L*6P`lS}|8sXEF-1XoL;m zL<-Y4SU-^GoPWd11g7DxFSo29M=U#kB=&|>BSRl{jmQSK$|^kxjEUR<7Vi%mFV zXI05BE&e?j_17~i?|nf_W%RoN!rzBZpDJ81#rg^ipQrU1TS{V5XJEmVcKy6|f!ZFo zS}>N@mSlZzN7?Gd#HnUI!M@JQN#K`~=s8Di*El)5|Egon`!g{n^NgPK=j^Sm@9CtH z1?-ZUNv%H(bW9n*WiLiwe7LW?HXzNRdMxHskenNc1*)WT8Wi?3>W>W6elZV?p@3^Q z`b|E#cm*yuwlRPXxm~@nHv#cIL}U}iU+8W;Ew5(JWh%)}YHmj?Z?QYiH(;Y+ zUAPN>v;F1C66@EK;W2){Xl!j-2TSdE;iB@25{MQ5Uc232axd~m-p7CmOiZ4>{*84G zTOWK}2TW&{t8cqMF4_}Tjq_&{D*YP3PsBg;hX zvGAT_kQ3<{zW*Q``+CsZbtS2d%0BHh7q$4WRw2&X3*^k>WAFYlhkNj-QQ^`bPW;Kw z-?^fohU=C-C|lj`N#E6E2?c7FM= z`r@Nq_HVa38qyzqlvbKkxLkV+R=o%vQcj9#e^)~z1Dt%R;kUilt+E2&5!H{)z63>< zW;oDZFOf(cU2KT#(RWdUVb;GVi#OZrnbn9F85X)519!W4t5@hGNW!k`_L3n^+*i&v zpExR-2Tnl>hi*mXjZ~>43zG3>W5XTcn4jxAhA{)UxU8qd&&g4 z?+k5d0nRFAa@V4z7p^ylmwbB@FKg$8jU=kZ>Bs#- zeRrFW!bz4sQe_{sjW3JZ)!yIEhe9ZCDTh{iDJz*EjkC4fv5qpgM4hmGLjJB4$R4V? z9W|hg?Y+>q(JM6a!?ACu`iV&Q1xD^tBJlHF3B&TqJ78sQPk~4Q$`Iq%>oQ@cT)bO3 z&xrD)z>+=gTD_)ClJUmiy)J+8>uVX!wh?5*!4d4$-tzm9P8zLO$a^7n!}|O}wdBkB z5i1QZbQ<6&pB|3J2Sj{xlmz_a9vOpI%ltr1p&XwYIHdhjj zY@)47-nX{{bSj>fbUd(G!NWI><_Xi|<83mm?2rCkt^|5txVCh&lOiy&ZEy7Ons3t0 zH!JaJP`)+cm#@x!o<^@yDm)!oNmt+^>rKzJe2GmPO#H6QLGBv1vxjOpd!u6eL?09N zF^&EgLG#P`?l|CU^~?nRna#o@<3~i& zu53l2tbgs914bG-30|rip5_83viVOI@G0PQ=m(eUyn{c(C$F9R@f8Ni6y|so1}hA; zfE(~U&5E0%21oFWzUyXVjs%!1xr&04DZW&*zE4bo7q&>(Cb?hZZ!SnkwTOzOHPS{$97LHRG&Oza0xM zPYw!}Xxo;ntw~<%`2%?mv*IoNOU4)ML#2`*Myx^$Lo;!Gvq#n2d3*hqimD%pB)Y=J zMr6y$WcK!iQ4J*1^sdQCgwe-W+^qH#jM9>?zbsI`fB*j5yJXooy?5`% zIVzO))L6VmJD2CBWx`lCD{*h$94-A@|2u3TEc5}_!?5xZ4|Y@=2egVDipx+N7)DBB z+dH^UqnVf2y|jep;OM|7C>=eyd-ADMG*M&(K|zm?ejTviV;?`-YgHk8Ri)YR_k){G zQJhAm%V&t(OQ(EF0~p>Kb@=EJX{UR zVCa|p>CufIalvOxfNyqBA*DG)xtcXSttszce1QcJlTt0usidX>k_`R?GLfLg9m>w% z>55U*%Wij!Ddl}4mh?d^5$xyq{X0pPls6hYZuYrOs_HlE1^#a~{8<^Xi1S}<55mS& zy1fh1U!i5|3cB}`oFEclZS|1B_astrNJJ?96-{<7?ZEXo1VP>Aea?iWg$bMZyiqotB zu0;ibhXY7Cy100~my3o%fQ`7k?%MH3WS4c<&pou1=JtZW4Nb{-5=Kx4)3~I#0LGY< zHvC>Erz)b6AKkBrps{j4_zvD^JovRmZVnIY?w%f|E_K*=JF@=v`}(h72yQGIcvVz> z917HZ@5_{`#$+pUb(Km%MGZoyZU3s?2WgY062OZcUWtFwOc|APiV>v_eK{%Tt;W?~E}$O#%YU;uVujjSPsp8&C~u5n3wKD*CNkWjt)rAF)7td`G6UL) ziuYKEg!je_WiO9hKX>m1u6BeiU_a-zmV+|nzOm0C3~0xXNf{YICNcw7d{{j8LiNGy zlsehROF|QKx!=BEk4DW>ZE0fl**whKP;?=nR97vxqChKsi0NNypO;-0Zp?k0YE>iU z5=?#-;`y`}Txif+^YJgT1X&~1^_53!#E}BaZIP!&>guZtCcLC{#d@!^iXgp(m@NbA zb>)iax|KmjX`3X;Czjg4^UvzRC25VQiMCtIh_pF_TQ-=;OhT$hVDfxVMBO4LJ&iAb z2q)lr(O?NM#JK7DjWWhee*@kSl+`B&K*p8XvxrLMN~Feu#pgM(In~*XnhE+TZ0d|g z8)mOQJB-K?O+b&{_#Wu;ebVq9&Vq zXP>`YuYfZ@=jy@Cz~Y`!hiHle6&Rc|O&JFA!-n`b8I|Nv!@nuKnBhoj^&KaP&LecW zVIk{u6F@&_D>M4U9zth}U-g{~7#eB|Te6}BcStNgp!!SZgwaHB_;kdth z7jC;?Qu7$g)2Vixov%3_k}ju+Ze`GI$!x`b+vRG9vDK$^A?y*w!Jt-6-@Lu?Xn#?; zTk~|a{$p^^2@{1a*y6qy9UbX^MpB7es-X=4_@iYe2BSGmvqR^h>|RPU`#=UhU}WrQ zVC;;l=|s6U7Z|mDe6&;9L{QIyg?t1moUKo91FF&l<9_M8s1d&>QpmB-`CD-giy^9C z`aGe3_S<(X5A49`WoSCe_xLe7@;P5X>}-hh9=DDf7N9`_C_vvlAW#yOw>C1KNHy6N z)czb){WE~jZhHnd*A)X*g6aBsi1hbFK&Gdf0KEzQRn2zC&;U?y+oiiaCVFLUzQd^1 zj*rOmAdm9X-y;J!-+9z8tfhd{iHv+SC#wK;eyVs5J9W~E28io>nMnBev&r*AefGb3 zb-rCs6n3R}(uLRm+2PF|w``phr4HyH3+@(Ij*s&S2?+T9g9=ACz=poz#*>zk+RXFs zIY#5%at3LIdbP<8^BAvZB0L=jzP{sZXDZqE>?T+AExBJiP`pM3S|L0X?No>rDvh~5 z@c}Q6rr%d8PzG1ZXC)#tw{#44$3F#Sz6PB>if18E{M3}0BqV`_c+UL|FDq^JsSwO( z&#I)~SJ~N0bn>fzgvXRwx$7e@ze_w;)1W6moodzPxfd8eZv{Y92bdq5dGwvuJonps z5>qu0vX7$w_PS8tbRPxEwt;_#g?+Ah;fIF~z10q*eA+KJSuXv2bLnY>o-{>3;3{qA zL<-GB=m_6?Ch!g*8JavzCaTX)-$zAE??n+QNZ1y%420h`@JiI>wHZe29p}vrA0{^h#&m>6eNOOwkY4*CC&#l zfALv{{Q#b?dHIw z@JEni!LOmt(^I1h?>zcK*dTJyh3}*H3pH0|``7IL-HsC`o(Tg1nVR3en)jkVognee8d14>{uV~+`n)f zTq^}=xh*Fq%6?HC$7?q4muBUxlBirv$_KYba4P1C=D-kcI7zLvfjEd*`3Pt-S=?gNOV z#@T?oB)3y0IMR%e@Pusccx68fl@|^i{CR78ZXnABsnwcDU}AMDaMVk1&p-!3e)eL#@4`SfK-CHk6Zr!3yd*B&gb**VlT&Mu3$WN}_ue@<2-VznuGvcDNJuwn5aH;MeJmxt$pdjHP z$OJLrYc)he;6cm?k?FvdXqy5!C39xrYw^h-lhM{e1G$<-#(N?V`+B9TXg)+n5K2fG5O@6TXV=wSN>_ z@eblV)0U`r50kq)69^McU{&P;ig+3gp7PoG1#v;FysV;-3+gp+Lki!ZuV7#V8CQ_+ z=?3ZrJy(G_1J3B~ag z{Zg9nd9^GkPd+3vsH1(wM~nb>ydNPLFPxMZ;l$vE%DpBVTqZ&~3)hD~2#D%q-Gp$! z6fsLcj2uw{@W_*%SYlYoZg##VQcw+NfrDz!30VVN=yqU=ra}ww9x~XeI5FWI^bz1+ zyukAZ=)<-olftgDO52<`Qs6DGMKM86;brU04OPJWKKcR1h@ z_wWK2kdI{cl~lhSQz56+cLUl$0T~Dn&EK>3{r;x0@PDZr9_H-}sH<^$c#IoI`^E3< zi~pYsFwk#Ejk0h1vNnTp;PDh)J@)I8g>&IFj22-7ry$|FUj z&>6sSwh*0k(85Ap14}r_=mHSm3aZzqj8ue3_ry-?rX4C~P;eKE6R4cNF#(9`w}dHg zy6_R`FH3iyfbW)20xl@v$pzh^6Crb=_Y0?*t8<~PdMuGG<|=Rjk>J$Eb~ z^0j;-c4$uaKgBB5Z={#3{2UKZXl|qhP`FfEAh3gfzX3PQa5~Qu0u$H&0BG0w?+#fd zA(Q~PU8pzC2JUbWIz^uMj27dxJY4jvHSZo5U%rBRhsylq5wNn<|M6a1SJ#sx%Eqmh zN$!y*Y0-{#FOJl_0T{UHzyDqenCK`hgqWbCG)tH-5`!$obLC@_$QJ0Z-vx7nN^9fde*o zh654RE3f~D`Ks^O48`GXX<`k)*E-2u7Vrj>f6Bmj6W)8lrI7O&z2Fx$z>Ei7pr)b# z4$2<-L+(LnjIZ5s* z;JPQB3~mLJegztWTc)CyWhC>*Eb*VteN`v~iW(MKLD8b9R}adr_TS?S!((GLK@m<) zFH5GjEUHg^b0`+yfzUYrnD8T;`ts@TDj{?I=j6NAnYz7!wL?)Lh#dH!$wK)*Cfl;p zVqqw5zPr22NuG3_$$*o@GLon=CVtLhlKe#mfo^rAGrPez$WYS_oxK{at`A3 zKc1oj-lXik9thd)II&^Cpt%8OX~MF0)e7?=i`1{=5zY1erGW#Mc#!?PTlus3_KC^^ zYB4XQ+BO;prHSadlS2nM+eQh-z>b2IwG!?XQczORxN+&Lbx8tn}bPn&1Asz{p##!&ALOp)L4h)@3j(cNza<#Yq4}^o&wn~Mu^VB&ZI=% z65(q#K=k>&W?E~i&b#N_N&oM8PdhTt{OYOikxI^+Ce~zxIERCtnti^+=! zD>Moo5x}^zAp@@vTNayA$Pf}~#fQP`uE9%LBCCU|uC#+!T*34htsHs9fExjbri^oY zENAnOzU98!d~M8a?#Zp-^*->spv7}Fz==KA1hO;!GS`2bL8P2t>($O+s=Z{68$%`&X<1Ou{-exJ%Yk7-|%|@Q7ZECm*UaB z^H}lr&~IAk(#;9Q?meWYo;SN+$*n}_W(>)0fJprm^=JlM=npYlB7@avAA(8-F)>b* z*;T%8Runi&+@~vZFCzuHgT3qUpDt;$S)&rF8%1(cnZzdO?*+5oD|#7T<>7tPEIJC` zuX~g9f&7*H%XhCa-;a_aV@LXmn=T5!naQX#x?v9dt#7p(^HOQHUp#Bz#DV*XEKcXf z>y>AazjWi)WpDkA*Rt8|ZQg3}@R!5`lWuXFItrWS#Gqm2;b!Yak(s>IB%I#b@^z(K zcob2+eD$;UBjWNMnMRh&{g7N!{uCoWX*+5{@iCPZJi`y3Z5cZ3c4l;xa|7j?5OQt& zCk`ID@1cOz#OZ;)M7-Zh^<~E^8A0>Al0yHVadI5iwzaHr`i#xavVtYT&m3{H%m$zA z&&Xg2)qai`N@T-M&mgMBf6#v7yCjfO`;p$4lSQvN2ZWM3dk9hE4K|~YX+XJ#sfgLC z{$vT!Xxi-H$5UIx@U+&o>OSD4-Csmag(B> z*7Wmi-*h*BBtxsy)qpJ4TLly}!S}Bxp5Xt&X1GD95XGeEDmW9ES13&YVjFz1aC_5Q zZoKgCOg7ESX9B6SKGHSWed+GTiOYu*plI`3PUs6;o(m{TtxX)EL>TCq*mfWCW%`1- zY9A?tG8@e_W>3BM6DZBRXXl%tKW=n>*JUedI(}#(_edpI*R-e6OrKq*YvG^GL>PHe z&$3+buvdHgFeKYh8LpZO(ZnAL%%;RE4r^fv#fU<%f^r^ z{Q_<_<7QJ#6ge;{=xh6N^G_7Znmw}M9;AA7Mh*YWXD$&QzG;@)U;6) znV?Z-kLAPXg!~ycqXLoGuc9K6T1Ee8#GWtnyQJ1KlZ^QIVyK0phR0M4Jwxtr#Xy%C zGc?4{rOxwh}vrIR`DT*W!Z??5HyLA3N^^{B&p8`2Dv0vU$dhH`80% z&Wtd5jLV9Nav)EiS2tnw1%?x#m;I@^g~IJCjz4RRE(2!~;M=x+NxS$Iq**b_0jr*s z=5*IRU3{j0(){QHp6(xsUj7^N?E}8p!1Z31ey#LiA17}}sVyR-&0yfD4j!t`m<%Qd zmGc&vhGe(qsQl;o_!XnjwfIgupVm}hkUS^1MTf&+i?=D;8EnxB!5mPUI3|jDZdEBv zg}a?wn5MvzsVI`!i?qURS5_8L5)2?fc$@z@!W2tFm&MQZI9dX&p=M1%Rh{!)d}cP78wV!9V_Ll~j!-Skl9C_c9!KJ{`^>Vep`RzM(qW32HTpEVT1 zgMrWRao=gHr_f)hRfQt%AdD`8Na)e7C`ayC5mJnT?s1>oDhs8Zi7V+VB~si6)N|Eu z#sJVb`{w@mdmhGB>UZw!)^UX5Qq$GQmNC8an`DQB;@=opK+Zxgo`E!-q>disBNAOUxm-RzDWNVi{KxEMp5?4Gm12M2+1Yn1#KGr5(y)W% zUAS{*6nOy>6BI?gq|~9hYP%YzhFG3YPJ;`-Ne?(8n_JVzT`Ej*-&cj?31SgwB{DoN zhDgaYz=zHgoBbsZvuGqqf`kL3Qm1@qCc8a;ld(yMaNLb5GKH{%o<6O4GF~x9PVR3xlN-WIp15jxh%%aBBGQ-{L9$ z!Nt@Z8D`9TX)Bbjpe^u)o!BVR$^;hpWFM72*YN;$`DIMFaW{o1KR|l_o%f=}^)ovX z^HU-CWvr6s*r-DK4`#^40vFhTZN542Z8z!F^;Pq5gym~pT+sUs0>gn*hMCp)U)|l@;&SD57+%!a!2?R&{tv4%mQslq!e|#1AS6XkzylXH&E!p; zs@GsMi;oGUBsz4qR)1;*^CI-NxJrGWz0jrs8PcXvw5|lpThCQixI-<6JI?y$_wp@+v4p%0>!TA=hsk3KN=@s6 zF4zzYnh?BC6Kkr$cZ3ez#5RIII<^lVOOO3cB7R^omS;x~-_sRu9X7GSnnwq7MZ(Xt z#^hX=(|2a#+z&2Zn5=cbbCx>Z{dWS(=Oy(HlW8gJY^x?!jn#V{yi2pY7x0{lF}**U zbwgxi~?dkId5|mH`ZePC=;MrS^gK6 zpKEH=T4!`Z^xFNiLv&%9Scna=1xa*>H-iwm(1w{0)^`d*@vH$1U-7lzek6M}Hy?`~ zn_giWx;&9k8h>_9cC7oNDvLx~-87Zp@o|>cn5d98vn~F6-w|;_aa#uRo`+_dIMH+u z-$--euRYtZ_LSa*ofLhbRbwGUT52S}`j0vJEI;=k#S0C|<8>2bt>?+(3cut9ixc#w zG}}J|i6p%L@Y2ifkL=AF>$b&nJ@nhqrXI-~zSb4*_tJ@O{P|;RgL(trv;T06+^M83 zp1ADs=Nrf9d6@`UC{7%E-TYxcVIrOv7FeqD=Kj&3Ar*WhX4V32p^%Q^tHSVImuJMj zy7F3Ca2&a84}?|2B039CEw7h0X2VuIJ;n<~IZ9|P8phpqi53} z$_$>34J$w=WE^!~o%&wISNYv?@;7-SEi8j{PR9ef{%d7^?*k^JD4h5#uiPW;bDu;fRr0LnC?bk;{1c-zu zj^$Mnzb_ZZdP`)Ucry)BYG8;hDM_AQleFBmuPK)ZAFYb$n1qi)@5Q-Rx59~Ek8y8? z7==1L7*3_|L%ab@i1B6$tJk)s zXG4*;%S;vnBwvj3{k~+`{6UQo!XJi12Bu=d0>`mzo`hqQVPG}Na}>&5Z`$Np4G3k9 z79X3GH>?&?(dg(W+80LzYblky{DD3xxX#h=2x{o!LXhV*@Q|dL1-qFFWQV>NNdQ74 z=JB*tujNp~ezXSgJ-@6VQ8(K$IkM>u$AOC_5^JK?e}VGW&p@Yw7!9-|^w#N*Jt&tk ztj^JYgm|-kMYwA?wT)}zZissnr@kq$>hdA|R_dpb(+CM6wdusRW*l&wwzw5HBI-q#tkgX_yUxeRvI)O;rEhG77I=4?rCe{I8-*gD99(`O_^g$Yl{pZ=R)1d{2|Pqbn9=U2wSrt_)oB6k zbnpQVFp2i2^)G6%>C-!$vf#&8zeSB5;!!jiYs5aA3>2t=T4gH3Eob+M0BI~fR2CVFA`$P{Ar_T|reauXf!DF0yY3x2NvLN{Gtl_4BewMS zRjY0|`9(^_^MX@7Zum8ZENad2f2!x7E&~%71=87flfNQ;Fo)1iLV-*}x+TLW1Ln2K zaLYKeZ{76%Y=Z)+YCYdR6=mmSJ<`G!77VU>)T<1gW?$%%d*WU8yYA&)Hr+0c1w$Lv zukb9yT3d%Od|TczcaRB?k2Cy-Svg+C>r|a;Q=jw_Ix~Fo3bZtInMHdDsoynj74~T| zxma%tw~b?D_e1R|Y~zOSw&f0+n+eQLwHTm486_QcuWUKJ1v4|{QyL`~sEme0gluIF zlP9XpQ`icX=n{c%%hM%l@_DvXN>JP2Vaz7U!Q`bAZ(4@-M(N0wv`(`bhn$Qd81^ViEUK|&|Skp{ug3V`91GOvqK`a%)OnT>4 zCP|br$K6VKlwB*m-`o3crO%HZ2`1FWDXnjH$A$6a0a$&6h0J|PUG%T!h8B}K?*M>$ zJw(~WuM$-G$s=}A77X|{NBKxz;LxhIi^)`0v=%!UXL#6gUmdrl6V0zHRQFlK?~=jHOh3AV z>ryTv#%zP95Xy;Hszu0?QNn&KraNYdVi#o{aSe(OEuKu7@%G132Tt1eK=le$QF1w& zESFE7Ot6{PDl)L5`dkg(#EV|}zEE{Rz?+kbFmZq|aVcu)G6HfKvcLKB=f&BtjTDXg ztBZ(LL|sW4ULT-?0|IzJ{NZX)l!NZpMM3b#pGE;=R+uh4%T0GR@ z2|xO{I0GwOtZ1E3Er0T=GRNxoHxX$7UdN4#I9Ogzw&setyL(MSZRx46tLejTYXsCEB_r4p?69 z7t}ruH_k*``-1(TTB!&=e$B3Pe6XC5?e2R%Zq$2|ywlTJUl&I(NGFw#ota`MD3B;n z{#~N2Yz&0D>7#EA%!=Cyi6AcK`Zznd5=?1n+CLXmps9i)|MF&a4xKrMG#UxrIRo3 zuHBjY({+>SNS9(W}fNq_ep$_+wa{?ua49%arRuX31r$rxsX^+<0_7+@M;xh=42 znlz(=@@6`|U60J-oX8frV9)mL)29SRn~3;i%mo$&+VlI(I9O3M&$NYG3edyQN}Y63 zXU*44jIXsX!N3%?hVr4Xhz(|j*5pE#)Ea*r1>WV=A)Ok2L$QcTVX77?s6QEx{X9M^ zK2?@8IeU0nvMx|HZ3+hH1CRZeBxEk~WkLoe(yQG)ZLtdb#?h7Z9Z*elMz#rT-j8mI zz^;Z0Lj&@nS|lZ|mK)$NX~ZD^x+s~E6-jtbtcw*haFb#8XB0{a2?awUL%{GxU=~D5 zF&#Xw2nMGA;Afqy=l`_HcXNZf5c{*UW!*|F5Jxc9-AIzx>$N!7I-k|av4`17;=+I0 z<92R-7X5x%cj~Jq`u`USTOGy#)+oq(G@gt4JrRvyL;)DC9 z8|pV-MhitCawVplg1*rRq<=hxZyPGCF~&krO$~bj{ZMTwo7?6#OWh5vhMAeACE?xW zQO^zHOKkr1+c3hXU(Q;zxiQ8jHMeSq==!EhHBG&}gC2qdNE_7$zfv+#MTYIfc<@kV zfHSP)I42rsP%r2!t}= z;c{$rw2=yayexJtPw8&GSl=GW&}k_BN-XnGf(y&1_lee~$sS=jr+`LeNVKf$b(}!4 z=S}(d{Nk4kR)RlYysxH_)$0{JiK`zpZFCLDI+l^9n(sIh$wI?wK!Z4&jP2OZ!vzN6 zl(TA;8p7XW1Qtu86(tjbAG_LSwZ*GqGcWElgDVTBvymUv{_Vi8rb!a>`>+AsoWz~b zlcoUPk2m^}C|Yy05AA6N{wTj$28Kpom>o5j^W|qP)YvT-(ZlJ7I!ZpXvA%VJ9+)jR zt!-_8sn!+1?UaKl@ycSuPz{y)k|c2xdTx}-yRknmUbF~V=F-=Fgs3OLw3H&d(!_`d z!Fwy?vv!UG$3I$mX@|;|19+{MZ&1??$HBw3NgMa8UrpFT1zy5MobpEg$PRTucf!C)(lT+Hm zKS`CnkTZ!}Y)yt>&vCr;9=;}tSU(8?wwRf9xj-jrG{%^~?!Mi3&Wd?z(bbEMh%~97 zBXRTNt=9nraG}54OrRBlUH=U0Quv14ekXMcmZ=WdmLtR(&={3pX)@DeGfzWp+7>Y6 zdidlfYS;-Q|Lz=9Uw?GHbT0WxUJ}dtqN8tJNa3b;!1nfO?7enROV{MLkb0px0< zGW0Z?8hJo4hEFx)j*nM8Cson40x16T+SHofYYtY_+)S`l5~rd;7wk$p^^t!)QZ1HQ z)+ZS^|9uo`m~^Z|U^v)c9C8VWF{XB4G(BwFFFy{an{nK|OUEyv zOJNI;oiIfPdaa2nSJuRjDpqnY(it++hb~JjEehuP#m2SLZOAu1{ zMJzNz?FNKrbRZo`>ru%tMJm|aUhYvyk+e!G?wmZq=vRlT3C-EJ!`e83yH z4f#JVKzSmjcoeG<>+8E(i{yhI@>_mUV;`)! zuq?;~&t?TX$lCGSJ}IHJz{%ot<-jOG3$-*%9ZF1@8-i?U@X0($O`Qf6h!o+3YvZwH ztRF}n2NHz5pRfrOz(qY!J5~7?1{ZF}B%9hXD8^qtk(H{TK=2f*OYk`3={?*Oa zfi>J-*Tronhk@_MRB^wPCoGZi0uet?rZS$9n_vu9ora!>E3HWwL^R$}Ef6OTOs&z3 zzpiR{S-Z=4Oq!(olTl=kOW(*sXvJ;4j5 zVgn7`BYs!seXCZ_w5|$$2^*V zEKcyMBEb#?#VvPVP`LG9KbR4&sZ!k!j(DhPR`Cbp2v8rt86`M^@bfvLg6H>P_q7@R zuw&E;iY@OQhH?v^?SwI;(uEJHI?e`MXYL{WQt45osP(h>xcE3zOV@uy=cry`t5j2M z4L7KQ?*b`olU1w+#G^)nFfABZc*sM1(dO#-x5tM9P2#Rx{?s4j1=0_`Lq<;gW9-5g zCNydf?c1BfyT{;EazNgd@vA%_ALV{1r+qD6f|@`(#F$f39Z1_EIkPHYI3Kx_xW z;UN5eF@(=34U!~^>Cx;MQ`>!DeF zaGffLg31E4fYpVWS$`umx!p`Z>7$qW z5Tr&;%WG4>freXhSYl*=VhXv|WEcTF@T_YsVa| z%ztBb`vhDw_lV;alzHm;(J=r}HjtX~lB|%(60&|Q2rK}VqzX37N6gfu&Nt1p&3vz~ zZl>VtykxIIuD4<}Eq2I;2o=44wONlmnM8HPQ&S;AL+jt+=;wu#uwbEgT|=Xg%b66L zp#G7q0{27Srv#rZ@^{i7#y;vtFnUP3aHQ5D(pT?eMJBuF{ws_}PghU4nG!X|xAG(D zece^}(lC*-sVFfn6713bNSViUbrXpc0ET#3=$UN@kJ00&RCtl1#0di4bA#i02;`%J zA2T>wkPH7-n#p2UBb46@hP^3!>}uvHmM$ioYjF%grB*)UXwEC7+$v{>7jrbs-Vp0) zbLE!X=xqkFqWkvkBL%&-p(~nMlqMUndezk2xH(z2zmx5<`WGAcVe)9@ym}v`0 zZIGbzGNPV82U&R4ja-y)xviOhvmT7^bo(s@kfr>#OHGu~_v^wLxZVdnSisw=8i=P% ze#Sje!CVB3zfvh<5(71OG+CUK5z}0df9~Ty@d1An@K_BO7?Um2v19DQt(-cg2aiGp1xhM9{n~nA7z#9M3kfBpo;Bj#tD8nmup6+0U{hCj$)~y9FZ|bX7qWK# z-jwm<6$am*iHjw)>%W2$;hC80L(dYSh>uUYw@R`b@<~}JP~hQf0Rhp;gDu`?YHXN{ z&sBT+{o@?c*LBW3yAy){kC9q)(9N}hUdpRPG3h=LT3kwoUnwll=?^K!1lCJU9-id{_MoeW2rd)0{55rG4{_|T^(22i zQAN2(8Yf^`T6%JocUL;HHqm3KebT}2^QnG!r^7weq)VLdp;n)ZqcT%Va3``{$L=Wv zc0MVES>1Icf>m>x)vU=c-p5R^nrP7NNdv$H(9#I?P=2Zw@}ae?jVX=bTcH%wlj0u9 zt@lF9x#Bi%6X~=^akXSUuZ4Jk0&3*$$70f1eL1dyf~v*3i~5MvWL2s&20Tn~Su$`k zFZ#&Dc6r!SKe0Nuh}ncbP7&j?`>xG8zIH%Z`h0J4bGvL7VBqNyiXeP~(5Q8HDAm6! z_$$WI+<;Z|_pQE;W*r6H3wl1k4P3K-mrl1IK=QZO>ChWdTK~Uj0DPU>h5F?OS2{uR zz-r(3_<@zjHsVtzS=->hPbvO*y{9Mm^N$xP%~h76#TdXBg)p*lJkI^?b2y2-&l-NI z;7UuoH`FidZX_C=K)>m)Tzb;TcYi1IVbz4|8Z(Uz7{P^pOU2T40e{`~-`(E}-)~hJ z^fTU4NB+)5nEbs9>R76N*PBp$M^Z}>7AN)fohS28Tk!gz$z9`)OlNYobC>Tpnk=J< ztl)HLhqf$~=@G}I{G*?oYbN6EVcat|DkSKx$SMQ*jAx5&Pt3z@RK97Qfhg9j6B`zP z|ByXRe?Pt^`~~nqRwHk3o39q2o%UcjkJxTBJK_CbK9BRAZ0N$jjy2cco2G?pZWEM_ z%el=w=h@^4XsX+ai}G(Y?rmIgPeu^1z{RjSdp?@G^_ZZ|eN;&y?7`SzMIGB@CvAy! z>Q(vA=B(;2)k&W}{@Zi0&YGwXtib9`gy_5Do%bXFe1t_-sQ$@MH8j#ddbec^+&&Hf zqL6}`X3aw2Jq?oTLZ|u|5Bm6qO)uSqAxDveP_>@NG%m020g>~?Xn-YQW0Fw#EK3^<>Y^7Mllw7DpKDaev4$X^SvSD(@ zhkF@qKgGNWfeckj9Wp^?Vm5+oy=5$JyTNNnzS+7u4duMxh?iW%z$gS+2W>x>5Xs|n z)86vWQk!^k+0XxrM!DK4SRlfj(46;lb%A5h(_u9f78T{($ zb%y?Cecp|Kj-(Vi@Jra|x%Dq9evG%bcT_f6LKyr+M*h#_0uNz9zWgRfzx>%upJB>- zts2}Ew-x;{DGz;|fxZtWR)f@h#!$D?FCzn`Cda69>JeT`4KUE6jHK31XH;s-68g033G@iGknAuz~BDNW{&q zYX24ZdX53lWUu82U8}r}Q)gBY^JP$j=lqetVzxi{7MmReS9se$F> zeuO=nBZ}|FCmLtKia-)><0d#|)`%$&x=m|<*PGWaO1zLfqH6)?_Sk?=Labawa0nT+ zQ|nBLx`xUVE`G;Iv1#zQzHWx>$6n)YESb`0K5n!10b zoDP;e&ewemy6)Ro1sIZur|=>;{rY4((eSF#E=J#ojGN+y;T=q7SOqZP^?}og=l++M zBga4NSA%9>HRjT7nIcCE9uW>{%AtWP#0L-dv3&g{(%=F3i zKLg(=u65e~%vaC(+Xb!NM1D9PszoP7nYwJR-9No&03f&)X(BF^1uaaw23oO!C7k72 z#AcMgsu1zd@PqpPRS)KROjL0Dt}X(XCHkU)hkn030?2VEX6zDTGtuu4OQqur5W&IW zX{P5TcBE9I&*Z8J4MVZ{C%pEoJI@|>@2d-6fQlDqsCSb5ji>fUztWo?Oraw--dFqL z-@nR0`!V@yt6JtCm2EMD*!gD37xEG;vBbwCA>_H5Y43F=^{755aNM-(nO==B(VI>~ z-_EJg?AHt0nlC{xEmM8vO52ehnUUa>5AQ*#minq}R;gI7u>(aEXbLDy?Spjbgittc zQgL^@VLC=f@y}47SghsUA3}us@j%+HKKY6zyB5=BG6pf}nM3T4JLF+s1@f_ysMxwxtuX-IYI;-rOK=D z^whSphsI0UT@*jnK5zzsGI-})ecYdj$iT00l}~EB@AIlHV?RMn-9QYzCV@LbPUtY? zRVY1bbX?6BVAcwT`A#s%nmm`#Eo()-t6T_@uA7X!ydvQoZJSyT*M9}p{pce6{0Rx=AX91zDHwKOF`*9uuC6@{+_*PO;v|oaQNYP3uevoO z%KJIg50U_2Ai$@KVC|g97GDcT14}nYL6@AH6JD%n=KUmL%ajvj+PEz6xM_m)LY?zu z5>DK{{M!*8voDkLxZq7Jn(qN!>}mT}FaTUwYIX`S69Y{58$;4f-++@-8Dw8m;`tEt zTy&HO_$n63xdo1+Y0M=8tXE|eeM}@k>&K|%)L!k@9yop&FyU4PWY-;Fpw2EXTrJ}P zxCy~}DcqF@HmjP2i`5eEcB!MW#c8dMCI?diuJ2@SQiOh0e_(`hxlxh)bpYBegJm)y zecf2a(nPMli{yA}oQhz084i&{yv+6DP!<}DhX(U)*_=iVqF=E*XB_A7=2bBVIno79 zf&+a*ER7ksAJ2Q-t82#1jqH{|7ua^`^4XIAh;Q=nYvIuF5>hFIHBoaFJ>)iYbp!$y zwNjrh=YF1Q^@63fh>W@NYpQkbvG`nDdvw$_CiLz><%$N}SjHYY+EmSxNzM16 z_G(+>UdRHzyP?psmn{n6CpR(B_mIcpDPrLjbK~s^XOxnsyz>`Y645R1JwWf$_V|ro zH2ini>NJ?(eka7D{RMuH_@(5H*ipy6GXUeUV*KL1BSt|ePfWrT^gxBE<>>X@jnWO9 zYGyv)Sty)*M-CmG3NX}DRQyGVnfn86D%G{`B`+)q+d(T%7|?S2(;)ZtKUj?p(pD3A zil$Kp`~2+BtKgZvwVQEd7)@2+fF0f3XG~BA=K{Y`l|_k`@^6y>FfqYE(l@Cu^{!9h zgr#$CgM>eyU0?Yh_oYlyA`*G51hR+6aC)NMK!fPmj8SfMDXS4bNSqC}0hK78c(q3J zBJ8ZxR<>00;15lRyUySlyRhmLk?I!eYX66Q_<^VLmp9}#8Il4q)qz_(Vsj=qda9*g z^oGM@5+D@G1rD%Cd6jxBLMd~tI2U#d7U)j=K9gUdDK7yDoo!Hhl)iVAJ#KbXfT=E zFKc??l?LMX|4OAB&B5?I=sLuqQ^F{R>2aY{+G`LDr>`dYgec5=IIzP8DtO*0?lu55 zGuMTQK^G0^FsPWqOndTmO84V_6BwpvOL_hRh&yO|<0#|fm`?bY7@#1jRR;{Qrd|RN zSzSR)wrH~)qFl(X+m6IX`_XJ`Nm@xV9Dpkjj|r6r!Cz&zbpM=Xt8O)#3jd(2P_PIK zmYE^>NzeJqn;}&m&dLN@cagc@Ap4!$2+u>#vZHds{#eHNwUso9`3PpEw?? z&mJH~R%|;Wiim4hMmRGu>4!TM++!l)PiK+R=PLQE_syX=V;+>M)uC1Cgq1o1hWiJd zB5JpKW9J(V`*z??%_||DcTYluO0*NC4i`0FVW}G85X%o%cN3x<(N8iiTqg`v0{!LJ z)ON(x@1OElD}6l;R1DF7E=kq!5~V3}k`q@kJ*`to#;g>7Ov3W4yr7)HR3H8Ohf3?w z#$SUv-J8$umyUT|E{^R{6I$kaR+NkV7{LK^@AWlhL?VHOpF57WwsyvsOg-1JbMy7M zGS3%ZUQ2j~W5@bjx1H+(#QiOd<%c;mmD?r`1D-5VtSjW7bX63wz$R_EYlRIXc7pV~ z+0UK&msjtF7K4s%Dt1!M0B&1aX&<0@?dC!3K-<;$wfNLw=0b%t!N({K&uJwJ8;S{U(E1Pv zdNQ3j2nHxo1aZPof9hXBZ9Q>u2M7o=j%5w#C~dCWpJ1VU?9-w6Y^3lEy?Q}GTo69L ztB`6eNWRQUr+(7<{wfiA-(a9NkK^LI=F+@+(U^FDlh^5A>*l^sB=38DQ7RLu)e7!u zNgpmM;T}B;Pg?Kg_6|=y4M}fw1B8E&iY&eLBCOGBZRq*;kehDeMz!ks+lv8g9N6>0 z@<2#EPud6%p)MvVZgcrXNYeG{w~yr&i7Bk9IHQhdS>!!bPF|m7{7T^T&+s!b3xOs4 zL^Rp9x2Je_d5HHJpUt10=v5jYm-(*(fcKw2>06behL}+N+ppo5r#F*$AnQ-4?SM}b`@mVQ4B#`;uHAARLK^gG41R2KDYTvf-tR>w|b^~>Y+2%!m_q@3UY z0(NC(HzY)+_eXTfbXp4Ohq>Cy0w+Cz)7Qq3X@65s)U6>J+vZj1?hAl=K|bI+4Q8jE z|BeyGw8*r(6tHolfmRu!tATwFL+=^|ui4}x&fw?Qobh~rcN0b?*(SMOu8d?QRDNz_T^kuJ|Kh9@AUcN>SDL-qEV(l7q<2qf zopJu{s$v!THsU@O!0SZVP4 zuG?*^O5dre?PuvKA?yw?1m~~{y=mJmh~nAmfiY-q%ZGaBlRRTr>5`Hgs)OCt`ooRC2xc!Pbd`Yq{H2XzUa4GH}<;y4Z@P#g4 zTmW8sxa7!&lDm-CZ+cGVqRP||6iIgK(=*y?8?(p6^i5WP7fq4y4P1N+WW#NVxuoIU zWXS8%_K=SUx?_Kog$1zhjGW5*9PARIBn9r^z@bVm1CktjwBY(q7q3=9R8gJ4 zQ@2t*K~d#hhAMiDKovt611l;7P^|+$dA!C>@8^)j&kl3=^&a74L&&4NlZxX&(FpI{ zk0beYr6Kb{(4i(oUFMjf)=5&yLr)T&9hHCzzakGHi4qNBOi~5c)5^6MylNeIlXOqFZAW!-DJ$*B0> z_v1D@lZv>R)ECl%ObLl`IX$0PH*?yxezdVF{;uN|#SwFK{-`H=pG+GPi;|X+KBiU) zVFmxwt-xh=GvfAs^=8pUsi>y`LmPYJt?qhEMruqdjxJjY@527SmF)`+Kcvv>jb8O? zvCyqKyfR3@e%kWJ-0x|9r+G}-WIoB|D;;jTz+&Z?Bl+f7-Zn7@IIykNq&O1PPVp zrcBrK8yQ3oym|g5SFBj!7aEZX)x~)d5ZI$Oxb)ce8 zILm|&^Lf6~Zgj=ZjVAj_xgtg;GmU*+JS+n~m2f5)VODC=CoWh+nnnd6Pom2CEMew7 z6TZxwrVk@;^_OB)k|WR{E-h$Llo=QnSpv3$8JniT>yqp8KFLCPxMhW9bd{jU!zifM z{pLyw3#Cv97NKUh3YH4)uLlF;i6(gpgWcxwn~KI58=@38+o~Sc$f=OjO${v7A`!p3 z%*<9TJCr2k+JKB_kNSrqGWZVMM&?238-wfqzh4|02}Nn74ULrdn$J>hQ@4K?Kv5OP z?Xve%h=f)^!@Ei&f_0J6`+8JaB7lijt)_XQPQ8ja+A56d-T&hPz>wJMfxs%rR0g;| zkuVwhv(P1S`(?u>_jjneanM|r4)&lhQAOCopWYJ-Zz489~?C3&unWTH%vua6blpnWkdATf&!X@L+v=)XbN z{=AdA%!|}5v7qhy8gon)4h+3~!v2Ad2b+xpk5x5ueXKEa%iKolko2!Ou`j^H3~%af zzZNc!zr$dpBtn>~F<$TsKR(ycy@FVQ;Pdecqka>g;RW0D@S`Db(NECWbN3OqGi$AZ z84GHI**h8%THV6x&f=M;5wM6}aN@A@#Vur#tO{W;HSI#*#bp7ujz!*OqLs4l+s-lc1V$(_$IYH){ML?=S0!rHRsUi z0_rKfhF;=cPto5u3sKi{i1k&jJw87R7ynt_sK7wZKn!p@7>n!|8;-p89{w+WPR-?B zvpxJR-55gGg~$ zlj-%~E76S`<{>ydWHooC#cC-y?%D6R|75=VsB?WsQyYDEKL%dn_6gp}T?=FVED{NU zMKLs%7*>_OtNMTebwwtgpkn3a-1#T37dr2se&GrgSU)=cjXwF0QH;w#YhH}PdadY{ z{0PQPv!e&M{M#Y{beO0F0Astf=n5mVW^$cSbr=`h!mnsG9rSzJ2Fh@GR;Q0;o-@az zp3ANCEOgGE=W6&hlrG))Ov@13hktUjCo#xvyW+Ng=;NGM8^7H2eyq5@ex|8`aK|fe z;fz747sN!<-#rX6djcC)hzo=Di`T%W&GA3uWi(0+}S>7**%?IJeU{o4rFLR zva{(3kJr3Ld-2kV_ieF+>bJ^%8og2DA~)$)1kWDp(w^&v7qzlv#? z>ZtWx^FYECD~qWR+r2~}$neCHdVv<~A7dQ{KI$q6A`IUK&!&~JLG zvLt`cy}a1n7t@@HW*P-;I7$4W=rNo~UR4C1(ogxbh*Afxn74nv04fif5&(VOyve9& z`!+sddPVX&6co%nV3_K{P((%_`QePOZ}lS`HZY9^N87Vn|C;2SJdf9}@j?ugB`_Ej z<%UruMk&OLJ>heJv7QsT1V~%N*$s;SbC*8!GcGo)a9XTKeqE_YG8mti>#YA;Fu`R# zw2}aG&-esfS+pS5@ZGj^?ob}NgQ~>_IrN{fEQj7hi9X2t<^)cuNMKU7@ZaUK2#u;9 zn52&7Ma)5aBGn!VF#!88XZ#69xM~>;n-?o2WB$c=yzH?E`^q#BY?Qalw)nZ-Ta7e( zF==gke|jR<$*bdtCqmrZoFhw~)-ToMG<10wz0QY(d*dLY|JL|BWik!dG-7=M&Y0%>KMz@vIXEy@%N5x41q&R4br0C*I#9(qc zhc{NteXzzT+PA9%O#R)(4?`^+mKo9+J`+myT$)>LvgfU%4H$?J4oMerQD=M}ZdbY_ zLSp%6Gy2Tg!`oiPOx9=hnUl~<4OP;RxkY%w(xlGsQ!nTCzuw~9?aG}WFV#uf2#2Ld(4c^)|4ptG!M{Du7Ds`-$KNE zp3m-vvhl;<{%Y5AgEoY`7ik1o{}f~WQRj9 zu3v?TelKFWPyE3GQ@8WedOB2wJ_qNW7?*cBHvG_QS&K1D)pZ7SL0R$1kKvfvF`^9& zF@6tG9=^htcO2LjZFBjkhmn6A zrJO+%(F>AwDCvSIp+_ zHxS#rg`A~{~&s)(vvy5m~MIiSG^a2@i^3|{@2kXPUrx748no8 zvnv;ikk>Nph;GA=56c@>q0eDowfbd(ZqMJy0Yi0aQmwg}mc5;OADcZ3Cyf}?{6%BU zml}5e7;3q1&|m3ATI$FW7GVz{^o1B%?8>4VG9gDrTF%A#J=cq37o*-@2Vxqe6&X+I zm5cR*O}}At{xx(JI^tuxOJfc~RadrzrQH19UF0|Oo1lu^ z$!XZ+_J+7RgF)ew8vI{P)v(B~a|C#G6JkT$547gI{3T_6#3#PiH|adxe>I76<$GJX zkTsYM0xUF^(%!3ymnB>2#YAq6XU#q;jCPX|4eyjg4K|n!k3GKfWQy}>b!X)hlIFEd z<&Z37*$v7WhT6^IR-+4)j7R;LF=VVjku_@fS$B^Q^*Rr6+$`Gwm*BTfieZ@aK7efK zeWWJYZ)g2Jc?;_0@ytYaF&4;Ei)I2B_4{=Lt)a`Rz^uIjL}{;ruUHY#4zK5;%JS&85s4Tqt|8b4teh+Sg%O{X@5X z3+2cx$@Kw67apLpbZN-DAVl%+nw{k654b-u^86_NRa52#ctc)T)tgb3nG}R3P$fbX zh0Vi>Q(9Ma2!a2+z;j&6#OCmlk(I)79d%j*0V<3!A=wWW1p_;LtcteK^iNpCR%lVS z2YTky-BTeZ4j6-Dr`X}J`CN}dDkW!t364&Xs^WBsPAi(VX3K+my! z)!Cr+>+KY|9r0&-)=keWp(ET0qvbk>G}e9VHEN;X7R?IkQziz8A@g4479?(Rj%JA@ zZ@8j0dL$93pb41OsiZa-6|=S}y#=k0FBsSV&ECPlVMjc}T}9sK_hpPDdf=fN<#LY( z9yH0b)M-K`0%}LEF>VFEmQ{B?J#~?~Ld2RzFQ+WXUmKFfL{tXH6?yfN$uh9+ye8t` zqUt*h0qhj+w`65^ZAWQZF*nYcsQf68*tckh%P@vbyS@9Nx!1KnMQR8&|NTuW|WeX2_4;AV@OHpj?3rDu*q^01Jd!7Dbs;i3u zsm>FHO^SFlq4~8RCDPq9WXok#LhnT=4W3bipk;`(E~O-7Km+3Th#HViBw0hmY9RR3qwnHlGiTEkbCGn3=Ha)WSl_gUwTOpOLn z%H@_h*Pw>_dm%cVhjf<5{pbTejKR%l{7+G2Y)u2-7RtR_-wl`0(kygsj=Wzh+6ch* z`y_oi^ic)_P$@kquw_J+II((GM%_d|sK?tms#UpQdpa8I8DnfXwN)4YW8#c!Yy(GS zuEZ^pF=%{{6;^_&q=>II-sA#I%s4Fk$FdV1GGPmrBzpu(NtQKh9WhXv1@)n-;FAs~ z;_6?mKp1Q)S%vUNOb*db5*omwy}Li2HnG;_>*!atn8%lfiCcUNqd9R3a84{k3>a0<5B;_KICR<c#IIh646o-}qH^yE$X;yIJ~>%K;Y zz3R3pVg)7Tdazm=HN2}^?raD-chPRf-B69u7 z0S0lt>|7HNZ%WZ3&Jf-66jP!X4En>!g4o9o72h6om!5CYV93RJ-`4t3}9tv*kw?k~`)Q zTo(ViEo4^mzD0C(arHwSmdmD}ZF(QT#LxSy4P5XYW*Y;HwaComdq7@ZGpW7H!+!hH z&SII|T}F}QRaPlAOUT2oMv3o#M5bPL#25mfc5#@J8hZD*(R7QVqm+-a^*QUlG-#I6 zHhPQ>W*!)~a~xMpjRar=Pk?0OP7Hv? zz17gB==c9pQ{?6NKRyU7ZVQk#b80U6FDXe4O`IHCqeI{ow^iBQdj_HekHhrHX{vD} zX);~?jq^MtF$yrO=iGF*=3+0q-E;iV)Q?X6C_!|=R@t&<(xCrHWfCymj%QGAokNvf z`IUpG-OwoGEPtT^ zg4^`995uUaEWZhCS?@P;m8&AX51$++^ik&`4-El*A`3$pE)xiBhfO8uMl%IM#9`)e zR_Q+bthML(!Oki{iXul0F-T;kXQ{5f%xPedrcjnz$UVe3RNL5aSR)cg0*|Hv!GNR& zZd_n>*ciXuH?tErHlc7#2JO+*{L zCCGGgmj#GY|LDp4yY0WMlt|q-cAvonF+6$sN9!~kG(^>LIB#%z`SD?;Ky}mxXAm~? z6RqpyPqjRHu!|!vCY`Dud$an(ngL;_fcN zHMqM33&Dc~+2HQ(?jg7YUkDH^xVr@c1cJM}1@~{Buj;Luou9K?JNI^o}<-;PUlWPA2UTl!6LbWzn<04c$^82R+K9Ni>5EsPpp zp-YQD*?-zAh$Ixz{c{v*+!eLsvB{y62c6@?brV$BW*ij8-Vf^@5`SZbwrXXsf$BlT zL59EN0|$E~7p05`gI8z_%!oKC<5W~^K}?xS#uMS$0@UX27QstEkKzYK$*$7KPC~8B zTgiK=kDvyik6psqzHSX1@*^01F%%}y3)$#ATZ>olkN}X((zqdi_BR8rgSCXAwoIF! z<^xiWXyME3E$8-i)aE&ONoMf~E<9$+wwE=`TWR|4UP?4(s5#CA336!f0?lTdqAG7q z&yArB!tf$>1FzB!(Od#>>+2x7M$17xpd^nO;yFmw_>UyRp9W9}bNw?z-h@+*Q+wum zZF6#t?RYpf141EAV(IpiV73&^2{&{by@g(e+JBDVek2+Wbcf~W3svAR)w(6>2>d(` z0VTXy5v-uK`Iv;kII1zt60`%PxknM!=T^q>$o`h4ZB#`BWcl$Rt4#=Y0)cGk9hs@g zg{q^yD@d*9dh)@E+T`p^FY*|e|Bkd1pYQzEa6+l zYpf_NT(2XNB6Q=B!!O{wBs5qo%>WfNKRH>R%FA~+D+?B_&nP;x!9N{4o;fa*%kVuu z-AxhT!4ZSHH2U|tp0x3m-#86wF{I|ISx)hBEHXYTh`r`y7e7Yq_-^DkY0?Cc$6q<7 z9joswE5gMED>?&6K}3_G{1L;J4@Yn>PSAGjl8^=kGrEgr!t`1q*L9`p?A2{@GtH{p zivbK4!s|y-j|*-FPm>oT2x3_lUxMgWafPGu-__|LONt(el|P}p`!MD0Qg#2c;^ogx z7ep#rKIl)=-yuD4?HUbgJ3lEK&dUrDW;rQj=QGA5lVeRxTRSGl)v~J*_C0bfM0e z^OSJ%NWWtO16{BTgbu7|om3z1JJx7VvBJRi?t{*VD6%9>2QjE1*lrGfa^R58xC}Zm zLUM;TrY1&_Vnk&=H-yF`rxya1;SVn`B!wrj92g{IRt4T6{t;#Qr=V6U>PdM;*J9bh zG~%(6$vltQN8btN9t`|nRf$Aw_%l*guO({T!f&O7F^Kx zxvpJ;dG34~k$nb~ltJ0Dhzm2s@NzUT*B9p+D0Sp&3dV@HLX)Lfk0z=%r{r%m^=t5* z65XUQM;14dUPvDyxN*BgZn)OObGT%AU?I9CD>gZKy7G71;+Vp0zaU-DcWSoG=S2ZW z=PKW&Z07}S-N>`+Qmk0s(}z>fi>o@{u?Y>Gy3FG^^Q9gD8{ye8+OuLpV%hpHHCA;C z50|EpusOzyvUo!P`Pg9(MUYb{HQ}4?sG+j`oXD+i1VOwDL2;g2atQQny!~M3(mQ78M) zJ~J|0=UzvI8BY- zvIZ7JhoF%r`RnUS?uC1ZA1uLAzLbdKn@h=g>Y!IGDP#REIU0N>K2ja#0}m#>ah5u; zI9e!wxl1rS6U-SG<8H%AvPs$<{5E-%#QgYpT)xbr$}}s6Z%c{lPBf5(?3t9GUBqPK z>WIX-By1(#JPz2=;yc}SC+)#eb7lMg>)*x)p3AZPx9Je`YZle|yc-VQfX#G+Q_rAy zPFI0vYM#G;;qe2I1u`mInf@+M6GGT~l3dw7Q;hmGuz$8&sJ-7Y`r$~P$8753@|NU* zL>L6(n$~4*)~OEM*-2dMdThySzpQHe*710=k-qvItN!mV`#GVt=*dI|(WP`Y{@@c@l`Z0og z#SIoA5Fp>yWx7G7DB}h2L&6}J(g;|gW-{q1Eu5kgdebe}CAUxfBhoN1C{>LzbUK`j zDUOJRm{TXcex2SF1ycc4P^0@R_-nS45E30RC}^ELghz4QRGE%aa7At_ra;|Q_uEsG z%r+)*CSTf*ls8H4^cosrGulW5Iz&go(kr@7&+GN}d7V?lne5Qdjd4A8s7sHo^BKz3 zvA0aL(lfwThyU9F%7WxhIr(euRQtq6lb>*Z_yLTSm@f(B5YS52o|@j)`4)sx!h>RM zKwK{SlQecK&2W)}e4kp)O|)~{c9FeITcc{t%vT>Aha^vj5}wizDF;yrR8o(=Kla3k zmQ?dvRB%{SI82{}@O-w5PT>uy!6y%K)k_i_BW4>neTS(`tROX~>SRMrtJMyws?JyJ zO9KlH>8I^4q5!mY2FKj_Qvn?^t^ghg(a9_)*(68N$!?KX%V(>i+HZTK^v2M`@2-D+ z&F_io;@>Fe09n9psi~z4&~sxO|B#v8({Z~R>5q&B2O^eCvnO&rxXSrbkSZZWsG?`V zmXSk+O{ncjczFBiU2nG_V@Y)8l|4_S$hjXHh#$*duxRKL2kph#R9-Uzu*{^(y5TY` z8Dix+{%urc$<}x+?VU}sTuC*#!*kU*X@G2b=sN6ieU4-z6DP2*#dz3w=R`kRi`k-V zxlC3)P_ckm&hPv0_K`qdXCi@(p);><`mMqI7#L=5e&9j%K4x+#Nt=hBm;bj9CObaz zM>kEVVAktqOOe9c#588Q927HlaN&udaO#K+Dh!{n^9-eD>wrcY0=E3Jk%B!a_)!{r zFYfCENkF*hTR$*J-q`h{rH`c=^1TuTU7h(@N;(x`dRR5DAME`*UeH(}_ul;eyN|;{ z{77#x-!_WIv+I#M#TMSy0cDk8}S{Pn-t7dBf3i2b*{QgE(yNimlOo z>9=iZ;j}(!N-pFf8sIdT&rUO%sntr&t}N%8jd6h0rSwi?vA|q&uxNFh=^#+Z3I%L9 ze6)k)pnw=8nT>c_Wkj^mw$??ITRrtLA78u2bn1qg;e|c0>(FId!vR#N2hn3g>3D`_ zzow}OzjA+nP>8B{r7666#iJWS2Ct>>oh>KK8Lng=O4QVYu&v@L3^2!lc=u;9CsvZ$y#5+HAIObfO8oI0C7Z|>SiSxXmKu$AFVrS(S`77abQ zRpbI|#=xChm#=ZIya`=n@oQ$fJKKMWNZHZDsD!A#>VLBUoGMuF#|vg@raCAApbCuQ z{1-M<#jNd)CJH3#Tuj3q@;7zD%~oW}PC12(Jovs;|Gn5gr{`GXu6Ovx^EhP5Ei4`` zgNzw?cGC5-1|dCnCk1f{i@I#>@9&?*x_T5I-aEm^r`uDALZzTpyPMtfY%Ht2XQq4h z`$luUBTA+v8bcc+LRxAcqKsJYl%Q3IW>trqKr?i_mMcTmRM`kr0{V#_Z( zfwLfdAcn{gf%a!jRL>5q zpKCQhLD1Alsl*9V@s1FexmpEA0Eyp%7ol9}{j zR4Sh@H;>Kahk8%qX%|(@U)4YUg&U;LgIIx1YiDP7skc3Z==U}hi5*-C>Gms5`cjcf zcnK=MP2C#Xt$K!%zy=R*OP}s6@xYbNPJaC3J9^3~fBw}cp_GMrM)%ll#3l?4&mlFh;Th&P2H zj(~-DJYDVMq;}TWcDfQpx*f^BUh^BcdEd8*0J!Tz#@YlF>9J55FyVp2kS}}ty1dAA zkTOKepf5EP2DVe&ACtd6a(1le;1Su~4%*~$?xDgAVLI>Ia$TYzIe0L(HcISy!?Ijc zQx~yVaQA1rFVSdH8cNf1R0#;l1=!dOArn}S229jH;QNPe*>r1KlZ^!$Ir!FzBfuYWEw`3OMEk{kWN za&p}vP>n(cRT3mn2!(77C73>Kqo}B=bXU%(dmc^3n27M(F@|?`irdZCqZl+f^vMw! z#}%k%6Z$Vp+Nz|KXE0@kSFWQoEBB%j*#u9O3<*OPEjoYTLonLB$7`KVO|bZHEriQs z8fEhNFyr>-+{hGd;}Q}~?5+?P2G#!45Q0hLxHm=kRANpc4Aq*7VER1xaP!vVWH;LN zcyoHAc;vWZ3L1Y4_gKL?2WAR6$M9){6aojO7QZ?bzYCa?h4A)V6C6qfwU(-1KTiuM zMnM=O6waSELNf%t!O3{ZOuE0Ejs`WpDwTfuy+Rk4$8DY%pyIf}sHO_`sF}3W3W=tgZEz=b^(Pfz=#g$JXmPDpC>dhd!|hG0ziN zx)G8B>R-Qb#)S7K(Dz7t4*ODPZ&^BJyJc%b_DWGlaV;9J%_m}x!=~j5c7Y6@$>$0x zqwX$%e{^y>3;1sqKfL9mY{^F2SRrv7oI#^~Ukgz?0%waAk%y6=vw>9p@dGe_9tk{( z_*Y2{j5D-H#pdHSzdEV;1jOr)R#I!VI+l!mI@l8Z6 zs9-HP?{_kc1(lD82>sgBHqb*GULcj>m~0gKQ%kPn(@@7+7a8dTG%M>S7-W?kR!s~A zhlCz$mE*`_VJ4zEJb1l987-~f8nf1L)yGp#D9OmJxJofn;@fRf=*UcJFy?)DG+=vO zX8R{hdeek&IFYQxoHS}7ObE{C=bLLsO*{?&H~3VRmXzFg8zm4B_I&vf$iLrK`!v>xLX%}<=)#Sa2no$gtEh1AW!hIB1`RdV02 zBlGV?NmKM0M#{ZqZN0nb)d16yYT_a6l?+M1C1HcIe!S@A+$nqsc?Tk13cT~qsk6@C zlF|Z#Sdt$~GHfyCHtPL*wapDG@t}?g@ksrKuf%qtB?2GjuGd>RV#2}l5s6#Yw9DSC zHKx<@hL?+T8|Av4xQ!ida+=oquD-Sl*R`H(iFDI)IXv^B_WlcewM2Nph~lN~=H_?p ziuv1P9>MxoPy(elr9($VvnH1}Q}6U|_oMG^?)YekImDC+?3K)n;iJ`^q}6`EZEMYe z@ua0yUKp- z2-593ByHc!vi)*$AOzcc0|t;<2HRYXt!Chm5wp9o>F36~!cjLdC@-@o*(7GwuyGSiSAP^mg zpmmT?LJ^#1?N(f{f%HeaFU(I0X6a$@{w{seD{XwtrgdX-F%< zAt6aXun|xjd?;W_1OsM>(>$)j?^QPvvKDeJ1Z-~TdCG3``Hpy ziE26|BH24gK7SjJgVBMI0a)08TI@k%Rq14M_DS@)e@oDB9h5S4VYu@0vhO~T&zLU% z%b6NMpgPd12?LBccdcGEtInazEut$~VAuo25{p^^K6%ZXsO>u^0wzvY-=U9gtxRLT zH#-5}E6p}4z?*WA80o>c#t+ikR2I~)Ep8(LrurBf0vo4!_aP$M$)BrujLD5Bp5`8*B(9RKpHjD4^k}7Ay@6 zQ$pP036B2HWKJs&>?X%0;Z%rN72U7@>;=~T*}h)*cg3kNz;hun6NAkcy>xzl3+M6B zKS4aAfVD<$1J znF-SJbhEEK|x67o9aoli-6;!b}6WFZK+1b)V&E_Z`auUQ_8q*y$@M zY#MBa5Q9F;cTRM{&MlNz}j->uP*$HMC!^PLK0XMqIaQlT^kqzDrrH0+At6R`fgs1V~l_R zAla!gq*WH-2Mbt)&Ju>Af|otd#Ju){k@Ep{e~#G8iIs>-V93tJj#uMzHdehVKLl`s zCX^vV>W%p#U2E8LJ}jsfr@DRwh}B>oFGYGjZ?>6=9F=x?Gv6r<>0IVOO*I{n{F%u< z4#gM{=-|2=Z%ED`Eud&Ay%BxcFPeWImSG}@H8H7Siv~(V=vG7kuo|TFasA+=VxvrO zf}_5SnsW(GqE+(M&z_4?F%FeFnfa0W=6WL`-<6&dMo-#QbA^rEHU|h>}`jB<;LB)V&>)~{P400zA6H2x(A~(+6DuToTXflUEt-%cp>KSX`dA*!6Oo$| z-dP{oSs$PBW98m z?9VD3;{&f&S*?Oge=N@xXGTm4!F}9w2c$U0SB57QYS2czIZvn&{Mb98EblmYLmnFH z7V6QT8E21%tcWmpLWCq(8~28ADrU-wR)cpUUs@o8Ug(`d6{sh>{Ke!)*;?St$SXJs zcb3k;zfwmPj=}>}pA)b&E`}B7`gcWt{PvjyCxXcamaz+`2$@m}<^~ix5d?!ZUCFxj zqd_>I=+7=GdT3`}{{RgxuUyNH633mLU${fN(ON|cT_iRtJxbqGhmdBqXo|r0WQhFuxB;WIg zUQR5;gicTmxxN>R&K!Bye%2%&l&e`USB(rbPIk(A3%mM&Q|kRvnt%3t_Vb`9^C1Eh zGBA{Z*4St>jI9AB1;Q_`b#-3nomA^1LsX&v2r|~^8@=fo9hbsXWkO3@^Hhvg*`Das z@u~5V?B%Kh=|Rrp&Z|O8Kx@__?){GQ_B_*R^Sy!BMtIR(_-#8;T7!6blWbUNo)`IA z+q1}bZCk}s&1S1P%;V)o5@}Q?nlX253gq!U3baahKMbbIKdf&!7E%Yp_s+U6lDNtJ zHxL}22L&#UlizRctv!Cay3X^Fu=mgR=6Y-(=oCpFc~ykgqR~ zEjSQ_z-@scuW#0{!cqj!mQUteplBr}mx69?_=yq^Oqf)HQU3)m=Z%3Q&#)>6eLRKU zgI)}LfFuU$WYC!MwqkHfN)1d1*?a#N9I+ov{aU5l;ioE%1W%|z*R%b$0R&+_XJimIvXtv&?eAlm5+AKb&hZw&`r~1 z;G*}rN95+{y)Y)1W(Z7>53Tg?3dAjr?^vyzAIb?yuwK#RFOG3>Swyr>r>xflX?;;bQ0K*b5!Ul1OxG|g z{$a&7AgE{>k^CD+KBGCndeEf*OhOp|ioTd(dO~E#WSZ1B-V+$$5x-m<9J>BljM1d(ai<%<(!#u@c{!iMP5)LTyIgZ zgVs{{A;%djYe#IM+2&JB`X92vAZnGm2+-RTq5}MH_P?#( z$#T2-gNfF>;A34~@9vFX2xOs4x|{*5dKuY$eQREjqPfU|G8P93572YRH+4Z|sNIg( zI)9L%6Pfs!I96Iy%*JFerJH->=3xU)oFUcV-pi8Z`9tdmfDNV^FuAsUJ9@$r9ZFmK5IL+U; zS0t6VpcL+Rl9Eidzk*NXqa_4#w%t6wHrRLzGk+*c(E?l%SwM%(W2ddRyq%BR(@gj= zNqVyHKMaO(xtpP)vV;|DNG_HmnxbmxB2IR%Du|tR)d=tIpR31O6Ccmp4@vU9CZw6N zYoV)@{L9v7#7_W&e!;#XFvzIKMJ~H~sr#Y35Ii zWOt;%YJ0@QYof%^>q~4`l#D{c>0rT`FiQ!@WAdDH`_gN7gz@4qma`il4A+Gf`PlYn zX&TePT=!G%c3a1a!&cX->@Tr{rsPiU=`b!;z@N~DSVsk3 zPs^OoWLGy-^R<`jK>4?RoNRgiRA)&OF8f|rM2%boq&nR#h+I@Zd*``^JT7l|F##%n zHrCL;r4;mjG_7yq-{?)Hd738b3~CZP$Mm~m3`C9jDc15vg{H}nk_T|3nYzF9x@g&} zNzo4}w}B{x1p1U$95fk|8ZIj-bg)FpJpSRp z3lSQkxrYU<6r=}P;!4U%>F6feAl$Z2IXfT?iB?DY+N^9J-Y#T8P2bvo^;Cy{vU|5% zxiwo3FYs#jULdgSwLADc2|DCa`GKtGX_>9_W+$+>_lf+$N7!jEx=3By-20#I#Qw)f z5cQ3v5_8y+7kzQ7ohWI~(y4fYt0U$nmH4af-9_FD!m0lwyom3)BaIe|dArjMTdu?- zItu|sKo^z*)^%ZN1;(=Zz7DL@AyY*CHVf}>1c?$eoWUYncu+n*1C+WEHB1B5jI0+a z=w_Ay!4GKH^G0<&FI!${z8+dS-*()d&I`48ZGb5Q?@T|}k%Wc7EjvHb)bkJ6q6aqZ z)iIzK`rzvP%KP@h$&5%~=4~{`ub;K$HFS{N>~@0m$@>K{&ZsLm@A+@(pXEl6k+Bnb z8*3C-p6QHlxjpMM6~ts6aEd|P5uwjwUPEGxADFf~(IrisoGaQ$GN)P2nk%||*ALgP zi`MSb1A8(RsQUgaIm)aBhg#V>D){OW`E^#lPatxUyXtRZ%u!T~wyk4Ufw?r%Bdtwh zu#HU=XfVrs(6SPz;?0XNIiF2SR4q+Af8v=~pCK}ql$$GHA^&f8uFaw3mCs(?mLI}C z&7-MPOz3LD!?6y*GrvKAroA2Gl{z`k=Yo1I88t!uY{oSr{BHu+L#dv*+qYKE7LtXe z1N6Qa8ulMw(G%|O)e1HRh2IMST>yOq3~2LKV_);-9nKy2rJ_`g{A2BlZkPY;V`_0t zvhxSpa0FAsq#6vR5#lK85H!~NoD^_Li{X^&B0Y!(zq|ycO7KYkc`W7v8MJhcjL76M zcVvt_RRGT>gBaeP3aV*xwcL5FAn~BO`-5e&{!e@R-+~nr`M5@MaHcS~Dyq_g5&;M{ z^_G^5CCERR&+HYLoOHk|$!}V7M%D@hWx3cY<<9oqX*ehgRffOk~Xq*F~3-g3+A_4Y{xaqFtMIv&!dPO#vT zvv+q{1s0Cp=Ds3*)Z?je!ex5o#WiOj3LdoR?mY3eztOwz$kgsLf+b}jI&`i&)HPu# z;cDwV*nuhL=kdLpa_$kact!8b>$gjgv<}e11cOe6oe_#^KcZtMZgRd{@!ZWbiU<3y zdaSXF+>Bf}8&Z1V2}B@q3y8$Jlx??4So7g;k1r(_GULGSkw<*M0iD-kE!Q1-bX{Im z*q+|%u01}`y_kyKw9;C#sJMez0Hj(s%RqeT=qsCQp=gwa)_$^ zjJZ-fsY(*3p`=oBNt~s;@>S4JM&Nub`ThEUWu9DZ^IH@RYJ6#5Ut~-Qp%^^R+(rJk zR(@^>5?;HH%}=|aF#Jh;LCF(E)OBK?RcR6oWO7IcfPx<8j&~L?@95gK|LdrD)AG1mOsOCHL0+DCN9$kdk ze(KdIfo|MR?Y?i>AOw-37PT-3hYu9%u%+`3dX>o|QWJ+^Q%eVNm(s5%@OK1f%Zi-^ z@+bdeADf)|Uh~`5?7HZQ?0jg*dx?HM+1fukTMM_CQ2_EyAC^DGT$P~|J$e7qX)8so zUaBhb5siR)6krE-kr)^j% ztNI>4^_WaNd{AT2V!x-1PGV4?>aL?9OioRO%qDmUdXwLf6{j?NZK#Sq-$4~Q0I-x$ z6#3wEXM*LIrGK>Iy7?>s-JcE4Mku_wcE>|;$BTeFzxNmP|Hs6Em9RNrIbpWHNZ@z8 zB@s`zl!33J6un`qd-1eTM@&gx{}0Ele)9&3jE#!KR^2uF_z`;Ncx^bp7mN*-8vZ5K zD{rhzW|l;~+Rhv1_%xmFeDUP{)XykhYwwNY))8`9-4Q_qaDkU~)1aJ3Qb@S8Vn3~7 zf8qYAos6Zgaw=pa2iQ@PT+I&a=Zq3JpT1l-conuVCwLAP0Y8s;uyl`0AWs&M$bOqD z#gZy*!yF#FHxa54BcqVGapmtgbdk(BOM#};8r;*uo6u-4URL-8m*)WN!1h`Ft%K^= z%kZ_S-(|&X+(5Vxml6(UWH)m#^BeR&)MVy*Op^Kk%>odjHgk){k@d+4Ufw|k{jMOZ z*XxhY`}@0nMM?v>97ckPx}Ut@@V21T2tY}21!(0rwNaG!R?vJpbq~hbAx9t(5 zlvKhVlq5Hs|LW4`rihe{5G6}`b)6_7t~k$6U@eCkHN7^m{aj$2v2G%*dp zOh-m?I{EiT<-JOw7E6eF%x)TCy{B7YQ3ct_Hwvq>V`+NQjxzs~H;T;8*HdrWua-Ze z8{G###`zi^Xs#Y{@pAsRoUJxb)6uQr}Z1a)<#T4MfxF9e?{$9`x-0b;FA|_TN zxci%DUb*l>OslhU@80ros=Hx^;k=7@og_6VZz58oOctZ4SIepw6MlX-4Ztw7HJhjR z!=*1+BrHr4c`_}RWX6w+BCFS@o?EMrXKU{7wo+r^y{-(_q{Z_T0v#Do+n*s?+8@)z ze3Ls{YCbI;g(F}qRbXMD1T94r+|G79&%?>~N}+$E>J#XCc-<&F3n02(_M}o<^~YLV zY})I|RAV>w`;1RF7wPP81-Y!N%k?T=)Ztc|oLPztRY=%e-=Nz+IO~Gt9-Q<7i%0Zg zzbGRo15}Ft>~GY3;=~CK2%I^uCR?q|wRD8{Z}M3YLvrd61&>=!^S7!kdth%kVfWGD z-5CcyrwcmWK_~&GaOWioPrFR?tn6a(sPQ&B-S`e}yyNO^ z%m6I}E-M>v|HMu~!2r+f55zA^2k&(K1}qY$D2ThDejMoCg8Rz`JMQD^n{lB8isQZ{ z_zvt66y`VodG-)$5a;C%Y>$Z|Re$OMLe4p|O!Lu|_44CQQ&EHcb*+gXGuk)=lUG3? zg>aY)v1Hmij=t{u-*=}?6dAcW{kIdM!K3hwA-ExZ$Ufyrf=F>Lptu%z_G=ahIArSv*W zT(6og#epCR)H@o@af`nV>0wQG_BH{bU0#k-I_jBnNGk!@4QlE@3BR}I#DN&HLGAO1 znSa|2cSRu>RdssmUrNYCi0XARKy)#MCLzg^i2(U8UI(wLUAZ^VQO4>-6H6d( zU1Sl{Jl=M0Wey9(L^w(_&HJ@?TNYI_E8-m!6kEqD0Y3~|sksvT1ta=eyxV5=6}BxM z#tK-yJX7$EV*Q3W{j9i8tAC?Ad+{*8tjc&8&xo6mnn$%7HjMz)DA6O*$ALL_bnUMX<1K8)-2o)hE(7Bua0RuUpvk= zAJ-l^q&K)8uqdQ8ZOO8-vaq8E^Y8hbN+d7u^L1Ic?C5@Ku@q>q6sQl=rT?b=rex|I zKzUimGi>4dodp%{JE{WLe&kwdFb|Rvii&18m&$f5;0Y}USZSC6IBP9%)7K=YsI-&_ z8Iwxh*Ha)X+W)*u?x7Rfb6Kwy~s^_8z83z+lhq#68;?(}S z75*B-#N>^p4xX@C*8Yi&3@v5P`njMy0Jz@rLVln16%;iUymm{~*EbckzzD>s zED#p$(h}##5jhZ!$TmI!wJ`(J^~nr>etScoUeEwTiF|0AT+I1SDt-Fd@>9#@?;NyS z@9(4%4< zw}(}vSA)K+8}`^oJ~}@sO5k4TT~m5eUB>h~s;NPgTWShW@(d-)@|ui-!4C0a z3lT}6kY&REURko4Bf?zpodp~~rLT`G=u<-!t8BeYoZZ{I%r-9iLOd>d!vqRZv5r05raR|3lUzTKWQ5SStDM5$03h%3$JOqSy^UL5h3d_J3DOKvBSH-g*v=@3EY`>(VATjXsZm{A(A27 z5wka#ZXWJMb!}wPB@77CGzc4-cn|*u$qpQ3{YKFa*C?j-3Qd0~vU*LXlJ=k`_ zd(54C4q~PEXg{NTRaD$>9f!+j?yM`vr84$cD-2ziH0E@OOSsUe-QO}~&MJAwBtR4X z#r@4JKPm2!SWH9vt3ZT4Xnnj*t&&=O@2A|D1*%mnLSuta>^&|L1CeP|_Ino!h@O4L zJ`(b=%(WmcOckE@!2(_+zQJO5LA_uHDrA2nkr*HM)Hd-t@%m0}*&Ej}aL#wK0X{Qf z&%)B_rmWQIpcgR++pWH7{ckiKBs}DLG`oeeM4&=PFBRdOcr@&bjZ3p+&}M&asNm#M zbY_d(*!Y{I(H$b<&6Tz25_Nt z0$hG4q)ISc2n_`3Y5&9;U?H0N&Zc#UpHAO(WrN(%!FvM&R-j3YFc5@>S}?MHR91Lo zL&X4b-LD!F{Ibe%<>8sH&SrW(NL+=HXy)RFjt7O_jSF-}e6pB{Bs72E{O}1 zYQM4l%-zLaYlGC4T%)+MfrR}x%4Z%SmEY_p+?i4w#k_S*`&CKd= z(fy=fYdgrKr5ZZ1r@%xmU)X{YU19-%+x&{A+q85cJ~w#B&I{pBFFmdq#8mK*;BqJO z}UG+ zZ*@(zJF}SRxuP0XAEUz6d=A*nRzxrJs|iF7Led>{#8lx|2ySEsiL4y-QFft+cE+Y~sdUXaCO4KOpv)C}O0T znWlw$>eo+{ZZ)KN^%CA1WxeTNqlmk#iT)RyfqQ_n&xEMc#^E*cs_3ooc-I4|uy3pL z-b$(S@y(W%&8oP!UafjJOkiRwUe|a4P}YFJqQXL&x9(`_oA@{x16@_YjZ5dwj-@Ph zo(%XmzLtf@^pQm=A&amr=^hZ~^`mo5HQG*00`NzNOQQ^EAnqt3Mp#Q{fg^yko;$x0 zK;tBWmg)qEStZ?Pmo&uZbmXYrrDZc)KN!!_s@^qU+9>rWMaenWOk`!0)_E6ekQDO> zZO59Y{36IG0hp^K6%LwA6|<`cu5od1B=O&oOYgt+9y|iFS3RLiF5)X0#AE|Jmg6P> znhU~~EixsSm`c29+--I45HY>;{Qw25xrmm<78oPolBdcen}u*>G(}NYxa`0Tv3><{ zX0_;jT>05)cG()J;XL2VWAfJ`B_|X0c;j}x@PmT_?OS+YBGM7fXK<0|6%`TGI*MWC z;3kSwnfD54@(dQ-0(t#FO*{yEJkqLgjkGuWa+{l)_=-yFFiz~#{*a(V+Aut6BS!g) zwYOj{dy`2*@C{_*#a}P_oM< z(iC;MH@@*?TTO$Fx^Z{nxqdg24Ag-8Y44isgyRp&-i@iKLM?nyfm$IW?_02S%wfA{ zrn=kgPjr8aM3Ig`*AW-n-94z_Z;Uv4{7@KlVG0SOHP7z(>2+KV>AiVbW!=gg7v ziwgt3gqfxomUI5d>oi_I=fdY$m44p3pq^ftA3=Qc9WG}txb3;bdhz1{*2Y~@02>D^ zNy##4f~bIuA&l!JhX6gRkQ)1n4j)2IiW1D-x|svg(-8)-DjGAt!IzWbB9_$kMWbg6 z*XP#-^h6aH(iLj;q+w?Hg-74_kyJGEwOER@SZEsR!=h{d?2J^`yV$$kT;*4kA{&Wy z>>r%SQMuAE1qA zC^92zr(|d8iRAh*j=sJnSvP?dC_&2d>;n>spDTL)H5dB4KZ=kFXU=%9iF0*kh$0D6 zKe;gBOVw0v(@xFT_~S1Pp@n_XK!q?z;Y+uQ{YVI&Ie$6(@MGgSFE=OZ9g55GeyxqX zKc@=K#o(Rj>4AMmnICAx4<*!E52=OU4~#rTZAEi2H`kPH2d&8@oG*%r^04RolUsLZ&U>Gxke zF#~mb$KUpp5pfb5@FNu0<0c7RyLMplXngz1Np^c9UY<me_3#)O+a>{>4wyzLt!qzC$9;hpW?*^_99p*uDJ? zqq^t6&?LIg*RdfDxRw-Re`6DFES#E#0x8ZKUF{wCbS^{i#?xhRjz_+0QZ2J%SmqSf z8ObOZxc=scJIeYn(NNVX>T=WSvPU7z_=&ck4EMuy;7KFOw5%X`@5mO-e&i!pQ*)S> zaHL@;XoZU=-2A&$R*V&W7=R0B)521>lQjvZHkgIPVmqA%mU4oE3d^mm)$*BfLJN*Ea+S?&EHFo4Y@d90-n8HRiv_SfKyHY2 zbo__)L@5=hiKV&lBTCAcQk4PdrdXQxANl?CL~g;rz%3>gF3o{l?GmLP;=~jL06&xN z#Gp0gyprC%>3kW>IGQCsreTJ=N=oe_1@X#k2FklEngHTxB>bF{BCtK}- z_4kXBdlaRk#0tuf5+v$kH3z`7fV%Ec+SisxKO0YbKnJ78%D&xVx%&Rd=Pbey#@X66 z$BUsFJs%_6h^xbI-^XjZFRYY`iW>eFbpRLeJDq9~{TB{Y&4xVj*H@OjZY8 zj7v))s;Pz|#8in^m3f77HX^t|LVejHb~{Svm}R@>vko*Lq$Bzzm<%Lw4K)L~xS+d`ePIb0xqb?av0V2U%Rz{t(b zlQ=LS$Hu|2-fOEP#9k_a+(%Xz7J&iL-@dxY<(tqzh%1Pq}qGt!a+++GU4_&#$30? zN|){1(-(v1-ww&WLR#8#0H5V+z*CH^Xz7}f^|5>GnAW1y^88%JcxWq8G)@y3{c7si z`nJDp0*Ok&oyNm!7CdM8k72fBfR|>*jb=)qJeKpdosRh$P(1!Qu;H>1@B78W0;SW? zmhQFel6>_+G!8PGbji59F0uHhv(mYvjCiXg(5EwjY!K*upa!xG{BS}v#@%jsn{Msf^M*!UyJ3-0 zaBu&_K>;Y8m0)jo3DdYly21uv_zXkx+}y&bqQ0}M3LUnlR1Kr^xA%UK$R|i-$PH_d z`lNAu=FO_|>g`PDF@L|<#muVnoGnCi;$kjNcp@~gF)aXHDW=v?5v-|;xY zS_Kj)EnY&JIjq7syX51WC~`j8mAznBN3TJDfqOZzp(F9q|D)=yqoQiNH{dhF0K?EF zrF3_<#1PUkq;w-l3P?x{2tI-+NOwsH(n!~cgn+aNNJ@8i%{R~czQ6BV-&$wQUuT^& z_qq4p_qF%F_TD^6HXexS_Sl{FS27=^XE{>`)rx%7oKMu8U;KNqC91Je9j)(FVZ}2> zGUdGe*DwC7Msbg1h$Pv3^WhW$^YIZe%`&eh{xzN>+Vg4inWy3t^F)=?z+O<45NDa| zWAtOl+o`2SiJhz;doA5Nc4Brmi%J^M2@Q`XbEybXM?bKFTD1L>4@+Gr73!AZB6dQ5 zh1V1bKlU^d#!(;Of25IcrjiHmuye~?H}`hT{U84W*^G%A&4gB!;`}fU z@7a%`KSuW55^JAkhfHDed~k)R>Q!{?)2T%zaC5uIq`g-n zuE%&uPM;?gAv$OSr40^fPtj5TN_$ZCoW3EaaY{4Dt5;lhth3aoCfYChM!-86-|v;} zo*XmvYgR~1@i%qmXVNQ?F2E(1XngGV=Da*zdn-cI1 z30>ZGn0?CS=Lvf_Zf!K#vYksS5SATUO?BNH`cL(zN0x7JWF-YUX{p-|b`pK6oak*PhNEX{Pl_665J@wzI%O1eq}p)OHZYXj0R z9Pd($hD-nDYywMJ>117G;D9IUAfAlR`lSWok8n12G}~CGMD>&9XUR#w=j?JU3w0L^ zdgqWKxgY~YwQPK%T7{UQwk~WB5fook8_T%GghCb&R$r2XUw?Td6CI?=xcb6!lTuY& zZ)(E8v({Hcc^8%bQwrf|Ji=nQv6jR5JMrkHUw!_kPuM+ncm^UTX=zr~ zi5l8}(?xWr`)m@Ga$X`dNZ&mfoB0!qF}@J+eSKZP!C17M-r`E%=WOh`j(a#%tyMX7 zSrTK(s&hhi*R>;$=(e)5XC5(=3z_@k(>JF1^xnB>vFil?tWp;=xBZCOq`2$w zyY|Y7{q0v8sf32aG}|2wg~J`~8|@1l?ZCnGQipC~((jXRG7CYC;mNC7@5fr(>XHc$ zvrPOKkH|zP9Us5xJeh}Khwn5mkp#sQFp}XZzWh^$V~}Uc&0@k?U{PsmD~E^>g5{Pm zQ@|K04kw5H=sxc4ym{sE&z}nC(}Nzlnngu-CFNguKGS&R{_5XJdDtz=6JF$phXBrQ zWc5X&Y^=4-vBZFxxw%B=Q(y*xJ(JMbH8aeT*pHdFVX{5=^j`$|Et!xLDC_@fLG1bD zk16>D!QgX+y>V0I_zfl}o1m@qsJmSk`qZolsX{C8ZuMYWt1nizmi zU4((xa@s1qw5mUK*dIVIjk{|Pu%F%-S7-DQBjA$CB*r;AlMQuGYn=tM5-F9bQ{Gc? zLn14H&l`THK_czK2b3XU#PssjwU4aeC~X`;rZW4C`0-s{QXLfl7S`_d`lJ01u^}*zA{yH)rR~Q%gq5P0>hN`{3jg{Wt>e zFe~ScN%!(|Ua!WXJK3^}%vS_oQVn|N!?F*Iv{kyr2ilZf2%oM6o=?f{%nxwf1nNJQ zc;(A`X&W`r3?PdPiyL(JNVZjmoApag$KBys-LZpA36W&#&pw6i@~Gj-Trd=pboVQg z5-eDBjm<~q)2WqAFd_}bv^lEP>M5lcaH25%O~b1=j)GSEIoQe-rFIcu6?=SNH9;miQ(?e_8tYRmr@5RUiE^dt2Md;F@Rg=XTet*-w z5G{5IxKqMBta*svB!I{3q6(Gzgs067HO6omPv)vSr^{D0+@uiRL`6UL*_`)=Q`Vlf zom0cnsSxDKUPDzo3;LXl(fmmGpx(afpZZ^*;ef5Pm{)AaXI(zVr;k#-_r=e%Po9#q ze}$!gU3T*rtv1_{E|(0wxbQpQ5hIbPoxh8i%pvYRvz!;Q&CK!n@)&>4y{zk`c|Cmz z;bEv`ZV|QQo z`g7~gYp7~cXq}Ag`!s{f6@4dnSZ+XPKafFI-U2iz*_^4MZBl;*^O5OA?)0YLM{X~# zCVM;Y{%lBK9b7Km56j@V`I^)9ycucr=RK}G(C2q!ZF8%?``xx3B|WouL`E&oduLnq z8VT<99irl-Q2CPPG$xU2@kbx5ppoZLt_`$FdEo(hWoChavGtj{P=zu`DTG$%_Z?0p zCp$o~OMQL!c1P(ufFZ!eoKbK`B4(%;Xs5Lg37rCy5gKZ}08=?_MZ@a6CHd@Q7r#Ux zrg+jJy)qq|_nWS1k>Gnhdz-}Ud1iWW)ojjWo6^2|?yTfd05Z#Qe)gFCgCFVHU|LPb-%dW;H}?crN|vxrGUN^2Z?XI&4Mone+xr)#hNpz@V^N$yjGny+!O6PyP;Rw7rx~_~G%G#;_Jrid-G28sj z&!2LKPG#Mxy}>Bp`reG}s^0Fa$!-XF?|qJBA0aS(_q=B8uBzDLGgItN>5p=W$+h{N zs*>v&tsB~=K)q=)H#oqp7`Z0IkwgNICU|0Zb&3!Ux<3{R-n~1Rsd>pZRoXB2SO^4+ ziq@m36JOGExqMWmNJ4C#N-iJYNf-h*px@Nw?>UYE!JrkKmn^tFLw4TYr0-5nZ0x3Q z*8YzRkd*Pwrb!Ko&1Pt<+4E;mjDnkRm;Dlly%RWWjU2yF%fnR=8%zE=iN&)TwttcJ zdL|mDJ?Bf%w5Pcn>Z+#p}C$Zv`?|HFP_qWhtH?gfrvL`dExWlRijJj5^63;;l-|Pp!0WRJT7qt4RO*l zx0Xe>W!_8Y+DmU_c>lf8bt<3T;d|m}90}s$y0YOt&VsZl>2aOU6#4>mYxcGERV(a% zAwIU981<`o%A)UZX5R#ha1Q2HcrZD*e-L84tCxEhQvL#s?%%jSGT!w>fAd?Y(BN-q z48Ahc$X%C!|JCcTC|xSuu%7woWJEx|WfwTPSo-wa zt(cY&Z;f?`+h{X8d35l=tu-8n*30(Y{vY!|G}`Oa2aqaFVnxLxP2h0U-q|K?wx^`> zL$slXRG;1>*|ToUPq_-ZbAX;4=%_f4!i=zuwk#Pyd&}yf1tP~cl!oj6mALJjlNoJ zO<$`DA16*37$k82ZgBQnVdYx9dV^_=1Gt@3r9zKl5!>*rym*v>0py&~M1LlYjL zHT3dagGosA2H4cillIVJBU$8s0|MziOYccB z8~{Qrld8YRqk_G~#rnJz+1Q{ih)}yE->I;}4S*ON2^hkzvkTLkj+KHN@ z@DHb*!CzVv%Iujc;+ZPUq)%RHYO=IH!6MuR3X`xH9hyaHm{9DjU#3dLDHqVzpxb%& z%xMLT;xNzc-l2_guo*d%4WZ0#lt?Z@c)HO62fgPoM@EK0f6vvlvmBcE5|h)^W`&2l zyDQBIdfPMAZ67rE1QJ+uz=oUY-?1TLXBNVuGjL(YO)!J9j9&~Ww>k2Y5F}HZ6czzX<45-sL6Bq? zwCCv*&P(dS?nIssVORn_3r4vH8h8e89gR@E-1xirhQ5#L@bR0ZgCBh&PgHZRect;S z^x$cAnnl;I)1Sme@GenphZliAITA7bg}?pihE&GAw-0cjuun8FwJ?J>w*@ih-n~7m z48&^1XI^`!tl@UL)>C!2JK_;wtsNUuW6D3}ZzP7f6PI#hcU%?;U;$*&-LfW>-=tD4 z*2KnLw<8%5t-qy5MvpJxb9>pQc(Qc22b!g#u%6|V_m@RlIC8mfiUWepXB#I-5X{z`jMkjYxg(#N z-gsN{rhe>y>K$BG#!Lodeh6b)x;VfWi>%yfw&)N{T&;G!fXOPCi}_tSx@URe?kMp& zw5Q{*&j7SOR!{+EK&Al|)fOXW=(JxRi1NYhILkg5Px)=k`$#U5rNa9%Df1PMRgOBd z(P#M*o1~?W|1hZLo5E2HKXH^kf;TLLD>ZoV^4KtCuqHYcXK!x9(5NqPP!WcjiC|~L zJ-WiWK9V`0ZGP#UCsF@(^=2UTo|NHw^NH8y;a|(=C(F08^f$wwFjF8wAculxM}GRo z*sxxse#z7yqNC7@+EFY%4Q3i|a!ic*#p!1X05hQF-s7LpW{(@A|FeQ#G2X;G8+;9U_iY1YSj z_~($)glOb>nnNjlVUi#LR*Nkr$-lzJ4JR+X%Lb zDB|{;dB08pA1jR0bLhg<-E(&BU4)qVDNgrniI4cZs6JPUUi8*dmigbP=X{>jSHaJB zGA_`$x05Cft?BZz)k+-OG`7CYj9Agi_C;7vJTj?UUX)&Vb{?|b=5`)^G5wi3x=5ku z$=tT@cMMmH9-L7B>0lhU({a5X_%G7V;z>?vI1d~)8f-#j!GIL+HHUjoYLgq1oO@g* z=*JW-D-bSeJH@+(ME~~$md(@ILxu3g+iRt!yKcPOA2*AQpO`>BcBEAur^1-L z0VYR@H=MpOHz!R6djhkldCOJFozVO~Y@l4vMb**rAnac?qSDJgy6;=O^t=7Lac`%@ z6OBasC&TY0aG!WQd;Bp>T-B^}|v7udUJAfoN24wIR2Pu}C}{@~G71^rbH&HHKn=NsqB4 zj_ee{z4J{=q4R>w<1u4U@U+lHy$h^x+y!&#!7;p9QW!Qy+eB4Bi&;nYQFocD&4_gF z)Ipz_;0{yXp6rL||x z%t_uUpJxqx6Vyr?V587n3$C%q;7J*H<3cS5x@2^u20#uu2xEjK6{u6-@5L2Zv6G>! zcyIa$$`s%4^br$N6QKA_$dZ64Fyyy)3Z;*&dm<#HPt(~iemnj|KBhD5bnHEUC|7nr zLAQO4%(f_zqvaFn%$}dO;PnR&03cR~Ge!*OT9i_52siiTPVaZhAu#5N@k49zJQVpm z(oj%vhEt>Z>%|RB%7519F5nA>u^|5OX+-7D=gk%s<{8`Pkm~JU2C!agQI+rlP7Ie8 zQy}uWtYv2d4z+DB%YO+*qzSTN!lZCm8e9Pen)sSRK5o``&C3{7PA_6}hRN!178x<~ z(ZAoN6*3?5E3A`psC}BG@!)T8h#Ns9iKxn_&HY^k16eB*Z?U@SOTh;ZcxE{?!te{| z@fh`$z$9E_;|u9xgdxYhqc&5{=wr{rozCk)>IY;7rLsX}Ouovmm*_T?O6_P&oKxa? zcD@LRh(vjY+z9DuD4Uz##Fn|Tn>4S&8VPx1&U2;7cHVfOeFtC)Bw)?A2u<)aWZ>-w z1N+1k7VU||6~0t{t3svMuO3lHoRcre`%bik;mnuayqat27jB ztVV8KMU@e>(Hjnv65wF6`!6A5DUR80d#HNcK5myo%&_BXL4Rz9wFanKYW2 z_WiELGo(w#zh)GZ3rrfQ)#EiL`0iEsSP{V8u2L6ef(#_XFjvaBu`qitXGAy<5h{=Q z{c5fNU4>y6j?*~Q?ri)%j6lRRtQU&_a`j_=_j@Js@564kbgPggWS4gUrADCW>8q^$J-+H{sUKu3-vKjW z_914DEz3vwJCpKvTgdHwrbn(VH3sZ)CTWcNVIef$O4p2h_-1|3xED!MP*$C;%U@7e zLHJQ`Gi855u}3hzAM;uVV?v%pgdJ0I7n~bggUc*4b9ClUOn@j%ExLbZhE7-S`h>x1 zZDth3Zj%TADT%esYJe@Qi{|5_`4FxN3ST#erj@#|tH9f1fqU@iLO7N{Jn(coocEYEb! zO{oxJxD!_-C<`7qNFd>YGqDVtWpPOsL7+nZS zn%$=GbQ!==#DxBARYq<;jd*Bb13-%?gRXNe140tFh+>WJhozXd5+`*v1vpDdpW-v- zC3B!sEu4uuAEN^t5CNVPl!O84VTyC;q!&*{ETn#aFM|H-pL5lTzKmlN(S{E2hLtjo zQVt zC9&tA>S7D^M+karP`eY1G2i&oD#?*?P?Xc2%Q69!K3LxPh)u{kO5P?f1O7DfoB zeiLJoL7fa3H+>clggJ}3lii4&F^)S;OXcEtVPcjLw}Q-dhEUC)2XnkPep6A^QdOak0$u|y?UE_Z#=DPh@3k303_(8kC5?!k?W1P}|%skca>AzzHcMYR54G+!MyCe-RLjb4W=7(n|EIWM1P~f5T zbQl$IyRnGgD`_0h3;%Xh?1QCbY5vq-7p2k#14tsETue+LP+GAfBU_|k|F3RSH-}A) zk|aikAoS~|o%zNvX zvILQDyz4z}FFIWp>pBzRaOi6_E+(x+%nP($LnoBQvyXLkV#S;%wyIYO^J5Fz+p!*5 zW^Zop!g(L4u+m0_5t2z@=zv`5-Q(kA>rVe6%{mA-m#ebIhbss&yz5Ji2-k}iV&^ho zT{A}8$Es^caoQWr$os{Hna#?BOtywFPARb8ymGku=tTv~A_-i-xyl4DRY1>CJNl^m?CPjYxe`c9R^Vy&2u;$51#7IW%| zNhdyb#A0O^nEqG7d-FWs8Bq$A8rdE>!i?gI z%~rB%hbhWOYZ^3HcBD~oZ@(&DCOyicpHkMVN&FFv>UioJ8i`tO0~NOdm=dpY)Hg|- zDKPNli6;JUWQ$pF#<0I5;H8lka-CAbDKMibU~k$%MjY*#Kew>#jujH>rlhB-9D~wE|@OPkr4>6YDLG-=AvbN3df0~Z(qJq zfZ5E)tvMfj6rd>UKG0#JCdm6zLAZ^BCpbYtot>eauXhUyzkOZ9@+4=Q=AkHCmc<$w zqB2ErN=h7z=W-)~-4^Gub#X;$8HfK}O<~k2F~%7DRSll;R#^m^!8As|$gfxs`Gb?S z0N7?n<6YlvZf(y!SRNPDcJPtH;G)%&D-6+-4jG&Pq((YSf$S56*`vZG({?{07I+lo zRCy6$S$HRk&;A?+-7F%Hh()1D$6qX%i3eOjco`FWQFqs_Z@}R|kH>`Iba;o{?a$6@ z2tkWjef$8F{^pz|V5JM-EW&7u4|~e9;TA$(^K;^=BhSgWlKKTSM&aaZXz>6%7b7}z zb}$CcL7BA@lXz4*BxUH-ixNJege^k|{;4A~H)W8oS1u<>i^eYWh$kSRCxJWbB z1+ZEEy0JbS;)<~&>%s(cBS{4ZSRIYUV7*POu@S=jTujy1C4HBT;(r)F(@u-Nj0FI3 zRq!;X>*GczfEsy24pzDKU@Z-350MnA(t!D;B3B#PO?~9a~m=qYJDNmZP!GIb2%9qIRxnn%nRT=Qz z;+H|RzrC%onLZ)n^-&L#V~56S6G~Zsxfuw%q=@qIauU+EEa1b5G)7->t-fOO;y{|K z@_P417MB{pHmbag?ovASE`OKX7E5jzPvh3?KUe2UBOysDi0?Sa)qAFdt@Va!OmbM8eB$mJ5R7#QdoF&GXDb~cgdH=nO0 zywwG-Dgnmbeo~OMf@yAn;cv}g4B54goOR|Rol7eX)9Qo3kN^wAUWl<$Y_?Fuc)BrD z0a*&6xOr8YE=17Y;$Ve8G-!<=Hi|LPB7*Kxb!j#sVyxA@_)B$?uT!&(MHKUU?r$Tf z9+)Q&P{wL&XC&9&qm^R^!bZ4b;?L6;bie>0=}htl1cfDM@;-c+C^o>|cNDwE^4W#gho9v$BfBr#rBxJ9nM4*gT-C z6~tq8!q>uaTEEZ~J^}EE-ht|9X9KXRYNN!T?-?Ix?%hA!FDdh!f3Z*|L z3{%vDUH)6kJsQBXkD3rW1e7^SxyVdh=h0(PJ+4&DsDc!Uc92Bds?#)&FVBmzrh;19Qqb)>j0m8_Mk_^X(sXp9{t+)ge0yu2dlDO1Z z)TIHzudhcvEzFO)*_9die&BMIs~%@DmouG@i`Cyv~1k`(k{Q{HW73W`km2IDT8SKQ2NbZkGWz|%DuinMP$u6$RrDr@?DEju|9 z2jzE9Xhy{dGi(|4D(rr*nZ5@`hf!!aKRe`?o6N(*t8wwOU*m+N5hDJ%z8!poWN=TSw(25R^e?8AO*&&Y9iZM`g-47VFe)b zuNb3|#V(}#ZyVK^L#Y@&yM#r4?jZTt?vwR{_0?px89{n#{Y=!a8Pa6XlMm_ibBP}S z19+@|0qB4w-s7zPTMo5gm?lLG8xYjeGMfBW;M!gtXoiDC`W=#e?q5MpUomccztm<0 zP!&_OjEp4lAp`-Lz?DCwDOu=Ectr@$w%tlgrOA&f3wV9d*m<)UNpPIn6*}a+vX%aJ zLN^rQ3jYk^q=;4lE78G@}SCl;w}528Hs!U5bb$%HGb&c(_Mq zp$CUzrsK|foeWyx3{fF{zP00k@)Ye}xKUh$Zrpq}d`#tBF7k2lw|v?-LAEtF%IxJj zgWk8vWE3o}{S66YVPrWzXu&=r09y|`atQ)hOyy_!a5rf-^FWJ~5d#p%jJ!x*NwxN; zuaIQYRfCZnYWncUJYg(rg-jaZdA3)$QLuYTcY8hv^4+k`zjd+VM&vd{h6(*e zC`-$l%g*}dJH^3T&#&$>qr1C0qZ=c>kh?0sa29ulP3{`iKDWozK@7-?vu^3o`Ssj};Bp@O(9U|du*$prKXDg#7ns}&{Gi?37VioOHm56(3P$(fp zqVk)Zwwf$#DHMKW&*fd4O^4pK^yk04yGzZX#6ij;7hz9WZ2um2*1PY>|7obpfSG>+ zbjafE0i74jao-zs_2z$6*=16(;4XDsgZsBa%c8CAwQeNfZ&P7RDcLo}vFb`w$8whP z#X{%Eq~k%yiHDY-yenOn7MJS$gZfaya0MEa4{&&|drxTgc5wpefG)jLj@e77USx^y z{c#7HA4xFXu(w`m?ZFGXvL#ZHD->=_-!~isu zYaeH`j8-YqfCiTWoe7uYf(8O)k56(_0jCL0IVAA1h64a*adAgG{qRLK^eZzY1B0INZ{i|tBoXuCP4?nsL{rcsr&Bz(1>Ug7 zC}tnfbQ_?FjW*%ukv)&}!eh%QM8HYlpOX+8Anw8}4jctIe8QK%XbAxx&m?{N%lk7^ zHyNCb33!{DqOR}&au-QQi^0*K{}yS%1nkc~m;hYB8SEX3UI|-LDYXjP)Y` z0!mg|JS#HRt%iGQUp}&&%GMJ+RB3fWZetVtSNGdf#uhANX9 zp*D?61=eaG;}LH_3NTwuR08TNh2)OpZ*~4P3M?J7k3YED4Lbtx=CxJzB_M?XFq8ox z2jjwl+ImvNdlsSuG^^;9d`MV}SVu_TzJ^>jLm~7mljk@xx$QfZj=48;+4ynqWaMvV z-no|%EX@N8k6{0JIOQGqG@lGs4z^kj`!PZCG49!0O{go7j+su~=SKvR#E0u-r1*7J z(G52KHf8uQm8zR?L*V;=T!5$wTCuzPkZ%f06*jxZYIY=Q{~(URj=SD6^kJj)4Aw?x z&B^XB;Y^aIFYTOxgkjB8-r_CiQA4pDM>jn)q{F zPa5L%xE2`|LtB0|m%08H6qk}hGnqsLkJ+3GNN!}Rr@5#2d}jEk-@?Pc6mdoT(dJO1 zDXG;pg|c#z7b?I}p=ZsGCrA|Utq_Z^F@ik#6gk@eZr}0!GrMzZZy{RH;4Sx_LWpV# zFSIveth)W;O(y%^pPZTWt>_P0!ZZ3@RNzncD-OPH`Si}0w=ZSKEY(g=A1Hl`7Ynma zg;g8soEde&K0MYCoB6D*7|p&>R2pCh00YfQ@yg;^oD0%9-bO#LaS8Kt$n%6=S%(oo z9KH#ub0+(U+@4^e*PQM)IvJwu$g2x(SN%vpw6R!CHVN3Ur3Ma1OqCC2Pm!_yLgO+JdkwXMLa6XYZcA zC2Szu6+O8Z=vfS2!om+lZ*Isn&XtXTF7F!l0w_f>so=2L+7W^2Kt-FQlkXcgn?tGc zmzgqhUR%lHcs!Kg6q#YU+fv;M2MMLKwOs!Cf(=H|9x_>SlOZi7zJP8u7Qbgn7@G<|sRB7H3h%5c z9y<13p}k69IyK+9v&+4>nCG!P<3-9>34B(gv7!A`t+KW(FiS0Wmrwln%rk7G$i%Qb ztH{YAya$eH-ZKIpKDV55!tuAtB#j`iGZW{X7>}e-w%3Ay6*Fnxm=GGn1O)K>7AcMp z_UpK&RvV&@Upic$_7VbcuY3|l{VH9>XDq${IQ;x#4*FTNq!`qXeH?NBJu;z}cp>cU zjvPf^K--zvE7an8E2jY2G9)AT|pZr3iOPhu$bvH=8VRQJjviKAKW_ z!WkK}Wz>8yGd^p=MG+g^EKGYybGRcNV?>^B1H2qkeKHy+bHA$l=RCh0+dphev$`3% zCRy!9XF2vZ^%b6i7l^4Ri?YPUQ+HnBU!w%)vs^0^ueq9 zt$)3U)WF)#UXS!Um(|p`wy$`f7mTWWu6x~YTE01wtLO@xe!!KT)b6qmbCYMRa+KcBbtwtIJ7#?^q9ss8N%fUTTw=xzG2HHSzR9D7f*>I9n{YM3%`@Ld z-d`3}T~?+_DL?OaCU=32yhwNeHlD)UNc-7QLM-Khpdq~Im%o9_(|_b3zz_^5!%+~i znC1c`tvRdjgFo4rvoOk_g_{k-&rd`v!?{ri-X1bb?)6ZQhyG`{>)puaR9@NhRTUy- z;RCBz`ycT?^f#ZS$nb;w+_?XAwNQa9Vy>7`(lFpN1?)#E&oe0CUuv@)^EbqQasDfC zc%{uBfN2W2hQYdWLL2}RfC~y5=aOXkIPiB!oy7PAjp+9wM<0nokOGx8Bd zRKFk!g{cDE02rn&8~)n+gKo&K{d4J*Ar!9s2~F_z2buLyG>QZ5^c@?idPvL(vavM9 z@HB7Qg-V44I8Q=7e|F?lMJaE8BVP*1O(CcTC~tXWjTzw}Oe!hGu6bqb<}Nr03A?4- z`Sza$oT=en4qkLngt)=d}@lDv`g^q}cAbkpnHxF4 zl%>(iTj4If1O&pTJVRxW^Z=D-Z@C^P1uUw7(hW$yM!Nts0rTKtuq0^7Fodh#-Z{6K z(Q)}MEM$w8jr(%ZW*z%6egsqR1Kd5Bij00=&N4S@bmu`oJC}(zAy7#1erjZL&qW;o zWJ#A+!q68yR%rW!P=B6QCcp}N$sf3-1MVu^FyS-ID^)b9&#-|Yf!YO#tm2Y45C;U% z<~*zBmb<8l z1yGslm&}HTRsXJ_XHAU+wFBHz$}-tNP$fWHKt0|4Tw6pOqSDOZKVQ|(po^Lk6S8+- zt53I(0|1@xAcY_0Q^OJE!=TZnk@fne=SOxAAzrvhVlcGPUh6-9np2$c^HiO>dAu)fQ7S)Gw zs{dU(XQl5saETur=6`r4m0i3IvAiyiT1yI=Jgjq-ss#FBw1OlU(bC#XM_<%MM0 zBz+!1c+Zf)X!-DgB18`{@L}cGBfx`f9J_Fq9+Ve_zs~@cgbB#&{pV>tlSA}CF0L05 z>Xlc=iNXXYse(5fij%FqrrKJK$&$ZYHE!d@6Z@oIc&O6bNh%g2&fo8B7?-|Y|FLT} zqyjKgg&gyr4#4wxzXpNw`tjW#=FA`D0?H<>p8r`ig$c!D;9f@d32JuCu5200`p! zltZFnHZO_}}CDx=&751Efua`6$aP6Dp3L36c`x=)`jP za7Pu~T@uXCcfPWDd9Z(<)jOS#>)Bx_PShzlE+d}!L7mBnZ}7q9+pp`u4~LUbV9DnZ zp#0+ggbxqUhM*xRYw)GWXXfJn3aZ%(-=QmR2!KLk8`4)T4=C6t?e86Y(AU_^&reSp zY?f{?3D1ANdmX+%T(&0Nr|KlU{oPI8yhZw5RfjveNq0gZBZur=o1rw#cr`O>mH~ksgE7 z%}h-N#|=+ai_0qF8#=hbw+GV{emipn68z>xgQz0PS+cMP+M>sM382z_fOu9`MSB-a zXpQ+&0=UIT%6mB7{P#0Zq%NHSL|B)5@9E#d$6zhJo8f!yN9}j>N1s^gw(_^!yg&8% zO07uvo+ntExB8#HRLy0;STk7iAJw=m4OY^3hE{#~qE; zI7c(?7y#H60s!WMZ~+o&eE68DF)tuWdW-wl=sL_i(cTE7pcuh7#Ull*aSyS9>mFl6 zexS$6?zt>&Tgc*h1yg6fyq{|@yGf-P-Q(iHbc`$~ezv*6-ovS6EzW0Od4VL2;k8o2F4?|p($zFMr%i{2_nU7oi{M}{dW7b;`tZ+=%?U*%$ zC2;r1!M}}% zmcWp&@3E|KCUcy?HfVHlk~FAi;admhTgUSo4{_*z82P-^DMnj&Uo|Z=O@)6G@~Izw)LfUy zMR{9AENAIMWAE-$9*Grt_Sh8k=;QB)K)TxkF%Vpdg;ayXep;va0-`jxXfC9@izD)X zLhjBAUU~wAV&za{1{CnTpF16n9}xf%3^|;9pO`5)zG+k)t$HruwwSO9y$%3AKEcczMuzu>n|DBZyk*sN*yq8#*)mal`PS^7Kzg+)= z3K$KN2M%8Va2@;(yN(CkHyDCsu$MavKLzhl&jc2+n=qRLy5>7D6CEac$A@(UGAJjIvxDAH>vp zEzKemByAr{rlydS^K(@-QOam74C^DHT7vkv^U}>-lLHx@?)LT3Y;yu0_WKlUB%&1I z3EKSkFh1_`Gu!)i$p*BVJxcqZ5KA8-fZSX(QUgox>+3x0DUTVE(N<@3W*xk@@$mw& zCBl8G&UM_Eo;e@l7n|G<6b{79mxWaET!}XRr$ato9&QbFk7l`&wI3UBzWGyA!IN&o zIQk;L`~P=Tr*%G4n5aXCftMERr8)m6!hWl9QX7l7UW=;4%HCHKX+;b5YzvCAG!m;SD}7{2%T2${bHVEhf~ zOo5!7fz={Ih7G5cEv1rc@~V)nnY@u_rP6n!n_7L{hGl#@5j@#yg3}2={C`lZxHN$L z3A5!lt4gN;9-&hI8cqG5;YP-j@l#Dl?lm`FoS%mxN#KzrP3Xa}&aoAJ3sq6>@x>SO z4IQe70)^dbwR!=e&$x>s(Cap_36E!6>?IENcibUp3$;LB2k{VB;mH?=Bb+W`^-pWS zWnzN?m(eV-6BM;b8NCfX;KTZQTbbpz)VjqX1~P=30e{AqgdZ5qo^R2f(9!Z3yYf-#7?j6qbx>UYWf|EEo#eZD(rWjS@)5dE z=RG@7wrr!(Q?v<=y&;B-mC}L#|AFcPA^^zKZz*`U9}4)_3zPg04C15=dfQ3A(<1kd zizkbCHH_RAzPONk&$KKtN-8)?NyHc|_uG{&X*|t|It;ROGCx1Riiy0GU=Z$Lt)YiB zko5dR$g^kM?tgSNB{ofXViC2i0%Jnc6QtP;*zEX|17jc4c|B{q?3ihfeTG%6u+clJ zrFPe$r<*=g9tS(ado%TX6Nzursm{wAE&utTQ&`Y95_>^0XtYM}8G(WE{I{|u8u_M& zAf(6!!1xX`==$UjUm(%Lb?vMV4s~GMfL?QLP$TwfSYf<_gD?$4x>oO9==W#{mhq^kBoWoG@~1%Wk})VRy_XZ&i; zVx}76xFH8#KhFM}r#q#qQ+!gkw%lv*WhSV?sd2HvFPZFrzDdync(haom@9e&#PV79 z*#-qkW7Pj5+8DQnwh(e$997_wZ|Y;y%`)7en!KM`0%FC^t`&3WP9j0r zv77Mc<_u8mKA641zI)T)nJ1I;GxZBcZ({SyxTpEk1pgwV+2{v@MJ>RR6u^nkw+EP3 zLK*F2y@urho4iTIukeMhf(D-%p9=pi&x@(v0z|xQ<+G6M z-QJ;p>U`Z>cvpF7M(WJ_>P9fSR|F@~V43kl_AB=UgS}mi{xor+&vUDV;dTNiAOM^0 zdiUtC)V;&NZXEPC?Uw2wRwg!vfkz=)ol)n94s&vfFI4|9C^7V7-U1s}qQ%mj*H9|2 z|D2Zy*Gdy%r;PB;n^=_n8553$>AnYg%)9sm}4!_rM9?zq~y+GR7CbOnsb z*s-mFH};Tu=#2p7H9ZYw5@Me#aCTFg7?P`!yWy(+Pjh6MVqh218F3+x0 zEaP4WMV6fk_Rco3YNV)`m6ib7R9Gdx=^F z5hl@)j$MgCr7pqp?oaqBlF)AA9)CFXPMFRP-&0I!pJ8n_@^m>1dg)x#v|-5wV%)s) zs%_=%S#=w1U8IG(KD8PO%Y~m9Eyu!g^qS7(L=+V2?tSKHIk{u0X3gXR_KE=wYUIxL zu88opWNVv84iaUb?rrmmY4I0DoW%tE#QMv2$w{)6wGB^X!F;t)YX^kU6%z=r?b51o0_g?C|Srexv*>YSr`2&5(=rr78Fewh?T-`Z4sU- zg6%==&rqu&M=wT`OCCo%mrd!b;-Le~k|0-gSq{KG73Km*bv1262*jW+>^ zTW0V#^>~Q{WJtiSz~3mMBEo2O$~7|&2aGx5-q`zLP>0PQzt+}F+V(uEq~A9-RxA!{ zBlZUqn`$~+OCjQ;o}9eGm;rPEwGx^DT?{BZed}JE$cf$9dNu?>wMD6MapQXir?TMs z%~?Lr|8PtzE&hg4WL~e)i+QlDs#S$XUH1QKY(j8kImT?Q2h+6138`wI z5@4#n1wj2c11mvY?HuNNpSf-i4;y&T+c~PJ*+AaLnJrn`AlwQTOC9XC%I)5HfOj_@ zyrWpYOib;-5B%&r-9npAGxG)SxuFjS;}2^IluZeO;PxKU$nf+Roq_By2Q53IhkZ#P z*zSma2dGF>Bv(Mo3eydy!Vp?IBlfO+0{kzKp3nIIz8FO1+Y1RMjd2LIe%pF*c{xB5 z52@%}SK<$De18K6Y+g@r7|D@mj%=h*v^&@tH%!ZU(`Z-P0(E}_b?d8*NQ)r2Mcd}0 zx;o6?y2-)gw)`mnm#$VLCpdn+qZ#$CFvC+JgiNdrD^dTZ3#IIIX z^;O_g%9S_8&JaUKk@e)J&;Ps~c_T6rTQ*Gdrg#(Bx;)9D0}mx=0Ng}uY=Rr(?wf(0 zz;?KgF1a#9OZ$;U4!P-LJKTi|qu-8n$qcurH`dIk?EiQS z2$+1|{ecX)N-+dKb{e-@RR6Af*MQAmqM0a+DsPdG2W>1_<#gl4z1w%6blv>L&k=th zcl7ILaUT8M$eO4$k`f%8Unds=w@8YX$AYgG3+NBCaEqnIJ4`_{<%cTSG)sY+SUMOo zIA~8(I2U~ZKl8e)?35|4H53+&e(pIhvdfNpmN6zRaP#d?DUtdNQoXhYEfvAO|Nm0#aRCaXzRwFvS{4J*y&`3L(RxD#824s-hJc7 zzTs z@x}J)Zxuh3SinSgAKae)Os!p_rK((TU7nq11xd7f!kz9uvql0+eS_bIMqtb}wtYz;ljx~KFB)awRlvDA zys$wJli8eYTN|kPSykxUGl~GDkK`jG7!5o{UCjEVAYp+o7Be3#ZM>UW1y{7aHKm8T zM=H2%&mPa3E|)T~u<$datC-6=8k7$ot-%QbY$4cy6aBUHL%**- zBPOE7Fi!+m0?Zn%H?@%B#~Tc<#_OIi%RSU&2?K@;8*MZ%Qt@AQU_+3pLHQx$QLb9y_>K) znQwR3B$LTMc_Ooo%gfi+n2WY)w7JdPVB}C(Y7YDVZx-Mlb~6%tvi_GkY&I8hbWbtQ zg9pX{0~A){!DZtVDDdr+v8c}Of;Qf$Ua&vJQbDOUrZTBWSOj=R$!YhVAg#lc3Asvv zBIQSq-~8DERo`Bw2j#p}u{=*!gc{kFcmI3RkDs>=V%XoaMT9bgdl7mPIBU~cd#2T} z0?+|+LoD}O;AC!b0l&9xw{J(ozS5P9hbq(7y^XCLYx=wn$E8WzJoK{$9xNRb&Qo5W zeN;t1TYn$ld^s3WVlFm#VZvwBE|;M)SB^?rUCrhLQP;P?0jNJVnl3AYJsIjh6Uy4b zzXOn?WX{{pGAJC%O_IwE1o_kN99wiGOSSqM&mM)j)6oG;jQjc$1_drEsVhO)Vv_X_ zLl;6%lcsN|{?}gqWD!#4!>7%lpP$)1ze6qc2{1n^@`ig4fu+M?w3qvpYJ!aVK{a2i zh63}{BPV`hUB**E-;$qpFB+0EdM{t}P}v%K9Z=L8zvO=$=hxwjT{0)A>u1IVihJJo zVVnFg`t}1&X=lW(zc=H{cU#o;w}Hlu7EJ0d(!s1<$F4haK$f79i*75-t#PNv`sRhd z^VIQts6@k*uXvv?_S%q@wIUD|jLDzF^NUg50(dSOsOxUW%rGU-t4h5n#{;O{D z5ANDrXRvpUhkdjAUv=DL5&kKHlajBhtnrn(8MgtUIr8mFnHfuAw1W%*_9imXH{G)>$Z_|Pv8l=-~bjveB zOhm4VKJKm_x$|;Mnn3Yw{QN}{E8xB5JR>`*aURxU33sCCs(fCDCmp@RV{$>AnE-}~ zg5g^jwlg-WL8k;>6~I6lnQK%MFVuJKA(aD6;^aSCWpQ8Ms@ulFK7sUsG+!>H4b~1P z7t_>FXJr$XU{tcq-n^QpmgyLpJ;|k6Vcw#quW`_XUx^K^aGEhO{Ea`E%3}Lb0JW#= zk{8(r^DcK<5Z^PCl?ua7hFCp4rJ)GVI4M9uF5=Q2g?4GCR_Hj@+}s|0{c*m%+5ru} zRsnbgv2nBFhk+nqQwqBcMDZVYM{PTvynb17b++dYj%@EPn-oCLQ!jzp<(fx zE%E28abtgj!A$fcUnY&SCaqinjMOMv7y&FnGL9_+Lo2BoauMl9&A#86HLJA)n$4jE zE8Obzkaw9Lsp8(q=|dtN4RF09uu^Jjf0rS4VlS$=nEP?g9Ru2oXz|=UWC?5BNm1`QimQFnd0Gbrg*VuW<2363~g#MQN ziu@%@4Hi^F7s7rZB+X=mnC{*bzMMkQcE0B0a_qn{=m4EZRmg0WbZbt-gG-?~65uz! zm<;XHgC>g`p-eCv6J3`Iu|rRMVtJxz3KVl$nxG+iS2ltum!__~%fIx$_jK_z6wr%N zhqP_IryD985W||wLN$4sQ{Xma{I7bkKEih+lt79mtO-Mc;;*}5lbxHeS87?I`ntWZ z^oGOfPDIcX4vyf zXg3Vzr;X{dXMi9|43}e?s&MgBOp12GbxgoSY(x+;qeV`&={tELWX3&IT(jYq-=*4F z#@iVWNA%c=pa{=4_}~N9Moj0^p7e9IaqOl$Oz&aOuYK2MR{PN~i0j^so9a9QpoBjl zRR~H~OS!LAhy&&JM(21m(|x7uZ|x%E*Qf66k0S}n_@0OHws}quqPrOLe4bh@UX3Zt zY>r%BTQ~p7xI(4v=7t`wz^zwR3u5TF&;$coIWAChn2z%Gu-8p{n1udIu&q!J zG9z%tPDd+_jP8ea9X-JL{^jGI3}R5R)paKOgA->0i^Wf#wym<$-_!+t3BxxTIap+J z5zRDNi1`QS(LXzRe6?F(iRl;9!?*t0J1%+nzb#q>K&BX3NWx5LA%Rd4RemDwp3oC= za)@^>TLHC(9K_DCLXdr=I7UR*)QzW5)D<$UB(TAt0>J2SWoKplIyXFT!K;uze*S5c_*3%$HBC)aw`u&&Y7V*Zb5cpSev3)XJt3 zS37me&D<^VImm?~H{E&zAk+a}c!Y==l09_%U-mJ_CuLh**V)GlR|CM>O&@Vn}-*8CtrV(PUq5 z5zS^P8F?Fra_cwVbO*V^spToBf22Qtfz0^9t=9aGu+~!;nzrl^$2#gefFm1G$HH{4cu22(KO2vIlLi z)sLZzB_OdFobl>vcu4QX<12Cq=-~9U`;J1yj5w9hs9{h*R`nQ4fL%zT))V9uhhjtR zDr8(4B5dm;ZR=5if-nB!piShh2tnKkc$(?tW-@YiXK$L&|1nUDMzP`JeWmFqMW{ol zp|CPxlfc~3?glpNjIhs~A=VXe?d^uxsujkcJ(*Zjx0`FA6r18tky_UTHYWo?o=nsD z;&$>-UzpxcPz&*WH74E9I?DJ_()d^3hGeF3QA)WC_<40KmA0XQltB1sb(EeqJnlSP z4eZfcUx1vKmjLf+n{$nNplMCRVxTs2O1#p^zg6QX6S{4%jc@O!iVE;Jhn$+-RVV&MK)_aX_jNp zIpeL{3GuiZ3eIP^6GHNP<=G;Qo)egkrx|Pu70%p-NAG8i9Wm>^%TD>7?=<)98e4%> z@9-&Kx;-j##qVdSMB`eZnrr#J;#)?30XKrf#sLw1W1HVXS#b>4p*3206|TdX!2$8H z@v2_Uko;kzQsd>**f7{>A6Cm6Vh~)c!fx{h*BcjClo?uCucVD1GVy8!yGq z1i+TPGVgU45fz(;06244HkDj&``-W?i_`fJ!*TxTOz^}B^q*$0qvznjBU4TKKOqVu z#Eiy_u*lsJka&|$txVIP)XuBq zsZQv8voEhkOPP$BUgv#X~85t&Mov>BU$9<|Ccb!B`h2k#3yXcY*HAJ@NY6Yn zAD?o$b#yk?3!m`>5e1oKBt9smESVZ`vQl3iz`Xi1!Zg+A9O`qjP4okEbLWysZK$e3 zRwNJK*m$+canfVa=k+$+qf)uD10K5h)UP5?!(_>`V~Uo~G3UH2O}aoi8NGR2CR#fd;_iU8pvgLY}5PPi3S8TKtm)8_QSY3J9$Fkx5T!E zoo^LeX||x~&~3qe-gyxlRSpI^M5@AQ^*Kv1s#R<@Ks;xye6hxn%4&O2aJ9d(&l=>(!g0PtrwcYwn6O<11@G0ecF3KxHKBw@N6a1Hsp)k$bw!W}xA^O_<_Q)c$M4BT^ld0VUIUb0@cH0-g1XaJ ziP^M*40aOeHTk^bDM%bcovizV3LrU9+kPHI(!5GVVv8)B?~=|Y?#2^FXQUu!hQb06 zG6PKRwqS=<&UaF)$((+t_EQHm19ZN{8JvI4idHpWx1syh3+{sOpv%SeAmw1*eon6u zX=;dKmqS3)p9H>5Z9WU!DY~EfDg9w8x!qHTJb-}MSj>}UFaXKK9Y9f22p6=e1p^af zrYKwD=XArpZ_gb!ZNJ=ilQO*T>iv-SgVWb@$VUQ%i;NerUAUwGqBDb5Yh5Kep&Z{0i^ItrhB=hm4WxFIqcVs0NB#;A7T_Lvowc5wO`UglC zQ(}HleMcUQC5PE)Hc?f@TozYl>B~`d-DKxa^mM z?iYSY11V6L!s&3~m4e_E`V;SFktqA7du1z>}SfzOpQ8y8Zt=1Vyj1z+8kyi=5Sr_gT8tMNiFkK!^yR>(eJIEOBud z352Lr94N(q5EEK;sMyB{vk5X6)@9DlQ6hq5`+78GHJ-Lkk)a{o-FXcH7oLa`FUd$nc6ZvX)FkqiI7R=S6HhN1G0o~-K?HRF<;;; z{!vU)ipAQFgQoCwQ|X)xyv>-8ZwXB4q0iLa1+C!27|&V&@i<9_&R3KBFl z3z>hVyq%00vjgw!isSB~ZYJT1Nn%4Mqi#w+_{SFK_`)unHe)ufc#?hhA(~6-DqRva zmt4;vyfr z;(mR{rdUj+5PBK)qL7?Uvli-VJdo|$y2(=$B(P?hi<@6K?8g}x@a(i0muY&(?LM%; zq5SjnKeh$cwCwDDDAUCcEd~H`i2CN}UqB_)x1e7k8c=mKvXE(Xw5>J#o5uo<=;o!b zGfg36*Hx%5^z)?@`RYfsPCSFmlbvyMwTRr81AhS2ax{8`oBofCL`sz#`|-LT6Of)U z^+K^rKu8EDt;s8B0MBK`^Z9hK&dX`pmJAvipTf4?vUb;mPFjz!=XL>IM~l62fSiAZ z<`69jYK}ioia<2jne(7NjbZ&$miPVlt$HVKHpeEH-TqznP!{-D<*)Hk`c0Jr4V$1V zgF1RrBWi#a3qjf(Gb6BPAM2mVMU|p5Pr+B-%F~RS5I=8dGhPFk3I0P?>jgZljM3mU zGvU2#a3Hem(L>K;z@7ShLeivi^KPaG1<766Ui!s?zaBA_j3Gz zaRs`A1uXPCIvSYXctB!kWNnfYw{Oe9-Hq3vaFEzK6dyPW8&;HYKtMIZBgyk5 ziz(hJML>QA9V8GNb)>`+5~z0mHJ9IU=XesQM*;=GBAQ2`EK9LdpGUvmsQc`=^5eVN zQw+xMHx3wRUo77>0u;5RL}>cH55BbT#I00Gm|-kc8+b6n&bOI55`vcHoXSYQC!M)v z5G=-~d2MY&QiucDfDw=>?n88;?+=`jp|A~iPKNQ!z=Dun*Bcpub@bFz*DOUM7klBT zQeT8`v!FRoXeSMmsM;8F)q6w=jp#cox7vTy1G)V=r z^+ep1gP)F##qi4|+U~pDemHBt@2SY34sgIO;ET~_nxp$dD!N>=mn};iTxpkRBh0%R z|9zXh;Bd;__^1U)GMjh2W(RdzgwSNl4>~Mgt-4<;a&ihbeSU{>ixE>#L_;@Z!v7tn zOCX$<0aP*Ls_$E+m;-;l5LE%l%5ynNdl{7!EJI;c>TPFci&boTdp{kVoEXic{ADFr z?w;2}uD~!Kmg;Du-tgUga1p&pLXrsK^iY^l%1=oZE82XyJZJO38Ja^bm180y>LC^u zfgde18=S~?U^~!*{$o0}2eI(~t~vx*{Ed6PD|u5LAWB8fCqp>aEnj6t%%#ttcavJo zpx$8xMI>unWj2Xi6cBDTXm#kR38F7FnWX_ii+el2)f$>FTDaJ_QDGzPt2HFBi?O{P z6U_`T%ti~9bGFTYcZPH^#oxN_VFYjce{=XQU~s&$1yEDQ-NJSqn_NdG=%4}^>iRd_ zxyxNQ|G~om7jF9V1x^l5uMU;2Pj+SxYqUBFzP<`z{ns^m>prVATB@L+Odp4o@qM}1 zW&9^0cuCsvq3{5ABP;uS?;L+f@DwQc#1fiz{>S+gFV`S_@`%aUqeqxW0qava=_l&pXN zkyFf<(}XH-(TR@heSs$Yp#j*55(=8BJv%{mvBxq-z}~@FO8QS$lUvH2Z%~#0SII=9 zh2)Lq^N;s>+_d+FI{2Oe)N%vKk6CeVX`MAB zWOe#2b6=0p``3+^EqqYe<7vxy~w+{pSNY>4L*=tz1|*}(Scjg5x_b@Uq_`Kt8m)XX^wR3 zg=+%)S}%k{?FTm63u83no{kT`<3-bGk#F)kgk)!1te+BZcuTBVE2CTY8+qw3)N`p2 zA8J^Rb;TSD91Pr&H92p>iam!;Zf}W^H=Pqkb3JUjO>WNRw!s3hrDC#h32+lzvtJ7T zNOMF~jG21Kz2Vg-yo%Q*^`cwnmoAkUKE7{L{cE5oh7KwQfS=|#w!qI`U>FBA4VB6q z-$8j-g%9?wsMV)!NOkjJ&855owDV{Gu3Qhr-*-(3DZyL4H@j6Yu!xAUMd34HT#f3z zy-BjP_S(^DuOYNQBtB3Z z(qX&Dhh5Xx53&lehca_$7e}YszAsxlAAhF_qr&6JL_Pim)Gt*Rlwfn$qKf}WF4t?m z6U!}ggzV6n;{nnzhLEe{r+Q@G6B!;PA!ryv%|>F_bU#7zv97P(vXO3MqF#2M{x2i9 zOV@$>a{~PQsY=#Y)1Jvuxh3#&Z?hF^qh0rc=^QAyjE;^kSjTo1xDxm(%Nra z7UJDsU#Vv}ObzwUlDPeDT-vO8gY%_e8l1_T$p>$JJNt`fktBLzVUPjlZv)Boig6#A z3S2v!cL&gA*jM8E*$f|?>Vq7@#D4T&&EUR0alE72*_BgE>{B%F2@7$YHPu8H23BVB zFrU4MIL2lhwJLtjE#5+CIo*<@|Lx0p_<{z5i_fvL%^nmT5$x^4VLw>D`dW)?Iv&O} zBYf`TFTDJ`vBQa4{6|kQdfGGTt&Yq4sOlZ@*v^hxE#9rqKq04(A#y|=B^`EGFvTe1 z{m=D8WMSf+Dw7!jEWf9^!j}TA9NMYBV=Ba9MCTJClI^ap4R}WLX744GC-@HzFAZmcT;Uf1lWZ)Ge%kdv@?Wwo}cUvkeRnYKt!) zae*y7k&Ds5wA>@MZgu_uW>{|@^1biz+?FGz*B({><){zq3B`r&&l4hPxtW7Q7Z;^0 zu)gbq0=eH&&)cur0bgZD#H*qE=~9 z#dG%r0K(fE&Y2f#P^PD4^+DZon;n+9^_k6^obN^PYMZ?8&~tnai%a-OHJAr?(4;vi z^MkgV8Xh94BD%}sncddV8Wt3iGkz;b8erGcmDF@J1U0Vvjxyn2@$!B2E5Q7=isj;O ziG77!86hy=peAn%_tp2*=?(GLc5YOttO8;87emM5{sJVYvewR_*=?_0- z8$ZR-*oRaifSqQeJMLx0DL8y^KxP6Px$|Ooa)NR%?TiHw8(VPvzWH3l&>d~(HIjV4 zr^}+;$#LJA%K6cNIfsOaz==J%oF(%%szO-h4*7HW?^jAf#3e` z#)}gka2#VKHL|}-X|3yuT)*2}1WWaHAH}9Q7nPE;`(i*Qd_Vs~xuf{)>%cpM$$H&C}8 zx7R8mZ{K=+tEQ5n6@S{q>K=Qz*%w3W8gO1kOJmcG^T1r^v}pd<=gP`MC^aY(NkJe( z_Oh{bzCFHRf&^fc^jJ{O)L^XB^!>WeH6^pG7(ClaX3;ee&xNzd$xK-sVSjd2*s{**R9af^P}s?u@3)22$J9TTx={fUlO??|q8h1X2W@9wbpN2PJA*n?u{3yT)1 zu#u?kFIaEuE9V{cakT1qp~>}c`xF(dY==R|5WMv?I=dWP1UZIbpih=nm7B&0AxiVi z)oUr)LRHkc-~RbU`TNa6>>T>^fJx<+6^F7}*T*-xzS#k_4!=oz{u2*P1p<^j^Fn3O zAVM-2h0+R8FhHS=KN?75PT2D_hYB0`lL=H$fQcUkSFXSm`z!tzBe!rQ)Yi+lW@>2n zDuG|7rII!+fvVFPT+_z6+{I5I(RmE!_^CD2thy%t(ZrctsMTQUMC5thXQ(+gi;{#D zVu#^Ws3B4U>ZUTB*BIwg{4R+DbzyG(wdlm98xioOv%z%#jQhrBokze9sL{9#2N{j@@3fD&#V zy~?401bmN<_$PKUS?Lc$omoDHJb|==h@m?ET<{b}XojL&<9^@DX=hjAGsh-R?mO&+ zsUTSQu6yeRw&U`zrZrzC^{?uKy?F?2uf4Ce66FBJIh~skNa0`e!DM2zd<}9~VBYt7 z=%{m?*pv07gGO;O9PxI3oOsasLqEqR*`%m!a?E(?^BGw-USh=|m<&CQm$1ed-tA?T zZ1K2&#sZy%B5^*<9X}Ak&a7|m>U6pO{leJ>f4ptvM{s`X-)`)W2vav zACM{A#0&y(h`oQ>F)FTrzfuuK(~R;7RG z6C|Ws>JNVbT}@c>VG=cJy$((iGa*tBCn_UqJ*Po%`fzpk(4w`QTe+|vBVqFX?Czy9&W3_R;2W_%5K&KAH?rvYpwUSM(W&hOzj-6JU9Lo|7 zyxibV`aZMW~ zGRQf{ni!t|z86kX9k@|_c#+F*k(D}D1z+L82VzO?G{-J$QPiFZssqo$=%umbg5V_% zlr%mQo5La6aV~?X&roaUaZuRI3cltM$d{6`hFI4dY)^_^qfeMN1#E7bdFP2~!)^@x z+jCUEry_=KQQKsyei-$(81M%{+m%eR2=be>1xf|yS;P|m7+WVSsL{yU$K@hBcZjQv zH$4*y>LWGzEO!Jaz82({og;n9i&bc}a*A56Yjin$d%jGc^uyfe$jPGFxP`|2x`{u) zMDt?@wVAVbo(aaLXw=BX`XwLoGcX5GMEWOSTS&<_Cdgwi{)yU=$xmNUFHrdOi8zz^ zyxF*z04}Yc>itf<*UqW)$73Nu<8(#pz=tCK(x@~!FR)6 zbUS^UGY2jx3}y;%Su78BVsC`}N%3xMfQKmro*KBA z7EXsB94@zrA7{Wb6qikQ9W;fbj?ZO>F|Je1!^O2$B47ab2$5+@N~ z0~;VYJNefCE^qqy3LX!j2Q(d<0n+aMuX^}^* z7XHjg>TIPEVUT3}XCN^mCj*UqWH`WNFGhSY(MuWQYV%~ zzCx>PJri`al&|-+FH)EU+DsNJ&3iHjPXsNQAV)LIkI8#MV#3(qTcbd5d9;cD%m!VU zg(J&ysL&D2v|2ujusBXm{F@G#^ke7yD~joz^Wz+R?$h+NMgRz))pq!)w}`D#5c$g_ z*HodO&Y_r#Nvc-56FW#=fh8qwKZXR5Krj6{;Ga$*GT>hPqAPZJe+3Tnyz+Ph3;eur z=>!$bN4b9UI5`Q8BJ&(+cqRWDu!Ozb=`4Jg$F`Y7kz7lwfda!Q53QofYH5w}$0o-r zUv@j+>w1VfpA;?P#NHMIJ-cLjd+nPep9k+L^Hh+7ccYKN^#=WRRd0VMiCi-q9?tm_ zwJG|rhNEGr-Lj75lBR$K^W-R!&<3s~8|VDd_}*Xew@rlTnAojptdIWjag85H{lf)_ z<}V|j8N}6a0)=F0t}qPPo{gJh^QDb$(13#9u=Tybu=*zA>cu3V!r-BawT%4gQi*hK zCm2(ae=<4nV>ED%cZ3Nt4OEn41qcaKpgtB&w_#SUaBwIv@q946uUqeDw1-crk(JMT zzmsqMUA{Td&a{AIZ>9&Ce$LysSaG>-xR5P)DCccFh1FBQ09rd=ir;4$12BI61{^TH z;jELB3^`R+nNX6DwL@6&CmkFdM~HHKFgZl;$p;1oIr;n$xA827_R+9GK{1l`I{imi zsDyh&TPH375(&qGnU(qWRtBhqWyWbmVBzN29@GBXE~zUgD-Z2|Ksnu1eUjE}n^2fS zv@j_GfJ5rl7&+`7GUQb z@4a|lo(~j(RWh|A_H*&R@dQc)wfN%W$~wb+?X9`V)qIDi(4eEYp-?xU;T7dJGBGq{ zG3oS-VJ0IBXIIL4iCu!Bdf3V(;ShZn^}m`K1ps6tzXMaNRuM zb}>Z2apcM)kOF;~k4F@~)(z=VB-KZ^G)qhXZ zdm|7j&XQaJN;X>M`2S<33RjwN5kP%3`lQf5Gwkn3;1#eMJIPUp=%um9-U&H~e}QxG zL61ejL5}CN{(Fo7l_y0lbhrP65*w5LTUO4F-*LTk=Ci)Hi*X9`*BE!$=!+kRPa-l* zm`uhh$p6+;%=~2@Wr;#dpox!zA}OOtlZO+ge*C=tcDHphew=UmGNOxg{rE~2v}Uv% zgdY->FA|qE*9Oo{VOiEv|Lg9CeHT+$3?!SM|DasvmSZCGXu&!P`cje;n1urg_Sk3; z=G5jFdi@xrXdY#}kREpW_Tf0ofeGN3B|4x8*L;olDLCqQ?rE;SetdQZbg~z|!HREekpli{b5M z%vIPwMyHdf0gd>5!Lm(-V&K-}XaQc5`>n(MIv0pZFxGBM>B+su(fG+?xKrbh)o}*6 z$PW|GN*)cwE|daLQ}dJoBHLkcwF7X1VhE-Fme$6PpeS$b8~mO(yMIr>k!tmtUH^8? z29OZTE%zXN$84?4jMWVPJ7@YedV_UoI?x+2t-CKw6PNl@b;>|O?ngbQ{AhRxvOF@* z9@=BZ!d2Ls?>2_-t;OIng$VK;X{xt)@3rWE`hqpz~u642|6^=;L2 zvz&Zw{`3qI;-+)txI4{2AKdcF^G|xy^YD+B%8sB4eYE@Bb-M<3$S1VxYjZPy%I)p# zho#(ix*YE-dAVk=$M}E@3CByXTa(KxB0xf6lj!=o&6U_QjDt8Ds9EA7 z&Hj$xeFyISnoZVNlN*md;SI`qYAmM0Mm zv?q_38#_u&f0rU%oTE69(INPp2qyak=mxZF!`REB%41vA*Vq#a4WjgPO@1p@0Gw2a zm1r^R85<+ur2De3D}8x)xy;qpcHd`R?vcG~LmG@gtzpWdNdBBp9nwIHr;!v6A8vms zBgKdTu{9Yb%gD_BbcQd>aHpW?-D!R}f!pzVTa|C{dtkk>HOK3;qHYYoLw>q^#S_W5 zv4=>a3>Ls`L#o4`gezfB-2TD?aph462#=X}2_&A3E)S>JwU=qG-b3jANrhPG+FX(I zcsBbmeJ$QM>HD(neRDa;$+hJ3W@s1lxa{V=9kbwa{S>p~%U7u}XP#GGKYk4IC^f-_ zYkGJf0`G475YgPN;6CkPET7S{(#nKanX9T z5`!)u*PYUpa3wfksS^gIXVlpfK9`c?D!90O<{Tl2lws_*qVTeFHUCpqUsPVlVpUeJ zGyTR4D4%Xbv!(fC(O6r%qW3Qs7goi5CfT#BF1D+5M|}BqT^>ZfZsThC zAQj*zUD9+A$k(4(X)y)p(Tx7N>X75V7j_yVtWaOz8Xb?zzrMV>R~Vo6lRgran%}q< z42PXW6W*FbCkU;+xJbiDXw(&u9q3o&8zIR38pFL$r1J|4@gfqs_f0rQSZUulc})Cv ziyt3Zy$H50S+Z{t_rH{WdFUtN;ua1XF13M#A#Mt?limuK z8EUWSwB{G;RVmTX8 z{UMzr2Pi2ip9u~)R}H=6t$;Vl2V}x(YMOVwbN12EAq~TpxYvJo+SbLGzhG!VYm7`l zV)XR_y$zH6Q2ZZ=RKhJ%IE}J_oss|X@2At_1;gC;(5h&$hXdNs?HBv1wwrBR2fOkd z(&2yGV|4q{xF4XNMhPVSvQL{nCEZ)kX>^J%ZY4me`piL=S)wSk;X#p_k7oY1Tz8Crn}M4Q(@pW)slL^jr?DESiq@I^XG#p zWTDUPVkdDYis;RbjD_a3)CG{wU+>?Z&x@CqmRM1yINnsTrC3^t z@~k0mPh90|HcVyNXT#bjim6&e-k5#304Oz-m3#BSvRNXV83t z@dlZJrlXisB4cSqv(b!A4Wf|)ZHp!4N5h{5iSJ`=U>ckiugmpgt1*!Wga9Q`N@`pJ zRtXR{nuQ!P3@{WXKrWXCraJ0=$>BAqPaq-FvI3e+@p#_W(DUf71U|0}< z0t2nqtm6>8{kztmCmQEDI{Zw}cub#W4j%e;5`xd2jG7I=_c4vk4ckt0s-@3hS1~#| zb=^oMS4_GBD^)%{tR$^Ix~`$AizAsr*E=XhQRqfAv3-fvOt9K!OW6po0Z*_ar2GRD2k^np9xIlQBqye75jD znC6fhn_w6OcV38_agy=AZUi%p9_K^PTS2q`2-LOqlT{Q8ixhzK799X+E&Qne3jk<{ zg8_g*0s0D=R3?o0H(eVN_=tJV`BPE}d5q`?D7rgWa?s>nC_{?bIplel#JZO)?502b z9vJm*a&UBX%Bv|iAb~o}njXT%swbJ44?`_1jUdq!33spr67eE*R|=&f3vOKV#`_Pr_^vnNfJ1$Sa!2_J zwbWwmgz4TD^kKUqV^1Pk=%ygR7^uGp$fk(hpi`&-~>lt-9 zkRqdnU?L7l{;>7h15grF;Nqy?!*c8q ze~W_yDj4*y>gnut5M3iGjU6T)@qZ?dljO}DPXjCp)v657(sp_Fz!6Pue{gCGmTAwy zGjDZa#?CB;{U}=~6^2YL`5BnEZEk9tiJVARa>7qoE!es7y8r$_l`4MofCoqQ{C6@{ zMn)D(8s6yJefGbo$11PL=A*t5@#8-<`j)3GqLmE@lz^Jbp7H0d94q)VIk24TGYT2HFC~aG8cSl%U|K7%Bnk8 z-wa*947Mbah)de+B;uc{2Y61epN-wRKc1TqlhTnh(P{p|&wKHI>~!ir0{W&I)kfDaX%5ypKg|xf8tmd}Fe|Rvp5IX{gR$6o>|H z2BhO4CZJ`p!(fxRF=7SW*7J$JV@+<}{Wd(Ht_=uB&d?)9{tD>dWqz zZhJBHkM_st`zQg z#?)Zj7wpki;1A+F(&@8ATi;m+{I}GSAi?OkGXpY5$gGw=q7nmp0UG@>fjEhm0Df{2 z&*go=%3~6X7wmVqDn!SB=_8zv2siYsOsr6rXyu>!pAuN{#d6nCT~mNQ5HcJcgF)0-U%DUy3A zmk(p#v;O^Dpk&Oks4ynbcj>U`GeIL1r?;I%J*FocwiRixHy;urT`G#d=d(`sy!TaU z^ZxY!eY0hNztPXf1)Hjm7-5A9ndXe|sKchtPR$4&l8OBFES~RIvJWE&aw-9E1d$_9 zD`c6#0MVY}7KQMD4S<@krak@~N&|S`q`pFa(6}jPLTB3l4YnX{&T&B$5Gx=14lE?< zJwQ$DF~~p_Sh(&XtM1vK*@}0Z6rTt&yk5a zg%M(wz{W0lSZ{UNiz&ZY2MsAuL{Wed(j`chaO?^{0E!kBZS|2?1|A*+zy{rbyehUF zJ?`KB=VB5Af^*|Z&1W|pP&)kki5_7J4mI}QSZ^5}Ah)vua$jJZRfVl?kZvYfd1oPMhg23tGV zzLzpe?RFz_y%;BNpw`rWFG4)7+~Yi8MKgBPUll$8o22%eb3i#D!+IsJ+Pa(TTSa?F z5oSs^LjsnhGP_(7L)6{k?fT_X0tMtZG93CB>;Fsxz`;uxN5l5bHSTM*SEK@fCBcmcv>R%~!U%^6W`Ipm3-+HaHizk*>9{O=sn1+prlB58%FK$GkNwZp$w! zCdek6>cV~bx5%;Qh!qhXE+b}&E+t3BzQnq{ZEVHJXl2{1zQ)P1#fM49FEK#m>d&x{ zB$U(A!jd}wdA;%RPdhc;pZ>oxYYoz>J1$~4AeU~NR4`_MbS1ywSLS8JTC z0Zbo1Ztg`BH96c8{xyB_!5VC;_)0>D(_o$78rtKdKF^<-qij#&;o7FEQ!$e%`u!%R zcYKWB0`V=1i=r-3Re)2KBSZtb<^P&M3Pr@y87NjNA?eYIwF`;o{kEjVeoKlSoc7pq z3)=$p&)7z6*N<*T|MAbX~GB~?XHF(Ap63UFO7|KaZ~gb1)|xseXG zb8$VcalnzwIMew@h07$g&*7J!a*Ba1W8pPwyG)qKiHHVE62YueP8dPnyV-6>sq4P2 zle%e0lr%N-?7wiz+)MNsW-;%7tT^wHiOGSB$tBLWI@N=$<>0^~BGrGmu=4P39u^+{ zdV1VGL!n0Ge?ZI_`t=BPCcotG!8bKG1WT7l#oW3m5fV9=Y+ogOD06xYP;%H8js{M; z4Sxcn4F~68u5eZL^~taR34s?Z?b!&kZK97g3zzGZiZq4nE^!)(OvC@HE}+2TV$QtRNrHzhsVyBTIx-PM-Cd8CgvcM@87Xtw20CfcTlZtidzkE2=mn{ zTFcq6#ub+`9d&N7F~%v4wKvymIS^N7lRugMhS2+-Q`1zs$nDk7&N0J@=&= zxUNv%=~P{>2Y~pemp*!}&Ubv?>)kGt0;+V`kJHJ63~*tX;9$nbK|jiXg@bs^4s746 z?bNNU+~y6QgZd zt7y6@G3j_LF@wC!iJ`NGz`^u$tgGfUfYt0g`Zz`7{tL_^m)GA!^AuhcyrhIQI3}b0I4IF!J(C6Sv!?`9z;luVIPfsRujcWk(KYot!-@b z^(w_>ejx{Y$7L|yMF1zsKo$B;R0AAzzSIRKq_p9INXNTaC8m0&;LVVKTur;z2pmLRe&z*{RJc$s`?}qEd9sTw-nIEV&^}<*0nEl3(U`y zl;NyVCSxw2i)`l6fOoJtYJV4Tk1|#|eo@)d>!rE%*=7&^egnm2KYjp1oLevIopLYQ zUhq-|!bej&x5v4-PPF=6Rse~(Qr(+nc&E05n6Kh zNEALtonFe(!uCYTIr*(m|D9roz7C;x+~K(!bB1>_8om!YPfGH$2q^zHnWO;{D7l#R zqWm2lwPE8c8er_mFWUWOj=jsZ-q%~!Z*vA=E=z zh4h#KMVXWD>6c>?znyLg6W#Cgc*P3cstCL6kDiOb6b)gZKv2^blR`p{I?neq%l9rC zJ6~O%hlO9ES=lixmvJB+y``=nq&%?uJ{YJ?b+Z7##LNT$SIup-gJ(TK=1aoV z-9W?w(u~7}>d&p-5!9AeK6Ag32tTF1xfQ?wL8im?lm0lp(ViTsy_O%K5j?wu6kcx9 z2}EAwgVovZ-cDH7P)+)Qh8GzO2?3aiD_7=TrFVMx`Df>CIX~x*0Eo^S>S;GmxO<|F zhpB*mx@#v|WQ7A#qC!NkiR^*4=FOsR&7=~cRXy&F5H_Ia{>od$W}p0Zc>ntI;-q2f zuW4_FAF%@(kOqZ*+$wUj%<1n@6kG@+b1N~ru(Y{l)%3GbY&gO3&{54ApvWtBro`$6 ziq8|<%=tfx7n?xjB3?+$R*P}GEiA1sRvs?8T9M0kL-0aEkN%w_5}1a)$fH+6NVh>7 zQ4A1*glG~>R_k`^tw5&bm-;7x4l@luG-{H~Y#hnM-*p(?zTQwpX>v<_&9~1L{`{1W z0&Jr3tbudn!SpDwAfUM^vje-}>lMo4`^$PghW!ohgo<;oRv5TL4FJ<63LgJsSWv?& zpp}r~pird3B{%0OVviR;_sX2Wd%n;oOzLKM>}E6`J98>bfGU$)cE|lM>E#Ut2`~<8 zkpU3MKYOVLqYmI=judWV@7nJwR%n&)<-X3jU1WA%YY%v?J;wKY4HG>aJcb*4jV6lx zL_M=!e3~AKCITS-{{B*qv2sJL#wvf4BHEG9wFK+Gp^1mY4hK;_g&KGyd_gRlEe!E-izk{mezO=}r{@Y!DIVS*ep32^k zmnIUhL~w$H!m7Si?vl_G#Qk23V~hHeuR@o-YEC_!DPS5gG0pt!CTYfRWMR0Cg99Aj zX0K0Q3rHx#Q4E4N@hLMKFyt9U$rW4Y+Ht!=CG0|-$-~6p0pnJl!rV^@G1Gb)+PZ&E z7njKc2=M8g&BA`bH|+F&{S)&|gZ+bY5CAb0H((`_YPFwat!~y;0NYbKxH+A0aHK8M z5KG{ULo@c$3SQR47CZU>_M0uacPb8fl^nnI7XNavq4PZ5%bpEeTuF8+(`JZiAAq&? z6e0cq4q>JFpt^NLHi+h*C?oAyV=UoCAMvh&ima8Dx28tZZj?!#uNbd2PaOub$|Qx; z_YNWm2Hr4aacEJ6b3DJq2t4knQeqLs)v3A;ek8Bxi{n-6lQ1HK`y+v{j{+ng}TIA$Cj4e3=hzuqH>GK49(akZy26`rVc}l z2+o1)>fbZN1OixZKoIJWW`4FyK@QoFcnKPUhsk`d9~$%UnZDv2J? zk8|o#Ve_MNN#75~0-~ystzeFZ##P5|d`I=4>&3P4H{AhTfSfsQl!>iMB%LNw7^K3qyjKj%(P9OV;L11yC zn=amPj){;11ButonpDC<6_)VGy?#@#geG3`{I#H?{XsI|iq7xY^Of7jzX3+1$mX+)Ji9)nYsJ%sZk_OBIQWmpU(6Oz|j-8boRCA9Gh>lrgO zhS}EmoN81r4A9~wgj$e19BU^@^$-(?>+pSINf}l-B)YxAXtuL7xi~qP=;C)`g!T#I zr9T|E^5MvWB$8Ob%F3CtU1)fLfQ5Vf3lq(h^fm~c2Nxq#tXoD(4i0}cCfvjfJ2qLf zhtRC*kO${?bEcql5Y7--M!LxQPGAxD-tEg3N16NII6xLABFScYIjPMkgnh$1re|_; za@Mig`>v1d1-w6&+tVkX8dEpi>Hr;{#Xa!EgSVrJ1<>lc!A?Y+K-Z~u`ha+MVrAEu!u0YlHA-#+qN z6^6dN{NFKJ=${O$kk*pETPpBX#W~51{0tfmmCWm!D+W%qp~HEj!}uN~slI7TM|=T0^)Ur=hf8BgGhef zT1$INhn|%?EzRRPi{}H}3Bd=jNzq+<@%16*O4&i|IxK*oBkl7rHKXxU^X;a8tCZ_0 z3uzHmQ;+ghLFGiRE@-KXb^U9#P5purbwr&&3f{`ThKM?!1P#qp9LAET2p#{sf-NV6 z5t#zhX_>_bK{r0`8icgfA@oo|TCBcAPT}G)d{qk2d!_PTTCN^e1J+NUrohj6DrNIh zo!6swo9M3(`i2G<4}5na1a|A11LNy{=Z_#A{Y43D%%H~YpyWSOU&^zevCFanXMBKC zs2%-*je6{^WZ9{N`Zv zV`z^x26wo%RlZOO#znaIuh8yWxf%9<_5=uWun~v$Gb8Q5l&r#?>W@j{3DMs`wxr>S z)))#6KNiM#!$6RTwQVX2TBAPo<$D<<;z>Pn`FLgcI%AGx)h0X7qML)}Uz;sZSD${i z{v9Prw&mtJa_cV`2%0HSN3LhWBBNs!~~P z&ny3SdYPAmy(pRdk+QLm(bV2(2EH-%D8}jg?oK|mA2~_yx^wUC@BJCEPr6EWw2n%1 z)MQ9a#?A!#rBbse9Ytz{`F*Hrk6ex|*CR0i4)g7K{49rV8b!V(*C;9qn1;+1RP>!J z+B1F*E`d0wREFDsyUnxjAgwHq!eCG6Q&uzuAbM~*i0trUcN)xlzp)D9oMx;z zi!8|F6DfY-0We`C7S;aUN%@x0gV&`@v&_EJ+q z0q2p)&oSuSm19h27suzqCddK<)sx6M`}rQJU`S?}Ha|Re(a(YZOeb`l035rd>5A?U zK0tc!+F#}Yh&bZYd$?ti4$snX-SIx515niq6r@AfGL(1L-WshBsVXi_$L7&{4HQ(m zN~5P;%Sa%Aof(DwR@AGA{0>hhGCc?*Y=1Qv5Og=QKFD{%7Dw4=55D>*=27OMg!kGW zw>qXUkKg4Vt4t|+uM~?SPZqz15|QGT--bx(6o99chsa_ z4smIbDYaIOlwK@}6?AwzD(_2XD<2KNJo~?U4%Kq^+ zI0-|HLi>5y)|+3e!ki*LzQTNe(F+p>sphFdJcO_er6w2^K*5U~lV<)LogBeCk6dst zx|m$AHI2OP*5}9Vx_m}zjHQ_r;jusTRMIcsm(^O;@y*N5)+X`3Xfy`>Nf}Vhc&+AI zj18F8;t(g4o6c|JK|0w&kBjl4E(P+ovp_(}smT{dJ>c^DSGOzJs@0QoxPD?4EC4Pa zCzFm6X()~h>q|F?0~W2znpK0)_Mcu=^|w{x{{_Q56$*DPEIeFVt4BS`p^ijB(-Lwb zu=37A(>^x-u!Ra0-oyFFid9eG<1=}Pg*S-WsJ;621`%TQZc`QKpj=!{{lfsaaBx{42Vr<&Ab> zrAE1Fs69GLruEiq&55>P=-5C)55wJhLA5Me%%yC}FzzeEUXKw)W3BP(6UL%qqKYk? z8B;mg?*#$q=HK4b!|%Mh!BUo(I~O^Knnspfj&H!mW4A$HAOzl_^3E_JB~Btb`%{{~ z+j$ZuDY;#{a%Ev#2O5yYg4;ee*cp}SuJX*7EEglm#C!Hgp2?ppr)@(B8>CYG19D4% zA-5EYAwzcgrn&2HO!byzL_tlBdbqyCoCRD5OMfXU za<$kZMCN~xUu!I$>wD6j?%#IY=HzAia)73`I*agP^&`Gn zo7az*4yfI?vg7Ii8JW5X(38fr2(L!d#|^)oK; zeW%iDCtjdtfv}%ggb&;U7~Bbr+tjyF4J`^??!YoWu8bkU|LTa+l&3&k+enMXYp<2l3sVY_(OJU~@*f;u*0 zz5i}5%%axwdu0UdX8#fm10wNl2PX%tnG|!X75#2n(FHBVQiz}IAIc=%EHh+3K#**) zpahSCoC995WKi~<4@FV5Vq_$tER36bOw|6Cw+F(w;xZ-Sud!!XS$1-@%Ir4D3kW zS(h}4S=?z8#Uq#y1)p5Rr5AK=w~43jycLbbGDG#1r*W6otqL+gayYJw7rP9G)mFXQnVJW ze%Ha#^l~JZy)kZQoAMvA;{Di=nYvo#I=$Vc@Km?(;Xl8tcqenj>zLM>#qX~VN6#wlyX&`S83}XPz4!O~{MCB* z8)TIq|M+hNW8!juM5?ZVTD#S^*I{WbysCprNKNl$O4%4E{#SkxN!J z)^&Ug^=D4zEVmx|N01zvVT3QCt z_S(g+`s6@qBSK?VFDqPtm6de@qucfPxBr%_aj67v^*Qg;Dj4L9%d;B0V{RN6ykbt) z>V7vha}kFF16932h%!#byd_>&5Un+=vMQ3fn`+9DwWo}QR zY;MQvTn)Cl*&B>;RL|#5HqdO?A3ZBB-9$OJYQ}=20lKhAq179l_VOz zYse#9-Di35-6tnZ0J$*h1a-tdJqH4W1VLV;wZ}04*^~lKzL;_y{mWWt_@*H%)aeJM zGDH8Z_C0z$bf6cT9PC}?Cnd;YnNYs0=Rcuu*guu0ssQcCgt7sot*o3^L((h?=sUWS z5*np5$1J+q8W!+wL#mskfk^?R{KC9fPUyM0%q=n4QvGd0wQZhG7Tc=Q(LoqY#S_Xn z`Lj#w-fxce;iYc(A63+>%2mI8a=NBTBPiaC4?(SxZ@)hyIVq@W#(Vc_vm6mc24Hv* z^lnS2XmKbnD&jg2&&%vO{`xdSOq8nu3nBA<(_Crt-R|XbDto^%yIkgO<X)vei+X6 zb+r9n^$?pf_`fZ-v7Pt9pX;*yl7U!LS7(PsECA^jN%(~pwHP%zh-=|^6RwODWXHkL zsO9?}So64F;(8A?hzsZo#YA^-Po&J?At3s6$$d{J5G}e~T47kz(HPKb5AOLyl_?se zzORPHWLjx$Z2(mWNp#~N!?UmfI7Va$5Zd5gM$yH-h5F!KV;_&6hD?_iaQ4jbc?U8; zhl_aB@DMxtnn2)Fpm94{$l;=Mpgb6bj=Cpw-RlGO8l$3P0zD(C`|8|l&FwXR_Dot= z?ir*IBb$|kJvUE^e{E8T23c}k_<6hdTKJUts^d*8I*=ci8DbNzWN`}U>MwVS9YaGm z#C2)WkXdG$GAM>C^xL6Ll_2vchk`VgBw1)LGc|yzx!oEB7xzv~j&9x)CJH*8qoT%I zSFt^ead(6l^V1R)wyIfe?rIN1AK=TN$;_!EsvS$k4>=Yal#bh5I|Cb+_kSG%ILyZ@ zmt?+`LBdc0O__9znWwYYec}&fJRDrkhDP5Fe0^$_D>zm5d_2AD%?75bg^ z(Lh=jzC}BWo&C@j700-&EDli^aj8n6`Gs%{fg$>h{ zscs%4NdW@N$-Awb%A_;QQF}1vD;D5>s#yG#qNb23=~sobBm!u%>9bB2f)d08JS;p< z%*lAUbw_yL0a~IsFFQ-wyTP|dL+IygfpL^)|AZZFJ;~1*fTmjIvQFsJo<;8dO29&y z$(j0y?k{H81q-R4P4?+jTt&ZJo7$XVM3gK-UDMDI#~@0vRpWAax+5-1GW$33Sl-)q zopbcssXrMBC&Di(5y7L`TOAI_@n*#VU%yW8{_%gyZNEoL*l8K_9&hK?H8t~??(lj> zLBI##Kv+p4;YlKlSIStD;gq{MGRj3GLiA!0ctouc_pa+_AzXLmYC5twx6}^w;*6g0 zSpxM=Lnwq?tn)lxOS?32*IKdZ( zO3%nRsj2rqZj2?!!ddix(9PwlW@_B18i!wz;kJK?X$f=2D{+5>Y64ZQB%SN6wlpYe^F4jfR*F9X zkn^YP&TI3j6b$x={Cg?h-z}U)0`MD3AOJ2qXDBk&{H_QU07Ozgc%C!b<&vtxpy0C_ zbV2kal=CV*A3xT5DgQ$U>@TORTi@1^moDM9_JgZ-Fk|w)uqjJzo8w74SPahF8+P&I zwxLl()W^{!S+YOWBs~YvQ0GZ~{!KmTwfP@^=1*K>E?2*8nzo!ttgUs58?7Wg9p(wm zI29eW^{Yh27pJ80XO1MtL?K=x@asYCLaXRNNmND{7kWVf0P35f$>o8V7N3)B!E;k# z7)`kErkD$(G5tmvb`4sWTJ`V7nP)e8?}U*5zZT#_qQ?ZaLu9!%+BWgtF^x_IVe1`E zll_?h)Vf?i=TU=&9A@7a-J%N;nN$CKV!Yh@MNVBYX1_KGkmK0+n7UPD{T!#uBjR^Iy}1`E=an@~pjUM?PzxS+Z*Q~MZFTnE zRlWpPP7-4LxI=n&YPs~s&m~!D2zrkL3~_>6_2b^~wiRUT?At2uAAb_d}PyYQ%6i)bZM{OBXE zsOzi+cQ}qZ^?);C&_DEOKKdSa(*-`Ax1#6x-D!5=*Tzpye)v59tk@^sdMkSJ4rG$t z)uMSv1`_Kb5ah~;vHCcFpPT)0b{^psIPIG{_+r+>K6JPk46T{d2Ej<4eI@G~p0-Qw z?QP;qb)FnM`f81<=iu~bB0X3qBC@{h!oMmvOJ26E&t2k5q-;#mi?0N*2+-=;2uA4+ zd)v|dVZQb6Oy|vu*YC^`4d}XUvlVk#z0a!(JpBgRpxi!bI`))Oh%WAU8Z4x;^W1Ld zXh-LB{r>xL=bD4cP{NH<{NB?a1QFwJ9VL*|-QP0dv#BS%-3hKW-;CkcZ`tLd?9a3H z`qFr>cHnn3MBByw83T^(i_7TgUA1vrORP`v+ZzLMikpIxH}SMHI$+>nNctSsU07?% zlcLluqXN5PPEMkXFdPC~%V|8mGM(%5j~)OfwjFA1n&!t|3(p?ft(0HUPk+z-y7adE zgx$%m_l_d%BWLt=Wb$5QHJvs&elGs-hk=@K_j?qFKsryy77aGy^QG~LGdL&4dp5+p zY*%s-Vu~oNp`>;mbXH+*#3;6|rZ*0=1~U;E`Ygh~C(R8z!I%PU`nn(3GeVG*gkE_7 z03|w_o5wh;FvkkU7|goY_4wzYyi<8m0j>+iyeb(CSr~jUaquv-ZDNFJyG`{)l9IaD zhXW46=2H;sbIvmEB(UI;YCe}OdasAFc<`_H>dkG-s$Y#I*S=UD*@ zq=8EW#4pL=I&z3Wlj`rrjJv(|cgDdAR)q@T$6h85hP*tREr!bjO^5yn0JxLql|IBY3n9LC#0OA%POC%{7I5Ed zMy9gr^#9;rwH+#Ddr-~I_!_yO!z^5)n>wJY8UotRS(~Zfee)sw zdK#3UMEZ1@St8{b_!j1P_fTAX)r@CxA)GXoOx9^(Y0^gfP)QK;G`QHjHH+|8Ai}yR zE73t9*u5yn|K$gvjM|P&g6aCbPuelQ<5^H~32N+k>Yvpf&C|XVRN*xG@-kM>1O9b? zx+wDO(FSKhhYx>^?QI6$+VM4}(I(oNjhO63pkK$f)e?wW*^FvCQS#d?)B62pBH0Um z7JsYF@V|~fJfYtsH~c&-Fkc^g$U>SIHOYe{dJ4BAhg6r&5Z)vX)|NP|Y zBg5#A;9bQX*U5e9|8ph&Q;V6Y(HdGQtm{<<6}H`CJpsEZsGQ5N{9$)187D;O-tUj< z2@fva8PgRs1Ly+i!m_|NUn?qj@y_a0;*ymiB(5GS68;<0*ugiKlh#_~>M&n>E_r#I} z5T_V5sVI&Z{QWSF7#{NtuZoR@hIf#ShaqhKwGKQL=>G}9fK-I}s1N=w-u?GqtuMAT zSA5&s3XZ&(XzWA{GH|`w`G}lAtsKR#cuP{)a)t^Zya&8Q_wgM8k?doWr-T51rx?B; zUO%?Lw<`mAM=d0t9UG4o-kUnw0Df*-)780Cc6c|q<86@2{w?(kcHTuaiQ3QE+DLiY zrIY&skB<_uAI^T>9Nukd22iW0)Kb8TjW$UvJPcCg-Ns9?ELWL!Y4fJKbr}#%rbTwM?yPsnjr?N5{Ei z@3}a>a4_F-=UKFl=Mg=R=d#U5dYc0TY(-Hixr@m^!beryS#TbRuGCwNZ$4@rrlxN+<_KsZrUc<7OSc zwJqV{?&EFnum8g}h|)0p{*#)KjUfz+HUKy^mgd3iV=O>&UIyJseIgj8p5c#)!d1zr zIg+5~vUv(W+?BhaJh>;6JFMo9iNT#}shN5sl!_7*)Gi%S&rtscQ%s-0nl(3Dy6NtP z`3&m}({vV))i`c9#=Dh8F@}#N$yWMJ{!pttWNgKgQAXY2;|2h2j2hoHFeFgm0z`2K z8-8SyDbo?4>Cka+I?e)afwJ)>hTZ!@FZAFZjCVc8$qHQNZqUqRcmPxx76c12I2WDh z1Vb?P@Ef5C!CEVOS&s8AvyaWZ8hUzAFQ3Dgq~m$!G2YPY{jr{X;TMZ0_e~i4F^YH@ zE~$Q+hzP900%`|Q>(rOZcdz{07|UNVFXT*vD6yd32|Jg;1gnNFF5<8WFV*rh%Sq*l zl_m9h8X@Cv#vUgf^@pjKb%7xQ>0L{k9JYS^=+_XZxs9wpOPK)}7#l>ZayXlf5{CH2 zD&cMWh*R;u!nOFaSMaJE;$&M2#Wf2xY`%+PoECj_>ViO<)(V7}ka6a``TAx{kENAq z;C;t)vR%$jmT0p|rg;{JL=ife2yv>eBqCoEgXm);xtFV%uPxf^ zZEY@WKYr2Fp%!~`1Dx_+0kxwj#!`EVQ7cTIuH~YG_F9jK>&LPfOrWl|fS9d64kxk4 z(t_6pA0a0zD@ele4Q0F`fE_{q;l#YF!6uAWB|7=U&pbaO9FWjp%-9gb{7kJ(-bg|^ zMoK96K~~8!752gjIl2F_&+?cdVTJn>(Kj*HF~epVwvF|X%Msea^j1O2i}nJ&S!v-fuo(1I^G z1W#o8GXKoIYNE=p#jLAX4!JZ1ag8Pr6ADkD7Kv?xPteN=)T6(sq~)`#ts&tPXk4xD z0p0Bh(Th&EJVv$OMBxBHoUezO$DxPi_H1TUdL)~$!`o2KedKa8lc)s1z!er6LoVu{ z+zOJqoyG-V@BJ?2FM4Br;X2L(>EvE7E@arUhlmOm4)4!(zN#y{aUs3Ji;5&Z7P-3f zB+i(~qR>S$GtFieha8^m)ILpV$1o4LxUAl8A;t=6^7w5!{<-%lTVyW_*n$*U$E4~s6!73g(Y_CkX9?BY8OO|~5tC#STGTOVe^Q`r(68ixPEjD(3KnUa z5X<`&kLw)7Hvm8veC~;tpLXIMzb#KOoWsZ?=z1_F5=;RA1>qNb;^x~i-$s4Wtd$;~ zNXDAq;D9`>nCN+5-Ut{&dcnOhJgXrhSvZZ>3;iK`Sn>^GRb4l$WR+6AGGjTaG(P9= z>vy}4`#FIuzOUC9l9&gcZOJSsvl7ZX0W)Jp*px7~EJyRnT4x@2orq98&TIMRS1%L5 z0~BM{D2OwD#M_)(w(Ts5oMT@1xe(>?yCVimfI~y1hZBBR-HFw&vQwNSerL~+{pm(b z^6`L8_UNS@Pvu|lE|dqeSammMcN=Pv0|(`;)MV5Ch)nLwF#OsOsA)p7RZ6)gpgfqA z(eTwe&5NHtPx~-nqJLH-3l~Ff5Tq2@ zf6yn`Ug}_xmBWu6h$g>)U%%dkq96CW^dA%`Vqq2xKP}g%yP6HxXk6VDy{M zhwaZEYd3h%FeoL`tsD3R*tKGQS<=a|x>g zGD~!jOu-cUV#_=B7+ks;%1?AoFmJr3Yp#gH&8I8;R*9ZfWi4&d5S4KL#JqJN6gBkq zR4wSX5saA!wsVIS5dz+jfQ^ij63hCM*Mwy|JvAJU_5OIQsK?Dq3h|WQJf81J3mnif z+*1KWzm>Y6)QSxWnENi|^lPM(H{Jv**om*8+G|Bic0PvR=0WHuk5Zb;@ zkidYg5SMbx(+Aqrd*h)#(8kx?$F0#0vankzCwedp8OA>t`#UCk1S>nnU9<1fr~ghk zfCF^PTQlWv#=rJ+J9$*fXU&}!M@r)%iN^5PvoPted-u753iN^xzJM;`MMWe>9cmUG zI;Iqur(Y-DcyedcSbjQnEc$K3YhAkIyhmyEiLlG$d@bjg=OWwA7dgjgk6h ze>1*@E+Xsq&2uC%_7qq0QIv+5J1pLl56^Im;=B!_16ml!K!Jyf*s%ZMVnL!@ubjGU zw)EyAaNS?Me;(Ixe_p=N&C;v*=abUZ@g+{ee}!FBW*US<`phza_mtKk4ddExNj{fu8pA7vZ_z?pG_`0}s3-4tsNV_Kd3D^`@MGRT+Xx@Q zdk;G|NUI#7fDYlSbPO{%V34(Y-g&7Hg4Ui00s!L?0%NctfUAAObTKB}Kx<~iMIBuBMV%*KE?7^2jzZl}D6p2v z461)kH8j#f`yM610gU?F1=Np2sx9eJKNLi<@F^$U}N&M zE-1Ir?}+rdHwXaSF{7FBtU^wM)lIKFwl2QA6js)yr+c((R8aGp&wTog0Bpf@udi5Y zYoB%r4%7;}KX^BP*W!|ElqMNoe;%XS7QWw`*X_u7Sws2}6T{sfQZpwWo1Oi0CiCCj zI6ia^!`S*&bXJ7blBsy4Csf>e=)8hAI2$X($)s-CpwMi=S7XTQ*i&U3vP+j#^Jn+J zSFKMV>lXBS$U^r}&$gH4!~AeztYD5Efm)PQyxn30h*&JWw$ipmsa<&GDdzt6mhwIe zzZ+eb&JP2Sk`6)sT3T8%zT#+kdD?lgcTFVd`%87YK)9C*-G!mg2~$4k`SYGDCKVm+uzs#zQ!E>pLJLnnvKZcl%-nTPfiD z2@2>``E*D3u0D%e-)kn=E_RYPa4=^};!)V7nzs25U*$}DMe&5*RU=^*;!HyEKZ--4 z-ZvI~ci#jjkxHMQ#pu@81H}Exj}UAD6-||9fR{*$YpgBOr#`!O|wsG zHW{I497L5I3EJ}Wn1O+QN7>Vz@64aUS}(EdB$thaV#@a8`1rRBZ(*Ag{!BBV3tzl_-akw#ECh;eF&=Z|$AsTT z@>#(}+GAP%^DiSr_co~wTPxS*o5$z^K*ezY_3-OVJ{2cheKdH(Bzh{MpAe_8U>4LL7%Nf0YRQXpBM}y5cY?ih@sKOh#SbAqqVc8KY|5PSEhM z=z)`W0YG)yJ5L>0*#waUlP{0$IU|JP6E zz3q|8HNc>`XajoY?4run(zkA!9g8bRg=u^VZ> zhc)RN&eNDD_jXj}#XX@MK`Gbg zVilXx2wNHFK+tXF6F*xh0q!!I_@mz8TgsiWvU>yq-6N+V}FtIk(i zJ;zI;SOK3w*EXx|EVp`cxU_4=+AQ@_fHDYalNbPR$B_}TnaCpTn=!|HB0_zP%zYE+ zHDXKS^TwANkfMlJ5TnFI{2VLJgsbgh4J!-`bN#8;WsSnci5zAX=0{Jyde0&$8P5CI z{Y6rF1_Fk`D{@89J|L(LYF#W?W4g<@uhDm|)mqg&45R2uvtRoKBU8*V2IZS9EPQPr z%Jd%@+;h;~+Mjoy8iWBLbxa?^@_LNd@)28#OaCXf=vDz8TU(8NpL&e8IrHtT*_&|! z-3k=8C(iA-py?(#ysmgRH?&1U?xiH+B^*5ka)&-FCu8Wz99lOoW|YzQL0!i_2n(3O0Siw5AsB5Xvl zQ)Befi|HDRKqqgCps!+>#rP@&ixIROT;`Zf9kd8Jw2vLMp`vu~qU4gwbdt(JpQnN8 z6Fb$9{b~Isyd%`uI`b~V5>4S4NXz>upc<^5#(Vfp#Rf9tHGaWjFTq((O#xLIs}@RG zn^jOCk;LS#WBaZ<(N9$VjftHvHiaAORZN%9#fKCdz{f(t0(|Ue$#>fNc3^9-sE)tx zTdCR~v45z9Z?eK|{yF#dJ3+1Vn^o+8r^g8ft$1742=QidlX;#zhRe0z7E~gL;9u%6 z7%HKdYlqUl3n}TZC`~Zo#t3-)!gYvdn#c^y003dg2Nve}n_aE1m2+C2_%=)vs8FW1 zPm(X67fSP|FE({_&X?Biv(OIjY6Y+na-x=jvYePN#%*Su+H8~mWw^a6>a*Z73(a+{NJc zbTC$`Nw`Z45x8KmiX8Y8WW0G4O9TTMf-XsfGCmvEy>gg%i9Yl?R~vbG@f^HBrptqP z*fQji;Won@xwI|tIf_d>I0avIRaz+5**TLyXb0hkMtzQMwz%%I&Xur&P~^&HkUcI` zto$Sp3!_@8cKeta+fSlg@B?b-yAWAaKsY3;`i_Rw3D~Ynd;LfKX!WO}^+r=Z9 zb?KT+xC@3r4>3q9OHdMG;j)SG_DtOU76DVlU~Iu*Gk{^Dj~R%DOK^0*^+G9@qmq5Y zsAZ6#sEGX&VR(2Ko8|qjaTG5l9IGXA#{_1caSffq`zb9gbyEO{0`LJAE^Dt}W_+#X zbC{C;ug_NJLX7fTEh)Jy>u=@1LObqzs4Dge;LD_~KE*(N4-PwQ);hf|@` zMxOF7E@R~65Iv^(t=W=d2d)dJ|B4X~211ocHQRd5Q>`%Zs!ro`aW3Sz{M@ZlGW#iF z*0Vi~=O6R?1HVOEGIfV@eqTG<%11ttllu?KNi_Y^N)$nt{CxPWd;}%DpU?ZFmm}1pD=UY6k z{xriV`u?DI1sLH4I6q5|EVWiXz!)C0vk11QtSY$jUw6u4Aluu(Lr`PTqYGSzC2$Jl zekEyS5!6=@Adn8o_9Te%&c|Sf;;=1v-^DZ-bw4=-2_H+=Qcw-F(R|o=`!C$&o$K}XM-UJ zfGnOf4%U0f%6&rSjMjS}Lfgc~+=LkhG)cIW(V{o2VcTdg-nP015M8Xkz0j4_90UXL z%srCw%8zyB#{tyHMOOU_+wzi$-^i=(W}Ir9vW`py$RQ@Nl`bf6n^91{y{)G&sNWq6yinDzB!DAzwl(wf5>7^8|vBU4QjtaBYX(ao%zzue-V+j)slttm{_v z5}AZ|SYI)LC5`0vS!3D&soe_RH&Wkjy~RD{CFaJQGbKmF5QVf;ea3=4g3MTM!?S?K zd**BwK}@08D|*eYhmwBP=3LP?CU*g&wc%0$Piw13cLnlfSG^Xd=_kEM+1XWch*d97|lu2!)5cs9xV`PN#?#>AEv)ghIjE|e9t zrz9H{!coV3UgviD;c@Kr!>6B|I-Ac%XXQ&5W4q^(vk{O?otWzgyAGSSo<$B~1O*Kr zrZMFP3f^($b)M)BzU3Ec_DbU=vxsMigr>aoEib!VD(x;$-15w^t1AsLZw=NvuO*kj~$^4uhCT8}?D;&7} zL#G*KJ`H7WBIm>TL|%CKz(8t{mL(5U9@|WVU*C}~hWErfwI5~cA=B^y>YHv!r|oBe zUKxUL1u^1cuOu9zxw6Lhy?_G|u4_M9!ui(s_KTZvv;!wgnDBe-VY8Y|L{{<3YM ziyfhnTCEaAO{z>L=q(m=_Zrh9l8rGoYX7mdl|14>+o0Y3DsIc6goIEY1H)3j6!pNV+*_LAf8s-sC z4?YtsZkN~7C-+A=9gp_NeIW{v)9vr`EHb#;d4W4CBxZNh)!A!4Ln3k-;-0N;;4JqL zY7?DiJOpSn(n@M9rnB8!QoEkF?b-F(!3)@FB1YaFJPuq9ZB{M1#D<@pvfmxpKDsZx zJpjjg=UgKLOVL1VlWIv3vwWqkT&1px{V4y%DxTP9^B-UM@|iaCnRz~aVapY@APsfS zFwZ3BCyUdOjiy%#7R{>s`s+CX!LJuevs;=g-j7W3`aGqJ_QVYm9-MjV-~NPwQ%`p&n#R5T+H=RD(dJ!1Z+kFTh?Ufw`ISrXgy>I=X5ZPRL6Y&FBZUgdn94N4k*?QlkP&XVApn|STVfg zx`RZP$dJhqQUiUWi~i^kd`3{Wu-M*ZCxX56_Dqlsp}!myT$dm{b3a&9bQTg2(oBaJl(G& z8kCUDV`&GOCqJ6nr{@!b?lfqMR%$WF&VyL~1Vy>JOIAUls)d_F4WE-=e&JA`7LQe4 zDj*|>4?uieEsI+H8PYve9JZas2&yzEFh^w)H!>_!|UVH=S80lLVuvH;ecmf6QgpJMWE1 zLLPCrv)&+8KoD}Is)&$){3Su?&B#{!k`qp~+5wLZZTc_d_vkjU<7rvC(>_7_nCz{8 z9*~Xzsy01QWQcc2K=DJZ2wUV zxtp;&5xcrco_OU~wPa|_sg4wBOD}Sg_O_}Tj%O#Pvi>BDcJJEmNC7}$-MguFW`DPQ zU0YmXNf`qk_fuav<3)10oS*jLIEYX+Ru_%fZNtc+NW(klc<-Y1JDLmwRwiPVM!(j@ z*vO519gt@}#Fwx>Rx*8687fiCg83`YIyHTfdMd~16vw11_=<82NA7>x-}{?&d|V#9 zCFD~_#X|Gu2^DCV+9;6Y5lCa*<{dogyoLqKBiEh?$aLDXXyj!LPY{)tA{B?ZOx3sQ zLgty}kbv@fe#$nsZ!Wtin(Zg}2wu1BOCd)f_@tcV4*;N9@~n-0>T|%$7m_wy;_NjD zn9*sDOw~rs-Ban>Q%+I*i~wjx2)l)G+ZIx5%B0XL>&nKuwKqKX9l*yV_2td`>?YrK zL{MJN=!1VhWEJf<`i6!)LAjh*Ct?eYB<*)xroAg}X=4D1w)^ZDJ;5uUMbAxx=qs5AzwTp|F z@6G;y^oKAaw7AV)Ld?kJ5dN{de8a)${o63+m`~12b+f$uLxQtCIA1#6YA*#u~jUQB{wrePIVQ+>S3oyC2f8*0=|`bza(se<|_idjx<8INJ1130~M# zZj3iN$8P7}uP1Fauf;ZgF28>)c)C1G*BU(A{Pjm<;@afrx+}15cDM2f_Lc)Wc5_aS z0z!m`o`k4dJe{ofYw%+jhzu~+u5-yqRD1jzbB;2CZ7RUf`+0{? z*|Fi1V0C)HQyg+JCP(V;McLLD)o-%=M;olr;LqH9pd> z`>YdxJEhaUGZ#3T^5UI?N&l@(if=p&gz|mXGUiZjz-}E4&mvon6a+02z6+*qkzu|G zW^M_l2ET=?m|Cm2UI#kKE82}<6&+N# zPROiqku2Y}A7A4d{!M1bxY>Uz_*_rE_Rf4z#OT{|-B$b7J9kQa6j`&U5i!mZ?OV}; zRL_XV&1%U&rBXxH&m}r6dSx*^uUiWuyK@A>yAVgwB(K0sxL^O%m-lMHwzVm(xz4G`G`T9jUvVbaC`Izl?Q0Hp z5x<(}dJ`x`|7;+-%h>++j-e`*9~vg9+mQ_E*@p3=xVK-0sAN)omEHd35gOI=pmjJ- zj&;gZ_`r^*1tBW*#%vU`Yvx3-Y2_hU0qPob)4#v!dw<-G^!;SclE>NaiyNkUSnxsm z>izeO>94n1baQb zVXW0NHj#K%d^?JcB{L0e2KFX8_h9@Ihix}jD?8Zr!YYbZ#l6yEBrdI(UtNhuO-azn z$bH#d1EtowPEQ)$8;!zSdG6 zW3$FTHYN9Q$6jx#n&+h)t`Q%uGa2@h7vAJad!DdrbA~ z8(-#Rj|dNzz5I`~T=GssM0@FQ|JJz~vJxUbc0CbIoq8lwFKPgnfk%s;Cwf?md06(# zN3AcV9?VgQsWyoi?|TRh^6RKI4U*mpaj+^Q!fmG>sOeWux~RX*KSRPt#XIZ!{|y|eCI=75qZg>dLA>nxE8!$(Qr~>&{HkG0X2m;+o$gnA?n`h>BZt# ze>Q9k>F_x8Ut$0NTpG6b(yq8Of>$TVk6AX-ViRy#Zbc=fx~Snm+6A5l)WOgRJ;U7{ z%gSOnk65yraJW<7b585SmNMh(XFawzGA|vlq#iXzt5*4QHB=E9DRA>x1b&VVWXdeq%8g=EJC3^pz?^4%wIe#H5V0vO zFabfs2AXA&q4uCf30e}w{o$)>K|8qQ*XzaFEEO7Ai0Xiqiztz=w)@Jc-Ifa@-ZiB4 zF{6VT!+q4ty5FrhZRbbYkxI$YNE5u1dmt2xaQhgIv1sTEom?q>FN6FGaNyC=CiyFc_E4fqeqk zr8?MSnOV}yr%P-afpr?-4_MZy=z6+VY=%eu=Q;O!$a~z5z?M&WlU^J#K(Ep2{i5Bm z|3PJH@b!jauZUc|s!otkL3Y^;){#RHBCf1);`f(v!=Y8Ip(U&`#tA5;ExSa&&~YfC zj(suDUp;4?i`DPvPANHHEjjv8vNKW@aKwsYwoeUwLJq~p(~jjPfmpn!)(kag#Qlj9 zswoShL-u@4$P7rU5&MU^V-`a7=0x60e}-1SiP0L=BsIzSjVC{)g5^NSL!lK>^l_6L zQ~4zeHj)Z+j2kI0zG4a(r4)X&>>BFj?)%7ANXimT$XZ7@V9oQ!nnlY><=fyFP3@hR zi90V7l&3CP!+ni4xSce3Ih1$<7T-EgqzAg%IX8sirh(c+w5qjLtuKRu>vI`9<>x4R z8Qk^m`}IgO!}4aY(Ymr?4{rp(DR$umNxF6INc>cT>agDn%ZCwBGuEYm|CWoCj#pAN z@J*791Q-sTJXD&!6K7-#$mQW?*Q;|<;-}Q8qcrm}*6@1J#FUFJVy49_7B0j*eoK&Oz;{Q-qXqF^E|KaOI#KlZQ277;%YxRw?y0U zx>&P2REj2yC7P7A5cj}={Uf|AFSb0Gu{hx1`|Te%c_=kTt%ZNmR!iXyY9aW&g;KZ| zDGQEB{78!*frn0~g1vo_5xnk<6t$ryOFqHiy-oqpd~0y>?ONtPFznBughCXDlsuwR zSgT|AokhB&wC%})agUc8aS?isz9z8eiiqee?Vs>tOre1@aGJS@*jR?#$wmkMumg2b zw4FG>?}x5&y~p5Asb8J00TZu$1kjUiNFXvzVnm?Nu`hArzgN^R_cw?@=?ZbleL!X9 zjkpw{xD;+%24A8%qt|-^8Qjm*xWviZFJB{2x zIiiWHCHq{-f;5pix`s-D{*O6J--Q)oJ+`Z( zLfi5}WFaI9p@W2=GLIT5l%JjNMGvkUSm8n^(5uNRo%K`oI}!n@;v zPIYQ|QgU(;@YY{kfJgVPaxL&~8m3CKh^g{Cx)5?F^YZ;i3m6Xav!|0Xu zv=7n9-1V1g%NR`cZl@Of6@|%aX02~SmR(gNGU8P?=<3h-bubuYEDPy1P10yl!IoVX zOP2#BJ1^tXO5Zq^=sIUER+X_eIi&C32YuxrcxX@sdfIyOaDVbDj}6;R`*0?^C1sL* zYoz;-Gu#U=_7 zkjEPc#>Jg>A26KOa`4vX(9LoOBd1Z?lb+rnx?V>czMkqg2;MSmPYcWW&S;?_u%G}3 z@imH(;%sZnAk(CX(l z3DL`AQ@|ev!L+PkLcLaU7F;k^VYDeX!v7Xk`g($Ifq%t z6I?qX@I*-o>e*EDM*QTi3ymTu%JasN_TuZ5&xa5wCD?E0AqpU*d+9&=g=Y5&8F!f_ zs*qn$Fc8s-cG+jQB-|_zp2c~%Er5fV!u!TGQ)PuaRb@=mkwaTRO>aS$VWl+jugm)& z1B_{wm0@}Tp)9qQ@WbO<4-va>hC->~9wufWj3bM~sFQWamW~E6&mpbx@J%pev<{uD zO*Hm&aQY@7nbH(+hsX03og$10S_=X;l;+oygvYpfZbPiN*m0piw(5Xk%mkMXLClU} zA9s$42##u@v`Ys27f*B@0Sc+N37E_6(zJ6Td(*=$SsDi}qR+3d%B0Gt8n*xLI0X9F zrnqFhavDWDkw5$`{?U~V$Hi{4$tGqp6aJAIgCC^Uicxzcp zY*xmP--|#wRmxiE24)GhkVDV8p4>Xgdtx=QL09^^`N z?|YyJ9y&7Nxe%D;o%QD6dGmu3Rhl_RWxo627_>80j%ZElPCd{ZSr)m}2s}2uEQi`( zGvw;p=S7#ZA7JDhCCGo(`p8DU9!?chcz;?FK*O9zUwc?BlDl4cs+^`Ez+`($MUpBTummd*Hb`Y5;5cz#Q~!QP zQ;Ftjn8aITyn$i|xyl*LMnj>Q2#ZpfWr-LfAW(vQ5Vl*A)Rv`s;KG^iaow&o&|vKD zUyzb*Quc+6Lv`g0_0}m}|GHVAA~`?6kP!l4?r0Bg3~vl>)OOHRJeL_3p_3(iMXfTl zgsykUE%Vvtz2-`<*t;onu`1zCeRcL!$1|12;*;-6=KRT;8gYAkGK95pB}|8evXD`F zZ>Hp5Ie~&3+k7n7hC!`*4wdtNGj=Zev=};f3hkcNI?kT>;D46E#YO4Qz8Oo#tW8O?ksVr+K0u3nIphIX8uu&z62C?}3 zlj*V`r3zsWS8HUKHKKOm+jOUV;=pNc`YL~O#s(G8Q#{Id7IO3B>q&mfhC`#|8gDGw zUSJ095m?|ey;r#d>gbR=e`6_HX(a#vuG%4!C-ns@x#w_d(grNj8kqRmjOT(z&~X=E zw#S=F*q#wb5h{fMI`I=Jkao8M8qL2GdJi2|2^>F8LfE%qj0XHi$)yL2piP_2h~bJwZWa z7VRI5ImWEVW+zt#AGHEq{CT|HeMFXcZ>uqY`Ss=1s$z(Fj*L+^hb+i{*^+{$BBBC| zi&p}u7vWp}eal)LU2m!e*u3Ssi7j2ZK(H|Tmy3cgB_3gZt@cOCb6}c`ifW8;E2lP8 zedrp*p4rM@3&C-KPp^KDmmf>=wWoe+u4$-v?3a2RRi&6nSDUU%WlMdBjeE*`YbB#{ z(HXHXbaPUd1DPZOOy7woP<3hky{5PsZ5sre-fw}O?bhxa%>qk~yd=zfo{^6uIB;ki zaLzV5Ouqrewvkd}b(HJys!iIH55!MSFlHwrx%?0}?=f|I?AzH^k~;gl)W=LaX6x9h z>zV@f#6h@gCLOx1`esIck7OJU05yDg(7_Ak{EZMKfFtAMSI^d;^nk4IYVhdt#KR%E zsT-{{S2mxuVbwgpQ>#sD(viOwt~`A-^V$0*!$mkXD+Xemqe?!!mb#$Sg7?Ka&Mk9J zxTShGe|xqm^K5c^?vI-OMkm^;cVOoCO#&sEy^HN+p9q0G8KrCrwkLK9fkkfgCjQ}a zp+yhbZ*|pD{>)m?9+*s|^S}NXXScPm({^ACh6zXSA+PD*=xj@CTgh}tD2`0n;JXMG zn_QcRh^39HU-td9wC&PYbq-iP;Z!slV|129wi4t?a(p4huS>=9CA%}A7l9lc#$pvy z>>t=_oB+d8UC}rJlzX;s^d(D`3-=>ldzI=tikP;*qpQQpJ`O4JDkE6o^C*5*Rj;=Y zfqe%Ketg$FBI1&0Y?yVru`I>EyTb`N1bvKA5H>J6T5LZqGDP}hK#07C`$gWYx^Wu3 z=hUT@)<6L?r*y(J!2+~2~~ep^!^wje)IO>X*+?3;S_o>x}KcsrTzH zY8z54)CDb^H~ZKqk)C~K4@XzO#6SB?1+xkkOg;T`5Eg*TI0+_#D*ZM~_v-TQ?jM9A zQ}Czj9CtiyUH}T1y&?4Mw|Ij_dj)Mygy8uWgT;Q`5NRt>^W(L?=a1dO((F}^QGt@a zq%>hJVxImR&Qebi&sN;^kX(#uRnB%6v@Ahw%PC}d8_e+$ebC8Ec&Y7R|E;rd`U3By z%`d(eJjD3y zKp0V)sNV;?{!Okc&!d>+s-su*%@t|#^YZW;{hgxKT5|soDdiJ+)KYiyZga07$u+4ZpReo#x>xGCliy__+!$0zki1wVnj-O-Km{ z@`~f`pkhLshV!XjPLs2HVynF539& z1otDE1s-T6orv#|4rKvgUjum`^po(!25L^J0O@JaNT*CtB8Ht#l@5<^bw6-S3|W2% z2AeVjD0nf0>HR@#Q}W8X<8^W$g`W=1ka#2(#dv>Swc1SO}141E*RoY&2E z6-|>Ao8bEv9^*5vk^^*dJb4;Z=DCaTVna)%WMm&`;mZv-L7R9iyRoy43ITm~O7YAz zjxjFXtzr-|C7=dY@}ex#J#K=PXa!5br0QTAf&5SsuEDJs8KHGnQ8gH-0s`6W`8lpL zN#(Hjeho_a=9QG+(GlE)0=Q}1Of0=AHW{e1FTr$i~zpqSA;Rk+}jjPcDhE0}+ z@lGOD+bD_ae+yc4mY~eItg4pus+M2MR6fnrcDx)1EOIT#PQNc~#Y%b*dX!*HvP7@Kfi>4drSAP(#uilAiMs zpx+s_hnw;X)pn(X(IocjF1VH)|qX^a$AL2{ZLS`%+ z66}~l(qwuX|IsYd>*b^7+^VAiNi5+OVHfHKHC2rMk2eIV+gqhb>d zmH-~w>T5u=g?U0VEc31gj+8HQ;2QXl_xLAd`EGn| z55R090Iqm%PJUHGq%)RyP%FA3kpi@hVaefvJ{Y1w@k-blI;&T6LbX>N_4f%`gL=rZDHg+ET_lkNk~axQsmo^g2R(colc~lHlHR|1BQl! zW_`O)&e^8zn)E8$tcR0!XnkvH-9v%eP)*C8Ppaq)uU@`O62I6|^5Ws-FFM|6AnzE+^w} z@OX2_JI`sMJdwE*TJK$afVlsLODh_(-eMnyOoI$LPN_PNG|ih>o6+x{<5!oGX5OFZ z*c)%AYV#YlWzb?H#83!7KRmDI2O$OrG3-lo&PyW~*El&N*7f!@3dX$IP;Fx-n{b9p=x$FfmuLx}YTm&o)d} zRuUSM1eXQJVqE*w1+xOp?5~iO+N>{IH^ufo44zGge!~r8h!Df1P2UX^ z=bYT+rprJ;*YX9YpQrJJ0^Hi!_X_Wsu z8qkbC!+FLI^eoW!s3A&o!t)WT22UU?lFxpfzUzD(jJOpj8M=6eywv3K``t;v+QRX5 z8Q04JYkpWMQ9OAKR;LE!C_C8-?2I>{Mb|S^amZRq&Z9SNhgllM@GG}>gC~Ta_&P3@ z@u4W{i&S!k$guU~36Eg&jGh9)fzw{kTMrsmw4aJSdt=V})8chOqrWYxd3;G#S#tz~ zAJ^r`abCE%roOB&=3J2Cp2-;7sYCq5dEd#nJ^GSa0no?T>i*$G+ry6tlxVotc#fN? z%)h`6FZ&I5fW2)iK|)4)JX9Al_1#p59UW@Vej>yO-|QQ5r#J%<2i5*p;d*m>9%(ei za7?VY?DzqKB0%fokhs92UcHsBZZa7-QhbN(sRn`ws1YNm-~yB30a5VZA=q`w5E=)^ zGP1I=GQ%)jT2hGhTHu2YrBKH~nW+gZb;&)P?h71GOYsXX4@(2XuxX_xGvTv%II{Op zr8`z0llV@J`vRctV zP0C_XxOuENRXSuqoi}A7jq~&sdHx8~Ns}n9; z&?5bAYkeaVG`0@sKlb%;sdH2ku(1;^^wU!1qEk@K-1&2V(F?c9u^{#Y#)jzABLL$c z0R{|Uf3^hn!bg%m@k9=?aqjo?@j?TjrogbN>b&}+EwttrG*KvESX+pvbqiQa zqM8(FGLNf*41`$PnptaZ;X(#sFV}fbKDyX{2G&V{Y$MOQrCeNZJJ)n+JjYunG78q0 zO&BzB7H6Nq-@pW5lio0XFDBB9oj#cmL5fqm^1fcW?X$T%C2*XTx9f z*0_mPZxHHQjXm7lZoCAu#-MItDLAoVhb9|e91r~daS%4hL088vRI7*&JjZw2oUrvp-Oo7K?z(8R%x$2>-dk05I5$}wi20g{Vkk_N^|{zrMmk5 zskgqgiLnSTg=4es%-T+`#K=-ufuFFONCiTGnhOzpXsL?-gkR8}E*yWOO(XwIT9`0) zX68*ZA;JC(4EBA^>u7wuylS538+pke2*@-T1Mfmps!CL!CuZiR)R@1CFhQ{ zP)g#kTXP!!6@!O35KZ_ZVFQE57xT$@+etNGC$$r6qVwi==39PZ#2RNdg1Gogq7}-- zI_>pG*U5y|mlPJD%%9E&t%<{SbNI9sp!mqZ?<3TSk9O;?Xm(6wr|)NHbuI;F6K!c4 z&ct!X;;^h-gU@HbR<&GgS`d+eodXH?sI=NB#Jw7JTS?3u;li^zX8OCaaRaw8rmnKl z!kIT4Swgcjgy|1I8%vR(perRu4tBHy=~9XooQhB)IW^uIOdq67Pegh+lMa zalI7lKA+CZJ?9C&Sbw%Pp^681VbS9cUBcjow*-jpMFozw-rhPv!W0!S{-6$aYZGUk z%`!HwlQxIF_+IE*wa3c8qrqTGeMMeY8U8vP(lf-eIHyqTg0%zA({>=(2P>mbk&B8W~SFN|MR8YQ2JIeki;Pzi5qFR8TIPKx0oYdMUjl>6-) z4^mJ;QP-ONc)R++`wr)YgZS)%(VlQT>iWEo3wtgp1$i76Xkie-2m?4^f74vvQobTq zt5y_2>^U|u%kpxe+1>luZH*|MXg=EHfeaj~p_(MeRTTwk_AP};Bb^2Wg_f1MnQ)VS zD_E!d3U6EbHN)NXZu+)hlxs;)-%PJu90`;@S@(hhbQX!x3>*bSN+z-X$fX2W1C^N0 z+M1NUK<;a46``E*?}M9X8`iu;TQa59OTR~WX5h>>_nJ0v77rb%Mwp(Q~E!bgm9#No9 z4vQBM5-1@lCIE>k_?%d)d>9296-FkQ&I+uHl4XuM46WzLMjJ_^B4C;b z(duk0LZvi!E;BwXSaf*vza@1F?gL!>%k>73c+WIeG^a+NUmqth$>73%iRSKX| z?_Yabj6E`d5UYZ`@gYxAHwl1xeQJRe6gl34NseWjbFUetXm8P@V7o;Wa-zc@238OLkYB{E+r3i)H3yaE%iptx*R(G=| zs@)9=efresF>K8%K$b92)U-t?+Z0AeKY`Bj!b{+~#)~0y@}Ia|v_J7yU!~C^vzG&! z^vfN!ZxDbXVCe0|!Bx*#-;N1njwGQ7-iC*HBNr;2&$@oChwkigMPUM4eo3FAwSx>g zL9zwR2rN+p1dqn!f+bZRPGaf9)?1}sqPZ`>SSpYV^~IwV6Lyz2qUKQw{Ps+*pMr)_`XSMl#xz1@t>I!nL0rdM^~(aZs#BP=5N3LNq#$p5^P=#Bb| z7!5)1{UoJrLZqxzMt89Il3v?LFAEz5Nw?>uUcLI@rXzT0Pawy9@`PQ!P6?z+m`a&G zDPm{dP%wFVy0js2*yi#LuQR67(0%_D-qTzD-GqdJhuSwIOe@1Wp2o0Rz6@jD)vg(>)BgZ|@u>&@^EUeu>&)%4fb`;_4260V*_5sx~%6<5L?eyg0K| zZR%US7?ahFngntKq<1;yi(c*#S+q=S?C1Pt{eZ9D2Rftu?Ok2lL53>-XPXES0BsFA zlc<;`U6M`3s5@fD`|-0(Q#0yyEdQXcPcS$-X~c2HZ<>DwB-&F!Wy!~5!HF|t+&U@a zjbKJ&own@h_mA>j`HsihI3Z7PG?%*{RH{p378uE`$k52{?wY^OjExQv)nP zZju%b69_$LRe|daOn7P19n|m{cX1lbwHmL_NZlmj@a`Cw0GLzqW9xJc%d{g z9Zc6h#_;zNvwT;e76jt{r`*}Owc??|H2m?xAL)9b-omN;T4ZEep1njb>G{wBoCotW z+rO$7We_)0bYL2<%1o*fp#CC{fu#P@_>W~MOT$OD>_Hpnntz6ha1XC3Ip*2e5)PE` zt!Rs^(!8JxjnUH^1oLa(?%JP~xml^qfZ9-}R6w910zj{&!jGT@kv7j#&Vyk$h_pEO z5n(|(v8{{3aDUWDT2V1#|3r$KS2u|cGX6ez_ij6paw#!=jE zfYT>a4krU*3N-MtiPrps4A7 z`JB-na#G1xwRAbH#MCKRVU9|(6ndrLlJ@VfFb=zXcS5Lk%g=Tdpy#IGc#D~y4Uy(3 zerL|RmfAyd$(rQFslhYhT|e5A(Zu7ybqQN&co@Rh#ca_lU?T-vybQJYhDYQh=m7V zahdhti<(Z;uM2SfxSzu3{1Kcw62ACkJ$lZ?&2g6+HRUm4~%=>m_b0Jqc#5x~4WS`0xTzzn%G zFzw9-JK?7O(1HMjl6;J0q~Me^F2cMy1KE&Yj+rEA9VI?AWYHvL2*#`=4o}G=0J3BhN{YcDYa0&FO050>hIG^IiIi&}Y=>Cs$(l*JVTpOOp3_MjvCeEjC6Y#sL zp-C?JJGbm-vjAu6v(6`xA$2>C1r0!om6J^Y@_AtW8h`=KKzgFktx%GXAxSc!8}7XJ zO~CW{XTp3(nq}0QWx%PXz56|$Ig=ZM8&M6?JaD7xpk}`f)eGH&+Cl9?d;d~^W5%@y zpS%<&`8l8dNB3?ANVmN)crG=_*)aex9Rp0a+?P-M!B9j8*kUYGIST9#=YyX+8fKQ_ zpiL52dz{~d4&j$>PEQ~sbybruhMO^*$qGUD3bk(Yei*KyKDuqzT?hY}V07k-nQ{eA zkb|jO2p}AR&-Ml&r=+Lcr+j}*k*0aGNV&6sn!DBNu~}5g7K9spBF_C&-bLjIsoKGsr(KZsp~?!@15BR&FHs9 z?Ae1#Ab4?s&n_py~=i5Mjj2l0gZq_11+2XKvK24Mee zti=axNuLr+#_AdF%Kt~%)<4RU4mHpL)gD<0@QDP$R{84d|Dg;sTDjE6v?*Cts7kEd z^pchq_|G}A$KLtA5eX4JUefb<01 zlh=PAAqj^T0-Cb4{bcLsJzt0SMD>STwj~fB`6k7t6~Vn)yZJx61ky50+e4A@->I^v z0KjPzxyxt!)LZsy^Aw=wo-ppI**HLgd@1eT*V`2M5dhprt-&9DX$hH&l=36_v8K+2 z=#8W>%9G>fSP)R13aoFb!pao3xKHhRKCGK}p3O+-)$e-2k6Ku9^O2DN;Q z#?+1Lx5}MgF=-P^>{(;);mgMYaSY0$`I_uZvTvzKWQ%U}dXU5ch^m!H)V>%kBqtO}(jzdePlR zbBfG_s$qJt%+5C5tyzJN+ZOa2Gw4!UtwGFK@wV!2C7Z<(nYqwu#(>i#?`iP*C;W{c}Tz!oexj#Rb6zOZhu-`J-u#co+ltmV5AN zDIIQr3+2&YWT{@h0xcM&BO^m~M+ZUUQ-}tqyd;{q!YaA+JK#U32{aFBX(bU6HX40t z>R%lsB90AqZ9zH*-_kZZ^Cz-)-Ajc&cSJBXcS3u#iSR}}wc<1eQx1B=&nQ&@kcNLg zD!9~N-cj;pY3Ma5qZ( zV2H7S_5Zx!IsU0%$LI>?mlBh%WoMA4B!V1?0`LQz5X!z8IeZeve=N7w!dj2pKBs0SJ z$@b}6_bIdFiF-4=x3Ue0>EGy~|E=QZ`=gfcydstv6s6hfgB~>|BrFV))70xc-=5um z!}govl=j_JIqA0CNYt_v8TSzSAWv(eNAQLSuq)CU>SklGA7#v`A7137#)AZwy!yV^ zJDG0Q!FRX+Dt8vS33R~!{ZKW=~i?xLF@uT{pO1yR(E%-_*$mYMvB1$#{yaOZRC-^5D z|FDxUxkuS~e&-`TLsxuK1C9BTgKXG%{n?3%$m*VDcd`gM%TB}6Ga7vzB5P0W%XbX^ zUf2m9H$SF)02A1FHF-$r4@2x>H5a>$9kH-)*$Yp!ALyorwmm-eyZXi_Mx zkSmQoqmlXYSil>rx?qdP8?hv`%6?xKnxbD7vo)eX@kB!=8%iYhNI68a*Fs+}SZaK5 z!m^E0Q8k4eRWVTPd|4l@#ulzGI;2`nCH?yq7Zk?N=JrSho<&-U1yqgGH)cZnor3h{ z@HQ&Lf5Nl*e)r;K;PAwAb(^S?IzOzOrcB(*SsC%RF8aOkMeJHHmq1jh#Ks@F{Wy1j zHNjK+8PCRmg!IAM8Lj&DYS4ztaOs9HWk1jIbKAE}n=MJ!bF>DZD|27!>6uNar#o}O z?^TCi^7bEq-j8)Aew!$|3G6fjH6D(yZu>k@y8)ZUfE|AS^M=YsNByG?oBMtHvB+0h za&^0Rjh@iarQc^6Y_KmL#oKOA5G8D?SHRbh^CK>~aK`rub{@j<4T{O&HsfQ?zzd0l<_$6?jFn_%Sk(We{y*0vyqx;KQ#RQ%U}?cj)UcBULUs3r|68R zp~CDJQT3&@ZQDVp1orWl2}w=1KB`=iR!pJ^cI*KP&t0`tZnx|~2L8_1T6cX--1j2M zAf`q8@$s4RoR2V%u;P$r?BGkNj*d(j(lg;llXO4ZcS9k(j%S<0!JICo#XKFnOtU!G z3J1T*x94k%x&_1Hb^H=Kaz}mvPD3{QIsMH0rtwGo9Ii2GkzR~+y5mf_|NLD-66UIu zi+F|uO4Usvtju!6naKOFpcg7RA4c`DqhteJ&fE(y3kFJl-Bk-`-RP&t<#dv^DH^Fm ztkM?dYrW#PJ`~AoKT8(^sEMh>L_WW)Z)5DpAIiZ2Upl1ag*jv!*Pi$9EDp$qvpYBC zx%E_T2a_&L^0(G}Ojh?_SgJdJ#=6w8*)!E=H)au8lu|j-Phz49L4QO!<1vfkJ8jOl5;kZ zD2G*)G*)5-B^v8ar;QC4kTOMDg33Xs=ffKR>Hgmgu_5nTRVc`^6w>0gAN!F3yi=MiD<_CN_CZa zBf(e#&V4k%Wa9lk@)^CEBkQ(Vc3XlS@c zNj4>dZ^xZ$tLlm6-Mcf!K{Bx|JTE3o>*&6HiWg5Q;z65D7Rdd=i8|vI(hp7U8s3y> zhC;T?CrsRMXr{h60!Qi&GI!F?Pff*d{`mr$%&f#qO*PIjYK;9oJ%C%-ULMLc|ANQa zfU(cO4u5k4`|4kl^bLg{av*Y|Zxwd!b{dCd&C5sC4f2ov3uN4jyLY$Y=?k@1l};%^1Zkv(9uNTm zDQO0zy9Z|G+uqOnywCfswSTbKYp#9ec^&6*RwX$oXUcR|$$KYw)+I71!R{kyL#~;Fo5=XiI zEoWQ-9*u|yrJJ24c4}BIxs-fXF@MV#Y^W2gnn(=%-4Y-$iv8sB;~#%plHUM zFx5=Nz~Ok^=wY|ysDzAy!i!xp4&ux9NOd*NLZB;@Du22cdG>f)!I=|Fy!s)yY_{WN z;7y|9;_cYWHaGXGOli6m>%m#d;2OH%nqO_J*L*aG8EdiPGfM5=v2Uz44f-Psx4}vU4Sg$q$K& zAR3LwqPB^R5*i+8#UhtFrO1KlT6f{}I)*r&n8dykk(kdS z3o6(|Blg@nd2y+z^%m=SYpYj}NBgvKMg2~blH?V|({RHhY|1F-(RqIER#W{c^zJmX zkTfJGHGVs97=h1tlTG?N4RKI{6LU1frmJ9;4C^|7C2VZ@W=mpK1cDqS{M8Kb<_54C z3JVjXF^Q~+O-(N=iXvne{PE1~UJieJI-)|KI>e8~Gb0^tND1R&_OK_HmC61FN2C(+Nx>mypO?B1)xQf7~}ELZbCm&PR~O4uKDyK~nH zRY)32!kOl(57O?#b^YJ6wQb3X32*9Urt5--UQ1*O@flxu-8_)3KA7$4!n+PQN$^;S z%{6EL!$C>WKSAC<0ZzSe3VXsWD2Cw1kjY?Ulf~dCy@3(wyG^-(RIL9Y{S%2ySwm&? z;OcSMiu2JHzvl?9>e8ds9`xAJOSWB>mDov&jn^{->!5e4a6oV0 zd5wym@!P~VR>t7lf)Rg#jn)OXb$^_4li~z4q@~ZV4ZH3nPn9^XBBwvIQOLVoqOe@@ zeWS~?KR)1hZA{6__|jT(-f<_MpdU|P{>@#u8yGBV@;#!|Wj=ApUw9r9wz4{5Yd_hh zV7lxhH8O@7(;L!GWz;sECHQjgDbhPG|C|K~ITcRW<)CCfi>jYoB_j z?Cx^_ckxyKnf*i!JRt7We^Rav=qooPTOe}Ysa$)xzhtEj^Df#w7NPj`v4ve~udwGF zuUlG=0+iiaomqCK8%M7298?~>#@;52L(0uGCb-YZrD-XpfWanIk~A!RzBb#;Okhg> zHE;RU7`Yyeo~zx3P?ych=Pvf>tcO7=qFGf%JE&$rOa!0K=_bw=pxuw_epz!}UIuit z!fX!sRM1-m)5sFuWk+sbUJ>Or>6lC9$o9OWOgSBWi1}lA%Cx=IS~n0;J{ZaKQ^Hzn z-mtD_LTIVruq9?C)Zq*3>1R8o4Q>l$cUYY^G)2{h zPSeP5*=aWz&vU*zRJfQDU|uaIm4Hf4YDvydp4ObkuM&)L67CCayGMTMV8&OD0$xb@{ahw^W!25Fe$(6}c4RkPX>B7%1#% zLmdnDBE=0g{M-;|q#gF!yyK{f3U+TBhe`{lGX)dV3T7ID-&|l>Dbvye@s@j+K`8Ag zSv4KG+&}y!F3Z?aL?UfCZ=|a(e(%=+wcXVe+=d)N_=$pO4u0K-?HF?u0r_G<9t06W zPMOB;Azp10QVx1KX1q`MN&p9>f?~getS3m=^3<9T0HHPhsZMskbrjwqzcej;Usv=S zX`jGlFIn46DN?$cDe86fs_0g$YI76xl}_Q2hoyit!|HsB2}sv>=R3|_MZSN70D%N& z=BTX)gMu2|Z{D9?eJugg{R3XL6TnfhNg(F?2kt-aq67dT$Da{6OcV=laAdn*l&oDn z0gzvgl=kg6*+{GO=l~U+0Y{0n!FyR}Y>ccc=}@dZi25q67JiJd&<{5~v6}^56_qkq zXX%&NGe?BBE{WvELUMFiUuXC$J!HUIefpf)#Ah;#ZgR_3zD^vUT`+ccXE}I1nkywE zQh43GBcVX^)YJKGVVIi2y}SZ=HI={#=WLph>$l@n;lP97<-(y7{9$i?QosTMJ@cHy zR*%A7VT}|;1wK=}WW;Ly)%qHqt9g^B8F9KEp|-l}y162$mHd~IUW19DCP@nn=$E1B zD?TWSs%go8;bX&7*yy3f2Zc1Iq~x1wI2IAstk^guipL0UeH>7>@#BDppi=W;EdV4B zTPR_-aR{S7{>An4K|8_>{j0<5K6wg#lEx}p9>!ErdDy}x--+Me^EUMF|6PJ)le{az zSb(+-*BZe{PZT?MTVUjn-s#5I2I_c2?}Uk~!S>~rQjy&PpqO>XD>Yj z*wd2g8DK^t)PtJco&5Y7jirKP1&*)Q7PBxK9v4sn!0mP*>&bCpHg4b9Ez)ro&+?R;~) zes+UdH~#wIFJqD)6IJhHGasG;9TQZ&gC7=ytLpU(rZffnxFXu?{|9^I?xX|EU&IA5 z{B;0m@!vpTE<+|A1C-gm`)8}JZvi(^KWK9?LK5uL-9CBbSCfx<<1P14O(8HUC9p)GQD{IMQ`oRD1hPYw} z=;T8xqT7jndqJY7%sw~Ye9v|3*yJQHx?xi>(I-S*%X@E%MN_fd<$f7niehT?uz`u} zSH)?Aa8DdsI#Oydt<}vv3S=%F3gHyU4MESmL`vV{B1J*NEtj)8SI#+#Hf+8qtI7t} zWA$Qn+qEihDo~aF%5tHP(RnWA2@8>H?9h>qGiX1QQUcWr5+Ovcbine_`774oONZ4O zIp(QG@2hj86W^=+@A8bDTK96c9S*`AXA%tzTm==YTT+e4#4t$^1c-rg$}lJbEp3k;; z3A=wW`eml|^K>@J-D1ji`M7)te!Os9Hg}@|J4fVShgDZZ8JJI+N^1PUm^fhwsF`=2 zF1V78FyM7EOwj;pS&ADWCtBZwCc`Gi|DlyzNI zwob~E(x`c6^QQ8Cg~qPW9@ zM@4M&h^_s+7aB|+xC(JQ;6cL&w4N5>gGcTwjeI`nlC3E*4375nlnTe5f!B4a%3*SQ z^4H{)iK$hb=rTf#T#1z`(~wZmDP^RXktGJC7{=!&H2lozw|o?qI5?c$tDH`vCZ&E= zx%D*trN~4Xu|FoL)#_*=h9+q$Tx#aDt9JpBQ#>h_yVErjZHktD}au}FPu z?zFx4r(Luxj4Oi()(!ta#Zrf_FLAzK8#$=q1N`yW2(V*D3|QBxug`~1k*wL)=7L}CqWNkzffm$Rf-%I9JA^VN@M?!TrVn%Y^l+;U&{_5jlF*PnzOvf*n_B)CmrOEtMJF%i_78;f;^_}?|F-h?VGGjj>K!yADO!kC%~{& z*b6(8+jpVjAMx)c^~$TrJxujW)*)6fh9C#|^6aq~Jftm@_N+f9nuHL~ZRwRbvrJ{# zw}ubfSqe%jqAe?G&P+7ay4G`?3QFB4qwr2B{YX0llLt+}l9(zp5)BRC@Xj0SKn7<)%d ze#7z>u1VbJKG*+Y+FHYLVih5kM4oiG`f}83^Cw5~&iL;KqaYd()}9#(2Txg4kz;-S zuFA#H((i$7vjnpBZ740-Zy3T$&a*zk5n+tfk8#Lwn`ujFY?NWj&N?CrVu;d{dB>Zn z`&Z-g^P?{__I+$|HM{C5HvqDiAl3+XSZh~mE44@il84qQ0jHgK61&8#p{~=%^kM!amB^BDnYh*FgC3|DZtc4pKl1 zf^e|s|Ne7;p++;-U&2Vl>GpQMqQ4>D!q1~D-opE#_kS9@`$nRESCDobOm#x^A zq~k~8Wl=)_v+pjO=kG9zIn&@O0_y7VVY4;w( zXX=tz@8?|+2+ZZRF18lB*2~C#ec=n3$NU9zb)&{x(9HTE^-{#m=p9Zp{_5%C`-il27S?9 zcD^lG4W8J@0>3}kUP8G=FS+|wm6Tnr@Kt&Hj1S=X)3$*Wk?eGbbrlUMrBRl+DhK}j zwCeZmOe3mX-bj23eLs_^A(Y3Srh6-nPnX-ISkhuVQ>bcxPy21NCO5&U-b%;YpRl`- zfS(eoFS$(#LQ4jJ{I#-@Y7rFfC71(udm5V#e&84Y!U@u3;l9MF`+1UoE7j*Jkd`a@BPR z>ckGQN`g!ktmXtwpcE)j`SmgCd1VbAG3UD)cV$~Uxq#u3!%pMs)PWZ?DTT?VT#?W`Bi^PA`gc_M<7+D|Rz4^n8rVDGj0nNrVIr0MLTkuQ!7YbU_gwEs|PXiU4kqRhGn70S$sSG~`lIV4f$R^tH6it=p(4fC)v~-gCZ{P1zDf?x>eO%Dx$Zyi z8O#DsbU@Iv=cQ(_lkuVI_SVMIXM2gCs|3Dvzv0ENhF{_?*x1Z_pYdd{j{4(jB79w3 ztB{LqiwL`$tNeF1xJxccymGZz3f9Z@>J*cHf*}3wq#>mrFYxoPhI^8NUUDmZgrB*4 zl)dD(ox+I(WOLV?px?l)xfDkop4P7*Q{}-$LsIBs*%9PYSX};)8YfooUc1WD<+WV- zljq_b&$}cGE`L+2hpgGidL6)&%)FUD{H=EXpIORrzciF6&0^kheo={h#;$PZ@AQPN z@JI9%#rM7AHWf&X>8&jLDV3lrrz^)$(4t^y8cZQQ>G1Sa@J{SiGi|R;Jr(BFg`+XA zslXD2?2_S&L{Gqmw(Y!|ObPRAV%~e0vQ0%a$|dgz@Pvfpuq8-4VD=Q3R%r8YeJyopaeeP{pG130Qi76o-z?=ws~}vbCx-F-&E3fOgsr;>g{#i zwc_wNhPx5@cvi+lAA;x;^D*q{l=4wxeObbA9hZi;thCa$iB(Dk@&K8UdW==;E2CB= zSE4bmC1C<+RrQynpiK=nFt|k4T|#GgmiOR8=L*EK^zv-qw2wyqgc?h{2Nm}5# z#eOR^F0MEd0&GSx_|^E8ge36JUx!UH%T^-4czg>(r9Fg5SqqFwhl%ivg@yb@rF{AR z;qgxkU6@?WrR!S0WP0+84Q|SkCRuhJ(yJTBV(Ha?KCpx4;f1PO#R}(g6Vs)wo0JcQ zwfCt6UC<|m{=Ai_x&D8BH2C$)gz)|$4jV1IYtEmR6tD(l3`8{V&qZl}grbhk;j<7* zf^X;Bxs{faQ4X7$MMZ73PNKPG#*Ui`({>$C=PzZ+@p{Dil>rEc7&+dA&y3gD^K%yE zVQBD{tJ|FSt)@k9$*$imsqbzwv!d!>g2gI*e0&b)$*RTf#3fW;Fo2G$LzwOcW+vFV z2_pGg5#~9nK6owa;F@00ibY<=B#!O|T=66+77im7Y#q)Qcg|`ZcX%7!EOof)p7^_w zbKtjBC6NK939v8A=XP`i1XqVCdaS?|-xX0ty|w<}uitnu&kgsWi}a+?-{Su<(En@P z%X4vys*M-e+cmK!?UNTb3TXP4;Tvrnyv7w2NGKYLYupm$)cR}#Ba^2aa-4$5r!-!$ zH`Aah3Vt zXZ5M7f|HJvLn_RDZmsst*cg9sdvMP7J_i#^?oA%?rv!YL$}bQFvDkLUol@jNaKvMwyiPBOp#~p>{O9w=vt#K#r8oGVdcB3c4qVB_J>*lMyQT4?qf9X+YW^eAc*wHEjSZ<(1YZ?FA&=m1^! zKPemg%^Uck1HXR!JH z%qcYcIVUIeVbbVjc4>@57E=4*vbgy@X#R0vKq9w4`U=-eP5p#QeLr+gt;(})dHs6B zEq>aOhUBW8lHgNfq;qAAeOCXap+e)ZO_MEIXK)hS+JuM=y=WeAy#RYK66k#lGV+7D zit~D;8sZ^#f()0)BXmpR)=|9EWxn&Jaqby3t{bHn_sm~~K0n}M&q>(yKW5v%GO?>( z@-nzHEA@gNGz>CDeIPE7(*Xz6(bD2pO=I*{o|Y>3&wlGwfBQw6cQg0lTsIr@To%^O zX!=d53qzE+$_`Y#%7!@XJ&lpRPfw@tA8P*I7IPP-mC&TK&yZUAxF>ftKz!mx^ki}W z3u*LWpzy0i$41y%J2*M; zgR_rX$nMXlcRWN~KM>pGYdLq#iYnd7D9v1|#P5NvN{GkFv6m&K8*>Veft ze{rFL!{1|4km){88$;0H_5$bK!tWhdSMk`)BR+25DQmV0y`qJ%{2R!^xSH%CrKJVqQq*hzHK%SNL|3hl#O!W;L+EWmDqr*v zQhf*Bf{9aa^;~GuHwvV2w%G6g(cin{vH5xtoh2|0eb?m$0YJocaFOqe26Z(rNbQ@Q zgFL=zc=$Dx|4s94xd+>nO$+{9fM3We?L-xJUS~;h?--ov2R%^i1H;!4m?HLJ>#~ z2=VgCJ-Y}?JaQX^YnEoXnzpu%8u9bb6{TqJab;E|AOs3zx}|B})sm5ISgm}_Q&0uF zx@=n{E5&Z3M9JHGdg^~o8Z~Wa(5=4WSjUvSFco+oj7IbWy>8QN>|!e@gsFhH;3>-d zHCB4MeRAv!ujGZD6b47-q$cTuZq_P zlwK~^{)XQEVu+)fy%jXUfF@fh{QBrWu4f~TK1M|?6{L2IUT*5d6`w2m^V7pecltKY zQb(RK#vu?+_vwb>S}-SN3N-Qu*VR?nRPRuN@15=UH(T!c$|)7CD6)XR>sblvK9i`1 z@n%2uA+W*fAHY)P7LU`=RLa+GE_3(9FdJGVQP{O%GT&W3-jQrEE0u;)^dBvNMJ-qT;#^jGpOXN@LsKouV$EX{@?ID}OjD*lp z^V(aEij)h%!Q_-l)W*Cuq=Qw4Jzx;(_oYS)WF|pl0v&Em_k1T_2z0XWzRGkbM6Sxf+=DHGtEZP% zZ&y9v&<4C*#_yXOSQ!lEOfPMmjX%kX=cNJbnZDWn-uCGfW2~hcqnOkiw$AkBMB2NI z6sL~Gqbl=cU8;VRj|(RAm)#|{9^zzX&VKJ!3`VSudwU6!DSqf?E(goN(^BCY;{lPLq02-+-dceC4GJ)m0l<1;$; zrG^dmrH+2U;<=p-_IqjN4qF^L)!yO1z5q1`KOMkBWU=F&)_1tc-&0fsY6g8z=R`_N zBX{g*W9&CkS6*1VP&70@b0joxgv`Fw{We)o+jB!OoP)ONX$m8A?$l*|tdEU^V^OnH zI<5)-L-G{Q<~25`?Zr;9ReIcAWm( ztqO9a?46{O?GD*e>5#J2;dOuCCFb}qhdXv#XgGCd)+CGvF=EFLZbvUQt`ctMq})L< zQk`PKgZEX|EQds3geW_^%{NQZs~6llWQr+q3FYI;vA6Z)7`P$C@9V!HTXvO$iYxuK z5WWHEWsY5%3laic9xQ`tjv{!nL_p`eZIrppihc6^n1hSUvwWB1A_gLP-~5PZ{SK!z zB&K=|BS=T~2E6s@rC!~AqjaJc@Z%)T8-M3Inc-JHzKuWwARtfY>drE~9!&#h}G zn&DlwsbT_uqFXRzLswHUU$h`|HNtf2>_BcoTKpaw>vS+&wAQj6xOA|%k;7zc=4WpF zT(40{mscXyQl>w(<_YtUC$x@uUWV!-ym3T&F9x{qy}ObdbiG9<;#ii$>+T%BO{ja^ zjdyHIqfYZ|NTM}yi6h60BjC=+2 z6#I@W!qIbZck!>$ay=uY=pr68-zFBUU4nKrBl!U|nnM8sRr&@D__~`?S>SiWBZEbstI}G+XtE>R@ zrPqvcq~{_|zuQpl;qidWh1MEGnU%>ol1LZ(Y%K5m9R^cc438#15Y1;5Fhtt__(K^; z6q?^6x9b$z9F6l(7{!;SmuD^+(v;861jqw#6MLt8AAQRK*x3)GfxJV{OVB5SSTLWq zu_ox4A>5g}#*;yfO3*ak=-$fw8}+Yop_irr^uqI7zPcP6Vdxkcy_kyhI;u1DqpGhw zG}Du6Ye}xLecSA0>AB*y9t>8b&6#(~mY>zXc|`^QE6c_!BUh%Y8;SM}TWrM5BgQKP z@Hu1Zgir{eiCB4b=hWvrSUhnCfpZf~QFaw57Q_HZnh3mmNWgCShFkBx@{hn@5{wY} zSLC<=eh10&3X{mS7+#<*Aa^=0UaYLy-D~DM+wh*`A{mpg@!Pd36Z>#(#u#UKO zLo_UOMX}Kx*|`E1@6wRySK@ijnHF{GL230z9_M#o$oSHdPkF`8Prn|iqurIBzMpk_1GVvQqj$S?67yAUr@I)i zUh@+BW_+a;jlbDYYk2;f@2DOqn_H47lvXTKEti3#d4uG$PUoVb)F}KX`L+hCDe=|U z{L>5BT5b*qW$Pjqd|kjy$Z%+CYIa~ufNM4jL9FCA*J_w>}J>ddLK04A|jdm4xQD_Tqdu=P${>p9`?#Rk!zW3IjFs411na*f7;5yM7c3P@w>Z-9&udD ziRDZkUi?5ADMXk4wQ}mPT-ybk6nuUHgubT{TYbIHGV6J{G?J9CG=4koTUIh7Wpv6f zDY^Rh&y12W!y6Y%XI018lf6-$BCKzS+YQAF#ZJM7rO%j+{{CCU{7|x|5*}P=b12OQ zakP5X1=P<=sG9#c&r{~Qv7UyXPZ%|4EWCeNuC0en3iRJ-)h8tVxNcS%c-5?ch4F42W%*K}GFS`KpVgSCr6+nyzrZ>L|&ypXDDzL6M*;~k&N{R<95P2|7OwNN<@qw2hci#@5vqM%;`>UNNAzg4ZnL4jl7i!lhg zY(MBTXAQsyI&hXHUyQcXT(`5juASK7g(kIO(b9HxOu3b?R?a}fj~VzOms=O@)f`W+ zHm{fL#<9?&3Uhf+d4GNb6OQON)Opog|IX+@=njPWX(Tn&DSqK0cC{WK_4E~Kg~H^( zM0DjjWZ2W~+Q2$hWqiO@35{fvJwA;zU~qh^&AFM_M@*{pF=7>`dD$A$Ptpg8I)PVA%;*SgEWwfCR z*x{02myAr7Ni02c$@gu($ozUJ1|~YjN70fP4*yub9MJt7SN|Mr3@TXjw=o_xQS{V` zZ_nIVQB?=N_si4#T;WZqO2@ndFc1>%EK>ym;(Rc3(=0mFDrKzqfbAPudJcRB$L5gB z*KVySQsW`E2Ele^<(b)qgp7*S&J?b%?yX$A&+&_48!P|0*orX=3p4Uc@y!*hvpvyh zbFA`=G4&VwS;MqMmvE9AdoJRS!8PV$R0;p-{I{nFBZfu)r#jL!430CkF0}hC=!CaX zJ?sCluF`<5uJ-@EF5jOnEfk{QuaVm3XG_)Rw3?qEjpN+UJAr%dDk}K(_iX4vubj1jNZYX&n-P_ zz+6v)W9Knr0Vs#B_}-c&(enYmm~4Y`j-UCu_H)wNmeyJQv?S4oQ&t`t{L}^7)VeUZ z_|o5gJ=lis;-PyA*%x2$d?6-?Alrtsfmijzx=(nW;zp`(OJrgJ_P1afp}#F!MNs2b z&$fJ->~m&%E*EL_Y9AkXjvsbkB`T z8a2fefqz@j;ivAr53~CmH}+tPiX8O0lmx+li z?B+}ifalC^?%)DtT%RUS8OrnL#*`8Wf3z<22ftth=E}HxaIv0xcTU#MAb~9z6H@X7 z%QU_;T?x*T?=8!2Pc8HXSI+}%jEt&?FYu}jb0#c8sz#mAKjpi-R980H2Xd$gHKoPL z?Z@?zm__{VF81T7vF(rb5KSS|;F3lOBt{HIH z8OR%27=*)c7&iAbIuYko=U0-bFlV;sz5q488nqzEu@bW_g*(=W5F=cC#VrZJfuM_S zeK@_S!E}4EXZ!-2j{mfMf?`X$Zo$xg(GkIJxLZQC{{FfW;J`PWdjbARo1Gyt-$^YM zgPF1;!MDF`##{D7v*cqjw=Iqu&|#tQ9q8EWwRJxZ;&Aru1Zv#bn_~m179JEcf>nlPp7owdilifmi(@6@=N*62T>)iP*d zj)Lo%5Ub9mvwUaybO^AhG)Dfwg(RH)xejqoeum|kfX`6>EF*8->5tT9(RAIyoPEj^?RO3x^joOjvvpwF(Z+Ns3vRdgsA`^Tx&PP z`N1j^FZ9%|otVSZ!P{GFLo60$=kpm>BRNlr8ZDO0nDiD@Ks;}R$-F!BMe|u2e=!BX zF}}UMOdNJ}M6#KdP_R2(xJ?{3Vd@fZShC#gtT~gYsx6x`W@J3Q63@Z(;3o^^M`MaY zKAMW5qV8Ij_)+fQ1%MN6RgE2@9pr&}RHEy2c}>IyskfFEQL^J9MnmkmIlSoLSRgqsw<~i?N+#eZ z%w%Zg^6oTt-i@&QeblcX_0@Y9FaM5q7H7HUu4yx%M%_!Q$LHjE`h#GA27zL|Em5sv zE}kjr>HYYQ+RRy@Mhm9DAqxzK7j+sDChqTiZ#> zjcK#rUTO8}wM9?&zynf7BaOFLtsqiwvc;y&<`3GxdYyWDA#VAcP&D@&(AR*``|)Ha zT^1McQKmw;D0s{DRd%4m)B_#UaOn`%CIV>BS#QuD6=p45kN68C*{pd~$TU$X9caZtSp8wa|=CRHP=x#{nG6g-Yv{ zWKR3P^0I2_TC{OInW5Bn8kdvI6_LV7QOuqSEuT;VTT7N`9=+$8XnEln%;JliZD8xb z{NoCH-u#77BZXb`zUFA`DKuaeKanlC<{A2F4A<9UOkfT2&w@WP*KcGD+-nXR9uSQq zV)gHcj-M@x#^lQ}I0?UJgBy zZ>t$E7rd`)Lcozcx+4dbiK*M@KO9mvUcNNY@mhklvVqQH1i+)jhj))DlpwN5+5msw_N2XJ^;Es2H9kfW}Nyovq9zDaT$z zFV!?T|1sVW^I^Hp{~cF$v2RlVlVVbLV?;AN@+aG`%*7oQlwgdgPoC7w;M)A7#1N*kox5Weh9_BVknU~)2xd9LHN6=va!yRfh zzYm9v<`Jen^F6jRR@r*$XH0uBl8_*b>TqBHKVIsv98;DbK|_vg3fWNJWP?09&&iCB zLL2Y(iC*lgiDct}l+8W^>UHbb1dEPgf_fT{XaDzv8}+$OlL$8c`0)3ig6xR@S%e@2 zexyhl#pkrYeaBU_oP$hkT8d!y=$IWc#{n`j^ZJoVL3phm5N&?&X}jbfXz5a`E~{e7 zcxZ&@|Eo4H8Dp@sMBXoID}-HgyY{p76ZWs6)kQVMS6syN>_Zp#u}EYbZ{X(}G??mH zURR&tqGQ8v4EpsZSTuXke#tcO==5D+^6--`1`Q8m@^+F@lp^52QuGal$M1R|N9i`y zJun;RAFw6_!ZGCDg*{@pwJqp25IVcXc!QLMC+1dvdw@kdWA}5~RJ3&PoE3K@XH1?+JPKhOv(b9Uh2}@D|k0zF=2GLK!dVZ{go&$RrxbMZnIu`vL z3+5y9nB{jN{8tn%$E&4s%hkp+SGV2?%$I*#4LcKTc0eS|d~>C5X$kzZn?Jhlh5GPL z&iim$&U=&Ea3WGjZ{}+VHM0ntx)el2_LF{*L1&4!ilB6qXL(J}U1rS>w5^e#6xS?2 za-0KadRuU+Pr-H?>oii$Y zT;V#qRBlf_+>M;m3yu$PEOVn>T-mvDQZ;N{uz97QW#(I8A?CG8Qp!6%ugm3^{wqIE zUY^2lYNhXU-8w+M3@H~sP{)3jsnq(&7o{QE77x3|TzDSOh|j-VYP}WH!c6t!X&qR$ zTc_p)7=&=3bB(se#!Q*I;;Tj(q{5L+#2<|ch(kY2#1aE@jbyV?!eosuoL`R~+rs2@;#%&h%aro1EAzXXR0kq_)=koGD zhNIkMD5_H~);QS*u>P6wTb@lQxX&uxh+U4R5crXcHd?DD54+>Q3$(S$GcK^Ju$d~R3DSu3te0o8D0>gSq$J!`1f*lLUfygJ74+K#bh7qgrp8saYN6Jh1butH&C!4C-wj|5ZU7BE z0K{aLfMX?f1+l7#^nE#m8S|7w4@&xHy->a39e{m^=HrU}x1(+bL8;fVTx@UL{&;^o z>e)yNvToVT*-6Ldn>TvXaF392Bx_Nf-w;lq8t^u^VpsZTx#X0+Nx91IsgVrma-%>q zMatB81|%QYfV3;yG>2S2`!uHetull%j2nbf@CUm=4c(aWw>*v@rsS9eGn3UgpsB$g zWKAui>>6KD$5hGLDv5_na&gH8KQFGp#N>(0e+`y=JTwJ^&49|lf!{A({7kn-Uyiq* zJOQC~60W~U*0`Lb2N1Im8MRq!OsEnesd+?~h4nu zR}1-UD^Fr6oAS5ea0dX?moxNvtsX{Masi*FXh6`OYywtRu?6qVvYAg_kh0{+fyND~ zQ2m7DV{63sC@RPGABgo}^ZPPlgd)8;gvNc8%V`8UcPlfM>Px|!@U*9qWz82a?Wu+t z*PC1LRbr!n;?j>t8&0~|^GW#1dAb6u817;51&%dw$`F60hwW0SWZcdE43ok&+iOGF z(O;KiuCv-)I9cNg=e)$S?==;ZOA-7}02XHP+9*7fJPLXL0K#-+nqq$OQP9%N*)cG{g?OTPQM)!_QEnXEstjpppr%{IdiX z8cKF={i>NqwF7J4<-3V<$?}X;m7)pTlLH;(j70I||KfDZ-kW}6!4bU|M0W(4r7gC} zww5~nZDI-3zCe27lDS8Wnw0RCxfwA>!P7dUc1#J%nl#(1>7RK}s{`@JzmLDFZ2U3S zriOuY#nZIfZbu^Yzi+_z{srS;Em7qoIS2?ZHnP2gW1atMLH~K)^4eQI42T(|iSdW1 zX}Nqq8=?eO+=~SMLYx2dtla96+Gu+g&oMS(YCHHb<$W3Ovp(d%4S=9usKtRDLOv3Z zBuUsxGI8ue3SL3~{kc@kRREy>l~)dUZiK75g8Se9Q{%7P8me8Eqm;{6WEIVlC+OVi z8^BZjzrUki1cTUC?mO>it4k?Sb@HS~P%p~-@0;vOMWY7z#8OVl?Yn?ItL*>trVWf{ z48O<{|6%J&qk4?o`fs_F;zkZy74fN&(^zT6ZwPeXP@6zJPaFE!~ z;;1^J{HJ~Z(+a29-m?J35>6PzZ5mWDC z=N{=|j8Jt5keF*M%;r6Ap>+BXWC!y1k8*z`0nUU^i9+{;>)>3IaG}2)8hb^|kv#4D zc=J

;(Lk)&xU%=syy@fi1e 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 FV1mx|y Date: Tue, 2 Jul 2024 17:49:52 +0200 Subject: [PATCH 103/179] fix resolver version warning for workspaces in rust2 --- Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 477f20b29ae..c511beee3b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,8 @@ members = [ "src/rust-bridge/test", ] +resolver = "2" + [profile.dev] panic = "abort" From 77054c113429a7c2c7e5efa2d2e962658a8e7e11 Mon Sep 17 00:00:00 2001 From: heinrich5991 Date: Wed, 3 Jul 2024 14:22:15 +0200 Subject: [PATCH 104/179] Use `Client()->PlayerName()` for copied server info Fixes #8554. Alternative to #8555. --- src/engine/client/serverbrowser.cpp | 13 ------------- src/engine/serverbrowser.h | 1 - src/game/client/components/menus_browser.cpp | 8 +++++++- src/game/client/components/menus_ingame.cpp | 10 +++++++++- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index 718eaa7e013..5afe8c626dc 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -2344,16 +2344,3 @@ bool CServerInfo::ParseLocation(int *pResult, const char *pString) } return true; } - -void CServerInfo::InfoToString(char *pBuffer, int BufferSize) const -{ - str_format( - pBuffer, - BufferSize, - "%s\n" - "Address: ddnet://%s\n" - "My IGN: %s\n", - m_aName, - m_aAddress, - g_Config.m_PlayerName); -} diff --git a/src/engine/serverbrowser.h b/src/engine/serverbrowser.h index 5d6d194798f..98af1819226 100644 --- a/src/engine/serverbrowser.h +++ b/src/engine/serverbrowser.h @@ -121,7 +121,6 @@ class CServerInfo static int EstimateLatency(int Loc1, int Loc2); static bool ParseLocation(int *pResult, const char *pString); - void InfoToString(char *pBuffer, int BufferSize) const; }; class CCommunityCountryServer diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 566b12b30c2..0fd4c2fc114 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -1121,7 +1121,13 @@ void CMenus::RenderServerbrowserInfo(CUIRect View) if(DoButton_Menu(&s_CopyButton, Localize("Copy info"), 0, &Button)) { char aInfo[256]; - pSelectedServer->InfoToString(aInfo, sizeof(aInfo)); + str_format( + aInfo, + sizeof(aInfo), + "%s\n" + "Address: ddnet://%s\n", + pSelectedServer->m_aName, + pSelectedServer->m_aAddress); Input()->SetClipboardText(aInfo); } } diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 6f93b15c6c4..a394ca14075 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -419,7 +419,15 @@ void CMenus::RenderServerInfo(CUIRect MainView) if(DoButton_Menu(&s_CopyButton, Localize("Copy info"), 0, &Button)) { char aInfo[256]; - CurrentServerInfo.InfoToString(aInfo, sizeof(aInfo)); + str_format( + aInfo, + sizeof(aInfo), + "%s\n" + "Address: ddnet://%s\n" + "My IGN: %s\n", + CurrentServerInfo.m_aName, + CurrentServerInfo.m_aAddress, + Client()->PlayerName()); Input()->SetClipboardText(aInfo); } } From 3806f324d8ce8bc1a26e99ed9cc8d2f83e18a627 Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Thu, 4 Jul 2024 12:33:15 +0200 Subject: [PATCH 105/179] Version 18.3.1 --- src/game/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/version.h b/src/game/version.h index e64ce8f691e..6143720e670 100644 --- a/src/game/version.h +++ b/src/game/version.h @@ -3,11 +3,11 @@ #ifndef GAME_VERSION_H #define GAME_VERSION_H #ifndef GAME_RELEASE_VERSION -#define GAME_RELEASE_VERSION "18.3" +#define GAME_RELEASE_VERSION "18.3.1" #endif #define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION #define GAME_NETVERSION "0.6 626fce9a778df4d4" -#define DDNET_VERSION_NUMBER 18030 +#define DDNET_VERSION_NUMBER 18031 extern const char *GIT_SHORTREV_HASH; #define GAME_NAME "DDNet" #endif From 429777236bc5ee2de7facb597d0b7c6f802b7fcf Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Thu, 4 Jul 2024 12:31:16 +0200 Subject: [PATCH 106/179] Fix integer overflow when computing tilemap size Cherry-picked from https://github.com/teeworlds/teeworlds/pull/2076/commits/d25869626a8cfbdd320929ba93ce73abed1402ce --- src/engine/shared/map.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/engine/shared/map.cpp b/src/engine/shared/map.cpp index 1abbd50515e..c1f619ea4e9 100644 --- a/src/engine/shared/map.cpp +++ b/src/engine/shared/map.cpp @@ -106,8 +106,17 @@ bool CMap::Load(const char *pMapName) CMapItemLayerTilemap *pTilemap = reinterpret_cast(pLayer); if(pTilemap->m_Version >= CMapItemLayerTilemap::TILE_SKIP_MIN_VERSION) { - const size_t TilemapSize = (size_t)pTilemap->m_Width * pTilemap->m_Height * sizeof(CTile); + const size_t TilemapCount = (size_t)pTilemap->m_Width * pTilemap->m_Height; + const size_t TilemapSize = TilemapCount * sizeof(CTile); + + if(((int)TilemapCount / pTilemap->m_Width != pTilemap->m_Height) || (TilemapSize / sizeof(CTile) != TilemapCount)) + { + log_error("map/load", "map layer too big (%d * %d * %d causes an integer overflow)", pTilemap->m_Width, pTilemap->m_Height, sizeof(CTile)); + return false; + } CTile *pTiles = static_cast(malloc(TilemapSize)); + if(!pTiles) + return false; ExtractTiles(pTiles, (size_t)pTilemap->m_Width * pTilemap->m_Height, static_cast(NewDataFile.GetData(pTilemap->m_Data)), NewDataFile.GetDataSize(pTilemap->m_Data) / sizeof(CTile)); NewDataFile.ReplaceData(pTilemap->m_Data, reinterpret_cast(pTiles), TilemapSize); } From b05ca91a15ac85f1904fb0b282cd354f165238ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sun, 30 Jun 2024 13:45:57 +0200 Subject: [PATCH 107/179] Use `SDL_OpenURL` to open links and files on Android Opening links and files with the `open_link` and `open_file` functions does not work on Android, as the `open_link` function uses `fork` which is not supported on Android. This also seems to cause a strange bug where client networking partially breaks. Currently, after trying to open any link, connecting to servers is not possible anymore but the server browser still works, with the connection getting stuck randomly in the connecting/loading state. SDL implements URL opening, including of file URIs, with the `SDL_OpenURL` function for most systems including Android. However, using `SDL_OpenURL` for all systems has several downsides: 1. The `SDL_OpenURL` function is only available since SDL 2.0.14, in particular not for the Ubuntu 20 CI runner. Hence, we would either have to conditionally compile the link opening function to a null-implementation or fallback to using the existing `open_link` function. 2. We would be undoing some additional fixes in the `open_link` function for Windows, which are not included in the Windows implementation of `SDL_OpenURL`. 3. This would also replace the use of `open` on UNIX with `xdg-open`. 4. This would move the functionality to open links and files from the base to the engine client, so we could not have tools or the server potentially making use of this functionality in the future (e.g. open a folder for convenience). Implementing link and file opening for Android ourselves is too much effort and potentially made even harder by SDL already managing all the unique JVM resources in the `SDLActivity`. Therefore, the `SDL_OpenURL` function is only used for Android, which is always based on the latest SDL2 version. The original `open_link` functionality is kept for the other systems. For this purpose, the `IClient::ViewLink` and `ViewFile` functions are added to wrap `open_link` and `open_file` for the client and also reduce some duplicate code for error logging. Unfortunately, testing also revealed that `SDL_OpenURL` does not currently support opening file URIs, at least not of files the internal storage location, which all the DDNet client's files would be located in. At least opening URLs works and neither breaks networking anymore. --- src/base/system.cpp | 2 + src/base/system.h | 6 ++- src/engine/client.h | 21 +++++++++ src/engine/client/client.cpp | 45 +++++++++++++++++++ src/engine/client/client.h | 3 ++ src/game/client/components/menus.cpp | 5 +-- src/game/client/components/menus_demo.cpp | 5 +-- src/game/client/components/menus_ingame.cpp | 5 +-- src/game/client/components/menus_settings.cpp | 36 +++++---------- .../components/menus_settings_assets.cpp | 5 +-- src/game/client/components/menus_start.cpp | 18 ++------ src/game/editor/editor.cpp | 4 +- 12 files changed, 94 insertions(+), 61 deletions(-) diff --git a/src/base/system.cpp b/src/base/system.cpp index 56df4589cca..ad94f3cc1c0 100644 --- a/src/base/system.cpp +++ b/src/base/system.cpp @@ -4175,6 +4175,7 @@ bool is_process_alive(PROCESS process) #endif } +#if !defined(CONF_PLATFORM_ANDROID) int open_link(const char *link) { #if defined(CONF_FAMILY_WINDOWS) @@ -4236,6 +4237,7 @@ int open_file(const char *path) return open_link(buf); #endif } +#endif // !defined(CONF_PLATFORM_ANDROID) struct SECURE_RANDOM_DATA { diff --git a/src/base/system.h b/src/base/system.h index 704e89356f5..4ac1bbb61b3 100644 --- a/src/base/system.h +++ b/src/base/system.h @@ -2583,6 +2583,7 @@ int kill_process(PROCESS process); */ bool is_process_alive(PROCESS process); +#if !defined(CONF_PLATFORM_ANDROID) /** * Opens a link in the browser. * @@ -2598,11 +2599,11 @@ bool is_process_alive(PROCESS process); int open_link(const char *link); /** - * Opens a file or directory with default program. + * Opens a file or directory with the default program. * * @ingroup Shell * - * @param path The path to open. + * @param path The file or folder to open with the default program. * * @return `1` on success, `0` on failure. * @@ -2610,6 +2611,7 @@ int open_link(const char *link); * @remark This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows. */ int open_file(const char *path); +#endif // !defined(CONF_PLATFORM_ANDROID) /** * @defgroup Secure-Random diff --git a/src/engine/client.h b/src/engine/client.h index 34279ffc358..c07b6e64076 100644 --- a/src/engine/client.h +++ b/src/engine/client.h @@ -289,6 +289,27 @@ class IClient : public IInterface virtual CChecksumData *ChecksumData() = 0; virtual int UdpConnectivity(int NetType) = 0; + /** + * Opens a link in the browser. + * + * @param pLink The link to open in a browser. + * + * @return `true` on success, `false` on failure. + * + * @remark This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows. + */ + virtual bool ViewLink(const char *pLink) = 0; + /** + * Opens a file or directory with the default program. + * + * @param pFilename The file or folder to open with the default program. + * + * @return `true` on success, `false` on failure. + * + * @remark This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows. + */ + virtual bool ViewFile(const char *pFilename) = 0; + #if defined(CONF_FAMILY_WINDOWS) virtual void ShellRegister() = 0; virtual void ShellUnregister() = 0; diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 08c17e6c9e5..17a54b256a3 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -4781,6 +4781,51 @@ int CClient::UdpConnectivity(int NetType) return Connectivity; } +bool CClient::ViewLink(const char *pLink) +{ +#if defined(CONF_PLATFORM_ANDROID) + if(SDL_OpenURL(pLink) == 0) + { + return true; + } + log_error("client", "Failed to open link '%s' (%s)", pLink, SDL_GetError()); + return false; +#else + if(open_link(pLink)) + { + return true; + } + log_error("client", "Failed to open link '%s'", pLink); + return false; +#endif +} + +bool CClient::ViewFile(const char *pFilename) +{ +#if defined(CONF_PLATFORM_MACOS) + return ViewLink(pFilename); +#else + // Create a file link so the path can contain forward and + // backward slashes. But the file link must be absolute. + char aWorkingDir[IO_MAX_PATH_LENGTH]; + if(fs_is_relative_path(pFilename)) + { + if(!fs_getcwd(aWorkingDir, sizeof(aWorkingDir))) + { + log_error("client", "Failed to open file '%s' (failed to get working directory)", pFilename); + return false; + } + str_append(aWorkingDir, "/"); + } + else + aWorkingDir[0] = '\0'; + + char aFileLink[IO_MAX_PATH_LENGTH]; + str_format(aFileLink, sizeof(aFileLink), "file://%s%s", aWorkingDir, pFilename); + return ViewLink(aFileLink); +#endif +} + #if defined(CONF_FAMILY_WINDOWS) void CClient::ShellRegister() { diff --git a/src/engine/client/client.h b/src/engine/client/client.h index bc587744521..0cf3e7b57e9 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -503,6 +503,9 @@ class CClient : public IClient, public CDemoPlayer::IListener CChecksumData *ChecksumData() override { return &m_Checksum.m_Data; } int UdpConnectivity(int NetType) override; + bool ViewLink(const char *pLink) override; + bool ViewFile(const char *pFilename) override; + #if defined(CONF_FAMILY_WINDOWS) void ShellRegister() override; void ShellUnregister() override; diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 9fe01f0b0e4..031ebc9c70b 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -1625,10 +1625,7 @@ void CMenus::RenderPopupFullscreen(CUIRect Screen) static CButtonContainer s_ButtonOpenFolder; if(DoButton_Menu(&s_ButtonOpenFolder, Localize("Videos directory"), 0, &OpenFolder)) { - if(!open_file(aSaveFolder)) - { - dbg_msg("menus", "couldn't open file '%s'", aSaveFolder); - } + Client()->ViewFile(aSaveFolder); } static CButtonContainer s_ButtonOk; diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 1efead6874a..4f61a7b8395 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -1458,10 +1458,7 @@ void CMenus::RenderDemoBrowserButtons(CUIRect ButtonsView, bool WasListboxItemAc { char aBuf[IO_MAX_PATH_LENGTH]; Storage()->GetCompletePath(m_DemolistSelectedIndex >= 0 ? m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType : IStorage::TYPE_SAVE, m_aCurrentDemoFolder[0] == '\0' ? "demos" : m_aCurrentDemoFolder, aBuf, sizeof(aBuf)); - if(!open_file(aBuf)) - { - dbg_msg("menus", "couldn't open file '%s'", aBuf); - } + Client()->ViewFile(aBuf); } GameClient()->m_Tooltips.DoToolTip(&s_DemosDirectoryButton, &DemosDirectoryButton, Localize("Open the directory that contains the demo files")); } diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index a394ca14075..3a5f604a76c 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -1166,10 +1166,7 @@ void CMenus::RenderGhost(CUIRect MainView) char aBuf[IO_MAX_PATH_LENGTH]; Storage()->GetCompletePath(IStorage::TYPE_SAVE, "ghosts", aBuf, sizeof(aBuf)); Storage()->CreateFolder("ghosts", IStorage::TYPE_SAVE); - if(!open_file(aBuf)) - { - dbg_msg("menus", "couldn't open file '%s'", aBuf); - } + Client()->ViewFile(aBuf); } Status.VSplitLeft(5.0f, &Button, &Status); diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 00be5dd4923..8172b46a500 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -77,8 +77,8 @@ bool CMenusKeyBinder::OnInput(const IInput::CEvent &Event) void CMenus::RenderSettingsGeneral(CUIRect MainView) { char aBuf[128 + IO_MAX_PATH_LENGTH]; - CUIRect Label, Button, Left, Right, Game, Client; - MainView.HSplitTop(150.0f, &Game, &Client); + CUIRect Label, Button, Left, Right, Game, ClientSettings; + MainView.HSplitTop(150.0f, &Game, &ClientSettings); // game { @@ -139,10 +139,10 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView) // client { // headline - Client.HSplitTop(30.0f, &Label, &Client); + ClientSettings.HSplitTop(30.0f, &Label, &ClientSettings); Ui()->DoLabel(&Label, Localize("Client"), 20.0f, TEXTALIGN_ML); - Client.HSplitTop(5.0f, nullptr, &Client); - Client.VSplitMid(&Left, &Right, 20.0f); + ClientSettings.HSplitTop(5.0f, nullptr, &ClientSettings); + ClientSettings.VSplitMid(&Left, &Right, 20.0f); // skip main menu Left.HSplitTop(20.0f, &Button, &Left); @@ -165,10 +165,7 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView) if(DoButton_Menu(&s_SettingsButtonId, Localize("Settings file"), 0, &SettingsButton)) { Storage()->GetCompletePath(IStorage::TYPE_SAVE, CONFIG_FILE, aBuf, sizeof(aBuf)); - if(!open_file(aBuf)) - { - dbg_msg("menus", "couldn't open file '%s'", aBuf); - } + Client()->ViewFile(aBuf); } GameClient()->m_Tooltips.DoToolTip(&s_SettingsButtonId, &SettingsButton, Localize("Open the settings file")); @@ -179,10 +176,7 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView) if(DoButton_Menu(&s_ConfigButtonId, Localize("Config directory"), 0, &ConfigButton)) { Storage()->GetCompletePath(IStorage::TYPE_SAVE, "", aBuf, sizeof(aBuf)); - if(!open_file(aBuf)) - { - dbg_msg("menus", "couldn't open file '%s'", aBuf); - } + Client()->ViewFile(aBuf); } GameClient()->m_Tooltips.DoToolTip(&s_ConfigButtonId, &ConfigButton, Localize("Open the directory that contains the configuration and user files")); @@ -194,10 +188,7 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView) { Storage()->GetCompletePath(IStorage::TYPE_SAVE, "themes", aBuf, sizeof(aBuf)); Storage()->CreateFolder("themes", IStorage::TYPE_SAVE); - if(!open_file(aBuf)) - { - dbg_msg("menus", "couldn't open file '%s'", aBuf); - } + Client()->ViewFile(aBuf); } GameClient()->m_Tooltips.DoToolTip(&s_ThemesButtonId, &DirectoryButton, Localize("Open the directory to add custom themes")); @@ -938,11 +929,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView) static CButtonContainer s_SkinDatabaseButton; if(DoButton_Menu(&s_SkinDatabaseButton, Localize("Skin Database"), 0, &DatabaseButton)) { - const char *pLink = "https://ddnet.org/skins/"; - if(!open_link(pLink)) - { - dbg_msg("menus", "couldn't open link '%s'", pLink); - } + Client()->ViewLink("https://ddnet.org/skins/"); } static CButtonContainer s_DirectoryButton; @@ -950,10 +937,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView) { Storage()->GetCompletePath(IStorage::TYPE_SAVE, "skins", aBuf, sizeof(aBuf)); Storage()->CreateFolder("skins", IStorage::TYPE_SAVE); - if(!open_file(aBuf)) - { - dbg_msg("menus", "couldn't open file '%s'", aBuf); - } + Client()->ViewFile(aBuf); } GameClient()->m_Tooltips.DoToolTip(&s_DirectoryButton, &DirectoryButton, Localize("Open the directory to add custom skins")); diff --git a/src/game/client/components/menus_settings_assets.cpp b/src/game/client/components/menus_settings_assets.cpp index c631547e416..a8a0e807eaa 100644 --- a/src/game/client/components/menus_settings_assets.cpp +++ b/src/game/client/components/menus_settings_assets.cpp @@ -648,10 +648,7 @@ void CMenus::RenderSettingsCustom(CUIRect MainView) Storage()->GetCompletePath(IStorage::TYPE_SAVE, aBufFull, aBuf, sizeof(aBuf)); Storage()->CreateFolder("assets", IStorage::TYPE_SAVE); Storage()->CreateFolder(aBufFull, IStorage::TYPE_SAVE); - if(!open_file(aBuf)) - { - dbg_msg("menus", "couldn't open file '%s'", aBuf); - } + Client()->ViewFile(aBuf); } GameClient()->m_Tooltips.DoToolTip(&s_AssetsDirId, &DirectoryButton, Localize("Open the directory to add custom assets")); diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index ec505159b0b..b862c018f75 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -43,11 +43,7 @@ void CMenus::RenderStartMenu(CUIRect MainView) static CButtonContainer s_DiscordButton; if(DoButton_Menu(&s_DiscordButton, Localize("Discord"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) { - const char *pLink = Localize("https://ddnet.org/discord"); - if(!open_link(pLink)) - { - dbg_msg("menus", "couldn't open link '%s'", pLink); - } + Client()->ViewLink(Localize("https://ddnet.org/discord")); } ExtMenu.HSplitBottom(5.0f, &ExtMenu, 0); // little space @@ -55,11 +51,7 @@ void CMenus::RenderStartMenu(CUIRect MainView) static CButtonContainer s_LearnButton; if(DoButton_Menu(&s_LearnButton, Localize("Learn"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) { - const char *pLink = Localize("https://wiki.ddnet.org/"); - if(!open_link(pLink)) - { - dbg_msg("menus", "couldn't open link '%s'", pLink); - } + Client()->ViewLink(Localize("https://wiki.ddnet.org/")); } ExtMenu.HSplitBottom(5.0f, &ExtMenu, 0); // little space @@ -96,11 +88,7 @@ void CMenus::RenderStartMenu(CUIRect MainView) static CButtonContainer s_WebsiteButton; if(DoButton_Menu(&s_WebsiteButton, Localize("Website"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) { - const char *pLink = "https://ddnet.org/"; - if(!open_link(pLink)) - { - dbg_msg("menus", "couldn't open link '%s'", pLink); - } + Client()->ViewLink("https://ddnet.org/"); } ExtMenu.HSplitBottom(5.0f, &ExtMenu, 0); // little space diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 997d38be381..a203a5e37ee 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -5396,7 +5396,7 @@ void CEditor::RenderFileDialog() { char aOpenPath[IO_MAX_PATH_LENGTH]; Storage()->GetCompletePath(m_FilesSelectedIndex >= 0 ? m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType : IStorage::TYPE_SAVE, m_pFileDialogPath, aOpenPath, sizeof(aOpenPath)); - if(!open_file(aOpenPath)) + if(!Client()->ViewFile(aOpenPath)) { ShowFileDialogError("Failed to open the directory '%s'.", aOpenPath); } @@ -7712,7 +7712,7 @@ void CEditor::RenderMenubar(CUIRect MenuBar) if(DoButton_Editor(&s_HelpButton, "?", 0, &Help, 0, "[F1] Open the DDNet Wiki page for the Map Editor in a web browser") || (Input()->KeyPress(KEY_F1) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr)) { const char *pLink = Localize("https://wiki.ddnet.org/wiki/Mapping"); - if(!open_link(pLink)) + if(!Client()->ViewLink(pLink)) { ShowFileDialogError("Failed to open the link '%s' in the default web browser.", pLink); } From 4f0ba0d5fa11b83033dd403159f5ebcd3170252c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 3 Jul 2024 18:07:41 +0200 Subject: [PATCH 108/179] Fix rustup toolchain overrides not working with MSVC Use the build folder as the working directory for the cargo build so rustup overrides of individual build folders are respected. --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e215f8e3ffe..da8182175e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -911,6 +911,7 @@ else() endif() endif() list(APPEND CARGO_BUILD $<$>:--release>) +list(APPEND CARGO_BUILD --manifest-path "${PROJECT_SOURCE_DIR}/Cargo.toml") if(CMAKE_OSX_ARCHITECTURES) set(RUST_OSX_ARCHITECTURES) @@ -949,7 +950,7 @@ if(NOT CMAKE_OSX_ARCHITECTURES) add_custom_command( OUTPUT ${RUST_OUTPUTS} COMMAND ${CARGO_BUILD} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} USES_TERMINAL DEPENDS ${RUST_SRC} ) @@ -982,7 +983,7 @@ else() add_custom_command( OUTPUT ${RUST_OUTPUTS} COMMAND ${CARGO_BUILD} --target=${arch} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} USES_TERMINAL DEPENDS ${RUST_SRC} ) From ecafa10dfae95ae4fbb1edce229cb62520a0db51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Fri, 5 Jul 2024 20:13:32 +0200 Subject: [PATCH 109/179] Fix server crash when starting with `random(_unfinished)_map` See #8559. --- src/game/server/gamecontext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 5a48cf25290..dc3197e28ca 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -3549,8 +3549,8 @@ void CGameContext::OnConsoleInit() Console()->Register("switch_open", "i[switch]", CFGFLAG_SERVER | CFGFLAG_GAME, ConSwitchOpen, this, "Whether a switch is deactivated by default (otherwise activated)"); Console()->Register("pause_game", "", CFGFLAG_SERVER, ConPause, this, "Pause/unpause game"); Console()->Register("change_map", "r[map]", CFGFLAG_SERVER | CFGFLAG_STORE, ConChangeMap, this, "Change map"); - Console()->Register("random_map", "?i[stars]", CFGFLAG_SERVER, ConRandomMap, this, "Random map"); - Console()->Register("random_unfinished_map", "?i[stars]", CFGFLAG_SERVER, ConRandomUnfinishedMap, this, "Random unfinished map"); + Console()->Register("random_map", "?i[stars]", CFGFLAG_SERVER | CFGFLAG_STORE, ConRandomMap, this, "Random map"); + Console()->Register("random_unfinished_map", "?i[stars]", CFGFLAG_SERVER | CFGFLAG_STORE, ConRandomUnfinishedMap, this, "Random unfinished map"); Console()->Register("restart", "?i[seconds]", CFGFLAG_SERVER | CFGFLAG_STORE, ConRestart, this, "Restart in x seconds (0 = abort)"); Console()->Register("broadcast", "r[message]", CFGFLAG_SERVER, ConBroadcast, this, "Broadcast message"); Console()->Register("say", "r[message]", CFGFLAG_SERVER, ConSay, this, "Say in chat"); From c8656635b9edcbf6e09cc4ad8d3a3e89a675f224 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 11 May 2024 12:51:41 +0800 Subject: [PATCH 110/179] Show help text when chaining multiple commands --- src/game/client/components/console.cpp | 11 ++++++++++- src/game/client/components/console.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index 10f51e954c3..c45bc461bd6 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -324,6 +324,14 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const pInstance->m_Input.Set(pStr); } +void CGameConsole::CInstance::GetCommand(char *pBuf, size_t Size) const +{ + const char *pInput = GetString(); + while(str_find(pInput, ";")) + pInput = str_find(pInput, ";") + 1; + StrCopyUntilSpace(pBuf, Size, pInput); +} + static void StrCopyUntilSpace(char *pDest, size_t DestSize, const char *pSrc) { const char *pSpace = str_find(pSrc, " "); @@ -582,7 +590,8 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) // find the current command { char aBuf[IConsole::CMDLINE_LENGTH]; - StrCopyUntilSpace(aBuf, sizeof(aBuf), GetString()); + GetCommand(aBuf, sizeof(aBuf)); + const IConsole::CCommandInfo *pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf, m_CompletionFlagmask, m_Type != CGameConsole::CONSOLETYPE_LOCAL && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands()); if(pCommand) diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index a4f9c9cd1bc..08da34b4957 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -113,6 +113,7 @@ class CGameConsole : public CComponent void Dump() REQUIRES(!m_BacklogPendingLock); const char *GetString() const { return m_Input.GetString(); } + void GetCommand(char *pBuf, size_t Size) const; static void PossibleCommandsCompleteCallback(int Index, const char *pStr, void *pUser); static void PossibleArgumentsCompleteCallback(int Index, const char *pStr, void *pUser); From 89437b7ef7c1dd6ab4c412786acbc8cfff3d1190 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 11 May 2024 13:12:32 +0800 Subject: [PATCH 111/179] Fix console search with multiple commands --- src/game/client/components/console.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index c45bc461bd6..cfd936f58b4 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -324,12 +324,11 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const pInstance->m_Input.Set(pStr); } -void CGameConsole::CInstance::GetCommand(char *pBuf, size_t Size) const +const char *CGameConsole::CInstance::GetCommand(const char *pInput) const { - const char *pInput = GetString(); while(str_find(pInput, ";")) pInput = str_find(pInput, ";") + 1; - StrCopyUntilSpace(pBuf, Size, pInput); + return pInput; } static void StrCopyUntilSpace(char *pDest, size_t DestSize, const char *pSrc) @@ -590,7 +589,7 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) // find the current command { char aBuf[IConsole::CMDLINE_LENGTH]; - GetCommand(aBuf, sizeof(aBuf)); + StrCopyUntilSpace(aBuf, sizeof(aBuf), GetCommand(GetString())); const IConsole::CCommandInfo *pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf, m_CompletionFlagmask, m_Type != CGameConsole::CONSOLETYPE_LOCAL && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands()); @@ -1120,7 +1119,8 @@ void CGameConsole::OnRender() Info.m_pOffsetChange = &pConsole->m_CompletionRenderOffsetChange; Info.m_Width = Screen.w; Info.m_TotalWidth = 0.0f; - Info.m_pCurrentCmd = pConsole->m_aCompletionBuffer; + Info.m_pCurrentCmd = pConsole->GetCommand(pConsole->m_aCompletionBuffer); + TextRender()->SetCursor(&Info.m_Cursor, InitialX - Info.m_Offset, InitialY + RowHeight + 2.0f, FONT_SIZE, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); Info.m_Cursor.m_LineWidth = std::numeric_limits::max(); const int NumCommands = m_pConsole->PossibleCommands(Info.m_pCurrentCmd, pConsole->m_CompletionFlagmask, m_ConsoleType != CGameConsole::CONSOLETYPE_LOCAL && Client()->RconAuthed() && Client()->UseTempRconCommands(), PossibleCommandsRenderCallback, &Info); From 54977d574595250be3be83f99cd9c5a54b5b4f5a Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 11 May 2024 13:41:41 +0800 Subject: [PATCH 112/179] Auto complete when chaining multiple commands closed #7966 --- src/game/client/components/console.cpp | 15 ++++++++++++--- src/game/client/components/console.h | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index cfd936f58b4..9410e602a8c 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -321,7 +321,13 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const { CGameConsole::CInstance *pInstance = (CGameConsole::CInstance *)pUser; if(pInstance->m_CompletionChosen == Index) - pInstance->m_Input.Set(pStr); + { + char aCurrent[512]; + str_truncate(aCurrent, sizeof(aCurrent), pInstance->m_aCompletionBuffer, pInstance->m_CompletionCommandStart); + char aBuf[512]; + str_format(aBuf, sizeof(aBuf), "%s%s", aCurrent, pStr); + pInstance->m_Input.Set(aBuf); + } } const char *CGameConsole::CInstance::GetCommand(const char *pInput) const @@ -452,9 +458,12 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) if(!m_Searching) { + const char *pSearch = GetCommand(m_aCompletionBuffer); + m_CompletionCommandStart = pSearch - m_aCompletionBuffer; + // command completion const bool UseTempCommands = m_Type == CGameConsole::CONSOLETYPE_REMOTE && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands(); - int CompletionEnumerationCount = m_pGameConsole->m_pConsole->PossibleCommands(m_aCompletionBuffer, m_CompletionFlagmask, UseTempCommands); + int CompletionEnumerationCount = m_pGameConsole->m_pConsole->PossibleCommands(pSearch, m_CompletionFlagmask, UseTempCommands); if(m_Type == CGameConsole::CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) { if(CompletionEnumerationCount) @@ -463,7 +472,7 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) m_CompletionChosen = 0; m_CompletionChosen = (m_CompletionChosen + Direction + CompletionEnumerationCount) % CompletionEnumerationCount; m_CompletionArgumentPosition = 0; - m_pGameConsole->m_pConsole->PossibleCommands(m_aCompletionBuffer, m_CompletionFlagmask, UseTempCommands, PossibleCommandsCompleteCallback, this); + m_pGameConsole->m_pConsole->PossibleCommands(pSearch, m_CompletionFlagmask, UseTempCommands, PossibleCommandsCompleteCallback, this); } else if(m_CompletionChosen != -1) { diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index 08da34b4957..7e3df01431c 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -69,6 +69,7 @@ class CGameConsole : public CComponent float m_CompletionRenderOffset; float m_CompletionRenderOffsetChange; int m_CompletionArgumentPosition; + int m_CompletionCommandStart = 0; char m_aUser[32]; bool m_UserGot; From 6b0b49e4143a0cddf404a2d300be056c18555439 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sun, 12 May 2024 07:44:54 +0800 Subject: [PATCH 113/179] Look at command under cursor not at the end of the line --- src/base/system.cpp | 32 +++++++++++++++ src/base/system.h | 15 +++++++ src/game/client/components/console.cpp | 30 ++++++++------ src/game/client/components/console.h | 16 +++++++- src/test/str.cpp | 56 ++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 14 deletions(-) diff --git a/src/base/system.cpp b/src/base/system.cpp index 56df4589cca..91d4e7cd7c8 100644 --- a/src/base/system.cpp +++ b/src/base/system.cpp @@ -3155,6 +3155,38 @@ const char *str_find(const char *haystack, const char *needle) return 0; } +bool str_delimiters_around_offset(const char *haystack, const char *delim, int offset, int *start, int *end) +{ + bool found = true; + const char *search = haystack; + const int delim_len = str_length(delim); + *start = 0; + while(str_find(search, delim)) + { + const char *test = str_find(search, delim) + delim_len; + int distance = test - haystack; + if(distance > offset) + break; + + *start = distance; + search = test; + } + if(search == haystack) + found = false; + + if(str_find(search, delim)) + { + *end = str_find(search, delim) - haystack; + } + else + { + *end = str_length(haystack); + found = false; + } + + return found; +} + const char *str_rchr(const char *haystack, char needle) { return strrchr(haystack, needle); diff --git a/src/base/system.h b/src/base/system.h index 704e89356f5..f3bf7b7496a 100644 --- a/src/base/system.h +++ b/src/base/system.h @@ -1605,6 +1605,21 @@ const char *str_find_nocase(const char *haystack, const char *needle); */ const char *str_find(const char *haystack, const char *needle); +/* + Function: str_delimiters_around_offset + Parameters: + haystack - String to search in + needle - String to search for + + Returns: + true if both delimiters were found + false if a delimiter is missing (it uses haystart start and end as fallback) + + Remarks: + - The strings are treated as zero-terminated strings. +*/ +bool str_delimiters_around_offset(const char *haystay, const char *delim, int offset, int *start, int *end); + /** * Finds the last occurrence of a character * diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index 9410e602a8c..d2b1b2d3bbf 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -322,19 +322,19 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const CGameConsole::CInstance *pInstance = (CGameConsole::CInstance *)pUser; if(pInstance->m_CompletionChosen == Index) { - char aCurrent[512]; - str_truncate(aCurrent, sizeof(aCurrent), pInstance->m_aCompletionBuffer, pInstance->m_CompletionCommandStart); + char aBefore[512]; + str_truncate(aBefore, sizeof(aBefore), pInstance->m_aCompletionBuffer, pInstance->m_CompletionCommandStart); char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "%s%s", aCurrent, pStr); + str_format(aBuf, sizeof(aBuf), "%s%s%s", aBefore, pStr, pInstance->m_aCompletionBuffer + pInstance->m_CompletionCommandEnd); pInstance->m_Input.Set(aBuf); + pInstance->m_Input.SetCursorOffset(str_length(pStr) + pInstance->m_CompletionCommandStart); } } -const char *CGameConsole::CInstance::GetCommand(const char *pInput) const +void CGameConsole::CInstance::GetCommand(const char *pInput, char *pCmd, size_t CmdSize) { - while(str_find(pInput, ";")) - pInput = str_find(pInput, ";") + 1; - return pInput; + str_delimiters_around_offset(pInput, ";", m_Input.GetCursorOffset(), &m_CompletionCommandStart, &m_CompletionCommandEnd); + str_truncate(pCmd, CmdSize, pInput + m_CompletionCommandStart, m_CompletionCommandEnd - m_CompletionCommandStart); } static void StrCopyUntilSpace(char *pDest, size_t DestSize, const char *pSrc) @@ -458,12 +458,12 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) if(!m_Searching) { - const char *pSearch = GetCommand(m_aCompletionBuffer); - m_CompletionCommandStart = pSearch - m_aCompletionBuffer; + char aSearch[128]; + GetCommand(m_aCompletionBuffer, aSearch, sizeof(aSearch)); // command completion const bool UseTempCommands = m_Type == CGameConsole::CONSOLETYPE_REMOTE && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands(); - int CompletionEnumerationCount = m_pGameConsole->m_pConsole->PossibleCommands(pSearch, m_CompletionFlagmask, UseTempCommands); + int CompletionEnumerationCount = m_pGameConsole->m_pConsole->PossibleCommands(aSearch, m_CompletionFlagmask, UseTempCommands); if(m_Type == CGameConsole::CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) { if(CompletionEnumerationCount) @@ -472,7 +472,7 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) m_CompletionChosen = 0; m_CompletionChosen = (m_CompletionChosen + Direction + CompletionEnumerationCount) % CompletionEnumerationCount; m_CompletionArgumentPosition = 0; - m_pGameConsole->m_pConsole->PossibleCommands(pSearch, m_CompletionFlagmask, UseTempCommands, PossibleCommandsCompleteCallback, this); + m_pGameConsole->m_pConsole->PossibleCommands(aSearch, m_CompletionFlagmask, UseTempCommands, PossibleCommandsCompleteCallback, this); } else if(m_CompletionChosen != -1) { @@ -597,8 +597,10 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) // find the current command { + char aCmd[128]; + GetCommand(GetString(), aCmd, sizeof(aCmd)); char aBuf[IConsole::CMDLINE_LENGTH]; - StrCopyUntilSpace(aBuf, sizeof(aBuf), GetCommand(GetString())); + StrCopyUntilSpace(aBuf, sizeof(aBuf), aCmd); const IConsole::CCommandInfo *pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf, m_CompletionFlagmask, m_Type != CGameConsole::CONSOLETYPE_LOCAL && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands()); @@ -1128,7 +1130,9 @@ void CGameConsole::OnRender() Info.m_pOffsetChange = &pConsole->m_CompletionRenderOffsetChange; Info.m_Width = Screen.w; Info.m_TotalWidth = 0.0f; - Info.m_pCurrentCmd = pConsole->GetCommand(pConsole->m_aCompletionBuffer); + char aCmd[128]; + pConsole->GetCommand(pConsole->m_aCompletionBuffer, aCmd, sizeof(aCmd)); + Info.m_pCurrentCmd = aCmd; TextRender()->SetCursor(&Info.m_Cursor, InitialX - Info.m_Offset, InitialY + RowHeight + 2.0f, FONT_SIZE, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); Info.m_Cursor.m_LineWidth = std::numeric_limits::max(); diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index 7e3df01431c..c54809c0543 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -70,6 +70,7 @@ class CGameConsole : public CComponent float m_CompletionRenderOffsetChange; int m_CompletionArgumentPosition; int m_CompletionCommandStart = 0; + int m_CompletionCommandEnd = 0; char m_aUser[32]; bool m_UserGot; @@ -114,7 +115,20 @@ class CGameConsole : public CComponent void Dump() REQUIRES(!m_BacklogPendingLock); const char *GetString() const { return m_Input.GetString(); } - void GetCommand(char *pBuf, size_t Size) const; + /** + * Gets the command at the current cursor including surrounding spaces. + * Commands are split by semicolons. + * + * So if the current console input is for example "hello; world ;foo" + * ^ + * and the cursor is here -------------/ + * The result would be " world " + * + * @param pInput the console input line + * @param pCmd the command the cursor is at + * @param CmdSize size of the pCmd buffer + */ + void GetCommand(const char *pInput, char *pCmd, size_t CmdSize); static void PossibleCommandsCompleteCallback(int Index, const char *pStr, void *pUser); static void PossibleArgumentsCompleteCallback(int Index, const char *pStr, void *pUser); diff --git a/src/test/str.cpp b/src/test/str.cpp index dde5edd2715..9dcbb6bbed7 100644 --- a/src/test/str.cpp +++ b/src/test/str.cpp @@ -4,6 +4,62 @@ #include +TEST(Str, StrDelim) +{ + int Start, End; + // 0123456 + // 01234567891111111 + str_delimiters_around_offset("123;123456789;aaa", ";", 5, &Start, &End); + EXPECT_EQ(Start, 4); + EXPECT_EQ(End, 13); + + str_delimiters_around_offset("123;123", ";", 1, &Start, &End); + EXPECT_EQ(Start, 0); + EXPECT_EQ(End, 3); + + str_delimiters_around_offset("---foo---bar---baz---hello", "---", 1, &Start, &End); + EXPECT_EQ(Start, 0); + EXPECT_EQ(End, 0); + + str_delimiters_around_offset("---foo---bar---baz---hello", "---", 2, &Start, &End); + EXPECT_EQ(Start, 0); + EXPECT_EQ(End, 0); + + str_delimiters_around_offset("---foo---bar---baz---hello", "---", 3, &Start, &End); + EXPECT_EQ(Start, 3); + EXPECT_EQ(End, 6); + + str_delimiters_around_offset("---foo---bar---baz---hello", "---", 4, &Start, &End); + EXPECT_EQ(Start, 3); + EXPECT_EQ(End, 6); + + str_delimiters_around_offset("---foo---bar---baz---hello", "---", 9, &Start, &End); + EXPECT_EQ(Start, 9); + EXPECT_EQ(End, 12); + + str_delimiters_around_offset("---foo---bar---baz---hello", "---", 22, &Start, &End); + EXPECT_EQ(Start, 21); + EXPECT_EQ(End, 26); + + str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 2, &Start, &End); + EXPECT_EQ(Start, 0); + EXPECT_EQ(End, 3); + + str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 3, &Start, &End); + EXPECT_EQ(Start, 0); + EXPECT_EQ(End, 3); + + bool Found = str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 4, &Start, &End); + EXPECT_EQ(Found, true); + EXPECT_EQ(Start, 4); + EXPECT_EQ(End, 4); + + Found = str_delimiters_around_offset("", ";", 4, &Start, &End); + EXPECT_EQ(Found, false); + EXPECT_EQ(Start, 0); + EXPECT_EQ(End, 0); +} + TEST(Str, StrIsNum) { EXPECT_EQ(str_isnum('/'), false); From 5d43d346e71a138f29175225af0050cf28e81453 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sun, 12 May 2024 11:21:38 +0800 Subject: [PATCH 114/179] Also split commands on double quotes --- src/game/client/components/console.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index d2b1b2d3bbf..e99bfd586f9 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -322,9 +322,9 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const CGameConsole::CInstance *pInstance = (CGameConsole::CInstance *)pUser; if(pInstance->m_CompletionChosen == Index) { - char aBefore[512]; + char aBefore[IConsole::CMDLINE_LENGTH]; str_truncate(aBefore, sizeof(aBefore), pInstance->m_aCompletionBuffer, pInstance->m_CompletionCommandStart); - char aBuf[512]; + char aBuf[IConsole::CMDLINE_LENGTH]; str_format(aBuf, sizeof(aBuf), "%s%s%s", aBefore, pStr, pInstance->m_aCompletionBuffer + pInstance->m_CompletionCommandEnd); pInstance->m_Input.Set(aBuf); pInstance->m_Input.SetCursorOffset(str_length(pStr) + pInstance->m_CompletionCommandStart); @@ -334,6 +334,12 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const void CGameConsole::CInstance::GetCommand(const char *pInput, char *pCmd, size_t CmdSize) { str_delimiters_around_offset(pInput, ";", m_Input.GetCursorOffset(), &m_CompletionCommandStart, &m_CompletionCommandEnd); + char aCmd[IConsole::CMDLINE_LENGTH]; + str_truncate(aCmd, sizeof(aCmd), pInput + m_CompletionCommandStart, m_CompletionCommandEnd - m_CompletionCommandStart); + int Start, End; + str_delimiters_around_offset(aCmd, "\"", m_Input.GetCursorOffset() - m_CompletionCommandStart, &Start, &End); + m_CompletionCommandStart += Start; + m_CompletionCommandEnd = m_CompletionCommandStart + (End - Start); str_truncate(pCmd, CmdSize, pInput + m_CompletionCommandStart, m_CompletionCommandEnd - m_CompletionCommandStart); } @@ -597,7 +603,7 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) // find the current command { - char aCmd[128]; + char aCmd[IConsole::CMDLINE_LENGTH]; GetCommand(GetString(), aCmd, sizeof(aCmd)); char aBuf[IConsole::CMDLINE_LENGTH]; StrCopyUntilSpace(aBuf, sizeof(aBuf), aCmd); From 43a493445ba08e1f75ec706a9ced02be5ac53b7c Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sun, 12 May 2024 11:37:28 +0800 Subject: [PATCH 115/179] Also split commands on spaces --- src/game/client/components/console.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index e99bfd586f9..071ebb0aff8 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -333,14 +333,22 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const void CGameConsole::CInstance::GetCommand(const char *pInput, char *pCmd, size_t CmdSize) { - str_delimiters_around_offset(pInput, ";", m_Input.GetCursorOffset(), &m_CompletionCommandStart, &m_CompletionCommandEnd); - char aCmd[IConsole::CMDLINE_LENGTH]; - str_truncate(aCmd, sizeof(aCmd), pInput + m_CompletionCommandStart, m_CompletionCommandEnd - m_CompletionCommandStart); + char aInput[IConsole::CMDLINE_LENGTH]; + str_copy(aInput, pInput); int Start, End; - str_delimiters_around_offset(aCmd, "\"", m_Input.GetCursorOffset() - m_CompletionCommandStart, &Start, &End); - m_CompletionCommandStart += Start; - m_CompletionCommandEnd = m_CompletionCommandStart + (End - Start); - str_truncate(pCmd, CmdSize, pInput + m_CompletionCommandStart, m_CompletionCommandEnd - m_CompletionCommandStart); + m_CompletionCommandStart = 0; + m_CompletionCommandEnd = 0; + + char aaSeperators[][2] = {";", "\"", " "}; + for(auto *pSeperator : aaSeperators) + { + str_delimiters_around_offset(aInput + m_CompletionCommandStart, pSeperator, m_Input.GetCursorOffset() - m_CompletionCommandStart, &Start, &End); + m_CompletionCommandStart += Start; + m_CompletionCommandEnd = m_CompletionCommandStart + (End - Start); + aInput[m_CompletionCommandEnd] = '\0'; + } + + str_copy(pCmd, aInput + m_CompletionCommandStart, CmdSize); } static void StrCopyUntilSpace(char *pDest, size_t DestSize, const char *pSrc) From 7553ea6297ceff162f731f26f4f5d1d0515757d9 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 6 Jul 2024 09:44:29 +0800 Subject: [PATCH 116/179] Improve clang variable naming checks Introduces checks for more variable types. And fixes false positives in newer clang versions. --- .clang-tidy | 14 ++++++++++++-- src/engine/client/serverbrowser.cpp | 8 ++++---- src/game/client/components/race_demo.cpp | 6 +++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index aecaa3f1566..8bc3f0284e3 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -111,8 +111,18 @@ CheckOptions: value: CamelCase - key: readability-identifier-naming.ClassMemberCase value: CamelCase - - key: readability-identifier-naming.ClassMemberPrefix + - key: readability-identifier-naming.MemberCase + value: CamelCase + - key: readability-identifier-naming.MemberPrefix value: m_ + - key: readability-identifier-naming.MemberIgnoredRegexp + value: '^(m_ap|m_v|m_p|m_a|ms_p|[a-z]$).*' + - key: readability-identifier-naming.ClassMemberPrefix + value: ms_ + - key: readability-identifier-naming.StaticVariablePrefix + value: s_ + - key: readability-identifier-naming.StaticVariableIgnoredRegexp + value: '^(NullAddr$|aDummyNameBuf$|aModifier$|EXPLANATION$|LocalClientId$|Dir$|LOCATION_NAMES$|EditorHotkeyWasPressed$|EditorHotKeyChecktime$|FrictionFraction$|LastTime$|SkidSoundTime$|NewVal$|aRotated$).*' - key: readability-identifier-naming.ClassMethodCase value: CamelCase - key: readability-identifier-naming.ClassCase @@ -132,7 +142,7 @@ CheckOptions: - key: readability-identifier-naming.ClassMethodIgnoredRegexp value: '^(Con_).*' - key: readability-identifier-naming.ClassMemberIgnoredRegexp - value: '^(ms_aStandardScreen$|s_1024x1024ImgSize$|s_ImageBufferCacheId$|s_VertexBufferCacheId$|s_StagingBufferImageCacheId$|REPLACEMENT_CHARACTER$|(MAX|MIN)_FONT_SIZE$|MAXIMUM_ATLAS_DIMENSION$|INITIAL_ATLAS_DIMENSION$|MAX_SECTION_DIMENSION_MAPPED$|MIN_SECTION_DIMENSION$|s_StagingBufferCacheId$|ms_MainThreadIndex$).*' + value: '^(m_a|m_v|m_p|ms_p|ms_a|ms_v|s_1024x1024ImgSize$|s_ImageBufferCacheId$|s_VertexBufferCacheId$|s_StagingBufferImageCacheId$|REPLACEMENT_CHARACTER$|(MAX|MIN)_FONT_SIZE$|MAXIMUM_ATLAS_DIMENSION$|INITIAL_ATLAS_DIMENSION$|MAX_SECTION_DIMENSION_MAPPED$|MIN_SECTION_DIMENSION$|s_StagingBufferCacheId$).*' - key: readability-identifier-naming.LocalConstantIgnoredRegexp value: '^(p|a|v|s_|MAX_ANIM_SPEED$|DATA_OFFSET$|HEADER_LEN$|MIN_ANIM_SPEED$|[hwdcbqstf]$|[xt][0123]$|result$|sub$|it$|len$|d[xy]$).*' - key: readability-identifier-naming.LocalVariableIgnoredRegexp diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index 5afe8c626dc..4c577ad4997 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -739,11 +739,11 @@ void CServerBrowser::SetInfo(CServerEntry *pEntry, const CServerInfo &Info) cons class CPlayerScoreNameLess { - const int ScoreKind; + const int m_ScoreKind; public: CPlayerScoreNameLess(int ClientScoreKind) : - ScoreKind(ClientScoreKind) + m_ScoreKind(ClientScoreKind) { } @@ -758,7 +758,7 @@ void CServerBrowser::SetInfo(CServerEntry *pEntry, const CServerInfo &Info) cons int Score0 = p0.m_Score; int Score1 = p1.m_Score; - if(ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME || ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME_BACKCOMPAT) + if(m_ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME || m_ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME_BACKCOMPAT) { // Sort unfinished (-9999) and still connecting players (-1) after others if(Score0 < 0 && Score1 >= 0) @@ -770,7 +770,7 @@ void CServerBrowser::SetInfo(CServerEntry *pEntry, const CServerInfo &Info) cons if(Score0 != Score1) { // Handle the sign change introduced with CLIENT_SCORE_KIND_TIME - if(ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME) + if(m_ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME) return Score0 < Score1; else return Score0 > Score1; diff --git a/src/game/client/components/race_demo.cpp b/src/game/client/components/race_demo.cpp index 53af258ab1c..3caef01080a 100644 --- a/src/game/client/components/race_demo.cpp +++ b/src/game/client/components/race_demo.cpp @@ -29,7 +29,7 @@ struct CDemoListParam { const CRaceDemo *m_pThis; std::vector *m_pvDemos; - const char *pMap; + const char *m_pMap; }; CRaceDemo::CRaceDemo() : @@ -203,8 +203,8 @@ int CRaceDemo::RaceDemolistFetchCallback(const CFsFileInfo *pInfo, int IsDir, in { auto *pRealUser = (SRaceDemoFetchUser *)pUser; auto *pParam = pRealUser->m_pParam; - int MapLen = str_length(pParam->pMap); - if(IsDir || !str_endswith(pInfo->m_pName, ".demo") || !str_startswith(pInfo->m_pName, pParam->pMap) || pInfo->m_pName[MapLen] != '_') + int MapLen = str_length(pParam->m_pMap); + if(IsDir || !str_endswith(pInfo->m_pName, ".demo") || !str_startswith(pInfo->m_pName, pParam->m_pMap) || pInfo->m_pName[MapLen] != '_') return 0; CDemoItem Item; From d6cf12705679746edae0e39428c6e5acec0f01c3 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 6 Jul 2024 17:53:10 +0800 Subject: [PATCH 117/179] Fix some clang warnings in the editor --- src/game/editor/editor.cpp | 2 +- src/game/editor/editor.h | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 997d38be381..fde9100234b 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -917,7 +917,7 @@ bool CEditor::CallbackSaveSound(const char *pFileName, int StorageType, void *pU return false; } -void CEditor::DoAudioPreview(CUIRect View, const void *pPlayPauseButtonId, const void *pStopButtonId, const void *pSeekBarId, const int SampleId) +void CEditor::DoAudioPreview(CUIRect View, const void *pPlayPauseButtonId, const void *pStopButtonId, const void *pSeekBarId, int SampleId) { CUIRect Button, SeekBar; // play/pause button diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index 17637030dcc..151fa36eaa4 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -31,7 +31,6 @@ #include #include -#include "auto_map.h" #include "editor_history.h" #include "editor_server_settings.h" #include "editor_trackers.h" @@ -402,8 +401,8 @@ class CEditor : public IEditor m_CheckerTexture.Invalidate(); m_BackgroundTexture.Invalidate(); - for(int i = 0; i < NUM_CURSORS; i++) - m_aCursorTextures[i].Invalidate(); + for(auto &CursorTexture : m_aCursorTextures) + CursorTexture.Invalidate(); m_CursorType = CURSOR_NORMAL; @@ -833,7 +832,7 @@ class CEditor : public IEditor void RenderBackground(CUIRect View, IGraphics::CTextureHandle Texture, float Size, float Brightness) const; - SEditResult UiDoValueSelector(void *pId, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool IsDegree = false, bool IsHex = false, int corners = IGraphics::CORNER_ALL, const ColorRGBA *pColor = nullptr, bool ShowValue = true); + SEditResult UiDoValueSelector(void *pId, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool IsDegree = false, bool IsHex = false, int Corners = IGraphics::CORNER_ALL, const ColorRGBA *pColor = nullptr, bool ShowValue = true); static CUi::EPopupMenuFunctionResult PopupMenuFile(void *pContext, CUIRect View, bool Active); static CUi::EPopupMenuFunctionResult PopupMenuTools(void *pContext, CUIRect View, bool Active); @@ -1003,7 +1002,7 @@ class CEditor : public IEditor void SelectGameLayer(); std::vector SortImages(); - void DoAudioPreview(CUIRect View, const void *pPlayPauseButtonId, const void *pStopButtonId, const void *pSeekBarId, const int SampleId); + void DoAudioPreview(CUIRect View, const void *pPlayPauseButtonId, const void *pStopButtonId, const void *pSeekBarId, int SampleId); // Tile Numbers For Explanations - TODO: Add/Improve tiles and explanations enum @@ -1127,7 +1126,6 @@ class CEditor : public IEditor int FindNextFreeSwitchNumber(); int FindNextFreeTeleNumber(bool IsCheckpoint = false); -public: // Undo/Redo CEditorHistory m_EditorHistory; CEditorHistory m_ServerSettingsHistory; @@ -1139,7 +1137,6 @@ class CEditor : public IEditor void UndoLastAction(); void RedoLastAction(); -private: std::map m_QuadDragOriginalPoints; }; From 698603d63cb6958024aac15823c99428320f9146 Mon Sep 17 00:00:00 2001 From: Corantin H Date: Sat, 6 Jul 2024 16:22:48 +0200 Subject: [PATCH 118/179] Fix various automapper issues Fix invalid logic for skipping empty tiles in automapper Fix partial default rule search Fix reading from wrong layer when proceeding --- src/game/editor/auto_map.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/game/editor/auto_map.cpp b/src/game/editor/auto_map.cpp index 8567f7cd658..e1ae00b0a8d 100644 --- a/src/game/editor/auto_map.cpp +++ b/src/game/editor/auto_map.cpp @@ -293,10 +293,18 @@ void CAutoMapper::Load(const char *pTileName) { for(const auto &Index : vNewIndexList) { - if(Value == CPosRule::INDEX && Index.m_Id == 0) + if(Index.m_Id == 0 && Value == CPosRule::INDEX) + { + // Skip full tiles if we have a rule "POS 0 0 INDEX 0" + // because that forces the tile to be empty pCurrentIndex->m_SkipFull = true; - else + } + else if((Index.m_Id > 0 && Value == CPosRule::INDEX) || (Index.m_Id == 0 && Value == CPosRule::NOTINDEX)) + { + // Skip empty tiles if we have a rule "POS 0 0 INDEX i" where i > 0 + // or if we have a rule "POS 0 0 NOTINDEX 0" pCurrentIndex->m_SkipEmpty = true; + } } } } @@ -334,14 +342,25 @@ void CAutoMapper::Load(const char *pTileName) for(auto &IndexRule : Run.m_vIndexRules) { bool Found = false; + + // Search for the exact rule "POS 0 0 INDEX 0" which corresponds to the default rule for(const auto &Rule : IndexRule.m_vRules) { - if(Rule.m_X == 0 && Rule.m_Y == 0) + if(Rule.m_X == 0 && Rule.m_Y == 0 && Rule.m_Value == CPosRule::INDEX) { - Found = true; + for(const auto &Index : Rule.m_vIndexList) + { + if(Index.m_Id == 0) + Found = true; + } break; } + + if(Found) + break; } + + // If the default rule was not found, and we require it, then add it if(!Found && IndexRule.m_DefaultRule) { std::vector vNewIndexList; @@ -353,6 +372,7 @@ void CAutoMapper::Load(const char *pTileName) IndexRule.m_SkipEmpty = true; IndexRule.m_SkipFull = false; } + if(IndexRule.m_SkipEmpty && IndexRule.m_SkipFull) { IndexRule.m_SkipEmpty = false; @@ -475,14 +495,15 @@ void CAutoMapper::Proceed(CLayerTiles *pLayer, int ConfigId, int Seed, int SeedO for(int x = 0; x < pLayer->m_Width; x++) { CTile *pTile = &(pLayer->m_pTiles[y * pLayer->m_Width + x]); + const CTile *pReadTile = &(pReadLayer->m_pTiles[y * pLayer->m_Width + x]); Editor()->m_Map.OnModify(); for(size_t i = 0; i < pRun->m_vIndexRules.size(); ++i) { CIndexRule *pIndexRule = &pRun->m_vIndexRules[i]; - if(pIndexRule->m_SkipEmpty && pTile->m_Index == 0) // skip empty tiles + if(pIndexRule->m_SkipEmpty && pReadTile->m_Index == 0) // skip empty tiles continue; - if(pIndexRule->m_SkipFull && pTile->m_Index != 0) // skip full tiles + if(pIndexRule->m_SkipFull && pReadTile->m_Index != 0) // skip full tiles continue; bool RespectRules = true; From 816c64235ca0abea1f17bff2285e46d6d7d18e11 Mon Sep 17 00:00:00 2001 From: Corantin H Date: Sun, 16 Jun 2024 16:37:45 +0200 Subject: [PATCH 119/179] Add team size indicator in scoreboard and through `/team` --- src/game/client/components/scoreboard.cpp | 28 +++++++++++++++++------ src/game/server/ddracechat.cpp | 25 ++++++++++++-------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp index fd952c7e86d..1f7cc124bee 100644 --- a/src/game/client/components/scoreboard.cpp +++ b/src/game/client/components/scoreboard.cpp @@ -273,9 +273,9 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, FontSize = 16.0f; } - const float ScoreOffset = Scoreboard.x + 10.0f + 10.0f; + const float ScoreOffset = Scoreboard.x + 40.0f; const float ScoreLength = TextRender()->TextWidth(FontSize, TimeScore ? "00:00:00" : "99999"); - const float TeeOffset = ScoreOffset + ScoreLength + 15.0f; + const float TeeOffset = ScoreOffset + ScoreLength + 20.0f; const float TeeLength = 60.0f * TeeSizeMod; const float NameOffset = TeeOffset + TeeLength; const float NameLength = 300.0f - TeeLength; @@ -302,8 +302,12 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, // render player entries int CountRendered = 0; int PrevDDTeam = -1; + int CurrentDDTeamSize = 0; char aBuf[64]; + int MaxTeamSize = m_pClient->Config()->m_SvMaxTeamSize; + float TeamStartY = 0; + for(int i = 0; i < MAX_CLIENTS; i++) { // make sure that we render the correct team @@ -350,30 +354,42 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, const ColorRGBA Color = GameClient()->GetDDTeamColor(DDTeam).WithAlpha(0.5f); int TeamRectCorners = 0; if(PrevDDTeam != DDTeam) + { TeamRectCorners |= IGraphics::CORNER_T; + TeamStartY = Row.y; + } if(NextDDTeam != DDTeam) TeamRectCorners |= IGraphics::CORNER_B; RowAndSpacing.Draw(Color, TeamRectCorners, RoundRadius); + CurrentDDTeamSize++; + if(NextDDTeam != DDTeam) { const float TeamFontSize = FontSize / 1.5f; + if(NumPlayers > 8) { if(DDTeam == TEAM_SUPER) str_copy(aBuf, Localize("Super")); - else + else if(CurrentDDTeamSize <= 1) str_format(aBuf, sizeof(aBuf), "%d", DDTeam); - TextRender()->Text(Row.x, Row.y + Row.h / 2.0f - TeamFontSize / 2.0f, TeamFontSize, aBuf); + else + str_format(aBuf, sizeof(aBuf), Localize("%d\n(%d/%d)", "Team and size"), DDTeam, CurrentDDTeamSize, MaxTeamSize); + TextRender()->Text(Row.x, TeamStartY + Row.h / 2.0f - TeamFontSize / 2.0f, TeamFontSize, aBuf); } else { if(DDTeam == TEAM_SUPER) str_copy(aBuf, Localize("Super")); + else if(CurrentDDTeamSize > 1) + str_format(aBuf, sizeof(aBuf), Localize("Team %d (%d/%d)"), DDTeam, CurrentDDTeamSize, MaxTeamSize); else str_format(aBuf, sizeof(aBuf), Localize("Team %d"), DDTeam); TextRender()->Text(Row.x + Row.w / 2.0f - TextRender()->TextWidth(TeamFontSize, aBuf) / 2.0f + 10.0f, Row.y + Row.h, TeamFontSize, aBuf); } + + CurrentDDTeamSize = 0; } } PrevDDTeam = DDTeam; @@ -383,9 +399,7 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, (GameClient()->m_Snap.m_SpecInfo.m_SpectatorId == SPEC_FREEVIEW && pInfo->m_Local) || (GameClient()->m_Snap.m_SpecInfo.m_Active && pInfo->m_ClientId == GameClient()->m_Snap.m_SpecInfo.m_SpectatorId)) { - CUIRect Highlight; - Row.VMargin(10.0f, &Highlight); - Highlight.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, RoundRadius); + Row.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, RoundRadius); } // score diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index 96f11984fbc..a6e8da7de38 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -1241,18 +1241,25 @@ void CGameContext::ConTeam(IConsole::IResult *pResult, void *pUserData) char aBuf[512]; if(!pPlayer->IsPlaying()) { - pSelf->Console()->Print( - IConsole::OUTPUT_LEVEL_STANDARD, - "chatresp", - "You can't check your team while you are dead/a spectator."); + pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "chatresp", "You can't check your team while you are dead/a spectator."); } else { - str_format( - aBuf, - sizeof(aBuf), - "You are in team %d", - pSelf->GetDDRaceTeam(pResult->m_ClientId)); + int TeamSize = 0; + const int PlayerTeam = pSelf->GetDDRaceTeam(pResult->m_ClientId); + + // Count players in team + for(int ClientId = 0; ClientId < MAX_CLIENTS; ClientId++) + { + const CPlayer *pOtherPlayer = pSelf->m_apPlayers[ClientId]; + if(!pOtherPlayer || !pOtherPlayer->IsPlaying()) + continue; + + if(pSelf->GetDDRaceTeam(ClientId) == PlayerTeam) + TeamSize++; + } + + str_format(aBuf, sizeof(aBuf), "You are in team %d having %d %s", PlayerTeam, TeamSize, TeamSize > 1 ? "players" : "player"); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "chatresp", aBuf); } } From 03f934c81efe37bc951d837b3cb3d0c6d6c37ecf Mon Sep 17 00:00:00 2001 From: art0007i Date: Tue, 2 Jul 2024 21:59:22 +0200 Subject: [PATCH 120/179] add "/setjumps" practice command and "setjumps" rcon command --- src/game/server/ddracechat.cpp | 8 ++++++++ src/game/server/ddracecommands.cpp | 8 ++++++++ src/game/server/entities/character.cpp | 5 +++++ src/game/server/entities/character.h | 1 + src/game/server/gamecontext.cpp | 2 ++ src/game/server/gamecontext.h | 2 ++ 6 files changed, 26 insertions(+) diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index 96f11984fbc..786c6b3b109 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -2082,6 +2082,13 @@ void CGameContext::ConPracticeJetpack(IConsole::IResult *pResult, void *pUserDat ConJetpack(pResult, pUserData); } +void CGameContext::ConPracticeSetJumps(IConsole::IResult *pResult, void *pUserData) +{ + CGameContext *pSelf = (CGameContext *)pUserData; + if(pSelf->GetPracticeCharacter(pResult)) + ConSetJumps(pResult, pUserData); +} + void CGameContext::ConPracticeWeapons(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; @@ -2130,6 +2137,7 @@ void CGameContext::ConPracticeNinja(IConsole::IResult *pResult, void *pUserData) if(pSelf->GetPracticeCharacter(pResult)) ConNinja(pResult, pUserData); } + void CGameContext::ConPracticeUnNinja(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; diff --git a/src/game/server/ddracecommands.cpp b/src/game/server/ddracecommands.cpp index 2f15c066e40..d595eac8299 100644 --- a/src/game/server/ddracecommands.cpp +++ b/src/game/server/ddracecommands.cpp @@ -269,6 +269,14 @@ void CGameContext::ConJetpack(IConsole::IResult *pResult, void *pUserData) pChr->SetJetpack(true); } +void CGameContext::ConSetJumps(IConsole::IResult *pResult, void *pUserData) +{ + CGameContext *pSelf = (CGameContext *)pUserData; + CCharacter *pChr = pSelf->GetPlayerChar(pResult->m_ClientId); + if(pChr) + pChr->SetJumps(pResult->GetInteger(0)); +} + void CGameContext::ConWeapons(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index c35e99a3a6d..fd704d5710d 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -132,6 +132,11 @@ void CCharacter::SetJetpack(bool Active) m_Core.m_Jetpack = Active; } +void CCharacter::SetJumps(int Jumps) +{ + m_Core.m_Jumps = Jumps; +} + void CCharacter::SetSolo(bool Solo) { m_Core.m_Solo = Solo; diff --git a/src/game/server/entities/character.h b/src/game/server/entities/character.h index a2263d3dc8d..54651f41020 100644 --- a/src/game/server/entities/character.h +++ b/src/game/server/entities/character.h @@ -48,6 +48,7 @@ class CCharacter : public CEntity void SetWeapon(int W); void SetJetpack(bool Active); + void SetJumps(int Jumps); void SetSolo(bool Solo); void SetSuper(bool Super); void SetLiveFrozen(bool Active); diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 5a48cf25290..33a8bdef37b 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -3592,6 +3592,7 @@ void CGameContext::RegisterDDRaceCommands() Console()->Register("laser", "", CFGFLAG_SERVER | CMDFLAG_TEST, ConLaser, this, "Gives a laser to you"); Console()->Register("rifle", "", CFGFLAG_SERVER | CMDFLAG_TEST, ConLaser, this, "Gives a laser to you"); Console()->Register("jetpack", "", CFGFLAG_SERVER | CMDFLAG_TEST, ConJetpack, this, "Gives jetpack to you"); + Console()->Register("setjumps", "i[jumps]", CFGFLAG_SERVER | CMDFLAG_TEST, ConSetJumps, this, "Gives you as many jumps as you specify"); Console()->Register("weapons", "", CFGFLAG_SERVER | CMDFLAG_TEST, ConWeapons, this, "Gives all weapons to you"); Console()->Register("unshotgun", "", CFGFLAG_SERVER | CMDFLAG_TEST, ConUnShotgun, this, "Removes the shotgun from you"); Console()->Register("ungrenade", "", CFGFLAG_SERVER | CMDFLAG_TEST, ConUnGrenade, this, "Removes the grenade launcher from you"); @@ -3721,6 +3722,7 @@ void CGameContext::RegisterChatCommands() Console()->Register("laser", "", CFGFLAG_CHAT | CMDFLAG_PRACTICE, ConPracticeLaser, this, "Gives a laser to you"); Console()->Register("rifle", "", CFGFLAG_CHAT | CMDFLAG_PRACTICE, ConPracticeLaser, this, "Gives a laser to you"); Console()->Register("jetpack", "", CFGFLAG_CHAT | CMDFLAG_PRACTICE, ConPracticeJetpack, this, "Gives jetpack to you"); + Console()->Register("setjumps", "i[jumps]", CFGFLAG_CHAT | CMDFLAG_PRACTICE, ConPracticeSetJumps, this, "Gives you as many jumps as you specify"); Console()->Register("weapons", "", CFGFLAG_CHAT | CMDFLAG_PRACTICE, ConPracticeWeapons, this, "Gives all weapons to you"); Console()->Register("unshotgun", "", CFGFLAG_CHAT | CMDFLAG_PRACTICE, ConPracticeUnShotgun, this, "Removes the shotgun from you"); Console()->Register("ungrenade", "", CFGFLAG_CHAT | CMDFLAG_PRACTICE, ConPracticeUnGrenade, this, "Removes the grenade launcher from you"); diff --git a/src/game/server/gamecontext.h b/src/game/server/gamecontext.h index 7d7d5ce47e0..33d17844a24 100644 --- a/src/game/server/gamecontext.h +++ b/src/game/server/gamecontext.h @@ -388,6 +388,7 @@ class CGameContext : public IGameServer static void ConGrenade(IConsole::IResult *pResult, void *pUserData); static void ConLaser(IConsole::IResult *pResult, void *pUserData); static void ConJetpack(IConsole::IResult *pResult, void *pUserData); + static void ConSetJumps(IConsole::IResult *pResult, void *pUserData); static void ConWeapons(IConsole::IResult *pResult, void *pUserData); static void ConUnShotgun(IConsole::IResult *pResult, void *pUserData); static void ConUnGrenade(IConsole::IResult *pResult, void *pUserData); @@ -474,6 +475,7 @@ class CGameContext : public IGameServer static void ConPracticeGrenade(IConsole::IResult *pResult, void *pUserData); static void ConPracticeLaser(IConsole::IResult *pResult, void *pUserData); static void ConPracticeJetpack(IConsole::IResult *pResult, void *pUserData); + static void ConPracticeSetJumps(IConsole::IResult *pResult, void *pUserData); static void ConPracticeWeapons(IConsole::IResult *pResult, void *pUserData); static void ConPracticeUnShotgun(IConsole::IResult *pResult, void *pUserData); static void ConPracticeUnGrenade(IConsole::IResult *pResult, void *pUserData); From 4c4b2e9edcb9c6727951e8a5148d633435d5d7fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 3 Jul 2024 23:09:16 +0200 Subject: [PATCH 121/179] Fix `map_extract` tool crashing if opus file cannot be opened --- src/tools/map_extract.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tools/map_extract.cpp b/src/tools/map_extract.cpp index 49412d57744..9de08e5ee78 100644 --- a/src/tools/map_extract.cpp +++ b/src/tools/map_extract.cpp @@ -102,8 +102,11 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) dbg_msg("map_extract", "writing sound: %s (%d B)", aBuf, SoundDataSize); IOHANDLE Opus = io_open(aBuf, IOFLAG_WRITE); - io_write(Opus, Reader.GetData(pItem->m_SoundData), SoundDataSize); - io_close(Opus); + if(Opus) + { + io_write(Opus, Reader.GetData(pItem->m_SoundData), SoundDataSize); + io_close(Opus); + } } return Reader.Close(); From c9467454d3ecab2c7f2758fe3c9f682b7d1a0ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Thu, 4 Jul 2024 23:25:24 +0200 Subject: [PATCH 122/179] Improve logging of `map_extract` tool Use `log_info` and `log_error` instead of `dbg_msg`. Add error messages when output files cannot be opened for writing. Move log messages regarding files being written so they are only printed when the files are actually being written. --- src/tools/map_extract.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/tools/map_extract.cpp b/src/tools/map_extract.cpp index 9de08e5ee78..407f1150f95 100644 --- a/src/tools/map_extract.cpp +++ b/src/tools/map_extract.cpp @@ -12,31 +12,31 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) CDataFileReader Reader; if(!Reader.Open(pStorage, pMapName, IStorage::TYPE_ABSOLUTE)) { - dbg_msg("map_extract", "error opening map '%s'", pMapName); + log_error("map_extract", "error opening map '%s'", pMapName); return false; } const CMapItemVersion *pVersion = static_cast(Reader.FindItem(MAPITEMTYPE_VERSION, 0)); if(pVersion == nullptr || pVersion->m_Version != CMapItemVersion::CURRENT_VERSION) { - dbg_msg("map_extract", "unsupported map version '%s'", pMapName); + log_error("map_extract", "unsupported map version '%s'", pMapName); return false; } - dbg_msg("map_extract", "Make sure you have the permission to use these images and sounds in your own maps"); + log_info("map_extract", "Make sure you have the permission to use these images and sounds in your own maps"); CMapItemInfo *pInfo = (CMapItemInfo *)Reader.FindItem(MAPITEMTYPE_INFO, 0); if(pInfo) { const char *pAuthor = Reader.GetDataString(pInfo->m_Author); - dbg_msg("map_extract", "author: %s", pAuthor == nullptr ? "(error)" : pAuthor); + log_info("map_extract", "author: %s", pAuthor == nullptr ? "(error)" : pAuthor); const char *pMapVersion = Reader.GetDataString(pInfo->m_MapVersion); - dbg_msg("map_extract", "version: %s", pMapVersion == nullptr ? "(error)" : pMapVersion); + log_info("map_extract", "version: %s", pMapVersion == nullptr ? "(error)" : pMapVersion); const char *pCredits = Reader.GetDataString(pInfo->m_Credits); - dbg_msg("map_extract", "credits: %s", pCredits == nullptr ? "(error)" : pCredits); + log_info("map_extract", "credits: %s", pCredits == nullptr ? "(error)" : pCredits); const char *pLicense = Reader.GetDataString(pInfo->m_License); - dbg_msg("map_extract", "license: %s", pLicense == nullptr ? "(error)" : pLicense); + log_info("map_extract", "license: %s", pLicense == nullptr ? "(error)" : pLicense); } int Start, Num; @@ -53,13 +53,12 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) const char *pName = Reader.GetDataString(pItem->m_ImageName); if(pName == nullptr || pName[0] == '\0') { - dbg_msg("map_extract", "failed to load name of image %d", i); + log_error("map_extract", "failed to load name of image %d", i); continue; } char aBuf[IO_MAX_PATH_LENGTH]; str_format(aBuf, sizeof(aBuf), "%s/%s.png", pPathSave, pName); - dbg_msg("map_extract", "writing image: %s (%dx%d)", aBuf, pItem->m_Width, pItem->m_Height); if(pItem->m_Version >= 2 && pItem->m_MustBe1 != 1) { @@ -71,6 +70,7 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) IOHANDLE File = io_open(aBuf, IOFLAG_WRITE); if(File) { + log_info("map_extract", "writing image: %s (%dx%d)", aBuf, pItem->m_Width, pItem->m_Height); TImageByteBuffer ByteBuffer; SImageByteBuffer ImageByteBuffer(&ByteBuffer); @@ -78,6 +78,10 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) io_write(File, &ByteBuffer.front(), ByteBuffer.size()); io_close(File); } + else + { + log_error("map_extract", "failed to open image file for writing. filename='%s'", aBuf); + } } // load sounds @@ -92,21 +96,25 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) const char *pName = Reader.GetDataString(pItem->m_SoundName); if(pName == nullptr || pName[0] == '\0') { - dbg_msg("map_extract", "failed to load name of sound %d", i); + log_error("map_extract", "failed to load name of sound %d", i); continue; } const int SoundDataSize = Reader.GetDataSize(pItem->m_SoundData); char aBuf[IO_MAX_PATH_LENGTH]; str_format(aBuf, sizeof(aBuf), "%s/%s.opus", pPathSave, pName); - dbg_msg("map_extract", "writing sound: %s (%d B)", aBuf, SoundDataSize); IOHANDLE Opus = io_open(aBuf, IOFLAG_WRITE); if(Opus) { + log_info("map_extract", "writing sound: %s (%d B)", aBuf, SoundDataSize); io_write(Opus, Reader.GetData(pItem->m_SoundData), SoundDataSize); io_close(Opus); } + else + { + log_error("map_extract", "failed to open sound file for writing. filename='%s'", aBuf); + } } return Reader.Close(); @@ -132,13 +140,13 @@ int main(int argc, const char *argv[]) } else { - dbg_msg("usage", "%s map [directory]", argv[0]); + log_error("map_extract", "usage: %s [directory]", argv[0]); return -1; } if(!fs_is_dir(pDir)) { - dbg_msg("usage", "directory '%s' does not exist", pDir); + log_error("map_extract", "directory '%s' does not exist", pDir); return -1; } From b81ac61556a7f757b4ff291f4f83b1dc00dbd131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Thu, 4 Jul 2024 23:30:33 +0200 Subject: [PATCH 123/179] Unload image and sound data in `map_extract` tool sooner Reduce the memory footprint of the tool by unloading the map data as soon as possible instead of only implicitly when the `CDataFileReader` is destructed. --- src/tools/map_extract.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tools/map_extract.cpp b/src/tools/map_extract.cpp index 407f1150f95..f4e2e5137f9 100644 --- a/src/tools/map_extract.cpp +++ b/src/tools/map_extract.cpp @@ -59,6 +59,7 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) char aBuf[IO_MAX_PATH_LENGTH]; str_format(aBuf, sizeof(aBuf), "%s/%s.png", pPathSave, pName); + Reader.UnloadData(pItem->m_ImageName); if(pItem->m_Version >= 2 && pItem->m_MustBe1 != 1) { @@ -77,6 +78,7 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) if(SavePng(IMAGE_FORMAT_RGBA, (const uint8_t *)Reader.GetData(pItem->m_ImageData), ImageByteBuffer, pItem->m_Width, pItem->m_Height)) io_write(File, &ByteBuffer.front(), ByteBuffer.size()); io_close(File); + Reader.UnloadData(pItem->m_ImageData); } else { @@ -103,6 +105,7 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) const int SoundDataSize = Reader.GetDataSize(pItem->m_SoundData); char aBuf[IO_MAX_PATH_LENGTH]; str_format(aBuf, sizeof(aBuf), "%s/%s.opus", pPathSave, pName); + Reader.UnloadData(pItem->m_SoundName); IOHANDLE Opus = io_open(aBuf, IOFLAG_WRITE); if(Opus) @@ -110,6 +113,7 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) log_info("map_extract", "writing sound: %s (%d B)", aBuf, SoundDataSize); io_write(Opus, Reader.GetData(pItem->m_SoundData), SoundDataSize); io_close(Opus); + Reader.UnloadData(pItem->m_SoundData); } else { From 4c702395db4e520919f1aec9a66106d174dbe533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Thu, 4 Jul 2024 23:44:28 +0200 Subject: [PATCH 124/179] Split `map_extract` tool into separate functions Improve readability by splitting the `map_extract` tool into multiple functions. --- src/tools/map_extract.cpp | 57 ++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/src/tools/map_extract.cpp b/src/tools/map_extract.cpp index f4e2e5137f9..7c445f4e4a8 100644 --- a/src/tools/map_extract.cpp +++ b/src/tools/map_extract.cpp @@ -7,26 +7,9 @@ #include #include -bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) +static void PrintMapInfo(CDataFileReader &Reader) { - CDataFileReader Reader; - if(!Reader.Open(pStorage, pMapName, IStorage::TYPE_ABSOLUTE)) - { - log_error("map_extract", "error opening map '%s'", pMapName); - return false; - } - - const CMapItemVersion *pVersion = static_cast(Reader.FindItem(MAPITEMTYPE_VERSION, 0)); - if(pVersion == nullptr || pVersion->m_Version != CMapItemVersion::CURRENT_VERSION) - { - log_error("map_extract", "unsupported map version '%s'", pMapName); - return false; - } - - log_info("map_extract", "Make sure you have the permission to use these images and sounds in your own maps"); - CMapItemInfo *pInfo = (CMapItemInfo *)Reader.FindItem(MAPITEMTYPE_INFO, 0); - if(pInfo) { const char *pAuthor = Reader.GetDataString(pInfo->m_Author); @@ -38,12 +21,12 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) const char *pLicense = Reader.GetDataString(pInfo->m_License); log_info("map_extract", "license: %s", pLicense == nullptr ? "(error)" : pLicense); } +} +static void ExtractMapImages(CDataFileReader &Reader, const char *pPathSave) +{ int Start, Num; - - // load images Reader.GetType(MAPITEMTYPE_IMAGE, &Start, &Num); - for(int i = 0; i < Num; i++) { CMapItemImage_v2 *pItem = (CMapItemImage_v2 *)Reader.GetItem(Start + i); @@ -67,7 +50,6 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) continue; } - // copy image data IOHANDLE File = io_open(aBuf, IOFLAG_WRITE); if(File) { @@ -85,10 +67,12 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) log_error("map_extract", "failed to open image file for writing. filename='%s'", aBuf); } } +} - // load sounds +static void ExtractMapSounds(CDataFileReader &Reader, const char *pPathSave) +{ + int Start, Num; Reader.GetType(MAPITEMTYPE_SOUND, &Start, &Num); - for(int i = 0; i < Num; i++) { CMapItemSound *pItem = (CMapItemSound *)Reader.GetItem(Start + i); @@ -120,6 +104,29 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave) log_error("map_extract", "failed to open sound file for writing. filename='%s'", aBuf); } } +} + +static bool ExtractMap(IStorage *pStorage, const char *pMapName, const char *pPathSave) +{ + CDataFileReader Reader; + if(!Reader.Open(pStorage, pMapName, IStorage::TYPE_ABSOLUTE)) + { + log_error("map_extract", "error opening map '%s'", pMapName); + return false; + } + + const CMapItemVersion *pVersion = static_cast(Reader.FindItem(MAPITEMTYPE_VERSION, 0)); + if(pVersion == nullptr || pVersion->m_Version != CMapItemVersion::CURRENT_VERSION) + { + log_error("map_extract", "unsupported map version '%s'", pMapName); + return false; + } + + log_info("map_extract", "Make sure you have the permission to use these images and sounds in your own maps"); + + PrintMapInfo(Reader); + ExtractMapImages(Reader, pPathSave); + ExtractMapSounds(Reader, pPathSave); return Reader.Close(); } @@ -154,6 +161,6 @@ int main(int argc, const char *argv[]) return -1; } - int Result = Process(pStorage, argv[1], pDir) ? 0 : 1; + int Result = ExtractMap(pStorage, argv[1], pDir) ? 0 : 1; return Result; } From 526251293cb35f3e1ef3838a79b70054a42ab3f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Thu, 4 Jul 2024 23:48:28 +0200 Subject: [PATCH 125/179] Use `static_cast` and `const` pointers for map items --- src/tools/map_extract.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tools/map_extract.cpp b/src/tools/map_extract.cpp index 7c445f4e4a8..17b68792149 100644 --- a/src/tools/map_extract.cpp +++ b/src/tools/map_extract.cpp @@ -9,7 +9,7 @@ static void PrintMapInfo(CDataFileReader &Reader) { - CMapItemInfo *pInfo = (CMapItemInfo *)Reader.FindItem(MAPITEMTYPE_INFO, 0); + const CMapItemInfo *pInfo = static_cast(Reader.FindItem(MAPITEMTYPE_INFO, 0)); if(pInfo) { const char *pAuthor = Reader.GetDataString(pInfo->m_Author); @@ -29,7 +29,7 @@ static void ExtractMapImages(CDataFileReader &Reader, const char *pPathSave) Reader.GetType(MAPITEMTYPE_IMAGE, &Start, &Num); for(int i = 0; i < Num; i++) { - CMapItemImage_v2 *pItem = (CMapItemImage_v2 *)Reader.GetItem(Start + i); + const CMapItemImage_v2 *pItem = static_cast(Reader.GetItem(Start + i)); if(pItem->m_External) continue; @@ -75,7 +75,7 @@ static void ExtractMapSounds(CDataFileReader &Reader, const char *pPathSave) Reader.GetType(MAPITEMTYPE_SOUND, &Start, &Num); for(int i = 0; i < Num; i++) { - CMapItemSound *pItem = (CMapItemSound *)Reader.GetItem(Start + i); + const CMapItemSound *pItem = static_cast(Reader.GetItem(Start + i)); if(pItem->m_External) continue; From 7b540ddb1628f1f03510d2305e9c175c22d05db5 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sat, 6 Jul 2024 08:48:33 +0800 Subject: [PATCH 126/179] Remove support for space separation --- src/base/system.h | 27 +++++++++++++------------- src/game/client/components/console.cpp | 22 ++++++++++----------- src/game/client/components/console.h | 5 ++--- src/test/str.cpp | 26 ++++++++++++------------- 4 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/base/system.h b/src/base/system.h index f3bf7b7496a..61bd9f775c4 100644 --- a/src/base/system.h +++ b/src/base/system.h @@ -1605,19 +1605,20 @@ const char *str_find_nocase(const char *haystack, const char *needle); */ const char *str_find(const char *haystack, const char *needle); -/* - Function: str_delimiters_around_offset - Parameters: - haystack - String to search in - needle - String to search for - - Returns: - true if both delimiters were found - false if a delimiter is missing (it uses haystart start and end as fallback) - - Remarks: - - The strings are treated as zero-terminated strings. -*/ +/** + * @ingroup Strings + * + * @param haystack String to search in + * @param delim String to search for + * @param offset Number of characters into the haystack + * @param start Will be set to the first delimiter on the left side of the offset (or haystack start) + * @param end Will be set to the furst delimiter on the right side of the offset (or haystack end) + * + * @return `true` if both delimiters were found + * @return 'false' if a delimiter is missing (it uses haystack start and end as fallback) + * + * @remark The strings are treated as zero-terminated strings. + */ bool str_delimiters_around_offset(const char *haystay, const char *delim, int offset, int *start, int *end); /** diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp index 071ebb0aff8..b962b8a3c1f 100644 --- a/src/game/client/components/console.cpp +++ b/src/game/client/components/console.cpp @@ -331,24 +331,24 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const } } -void CGameConsole::CInstance::GetCommand(const char *pInput, char *pCmd, size_t CmdSize) +void CGameConsole::CInstance::GetCommand(const char *pInput, char (&aCmd)[IConsole::CMDLINE_LENGTH]) { char aInput[IConsole::CMDLINE_LENGTH]; str_copy(aInput, pInput); - int Start, End; m_CompletionCommandStart = 0; m_CompletionCommandEnd = 0; - char aaSeperators[][2] = {";", "\"", " "}; - for(auto *pSeperator : aaSeperators) + char aaSeparators[][2] = {";", "\""}; + for(auto *pSeparator : aaSeparators) { - str_delimiters_around_offset(aInput + m_CompletionCommandStart, pSeperator, m_Input.GetCursorOffset() - m_CompletionCommandStart, &Start, &End); + int Start, End; + str_delimiters_around_offset(aInput + m_CompletionCommandStart, pSeparator, m_Input.GetCursorOffset() - m_CompletionCommandStart, &Start, &End); m_CompletionCommandStart += Start; m_CompletionCommandEnd = m_CompletionCommandStart + (End - Start); aInput[m_CompletionCommandEnd] = '\0'; } - str_copy(pCmd, aInput + m_CompletionCommandStart, CmdSize); + str_copy(aCmd, aInput + m_CompletionCommandStart, sizeof(aCmd)); } static void StrCopyUntilSpace(char *pDest, size_t DestSize, const char *pSrc) @@ -472,8 +472,8 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) if(!m_Searching) { - char aSearch[128]; - GetCommand(m_aCompletionBuffer, aSearch, sizeof(aSearch)); + char aSearch[IConsole::CMDLINE_LENGTH]; + GetCommand(m_aCompletionBuffer, aSearch); // command completion const bool UseTempCommands = m_Type == CGameConsole::CONSOLETYPE_REMOTE && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands(); @@ -612,7 +612,7 @@ bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) // find the current command { char aCmd[IConsole::CMDLINE_LENGTH]; - GetCommand(GetString(), aCmd, sizeof(aCmd)); + GetCommand(GetString(), aCmd); char aBuf[IConsole::CMDLINE_LENGTH]; StrCopyUntilSpace(aBuf, sizeof(aBuf), aCmd); @@ -1144,8 +1144,8 @@ void CGameConsole::OnRender() Info.m_pOffsetChange = &pConsole->m_CompletionRenderOffsetChange; Info.m_Width = Screen.w; Info.m_TotalWidth = 0.0f; - char aCmd[128]; - pConsole->GetCommand(pConsole->m_aCompletionBuffer, aCmd, sizeof(aCmd)); + char aCmd[IConsole::CMDLINE_LENGTH]; + pConsole->GetCommand(pConsole->m_aCompletionBuffer, aCmd); Info.m_pCurrentCmd = aCmd; TextRender()->SetCursor(&Info.m_Cursor, InitialX - Info.m_Offset, InitialY + RowHeight + 2.0f, FONT_SIZE, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index c54809c0543..3e92ad195f9 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -125,10 +125,9 @@ class CGameConsole : public CComponent * The result would be " world " * * @param pInput the console input line - * @param pCmd the command the cursor is at - * @param CmdSize size of the pCmd buffer + * @param aCmd the command the cursor is at */ - void GetCommand(const char *pInput, char *pCmd, size_t CmdSize); + void GetCommand(const char *pInput, char (&aCmd)[IConsole::CMDLINE_LENGTH]); static void PossibleCommandsCompleteCallback(int Index, const char *pStr, void *pUser); static void PossibleArgumentsCompleteCallback(int Index, const char *pStr, void *pUser); diff --git a/src/test/str.cpp b/src/test/str.cpp index 9dcbb6bbed7..babadc27610 100644 --- a/src/test/str.cpp +++ b/src/test/str.cpp @@ -9,53 +9,51 @@ TEST(Str, StrDelim) int Start, End; // 0123456 // 01234567891111111 - str_delimiters_around_offset("123;123456789;aaa", ";", 5, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("123;123456789;aaa", ";", 5, &Start, &End), true); EXPECT_EQ(Start, 4); EXPECT_EQ(End, 13); - str_delimiters_around_offset("123;123", ";", 1, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("123;123", ";", 1, &Start, &End), false); EXPECT_EQ(Start, 0); EXPECT_EQ(End, 3); - str_delimiters_around_offset("---foo---bar---baz---hello", "---", 1, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("---foo---bar---baz---hello", "---", 1, &Start, &End), false); EXPECT_EQ(Start, 0); EXPECT_EQ(End, 0); - str_delimiters_around_offset("---foo---bar---baz---hello", "---", 2, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("---foo---bar---baz---hello", "---", 2, &Start, &End), false); EXPECT_EQ(Start, 0); EXPECT_EQ(End, 0); - str_delimiters_around_offset("---foo---bar---baz---hello", "---", 3, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("---foo---bar---baz---hello", "---", 3, &Start, &End), true); EXPECT_EQ(Start, 3); EXPECT_EQ(End, 6); - str_delimiters_around_offset("---foo---bar---baz---hello", "---", 4, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("---foo---bar---baz---hello", "---", 4, &Start, &End), true); EXPECT_EQ(Start, 3); EXPECT_EQ(End, 6); - str_delimiters_around_offset("---foo---bar---baz---hello", "---", 9, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("---foo---bar---baz---hello", "---", 9, &Start, &End), true); EXPECT_EQ(Start, 9); EXPECT_EQ(End, 12); - str_delimiters_around_offset("---foo---bar---baz---hello", "---", 22, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("---foo---bar---baz---hello", "---", 22, &Start, &End), false); EXPECT_EQ(Start, 21); EXPECT_EQ(End, 26); - str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 2, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 2, &Start, &End), false); EXPECT_EQ(Start, 0); EXPECT_EQ(End, 3); - str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 3, &Start, &End); + EXPECT_EQ(str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 3, &Start, &End), false); EXPECT_EQ(Start, 0); EXPECT_EQ(End, 3); - bool Found = str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 4, &Start, &End); - EXPECT_EQ(Found, true); + EXPECT_EQ(str_delimiters_around_offset("foo;;;;bar;;;;;;", ";", 4, &Start, &End), true); EXPECT_EQ(Start, 4); EXPECT_EQ(End, 4); - Found = str_delimiters_around_offset("", ";", 4, &Start, &End); - EXPECT_EQ(Found, false); + EXPECT_EQ(str_delimiters_around_offset("", ";", 4, &Start, &End), false); EXPECT_EQ(Start, 0); EXPECT_EQ(End, 0); } From 3e3017f557f2574ef1ff51936c5fa41079bade44 Mon Sep 17 00:00:00 2001 From: fokkonaut <35420825+fokkonaut@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:40:17 +0200 Subject: [PATCH 127/179] Update F-DDrace entities --- CMakeLists.txt | 1 + data/editor/entities/F-DDrace.png | Bin 0 -> 484155 bytes data/editor/entities_clear/f-ddrace.png | Bin 397158 -> 491010 bytes 3 files changed, 1 insertion(+) create mode 100644 data/editor/entities/F-DDrace.png diff --git a/CMakeLists.txt b/CMakeLists.txt index da8182175e3..5a7c80860b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1410,6 +1410,7 @@ set(EXPECTED_DATA editor/cursor.png editor/cursor_resize.png editor/entities/DDNet.png + editor/entities/F-DDrace.png editor/entities/FNG.png editor/entities/Race.png editor/entities/Vanilla.png diff --git a/data/editor/entities/F-DDrace.png b/data/editor/entities/F-DDrace.png new file mode 100644 index 0000000000000000000000000000000000000000..d314db403eaab864c255349571927450a6a07e8c GIT binary patch literal 484155 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 z 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%0Dkh2r`M(SJ>AfK+dxv|(Iq6ltO~OWRd$#}m#5n;o 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

CxSu4yT`R0E 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%0Alvk18a1e+#f~Ck3IR%3HnG!{Bj;ti)|mT%m|uIg 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

VDROmu52mU@YnPy_k@0?xwy0f@A=iUX0% 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 literal 0 HcmV?d00001 diff --git a/data/editor/entities_clear/f-ddrace.png b/data/editor/entities_clear/f-ddrace.png index 5fe42a1cf6d2dbc0c26bee23f1f501b52de68263..38f3fc2d0323480140814508cebb6fa6e7e7f8e6 100644 GIT binary patch literal 491010 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 z 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 #Xb=Apv9= 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≫GEnkqcao|BIkubD1RZ>fe?ep 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%0Aa&tT}wv=yNcjEwi21od_#q%ZdON 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

V1c2R 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 z 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%0Dq=FHjDfyZiFiXxhXL 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