From b83b4c8e33ea933b0531c13f6e2b06ea2cc2132c Mon Sep 17 00:00:00 2001 From: def Date: Fri, 23 Oct 2020 23:25:58 +0200 Subject: [PATCH 001/144] Warn new players about name with points (fixes #3178) --- src/engine/client.h | 1 + src/engine/client/client.cpp | 5 +++ src/game/client/components/menus.cpp | 46 +++++++++++++++++++++++++++- src/game/client/components/menus.h | 1 + 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/engine/client.h b/src/engine/client.h index 8e4bbcd39..515f62269 100644 --- a/src/engine/client.h +++ b/src/engine/client.h @@ -49,6 +49,7 @@ protected: public: char m_aNews[3000]; + int m_Points; int64 m_ReconnectTime; class CSnapItem diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 0be8ea034..4132981dc 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -328,6 +328,7 @@ CClient::CClient() : str_format(m_aDDNetInfoTmp, sizeof(m_aDDNetInfoTmp), DDNET_INFO ".%d.tmp", pid()); m_pDDNetInfoTask = NULL; m_aNews[0] = '\0'; + m_Points = -1; m_CurrentServerInfoRequestTime = -1; @@ -2521,6 +2522,10 @@ void CClient::LoadDDNetInfo() str_copy(m_aNews, pNewsString, sizeof(m_aNews)); } + + const json_value *pPoints = json_object_get(pDDNetInfo, "points"); + if(pPoints->type == json_integer) + m_Points = pPoints->u.integer; } void CClient::PumpNetwork() diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 52380d56c..c135a6191 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -1440,6 +1440,24 @@ int CMenus::Render() pButtonText = Localize("Ok"); ExtraAlign = -1; } + else if(m_Popup == POPUP_POINTS) + { + pTitle = Localize("Existing Player"); + if(Client()->m_Points > 50) + { + str_format(aBuf, sizeof(aBuf), Localize("Your nick name '%s' is already used (%d points). Do you still want to use it?"), Client()->PlayerName(), Client()->m_Points); + pExtraText = aBuf; + } + else if(Client()->m_Points >= 0) + { + m_Popup = POPUP_NONE; + } + else + { + pExtraText = Localize("Checking for existing player with your name"); + } + ExtraAlign = -1; + } else if(m_Popup == POPUP_WARNING) { BgColor = ColorRGBA{0.5f, 0.0f, 0.0f, 0.7f}; @@ -2024,7 +2042,12 @@ int CMenus::Render() if(DoButton_Menu(&s_EnterButton, Localize("Enter"), 0, &Part) || m_EnterPressed) { Client()->RequestDDNetInfo(); - m_Popup = POPUP_NONE; + if(g_Config.m_BrIndicateFinished) + m_Popup = POPUP_POINTS; + else + { + m_Popup = POPUP_NONE; + } } Box.HSplitBottom(20.f, &Box, &Part); @@ -2050,6 +2073,27 @@ int CMenus::Render() static float Offset = 0.0f; DoEditBox(&g_Config.m_PlayerName, &TextBox, g_Config.m_PlayerName, sizeof(g_Config.m_PlayerName), 12.0f, &Offset, false, CUI::CORNER_ALL, Client()->PlayerName()); } + else if(m_Popup == POPUP_POINTS) + { + CUIRect Yes, No; + + Box.HSplitBottom(20.f, &Box, &Part); + Box.HSplitBottom(24.f, &Box, &Part); + Part.VMargin(80.0f, &Part); + + Part.VSplitMid(&No, &Yes); + + Yes.VMargin(20.0f, &Yes); + No.VMargin(20.0f, &No); + + static int s_ButtonNo = 0; + if(DoButton_Menu(&s_ButtonNo, Localize("No"), 0, &No) || m_EscapePressed) + m_Popup = POPUP_FIRST_LAUNCH; + + static int s_ButtonYes = 0; + if(DoButton_Menu(&s_ButtonYes, Localize("Yes"), 0, &Yes) || m_EnterPressed) + m_Popup = POPUP_NONE; + } else if(m_Popup == POPUP_WARNING) { Box.HSplitBottom(20.f, &Box, &Part); diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index 79df6207b..0abaa2a9e 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -502,6 +502,7 @@ public: { POPUP_NONE = 0, POPUP_FIRST_LAUNCH, + POPUP_POINTS, POPUP_CONNECTING, POPUP_MESSAGE, POPUP_DISCONNECTED, From 055eadd88d765a9410773f78036c5b521b48f1ad Mon Sep 17 00:00:00 2001 From: def Date: Fri, 30 Oct 2020 10:05:46 +0100 Subject: [PATCH 002/144] Sort skins without case (fixes #3213) --- src/game/client/skin.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/client/skin.h b/src/game/client/skin.h index a924bd7e5..423869e01 100644 --- a/src/game/client/skin.h +++ b/src/game/client/skin.h @@ -42,10 +42,10 @@ struct CSkin char m_aName[24]; ColorRGBA m_BloodColor; - bool operator<(const CSkin &Other) const { return str_comp(m_aName, Other.m_aName) < 0; } + bool operator<(const CSkin &Other) const { return str_comp_nocase(m_aName, Other.m_aName) < 0; } - bool operator<(const char *pOther) const { return str_comp(m_aName, pOther) < 0; } - bool operator==(const char *pOther) const { return !str_comp(m_aName, pOther); } + bool operator<(const char *pOther) const { return str_comp_nocase(m_aName, pOther) < 0; } + bool operator==(const char *pOther) const { return !str_comp_nocase(m_aName, pOther); } }; #endif From 71079f094455851b28b4a0c01d53658cc9b9c644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D1=8F=D0=B4=D1=8F=20=D0=96=D0=B5=D0=BD=D1=8F?= Date: Sat, 31 Oct 2020 01:23:07 +0300 Subject: [PATCH 003/144] Fix overlapping of combined binds with modifiers --- src/game/client/components/binds.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/game/client/components/binds.cpp b/src/game/client/components/binds.cpp index 9d1b90e72..25d2403cc 100644 --- a/src/game/client/components/binds.cpp +++ b/src/game/client/components/binds.cpp @@ -143,8 +143,7 @@ bool CBinds::OnInput(IInput::CEvent e) } } - // Shift for emoticons works while moving through map - if(m_aapKeyBindings[0][e.m_Key] && (!ret || m_aapKeyBindings[0][e.m_Key][0] == '+')) + if(m_aapKeyBindings[0][e.m_Key] && !ret) { // When ctrl+shift are pressed (ctrl+shift binds and also the hard-coded ctrl+shift+d, ctrl+shift+g, ctrl+shift+e), ignore other +xxx binds if(e.m_Flags & IInput::FLAG_PRESS && Mask != ((1 << MODIFIER_CTRL) | (1 << MODIFIER_SHIFT))) From bb7ff2a482431617138a34d27605a280a6ca9403 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 31 Oct 2020 09:50:42 +0100 Subject: [PATCH 004/144] Revert "Show halloween skins only on Halloween" People are clearly unhappy with this event, so let's revert it. On servers I've set events 0 already. This reverts commit ae90bdf3f9cf522b0fca5f3b690a624d319f04cf. --- src/game/server/player.cpp | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 886fabe28..1546fa267 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -12,11 +12,6 @@ #include #include -static const char g_aHalloweenSkins[][64] = { - "Bat", "Cyclops", "darky", "dynamite", "Electro Tee", "evil", "ghost", "glitch", - "Lord_of_Zombie", "pumpkin", "reaper", "red_flame", "undead", "Voodoo_tee_1", - "zombie", "zombie1", "zombie2", "zombie3", "zombie4"}; - MACRO_ALLOC_POOL_ID_IMPL(CPlayer, MAX_CLIENTS) IServer *CPlayer::Server() const { return m_pGameServer->Server(); } @@ -321,31 +316,10 @@ void CPlayer::Snap(int SnappingClient) if(!pClientInfo) return; - const char *pSkinName = m_TeeInfos.m_SkinName; - - if(m_Halloween) - { - bool Found = false; - - for(const auto &HalloweenSkin : g_aHalloweenSkins) - { - if(str_comp(pSkinName, HalloweenSkin) == 0) - { - Found = true; - break; - } - } - - if(!Found) - { - pSkinName = g_aHalloweenSkins[str_quickhash(Server()->ClientName(m_ClientID)) % (sizeof(g_aHalloweenSkins) / sizeof(g_aHalloweenSkins[0]))]; - } - } - StrToInts(&pClientInfo->m_Name0, 4, Server()->ClientName(m_ClientID)); StrToInts(&pClientInfo->m_Clan0, 3, Server()->ClientClan(m_ClientID)); pClientInfo->m_Country = Server()->ClientCountry(m_ClientID); - StrToInts(&pClientInfo->m_Skin0, 6, pSkinName); + StrToInts(&pClientInfo->m_Skin0, 6, m_TeeInfos.m_SkinName); pClientInfo->m_UseCustomColor = m_TeeInfos.m_UseCustomColor; pClientInfo->m_ColorBody = m_TeeInfos.m_ColorBody; pClientInfo->m_ColorFeet = m_TeeInfos.m_ColorFeet; From c984203c2d215a3485f5f57895126d66ce1f96af Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 1 Nov 2020 04:48:10 +0100 Subject: [PATCH 005/144] Revert "Disable Chat render on TAB and fix tee icon position" This reverts commit 75987a26cf2eec415f3fba0607e755a42ef85eab. --- src/game/client/components/chat.cpp | 40 ++++++++++++++++------------- src/game/client/components/chat.h | 6 ++--- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index d0885103d..cc7759ee4 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -58,7 +58,8 @@ void CChat::RebuildChat() Graphics()->DeleteQuadContainer(m_aLines[i].m_QuadContainerIndex); m_aLines[i].m_QuadContainerIndex = -1; // recalculate sizes - m_aLines[i].m_YOffset = -1.f; + m_aLines[i].m_YOffset[0] = -1.f; + m_aLines[i].m_YOffset[1] = -1.f; } } @@ -84,7 +85,7 @@ void CChat::Reset() m_aLines[i].m_TimesRepeated = 0; m_aLines[i].m_HasRenderTee = false; } - + m_PrevScoreBoardShowed = false; m_PrevShowChat = false; m_ReverseTAB = false; @@ -701,7 +702,8 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine) Graphics()->DeleteQuadContainer(pCurrentLine->m_QuadContainerIndex); pCurrentLine->m_QuadContainerIndex = -1; pCurrentLine->m_Time = time(); - pCurrentLine->m_YOffset = -1.f; + pCurrentLine->m_YOffset[0] = -1.f; + pCurrentLine->m_YOffset[1] = -1.f; return; } @@ -710,7 +712,8 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine) pCurrentLine = &m_aLines[m_CurrentLine]; pCurrentLine->m_TimesRepeated = 0; pCurrentLine->m_Time = time(); - pCurrentLine->m_YOffset = -1.0f; + pCurrentLine->m_YOffset[0] = -1.0f; + pCurrentLine->m_YOffset[1] = -1.0f; pCurrentLine->m_ClientID = ClientID; pCurrentLine->m_Team = Team; pCurrentLine->m_NameColor = -2; @@ -890,9 +893,12 @@ void CChat::OnPrepareLines() float y = 300.0f - 28.0f; float FontSize = FONT_SIZE; + bool ForceRecreate = m_pClient->m_pScoreboard->Active() != m_PrevScoreBoardShowed; bool ShowLargeArea = m_Show || g_Config.m_ClShowChat == 2; - bool ForceRecreate = ShowLargeArea != m_PrevShowChat; + ForceRecreate |= ShowLargeArea != m_PrevShowChat; + + m_PrevScoreBoardShowed = m_pClient->m_pScoreboard->Active(); m_PrevShowChat = ShowLargeArea; float RealMsgPaddingX = MESSAGE_PADDING_X; @@ -909,12 +915,13 @@ void CChat::OnPrepareLines() RealMsgPaddingTee = 0; int64 Now = time(); - float LineWidth = CHAT_WIDTH - RealMsgPaddingX - RealMsgPaddingTee; + float LineWidth = (m_pClient->m_pScoreboard->Active() ? 90.0f : 200.0f) - RealMsgPaddingX - RealMsgPaddingTee; - float HeightLimit = m_PrevShowChat ? CHAT_HEIGHT_MIN : CHAT_HEIGHT_FULL; + float HeightLimit = m_pClient->m_pScoreboard->Active() ? 180.0f : m_PrevShowChat ? 50.0f : 200.0f; float Begin = x; float TextBegin = Begin + RealMsgPaddingX / 2.0f; CTextCursor Cursor; + int OffsetType = m_pClient->m_pScoreboard->Active() ? 1 : 0; for(int i = 0; i < MAX_LINES; i++) { @@ -960,7 +967,7 @@ void CChat::OnPrepareLines() } // get the y offset (calculate it if we haven't done that yet) - if(m_aLines[r].m_YOffset < 0.0f) + if(m_aLines[r].m_YOffset[OffsetType] < 0.0f) { TextRender()->SetCursor(&Cursor, TextBegin, 0.0f, FontSize, 0); Cursor.m_LineWidth = LineWidth; @@ -990,10 +997,10 @@ void CChat::OnPrepareLines() TextRender()->TextEx(&AppendCursor, m_aLines[r].m_aText, -1); - m_aLines[r].m_YOffset = AppendCursor.m_Y + AppendCursor.m_FontSize + RealMsgPaddingY; + m_aLines[r].m_YOffset[OffsetType] = AppendCursor.m_Y + AppendCursor.m_FontSize + RealMsgPaddingY; } - y -= m_aLines[r].m_YOffset; + y -= m_aLines[r].m_YOffset[OffsetType]; // cut off if msgs waste too much space if(y < HeightLimit) @@ -1104,7 +1111,7 @@ void CChat::OnPrepareLines() if(g_Config.m_ClChatBackground && (m_aLines[r].m_aText[0] != '\0' || m_aLines[r].m_aName[0] != '\0')) { - float Height = m_aLines[r].m_YOffset; + float Height = m_aLines[r].m_YOffset[OffsetType]; Graphics()->SetColor(1, 1, 1, 1); m_aLines[r].m_QuadContainerIndex = RenderTools()->CreateRoundRectQuadContainer(Begin, y, (AppendCursor.m_LongestLineWidth - TextBegin) + RealMsgPaddingX * 1.5f, Height, MESSAGE_ROUNDING, CUI::CORNER_ALL); } @@ -1119,10 +1126,6 @@ void CChat::OnPrepareLines() void CChat::OnRender() { - // Do not render chat when scoreboard active - if(m_pClient->m_pScoreboard->Active()) - return; - // send pending chat messages if(m_PendingChatCounter > 0 && m_LastChatSend + time_freq() < time()) { @@ -1219,7 +1222,8 @@ void CChat::OnRender() OnPrepareLines(); int64 Now = time(); - float HeightLimit = m_PrevShowChat ? CHAT_HEIGHT_MIN : CHAT_HEIGHT_FULL; + float HeightLimit = m_pClient->m_pScoreboard->Active() ? 180.0f : m_PrevShowChat ? 50.0f : 200.0f; + int OffsetType = m_pClient->m_pScoreboard->Active() ? 1 : 0; float RealMsgPaddingX = MESSAGE_PADDING_X; float RealMsgPaddingY = MESSAGE_PADDING_Y; @@ -1236,7 +1240,7 @@ void CChat::OnRender() if(Now > m_aLines[r].m_Time + 16 * time_freq() && !m_PrevShowChat) break; - y -= m_aLines[r].m_YOffset; + y -= m_aLines[r].m_YOffset[OffsetType]; // cut off if msgs waste too much space if(y < HeightLimit) @@ -1273,7 +1277,7 @@ void CChat::OnRender() float RowHeight = FONT_SIZE + RealMsgPaddingY; float OffsetTeeY = MESSAGE_TEE_SIZE / 2.0f; float FullHeightMinusTee = RowHeight - MESSAGE_TEE_SIZE; - float TWSkinUnreliableOffset = 0.25f; // teeworlds skins were always a bit in the ground + float TWSkinUnreliableOffset = 1.0f; // teeworlds skins were always a bit in the ground CAnimState *pIdleState = CAnimState::GetIdle(); RenderTools()->RenderTee(pIdleState, &RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), vec2(x + (RealMsgPaddingX + MESSAGE_TEE_SIZE) / 2.0f, y + OffsetTeeY + FullHeightMinusTee / 2.0f + TWSkinUnreliableOffset), Blend); diff --git a/src/game/client/components/chat.h b/src/game/client/components/chat.h index af960162d..1d1342756 100644 --- a/src/game/client/components/chat.h +++ b/src/game/client/components/chat.h @@ -11,9 +11,6 @@ class CChat : public CComponent { CLineInput m_Input; - static constexpr float CHAT_WIDTH = 200.0f; - static constexpr float CHAT_HEIGHT_FULL = 200.0f; - static constexpr float CHAT_HEIGHT_MIN = 50.0f; static constexpr float MESSAGE_PADDING_X = 5.0f; static constexpr float MESSAGE_TEE_SIZE = 7.0f; static constexpr float MESSAGE_TEE_PADDING_RIGHT = 0.5f; @@ -30,7 +27,7 @@ class CChat : public CComponent struct CLine { int64 m_Time; - float m_YOffset; + float m_YOffset[2]; int m_ClientID; int m_Team; int m_NameColor; @@ -54,6 +51,7 @@ class CChat : public CComponent int m_TimesRepeated; }; + bool m_PrevScoreBoardShowed; bool m_PrevShowChat; CLine m_aLines[MAX_LINES]; From 1d912b2df6e423b976821f649b48dda82260c6c8 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 1 Nov 2020 04:52:07 +0100 Subject: [PATCH 006/144] Don't align text with scoreboard open --- src/game/client/components/chat.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index cc7759ee4..333fd9823 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -893,12 +893,14 @@ void CChat::OnPrepareLines() float y = 300.0f - 28.0f; float FontSize = FONT_SIZE; - bool ForceRecreate = m_pClient->m_pScoreboard->Active() != m_PrevScoreBoardShowed; + bool IsScoreBoardOpen = m_pClient->m_pScoreboard->Active(); + + bool ForceRecreate = IsScoreBoardOpen != m_PrevScoreBoardShowed; bool ShowLargeArea = m_Show || g_Config.m_ClShowChat == 2; ForceRecreate |= ShowLargeArea != m_PrevShowChat; - m_PrevScoreBoardShowed = m_pClient->m_pScoreboard->Active(); + m_PrevScoreBoardShowed = IsScoreBoardOpen; m_PrevShowChat = ShowLargeArea; float RealMsgPaddingX = MESSAGE_PADDING_X; @@ -915,13 +917,13 @@ void CChat::OnPrepareLines() RealMsgPaddingTee = 0; int64 Now = time(); - float LineWidth = (m_pClient->m_pScoreboard->Active() ? 90.0f : 200.0f) - RealMsgPaddingX - RealMsgPaddingTee; + float LineWidth = (IsScoreBoardOpen ? 90.0f : 200.0f) - RealMsgPaddingX - RealMsgPaddingTee; - float HeightLimit = m_pClient->m_pScoreboard->Active() ? 180.0f : m_PrevShowChat ? 50.0f : 200.0f; + float HeightLimit = IsScoreBoardOpen ? 180.0f : m_PrevShowChat ? 50.0f : 200.0f; float Begin = x; float TextBegin = Begin + RealMsgPaddingX / 2.0f; CTextCursor Cursor; - int OffsetType = m_pClient->m_pScoreboard->Active() ? 1 : 0; + int OffsetType = IsScoreBoardOpen ? 1 : 0; for(int i = 0; i < MAX_LINES; i++) { @@ -992,8 +994,12 @@ void CChat::OnPrepareLines() } CTextCursor AppendCursor = Cursor; - AppendCursor.m_StartX = Cursor.m_X; - AppendCursor.m_LineWidth -= (Cursor.m_LongestLineWidth - Cursor.m_StartX); + + if(!IsScoreBoardOpen) + { + AppendCursor.m_StartX = Cursor.m_X; + AppendCursor.m_LineWidth -= (Cursor.m_LongestLineWidth - Cursor.m_StartX); + } TextRender()->TextEx(&AppendCursor, m_aLines[r].m_aText, -1); @@ -1101,8 +1107,11 @@ void CChat::OnPrepareLines() TextRender()->TextColor(Color); CTextCursor AppendCursor = Cursor; - AppendCursor.m_LineWidth -= (Cursor.m_LongestLineWidth - Cursor.m_StartX); - AppendCursor.m_StartX = Cursor.m_X; + if(!IsScoreBoardOpen) + { + AppendCursor.m_LineWidth -= (Cursor.m_LongestLineWidth - Cursor.m_StartX); + AppendCursor.m_StartX = Cursor.m_X; + } if(m_aLines[r].m_TextContainerIndex == -1) m_aLines[r].m_TextContainerIndex = TextRender()->CreateTextContainer(&AppendCursor, m_aLines[r].m_aText); From 143074349edc3b4a87d064dad59d7c4b482d27d1 Mon Sep 17 00:00:00 2001 From: Patiga Date: Sun, 1 Nov 2020 23:04:33 +0100 Subject: [PATCH 007/144] Add m_PosEnv as index that must be offset when appended --- src/game/editor/layer_sounds.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/game/editor/layer_sounds.cpp b/src/game/editor/layer_sounds.cpp index 22e38ffe4..472617c7a 100644 --- a/src/game/editor/layer_sounds.cpp +++ b/src/game/editor/layer_sounds.cpp @@ -227,5 +227,8 @@ void CLayerSounds::ModifySoundIndex(INDEX_MODIFY_FUNC Func) void CLayerSounds::ModifyEnvelopeIndex(INDEX_MODIFY_FUNC Func) { for(int i = 0; i < m_lSources.size(); i++) + { Func(&m_lSources[i].m_SoundEnv); + Func(&m_lSources[i].m_PosEnv); + } } From 532d845aedd804184146fe2b324f3fe7691b7c8e Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Mon, 2 Nov 2020 21:21:57 +0100 Subject: [PATCH 008/144] Fix skin load --- src/game/client/components/skins.cpp | 11 ++++------- src/game/client/components/skins.h | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp index df5faea22..7fc664c38 100644 --- a/src/game/client/components/skins.cpp +++ b/src/game/client/components/skins.cpp @@ -55,7 +55,7 @@ int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser) return pSelf->LoadSkin(aNameWithoutPng, aBuf, DirType); } -int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType, int *pGetSkinID) +int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) { char aBuf[512]; CImageInfo Info; @@ -172,10 +172,8 @@ int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType, int *pGe str_format(aBuf, sizeof(aBuf), "load skin %s", Skin.m_aName); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf); } - m_aSkins.add(Skin); - if(pGetSkinID) - *pGetSkinID = m_aSkins.size() - 1; + m_aSkins.add(Skin); return 0; } @@ -293,20 +291,19 @@ int CSkins::FindImpl(const char *pName) auto d = ::find_binary(m_aDownloadSkins.all(), pName); if(!d.empty()) { - int SkinID = -1; if(d.front().m_pTask && d.front().m_pTask->State() == HTTP_DONE) { char aPath[MAX_PATH_LENGTH]; str_format(aPath, sizeof(aPath), "downloadedskins/%s.png", d.front().m_aName); Storage()->RenameFile(d.front().m_aPath, aPath, IStorage::TYPE_SAVE); - LoadSkin(d.front().m_aName, aPath, IStorage::TYPE_SAVE, &SkinID); + LoadSkin(d.front().m_aName, aPath, IStorage::TYPE_SAVE); d.front().m_pTask = nullptr; } if(d.front().m_pTask && (d.front().m_pTask->State() == HTTP_ERROR || d.front().m_pTask->State() == HTTP_ABORTED)) { d.front().m_pTask = nullptr; } - return SkinID; + return -1; } CDownloadSkin Skin; diff --git a/src/game/client/components/skins.h b/src/game/client/components/skins.h index c1a56c343..4b6c35aff 100644 --- a/src/game/client/components/skins.h +++ b/src/game/client/components/skins.h @@ -35,7 +35,7 @@ private: sorted_array m_aDownloadSkins; char m_EventSkinPrefix[24]; - int LoadSkin(const char *pName, const char *pPath, int DirType, int *pGetSkinID = NULL); + int LoadSkin(const char *pName, const char *pPath, int DirType); int FindImpl(const char *pName); static int SkinScan(const char *pName, int IsDir, int DirType, void *pUser); }; From dad91eb763d1d84de959a741f06eae44660cf170 Mon Sep 17 00:00:00 2001 From: def Date: Mon, 26 Oct 2020 11:28:18 +0100 Subject: [PATCH 009/144] Enable readability-qualified-auto clang-tidy check https://clang.llvm.org/extra/clang-tidy/checks/readability-qualified-auto.html --- .clang-tidy | 1 + src/game/server/score.cpp | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index f18828dfa..df8c0eeb2 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -16,4 +16,5 @@ Checks: > -clang-analyzer-optin.cplusplus.VirtualCall, -clang-analyzer-optin.performance.Padding, -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, + readability-qualified-auto, HeaderFilterRegex: 'src/.*' diff --git a/src/game/server/score.cpp b/src/game/server/score.cpp index 136aba683..876016942 100644 --- a/src/game/server/score.cpp +++ b/src/game/server/score.cpp @@ -275,7 +275,7 @@ void CScore::MapVote(int ClientID, const char *MapName) bool CScore::MapVoteThread(IDbConnection *pSqlServer, const ISqlData *pGameData) { const CSqlPlayerRequest *pData = dynamic_cast(pGameData); - auto paMessages = pData->m_pResult->m_Data.m_aaMessages; + auto *paMessages = pData->m_pResult->m_Data.m_aaMessages; char aFuzzyMap[128]; str_copy(aFuzzyMap, pData->m_Name, sizeof(aFuzzyMap)); @@ -304,7 +304,7 @@ bool CScore::MapVoteThread(IDbConnection *pSqlServer, const ISqlData *pGameData) if(pSqlServer->Step()) { pData->m_pResult->SetVariant(CScorePlayerResult::MAP_VOTE); - auto MapVote = &pData->m_pResult->m_Data.m_MapVote; + auto *MapVote = &pData->m_pResult->m_Data.m_MapVote; pSqlServer->GetString(1, MapVote->m_Map, sizeof(MapVote->m_Map)); pSqlServer->GetString(2, MapVote->m_Server, sizeof(MapVote->m_Server)); strcpy(MapVote->m_Reason, "/map"); @@ -474,7 +474,7 @@ void CScore::SaveScore(int ClientID, float Time, const char *pTimestamp, float C bool CScore::SaveScoreThread(IDbConnection *pSqlServer, const ISqlData *pGameData, bool Failure) { const CSqlScoreData *pData = dynamic_cast(pGameData); - auto paMessages = pData->m_pResult->m_Data.m_aaMessages; + auto *paMessages = pData->m_pResult->m_Data.m_aaMessages; char aBuf[1024]; @@ -843,7 +843,7 @@ void CScore::ShowTeamTop5(int ClientID, int Offset) bool CScore::ShowTeamTop5Thread(IDbConnection *pSqlServer, const ISqlData *pGameData) { const CSqlPlayerRequest *pData = dynamic_cast(pGameData); - auto paMessages = pData->m_pResult->m_Data.m_aaMessages; + auto *paMessages = pData->m_pResult->m_Data.m_aaMessages; int LimitStart = maximum(abs(pData->m_Offset) - 1, 0); const char *pOrder = pData->m_Offset >= 0 ? "ASC" : "DESC"; @@ -933,7 +933,7 @@ void CScore::ShowTimes(int ClientID, const char *pName, int Offset) bool CScore::ShowTimesThread(IDbConnection *pSqlServer, const ISqlData *pGameData) { const CSqlPlayerRequest *pData = dynamic_cast(pGameData); - auto paMessages = pData->m_pResult->m_Data.m_aaMessages; + auto *paMessages = pData->m_pResult->m_Data.m_aaMessages; int LimitStart = maximum(abs(pData->m_Offset) - 1, 0); const char *pOrder = pData->m_Offset >= 0 ? "DESC" : "ASC"; @@ -1036,7 +1036,7 @@ void CScore::ShowPoints(int ClientID, const char *pName) bool CScore::ShowPointsThread(IDbConnection *pSqlServer, const ISqlData *pGameData) { const CSqlPlayerRequest *pData = dynamic_cast(pGameData); - auto paMessages = pData->m_pResult->m_Data.m_aaMessages; + auto *paMessages = pData->m_pResult->m_Data.m_aaMessages; char aBuf[512]; str_format(aBuf, sizeof(aBuf), @@ -1081,7 +1081,7 @@ void CScore::ShowTopPoints(int ClientID, int Offset) bool CScore::ShowTopPointsThread(IDbConnection *pSqlServer, const ISqlData *pGameData) { const CSqlPlayerRequest *pData = dynamic_cast(pGameData); - auto paMessages = pData->m_pResult->m_Data.m_aaMessages; + auto *paMessages = pData->m_pResult->m_Data.m_aaMessages; int LimitStart = maximum(abs(pData->m_Offset) - 1, 0); const char *pOrder = pData->m_Offset >= 0 ? "ASC" : "DESC"; @@ -1246,7 +1246,7 @@ void CScore::SaveTeam(int ClientID, const char *Code, const char *Server) { if(RateLimitPlayer(ClientID)) return; - auto pController = ((CGameControllerDDRace *)(GameServer()->m_pController)); + auto *pController = ((CGameControllerDDRace *)(GameServer()->m_pController)); int Team = pController->m_Teams.m_Core.Team(ClientID); if(pController->m_Teams.GetSaving(Team)) return; @@ -1376,7 +1376,7 @@ void CScore::LoadTeam(const char *Code, int ClientID) { if(RateLimitPlayer(ClientID)) return; - auto pController = ((CGameControllerDDRace *)(GameServer()->m_pController)); + auto *pController = ((CGameControllerDDRace *)(GameServer()->m_pController)); int Team = pController->m_Teams.m_Core.Team(ClientID); if(pController->m_Teams.GetSaving(Team)) return; @@ -1519,7 +1519,7 @@ void CScore::GetSaves(int ClientID) bool CScore::GetSavesThread(IDbConnection *pSqlServer, const ISqlData *pGameData) { const CSqlPlayerRequest *pData = dynamic_cast(pGameData); - auto paMessages = pData->m_pResult->m_Data.m_aaMessages; + auto *paMessages = pData->m_pResult->m_Data.m_aaMessages; char aSaveLike[128] = ""; str_append(aSaveLike, "%\n", sizeof(aSaveLike)); From b1f0fd896960387d5ef9df241347b244ad6d3d72 Mon Sep 17 00:00:00 2001 From: def Date: Mon, 26 Oct 2020 14:11:11 +0100 Subject: [PATCH 010/144] Enable modernize-loop-convert clang-tidy check and run clang-format afterwards https://clang.llvm.org/extra/clang-tidy/checks/modernize-loop-convert.html --- .clang-tidy | 1 + src/engine/client/backend_sdl.cpp | 20 ++--- src/engine/client/client.cpp | 30 +++---- src/engine/client/graphics_threaded.cpp | 36 ++++----- src/engine/client/http.cpp | 4 +- src/engine/client/serverbrowser.cpp | 22 +++-- src/engine/client/sound.cpp | 30 +++---- src/engine/client/text.cpp | 34 ++++---- src/engine/client/updater.cpp | 14 ++-- src/engine/server/authmanager.cpp | 10 +-- src/engine/server/register.cpp | 32 ++++---- src/engine/server/server.cpp | 58 +++++++------- src/engine/shared/datafile.cpp | 4 +- src/engine/shared/econ.cpp | 4 +- src/engine/shared/masterserver.cpp | 20 ++--- src/engine/shared/network_console.cpp | 8 +- src/engine/shared/network_server.cpp | 4 +- src/game/client/components/binds.cpp | 16 ++-- src/game/client/components/chat.cpp | 54 ++++++------- src/game/client/components/controls.cpp | 8 +- src/game/client/components/countryflags.cpp | 4 +- src/game/client/components/ghost.cpp | 22 ++--- src/game/client/components/killmessages.cpp | 26 +++--- .../client/components/menu_background.cpp | 8 +- src/game/client/components/menus_browser.cpp | 4 +- src/game/client/components/menus_ingame.cpp | 14 ++-- src/game/client/components/menus_settings.cpp | 20 +++-- .../components/menus_settings_assets.cpp | 8 +- src/game/client/components/nameplates.cpp | 12 +-- src/game/client/components/particles.cpp | 10 +-- src/game/client/components/race_demo.cpp | 6 +- src/game/client/components/scoreboard.cpp | 6 +- src/game/client/components/skins.cpp | 12 +-- src/game/client/components/spectator.cpp | 4 +- src/game/client/components/statboard.cpp | 20 ++--- src/game/client/gameclient.cpp | 74 ++++++++--------- .../client/prediction/entities/character.cpp | 4 +- src/game/client/prediction/gameworld.cpp | 38 ++++----- src/game/client/race.cpp | 6 +- src/game/client/skin.h | 4 +- src/game/editor/editor.cpp | 16 ++-- src/game/editor/io.cpp | 12 +-- src/game/editor/layer_quads.cpp | 26 +++--- src/game/editor/popups.cpp | 8 +- src/game/mapbugs.cpp | 6 +- src/game/server/ddracechat.cpp | 6 +- src/game/server/entities/character.cpp | 4 +- src/game/server/entities/dragger.cpp | 18 ++--- src/game/server/entities/light.cpp | 4 +- src/game/server/gamecontext.cpp | 80 +++++++++---------- src/game/server/gamecontroller.cpp | 10 +-- src/game/server/gameworld.cpp | 38 ++++----- src/game/server/player.cpp | 18 ++--- src/game/server/score.cpp | 12 +-- src/game/server/score.h | 4 +- src/game/server/teehistorian.cpp | 6 +- src/game/server/teeinfo.cpp | 16 ++-- src/tools/dummy_map.cpp | 10 +-- src/tools/packetgen.cpp | 4 +- 59 files changed, 499 insertions(+), 510 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index df8c0eeb2..a08e38ff4 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -16,5 +16,6 @@ Checks: > -clang-analyzer-optin.cplusplus.VirtualCall, -clang-analyzer-optin.performance.Padding, -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, + modernize-loop-convert, readability-qualified-auto, HeaderFilterRegex: 'src/.*' diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 281a47c35..03709355f 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -1826,12 +1826,12 @@ void CCommandProcessorFragment_OpenGL2::Cmd_DeleteBufferContainer(const CCommand int VertBufferID = BufferContainer.m_ContainerInfo.m_Attributes[i].m_VertBufferBindingIndex; if(VertBufferID != -1) { - for(size_t j = 0; j < BufferContainer.m_ContainerInfo.m_Attributes.size(); ++j) + for(auto &m_Attribute : BufferContainer.m_ContainerInfo.m_Attributes) { // set all equal ids to zero to not double delete - if(VertBufferID == BufferContainer.m_ContainerInfo.m_Attributes[j].m_VertBufferBindingIndex) + if(VertBufferID == m_Attribute.m_VertBufferBindingIndex) { - BufferContainer.m_ContainerInfo.m_Attributes[j].m_VertBufferBindingIndex = -1; + m_Attribute.m_VertBufferBindingIndex = -1; } } @@ -3096,12 +3096,12 @@ void CCommandProcessorFragment_OpenGL3_3::DestroyBufferContainer(int Index, bool int VertBufferID = BufferContainer.m_ContainerInfo.m_Attributes[i].m_VertBufferBindingIndex; if(VertBufferID != -1) { - for(size_t j = 0; j < BufferContainer.m_ContainerInfo.m_Attributes.size(); ++j) + for(auto &m_Attribute : BufferContainer.m_ContainerInfo.m_Attributes) { // set all equal ids to zero to not double delete - if(VertBufferID == BufferContainer.m_ContainerInfo.m_Attributes[j].m_VertBufferBindingIndex) + if(VertBufferID == m_Attribute.m_VertBufferBindingIndex) { - BufferContainer.m_ContainerInfo.m_Attributes[j].m_VertBufferBindingIndex = -1; + m_Attribute.m_VertBufferBindingIndex = -1; } } @@ -3146,11 +3146,11 @@ void CCommandProcessorFragment_OpenGL3_3::AppendIndices(unsigned int NewIndicesC glDeleteBuffers(1, &m_QuadDrawIndexBufferID); m_QuadDrawIndexBufferID = NewIndexBufferID; - for(int i = 0; i < MAX_STREAM_BUFFER_COUNT; ++i) - m_LastIndexBufferBound[i] = 0; - for(size_t i = 0; i < m_BufferContainers.size(); ++i) + for(unsigned int &i : m_LastIndexBufferBound) + i = 0; + for(auto &m_BufferContainer : m_BufferContainers) { - m_BufferContainers[i].m_LastIndexBufferBound = 0; + m_BufferContainer.m_LastIndexBufferBound = 0; } m_CurrentIndicesInBuffer = NewIndicesCount; diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 4132981dc..9fdb79e64 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -263,8 +263,8 @@ void CSmoothTime::Update(CGraph *pGraph, int64 Target, int TimeLeft, int AdjustD CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta) { - for(int i = 0; i < RECORDER_MAX; i++) - m_DemoRecorder[i] = CDemoRecorder(&m_SnapshotDelta); + for(auto &i : m_DemoRecorder) + i = CDemoRecorder(&m_SnapshotDelta); m_pEditor = 0; m_pInput = 0; @@ -403,9 +403,9 @@ int CClient::SendMsg(CMsgPacker *pMsg, int Flags) if(Flags & MSGFLAG_RECORD) { - for(int i = 0; i < RECORDER_MAX; i++) - if(m_DemoRecorder[i].IsRecording()) - m_DemoRecorder[i].RecordMessage(Packet.m_pData, Packet.m_DataSize); + for(auto &i : m_DemoRecorder) + if(i.IsRecording()) + i.RecordMessage(Packet.m_pData, Packet.m_DataSize); } if(!(Flags & MSGFLAG_NOSEND)) @@ -2019,12 +2019,12 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket) SnapshotRemoveExtraInfo(aExtraInfoRemoved); // add snapshot to demo - for(int i = 0; i < RECORDER_MAX; i++) + for(auto &i : m_DemoRecorder) { - if(m_DemoRecorder[i].IsRecording()) + if(i.IsRecording()) { // write snapshot - m_DemoRecorder[i].RecordSnapshot(GameTick, aExtraInfoRemoved, SnapSize); + i.RecordSnapshot(GameTick, aExtraInfoRemoved, SnapSize); } } @@ -2091,9 +2091,9 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket) if((pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 || Msg == NETMSGTYPE_SV_EXTRAPROJECTILE) { // game message - for(int i = 0; i < RECORDER_MAX; i++) - if(m_DemoRecorder[i].IsRecording()) - m_DemoRecorder[i].RecordMessage(pPacket->m_pData, pPacket->m_DataSize); + for(auto &i : m_DemoRecorder) + if(i.IsRecording()) + i.RecordMessage(pPacket->m_pData, pPacket->m_DataSize); GameClient()->OnMessage(Msg, &Unpacker); } @@ -2530,9 +2530,9 @@ void CClient::LoadDDNetInfo() void CClient::PumpNetwork() { - for(int i = 0; i < NUM_CLIENTS; i++) + for(auto &i : m_NetClient) { - m_NetClient[i].Update(); + i.Update(); } if(State() != IClient::STATE_DEMOPLAYBACK) @@ -3056,12 +3056,12 @@ void CClient::Run() mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; } - for(int i = 0; i < NUM_CLIENTS; i++) + for(auto &i : m_NetClient) { do { BindAddr.port = (secure_rand() % 64511) + 1024; - } while(!m_NetClient[i].Open(BindAddr, 0)); + } while(!i.Open(BindAddr, 0)); } } diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index 7732c898d..6c73d5727 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -757,12 +757,12 @@ void CGraphics_Threaded::SetColor(float r, float g, float b, float a) b *= 255.f; a *= 255.f; - for(int i = 0; i < 4; ++i) + for(auto &i : m_aColor) { - m_aColor[i].r = (unsigned char)(r); - m_aColor[i].g = (unsigned char)(g); - m_aColor[i].b = (unsigned char)(b); - m_aColor[i].a = (unsigned char)(a); + i.r = (unsigned char)(r); + i.g = (unsigned char)(g); + i.b = (unsigned char)(b); + i.a = (unsigned char)(a); } } @@ -2022,8 +2022,8 @@ int CGraphics_Threaded::CreateBufferContainer(SBufferContainerInfo *pContainerIn mem_copy(Cmd.m_Attributes, &pContainerInfo->m_Attributes[0], Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - for(size_t i = 0; i < pContainerInfo->m_Attributes.size(); ++i) - m_VertexArrayInfo[Index].m_AssociatedBufferObjectIndices.push_back(pContainerInfo->m_Attributes[i].m_VertBufferBindingIndex); + for(auto &m_Attribute : pContainerInfo->m_Attributes) + m_VertexArrayInfo[Index].m_AssociatedBufferObjectIndices.push_back(m_Attribute.m_VertBufferBindingIndex); return Index; } @@ -2058,10 +2058,10 @@ void CGraphics_Threaded::DeleteBufferContainer(int ContainerIndex, bool DestroyA if(BufferObjectIndex != -1) { // don't delete double entries - for(size_t n = 0; n < m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices.size(); ++n) + for(int &m_AssociatedBufferObjectIndice : m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices) { - if(BufferObjectIndex == m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices[n]) - m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices[n] = -1; + if(BufferObjectIndex == m_AssociatedBufferObjectIndice) + m_AssociatedBufferObjectIndice = -1; } // clear the buffer object index m_BufferObjectIndices[BufferObjectIndex] = m_FirstFreeBufferObjectIndex; @@ -2110,8 +2110,8 @@ void CGraphics_Threaded::UpdateBufferContainer(int ContainerIndex, SBufferContai mem_copy(Cmd.m_Attributes, &pContainerInfo->m_Attributes[0], Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices.clear(); - for(size_t i = 0; i < pContainerInfo->m_Attributes.size(); ++i) - m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices.push_back(pContainerInfo->m_Attributes[i].m_VertBufferBindingIndex); + for(auto &m_Attribute : pContainerInfo->m_Attributes) + m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices.push_back(m_Attribute.m_VertBufferBindingIndex); } void CGraphics_Threaded::IndicesNumRequiredNotify(unsigned int RequiredIndicesCount) @@ -2292,8 +2292,8 @@ int CGraphics_Threaded::Init() return -1; // create command buffers - for(int i = 0; i < NUM_CMDBUFFERS; i++) - m_apCommandBuffers[i] = new CCommandBuffer(CMD_BUFFER_CMD_BUFFER_SIZE, CMD_BUFFER_DATA_BUFFER_SIZE); + for(auto &m_apCommandBuffer : m_apCommandBuffers) + m_apCommandBuffer = new CCommandBuffer(CMD_BUFFER_CMD_BUFFER_SIZE, CMD_BUFFER_DATA_BUFFER_SIZE); m_pCommandBuffer = m_apCommandBuffers[0]; // create null texture, will get id=0 @@ -2315,8 +2315,8 @@ void CGraphics_Threaded::Shutdown() m_pBackend = 0x0; // delete the command buffers - for(int i = 0; i < NUM_CMDBUFFERS; i++) - delete m_apCommandBuffers[i]; + for(auto &m_apCommandBuffer : m_apCommandBuffers) + delete m_apCommandBuffer; } int CGraphics_Threaded::GetNumScreens() const @@ -2377,8 +2377,8 @@ void CGraphics_Threaded::Resize(int w, int h) KickCommandBuffer(); WaitForIdle(); - for(size_t i = 0; i < m_ResizeListeners.size(); ++i) - m_ResizeListeners[i].m_pFunc(m_ResizeListeners[i].m_pUser); + for(auto &m_ResizeListener : m_ResizeListeners) + m_ResizeListener.m_pFunc(m_ResizeListener.m_pUser); } void CGraphics_Threaded::AddWindowResizeListener(WINDOW_RESIZE_FUNC pFunc, void *pUser) diff --git a/src/engine/client/http.cpp b/src/engine/client/http.cpp index 9c00dcba9..af2efeacc 100644 --- a/src/engine/client/http.cpp +++ b/src/engine/client/http.cpp @@ -56,9 +56,9 @@ bool HttpInit(IStorage *pStorage) dbg_msg("http", "libcurl version %s (compiled = " LIBCURL_VERSION ")", pVersion->version); } - for(unsigned int i = 0; i < sizeof(gs_aLocks) / sizeof(gs_aLocks[0]); i++) + for(auto &gs_aLock : gs_aLocks) { - gs_aLocks[i] = lock_create(); + gs_aLock = lock_create(); } curl_share_setopt(gs_Share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); curl_share_setopt(gs_Share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index 023540796..ab135a88e 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -334,10 +334,8 @@ void SetFilteredPlayers(const CServerInfo &Item) Item.m_NumFilteredPlayers = Item.m_NumClients; if(g_Config.m_BrFilterConnectingPlayers) { - for(int i = 0; i < MAX_CLIENTS; i++) + for(const auto &Client : Item.m_aClients) { - const CServerInfo::CClient &Client = Item.m_aClients[i]; - if(str_comp(Client.m_aName, "(connecting)") == 0 && Client.m_aClan[0] == '\0' && Client.m_Country == -1 && Client.m_Score == 0) Item.m_NumFilteredPlayers--; } @@ -481,11 +479,11 @@ CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr) } // check if it's an official server - for(int Network = 0; Network < NUM_NETWORKS; Network++) + for(auto &m_aNetwork : m_aNetworks) { - for(int i = 0; i < m_aNetworks[Network].m_NumCountries; i++) + for(int i = 0; i < m_aNetwork.m_NumCountries; i++) { - CNetworkCountry *pCntr = &m_aNetworks[Network].m_aCountries[i]; + CNetworkCountry *pCntr = &m_aNetwork.m_aCountries[i]; for(int j = 0; j < pCntr->m_NumServers; j++) { if(net_addr_comp(&Addr, &pCntr->m_aServers[j]) == 0) @@ -1141,11 +1139,11 @@ void CServerBrowser::LoadDDNetServers() void CServerBrowser::RecheckOfficial() { - for(int Network = 0; Network < NUM_NETWORKS; Network++) + for(auto &m_aNetwork : m_aNetworks) { - for(int i = 0; i < m_aNetworks[Network].m_NumCountries; i++) + for(int i = 0; i < m_aNetwork.m_NumCountries; i++) { - CNetworkCountry *pCntr = &m_aNetworks[Network].m_aCountries[i]; + CNetworkCountry *pCntr = &m_aNetwork.m_aCountries[i]; for(int j = 0; j < pCntr->m_NumServers; j++) { CServerEntry *pEntry = Find(pCntr->m_aServers[j]); @@ -1323,11 +1321,11 @@ void CServerBrowser::CountryFilterClean(int Network) char aNewList[128]; aNewList[0] = '\0'; - for(int Network = 0; Network < NUM_NETWORKS; Network++) + for(auto &m_aNetwork : m_aNetworks) { - for(int i = 0; i < m_aNetworks[Network].m_NumCountries; i++) + for(int i = 0; i < m_aNetwork.m_NumCountries; i++) { - const char *pName = m_aNetworks[Network].m_aCountries[i].m_aName; + const char *pName = m_aNetwork.m_aCountries[i].m_aName; if(DDNetFiltered(pExcludeCountries, pName)) { char aBuf[128]; diff --git a/src/engine/client/sound.cpp b/src/engine/client/sound.cpp index 5ea2fcf00..87e120dc0 100644 --- a/src/engine/client/sound.cpp +++ b/src/engine/client/sound.cpp @@ -115,12 +115,12 @@ static void Mix(short *pFinalOut, unsigned Frames) MasterVol = m_SoundVolume; - for(unsigned i = 0; i < NUM_VOICES; i++) + for(auto &m_aVoice : m_aVoices) { - if(m_aVoices[i].m_pSample) + if(m_aVoice.m_pSample) { // mix voice - CVoice *v = &m_aVoices[i]; + CVoice *v = &m_aVoice; int *pOut = m_pMixBuffer; int Step = v->m_pSample->m_Channels; // setup input sources @@ -937,15 +937,15 @@ void CSound::Stop(int SampleID) // TODO: a nice fade out lock_wait(m_SoundLock); CSample *pSample = &m_aSamples[SampleID]; - for(int i = 0; i < NUM_VOICES; i++) + for(auto &m_aVoice : m_aVoices) { - if(m_aVoices[i].m_pSample == pSample) + if(m_aVoice.m_pSample == pSample) { - if(m_aVoices[i].m_Flags & FLAG_LOOP) - m_aVoices[i].m_pSample->m_PausedAt = m_aVoices[i].m_Tick; + if(m_aVoice.m_Flags & FLAG_LOOP) + m_aVoice.m_pSample->m_PausedAt = m_aVoice.m_Tick; else - m_aVoices[i].m_pSample->m_PausedAt = 0; - m_aVoices[i].m_pSample = 0; + m_aVoice.m_pSample->m_PausedAt = 0; + m_aVoice.m_pSample = 0; } } lock_unlock(m_SoundLock); @@ -955,16 +955,16 @@ void CSound::StopAll() { // TODO: a nice fade out lock_wait(m_SoundLock); - for(int i = 0; i < NUM_VOICES; i++) + for(auto &m_aVoice : m_aVoices) { - if(m_aVoices[i].m_pSample) + if(m_aVoice.m_pSample) { - if(m_aVoices[i].m_Flags & FLAG_LOOP) - m_aVoices[i].m_pSample->m_PausedAt = m_aVoices[i].m_Tick; + if(m_aVoice.m_Flags & FLAG_LOOP) + m_aVoice.m_pSample->m_PausedAt = m_aVoice.m_Tick; else - m_aVoices[i].m_pSample->m_PausedAt = 0; + m_aVoice.m_pSample->m_PausedAt = 0; } - m_aVoices[i].m_pSample = 0; + m_aVoice.m_pSample = 0; } lock_unlock(m_SoundLock); } diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index a7a29ab70..041f0305a 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -85,9 +85,9 @@ public: free(m_pBuf); delete[] m_TextureData[0]; delete[] m_TextureData[1]; - for(size_t i = 0; i < m_FtFallbackFonts.size(); i++) + for(auto &m_FtFallbackFont : m_FtFallbackFonts) { - free(m_FtFallbackFonts[i].m_pBuf); + free(m_FtFallbackFont.m_pBuf); } } @@ -600,16 +600,16 @@ public: virtual ~CTextRender() { - for(size_t i = 0; i < m_Fonts.size(); ++i) + for(auto &m_Font : m_Fonts) { - FT_Done_Face(m_Fonts[i]->m_FtFace); + FT_Done_Face(m_Font->m_FtFace); - for(CFont::SFontFallBack &FallbackFont : m_Fonts[i]->m_FtFallbackFonts) + for(CFont::SFontFallBack &FallbackFont : m_Font->m_FtFallbackFonts) { FT_Done_Face(FallbackFont.m_FtFace); } - delete m_Fonts[i]; + delete m_Font; } if(m_FTLibrary != 0) @@ -733,10 +733,10 @@ public: CFont *GetFont(const char *pFilename) { - for(size_t i = 0; i < m_Fonts.size(); ++i) + for(auto &m_Font : m_Fonts) { - if(str_comp(pFilename, m_Fonts[i]->m_aFilename) == 0) - return m_Fonts[i]; + if(str_comp(pFilename, m_Font->m_aFilename) == 0) + return m_Font; } return NULL; @@ -1975,8 +1975,8 @@ public: virtual void OnWindowResize() { bool FoundTextContainer = false; - for(size_t i = 0; i < m_TextContainers.size(); ++i) - if(m_TextContainers[i].m_StringInfo.m_QuadBufferContainerIndex != -1) + for(auto &m_TextContainer : m_TextContainers) + if(m_TextContainer.m_StringInfo.m_QuadBufferContainerIndex != -1) FoundTextContainer = true; if(FoundTextContainer) { @@ -1984,19 +1984,19 @@ public: dbg_assert(false, "text container was not empty"); } - for(size_t i = 0; i < m_Fonts.size(); ++i) + for(auto &m_Font : m_Fonts) { // reset the skylines for(int j = 0; j < 2; ++j) { - for(size_t k = 0; k < m_Fonts[i]->m_TextureSkyline[j].m_CurHeightOfPixelColumn.size(); ++k) - m_Fonts[i]->m_TextureSkyline[j].m_CurHeightOfPixelColumn[k] = 0; + for(int & k : m_Font->m_TextureSkyline[j].m_CurHeightOfPixelColumn) + k = 0; - mem_zero(m_Fonts[i]->m_TextureData[j], (size_t)m_Fonts[i]->m_CurTextureDimensions[j] * m_Fonts[i]->m_CurTextureDimensions[j] * sizeof(unsigned char)); - Graphics()->LoadTextureRawSub(m_Fonts[i]->m_aTextures[j], 0, 0, m_Fonts[i]->m_CurTextureDimensions[j], m_Fonts[i]->m_CurTextureDimensions[j], CImageInfo::FORMAT_ALPHA, m_Fonts[i]->m_TextureData[j]); + mem_zero(m_Font->m_TextureData[j], (size_t)m_Font->m_CurTextureDimensions[j] * m_Font->m_CurTextureDimensions[j] * sizeof(unsigned char)); + Graphics()->LoadTextureRawSub(m_Font->m_aTextures[j], 0, 0, m_Font->m_CurTextureDimensions[j], m_Font->m_CurTextureDimensions[j], CImageInfo::FORMAT_ALPHA, m_Font->m_TextureData[j]); } - m_Fonts[i]->InitFontSizes(); + m_Font->InitFontSizes(); } } }; diff --git a/src/engine/client/updater.cpp b/src/engine/client/updater.cpp index 0004c85bd..6997debff 100644 --- a/src/engine/client/updater.cpp +++ b/src/engine/client/updater.cpp @@ -312,11 +312,11 @@ void CUpdater::PerformUpdate() } } - for(map::iterator it = m_FileJobs.begin(); it != m_FileJobs.end(); ++it) + for(auto &m_FileJob : m_FileJobs) { - if(it->second) + if(m_FileJob.second) { - const char *pFile = it->first.c_str(); + const char *pFile = m_FileJob.first.c_str(); size_t len = str_length(pFile); if(!str_comp_nocase(pFile + len - 4, ".dll")) { @@ -347,7 +347,7 @@ void CUpdater::PerformUpdate() pLastFile = pFile; } else - m_pStorage->RemoveBinaryFile(it->first.c_str()); + m_pStorage->RemoveBinaryFile(m_FileJob.first.c_str()); } if(m_ServerUpdate) @@ -368,9 +368,9 @@ void CUpdater::CommitUpdate() { bool Success = true; - for(map::iterator it = m_FileJobs.begin(); it != m_FileJobs.end(); ++it) - if(it->second) - Success &= MoveFile(it->first.c_str()); + for(auto &m_FileJob : m_FileJobs) + if(m_FileJob.second) + Success &= MoveFile(m_FileJob.first.c_str()); if(m_ClientUpdate) Success &= ReplaceClient(); diff --git a/src/engine/server/authmanager.cpp b/src/engine/server/authmanager.cpp index b25df0d2c..de99af252 100644 --- a/src/engine/server/authmanager.cpp +++ b/src/engine/server/authmanager.cpp @@ -66,15 +66,15 @@ int CAuthManager::AddKey(const char *pIdent, const char *pPw, int AuthLevel) int CAuthManager::RemoveKey(int Slot) { m_aKeys.remove_index_fast(Slot); - for(int i = 0; i < (int)(sizeof(m_aDefault) / sizeof(m_aDefault[0])); i++) + for(int &i : m_aDefault) { - if(m_aDefault[i] == Slot) + if(i == Slot) { - m_aDefault[i] = -1; + i = -1; } - else if(m_aDefault[i] == m_aKeys.size()) + else if(i == m_aKeys.size()) { - m_aDefault[i] = Slot; + i = Slot; } } return m_aKeys.size(); diff --git a/src/engine/server/register.cpp b/src/engine/server/register.cpp index f1ecd1188..40c6c2a6c 100644 --- a/src/engine/server/register.cpp +++ b/src/engine/server/register.cpp @@ -32,13 +32,13 @@ CRegister::CRegister(bool Sixup) void CRegister::FeedToken(NETADDR Addr, SECURITY_TOKEN ResponseToken) { Addr.port = 0; - for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) + for(auto &i : m_aMasterserverInfo) { - NETADDR Addr2 = m_aMasterserverInfo[i].m_Addr; + NETADDR Addr2 = i.m_Addr; Addr2.port = 0; if(net_addr_comp(&Addr, &Addr2) == 0) { - m_aMasterserverInfo[i].m_Token = ResponseToken; + i.m_Token = ResponseToken; break; } } @@ -108,11 +108,11 @@ void CRegister::RegisterGotCount(CNetChunk *pChunk) unsigned char *pData = (unsigned char *)pChunk->m_pData; int Count = (pData[sizeof(SERVERBROWSE_COUNT)] << 8) | pData[sizeof(SERVERBROWSE_COUNT) + 1]; - for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) + for(auto &i : m_aMasterserverInfo) { - if(net_addr_comp(&m_aMasterserverInfo[i].m_Addr, &pChunk->m_Address) == 0) + if(net_addr_comp(&i.m_Addr, &pChunk->m_Address) == 0) { - m_aMasterserverInfo[i].m_Count = Count; + i.m_Count = Count; break; } } @@ -183,21 +183,21 @@ void CRegister::RegisterUpdate(int Nettype) else if(m_RegisterState == REGISTERSTATE_QUERY_COUNT) { int Left = 0; - for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) + for(auto &i : m_aMasterserverInfo) { - if(!m_aMasterserverInfo[i].m_Valid) + if(!i.m_Valid) continue; - if(m_aMasterserverInfo[i].m_Count == -1) + if(i.m_Count == -1) { Left++; - if(m_aMasterserverInfo[i].m_LastSend + Freq < Now) + if(i.m_LastSend + Freq < Now) { - m_aMasterserverInfo[i].m_LastSend = Now; - if(m_Sixup && m_aMasterserverInfo[i].m_Token == NET_SECURITY_TOKEN_UNKNOWN) - m_pNetServer->SendTokenSixup(m_aMasterserverInfo[i].m_Addr, NET_SECURITY_TOKEN_UNKNOWN); + i.m_LastSend = Now; + if(m_Sixup && i.m_Token == NET_SECURITY_TOKEN_UNKNOWN) + m_pNetServer->SendTokenSixup(i.m_Addr, NET_SECURITY_TOKEN_UNKNOWN); else - RegisterSendCountRequest(m_aMasterserverInfo[i].m_Addr, m_aMasterserverInfo[i].m_Token); + RegisterSendCountRequest(i.m_Addr, i.m_Token); } } } @@ -280,9 +280,9 @@ int CRegister::RegisterProcessPacket(CNetChunk *pPacket, SECURITY_TOKEN Response { // check for masterserver address bool Valid = false; - for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) + for(auto &i : m_aMasterserverInfo) { - if(net_addr_comp_noport(&pPacket->m_Address, &m_aMasterserverInfo[i].m_Addr) == 0) + if(net_addr_comp_noport(&pPacket->m_Address, &i.m_Addr) == 0) { Valid = true; break; diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index fb4e53c03..cdf4b049f 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -269,8 +269,8 @@ void CServerBan::ConBanRegionRange(IConsole::IResult *pResult, void *pUser) void CServer::CClient::Reset() { // reset input - for(int i = 0; i < 200; i++) - m_aInputs[i].m_GameTick = -1; + for(auto &m_aInput : m_aInputs) + m_aInput.m_GameTick = -1; m_CurrentInput = 0; mem_zero(&m_LatestInput, sizeof(m_LatestInput)); @@ -502,19 +502,19 @@ int64 CServer::TickStartTime(int Tick) int CServer::Init() { - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_aClient : m_aClients) { - m_aClients[i].m_State = CClient::STATE_EMPTY; - m_aClients[i].m_aName[0] = 0; - m_aClients[i].m_aClan[0] = 0; - m_aClients[i].m_Country = -1; - m_aClients[i].m_Snapshots.Init(); - m_aClients[i].m_Traffic = 0; - m_aClients[i].m_TrafficSince = 0; - m_aClients[i].m_ShowIps = false; - m_aClients[i].m_AuthKey = -1; - m_aClients[i].m_Latency = 0; - m_aClients[i].m_Sixup = false; + m_aClient.m_State = CClient::STATE_EMPTY; + m_aClient.m_aName[0] = 0; + m_aClient.m_aClan[0] = 0; + m_aClient.m_Country = -1; + m_aClient.m_Snapshots.Init(); + m_aClient.m_Traffic = 0; + m_aClient.m_TrafficSince = 0; + m_aClient.m_ShowIps = false; + m_aClient.m_AuthKey = -1; + m_aClient.m_Latency = 0; + m_aClient.m_Sixup = false; } m_CurrentGameTick = 0; @@ -641,9 +641,9 @@ int CServer::MaxClients() const int CServer::ClientCount() { int ClientCount = 0; - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_aClient : m_aClients) { - if(m_aClients[i].m_State != CClient::STATE_EMPTY) + if(m_aClient.m_State != CClient::STATE_EMPTY) { ClientCount++; } @@ -2533,9 +2533,9 @@ int CServer::Run() { for(int c = 0; c < MAX_CLIENTS; c++) if(m_aClients[c].m_State == CClient::STATE_INGAME) - for(int i = 0; i < 200; i++) - if(m_aClients[c].m_aInputs[i].m_GameTick == Tick() + 1) - GameServer()->OnClientPredictedEarlyInput(c, m_aClients[c].m_aInputs[i].m_aData); + for(auto &m_aInput : m_aClients[c].m_aInputs) + if(m_aInput.m_GameTick == Tick() + 1) + GameServer()->OnClientPredictedEarlyInput(c, m_aInput.m_aData); m_CurrentGameTick++; NewTicks++; @@ -2545,11 +2545,11 @@ int CServer::Run() { if(m_aClients[c].m_State != CClient::STATE_INGAME) continue; - for(int i = 0; i < 200; i++) + for(auto &m_aInput : m_aClients[c].m_aInputs) { - if(m_aClients[c].m_aInputs[i].m_GameTick == Tick()) + if(m_aInput.m_GameTick == Tick()) { - GameServer()->OnClientPredictedInput(c, m_aClients[c].m_aInputs[i].m_aData); + GameServer()->OnClientPredictedInput(c, m_aInput.m_aData); break; } } @@ -2590,8 +2590,8 @@ int CServer::Run() NonActive = true; - for(int c = 0; c < MAX_CLIENTS; c++) - if(m_aClients[c].m_State != CClient::STATE_EMPTY) + for(auto &m_aClient : m_aClients) + if(m_aClient.m_State != CClient::STATE_EMPTY) NonActive = false; // wait for incoming data @@ -2647,8 +2647,8 @@ int CServer::Run() GameServer()->OnShutdown(); m_pMap->Unload(); - for(int i = 0; i < 2; i++) - free(m_apCurrentMapData[i]); + for(auto &i : m_apCurrentMapData) + free(i); DbPool()->OnShutdown(); delete m_pConnectionPool; @@ -2760,9 +2760,9 @@ void CServer::AuthRemoveKey(int KeySlot) // Update indices. if(OldKeySlot != NewKeySlot) { - for(int i = 0; i < MAX_CLIENTS; i++) - if(m_aClients[i].m_AuthKey == OldKeySlot) - m_aClients[i].m_AuthKey = NewKeySlot; + for(auto &m_aClient : m_aClients) + if(m_aClient.m_AuthKey == OldKeySlot) + m_aClient.m_AuthKey = NewKeySlot; } } diff --git a/src/engine/shared/datafile.cpp b/src/engine/shared/datafile.cpp index 3db171bd2..b84522b55 100644 --- a/src/engine/shared/datafile.cpp +++ b/src/engine/shared/datafile.cpp @@ -549,9 +549,9 @@ SHA256_DIGEST CDataFileReader::Sha256() if(!m_pDataFile) { SHA256_DIGEST Result; - for(unsigned i = 0; i < sizeof(Result.data); i++) + for(unsigned char &i : Result.data) { - Result.data[i] = 0xff; + i = 0xff; } return Result; } diff --git a/src/engine/shared/econ.cpp b/src/engine/shared/econ.cpp index 9f9e5a38b..668f59f34 100644 --- a/src/engine/shared/econ.cpp +++ b/src/engine/shared/econ.cpp @@ -63,8 +63,8 @@ void CEcon::Init(IConsole *pConsole, CNetBan *pNetBan) { m_pConsole = pConsole; - for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) - m_aClients[i].m_State = CClient::STATE_EMPTY; + for(auto &m_aClient : m_aClients) + m_aClient.m_State = CClient::STATE_EMPTY; m_Ready = false; m_UserClientID = -1; diff --git a/src/engine/shared/masterserver.cpp b/src/engine/shared/masterserver.cpp index 8760d2f74..1345ea28f 100644 --- a/src/engine/shared/masterserver.cpp +++ b/src/engine/shared/masterserver.cpp @@ -168,11 +168,11 @@ public: { Info.m_Addr.port = 8300; bool Added = false; - for(int i = 0; i < MAX_MASTERSERVERS; ++i) + for(auto &m_aMasterServer : m_aMasterServers) { - if(str_comp(m_aMasterServers[i].m_aHostname, Info.m_aHostname) == 0) + if(str_comp(m_aMasterServer.m_aHostname, Info.m_aHostname) == 0) { - m_aMasterServers[i] = Info; + m_aMasterServer = Info; Added = true; break; } @@ -180,11 +180,11 @@ public: if(!Added) { - for(int i = 0; i < MAX_MASTERSERVERS; ++i) + for(auto &m_aMasterServer : m_aMasterServers) { - if(m_aMasterServers[i].m_Addr.type == NETTYPE_INVALID) + if(m_aMasterServer.m_Addr.type == NETTYPE_INVALID) { - m_aMasterServers[i] = Info; + m_aMasterServer = Info; Added = true; break; } @@ -210,15 +210,15 @@ public: if(!File) return -1; - for(int i = 0; i < MAX_MASTERSERVERS; i++) + for(auto &m_aMasterServer : m_aMasterServers) { char aAddrStr[NETADDR_MAXSTRSIZE]; - if(m_aMasterServers[i].m_Addr.type != NETTYPE_INVALID) - net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr), true); + if(m_aMasterServer.m_Addr.type != NETTYPE_INVALID) + net_addr_str(&m_aMasterServer.m_Addr, aAddrStr, sizeof(aAddrStr), true); else aAddrStr[0] = 0; char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "%s %s", m_aMasterServers[i].m_aHostname, aAddrStr); + str_format(aBuf, sizeof(aBuf), "%s %s", m_aMasterServer.m_aHostname, aAddrStr); io_write(File, aBuf, str_length(aBuf)); io_write_newline(File); } diff --git a/src/engine/shared/network_console.cpp b/src/engine/shared/network_console.cpp index 954bd4a61..4cb0b138d 100644 --- a/src/engine/shared/network_console.cpp +++ b/src/engine/shared/network_console.cpp @@ -24,8 +24,8 @@ bool CNetConsole::Open(NETADDR BindAddr, CNetBan *pNetBan, int Flags) return false; net_set_non_blocking(m_Socket); - for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) - m_aSlots[i].m_Connection.Reset(); + for(auto &m_aSlot : m_aSlots) + m_aSlot.m_Connection.Reset(); return true; } @@ -39,8 +39,8 @@ void CNetConsole::SetCallbacks(NETFUNC_NEWCLIENT_CON pfnNewClient, NETFUNC_DELCL int CNetConsole::Close() { - for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) - m_aSlots[i].m_Connection.Disconnect("closing console"); + for(auto &m_aSlot : m_aSlots) + m_aSlot.m_Connection.Disconnect("closing console"); net_tcp_close(m_Socket); diff --git a/src/engine/shared/network_server.cpp b/src/engine/shared/network_server.cpp index 9db80304d..c9df48fea 100644 --- a/src/engine/shared/network_server.cpp +++ b/src/engine/shared/network_server.cpp @@ -76,8 +76,8 @@ bool CNetServer::Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int Ma secure_random_fill(m_SecurityTokenSeed, sizeof(m_SecurityTokenSeed)); - for(int i = 0; i < NET_MAX_CLIENTS; i++) - m_aSlots[i].m_Connection.Init(m_Socket, true); + for(auto &m_aSlot : m_aSlots) + m_aSlot.m_Connection.Init(m_Socket, true); net_init_mmsgs(&m_MMSGS); diff --git a/src/game/client/components/binds.cpp b/src/game/client/components/binds.cpp index 25d2403cc..4186a0490 100644 --- a/src/game/client/components/binds.cpp +++ b/src/game/client/components/binds.cpp @@ -33,9 +33,9 @@ CBinds::CBinds() CBinds::~CBinds() { for(int i = 0; i < KEY_LAST; i++) - for(int j = 0; j < MODIFIER_COMBINATION_COUNT; j++) - if(m_aapKeyBindings[j][i]) - free(m_aapKeyBindings[j][i]); + for(auto &m_aapKeyBinding : m_aapKeyBindings) + if(m_aapKeyBinding[i]) + free(m_aapKeyBinding[i]); } void CBinds::Bind(int KeyID, const char *pStr, bool FreeOnly, int Modifier) @@ -158,13 +158,13 @@ bool CBinds::OnInput(IInput::CEvent e) void CBinds::UnbindAll() { - for(int i = 0; i < MODIFIER_COMBINATION_COUNT; i++) + for(auto &m_aapKeyBinding : m_aapKeyBindings) { - for(int j = 0; j < KEY_LAST; j++) + for(auto & j : m_aapKeyBinding) { - if(m_aapKeyBindings[i][j]) - free(m_aapKeyBindings[i][j]); - m_aapKeyBindings[i][j] = 0; + if(j) + free(j); + j = 0; } } } diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index 333fd9823..030fd13b0 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -27,11 +27,11 @@ CChat::CChat() { - for(int i = 0; i < MAX_LINES; i++) + for(auto &m_aLine : m_aLines) { // reset the container indices, so the text containers can be deleted on reset - m_aLines[i].m_TextContainerIndex = -1; - m_aLines[i].m_QuadContainerIndex = -1; + m_aLine.m_TextContainerIndex = -1; + m_aLine.m_QuadContainerIndex = -1; } #define CHAT_COMMAND(name, params, flags, callback, userdata, help) RegisterCommand(name, params, flags, help); @@ -49,17 +49,17 @@ void CChat::RegisterCommand(const char *pName, const char *pParams, int flags, c void CChat::RebuildChat() { - for(int i = 0; i < MAX_LINES; i++) + for(auto &m_aLine : m_aLines) { - if(m_aLines[i].m_TextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aLines[i].m_TextContainerIndex); - m_aLines[i].m_TextContainerIndex = -1; - if(m_aLines[i].m_QuadContainerIndex != -1) - Graphics()->DeleteQuadContainer(m_aLines[i].m_QuadContainerIndex); - m_aLines[i].m_QuadContainerIndex = -1; + if(m_aLine.m_TextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aLine.m_TextContainerIndex); + m_aLine.m_TextContainerIndex = -1; + if(m_aLine.m_QuadContainerIndex != -1) + Graphics()->DeleteQuadContainer(m_aLine.m_QuadContainerIndex); + m_aLine.m_QuadContainerIndex = -1; // recalculate sizes - m_aLines[i].m_YOffset[0] = -1.f; - m_aLines[i].m_YOffset[1] = -1.f; + m_aLine.m_YOffset[0] = -1.f; + m_aLine.m_YOffset[1] = -1.f; } } @@ -70,20 +70,20 @@ void CChat::OnWindowResize() void CChat::Reset() { - for(int i = 0; i < MAX_LINES; i++) + for(auto &m_aLine : m_aLines) { - if(m_aLines[i].m_TextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aLines[i].m_TextContainerIndex); - if(m_aLines[i].m_QuadContainerIndex != -1) - Graphics()->DeleteQuadContainer(m_aLines[i].m_QuadContainerIndex); - m_aLines[i].m_Time = 0; - m_aLines[i].m_aText[0] = 0; - m_aLines[i].m_aName[0] = 0; - m_aLines[i].m_Friend = false; - m_aLines[i].m_TextContainerIndex = -1; - m_aLines[i].m_QuadContainerIndex = -1; - m_aLines[i].m_TimesRepeated = 0; - m_aLines[i].m_HasRenderTee = false; + if(m_aLine.m_TextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aLine.m_TextContainerIndex); + if(m_aLine.m_QuadContainerIndex != -1) + Graphics()->DeleteQuadContainer(m_aLine.m_QuadContainerIndex); + m_aLine.m_Time = 0; + m_aLine.m_aText[0] = 0; + m_aLine.m_aName[0] = 0; + m_aLine.m_Friend = false; + m_aLine.m_TextContainerIndex = -1; + m_aLine.m_QuadContainerIndex = -1; + m_aLine.m_TimesRepeated = 0; + m_aLine.m_HasRenderTee = false; } m_PrevScoreBoardShowed = false; m_PrevShowChat = false; @@ -102,8 +102,8 @@ void CChat::Reset() m_CurrentLine = 0; DisableMode(); - for(int i = 0; i < CHAT_NUM; ++i) - m_aLastSoundPlayed[i] = 0; + for(long long &i : m_aLastSoundPlayed) + i = 0; } void CChat::OnRelease() diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index 307085ecf..ebd3195a0 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -71,8 +71,8 @@ void CControls::OnReset() m_JoystickFirePressed = false; m_JoystickRunPressed = false; m_JoystickTapTime = 0; - for(int i = 0; i < NUM_WEAPONS; i++) - m_AmmoCount[i] = 0; + for(int &i : m_AmmoCount) + i = 0; m_OldMouseX = m_OldMouseY = 0.0f; } @@ -100,8 +100,8 @@ void CControls::OnPlayerDeath() { if(g_Config.m_ClResetWantedWeaponOnDeath) m_LastData[g_Config.m_ClDummy].m_WantedWeapon = m_InputData[g_Config.m_ClDummy].m_WantedWeapon = 0; - for(int i = 0; i < NUM_WEAPONS; i++) - m_AmmoCount[i] = 0; + for(int &i : m_AmmoCount) + i = 0; m_JoystickTapTime = 0; // Do not launch hook on first tap } diff --git a/src/game/client/components/countryflags.cpp b/src/game/client/components/countryflags.cpp index 33e114720..2494199d6 100644 --- a/src/game/client/components/countryflags.cpp +++ b/src/game/client/components/countryflags.cpp @@ -102,8 +102,8 @@ void CCountryFlags::LoadCountryflagsIndexfile() // init LUT if(DefaultIndex != 0) - for(int i = 0; i < CODE_RANGE; ++i) - m_CodeIndexLUT[i] = DefaultIndex; + for(int &i : m_CodeIndexLUT) + i = DefaultIndex; else mem_zero(m_CodeIndexLUT, sizeof(m_CodeIndexLUT)); for(int i = 0; i < m_aCountryFlags.size(); ++i) diff --git a/src/game/client/components/ghost.cpp b/src/game/client/components/ghost.cpp index 0597eed74..43bf32735 100644 --- a/src/game/client/components/ghost.cpp +++ b/src/game/client/components/ghost.cpp @@ -78,8 +78,8 @@ CGhost::CGhostPath &CGhost::CGhostPath::operator=(CGhostPath &&Other) void CGhost::CGhostPath::Reset(int ChunkSize) { - for(unsigned i = 0; i < m_lChunks.size(); i++) - free(m_lChunks[i]); + for(auto &m_lChunk : m_lChunks) + free(m_lChunk); m_lChunks.clear(); m_ChunkSize = ChunkSize; m_NumItems = 0; @@ -167,8 +167,8 @@ int CGhost::GetSlot() const int CGhost::FreeSlots() const { int Num = 0; - for(int i = 0; i < MAX_ACTIVE_GHOSTS; i++) - if(m_aActiveGhosts[i].Empty()) + for(const auto &m_aActiveGhost : m_aActiveGhosts) + if(m_aActiveGhost.Empty()) Num++; return Num; } @@ -308,9 +308,9 @@ void CGhost::OnRender() int PlaybackTick = Client()->PredGameTick(g_Config.m_ClDummy) - m_StartRenderTick; - for(int i = 0; i < MAX_ACTIVE_GHOSTS; i++) + for(auto &m_aActiveGhost : m_aActiveGhosts) { - CGhostItem *pGhost = &m_aActiveGhosts[i]; + CGhostItem *pGhost = &m_aActiveGhost; if(pGhost->Empty()) continue; @@ -431,8 +431,8 @@ void CGhost::StartRender(int Tick) { m_Rendering = true; m_StartRenderTick = Tick; - for(int i = 0; i < MAX_ACTIVE_GHOSTS; i++) - m_aActiveGhosts[i].m_PlaybackPos = 0; + for(auto &m_aActiveGhost : m_aActiveGhosts) + m_aActiveGhost.m_PlaybackPos = 0; } void CGhost::StopRender() @@ -632,12 +632,12 @@ int CGhost::GetLastRaceTick() void CGhost::RefindSkin() { char aSkinName[64]; - for(int i = 0; i < (int)(sizeof(m_aActiveGhosts) / sizeof(m_aActiveGhosts[0])); ++i) + for(auto &m_aActiveGhost : m_aActiveGhosts) { - IntsToStr(&m_aActiveGhosts[i].m_Skin.m_Skin0, 6, aSkinName); + IntsToStr(&m_aActiveGhost.m_Skin.m_Skin0, 6, aSkinName); if(aSkinName[0] != '\0') { - CTeeRenderInfo *pRenderInfo = &m_aActiveGhosts[i].m_RenderInfo; + CTeeRenderInfo *pRenderInfo = &m_aActiveGhost.m_RenderInfo; int SkinId = m_pClient->m_pSkins->Find(aSkinName); const CSkin *pSkin = m_pClient->m_pSkins->Get(SkinId); diff --git a/src/game/client/components/killmessages.cpp b/src/game/client/components/killmessages.cpp index 3b5f3096a..b6a85170d 100644 --- a/src/game/client/components/killmessages.cpp +++ b/src/game/client/components/killmessages.cpp @@ -12,30 +12,30 @@ void CKillMessages::OnWindowResize() { - for(int i = 0; i < MAX_KILLMSGS; i++) + for(auto &m_aKillmsg : m_aKillmsgs) { - if(m_aKillmsgs[i].m_VictimTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsgs[i].m_VictimTextContainerIndex); - if(m_aKillmsgs[i].m_KillerTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsgs[i].m_KillerTextContainerIndex); - m_aKillmsgs[i].m_VictimTextContainerIndex = m_aKillmsgs[i].m_KillerTextContainerIndex = -1; + if(m_aKillmsg.m_VictimTextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aKillmsg.m_VictimTextContainerIndex); + if(m_aKillmsg.m_KillerTextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aKillmsg.m_KillerTextContainerIndex); + m_aKillmsg.m_VictimTextContainerIndex = m_aKillmsg.m_KillerTextContainerIndex = -1; } } void CKillMessages::OnReset() { m_KillmsgCurrent = 0; - for(int i = 0; i < MAX_KILLMSGS; i++) + for(auto &m_aKillmsg : m_aKillmsgs) { - m_aKillmsgs[i].m_Tick = -100000; + m_aKillmsg.m_Tick = -100000; - if(m_aKillmsgs[i].m_VictimTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsgs[i].m_VictimTextContainerIndex); + if(m_aKillmsg.m_VictimTextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aKillmsg.m_VictimTextContainerIndex); - if(m_aKillmsgs[i].m_KillerTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsgs[i].m_KillerTextContainerIndex); + if(m_aKillmsg.m_KillerTextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aKillmsg.m_KillerTextContainerIndex); - m_aKillmsgs[i].m_VictimTextContainerIndex = m_aKillmsgs[i].m_KillerTextContainerIndex = -1; + m_aKillmsg.m_VictimTextContainerIndex = m_aKillmsg.m_KillerTextContainerIndex = -1; } } diff --git a/src/game/client/components/menu_background.cpp b/src/game/client/components/menu_background.cpp index 4b6b2e4f6..6bd45d0fa 100644 --- a/src/game/client/components/menu_background.cpp +++ b/src/game/client/components/menu_background.cpp @@ -108,14 +108,14 @@ int CMenuBackground::ThemeScan(const char *pName, int IsDir, int DirType, void * return 0; // try to edit an existing theme - for(int i = 0; i < (int)pSelf->m_lThemes.size(); i++) + for(auto &m_lTheme : pSelf->m_lThemes) { - if(str_comp(pSelf->m_lThemes[i].m_Name, aThemeName) == 0) + if(str_comp(m_lTheme.m_Name, aThemeName) == 0) { if(IsDay) - pSelf->m_lThemes[i].m_HasDay = true; + m_lTheme.m_HasDay = true; if(IsNight) - pSelf->m_lThemes[i].m_HasNight = true; + m_lTheme.m_HasNight = true; return 0; } } diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index d1f98c516..493e2da27 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -1081,10 +1081,10 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View) ServerDetails.VSplitLeft(5.0f, 0x0, &ServerDetails); ServerDetails.VSplitLeft(80.0f, &LeftColumn, &RightColumn); - for(unsigned int i = 0; i < sizeof(s_aLabels) / sizeof(s_aLabels[0]); i++) + for(auto &s_aLabel : s_aLabels) { LeftColumn.HSplitTop(15.0f, &Row, &LeftColumn); - UI()->DoLabelScaled(&Row, s_aLabels[i], FontSize, -1); + UI()->DoLabelScaled(&Row, s_aLabel, FontSize, -1); } RightColumn.HSplitTop(15.0f, &Row, &RightColumn); diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 298dbd206..02a2c2e89 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -248,12 +248,12 @@ void CMenus::RenderPlayers(CUIRect MainView) int TotalPlayers = 0; - for(int i = 0; i < MAX_CLIENTS; ++i) + for(auto &i : m_pClient->m_Snap.m_paInfoByName) { - if(!m_pClient->m_Snap.m_paInfoByName[i]) + if(!i) continue; - int Index = m_pClient->m_Snap.m_paInfoByName[i]->m_ClientID; + int Index = i->m_ClientID; if(Index == m_pClient->m_Snap.m_LocalClientID) continue; @@ -561,13 +561,13 @@ bool CMenus::RenderServerControlKick(CUIRect MainView, bool FilterSpectators) int NumOptions = 0; int Selected = -1; static int aPlayerIDs[MAX_CLIENTS]; - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &i : m_pClient->m_Snap.m_paInfoByName) { - if(!m_pClient->m_Snap.m_paInfoByName[i]) + if(!i) continue; - int Index = m_pClient->m_Snap.m_paInfoByName[i]->m_ClientID; - if(Index == m_pClient->m_Snap.m_LocalClientID || (FilterSpectators && m_pClient->m_Snap.m_paInfoByName[i]->m_Team == TEAM_SPECTATORS)) + int Index = i->m_ClientID; + if(Index == m_pClient->m_Snap.m_LocalClientID || (FilterSpectators && i->m_Team == TEAM_SPECTATORS)) continue; if(!str_find_nocase(m_pClient->m_aClients[Index].m_aName, m_aFilterString)) diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 35879ea27..6efa3c5f0 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -529,13 +529,13 @@ void CMenus::RenderSettingsTee(CUIRect MainView) SkinPrefix.HSplitTop(2.0f, 0, &SkinPrefix); { static const char *s_aSkinPrefixes[] = {"kitty", "santa"}; - for(unsigned i = 0; i < sizeof(s_aSkinPrefixes) / sizeof(s_aSkinPrefixes[0]); i++) + for(auto &s_aSkinPrefixe : s_aSkinPrefixes) { - const char *pPrefix = s_aSkinPrefixes[i]; + const char *pPrefix = s_aSkinPrefixe; CUIRect Button; SkinPrefix.HSplitTop(20.0f, &Button, &SkinPrefix); Button.HMargin(2.0f, &Button); - if(DoButton_Menu(&s_aSkinPrefixes[i], pPrefix, 0, &Button)) + if(DoButton_Menu(&s_aSkinPrefixe, pPrefix, 0, &Button)) { str_copy(g_Config.m_ClSkinPrefix, pPrefix, sizeof(g_Config.m_ClSkinPrefix)); } @@ -813,8 +813,6 @@ static CKeyInfo gs_aKeys[] = Localize("Lock team");Localize("Show entities");Localize("Show HUD"); */ -const int g_KeyCount = sizeof(gs_aKeys) / sizeof(CKeyInfo); - void CMenus::UiDoGetButtons(int Start, int Stop, CUIRect View, CUIRect ScopeView) { for(int i = Start; i < Stop; i++) @@ -850,8 +848,8 @@ void CMenus::RenderSettingsControls(CUIRect MainView) char aBuf[128]; // this is kinda slow, but whatever - for(int i = 0; i < g_KeyCount; i++) - gs_aKeys[i].m_KeyId = gs_aKeys[i].m_Modifier = 0; + for(auto &gs_aKey : gs_aKeys) + gs_aKey.m_KeyId = gs_aKey.m_Modifier = 0; for(int Mod = 0; Mod < CBinds::MODIFIER_COUNT; Mod++) { @@ -861,11 +859,11 @@ void CMenus::RenderSettingsControls(CUIRect MainView) if(!pBind[0]) continue; - for(int i = 0; i < g_KeyCount; i++) - if(str_comp(pBind, gs_aKeys[i].m_pCommand) == 0) + for(auto &gs_aKey : gs_aKeys) + if(str_comp(pBind, gs_aKey.m_pCommand) == 0) { - gs_aKeys[i].m_KeyId = KeyId; - gs_aKeys[i].m_Modifier = Mod; + gs_aKey.m_KeyId = KeyId; + gs_aKey.m_Modifier = Mod; break; } } diff --git a/src/game/client/components/menus_settings_assets.cpp b/src/game/client/components/menus_settings_assets.cpp index 539480243..2a5f6a7b9 100644 --- a/src/game/client/components/menus_settings_assets.cpp +++ b/src/game/client/components/menus_settings_assets.cpp @@ -241,11 +241,11 @@ void CMenus::ClearCustomItems(int CurTab) { for(int i = 0; i < m_EntitiesList.size(); ++i) { - for(int n = 0; n < MAP_IMAGE_MOD_TYPE_COUNT; ++n) + for(auto &m_aImage : m_EntitiesList[i].m_aImages) { - if(m_EntitiesList[i].m_aImages[n].m_Texture != -1) - Graphics()->UnloadTexture(m_EntitiesList[i].m_aImages[n].m_Texture); - m_EntitiesList[i].m_aImages[n].m_Texture = IGraphics::CTextureHandle(); + if(m_aImage.m_Texture != -1) + Graphics()->UnloadTexture(m_aImage.m_Texture); + m_aImage.m_Texture = IGraphics::CTextureHandle(); } } m_EntitiesList.clear(); diff --git a/src/game/client/components/nameplates.cpp b/src/game/client/components/nameplates.cpp index d37fd72c0..990cbb455 100644 --- a/src/game/client/components/nameplates.cpp +++ b/src/game/client/components/nameplates.cpp @@ -247,14 +247,14 @@ void CNamePlates::SetPlayers(CPlayers *pPlayers) void CNamePlates::ResetNamePlates() { - for(int i = 0; i < MAX_CLIENTS; ++i) + for(auto &m_aNamePlate : m_aNamePlates) { - if(m_aNamePlates[i].m_NameTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aNamePlates[i].m_NameTextContainerIndex); - if(m_aNamePlates[i].m_ClanNameTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aNamePlates[i].m_ClanNameTextContainerIndex); + if(m_aNamePlate.m_NameTextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aNamePlate.m_NameTextContainerIndex); + if(m_aNamePlate.m_ClanNameTextContainerIndex != -1) + TextRender()->DeleteTextContainer(m_aNamePlate.m_ClanNameTextContainerIndex); - m_aNamePlates[i].Reset(); + m_aNamePlate.Reset(); } } diff --git a/src/game/client/components/particles.cpp b/src/game/client/components/particles.cpp index af3f9f464..cf595de18 100644 --- a/src/game/client/components/particles.cpp +++ b/src/game/client/components/particles.cpp @@ -30,8 +30,8 @@ void CParticles::OnReset() m_aParticles[MAX_PARTICLES - 1].m_NextPart = -1; m_FirstFree = 0; - for(int i = 0; i < NUM_GROUPS; i++) - m_aFirstPart[i] = -1; + for(int &i : m_aFirstPart) + i = -1; } void CParticles::Add(int Group, CParticle *pPart, float TimePassed) @@ -89,9 +89,9 @@ void CParticles::Update(float TimePassed) FrictionFraction -= 0.05f; } - for(int g = 0; g < NUM_GROUPS; g++) + for(int &g : m_aFirstPart) { - int i = m_aFirstPart[g]; + int i = g; while(i != -1) { int Next = m_aParticles[i].m_NextPart; @@ -116,7 +116,7 @@ void CParticles::Update(float TimePassed) if(m_aParticles[i].m_PrevPart != -1) m_aParticles[m_aParticles[i].m_PrevPart].m_NextPart = m_aParticles[i].m_NextPart; else - m_aFirstPart[g] = m_aParticles[i].m_NextPart; + g = m_aParticles[i].m_NextPart; if(m_aParticles[i].m_NextPart != -1) m_aParticles[m_aParticles[i].m_NextPart].m_PrevPart = m_aParticles[i].m_PrevPart; diff --git a/src/game/client/components/race_demo.cpp b/src/game/client/components/race_demo.cpp index 3d3cf2327..469c0a866 100644 --- a/src/game/client/components/race_demo.cpp +++ b/src/game/client/components/race_demo.cpp @@ -214,14 +214,14 @@ bool CRaceDemo::CheckDemo(int Time) const Storage()->ListDirectoryInfo(IStorage::TYPE_SAVE, ms_pRaceDemoDir, RaceDemolistFetchCallback, &Param); // loop through demo files - for(unsigned i = 0; i < lDemos.size(); i++) + for(auto &lDemo : lDemos) { - if(Time >= lDemos[i].m_Time) // found a better demo + if(Time >= lDemo.m_Time) // found a better demo return false; // delete old demo char aFilename[512]; - str_format(aFilename, sizeof(aFilename), "%s/%s.demo", ms_pRaceDemoDir, lDemos[i].m_aName); + str_format(aFilename, sizeof(aFilename), "%s/%s.demo", ms_pRaceDemoDir, lDemo.m_aName); Storage()->RemoveFile(aFilename, IStorage::TYPE_SAVE); } diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp index 17082eb52..e4164749a 100644 --- a/src/game/client/components/scoreboard.cpp +++ b/src/game/client/components/scoreboard.cpp @@ -120,9 +120,8 @@ void CScoreboard::RenderSpectators(float x, float y, float w) Cursor.m_LineWidth = w - 20.0f; Cursor.m_MaxLines = 4; - for(int i = 0; i < MAX_CLIENTS; ++i) + for(const auto *pInfo : m_pClient->m_Snap.m_paInfoByName) { - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByName[i]; if(!pInfo || pInfo->m_Team != TEAM_SPECTATORS) continue; @@ -692,9 +691,8 @@ const char *CScoreboard::GetClanName(int Team) { int ClanPlayers = 0; const char *pClanName = 0; - for(int i = 0; i < MAX_CLIENTS; i++) + for(const auto *pInfo : m_pClient->m_Snap.m_paInfoByScore) { - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByScore[i]; if(!pInfo || pInfo->m_Team != Team) continue; diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp index df5faea22..3e8db92b9 100644 --- a/src/game/client/components/skins.cpp +++ b/src/game/client/components/skins.cpp @@ -20,9 +20,9 @@ static const char *VANILLA_SKINS[] = {"bluekitty", "bluestripe", "brownbear", static bool IsVanillaSkin(const char *pName) { - for(unsigned int i = 0; i < sizeof(VANILLA_SKINS) / sizeof(VANILLA_SKINS[0]); i++) + for(auto &i : VANILLA_SKINS) { - if(str_comp(pName, VANILLA_SKINS[i]) == 0) + if(str_comp(pName, i) == 0) { return true; } @@ -210,8 +210,8 @@ void CSkins::Refresh() Graphics()->UnloadTextureNew(m_aSkins[i].m_OriginalSkin.m_FeetOutline); Graphics()->UnloadTextureNew(m_aSkins[i].m_OriginalSkin.m_Hands); Graphics()->UnloadTextureNew(m_aSkins[i].m_OriginalSkin.m_HandsOutline); - for(int n = 0; n < 6; ++n) - Graphics()->UnloadTextureNew(m_aSkins[i].m_OriginalSkin.m_Eyes[n]); + for(auto &m_Eye : m_aSkins[i].m_OriginalSkin.m_Eyes) + Graphics()->UnloadTextureNew(m_Eye); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_Body); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_BodyOutline); @@ -219,8 +219,8 @@ void CSkins::Refresh() Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_FeetOutline); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_Hands); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_HandsOutline); - for(int n = 0; n < 6; ++n) - Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_Eyes[n]); + for(auto &m_Eye : m_aSkins[i].m_ColorableSkin.m_Eyes) + Graphics()->UnloadTextureNew(m_Eye); } m_aSkins.clear(); diff --git a/src/game/client/components/spectator.cpp b/src/game/client/components/spectator.cpp index 36742e815..93ee026a2 100644 --- a/src/game/client/components/spectator.cpp +++ b/src/game/client/components/spectator.cpp @@ -217,9 +217,9 @@ void CSpectator::OnRender() float BoxMove = -10.0f; float BoxOffset = 0.0f; - for(int i = 0; i < MAX_CLIENTS; ++i) + for(auto &i : m_pClient->m_Snap.m_paInfoByDDTeamName) { - if(!m_pClient->m_Snap.m_paInfoByDDTeamName[i] || m_pClient->m_Snap.m_paInfoByDDTeamName[i]->m_Team == TEAM_SPECTATORS) + if(!i || i->m_Team == TEAM_SPECTATORS) continue; ++TotalPlayers; diff --git a/src/game/client/components/statboard.cpp b/src/game/client/components/statboard.cpp index fea07d3aa..cb6eb5ad7 100644 --- a/src/game/client/components/statboard.cpp +++ b/src/game/client/components/statboard.cpp @@ -19,8 +19,8 @@ CStatboard::CStatboard() void CStatboard::OnReset() { - for(int i = 0; i < MAX_CLIENTS; i++) - m_pClient->m_aStats[i].Reset(); + for(auto &m_aStat : m_pClient->m_aStats) + m_aStat.Reset(); m_Active = false; m_ScreenshotTaken = false; m_ScreenshotTime = -1; @@ -136,9 +136,8 @@ void CStatboard::RenderGlobalStats() int NumPlayers = 0; // sort red or dm players by score - for(int i = 0; i < MAX_CLIENTS; i++) + for(const auto *pInfo : m_pClient->m_Snap.m_paInfoByScore) { - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByScore[i]; if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientID].IsActive() || m_pClient->m_aClients[pInfo->m_ClientID].m_Team != TEAM_RED) continue; apPlayers[NumPlayers] = pInfo; @@ -148,9 +147,8 @@ void CStatboard::RenderGlobalStats() // sort blue players by score after if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) { - for(int i = 0; i < MAX_CLIENTS; i++) + for(const auto *pInfo : m_pClient->m_Snap.m_paInfoByScore) { - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByScore[i]; if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientID].IsActive() || m_pClient->m_aClients[pInfo->m_ClientID].m_Team != TEAM_BLUE) continue; apPlayers[NumPlayers] = pInfo; @@ -182,8 +180,8 @@ void CStatboard::RenderGlobalStats() for(int j = 0; j < NUM_WEAPONS; j++) aDisplayWeapon[j] = aDisplayWeapon[j] || pStats->m_aFragsWith[j] || pStats->m_aDeathsFrom[j]; } - for(int i = 0; i < NUM_WEAPONS; i++) - if(aDisplayWeapon[i]) + for(bool i : aDisplayWeapon) + if(i) StatboardContentWidth += 80; float x = StatboardWidth / 2 - StatboardContentWidth / 2; @@ -449,9 +447,8 @@ void CStatboard::FormatStats() int NumPlayers = 0; // sort red or dm players by score - for(int i = 0; i < MAX_CLIENTS; i++) + for(const auto *pInfo : m_pClient->m_Snap.m_paInfoByScore) { - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByScore[i]; if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientID].IsActive() || m_pClient->m_aClients[pInfo->m_ClientID].m_Team != TEAM_RED) continue; apPlayers[NumPlayers] = pInfo; @@ -461,9 +458,8 @@ void CStatboard::FormatStats() // sort blue players by score after if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) { - for(int i = 0; i < MAX_CLIENTS; i++) + for(const auto *pInfo : m_pClient->m_Snap.m_paInfoByScore) { - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByScore[i]; if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientID].IsActive() || m_pClient->m_aClients[pInfo->m_ClientID].m_Team != TEAM_BLUE) continue; apPlayers[NumPlayers] = pInfo; diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index f59e606bf..75e5efa43 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -524,8 +524,8 @@ void CGameClient::OnConnected() m_GameWorld.Clear(); m_GameWorld.m_WorldConfig.m_InfiniteAmmo = true; m_PredictedDummyID = -1; - for(int i = 0; i < MAX_CLIENTS; i++) - m_aLastWorldCharacters[i].m_Alive = false; + for(auto &m_aLastWorldCharacter : m_aLastWorldCharacters) + m_aLastWorldCharacter.m_Alive = false; LoadMapSettings(); if(Client()->State() != IClient::STATE_DEMOPLAYBACK && g_Config.m_ClAutoDemoOnConnect) @@ -539,8 +539,8 @@ void CGameClient::OnReset() InvalidateSnapshot(); - for(int i = 0; i < MAX_CLIENTS; i++) - m_aClients[i].Reset(); + for(auto &m_aClient : m_aClients) + m_aClient.Reset(); for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnReset(); @@ -1208,9 +1208,9 @@ void CGameClient::OnNewSnapshot() bool FoundGameInfoEx = false; - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_aClient : m_aClients) { - m_aClients[i].m_SpecCharPresent = false; + m_aClient.m_SpecCharPresent = false; } // go trough all the items in the snapshot and gather the info we want @@ -2243,14 +2243,14 @@ void CGameClient::UpdatePrediction() if(m_Snap.m_aCharacters[m_Snap.m_LocalClientID].m_HasExtendedData) { int aIDs[MAX_CLIENTS]; - for(int i = 0; i < MAX_CLIENTS; i++) - aIDs[i] = -1; + for(int &aID : aIDs) + aID = -1; for(int i = 0; i < MAX_CLIENTS; i++) if(CCharacter *pChar = m_GameWorld.GetCharacterByID(i)) aIDs[pChar->GetStrongWeakID()] = i; - for(int i = 0; i < MAX_CLIENTS; i++) - if(aIDs[i] >= 0) - m_CharOrder.GiveStrong(aIDs[i]); + for(int aID : aIDs) + if(aID >= 0) + m_CharOrder.GiveStrong(aID); } else { @@ -2545,9 +2545,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinjaCursor); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponLaserCursor); - for(int i = 0; i < 6; ++i) + for(auto &m_SpriteWeaponCursor : m_GameSkin.m_SpriteWeaponCursors) { - m_GameSkin.m_SpriteWeaponCursors[i] = IGraphics::CTextureHandle(); + m_SpriteWeaponCursor = IGraphics::CTextureHandle(); } Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteHookChain); @@ -2559,19 +2559,19 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinja); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponLaser); - for(int i = 0; i < 6; ++i) + for(auto &m_SpriteWeapon : m_GameSkin.m_SpriteWeapons) { - m_GameSkin.m_SpriteWeapons[i] = IGraphics::CTextureHandle(); + m_SpriteWeapon = IGraphics::CTextureHandle(); } - for(int i = 0; i < 9; ++i) + for(auto &m_SpriteParticle : m_GameSkin.m_SpriteParticles) { - Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteParticles[i]); + Graphics()->UnloadTextureNew(m_SpriteParticle); } - for(int i = 0; i < 3; ++i) + for(auto &m_SpriteStar : m_GameSkin.m_SpriteStars) { - Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteStars[i]); + Graphics()->UnloadTextureNew(m_SpriteStar); } Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponGunProjectile); @@ -2581,9 +2581,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinjaProjectile); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponLaserProjectile); - for(int i = 0; i < 6; ++i) + for(auto &m_SpriteWeaponProjectile : m_GameSkin.m_SpriteWeaponProjectiles) { - m_GameSkin.m_SpriteWeaponProjectiles[i] = IGraphics::CTextureHandle(); + m_SpriteWeaponProjectile = IGraphics::CTextureHandle(); } for(int i = 0; i < 3; ++i) @@ -2592,9 +2592,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponShotgunMuzzles[i]); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinjaMuzzles[i]); - for(int n = 0; n < 6; ++n) + for(auto &m_SpriteWeaponsMuzzle : m_GameSkin.m_SpriteWeaponsMuzzles) { - m_GameSkin.m_SpriteWeaponsMuzzles[n][i] = IGraphics::CTextureHandle(); + m_SpriteWeaponsMuzzle[i] = IGraphics::CTextureHandle(); } } @@ -2607,9 +2607,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpritePickupGun); Graphics()->UnloadTextureNew(m_GameSkin.m_SpritePickupHammer); - for(int i = 0; i < 6; ++i) + for(auto &m_SpritePickupWeapon : m_GameSkin.m_SpritePickupWeapons) { - m_GameSkin.m_SpritePickupWeapons[i] = IGraphics::CTextureHandle(); + m_SpritePickupWeapon = IGraphics::CTextureHandle(); } Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteFlagBlue); @@ -2773,8 +2773,8 @@ void CGameClient::LoadEmoticonsSkin(const char *pPath, bool AsDir) { if(m_EmoticonsSkinLoaded) { - for(int i = 0; i < 16; ++i) - Graphics()->UnloadTextureNew(m_EmoticonsSkin.m_SpriteEmoticons[i]); + for(auto &m_SpriteEmoticon : m_EmoticonsSkin.m_SpriteEmoticons) + Graphics()->UnloadTextureNew(m_SpriteEmoticon); m_EmoticonsSkinLoaded = false; } @@ -2819,16 +2819,16 @@ void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir) { Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleSlice); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleBall); - for(int i = 0; i < 3; ++i) - Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleSplat[i]); + for(auto &i : m_ParticlesSkin.m_SpriteParticleSplat) + Graphics()->UnloadTextureNew(i); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleSmoke); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleShell); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleExpl); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleAirJump); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleHit); - for(int i = 0; i < (int)(sizeof(m_ParticlesSkin.m_SpriteParticles) / sizeof(m_ParticlesSkin.m_SpriteParticles[0])); ++i) - m_ParticlesSkin.m_SpriteParticles[i] = IGraphics::CTextureHandle(); + for(auto &m_SpriteParticle : m_ParticlesSkin.m_SpriteParticles) + m_SpriteParticle = IGraphics::CTextureHandle(); m_ParticlesSkinLoaded = false; } @@ -2886,14 +2886,14 @@ void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir) void CGameClient::RefindSkins() { - for(int i = 0; i < MAX_CLIENTS; ++i) + for(auto &m_aClient : m_aClients) { - if(m_aClients[i].m_aSkinName[0] != '\0') + if(m_aClient.m_aSkinName[0] != '\0') { - const CSkin *pSkin = m_pSkins->Get(m_pSkins->Find(m_aClients[i].m_aSkinName)); - m_aClients[i].m_SkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin; - m_aClients[i].m_SkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin; - m_aClients[i].UpdateRenderInfo(); + const CSkin *pSkin = m_pSkins->Get(m_pSkins->Find(m_aClient.m_aSkinName)); + m_aClient.m_SkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin; + m_aClient.m_SkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin; + m_aClient.UpdateRenderInfo(); } } m_pGhost->RefindSkin(); diff --git a/src/game/client/prediction/entities/character.cpp b/src/game/client/prediction/entities/character.cpp index d00a2e4f3..410206347 100644 --- a/src/game/client/prediction/entities/character.cpp +++ b/src/game/client/prediction/entities/character.cpp @@ -917,8 +917,8 @@ void CCharacter::DDRacePostCoreTick() // handle Anti-Skip tiles std::list Indices = Collision()->GetMapIndices(m_PrevPos, m_Pos); if(!Indices.empty()) - for(std::list::iterator i = Indices.begin(); i != Indices.end(); i++) - HandleTiles(*i); + for(int &Indice : Indices) + HandleTiles(Indice); else { HandleTiles(CurrentIndex); diff --git a/src/game/client/prediction/gameworld.cpp b/src/game/client/prediction/gameworld.cpp index 086585480..c72506759 100644 --- a/src/game/client/prediction/gameworld.cpp +++ b/src/game/client/prediction/gameworld.cpp @@ -16,10 +16,10 @@ ////////////////////////////////////////////////// CGameWorld::CGameWorld() { - for(int i = 0; i < NUM_ENTTYPES; i++) - m_apFirstEntityTypes[i] = 0; - for(int i = 0; i < MAX_CLIENTS; i++) - m_apCharacters[i] = 0; + for(auto &m_apFirstEntityType : m_apFirstEntityTypes) + m_apFirstEntityType = 0; + for(auto &m_apCharacter : m_apCharacters) + m_apCharacter = 0; m_pCollision = 0; m_GameTick = 0; m_pParent = 0; @@ -29,9 +29,9 @@ CGameWorld::CGameWorld() CGameWorld::~CGameWorld() { // delete all entities - for(int i = 0; i < NUM_ENTTYPES; i++) - while(m_apFirstEntityTypes[i]) - delete m_apFirstEntityTypes[i]; + for(auto &m_apFirstEntityType : m_apFirstEntityTypes) + while(m_apFirstEntityType) + delete m_apFirstEntityType; if(m_pChild && m_pChild->m_pParent == this) { OnModified(); @@ -165,8 +165,8 @@ void CGameWorld::RemoveEntity(CEntity *pEnt) void CGameWorld::RemoveEntities() { // destroy objects marked for destruction - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; if(pEnt->m_MarkedForDestroy) @@ -186,16 +186,16 @@ bool distCompare(std::pair a, std::pair b) void CGameWorld::Tick() { // update all objects - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Tick(); pEnt = m_pNextTraverseEntity; } - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickDefered(); @@ -534,9 +534,9 @@ void CGameWorld::CopyWorld(CGameWorld *pFrom) m_pTuningList = pFrom->m_pTuningList; m_Teams = pFrom->m_Teams; // delete the previous entities - for(int i = 0; i < NUM_ENTTYPES; i++) - while(m_apFirstEntityTypes[i]) - delete m_apFirstEntityTypes[i]; + for(auto &m_apFirstEntityType : m_apFirstEntityTypes) + while(m_apFirstEntityType) + delete m_apFirstEntityType; for(int i = 0; i < MAX_CLIENTS; i++) { m_apCharacters[i] = 0; @@ -594,7 +594,7 @@ void CGameWorld::OnModified() void CGameWorld::Clear() { // delete all entities - for(int i = 0; i < NUM_ENTTYPES; i++) - while(m_apFirstEntityTypes[i]) - delete m_apFirstEntityTypes[i]; + for(auto &m_apFirstEntityType : m_apFirstEntityTypes) + while(m_apFirstEntityType) + delete m_apFirstEntityType; } diff --git a/src/game/client/race.cpp b/src/game/client/race.cpp index 22be0f0f8..6b293a666 100644 --- a/src/game/client/race.cpp +++ b/src/game/client/race.cpp @@ -80,11 +80,11 @@ bool CRaceHelper::IsStart(CGameClient *pClient, vec2 Prev, vec2 Pos) { std::list Indices = pCollision->GetMapIndices(Prev, Pos); if(!Indices.empty()) - for(std::list::iterator i = Indices.begin(); i != Indices.end(); i++) + for(int &Indice : Indices) { - if(pCollision->GetTileIndex(*i) == TILE_START) + if(pCollision->GetTileIndex(Indice) == TILE_START) return true; - if(pCollision->GetFTileIndex(*i) == TILE_START) + if(pCollision->GetFTileIndex(Indice) == TILE_START) return true; } else diff --git a/src/game/client/skin.h b/src/game/client/skin.h index 423869e01..d7caf976f 100644 --- a/src/game/client/skin.h +++ b/src/game/client/skin.h @@ -32,8 +32,8 @@ struct CSkin m_FeetOutline = IGraphics::CTextureHandle(); m_Hands = IGraphics::CTextureHandle(); m_HandsOutline = IGraphics::CTextureHandle(); - for(int i = 0; i < 6; ++i) - m_Eyes[i] = IGraphics::CTextureHandle(); + for(auto &m_Eye : m_Eyes) + m_Eye = IGraphics::CTextureHandle(); } }; diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 972f0fef0..b6b13df68 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -67,9 +67,9 @@ static const char *VANILLA_IMAGES[] = { static bool IsVanillaImage(const char *pImage) { - for(unsigned i = 0; i < sizeof(VANILLA_IMAGES) / sizeof(VANILLA_IMAGES[0]); i++) + for(auto &i : VANILLA_IMAGES) { - if(str_comp(pImage, VANILLA_IMAGES[i]) == 0) + if(str_comp(pImage, i) == 0) { return true; } @@ -1687,10 +1687,10 @@ void CEditor::DoQuad(CQuad *q, int Index) for(int i = 0; i < m_lSelectedQuads.size(); ++i) { CQuad *pCurrentQuad = &pLayer->m_lQuads[m_lSelectedQuads[i]]; - for(int v = 0; v < 5; v++) + for(auto &m_aPoint : pCurrentQuad->m_aPoints) { - pCurrentQuad->m_aPoints[v].x += OffsetX; - pCurrentQuad->m_aPoints[v].y += OffsetY; + m_aPoint.x += OffsetX; + m_aPoint.y += OffsetY; } } } @@ -1702,10 +1702,10 @@ void CEditor::DoQuad(CQuad *q, int Index) for(int i = 0; i < m_lSelectedQuads.size(); ++i) { CQuad *pCurrentQuad = &pLayer->m_lQuads[m_lSelectedQuads[i]]; - for(int v = 0; v < 5; v++) + for(auto &m_aPoint : pCurrentQuad->m_aPoints) { - pCurrentQuad->m_aPoints[v].x += OffsetX; - pCurrentQuad->m_aPoints[v].y += OffsetY; + m_aPoint.x += OffsetX; + m_aPoint.y += OffsetY; } } } diff --git a/src/game/editor/io.cpp b/src/game/editor/io.cpp index 0720d2d09..02e8bf2ea 100644 --- a/src/game/editor/io.cpp +++ b/src/game/editor/io.cpp @@ -915,10 +915,10 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int Storag for(int i = 0; i < pTiles->m_Width * pTiles->m_Height; i++) { pTiles->m_pTiles[i].m_Index = 0; - for(unsigned e = 0; e < sizeof(s_aTilesRep) / sizeof(s_aTilesRep[0]); e++) + for(int e : s_aTilesRep) { - if(((CLayerTele *)pTiles)->m_pTeleTile[i].m_Type == s_aTilesRep[e]) - pTiles->m_pTiles[i].m_Index = s_aTilesRep[e]; + if(((CLayerTele *)pTiles)->m_pTeleTile[i].m_Type == e) + pTiles->m_pTiles[i].m_Index = e; } } } @@ -988,11 +988,11 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int Storag continue; } - for(unsigned e = 0; e < sizeof(s_aTilesComp) / sizeof(s_aTilesComp[0]); e++) + for(int e : s_aTilesComp) { - if(pLayerSwitchTiles[i].m_Type == s_aTilesComp[e]) + if(pLayerSwitchTiles[i].m_Type == e) { - pTiles->m_pTiles[i].m_Index = s_aTilesComp[e]; + pTiles->m_pTiles[i].m_Index = e; pTiles->m_pTiles[i].m_Flags = pLayerSwitchTiles[i].m_Flags; } } diff --git a/src/game/editor/layer_quads.cpp b/src/game/editor/layer_quads.cpp index 830d97bd8..effa429a7 100644 --- a/src/game/editor/layer_quads.cpp +++ b/src/game/editor/layer_quads.cpp @@ -124,10 +124,10 @@ int CLayerQuads::BrushGrab(CLayerGroup *pBrush, CUIRect Rect) CQuad n; n = *q; - for(int p = 0; p < 5; p++) + for(auto &m_aPoint : n.m_aPoints) { - n.m_aPoints[p].x -= f2fx(Rect.x); - n.m_aPoints[p].y -= f2fx(Rect.y); + m_aPoint.x -= f2fx(Rect.x); + m_aPoint.y -= f2fx(Rect.y); } pGrabbed->m_lQuads.add(n); @@ -144,10 +144,10 @@ void CLayerQuads::BrushPlace(CLayer *pBrush, float wx, float wy) { CQuad n = l->m_lQuads[i]; - for(int p = 0; p < 5; p++) + for(auto &m_aPoint : n.m_aPoints) { - n.m_aPoints[p].x += f2fx(wx); - n.m_aPoints[p].y += f2fx(wy); + m_aPoint.x += f2fx(wx); + m_aPoint.y += f2fx(wy); } m_lQuads.add(n); @@ -211,12 +211,12 @@ void CLayerQuads::BrushRotate(float Amount) { CQuad *q = &m_lQuads[i]; - for(int p = 0; p < 5; p++) + for(auto &m_aPoint : q->m_aPoints) { - vec2 Pos(fx2f(q->m_aPoints[p].x), fx2f(q->m_aPoints[p].y)); + vec2 Pos(fx2f(m_aPoint.x), fx2f(m_aPoint.y)); Rotate(&Center, &Pos, Amount); - q->m_aPoints[p].x = f2fx(Pos.x); - q->m_aPoints[p].y = f2fx(Pos.y); + m_aPoint.x = f2fx(Pos.x); + m_aPoint.y = f2fx(Pos.y); } } } @@ -228,10 +228,10 @@ void CLayerQuads::GetSize(float *w, float *h) for(int i = 0; i < m_lQuads.size(); i++) { - for(int p = 0; p < 5; p++) + for(auto &m_aPoint : m_lQuads[i].m_aPoints) { - *w = maximum(*w, fx2f(m_lQuads[i].m_aPoints[p].x)); - *h = maximum(*h, fx2f(m_lQuads[i].m_aPoints[p].y)); + *w = maximum(*w, fx2f(m_aPoint.x)); + *h = maximum(*h, fx2f(m_aPoint.y)); } } } diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index 561ba586f..6de73fd91 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -638,13 +638,13 @@ int CEditor::PopupQuad(CEditor *pEditor, CUIRect View, void *pContext) { if(Prop == PROP_POS_X) { - for(int k = 0; k < 5; ++k) - lQuads[i]->m_aPoints[k].x += OffsetX; + for(auto &m_aPoint : lQuads[i]->m_aPoints) + m_aPoint.x += OffsetX; } if(Prop == PROP_POS_Y) { - for(int k = 0; k < 5; ++k) - lQuads[i]->m_aPoints[k].y += OffsetY; + for(auto &m_aPoint : lQuads[i]->m_aPoints) + m_aPoint.y += OffsetY; } if(Prop == PROP_POS_ENV) { diff --git a/src/game/mapbugs.cpp b/src/game/mapbugs.cpp index dd6296173..6db424f97 100644 --- a/src/game/mapbugs.cpp +++ b/src/game/mapbugs.cpp @@ -50,11 +50,11 @@ CMapBugs GetMapBugs(const char *pName, int Size, SHA256_DIGEST Sha256) CMapDescription Map = {pName, Size, Sha256}; CMapBugs Result; Result.m_Extra = 0; - for(unsigned int i = 0; i < sizeof(MAP_BUGS) / sizeof(MAP_BUGS[0]); i++) + for(auto &i : MAP_BUGS) { - if(Map == MAP_BUGS[i].m_Map) + if(Map == i.m_Map) { - Result.m_pData = &MAP_BUGS[i]; + Result.m_pData = &i; return Result; } } diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index eec9bc5a6..b7009815c 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -262,12 +262,12 @@ void CGameContext::ConRules(IConsole::IResult *pResult, void *pUserData) _RL(9), _RL(10), }; - for(unsigned i = 0; i < sizeof(pRuleLines) / sizeof(pRuleLines[0]); i++) + for(auto &pRuleLine : pRuleLines) { - if(pRuleLines[i][0]) + if(pRuleLine[0]) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, - "rules", pRuleLines[i]); + "rules", pRuleLine); Printed = true; } } diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index eeab212ef..c1cc3686e 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -2259,9 +2259,9 @@ void CCharacter::DDRacePostCoreTick() std::list Indices = GameServer()->Collision()->GetMapIndices(m_PrevPos, m_Pos); if(!Indices.empty()) { - for(std::list::iterator i = Indices.begin(); i != Indices.end(); i++) + for(int &Indice : Indices) { - HandleTiles(*i); + HandleTiles(Indice); if(!m_Alive) return; } diff --git a/src/game/server/entities/dragger.cpp b/src/game/server/entities/dragger.cpp index 4b5c3c8a6..443179b5e 100644 --- a/src/game/server/entities/dragger.cpp +++ b/src/game/server/entities/dragger.cpp @@ -21,9 +21,9 @@ CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, m_CaughtTeam = CaughtTeam; GameWorld()->InsertEntity(this); - for(int i = 0; i < MAX_CLIENTS; i++) + for(int &m_SoloID : m_SoloIDs) { - m_SoloIDs[i] = -1; + m_SoloID = -1; } } @@ -84,10 +84,10 @@ void CDragger::Move() if(m_Target) { - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_SoloEnt : m_SoloEnts) { - if(m_SoloEnts[i] == m_Target) - m_SoloEnts[i] = 0; + if(m_SoloEnt == m_Target) + m_SoloEnt = 0; } } } @@ -163,13 +163,13 @@ void CDragger::Snap(int SnappingClient) CCharacter *Target = m_Target; - for(int i = 0; i < MAX_CLIENTS; i++) + for(int &m_SoloID : m_SoloIDs) { - if(m_SoloIDs[i] == -1) + if(m_SoloID == -1) break; - Server()->SnapFreeID(m_SoloIDs[i]); - m_SoloIDs[i] = -1; + Server()->SnapFreeID(m_SoloID); + m_SoloID = -1; } int pos = 0; diff --git a/src/game/server/entities/light.cpp b/src/game/server/entities/light.cpp index c9b8b0788..d2989fc6f 100644 --- a/src/game/server/entities/light.cpp +++ b/src/game/server/entities/light.cpp @@ -27,10 +27,8 @@ bool CLight::HitCharacter() GameServer()->m_World.IntersectedCharacters(m_Pos, m_To, 0.0f, 0); if(HitCharacters.empty()) return false; - for(std::list::iterator i = HitCharacters.begin(); - i != HitCharacters.end(); i++) + for(auto *Char : HitCharacters) { - CCharacter *Char = *i; if(m_Layer == LAYER_SWITCH && !GameServer()->Collision()->m_pSwitchers[m_Number].m_Status[Char->Team()]) continue; Char->Freeze(); diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 49d226cef..14ec5f459 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -37,8 +37,8 @@ void CGameContext::Construct(int Resetting) m_Resetting = 0; m_pServer = 0; - for(int i = 0; i < MAX_CLIENTS; i++) - m_apPlayers[i] = 0; + for(auto &m_apPlayer : m_apPlayers) + m_apPlayer = 0; m_pController = 0; m_VoteType = VOTE_TYPE_UNKNOWN; @@ -75,8 +75,8 @@ CGameContext::CGameContext() CGameContext::~CGameContext() { - for(int i = 0; i < MAX_CLIENTS; i++) - delete m_apPlayers[i]; + for(auto &m_apPlayer : m_apPlayers) + delete m_apPlayer; if(!m_Resetting) delete m_pVoteOptionHeap; @@ -142,10 +142,10 @@ void CGameContext::FillAntibot(CAntibotRoundData *pData) for(int i = 0; i < MAX_CLIENTS; i++) { CAntibotCharacterData *pChar = &pData->m_aCharacters[i]; - for(int i = 0; i < 3; i++) + for(auto &m_aLatestInput : pChar->m_aLatestInputs) { - pChar->m_aLatestInputs[i].m_TargetX = -1; - pChar->m_aLatestInputs[i].m_TargetY = -1; + m_aLatestInput.m_TargetX = -1; + m_aLatestInput.m_TargetY = -1; } pChar->m_Alive = false; pChar->m_Pause = false; @@ -479,12 +479,12 @@ void CGameContext::SendBroadcast(const char *pText, int ClientID, bool IsImporta dbg_assert(IsImportant, "broadcast messages to all players must be important"); Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i]) + if(m_apPlayer) { - m_apPlayers[i]->m_LastBroadcastImportance = true; - m_apPlayers[i]->m_LastBroadcast = Server()->Tick(); + m_apPlayer->m_LastBroadcastImportance = true; + m_apPlayer->m_LastBroadcast = Server()->Tick(); } } return; @@ -506,12 +506,12 @@ void CGameContext::StartVote(const char *pDesc, const char *pCommand, const char // reset votes m_VoteEnforce = VOTE_ENFORCE_UNKNOWN; m_VoteEnforcer = -1; - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i]) + if(m_apPlayer) { - m_apPlayers[i]->m_Vote = 0; - m_apPlayers[i]->m_VotePos = 0; + m_apPlayer->m_Vote = 0; + m_apPlayer->m_VotePos = 0; } } @@ -784,10 +784,10 @@ void CGameContext::OnTick() } } - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i]) - m_apPlayers[i]->PostPostTick(); + if(m_apPlayer) + m_apPlayer->PostPostTick(); } // update voting @@ -1309,9 +1309,9 @@ void CGameContext::OnClientConnected(int ClientID) { { bool Empty = true; - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i]) + if(m_apPlayer) { Empty = false; break; @@ -1379,17 +1379,17 @@ void CGameContext::OnClientDrop(int ClientID, const char *pReason) m_VoteUpdate = true; // update spectator modes - for(int i = 0; i < MAX_CLIENTS; ++i) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i] && m_apPlayers[i]->m_SpectatorID == ClientID) - m_apPlayers[i]->m_SpectatorID = SPEC_FREEVIEW; + if(m_apPlayer && m_apPlayer->m_SpectatorID == ClientID) + m_apPlayer->m_SpectatorID = SPEC_FREEVIEW; } // update conversation targets - for(int i = 0; i < MAX_CLIENTS; ++i) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i] && m_apPlayers[i]->m_LastWhisperTo == ClientID) - m_apPlayers[i]->m_LastWhisperTo = -1; + if(m_apPlayer && m_apPlayer->m_LastWhisperTo == ClientID) + m_apPlayer->m_LastWhisperTo = -1; } protocol7::CNetMsg_Sv_ClientDrop Msg; @@ -2688,9 +2688,9 @@ void CGameContext::ConSetTeamAll(IConsole::IResult *pResult, void *pUserData) str_format(aBuf, sizeof(aBuf), "All players were moved to the %s", pSelf->m_pController->GetTeamName(Team)); pSelf->SendChat(-1, CGameContext::CHAT_ALL, aBuf); - for(int i = 0; i < MAX_CLIENTS; ++i) - if(pSelf->m_apPlayers[i]) - pSelf->m_apPlayers[i]->SetTeam(Team, false); + for(auto &m_apPlayer : pSelf->m_apPlayers) + if(m_apPlayer) + m_apPlayer->SetTeam(Team, false); } void CGameContext::ConAddVote(IConsole::IResult *pResult, void *pUserData) @@ -2789,10 +2789,10 @@ void CGameContext::ConRemoveVote(IConsole::IResult *pResult, void *pUserData) pSelf->Server()->SendPackMsg(&VoteClearOptionsMsg, MSGFLAG_VITAL, -1); // reset sending of vote options - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : pSelf->m_apPlayers) { - if(pSelf->m_apPlayers[i]) - pSelf->m_apPlayers[i]->m_SendVoteIndex = 0; + if(m_apPlayer) + m_apPlayer->m_SendVoteIndex = 0; } // TODO: improve this @@ -2916,10 +2916,10 @@ void CGameContext::ConClearVotes(IConsole::IResult *pResult, void *pUserData) pSelf->m_NumVoteOptions = 0; // reset sending of vote options - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : pSelf->m_apPlayers) { - if(pSelf->m_apPlayers[i]) - pSelf->m_apPlayers[i]->m_SendVoteIndex = 0; + if(m_apPlayer) + m_apPlayer->m_SendVoteIndex = 0; } } @@ -3567,10 +3567,10 @@ void CGameContext::OnSnap(int ClientID) m_pController->Snap(ClientID); m_Events.Snap(ClientID); - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i]) - m_apPlayers[i]->Snap(ClientID); + if(m_apPlayer) + m_apPlayer->Snap(ClientID); } if(ClientID > -1) @@ -4016,9 +4016,9 @@ int CGameContext::GetClientVersion(int ClientID) bool CGameContext::PlayerModerating() { - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_apPlayer : m_apPlayers) { - if(m_apPlayers[i] && m_apPlayers[i]->m_Moderating) + if(m_apPlayer && m_apPlayer->m_Moderating) return true; } return false; diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index a80688dc2..4cedb1917 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -377,9 +377,9 @@ void IGameController::ChangeMap(const char *pToMap) void IGameController::PostReset() { - for(int i = 0; i < MAX_CLIENTS; i++) - if(GameServer()->m_apPlayers[i]) - GameServer()->m_apPlayers[i]->Respawn(); + for(auto &m_apPlayer : GameServer()->m_apPlayers) + if(m_apPlayer) + m_apPlayer->Respawn(); } int IGameController::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) @@ -462,8 +462,8 @@ void IGameController::Tick() { // move player to spectator if the reserved slots aren't filled yet, kick him otherwise int Spectators = 0; - for(int j = 0; j < MAX_CLIENTS; ++j) - if(GameServer()->m_apPlayers[j] && GameServer()->m_apPlayers[j]->GetTeam() == TEAM_SPECTATORS) + for(auto &m_apPlayer : GameServer()->m_apPlayers) + if(m_apPlayer && m_apPlayer->GetTeam() == TEAM_SPECTATORS) ++Spectators; if(Spectators >= g_Config.m_SvSpectatorSlots) Server()->Kick(i, "Kicked for inactivity"); diff --git a/src/game/server/gameworld.cpp b/src/game/server/gameworld.cpp index 26a7c48ad..c495fc0ea 100644 --- a/src/game/server/gameworld.cpp +++ b/src/game/server/gameworld.cpp @@ -18,16 +18,16 @@ CGameWorld::CGameWorld() m_Paused = false; m_ResetRequested = false; - for(int i = 0; i < NUM_ENTTYPES; i++) - m_apFirstEntityTypes[i] = 0; + for(auto &m_apFirstEntityType : m_apFirstEntityTypes) + m_apFirstEntityType = 0; } CGameWorld::~CGameWorld() { // delete all entities - for(int i = 0; i < NUM_ENTTYPES; i++) - while(m_apFirstEntityTypes[i]) - delete m_apFirstEntityTypes[i]; + for(auto &m_apFirstEntityType : m_apFirstEntityTypes) + while(m_apFirstEntityType) + delete m_apFirstEntityType; } void CGameWorld::SetGameServer(CGameContext *pGameServer) @@ -107,8 +107,8 @@ void CGameWorld::RemoveEntity(CEntity *pEnt) // void CGameWorld::Snap(int SnappingClient) { - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Snap(SnappingClient); @@ -119,8 +119,8 @@ void CGameWorld::Snap(int SnappingClient) void CGameWorld::Reset() { // reset all entities - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Reset(); @@ -137,8 +137,8 @@ void CGameWorld::Reset() void CGameWorld::RemoveEntities() { // destroy objects marked for destruction - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; if(pEnt->m_MarkedForDestroy) @@ -204,9 +204,9 @@ void CGameWorld::UpdatePlayerMaps() // compute reverse map int rMap[MAX_CLIENTS]; - for(int j = 0; j < MAX_CLIENTS; j++) + for(int &j : rMap) { - rMap[j] = -1; + j = -1; } for(int j = 0; j < VANILLA_MAX_CLIENTS; j++) { @@ -254,16 +254,16 @@ void CGameWorld::Tick() if(GameServer()->m_pController->IsForceBalanced()) GameServer()->SendChat(-1, CGameContext::CHAT_ALL, "Teams have been balanced"); // update all objects - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Tick(); pEnt = m_pNextTraverseEntity; } - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickDefered(); @@ -273,8 +273,8 @@ void CGameWorld::Tick() else { // update all objects - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt;) + for(auto *pEnt : m_apFirstEntityTypes) + for(; pEnt;) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickPaused(); diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 1546fa267..99195c6a0 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -655,10 +655,10 @@ void CPlayer::SetTeam(int Team, bool DoChatMsg) if(Team == TEAM_SPECTATORS) { // update spectator modes - for(int i = 0; i < MAX_CLIENTS; ++i) + for(auto &m_apPlayer : GameServer()->m_apPlayers) { - if(GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->m_SpectatorID == m_ClientID) - GameServer()->m_apPlayers[i]->m_SpectatorID = SPEC_FREEVIEW; + if(m_apPlayer && m_apPlayer->m_SpectatorID == m_ClientID) + m_apPlayer->m_SpectatorID = SPEC_FREEVIEW; } } } @@ -931,19 +931,19 @@ void CPlayer::ProcessScoreResult(CScorePlayerResult &Result) switch(Result.m_MessageKind) { case CScorePlayerResult::DIRECT: - for(int i = 0; i < CScorePlayerResult::MAX_MESSAGES; i++) + for(auto &m_aaMessage : Result.m_Data.m_aaMessages) { - if(Result.m_Data.m_aaMessages[i][0] == 0) + if(m_aaMessage[0] == 0) break; - GameServer()->SendChatTarget(m_ClientID, Result.m_Data.m_aaMessages[i]); + GameServer()->SendChatTarget(m_ClientID, m_aaMessage); } break; case CScorePlayerResult::ALL: - for(int i = 0; i < CScorePlayerResult::MAX_MESSAGES; i++) + for(auto &m_aaMessage : Result.m_Data.m_aaMessages) { - if(Result.m_Data.m_aaMessages[i][0] == 0) + if(m_aaMessage[0] == 0) break; - GameServer()->SendChat(-1, CGameContext::CHAT_ALL, Result.m_Data.m_aaMessages[i], m_ClientID); + GameServer()->SendChat(-1, CGameContext::CHAT_ALL, m_aaMessage, m_ClientID); } break; case CScorePlayerResult::BROADCAST: diff --git a/src/game/server/score.cpp b/src/game/server/score.cpp index 876016942..64d511cef 100644 --- a/src/game/server/score.cpp +++ b/src/game/server/score.cpp @@ -30,8 +30,8 @@ void CScorePlayerResult::SetVariant(Variant v) { case DIRECT: case ALL: - for(int i = 0; i < MAX_MESSAGES; i++) - m_Data.m_aaMessages[i][0] = 0; + for(auto &m_aaMessage : m_Data.m_aaMessages) + m_aaMessage[0] = 0; break; case BROADCAST: m_Data.m_Broadcast[0] = 0; @@ -46,16 +46,16 @@ void CScorePlayerResult::SetVariant(Variant v) m_Data.m_Info.m_Birthday = 0; m_Data.m_Info.m_HasFinishScore = false; m_Data.m_Info.m_Time = 0; - for(int i = 0; i < NUM_CHECKPOINTS; i++) - m_Data.m_Info.m_CpTime[i] = 0; + for(float &i : m_Data.m_Info.m_CpTime) + i = 0; } } CTeamrank::CTeamrank() : m_NumNames(0) { - for(int i = 0; i < MAX_CLIENTS; i++) - m_aaNames[i][0] = '\0'; + for(auto &m_aaName : m_aaNames) + m_aaName[0] = '\0'; mem_zero(&m_TeamID.m_aData, sizeof(m_TeamID)); } diff --git a/src/game/server/score.h b/src/game/server/score.h index 840924df7..a35d7939c 100644 --- a/src/game/server/score.h +++ b/src/game/server/score.h @@ -129,8 +129,8 @@ public: { m_BestTime = 0; m_CurrentTime = 0; - for(int i = 0; i < NUM_CHECKPOINTS; i++) - m_aBestCpTime[i] = 0; + for(float &i : m_aBestCpTime) + i = 0; } void Set(float Time, float CpTime[NUM_CHECKPOINTS]) diff --git a/src/game/server/teehistorian.cpp b/src/game/server/teehistorian.cpp index 6d77d614d..e5d26345c 100644 --- a/src/game/server/teehistorian.cpp +++ b/src/game/server/teehistorian.cpp @@ -48,10 +48,10 @@ void CTeeHistorian::Reset(const CGameInfo *pGameInfo, WRITE_CALLBACK pfnWriteCal m_TickWritten = true; m_MaxClientID = MAX_CLIENTS; // `m_PrevMaxClientID` is initialized in `BeginTick` - for(int i = 0; i < MAX_CLIENTS; i++) + for(auto &m_aPrevPlayer : m_aPrevPlayers) { - m_aPrevPlayers[i].m_Alive = false; - m_aPrevPlayers[i].m_InputExists = false; + m_aPrevPlayer.m_Alive = false; + m_aPrevPlayer.m_InputExists = false; } m_pfnWriteCallback = pfnWriteCallback; m_pWriteCallbackUserdata = pUser; diff --git a/src/game/server/teeinfo.cpp b/src/game/server/teeinfo.cpp index 03b70f019..60c10dfd3 100644 --- a/src/game/server/teeinfo.cpp +++ b/src/game/server/teeinfo.cpp @@ -58,15 +58,15 @@ void CTeeInfo::ToSixup() } // check for std skin - for(int s = 0; s < 16; s++) + for(auto &g_StdSkin : g_StdSkins) { - if(!str_comp(m_SkinName, g_StdSkins[s].m_SkinName)) + if(!str_comp(m_SkinName, g_StdSkin.m_SkinName)) { for(int p = 0; p < 6; p++) { - str_copy(m_apSkinPartNames[p], g_StdSkins[s].m_apSkinPartNames[p], 24); - m_aUseCustomColors[p] = g_StdSkins[s].m_aUseCustomColors[p]; - m_aSkinPartColors[p] = g_StdSkins[s].m_aSkinPartColors[p]; + str_copy(m_apSkinPartNames[p], g_StdSkin.m_apSkinPartNames[p], 24); + m_aUseCustomColors[p] = g_StdSkin.m_aUseCustomColors[p]; + m_aSkinPartColors[p] = g_StdSkin.m_aSkinPartColors[p]; } break; } @@ -98,12 +98,12 @@ void CTeeInfo::FromSixup() m_ColorFeet = 0; // check for std skin - for(int s = 0; s < 16; s++) + for(auto &g_StdSkin : g_StdSkins) { bool match = true; for(int p = 0; p < 6; p++) { - if(str_comp(m_apSkinPartNames[p], g_StdSkins[s].m_apSkinPartNames[p]) || m_aUseCustomColors[p] != g_StdSkins[s].m_aUseCustomColors[p] || (m_aUseCustomColors[p] && m_aSkinPartColors[p] != g_StdSkins[s].m_aSkinPartColors[p])) + if(str_comp(m_apSkinPartNames[p], g_StdSkin.m_apSkinPartNames[p]) || m_aUseCustomColors[p] != g_StdSkin.m_aUseCustomColors[p] || (m_aUseCustomColors[p] && m_aSkinPartColors[p] != g_StdSkin.m_aSkinPartColors[p])) { match = false; break; @@ -111,7 +111,7 @@ void CTeeInfo::FromSixup() } if(match) { - str_copy(m_SkinName, g_StdSkins[s].m_SkinName, sizeof(m_SkinName)); + str_copy(m_SkinName, g_StdSkin.m_SkinName, sizeof(m_SkinName)); return; } } diff --git a/src/tools/dummy_map.cpp b/src/tools/dummy_map.cpp index 1e5c0a88f..109613b83 100644 --- a/src/tools/dummy_map.cpp +++ b/src/tools/dummy_map.cpp @@ -59,12 +59,12 @@ void CreateEmptyMap(IStorage *pStorage) Writer.AddItem(MAPITEMTYPE_LAYER, 1, sizeof(Layer) - sizeof(Layer.m_aName), &Layer); CTile Tiles[4]; - for(int i = 0; i < 4; i++) + for(auto &Tile : Tiles) { - Tiles[i].m_Index = 1; - Tiles[i].m_Flags = 0; - Tiles[i].m_Skip = 0; - Tiles[i].m_Reserved = 0; + Tile.m_Index = 1; + Tile.m_Flags = 0; + Tile.m_Skip = 0; + Tile.m_Reserved = 0; } Writer.AddData(sizeof(Tiles), &Tiles); diff --git a/src/tools/packetgen.cpp b/src/tools/packetgen.cpp index b2128e5be..1caf02be6 100644 --- a/src/tools/packetgen.cpp +++ b/src/tools/packetgen.cpp @@ -11,10 +11,10 @@ void Run(NETADDR Dest) { NETSOCKET aSockets[NUM_SOCKETS]; - for(int i = 0; i < NUM_SOCKETS; i++) + for(auto &aSocket : aSockets) { NETADDR BindAddr = {NETTYPE_IPV4, {0}, 0}; - aSockets[i] = net_udp_create(BindAddr); + aSocket = net_udp_create(BindAddr); } while(1) From 165857a5a8a5de78686fe59938ffb6a1b59bb15e Mon Sep 17 00:00:00 2001 From: def Date: Mon, 26 Oct 2020 15:14:07 +0100 Subject: [PATCH 011/144] Fix variable names manually --- src/engine/client/backend_sdl.cpp | 16 ++-- src/engine/client/client.cpp | 24 +++--- src/engine/client/graphics_threaded.cpp | 30 +++---- src/engine/client/http.cpp | 4 +- src/engine/client/serverbrowser.cpp | 18 ++--- src/engine/client/sound.cpp | 79 +++++++++--------- src/engine/client/text.cpp | 32 ++++---- src/engine/client/updater.cpp | 14 ++-- src/engine/server/authmanager.cpp | 10 +-- src/engine/server/register.cpp | 32 ++++---- src/engine/server/server.cpp | 58 +++++++------- src/engine/shared/datafile.cpp | 4 +- src/engine/shared/econ.cpp | 4 +- src/engine/shared/masterserver.cpp | 20 ++--- src/engine/shared/network_console.cpp | 8 +- src/engine/shared/network_server.cpp | 4 +- src/game/client/components/binds.cpp | 16 ++-- src/game/client/components/chat.cpp | 54 ++++++------- src/game/client/components/controls.cpp | 8 +- src/game/client/components/countryflags.cpp | 4 +- src/game/client/components/ghost.cpp | 47 ++++++----- src/game/client/components/killmessages.cpp | 26 +++--- .../client/components/menu_background.cpp | 8 +- src/game/client/components/menus_browser.cpp | 4 +- src/game/client/components/menus_ingame.cpp | 14 ++-- src/game/client/components/menus_settings.cpp | 17 ++-- .../components/menus_settings_assets.cpp | 8 +- src/game/client/components/nameplates.cpp | 12 +-- src/game/client/components/particles.cpp | 10 +-- src/game/client/components/race_demo.cpp | 6 +- src/game/client/components/skins.cpp | 12 +-- src/game/client/components/spectator.cpp | 4 +- src/game/client/components/statboard.cpp | 8 +- src/game/client/gameclient.cpp | 74 ++++++++--------- .../client/prediction/entities/character.cpp | 4 +- src/game/client/prediction/gameworld.cpp | 26 +++--- src/game/client/skin.h | 4 +- src/game/editor/editor.cpp | 16 ++-- src/game/editor/io.cpp | 12 +-- src/game/editor/layer_quads.cpp | 26 +++--- src/game/editor/popups.cpp | 8 +- src/game/mapbugs.cpp | 6 +- src/game/server/entities/character.cpp | 4 +- src/game/server/entities/dragger.cpp | 18 ++--- src/game/server/gamecontext.cpp | 80 +++++++++---------- src/game/server/gamecontroller.cpp | 10 +-- src/game/server/gameworld.cpp | 10 +-- src/game/server/player.cpp | 18 ++--- src/game/server/score.cpp | 12 +-- src/game/server/score.h | 4 +- src/game/server/teehistorian.cpp | 6 +- src/game/server/teeinfo.cpp | 16 ++-- src/tools/packetgen.cpp | 4 +- 53 files changed, 485 insertions(+), 488 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 03709355f..83c1a9940 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -1826,12 +1826,12 @@ void CCommandProcessorFragment_OpenGL2::Cmd_DeleteBufferContainer(const CCommand int VertBufferID = BufferContainer.m_ContainerInfo.m_Attributes[i].m_VertBufferBindingIndex; if(VertBufferID != -1) { - for(auto &m_Attribute : BufferContainer.m_ContainerInfo.m_Attributes) + for(auto &Attribute : BufferContainer.m_ContainerInfo.m_Attributes) { // set all equal ids to zero to not double delete - if(VertBufferID == m_Attribute.m_VertBufferBindingIndex) + if(VertBufferID == Attribute.m_VertBufferBindingIndex) { - m_Attribute.m_VertBufferBindingIndex = -1; + Attribute.m_VertBufferBindingIndex = -1; } } @@ -3096,12 +3096,12 @@ void CCommandProcessorFragment_OpenGL3_3::DestroyBufferContainer(int Index, bool int VertBufferID = BufferContainer.m_ContainerInfo.m_Attributes[i].m_VertBufferBindingIndex; if(VertBufferID != -1) { - for(auto &m_Attribute : BufferContainer.m_ContainerInfo.m_Attributes) + for(auto &Attribute : BufferContainer.m_ContainerInfo.m_Attributes) { // set all equal ids to zero to not double delete - if(VertBufferID == m_Attribute.m_VertBufferBindingIndex) + if(VertBufferID == Attribute.m_VertBufferBindingIndex) { - m_Attribute.m_VertBufferBindingIndex = -1; + Attribute.m_VertBufferBindingIndex = -1; } } @@ -3148,9 +3148,9 @@ void CCommandProcessorFragment_OpenGL3_3::AppendIndices(unsigned int NewIndicesC for(unsigned int &i : m_LastIndexBufferBound) i = 0; - for(auto &m_BufferContainer : m_BufferContainers) + for(auto &BufferContainer : m_BufferContainers) { - m_BufferContainer.m_LastIndexBufferBound = 0; + BufferContainer.m_LastIndexBufferBound = 0; } m_CurrentIndicesInBuffer = NewIndicesCount; diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 9fdb79e64..3f8c154c6 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -263,8 +263,8 @@ void CSmoothTime::Update(CGraph *pGraph, int64 Target, int TimeLeft, int AdjustD CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta) { - for(auto &i : m_DemoRecorder) - i = CDemoRecorder(&m_SnapshotDelta); + for(auto &DemoRecorder : m_DemoRecorder) + DemoRecorder = CDemoRecorder(&m_SnapshotDelta); m_pEditor = 0; m_pInput = 0; @@ -2019,12 +2019,12 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket) SnapshotRemoveExtraInfo(aExtraInfoRemoved); // add snapshot to demo - for(auto &i : m_DemoRecorder) + for(auto &DemoRecorder : m_DemoRecorder) { - if(i.IsRecording()) + if(DemoRecorder.IsRecording()) { // write snapshot - i.RecordSnapshot(GameTick, aExtraInfoRemoved, SnapSize); + DemoRecorder.RecordSnapshot(GameTick, aExtraInfoRemoved, SnapSize); } } @@ -2091,9 +2091,9 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket) if((pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 || Msg == NETMSGTYPE_SV_EXTRAPROJECTILE) { // game message - for(auto &i : m_DemoRecorder) - if(i.IsRecording()) - i.RecordMessage(pPacket->m_pData, pPacket->m_DataSize); + for(auto &DemoRecorder : m_DemoRecorder) + if(DemoRecorder.IsRecording()) + DemoRecorder.RecordMessage(pPacket->m_pData, pPacket->m_DataSize); GameClient()->OnMessage(Msg, &Unpacker); } @@ -2530,9 +2530,9 @@ void CClient::LoadDDNetInfo() void CClient::PumpNetwork() { - for(auto &i : m_NetClient) + for(auto &NetClient : m_NetClient) { - i.Update(); + NetClient.Update(); } if(State() != IClient::STATE_DEMOPLAYBACK) @@ -3056,12 +3056,12 @@ void CClient::Run() mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; } - for(auto &i : m_NetClient) + for(auto &NetClient : m_NetClient) { do { BindAddr.port = (secure_rand() % 64511) + 1024; - } while(!i.Open(BindAddr, 0)); + } while(!NetClient.Open(BindAddr, 0)); } } diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index 6c73d5727..b316f062c 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -757,12 +757,12 @@ void CGraphics_Threaded::SetColor(float r, float g, float b, float a) b *= 255.f; a *= 255.f; - for(auto &i : m_aColor) + for(auto &Color : m_aColor) { - i.r = (unsigned char)(r); - i.g = (unsigned char)(g); - i.b = (unsigned char)(b); - i.a = (unsigned char)(a); + Color.r = (unsigned char)(r); + Color.g = (unsigned char)(g); + Color.b = (unsigned char)(b); + Color.a = (unsigned char)(a); } } @@ -2022,8 +2022,8 @@ int CGraphics_Threaded::CreateBufferContainer(SBufferContainerInfo *pContainerIn mem_copy(Cmd.m_Attributes, &pContainerInfo->m_Attributes[0], Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - for(auto &m_Attribute : pContainerInfo->m_Attributes) - m_VertexArrayInfo[Index].m_AssociatedBufferObjectIndices.push_back(m_Attribute.m_VertBufferBindingIndex); + for(auto &Attribute : pContainerInfo->m_Attributes) + m_VertexArrayInfo[Index].m_AssociatedBufferObjectIndices.push_back(Attribute.m_VertBufferBindingIndex); return Index; } @@ -2110,8 +2110,8 @@ void CGraphics_Threaded::UpdateBufferContainer(int ContainerIndex, SBufferContai mem_copy(Cmd.m_Attributes, &pContainerInfo->m_Attributes[0], Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices.clear(); - for(auto &m_Attribute : pContainerInfo->m_Attributes) - m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices.push_back(m_Attribute.m_VertBufferBindingIndex); + for(auto &Attribute : pContainerInfo->m_Attributes) + m_VertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndices.push_back(Attribute.m_VertBufferBindingIndex); } void CGraphics_Threaded::IndicesNumRequiredNotify(unsigned int RequiredIndicesCount) @@ -2292,8 +2292,8 @@ int CGraphics_Threaded::Init() return -1; // create command buffers - for(auto &m_apCommandBuffer : m_apCommandBuffers) - m_apCommandBuffer = new CCommandBuffer(CMD_BUFFER_CMD_BUFFER_SIZE, CMD_BUFFER_DATA_BUFFER_SIZE); + for(auto &pCommandBuffer : m_apCommandBuffers) + pCommandBuffer = new CCommandBuffer(CMD_BUFFER_CMD_BUFFER_SIZE, CMD_BUFFER_DATA_BUFFER_SIZE); m_pCommandBuffer = m_apCommandBuffers[0]; // create null texture, will get id=0 @@ -2315,8 +2315,8 @@ void CGraphics_Threaded::Shutdown() m_pBackend = 0x0; // delete the command buffers - for(auto &m_apCommandBuffer : m_apCommandBuffers) - delete m_apCommandBuffer; + for(auto &pCommandBuffer : m_apCommandBuffers) + delete pCommandBuffer; } int CGraphics_Threaded::GetNumScreens() const @@ -2377,8 +2377,8 @@ void CGraphics_Threaded::Resize(int w, int h) KickCommandBuffer(); WaitForIdle(); - for(auto &m_ResizeListener : m_ResizeListeners) - m_ResizeListener.m_pFunc(m_ResizeListener.m_pUser); + for(auto &ResizeListener : m_ResizeListeners) + ResizeListener.m_pFunc(ResizeListener.m_pUser); } void CGraphics_Threaded::AddWindowResizeListener(WINDOW_RESIZE_FUNC pFunc, void *pUser) diff --git a/src/engine/client/http.cpp b/src/engine/client/http.cpp index af2efeacc..9333636d2 100644 --- a/src/engine/client/http.cpp +++ b/src/engine/client/http.cpp @@ -56,9 +56,9 @@ bool HttpInit(IStorage *pStorage) dbg_msg("http", "libcurl version %s (compiled = " LIBCURL_VERSION ")", pVersion->version); } - for(auto &gs_aLock : gs_aLocks) + for(auto &Lock : gs_aLocks) { - gs_aLock = lock_create(); + Lock = lock_create(); } curl_share_setopt(gs_Share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); curl_share_setopt(gs_Share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index ab135a88e..691feffb5 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -479,11 +479,11 @@ CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr) } // check if it's an official server - for(auto &m_aNetwork : m_aNetworks) + for(auto &Network : m_aNetworks) { - for(int i = 0; i < m_aNetwork.m_NumCountries; i++) + for(int i = 0; i < Network.m_NumCountries; i++) { - CNetworkCountry *pCntr = &m_aNetwork.m_aCountries[i]; + CNetworkCountry *pCntr = &Network.m_aCountries[i]; for(int j = 0; j < pCntr->m_NumServers; j++) { if(net_addr_comp(&Addr, &pCntr->m_aServers[j]) == 0) @@ -1139,11 +1139,11 @@ void CServerBrowser::LoadDDNetServers() void CServerBrowser::RecheckOfficial() { - for(auto &m_aNetwork : m_aNetworks) + for(auto &Network : m_aNetworks) { - for(int i = 0; i < m_aNetwork.m_NumCountries; i++) + for(int i = 0; i < Network.m_NumCountries; i++) { - CNetworkCountry *pCntr = &m_aNetwork.m_aCountries[i]; + CNetworkCountry *pCntr = &Network.m_aCountries[i]; for(int j = 0; j < pCntr->m_NumServers; j++) { CServerEntry *pEntry = Find(pCntr->m_aServers[j]); @@ -1321,11 +1321,11 @@ void CServerBrowser::CountryFilterClean(int Network) char aNewList[128]; aNewList[0] = '\0'; - for(auto &m_aNetwork : m_aNetworks) + for(auto &Network : m_aNetworks) { - for(int i = 0; i < m_aNetwork.m_NumCountries; i++) + for(int i = 0; i < Network.m_NumCountries; i++) { - const char *pName = m_aNetwork.m_aCountries[i].m_aName; + const char *pName = Network.m_aCountries[i].m_aName; if(DDNetFiltered(pExcludeCountries, pName)) { char aBuf[128]; diff --git a/src/engine/client/sound.cpp b/src/engine/client/sound.cpp index 87e120dc0..ab4dd89d2 100644 --- a/src/engine/client/sound.cpp +++ b/src/engine/client/sound.cpp @@ -115,37 +115,36 @@ static void Mix(short *pFinalOut, unsigned Frames) MasterVol = m_SoundVolume; - for(auto &m_aVoice : m_aVoices) + for(auto &Voice : m_aVoices) { - if(m_aVoice.m_pSample) + if(Voice.m_pSample) { // mix voice - CVoice *v = &m_aVoice; int *pOut = m_pMixBuffer; - int Step = v->m_pSample->m_Channels; // setup input sources - short *pInL = &v->m_pSample->m_pData[v->m_Tick * Step]; - short *pInR = &v->m_pSample->m_pData[v->m_Tick * Step + 1]; + int Step = Voice.m_pSample->m_Channels; // setup input sources + short *pInL = &Voice.m_pSample->m_pData[Voice.m_Tick * Step]; + short *pInR = &Voice.m_pSample->m_pData[Voice.m_Tick * Step + 1]; - unsigned End = v->m_pSample->m_NumFrames - v->m_Tick; + unsigned End = Voice.m_pSample->m_NumFrames - Voice.m_Tick; - int Rvol = (int)(v->m_pChannel->m_Vol * (v->m_Vol / 255.0f)); - int Lvol = (int)(v->m_pChannel->m_Vol * (v->m_Vol / 255.0f)); + int Rvol = (int)(Voice.m_pChannel->m_Vol * (Voice.m_Vol / 255.0f)); + int Lvol = (int)(Voice.m_pChannel->m_Vol * (Voice.m_Vol / 255.0f)); // make sure that we don't go outside the sound data if(Frames < End) End = Frames; // check if we have a mono sound - if(v->m_pSample->m_Channels == 1) + if(Voice.m_pSample->m_Channels == 1) pInR = pInL; // volume calculation - if(v->m_Flags & ISound::FLAG_POS && v->m_pChannel->m_Pan) + if(Voice.m_Flags & ISound::FLAG_POS && Voice.m_pChannel->m_Pan) { // TODO: we should respect the channel panning value - int dx = v->m_X - m_CenterX; - int dy = v->m_Y - m_CenterY; + int dx = Voice.m_X - m_CenterX; + int dy = Voice.m_Y - m_CenterY; // int p = IntAbs(dx); float FalloffX = 0.0f; @@ -154,11 +153,11 @@ static void Mix(short *pFinalOut, unsigned Frames) int RangeX = 0; // for panning bool InVoiceField = false; - switch(v->m_Shape) + switch(Voice.m_Shape) { case ISound::SHAPE_CIRCLE: { - float r = v->m_Circle.m_Radius; + float r = Voice.m_Circle.m_Radius; RangeX = r; int Dist = (int)sqrtf((float)dx * dx + dy * dy); // nasty float @@ -167,7 +166,7 @@ static void Mix(short *pFinalOut, unsigned Frames) InVoiceField = true; // falloff - int FalloffDistance = r * v->m_Falloff; + int FalloffDistance = r * Voice.m_Falloff; if(Dist > FalloffDistance) FalloffX = FalloffY = (r - Dist) / (r - FalloffDistance); else @@ -181,21 +180,21 @@ static void Mix(short *pFinalOut, unsigned Frames) case ISound::SHAPE_RECTANGLE: { - RangeX = v->m_Rectangle.m_Width / 2.0f; + RangeX = Voice.m_Rectangle.m_Width / 2.0f; int abs_dx = abs(dx); int abs_dy = abs(dy); - int w = v->m_Rectangle.m_Width / 2.0f; - int h = v->m_Rectangle.m_Height / 2.0f; + int w = Voice.m_Rectangle.m_Width / 2.0f; + int h = Voice.m_Rectangle.m_Height / 2.0f; if(abs_dx < w && abs_dy < h) { InVoiceField = true; // falloff - int fx = v->m_Falloff * w; - int fy = v->m_Falloff * h; + int fx = Voice.m_Falloff * w; + int fy = Voice.m_Falloff * h; FalloffX = abs_dx > fx ? (float)(w - abs_dx) / (w - fx) : 1.0f; FalloffY = abs_dy > fy ? (float)(h - abs_dy) / (h - fy) : 1.0f; @@ -210,7 +209,7 @@ static void Mix(short *pFinalOut, unsigned Frames) if(InVoiceField) { // panning - if(!(v->m_Flags & ISound::FLAG_NO_PANNING)) + if(!(Voice.m_Flags & ISound::FLAG_NO_PANNING)) { if(dx > 0) Lvol = ((RangeX - p) * Lvol) / RangeX; @@ -237,18 +236,18 @@ static void Mix(short *pFinalOut, unsigned Frames) *pOut++ += (*pInR) * Rvol; pInL += Step; pInR += Step; - v->m_Tick++; + Voice.m_Tick++; } // free voice if not used any more - if(v->m_Tick == v->m_pSample->m_NumFrames) + if(Voice.m_Tick == Voice.m_pSample->m_NumFrames) { - if(v->m_Flags & ISound::FLAG_LOOP) - v->m_Tick = 0; + if(Voice.m_Flags & ISound::FLAG_LOOP) + Voice.m_Tick = 0; else { - v->m_pSample = 0; - v->m_Age++; + Voice.m_pSample = 0; + Voice.m_Age++; } } } @@ -937,15 +936,15 @@ void CSound::Stop(int SampleID) // TODO: a nice fade out lock_wait(m_SoundLock); CSample *pSample = &m_aSamples[SampleID]; - for(auto &m_aVoice : m_aVoices) + for(auto &Voice : m_aVoices) { - if(m_aVoice.m_pSample == pSample) + if(Voice.m_pSample == pSample) { - if(m_aVoice.m_Flags & FLAG_LOOP) - m_aVoice.m_pSample->m_PausedAt = m_aVoice.m_Tick; + if(Voice.m_Flags & FLAG_LOOP) + Voice.m_pSample->m_PausedAt = Voice.m_Tick; else - m_aVoice.m_pSample->m_PausedAt = 0; - m_aVoice.m_pSample = 0; + Voice.m_pSample->m_PausedAt = 0; + Voice.m_pSample = 0; } } lock_unlock(m_SoundLock); @@ -955,16 +954,16 @@ void CSound::StopAll() { // TODO: a nice fade out lock_wait(m_SoundLock); - for(auto &m_aVoice : m_aVoices) + for(auto &Voice : m_aVoices) { - if(m_aVoice.m_pSample) + if(Voice.m_pSample) { - if(m_aVoice.m_Flags & FLAG_LOOP) - m_aVoice.m_pSample->m_PausedAt = m_aVoice.m_Tick; + if(Voice.m_Flags & FLAG_LOOP) + Voice.m_pSample->m_PausedAt = Voice.m_Tick; else - m_aVoice.m_pSample->m_PausedAt = 0; + Voice.m_pSample->m_PausedAt = 0; } - m_aVoice.m_pSample = 0; + Voice.m_pSample = 0; } lock_unlock(m_SoundLock); } diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index 041f0305a..61c252379 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -85,9 +85,9 @@ public: free(m_pBuf); delete[] m_TextureData[0]; delete[] m_TextureData[1]; - for(auto &m_FtFallbackFont : m_FtFallbackFonts) + for(auto &FtFallbackFont : m_FtFallbackFonts) { - free(m_FtFallbackFont.m_pBuf); + free(FtFallbackFont.m_pBuf); } } @@ -600,16 +600,16 @@ public: virtual ~CTextRender() { - for(auto &m_Font : m_Fonts) + for(auto &pFont : m_Fonts) { - FT_Done_Face(m_Font->m_FtFace); + FT_Done_Face(pFont->m_FtFace); - for(CFont::SFontFallBack &FallbackFont : m_Font->m_FtFallbackFonts) + for(CFont::SFontFallBack &FallbackFont : pFont->m_FtFallbackFonts) { FT_Done_Face(FallbackFont.m_FtFace); } - delete m_Font; + delete pFont; } if(m_FTLibrary != 0) @@ -733,10 +733,10 @@ public: CFont *GetFont(const char *pFilename) { - for(auto &m_Font : m_Fonts) + for(auto &pFont : m_Fonts) { - if(str_comp(pFilename, m_Font->m_aFilename) == 0) - return m_Font; + if(str_comp(pFilename, pFont->m_aFilename) == 0) + return pFont; } return NULL; @@ -1975,8 +1975,8 @@ public: virtual void OnWindowResize() { bool FoundTextContainer = false; - for(auto &m_TextContainer : m_TextContainers) - if(m_TextContainer.m_StringInfo.m_QuadBufferContainerIndex != -1) + for(auto &TextContainer : m_TextContainers) + if(TextContainer.m_StringInfo.m_QuadBufferContainerIndex != -1) FoundTextContainer = true; if(FoundTextContainer) { @@ -1984,19 +1984,19 @@ public: dbg_assert(false, "text container was not empty"); } - for(auto &m_Font : m_Fonts) + for(auto &pFont : m_Fonts) { // reset the skylines for(int j = 0; j < 2; ++j) { - for(int & k : m_Font->m_TextureSkyline[j].m_CurHeightOfPixelColumn) + for(int &k : pFont->m_TextureSkyline[j].m_CurHeightOfPixelColumn) k = 0; - mem_zero(m_Font->m_TextureData[j], (size_t)m_Font->m_CurTextureDimensions[j] * m_Font->m_CurTextureDimensions[j] * sizeof(unsigned char)); - Graphics()->LoadTextureRawSub(m_Font->m_aTextures[j], 0, 0, m_Font->m_CurTextureDimensions[j], m_Font->m_CurTextureDimensions[j], CImageInfo::FORMAT_ALPHA, m_Font->m_TextureData[j]); + mem_zero(pFont->m_TextureData[j], (size_t)pFont->m_CurTextureDimensions[j] * pFont->m_CurTextureDimensions[j] * sizeof(unsigned char)); + Graphics()->LoadTextureRawSub(pFont->m_aTextures[j], 0, 0, pFont->m_CurTextureDimensions[j], pFont->m_CurTextureDimensions[j], CImageInfo::FORMAT_ALPHA, pFont->m_TextureData[j]); } - m_Font->InitFontSizes(); + pFont->InitFontSizes(); } } }; diff --git a/src/engine/client/updater.cpp b/src/engine/client/updater.cpp index 6997debff..541e79aca 100644 --- a/src/engine/client/updater.cpp +++ b/src/engine/client/updater.cpp @@ -312,11 +312,11 @@ void CUpdater::PerformUpdate() } } - for(auto &m_FileJob : m_FileJobs) + for(auto &FileJob : m_FileJobs) { - if(m_FileJob.second) + if(FileJob.second) { - const char *pFile = m_FileJob.first.c_str(); + const char *pFile = FileJob.first.c_str(); size_t len = str_length(pFile); if(!str_comp_nocase(pFile + len - 4, ".dll")) { @@ -347,7 +347,7 @@ void CUpdater::PerformUpdate() pLastFile = pFile; } else - m_pStorage->RemoveBinaryFile(m_FileJob.first.c_str()); + m_pStorage->RemoveBinaryFile(FileJob.first.c_str()); } if(m_ServerUpdate) @@ -368,9 +368,9 @@ void CUpdater::CommitUpdate() { bool Success = true; - for(auto &m_FileJob : m_FileJobs) - if(m_FileJob.second) - Success &= MoveFile(m_FileJob.first.c_str()); + for(auto &FileJob : m_FileJobs) + if(FileJob.second) + Success &= MoveFile(FileJob.first.c_str()); if(m_ClientUpdate) Success &= ReplaceClient(); diff --git a/src/engine/server/authmanager.cpp b/src/engine/server/authmanager.cpp index de99af252..c1038ebb1 100644 --- a/src/engine/server/authmanager.cpp +++ b/src/engine/server/authmanager.cpp @@ -66,15 +66,15 @@ int CAuthManager::AddKey(const char *pIdent, const char *pPw, int AuthLevel) int CAuthManager::RemoveKey(int Slot) { m_aKeys.remove_index_fast(Slot); - for(int &i : m_aDefault) + for(int &Default : m_aDefault) { - if(i == Slot) + if(Default == Slot) { - i = -1; + Default = -1; } - else if(i == m_aKeys.size()) + else if(Default == m_aKeys.size()) { - i = Slot; + Default = Slot; } } return m_aKeys.size(); diff --git a/src/engine/server/register.cpp b/src/engine/server/register.cpp index 40c6c2a6c..5a633d270 100644 --- a/src/engine/server/register.cpp +++ b/src/engine/server/register.cpp @@ -32,13 +32,13 @@ CRegister::CRegister(bool Sixup) void CRegister::FeedToken(NETADDR Addr, SECURITY_TOKEN ResponseToken) { Addr.port = 0; - for(auto &i : m_aMasterserverInfo) + for(auto &MasterserverInfo : m_aMasterserverInfo) { - NETADDR Addr2 = i.m_Addr; + NETADDR Addr2 = MasterserverInfo.m_Addr; Addr2.port = 0; if(net_addr_comp(&Addr, &Addr2) == 0) { - i.m_Token = ResponseToken; + MasterserverInfo.m_Token = ResponseToken; break; } } @@ -108,11 +108,11 @@ void CRegister::RegisterGotCount(CNetChunk *pChunk) unsigned char *pData = (unsigned char *)pChunk->m_pData; int Count = (pData[sizeof(SERVERBROWSE_COUNT)] << 8) | pData[sizeof(SERVERBROWSE_COUNT) + 1]; - for(auto &i : m_aMasterserverInfo) + for(auto &MasterserverInfo : m_aMasterserverInfo) { - if(net_addr_comp(&i.m_Addr, &pChunk->m_Address) == 0) + if(net_addr_comp(&MasterserverInfo.m_Addr, &pChunk->m_Address) == 0) { - i.m_Count = Count; + MasterserverInfo.m_Count = Count; break; } } @@ -183,21 +183,21 @@ void CRegister::RegisterUpdate(int Nettype) else if(m_RegisterState == REGISTERSTATE_QUERY_COUNT) { int Left = 0; - for(auto &i : m_aMasterserverInfo) + for(auto &MasterserverInfo : m_aMasterserverInfo) { - if(!i.m_Valid) + if(!MasterserverInfo.m_Valid) continue; - if(i.m_Count == -1) + if(MasterserverInfo.m_Count == -1) { Left++; - if(i.m_LastSend + Freq < Now) + if(MasterserverInfo.m_LastSend + Freq < Now) { - i.m_LastSend = Now; - if(m_Sixup && i.m_Token == NET_SECURITY_TOKEN_UNKNOWN) - m_pNetServer->SendTokenSixup(i.m_Addr, NET_SECURITY_TOKEN_UNKNOWN); + MasterserverInfo.m_LastSend = Now; + if(m_Sixup && MasterserverInfo.m_Token == NET_SECURITY_TOKEN_UNKNOWN) + m_pNetServer->SendTokenSixup(MasterserverInfo.m_Addr, NET_SECURITY_TOKEN_UNKNOWN); else - RegisterSendCountRequest(i.m_Addr, i.m_Token); + RegisterSendCountRequest(MasterserverInfo.m_Addr, MasterserverInfo.m_Token); } } } @@ -280,9 +280,9 @@ int CRegister::RegisterProcessPacket(CNetChunk *pPacket, SECURITY_TOKEN Response { // check for masterserver address bool Valid = false; - for(auto &i : m_aMasterserverInfo) + for(auto &MasterserverInfo : m_aMasterserverInfo) { - if(net_addr_comp_noport(&pPacket->m_Address, &i.m_Addr) == 0) + if(net_addr_comp_noport(&pPacket->m_Address, &MasterserverInfo.m_Addr) == 0) { Valid = true; break; diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index cdf4b049f..ba022acf6 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -269,8 +269,8 @@ void CServerBan::ConBanRegionRange(IConsole::IResult *pResult, void *pUser) void CServer::CClient::Reset() { // reset input - for(auto &m_aInput : m_aInputs) - m_aInput.m_GameTick = -1; + for(auto &Input : m_aInputs) + Input.m_GameTick = -1; m_CurrentInput = 0; mem_zero(&m_LatestInput, sizeof(m_LatestInput)); @@ -502,19 +502,19 @@ int64 CServer::TickStartTime(int Tick) int CServer::Init() { - for(auto &m_aClient : m_aClients) + for(auto &Client : m_aClients) { - m_aClient.m_State = CClient::STATE_EMPTY; - m_aClient.m_aName[0] = 0; - m_aClient.m_aClan[0] = 0; - m_aClient.m_Country = -1; - m_aClient.m_Snapshots.Init(); - m_aClient.m_Traffic = 0; - m_aClient.m_TrafficSince = 0; - m_aClient.m_ShowIps = false; - m_aClient.m_AuthKey = -1; - m_aClient.m_Latency = 0; - m_aClient.m_Sixup = false; + Client.m_State = CClient::STATE_EMPTY; + Client.m_aName[0] = 0; + Client.m_aClan[0] = 0; + Client.m_Country = -1; + Client.m_Snapshots.Init(); + Client.m_Traffic = 0; + Client.m_TrafficSince = 0; + Client.m_ShowIps = false; + Client.m_AuthKey = -1; + Client.m_Latency = 0; + Client.m_Sixup = false; } m_CurrentGameTick = 0; @@ -641,9 +641,9 @@ int CServer::MaxClients() const int CServer::ClientCount() { int ClientCount = 0; - for(auto &m_aClient : m_aClients) + for(auto &Client : m_aClients) { - if(m_aClient.m_State != CClient::STATE_EMPTY) + if(Client.m_State != CClient::STATE_EMPTY) { ClientCount++; } @@ -2533,9 +2533,9 @@ int CServer::Run() { for(int c = 0; c < MAX_CLIENTS; c++) if(m_aClients[c].m_State == CClient::STATE_INGAME) - for(auto &m_aInput : m_aClients[c].m_aInputs) - if(m_aInput.m_GameTick == Tick() + 1) - GameServer()->OnClientPredictedEarlyInput(c, m_aInput.m_aData); + for(auto &Input : m_aClients[c].m_aInputs) + if(Input.m_GameTick == Tick() + 1) + GameServer()->OnClientPredictedEarlyInput(c, Input.m_aData); m_CurrentGameTick++; NewTicks++; @@ -2545,11 +2545,11 @@ int CServer::Run() { if(m_aClients[c].m_State != CClient::STATE_INGAME) continue; - for(auto &m_aInput : m_aClients[c].m_aInputs) + for(auto &Input : m_aClients[c].m_aInputs) { - if(m_aInput.m_GameTick == Tick()) + if(Input.m_GameTick == Tick()) { - GameServer()->OnClientPredictedInput(c, m_aInput.m_aData); + GameServer()->OnClientPredictedInput(c, Input.m_aData); break; } } @@ -2590,8 +2590,8 @@ int CServer::Run() NonActive = true; - for(auto &m_aClient : m_aClients) - if(m_aClient.m_State != CClient::STATE_EMPTY) + for(auto &Client : m_aClients) + if(Client.m_State != CClient::STATE_EMPTY) NonActive = false; // wait for incoming data @@ -2647,8 +2647,8 @@ int CServer::Run() GameServer()->OnShutdown(); m_pMap->Unload(); - for(auto &i : m_apCurrentMapData) - free(i); + for(auto &pCurrentMapData : m_apCurrentMapData) + free(pCurrentMapData); DbPool()->OnShutdown(); delete m_pConnectionPool; @@ -2760,9 +2760,9 @@ void CServer::AuthRemoveKey(int KeySlot) // Update indices. if(OldKeySlot != NewKeySlot) { - for(auto &m_aClient : m_aClients) - if(m_aClient.m_AuthKey == OldKeySlot) - m_aClient.m_AuthKey = NewKeySlot; + for(auto &Client : m_aClients) + if(Client.m_AuthKey == OldKeySlot) + Client.m_AuthKey = NewKeySlot; } } diff --git a/src/engine/shared/datafile.cpp b/src/engine/shared/datafile.cpp index b84522b55..1a284a93e 100644 --- a/src/engine/shared/datafile.cpp +++ b/src/engine/shared/datafile.cpp @@ -549,9 +549,9 @@ SHA256_DIGEST CDataFileReader::Sha256() if(!m_pDataFile) { SHA256_DIGEST Result; - for(unsigned char &i : Result.data) + for(unsigned char &d : Result.data) { - i = 0xff; + d = 0xff; } return Result; } diff --git a/src/engine/shared/econ.cpp b/src/engine/shared/econ.cpp index 668f59f34..f48f4499b 100644 --- a/src/engine/shared/econ.cpp +++ b/src/engine/shared/econ.cpp @@ -63,8 +63,8 @@ void CEcon::Init(IConsole *pConsole, CNetBan *pNetBan) { m_pConsole = pConsole; - for(auto &m_aClient : m_aClients) - m_aClient.m_State = CClient::STATE_EMPTY; + for(auto &Client : m_aClients) + Client.m_State = CClient::STATE_EMPTY; m_Ready = false; m_UserClientID = -1; diff --git a/src/engine/shared/masterserver.cpp b/src/engine/shared/masterserver.cpp index 1345ea28f..4003b1b98 100644 --- a/src/engine/shared/masterserver.cpp +++ b/src/engine/shared/masterserver.cpp @@ -168,11 +168,11 @@ public: { Info.m_Addr.port = 8300; bool Added = false; - for(auto &m_aMasterServer : m_aMasterServers) + for(auto &MasterServer : m_aMasterServers) { - if(str_comp(m_aMasterServer.m_aHostname, Info.m_aHostname) == 0) + if(str_comp(MasterServer.m_aHostname, Info.m_aHostname) == 0) { - m_aMasterServer = Info; + MasterServer = Info; Added = true; break; } @@ -180,11 +180,11 @@ public: if(!Added) { - for(auto &m_aMasterServer : m_aMasterServers) + for(auto &MasterServer : m_aMasterServers) { - if(m_aMasterServer.m_Addr.type == NETTYPE_INVALID) + if(MasterServer.m_Addr.type == NETTYPE_INVALID) { - m_aMasterServer = Info; + MasterServer = Info; Added = true; break; } @@ -210,15 +210,15 @@ public: if(!File) return -1; - for(auto &m_aMasterServer : m_aMasterServers) + for(auto &MasterServer : m_aMasterServers) { char aAddrStr[NETADDR_MAXSTRSIZE]; - if(m_aMasterServer.m_Addr.type != NETTYPE_INVALID) - net_addr_str(&m_aMasterServer.m_Addr, aAddrStr, sizeof(aAddrStr), true); + if(MasterServer.m_Addr.type != NETTYPE_INVALID) + net_addr_str(&MasterServer.m_Addr, aAddrStr, sizeof(aAddrStr), true); else aAddrStr[0] = 0; char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "%s %s", m_aMasterServer.m_aHostname, aAddrStr); + str_format(aBuf, sizeof(aBuf), "%s %s", MasterServer.m_aHostname, aAddrStr); io_write(File, aBuf, str_length(aBuf)); io_write_newline(File); } diff --git a/src/engine/shared/network_console.cpp b/src/engine/shared/network_console.cpp index 4cb0b138d..b49e4d586 100644 --- a/src/engine/shared/network_console.cpp +++ b/src/engine/shared/network_console.cpp @@ -24,8 +24,8 @@ bool CNetConsole::Open(NETADDR BindAddr, CNetBan *pNetBan, int Flags) return false; net_set_non_blocking(m_Socket); - for(auto &m_aSlot : m_aSlots) - m_aSlot.m_Connection.Reset(); + for(auto &Slot : m_aSlots) + Slot.m_Connection.Reset(); return true; } @@ -39,8 +39,8 @@ void CNetConsole::SetCallbacks(NETFUNC_NEWCLIENT_CON pfnNewClient, NETFUNC_DELCL int CNetConsole::Close() { - for(auto &m_aSlot : m_aSlots) - m_aSlot.m_Connection.Disconnect("closing console"); + for(auto &Slot : m_aSlots) + Slot.m_Connection.Disconnect("closing console"); net_tcp_close(m_Socket); diff --git a/src/engine/shared/network_server.cpp b/src/engine/shared/network_server.cpp index c9df48fea..7689efa4e 100644 --- a/src/engine/shared/network_server.cpp +++ b/src/engine/shared/network_server.cpp @@ -76,8 +76,8 @@ bool CNetServer::Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int Ma secure_random_fill(m_SecurityTokenSeed, sizeof(m_SecurityTokenSeed)); - for(auto &m_aSlot : m_aSlots) - m_aSlot.m_Connection.Init(m_Socket, true); + for(auto &Slot : m_aSlots) + Slot.m_Connection.Init(m_Socket, true); net_init_mmsgs(&m_MMSGS); diff --git a/src/game/client/components/binds.cpp b/src/game/client/components/binds.cpp index 4186a0490..9f40b422c 100644 --- a/src/game/client/components/binds.cpp +++ b/src/game/client/components/binds.cpp @@ -33,9 +33,9 @@ CBinds::CBinds() CBinds::~CBinds() { for(int i = 0; i < KEY_LAST; i++) - for(auto &m_aapKeyBinding : m_aapKeyBindings) - if(m_aapKeyBinding[i]) - free(m_aapKeyBinding[i]); + for(auto &apKeyBinding : m_aapKeyBindings) + if(apKeyBinding[i]) + free(apKeyBinding[i]); } void CBinds::Bind(int KeyID, const char *pStr, bool FreeOnly, int Modifier) @@ -158,13 +158,13 @@ bool CBinds::OnInput(IInput::CEvent e) void CBinds::UnbindAll() { - for(auto &m_aapKeyBinding : m_aapKeyBindings) + for(auto &apKeyBinding : m_aapKeyBindings) { - for(auto & j : m_aapKeyBinding) + for(auto &pKeyBinding : apKeyBinding) { - if(j) - free(j); - j = 0; + if(pKeyBinding) + free(pKeyBinding); + pKeyBinding = 0; } } } diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index 030fd13b0..d83b1df23 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -27,11 +27,11 @@ CChat::CChat() { - for(auto &m_aLine : m_aLines) + for(auto &Line : m_aLines) { // reset the container indices, so the text containers can be deleted on reset - m_aLine.m_TextContainerIndex = -1; - m_aLine.m_QuadContainerIndex = -1; + Line.m_TextContainerIndex = -1; + Line.m_QuadContainerIndex = -1; } #define CHAT_COMMAND(name, params, flags, callback, userdata, help) RegisterCommand(name, params, flags, help); @@ -49,17 +49,17 @@ void CChat::RegisterCommand(const char *pName, const char *pParams, int flags, c void CChat::RebuildChat() { - for(auto &m_aLine : m_aLines) + for(auto &Line : m_aLines) { - if(m_aLine.m_TextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aLine.m_TextContainerIndex); - m_aLine.m_TextContainerIndex = -1; - if(m_aLine.m_QuadContainerIndex != -1) - Graphics()->DeleteQuadContainer(m_aLine.m_QuadContainerIndex); - m_aLine.m_QuadContainerIndex = -1; + if(Line.m_TextContainerIndex != -1) + TextRender()->DeleteTextContainer(Line.m_TextContainerIndex); + Line.m_TextContainerIndex = -1; + if(Line.m_QuadContainerIndex != -1) + Graphics()->DeleteQuadContainer(Line.m_QuadContainerIndex); + Line.m_QuadContainerIndex = -1; // recalculate sizes - m_aLine.m_YOffset[0] = -1.f; - m_aLine.m_YOffset[1] = -1.f; + Line.m_YOffset[0] = -1.f; + Line.m_YOffset[1] = -1.f; } } @@ -70,20 +70,20 @@ void CChat::OnWindowResize() void CChat::Reset() { - for(auto &m_aLine : m_aLines) + for(auto &Line : m_aLines) { - if(m_aLine.m_TextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aLine.m_TextContainerIndex); - if(m_aLine.m_QuadContainerIndex != -1) - Graphics()->DeleteQuadContainer(m_aLine.m_QuadContainerIndex); - m_aLine.m_Time = 0; - m_aLine.m_aText[0] = 0; - m_aLine.m_aName[0] = 0; - m_aLine.m_Friend = false; - m_aLine.m_TextContainerIndex = -1; - m_aLine.m_QuadContainerIndex = -1; - m_aLine.m_TimesRepeated = 0; - m_aLine.m_HasRenderTee = false; + if(Line.m_TextContainerIndex != -1) + TextRender()->DeleteTextContainer(Line.m_TextContainerIndex); + if(Line.m_QuadContainerIndex != -1) + Graphics()->DeleteQuadContainer(Line.m_QuadContainerIndex); + Line.m_Time = 0; + Line.m_aText[0] = 0; + Line.m_aName[0] = 0; + Line.m_Friend = false; + Line.m_TextContainerIndex = -1; + Line.m_QuadContainerIndex = -1; + Line.m_TimesRepeated = 0; + Line.m_HasRenderTee = false; } m_PrevScoreBoardShowed = false; m_PrevShowChat = false; @@ -102,8 +102,8 @@ void CChat::Reset() m_CurrentLine = 0; DisableMode(); - for(long long &i : m_aLastSoundPlayed) - i = 0; + for(long long &LastSoundPlayed : m_aLastSoundPlayed) + LastSoundPlayed = 0; } void CChat::OnRelease() diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp index ebd3195a0..5f3d82669 100644 --- a/src/game/client/components/controls.cpp +++ b/src/game/client/components/controls.cpp @@ -71,8 +71,8 @@ void CControls::OnReset() m_JoystickFirePressed = false; m_JoystickRunPressed = false; m_JoystickTapTime = 0; - for(int &i : m_AmmoCount) - i = 0; + for(int &AmmoCount : m_AmmoCount) + AmmoCount = 0; m_OldMouseX = m_OldMouseY = 0.0f; } @@ -100,8 +100,8 @@ void CControls::OnPlayerDeath() { if(g_Config.m_ClResetWantedWeaponOnDeath) m_LastData[g_Config.m_ClDummy].m_WantedWeapon = m_InputData[g_Config.m_ClDummy].m_WantedWeapon = 0; - for(int &i : m_AmmoCount) - i = 0; + for(int &AmmoCount : m_AmmoCount) + AmmoCount = 0; m_JoystickTapTime = 0; // Do not launch hook on first tap } diff --git a/src/game/client/components/countryflags.cpp b/src/game/client/components/countryflags.cpp index 2494199d6..41a5df7a6 100644 --- a/src/game/client/components/countryflags.cpp +++ b/src/game/client/components/countryflags.cpp @@ -102,8 +102,8 @@ void CCountryFlags::LoadCountryflagsIndexfile() // init LUT if(DefaultIndex != 0) - for(int &i : m_CodeIndexLUT) - i = DefaultIndex; + for(int &CodeIndexLUT : m_CodeIndexLUT) + CodeIndexLUT = DefaultIndex; else mem_zero(m_CodeIndexLUT, sizeof(m_CodeIndexLUT)); for(int i = 0; i < m_aCountryFlags.size(); ++i) diff --git a/src/game/client/components/ghost.cpp b/src/game/client/components/ghost.cpp index 43bf32735..f866c196f 100644 --- a/src/game/client/components/ghost.cpp +++ b/src/game/client/components/ghost.cpp @@ -78,8 +78,8 @@ CGhost::CGhostPath &CGhost::CGhostPath::operator=(CGhostPath &&Other) void CGhost::CGhostPath::Reset(int ChunkSize) { - for(auto &m_lChunk : m_lChunks) - free(m_lChunk); + for(auto &pChunk : m_lChunks) + free(pChunk); m_lChunks.clear(); m_ChunkSize = ChunkSize; m_NumItems = 0; @@ -167,8 +167,8 @@ int CGhost::GetSlot() const int CGhost::FreeSlots() const { int Num = 0; - for(const auto &m_aActiveGhost : m_aActiveGhosts) - if(m_aActiveGhost.Empty()) + for(const auto &ActiveGhost : m_aActiveGhosts) + if(ActiveGhost.Empty()) Num++; return Num; } @@ -308,32 +308,31 @@ void CGhost::OnRender() int PlaybackTick = Client()->PredGameTick(g_Config.m_ClDummy) - m_StartRenderTick; - for(auto &m_aActiveGhost : m_aActiveGhosts) + for(auto &Ghost : m_aActiveGhosts) { - CGhostItem *pGhost = &m_aActiveGhost; - if(pGhost->Empty()) + if(Ghost.Empty()) continue; - int GhostTick = pGhost->m_StartTick + PlaybackTick; - while(pGhost->m_PlaybackPos >= 0 && pGhost->m_Path.Get(pGhost->m_PlaybackPos)->m_Tick < GhostTick) + int GhostTick = Ghost.m_StartTick + PlaybackTick; + while(Ghost.m_PlaybackPos >= 0 && Ghost.m_Path.Get(Ghost.m_PlaybackPos)->m_Tick < GhostTick) { - if(pGhost->m_PlaybackPos < pGhost->m_Path.Size() - 1) - pGhost->m_PlaybackPos++; + if(Ghost.m_PlaybackPos < Ghost.m_Path.Size() - 1) + Ghost.m_PlaybackPos++; else - pGhost->m_PlaybackPos = -1; + Ghost.m_PlaybackPos = -1; } - if(pGhost->m_PlaybackPos < 0) + if(Ghost.m_PlaybackPos < 0) continue; - int CurPos = pGhost->m_PlaybackPos; + int CurPos = Ghost.m_PlaybackPos; int PrevPos = maximum(0, CurPos - 1); - if(pGhost->m_Path.Get(PrevPos)->m_Tick > GhostTick) + if(Ghost.m_Path.Get(PrevPos)->m_Tick > GhostTick) continue; CNetObj_Character Player, Prev; - GetNetObjCharacter(&Player, pGhost->m_Path.Get(CurPos)); - GetNetObjCharacter(&Prev, pGhost->m_Path.Get(PrevPos)); + GetNetObjCharacter(&Player, Ghost.m_Path.Get(CurPos)); + GetNetObjCharacter(&Prev, Ghost.m_Path.Get(PrevPos)); int TickDiff = Player.m_Tick - Prev.m_Tick; float IntraTick = 0.f; @@ -342,8 +341,8 @@ void CGhost::OnRender() Player.m_AttackTick += Client()->GameTick(g_Config.m_ClDummy) - GhostTick; - m_pClient->m_pPlayers->RenderHook(&Prev, &Player, &pGhost->m_RenderInfo, -2, IntraTick); - m_pClient->m_pPlayers->RenderPlayer(&Prev, &Player, &pGhost->m_RenderInfo, -2, IntraTick); + m_pClient->m_pPlayers->RenderHook(&Prev, &Player, &Ghost.m_RenderInfo, -2, IntraTick); + m_pClient->m_pPlayers->RenderPlayer(&Prev, &Player, &Ghost.m_RenderInfo, -2, IntraTick); } } @@ -431,8 +430,8 @@ void CGhost::StartRender(int Tick) { m_Rendering = true; m_StartRenderTick = Tick; - for(auto &m_aActiveGhost : m_aActiveGhosts) - m_aActiveGhost.m_PlaybackPos = 0; + for(auto &Ghost : m_aActiveGhosts) + Ghost.m_PlaybackPos = 0; } void CGhost::StopRender() @@ -632,12 +631,12 @@ int CGhost::GetLastRaceTick() void CGhost::RefindSkin() { char aSkinName[64]; - for(auto &m_aActiveGhost : m_aActiveGhosts) + for(auto &Ghost : m_aActiveGhosts) { - IntsToStr(&m_aActiveGhost.m_Skin.m_Skin0, 6, aSkinName); + IntsToStr(&Ghost.m_Skin.m_Skin0, 6, aSkinName); if(aSkinName[0] != '\0') { - CTeeRenderInfo *pRenderInfo = &m_aActiveGhost.m_RenderInfo; + CTeeRenderInfo *pRenderInfo = &Ghost.m_RenderInfo; int SkinId = m_pClient->m_pSkins->Find(aSkinName); const CSkin *pSkin = m_pClient->m_pSkins->Get(SkinId); diff --git a/src/game/client/components/killmessages.cpp b/src/game/client/components/killmessages.cpp index b6a85170d..4768e325f 100644 --- a/src/game/client/components/killmessages.cpp +++ b/src/game/client/components/killmessages.cpp @@ -12,30 +12,30 @@ void CKillMessages::OnWindowResize() { - for(auto &m_aKillmsg : m_aKillmsgs) + for(auto &Killmsg : m_aKillmsgs) { - if(m_aKillmsg.m_VictimTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsg.m_VictimTextContainerIndex); - if(m_aKillmsg.m_KillerTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsg.m_KillerTextContainerIndex); - m_aKillmsg.m_VictimTextContainerIndex = m_aKillmsg.m_KillerTextContainerIndex = -1; + if(Killmsg.m_VictimTextContainerIndex != -1) + TextRender()->DeleteTextContainer(Killmsg.m_VictimTextContainerIndex); + if(Killmsg.m_KillerTextContainerIndex != -1) + TextRender()->DeleteTextContainer(Killmsg.m_KillerTextContainerIndex); + Killmsg.m_VictimTextContainerIndex = Killmsg.m_KillerTextContainerIndex = -1; } } void CKillMessages::OnReset() { m_KillmsgCurrent = 0; - for(auto &m_aKillmsg : m_aKillmsgs) + for(auto &Killmsg : m_aKillmsgs) { - m_aKillmsg.m_Tick = -100000; + Killmsg.m_Tick = -100000; - if(m_aKillmsg.m_VictimTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsg.m_VictimTextContainerIndex); + if(Killmsg.m_VictimTextContainerIndex != -1) + TextRender()->DeleteTextContainer(Killmsg.m_VictimTextContainerIndex); - if(m_aKillmsg.m_KillerTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aKillmsg.m_KillerTextContainerIndex); + if(Killmsg.m_KillerTextContainerIndex != -1) + TextRender()->DeleteTextContainer(Killmsg.m_KillerTextContainerIndex); - m_aKillmsg.m_VictimTextContainerIndex = m_aKillmsg.m_KillerTextContainerIndex = -1; + Killmsg.m_VictimTextContainerIndex = Killmsg.m_KillerTextContainerIndex = -1; } } diff --git a/src/game/client/components/menu_background.cpp b/src/game/client/components/menu_background.cpp index 6bd45d0fa..79dcdfda1 100644 --- a/src/game/client/components/menu_background.cpp +++ b/src/game/client/components/menu_background.cpp @@ -108,14 +108,14 @@ int CMenuBackground::ThemeScan(const char *pName, int IsDir, int DirType, void * return 0; // try to edit an existing theme - for(auto &m_lTheme : pSelf->m_lThemes) + for(auto &Theme : pSelf->m_lThemes) { - if(str_comp(m_lTheme.m_Name, aThemeName) == 0) + if(str_comp(Theme.m_Name, aThemeName) == 0) { if(IsDay) - m_lTheme.m_HasDay = true; + Theme.m_HasDay = true; if(IsNight) - m_lTheme.m_HasNight = true; + Theme.m_HasNight = true; return 0; } } diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 493e2da27..973b02f63 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -1081,10 +1081,10 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View) ServerDetails.VSplitLeft(5.0f, 0x0, &ServerDetails); ServerDetails.VSplitLeft(80.0f, &LeftColumn, &RightColumn); - for(auto &s_aLabel : s_aLabels) + for(auto &Label : s_aLabels) { LeftColumn.HSplitTop(15.0f, &Row, &LeftColumn); - UI()->DoLabelScaled(&Row, s_aLabel, FontSize, -1); + UI()->DoLabelScaled(&Row, Label, FontSize, -1); } RightColumn.HSplitTop(15.0f, &Row, &RightColumn); diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 02a2c2e89..9171860a7 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -248,12 +248,12 @@ void CMenus::RenderPlayers(CUIRect MainView) int TotalPlayers = 0; - for(auto &i : m_pClient->m_Snap.m_paInfoByName) + for(auto &pInfoByName : m_pClient->m_Snap.m_paInfoByName) { - if(!i) + if(!pInfoByName) continue; - int Index = i->m_ClientID; + int Index = pInfoByName->m_ClientID; if(Index == m_pClient->m_Snap.m_LocalClientID) continue; @@ -561,13 +561,13 @@ bool CMenus::RenderServerControlKick(CUIRect MainView, bool FilterSpectators) int NumOptions = 0; int Selected = -1; static int aPlayerIDs[MAX_CLIENTS]; - for(auto &i : m_pClient->m_Snap.m_paInfoByName) + for(auto &pInfoByName : m_pClient->m_Snap.m_paInfoByName) { - if(!i) + if(!pInfoByName) continue; - int Index = i->m_ClientID; - if(Index == m_pClient->m_Snap.m_LocalClientID || (FilterSpectators && i->m_Team == TEAM_SPECTATORS)) + int Index = pInfoByName->m_ClientID; + if(Index == m_pClient->m_Snap.m_LocalClientID || (FilterSpectators && pInfoByName->m_Team == TEAM_SPECTATORS)) continue; if(!str_find_nocase(m_pClient->m_aClients[Index].m_aName, m_aFilterString)) diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 6efa3c5f0..54955226e 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -529,13 +529,12 @@ void CMenus::RenderSettingsTee(CUIRect MainView) SkinPrefix.HSplitTop(2.0f, 0, &SkinPrefix); { static const char *s_aSkinPrefixes[] = {"kitty", "santa"}; - for(auto &s_aSkinPrefixe : s_aSkinPrefixes) + for(auto &pPrefix : s_aSkinPrefixes) { - const char *pPrefix = s_aSkinPrefixe; CUIRect Button; SkinPrefix.HSplitTop(20.0f, &Button, &SkinPrefix); Button.HMargin(2.0f, &Button); - if(DoButton_Menu(&s_aSkinPrefixe, pPrefix, 0, &Button)) + if(DoButton_Menu(&pPrefix, pPrefix, 0, &Button)) { str_copy(g_Config.m_ClSkinPrefix, pPrefix, sizeof(g_Config.m_ClSkinPrefix)); } @@ -848,8 +847,8 @@ void CMenus::RenderSettingsControls(CUIRect MainView) char aBuf[128]; // this is kinda slow, but whatever - for(auto &gs_aKey : gs_aKeys) - gs_aKey.m_KeyId = gs_aKey.m_Modifier = 0; + for(auto &Key : gs_aKeys) + Key.m_KeyId = Key.m_Modifier = 0; for(int Mod = 0; Mod < CBinds::MODIFIER_COUNT; Mod++) { @@ -859,11 +858,11 @@ void CMenus::RenderSettingsControls(CUIRect MainView) if(!pBind[0]) continue; - for(auto &gs_aKey : gs_aKeys) - if(str_comp(pBind, gs_aKey.m_pCommand) == 0) + for(auto &Key : gs_aKeys) + if(str_comp(pBind, Key.m_pCommand) == 0) { - gs_aKey.m_KeyId = KeyId; - gs_aKey.m_Modifier = Mod; + Key.m_KeyId = KeyId; + Key.m_Modifier = Mod; break; } } diff --git a/src/game/client/components/menus_settings_assets.cpp b/src/game/client/components/menus_settings_assets.cpp index 2a5f6a7b9..2557da4a9 100644 --- a/src/game/client/components/menus_settings_assets.cpp +++ b/src/game/client/components/menus_settings_assets.cpp @@ -241,11 +241,11 @@ void CMenus::ClearCustomItems(int CurTab) { for(int i = 0; i < m_EntitiesList.size(); ++i) { - for(auto &m_aImage : m_EntitiesList[i].m_aImages) + for(auto &Image : m_EntitiesList[i].m_aImages) { - if(m_aImage.m_Texture != -1) - Graphics()->UnloadTexture(m_aImage.m_Texture); - m_aImage.m_Texture = IGraphics::CTextureHandle(); + if(Image.m_Texture != -1) + Graphics()->UnloadTexture(Image.m_Texture); + Image.m_Texture = IGraphics::CTextureHandle(); } } m_EntitiesList.clear(); diff --git a/src/game/client/components/nameplates.cpp b/src/game/client/components/nameplates.cpp index 990cbb455..2f460a2a7 100644 --- a/src/game/client/components/nameplates.cpp +++ b/src/game/client/components/nameplates.cpp @@ -247,14 +247,14 @@ void CNamePlates::SetPlayers(CPlayers *pPlayers) void CNamePlates::ResetNamePlates() { - for(auto &m_aNamePlate : m_aNamePlates) + for(auto &NamePlate : m_aNamePlates) { - if(m_aNamePlate.m_NameTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aNamePlate.m_NameTextContainerIndex); - if(m_aNamePlate.m_ClanNameTextContainerIndex != -1) - TextRender()->DeleteTextContainer(m_aNamePlate.m_ClanNameTextContainerIndex); + if(NamePlate.m_NameTextContainerIndex != -1) + TextRender()->DeleteTextContainer(NamePlate.m_NameTextContainerIndex); + if(NamePlate.m_ClanNameTextContainerIndex != -1) + TextRender()->DeleteTextContainer(NamePlate.m_ClanNameTextContainerIndex); - m_aNamePlate.Reset(); + NamePlate.Reset(); } } diff --git a/src/game/client/components/particles.cpp b/src/game/client/components/particles.cpp index cf595de18..dd574045a 100644 --- a/src/game/client/components/particles.cpp +++ b/src/game/client/components/particles.cpp @@ -30,8 +30,8 @@ void CParticles::OnReset() m_aParticles[MAX_PARTICLES - 1].m_NextPart = -1; m_FirstFree = 0; - for(int &i : m_aFirstPart) - i = -1; + for(int &FirstPart : m_aFirstPart) + FirstPart = -1; } void CParticles::Add(int Group, CParticle *pPart, float TimePassed) @@ -89,9 +89,9 @@ void CParticles::Update(float TimePassed) FrictionFraction -= 0.05f; } - for(int &g : m_aFirstPart) + for(int &FirstPart : m_aFirstPart) { - int i = g; + int i = FirstPart; while(i != -1) { int Next = m_aParticles[i].m_NextPart; @@ -116,7 +116,7 @@ void CParticles::Update(float TimePassed) if(m_aParticles[i].m_PrevPart != -1) m_aParticles[m_aParticles[i].m_PrevPart].m_NextPart = m_aParticles[i].m_NextPart; else - g = m_aParticles[i].m_NextPart; + FirstPart = m_aParticles[i].m_NextPart; if(m_aParticles[i].m_NextPart != -1) m_aParticles[m_aParticles[i].m_NextPart].m_PrevPart = m_aParticles[i].m_PrevPart; diff --git a/src/game/client/components/race_demo.cpp b/src/game/client/components/race_demo.cpp index 469c0a866..468e20823 100644 --- a/src/game/client/components/race_demo.cpp +++ b/src/game/client/components/race_demo.cpp @@ -214,14 +214,14 @@ bool CRaceDemo::CheckDemo(int Time) const Storage()->ListDirectoryInfo(IStorage::TYPE_SAVE, ms_pRaceDemoDir, RaceDemolistFetchCallback, &Param); // loop through demo files - for(auto &lDemo : lDemos) + for(auto &Demo : lDemos) { - if(Time >= lDemo.m_Time) // found a better demo + if(Time >= Demo.m_Time) // found a better demo return false; // delete old demo char aFilename[512]; - str_format(aFilename, sizeof(aFilename), "%s/%s.demo", ms_pRaceDemoDir, lDemo.m_aName); + str_format(aFilename, sizeof(aFilename), "%s/%s.demo", ms_pRaceDemoDir, Demo.m_aName); Storage()->RemoveFile(aFilename, IStorage::TYPE_SAVE); } diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp index 3e8db92b9..fe45b7734 100644 --- a/src/game/client/components/skins.cpp +++ b/src/game/client/components/skins.cpp @@ -20,9 +20,9 @@ static const char *VANILLA_SKINS[] = {"bluekitty", "bluestripe", "brownbear", static bool IsVanillaSkin(const char *pName) { - for(auto &i : VANILLA_SKINS) + for(auto &pVanillaSkin : VANILLA_SKINS) { - if(str_comp(pName, i) == 0) + if(str_comp(pName, pVanillaSkin) == 0) { return true; } @@ -210,8 +210,8 @@ void CSkins::Refresh() Graphics()->UnloadTextureNew(m_aSkins[i].m_OriginalSkin.m_FeetOutline); Graphics()->UnloadTextureNew(m_aSkins[i].m_OriginalSkin.m_Hands); Graphics()->UnloadTextureNew(m_aSkins[i].m_OriginalSkin.m_HandsOutline); - for(auto &m_Eye : m_aSkins[i].m_OriginalSkin.m_Eyes) - Graphics()->UnloadTextureNew(m_Eye); + for(auto &Eye : m_aSkins[i].m_OriginalSkin.m_Eyes) + Graphics()->UnloadTextureNew(Eye); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_Body); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_BodyOutline); @@ -219,8 +219,8 @@ void CSkins::Refresh() Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_FeetOutline); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_Hands); Graphics()->UnloadTextureNew(m_aSkins[i].m_ColorableSkin.m_HandsOutline); - for(auto &m_Eye : m_aSkins[i].m_ColorableSkin.m_Eyes) - Graphics()->UnloadTextureNew(m_Eye); + for(auto &Eye : m_aSkins[i].m_ColorableSkin.m_Eyes) + Graphics()->UnloadTextureNew(Eye); } m_aSkins.clear(); diff --git a/src/game/client/components/spectator.cpp b/src/game/client/components/spectator.cpp index 93ee026a2..0c2e13148 100644 --- a/src/game/client/components/spectator.cpp +++ b/src/game/client/components/spectator.cpp @@ -217,9 +217,9 @@ void CSpectator::OnRender() float BoxMove = -10.0f; float BoxOffset = 0.0f; - for(auto &i : m_pClient->m_Snap.m_paInfoByDDTeamName) + for(auto &pInfo : m_pClient->m_Snap.m_paInfoByDDTeamName) { - if(!i || i->m_Team == TEAM_SPECTATORS) + if(!pInfo || pInfo->m_Team == TEAM_SPECTATORS) continue; ++TotalPlayers; diff --git a/src/game/client/components/statboard.cpp b/src/game/client/components/statboard.cpp index cb6eb5ad7..efba8c753 100644 --- a/src/game/client/components/statboard.cpp +++ b/src/game/client/components/statboard.cpp @@ -19,8 +19,8 @@ CStatboard::CStatboard() void CStatboard::OnReset() { - for(auto &m_aStat : m_pClient->m_aStats) - m_aStat.Reset(); + for(auto &Stat : m_pClient->m_aStats) + Stat.Reset(); m_Active = false; m_ScreenshotTaken = false; m_ScreenshotTime = -1; @@ -180,8 +180,8 @@ void CStatboard::RenderGlobalStats() for(int j = 0; j < NUM_WEAPONS; j++) aDisplayWeapon[j] = aDisplayWeapon[j] || pStats->m_aFragsWith[j] || pStats->m_aDeathsFrom[j]; } - for(bool i : aDisplayWeapon) - if(i) + for(bool DisplayWeapon : aDisplayWeapon) + if(DisplayWeapon) StatboardContentWidth += 80; float x = StatboardWidth / 2 - StatboardContentWidth / 2; diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 75e5efa43..b295e5e2e 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -524,8 +524,8 @@ void CGameClient::OnConnected() m_GameWorld.Clear(); m_GameWorld.m_WorldConfig.m_InfiniteAmmo = true; m_PredictedDummyID = -1; - for(auto &m_aLastWorldCharacter : m_aLastWorldCharacters) - m_aLastWorldCharacter.m_Alive = false; + for(auto &LastWorldCharacter : m_aLastWorldCharacters) + LastWorldCharacter.m_Alive = false; LoadMapSettings(); if(Client()->State() != IClient::STATE_DEMOPLAYBACK && g_Config.m_ClAutoDemoOnConnect) @@ -539,8 +539,8 @@ void CGameClient::OnReset() InvalidateSnapshot(); - for(auto &m_aClient : m_aClients) - m_aClient.Reset(); + for(auto &Client : m_aClients) + Client.Reset(); for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnReset(); @@ -1208,9 +1208,9 @@ void CGameClient::OnNewSnapshot() bool FoundGameInfoEx = false; - for(auto &m_aClient : m_aClients) + for(auto &Client : m_aClients) { - m_aClient.m_SpecCharPresent = false; + Client.m_SpecCharPresent = false; } // go trough all the items in the snapshot and gather the info we want @@ -2243,14 +2243,14 @@ void CGameClient::UpdatePrediction() if(m_Snap.m_aCharacters[m_Snap.m_LocalClientID].m_HasExtendedData) { int aIDs[MAX_CLIENTS]; - for(int &aID : aIDs) - aID = -1; + for(int &ID : aIDs) + ID = -1; for(int i = 0; i < MAX_CLIENTS; i++) if(CCharacter *pChar = m_GameWorld.GetCharacterByID(i)) aIDs[pChar->GetStrongWeakID()] = i; - for(int aID : aIDs) - if(aID >= 0) - m_CharOrder.GiveStrong(aID); + for(int ID : aIDs) + if(ID >= 0) + m_CharOrder.GiveStrong(ID); } else { @@ -2545,9 +2545,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinjaCursor); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponLaserCursor); - for(auto &m_SpriteWeaponCursor : m_GameSkin.m_SpriteWeaponCursors) + for(auto &SpriteWeaponCursor : m_GameSkin.m_SpriteWeaponCursors) { - m_SpriteWeaponCursor = IGraphics::CTextureHandle(); + SpriteWeaponCursor = IGraphics::CTextureHandle(); } Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteHookChain); @@ -2559,19 +2559,19 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinja); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponLaser); - for(auto &m_SpriteWeapon : m_GameSkin.m_SpriteWeapons) + for(auto &SpriteWeapon : m_GameSkin.m_SpriteWeapons) { - m_SpriteWeapon = IGraphics::CTextureHandle(); + SpriteWeapon = IGraphics::CTextureHandle(); } - for(auto &m_SpriteParticle : m_GameSkin.m_SpriteParticles) + for(auto &SpriteParticle : m_GameSkin.m_SpriteParticles) { - Graphics()->UnloadTextureNew(m_SpriteParticle); + Graphics()->UnloadTextureNew(SpriteParticle); } - for(auto &m_SpriteStar : m_GameSkin.m_SpriteStars) + for(auto &SpriteStar : m_GameSkin.m_SpriteStars) { - Graphics()->UnloadTextureNew(m_SpriteStar); + Graphics()->UnloadTextureNew(SpriteStar); } Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponGunProjectile); @@ -2581,9 +2581,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinjaProjectile); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponLaserProjectile); - for(auto &m_SpriteWeaponProjectile : m_GameSkin.m_SpriteWeaponProjectiles) + for(auto &SpriteWeaponProjectile : m_GameSkin.m_SpriteWeaponProjectiles) { - m_SpriteWeaponProjectile = IGraphics::CTextureHandle(); + SpriteWeaponProjectile = IGraphics::CTextureHandle(); } for(int i = 0; i < 3; ++i) @@ -2592,9 +2592,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponShotgunMuzzles[i]); Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteWeaponNinjaMuzzles[i]); - for(auto &m_SpriteWeaponsMuzzle : m_GameSkin.m_SpriteWeaponsMuzzles) + for(auto &SpriteWeaponsMuzzle : m_GameSkin.m_SpriteWeaponsMuzzles) { - m_SpriteWeaponsMuzzle[i] = IGraphics::CTextureHandle(); + SpriteWeaponsMuzzle[i] = IGraphics::CTextureHandle(); } } @@ -2607,9 +2607,9 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) Graphics()->UnloadTextureNew(m_GameSkin.m_SpritePickupGun); Graphics()->UnloadTextureNew(m_GameSkin.m_SpritePickupHammer); - for(auto &m_SpritePickupWeapon : m_GameSkin.m_SpritePickupWeapons) + for(auto &SpritePickupWeapon : m_GameSkin.m_SpritePickupWeapons) { - m_SpritePickupWeapon = IGraphics::CTextureHandle(); + SpritePickupWeapon = IGraphics::CTextureHandle(); } Graphics()->UnloadTextureNew(m_GameSkin.m_SpriteFlagBlue); @@ -2773,8 +2773,8 @@ void CGameClient::LoadEmoticonsSkin(const char *pPath, bool AsDir) { if(m_EmoticonsSkinLoaded) { - for(auto &m_SpriteEmoticon : m_EmoticonsSkin.m_SpriteEmoticons) - Graphics()->UnloadTextureNew(m_SpriteEmoticon); + for(auto &SpriteEmoticon : m_EmoticonsSkin.m_SpriteEmoticons) + Graphics()->UnloadTextureNew(SpriteEmoticon); m_EmoticonsSkinLoaded = false; } @@ -2819,16 +2819,16 @@ void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir) { Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleSlice); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleBall); - for(auto &i : m_ParticlesSkin.m_SpriteParticleSplat) - Graphics()->UnloadTextureNew(i); + for(auto &SpriteParticleSplat : m_ParticlesSkin.m_SpriteParticleSplat) + Graphics()->UnloadTextureNew(SpriteParticleSplat); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleSmoke); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleShell); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleExpl); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleAirJump); Graphics()->UnloadTextureNew(m_ParticlesSkin.m_SpriteParticleHit); - for(auto &m_SpriteParticle : m_ParticlesSkin.m_SpriteParticles) - m_SpriteParticle = IGraphics::CTextureHandle(); + for(auto &SpriteParticle : m_ParticlesSkin.m_SpriteParticles) + SpriteParticle = IGraphics::CTextureHandle(); m_ParticlesSkinLoaded = false; } @@ -2886,14 +2886,14 @@ void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir) void CGameClient::RefindSkins() { - for(auto &m_aClient : m_aClients) + for(auto &Client : m_aClients) { - if(m_aClient.m_aSkinName[0] != '\0') + if(Client.m_aSkinName[0] != '\0') { - const CSkin *pSkin = m_pSkins->Get(m_pSkins->Find(m_aClient.m_aSkinName)); - m_aClient.m_SkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin; - m_aClient.m_SkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin; - m_aClient.UpdateRenderInfo(); + const CSkin *pSkin = m_pSkins->Get(m_pSkins->Find(Client.m_aSkinName)); + Client.m_SkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin; + Client.m_SkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin; + Client.UpdateRenderInfo(); } } m_pGhost->RefindSkin(); diff --git a/src/game/client/prediction/entities/character.cpp b/src/game/client/prediction/entities/character.cpp index 410206347..acfce1b9d 100644 --- a/src/game/client/prediction/entities/character.cpp +++ b/src/game/client/prediction/entities/character.cpp @@ -917,8 +917,8 @@ void CCharacter::DDRacePostCoreTick() // handle Anti-Skip tiles std::list Indices = Collision()->GetMapIndices(m_PrevPos, m_Pos); if(!Indices.empty()) - for(int &Indice : Indices) - HandleTiles(Indice); + for(int Index : Indices) + HandleTiles(Index); else { HandleTiles(CurrentIndex); diff --git a/src/game/client/prediction/gameworld.cpp b/src/game/client/prediction/gameworld.cpp index c72506759..ac7195f9d 100644 --- a/src/game/client/prediction/gameworld.cpp +++ b/src/game/client/prediction/gameworld.cpp @@ -16,10 +16,10 @@ ////////////////////////////////////////////////// CGameWorld::CGameWorld() { - for(auto &m_apFirstEntityType : m_apFirstEntityTypes) - m_apFirstEntityType = 0; - for(auto &m_apCharacter : m_apCharacters) - m_apCharacter = 0; + for(auto &pFirstEntityType : m_apFirstEntityTypes) + pFirstEntityType = 0; + for(auto &pCharacter : m_apCharacters) + pCharacter = 0; m_pCollision = 0; m_GameTick = 0; m_pParent = 0; @@ -29,9 +29,9 @@ CGameWorld::CGameWorld() CGameWorld::~CGameWorld() { // delete all entities - for(auto &m_apFirstEntityType : m_apFirstEntityTypes) - while(m_apFirstEntityType) - delete m_apFirstEntityType; + for(auto &pFirstEntityType : m_apFirstEntityTypes) + while(pFirstEntityType) + delete pFirstEntityType; if(m_pChild && m_pChild->m_pParent == this) { OnModified(); @@ -534,9 +534,9 @@ void CGameWorld::CopyWorld(CGameWorld *pFrom) m_pTuningList = pFrom->m_pTuningList; m_Teams = pFrom->m_Teams; // delete the previous entities - for(auto &m_apFirstEntityType : m_apFirstEntityTypes) - while(m_apFirstEntityType) - delete m_apFirstEntityType; + for(auto &pFirstEntityType : m_apFirstEntityTypes) + while(pFirstEntityType) + delete pFirstEntityType; for(int i = 0; i < MAX_CLIENTS; i++) { m_apCharacters[i] = 0; @@ -594,7 +594,7 @@ void CGameWorld::OnModified() void CGameWorld::Clear() { // delete all entities - for(auto &m_apFirstEntityType : m_apFirstEntityTypes) - while(m_apFirstEntityType) - delete m_apFirstEntityType; + for(auto &pFirstEntityType : m_apFirstEntityTypes) + while(pFirstEntityType) + delete pFirstEntityType; } diff --git a/src/game/client/skin.h b/src/game/client/skin.h index d7caf976f..978430806 100644 --- a/src/game/client/skin.h +++ b/src/game/client/skin.h @@ -32,8 +32,8 @@ struct CSkin m_FeetOutline = IGraphics::CTextureHandle(); m_Hands = IGraphics::CTextureHandle(); m_HandsOutline = IGraphics::CTextureHandle(); - for(auto &m_Eye : m_Eyes) - m_Eye = IGraphics::CTextureHandle(); + for(auto &Eye : m_Eyes) + Eye = IGraphics::CTextureHandle(); } }; diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index b6b13df68..538caf05d 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -67,9 +67,9 @@ static const char *VANILLA_IMAGES[] = { static bool IsVanillaImage(const char *pImage) { - for(auto &i : VANILLA_IMAGES) + for(const auto *pVanillaImage : VANILLA_IMAGES) { - if(str_comp(pImage, i) == 0) + if(str_comp(pImage, pVanillaImage) == 0) { return true; } @@ -1687,10 +1687,10 @@ void CEditor::DoQuad(CQuad *q, int Index) for(int i = 0; i < m_lSelectedQuads.size(); ++i) { CQuad *pCurrentQuad = &pLayer->m_lQuads[m_lSelectedQuads[i]]; - for(auto &m_aPoint : pCurrentQuad->m_aPoints) + for(auto &Point : pCurrentQuad->m_aPoints) { - m_aPoint.x += OffsetX; - m_aPoint.y += OffsetY; + Point.x += OffsetX; + Point.y += OffsetY; } } } @@ -1702,10 +1702,10 @@ void CEditor::DoQuad(CQuad *q, int Index) for(int i = 0; i < m_lSelectedQuads.size(); ++i) { CQuad *pCurrentQuad = &pLayer->m_lQuads[m_lSelectedQuads[i]]; - for(auto &m_aPoint : pCurrentQuad->m_aPoints) + for(auto &Point : pCurrentQuad->m_aPoints) { - m_aPoint.x += OffsetX; - m_aPoint.y += OffsetY; + Point.x += OffsetX; + Point.y += OffsetY; } } } diff --git a/src/game/editor/io.cpp b/src/game/editor/io.cpp index 02e8bf2ea..8be8a68cd 100644 --- a/src/game/editor/io.cpp +++ b/src/game/editor/io.cpp @@ -915,10 +915,10 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int Storag for(int i = 0; i < pTiles->m_Width * pTiles->m_Height; i++) { pTiles->m_pTiles[i].m_Index = 0; - for(int e : s_aTilesRep) + for(int TilesRep : s_aTilesRep) { - if(((CLayerTele *)pTiles)->m_pTeleTile[i].m_Type == e) - pTiles->m_pTiles[i].m_Index = e; + if(((CLayerTele *)pTiles)->m_pTeleTile[i].m_Type == TilesRep) + pTiles->m_pTiles[i].m_Index = TilesRep; } } } @@ -988,11 +988,11 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int Storag continue; } - for(int e : s_aTilesComp) + for(int TilesComp : s_aTilesComp) { - if(pLayerSwitchTiles[i].m_Type == e) + if(pLayerSwitchTiles[i].m_Type == TilesComp) { - pTiles->m_pTiles[i].m_Index = e; + pTiles->m_pTiles[i].m_Index = TilesComp; pTiles->m_pTiles[i].m_Flags = pLayerSwitchTiles[i].m_Flags; } } diff --git a/src/game/editor/layer_quads.cpp b/src/game/editor/layer_quads.cpp index effa429a7..52df748d1 100644 --- a/src/game/editor/layer_quads.cpp +++ b/src/game/editor/layer_quads.cpp @@ -124,10 +124,10 @@ int CLayerQuads::BrushGrab(CLayerGroup *pBrush, CUIRect Rect) CQuad n; n = *q; - for(auto &m_aPoint : n.m_aPoints) + for(auto &Point : n.m_aPoints) { - m_aPoint.x -= f2fx(Rect.x); - m_aPoint.y -= f2fx(Rect.y); + Point.x -= f2fx(Rect.x); + Point.y -= f2fx(Rect.y); } pGrabbed->m_lQuads.add(n); @@ -144,10 +144,10 @@ void CLayerQuads::BrushPlace(CLayer *pBrush, float wx, float wy) { CQuad n = l->m_lQuads[i]; - for(auto &m_aPoint : n.m_aPoints) + for(auto &Point : n.m_aPoints) { - m_aPoint.x += f2fx(wx); - m_aPoint.y += f2fx(wy); + Point.x += f2fx(wx); + Point.y += f2fx(wy); } m_lQuads.add(n); @@ -211,12 +211,12 @@ void CLayerQuads::BrushRotate(float Amount) { CQuad *q = &m_lQuads[i]; - for(auto &m_aPoint : q->m_aPoints) + for(auto &Point : q->m_aPoints) { - vec2 Pos(fx2f(m_aPoint.x), fx2f(m_aPoint.y)); + vec2 Pos(fx2f(Point.x), fx2f(Point.y)); Rotate(&Center, &Pos, Amount); - m_aPoint.x = f2fx(Pos.x); - m_aPoint.y = f2fx(Pos.y); + Point.x = f2fx(Pos.x); + Point.y = f2fx(Pos.y); } } } @@ -228,10 +228,10 @@ void CLayerQuads::GetSize(float *w, float *h) for(int i = 0; i < m_lQuads.size(); i++) { - for(auto &m_aPoint : m_lQuads[i].m_aPoints) + for(auto &Point : m_lQuads[i].m_aPoints) { - *w = maximum(*w, fx2f(m_aPoint.x)); - *h = maximum(*h, fx2f(m_aPoint.y)); + *w = maximum(*w, fx2f(Point.x)); + *h = maximum(*h, fx2f(Point.y)); } } } diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index 6de73fd91..7aa5b10c2 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -638,13 +638,13 @@ int CEditor::PopupQuad(CEditor *pEditor, CUIRect View, void *pContext) { if(Prop == PROP_POS_X) { - for(auto &m_aPoint : lQuads[i]->m_aPoints) - m_aPoint.x += OffsetX; + for(auto &Point : lQuads[i]->m_aPoints) + Point.x += OffsetX; } if(Prop == PROP_POS_Y) { - for(auto &m_aPoint : lQuads[i]->m_aPoints) - m_aPoint.y += OffsetY; + for(auto &Point : lQuads[i]->m_aPoints) + Point.y += OffsetY; } if(Prop == PROP_POS_ENV) { diff --git a/src/game/mapbugs.cpp b/src/game/mapbugs.cpp index 6db424f97..95b4b4b8f 100644 --- a/src/game/mapbugs.cpp +++ b/src/game/mapbugs.cpp @@ -50,11 +50,11 @@ CMapBugs GetMapBugs(const char *pName, int Size, SHA256_DIGEST Sha256) CMapDescription Map = {pName, Size, Sha256}; CMapBugs Result; Result.m_Extra = 0; - for(auto &i : MAP_BUGS) + for(auto &MapBug : MAP_BUGS) { - if(Map == i.m_Map) + if(Map == MapBug.m_Map) { - Result.m_pData = &i; + Result.m_pData = &MapBug; return Result; } } diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index c1cc3686e..4d1a18841 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -2259,9 +2259,9 @@ void CCharacter::DDRacePostCoreTick() std::list Indices = GameServer()->Collision()->GetMapIndices(m_PrevPos, m_Pos); if(!Indices.empty()) { - for(int &Indice : Indices) + for(int &Index : Indices) { - HandleTiles(Indice); + HandleTiles(Index); if(!m_Alive) return; } diff --git a/src/game/server/entities/dragger.cpp b/src/game/server/entities/dragger.cpp index 443179b5e..6149d7514 100644 --- a/src/game/server/entities/dragger.cpp +++ b/src/game/server/entities/dragger.cpp @@ -21,9 +21,9 @@ CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, m_CaughtTeam = CaughtTeam; GameWorld()->InsertEntity(this); - for(int &m_SoloID : m_SoloIDs) + for(int &SoloID : m_SoloIDs) { - m_SoloID = -1; + SoloID = -1; } } @@ -84,10 +84,10 @@ void CDragger::Move() if(m_Target) { - for(auto &m_SoloEnt : m_SoloEnts) + for(auto &SoloEnt : m_SoloEnts) { - if(m_SoloEnt == m_Target) - m_SoloEnt = 0; + if(SoloEnt == m_Target) + SoloEnt = 0; } } } @@ -163,13 +163,13 @@ void CDragger::Snap(int SnappingClient) CCharacter *Target = m_Target; - for(int &m_SoloID : m_SoloIDs) + for(int &SoloID : m_SoloIDs) { - if(m_SoloID == -1) + if(SoloID == -1) break; - Server()->SnapFreeID(m_SoloID); - m_SoloID = -1; + Server()->SnapFreeID(SoloID); + SoloID = -1; } int pos = 0; diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 14ec5f459..b3cbf80cf 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -37,8 +37,8 @@ void CGameContext::Construct(int Resetting) m_Resetting = 0; m_pServer = 0; - for(auto &m_apPlayer : m_apPlayers) - m_apPlayer = 0; + for(auto &pPlayer : m_apPlayers) + pPlayer = 0; m_pController = 0; m_VoteType = VOTE_TYPE_UNKNOWN; @@ -75,8 +75,8 @@ CGameContext::CGameContext() CGameContext::~CGameContext() { - for(auto &m_apPlayer : m_apPlayers) - delete m_apPlayer; + for(auto &pPlayer : m_apPlayers) + delete pPlayer; if(!m_Resetting) delete m_pVoteOptionHeap; @@ -142,10 +142,10 @@ void CGameContext::FillAntibot(CAntibotRoundData *pData) for(int i = 0; i < MAX_CLIENTS; i++) { CAntibotCharacterData *pChar = &pData->m_aCharacters[i]; - for(auto &m_aLatestInput : pChar->m_aLatestInputs) + for(auto &LatestInput : pChar->m_aLatestInputs) { - m_aLatestInput.m_TargetX = -1; - m_aLatestInput.m_TargetY = -1; + LatestInput.m_TargetX = -1; + LatestInput.m_TargetY = -1; } pChar->m_Alive = false; pChar->m_Pause = false; @@ -479,12 +479,12 @@ void CGameContext::SendBroadcast(const char *pText, int ClientID, bool IsImporta dbg_assert(IsImportant, "broadcast messages to all players must be important"); Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer) + if(pPlayer) { - m_apPlayer->m_LastBroadcastImportance = true; - m_apPlayer->m_LastBroadcast = Server()->Tick(); + pPlayer->m_LastBroadcastImportance = true; + pPlayer->m_LastBroadcast = Server()->Tick(); } } return; @@ -506,12 +506,12 @@ void CGameContext::StartVote(const char *pDesc, const char *pCommand, const char // reset votes m_VoteEnforce = VOTE_ENFORCE_UNKNOWN; m_VoteEnforcer = -1; - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer) + if(pPlayer) { - m_apPlayer->m_Vote = 0; - m_apPlayer->m_VotePos = 0; + pPlayer->m_Vote = 0; + pPlayer->m_VotePos = 0; } } @@ -784,10 +784,10 @@ void CGameContext::OnTick() } } - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer) - m_apPlayer->PostPostTick(); + if(pPlayer) + pPlayer->PostPostTick(); } // update voting @@ -1309,9 +1309,9 @@ void CGameContext::OnClientConnected(int ClientID) { { bool Empty = true; - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer) + if(pPlayer) { Empty = false; break; @@ -1379,17 +1379,17 @@ void CGameContext::OnClientDrop(int ClientID, const char *pReason) m_VoteUpdate = true; // update spectator modes - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer && m_apPlayer->m_SpectatorID == ClientID) - m_apPlayer->m_SpectatorID = SPEC_FREEVIEW; + if(pPlayer && pPlayer->m_SpectatorID == ClientID) + pPlayer->m_SpectatorID = SPEC_FREEVIEW; } // update conversation targets - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer && m_apPlayer->m_LastWhisperTo == ClientID) - m_apPlayer->m_LastWhisperTo = -1; + if(pPlayer && pPlayer->m_LastWhisperTo == ClientID) + pPlayer->m_LastWhisperTo = -1; } protocol7::CNetMsg_Sv_ClientDrop Msg; @@ -2688,9 +2688,9 @@ void CGameContext::ConSetTeamAll(IConsole::IResult *pResult, void *pUserData) str_format(aBuf, sizeof(aBuf), "All players were moved to the %s", pSelf->m_pController->GetTeamName(Team)); pSelf->SendChat(-1, CGameContext::CHAT_ALL, aBuf); - for(auto &m_apPlayer : pSelf->m_apPlayers) - if(m_apPlayer) - m_apPlayer->SetTeam(Team, false); + for(auto &pPlayer : pSelf->m_apPlayers) + if(pPlayer) + pPlayer->SetTeam(Team, false); } void CGameContext::ConAddVote(IConsole::IResult *pResult, void *pUserData) @@ -2789,10 +2789,10 @@ void CGameContext::ConRemoveVote(IConsole::IResult *pResult, void *pUserData) pSelf->Server()->SendPackMsg(&VoteClearOptionsMsg, MSGFLAG_VITAL, -1); // reset sending of vote options - for(auto &m_apPlayer : pSelf->m_apPlayers) + for(auto &pPlayer : pSelf->m_apPlayers) { - if(m_apPlayer) - m_apPlayer->m_SendVoteIndex = 0; + if(pPlayer) + pPlayer->m_SendVoteIndex = 0; } // TODO: improve this @@ -2916,10 +2916,10 @@ void CGameContext::ConClearVotes(IConsole::IResult *pResult, void *pUserData) pSelf->m_NumVoteOptions = 0; // reset sending of vote options - for(auto &m_apPlayer : pSelf->m_apPlayers) + for(auto &pPlayer : pSelf->m_apPlayers) { - if(m_apPlayer) - m_apPlayer->m_SendVoteIndex = 0; + if(pPlayer) + pPlayer->m_SendVoteIndex = 0; } } @@ -3567,10 +3567,10 @@ void CGameContext::OnSnap(int ClientID) m_pController->Snap(ClientID); m_Events.Snap(ClientID); - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer) - m_apPlayer->Snap(ClientID); + if(pPlayer) + pPlayer->Snap(ClientID); } if(ClientID > -1) @@ -4016,9 +4016,9 @@ int CGameContext::GetClientVersion(int ClientID) bool CGameContext::PlayerModerating() { - for(auto &m_apPlayer : m_apPlayers) + for(auto &pPlayer : m_apPlayers) { - if(m_apPlayer && m_apPlayer->m_Moderating) + if(pPlayer && pPlayer->m_Moderating) return true; } return false; diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 4cedb1917..0b35f3b73 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -377,9 +377,9 @@ void IGameController::ChangeMap(const char *pToMap) void IGameController::PostReset() { - for(auto &m_apPlayer : GameServer()->m_apPlayers) - if(m_apPlayer) - m_apPlayer->Respawn(); + for(auto &pPlayer : GameServer()->m_apPlayers) + if(pPlayer) + pPlayer->Respawn(); } int IGameController::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) @@ -462,8 +462,8 @@ void IGameController::Tick() { // move player to spectator if the reserved slots aren't filled yet, kick him otherwise int Spectators = 0; - for(auto &m_apPlayer : GameServer()->m_apPlayers) - if(m_apPlayer && m_apPlayer->GetTeam() == TEAM_SPECTATORS) + for(auto &pPlayer : GameServer()->m_apPlayers) + if(pPlayer && pPlayer->GetTeam() == TEAM_SPECTATORS) ++Spectators; if(Spectators >= g_Config.m_SvSpectatorSlots) Server()->Kick(i, "Kicked for inactivity"); diff --git a/src/game/server/gameworld.cpp b/src/game/server/gameworld.cpp index c495fc0ea..5cb93f3c6 100644 --- a/src/game/server/gameworld.cpp +++ b/src/game/server/gameworld.cpp @@ -18,16 +18,16 @@ CGameWorld::CGameWorld() m_Paused = false; m_ResetRequested = false; - for(auto &m_apFirstEntityType : m_apFirstEntityTypes) - m_apFirstEntityType = 0; + for(auto &pFirstEntityType : m_apFirstEntityTypes) + pFirstEntityType = 0; } CGameWorld::~CGameWorld() { // delete all entities - for(auto &m_apFirstEntityType : m_apFirstEntityTypes) - while(m_apFirstEntityType) - delete m_apFirstEntityType; + for(auto &pFirstEntityType : m_apFirstEntityTypes) + while(pFirstEntityType) + delete pFirstEntityType; } void CGameWorld::SetGameServer(CGameContext *pGameServer) diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 99195c6a0..0a914f62e 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -655,10 +655,10 @@ void CPlayer::SetTeam(int Team, bool DoChatMsg) if(Team == TEAM_SPECTATORS) { // update spectator modes - for(auto &m_apPlayer : GameServer()->m_apPlayers) + for(auto &pPlayer : GameServer()->m_apPlayers) { - if(m_apPlayer && m_apPlayer->m_SpectatorID == m_ClientID) - m_apPlayer->m_SpectatorID = SPEC_FREEVIEW; + if(pPlayer && pPlayer->m_SpectatorID == m_ClientID) + pPlayer->m_SpectatorID = SPEC_FREEVIEW; } } } @@ -931,19 +931,19 @@ void CPlayer::ProcessScoreResult(CScorePlayerResult &Result) switch(Result.m_MessageKind) { case CScorePlayerResult::DIRECT: - for(auto &m_aaMessage : Result.m_Data.m_aaMessages) + for(auto &aMessage : Result.m_Data.m_aaMessages) { - if(m_aaMessage[0] == 0) + if(aMessage[0] == 0) break; - GameServer()->SendChatTarget(m_ClientID, m_aaMessage); + GameServer()->SendChatTarget(m_ClientID, aMessage); } break; case CScorePlayerResult::ALL: - for(auto &m_aaMessage : Result.m_Data.m_aaMessages) + for(auto &aMessage : Result.m_Data.m_aaMessages) { - if(m_aaMessage[0] == 0) + if(aMessage[0] == 0) break; - GameServer()->SendChat(-1, CGameContext::CHAT_ALL, m_aaMessage, m_ClientID); + GameServer()->SendChat(-1, CGameContext::CHAT_ALL, aMessage, m_ClientID); } break; case CScorePlayerResult::BROADCAST: diff --git a/src/game/server/score.cpp b/src/game/server/score.cpp index 64d511cef..a2b141306 100644 --- a/src/game/server/score.cpp +++ b/src/game/server/score.cpp @@ -30,8 +30,8 @@ void CScorePlayerResult::SetVariant(Variant v) { case DIRECT: case ALL: - for(auto &m_aaMessage : m_Data.m_aaMessages) - m_aaMessage[0] = 0; + for(auto &aMessage : m_Data.m_aaMessages) + aMessage[0] = 0; break; case BROADCAST: m_Data.m_Broadcast[0] = 0; @@ -46,16 +46,16 @@ void CScorePlayerResult::SetVariant(Variant v) m_Data.m_Info.m_Birthday = 0; m_Data.m_Info.m_HasFinishScore = false; m_Data.m_Info.m_Time = 0; - for(float &i : m_Data.m_Info.m_CpTime) - i = 0; + for(float &CpTime : m_Data.m_Info.m_CpTime) + CpTime = 0; } } CTeamrank::CTeamrank() : m_NumNames(0) { - for(auto &m_aaName : m_aaNames) - m_aaName[0] = '\0'; + for(auto &aName : m_aaNames) + aName[0] = '\0'; mem_zero(&m_TeamID.m_aData, sizeof(m_TeamID)); } diff --git a/src/game/server/score.h b/src/game/server/score.h index a35d7939c..95d56ed79 100644 --- a/src/game/server/score.h +++ b/src/game/server/score.h @@ -129,8 +129,8 @@ public: { m_BestTime = 0; m_CurrentTime = 0; - for(float &i : m_aBestCpTime) - i = 0; + for(float &BestCpTime : m_aBestCpTime) + BestCpTime = 0; } void Set(float Time, float CpTime[NUM_CHECKPOINTS]) diff --git a/src/game/server/teehistorian.cpp b/src/game/server/teehistorian.cpp index e5d26345c..a4ef51753 100644 --- a/src/game/server/teehistorian.cpp +++ b/src/game/server/teehistorian.cpp @@ -48,10 +48,10 @@ void CTeeHistorian::Reset(const CGameInfo *pGameInfo, WRITE_CALLBACK pfnWriteCal m_TickWritten = true; m_MaxClientID = MAX_CLIENTS; // `m_PrevMaxClientID` is initialized in `BeginTick` - for(auto &m_aPrevPlayer : m_aPrevPlayers) + for(auto &PrevPlayer : m_aPrevPlayers) { - m_aPrevPlayer.m_Alive = false; - m_aPrevPlayer.m_InputExists = false; + PrevPlayer.m_Alive = false; + PrevPlayer.m_InputExists = false; } m_pfnWriteCallback = pfnWriteCallback; m_pWriteCallbackUserdata = pUser; diff --git a/src/game/server/teeinfo.cpp b/src/game/server/teeinfo.cpp index 60c10dfd3..12d0f25e2 100644 --- a/src/game/server/teeinfo.cpp +++ b/src/game/server/teeinfo.cpp @@ -58,15 +58,15 @@ void CTeeInfo::ToSixup() } // check for std skin - for(auto &g_StdSkin : g_StdSkins) + for(auto &StdSkin : g_StdSkins) { - if(!str_comp(m_SkinName, g_StdSkin.m_SkinName)) + if(!str_comp(m_SkinName, StdSkin.m_SkinName)) { for(int p = 0; p < 6; p++) { - str_copy(m_apSkinPartNames[p], g_StdSkin.m_apSkinPartNames[p], 24); - m_aUseCustomColors[p] = g_StdSkin.m_aUseCustomColors[p]; - m_aSkinPartColors[p] = g_StdSkin.m_aSkinPartColors[p]; + str_copy(m_apSkinPartNames[p], StdSkin.m_apSkinPartNames[p], 24); + m_aUseCustomColors[p] = StdSkin.m_aUseCustomColors[p]; + m_aSkinPartColors[p] = StdSkin.m_aSkinPartColors[p]; } break; } @@ -98,12 +98,12 @@ void CTeeInfo::FromSixup() m_ColorFeet = 0; // check for std skin - for(auto &g_StdSkin : g_StdSkins) + for(auto &StdSkin : g_StdSkins) { bool match = true; for(int p = 0; p < 6; p++) { - if(str_comp(m_apSkinPartNames[p], g_StdSkin.m_apSkinPartNames[p]) || m_aUseCustomColors[p] != g_StdSkin.m_aUseCustomColors[p] || (m_aUseCustomColors[p] && m_aSkinPartColors[p] != g_StdSkin.m_aSkinPartColors[p])) + if(str_comp(m_apSkinPartNames[p], StdSkin.m_apSkinPartNames[p]) || m_aUseCustomColors[p] != StdSkin.m_aUseCustomColors[p] || (m_aUseCustomColors[p] && m_aSkinPartColors[p] != StdSkin.m_aSkinPartColors[p])) { match = false; break; @@ -111,7 +111,7 @@ void CTeeInfo::FromSixup() } if(match) { - str_copy(m_SkinName, g_StdSkin.m_SkinName, sizeof(m_SkinName)); + str_copy(m_SkinName, StdSkin.m_SkinName, sizeof(m_SkinName)); return; } } diff --git a/src/tools/packetgen.cpp b/src/tools/packetgen.cpp index 1caf02be6..b4c32cf3a 100644 --- a/src/tools/packetgen.cpp +++ b/src/tools/packetgen.cpp @@ -11,10 +11,10 @@ void Run(NETADDR Dest) { NETSOCKET aSockets[NUM_SOCKETS]; - for(auto &aSocket : aSockets) + for(auto &Socket : aSockets) { NETADDR BindAddr = {NETTYPE_IPV4, {0}, 0}; - aSocket = net_udp_create(BindAddr); + Socket = net_udp_create(BindAddr); } while(1) From 63c093c065d321f7e15d6469e00769f44d33cad7 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 17 Oct 2020 13:14:38 +0200 Subject: [PATCH 012/144] Get rid of remaining strcpy calls --- src/game/server/score.cpp | 47 ++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/game/server/score.cpp b/src/game/server/score.cpp index a2b141306..c64c01efc 100644 --- a/src/game/server/score.cpp +++ b/src/game/server/score.cpp @@ -307,7 +307,7 @@ bool CScore::MapVoteThread(IDbConnection *pSqlServer, const ISqlData *pGameData) auto *MapVote = &pData->m_pResult->m_Data.m_MapVote; pSqlServer->GetString(1, MapVote->m_Map, sizeof(MapVote->m_Map)); pSqlServer->GetString(2, MapVote->m_Server, sizeof(MapVote->m_Server)); - strcpy(MapVote->m_Reason, "/map"); + str_copy(MapVote->m_Reason, "/map", sizeof(MapVote->m_Reason)); for(char *p = MapVote->m_Server; *p; p++) // lower case server *p = tolower(*p); @@ -413,12 +413,12 @@ bool CScore::MapInfoThread(IDbConnection *pSqlServer, const ISqlData *pGameData) char aStars[20]; switch(Stars) { - case 0: strcpy(aStars, "✰✰✰✰✰"); break; - case 1: strcpy(aStars, "★✰✰✰✰"); break; - case 2: strcpy(aStars, "★★✰✰✰"); break; - case 3: strcpy(aStars, "★★★✰✰"); break; - case 4: strcpy(aStars, "★★★★✰"); break; - case 5: strcpy(aStars, "★★★★★"); break; + case 0: str_copy(aStars, "✰✰✰✰✰", sizeof(aStars)); break; + case 1: str_copy(aStars, "★✰✰✰✰", sizeof(aStars)); break; + case 2: str_copy(aStars, "★★✰✰✰", sizeof(aStars)); break; + case 3: str_copy(aStars, "★★★✰✰", sizeof(aStars)); break; + case 4: str_copy(aStars, "★★★★✰", sizeof(aStars)); break; + case 5: str_copy(aStars, "★★★★★", sizeof(aStars)); break; default: aStars[0] = '\0'; } @@ -813,7 +813,7 @@ bool CScore::ShowTop5Thread(IDbConnection *pSqlServer, const ISqlData *pGameData pSqlServer->BindString(1, pData->m_Map); // show top5 - strcpy(pData->m_pResult->m_Data.m_aaMessages[0], "----------- Top 5 -----------"); + str_copy(pData->m_pResult->m_Data.m_aaMessages[0], "----------- Top 5 -----------", sizeof(pData->m_pResult->m_Data.m_aaMessages[0])); int Line = 1; while(pSqlServer->Step()) @@ -827,7 +827,7 @@ bool CScore::ShowTop5Thread(IDbConnection *pSqlServer, const ISqlData *pGameData "%d. %s Time: %s", Rank, aName, aBuf); Line++; } - strcpy(pData->m_pResult->m_Data.m_aaMessages[Line], "-------------------------------"); + str_copy(pData->m_pResult->m_Data.m_aaMessages[Line], "-------------------------------", sizeof(pData->m_pResult->m_Data.m_aaMessages[Line])); pData->m_pResult->m_Done = true; return true; @@ -873,7 +873,7 @@ bool CScore::ShowTeamTop5Thread(IDbConnection *pSqlServer, const ISqlData *pGame // show teamtop5 int Line = 0; - strcpy(paMessages[Line++], "------- Team Top 5 -------"); + str_copy(paMessages[Line++], "------- Team Top 5 -------", sizeof(paMessages[Line])); if(pSqlServer->Step()) { @@ -911,7 +911,7 @@ bool CScore::ShowTeamTop5Thread(IDbConnection *pSqlServer, const ISqlData *pGame } } - strcpy(paMessages[Line], "-------------------------------"); + str_copy(paMessages[Line], "-------------------------------", sizeof(paMessages[Line])); pData->m_pResult->m_Done = true; return true; } @@ -976,12 +976,12 @@ bool CScore::ShowTimesThread(IDbConnection *pSqlServer, const ISqlData *pGameDat // show top5 if(!pSqlServer->Step()) { - strcpy(paMessages[0], "There are no times in the specified range"); + str_copy(paMessages[0], "There are no times in the specified range", sizeof(paMessages[0])); pData->m_pResult->m_Done = true; return true; } - strcpy(paMessages[0], "------------- Last Times -------------"); + str_copy(paMessages[0], "------------- Last Times -------------", sizeof(paMessages[0])); int Line = 1; do @@ -1020,7 +1020,7 @@ bool CScore::ShowTimesThread(IDbConnection *pSqlServer, const ISqlData *pGameDat } Line++; } while(pSqlServer->Step()); - strcpy(paMessages[Line], "----------------------------------------------------"); + str_copy(paMessages[Line], "----------------------------------------------------", sizeof(paMessages[Line])); pData->m_pResult->m_Done = true; return true; @@ -1101,7 +1101,7 @@ bool CScore::ShowTopPointsThread(IDbConnection *pSqlServer, const ISqlData *pGam pSqlServer->BindInt(1, LimitStart); // show top points - strcpy(paMessages[0], "-------- Top Points --------"); + str_copy(paMessages[0], "-------- Top Points --------", sizeof(paMessages[0])); int Line = 1; while(pSqlServer->Step()) @@ -1114,7 +1114,7 @@ bool CScore::ShowTopPointsThread(IDbConnection *pSqlServer, const ISqlData *pGam "%d. %s Points: %d", Rank, aName, Points); Line++; } - strcpy(paMessages[Line], "-------------------------------"); + str_copy(paMessages[Line], "-------------------------------", sizeof(paMessages[Line])); pData->m_pResult->m_Done = true; return true; @@ -1343,8 +1343,9 @@ bool CScore::SaveTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData } else { - strcpy(pData->m_pResult->m_aBroadcast, - "Database connection failed, teamsave written to a file instead. Admins will add it manually in a few days."); + str_copy(pData->m_pResult->m_aBroadcast, + "Database connection failed, teamsave written to a file instead. Admins will add it manually in a few days.", + sizeof(pData->m_pResult->m_aBroadcast)); if(str_comp(pData->m_Server, g_Config.m_SvSqlServerName) == 0) { str_format(pData->m_pResult->m_aMessage, sizeof(pData->m_pResult->m_aMessage), @@ -1365,7 +1366,7 @@ bool CScore::SaveTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData { dbg_msg("sql", "ERROR: This save-code already exists"); pData->m_pResult->m_Status = CScoreSaveResult::SAVE_FAILED; - strcpy(pData->m_pResult->m_aMessage, "This save-code already exists"); + str_copy(pData->m_pResult->m_aMessage, "This save-code already exists", sizeof(pData->m_pResult->m_aMessage)); } pSqlServer->Unlock(); @@ -1448,7 +1449,7 @@ bool CScore::LoadTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData if(!pSqlServer->Step()) { - strcpy(pData->m_pResult->m_aMessage, "No such savegame for this map"); + str_copy(pData->m_pResult->m_aMessage, "No such savegame for this map", sizeof(pData->m_pResult->m_aMessage)); goto end; } @@ -1468,7 +1469,7 @@ bool CScore::LoadTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData pSqlServer->GetString(3, aSaveID, sizeof(aSaveID)); if(str_length(aSaveID) + 1 != UUID_MAXSTRSIZE) { - strcpy(pData->m_pResult->m_aMessage, "Unable to load savegame: SaveID corrupted"); + str_copy(pData->m_pResult->m_aMessage, "Unable to load savegame: SaveID corrupted", sizeof(pData->m_pResult->m_aMessage)); goto end; } ParseUuid(&pData->m_pResult->m_SaveID, aSaveID); @@ -1480,7 +1481,7 @@ bool CScore::LoadTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData if(Num != 0) { - strcpy(pData->m_pResult->m_aMessage, "Unable to load savegame: data corrupted"); + str_copy(pData->m_pResult->m_aMessage, "Unable to load savegame: data corrupted", sizeof(pData->m_pResult->m_aMessage)); goto end; } @@ -1502,7 +1503,7 @@ bool CScore::LoadTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData pSqlServer->Step(); pData->m_pResult->m_Status = CScoreSaveResult::LOAD_SUCCESS; - strcpy(pData->m_pResult->m_aMessage, "Loading successfully done"); + str_copy(pData->m_pResult->m_aMessage, "Loading successfully done", sizeof(pData->m_pResult->m_aMessage)); } end: pSqlServer->Unlock(); From 996e519fe6def2f461fbb099e47db2390d6f5657 Mon Sep 17 00:00:00 2001 From: TsFreddie Date: Tue, 3 Nov 2020 15:03:24 +0800 Subject: [PATCH 013/144] hint for disabling debug mode --- src/game/client/components/debughud.cpp | 12 ++++++++++++ src/game/client/components/debughud.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/game/client/components/debughud.cpp b/src/game/client/components/debughud.cpp index 2516e52d6..54cc28879 100644 --- a/src/game/client/components/debughud.cpp +++ b/src/game/client/components/debughud.cpp @@ -143,8 +143,20 @@ void CDebugHud::RenderTuning() TextRender()->TextColor(1, 1, 1, 1); } +void CDebugHud::RenderHint() +{ + if(!g_Config.m_Debug) + return; + + float Width = 300 * Graphics()->ScreenAspect(); + Graphics()->MapScreen(0, 0, Width, 300); + TextRender()->TextColor(1, 1, 1, 1); + TextRender()->Text(0x0, 5, 290, 5, Localize("Debug mode enabled. Press Ctrl+Shift+D to disable debug mode."), -1.0f); +} + void CDebugHud::OnRender() { RenderTuning(); RenderNetCorrections(); + RenderHint(); } diff --git a/src/game/client/components/debughud.h b/src/game/client/components/debughud.h index c7b2173fc..100580b66 100644 --- a/src/game/client/components/debughud.h +++ b/src/game/client/components/debughud.h @@ -8,6 +8,7 @@ class CDebugHud : public CComponent { void RenderNetCorrections(); void RenderTuning(); + void RenderHint(); public: virtual void OnRender(); From 27625832f75b70eea3265b72e18d0998c7c030a1 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 3 Nov 2020 08:30:12 +0100 Subject: [PATCH 014/144] Fix clang-tidy in text.cpp --- src/engine/client/text.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index 61c252379..ada1f60b4 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -1718,8 +1718,8 @@ public: void *pUploadData = &TextContainer.m_StringInfo.m_CharacterQuads[0]; TextContainer.m_StringInfo.m_QuadBufferObjectIndex = Graphics()->CreateBufferObject(DataSize, pUploadData); - for(size_t i = 0; i < m_DefaultTextContainerInfo.m_Attributes.size(); ++i) - m_DefaultTextContainerInfo.m_Attributes[i].m_VertBufferBindingIndex = TextContainer.m_StringInfo.m_QuadBufferObjectIndex; + for(auto &Attribute : m_DefaultTextContainerInfo.m_Attributes) + Attribute.m_VertBufferBindingIndex = TextContainer.m_StringInfo.m_QuadBufferObjectIndex; TextContainer.m_StringInfo.m_QuadBufferContainerIndex = Graphics()->CreateBufferContainer(&m_DefaultTextContainerInfo); Graphics()->IndicesNumRequiredNotify(TextContainer.m_StringInfo.m_QuadNum * 6); From 2c98f2b76b70fdaa97192287c46d2caaba48d188 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 31 Oct 2020 11:32:37 +0100 Subject: [PATCH 015/144] Kick-voting someone from team doesn't kill locked team (fixes #3207) --- src/game/server/ddracecommands.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/server/ddracecommands.cpp b/src/game/server/ddracecommands.cpp index 0a34d706e..8ff0a3bd2 100644 --- a/src/game/server/ddracecommands.cpp +++ b/src/game/server/ddracecommands.cpp @@ -665,7 +665,7 @@ void CGameContext::ConSetDDRTeam(IConsole::IResult *pResult, void *pUserData) CCharacter *pChr = pSelf->GetPlayerChar(Target); if((pController->m_Teams.m_Core.Team(Target) && pController->m_Teams.GetDDRaceState(pSelf->m_apPlayers[Target]) == DDRACE_STARTED) || (pChr && pController->m_Teams.IsPractice(pChr->Team()))) - pSelf->m_apPlayers[Target]->KillCharacter(WEAPON_SELF); + pSelf->m_apPlayers[Target]->KillCharacter(WEAPON_GAME); pController->m_Teams.SetForceCharacterTeam(Target, Team); } From c8efa7d15068fa51ac2b2a3daff7cd9948ed4124 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 3 Nov 2020 13:52:09 +0100 Subject: [PATCH 016/144] Make bors also look at clang-format & clang-tidy --- bors.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bors.toml b/bors.toml index 53a4fa3d9..5863a78f3 100644 --- a/bors.toml +++ b/bors.toml @@ -3,4 +3,6 @@ status = [ "build-cmake (ubuntu-16.04)", "build-cmake (macOS-latest)", "build-cmake (windows-latest)", + "check-clang-tidy", + "check-style", ] From 8fd33f0ce9f58b22a6c8b54d75f221ac96e9af02 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 3 Nov 2020 14:19:46 +0100 Subject: [PATCH 017/144] Fix grammar in autoexec_server.cfg (Credits to Blade) --- autoexec_server.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoexec_server.cfg b/autoexec_server.cfg index d66b2f949..58d2a4f6f 100644 --- a/autoexec_server.cfg +++ b/autoexec_server.cfg @@ -81,7 +81,7 @@ sv_rank_cheats 1 # -------------------- # Message on chat displayed when joining -sv_welcome "Welcome on my server!" +sv_welcome "Welcome to my server!" # File which will have the announcements (each one in new line) sv_announcement_filename "announcement.txt" From 06b534c07d1987174bbe71ad49c71c142a4048cd Mon Sep 17 00:00:00 2001 From: def Date: Tue, 3 Nov 2020 14:48:24 +0100 Subject: [PATCH 018/144] Create fallback wordlist in sourcecode (fixes #3206) --- CMakeLists.txt | 8 ++++++++ scripts/wordlist.py | 9 +++++++++ src/game/server/score.cpp | 37 +++++++++++++++++++++---------------- 3 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 scripts/wordlist.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 9768d4259..5c06e1bea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1410,6 +1410,13 @@ generate_source7("src/game/generated/client_data7.h" "client_content_header") generate_maps("src/game/generated/protocolglue.h") +add_custom_command(OUTPUT "src/game/generated/wordlist.h" + COMMAND ${PYTHON_EXECUTABLE} scripts/wordlist.py > ${PROJECT_BINARY_DIR}/src/game/generated/wordlist.h + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + DEPENDS + scripts/wordlist.py +) + ######################################################################## # SHARED ######################################################################## @@ -1976,6 +1983,7 @@ set_src(GAME_SERVER GLOB_RECURSE src/game/server set(GAME_GENERATED_SERVER "src/game/generated/server_data.cpp" "src/game/generated/server_data.h" + "src/game/generated/wordlist.h" ) set(SERVER_SRC ${ENGINE_SERVER} ${GAME_SERVER} ${GAME_GENERATED_SERVER}) if(TARGET_OS STREQUAL "windows") diff --git a/scripts/wordlist.py b/scripts/wordlist.py new file mode 100644 index 000000000..688c62d4f --- /dev/null +++ b/scripts/wordlist.py @@ -0,0 +1,9 @@ +print("#ifndef GENERATED_WORDLIST_H") +print("#define GENERATED_WORDLIST_H") +print("const char g_aFallbackWordlist[][32] = {") +with open("data/wordlist.txt") as f: + for line in f: + word = line.strip().split("\t")[1] + print("\t\"%s\", " % word) +print("};") +print("#endif // GENERATED_WORDLIST_H") diff --git a/src/game/server/score.cpp b/src/game/server/score.cpp index c64c01efc..86526a1c8 100644 --- a/src/game/server/score.cpp +++ b/src/game/server/score.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -149,33 +150,37 @@ CScore::CScore(CGameContext *pGameServer, CDbConnectionPool *pPool) : ((CGameControllerDDRace *)(pGameServer->m_pController))->m_pInitResult = InitResult; str_copy(Tmp->m_Map, g_Config.m_SvMap, sizeof(Tmp->m_Map)); - IOHANDLE File = GameServer()->Storage()->OpenFile("wordlist.txt", IOFLAG_READ, IStorage::TYPE_ALL); - if(!File) - { - dbg_msg("sql", "failed to open wordlist"); - Server()->SetErrorShutdown("sql open wordlist error"); - return; - } - uint64 aSeed[2]; secure_random_fill(aSeed, sizeof(aSeed)); m_Prng.Seed(aSeed); - CLineReader LineReader; - LineReader.Init(File); - char *pLine; - while((pLine = LineReader.Get())) + + IOHANDLE File = GameServer()->Storage()->OpenFile("wordlist.txt", IOFLAG_READ, IStorage::TYPE_ALL); + if(File) { - char Word[32] = {0}; - sscanf(pLine, "%*s %31s", Word); - Word[31] = 0; - m_aWordlist.push_back(Word); + CLineReader LineReader; + LineReader.Init(File); + char *pLine; + while((pLine = LineReader.Get())) + { + char Word[32] = {0}; + sscanf(pLine, "%*s %31s", Word); + Word[31] = 0; + m_aWordlist.push_back(Word); + } } + else + { + dbg_msg("sql", "failed to open wordlist, using fallback"); + m_aWordlist.assign(std::begin(g_aFallbackWordlist), std::end(g_aFallbackWordlist)); + } + if(m_aWordlist.size() < 1000) { dbg_msg("sql", "too few words in wordlist"); Server()->SetErrorShutdown("sql too few words in wordlist"); return; } + m_pPool->Execute(Init, std::move(Tmp), "load best time"); } From 5914dbb8fad8171d4c4dab98605d82967a3dee2c Mon Sep 17 00:00:00 2001 From: Zwelf Date: Tue, 3 Nov 2020 22:55:12 +0100 Subject: [PATCH 019/144] Fix UUID in test case comment for `teehistorian-ddnetver-old@ddnet.tw` --- src/test/teehistorian.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/teehistorian.cpp b/src/test/teehistorian.cpp index d626a30ee..2618d12c0 100644 --- a/src/test/teehistorian.cpp +++ b/src/test/teehistorian.cpp @@ -350,7 +350,7 @@ TEST_F(TeeHistorian, DDNetVersion) '6', '2', '3', 'f', '5', 'e', '4', 'c', 'd', '1', '8', '4', '5', '5', '6', ')', 0x00, - // EX uuid=1397b63e-ee4e-3919-b86a-b058887fcaf5 data_len=4 + // EX uuid=41b49541-f26f-325d-8715-9baf4b544ef9 data_len=4 0x4a, 0x41, 0xb4, 0x95, 0x41, 0xf2, 0x6f, 0x32, 0x5d, 0x87, 0x15, 0x9b, 0xaf, 0x4b, 0x54, 0x4e, 0xf9, From fea4481f8d455f0e957aecb4f25ffa3d327e48d2 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:28:06 +0100 Subject: [PATCH 020/144] Fix network x_ check (thanks to Jupeyy) --- 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 b295e5e2e..7f05d7eda 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -1241,7 +1241,7 @@ void CGameClient::OnNewSnapshot() pClient->m_ColorFeet = pInfo->m_ColorFeet; // prepare the info - if(!m_GameInfo.m_AllowXSkins && (pClient->m_aSkinName[0] == 'x' || pClient->m_aSkinName[1] == '_')) + if(!m_GameInfo.m_AllowXSkins && (pClient->m_aSkinName[0] == 'x' && pClient->m_aSkinName[1] == '_')) str_copy(pClient->m_aSkinName, "default", 64); pClient->m_SkinInfo.m_ColorBody = color_cast(ColorHSLA(pClient->m_ColorBody).UnclampLighting()); From 5a9d93f160f5685e9ee9e5732135f466b9625915 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 23:06:44 +0100 Subject: [PATCH 021/144] Initialize pointer in dragger How did this not blow up all day long for years?! Found by UBSAN: /home/teeworlds/src/master/src/game/server/entities/dragger.cpp:32:29: runtime error: member call on address 0x0000013319b8 which does not point to an object of type 'CCharacter' 0x0000013319b8: note: object has invalid vptr 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ^~~~~~~~~~~~~~~~~~~~~~~ invalid vptr #0 0x5501de in CDragger::Move() /home/teeworlds/src/master/src/game/server/entities/dragger.cpp:32:29 #1 0x5522c2 in CDragger::Tick() /home/teeworlds/src/master/src/game/server/entities/dragger.cpp:153:3 #2 0x5eb11e in CGameWorld::Tick() /home/teeworlds/src/master/src/game/server/gameworld.cpp:261:11 #3 0x58d660 in CGameContext::OnTick() /home/teeworlds/src/master/src/game/server/gamecontext.cpp:751:10 #4 0x4afefe in CServer::Run() /home/teeworlds/src/master/src/engine/server/server.cpp:2558:19 #5 0x4c26fd in main /home/teeworlds/src/master/src/engine/server/server.cpp:3551:21 #6 0x7f2c8cc9309a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a) #7 0x451509 in _start (/home/teeworlds/servers/DDNet-Server-ubsan+0x451509) --- src/game/server/entities/dragger.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/server/entities/dragger.cpp b/src/game/server/entities/dragger.cpp index 6149d7514..c0db76f5f 100644 --- a/src/game/server/entities/dragger.cpp +++ b/src/game/server/entities/dragger.cpp @@ -12,6 +12,7 @@ CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, int CaughtTeam, int Layer, int Number) : CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER) { + m_Target = 0; m_Layer = Layer; m_Number = Number; m_Pos = Pos; From 5b5d4404a6f232045b54127c4f82a24e67905800 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 23:02:01 +0100 Subject: [PATCH 022/144] Don't access m_aaSpawnPoints out of bounds As discovered by ASAN: /home/teeworlds/src/master/src/game/server/gamecontroller.cpp:142:3: runtime error: index 65 out of bounds for type 'vec2 [64]' #0 0x5de082 in IGameController::OnEntity(int, vector2_base, int, int, int) /home/teeworlds/src/master/src/game/server/gamecontroller.cpp:142:3 #1 0x5c9f43 in CGameContext::OnInit() /home/teeworlds/src/master/src/game/server/gamecontext.cpp:3291:20 #2 0x4ae3aa in CServer::Run() /home/teeworlds/src/master/src/engine/server/server.cpp:2473:20 #3 0x4c265d in main /home/teeworlds/src/master/src/engine/server/server.cpp:3551:21 #4 0x7f400fedc09a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a) #5 0x451509 in _start (/home/teeworlds/servers/DDNet-Server-ubsan+0x451509) --- src/game/server/gamecontroller.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 0b35f3b73..98fe38ab7 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -138,12 +138,12 @@ bool IGameController::OnEntity(int Index, vec2 Pos, int Layer, int Flags, int Nu sides[6] = GameServer()->Collision()->Entity(x - 1, y, Layer); sides[7] = GameServer()->Collision()->Entity(x - 1, y + 1, Layer); - if(Index == ENTITY_SPAWN) - m_aaSpawnPoints[0][m_aNumSpawnPoints[0]++] = Pos; - else if(Index == ENTITY_SPAWN_RED) - m_aaSpawnPoints[1][m_aNumSpawnPoints[1]++] = Pos; - else if(Index == ENTITY_SPAWN_BLUE) - m_aaSpawnPoints[2][m_aNumSpawnPoints[2]++] = Pos; + if(Index >= ENTITY_SPAWN && Index <= ENTITY_SPAWN_BLUE) + { + int Type = Index - ENTITY_SPAWN; + m_aaSpawnPoints[Type][m_aNumSpawnPoints[Type]] = Pos; + m_aNumSpawnPoints[Type] = minimum(m_aNumSpawnPoints[Type], (int)(sizeof(m_aaSpawnPoints[0]) / sizeof(m_aaSpawnPoints[0][0]) - 1)); + } else if(Index == ENTITY_DOOR) { From 2c3000ba81389c54d98deb491fea690de52d342e Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 23:09:22 +0100 Subject: [PATCH 023/144] Minor code cleanup in dragger.cpp --- src/game/server/entities/dragger.cpp | 68 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/game/server/entities/dragger.cpp b/src/game/server/entities/dragger.cpp index c0db76f5f..349ce099a 100644 --- a/src/game/server/entities/dragger.cpp +++ b/src/game/server/entities/dragger.cpp @@ -57,10 +57,9 @@ void CDragger::Move() continue; } int Res = - m_NW ? GameServer()->Collision()->IntersectNoLaserNW(m_Pos, - Temp->m_Pos, 0, 0) : - GameServer()->Collision()->IntersectNoLaser(m_Pos, - Temp->m_Pos, 0, 0); + m_NW ? + GameServer()->Collision()->IntersectNoLaserNW(m_Pos, Temp->m_Pos, 0, 0) : + GameServer()->Collision()->IntersectNoLaser(m_Pos, Temp->m_Pos, 0, 0); if(Res == 0) { @@ -81,9 +80,10 @@ void CDragger::Move() } if(!m_Target) + { m_Target = Id != -1 ? TempEnts[Id] : 0; - - if(m_Target) + } + else { for(auto &SoloEnt : m_SoloEnts) { @@ -95,38 +95,38 @@ void CDragger::Move() void CDragger::Drag() { - if(m_Target) + if(!m_Target) + return; + + CCharacter *Target = m_Target; + + for(int i = -1; i < MAX_CLIENTS; i++) { - CCharacter *Target = m_Target; + if(i >= 0) + Target = m_SoloEnts[i]; - for(int i = -1; i < MAX_CLIENTS; i++) + if(!Target) + continue; + + int Res = 0; + if(!m_NW) + Res = GameServer()->Collision()->IntersectNoLaser(m_Pos, + Target->m_Pos, 0, 0); + else + Res = GameServer()->Collision()->IntersectNoLaserNW(m_Pos, + Target->m_Pos, 0, 0); + if(Res || length(m_Pos - Target->m_Pos) > g_Config.m_SvDraggerRange) { - if(i >= 0) - Target = m_SoloEnts[i]; - - if(!Target) - continue; - - int Res = 0; - if(!m_NW) - Res = GameServer()->Collision()->IntersectNoLaser(m_Pos, - Target->m_Pos, 0, 0); + Target = 0; + if(i == -1) + m_Target = 0; else - Res = GameServer()->Collision()->IntersectNoLaserNW(m_Pos, - Target->m_Pos, 0, 0); - if(Res || length(m_Pos - Target->m_Pos) > g_Config.m_SvDraggerRange) - { - Target = 0; - if(i == -1) - m_Target = 0; - else - m_SoloEnts[i] = 0; - } - else if(length(m_Pos - Target->m_Pos) > 28) - { - vec2 Temp = Target->Core()->m_Vel + (normalize(m_Pos - Target->m_Pos) * m_Strength); - Target->Core()->m_Vel = ClampVel(Target->m_MoveRestrictions, Temp); - } + m_SoloEnts[i] = 0; + } + else if(length(m_Pos - Target->m_Pos) > 28) + { + vec2 Temp = Target->Core()->m_Vel + (normalize(m_Pos - Target->m_Pos) * m_Strength); + Target->Core()->m_Vel = ClampVel(Target->m_MoveRestrictions, Temp); } } } From ba53c7e20c576b309b7c845b4e827b2085efafa8 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:03:10 +0100 Subject: [PATCH 024/144] Add most bugprone checks --- .clang-tidy | 8 ++++++++ src/engine/server/databases/mysql.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.clang-tidy b/.clang-tidy index a08e38ff4..3da516da8 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -11,6 +11,14 @@ Checks: > -*, + bugprone-*, + -bugprone-branch-clone, + -bugprone-incorrect-roundings, + -bugprone-integer-division, + -bugprone-macro-parentheses, + -bugprone-narrowing-conversions, + -bugprone-parent-virtual-call, + -bugprone-unhandled-self-assignment, clang-analyzer-*, -clang-analyzer-optin.cplusplus.UninitializedObject, -clang-analyzer-optin.cplusplus.VirtualCall, diff --git a/src/engine/server/databases/mysql.cpp b/src/engine/server/databases/mysql.cpp index b0e56fd66..598a7da10 100644 --- a/src/engine/server/databases/mysql.cpp +++ b/src/engine/server/databases/mysql.cpp @@ -304,7 +304,7 @@ void CMysqlConnection::GetString(int Col, char *pBuffer, int BufferSize) const int CMysqlConnection::GetBlob(int Col, unsigned char *pBuffer, int BufferSize) const { #if defined(CONF_SQL) - auto Blob = m_pResults->getBlob(Col); + auto *Blob = m_pResults->getBlob(Col); Blob->read((char *)pBuffer, BufferSize); int NumRead = Blob->gcount(); delete Blob; From 1877943ceb422e9715b1c368db7bed9aecec69d1 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:07:20 +0100 Subject: [PATCH 025/144] Fix bugprone-signed-char-misuse with tolower --- src/base/system.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/base/system.c b/src/base/system.c index 36aa2f9e7..719616ad3 100644 --- a/src/base/system.c +++ b/src/base/system.c @@ -2064,7 +2064,7 @@ int fs_storage_path(const char *appname, char *path, int max) #else snprintf(path, max, "%s/.%s", home, appname); for(i = strlen(home) + 2; path[i]; i++) - path[i] = tolower(path[i]); + path[i] = tolower((unsigned char)path[i]); #endif return 0; @@ -2710,7 +2710,7 @@ const char *str_find_nocase(const char *haystack, const char *needle) { const char *a = haystack; const char *b = needle; - while(*a && *b && tolower(*a) == tolower(*b)) + while(*a && *b && tolower((unsigned char)*a) == tolower((unsigned char)*b)) { a++; b++; From 5e2776de0dd76e9c4edf5314673b2c0575e1cdb1 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:08:52 +0100 Subject: [PATCH 026/144] Fix bugprone-misplaced-widening-cast --- src/engine/client/backend_sdl.cpp | 6 +++--- src/game/client/components/maplayers.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 83c1a9940..d4dde4447 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -134,7 +134,7 @@ static bool Texture2DTo3D(void *pImageBuffer, int ImageWidth, int ImageHeight, i Target3DImageWidth = ImageWidth / SplitCountWidth; Target3DImageHeight = ImageHeight / SplitCountHeight; - size_t FullImageWidth = (size_t)(ImageWidth * ImageColorChannelCount); + size_t FullImageWidth = (size_t)ImageWidth * ImageColorChannelCount; for(int Y = 0; Y < SplitCountHeight; ++Y) { @@ -144,8 +144,8 @@ static bool Texture2DTo3D(void *pImageBuffer, int ImageWidth, int ImageHeight, i { int DepthIndex = X + Y * SplitCountWidth; - size_t TargetImageFullWidth = (size_t)(Target3DImageWidth * ImageColorChannelCount); - size_t TargetImageFullSize = (size_t)(TargetImageFullWidth * (size_t)Target3DImageHeight); + size_t TargetImageFullWidth = (size_t)Target3DImageWidth * ImageColorChannelCount; + size_t TargetImageFullSize = (size_t)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(((uint8_t *)pTarget3DImageData) + TargetImageOffset, ((uint8_t *)pImageBuffer) + (ptrdiff_t)(ImageOffset), TargetImageFullWidth); diff --git a/src/game/client/components/maplayers.cpp b/src/game/client/components/maplayers.cpp index a2a0f015a..b885853bd 100644 --- a/src/game/client/components/maplayers.cpp +++ b/src/game/client/components/maplayers.cpp @@ -601,7 +601,7 @@ void CMapLayers::OnMapLoad() if(!DoTextureCoords) { - tmpTiles.reserve((size_t)(pTMap->m_Width * pTMap->m_Height)); + tmpTiles.reserve((size_t)pTMap->m_Width * pTMap->m_Height); tmpBorderTopTiles.reserve((size_t)pTMap->m_Width); tmpBorderBottomTiles.reserve((size_t)pTMap->m_Width); tmpBorderLeftTiles.reserve((size_t)pTMap->m_Height); @@ -610,7 +610,7 @@ void CMapLayers::OnMapLoad() } else { - tmpTileTexCoords.reserve((size_t)(pTMap->m_Width * pTMap->m_Height)); + tmpTileTexCoords.reserve((size_t)pTMap->m_Width * pTMap->m_Height); tmpBorderTopTilesTexCoords.reserve((size_t)pTMap->m_Width); tmpBorderBottomTilesTexCoords.reserve((size_t)pTMap->m_Width); tmpBorderLeftTilesTexCoords.reserve((size_t)pTMap->m_Height); From bf8ae71b7d086062b035edbe9f18cd356b3fc446 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:12:45 +0100 Subject: [PATCH 027/144] Fix and NOLINT bugprone-sizeof-expression --- src/base/system.c | 2 +- src/engine/client/serverbrowser.cpp | 4 ++-- src/game/editor/editor.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/base/system.c b/src/base/system.c index 719616ad3..ee2cf4729 100644 --- a/src/base/system.c +++ b/src/base/system.c @@ -1928,7 +1928,7 @@ int net_unix_send(UNIXSOCKET sock, UNIXSOCKETADDR *addr, void *data, int size) void net_unix_set_addr(UNIXSOCKETADDR *addr, const char *path) { - mem_zero(addr, sizeof(addr)); + mem_zero(addr, sizeof(UNIXSOCKETADDR)); addr->sun_family = AF_UNIX; str_copy(addr->sun_path, path, sizeof(addr->sun_path)); } diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index 691feffb5..4adbf7925 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -503,9 +503,9 @@ CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr) { CServerEntry **ppNewlist; m_NumServerCapacity += 100; - ppNewlist = (CServerEntry **)calloc(m_NumServerCapacity, sizeof(CServerEntry *)); + ppNewlist = (CServerEntry **)calloc(m_NumServerCapacity, sizeof(CServerEntry *)); // NOLINT(bugprone-sizeof-expression) if(m_NumServers > 0) - mem_copy(ppNewlist, m_ppServerlist, m_NumServers * sizeof(CServerEntry *)); + mem_copy(ppNewlist, m_ppServerlist, m_NumServers * sizeof(CServerEntry *)); // NOLINT(bugprone-sizeof-expression) free(m_ppServerlist); m_ppServerlist = ppNewlist; } diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 538caf05d..7ecb3f9bc 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -2075,7 +2075,7 @@ void CEditor::DoQuadEnvelopes(const array &lQuads, IGraphics::CTextureHan { int Num = lQuads.size(); CEnvelope **apEnvelope = new CEnvelope *[Num]; - mem_zero(apEnvelope, sizeof(CEnvelope *) * Num); + mem_zero(apEnvelope, sizeof(CEnvelope *) * Num); // NOLINT(bugprone-sizeof-expression) for(int i = 0; i < Num; i++) { if((m_ShowEnvelopePreview == 1 && lQuads[i].m_PosEnv == m_SelectedEnvelope) || m_ShowEnvelopePreview == 2) From ed27c49eea4e1abc69f588846dc99e3f81142d4e Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:18:12 +0100 Subject: [PATCH 028/144] Fix bugprone-unused-return-value --- src/engine/server/databases/mysql.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/engine/server/databases/mysql.cpp b/src/engine/server/databases/mysql.cpp index 598a7da10..336d448f8 100644 --- a/src/engine/server/databases/mysql.cpp +++ b/src/engine/server/databases/mysql.cpp @@ -41,11 +41,6 @@ CMysqlConnection::CMysqlConnection( CMysqlConnection::~CMysqlConnection() { -#if defined(CONF_SQL) - m_pStmt.release(); - m_pPreparedStmt.release(); - m_pConnection.release(); -#endif } void CMysqlConnection::Print(IConsole *pConsole, const char *Mode) @@ -104,9 +99,9 @@ IDbConnection::Status CMysqlConnection::Connect() try { - m_pConnection.release(); - m_pPreparedStmt.release(); - m_pResults.release(); + m_pConnection.reset(); + m_pPreparedStmt.reset(); + m_pResults.reset(); sql::ConnectOptionsMap connection_properties; connection_properties["hostName"] = sql::SQLString(m_aIp); From 809ce102bd4ee8e1e04de32d60ac1810c8d85fec Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:20:21 +0100 Subject: [PATCH 029/144] NOLINT bugprone-forward-declaration-namespace --- src/engine/graphics.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 27b5ea06b..5c45f2d11 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -150,7 +150,7 @@ struct GL_SVertexTex3DStream typedef void (*WINDOW_RESIZE_FUNC)(void *pUser); namespace client_data7 { -struct CDataSprite; +struct CDataSprite; // NOLINT(bugprone-forward-declaration-namespace) } class IGraphics : public IInterface From 21d76ed31d22af0e67696d7cba42ec9a31e0fcc6 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 4 Nov 2020 19:27:22 +0100 Subject: [PATCH 030/144] NOLINT bugprone-parent-virtual-call where clang-tidy is stupid /media/ddnet/src/game/editor/layer_game.cpp:42:35: warning: qualified name 'm_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile' refers to a member overridden in subclass; did you mean 'CLayerTiles'? [bugprone-parent-virtual-call] m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, through_cut); ^~~~~~~~~~~~~ CLayerTiles:: /media/ddnet/src/game/editor/layer_game.cpp:42:35: note: FIX-IT applied suggested code changes --- src/game/editor/layer_game.cpp | 4 ++-- src/game/editor/layer_tiles.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/editor/layer_game.cpp b/src/game/editor/layer_game.cpp index 9e4cd1b44..481b290eb 100644 --- a/src/game/editor/layer_game.cpp +++ b/src/game/editor/layer_game.cpp @@ -39,14 +39,14 @@ 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); + m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, through_cut); // NOLINT(bugprone-parent-virtual-call) } else { if(m_pEditor->m_Map.m_pFrontLayer && m_pEditor->m_Map.m_pFrontLayer->GetTile(x, y).m_Index == TILE_THROUGH_CUT) { CTile air = {TILE_AIR}; - m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, air); + m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, air); // NOLINT(bugprone-parent-virtual-call) } if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidGameTile(tile.m_Index)) { diff --git a/src/game/editor/layer_tiles.cpp b/src/game/editor/layer_tiles.cpp index 4f44c0724..f69491419 100644 --- a/src/game/editor/layer_tiles.cpp +++ b/src/game/editor/layer_tiles.cpp @@ -1697,12 +1697,12 @@ void CLayerFront::SetTile(int x, int y, CTile tile) if(tile.m_Index == TILE_THROUGH_CUT) { CTile nohook = {TILE_NOHOOK}; - m_pEditor->m_Map.m_pGameLayer->CLayerTiles::SetTile(x, y, nohook); + m_pEditor->m_Map.m_pGameLayer->CLayerTiles::SetTile(x, y, nohook); // NOLINT(bugprone-parent-virtual-call) } else if(tile.m_Index == TILE_AIR && CLayerTiles::GetTile(x, y).m_Index == TILE_THROUGH_CUT) { CTile air = {TILE_AIR}; - m_pEditor->m_Map.m_pGameLayer->CLayerTiles::SetTile(x, y, air); + m_pEditor->m_Map.m_pGameLayer->CLayerTiles::SetTile(x, y, air); // NOLINT(bugprone-parent-virtual-call) } if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidFrontTile(tile.m_Index)) { From 05eed38cad57548e4cc79e6dcae990ad4f0faa6c Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 08:58:48 +0100 Subject: [PATCH 031/144] Update translations --- data/languages/belarusian.txt | 41 ++++++++++++---- data/languages/bosnian.txt | 41 ++++++++++++---- data/languages/brazilian_portuguese.txt | 57 +++++++++++++++------- data/languages/bulgarian.txt | 41 ++++++++++++---- data/languages/catalan.txt | 55 ++++++++++++++------- data/languages/chuvash.txt | 41 ++++++++++++---- data/languages/czech.txt | 41 ++++++++++++---- data/languages/danish.txt | 41 ++++++++++++---- data/languages/dutch.txt | 55 ++++++++++++++------- data/languages/finnish.txt | 41 ++++++++++++---- data/languages/french.txt | 57 +++++++++++++++------- data/languages/german.txt | 57 +++++++++++++++------- data/languages/greek.txt | 41 ++++++++++++---- data/languages/hungarian.txt | 55 ++++++++++++++------- data/languages/italian.txt | 41 ++++++++++++---- data/languages/japanese.txt | 41 ++++++++++++---- data/languages/korean.txt | 41 ++++++++++++---- data/languages/kyrgyz.txt | 41 ++++++++++++---- data/languages/norwegian.txt | 55 ++++++++++++++------- data/languages/persian.txt | 47 +++++++++++++----- data/languages/polish.txt | 55 ++++++++++++++------- data/languages/portuguese.txt | 41 ++++++++++++---- data/languages/romanian.txt | 41 ++++++++++++---- data/languages/russian.txt | 53 ++++++++++++++------- data/languages/serbian.txt | 41 ++++++++++++---- data/languages/serbian_cyrillic.txt | 63 +++++++++++++++++++------ data/languages/simplified_chinese.txt | 53 ++++++++++++++------- data/languages/slovak.txt | 41 ++++++++++++---- data/languages/spanish.txt | 55 ++++++++++++++------- data/languages/swedish.txt | 53 ++++++++++++++------- data/languages/traditional_chinese.txt | 55 ++++++++++++++------- data/languages/turkish.txt | 55 ++++++++++++++------- data/languages/ukrainian.txt | 57 +++++++++++++++------- 33 files changed, 1149 insertions(+), 444 deletions(-) diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt index 9d19b006a..87d358696 100644 --- a/data/languages/belarusian.txt +++ b/data/languages/belarusian.txt @@ -622,9 +622,6 @@ Name plates size Type: == Тып: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -640,6 +637,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -706,6 +706,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -769,9 +778,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -826,6 +832,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -979,6 +988,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1009,6 +1024,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1045,6 +1063,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1220,16 +1241,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt index 37296807f..d6e236761 100644 --- a/data/languages/bosnian.txt +++ b/data/languages/bosnian.txt @@ -1135,15 +1135,24 @@ The width or height of texture %s is not divisible by 16, which might cause visu Country / Region == Zemlja / Regija -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Speed == @@ -1162,9 +1171,6 @@ Theme %d player == -File -== - %.2f MiB == @@ -1174,6 +1180,9 @@ File Demos directory == +Smooth Camera +== + Skip the main menu == @@ -1195,6 +1204,12 @@ Skins directory Borderless window == +Game sound volume +== + +Chat sound volume +== + Background music volume == @@ -1207,6 +1222,12 @@ DDNet Assets == +Use old chat style +== + +Highlight +== + Overlay entities == @@ -1253,16 +1274,16 @@ Editor Play == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == FPM diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index 1df1fd1c9..706e6fd76 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -723,9 +723,6 @@ Enable gun sound Team message == Mensagem do time -Manual %3d:%02d -== Manual %3d:%02d - Save the best demo of each race == Salvar a melhor demo de cada corrida @@ -756,9 +753,6 @@ Exclude DDNet Client updated! == DDNet Client atualizado! -Race %3d:%02d -== Corrida %3d:%02d - Type: == Tipo: @@ -894,9 +888,6 @@ Map: Lht. == Lumin. -Auto %3d:%02d -== Auto %3d:%02d - Show clan above name plates == Mostrar clã sobre placas de nomes @@ -1107,9 +1098,6 @@ Pause Converse == Conversar -Replay %3d:%02d -== Reproduzir %3d:%02d - Successfully saved the replay! == A reprodução foi salva com sucesso @@ -1240,18 +1228,12 @@ Editor Play == Jogar -Downloading ddnet-info.json failed -== Falha ao baixar ddnet-info.json - Saving ddnet-settings.cfg failed == Falha ao salvar ddnet-settings.cfg Theme == Tema -File -== Arquivo - Demos directory == Diretório de demos @@ -1284,3 +1266,42 @@ Particles Assets directory == Diretório de ativos + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + +Smooth Camera +== + +Game sound volume +== + +Chat sound volume +== + +Use old chat style +== + +Highlight +== + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/bulgarian.txt b/data/languages/bulgarian.txt index 8e1b2d850..22391c37c 100644 --- a/data/languages/bulgarian.txt +++ b/data/languages/bulgarian.txt @@ -619,9 +619,6 @@ Name plates size Type: == Тип: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -637,6 +634,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -703,6 +703,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -766,9 +775,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -823,6 +829,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -979,6 +988,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1009,6 +1024,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1045,6 +1063,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1220,16 +1241,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt index 064b0f904..dd24a57e8 100644 --- a/data/languages/catalan.txt +++ b/data/languages/catalan.txt @@ -750,9 +750,6 @@ Show health + ammo Team message == Missatge d'equip -Manual %3d:%02d -== Manual %3d:%02d - Automatically create statboard csv == Crear un fitxer csv d'estadístiques automàticament @@ -780,9 +777,6 @@ Threaded sound loading Check now == Comprova ara -Race %3d:%02d -== Carrera %3d:%02d - Background (regular) == Fons (regular) @@ -888,9 +882,6 @@ Clan plates size Update now == Actualitza ara -Auto %3d:%02d -== Auto %3d:%02d - Show clan above name plates == Mostrar el clan a sobre dels noms @@ -1146,9 +1137,6 @@ Show others (own team only) Time == Temps -Replay %3d:%02d -== Repetició %3d:%02d - 1 new mention == 1 nova menció @@ -1158,9 +1146,6 @@ Replay %3d:%02d 9+ new mentions == 9+ noves mencions -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1170,9 +1155,21 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1194,10 +1191,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1215,12 +1212,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Client message == @@ -1263,3 +1272,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/chuvash.txt b/data/languages/chuvash.txt index 53d3d0e41..acbf86a73 100644 --- a/data/languages/chuvash.txt +++ b/data/languages/chuvash.txt @@ -622,9 +622,6 @@ Name plates size Type: == Тĕс: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -640,6 +637,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -706,6 +706,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -769,9 +778,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -826,6 +832,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -979,6 +988,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1009,6 +1024,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1045,6 +1063,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1220,16 +1241,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/czech.txt b/data/languages/czech.txt index 00d80e458..82f4ad895 100644 --- a/data/languages/czech.txt +++ b/data/languages/czech.txt @@ -625,9 +625,6 @@ Name plates size Type: == Typ: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -643,6 +640,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -709,6 +709,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -772,9 +781,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -829,6 +835,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -982,6 +991,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1012,6 +1027,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1048,6 +1066,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1223,16 +1244,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/danish.txt b/data/languages/danish.txt index 43f86a4b2..5324f9a57 100644 --- a/data/languages/danish.txt +++ b/data/languages/danish.txt @@ -622,9 +622,6 @@ Name plates size Type: == Type: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -640,6 +637,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -706,6 +706,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -769,9 +778,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -826,6 +832,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -979,6 +988,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1009,6 +1024,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1045,6 +1063,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1220,16 +1241,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index 6f3004ee3..dfa96c3b5 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -1125,18 +1125,6 @@ New random timeout code Time == Tijd -Manual %3d:%02d -== Manual %3d:%02d - -Race %3d:%02d -== Race %3d:%02d - -Auto %3d:%02d -== Automatisch %3d:%02d - -Replay %3d:%02d -== Herhaling %3d:%02d - Follow == Volg @@ -1170,9 +1158,6 @@ Grabs 9+ new mentions == 9+ nieuwe berichten -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1182,9 +1167,21 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1206,10 +1203,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1227,12 +1224,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Client message == @@ -1276,6 +1285,18 @@ Editor Play == +Manual +== + +Race +== + +Auto +== + +Replay +== + Net == diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt index 257739f0a..a3e4bfbc5 100644 --- a/data/languages/finnish.txt +++ b/data/languages/finnish.txt @@ -623,9 +623,6 @@ Name plates size Type: == Tyyppi: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -641,6 +638,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -707,6 +707,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -770,9 +779,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -827,6 +833,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -980,6 +989,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1010,6 +1025,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1046,6 +1064,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1221,16 +1242,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/french.txt b/data/languages/french.txt index 080955c92..8859f1186 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -785,9 +785,6 @@ Statboard Show text entities == Afficher le texte des entités -Race %3d:%02d -== Course %3d:%02d - Connecting dummy == Connection du dummy @@ -893,12 +890,6 @@ Messages Fetch Info == Afficher les détails -Auto %3d:%02d -== Auto %3d:%02d - -Replay %3d:%02d -== Replay %3d:%02d - Show only chat messages from friends == Ne montrer que les messages des amis @@ -953,9 +944,6 @@ Exclude Disconnect Dummy == Deconnecter le dummy -Manual %3d:%02d -== Manuel %3d:%02d - Show clan above name plates == Afficher le clan au dessus du pseudonyme @@ -1187,9 +1175,6 @@ Show DDNet map finishes in server browser transmits your player name to info2.ddnet.tw == transmet votre pseudonyme à info2.ddnet.tw -Downloading ddnet-info.json failed -== Le téléchargement de ddnet-info.json a échoué - Saving ddnet-settings.cfg failed == L'enregistrement de ddnet-settings.cfg a échoué @@ -1223,9 +1208,6 @@ Theme %d player == %d joueur -File -== Fichier - Demos directory == Répertoire des enregistrements @@ -1295,3 +1277,42 @@ Editor [Start menu] Play == Jouer + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + +Smooth Camera +== + +Game sound volume +== + +Chat sound volume +== + +Use old chat style +== + +Highlight +== + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/german.txt b/data/languages/german.txt index 24dc994fd..4a4c199a5 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -880,9 +880,6 @@ Follow Reset == Zurücks. -Manual %3d:%02d -== Manuell %3d:%02d - Automatically create statboard csv == Automatisch Punktetafel-CSV erstellen @@ -895,9 +892,6 @@ Remove chat Threaded sound loading == Sounds in Threads laden -Race %3d:%02d -== Rennen %3d:%02d - Frags == Abschüsse @@ -940,9 +934,6 @@ Best Screen == Bildschirm -Auto %3d:%02d -== Auto %3d:%02d - Exclude == Ausschließen @@ -1078,9 +1069,6 @@ Enable replays Toggle dummy == Dummy wechseln -Replay %3d:%02d -== Wiederholung %3d:%02d - Markers: == Markierungen: @@ -1241,9 +1229,6 @@ Play Theme == Theme -File -== Datei - Demos directory == Demo-Ordner @@ -1277,11 +1262,47 @@ Assets directory https://wiki.ddnet.tw/ == https://wiki.ddnet.tw/ -Downloading ddnet-info.json failed -== ddnet-info.json herunterzuladen ist fehlgeschlagen - Saving ddnet-settings.cfg failed == ddnet-settings.cfg zu speichern ist fehlgeschlagen Use current map as background == Aktuelle Karte als Hintergrund benutzen + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + +Smooth Camera +== + +Game sound volume +== + +Chat sound volume +== + +Use old chat style +== + +Highlight +== + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/greek.txt b/data/languages/greek.txt index c523eb864..47830d6b8 100644 --- a/data/languages/greek.txt +++ b/data/languages/greek.txt @@ -628,9 +628,6 @@ Name plates size Type: == Τύπος: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -646,6 +643,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Server best: == @@ -709,6 +709,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -772,9 +781,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -829,6 +835,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -979,6 +988,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1009,6 +1024,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1045,6 +1063,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1220,16 +1241,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index e374504c0..c9a0ee9c6 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -741,9 +741,6 @@ Show health + ammo Team message == Csapat üzenet -Manual %3d:%02d -== Manuális %3d:%02 - Automatically create statboard csv == Magától készítsen csv pontszámtáblát @@ -768,9 +765,6 @@ Remove chat Check now == Nézd meg -Race %3d:%02d -== Verseny %3d:%02d - Background (regular) == Háttér (pálya) @@ -891,9 +885,6 @@ Clan plates size Update now == Feljeszd most -Auto %3d:%02d -== Auto %3d:%02d - Show clan above name plates == Klán mutatása a nevek fölött @@ -1020,9 +1011,6 @@ Personal best: Show entities == Entitások mutatása -Replay %3d:%02d -== Visszajátszás %3d:%02d - Video name: == Videó neve: @@ -1164,9 +1152,6 @@ Length Are you sure that you want to disconnect your dummy? == Biztos, hogy kiakarod léptetni a másolatodat? -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1176,9 +1161,21 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1200,10 +1197,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1224,12 +1221,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Client message == @@ -1275,3 +1284,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/italian.txt b/data/languages/italian.txt index cd3519995..a47e10c93 100644 --- a/data/languages/italian.txt +++ b/data/languages/italian.txt @@ -680,9 +680,6 @@ Are you sure that you want to disconnect your dummy? 1 new mention == 1 nuova menzione -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -698,6 +695,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -758,6 +758,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -818,9 +827,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -866,6 +872,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -1022,6 +1031,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1052,6 +1067,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1088,6 +1106,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1254,16 +1275,16 @@ DDNet %s is out! Restart == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/japanese.txt b/data/languages/japanese.txt index 65396a3a9..e1ad1ca39 100644 --- a/data/languages/japanese.txt +++ b/data/languages/japanese.txt @@ -622,9 +622,6 @@ Name plates size Type: == タイプ: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -640,6 +637,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -706,6 +706,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -769,9 +778,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -826,6 +832,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -979,6 +988,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1009,6 +1024,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1045,6 +1063,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1220,16 +1241,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/korean.txt b/data/languages/korean.txt index aa2ab8f33..5de3fccb9 100644 --- a/data/languages/korean.txt +++ b/data/languages/korean.txt @@ -624,9 +624,6 @@ Name plates size Type: == 종류: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -642,6 +639,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Server best: == @@ -705,6 +705,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -768,9 +777,6 @@ Please use a different name Remove chat == -File -== - Demofile: %s == @@ -828,6 +834,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -978,6 +987,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1008,6 +1023,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1044,6 +1062,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1219,16 +1240,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/kyrgyz.txt b/data/languages/kyrgyz.txt index 7e2ac9946..505973a03 100644 --- a/data/languages/kyrgyz.txt +++ b/data/languages/kyrgyz.txt @@ -619,9 +619,6 @@ Game paused Show only chat messages from friends == Достордун гана маек билдирүүлөрүн көрсөтүү -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -637,6 +634,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Server best: == @@ -700,6 +700,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -763,9 +772,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -820,6 +826,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -970,6 +979,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1000,6 +1015,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1036,6 +1054,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1211,16 +1232,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index 6cce6be00..e74934e5b 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -1115,18 +1115,6 @@ New random timeout code Time == Tid -Manual %3d:%02d -== Manuell %3d:%02d - -Race %3d:%02d -== Løp %3d:%02d - -Auto %3d:%02d -== Auto %3d:%02d - -Replay %3d:%02d -== Opptak %3d:%02d - Follow == Følg @@ -1166,9 +1154,6 @@ Grabs 9+ new mentions == nevnt 9+ ganger -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1178,9 +1163,21 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1202,10 +1199,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1223,12 +1220,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Client message == @@ -1271,3 +1280,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/persian.txt b/data/languages/persian.txt index f4d33e806..0ef50a0e0 100644 --- a/data/languages/persian.txt +++ b/data/languages/persian.txt @@ -208,9 +208,6 @@ Pistol Play == ﻥﺩﺮﻛ ىﺯﺎﺑ -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -229,6 +226,9 @@ Warning Team == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Sudden Death == @@ -349,6 +349,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + There's an unsaved map in the editor, you might want to save it before you quit the game. == @@ -409,9 +418,6 @@ Search Exclude == -Server address: -== - %d of %d servers == @@ -424,6 +430,9 @@ Server address: %d player == +Server address: +== + Refresh == @@ -481,9 +490,6 @@ Please use a different name Remove chat == -File -== - Created: == @@ -595,6 +601,9 @@ Activate Save == +Smooth Camera +== + Switch weapon on pickup == @@ -835,6 +844,12 @@ Sample rate Sound volume == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -883,6 +898,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -919,6 +937,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1106,16 +1127,16 @@ Time Score == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Red team wins! diff --git a/data/languages/polish.txt b/data/languages/polish.txt index e9b1fae73..607694ab2 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -825,9 +825,6 @@ Disconnect Dummy Remove chat == Usuń chat -Manual %3d:%02d -== Instrukcja %3d:%02d - Activate == Aktywuj @@ -1017,9 +1014,6 @@ Connecting dummy Show all == Pokaż wszystkich -Race %3d:%02d -== Wyścig %3d:%02d - Use high DPI == Użyj dużego DPI @@ -1089,9 +1083,6 @@ Successfully saved the replay! Length == Długość -Auto %3d:%02d -== Auto %3d:%02d - Are you sure that you want to disconnect your dummy? == Czy jesteś pewien, że chcesz odesłać kukłę? @@ -1125,9 +1116,6 @@ Personal best: Show text entities == Pokaż entities tekstu -Replay %3d:%02d -== Powtórka %3d:%02d - Friend == Znajomy @@ -1170,9 +1158,6 @@ Indicate map finish Show others (own team only) == Pokazuj innych (tylko drużynę) -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1182,9 +1167,21 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1206,10 +1203,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1227,12 +1224,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Client message == @@ -1275,3 +1284,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt index 28dc5006c..ba8286926 100644 --- a/data/languages/portuguese.txt +++ b/data/languages/portuguese.txt @@ -872,9 +872,6 @@ AntiPing: predict grenade paths Inner color == Cor interior -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -890,6 +887,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Server best: == @@ -941,6 +941,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -983,9 +992,6 @@ Indicate map finish Unfinished map == -File -== - Markers: == @@ -1034,6 +1040,9 @@ Activate Save == +Smooth Camera +== + Reset wanted weapon on death == @@ -1127,15 +1136,27 @@ Enable long pain sound (used when shooting in freeze) Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + Friend message == +Highlight +== + Client message == @@ -1233,16 +1254,16 @@ Update failed! Check log... Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Frags diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt index 9eb6f9885..64fc9e5c7 100644 --- a/data/languages/romanian.txt +++ b/data/languages/romanian.txt @@ -634,9 +634,6 @@ Name plates size Type: == Tip: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -652,6 +649,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Server best: == @@ -715,6 +715,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -778,9 +787,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -835,6 +841,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -985,6 +994,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1015,6 +1030,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1051,6 +1069,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1226,16 +1247,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/russian.txt b/data/languages/russian.txt index d1f0fa494..be53c28db 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1111,18 +1111,6 @@ Check now Time == Время -Manual %3d:%02d -== Ручное %3d:%02d - -Race %3d:%02d -== Попытка %3d:%02d - -Auto %3d:%02d -== Авто %3d:%02d - -Replay %3d:%02d -== Повтор %3d:%02d - Follow == Следить @@ -1232,19 +1220,28 @@ Learn Play == Играть -Downloading ddnet-info.json failed +Saving ddnet-settings.cfg failed == -Saving ddnet-settings.cfg failed +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name == Theme == -File +Demos directory == -Demos directory +Smooth Camera == Themes directory @@ -1256,12 +1253,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Use current map as background == @@ -1276,3 +1285,15 @@ Particles Assets directory == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt index 92cea7744..5c60ec8f7 100644 --- a/data/languages/serbian.txt +++ b/data/languages/serbian.txt @@ -650,9 +650,6 @@ Video name: Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == Tipka K da se ubijes (restart), tipka q da pauziras i gledas druge igrače. -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -662,6 +659,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Server best: == @@ -713,6 +713,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -773,9 +782,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -830,6 +836,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -983,6 +992,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1013,6 +1028,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1049,6 +1067,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1221,16 +1242,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt index 9f4001b37..29e1f97dd 100644 --- a/data/languages/serbian_cyrillic.txt +++ b/data/languages/serbian_cyrillic.txt @@ -1102,9 +1102,6 @@ Show others (own team only) Show quads == Прикажи quads -AntiPing limit -== AntiPing ограничења - AntiPing == AntiPing @@ -1208,18 +1205,6 @@ Restart Time == Време -Manual %3d:%02d -== Упутство %3d:%02d - -Race %3d:%02d -== Трка %3d:%02d - -Auto %3d:%02d -== Ауто %3d:%02d - -Replay %3d:%02d -== Помнови %3d:%02d - Follow == Прати @@ -1258,3 +1243,51 @@ Grabs 9+ new mentions == 9+ нових помињања + +Saving ddnet-settings.cfg failed +== + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + +Smooth Camera +== + +Game sound volume +== + +Chat sound volume +== + +Background music volume +== + +Use old chat style +== + +Highlight +== + +Use current map as background +== + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index e266a9fdb..f11b69df6 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -1008,21 +1008,12 @@ Time Show entities == 实体层显示开关 -Race %3d:%02d -== 竞速赛 %3d:%02d - -Replay %3d:%02d -== 回放 %3d:%02d - Show all == 显示所有玩家 Downloading %s: == 正在下载 %s: -Manual %3d:%02d -== 手动 %3d:%02d - %d new mentions == %d 条新提示 @@ -1083,9 +1074,6 @@ Size Dummy copy == 分身同步动作 -Auto %3d:%02d -== 自动 %3d:%02d - 9+ new mentions == 9+ 条新提示 @@ -1222,10 +1210,19 @@ Server executable not found, can't run server Editor == 编辑器 -Downloading ddnet-info.json failed +Saving ddnet-settings.cfg failed == -Saving ddnet-settings.cfg failed +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name == Theme @@ -1243,10 +1240,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Themes directory @@ -1261,12 +1258,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Use current map as background == @@ -1281,3 +1290,15 @@ Particles Assets directory == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt index 6511446ba..9cbf3c182 100644 --- a/data/languages/slovak.txt +++ b/data/languages/slovak.txt @@ -622,9 +622,6 @@ Name plates size Type: == Typ: -Downloading ddnet-info.json failed -== - Successfully saved the replay! == @@ -640,6 +637,9 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Game paused == @@ -706,6 +706,15 @@ It's recommended that you check the settings to adjust them to your liking befor Please enter your nick name below. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -769,9 +778,6 @@ Please use a different name Remove chat == -File -== - Markers: == @@ -826,6 +832,9 @@ Activate Save == +Smooth Camera +== + Switch weapon when out of ammo == @@ -979,6 +988,12 @@ Enable highlighted chat sound Threaded sound loading == +Game sound volume +== + +Chat sound volume +== + Map sound volume == @@ -1009,6 +1024,9 @@ Show score Show health + ammo == +Use old chat style +== + Show names in chat in team colors == @@ -1045,6 +1063,9 @@ We will win Friend message == +Highlight +== + Friend == @@ -1220,16 +1241,16 @@ Restart Time == -Manual %3d:%02d +Manual == -Race %3d:%02d +Race == -Auto %3d:%02d +Auto == -Replay %3d:%02d +Replay == Follow diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index 45ce58a69..6bc4dcd89 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -1120,18 +1120,6 @@ New random timeout code Time == Tiempo -Manual %3d:%02d -== Manual %3d:%02d - -Race %3d:%02d -== Carrera %3d:%02d - -Auto %3d:%02d -== Auto %3d:%02d - -Replay %3d:%02d -== Repetición %3d:%02d - Follow == Seguir @@ -1171,9 +1159,6 @@ Grabs 9+ new mentions == 9+ nuevas menciones -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1183,9 +1168,21 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1207,10 +1204,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1228,12 +1225,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Client message == @@ -1276,3 +1285,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index 0a169e6d8..e8d625c64 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -883,9 +883,6 @@ Show text entities Show ghost == Visa spöke -Replay %3d:%02d -== Repris %3d:%02d - 1 new mention == 1 ny nämning @@ -937,9 +934,6 @@ Follow Restart == Starta om -Manual %3d:%02d -== Manual %3d:%02d - Background (regular) == Bakgrund (vanlig) @@ -1108,9 +1102,6 @@ Gameplay Loading DDNet Client == Laddar DDNet Klienten -Auto %3d:%02d -== Auto %3d:%02d - Show HUD == Visa HUD @@ -1126,9 +1117,6 @@ Spree Show others == Visa andra -Race %3d:%02d -== Race %3d:%02d - Unfinished map == Oavslutat bana @@ -1229,19 +1217,28 @@ Editor Play == Spela -Downloading ddnet-info.json failed +Saving ddnet-settings.cfg failed == -Saving ddnet-settings.cfg failed +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name == Theme == -File +Demos directory == -Demos directory +Smooth Camera == Themes directory @@ -1253,12 +1250,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Use current map as background == @@ -1273,3 +1282,15 @@ Particles Assets directory == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index e011595f8..482744647 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -1167,24 +1167,9 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Country / Region == 國家/地區 -Manual %3d:%02d -== 手動 %3d:%02d - -Race %3d:%02d -== 競速賽 %3d:%02d - -Auto %3d:%02d -== 自動 %3d:%02d - -Replay %3d:%02d -== 回放 %3d:%02d - https://wiki.ddnet.tw/ == https://docs.qq.com/doc/DWGFrV0xPRmVWVkla -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1194,6 +1179,18 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Speed == @@ -1212,10 +1209,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1233,12 +1230,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Use current map as background == @@ -1275,3 +1284,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index 268364ae1..bcfea526d 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -1125,18 +1125,6 @@ New random timeout code Time == Süre -Manual %3d:%02d -== Manual %3d:%02d - -Race %3d:%02d -== Yarış %3d:%02d - -Auto %3d:%02d -== Otomatik %3d:%02d - -Replay %3d:%02d -== Yeniden oynatma %3d:%02d - Follow == Takip et @@ -1176,9 +1164,6 @@ Grabs 9+ new mentions == 9+ yeni bildirim -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1188,6 +1173,18 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1209,10 +1206,10 @@ Theme %d player == -File +Demos directory == -Demos directory +Smooth Camera == Skip the main menu @@ -1230,12 +1227,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Use current map as background == @@ -1275,3 +1284,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index 9e174fb41..81b3a6e77 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -1111,18 +1111,6 @@ New random timeout code Time == Час -Manual %3d:%02d -== Ручна %3d:%02d - -Race %3d:%02d -== Гонка %3d:%02d - -Auto %3d:%02d -== Авто %3d:%02d - -Replay %3d:%02d -== Повтор %3d:%02d - %s wins! == %s переміг! @@ -1165,9 +1153,6 @@ Grabs 9+ new mentions == 9+ нових згадок -Downloading ddnet-info.json failed -== - Saving ddnet-settings.cfg failed == @@ -1177,9 +1162,21 @@ The width or height of texture %s is not divisible by 16, which might cause visu Warning == +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== + Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. == +Existing Player +== + +Your nick name '%s' is already used (%d points). Do you still want to use it? +== + +Checking for existing player with your name +== + Country / Region == @@ -1201,15 +1198,15 @@ Theme %d player == -File -== - Markers == Demos directory == +Smooth Camera +== + Skip the main menu == @@ -1225,12 +1222,24 @@ Skin Database Skins directory == +Game sound volume +== + +Chat sound volume +== + Background music volume == Assets == +Use old chat style +== + +Highlight +== + Use current map as background == @@ -1270,3 +1279,15 @@ Editor [Start menu] Play == + +Manual +== + +Race +== + +Auto +== + +Replay +== From 1ff250257728828fbacc1fbcc03169b46fae2d18 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 09:04:25 +0100 Subject: [PATCH 032/144] Update German translation --- data/languages/german.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/data/languages/german.txt b/data/languages/german.txt index 4a4c199a5..8f1962e07 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -1269,40 +1269,40 @@ Use current map as background == Aktuelle Karte als Hintergrund benutzen Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== Debug-Modus aktiviert. Drück Strg+Shift+D um den Debug-Modus zu deaktivieren. Existing Player -== +== Existierender Spieler Your nick name '%s' is already used (%d points). Do you still want to use it? -== +== Dein Spitzname '%s' wird bereits genutzt (%d Punkte). Willst du ihn dennoch nutzen? Checking for existing player with your name -== +== Prüfe auf existierenden Spieler mit deinem Namen Smooth Camera -== +== Weiche Kamera Game sound volume -== +== Spiel-Lautstärke Chat sound volume -== +== Chat-Lautstärke Use old chat style -== +== Alten Chat-Stil nutzen Highlight -== +== Hervorheben Manual -== +== Manuell Race -== +== Rennen Auto -== +== Auto Replay -== +== Wiederholung From 5b5cfa7d9ec1b03835e24c5959882f278e0789fb Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 09:32:14 +0100 Subject: [PATCH 033/144] nick name -> nickname --- data/languages/belarusian.txt | 4 ++-- data/languages/bosnian.txt | 4 ++-- data/languages/brazilian_portuguese.txt | 4 ++-- data/languages/bulgarian.txt | 4 ++-- data/languages/catalan.txt | 4 ++-- data/languages/chuvash.txt | 4 ++-- data/languages/czech.txt | 4 ++-- data/languages/danish.txt | 4 ++-- data/languages/dutch.txt | 4 ++-- data/languages/finnish.txt | 4 ++-- data/languages/french.txt | 4 ++-- data/languages/german.txt | 4 ++-- data/languages/greek.txt | 4 ++-- data/languages/hungarian.txt | 4 ++-- data/languages/italian.txt | 4 ++-- data/languages/japanese.txt | 4 ++-- data/languages/korean.txt | 4 ++-- data/languages/kyrgyz.txt | 4 ++-- data/languages/norwegian.txt | 4 ++-- data/languages/persian.txt | 4 ++-- data/languages/polish.txt | 4 ++-- data/languages/portuguese.txt | 4 ++-- data/languages/romanian.txt | 4 ++-- data/languages/russian.txt | 4 ++-- data/languages/serbian.txt | 4 ++-- data/languages/serbian_cyrillic.txt | 4 ++-- data/languages/simplified_chinese.txt | 4 ++-- data/languages/slovak.txt | 4 ++-- data/languages/spanish.txt | 4 ++-- data/languages/swedish.txt | 4 ++-- data/languages/traditional_chinese.txt | 4 ++-- data/languages/turkish.txt | 4 ++-- data/languages/ukrainian.txt | 4 ++-- src/engine/server/server.cpp | 4 ++-- src/game/client/components/menus.cpp | 4 ++-- 35 files changed, 70 insertions(+), 70 deletions(-) diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt index 87d358696..1d09b472f 100644 --- a/data/languages/belarusian.txt +++ b/data/languages/belarusian.txt @@ -703,13 +703,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt index d6e236761..c3d2bb809 100644 --- a/data/languages/bosnian.txt +++ b/data/languages/bosnian.txt @@ -697,7 +697,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == Preporučeno je da provjeriš i podesiš postavke najbolje za tebe prije nego uđeš na server. -Please enter your nick name below. +Please enter your nickname below. == Molimo unesite vaš nadimak dole. Destination file already exist @@ -1147,7 +1147,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index 706e6fd76..1fd6855bf 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -1149,7 +1149,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == É recomendado que você verifique as configurações para ajustá-las ao seu gosto antes de entrar em um servidor. -Please enter your nick name below. +Please enter your nickname below. == Por favor, insira seu apelido abaixo. Destination file already exist @@ -1273,7 +1273,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/bulgarian.txt b/data/languages/bulgarian.txt index 22391c37c..c0d81313b 100644 --- a/data/languages/bulgarian.txt +++ b/data/languages/bulgarian.txt @@ -700,13 +700,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt index dd24a57e8..5a09d5786 100644 --- a/data/languages/catalan.txt +++ b/data/languages/catalan.txt @@ -1026,7 +1026,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == És recomanat que miris la configuració i ho canviïs al teu gust abans d'entrar a un servidor. -Please enter your nick name below. +Please enter your nickname below. == Si us plau, escriu el teu nom a sota. Destination file already exist @@ -1164,7 +1164,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/chuvash.txt b/data/languages/chuvash.txt index acbf86a73..48a241e97 100644 --- a/data/languages/chuvash.txt +++ b/data/languages/chuvash.txt @@ -703,13 +703,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/czech.txt b/data/languages/czech.txt index 82f4ad895..bcfb9e436 100644 --- a/data/languages/czech.txt +++ b/data/languages/czech.txt @@ -706,13 +706,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/danish.txt b/data/languages/danish.txt index 5324f9a57..c59c9a4b4 100644 --- a/data/languages/danish.txt +++ b/data/languages/danish.txt @@ -703,13 +703,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index dfa96c3b5..157e745ff 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -703,7 +703,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Het wordt aangeraden dat je de instellingen bekijkt en ze aanpast naar jouw wensen voordat je met een server verbindt. -Please enter your nick name below. +Please enter your nickname below. == Voer je bijnaam in a.u.b. Destination file already exist @@ -1176,7 +1176,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt index a3e4bfbc5..0f4464ace 100644 --- a/data/languages/finnish.txt +++ b/data/languages/finnish.txt @@ -704,13 +704,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/french.txt b/data/languages/french.txt index 8859f1186..0ce7e12e2 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -1166,7 +1166,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch 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 nick name below. +Please enter your nickname below. == Veuillez entrer votre pseudonyme ci-dessous. Show DDNet map finishes in server browser @@ -1284,7 +1284,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/german.txt b/data/languages/german.txt index 8f1962e07..0dbf9eb9e 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -1135,7 +1135,7 @@ Personal best: Kill == Kill -Please enter your nick name below. +Please enter your nickname below. == Bitte gib deinen Spitznamen unten ein. The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. @@ -1274,7 +1274,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == Existierender Spieler -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Dein Spitzname '%s' wird bereits genutzt (%d Punkte). Willst du ihn dennoch nutzen? Checking for existing player with your name diff --git a/data/languages/greek.txt b/data/languages/greek.txt index 47830d6b8..f712ca78e 100644 --- a/data/languages/greek.txt +++ b/data/languages/greek.txt @@ -706,13 +706,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index c9a0ee9c6..a9658495f 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -1122,7 +1122,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Ajánlott, hogy ellenőrizze a beállításokat, hogy a kedvéhez igazítsa őket, mielőtt csatlakozna egy szerverhez. (Tipp: szűrők) -Please enter your nick name below. +Please enter your nickname below. == Írja be lent a becenevét. 9+ new mentions @@ -1170,7 +1170,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/italian.txt b/data/languages/italian.txt index a47e10c93..7ea1c9be0 100644 --- a/data/languages/italian.txt +++ b/data/languages/italian.txt @@ -755,13 +755,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/japanese.txt b/data/languages/japanese.txt index e1ad1ca39..83f20ec42 100644 --- a/data/languages/japanese.txt +++ b/data/languages/japanese.txt @@ -703,13 +703,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/korean.txt b/data/languages/korean.txt index 5de3fccb9..bc6b59cb0 100644 --- a/data/languages/korean.txt +++ b/data/languages/korean.txt @@ -702,13 +702,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/kyrgyz.txt b/data/languages/kyrgyz.txt index 505973a03..e5803a52c 100644 --- a/data/languages/kyrgyz.txt +++ b/data/languages/kyrgyz.txt @@ -697,13 +697,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index e74934e5b..9de7e071b 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -692,7 +692,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Det anbefales å sjekke innstillingene og justere dem slik det passer deg før du går inn på en server. -Please enter your nick name below. +Please enter your nickname below. == Skriv inn ditt ønskede kallenavn under. Destination file already exist @@ -1172,7 +1172,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/persian.txt b/data/languages/persian.txt index 0ef50a0e0..d5fe4d553 100644 --- a/data/languages/persian.txt +++ b/data/languages/persian.txt @@ -346,13 +346,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/polish.txt b/data/languages/polish.txt index 607694ab2..abcd5c6af 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -1143,7 +1143,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Przed wejściem na dowolny serwer zalecane jest sprawdzenie ustawień w celu dostosowania ich do własnych upodobań. -Please enter your nick name below. +Please enter your nickname below. == Proszę wpisać swój nick poniżej. Show DDNet map finishes in server browser @@ -1176,7 +1176,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt index ba8286926..0be31aa59 100644 --- a/data/languages/portuguese.txt +++ b/data/languages/portuguese.txt @@ -938,13 +938,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt index 64fc9e5c7..27c4d565c 100644 --- a/data/languages/romanian.txt +++ b/data/languages/romanian.txt @@ -712,13 +712,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/russian.txt b/data/languages/russian.txt index be53c28db..300ece713 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -868,7 +868,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Перед посещением сервера рекомендуем изменить настройки на Ваш вкус. -Please enter your nick name below. +Please enter your nickname below. == Пожалуйста, ниже укажите свой никнейм. Destination file already exist @@ -1229,7 +1229,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt index 5c60ec8f7..dba638372 100644 --- a/data/languages/serbian.txt +++ b/data/languages/serbian.txt @@ -710,13 +710,13 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt index 29e1f97dd..add75c6c6 100644 --- a/data/languages/serbian_cyrillic.txt +++ b/data/languages/serbian_cyrillic.txt @@ -723,7 +723,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == Препоручује се да проверите подешавања како бисте их прилагодили пре него што се придружите серверу. -Please enter your nick name below. +Please enter your nickname below. == Молимо вас напишите ваш надимак испод. Country / Region @@ -1253,7 +1253,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index f11b69df6..02eb2d435 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -1128,7 +1128,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == 推荐在进入服务器前,先将设置调整到符合你的习惯。 -Please enter your nick name below. +Please enter your nickname below. == 请输入你的昵称。 Render @@ -1219,7 +1219,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt index 9cbf3c182..7e0a10151 100644 --- a/data/languages/slovak.txt +++ b/data/languages/slovak.txt @@ -703,13 +703,13 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == -Please enter your nick name below. +Please enter your nickname below. == Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index 6bc4dcd89..fa959cc25 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -700,7 +700,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Se recomienda que verifiques la configuración para ajustarla a tu gusto antes de unirte a un servidor. -Please enter your nick name below. +Please enter your nickname below. == Por favor, introduzca su apodo a continuación. Destination file already exist @@ -1177,7 +1177,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index e8d625c64..d2d32365b 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -769,7 +769,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Det är rekomenderad att du kollar igenom inställningarna och ändra dom så de passar dig innan du ansluter dig till en server. -Please enter your nick name below. +Please enter your nickname below. == Skriv ditt smeknamn nedanför. Render @@ -1226,7 +1226,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index 482744647..70598b8d9 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -1122,7 +1122,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == 推薦在進入伺服器前,先將設定調整到符合你的習慣。 -Please enter your nick name below. +Please enter your nickname below. == 請輸入你的暱稱。 Render @@ -1185,7 +1185,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index bcfea526d..595d0ab55 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -696,7 +696,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo It's recommended that you check the settings to adjust them to your liking before joining a server. == Sunuculara bağlanmadan önce ayarları kontrol edip kendine göre düzenlemeni öneriyoruz. -Please enter your nick name below. +Please enter your nickname below. == Lütfen takma adı girin. Destination file already exist @@ -1179,7 +1179,7 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index 81b3a6e77..8ce1535c4 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -538,7 +538,7 @@ Most importantly communication is key: There is no tutorial so you'll have to ch It's recommended that you check the settings to adjust them to your liking before joining a server. == Рекомендується перевірити налаштування, щоб підлаштувати їх до душі перед тим, як приєднатися до сервера. -Please enter your nick name below. +Please enter your nickname below. == Будь ласка, введіть свій нікнейм нижче There's an unsaved map in the editor, you might want to save it before you quit the game. @@ -1171,7 +1171,7 @@ Use k key to kill (restart), q to pause and watch other players. See settings fo Existing Player == -Your nick name '%s' is already used (%d points). Do you still want to use it? +Your nickname '%s' is already used (%d points). Do you still want to use it? == Checking for existing player with your name diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index ba022acf6..27bfd4464 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -3406,8 +3406,8 @@ void CServer::RegisterCommands() Console()->Register("auth_remove", "s[ident]", CFGFLAG_SERVER | CFGFLAG_NONTEEHISTORIC, ConAuthRemove, this, "Remove a rcon key"); Console()->Register("auth_list", "", CFGFLAG_SERVER, ConAuthList, this, "List all rcon keys"); - Console()->Register("name_ban", "s[name] ?i[distance] ?i[is_substring] ?r[reason]", CFGFLAG_SERVER, ConNameBan, this, "Ban a certain nick name"); - Console()->Register("name_unban", "s[name]", CFGFLAG_SERVER, ConNameUnban, this, "Unban a certain nick name"); + Console()->Register("name_ban", "s[name] ?i[distance] ?i[is_substring] ?r[reason]", CFGFLAG_SERVER, ConNameBan, this, "Ban a certain nickname"); + Console()->Register("name_unban", "s[name]", CFGFLAG_SERVER, ConNameUnban, this, "Unban a certain nickname"); Console()->Register("name_bans", "", CFGFLAG_SERVER, ConNameBans, this, "List all name bans"); Console()->Chain("sv_name", ConchainSpecialInfoupdate, this); diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index adedc49a7..7746164c6 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -1419,7 +1419,7 @@ int CMenus::Render() Localize("Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game."), Localize("Use k key to kill (restart), q to pause and watch other players. See settings for other key binds."), Localize("It's recommended that you check the settings to adjust them to your liking before joining a server."), - Localize("Please enter your nick name below.")); + Localize("Please enter your nickname below.")); pExtraText = aBuf; pButtonText = Localize("Ok"); ExtraAlign = -1; @@ -1429,7 +1429,7 @@ int CMenus::Render() pTitle = Localize("Existing Player"); if(Client()->m_Points > 50) { - str_format(aBuf, sizeof(aBuf), Localize("Your nick name '%s' is already used (%d points). Do you still want to use it?"), Client()->PlayerName(), Client()->m_Points); + str_format(aBuf, sizeof(aBuf), Localize("Your nickname '%s' is already used (%d points). Do you still want to use it?"), Client()->PlayerName(), Client()->m_Points); pExtraText = aBuf; } else if(Client()->m_Points >= 0) From b0f9dc2139d45ccaf2138626b7004403060f860d Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 09:53:03 +0100 Subject: [PATCH 034/144] 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 b7009815c..89322d151 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -36,7 +36,7 @@ void CGameContext::ConCredits(IConsole::IResult *pResult, void *pUserData) pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "credits", "trafilaw, Zwelf, Patiga, Konsti, ElXreno, MikiGamer,"); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "credits", - "Fireball & others."); + "Fireball, Banana090, axblk, yangfl & others."); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "credits", "Based on DDRace by the DDRace developers,"); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "credits", From 312b9d3bd8f47d73a571c1969bf21bb180689b57 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 11:34:20 +0100 Subject: [PATCH 035/144] Enable clang-tidy performance-* checks --- .clang-tidy | 1 + src/engine/client/text.cpp | 2 +- src/engine/server/sql_string_helpers.cpp | 4 ++-- src/game/client/components/ghost.cpp | 4 ++-- src/game/client/components/ghost.h | 4 ++-- src/game/server/score.h | 13 +++++++------ src/game/server/teams.h | 4 +++- 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 3da516da8..ed2a96501 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -26,4 +26,5 @@ Checks: > -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, modernize-loop-convert, readability-qualified-auto, + performance-*, HeaderFilterRegex: 'src/.*' diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index ada1f60b4..e2cd4a629 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -715,7 +715,7 @@ public: if(FT_New_Memory_Face(m_FTLibrary, pBuf, Size, 0, &FallbackFont.m_FtFace) == 0) { dbg_msg("textrender", "loaded fallback font from '%s'", pFilename); - pFont->m_FtFallbackFonts.emplace_back(std::move(FallbackFont)); + pFont->m_FtFallbackFonts.emplace_back(FallbackFont); return true; } diff --git a/src/engine/server/sql_string_helpers.cpp b/src/engine/server/sql_string_helpers.cpp index 1164abdc3..46c44bd88 100644 --- a/src/engine/server/sql_string_helpers.cpp +++ b/src/engine/server/sql_string_helpers.cpp @@ -73,7 +73,7 @@ void sqlstr::AgoTimeToString(int AgoTime, char *pAgoString, int Size) Seconds = aTimes[i]; str_copy(aName, aaNames[i], sizeof(aName)); - Count = floor((float)AgoTime / (float)Seconds); + Count = std::floor((float)AgoTime / (float)Seconds); if(Count != 0) { break; @@ -98,7 +98,7 @@ void sqlstr::AgoTimeToString(int AgoTime, char *pAgoString, int Size) str_copy(aName2, aaNames[i + 1], sizeof(aName2)); // add second piece if it's greater than 0 - int Count2 = floor((float)(AgoTime - (Seconds * Count)) / (float)Seconds2); + int Count2 = std::floor((float)(AgoTime - (Seconds * Count)) / (float)Seconds2); if(Count2 != 0) { diff --git a/src/game/client/components/ghost.cpp b/src/game/client/components/ghost.cpp index f866c196f..20065117d 100644 --- a/src/game/client/components/ghost.cpp +++ b/src/game/client/components/ghost.cpp @@ -59,14 +59,14 @@ void CGhost::GetNetObjCharacter(CNetObj_Character *pChar, const CGhostCharacter pChar->m_Tick = pGhostChar->m_Tick; } -CGhost::CGhostPath::CGhostPath(CGhostPath &&Other) : +CGhost::CGhostPath::CGhostPath(CGhostPath &&Other) noexcept : m_ChunkSize(Other.m_ChunkSize), m_NumItems(Other.m_NumItems), m_lChunks(std::move(Other.m_lChunks)) { Other.m_NumItems = 0; Other.m_lChunks.clear(); } -CGhost::CGhostPath &CGhost::CGhostPath::operator=(CGhostPath &&Other) +CGhost::CGhostPath &CGhost::CGhostPath::operator=(CGhostPath &&Other) noexcept { Reset(Other.m_ChunkSize); m_NumItems = Other.m_NumItems; diff --git a/src/game/client/components/ghost.h b/src/game/client/components/ghost.h index bf3f1348d..771483d11 100644 --- a/src/game/client/components/ghost.h +++ b/src/game/client/components/ghost.h @@ -68,8 +68,8 @@ private: CGhostPath(const CGhostPath &Other) = delete; CGhostPath &operator=(const CGhostPath &Other) = delete; - CGhostPath(CGhostPath &&Other); - CGhostPath &operator=(CGhostPath &&Other); + CGhostPath(CGhostPath &&Other) noexcept; + CGhostPath &operator=(CGhostPath &&Other) noexcept; void Reset(int ChunkSize = 25 * 60); // one minute with default snap rate void SetSize(int Items); diff --git a/src/game/server/score.h b/src/game/server/score.h index 95d56ed79..7f3fe2692 100644 --- a/src/game/server/score.h +++ b/src/game/server/score.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -149,7 +150,7 @@ public: struct CSqlInitData : ISqlData { CSqlInitData(std::shared_ptr pResult) : - m_pResult(pResult) + m_pResult(std::move(pResult)) { } std::shared_ptr m_pResult; @@ -161,7 +162,7 @@ struct CSqlInitData : ISqlData struct CSqlPlayerRequest : ISqlData { CSqlPlayerRequest(std::shared_ptr pResult) : - m_pResult(pResult) + m_pResult(std::move(pResult)) { } std::shared_ptr m_pResult; @@ -177,7 +178,7 @@ struct CSqlPlayerRequest : ISqlData struct CSqlRandomMapRequest : ISqlData { CSqlRandomMapRequest(std::shared_ptr pResult) : - m_pResult(pResult) + m_pResult(std::move(pResult)) { } std::shared_ptr m_pResult; @@ -191,7 +192,7 @@ struct CSqlRandomMapRequest : ISqlData struct CSqlScoreData : ISqlData { CSqlScoreData(std::shared_ptr pResult) : - m_pResult(pResult) + m_pResult(std::move(pResult)) { } virtual ~CSqlScoreData(){}; @@ -224,7 +225,7 @@ struct CSqlTeamScoreData : ISqlData struct CSqlTeamSave : ISqlData { CSqlTeamSave(std::shared_ptr pResult) : - m_pResult(pResult) + m_pResult(std::move(pResult)) { } virtual ~CSqlTeamSave(){}; @@ -241,7 +242,7 @@ struct CSqlTeamSave : ISqlData struct CSqlTeamLoad : ISqlData { CSqlTeamLoad(std::shared_ptr pResult) : - m_pResult(pResult) + m_pResult(std::move(pResult)) { } virtual ~CSqlTeamLoad(){}; diff --git a/src/game/server/teams.h b/src/game/server/teams.h index a99588878..f2f446707 100644 --- a/src/game/server/teams.h +++ b/src/game/server/teams.h @@ -6,6 +6,8 @@ #include #include +#include + class CGameTeams { int m_TeamState[MAX_CLIENTS]; @@ -123,7 +125,7 @@ public: void SetSaving(int TeamID, std::shared_ptr SaveResult) { - m_pSaveTeamResult[TeamID] = SaveResult; + m_pSaveTeamResult[TeamID] = std::move(SaveResult); } bool GetSaving(int TeamID) From 7a9a67c5d77bad671759431ec7e0becb9cec222e Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 11:47:07 +0100 Subject: [PATCH 036/144] Enable most clang-tidy misc-* checks --- .clang-tidy | 6 ++++++ src/engine/client/keynames.h | 2 +- src/engine/client/opengl_sl.cpp | 2 +- src/game/server/entity.h | 4 ++-- src/game/server/gamecontext.cpp | 2 +- src/tools/config_common.h | 4 ++-- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index ed2a96501..0b85d463a 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -8,6 +8,8 @@ # Too annoying to always align for perfect padding # clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, # TODO: Requires C11 to fix +# misc-unused-parameters +# TODO: Many changes Checks: > -*, @@ -24,6 +26,10 @@ Checks: > -clang-analyzer-optin.cplusplus.VirtualCall, -clang-analyzer-optin.performance.Padding, -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, + misc-*, + -misc-non-private-member-variables-in-classes, + -misc-static-assert, + -misc-unused-parameters, modernize-loop-convert, readability-qualified-auto, performance-*, diff --git a/src/engine/client/keynames.h b/src/engine/client/keynames.h index 64bddd503..e1802f624 100644 --- a/src/engine/client/keynames.h +++ b/src/engine/client/keynames.h @@ -6,7 +6,7 @@ #include -const char g_aaKeyStrings[512][20] = +const char g_aaKeyStrings[512][20] = // NOLINT(misc-definitions-in-headers) { "unknown", "&1", diff --git a/src/engine/client/opengl_sl.cpp b/src/engine/client/opengl_sl.cpp index 15952cae5..bc59e910a 100644 --- a/src/engine/client/opengl_sl.cpp +++ b/src/engine/client/opengl_sl.cpp @@ -188,7 +188,7 @@ void CGLSLCompiler::ParseLine(std::string &Line, const char *pReadLine, int Type ++pBuff; } - if(*pBuff && *pBuff == ' ' && *(pBuff + 1) && *(pBuff + 1) == 'i' && *(pBuff + 2) == 'n') + if(*pBuff == ' ' && *(pBuff + 1) && *(pBuff + 1) == 'i' && *(pBuff + 2) == 'n') { pBuff += 3; Line.append("attribute"); diff --git a/src/game/server/entity.h b/src/game/server/entity.h index 9725bf610..a3521ea53 100644 --- a/src/game/server/entity.h +++ b/src/game/server/entity.h @@ -26,7 +26,7 @@ private: public: \ void *operator new(size_t Size, int id); \ void operator delete(void *p, int id); \ - void operator delete(void *p); \ + void operator delete(void *p); /* NOLINT(misc-new-delete-overloads) */ \ \ private: @@ -50,7 +50,7 @@ private: ms_PoolUsed##POOLTYPE[id] = 0; \ mem_zero(ms_PoolData##POOLTYPE[id], sizeof(POOLTYPE)); \ } \ - void POOLTYPE::operator delete(void *p) \ + void POOLTYPE::operator delete(void *p) /* NOLINT(misc-new-delete-overloads) */ \ { \ int id = (POOLTYPE *)p - (POOLTYPE *)ms_PoolData##POOLTYPE; \ dbg_assert(ms_PoolUsed##POOLTYPE[id], "not used"); \ diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index b3cbf80cf..3ebb43fef 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -2718,7 +2718,7 @@ void CGameContext::AddVote(const char *pDescription, const char *pCommand) Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); return; } - while(*pDescription && *pDescription == ' ') + while(*pDescription == ' ') pDescription++; if(str_length(pDescription) >= VOTE_DESC_LENGTH || *pDescription == 0) { diff --git a/src/tools/config_common.h b/src/tools/config_common.h index 97bb9bd8c..d3fa551cf 100644 --- a/src/tools/config_common.h +++ b/src/tools/config_common.h @@ -7,7 +7,7 @@ struct ListDirectoryContext IStorage *pStorage; }; -void ProcessItem(const char *pItemName, IStorage *pStorage) +inline void ProcessItem(const char *pItemName, IStorage *pStorage) { char aConfig[2048]; @@ -44,7 +44,7 @@ static int ListdirCallback(const char *pItemName, int IsDir, int StorageType, vo return 0; } -int main(int argc, const char **argv) +int main(int argc, const char **argv) // NOLINT(misc-definitions-in-headers) { dbg_logger_stdout(); IStorage *pStorage = CreateLocalStorage(); From e75d7a2ff8055ef8255ad818beb0e8363ec14970 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 12:15:27 +0100 Subject: [PATCH 037/144] Scoreboard same line height and font size for each team (fixes #3216, supersedes #3219) --- src/game/client/components/scoreboard.cpp | 27 ++++++++++++----------- src/game/client/components/scoreboard.h | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp index e4164749a..0c9f9b3b6 100644 --- a/src/game/client/components/scoreboard.cpp +++ b/src/game/client/components/scoreboard.cpp @@ -147,11 +147,14 @@ void CScoreboard::RenderSpectators(float x, float y, float w) } } -void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const char *pTitle) +void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const char *pTitle, int NumPlayers) { if(Team == TEAM_SPECTATORS) return; + if(NumPlayers < 0) + NumPlayers = m_pClient->m_Snap.m_aTeamSize[Team]; + bool lower16 = false; bool upper16 = false; bool lower24 = false; @@ -253,28 +256,31 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch float TeeSizeMod = 1.0f; float Spacing = 16.0f; float RoundRadius = 15.0f; - if(m_pClient->m_Snap.m_aTeamSize[Team] > 48) + float FontSize = 24.0f; + if(NumPlayers > 48) { LineHeight = 20.0f; TeeSizeMod = 0.4f; Spacing = 0.0f; RoundRadius = 5.0f; + FontSize = 16.0f; } - else if(m_pClient->m_Snap.m_aTeamSize[Team] > 32) + else if(NumPlayers > 32) { LineHeight = 27.0f; TeeSizeMod = 0.6f; Spacing = 0.0f; RoundRadius = 5.0f; + FontSize = 20.0f; } - else if(m_pClient->m_Snap.m_aTeamSize[Team] > 12) + else if(NumPlayers > 12) { LineHeight = 40.0f; TeeSizeMod = 0.8f; Spacing = 0.0f; RoundRadius = 15.0f; } - else if(m_pClient->m_Snap.m_aTeamSize[Team] > 8) + else if(NumPlayers > 8) { LineHeight = 50.0f; TeeSizeMod = 0.9f; @@ -282,12 +288,6 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch RoundRadius = 15.0f; } - float FontSize = 24.0f; - if(m_pClient->m_Snap.m_aTeamSize[Team] > 48) - FontSize = 16.0f; - else if(m_pClient->m_Snap.m_aTeamSize[Team] > 32) - FontSize = 20.0f; - float ScoreOffset = x + 10.0f, ScoreLength = TextRender()->TextWidth(0, FontSize, "00:00:00", -1, -1.0f); float TeeOffset = ScoreOffset + ScoreLength + 15.0f, TeeLength = 60 * TeeSizeMod; float NameOffset = TeeOffset + TeeLength, NameLength = 300.0f - TeeLength; @@ -654,8 +654,9 @@ void CScoreboard::OnRender() TextRender()->Text(0, Width / 2 - w / 2, 39, 86.0f, aText, -1.0f); } - RenderScoreboard(Width / 2 - w - 5.0f, 150.0f, w, TEAM_RED, pRedClanName ? pRedClanName : Localize("Red team")); - RenderScoreboard(Width / 2 + 5.0f, 150.0f, w, TEAM_BLUE, pBlueClanName ? pBlueClanName : Localize("Blue team")); + 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); } } diff --git a/src/game/client/components/scoreboard.h b/src/game/client/components/scoreboard.h index 0ccaf8d91..da90c4b1f 100644 --- a/src/game/client/components/scoreboard.h +++ b/src/game/client/components/scoreboard.h @@ -8,7 +8,7 @@ class CScoreboard : public CComponent { void RenderGoals(float x, float y, float w); void RenderSpectators(float x, float y, float w); - void RenderScoreboard(float x, float y, float w, int Team, const char *pTitle); + void RenderScoreboard(float x, float y, float w, int Team, const char *pTitle, int NumPlayers = -1); void RenderRecordingNotification(float x); static void ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData); From b03b75146cafa543813fc8f4922d9abaff04a0b4 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 13:13:05 +0100 Subject: [PATCH 038/144] cl_chat_tee + cl_chat_background => cl_chat_old (fixes #3106) --- src/engine/shared/config_variables.h | 3 +-- src/game/client/components/chat.cpp | 22 +++++++++---------- src/game/client/components/menus_settings.cpp | 15 ++----------- 3 files changed, 13 insertions(+), 27 deletions(-) diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index f46478a25..b54e5c0e3 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -362,8 +362,7 @@ MACRO_CONFIG_INT(ClShowHookCollOwn, cl_show_hook_coll_own, 1, 0, 2, CFGFLAG_CLIE MACRO_CONFIG_INT(ClChatTeamColors, cl_chat_teamcolors, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show names in chat in team colors") MACRO_CONFIG_INT(ClChatReset, cl_chat_reset, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Reset chat when pressing escape") -MACRO_CONFIG_INT(ClChatTee, cl_chat_tee, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show a tee before the player name in chat"); -MACRO_CONFIG_INT(ClChatBackground, cl_chat_background, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show a background for each chat message"); +MACRO_CONFIG_INT(ClChatOld, cl_chat_old, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Old chat style: No tee, no background"); MACRO_CONFIG_INT(ClShowDirection, cl_show_direction, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show tee direction") MACRO_CONFIG_INT(ClHttpMapDownload, cl_http_map_download, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Try fast HTTP map download first") diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index d83b1df23..00842833a 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -799,7 +799,7 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine) if(pCurrentLine->m_ClientID >= 0 && pCurrentLine->m_aName[0] != '\0') { - if(g_Config.m_ClChatTee) + if(!g_Config.m_ClChatOld) { pCurrentLine->m_CustomColoredSkin = m_pClient->m_aClients[pCurrentLine->m_ClientID].m_RenderInfo.m_CustomColoredSkin; if(pCurrentLine->m_CustomColoredSkin) @@ -907,14 +907,12 @@ void CChat::OnPrepareLines() float RealMsgPaddingY = MESSAGE_PADDING_Y; float RealMsgPaddingTee = MESSAGE_TEE_SIZE + MESSAGE_TEE_PADDING_RIGHT; - if(!g_Config.m_ClChatBackground) + if(g_Config.m_ClChatOld) { RealMsgPaddingX = 0; - RealMsgPaddingY = (g_Config.m_ClChatTee ? (MESSAGE_TEE_SIZE - FONT_SIZE) : 0); - } - - if(!g_Config.m_ClChatTee) + RealMsgPaddingY = 0; RealMsgPaddingTee = 0; + } int64 Now = time(); float LineWidth = (IsScoreBoardOpen ? 90.0f : 200.0f) - RealMsgPaddingX - RealMsgPaddingTee; @@ -963,7 +961,7 @@ void CChat::OnPrepareLines() else str_format(aCount, sizeof(aCount), " [%d]", m_aLines[r].m_TimesRepeated + 1); - if(!g_Config.m_ClChatTee) + if(g_Config.m_ClChatOld) { m_aLines[r].m_HasRenderTee = false; } @@ -1118,7 +1116,7 @@ void CChat::OnPrepareLines() else TextRender()->AppendTextContainer(&AppendCursor, m_aLines[r].m_TextContainerIndex, m_aLines[r].m_aText); - if(g_Config.m_ClChatBackground && (m_aLines[r].m_aText[0] != '\0' || m_aLines[r].m_aName[0] != '\0')) + if(!g_Config.m_ClChatOld && (m_aLines[r].m_aText[0] != '\0' || m_aLines[r].m_aName[0] != '\0')) { float Height = m_aLines[r].m_YOffset[OffsetType]; Graphics()->SetColor(1, 1, 1, 1); @@ -1237,10 +1235,10 @@ void CChat::OnRender() float RealMsgPaddingX = MESSAGE_PADDING_X; float RealMsgPaddingY = MESSAGE_PADDING_Y; - if(!g_Config.m_ClChatBackground) + if(g_Config.m_ClChatOld) { RealMsgPaddingX = 0; - RealMsgPaddingY = (g_Config.m_ClChatTee ? (MESSAGE_TEE_SIZE - FONT_SIZE) : 0); + RealMsgPaddingY = 0; } for(int i = 0; i < MAX_LINES; i++) @@ -1258,7 +1256,7 @@ void CChat::OnRender() float Blend = Now > m_aLines[r].m_Time + 14 * time_freq() && !m_PrevShowChat ? 1.0f - (Now - m_aLines[r].m_Time - 14 * time_freq()) / (2.0f * time_freq()) : 1.0f; // Draw backgrounds for messages in one batch - if(g_Config.m_ClChatBackground) + if(!g_Config.m_ClChatOld) { Graphics()->TextureClear(); if(m_aLines[r].m_QuadContainerIndex != -1) @@ -1270,7 +1268,7 @@ void CChat::OnRender() if(m_aLines[r].m_TextContainerIndex != -1) { - if(g_Config.m_ClChatTee && m_aLines[r].m_HasRenderTee) + if(!g_Config.m_ClChatOld && m_aLines[r].m_HasRenderTee) { CTeeRenderInfo RenderInfo; RenderInfo.m_CustomColoredSkin = m_aLines[r].m_CustomColoredSkin; diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 54955226e..46e144172 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -1646,21 +1646,10 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) g_Config.m_ClShowChat ^= 1; } - bool IsOldChat = !(g_Config.m_ClChatTee || g_Config.m_ClChatBackground); - Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClChatTee, Localize("Use old chat style"), IsOldChat, &Button)) + if(DoButton_CheckBox(&g_Config.m_ClChatOld, Localize("Use old chat style"), g_Config.m_ClChatOld, &Button)) { - if(IsOldChat) - { - g_Config.m_ClChatTee = 1; - g_Config.m_ClChatBackground = 1; - } - else - { - g_Config.m_ClChatTee = 0; - g_Config.m_ClChatBackground = 0; - } + g_Config.m_ClChatOld ^= 1; GameClient()->m_pChat->RebuildChat(); } From c4786009353e8647df7630072470b9c990ac31c5 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 5 Nov 2020 20:19:29 +0100 Subject: [PATCH 039/144] Warn when connecting to new server with high gametime as suggested by HalfNoob on Discord --- src/game/client/components/menus_browser.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 973b02f63..dc61b42df 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -525,7 +525,12 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) const CServerInfo *pItem = ServerBrowser()->SortedGet(NewSelected); str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress, sizeof(g_Config.m_UiServerAddress)); if(Input()->MouseDoubleClick() && DoubleClicked) - Client()->Connect(g_Config.m_UiServerAddress); + { + if(Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) + m_Popup = POPUP_DISCONNECT; + else + Client()->Connect(g_Config.m_UiServerAddress); + } } //RenderTools()->DrawUIRect(&Status, ms_ColorTabbarActive, CUI::CORNER_B, 5.0f); @@ -681,7 +686,10 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) m_ConnectButton, &s_JoinButton, []() -> const char * { return Localize("Connect"); }, 0, &ButtonConnect, false, false, CUI::CORNER_ALL, 5, 0, vec4(0.7f, 1, 0.7f, 0.1f), vec4(0.7f, 1, 0.7f, 0.2f)) || m_EnterPressed) { - Client()->Connect(g_Config.m_UiServerAddress); + if(Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) + m_Popup = POPUP_DISCONNECT; + else + Client()->Connect(g_Config.m_UiServerAddress); m_EnterPressed = false; } } From 54946518dc54b8eabaa9e47c99ec6d7a852f345d Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Thu, 5 Nov 2020 20:38:37 +0100 Subject: [PATCH 040/144] Add block list for drivers --- src/engine/client/backend_sdl.cpp | 138 ++++++++++++++++++++++-- src/engine/client/backend_sdl.h | 12 +++ src/engine/client/graphics_threaded.cpp | 12 +++ src/engine/client/graphics_threaded.h | 3 + src/engine/warning.h | 2 +- 5 files changed, 155 insertions(+), 12 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 83c1a9940..861e32b0c 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -3800,6 +3800,93 @@ static void ParseVersionString(const GLubyte *pStr, int &VersionMajor, int &Vers } } +/* TODO: move this somewhere nice, generalize it more for other drivers / vendors */ +struct SBackEndDriverBlockList +{ + int m_VersionIdentifierMin; + int m_VersionIdentifierMax; + int m_VersionMajorMin; + int m_VersionMajorMax; + int m_VersionMinorMin; + int m_VersionMinorMax; + int m_VersionPatchMin; + int m_VersionPatchMax; + const char *m_pReason; +}; + +static SBackEndDriverBlockList gs_aBlockList[] = { + {26, 26, 20, 20, 100, 100, 7800, 7999, "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."}}; + +static const char *ParseBlocklistDriverVersions(const GLubyte *pVendorStrGL, const GLubyte *pVersionStrGL) +{ + const char *pVendorStr = (const char *)pVendorStrGL; + const char *pVersionStr = (const char *)pVersionStrGL; + if(str_find_nocase(pVendorStr, "Intel") != NULL) + { + const char *pVersionStrStart = str_find_nocase(pVersionStr, "Build "); + if(pVersionStrStart != NULL) + { + // ignore "Build ", after that, it should directly start with the driver version + pVersionStrStart += (ptrdiff_t)str_length("Build "); + + // get the "major" version + char aVersionStrHelper[MAX_PATH_LENGTH]; // the size is random, but shouldn't be too small probably + const char *pIdentifier = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); + bool CheckDriver = false; + int VIdentifier = -1; + int VMajor = -1; + int VMinor = -1; + int VPatch = -1; + if(pIdentifier != NULL) + { + pVersionStrStart = pIdentifier; + VIdentifier = str_toint(aVersionStrHelper); + const char *pMajor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); + if(pMajor != NULL) + { + pVersionStrStart = pMajor; + VMajor = str_toint(aVersionStrHelper); + const char *pMinor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); + if(pMinor != NULL) + { + pVersionStrStart = pMinor; + VMinor = str_toint(aVersionStrHelper); + const char *pPatch = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); + if(pPatch != NULL) + { + //pVersionStrStart = pPatch; + VPatch = str_toint(aVersionStrHelper); + CheckDriver = true; + } + } + } + } + + if(CheckDriver) + { + for(auto &BlockListItem : gs_aBlockList) + { + if(VIdentifier >= BlockListItem.m_VersionIdentifierMin && VIdentifier <= BlockListItem.m_VersionIdentifierMax) + { + if(VMajor >= BlockListItem.m_VersionMajorMin && VMajor <= BlockListItem.m_VersionMajorMax) + { + if(VMinor >= BlockListItem.m_VersionMinorMin && VMinor <= BlockListItem.m_VersionMinorMax) + { + if(VPatch >= BlockListItem.m_VersionPatchMin && VPatch <= BlockListItem.m_VersionPatchMax) + { + return BlockListItem.m_pReason; + } + } + } + } + } + } + } + } + + return NULL; +} + static const char *GetGLErrorName(GLenum Type) { if(Type == GL_DEBUG_TYPE_ERROR) @@ -3886,34 +3973,54 @@ void CCommandProcessorFragment_SDL::Cmd_Init(const SCommand_Init *pCommand) dbg_msg("gfx", "Requested OpenGL debug mode, but the driver does not support the required extension"); } + const GLubyte *pVendorString = glGetString(GL_VENDOR); + dbg_msg("opengl", "Vendor string: %s", (const char *)pVendorString); + // check what this context can do const GLubyte *pVersionString = glGetString(GL_VERSION); dbg_msg("opengl", "Version string: %s", (const char *)pVersionString); // parse version string ParseVersionString(pVersionString, pCommand->m_pCapabilities->m_ContextMajor, pCommand->m_pCapabilities->m_ContextMinor, pCommand->m_pCapabilities->m_ContextPatch); + *pCommand->m_pInitError = 0; + + const char *pErrString = ParseBlocklistDriverVersions(pVendorString, pVersionString); + //if the driver is buggy, and the requested GL version is the default, fallback + if(pErrString != NULL && pCommand->m_RequestedMajor == 3 && pCommand->m_RequestedMinor == 0 && pCommand->m_RequestedPatch == 0) + { + // fallback to lowest GL version + pCommand->m_pCapabilities->m_ContextMajor = 1; + pCommand->m_pCapabilities->m_ContextMinor = 5; + pCommand->m_pCapabilities->m_ContextPatch = 0; + + // set backend error string + *pCommand->m_pErrStringPtr = pErrString; + *pCommand->m_pInitError = -2; + } + int MajorV = pCommand->m_pCapabilities->m_ContextMajor; int MinorV = pCommand->m_pCapabilities->m_ContextMinor; - *pCommand->m_pInitError = 0; - - if(MajorV < pCommand->m_RequestedMajor) + if(*pCommand->m_pInitError == 0) { - *pCommand->m_pInitError = -2; - } - else if(MajorV == pCommand->m_RequestedMajor) - { - if(MinorV < pCommand->m_RequestedMinor) + if(MajorV < pCommand->m_RequestedMajor) { *pCommand->m_pInitError = -2; } - else if(MinorV == pCommand->m_RequestedMinor) + else if(MajorV == pCommand->m_RequestedMajor) { - int PatchV = pCommand->m_pCapabilities->m_ContextPatch; - if(PatchV < pCommand->m_RequestedPatch) + if(MinorV < pCommand->m_RequestedMinor) { *pCommand->m_pInitError = -2; } + else if(MinorV == pCommand->m_RequestedMinor) + { + int PatchV = pCommand->m_pCapabilities->m_ContextPatch; + if(PatchV < pCommand->m_RequestedPatch) + { + *pCommand->m_pInitError = -2; + } + } } } @@ -4648,6 +4755,7 @@ int CGraphicsBackend_SDL_OpenGL::Init(const char *pName, int *Screen, int *pWidt GetGlewVersion(GlewMajor, GlewMinor, GlewPatch); int InitError = 0; + const char *pErrorStr = NULL; InitError = IsVersionSupportedGlew(g_Config.m_GfxOpenGLMajor, g_Config.m_GfxOpenGLMinor, g_Config.m_GfxOpenGLPatch, GlewMajor, GlewMinor, GlewPatch); @@ -4672,6 +4780,8 @@ int CGraphicsBackend_SDL_OpenGL::Init(const char *pName, int *Screen, int *pWidt m_pProcessor = new CCommandProcessor_SDL_OpenGL(g_Config.m_GfxOpenGLMajor, g_Config.m_GfxOpenGLMinor, g_Config.m_GfxOpenGLPatch); StartProcessor(m_pProcessor); + mem_zero(m_aErrorString, sizeof(m_aErrorString) / sizeof(m_aErrorString[0])); + // issue init commands for OpenGL and SDL CCommandBuffer CmdBuffer(1024, 512); //run sdl first to have the context in the thread @@ -4686,6 +4796,7 @@ int CGraphicsBackend_SDL_OpenGL::Init(const char *pName, int *Screen, int *pWidt CmdSDL.m_GlewMinor = GlewMinor; CmdSDL.m_GlewPatch = GlewPatch; CmdSDL.m_pInitError = &InitError; + CmdSDL.m_pErrStringPtr = &pErrorStr; CmdBuffer.AddCommand(CmdSDL); RunBuffer(&CmdBuffer); WaitForIdle(); @@ -4741,6 +4852,11 @@ int CGraphicsBackend_SDL_OpenGL::Init(const char *pName, int *Screen, int *pWidt g_Config.m_GfxOpenGLPatch = m_Capabilites.m_ContextPatch; } + if(pErrorStr != NULL) + { + str_copy(m_aErrorString, pErrorStr, sizeof(m_aErrorString) / sizeof(m_aErrorString[0])); + } + return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_OPENGL_VERSION_FAILED; } diff --git a/src/engine/client/backend_sdl.h b/src/engine/client/backend_sdl.h index a686c53a7..8dae2d279 100644 --- a/src/engine/client/backend_sdl.h +++ b/src/engine/client/backend_sdl.h @@ -419,6 +419,8 @@ public: SDL_GLContext m_GLContext; SBackendCapabilites *m_pCapabilities; + const char **m_pErrStringPtr; + int *m_pInitError; int m_RequestedMajor; @@ -487,6 +489,8 @@ class CGraphicsBackend_SDL_OpenGL : public CGraphicsBackend_Threaded bool m_UseNewOpenGL; + char m_aErrorString[256]; + public: virtual int Init(const char *pName, int *Screen, int *pWidth, int *pHeight, int FsaaSamples, int Flags, int *pDesktopWidth, int *pDesktopHeight, int *pCurrentWidth, int *pCurrentHeight, class IStorage *pStorage); virtual int Shutdown(); @@ -512,6 +516,14 @@ public: virtual bool HasTextBuffering() { return m_Capabilites.m_TextBuffering; } virtual bool HasQuadContainerBuffering() { return m_Capabilites.m_QuadContainerBuffering; } virtual bool Has2DTextureArrays() { return m_Capabilites.m_2DArrayTextures; } + + virtual const char *GetErrorString() + { + if(m_aErrorString[0] != '\0') + return m_aErrorString; + + return NULL; + } }; #endif // ENGINE_CLIENT_BACKEND_SDL_H diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index b316f062c..f0f3cc695 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -2149,6 +2149,7 @@ int CGraphics_Threaded::IssueInit() Flags |= IGraphicsBackend::INITFLAG_RESIZABLE; int r = m_pBackend->Init("DDNet Client", &g_Config.m_GfxScreen, &g_Config.m_GfxScreenWidth, &g_Config.m_GfxScreenHeight, g_Config.m_GfxFsaaSamples, Flags, &m_DesktopScreenWidth, &m_DesktopScreenHeight, &m_ScreenWidth, &m_ScreenHeight, m_pStorage); + AddBackEndWarningIfExists(); m_IsNewOpenGL = m_pBackend->IsNewOpenGL(); m_OpenGLTileBufferingEnabled = m_IsNewOpenGL || m_pBackend->HasTileBuffering(); m_OpenGLQuadBufferingEnabled = m_IsNewOpenGL || m_pBackend->HasQuadBuffering(); @@ -2158,6 +2159,17 @@ int CGraphics_Threaded::IssueInit() return r; } +void CGraphics_Threaded::AddBackEndWarningIfExists() +{ + const char *pErrStr = m_pBackend->GetErrorString(); + if(pErrStr != NULL) + { + SWarning NewWarning; + str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg), "%s", Localize(pErrStr)); + m_Warnings.emplace_back(NewWarning); + } +} + int CGraphics_Threaded::InitWindow() { int ErrorCode = IssueInit(); diff --git a/src/engine/client/graphics_threaded.h b/src/engine/client/graphics_threaded.h index 2a2e224b5..13e0c4188 100644 --- a/src/engine/client/graphics_threaded.h +++ b/src/engine/client/graphics_threaded.h @@ -671,6 +671,7 @@ public: virtual bool HasTextBuffering() { return false; } virtual bool HasQuadContainerBuffering() { return false; } virtual bool Has2DTextureArrays() { return false; } + virtual const char *GetErrorString() { return NULL; } }; class CGraphics_Threaded : public IEngineGraphics @@ -801,6 +802,8 @@ class CGraphics_Threaded : public IEngineGraphics void KickCommandBuffer(); + void AddBackEndWarningIfExists(); + int IssueInit(); int InitWindow(); diff --git a/src/engine/warning.h b/src/engine/warning.h index 1fcd01ca8..64941b504 100644 --- a/src/engine/warning.h +++ b/src/engine/warning.h @@ -10,7 +10,7 @@ struct SWarning { str_copy(m_aWarningMsg, pMsg, sizeof(m_aWarningMsg)); } - char m_aWarningMsg[128]; + char m_aWarningMsg[256]; bool m_WasShown; }; From 75b7474443ca323bb4df44122b4fad39001a2881 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 6 Nov 2020 09:25:21 +0100 Subject: [PATCH 041/144] Add cl_showhud_timer option (requested by hussainx3) --- src/game/client/components/hud.cpp | 3 ++- src/game/variables.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index 2a388332c..b3b9f6158 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -838,7 +838,8 @@ void CHud::OnRender() RenderSpectatorHud(); } - RenderGameTimer(); + if(g_Config.m_ClShowhudTimer) + RenderGameTimer(); RenderPauseNotification(); RenderSuddenDeath(); if(g_Config.m_ClShowhudScore) diff --git a/src/game/variables.h b/src/game/variables.h index e0b3b5b0b..68b9c803f 100644 --- a/src/game/variables.h +++ b/src/game/variables.h @@ -40,6 +40,7 @@ MACRO_CONFIG_INT(ClAutoswitchWeaponsOutOfAmmo, cl_autoswitch_weapons_out_of_ammo MACRO_CONFIG_INT(ClShowhud, cl_showhud, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD") 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(ClShowRecord, cl_showrecord, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show old style DDRace client records") MACRO_CONFIG_INT(ClShowNotifications, cl_shownotifications, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Make the client notify when someone highlights you") MACRO_CONFIG_INT(ClShowEmotes, cl_showemotes, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show tee emotes") From 5c79e9aa80d7080a4f2bf10570c4dad56841af2d Mon Sep 17 00:00:00 2001 From: def Date: Fri, 6 Nov 2020 17:15:47 +0100 Subject: [PATCH 042/144] Less deep nesting in ParseBlocklistDriverVersions --- src/engine/client/backend_sdl.cpp | 108 +++++++++++++----------------- 1 file changed, 48 insertions(+), 60 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 861e32b0c..8183f6cf1 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -3819,69 +3819,57 @@ static SBackEndDriverBlockList gs_aBlockList[] = { static const char *ParseBlocklistDriverVersions(const GLubyte *pVendorStrGL, const GLubyte *pVersionStrGL) { - const char *pVendorStr = (const char *)pVendorStrGL; - const char *pVersionStr = (const char *)pVersionStrGL; - if(str_find_nocase(pVendorStr, "Intel") != NULL) + if(str_find_nocase((const char *)pVendorStrGL, "Intel") == NULL) + return NULL; + + const char *pVersionStrStart = str_find_nocase((const char *)pVersionStrGL, "Build "); + if(pVersionStrStart == NULL) + return NULL; + + // ignore "Build ", after that, it should directly start with the driver version + pVersionStrStart += (ptrdiff_t)str_length("Build "); + + // get the "major" version + char aVersionStrHelper[512]; // the size is random, but shouldn't be too small probably + const char *pIdentifier = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); + if(pIdentifier == NULL) + return NULL; + + pVersionStrStart = pIdentifier; + int VIdentifier = str_toint(aVersionStrHelper); + const char *pMajor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); + if(pMajor == NULL) + return NULL; + + pVersionStrStart = pMajor; + int VMajor = str_toint(aVersionStrHelper); + const char *pMinor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); + if(pMinor == NULL) + return NULL; + + pVersionStrStart = pMinor; + int VMinor = str_toint(aVersionStrHelper); + const char *pPatch = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); + if(pPatch == NULL) + return NULL; + + int VPatch = str_toint(aVersionStrHelper); + + for(auto &BlockListItem : gs_aBlockList) { - const char *pVersionStrStart = str_find_nocase(pVersionStr, "Build "); - if(pVersionStrStart != NULL) - { - // ignore "Build ", after that, it should directly start with the driver version - pVersionStrStart += (ptrdiff_t)str_length("Build "); + if(VIdentifier < BlockListItem.m_VersionIdentifierMin || VIdentifier > BlockListItem.m_VersionIdentifierMax) + continue; - // get the "major" version - char aVersionStrHelper[MAX_PATH_LENGTH]; // the size is random, but shouldn't be too small probably - const char *pIdentifier = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); - bool CheckDriver = false; - int VIdentifier = -1; - int VMajor = -1; - int VMinor = -1; - int VPatch = -1; - if(pIdentifier != NULL) - { - pVersionStrStart = pIdentifier; - VIdentifier = str_toint(aVersionStrHelper); - const char *pMajor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); - if(pMajor != NULL) - { - pVersionStrStart = pMajor; - VMajor = str_toint(aVersionStrHelper); - const char *pMinor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); - if(pMinor != NULL) - { - pVersionStrStart = pMinor; - VMinor = str_toint(aVersionStrHelper); - const char *pPatch = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper) / sizeof(aVersionStrHelper[0])); - if(pPatch != NULL) - { - //pVersionStrStart = pPatch; - VPatch = str_toint(aVersionStrHelper); - CheckDriver = true; - } - } - } - } + if(VMajor < BlockListItem.m_VersionMajorMin || VMajor > BlockListItem.m_VersionMajorMax) + continue; - if(CheckDriver) - { - for(auto &BlockListItem : gs_aBlockList) - { - if(VIdentifier >= BlockListItem.m_VersionIdentifierMin && VIdentifier <= BlockListItem.m_VersionIdentifierMax) - { - if(VMajor >= BlockListItem.m_VersionMajorMin && VMajor <= BlockListItem.m_VersionMajorMax) - { - if(VMinor >= BlockListItem.m_VersionMinorMin && VMinor <= BlockListItem.m_VersionMinorMax) - { - if(VPatch >= BlockListItem.m_VersionPatchMin && VPatch <= BlockListItem.m_VersionPatchMax) - { - return BlockListItem.m_pReason; - } - } - } - } - } - } - } + if(VMinor < BlockListItem.m_VersionMinorMin || VMinor > BlockListItem.m_VersionMinorMax) + continue; + + if(VPatch < BlockListItem.m_VersionPatchMin || VPatch > BlockListItem.m_VersionPatchMax) + continue; + + return BlockListItem.m_pReason; } return NULL; From 3b90f97aa5083f79d8f2b824db63fa35593e3621 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 6 Nov 2020 18:18:55 +0100 Subject: [PATCH 043/144] Pull out blocklist_driver.cpp and unit test it --- CMakeLists.txt | 5 ++ src/engine/client/backend_sdl.cpp | 91 +++----------------------- src/engine/client/backend_sdl.h | 1 + src/engine/client/blocklist_driver.cpp | 66 +++++++++++++++++++ src/engine/client/blocklist_driver.h | 6 ++ src/test/blocklist_driver.cpp | 18 +++++ 6 files changed, 104 insertions(+), 83 deletions(-) create mode 100644 src/engine/client/blocklist_driver.cpp create mode 100644 src/engine/client/blocklist_driver.h create mode 100644 src/test/blocklist_driver.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c06e1bea..10efdedee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1644,6 +1644,8 @@ if(CLIENT) set_src(ENGINE_CLIENT GLOB src/engine/client backend_sdl.cpp backend_sdl.h + blocklist_driver.cpp + blocklist_driver.h client.cpp client.h demoedit.cpp @@ -2114,6 +2116,7 @@ if(GTEST_FOUND OR DOWNLOAD_GTEST) set_src(TESTS GLOB src/test aio.cpp bezier.cpp + blocklist_driver.cpp color.cpp csv.cpp datafile.cpp @@ -2135,6 +2138,8 @@ if(GTEST_FOUND OR DOWNLOAD_GTEST) unix.cpp ) set(TESTS_EXTRA + src/engine/client/blocklist_driver.cpp + src/engine/client/blocklist_driver.h src/engine/server/name_ban.cpp src/engine/server/name_ban.h src/game/server/teehistorian.cpp diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 8183f6cf1..0c8e1f674 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -3754,7 +3754,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadContainerAsSpriteMultipl // ------------ CCommandProcessorFragment_SDL -static void ParseVersionString(const GLubyte *pStr, int &VersionMajor, int &VersionMinor, int &VersionPatch) +static void ParseVersionString(const char *pStr, int &VersionMajor, int &VersionMinor, int &VersionPatch) { if(pStr) { @@ -3765,12 +3765,12 @@ static void ParseVersionString(const GLubyte *pStr, int &VersionMajor, int &Vers bool LastWasNumber = false; while(*pStr && TotalNumbersPassed < 3) { - if(*pStr >= (GLubyte)'0' && *pStr <= (GLubyte)'9') + if(*pStr >= '0' && *pStr <= '9') { aCurNumberStr[CurNumberStrLen++] = (char)*pStr; LastWasNumber = true; } - else if(LastWasNumber && (*pStr == (GLubyte)'.' || *pStr == (GLubyte)' ' || *pStr == (GLubyte)'\0')) + else if(LastWasNumber && (*pStr == '.' || *pStr == ' ' || *pStr == '\0')) { int CurNumber = 0; if(CurNumberStrLen > 0) @@ -3783,7 +3783,7 @@ static void ParseVersionString(const GLubyte *pStr, int &VersionMajor, int &Vers LastWasNumber = false; - if(*pStr != (GLubyte)'.') + if(*pStr != '.') break; } else @@ -3800,81 +3800,6 @@ static void ParseVersionString(const GLubyte *pStr, int &VersionMajor, int &Vers } } -/* TODO: move this somewhere nice, generalize it more for other drivers / vendors */ -struct SBackEndDriverBlockList -{ - int m_VersionIdentifierMin; - int m_VersionIdentifierMax; - int m_VersionMajorMin; - int m_VersionMajorMax; - int m_VersionMinorMin; - int m_VersionMinorMax; - int m_VersionPatchMin; - int m_VersionPatchMax; - const char *m_pReason; -}; - -static SBackEndDriverBlockList gs_aBlockList[] = { - {26, 26, 20, 20, 100, 100, 7800, 7999, "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."}}; - -static const char *ParseBlocklistDriverVersions(const GLubyte *pVendorStrGL, const GLubyte *pVersionStrGL) -{ - if(str_find_nocase((const char *)pVendorStrGL, "Intel") == NULL) - return NULL; - - const char *pVersionStrStart = str_find_nocase((const char *)pVersionStrGL, "Build "); - if(pVersionStrStart == NULL) - return NULL; - - // ignore "Build ", after that, it should directly start with the driver version - pVersionStrStart += (ptrdiff_t)str_length("Build "); - - // get the "major" version - char aVersionStrHelper[512]; // the size is random, but shouldn't be too small probably - const char *pIdentifier = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); - if(pIdentifier == NULL) - return NULL; - - pVersionStrStart = pIdentifier; - int VIdentifier = str_toint(aVersionStrHelper); - const char *pMajor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); - if(pMajor == NULL) - return NULL; - - pVersionStrStart = pMajor; - int VMajor = str_toint(aVersionStrHelper); - const char *pMinor = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); - if(pMinor == NULL) - return NULL; - - pVersionStrStart = pMinor; - int VMinor = str_toint(aVersionStrHelper); - const char *pPatch = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); - if(pPatch == NULL) - return NULL; - - int VPatch = str_toint(aVersionStrHelper); - - for(auto &BlockListItem : gs_aBlockList) - { - if(VIdentifier < BlockListItem.m_VersionIdentifierMin || VIdentifier > BlockListItem.m_VersionIdentifierMax) - continue; - - if(VMajor < BlockListItem.m_VersionMajorMin || VMajor > BlockListItem.m_VersionMajorMax) - continue; - - if(VMinor < BlockListItem.m_VersionMinorMin || VMinor > BlockListItem.m_VersionMinorMax) - continue; - - if(VPatch < BlockListItem.m_VersionPatchMin || VPatch > BlockListItem.m_VersionPatchMax) - continue; - - return BlockListItem.m_pReason; - } - - return NULL; -} - static const char *GetGLErrorName(GLenum Type) { if(Type == GL_DEBUG_TYPE_ERROR) @@ -3961,12 +3886,12 @@ void CCommandProcessorFragment_SDL::Cmd_Init(const SCommand_Init *pCommand) dbg_msg("gfx", "Requested OpenGL debug mode, but the driver does not support the required extension"); } - const GLubyte *pVendorString = glGetString(GL_VENDOR); - dbg_msg("opengl", "Vendor string: %s", (const char *)pVendorString); + const char *pVendorString = (const char *)glGetString(GL_VENDOR); + dbg_msg("opengl", "Vendor string: %s", pVendorString); // check what this context can do - const GLubyte *pVersionString = glGetString(GL_VERSION); - dbg_msg("opengl", "Version string: %s", (const char *)pVersionString); + const char *pVersionString = (const char *)glGetString(GL_VERSION); + dbg_msg("opengl", "Version string: %s", pVersionString); // parse version string ParseVersionString(pVersionString, pCommand->m_pCapabilities->m_ContextMajor, pCommand->m_pCapabilities->m_ContextMinor, pCommand->m_pCapabilities->m_ContextPatch); diff --git a/src/engine/client/backend_sdl.h b/src/engine/client/backend_sdl.h index 8dae2d279..550a62c71 100644 --- a/src/engine/client/backend_sdl.h +++ b/src/engine/client/backend_sdl.h @@ -4,6 +4,7 @@ #include "SDL.h" #include "SDL_opengl.h" +#include "blocklist_driver.h" #include "graphics_threaded.h" #include diff --git a/src/engine/client/blocklist_driver.cpp b/src/engine/client/blocklist_driver.cpp new file mode 100644 index 000000000..1df09d06b --- /dev/null +++ b/src/engine/client/blocklist_driver.cpp @@ -0,0 +1,66 @@ +#include "blocklist_driver.h" + +#include + +#define VERSION_PARTS 4 + +struct SVersion +{ + int m_Parts[VERSION_PARTS]; + + bool operator<=(const SVersion &Other) const + { + for(int i = 0; i < VERSION_PARTS; i++) + { + if(m_Parts[i] < Other.m_Parts[i]) + return true; + if(m_Parts[i] > Other.m_Parts[i]) + return false; + } + return true; + } +}; + +/* TODO: generalize it more for other drivers / vendors */ +struct SBackEndDriverBlockList +{ + SVersion m_VersionMin; + SVersion m_VersionMax; + const char *m_pReason; +}; + +static SBackEndDriverBlockList gs_aBlockList[] = { + {{26, 20, 100, 7800}, {26, 20, 100, 7999}, "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."}}; + +const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr) +{ + if(str_find_nocase(pVendorStr, "Intel") == NULL) + return NULL; + + const char *pVersionStrStart = str_find_nocase(pVersionStr, "Build "); + if(pVersionStrStart == NULL) + return NULL; + + // ignore "Build ", after that, it should directly start with the driver version + pVersionStrStart += (ptrdiff_t)str_length("Build "); + + char aVersionStrHelper[512]; // the size is random, but shouldn't be too small probably + + SVersion Version; + for(int &VersionPart : Version.m_Parts) + { + pVersionStrStart = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); + if(pVersionStrStart == NULL) + return NULL; + + VersionPart = str_toint(aVersionStrHelper); + } + + for(const auto &BlockListItem : gs_aBlockList) + { + if(BlockListItem.m_VersionMin <= Version && Version <= BlockListItem.m_VersionMax) + return BlockListItem.m_pReason; + } + + return NULL; +} diff --git a/src/engine/client/blocklist_driver.h b/src/engine/client/blocklist_driver.h new file mode 100644 index 000000000..8baa032a1 --- /dev/null +++ b/src/engine/client/blocklist_driver.h @@ -0,0 +1,6 @@ +#ifndef ENGINE_CLIENT_BLOCKLIST_DRIVER_H +#define ENGINE_CLIENT_BLOCKLIST_DRIVER_H + +const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr); + +#endif // ENGINE_CLIENT_BLOCKLIST_DRIVER_H diff --git a/src/test/blocklist_driver.cpp b/src/test/blocklist_driver.cpp new file mode 100644 index 000000000..d3e601881 --- /dev/null +++ b/src/test/blocklist_driver.cpp @@ -0,0 +1,18 @@ +#include + +#include + +TEST(BlocklistDriver, Valid) +{ + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7810"), "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7926"), "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7985"), "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."); +} + +TEST(BlocklistDriver, Invalid) +{ + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 25.20.100.7810"), NULL); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7799"), NULL); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.8000"), NULL); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 27.20.100.7900"), NULL); +} From 62e291b4d107866090b8e0f1b24dc0e2b3e39033 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 6 Nov 2020 19:00:23 +0100 Subject: [PATCH 044/144] Allow opengl version 2.0 --- src/engine/client/backend_sdl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 0c8e1f674..8a1e56cb2 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -3901,9 +3901,9 @@ void CCommandProcessorFragment_SDL::Cmd_Init(const SCommand_Init *pCommand) //if the driver is buggy, and the requested GL version is the default, fallback if(pErrString != NULL && pCommand->m_RequestedMajor == 3 && pCommand->m_RequestedMinor == 0 && pCommand->m_RequestedPatch == 0) { - // fallback to lowest GL version - pCommand->m_pCapabilities->m_ContextMajor = 1; - pCommand->m_pCapabilities->m_ContextMinor = 5; + // fallback to known good GL version + pCommand->m_pCapabilities->m_ContextMajor = 2; + pCommand->m_pCapabilities->m_ContextMinor = 0; pCommand->m_pCapabilities->m_ContextPatch = 0; // set backend error string From 373275dc6cf0b84d4ab4cddc32e107a3c1a1d348 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 00:00:21 +0100 Subject: [PATCH 045/144] Connect to menu: Don't disconnect on enter (fixes #3259) --- src/game/client/components/menus.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index adedc49a7..b7383f829 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -1605,7 +1605,7 @@ int CMenus::Render() Part.VMargin(120.0f, &Part); static int s_Button = 0; - if(DoButton_Menu(&s_Button, pButtonText, 0, &Part) || m_EscapePressed || m_EnterPressed) + if(DoButton_Menu(&s_Button, pButtonText, 0, &Part) || m_EscapePressed || (m_EnterPressed && m_Popup != POPUP_CONNECTING)) { Client()->Disconnect(); m_Popup = POPUP_NONE; From 53c52d3c8bec6d48870cb890bbaa0e6d6856d5a5 Mon Sep 17 00:00:00 2001 From: Vlad <51330274+gerdoe-jr@users.noreply.github.com> Date: Sat, 7 Nov 2020 03:38:56 +0300 Subject: [PATCH 046/144] Update russian.txt --- data/languages/russian.txt | 48 +++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 300ece713..57e4676a7 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1221,79 +1221,79 @@ Play == Играть Saving ddnet-settings.cfg failed -== +== Неудачное сохранение ddnet-settings.cfg Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== Отладочный режим включен. Нажмите Ctrl+Shift+D, чтобы выйти. Existing Player -== +== Существующий игрок Your nickname '%s' is already used (%d points). Do you still want to use it? -== +== Твой никнейм '%s' уже существует (%d поинтов). Вы уверены, что хотите использовать его? Checking for existing player with your name -== +== Проверка существования игрока с таким же именем Theme -== +== Тема Demos directory -== +== Папка с демо Smooth Camera -== +== Плавная камера Themes directory -== +== Папка с темами Skin Database -== +== База данных скинов Skins directory -== +== Папка со скинами Game sound volume -== +== Громкость игры Chat sound volume -== +== Громкость звуков чата Background music volume -== +== Громкость фоновой музыки Assets -== +== Графика Use old chat style -== +== Использовать старый чат Highlight -== +== Подсветка Use current map as background -== +== Использовать данную карту как фон Entities == Emoticons -== +== Эмоции Particles -== +== Частицы Assets directory -== +== Папка с графикой Manual == Race -== +== Гонка Auto -== +== Авто Replay -== +== Запись From 81a11532c52f63be4570516735e9ca9b5f62b436 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sat, 7 Nov 2020 06:54:08 +0100 Subject: [PATCH 047/144] Track the driver state --- src/engine/client/backend_sdl.cpp | 29 +++++++++++++++++++++----- src/engine/client/blocklist_driver.cpp | 15 +++++++++++-- src/engine/client/blocklist_driver.h | 2 +- src/engine/shared/config_variables.h | 1 + src/test/blocklist_driver.cpp | 16 +++++++------- 5 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 8a1e56cb2..aeca5c88f 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -3897,18 +3897,37 @@ void CCommandProcessorFragment_SDL::Cmd_Init(const SCommand_Init *pCommand) *pCommand->m_pInitError = 0; - const char *pErrString = ParseBlocklistDriverVersions(pVendorString, pVersionString); + int BlocklistMajor = -1, BlocklistMinor = -1, BlocklistPatch = -1; + const char *pErrString = ParseBlocklistDriverVersions(pVendorString, pVersionString, BlocklistMajor, BlocklistMinor, BlocklistPatch); //if the driver is buggy, and the requested GL version is the default, fallback if(pErrString != NULL && pCommand->m_RequestedMajor == 3 && pCommand->m_RequestedMinor == 0 && pCommand->m_RequestedPatch == 0) { - // fallback to known good GL version - pCommand->m_pCapabilities->m_ContextMajor = 2; + // if not already in the error state, set the GL version + if(g_Config.m_GfxDriverIsBlocked == 0) + { + // fallback to known good GL version + pCommand->m_pCapabilities->m_ContextMajor = BlocklistMajor; + pCommand->m_pCapabilities->m_ContextMinor = BlocklistMinor; + pCommand->m_pCapabilities->m_ContextPatch = BlocklistPatch; + + // set backend error string + *pCommand->m_pErrStringPtr = pErrString; + *pCommand->m_pInitError = -2; + + g_Config.m_GfxDriverIsBlocked = 1; + } + } + // if the driver was in a blocked error state, but is not anymore, reset all config variables + else if(pErrString == NULL && g_Config.m_GfxDriverIsBlocked == 1) + { + pCommand->m_pCapabilities->m_ContextMajor = 3; pCommand->m_pCapabilities->m_ContextMinor = 0; pCommand->m_pCapabilities->m_ContextPatch = 0; - // set backend error string - *pCommand->m_pErrStringPtr = pErrString; + // tell the caller to reinitialize the context *pCommand->m_pInitError = -2; + + g_Config.m_GfxDriverIsBlocked = 0; } int MajorV = pCommand->m_pCapabilities->m_ContextMajor; diff --git a/src/engine/client/blocklist_driver.cpp b/src/engine/client/blocklist_driver.cpp index 1df09d06b..db592b66d 100644 --- a/src/engine/client/blocklist_driver.cpp +++ b/src/engine/client/blocklist_driver.cpp @@ -26,13 +26,19 @@ struct SBackEndDriverBlockList { SVersion m_VersionMin; SVersion m_VersionMax; + + // the OpenGL version, that is supported + int m_AllowedMajor; + int m_AllowedMinor; + int m_AllowedPatch; + const char *m_pReason; }; static SBackEndDriverBlockList gs_aBlockList[] = { - {{26, 20, 100, 7800}, {26, 20, 100, 7999}, "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."}}; + {{26, 20, 100, 7800}, {26, 20, 100, 7999}, 2, 0, 0, "This Intel driver version can cause crashes, please update it to a newer version."}}; -const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr) +const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr, int &BlocklistMajor, int &BlocklistMinor, int &BlocklistPatch) { if(str_find_nocase(pVendorStr, "Intel") == NULL) return NULL; @@ -59,7 +65,12 @@ const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVe for(const auto &BlockListItem : gs_aBlockList) { if(BlockListItem.m_VersionMin <= Version && Version <= BlockListItem.m_VersionMax) + { + BlocklistMajor = BlockListItem.m_AllowedMajor; + BlocklistMinor = BlockListItem.m_AllowedMinor; + BlocklistPatch = BlockListItem.m_AllowedPatch; return BlockListItem.m_pReason; + } } return NULL; diff --git a/src/engine/client/blocklist_driver.h b/src/engine/client/blocklist_driver.h index 8baa032a1..310310b4b 100644 --- a/src/engine/client/blocklist_driver.h +++ b/src/engine/client/blocklist_driver.h @@ -1,6 +1,6 @@ #ifndef ENGINE_CLIENT_BLOCKLIST_DRIVER_H #define ENGINE_CLIENT_BLOCKLIST_DRIVER_H -const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr); +const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr, int &BlocklistMajor, int &BlocklistMinor, int &BlocklistPatch); #endif // ENGINE_CLIENT_BLOCKLIST_DRIVER_H diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index f46478a25..152c04798 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -395,6 +395,7 @@ MACRO_CONFIG_INT(GfxOpenGLPatch, gfx_opengl_patch, 0, 0, 10, CFGFLAG_SAVE | CFGF MACRO_CONFIG_INT(GfxOpenGLTextureLODBIAS, gfx_opengl_texture_lod_bias, -500, -15000, 15000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "The lod bias for OpenGL texture sampling multiplied by 1000") MACRO_CONFIG_INT(Gfx3DTextureAnalysisDone, gfx_3d_texture_analysis_done, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Analyzed, if sampling 3D/2D array textures was correct") +MACRO_CONFIG_INT(GfxDriverIsBlocked, gfx_driver_is_blocked, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "If 1, the current driver is in a blocked error state.") #if !defined(CONF_PLATFORM_MACOSX) MACRO_CONFIG_INT(GfxEnableTextureUnitOptimization, gfx_enable_texture_unit_optimization, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Use multiple texture units, instead of only one.") #else diff --git a/src/test/blocklist_driver.cpp b/src/test/blocklist_driver.cpp index d3e601881..13d2ecbac 100644 --- a/src/test/blocklist_driver.cpp +++ b/src/test/blocklist_driver.cpp @@ -4,15 +4,17 @@ TEST(BlocklistDriver, Valid) { - EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7810"), "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."); - EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7926"), "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."); - EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7985"), "This Intel driver version can cause crashes, please update it to a newer version and remove any gfx_opengl* config from ddnet_settings.cfg."); + int Major, Minor, Patch; + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7810", Major, Minor, Patch), "This Intel driver version can cause crashes, please update it to a newer version."); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7926", Major, Minor, Patch), "This Intel driver version can cause crashes, please update it to a newer version."); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7985", Major, Minor, Patch), "This Intel driver version can cause crashes, please update it to a newer version."); } TEST(BlocklistDriver, Invalid) { - EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 25.20.100.7810"), NULL); - EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7799"), NULL); - EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.8000"), NULL); - EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 27.20.100.7900"), NULL); + int Major, Minor, Patch; + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 25.20.100.7810", Major, Minor, Patch), NULL); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7799", Major, Minor, Patch), NULL); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.8000", Major, Minor, Patch), NULL); + EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 27.20.100.7900", Major, Minor, Patch), NULL); } From 254c970a8e903dec50354124e00bffee9a854ed0 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 11:00:30 +0100 Subject: [PATCH 048/144] Fix behaviour with cl_confirm_disconnect_time 0 --- src/game/client/components/menus_browser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index dc61b42df..0b553caf5 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -526,7 +526,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress, sizeof(g_Config.m_UiServerAddress)); if(Input()->MouseDoubleClick() && DoubleClicked) { - if(Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) + if(Client()->State() == IClient::STATE_ONLINE && Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) m_Popup = POPUP_DISCONNECT; else Client()->Connect(g_Config.m_UiServerAddress); @@ -686,7 +686,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) m_ConnectButton, &s_JoinButton, []() -> const char * { return Localize("Connect"); }, 0, &ButtonConnect, false, false, CUI::CORNER_ALL, 5, 0, vec4(0.7f, 1, 0.7f, 0.1f), vec4(0.7f, 1, 0.7f, 0.2f)) || m_EnterPressed) { - if(Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) + if(Client()->State() == IClient::STATE_ONLINE && Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) m_Popup = POPUP_DISCONNECT; else Client()->Connect(g_Config.m_UiServerAddress); From d0437df51d2745a82001f18ea02f01a3ad848fc6 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 11:29:23 +0100 Subject: [PATCH 049/144] Smooth Camera -> Smooth Dynamic Camera, only show if dyncam active As suggested by Pipou --- src/game/client/components/camera.cpp | 8 +++---- src/game/client/components/menus_settings.cpp | 21 +++++++++++-------- src/game/variables.h | 4 ++-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/game/client/components/camera.cpp b/src/game/client/components/camera.cpp index 2f83da6e2..75a4aff08 100644 --- a/src/game/client/components/camera.cpp +++ b/src/game/client/components/camera.cpp @@ -129,10 +129,10 @@ void CCamera::OnRender() static vec2 s_CurrentCameraOffset[2] = {vec2(0, 0), vec2(0, 0)}; static float s_SpeedBias = 0.5f; - if(g_Config.m_ClCameraSmoothness > 0) + if(g_Config.m_ClDyncamSmoothness > 0) { - float CameraSpeed = (1.0f - (g_Config.m_ClCameraSmoothness / 100.0f)) * 9.5f + 0.5f; - float CameraStabilizingFactor = 1 + g_Config.m_ClCameraStabilizing / 100.0f; + float CameraSpeed = (1.0f - (g_Config.m_ClDyncamSmoothness / 100.0f)) * 9.5f + 0.5f; + float CameraStabilizingFactor = 1 + g_Config.m_ClDyncamStabilizing / 100.0f; s_SpeedBias += CameraSpeed * DeltaTime; if(g_Config.m_ClDyncam) @@ -158,7 +158,7 @@ void CCamera::OnRender() TargetCameraOffset = normalize(m_pClient->m_pControls->m_MousePos[g_Config.m_ClDummy]) * OffsetAmount; } - if(g_Config.m_ClCameraSmoothness > 0) + if(g_Config.m_ClDyncamSmoothness > 0) s_CurrentCameraOffset[g_Config.m_ClDummy] += (TargetCameraOffset - s_CurrentCameraOffset[g_Config.m_ClDummy]) * minimum(DeltaTime * s_SpeedBias, 1.0f); else s_CurrentCameraOffset[g_Config.m_ClDummy] = TargetCameraOffset; diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 54955226e..bf5b1f908 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -107,19 +107,22 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView) } } - // smooth camera + // smooth dynamic camera Left.HSplitTop(5.0f, 0, &Left); Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClCameraSmoothness, Localize("Smooth Camera"), g_Config.m_ClCameraSmoothness, &Button)) + if(g_Config.m_ClDyncam) { - if(g_Config.m_ClCameraSmoothness) + if(DoButton_CheckBox(&g_Config.m_ClDyncamSmoothness, Localize("Smooth Dynamic Camera"), g_Config.m_ClDyncamSmoothness, &Button)) { - g_Config.m_ClCameraSmoothness = 0; - } - else - { - g_Config.m_ClCameraSmoothness = 50; - g_Config.m_ClCameraStabilizing = 50; + if(g_Config.m_ClDyncamSmoothness) + { + g_Config.m_ClDyncamSmoothness = 0; + } + else + { + g_Config.m_ClDyncamSmoothness = 50; + g_Config.m_ClDyncamStabilizing = 50; + } } } diff --git a/src/game/variables.h b/src/game/variables.h index e0b3b5b0b..1d89f6d6b 100644 --- a/src/game/variables.h +++ b/src/game/variables.h @@ -71,8 +71,8 @@ MACRO_CONFIG_INT(ClDyncamMousesens, cl_dyncam_mousesens, 0, 0, 100000, CFGFLAG_C MACRO_CONFIG_INT(ClDyncamDeadzone, cl_dyncam_deadzone, 300, 1, 1300, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Dynamic camera dead zone") MACRO_CONFIG_INT(ClDyncamFollowFactor, cl_dyncam_follow_factor, 60, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Dynamic camera follow factor") -MACRO_CONFIG_INT(ClCameraSmoothness, cl_camera_smoothness, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Transition amount of the camera movement, 0=instant, 100=slow and smooth") -MACRO_CONFIG_INT(ClCameraStabilizing, cl_camera_stabilizing, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Amount of camera slowdown during fast cursor movement. High value can cause delay in camera movement") +MACRO_CONFIG_INT(ClDyncamSmoothness, cl_dyncam_smoothness, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Transition amount of the camera movement, 0=instant, 100=slow and smooth") +MACRO_CONFIG_INT(ClDyncamStabilizing, cl_dyncam_stabilizing, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Amount of camera slowdown during fast cursor movement. High value can cause delay in camera movement") MACRO_CONFIG_INT(EdZoomTarget, ed_zoom_target, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Zoom to the current mouse target") MACRO_CONFIG_INT(EdShowkeys, ed_showkeys, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "") From f95639df8d9e5584771b55e7c5615bd24483dff2 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 11:37:57 +0100 Subject: [PATCH 050/144] Update translations --- data/languages/belarusian.txt | 2 +- data/languages/bosnian.txt | 2 +- data/languages/brazilian_portuguese.txt | 2 +- data/languages/bulgarian.txt | 2 +- data/languages/catalan.txt | 2 +- data/languages/chuvash.txt | 2 +- data/languages/czech.txt | 2 +- data/languages/danish.txt | 2 +- data/languages/dutch.txt | 2 +- data/languages/finnish.txt | 2 +- data/languages/french.txt | 2 +- data/languages/german.txt | 6 +++--- data/languages/greek.txt | 2 +- data/languages/hungarian.txt | 2 +- data/languages/italian.txt | 2 +- data/languages/japanese.txt | 2 +- data/languages/korean.txt | 2 +- data/languages/kyrgyz.txt | 2 +- data/languages/norwegian.txt | 2 +- data/languages/persian.txt | 2 +- data/languages/polish.txt | 2 +- data/languages/portuguese.txt | 2 +- data/languages/romanian.txt | 2 +- data/languages/russian.txt | 4 ++-- data/languages/serbian.txt | 2 +- data/languages/serbian_cyrillic.txt | 2 +- data/languages/simplified_chinese.txt | 2 +- data/languages/slovak.txt | 2 +- data/languages/spanish.txt | 2 +- data/languages/swedish.txt | 2 +- data/languages/traditional_chinese.txt | 2 +- data/languages/turkish.txt | 2 +- data/languages/ukrainian.txt | 2 +- 33 files changed, 36 insertions(+), 36 deletions(-) diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt index 1d09b472f..ae8bcb48f 100644 --- a/data/languages/belarusian.txt +++ b/data/languages/belarusian.txt @@ -832,7 +832,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt index c3d2bb809..6c41ac015 100644 --- a/data/languages/bosnian.txt +++ b/data/languages/bosnian.txt @@ -1180,7 +1180,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index 1fd6855bf..6255faf91 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -1279,7 +1279,7 @@ Your nickname '%s' is already used (%d points). Do you still want to use it? Checking for existing player with your name == -Smooth Camera +Smooth Dynamic Camera == Game sound volume diff --git a/data/languages/bulgarian.txt b/data/languages/bulgarian.txt index c0d81313b..d433e69e9 100644 --- a/data/languages/bulgarian.txt +++ b/data/languages/bulgarian.txt @@ -829,7 +829,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt index 5a09d5786..2f0bd660d 100644 --- a/data/languages/catalan.txt +++ b/data/languages/catalan.txt @@ -1194,7 +1194,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/chuvash.txt b/data/languages/chuvash.txt index 48a241e97..49c214121 100644 --- a/data/languages/chuvash.txt +++ b/data/languages/chuvash.txt @@ -832,7 +832,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/czech.txt b/data/languages/czech.txt index bcfb9e436..aee2c7fd2 100644 --- a/data/languages/czech.txt +++ b/data/languages/czech.txt @@ -835,7 +835,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/danish.txt b/data/languages/danish.txt index c59c9a4b4..c6b808f02 100644 --- a/data/languages/danish.txt +++ b/data/languages/danish.txt @@ -832,7 +832,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index 157e745ff..96d93e336 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -1206,7 +1206,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt index 0f4464ace..c7c9b4b69 100644 --- a/data/languages/finnish.txt +++ b/data/languages/finnish.txt @@ -833,7 +833,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/french.txt b/data/languages/french.txt index 0ce7e12e2..44ee668fe 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -1290,7 +1290,7 @@ Your nickname '%s' is already used (%d points). Do you still want to use it? Checking for existing player with your name == -Smooth Camera +Smooth Dynamic Camera == Game sound volume diff --git a/data/languages/german.txt b/data/languages/german.txt index 0dbf9eb9e..cee172a2a 100644 --- a/data/languages/german.txt +++ b/data/languages/german.txt @@ -1280,9 +1280,6 @@ Your nickname '%s' is already used (%d points). Do you still want to use it? Checking for existing player with your name == Prüfe auf existierenden Spieler mit deinem Namen -Smooth Camera -== Weiche Kamera - Game sound volume == Spiel-Lautstärke @@ -1306,3 +1303,6 @@ Auto Replay == Wiederholung + +Smooth Dynamic Camera +== Weiche Dynamische Kamera diff --git a/data/languages/greek.txt b/data/languages/greek.txt index f712ca78e..35a74da84 100644 --- a/data/languages/greek.txt +++ b/data/languages/greek.txt @@ -835,7 +835,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index a9658495f..39689d515 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -1200,7 +1200,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/italian.txt b/data/languages/italian.txt index 7ea1c9be0..dde406124 100644 --- a/data/languages/italian.txt +++ b/data/languages/italian.txt @@ -872,7 +872,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/japanese.txt b/data/languages/japanese.txt index 83f20ec42..cdaeb1990 100644 --- a/data/languages/japanese.txt +++ b/data/languages/japanese.txt @@ -832,7 +832,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/korean.txt b/data/languages/korean.txt index bc6b59cb0..415135fee 100644 --- a/data/languages/korean.txt +++ b/data/languages/korean.txt @@ -834,7 +834,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/kyrgyz.txt b/data/languages/kyrgyz.txt index e5803a52c..fbab90655 100644 --- a/data/languages/kyrgyz.txt +++ b/data/languages/kyrgyz.txt @@ -826,7 +826,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index 9de7e071b..dbb6151f0 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -1202,7 +1202,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/persian.txt b/data/languages/persian.txt index d5fe4d553..31fb657bf 100644 --- a/data/languages/persian.txt +++ b/data/languages/persian.txt @@ -601,7 +601,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon on pickup diff --git a/data/languages/polish.txt b/data/languages/polish.txt index abcd5c6af..0b799813a 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -1206,7 +1206,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt index 0be31aa59..5deb73b2d 100644 --- a/data/languages/portuguese.txt +++ b/data/languages/portuguese.txt @@ -1040,7 +1040,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Reset wanted weapon on death diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt index 27c4d565c..85594fb56 100644 --- a/data/languages/romanian.txt +++ b/data/languages/romanian.txt @@ -841,7 +841,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/russian.txt b/data/languages/russian.txt index 57e4676a7..4c0d32eb1 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1241,8 +1241,8 @@ Theme Demos directory == Папка с демо -Smooth Camera -== Плавная камера +Smooth Dynamic Camera +== Плавная Динамическая камера Themes directory == Папка с темами diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt index dba638372..bfebf2bd3 100644 --- a/data/languages/serbian.txt +++ b/data/languages/serbian.txt @@ -836,7 +836,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt index add75c6c6..f1a58627a 100644 --- a/data/languages/serbian_cyrillic.txt +++ b/data/languages/serbian_cyrillic.txt @@ -1259,7 +1259,7 @@ Your nickname '%s' is already used (%d points). Do you still want to use it? Checking for existing player with your name == -Smooth Camera +Smooth Dynamic Camera == Game sound volume diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index 02eb2d435..e15fe02b7 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -1243,7 +1243,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Themes directory diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt index 7e0a10151..2c4319455 100644 --- a/data/languages/slovak.txt +++ b/data/languages/slovak.txt @@ -832,7 +832,7 @@ Activate Save == -Smooth Camera +Smooth Dynamic Camera == Switch weapon when out of ammo diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index fa959cc25..d2578f058 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -1207,7 +1207,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index d2d32365b..935f36d74 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -1238,7 +1238,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Themes directory diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index 70598b8d9..cff35428d 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -1212,7 +1212,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index 595d0ab55..c3a25039d 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -1209,7 +1209,7 @@ Theme Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index 8ce1535c4..5bf1a573e 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -1204,7 +1204,7 @@ Markers Demos directory == -Smooth Camera +Smooth Dynamic Camera == Skip the main menu From 70a9738c9bb9b58e0e3c3296d0d1a8baa51cd0dd Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 11:56:54 +0100 Subject: [PATCH 051/144] Add french translation by Pipou --- data/languages/french.txt | 2637 +++++++++++++++++++------------------ 1 file changed, 1319 insertions(+), 1318 deletions(-) diff --git a/data/languages/french.txt b/data/languages/french.txt index 44ee668fe..13ac9a6a1 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -1,1318 +1,1319 @@ -##### 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 -##### /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 ! - --Page %d- -== -Page %d- - -Abort -== Annuler - -Add -== Ajouter - -Add Friend -== Ajouter aux amis - -Address -== Adresse - -All -== Tout le monde - -Are you sure that you want to delete the demo? -== Êtes-vous sûr de vouloir supprimer la démo ? - -Are you sure that you want to quit? -== Êtes-vous sûr de vouloir quitter ? - -Are you sure that you want to remove the player from your friends list? -== Êtes-vous sûr de vouloir supprimer ce joueur de votre liste d'amis ? - -Automatically record demos -== Enregistrer les démos automatiquement - -Automatically take game over screenshot -== Prends 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 - -Close -== Fermer - -Compatible version -== Version compatible - -Connect -== Se connecter - -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 - -Demo details -== Détails de 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 - -Enter -== Démarrer - -Error -== Erreur - -Error loading demo -== Erreur pendant le chargement de la démo - -Favorite -== Favori - -Favorites -== Favoris - -Feet -== Pieds - -Filter -== Filtre - -Fire -== Tirer - -Folder -== Dossier - -Force vote -== Forcer le vote - -Free-View -== Vue libre - -Friends -== Amis - -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 - -Maximum ping: -== Ping maximum : - -Mouse sens. -== Sens. souris - -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 - -Open -== Ouvrir - -Parent Folder -== Dossier parent - -Password -== Mot de passe - -Password incorrect -== Mot de passe incorrect - -Ping -== Ping - -Pistol -== Pistolet - -[Demo browser] -Play -== Jouer - -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 ! - -Refresh -== Rafraîchir - -Refreshing master servers -== Rafraîchissement des serveurs maîtres - -Remote console -== Console serveur - -Remove -== Retirer - -Remove friend -== Retirer des amis - -Rename -== Renommer - -Rename demo -== Renommer la démo - -Reset filter -== Filtres par défaut - -Sample rate -== Taux d'échantillonnage - -Score -== Score - -Score limit -== Limite des scores - -Scoreboard -== Tableau des scores - -Screenshot -== Capture d'écran - -Server address: -== Addresse du serveur : - -Server details -== Détails du serveur - -Server filter -== Filtres 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 - -Show only supported -== N'afficher que les résolutions supportées - -Skins -== Skins - -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. - -There's an unsaved map in the editor, you might want to save it before you quit the game. -== Il y a une carte non-enregistrée dans l'éditeur, il se peut que vous vouliez l'enregistrer avant de quitter le jeu. - -Time limit -== Limite de temps - -Time limit: %d min -== Limite de temps : %d min - -Try again -== Réessayer - -Type -== Type - -Unable to delete the demo -== Impossible de supprimer la démo - -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 - -Created: -== Créé le : - -Max Screenshots -== Nombre maximum de captures d'écran - -Length: -== Durée : - -Laser -== Laser - -Netversion: -== Netversion : - -Map: -== Carte : - -Info -== Info. - -Hue -== Teinte - -Record demo -== Enregist. démo - -Your skin -== Votre skin - -Size: -== Taille : - -Reset to defaults -== Réinitialiser - -Quit anyway? -== Quitter quand même ? - -Display Modes -== Résolutions - -Version: -== Version : - -Round -== Round - -Lht. -== Luminosité - -UI Color -== Couleur du menu - -Crc: -== Crc : - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Taille des pseudonymes - -Type: -== Type : - - -##### generated by copy_fix.py, please translate this ##### - - -##### generated by copy_fix.py, please translate this ##### - - -##### generated by copy_fix.py, please translate this ##### - - -##### generated by copy_fix.py, please translate this ##### - -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 - -Reset wanted weapon on death -== Réinitialiser l'arme choisie après être mort - -Inner color -== Couleur intérieur - -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 -== Prends 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 - -Use DDRace Scoreboard -== Utiliser le tableau des scores de DDRace - -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 - -Preinit VBO (iGPUs only) -== Préinitialisation VBO (iGPU uniquement) - -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 - -We will win -== On va gagner - -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ûr de vouloir déconnecter votre dummy? - -Reload -== Recharger - -Old mouse mode -== Ancien mode de souris - -Server best: -== Meilleur score du serveur - -Personal best: -== Meilleur temps personnel - -Skin prefix -== Préfixe de skin - -Use OpenGL 3.3 (experimental) -== Utiliser OpenGL 3.3 (expérimental) - -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 - -Spectator -== Spectateur - -Statboard -== Tableau des stats - -Show text entities -== Afficher le texte des entités - -Connecting dummy -== Connection du dummy - -Hello and welcome -== Bonjour et bienvenue - -second -== seconde - -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 - -Dummy settings -== Config. du dummy - -Are you sure that you want to disconnect? -== Êtes-vous sûr 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 - -Background (regular) -== Arrière-plan (défaut) - -Reset -== Défaut - -Threaded sound loading -== Chargement de sons enfilés - -File already exists, do you want to overwrite it? -== Ce fichier existe déjà, voulez-vous l'écraser? - -Grabs -== Grappins - -Update now -== Mettre à jour - -Wait before try for -== Avant votre prochain essai, veuillez attendre - -Follow -== Suivre - -Converse -== Converser - -Borderless window -== Mode fenêtré sans bordure - -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 - -Markers: -== Marqueurs : - -Multiple texture units (disable for MacOS) -== Unités de texture multiple (désactivé pour MacOS) - -Pause -== Pause - -Deaths -== Morts - -Length -== Durée - -Outline color -== Couleur du contour - -Normal message -== Message normal - -Show client IDs in Scoreboard -== Afficher les IDs des clients dans le tableau des scores - -seconds -== secondes - -Friend -== Ami - -Dummy copy -== Copiage du dummy - -Demo -== Démo - -Map sound volume -== Volume des sons de la map - -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: - -Please use a different name -== Veuillez changer de pseudonyme - -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 - -Try fast HTTP map download first -== Carte : essayer d'abord le téléchargement rapide HTTP - -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 - -Hi o/ -== Salut o/ - -Unfinished map -== Carte non terminée - -Default length: %d -== Durée par défaut : %d - -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 - -Look out! -== Attention! - -Show console window -== Afficher la fenêtre de la console - -Show kill messages -== Afficher les messages d'élimination - -Select a name -== Choisissez un pseudonyme - -UI mouse s. -== Sens. souris interface - -Markers -== Marqueurs - -HUD -== Interface - -Show health + ammo -== Afficher la vie et les munitions - -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 - -Background (entities) -== Arrière-plan (entités) - -Show votes window after voting -== Afficher la fenêtre de vote après avoir voté - -Destination file already exist -== Le fichier de destination existe déjà - -%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 - -Render -== Convertir - -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 (gèle)) - -9+ new mentions -== 9+ nouveaux messages - -Kill -== Tuer - -Types -== Types - -Countries -== Pays - -Gameplay -== Jouabilité - -Connect Dummy -== Connecter le dummy - -Reconnect in %d sec -== Reconnecte 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 map. 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. - -The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. -== Les maps contiennent du freeze (gèle), ce qui vous empêche temporairement de bouger. Vous devez travailler en équipe pour passer ces parties. - -The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== La molette de la souris permet de changer d'arme. Le marteau (clic gauche) peut être utilisé pour frapper les autres tees ce qui les unfreeze (dégivre). - -Hook (right mouse) can be used to swing through the map and to hook other tees to you. -== Le grappin (clic droit) peut être utilisé pour se balancer tout le long de la carte en attrappant les murs et peut aussi permettre d'attrapper les autres Tees. - -Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. -== La communication est la clé de la réussite: Il n'y a pas de tutoriel donc vous devrez parler avec d'autres joueurs (touche T) afin d'apprendre les bases du jeu ainsi que ses mécanismes complexes, avancés et variés. - -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 info2.ddnet.tw -== transmet votre pseudonyme à info2.ddnet.tw - -Saving ddnet-settings.cfg failed -== L'enregistrement de ddnet-settings.cfg a échoué - -The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== La largeur ou la hauteur de la texture %s n'est pas divisible par 16, ce qui pourrait causer des bugs visuels - -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. - -Country / Region -== Pays / Region - -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 -== Particles - -Assets directory -== Répertoire des assets - -https://wiki.ddnet.tw/ -== https://wiki.ddnet.tw/ - -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. -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Smooth Dynamic Camera -== - -Game sound volume -== - -Chat sound volume -== - -Use old chat style -== - -Highlight -== - -Manual -== - -Race -== - -Auto -== - -Replay -== +##### 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 +##### /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 ! + +-Page %d- +== -Page %d- + +Abort +== Annuler + +Add +== Ajouter + +Add Friend +== Ajouter aux amis + +Address +== Adresse + +All +== Tout le monde + +Are you sure that you want to delete the demo? +== Êtes-vous sûr de vouloir supprimer la démo ? + +Are you sure that you want to quit? +== Êtes-vous sûr de vouloir quitter ? + +Are you sure that you want to remove the player from your friends list? +== Êtes-vous sûr de vouloir supprimer ce joueur de votre liste d'amis ? + +Automatically record demos +== Enregistrer les démos automatiquement + +Automatically take game over screenshot +== Prends 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 + +Close +== Fermer + +Compatible version +== Version compatible + +Connect +== Se connecter + +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 + +Demo details +== Détails de 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 + +Enter +== Démarrer + +Error +== Erreur + +Error loading demo +== Erreur pendant le chargement de la démo + +Favorite +== Favori + +Favorites +== Favoris + +Feet +== Pieds + +Filter +== Filtre + +Fire +== Tirer + +Folder +== Dossier + +Force vote +== Forcer le vote + +Free-View +== Vue libre + +Friends +== Amis + +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 + +Maximum ping: +== Ping maximum : + +Mouse sens. +== Sens. souris + +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 + +Open +== Ouvrir + +Parent Folder +== Dossier parent + +Password +== Mot de passe + +Password incorrect +== Mot de passe incorrect + +Ping +== Ping + +Pistol +== Pistolet + +[Demo browser] +Play +== Jouer + +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 ! + +Refresh +== Rafraîchir + +Refreshing master servers +== Rafraîchissement des serveurs maîtres + +Remote console +== Console serveur + +Remove +== Retirer + +Remove friend +== Retirer des amis + +Rename +== Renommer + +Rename demo +== Renommer la démo + +Reset filter +== Filtres par défaut + +Sample rate +== Taux d'échantillonnage + +Score +== Score + +Score limit +== Limite des scores + +Scoreboard +== Tableau des scores + +Screenshot +== Capture d'écran + +Server address: +== Addresse du serveur : + +Server details +== Détails du serveur + +Server filter +== Filtres 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 + +Show only supported +== N'afficher que les résolutions supportées + +Skins +== Skins + +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. + +There's an unsaved map in the editor, you might want to save it before you quit the game. +== Il y a une carte non-enregistrée dans l'éditeur, il se peut que vous vouliez l'enregistrer avant de quitter le jeu. + +Time limit +== Limite de temps + +Time limit: %d min +== Limite de temps : %d min + +Try again +== Réessayer + +Type +== Type + +Unable to delete the demo +== Impossible de supprimer la démo + +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 + +Created: +== Créé le : + +Max Screenshots +== Nombre maximum de captures d'écran + +Length: +== Durée : + +Laser +== Laser + +Netversion: +== Netversion : + +Map: +== Carte : + +Info +== Info. + +Hue +== Teinte + +Record demo +== Enregist. démo + +Your skin +== Votre skin + +Size: +== Taille : + +Reset to defaults +== Réinitialiser + +Quit anyway? +== Quitter quand même ? + +Display Modes +== Résolutions + +Version: +== Version : + +Round +== Round + +Lht. +== Luminosité + +UI Color +== Couleur du menu + +Crc: +== Crc : + +Alpha +== Alpha + +LAN +== LAN + +Name plates size +== Taille des pseudonymes + +Type: +== Type : + + +##### generated by copy_fix.py, please translate this ##### + + +##### generated by copy_fix.py, please translate this ##### + + +##### generated by copy_fix.py, please translate this ##### + + +##### generated by copy_fix.py, please translate this ##### + +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 + +Reset wanted weapon on death +== Réinitialiser l'arme choisie après être mort + +Inner color +== Couleur intérieur + +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 +== Prends 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 + +Use DDRace Scoreboard +== Utiliser le tableau des scores de DDRace + +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 + +Preinit VBO (iGPUs only) +== Préinitialisation VBO (iGPU uniquement) + +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 + +We will win +== On va gagner + +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ûr de vouloir déconnecter votre dummy? + +Reload +== Recharger + +Old mouse mode +== Ancien mode de souris + +Server best: +== Meilleur score du serveur + +Personal best: +== Meilleur temps personnel + +Skin prefix +== Préfixe de skin + +Use OpenGL 3.3 (experimental) +== Utiliser OpenGL 3.3 (expérimental) + +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 + +Spectator +== Spectateur + +Statboard +== Tableau des stats + +Show text entities +== Afficher le texte des entités + +Connecting dummy +== Connection du dummy + +Hello and welcome +== Bonjour et bienvenue + +second +== seconde + +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 + +Dummy settings +== Config. du dummy + +Are you sure that you want to disconnect? +== Êtes-vous sûr 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 + +Background (regular) +== Arrière-plan (défaut) + +Reset +== Défaut + +Threaded sound loading +== Chargement de sons enfilés + +File already exists, do you want to overwrite it? +== Ce fichier existe déjà, voulez-vous l'écraser? + +Grabs +== Grappins + +Update now +== Mettre à jour + +Wait before try for +== Avant votre prochain essai, veuillez attendre + +Follow +== Suivre + +Converse +== Converser + +Borderless window +== Mode fenêtré sans bordure + +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 + +Markers: +== Marqueurs : + +Multiple texture units (disable for MacOS) +== Unités de texture multiple (désactivé pour MacOS) + +Pause +== Pause + +Deaths +== Morts + +Length +== Durée + +Outline color +== Couleur du contour + +Normal message +== Message normal + +Show client IDs in Scoreboard +== Afficher les IDs des clients dans le tableau des scores + +seconds +== secondes + +Friend +== Ami + +Dummy copy +== Copiage du dummy + +Demo +== Démo + +Map sound volume +== Volume des sons de la map + +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: + +Please use a different name +== Veuillez changer de pseudonyme + +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 + +Try fast HTTP map download first +== Carte : essayer d'abord le téléchargement rapide HTTP + +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 + +Hi o/ +== Salut o/ + +Unfinished map +== Carte non terminée + +Default length: %d +== Durée par défaut : %d + +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 + +Look out! +== Attention! + +Show console window +== Afficher la fenêtre de la console + +Show kill messages +== Afficher les messages d'élimination + +Select a name +== Choisissez un pseudonyme + +UI mouse s. +== Sens. souris interface + +Markers +== Marqueurs + +HUD +== Interface + +Show health + ammo +== Afficher la vie et les munitions + +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 + +Background (entities) +== Arrière-plan (entités) + +Show votes window after voting +== Afficher la fenêtre de vote après avoir voté + +Destination file already exist +== Le fichier de destination existe déjà + +%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 + +Render +== Convertir + +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 (gèle)) + +9+ new mentions +== 9+ nouveaux messages + +Kill +== Tuer + +Types +== Types + +Countries +== Pays + +Gameplay +== Jouabilité + +Connect Dummy +== Connecter le dummy + +Reconnect in %d sec +== Reconnecte 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 map. 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. + +The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. +== Les maps contiennent du freeze (gèle), ce qui vous empêche temporairement de bouger. Vous devez travailler en équipe pour passer ces parties. + +The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. +== La molette de la souris permet de changer d'arme. Le marteau (clic gauche) peut être utilisé pour frapper les autres tees ce qui les unfreeze (dégivre). + +Hook (right mouse) can be used to swing through the map and to hook other tees to you. +== Le grappin (clic droit) peut être utilisé pour se balancer tout le long de la carte en attrappant les murs et peut aussi permettre d'attrapper les autres Tees. + +Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. +== La communication est la clé de la réussite: Il n'y a pas de tutoriel donc vous devrez parler avec d'autres joueurs (touche T) afin d'apprendre les bases du jeu ainsi que ses mécanismes complexes, avancés et variés. + +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 info2.ddnet.tw +== transmet votre pseudonyme à info2.ddnet.tw + +Saving ddnet-settings.cfg failed +== L'enregistrement de ddnet-settings.cfg a échoué + +The width or height of texture %s is not divisible by 16, which might cause visual bugs. +== La largeur ou la hauteur de la texture %s n'est pas divisible par 16, ce qui pourrait causer des bugs visuels + +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. + +Country / Region +== Pays / Region + +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 +== Particles + +Assets directory +== Répertoire des assets + +https://wiki.ddnet.tw/ +== https://wiki.ddnet.tw/ + +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 + +Highlight +== Surbrillance + +Manual +== Manuel + +Race +== Race + +Auto +== Auto + +Replay +== Replay From 18792a0d894cd134d0d717189f2f9866e1db100e Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 12:13:05 +0100 Subject: [PATCH 052/144] Update russian translation --- 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 4c0d32eb1..af99caa69 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1287,7 +1287,7 @@ Assets directory == Папка с графикой Manual -== +== Ручное Race == Гонка From b043fdae0d7f5f0aa636f0960ddd0a031b945d22 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 12:19:33 +0100 Subject: [PATCH 053/144] Update all translations --- data/languages/brazilian_portuguese.txt | 8 ++++---- data/languages/catalan.txt | 8 ++++---- data/languages/dutch.txt | 8 ++++---- data/languages/hungarian.txt | 8 ++++---- data/languages/norwegian.txt | 8 ++++---- data/languages/polish.txt | 8 ++++---- data/languages/serbian_cyrillic.txt | 8 ++++---- data/languages/simplified_chinese.txt | 8 ++++---- data/languages/spanish.txt | 8 ++++---- data/languages/swedish.txt | 8 ++++---- data/languages/traditional_chinese.txt | 8 ++++---- data/languages/turkish.txt | 8 ++++---- data/languages/ukrainian.txt | 8 ++++---- 13 files changed, 52 insertions(+), 52 deletions(-) diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index 6255faf91..fcc0c9ce1 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -1295,13 +1295,13 @@ Highlight == Manual -== +== Manual Race -== +== Corrida Auto -== +== Auto Replay -== +== Reproduzir diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt index 2f0bd660d..e29bfb8c8 100644 --- a/data/languages/catalan.txt +++ b/data/languages/catalan.txt @@ -1274,13 +1274,13 @@ Play == Manual -== +== Manual Race -== +== Carrera Auto -== +== Auto Replay -== +== Repetició diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index 96d93e336..3efc9620d 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -1286,16 +1286,16 @@ Play == Manual -== +== Manual Race -== +== Race Auto -== +== Automatisch Replay -== +== Herhaling Net == diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index 39689d515..9d91fd986 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -1286,13 +1286,13 @@ Play == Manual -== +== Manuális Race -== +== Verseny Auto -== +== Auto Replay -== +== Visszajátszás diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index dbb6151f0..520bb00af 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -1282,13 +1282,13 @@ Play == Manual -== +== Manuell Race -== +== Løp Auto -== +== Auto Replay -== +== Opptak diff --git a/data/languages/polish.txt b/data/languages/polish.txt index 0b799813a..0a366f936 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -1286,13 +1286,13 @@ Play == Manual -== +== Instrukcja Race -== +== Wyścig Auto -== +== Auto Replay -== +== Powtórka diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt index f1a58627a..81a723734 100644 --- a/data/languages/serbian_cyrillic.txt +++ b/data/languages/serbian_cyrillic.txt @@ -1281,13 +1281,13 @@ Use current map as background == Manual -== +== Упутство Race -== +== Трка Auto -== +== Ауто Replay -== +== Помнови diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index e15fe02b7..52e940698 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -1292,13 +1292,13 @@ Assets directory == Manual -== +== 手动 Race -== +== 竞速赛 Auto -== +== 自动 Replay -== +== 回放 diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index d2578f058..e85fd6721 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -1287,13 +1287,13 @@ Play == Manual -== +== Manual Race -== +== Carrera Auto -== +== Auto Replay -== +== Repetición diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index 935f36d74..5e67a3413 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -1284,13 +1284,13 @@ Assets directory == Manual -== +== Manual Race -== +== Race Auto -== +== Auto Replay -== +== Repris diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index cff35428d..7f11f073c 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -1286,13 +1286,13 @@ Play == Manual -== +== 手動 Race -== +== 競速賽 Auto -== +== 自動 Replay -== +== 回放 diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index c3a25039d..805b78dbb 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -1286,13 +1286,13 @@ Play == Manual -== +== Manual Race -== +== Yarış Auto -== +== Otomatik Replay -== +== Yeniden oynatma diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index 5bf1a573e..bc0a7fdd0 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -1281,13 +1281,13 @@ Play == Manual -== +== Ручна Race -== +== Гонка Auto -== +== Авто Replay -== +== Повтор From 2ef7f2e6fb84f502f7ed92f25de103508e7d31b5 Mon Sep 17 00:00:00 2001 From: Headshot <36455681+headshot2017@users.noreply.github.com> Date: Sat, 7 Nov 2020 12:51:17 -0400 Subject: [PATCH 054/144] Update spanish.txt --- data/languages/spanish.txt | 93 +++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index fa959cc25..5cb07aef7 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -9,6 +9,7 @@ # Mortcheck 2012-11-03 22:58:43 # FeaRZ 2020-07-07 12:09:00 # Ryozuki 2020-07-09 12:06:00 +# Headshot 2020-11-07 12:40:00 ##### /authors ##### ##### translated strings ##### @@ -1160,140 +1161,140 @@ Grabs == 9+ nuevas menciones Saving ddnet-settings.cfg failed -== +== Error al guardar ddnet-settings.cfg The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== +== El ancho o alto de la textura %s no es divisible por 16, por lo que puede causar errores visuales. Warning -== +== Advertencia Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== Modo debug activado. Pulsa Ctrl+Shift+D para desactivar. Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== +== Usa la tecla K para suicidarte (reiniciar), Q para pausar y ver a otros jugadores. Mira la configuración para otras teclas. Existing Player -== +== Este jugador ya existe Your nickname '%s' is already used (%d points). Do you still want to use it? -== +== Tu nombre '%s' ya está usado (%d puntos). ¿Deseas seguir usándolo? Checking for existing player with your name -== +== Comprobando si ya hay un jugador con tu nombre Country / Region -== +== País / Región Speed -== +== Velocidad Theme -== +== Tema %d of %d servers -== +== %d de %d servidores %d of %d server -== +== %d de %d servidor %d players -== +== %d jugadores %d player -== +== %d jugador Demos directory -== +== Directorio de demos Smooth Camera -== +== Cámara suave Skip the main menu -== +== Saltar el menú principal Themes directory -== +== Directorio de temas Download skins -== +== Descargar skins Skin Database -== +== Base de datos de skins Skins directory -== +== Directorio de skins Game sound volume -== +== Volúmen de sonido del juego Chat sound volume -== +== Volúmen del chat Background music volume -== +== Volúmen de música de fondo Assets -== +== Recursos Use old chat style -== +== Usar estilo viejo de chat Highlight -== +== Resaltado Client message -== +== Mensaje de cliente Use current map as background -== +== Usar mapa actual como fondo Entities -== +== Entidades Emoticons -== +== Emoticones Particles -== +== Partículas Assets directory -== +== Directorio de recursos https://wiki.ddnet.tw/ -== +== https://wiki.ddnet.tw/ Website -== +== Página web Settings -== +== Configuración Stop server -== +== Detener servidor Run server -== +== Iniciar servidor Server executable not found, can't run server -== +== Ejecutable del servidor no encontrado. No se puede iniciar el servidor Editor -== +== Editor [Start menu] Play -== +== Jugar Manual -== +== Manual Race -== +== Carrera Auto -== +== Auto Replay -== +== Repetición From b03e0a7c09da3f00ee195a738385dab7e6bbe557 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 18:27:15 +0100 Subject: [PATCH 055/144] Add hungarian translation by Boti. --- data/languages/hungarian.txt | 2596 +++++++++++++++++----------------- 1 file changed, 1298 insertions(+), 1298 deletions(-) diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index 9d91fd986..5856a2c39 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -1,1298 +1,1298 @@ -##### authors ##### -#originally created by: -# Feca -#modified by: -# -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds van hátra - -%i minute left -== %i perc van hátra - -%i minutes left -== %i perc van hátra - -%i second left -== %i másodperc van hátra - -%i seconds left -== %i másodperc van hátra - -%s wins! -== %s nyert! - --Page %d- -== -oldal %d- - -Abort -== Mégse - -Add -== Hozzáadás - -Add Friend -== Barát hozzáadása - -Address -== Cím - -All -== Mindenki - -Are you sure that you want to delete the demo? -== Biztos, hogy le akarod törölni a demót? - -Are you sure that you want to quit? -== Biztos, hogy ki akarsz lépni? - -Are you sure that you want to remove the player from your friends list? -== Biztos vagy benne, hogy ki akarod törölni a játékost a barátok listájáról? - -Automatically record demos -== Magától rögzítse a demókat - -Automatically take game over screenshot -== Magától készítsen a játék végén képet - -Blue team -== Kék csapat - -Blue team wins! -== A kék csapat nyert! - -Body -== Test - -Call vote -== Szavazás - -Change settings -== Beállítások átállítása - -Chat -== Chat - -Clan -== Klán - -Client -== Kliens - -Close -== Bezárás - -Compatible version -== Kompatibilis Verzió - -Connect -== Csatlakozás - -Connecting to -== Csatlakozás a - -Connection Problems... -== Csatlakozási problémák... - -Console -== Konzol - -Controls -== Irányítások - -Count players only -== Számontartott játékosok - -Current -== Aktuális - -Custom colors -== Egyéni színek - -Delete -== Törlés - -Delete demo -== Demó törlése - -Demo details -== Információk a demóról - -Demos -== Demók - -Disconnect -== Kilépés - -Disconnected -== Lekapcsolódott - -Downloading map -== Pálya letöltése - -Draw! -== Döntetlen! - -Dynamic Camera -== Dinamikus kamera - -Emoticon -== Hangulatjel - -Enter -== Belépés - -Error -== Hiba - -Error loading demo -== Hiba a demó betöltése közben - -Favorite -== Kedvenc - -Favorites -== Kedvencek - -Feet -== Láb - -Filter -== Szűrő - -Fire -== Tűz - -Folder -== Mappa - -Force vote -== Különleges szavazás - -Free-View -== Szabad-nézet - -Friends -== Barátok - -Fullscreen -== Teljesképernyő - -Game -== Játék - -Game info -== Játék infó - -Game over -== Játék vége - -Game type -== Játék fajtája - -Game types: -== Játék fajtái: - -General -== Általános - -Graphics -== Grafika - -Grenade -== Gránát - -Hammer -== Kalapács - -Has people playing -== Játékos játszik - -High Detail -== Jó részletek - -Hook -== Horog - -Invalid Demo -== Érvénytelen demó - -Join blue -== Kékhez lépés - -Join red -== Piroshoz lépés - -Jump -== Ugrás - -Kick player -== Játékos kirúgása - -Language -== Nyelv - -MOTD -== Napi üzenet - -Map -== Pálya - -Maximum ping: -== Maximum Ping: - -Mouse sens. -== Egér érzékenység - -Move left -== Balra lépés - -Move player to spectators -== Megfigyelőbe mozgatás - -Move right -== Jobbra lépés - -Movement -== Mozgás - -Mute when not active -== Letiltás ha nem aktív - -Name -== Név - -Next weapon -== Következő fegyver - -Nickname -== Becenév - -No -== Nem - -No password -== Jelszó nélküli - -No servers found -== Nem talált szervereket - -No servers match your filter criteria -== Nincs szerver a szűrőfeltételeidhez - -Ok -== Oké - -Open -== Megnyit - -Parent Folder -== Szülői mappa - -Password -== Jelszó - -Password incorrect -== Helytelen jelszó - -Ping -== Ping - -Pistol -== Pisztoly - -[Demo browser] -Play -== Játék - -Player -== Játékos - -Player options -== Játékos beállításai - -Players -== Játékos - -Please balance teams! -== Kérlek egyenlítsd ki a csapatokat! - -Prev. weapon -== Előző fegyver - -Quit -== Kilépés - -Reason: -== Indok: - -Red team -== Piros csapat - -Red team wins! -== A piros csapat nyert! - -Refresh -== Újratöltés - -Refreshing master servers -== Mester szerverek frissítése - -Remote console -== Távoli konzol - -Remove -== Eltávolítás - -Remove friend -== Barát eltávolítása - -Rename -== Átnevezés - -Rename demo -== Demó átnevezése - -Reset filter -== Szűrő visszaállítása - -Sample rate -== Mintavételi frekvencia - -Score -== Pontszám - -Score limit -== Ponthatár - -Scoreboard -== Pontszámtábla - -Screenshot -== Pillanatkép - -Server address: -== Szerver címe: - -Server details -== Szerver részletei - -Server filter -== Szerver szűrő - -Server info -== Szerver infó - -Server not full -== Szerver nincs tele - -Shotgun -== Sörétes puska - -Show chat -== Chat mutatása - -Show friends only -== Barátok mutatása - -Show ingame HUD -== Játék közbeni HUD mutatása - -Show name plates -== Név táblák mutatása - -Show only supported -== Csak támogatott mutatása - -Skins -== Skinek - -Sound -== Hang - -Sound error -== Hang hiba - -Spectate -== Megfigyelés - -Spectator mode -== Néző mód - -Spectators -== Megfigyelők - -Stop record -== Demó megállítása - -Sudden Death -== Gyors halál - -Switch weapon on pickup -== Fegyverváltás felvételnél - -Team -== Csapat - -Team chat -== Csapat chat - -The audio device couldn't be initialised. -== A hangeszköz nem kezdeményezhető. - -The server is running a non-standard tuning on a pure game type. -== A szerver egy nem szabványos hangolást futtat a tiszta játék típuson. - -There's an unsaved map in the editor, you might want to save it before you quit the game. -== Van egy mentett térkép a szerkesztőben, talán elakartad menteni, mielőtt kilépsz a játékból. - -Time limit -== Időhatár - -Time limit: %d min -== Időhatár: %d perc - -Try again -== Próbáld újra - -Type -== Típus - -Unable to delete the demo -== Nem sikerült törölni a demót - -Unable to rename the demo -== Nem sikerült átnevezni a demót - -Use sounds -== Hangok használata - -Use team colors for name plates -== Csapat szín használata név tábláknál - -V-Sync -== V-Sync - -Version -== Verzió - -Vote command: -== Szavazás parancsa: - -Vote description: -== Szavazás leírása: - -Vote no -== Nem - -Vote yes -== Igen - -Voting -== Szavazás - -Warmup -== Felkészülés - -Weapon -== Fegyver - -Yes -== Igen - -You must restart the game for all settings to take effect. -== Újra kell indítani a játékot, a beállítások érvénybe lépéséhez. - -New name: -== Új Név: - -Sat. -== telítettség - - - -Internet -== Internet - - - -Max demos -== Maximum Demó - -News -== Hírek - -Join game -== Csatlakozás a játékhoz - -FSAA samples -== FSAA minták - -Sound volume -== Hangerő - -Created: -== Készült: - -Max Screenshots -== Maximum Fotó - -Length: -== Hossza: - -Laser -== Lézer - -Netversion: -== Netes verzió: - -Map: -== Pálya: - -Info -== Infó - -Miscellaneous -== Vegyes - -Record demo -== Demó felvétele - -Your skin -== Te skined - -Size: -== Méret: - -Reset to defaults -== Visszaállítás alapértelmezettre - -Quit anyway? -== Mindenképpen kilép? - -Display Modes -== Kijelző módok - -Version: -== Verzió: - -Round -== Menet - -Lht. -== Fényerősség - -UI Color -== UI Szín - -Hue -== Színárnyalat - -Crc: -== Crc: - -Alpha -== Alpha - -LAN -== Helyi - -Name plates size -== Névtáblák mérete - -Type: -== Típus: - -Dummy settings -== Másolat beállításai - -AntiPing -== Antiping - -Show quads -== Képek mutatása - -Map sound volume -== Pálya hangereje - -Show only chat messages from friends -== Csak barátoktól jön üzenet - -Countries -== Országok - -Reconnect in %d sec -== Újracsatlakozás %d másodperc múlva - -Grabs -== Megfog - -Background (entities) -== Háttér entitással - -Show kill messages -== Halálüzenetek mutatása - -Show ghost -== Szellem mutatása - -DDNet -== DDNet - -No updates available -== Nem elérhető fejlesztés - -Enable server message sound -== Szerver chat hang engedélyezése - -second -== másodperc - -Show votes window after voting -== Szavazási ablak mutatása - -HUD -== HUD - -Spectate previous -== Előző nézése - -Look out! -== Nézz oda! - -Spectate next -== Utáni nézése - -Show names in chat in team colors -== Csapatszínben jelennek meg a játékosok a chatben - -Select a name -== Válassz nevet - -Enable team chat sound -== Csapat chat hang engedélyezése - -Show other players' hook collision lines -== Játékosok horogvonalaik mutatása - -We will win -== Nyerni fogunk - -Hi o/ -== Szia o/ - -Deaths -== Halálok - -Enable game sounds -== Játék hang engedélyezése - -DDNet Client needs to be restarted to complete update! -== Újra kell indítani a DDNet Klienst a fejlesztés befejezéséhez! - -Spectator -== Néző - -Please use a different name -== Kérlek, válassz másik nevet - -Wait before try for -== Várj, mielőtt kipróbálod a: - -Show console window -== Konzol ablak mutatása - -Show others -== Játékosok mutatása - -Gameplay -== Játékmód - -Restart -== Újraindítás - -Game paused -== Játék megállítva - -Old mouse mode -== Régi egér mód - -Browser -== Böngésző - -Play background music -== Háttérzene lejátszása - -Follow -== Követni - -Reset -== Alap - -Enable gun sound -== Fegyverhang lejátszása - -Show health + ammo -== Élet + lőszer mutatása - -Team message -== Csapat üzenet - -Automatically create statboard csv -== Magától készítsen csv pontszámtáblát - -Save the best demo of each race -== Mentse el a legjobb demót minden versenynél - -Show tiles layers from BG map -== Block-ok mutatása a háttérben - -Are you sure that you want to disconnect? -== Biztos, hogy le akarsz csatlakozni? - -Types -== Típusok - -Ghost -== Szellem - -Remove chat -== Chat eltüntetése - -Check now -== Nézd meg - -Background (regular) -== Háttér (pálya) - -Reset wanted weapon on death -== Újraéledéskor váltson az akart fegyverre - -Frags -== Zászlók - -AntiPing: predict other players -== Antiping: más játékosokra - -Show other players' key presses -== Mutassa a játékosok mozgását nyilakkal - -Automatically take statboard screenshot -== Automatikusan készítsen pontszám fényképet - -System message -== Rendszer üzenet - -Enable long pain sound (used when shooting in freeze) -== Hosszú fájdalom hang lejátszása (mikor a játékos lő,ha lefagyott) - -DDNet %s is available: -== DDnet %s verzió elérhető - -Updating... -== Fejlesztés... - -Overlay entities -== Entitás jelenése - -Messages -== Üzenetek - -%.2f MiB -== %.2f MiB - -Refresh Rate -== Frissítési érték - -New random timeout code -== Új random időtúllépési kód - -Suicides -== Öngyilkosságok - -Player country: -== Játékos országa - -Net -== Net - -Loading DDNet Client -== DDNet Kliens betöltése - -FPM -== FPM - -Default zoom -== Alap nagyítás - -Show score -== Pontok mutatása - -Spree -== Szorzó - -Show client IDs in Scoreboard -== Mutassa a játékosok ID-ét a pontszámtáblán - -Demofile: %s -== Demófájl: %s - -Max CSVs -== Maximum CSV-k - -seconds -== másodpercek - -Borderless window -== Ablak mód - -%.2f KiB -== %.2f KiB - -Strict gametype filter -== Szigorú játékmód szűrő - -Try fast HTTP map download first -== Próbálja meg letölteni a HTTP Fájlokat elösször - -Use DDRace Scoreboard -== DDRace pontszámtábla használata - -Best -== Legjobb - -Enable regular chat sound -== Alap chat hang lejátszása - -Normal message -== Normál üzenet - -Screen -== Képernyő - -Search -== Keresés - -Connecting dummy -== Másolat válasza... - -Clan plates size -== Klán felirat mérete - -Update now -== Feljeszd most - -Show clan above name plates -== Klán mutatása a nevek fölött - -Save ghost -== Szellem mentése - -Exclude -== Kizárás - -Enable highlighted chat sound -== kiemelt chat hang lejátszása - -Hello and welcome -== Hali és üdv - -AntiPing: predict weapons -== Antiping: fegyvereknél - -DDNet Client updated! -== DDNet Kliens fejlesztve van! - -Outline color -== Vázolt szín - -Highlighted message -== Kiemelt üzenet - -Friend -== Barát - -Switch weapon when out of ammo -== Fegyver váltása, ha elfogy a lőszer - -AntiPing: predict grenade paths -== Antiping: gránátoknál - -Demo -== Demó - -Inner color -== belső szín - -##### generated by copy_fix.py, please translate this ##### -##### update for 11.6 version by Cellegen ##### - -Ratio -== Érték - -Friend message -== Baráti üzenet - -Fat skins (DDFat) -== Nagy skinek (DDFat) - -may cause delay -== Késleltetést okozhat - -Unfinished map -== befejezetlen pálya - -Deactivate -== Deaktiválás - -Welcome to DDNet -== Üzvözlet a DDNet-en - -Preinit VBO (iGPUs only) -== VBO használata (csak iGPU-nak) - -Threaded sound loading -== Csavarmenetes hang betöltése - -Activate -== Aktiválás - -Multiple texture units (disable for MacOS) -== Több textúra egységek (kapcsolja ki MacOS esetén) - -Use OpenGL 3.3 (experimental) -== OpenGL 3.3 használata (Haladó) - -UI mouse s. -== UI egér sebesség - -File already exists, do you want to overwrite it? -== A fájl már létezik, szeretné felülírni? - -Indicate map finish -== Befejezett pályák - -Save -== Mentés - -Vanilla skins only -== Csak alap skinek - -Date -== Idő - -Show DDNet map finishes in server browser -== Mutassa a DDNet befejezett pályákat a keresőben - -transmits your player name to info2.ddnet.tw -== Keress rá a játékosnevedre az info2.ddnet.tw oldalon - -Reload -== újratöltés - -Hammerfly dummy -== Másolat kalapács - -Downloading %s: -== Letöltés %s: - -Time -== Idő - -Kill -== Halál - -Personal best: -== Egyéni record: - -Show entities -== Entitások mutatása - -Video name: -== Videó neve: - -Connect Dummy -== Másolat belépése - -Disconnect Dummy -== Másolat kilépése - -Filter connecting players -== "Connecting" szűrés - -Pause -== Nézetváltás - -Toggle dummy -== Másolat irányítása - -Fetch Info -== Minden infó - -Dummy copy -== Másolat tükrözése - -Enable replays -== Visszajátszások - -Render demo -== Demó renderelése - -Zoom in -== Nagyítás - -Show text entities -== Textúrázott entitások - -Render -== Render - -Show all -== Mutasson mindent - -Learn -== Wiki - -Successfully saved the replay! -== Sikeresen elmentette a visszajátszást! - -Zoom out -== Kicsinyítés - -DDNet %s is out! -== DDNet %s elérhető! - -Statboard -== Státusztábla - -Converse -== Fordítás - -Use high DPI -== Magas DPI használata - -Update failed! Check log... -== Fejlesztés sikertelen! Tekintsen a naplóba... - -Toggle dyncam -== Dinamikus kamera - -%d new mentions -== %d új értesítés - -Default length: %d -== Átlagos hossz: %d - -Show HUD -== HUD mutatása - -Size -== Méret - -Destination file already exist -== A kiválasztott helynél ez létezik - -Server best: -== Legjobb szerver: - -Markers: -== Jelölések - -1 new mention -== 1 új értesíté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. -== A DDraceNetwork együttműködésen alapuló online játékként tekinthető, ahol a cél az, hogy te és egy csapat Tee elérje a célvonalat. Ha újonc vagy, a kezdő szervereket ajánljuk, ahol a legegyszerűbb versenyeket tároljuk. A lehető legkisebb ping választása alapján válasszon egy szervert. - -The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. -== A pályákon fagyasztó részeket találtok, melyek ideiglenesen blokkolják a játékos mozgását. Együtt kell dolgoznod a pályarészek átjutásán. - -The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== A görgő megváltoztatja a fegyvereket. A kalapács (bal egérgomb) segítségével más Tee-ket megüthetsz és ütésekkel kiolvadhatnak a fagyásból. - -Hook (right mouse) can be used to swing through the map and to hook other tees to you. -== A horoggal (jobb egérgomb) megkapaszkodhatsz néhány platformon és más Tee-ket is megragadhatsz vele. - -Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. -== A legfontosabb kulcsa a sikerhez: Nincs oktatóprogram, így mindenki magától tanulja meg más játékosok által. (T gombbal tudsz Chattelni) - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Ajánlott, hogy ellenőrizze a beállításokat, hogy a kedvéhez igazítsa őket, mielőtt csatlakozna egy szerverhez. (Tipp: szűrők) - -Please enter your nickname below. -== Írja be lent a becenevét. - -9+ new mentions -== 9+ új értesítés - -Replay feature is disabled! -== Visszajátszás mód kikapcsolva van! - -Lock team -== Csapat lezárása - -Hook collisions -== Horog pontossága - -Toggle ghost -== Szellem mutatása - -Markers -== Jelölések - -Replace video -== Videó lecserélése - -Length -== Hossz - -Are you sure that you want to disconnect your dummy? -== Biztos, hogy kiakarod léptetni a másolatodat? - -Saving ddnet-settings.cfg failed -== - -The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== - -Warning -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Country / Region -== - -Speed -== - -Theme -== - -%d of %d servers -== - -%d of %d server -== - -%d players -== - -%d player -== - -Demos directory -== - -Smooth Dynamic Camera -== - -Skip the main menu -== - -Themes directory -== - -Download skins -== - -Skin prefix -== - -Skin Database -== - -Skins directory -== - -Game sound volume -== - -Chat sound volume -== - -Background music volume -== - -Assets -== - -Use old chat style -== - -Highlight -== - -Client message -== - -Show others (own team only) -== - -Use current map as background -== - -Entities -== - -Emoticons -== - -Particles -== - -Assets directory -== - -https://wiki.ddnet.tw/ -== - -Website -== - -Settings -== - -Stop server -== - -Run server -== - -Server executable not found, can't run server -== - -Editor -== - -[Start menu] -Play -== - -Manual -== Manuális - -Race -== Verseny - -Auto -== Auto - -Replay -== Visszajátszás +##### authors ##### +#originally created by: +# Feca +#modified by: +# Boti. +##### /authors ##### + +##### translated strings ##### + +%ds left +== %ds van hátra + +%i minute left +== %i perc van hátra + +%i minutes left +== %i perc van hátra + +%i second left +== %i másodperc van hátra + +%i seconds left +== %i másodperc van hátra + +%s wins! +== %s nyert! + +-Page %d- +== -oldal %d- + +Abort +== Mégse + +Add +== Hozzáadás + +Add Friend +== Barát hozzáadása + +Address +== Cím + +All +== Mindenki + +Are you sure that you want to delete the demo? +== Biztos, hogy le akarod törölni a demót? + +Are you sure that you want to quit? +== Biztos, hogy ki akarsz lépni? + +Are you sure that you want to remove the player from your friends list? +== Biztos vagy benne, hogy ki akarod törölni a játékost a barátok listájáról? + +Automatically record demos +== Magától rögzítse a demókat + +Automatically take game over screenshot +== Magától készítsen a játék végén képet + +Blue team +== Kék csapat + +Blue team wins! +== A kék csapat nyert! + +Body +== Test + +Call vote +== Szavazás + +Change settings +== Beállítások átállítása + +Chat +== Chat + +Clan +== Klán + +Client +== Kliens + +Close +== Bezárás + +Compatible version +== Kompatibilis Verzió + +Connect +== Csatlakozás + +Connecting to +== Csatlakozás.. + +Connection Problems... +== Csatlakozási problémák... + +Console +== Konzol + +Controls +== Irányítások + +Count players only +== Számontartott játékosok + +Current +== Aktuális + +Custom colors +== Egyéni színek + +Delete +== Törlés + +Delete demo +== Demó törlése + +Demo details +== Információk a demóról + +Demos +== Demók + +Disconnect +== Kilépés + +Disconnected +== Lekapcsolódott + +Downloading map +== Pálya letöltése.. + +Draw! +== Döntetlen! + +Dynamic Camera +== Dinamikus kamera + +Emoticon +== Hangulatjel + +Enter +== Belépés + +Error +== Hiba + +Error loading demo +== Hiba történt a demó betöltése közben + +Favorite +== Kedvenc + +Favorites +== Kedvencek + +Feet +== Láb + +Filter +== Szűrő + +Fire +== Tűz + +Folder +== Mappa + +Force vote +== Szavazás kényszerítése + +Free-View +== Szabad-nézet + +Friends +== Barátok + +Fullscreen +== Teljesképernyő + +Game +== Játék + +Game info +== Játék infó + +Game over +== Játék vége + +Game type +== Játék fajtája + +Game types: +== Játék fajtái: + +General +== Általános + +Graphics +== Grafika + +Grenade +== Gránát + +Hammer +== Kalapács + +Has people playing +== Játékos játszik + +High Detail +== Jó részletek + +Hook +== Horog + +Invalid Demo +== Érvénytelen demó + +Join blue +== Kékhez lépés + +Join red +== Piroshoz lépés + +Jump +== Ugrás + +Kick player +== Játékos kirúgása + +Language +== Nyelv + +MOTD +== Napi üzenet + +Map +== Pálya + +Maximum ping: +== Maximum Ping: + +Mouse sens. +== Egér érzékenység + +Move left +== Balra lépés + +Move player to spectators +== Megfigyelőbe mozgatás + +Move right +== Jobbra lépés + +Movement +== Mozgás + +Mute when not active +== Letiltás ha nem aktív + +Name +== Név + +Next weapon +== Következő fegyver + +Nickname +== Becenév + +No +== Nem + +No password +== Jelszó nélküli + +No servers found +== Nem talált szervereket + +No servers match your filter criteria +== Nincs szerver a szűrőfeltételeidhez + +Ok +== Oké + +Open +== Megnyit + +Parent Folder +== Főmappa + +Password +== Jelszó + +Password incorrect +== Helytelen jelszó + +Ping +== Ping + +Pistol +== Pisztoly + +[Demo browser] +Play +== Játék + +Player +== Játékos + +Player options +== Játékos beállításai + +Players +== Játékos + +Please balance teams! +== Kérlek egyenlítsd ki a csapatokat! + +Prev. weapon +== Előző fegyver + +Quit +== Kilépés + +Reason: +== Indok: + +Red team +== Piros csapat + +Red team wins! +== A piros csapat nyert! + +Refresh +== Újratöltés + +Refreshing master servers +== Mester szerverek frissítése + +Remote console +== Távoli konzol + +Remove +== Eltávolítás + +Remove friend +== Barát eltávolítása + +Rename +== Átnevezés + +Rename demo +== Demó átnevezése + +Reset filter +== Szűrő visszaállítása + +Sample rate +== Mintavételi frekvencia + +Score +== Pontszám + +Score limit +== Ponthatár + +Scoreboard +== Pontszámtábla + +Screenshot +== Pillanatkép + +Server address: +== Szerver címe: + +Server details +== Szerver részletei + +Server filter +== Szerver szűrő + +Server info +== Szerver infó + +Server not full +== Szerver nincs tele + +Shotgun +== Sörétes puska + +Show chat +== Chat mutatása + +Show friends only +== Barátok mutatása + +Show ingame HUD +== Játék közbeni HUD mutatása + +Show name plates +== Név táblák mutatása + +Show only supported +== Csak támogatott mutatása + +Skins +== Skinek + +Sound +== Hang + +Sound error +== Hang hiba + +Spectate +== Megfigyelés + +Spectator mode +== Néző mód + +Spectators +== Megfigyelők + +Stop record +== Demó megállítása + +Sudden Death +== Gyors halál + +Switch weapon on pickup +== Fegyverváltás felvételnél + +Team +== Csapat + +Team chat +== Csapat chat + +The audio device couldn't be initialised. +== A hangeszköz nem érzékelhető. + +The server is running a non-standard tuning on a pure game type. +== A szerver egy nem szabványos hangolást futtat a tiszta játék típuson. + +There's an unsaved map in the editor, you might want to save it before you quit the game. +== Van egy mentett térkép a szerkesztőben, talán elakartad menteni, mielőtt kilépsz a játékból. + +Time limit +== Időhatár + +Time limit: %d min +== Időhatár: %d perc + +Try again +== Próbáld újra + +Type +== Típus + +Unable to delete the demo +== Nem sikerült törölni a demót + +Unable to rename the demo +== Nem sikerült átnevezni a demót + +Use sounds +== Hangok használata + +Use team colors for name plates +== Csapat szín használata név tábláknál + +V-Sync +== V-Sync + +Version +== Verzió + +Vote command: +== Szavazás parancsa: + +Vote description: +== Szavazás leírása: + +Vote no +== Nem + +Vote yes +== Igen + +Voting +== Szavazás + +Warmup +== Felkészülés + +Weapon +== Fegyver + +Yes +== Igen + +You must restart the game for all settings to take effect. +== Újra kell indítani a játékot, a beállítások érvénybe lépéséhez. + +New name: +== Új Név: + +Sat. +== telítettség + + + +Internet +== Internet + + + +Max demos +== Maximum Demók + +News +== Hírek + +Join game +== Csatlakozás a játékhoz + +FSAA samples +== FSAA minták + +Sound volume +== Hangerő + +Created: +== Készült: + +Max Screenshots +== Maximum Fotó + +Length: +== Hossza: + +Laser +== Lézer + +Netversion: +== Netes verzió: + +Map: +== Pálya: + +Info +== Infó + +Miscellaneous +== Vegyes + +Record demo +== Demó felvétele + +Your skin +== Te skined + +Size: +== Méret: + +Reset to defaults +== Visszaállítás alapértelmezettre + +Quit anyway? +== Mindenképpen kilép? + +Display Modes +== Kijelző módok + +Version: +== Verzió: + +Round +== Menet + +Lht. +== Fényerősség + +UI Color +== UI Szín + +Hue +== Színárnyalat + +Crc: +== Crc: + +Alpha +== Alpha + +LAN +== Helyi + +Name plates size +== Névtáblák mérete + +Type: +== Típus: + +Dummy settings +== Dummy beállításai + +AntiPing +== Antiping + +Show quads +== Képek mutatása + +Map sound volume +== Pálya hangereje + +Show only chat messages from friends +== Csak barátoktól jön üzenet + +Countries +== Országok + +Reconnect in %d sec +== Újracsatlakozás %d másodperc múlva + +Grabs +== Megfog + +Background (entities) +== Háttér entitással + +Show kill messages +== Halálüzenetek mutatása + +Show ghost +== Szellem mutatása + +DDNet +== DDNet + +No updates available +== Nincs elérhető frissítés + +Enable server message sound +== Szerver chat hang engedélyezése + +second +== másodperc + +Show votes window after voting +== Szavazási ablak mutatása szavazás után + +HUD +== HUD + +Spectate previous +== Előző nézése + +Look out! +== Vigyázz! + +Spectate next +== Következő nézése + +Show names in chat in team colors +== Csapatszínben jelennek meg a játékosok a chatben + +Select a name +== Válassz nevet + +Enable team chat sound +== Csapat chat hang engedélyezése + +Show other players' hook collision lines +== Játékosok horogvonalaik mutatása + +We will win +== Nyerni fogunk + +Hi o/ +== Szia o/ + +Deaths +== Halálok + +Enable game sounds +== Játék hangok engedélyezése + +DDNet Client needs to be restarted to complete update! +== Újra kell indítani a DDNet Klienst a frissítés befejezéséhez! + +Spectator +== Néző + +Please use a different name +== Kérlek, válassz másik nevet + +Wait before try for +== Várj, mielőtt kipróbálod a: + +Show console window +== Konzol ablak mutatása + +Show others +== Játékosok mutatása + +Gameplay +== Játékmód + +Restart +== Újraindítás + +Game paused +== Játék megállítva + +Old mouse mode +== Régi egér mód + +Browser +== Böngésző + +Play background music +== Háttérzene lejátszása + +Follow +== Követni + +Reset +== Alap + +Enable gun sound +== Fegyverhang lejátszása + +Show health + ammo +== Élet + lőszer mutatása + +Team message +== Csapat üzenet + +Automatically create statboard csv +== Magától készítsen csv pontszámtáblát + +Save the best demo of each race +== Mentse el a legjobb demót minden versenynél + +Show tiles layers from BG map +== Block-ok mutatása a háttérben + +Are you sure that you want to disconnect? +== Biztos, hogy le akarsz csatlakozni? + +Types +== Típusok + +Ghost +== Szellem + +Remove chat +== Chat eltüntetése + +Check now +== Nézd meg + +Background (regular) +== Háttér (pálya) + +Reset wanted weapon on death +== Újraéledéskor váltson az akart fegyverre + +Frags +== Zászlók + +AntiPing: predict other players +== Antiping: más játékosokra + +Show other players' key presses +== Mutassa a játékosok mozgását nyilakkal + +Automatically take statboard screenshot +== Automatikusan készítsen pontszám fényképet + +System message +== Rendszer üzenet + +Enable long pain sound (used when shooting in freeze) +== Hosszú fájdalom hang lejátszása (mikor a játékos lő,ha lefagyott) + +DDNet %s is available: +== DDnet %s verzió elérhető + +Updating... +== Frissítés... + +Overlay entities +== Entitás jelenése + +Messages +== Üzenetek + +%.2f MiB +== %.2f MiB + +Refresh Rate +== Frissítési érték + +New random timeout code +== Új random időtúllépési kód + +Suicides +== Öngyilkosságok + +Player country: +== Játékos országa + +Net +== Net + +Loading DDNet Client +== DDNet Kliens betöltése + +FPM +== FPM + +Default zoom +== Alap nagyítás + +Show score +== Pontok mutatása + +Spree +== Szorzó + +Show client IDs in Scoreboard +== Mutassa a játékosok ID-ét a pontszámtáblán + +Demofile: %s +== Demófájl: %s + +Max CSVs +== Maximum CSV-k + +seconds +== másodpercek + +Borderless window +== Ablak mód + +%.2f KiB +== %.2f KiB + +Strict gametype filter +== Szigorú játékmód szűrő + +Try fast HTTP map download first +== Próbálja meg a gyors HTTP letöltést először + +Use DDRace Scoreboard +== DDRace pontszámtábla használata + +Best +== Legjobb + +Enable regular chat sound +== Alap chat hang lejátszása + +Normal message +== Normál üzenet + +Screen +== Képernyő + +Search +== Keresés + +Connecting dummy +== Másolat válasza... + +Clan plates size +== Klán felirat mérete + +Update now +== frissíts most + +Show clan above name plates +== Klán mutatása a nevek fölött + +Save ghost +== Szellem mentése + +Exclude +== Kizárás + +Enable highlighted chat sound +== kiemelt chat hang lejátszása + +Hello and welcome +== Hali és üdv + +AntiPing: predict weapons +== Antiping: fegyvereknél + +DDNet Client updated! +== DDNet Kliens frissítve van! + +Outline color +== Körvonal szín + +Highlighted message +== Kiemelt üzenet + +Friend +== Barát + +Switch weapon when out of ammo +== Fegyver váltása, ha elfogy a lőszer + +AntiPing: predict grenade paths +== Antiping: gránátoknál + +Demo +== Demó + +Inner color +== belső szín + +##### generated by copy_fix.py, please translate this ##### +##### update for 11.6 version by Cellegen ##### + +Ratio +== Érték + +Friend message +== Baráti üzenet + +Fat skins (DDFat) +== Nagy skinek (DDFat) + +may cause delay +== Késleltetést okozhat + +Unfinished map +== befejezetlen pálya + +Deactivate +== Deaktiválás + +Welcome to DDNet +== Üdvözlet a DDNet-en + +Preinit VBO (iGPUs only) +== VBO használata (csak iGPU) + +Threaded sound loading +== Csavarmenetes hang betöltése + +Activate +== Aktiválás + +Multiple texture units (disable for MacOS) +== Több textúra egységek (kapcsolja ki MacOS esetén) + +Use OpenGL 3.3 (experimental) +== OpenGL 3.3 használata (Haladó) + +UI mouse s. +== UI egér sebesség + +File already exists, do you want to overwrite it? +== A fájl már létezik, szeretné felülírni? + +Indicate map finish +== Befejezett pályák + +Save +== Mentés + +Vanilla skins only +== Csak alap skinek + +Date +== Idő + +Show DDNet map finishes in server browser +== Mutassa a befejezett pályákat a keresőben + +transmits your player name to info2.ddnet.tw +== Keress rá a játékosnevedre az info2.ddnet.tw oldalon + +Reload +== újratöltés + +Hammerfly dummy +== Dummy Kalapács + +Downloading %s: +== Letöltés %s: + +Time +== Idő + +Kill +== Halál + +Personal best: +== Egyéni record: + +Show entities +== Entitások mutatása + +Video name: +== Videó neve: + +Connect Dummy +== Dummy Csatlakoztatása + +Disconnect Dummy +== Dummy Lecsatlakoztatása + +Filter connecting players +== Csatlakozók szűrése + +Pause +== Nézetváltás + +Toggle dummy +== Dummy irányítása + +Fetch Info +== Minden infó + +Dummy copy +== Másolat tükrözése + +Enable replays +== Visszajátszások + +Render demo +== Demó renderelése + +Zoom in +== Nagyítás + +Show text entities +== Textúrázott entitások + +Render +== Render + +Show all +== Mutasson mindent + +Learn +== Wikipédia + +Successfully saved the replay! +== Sikeresen elmentette a visszajátszást! + +Zoom out +== Kicsinyítés + +DDNet %s is out! +== DDNet %s elérhető! + +Statboard +== Státusztábla + +Converse +== Fordítás + +Use high DPI +== Magas DPI használata + +Update failed! Check log... +== Frissítés sikertelen! nézd meg a logot... + +Toggle dyncam +== Dinamikus kamera + +%d new mentions +== %d új értesítés + +Default length: %d +== Átlagos hossz: %d + +Show HUD +== HUD mutatása + +Size +== Méret + +Destination file already exist +== A kiválasztott helynél ez létezik + +Server best: +== Legjobb szerver: + +Markers: +== Jelölések + +1 new mention +== 1 új értesíté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. +== A DDraceNetwork együttműködésen alapuló online játékként tekinthető, ahol a cél az, hogy te és egy csapat Tee elérje a célvonalat. Ha újonc vagy, a kezdő (Novice) szervereket ajánljuk, ahol a legegyszerűbb versenyeket tároljuk. A lehető legkisebb ping választása alapján válassz egy szervert. + +The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. +== A pályákon fagyasztó részeket találtok, melyek ideiglenesen blokkolják a játékos mozgását. Együtt kell dolgoznod a pályarészekkel az átjutáshoz. + +The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. +== A görgő megváltoztatja a fegyvereket. A kalapács (bal egérgomb) segítségével más Tee-ket megüthetsz és ütésekkel kiolvadhatnak a fagyásból. + +Hook (right mouse) can be used to swing through the map and to hook other tees to you. +== A horoggal (jobb egérgomb) megkapaszkodhatsz néhány platformon és más Tee-ket is megragadhatsz vele. + +Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. +== A legfontosabb kulcs a sikerhez: Nincs oktatóprogram, így mindenki magától tanulja meg más játékosok által. (T gombbal tudsz Chattelni) + +It's recommended that you check the settings to adjust them to your liking before joining a server. +== Ajánlott, hogy ellenőrizd a beállításokat, hogy a kedvedhez igazítsd őket, mielőtt csatlakoznál egy szerverhez. (Tipp: szűrők) + +Please enter your nickname below. +== Írja be lent a becenevét. + +9+ new mentions +== 9+ új értesítés + +Replay feature is disabled! +== Visszajátszás mód kikapcsolva! + +Lock team +== Csapat lezárása + +Hook collisions +== Horog pontossága + +Toggle ghost +== Szellem mutatása + +Markers +== Jelölések + +Replace video +== Videó lecserélése + +Length +== Hossz + +Are you sure that you want to disconnect your dummy? +== Biztos, hogy kiakarod léptetni a dummy-d? + +Saving ddnet-settings.cfg failed +== nem sikerült elmenteni ddnet-settings.cfg fájlt + +The width or height of texture %s is not divisible by 16, which might cause visual bugs. +== A mérete a texturának %s nem látható, ami látható bugokhoz vezethet. + +Warning +== Figyelmeztetés + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== Debug mód bekapcsolva. nyomd meg a Ctrl+Shift+D billentyű kombinációt a kikapcsolásához + +Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. +== Használd a k gombot az újraéledéshez, q betű a megfigyeléshez. nézd meg a beállításokat a többi bindért. + +Existing Player +== Létező Játékos + +Your nickname '%s' is already used (%d points). Do you still want to use it? +== A Neved '%s' már használva volt (%d ponttal). Biztosan szeretnéd használni? + +Checking for existing player with your name +== Keresés már létező játékos után a neveddel + +Country / Region +== Ország / Régió + +Speed +== Sebesség + +Theme +== Téma + +%d of %d servers +== %d a %d szerverből + +%d of %d server +== %d ből %d szerver + +%d players +== %d játékos + +%d player +== %d játékos + +Demos directory +== Demók Helye + +Smooth Dynamic Camera +== Egyenletesen dinamikus kamera + +Skip the main menu +== főmenű kihagyása + +Themes directory +== Témák Helye + +Download skins +== Skinek letöltése + +Skin prefix +== Karakter prefix + +Skin Database +== Több skin + +Skins directory +== Skinek Helye + +Game sound volume +== Játék Hangerő + +Chat sound volume +== Chat Hangerő + +Background music volume +== Háttér Zene hangerő + +Assets +== Kinézet + +Use old chat style +== régi chat stílus használata + +Highlight +== kijelöl + +Client message +== Kliens Üzenet + +Show others (own team only) +== Mások mutatása (csak csapatok) + +Use current map as background +== Jelenlegi map használta háttérként + +Entities +== Entitások + +Emoticons +== Hangulatjelek + +Particles +== effektek + +Assets directory +== Kinézet Helye + +https://wiki.ddnet.tw/ +== + +Website +== Weboldal + +Settings +== Beállítások + +Stop server +== Szerver leállítása + +Run server +== Szerver indítása + +Server executable not found, can't run server +== nem sikerült elindítani a szervert + +Editor +== Szerkesztő + +[Start menu] +Play +== Játszás + +Manual +== Manuális + +Race +== Verseny + +Auto +== Autómatikus + +Replay +== Visszajátszás From 6da48a0bc305f584f39405dc94cc34eaec6b7482 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 18:36:24 +0100 Subject: [PATCH 056/144] Fix scoreboard on ddnet server Broken in https://github.com/ddnet/ddnet/pull/3251 Thanks to louis for report --- src/game/client/components/scoreboard.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp index 0c9f9b3b6..2b6c22817 100644 --- a/src/game/client/components/scoreboard.cpp +++ b/src/game/client/components/scoreboard.cpp @@ -152,9 +152,6 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch if(Team == TEAM_SPECTATORS) return; - if(NumPlayers < 0) - NumPlayers = m_pClient->m_Snap.m_aTeamSize[Team]; - bool lower16 = false; bool upper16 = false; bool lower24 = false; @@ -178,6 +175,9 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch if(Team < -1) Team = 0; + if(NumPlayers < 0) + NumPlayers = m_pClient->m_Snap.m_aTeamSize[Team]; + float h = 760.0f; // background From e870a1bdc780fbd9e1dcef0562218118c83a603f Mon Sep 17 00:00:00 2001 From: Headshot <36455681+headshot2017@users.noreply.github.com> Date: Sat, 7 Nov 2020 14:00:01 -0400 Subject: [PATCH 057/144] "ya existe" --- data/languages/spanish.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt index 4aafdb6aa..7e8e3000b 100644 --- a/data/languages/spanish.txt +++ b/data/languages/spanish.txt @@ -1182,7 +1182,7 @@ Your nickname '%s' is already used (%d points). Do you still want to use it? == Tu nombre '%s' ya está usado (%d puntos). ¿Deseas seguir usándolo? Checking for existing player with your name -== Comprobando si ya hay un jugador con tu nombre +== Comprobando si ya existe un jugador con tu nombre Country / Region == País / Región From 5f7e8a7901ff5d19c04aa57b529c842f63218f8e Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sat, 7 Nov 2020 19:05:23 +0100 Subject: [PATCH 058/144] Fix chat scoreboard collision for 16:9 and disable scoreboard checks for lower aspect ratios --- src/game/client/components/chat.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index d83b1df23..d862e42c6 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -893,7 +893,9 @@ void CChat::OnPrepareLines() float y = 300.0f - 28.0f; float FontSize = FONT_SIZE; - bool IsScoreBoardOpen = m_pClient->m_pScoreboard->Active(); + float ScreenRatio = Graphics()->ScreenAspect(); + + bool IsScoreBoardOpen = m_pClient->m_pScoreboard->Active() && (ScreenRatio > 1.7f); // only assume scoreboard when screen ratio is widescreen(something around 16:9) bool ForceRecreate = IsScoreBoardOpen != m_PrevScoreBoardShowed; bool ShowLargeArea = m_Show || g_Config.m_ClShowChat == 2; @@ -917,7 +919,7 @@ void CChat::OnPrepareLines() RealMsgPaddingTee = 0; int64 Now = time(); - float LineWidth = (IsScoreBoardOpen ? 90.0f : 200.0f) - RealMsgPaddingX - RealMsgPaddingTee; + float LineWidth = (IsScoreBoardOpen ? 85.0f : 200.0f) - (RealMsgPaddingX * 1.5f) - RealMsgPaddingTee; float HeightLimit = IsScoreBoardOpen ? 180.0f : m_PrevShowChat ? 50.0f : 200.0f; float Begin = x; @@ -1230,9 +1232,12 @@ void CChat::OnRender() OnPrepareLines(); + float ScreenRatio = Graphics()->ScreenAspect(); + bool IsScoreBoardOpen = m_pClient->m_pScoreboard->Active() && (ScreenRatio > 1.7f); // only assume scoreboard when screen ratio is widescreen(something around 16:9) + int64 Now = time(); - float HeightLimit = m_pClient->m_pScoreboard->Active() ? 180.0f : m_PrevShowChat ? 50.0f : 200.0f; - int OffsetType = m_pClient->m_pScoreboard->Active() ? 1 : 0; + float HeightLimit = IsScoreBoardOpen ? 180.0f : m_PrevShowChat ? 50.0f : 200.0f; + int OffsetType = IsScoreBoardOpen ? 1 : 0; float RealMsgPaddingX = MESSAGE_PADDING_X; float RealMsgPaddingY = MESSAGE_PADDING_Y; From 1b07992c0041f2e213c7655b1b389eb893c02041 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 19:23:29 +0100 Subject: [PATCH 059/144] Add czech translation by eNJi --- data/languages/czech.txt | 1286 +++++++++++++++++++------------------- 1 file changed, 643 insertions(+), 643 deletions(-) diff --git a/data/languages/czech.txt b/data/languages/czech.txt index aee2c7fd2..b73390b91 100644 --- a/data/languages/czech.txt +++ b/data/languages/czech.txt @@ -310,10 +310,6 @@ Ping Pistol == Pistolka -[Demo browser] -Play -== Přehrát - Play background music == Přehrávat hudbu na pozadí @@ -626,671 +622,675 @@ Type: == Typ: Successfully saved the replay! -== - -Saving ddnet-settings.cfg failed -== +== Záznam byl úspěšně uložen! Replay feature is disabled! -== - -The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== - -Warning -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== Funkce opakovaného přehrávání je zakázána! Game paused -== +== Game paused Server best: -== +== Server best: Personal best: -== - -Browser -== - -Ghost -== - -Loading DDNet Client -== - -Reconnect in %d sec -== - -Render demo -== - -Replace video -== - -File already exists, do you want to overwrite it? -== - -Are you sure that you want to disconnect? -== - -Disconnect Dummy -== - -Are you sure that you want to disconnect your dummy? -== - -Welcome to DDNet -== - -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. -== - -The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. -== - -The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== - -Hook (right mouse) can be used to swing through the map and to hook other tees to you. -== - -Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== - -Please enter your nickname below. -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Country / Region -== - -Destination file already exist -== - -Speed -== - -Video name: -== - -Show DDNet map finishes in server browser -== - -transmits your player name to info2.ddnet.tw -== - -Theme -== - -Search -== - -Exclude -== - -%d of %d servers -== - -%d of %d server -== - -%d players -== - -%d player -== - -Filter connecting players -== - -Indicate map finish -== - -Unfinished map -== - -Countries -== - -Types -== - -Select a name -== - -Please use a different name -== - -Remove chat -== - -Markers: -== - -%.2f MiB -== - -%.2f KiB -== - -Demo -== - -Markers -== - -Length -== - -Date -== - -Fetch Info -== - -Demos directory -== - -Render -== - -Connecting dummy -== - -Connect Dummy -== - -Kill -== - -Pause -== - -Reload -== - -Deactivate -== - -Activate -== - -Save -== - -Smooth Dynamic Camera -== - -Switch weapon when out of ammo -== - -Reset wanted weapon on death -== - -Show only chat messages from friends -== - -Show clan above name plates -== - -Clan plates size -== - -Skip the main menu -== - -Refresh Rate -== - -Show console window -== - -Themes directory -== - -Automatically take statboard screenshot -== - -Automatically create statboard csv -== - -Max CSVs -== - -Dummy settings -== - -Download skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Skin Database -== - -Skins directory -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Default zoom -== - -Show others -== - -Show all -== - -Toggle dyncam -== - -Toggle dummy -== - -Toggle ghost -== - -Dummy copy -== - -Hammerfly dummy -== - -Converse -== - -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -UI mouse s. -== - -Borderless window -== - -may cause delay -== - -Screen -== - -Use OpenGL 3.3 (experimental) -== - -Preinit VBO (iGPUs only) -== - -Multiple texture units (disable for MacOS) -== - -Use high DPI -== - -Enable game sounds -== - -Enable gun sound -== - -Enable long pain sound (used when shooting in freeze) -== - -Enable server message sound -== - -Enable regular chat sound -== - -Enable team chat sound -== - -Enable highlighted chat sound -== - -Threaded sound loading -== - -Game sound volume -== - -Chat sound volume -== - -Map sound volume -== - -Background music volume -== - -HUD -== - -DDNet -== - -Assets -== - -DDNet Client needs to be restarted to complete update! -== - -Use DDRace Scoreboard -== - -Show client IDs in Scoreboard -== - -Show score -== - -Show health + ammo -== - -Use old chat style -== - -Show names in chat in team colors -== - -Show kill messages -== - -Show votes window after voting -== - -Messages -== - -System message -== - -Reset -== - -Highlighted message -== - -Spectator -== - -Look out! -== - -Team message -== - -We will win -== - -Friend message -== - -Highlight -== - -Friend -== - -Hi o/ -== - -Normal message -== - -Hello and welcome -== - -Client message -== - -Inner color -== - -Outline color -== - -Wait before try for -== - -second -== - -seconds -== - -Save the best demo of each race -== - -Default length: %d -== - -Enable replays -== - -Show ghost -== - -Save ghost -== - -Gameplay -== - -Overlay entities -== - -Size -== - -Show text entities -== - -Show others (own team only) -== - -Show quads -== - -AntiPing -== - -AntiPing: predict other players -== - -AntiPing: predict weapons -== - -AntiPing: predict grenade paths -== - -Show other players' hook collision lines -== - -Show other players' key presses -== - -Old mouse mode -== - -Background (regular) -== - -Background (entities) -== - -Use current map as background -== - -Show tiles layers from BG map -== - -Try fast HTTP map download first -== - -DDNet %s is available: -== - -Update now -== - -Updating... -== - -DDNet Client updated! -== - -No updates available -== - -Check now -== - -New random timeout code -== - -Entities -== - -Emoticons -== - -Particles -== - -Assets directory -== +== Personal best: Learn -== +== Učit se + +Browser +== Browser + +Ghost +== Duch + +Loading DDNet Client +== Načítání DDNet klienta + +Reconnect in %d sec +== Opětovné připojení za %d sekund + +Render demo +== Vyrenderovat demo + +Replace video +== Nahradit video + +File already exists, do you want to overwrite it? +== Soubor již existuje, chcete jej přepsat? + +Are you sure that you want to disconnect? +== Jste si jisti, že se chcete odpojit? + +Disconnect Dummy +== Odpojit Dummyho + +Are you sure that you want to disconnect your dummy? +== Jste si jisti, že chcete odpojit svého dummyho? + +Welcome to DDNet +== Vítejte na DDNetu + +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 je kooperativní online hra, kde je cílem pro vás a vaši skupinu dosáhnout cílové čáry mapy. Jako nováček byste měli začít na začínajících serverech, které hostují nejjednodušší mapy. Zvažte ping a vyberte si server, který je vám nejblíž. + +The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. +== Mapy obsahují zmrazení, které dočasně znemožňuje vašemu tee pohyb. Abyste se dostali přes tyto části, musíte spolupracovat. + +The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. +== Kolečko myši mění zbraně. Kladivo (levé tlačítko myši) lze použít k zasažení ostatních tee a jejich rozmražení. + +Hook (right mouse) can be used to swing through the map and to hook other tees to you. +== Hák (pravé tlačítko myši) lze použít k zhoupnutí se skrz mapu a k přitáhnutí ostatních tee k vám. + +Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. +== A co je nejdůležitější, klíčem je komunikace. Neexistuje žádný návod, takže budete muset chatovat (klávesou t) s ostatními hráči, abyste se naučili základy a triky hry. + +It's recommended that you check the settings to adjust them to your liking before joining a server. +== Před připojením k serveru se doporučuje zkontrolovat nastavení a upravit je podle vašich představ. + +Destination file already exist +== Cílový soubor již existuje + +Video name: +== Název videa: + +Show DDNet map finishes in server browser +== Zobrazit dokončení DDNet map v prohlížeči serveru + +Search +== Hledat + +Exclude +== Vyloučit + +Filter connecting players +== Filtrovat připojující se hráče + +Indicate map finish +== Indikovat dokončení mapy + +Unfinished map +== Nedokončená mapa + +Countries +== Země + +Types +== Typy + +DDNet %s is out! +== DDNet %s je venku! + +Downloading %s: +== Stahování %s: + +DDNet Client updated! +== Aktualizace selhala! Zkontrolujte log... + +Update now +== Aktualizovat nyní + +Restart +== Restartovat + +Select a name +== Vyberte jméno + +Please use a different name +== Použijte jiné jméno + +Remove chat +== Odebrat chat + +Markers: +== Markery: + +%.2f MiB +== %.2f MiB + +%.2f KiB +== %.2f KiB + +Demo +== Demo + +Markers +== Markery + +Length +== Délka + +Date +== Datum + +Fetch Info +== Načíst informace + +Render +== Render + +Connecting dummy +== Připojování dummyho + +Connect Dummy +== Připojit dummyho + +Reload +== Znovu načíst + +Deactivate +== Deaktivovat + +Activate +== Aktivovat + +Save +== Uložit + +Switch weapon when out of ammo +== Změnit zbraň když vám dojdou náboje + +Reset wanted weapon on death +== Resetujte hledanou zbraň po smrti + +Show only chat messages from friends +== Zobrazit pouze zprávy od přátel + +Show clan above name plates +== Ukázat klan nad jménem + +Clan plates size +== Velikost klanových jmenovek + +Refresh Rate +== Obnovovací frekvence + +Show console window +== Zobrazit konzolové okno + +Automatically take statboard screenshot +== Automaticky pořídit snímek obrazovky statboardu + +Automatically create statboard csv +== Automaticky vytvořit statboard csv + +Max CSVs +== Maximální CSV + +Dummy settings +== Nastavení dummyho + +Vanilla skins only +== Pouze vanilla skiny + +Fat skins (DDFat) +== Tlusté skiny (DDFat) + +Skin prefix +== Skin prefix + +Hook collisions +== Kolize háku + +Pause +== Pauza + +Kill +== Zabít + +Zoom in +== Přiblížit + +Zoom out +== Oddálit + +Default zoom +== Výchozí zvětšení + +Show others +== Ukázat ostatní + +Show all +== Ukázat všechny + +Toggle dyncam +== Přepnout dyncam + +Toggle dummy +== Přepnout dummyho + +Toggle ghost +== Přepnout ducha + +Dummy copy +== Dummy kopírovat + +Hammerfly dummy +== Dummy hammerfly + +Converse +== Konverzovat + +Statboard +== Statboard + +Lock team +== Zamknout tým + +Show entities +== Zobrazit entity + +Show HUD +== Zobrazit HUD + +UI mouse s. +== UI mouse s. + +Borderless window +== Okno bez okrajů + +may cause delay +== může způsobit zpoždění + +Screen +== Obrazovka + +Use OpenGL 3.3 (experimental) +== Použít OpenGL 3.3 (experimentální) + +Preinit VBO (iGPUs only) +== Preinit VBO (pouze iGPU) + +Multiple texture units (disable for MacOS) +== Více texturových jednotek (deaktivovat pro MacOS) + +Use high DPI +== Použít vysoké DPI + +Enable game sounds +== Povolit zvuky hry + +Enable gun sound +== Povolit zvuk zbraně + +Enable long pain sound (used when shooting in freeze) +== Povolit zvuk dlouhé bolesti (používá se při střílení ve zmrazení) + +Enable server message sound +== Povolit zvuk zpráv serveru + +Enable regular chat sound +== Povolit normální zvuk chatu + +Enable team chat sound +== Povolit zvuk týmového chatu + +Enable highlighted chat sound +== Povolit zvuk zvýrazněné zprávy + +Threaded sound loading +== Načítání Threaded zvuku + +Map sound volume +== Hlasitost zvuků mapy + +HUD +== HUD + +DDNet +== DDNet + +DDNet Client needs to be restarted to complete update! +== K dokončení aktualizace je nutné restartovat klienta DDNet! + +Use DDRace Scoreboard +== Použijte hodnotící tabuli DDRace + +Show client IDs in Scoreboard +== Zobrazit ID klienta ve výsledkové tabulce + +Show score +== Zobrazit skóre + +Show health + ammo +== Ukázat zdraví + munici + +Show names in chat in team colors +== Zobrazit jména v chatu v týmových barvách + +Show kill messages +== Zobrazit zprávy zabití + +Show votes window after voting +== Zobrazit okno hlasování po hlasování + +Messages +== Zprávy + +System message +== Systémová zpráva + +Reset +== Resetovat + +Highlighted message +== Zvýrazněná zpráva + +Spectator +== Divák + +Look out! +== Pozor! + +Team message +== Týmová zpráva + +We will win +== Vyhrajeme + +Friend message +== Zpráva od přítele + +Friend +== Přítel + +Hi o/ +== Ahoj o/ + +Normal message +== Normální zpráva + +Hello and welcome +== Ahoj a vítejte + +Inner color +== Vnitřní barva + +Outline color +== Barva obrysu + +Wait before try for +== Počkejte, než to zkusíte + +second +== sekunda + +seconds +== sekundy + +Save the best demo of each race +== Uložte si nejlepší demo každého závodu + +Default length: %d +== Výchozí délka: %d + +Enable replays +== Povolit záznamy + +Show ghost +== Ukázat ducha + +Save ghost +== Uložit ducha + +Gameplay +== Hratelnost + +Overlay entities +== Překrytí entit + +Size +== Velikost + +Show text entities +== Zobrazit textové entity + +Show others (own team only) +== Zobrazit ostatní (pouze vlastní tým) + +Show quads +== Zobrazit quads + +AntiPing +== AntiPing + +AntiPing: predict other players +== AntiPing: předvídání ostatních hráčů + +AntiPing: predict weapons +== AntiPing: předvídání zbraní + +AntiPing: predict grenade paths +== AntiPing: předvídání cest granátů + +Show other players' hook collision lines +== Zobrazit čáru kolize háků ostatních hráčů + +Show other players' key presses +== Zobrazit stisknutí kláves ostatních hráčů + +Old mouse mode +== Starý režim myši + +Background (regular) +== Pozadí (běžné) + +Background (entities) +== Pozadí (entity) + +Show tiles layers from BG map +== Zobrazit vrstvy dlaždic z mapy BG + +Try fast HTTP map download first +== Zkusit rychlé HTTP stáhnutí map jako první + +DDNet %s is available: +== DDNet %s je k dispozici: + +Updating... +== Aktualizace... + +No updates available +== Nejsou k dispozici žádné aktualizace + +Check now +== Zkontrolovat nyní + +New random timeout code +== Nový náhodný timeout kód + +Time +== Čas + +Manual +== Manuál + +Race +== Závod + +Auto +== Auto + +Replay +== Replay + +Follow +== Následovat + +Frags +== Fragy + +Deaths +== Smrti + +Suicides +== Sebevraždy + +Ratio +== Poměr + +Net +== Net + +FPM +== FPM + +Spree +== Řádění + +Best +== Nejlepší + +Grabs +== Chycení + +1 new mention +== 1 nová zmínka + +%d new mentions +== %d nových zmínek + +9+ new mentions +== 9+ nových zmínek + +Saving ddnet-settings.cfg failed +== Uložení souboru ddnet-settings.cfg se nezdařilo + +The width or height of texture %s is not divisible by 16, which might cause visual bugs. +== Šířka nebo výška textury %s není dělitelná 16, což může způsobit vizuální chyby. + +Warning +== Varování + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== Režim ladění povolen. Stisknutím kláves Ctrl + Shift + D deaktivujte režim ladění. + +Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. +== Pomocí klávesy k se zabijete (restartujte), pomocí q se zapauzijete a můžete sledovat ostatní hráče. Viz nastavení pro další klávesové zkratky. + +Please enter your nickname below. +== Níže zadejte svou přezdívku. + +Existing Player +== Stávající hráč + +Your nickname '%s' is already used (%d points). Do you still want to use it? +== Vaše přezdívka '%s' je již použita (%d bodů). Chcete jej i přes to používat? + +Checking for existing player with your name +== Kontrola pro existujícího hráče s vaším jménem + +Country / Region +== Země / Region + +Speed +== Rychlost + +transmits your player name to info2.ddnet.tw +== přenese vaše jméno hráče na info2.ddnet.tw + +Theme +== Téma + +%d of %d servers +== %d z %d serverů + +%d of %d server +== %d z %d serverů + +%d players +== %d hráčů + +%d player +== %d hráč + +[Demo browser] +Play +== Přehrát + +Demos directory +== Adresář dem + +Smooth Dynamic Camera +== Hladká dynamická kamera + +Skip the main menu +== Přeskočit hlavní nabídku + +Themes directory +== Adresář témat + +Download skins +== Stáhnout skiny + +Skin Database +== Databáze skinů + +Skins directory +== Adresář skinů + +Game sound volume +== Hlasitost zvuku hry + +Chat sound volume +== Hlasitost chatu + +Background music volume +== Hlasitost hudby na pozadí + +Assets +== Aktiva + +Use old chat style +== Použijte starý styl chatu + +Highlight +== Zvýraznit + +Client message +== Zpráva klienta + +Use current map as background +== Použít aktuální mapu jako pozadí + +Entities +== Entity + +Emoticons +== Emotikony + +Particles +== Částice + +Assets directory +== Adresář aktiv https://wiki.ddnet.tw/ -== +== https://wiki.ddnet.tw/ Website -== +== webová stránka Settings -== +== Nastavení Stop server -== +== Zastavit server Run server -== +== Spustit server Server executable not found, can't run server -== +== Spustitelný soubor serveru nebyl nalezen, server nelze spustit Editor -== +== Editor [Start menu] Play -== - -DDNet %s is out! -== - -Downloading %s: -== +== Hrát Update failed! Check log... -== - -Restart -== - -Time -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -Follow -== - -Frags -== - -Deaths -== - -Suicides -== - -Ratio -== - -Net -== - -FPM -== - -Spree -== - -Best -== - -Grabs -== - -1 new mention -== - -%d new mentions -== - -9+ new mentions -== +== Aktualizace selhala! Zkontrolujte log... From d04f2cf96241948a062e68bbcf346e990a0f2b76 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 11:14:58 +0100 Subject: [PATCH 060/144] blocklist_driver unit test: also check gl version --- src/test/blocklist_driver.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/test/blocklist_driver.cpp b/src/test/blocklist_driver.cpp index 13d2ecbac..aa0cb926b 100644 --- a/src/test/blocklist_driver.cpp +++ b/src/test/blocklist_driver.cpp @@ -2,12 +2,31 @@ #include -TEST(BlocklistDriver, Valid) +TEST(BlocklistDriver, Valid1) { - int Major, Minor, Patch; + int Major = -1, Minor = -1, Patch = -1; EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7810", Major, Minor, Patch), "This Intel driver version can cause crashes, please update it to a newer version."); + EXPECT_EQ(Major, 2); + EXPECT_EQ(Minor, 0); + EXPECT_EQ(Patch, 0); +} + +TEST(BlocklistDriver, Valid2) +{ + int Major = -1, Minor = -1, Patch = -1; EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7926", Major, Minor, Patch), "This Intel driver version can cause crashes, please update it to a newer version."); + EXPECT_EQ(Major, 2); + EXPECT_EQ(Minor, 0); + EXPECT_EQ(Patch, 0); +} + +TEST(BlocklistDriver, Valid3) +{ + int Major = -1, Minor = -1, Patch = -1; EXPECT_STREQ(ParseBlocklistDriverVersions("Intel", "Build 26.20.100.7985", Major, Minor, Patch), "This Intel driver version can cause crashes, please update it to a newer version."); + EXPECT_EQ(Major, 2); + EXPECT_EQ(Minor, 0); + EXPECT_EQ(Patch, 0); } TEST(BlocklistDriver, Invalid) From 7e0cbb5b09e89892df052326fd04f63dc966be74 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 7 Nov 2020 19:57:25 +0100 Subject: [PATCH 061/144] Fix sizeof differently --- src/base/system.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/system.c b/src/base/system.c index ee2cf4729..c8f29fbee 100644 --- a/src/base/system.c +++ b/src/base/system.c @@ -1928,7 +1928,7 @@ int net_unix_send(UNIXSOCKET sock, UNIXSOCKETADDR *addr, void *data, int size) void net_unix_set_addr(UNIXSOCKETADDR *addr, const char *path) { - mem_zero(addr, sizeof(UNIXSOCKETADDR)); + mem_zero(addr, sizeof(*addr)); addr->sun_family = AF_UNIX; str_copy(addr->sun_path, path, sizeof(addr->sun_path)); } From 7c0e2212e23c68b1dcff71eb40131e70b2413e4c Mon Sep 17 00:00:00 2001 From: def Date: Sun, 8 Nov 2020 00:02:34 +0100 Subject: [PATCH 062/144] Fix ScaleFontSize with too long strings Thanks to PopCorn181 for report --- src/engine/client/text.cpp | 4 ++-- src/game/editor/editor.cpp | 18 +++++++++--------- src/game/editor/editor.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index ada1f60b4..dad66bf32 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -897,7 +897,7 @@ public: //the outlined texture is always the same size as the current float UVScale = 1.0f / pFont->m_CurTextureDimensions[0]; - const char *pCurrent = (char *)pText; + const char *pCurrent = pText; const char *pEnd = pCurrent + Length; if((m_RenderFlags & TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT) != 0) @@ -941,7 +941,7 @@ public: const char *pBatchEnd = pEnd; if(pCursor->m_LineWidth > 0 && !(pCursor->m_Flags & TEXTFLAG_STOP_AT_END)) { - int Wlen = minimum(WordLength((char *)pCurrent), (int)(pEnd - pCurrent)); + int Wlen = minimum(WordLength(pCurrent), (int)(pEnd - pCurrent)); CTextCursor Compare = *pCursor; Compare.m_X = DrawX; Compare.m_Y = DrawY; diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 538caf05d..19b722d3e 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -2962,9 +2962,9 @@ void CEditor::DoMapEditor(CUIRect View) //UI()->ClipDisable(); } -float CEditor::ScaleFontSize(char *aBuf, float FontSize, int Width) +float CEditor::ScaleFontSize(char *pText, int TextSize, float FontSize, int Width) { - while(TextRender()->TextWidth(0, FontSize, aBuf, -1, -1.0f) > Width) + while(TextRender()->TextWidth(0, FontSize, pText, -1, -1.0f) > Width) { if(FontSize > 6.0f) { @@ -2972,8 +2972,8 @@ float CEditor::ScaleFontSize(char *aBuf, float FontSize, int Width) } else { - aBuf[str_length(aBuf) - 4] = '\0'; - str_append(aBuf, "...", sizeof(aBuf)); + pText[str_length(pText) - 4] = '\0'; + str_append(pText, "...", TextSize); } } return FontSize; @@ -3140,7 +3140,7 @@ int CEditor::DoProperties(CUIRect *pToolBox, CProperty *pProps, int *pIDs, int * else str_format(aBuf, sizeof(aBuf), "%s", m_Map.m_lImages[pProps[i].m_Value]->m_aName); - float FontSize = ScaleFontSize(aBuf, 10.0f, Shifter.w); + float FontSize = ScaleFontSize(aBuf, sizeof(aBuf), 10.0f, Shifter.w); if(DoButton_Ex(&pIDs[i], aBuf, 0, &Shifter, 0, 0, CUI::CORNER_ALL, FontSize)) PopupSelectImageInvoke(pProps[i].m_Value, UI()->MouseX(), UI()->MouseY()); @@ -3194,7 +3194,7 @@ int CEditor::DoProperties(CUIRect *pToolBox, CProperty *pProps, int *pIDs, int * else str_format(aBuf, sizeof(aBuf), "%s", m_Map.m_lSounds[pProps[i].m_Value]->m_aName); - float FontSize = ScaleFontSize(aBuf, 10.0f, Shifter.w); + float FontSize = ScaleFontSize(aBuf, sizeof(aBuf), 10.0f, Shifter.w); if(DoButton_Ex(&pIDs[i], aBuf, 0, &Shifter, 0, 0, CUI::CORNER_ALL, FontSize)) PopupSelectSoundInvoke(pProps[i].m_Value, UI()->MouseX(), UI()->MouseY()); @@ -3213,7 +3213,7 @@ int CEditor::DoProperties(CUIRect *pToolBox, CProperty *pProps, int *pIDs, int * else str_format(aBuf, sizeof(aBuf), "%s", m_Map.m_lImages[pProps[i].m_Min]->m_AutoMapper.GetConfigName(pProps[i].m_Value)); - float FontSize = ScaleFontSize(aBuf, 10.0f, Shifter.w); + float FontSize = ScaleFontSize(aBuf, sizeof(aBuf), 10.0f, Shifter.w); if(DoButton_Ex(&pIDs[i], aBuf, 0, &Shifter, 0, 0, CUI::CORNER_ALL, FontSize)) PopupSelectConfigAutoMapInvoke(pProps[i].m_Value, UI()->MouseX(), UI()->MouseY()); @@ -3240,7 +3240,7 @@ int CEditor::DoProperties(CUIRect *pToolBox, CProperty *pProps, int *pIDs, int * else str_format(aBuf, sizeof(aBuf), "%d", CurValue); - float FontSize = ScaleFontSize(aBuf, 10.0f, Shifter.w); + float FontSize = ScaleFontSize(aBuf, sizeof(aBuf), 10.0f, Shifter.w); RenderTools()->DrawUIRect(&Shifter, Color, 0, 5.0f); UI()->DoLabel(&Shifter, aBuf, FontSize, 0, -1); @@ -4785,7 +4785,7 @@ void CEditor::RenderStatusbar(CUIRect View) else str_copy(aBuf, m_pTooltip, sizeof(aBuf)); - float FontSize = ScaleFontSize(aBuf, 10.0f, View.w); + float FontSize = ScaleFontSize(aBuf, sizeof(aBuf), 10.0f, View.w); UI()->DoLabel(&View, aBuf, FontSize, -1, View.w); } } diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index d9fa6a107..abce25cd6 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -799,7 +799,7 @@ public: bool IsQuadSelected(int Index); int FindSelectedQuadIndex(int Index); - float ScaleFontSize(char *aBuf, float FontSize, int Width); + float ScaleFontSize(char *pText, int TextSize, float FontSize, int Width); int DoProperties(CUIRect *pToolbox, CProperty *pProps, int *pIDs, int *pNewVal, ColorRGBA Color = ColorRGBA(1, 1, 1, 0.5f)); int m_Mode; From 6fbb16184627d00ce83f4369bc118c647fb3f6f8 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 8 Nov 2020 01:41:12 +0100 Subject: [PATCH 063/144] Fix wrong alignment --- src/game/client/components/menus_browser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 0b553caf5..492195a04 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -461,7 +461,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_PLAYER)) TextRender()->TextColor(0.4f, 0.4f, 1.0f, 1); float FontSize = 12.0f * UI()->Scale(); - UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPlayers), &Button, aTemp, FontSize, -1, Button.w, 1, true); + UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPlayers), &Button, aTemp, FontSize, 1, Button.w, 1, true); TextRender()->TextColor(1, 1, 1, 1); } else if(ID == COL_PING) @@ -474,14 +474,14 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) } float FontSize = 12.0f * UI()->Scale(); - UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPing), &Button, aTemp, FontSize, -1, Button.w, 1, true); + UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPing), &Button, aTemp, FontSize, 1, Button.w, 1, true); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); } else if(ID == COL_VERSION) { const char *pVersion = pItem->m_aVersion; float FontSize = 12.0f * UI()->Scale(); - UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColVersion), &Button, pVersion, FontSize, -1, Button.w, 1, true); + UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColVersion), &Button, pVersion, FontSize, 1, Button.w, 1, true); } else if(ID == COL_GAMETYPE) { From 6db4323daf60130cb20d88339346d260a16418d7 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 8 Nov 2020 03:42:35 +0100 Subject: [PATCH 064/144] Fix spawnpoints calculation --- src/game/server/gamecontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index 98fe38ab7..620c3068d 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -142,7 +142,7 @@ bool IGameController::OnEntity(int Index, vec2 Pos, int Layer, int Flags, int Nu { int Type = Index - ENTITY_SPAWN; m_aaSpawnPoints[Type][m_aNumSpawnPoints[Type]] = Pos; - m_aNumSpawnPoints[Type] = minimum(m_aNumSpawnPoints[Type], (int)(sizeof(m_aaSpawnPoints[0]) / sizeof(m_aaSpawnPoints[0][0]) - 1)); + m_aNumSpawnPoints[Type] = minimum(m_aNumSpawnPoints[Type] + 1, (int)(sizeof(m_aaSpawnPoints[0]) / sizeof(m_aaSpawnPoints[0][0]))); } else if(Index == ENTITY_DOOR) From 24dedd41e98b4688fe176b187fea17931afa1d53 Mon Sep 17 00:00:00 2001 From: def Date: Sun, 8 Nov 2020 10:18:35 +0100 Subject: [PATCH 065/144] Update Italian (by Shawn.) --- data/languages/italian.txt | 1087 ++++++++++++++++++------------------ 1 file changed, 545 insertions(+), 542 deletions(-) diff --git a/data/languages/italian.txt b/data/languages/italian.txt index dde406124..9264dd562 100644 --- a/data/languages/italian.txt +++ b/data/languages/italian.txt @@ -591,7 +591,7 @@ Size: ##### translated strings ##### Reset to defaults -== Reimposta +== Reimposta predefinito Quit anyway? == Vuoi chiudere comunque? @@ -609,7 +609,7 @@ Lht. == Luminosità UI Color -== Color interfaccia +== Colore interfaccia Crc: == Crc: @@ -627,31 +627,31 @@ Type: == Tipo: DDNet %s is out! -== DDNet %s è uscito +== DDNet %s è uscito! %d new mentions == %d nuove menzioni Disconnect Dummy -== +== Disconnetti Dummy Are you sure that you want to disconnect your dummy? -== +== Sei sicuro di voler disconnettere il tuo dummy? Filter connecting players -== +== Filtra i giocatori in conness. 9+ new mentions -== 9+ nuova menzione +== 9+ nuove menzioni Markers == Marcatrici Disconnect Dummy -== Disconnetti il manichino +== Disconnetti il dummy Length -== +== Lunghezza Fetch Info == Recuperare informazioni @@ -660,13 +660,13 @@ Length == Lunghezza Downloading %s: -== +== Scaricando %s: Update failed! Check log... == Aggiornamento non riuscito! Controlla registro... Filter connecting players -== Filtra i giocatori in connessione +== Filtra i giocatori in conness. Time == Tempo @@ -675,157 +675,641 @@ Downloading %s: == Scarica %s Are you sure that you want to disconnect your dummy? -== Sei sicuro di voler scollegare il tuo manichino? +== Sei sicuro di voler scollegare il tuo dummy? 1 new mention == 1 nuova menzione Successfully saved the replay! -== +== Hai salvato il replay con successo! Saving ddnet-settings.cfg failed -== +== Salvataggio di ddnet-settings.cfg non riuscito Replay feature is disabled! -== +== Il replay è disabilitato! The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== +== La largezza o altezza della texture %s non è divisibile per 16, quindi potrebbe causare dei bug visivi. Warning -== +== Attenzione Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== Modalità debug attivata. Premi Ctrl+Shift+D per disattivare la modalità debug. Game paused -== +== Gioco in pausa Server best: -== +== Migliore del server Personal best: -== +== Miglior tempo personale Browser -== +== Browser Ghost -== +== Ghost Loading DDNet Client -== +== Caricando Client DDNet Reconnect in %d sec -== +== Riconnettiti in %d secondi Render demo -== +== Renderizza demo Replace video -== +== Rimpiazza video File already exists, do you want to overwrite it? -== +== Il file già esiste, vuoi sovrascriverlo? Are you sure that you want to disconnect? -== +== Sei sicuro di volerti disconnettere? Welcome to DDNet -== +== Benvenuto in DDNet 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 è un gioco online cooperativo dove l'obbiettivo è per te ed il tuo gruppo di tee di raggiungere la linea del traguardo della mappa. Da nuovo arrivato dovresti iniziare sui server Novice, dove sono ospitate le mappe più facili. Considera il ping per scegliere un server vicino a te. The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. -== +== Le mappe contengono freeze, che rendono temporaneamente impossibile il movimento per un tee. Devi fare gioco di squadra per superare queste parti. The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== +== La rotellina del mouse cambia le armi.Il Martello (tasto sinistro mouse) può essere usato per colpire altri tee e svegliarli quando sono stati gelati nel freeze. Hook (right mouse) can be used to swing through the map and to hook other tees to you. -== +== Il Rampino (tasto destro mouse) può essere usato per aggrapparsi ad alcune superfici e per agganciare altri tee. Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. -== +== La cosa più importante è la comunicazione: Non ci sono tutorial quindi dovrai scrivere in chat (tasto t) con altri giocatori per imparare le basi e i trucchi del gioco. Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== +== Usa il tasto k per ucciderti (respawn), il tasto q per andare in modalità pausa e guardare altri giocatori. Guarda le impostazioni per gli altri tasti. It's recommended that you check the settings to adjust them to your liking before joining a server. -== +== E' raccomandato controllare le impostazioni e aggiustarle a tuo piacimento prima di entrare in un server. Please enter your nickname below. -== +== Per favore inserisci il tuo nickname qui sotto. Existing Player -== +== Giocatore esistente Your nickname '%s' is already used (%d points). Do you still want to use it? -== +== Il tuo nickname '%s' è già usato (punti %d). Vuoi comunque usarlo? Checking for existing player with your name -== +== Controllando per un giocatore esistente con il tuo nome Country / Region -== +== Paese / Regione Destination file already exist -== +== Il file destinazione esiste già Speed -== +== Velocità Video name: -== +== Nome del video: Show DDNet map finishes in server browser -== +== Mostra le mappe finite in DDNet nel tuo browser dei server transmits your player name to info2.ddnet.tw -== + +== Transmette il tuo nome da giocatore a info2.ddnet.tw + Theme -== +== Tema Search -== +== Cerca Exclude -== +== Escludi %d of %d servers -== +== %d di %d server %d of %d server -== +== %d di %d server %d players -== +== %d giocatori %d player -== +== %d giocatore Indicate map finish -== +== Indica una mappa finita Unfinished map -== +== Mappa non finita Countries -== +== Paesi Types -== +== Tipi Select a name -== +== Seleziona un nome Please use a different name -== +== Per favore usa un nome differente Remove chat -== +== Rimuovi chat + +Demo +== Demo + +Date +== Data + +Demos directory +== Cartella delle demo + +Render +== Renderizza + +Connecting dummy +== Connettendo dummy + +Connect Dummy +== Connetti Dummy + +Kill +== Respawn + +Pause +== Pausa + +Reload +== Ricarica + +Deactivate +== Disattiva + +Activate +== Attiva + +Save +== Salva + +Smooth Dynamic Camera +== Camera dinamica liscia + +Switch weapon when out of ammo +== Cambia arma quando senza munizioni + +Reset wanted weapon on death +== Resetta l'arma voluta quando muori + +Show only chat messages from friends +== Mostra solo messaggi da parte di amici + +Show clan above name plates +== Mostra clan sopra la targa dei nomi + +Clan plates size +== Grandezza della targa del clan + +Skip the main menu +== Salta il menu principale + +Refresh Rate +== Frequenza di aggiornamento + +Show console window +== Monstra la console + +Themes directory +== Cartella dei temi + +Automatically take statboard screenshot +== Fai una cattura di schermata automaticamente alla statboard + +Automatically create statboard csv +== Crea automaticamente massimo valore separato da virgole (CSV) in statboard + +Max CSVs +== Massimo valore separato da virgole (CSV) + +Dummy settings +== Impostazioni Dummy + +Download skins +== Scarica skin + +Vanilla skins only +== Solo skin vanilla + +Fat skins (DDFat) +== Skin grasse (DDFat) + +Skin prefix +== Prefisso skin + +Skin Database +== Database delle skin + +Skins directory +== Cartella delle skin + +Hook collisions +== Linea dell'hook + +Zoom in +== Ingrandisci in dentro + +Zoom out +== Ingrandisci in fuori + +Default zoom +== Zoom predefinito + +Show others +== Mostra altri + +Show all +== Mostra tutti + +Toggle dyncam +== Attiva/disattiva dyncam + +Toggle dummy +== Attiva/disattiva dummy + +Toggle ghost +== Attiva/disattiva ghost + +Dummy copy +== Dummy copy + +Hammerfly dummy +== Hammerfly dummy + +Laser +== Laser/cecchino + +Statboard +== Tabellone segnapunti + +Lock team +== Blocca la squadra (team) + +Show entities +== Mostra entities + +Show HUD +== Mostra interf. utente + +UI mouse s. +== Sensibilità mouse nei menu + +Borderless window +== Finestra senza bordi + +may cause delay +== Può esserci ritardo + +Screen +== Schermo + +Use OpenGL 3.3 (experimental) +== Usa OpenGL 3.3 (sperimentale) + +Preinit VBO (iGPUs only) +== Preinit VBO (solo iGPU) + +Multiple texture units (disable for MacOS) +== Unità multiple di texture + +Use high DPI +== Usa DPI alti + +Enable game sounds +== Abilita suoni del gioco + +Enable gun sound +== Abilita suono delle armi + +Enable long pain sound (used when shooting in freeze) +== Abilita suono di dolore (quando premi tasto sinistro nel freeze) + +Enable server message sound +== Abilita suono del messaggio del server + +Enable regular chat sound +== Abilita suono della chat normale + +Enable team chat sound +== Abilita suono della chat di squadra + +Enable highlighted chat sound +== Abilita suono della chat evidenziata + +Threaded sound loading +== Suono filettato + +Game sound volume +== Volume del gioco + +Chat sound volume +== Volume della chat + +Map sound volume +== Volume della mappa + +Background music volume +== Volume della musica in sottofondo + +HUD +== Interf. utente + +DDNet +== DDNet + +Assets +== Asset + +DDNet Client needs to be restarted to complete update! +== Il Client DDNet deve essere riavviato per completare l'update! + +Use DDRace Scoreboard +== Usa il tabellone segnapunti DDRace + +Show client IDs in Scoreboard +== Mostra gli ID nella Scoreboard + +Show score +== Mostra punteggio/tempo + +Show health + ammo +== Mostra vita + armatura + +Use old chat style +== Usa il modello della vecchia chat + +Show names in chat in team colors +== Mostra i nomi in chat nei colori delle squadre + +Show kill messages +== Mostra i messaggi delle morti + +Show votes window after voting +== Mostra la finestra del voto dopo aver votato + +Messages +== Messaggi + +System message +== Messaggio di sistema + +Reset +== Ripristina + +Highlighted message +== Messaggio evidenziato + +Spectator +== Spettatore + +Look out! +== Attento! + +Team message +== Messaggio della squadra + +We will win +== Vinceremo + +Friend message +== Messaggio di un amico + +Highlight +== Evidenzia + +Friend +== Amico + +Hi o/ +== Ciao o/ + +Normal message +== Messaggio normale + +Hello and welcome +== Ciao e benvenuto + +Client message +== Messaggio del Client + +Inner color +== Colore interno + +Outline color +== Colore del contorno + +Wait before try for +== Aspetta prima di provare per + +second +== secondo + +seconds +== secondi + +Save the best demo of each race +== Salva la miglior demo di ogni partita + +Default length: %d +== Lunghezza predefinita: %d + +Enable replays +== Abilita i replay + +Show ghost +== Mostra ghost + +Save ghost +== Salva ghost + +Gameplay +== Gameplay + +Size +== Grandezza + +Show text entities +== Mostra i testi delle entità (entities) + +Show others (own team only) +== Mostra altri (solo la propria squadra) + +Show quads +== Mostra quads + +AntiPing +== AntiPing + +AntiPing: predict other players +== AntiPing: prevedi altri giocatori + +AntiPing: predict weapons +== AntiPing: prevedi le armi + +AntiPing: predict grenade paths +== AntiPing: prevedi i percorsi dei colpi del lanciagranate + +Show other players' hook collision lines +== Mostra la linea di collisione del rampino degli altri giocatori + +Show other players' key presses +== Mostra i tasti degli altri giocatori + +Old mouse mode +== Modalità mouse vecchio + +Background (regular) +== Sfondo (regolare) + +Background (entities) +== Sfondo (entità) + +Use current map as background +== Usa la mappa attuale come sfondo + +Show tiles layers from BG map +== Mostra i layer dei tile dalla mappa in sfondo + +Try fast HTTP map download first +== Prova un download veloce della mappa con HTTP + +DDNet %s is available: +== DDNet %s è disponibile: + +Update now +== Aggiorna ora + +Updating... +== Aggiornamento in corso... + +DDNet Client updated! +== Client DDNet aggiornato! + +No updates available +== Non ci sono aggiornamenti disponibili + +Check now +== Controlla adesso + +New random timeout code +== Nuovo codice timeout a caso + +Entities +== Entità + +Emoticons +== Emoticon + +Particles +== Particelle + +Assets directory +== Cartella degli asset + +Learn +== Impara + +https://wiki.ddnet.tw/ +== https://wiki.ddnet.tw/ + + +Website +== Sito web + +Settings +== Impostazioni + +Stop server +== Arresta server + +Run server +== Attiva server + +Server executable not found, can't run server +== Server eseguibile non trovato, non si può attivare il server + +Editor +== Editor + +[Start menu] +Play +== Gioca + +DDNet %s is out! +== E' uscito DDNet %s! + +Restart +== Ricomincia + +Manual +== Manuale + +Race +== Gara + +Auto +== Automatico + +Replay +== Replay + +Follow +== Segui + +Frags +== Uccisioni + +Deaths +== Morti + +Suicides +== Suicidi + +Ratio +== Rapporto + +Net +== Net + +Spree +== Carneficina + +Best +== Migliore + +Grabs +== Agganci + +1 new mention +== 1 nuova menzione + +%d new mentions +== %d nuove menzioni + +9+ new mentions +== +9 nuove menzioni Markers: == @@ -836,492 +1320,11 @@ Markers: %.2f KiB == -Demo -== - -Date -== - -Demos directory -== - -Render -== - -Connecting dummy -== - -Connect Dummy -== - -Kill -== - -Pause -== - -Reload -== - -Deactivate -== - -Activate -== - -Save -== - -Smooth Dynamic Camera -== - -Switch weapon when out of ammo -== - -Reset wanted weapon on death -== - -Show only chat messages from friends -== - -Show clan above name plates -== - -Clan plates size -== - -Skip the main menu -== - -Refresh Rate -== - -Show console window -== - -Themes directory -== - -Automatically take statboard screenshot -== - -Automatically create statboard csv -== - -Max CSVs -== - -Dummy settings -== - -Download skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Skin Database -== - -Skins directory -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Default zoom -== - -Show others -== - -Show all -== - -Toggle dyncam -== - -Toggle dummy -== - -Toggle ghost -== - -Dummy copy -== - -Hammerfly dummy -== - -Laser -== - Converse == -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -UI mouse s. -== - -Borderless window -== - -may cause delay -== - -Screen -== - -Use OpenGL 3.3 (experimental) -== - -Preinit VBO (iGPUs only) -== - -Multiple texture units (disable for MacOS) -== - -Use high DPI -== - -Enable game sounds -== - -Enable gun sound -== - -Enable long pain sound (used when shooting in freeze) -== - -Enable server message sound -== - -Enable regular chat sound -== - -Enable team chat sound -== - -Enable highlighted chat sound -== - -Threaded sound loading -== - -Game sound volume -== - -Chat sound volume -== - -Map sound volume -== - -Background music volume -== - -HUD -== - -DDNet -== - -Assets -== - -DDNet Client needs to be restarted to complete update! -== - -Use DDRace Scoreboard -== - -Show client IDs in Scoreboard -== - -Show score -== - -Show health + ammo -== - -Use old chat style -== - -Show names in chat in team colors -== - -Show kill messages -== - -Show votes window after voting -== - -Messages -== - -System message -== - -Reset -== - -Highlighted message -== - -Spectator -== - -Look out! -== - -Team message -== - -We will win -== - -Friend message -== - -Highlight -== - -Friend -== - -Hi o/ -== - -Normal message -== - -Hello and welcome -== - -Client message -== - -Inner color -== - -Outline color -== - -Wait before try for -== - -second -== - -seconds -== - -Save the best demo of each race -== - -Default length: %d -== - -Enable replays -== - -Show ghost -== - -Save ghost -== - -Gameplay -== - Overlay entities == -Size -== - -Show text entities -== - -Show others (own team only) -== - -Show quads -== - -AntiPing -== - -AntiPing: predict other players -== - -AntiPing: predict weapons -== - -AntiPing: predict grenade paths -== - -Show other players' hook collision lines -== - -Show other players' key presses -== - -Old mouse mode -== - -Background (regular) -== - -Background (entities) -== - -Use current map as background -== - -Show tiles layers from BG map -== - -Try fast HTTP map download first -== - -DDNet %s is available: -== - -Update now -== - -Updating... -== - -DDNet Client updated! -== - -No updates available -== - -Check now -== - -New random timeout code -== - -Entities -== - -Emoticons -== - -Particles -== - -Assets directory -== - -Learn -== - -https://wiki.ddnet.tw/ -== - -Website -== - -Settings -== - -Stop server -== - -Run server -== - -Server executable not found, can't run server -== - -Editor -== - -[Start menu] -Play -== - -DDNet %s is out! -== - -Restart -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -Follow -== - -Frags -== - -Deaths -== - -Suicides -== - -Ratio -== - -Net -== - FPM == - -Spree -== - -Best -== - -Grabs -== - -1 new mention -== - -%d new mentions -== - -9+ new mentions -== From 4e04bf7555fb47176079e6f2cd17f53a15f02ffc Mon Sep 17 00:00:00 2001 From: def Date: Sun, 8 Nov 2020 10:21:40 +0100 Subject: [PATCH 066/144] Fix some translation files --- data/languages/brazilian_portuguese.txt | 24 +- data/languages/catalan.txt | 24 +- data/languages/dutch.txt | 24 +- data/languages/french.txt | 2638 +++++++++++------------ data/languages/hungarian.txt | 2596 +++++++++++----------- data/languages/norwegian.txt | 24 +- data/languages/polish.txt | 24 +- data/languages/russian.txt | 6 +- data/languages/serbian_cyrillic.txt | 24 +- data/languages/simplified_chinese.txt | 24 +- data/languages/swedish.txt | 24 +- data/languages/traditional_chinese.txt | 24 +- data/languages/turkish.txt | 24 +- data/languages/ukrainian.txt | 24 +- 14 files changed, 2752 insertions(+), 2752 deletions(-) diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt index fcc0c9ce1..82e1d5891 100644 --- a/data/languages/brazilian_portuguese.txt +++ b/data/languages/brazilian_portuguese.txt @@ -1267,6 +1267,18 @@ Particles Assets directory == Diretório de ativos +Manual +== Manual + +Race +== Corrida + +Auto +== Auto + +Replay +== Reproduzir + Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. == @@ -1293,15 +1305,3 @@ Use old chat style Highlight == - -Manual -== Manual - -Race -== Corrida - -Auto -== Auto - -Replay -== Reproduzir diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt index e29bfb8c8..7f68b6958 100644 --- a/data/languages/catalan.txt +++ b/data/languages/catalan.txt @@ -1146,6 +1146,18 @@ Time 9+ new mentions == 9+ noves mencions +Manual +== Manual + +Race +== Carrera + +Auto +== Auto + +Replay +== Repetició + Saving ddnet-settings.cfg failed == @@ -1272,15 +1284,3 @@ Editor [Start menu] Play == - -Manual -== Manual - -Race -== Carrera - -Auto -== Auto - -Replay -== Repetició diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index 3efc9620d..188166ccd 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -1158,6 +1158,18 @@ Grabs 9+ new mentions == 9+ nieuwe berichten +Manual +== Manual + +Race +== Race + +Auto +== Automatisch + +Replay +== Herhaling + Saving ddnet-settings.cfg failed == @@ -1285,18 +1297,6 @@ Editor Play == -Manual -== Manual - -Race -== Race - -Auto -== Automatisch - -Replay -== Herhaling - Net == diff --git a/data/languages/french.txt b/data/languages/french.txt index 13ac9a6a1..f52238f8c 100644 --- a/data/languages/french.txt +++ b/data/languages/french.txt @@ -1,1319 +1,1319 @@ -##### 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 -##### /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 ! - --Page %d- -== -Page %d- - -Abort -== Annuler - -Add -== Ajouter - -Add Friend -== Ajouter aux amis - -Address -== Adresse - -All -== Tout le monde - -Are you sure that you want to delete the demo? -== Êtes-vous sûr de vouloir supprimer la démo ? - -Are you sure that you want to quit? -== Êtes-vous sûr de vouloir quitter ? - -Are you sure that you want to remove the player from your friends list? -== Êtes-vous sûr de vouloir supprimer ce joueur de votre liste d'amis ? - -Automatically record demos -== Enregistrer les démos automatiquement - -Automatically take game over screenshot -== Prends 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 - -Close -== Fermer - -Compatible version -== Version compatible - -Connect -== Se connecter - -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 - -Demo details -== Détails de 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 - -Enter -== Démarrer - -Error -== Erreur - -Error loading demo -== Erreur pendant le chargement de la démo - -Favorite -== Favori - -Favorites -== Favoris - -Feet -== Pieds - -Filter -== Filtre - -Fire -== Tirer - -Folder -== Dossier - -Force vote -== Forcer le vote - -Free-View -== Vue libre - -Friends -== Amis - -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 - -Maximum ping: -== Ping maximum : - -Mouse sens. -== Sens. souris - -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 - -Open -== Ouvrir - -Parent Folder -== Dossier parent - -Password -== Mot de passe - -Password incorrect -== Mot de passe incorrect - -Ping -== Ping - -Pistol -== Pistolet - -[Demo browser] -Play -== Jouer - -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 ! - -Refresh -== Rafraîchir - -Refreshing master servers -== Rafraîchissement des serveurs maîtres - -Remote console -== Console serveur - -Remove -== Retirer - -Remove friend -== Retirer des amis - -Rename -== Renommer - -Rename demo -== Renommer la démo - -Reset filter -== Filtres par défaut - -Sample rate -== Taux d'échantillonnage - -Score -== Score - -Score limit -== Limite des scores - -Scoreboard -== Tableau des scores - -Screenshot -== Capture d'écran - -Server address: -== Addresse du serveur : - -Server details -== Détails du serveur - -Server filter -== Filtres 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 - -Show only supported -== N'afficher que les résolutions supportées - -Skins -== Skins - -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. - -There's an unsaved map in the editor, you might want to save it before you quit the game. -== Il y a une carte non-enregistrée dans l'éditeur, il se peut que vous vouliez l'enregistrer avant de quitter le jeu. - -Time limit -== Limite de temps - -Time limit: %d min -== Limite de temps : %d min - -Try again -== Réessayer - -Type -== Type - -Unable to delete the demo -== Impossible de supprimer la démo - -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 - -Created: -== Créé le : - -Max Screenshots -== Nombre maximum de captures d'écran - -Length: -== Durée : - -Laser -== Laser - -Netversion: -== Netversion : - -Map: -== Carte : - -Info -== Info. - -Hue -== Teinte - -Record demo -== Enregist. démo - -Your skin -== Votre skin - -Size: -== Taille : - -Reset to defaults -== Réinitialiser - -Quit anyway? -== Quitter quand même ? - -Display Modes -== Résolutions - -Version: -== Version : - -Round -== Round - -Lht. -== Luminosité - -UI Color -== Couleur du menu - -Crc: -== Crc : - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Taille des pseudonymes - -Type: -== Type : - - -##### generated by copy_fix.py, please translate this ##### - - -##### generated by copy_fix.py, please translate this ##### - - -##### generated by copy_fix.py, please translate this ##### - - -##### generated by copy_fix.py, please translate this ##### - -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 - -Reset wanted weapon on death -== Réinitialiser l'arme choisie après être mort - -Inner color -== Couleur intérieur - -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 -== Prends 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 - -Use DDRace Scoreboard -== Utiliser le tableau des scores de DDRace - -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 - -Preinit VBO (iGPUs only) -== Préinitialisation VBO (iGPU uniquement) - -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 - -We will win -== On va gagner - -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ûr de vouloir déconnecter votre dummy? - -Reload -== Recharger - -Old mouse mode -== Ancien mode de souris - -Server best: -== Meilleur score du serveur - -Personal best: -== Meilleur temps personnel - -Skin prefix -== Préfixe de skin - -Use OpenGL 3.3 (experimental) -== Utiliser OpenGL 3.3 (expérimental) - -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 - -Spectator -== Spectateur - -Statboard -== Tableau des stats - -Show text entities -== Afficher le texte des entités - -Connecting dummy -== Connection du dummy - -Hello and welcome -== Bonjour et bienvenue - -second -== seconde - -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 - -Dummy settings -== Config. du dummy - -Are you sure that you want to disconnect? -== Êtes-vous sûr 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 - -Background (regular) -== Arrière-plan (défaut) - -Reset -== Défaut - -Threaded sound loading -== Chargement de sons enfilés - -File already exists, do you want to overwrite it? -== Ce fichier existe déjà, voulez-vous l'écraser? - -Grabs -== Grappins - -Update now -== Mettre à jour - -Wait before try for -== Avant votre prochain essai, veuillez attendre - -Follow -== Suivre - -Converse -== Converser - -Borderless window -== Mode fenêtré sans bordure - -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 - -Markers: -== Marqueurs : - -Multiple texture units (disable for MacOS) -== Unités de texture multiple (désactivé pour MacOS) - -Pause -== Pause - -Deaths -== Morts - -Length -== Durée - -Outline color -== Couleur du contour - -Normal message -== Message normal - -Show client IDs in Scoreboard -== Afficher les IDs des clients dans le tableau des scores - -seconds -== secondes - -Friend -== Ami - -Dummy copy -== Copiage du dummy - -Demo -== Démo - -Map sound volume -== Volume des sons de la map - -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: - -Please use a different name -== Veuillez changer de pseudonyme - -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 - -Try fast HTTP map download first -== Carte : essayer d'abord le téléchargement rapide HTTP - -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 - -Hi o/ -== Salut o/ - -Unfinished map -== Carte non terminée - -Default length: %d -== Durée par défaut : %d - -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 - -Look out! -== Attention! - -Show console window -== Afficher la fenêtre de la console - -Show kill messages -== Afficher les messages d'élimination - -Select a name -== Choisissez un pseudonyme - -UI mouse s. -== Sens. souris interface - -Markers -== Marqueurs - -HUD -== Interface - -Show health + ammo -== Afficher la vie et les munitions - -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 - -Background (entities) -== Arrière-plan (entités) - -Show votes window after voting -== Afficher la fenêtre de vote après avoir voté - -Destination file already exist -== Le fichier de destination existe déjà - -%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 - -Render -== Convertir - -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 (gèle)) - -9+ new mentions -== 9+ nouveaux messages - -Kill -== Tuer - -Types -== Types - -Countries -== Pays - -Gameplay -== Jouabilité - -Connect Dummy -== Connecter le dummy - -Reconnect in %d sec -== Reconnecte 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 map. 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. - -The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. -== Les maps contiennent du freeze (gèle), ce qui vous empêche temporairement de bouger. Vous devez travailler en équipe pour passer ces parties. - -The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== La molette de la souris permet de changer d'arme. Le marteau (clic gauche) peut être utilisé pour frapper les autres tees ce qui les unfreeze (dégivre). - -Hook (right mouse) can be used to swing through the map and to hook other tees to you. -== Le grappin (clic droit) peut être utilisé pour se balancer tout le long de la carte en attrappant les murs et peut aussi permettre d'attrapper les autres Tees. - -Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. -== La communication est la clé de la réussite: Il n'y a pas de tutoriel donc vous devrez parler avec d'autres joueurs (touche T) afin d'apprendre les bases du jeu ainsi que ses mécanismes complexes, avancés et variés. - -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 info2.ddnet.tw -== transmet votre pseudonyme à info2.ddnet.tw - -Saving ddnet-settings.cfg failed -== L'enregistrement de ddnet-settings.cfg a échoué - -The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== La largeur ou la hauteur de la texture %s n'est pas divisible par 16, ce qui pourrait causer des bugs visuels - -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. - -Country / Region -== Pays / Region - -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 -== Particles - -Assets directory -== Répertoire des assets - -https://wiki.ddnet.tw/ -== https://wiki.ddnet.tw/ - -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 - -Highlight -== Surbrillance - -Manual -== Manuel - -Race -== Race - -Auto -== Auto - -Replay -== Replay +##### 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 +##### /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 ! + +-Page %d- +== -Page %d- + +Abort +== Annuler + +Add +== Ajouter + +Add Friend +== Ajouter aux amis + +Address +== Adresse + +All +== Tout le monde + +Are you sure that you want to delete the demo? +== Êtes-vous sûr de vouloir supprimer la démo ? + +Are you sure that you want to quit? +== Êtes-vous sûr de vouloir quitter ? + +Are you sure that you want to remove the player from your friends list? +== Êtes-vous sûr de vouloir supprimer ce joueur de votre liste d'amis ? + +Automatically record demos +== Enregistrer les démos automatiquement + +Automatically take game over screenshot +== Prends 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 + +Close +== Fermer + +Compatible version +== Version compatible + +Connect +== Se connecter + +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 + +Demo details +== Détails de 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 + +Enter +== Démarrer + +Error +== Erreur + +Error loading demo +== Erreur pendant le chargement de la démo + +Favorite +== Favori + +Favorites +== Favoris + +Feet +== Pieds + +Filter +== Filtre + +Fire +== Tirer + +Folder +== Dossier + +Force vote +== Forcer le vote + +Free-View +== Vue libre + +Friends +== Amis + +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 + +Maximum ping: +== Ping maximum : + +Mouse sens. +== Sens. souris + +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 + +Open +== Ouvrir + +Parent Folder +== Dossier parent + +Password +== Mot de passe + +Password incorrect +== Mot de passe incorrect + +Ping +== Ping + +Pistol +== Pistolet + +[Demo browser] +Play +== Jouer + +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 ! + +Refresh +== Rafraîchir + +Refreshing master servers +== Rafraîchissement des serveurs maîtres + +Remote console +== Console serveur + +Remove +== Retirer + +Remove friend +== Retirer des amis + +Rename +== Renommer + +Rename demo +== Renommer la démo + +Reset filter +== Filtres par défaut + +Sample rate +== Taux d'échantillonnage + +Score +== Score + +Score limit +== Limite des scores + +Scoreboard +== Tableau des scores + +Screenshot +== Capture d'écran + +Server address: +== Addresse du serveur : + +Server details +== Détails du serveur + +Server filter +== Filtres 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 + +Show only supported +== N'afficher que les résolutions supportées + +Skins +== Skins + +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. + +There's an unsaved map in the editor, you might want to save it before you quit the game. +== Il y a une carte non-enregistrée dans l'éditeur, il se peut que vous vouliez l'enregistrer avant de quitter le jeu. + +Time limit +== Limite de temps + +Time limit: %d min +== Limite de temps : %d min + +Try again +== Réessayer + +Type +== Type + +Unable to delete the demo +== Impossible de supprimer la démo + +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 + +Created: +== Créé le : + +Max Screenshots +== Nombre maximum de captures d'écran + +Length: +== Durée : + +Laser +== Laser + +Netversion: +== Netversion : + +Map: +== Carte : + +Info +== Info. + +Hue +== Teinte + +Record demo +== Enregist. démo + +Your skin +== Votre skin + +Size: +== Taille : + +Reset to defaults +== Réinitialiser + +Quit anyway? +== Quitter quand même ? + +Display Modes +== Résolutions + +Version: +== Version : + +Round +== Round + +Lht. +== Luminosité + +UI Color +== Couleur du menu + +Crc: +== Crc : + +Alpha +== Alpha + +LAN +== LAN + +Name plates size +== Taille des pseudonymes + +Type: +== Type : + + +##### generated by copy_fix.py, please translate this ##### + + +##### generated by copy_fix.py, please translate this ##### + + +##### generated by copy_fix.py, please translate this ##### + + +##### generated by copy_fix.py, please translate this ##### + +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 + +Reset wanted weapon on death +== Réinitialiser l'arme choisie après être mort + +Inner color +== Couleur intérieur + +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 +== Prends 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 + +Use DDRace Scoreboard +== Utiliser le tableau des scores de DDRace + +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 + +Preinit VBO (iGPUs only) +== Préinitialisation VBO (iGPU uniquement) + +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 + +We will win +== On va gagner + +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ûr de vouloir déconnecter votre dummy? + +Reload +== Recharger + +Old mouse mode +== Ancien mode de souris + +Server best: +== Meilleur score du serveur + +Personal best: +== Meilleur temps personnel + +Skin prefix +== Préfixe de skin + +Use OpenGL 3.3 (experimental) +== Utiliser OpenGL 3.3 (expérimental) + +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 + +Spectator +== Spectateur + +Statboard +== Tableau des stats + +Show text entities +== Afficher le texte des entités + +Connecting dummy +== Connection du dummy + +Hello and welcome +== Bonjour et bienvenue + +second +== seconde + +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 + +Dummy settings +== Config. du dummy + +Are you sure that you want to disconnect? +== Êtes-vous sûr 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 + +Background (regular) +== Arrière-plan (défaut) + +Reset +== Défaut + +Threaded sound loading +== Chargement de sons enfilés + +File already exists, do you want to overwrite it? +== Ce fichier existe déjà, voulez-vous l'écraser? + +Grabs +== Grappins + +Update now +== Mettre à jour + +Wait before try for +== Avant votre prochain essai, veuillez attendre + +Follow +== Suivre + +Converse +== Converser + +Borderless window +== Mode fenêtré sans bordure + +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 + +Markers: +== Marqueurs : + +Multiple texture units (disable for MacOS) +== Unités de texture multiple (désactivé pour MacOS) + +Pause +== Pause + +Deaths +== Morts + +Length +== Durée + +Outline color +== Couleur du contour + +Normal message +== Message normal + +Show client IDs in Scoreboard +== Afficher les IDs des clients dans le tableau des scores + +seconds +== secondes + +Friend +== Ami + +Dummy copy +== Copiage du dummy + +Demo +== Démo + +Map sound volume +== Volume des sons de la map + +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: + +Please use a different name +== Veuillez changer de pseudonyme + +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 + +Try fast HTTP map download first +== Carte : essayer d'abord le téléchargement rapide HTTP + +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 + +Hi o/ +== Salut o/ + +Unfinished map +== Carte non terminée + +Default length: %d +== Durée par défaut : %d + +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 + +Look out! +== Attention! + +Show console window +== Afficher la fenêtre de la console + +Show kill messages +== Afficher les messages d'élimination + +Select a name +== Choisissez un pseudonyme + +UI mouse s. +== Sens. souris interface + +Markers +== Marqueurs + +HUD +== Interface + +Show health + ammo +== Afficher la vie et les munitions + +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 + +Background (entities) +== Arrière-plan (entités) + +Show votes window after voting +== Afficher la fenêtre de vote après avoir voté + +Destination file already exist +== Le fichier de destination existe déjà + +%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 + +Render +== Convertir + +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 (gèle)) + +9+ new mentions +== 9+ nouveaux messages + +Kill +== Tuer + +Types +== Types + +Countries +== Pays + +Gameplay +== Jouabilité + +Connect Dummy +== Connecter le dummy + +Reconnect in %d sec +== Reconnecte 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 map. 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. + +The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. +== Les maps contiennent du freeze (gèle), ce qui vous empêche temporairement de bouger. Vous devez travailler en équipe pour passer ces parties. + +The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. +== La molette de la souris permet de changer d'arme. Le marteau (clic gauche) peut être utilisé pour frapper les autres tees ce qui les unfreeze (dégivre). + +Hook (right mouse) can be used to swing through the map and to hook other tees to you. +== Le grappin (clic droit) peut être utilisé pour se balancer tout le long de la carte en attrappant les murs et peut aussi permettre d'attrapper les autres Tees. + +Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. +== La communication est la clé de la réussite: Il n'y a pas de tutoriel donc vous devrez parler avec d'autres joueurs (touche T) afin d'apprendre les bases du jeu ainsi que ses mécanismes complexes, avancés et variés. + +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 info2.ddnet.tw +== transmet votre pseudonyme à info2.ddnet.tw + +Saving ddnet-settings.cfg failed +== L'enregistrement de ddnet-settings.cfg a échoué + +The width or height of texture %s is not divisible by 16, which might cause visual bugs. +== La largeur ou la hauteur de la texture %s n'est pas divisible par 16, ce qui pourrait causer des bugs visuels + +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. + +Country / Region +== Pays / Region + +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 +== Particles + +Assets directory +== Répertoire des assets + +https://wiki.ddnet.tw/ +== https://wiki.ddnet.tw/ + +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 + +Highlight +== Surbrillance + +Manual +== Manuel + +Race +== Race + +Auto +== Auto + +Replay +== Replay diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt index 5856a2c39..69fa66700 100644 --- a/data/languages/hungarian.txt +++ b/data/languages/hungarian.txt @@ -1,1298 +1,1298 @@ -##### authors ##### -#originally created by: -# Feca -#modified by: -# Boti. -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds van hátra - -%i minute left -== %i perc van hátra - -%i minutes left -== %i perc van hátra - -%i second left -== %i másodperc van hátra - -%i seconds left -== %i másodperc van hátra - -%s wins! -== %s nyert! - --Page %d- -== -oldal %d- - -Abort -== Mégse - -Add -== Hozzáadás - -Add Friend -== Barát hozzáadása - -Address -== Cím - -All -== Mindenki - -Are you sure that you want to delete the demo? -== Biztos, hogy le akarod törölni a demót? - -Are you sure that you want to quit? -== Biztos, hogy ki akarsz lépni? - -Are you sure that you want to remove the player from your friends list? -== Biztos vagy benne, hogy ki akarod törölni a játékost a barátok listájáról? - -Automatically record demos -== Magától rögzítse a demókat - -Automatically take game over screenshot -== Magától készítsen a játék végén képet - -Blue team -== Kék csapat - -Blue team wins! -== A kék csapat nyert! - -Body -== Test - -Call vote -== Szavazás - -Change settings -== Beállítások átállítása - -Chat -== Chat - -Clan -== Klán - -Client -== Kliens - -Close -== Bezárás - -Compatible version -== Kompatibilis Verzió - -Connect -== Csatlakozás - -Connecting to -== Csatlakozás.. - -Connection Problems... -== Csatlakozási problémák... - -Console -== Konzol - -Controls -== Irányítások - -Count players only -== Számontartott játékosok - -Current -== Aktuális - -Custom colors -== Egyéni színek - -Delete -== Törlés - -Delete demo -== Demó törlése - -Demo details -== Információk a demóról - -Demos -== Demók - -Disconnect -== Kilépés - -Disconnected -== Lekapcsolódott - -Downloading map -== Pálya letöltése.. - -Draw! -== Döntetlen! - -Dynamic Camera -== Dinamikus kamera - -Emoticon -== Hangulatjel - -Enter -== Belépés - -Error -== Hiba - -Error loading demo -== Hiba történt a demó betöltése közben - -Favorite -== Kedvenc - -Favorites -== Kedvencek - -Feet -== Láb - -Filter -== Szűrő - -Fire -== Tűz - -Folder -== Mappa - -Force vote -== Szavazás kényszerítése - -Free-View -== Szabad-nézet - -Friends -== Barátok - -Fullscreen -== Teljesképernyő - -Game -== Játék - -Game info -== Játék infó - -Game over -== Játék vége - -Game type -== Játék fajtája - -Game types: -== Játék fajtái: - -General -== Általános - -Graphics -== Grafika - -Grenade -== Gránát - -Hammer -== Kalapács - -Has people playing -== Játékos játszik - -High Detail -== Jó részletek - -Hook -== Horog - -Invalid Demo -== Érvénytelen demó - -Join blue -== Kékhez lépés - -Join red -== Piroshoz lépés - -Jump -== Ugrás - -Kick player -== Játékos kirúgása - -Language -== Nyelv - -MOTD -== Napi üzenet - -Map -== Pálya - -Maximum ping: -== Maximum Ping: - -Mouse sens. -== Egér érzékenység - -Move left -== Balra lépés - -Move player to spectators -== Megfigyelőbe mozgatás - -Move right -== Jobbra lépés - -Movement -== Mozgás - -Mute when not active -== Letiltás ha nem aktív - -Name -== Név - -Next weapon -== Következő fegyver - -Nickname -== Becenév - -No -== Nem - -No password -== Jelszó nélküli - -No servers found -== Nem talált szervereket - -No servers match your filter criteria -== Nincs szerver a szűrőfeltételeidhez - -Ok -== Oké - -Open -== Megnyit - -Parent Folder -== Főmappa - -Password -== Jelszó - -Password incorrect -== Helytelen jelszó - -Ping -== Ping - -Pistol -== Pisztoly - -[Demo browser] -Play -== Játék - -Player -== Játékos - -Player options -== Játékos beállításai - -Players -== Játékos - -Please balance teams! -== Kérlek egyenlítsd ki a csapatokat! - -Prev. weapon -== Előző fegyver - -Quit -== Kilépés - -Reason: -== Indok: - -Red team -== Piros csapat - -Red team wins! -== A piros csapat nyert! - -Refresh -== Újratöltés - -Refreshing master servers -== Mester szerverek frissítése - -Remote console -== Távoli konzol - -Remove -== Eltávolítás - -Remove friend -== Barát eltávolítása - -Rename -== Átnevezés - -Rename demo -== Demó átnevezése - -Reset filter -== Szűrő visszaállítása - -Sample rate -== Mintavételi frekvencia - -Score -== Pontszám - -Score limit -== Ponthatár - -Scoreboard -== Pontszámtábla - -Screenshot -== Pillanatkép - -Server address: -== Szerver címe: - -Server details -== Szerver részletei - -Server filter -== Szerver szűrő - -Server info -== Szerver infó - -Server not full -== Szerver nincs tele - -Shotgun -== Sörétes puska - -Show chat -== Chat mutatása - -Show friends only -== Barátok mutatása - -Show ingame HUD -== Játék közbeni HUD mutatása - -Show name plates -== Név táblák mutatása - -Show only supported -== Csak támogatott mutatása - -Skins -== Skinek - -Sound -== Hang - -Sound error -== Hang hiba - -Spectate -== Megfigyelés - -Spectator mode -== Néző mód - -Spectators -== Megfigyelők - -Stop record -== Demó megállítása - -Sudden Death -== Gyors halál - -Switch weapon on pickup -== Fegyverváltás felvételnél - -Team -== Csapat - -Team chat -== Csapat chat - -The audio device couldn't be initialised. -== A hangeszköz nem érzékelhető. - -The server is running a non-standard tuning on a pure game type. -== A szerver egy nem szabványos hangolást futtat a tiszta játék típuson. - -There's an unsaved map in the editor, you might want to save it before you quit the game. -== Van egy mentett térkép a szerkesztőben, talán elakartad menteni, mielőtt kilépsz a játékból. - -Time limit -== Időhatár - -Time limit: %d min -== Időhatár: %d perc - -Try again -== Próbáld újra - -Type -== Típus - -Unable to delete the demo -== Nem sikerült törölni a demót - -Unable to rename the demo -== Nem sikerült átnevezni a demót - -Use sounds -== Hangok használata - -Use team colors for name plates -== Csapat szín használata név tábláknál - -V-Sync -== V-Sync - -Version -== Verzió - -Vote command: -== Szavazás parancsa: - -Vote description: -== Szavazás leírása: - -Vote no -== Nem - -Vote yes -== Igen - -Voting -== Szavazás - -Warmup -== Felkészülés - -Weapon -== Fegyver - -Yes -== Igen - -You must restart the game for all settings to take effect. -== Újra kell indítani a játékot, a beállítások érvénybe lépéséhez. - -New name: -== Új Név: - -Sat. -== telítettség - - - -Internet -== Internet - - - -Max demos -== Maximum Demók - -News -== Hírek - -Join game -== Csatlakozás a játékhoz - -FSAA samples -== FSAA minták - -Sound volume -== Hangerő - -Created: -== Készült: - -Max Screenshots -== Maximum Fotó - -Length: -== Hossza: - -Laser -== Lézer - -Netversion: -== Netes verzió: - -Map: -== Pálya: - -Info -== Infó - -Miscellaneous -== Vegyes - -Record demo -== Demó felvétele - -Your skin -== Te skined - -Size: -== Méret: - -Reset to defaults -== Visszaállítás alapértelmezettre - -Quit anyway? -== Mindenképpen kilép? - -Display Modes -== Kijelző módok - -Version: -== Verzió: - -Round -== Menet - -Lht. -== Fényerősség - -UI Color -== UI Szín - -Hue -== Színárnyalat - -Crc: -== Crc: - -Alpha -== Alpha - -LAN -== Helyi - -Name plates size -== Névtáblák mérete - -Type: -== Típus: - -Dummy settings -== Dummy beállításai - -AntiPing -== Antiping - -Show quads -== Képek mutatása - -Map sound volume -== Pálya hangereje - -Show only chat messages from friends -== Csak barátoktól jön üzenet - -Countries -== Országok - -Reconnect in %d sec -== Újracsatlakozás %d másodperc múlva - -Grabs -== Megfog - -Background (entities) -== Háttér entitással - -Show kill messages -== Halálüzenetek mutatása - -Show ghost -== Szellem mutatása - -DDNet -== DDNet - -No updates available -== Nincs elérhető frissítés - -Enable server message sound -== Szerver chat hang engedélyezése - -second -== másodperc - -Show votes window after voting -== Szavazási ablak mutatása szavazás után - -HUD -== HUD - -Spectate previous -== Előző nézése - -Look out! -== Vigyázz! - -Spectate next -== Következő nézése - -Show names in chat in team colors -== Csapatszínben jelennek meg a játékosok a chatben - -Select a name -== Válassz nevet - -Enable team chat sound -== Csapat chat hang engedélyezése - -Show other players' hook collision lines -== Játékosok horogvonalaik mutatása - -We will win -== Nyerni fogunk - -Hi o/ -== Szia o/ - -Deaths -== Halálok - -Enable game sounds -== Játék hangok engedélyezése - -DDNet Client needs to be restarted to complete update! -== Újra kell indítani a DDNet Klienst a frissítés befejezéséhez! - -Spectator -== Néző - -Please use a different name -== Kérlek, válassz másik nevet - -Wait before try for -== Várj, mielőtt kipróbálod a: - -Show console window -== Konzol ablak mutatása - -Show others -== Játékosok mutatása - -Gameplay -== Játékmód - -Restart -== Újraindítás - -Game paused -== Játék megállítva - -Old mouse mode -== Régi egér mód - -Browser -== Böngésző - -Play background music -== Háttérzene lejátszása - -Follow -== Követni - -Reset -== Alap - -Enable gun sound -== Fegyverhang lejátszása - -Show health + ammo -== Élet + lőszer mutatása - -Team message -== Csapat üzenet - -Automatically create statboard csv -== Magától készítsen csv pontszámtáblát - -Save the best demo of each race -== Mentse el a legjobb demót minden versenynél - -Show tiles layers from BG map -== Block-ok mutatása a háttérben - -Are you sure that you want to disconnect? -== Biztos, hogy le akarsz csatlakozni? - -Types -== Típusok - -Ghost -== Szellem - -Remove chat -== Chat eltüntetése - -Check now -== Nézd meg - -Background (regular) -== Háttér (pálya) - -Reset wanted weapon on death -== Újraéledéskor váltson az akart fegyverre - -Frags -== Zászlók - -AntiPing: predict other players -== Antiping: más játékosokra - -Show other players' key presses -== Mutassa a játékosok mozgását nyilakkal - -Automatically take statboard screenshot -== Automatikusan készítsen pontszám fényképet - -System message -== Rendszer üzenet - -Enable long pain sound (used when shooting in freeze) -== Hosszú fájdalom hang lejátszása (mikor a játékos lő,ha lefagyott) - -DDNet %s is available: -== DDnet %s verzió elérhető - -Updating... -== Frissítés... - -Overlay entities -== Entitás jelenése - -Messages -== Üzenetek - -%.2f MiB -== %.2f MiB - -Refresh Rate -== Frissítési érték - -New random timeout code -== Új random időtúllépési kód - -Suicides -== Öngyilkosságok - -Player country: -== Játékos országa - -Net -== Net - -Loading DDNet Client -== DDNet Kliens betöltése - -FPM -== FPM - -Default zoom -== Alap nagyítás - -Show score -== Pontok mutatása - -Spree -== Szorzó - -Show client IDs in Scoreboard -== Mutassa a játékosok ID-ét a pontszámtáblán - -Demofile: %s -== Demófájl: %s - -Max CSVs -== Maximum CSV-k - -seconds -== másodpercek - -Borderless window -== Ablak mód - -%.2f KiB -== %.2f KiB - -Strict gametype filter -== Szigorú játékmód szűrő - -Try fast HTTP map download first -== Próbálja meg a gyors HTTP letöltést először - -Use DDRace Scoreboard -== DDRace pontszámtábla használata - -Best -== Legjobb - -Enable regular chat sound -== Alap chat hang lejátszása - -Normal message -== Normál üzenet - -Screen -== Képernyő - -Search -== Keresés - -Connecting dummy -== Másolat válasza... - -Clan plates size -== Klán felirat mérete - -Update now -== frissíts most - -Show clan above name plates -== Klán mutatása a nevek fölött - -Save ghost -== Szellem mentése - -Exclude -== Kizárás - -Enable highlighted chat sound -== kiemelt chat hang lejátszása - -Hello and welcome -== Hali és üdv - -AntiPing: predict weapons -== Antiping: fegyvereknél - -DDNet Client updated! -== DDNet Kliens frissítve van! - -Outline color -== Körvonal szín - -Highlighted message -== Kiemelt üzenet - -Friend -== Barát - -Switch weapon when out of ammo -== Fegyver váltása, ha elfogy a lőszer - -AntiPing: predict grenade paths -== Antiping: gránátoknál - -Demo -== Demó - -Inner color -== belső szín - -##### generated by copy_fix.py, please translate this ##### -##### update for 11.6 version by Cellegen ##### - -Ratio -== Érték - -Friend message -== Baráti üzenet - -Fat skins (DDFat) -== Nagy skinek (DDFat) - -may cause delay -== Késleltetést okozhat - -Unfinished map -== befejezetlen pálya - -Deactivate -== Deaktiválás - -Welcome to DDNet -== Üdvözlet a DDNet-en - -Preinit VBO (iGPUs only) -== VBO használata (csak iGPU) - -Threaded sound loading -== Csavarmenetes hang betöltése - -Activate -== Aktiválás - -Multiple texture units (disable for MacOS) -== Több textúra egységek (kapcsolja ki MacOS esetén) - -Use OpenGL 3.3 (experimental) -== OpenGL 3.3 használata (Haladó) - -UI mouse s. -== UI egér sebesség - -File already exists, do you want to overwrite it? -== A fájl már létezik, szeretné felülírni? - -Indicate map finish -== Befejezett pályák - -Save -== Mentés - -Vanilla skins only -== Csak alap skinek - -Date -== Idő - -Show DDNet map finishes in server browser -== Mutassa a befejezett pályákat a keresőben - -transmits your player name to info2.ddnet.tw -== Keress rá a játékosnevedre az info2.ddnet.tw oldalon - -Reload -== újratöltés - -Hammerfly dummy -== Dummy Kalapács - -Downloading %s: -== Letöltés %s: - -Time -== Idő - -Kill -== Halál - -Personal best: -== Egyéni record: - -Show entities -== Entitások mutatása - -Video name: -== Videó neve: - -Connect Dummy -== Dummy Csatlakoztatása - -Disconnect Dummy -== Dummy Lecsatlakoztatása - -Filter connecting players -== Csatlakozók szűrése - -Pause -== Nézetváltás - -Toggle dummy -== Dummy irányítása - -Fetch Info -== Minden infó - -Dummy copy -== Másolat tükrözése - -Enable replays -== Visszajátszások - -Render demo -== Demó renderelése - -Zoom in -== Nagyítás - -Show text entities -== Textúrázott entitások - -Render -== Render - -Show all -== Mutasson mindent - -Learn -== Wikipédia - -Successfully saved the replay! -== Sikeresen elmentette a visszajátszást! - -Zoom out -== Kicsinyítés - -DDNet %s is out! -== DDNet %s elérhető! - -Statboard -== Státusztábla - -Converse -== Fordítás - -Use high DPI -== Magas DPI használata - -Update failed! Check log... -== Frissítés sikertelen! nézd meg a logot... - -Toggle dyncam -== Dinamikus kamera - -%d new mentions -== %d új értesítés - -Default length: %d -== Átlagos hossz: %d - -Show HUD -== HUD mutatása - -Size -== Méret - -Destination file already exist -== A kiválasztott helynél ez létezik - -Server best: -== Legjobb szerver: - -Markers: -== Jelölések - -1 new mention -== 1 új értesíté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. -== A DDraceNetwork együttműködésen alapuló online játékként tekinthető, ahol a cél az, hogy te és egy csapat Tee elérje a célvonalat. Ha újonc vagy, a kezdő (Novice) szervereket ajánljuk, ahol a legegyszerűbb versenyeket tároljuk. A lehető legkisebb ping választása alapján válassz egy szervert. - -The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. -== A pályákon fagyasztó részeket találtok, melyek ideiglenesen blokkolják a játékos mozgását. Együtt kell dolgoznod a pályarészekkel az átjutáshoz. - -The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== A görgő megváltoztatja a fegyvereket. A kalapács (bal egérgomb) segítségével más Tee-ket megüthetsz és ütésekkel kiolvadhatnak a fagyásból. - -Hook (right mouse) can be used to swing through the map and to hook other tees to you. -== A horoggal (jobb egérgomb) megkapaszkodhatsz néhány platformon és más Tee-ket is megragadhatsz vele. - -Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. -== A legfontosabb kulcs a sikerhez: Nincs oktatóprogram, így mindenki magától tanulja meg más játékosok által. (T gombbal tudsz Chattelni) - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Ajánlott, hogy ellenőrizd a beállításokat, hogy a kedvedhez igazítsd őket, mielőtt csatlakoznál egy szerverhez. (Tipp: szűrők) - -Please enter your nickname below. -== Írja be lent a becenevét. - -9+ new mentions -== 9+ új értesítés - -Replay feature is disabled! -== Visszajátszás mód kikapcsolva! - -Lock team -== Csapat lezárása - -Hook collisions -== Horog pontossága - -Toggle ghost -== Szellem mutatása - -Markers -== Jelölések - -Replace video -== Videó lecserélése - -Length -== Hossz - -Are you sure that you want to disconnect your dummy? -== Biztos, hogy kiakarod léptetni a dummy-d? - -Saving ddnet-settings.cfg failed -== nem sikerült elmenteni ddnet-settings.cfg fájlt - -The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== A mérete a texturának %s nem látható, ami látható bugokhoz vezethet. - -Warning -== Figyelmeztetés - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Debug mód bekapcsolva. nyomd meg a Ctrl+Shift+D billentyű kombinációt a kikapcsolásához - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Használd a k gombot az újraéledéshez, q betű a megfigyeléshez. nézd meg a beállításokat a többi bindért. - -Existing Player -== Létező Játékos - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== A Neved '%s' már használva volt (%d ponttal). Biztosan szeretnéd használni? - -Checking for existing player with your name -== Keresés már létező játékos után a neveddel - -Country / Region -== Ország / Régió - -Speed -== Sebesség - -Theme -== Téma - -%d of %d servers -== %d a %d szerverből - -%d of %d server -== %d ből %d szerver - -%d players -== %d játékos - -%d player -== %d játékos - -Demos directory -== Demók Helye - -Smooth Dynamic Camera -== Egyenletesen dinamikus kamera - -Skip the main menu -== főmenű kihagyása - -Themes directory -== Témák Helye - -Download skins -== Skinek letöltése - -Skin prefix -== Karakter prefix - -Skin Database -== Több skin - -Skins directory -== Skinek Helye - -Game sound volume -== Játék Hangerő - -Chat sound volume -== Chat Hangerő - -Background music volume -== Háttér Zene hangerő - -Assets -== Kinézet - -Use old chat style -== régi chat stílus használata - -Highlight -== kijelöl - -Client message -== Kliens Üzenet - -Show others (own team only) -== Mások mutatása (csak csapatok) - -Use current map as background -== Jelenlegi map használta háttérként - -Entities -== Entitások - -Emoticons -== Hangulatjelek - -Particles -== effektek - -Assets directory -== Kinézet Helye - -https://wiki.ddnet.tw/ -== - -Website -== Weboldal - -Settings -== Beállítások - -Stop server -== Szerver leállítása - -Run server -== Szerver indítása - -Server executable not found, can't run server -== nem sikerült elindítani a szervert - -Editor -== Szerkesztő - -[Start menu] -Play -== Játszás - -Manual -== Manuális - -Race -== Verseny - -Auto -== Autómatikus - -Replay -== Visszajátszás +##### authors ##### +#originally created by: +# Feca +#modified by: +# Boti. +##### /authors ##### + +##### translated strings ##### + +%ds left +== %ds van hátra + +%i minute left +== %i perc van hátra + +%i minutes left +== %i perc van hátra + +%i second left +== %i másodperc van hátra + +%i seconds left +== %i másodperc van hátra + +%s wins! +== %s nyert! + +-Page %d- +== -oldal %d- + +Abort +== Mégse + +Add +== Hozzáadás + +Add Friend +== Barát hozzáadása + +Address +== Cím + +All +== Mindenki + +Are you sure that you want to delete the demo? +== Biztos, hogy le akarod törölni a demót? + +Are you sure that you want to quit? +== Biztos, hogy ki akarsz lépni? + +Are you sure that you want to remove the player from your friends list? +== Biztos vagy benne, hogy ki akarod törölni a játékost a barátok listájáról? + +Automatically record demos +== Magától rögzítse a demókat + +Automatically take game over screenshot +== Magától készítsen a játék végén képet + +Blue team +== Kék csapat + +Blue team wins! +== A kék csapat nyert! + +Body +== Test + +Call vote +== Szavazás + +Change settings +== Beállítások átállítása + +Chat +== Chat + +Clan +== Klán + +Client +== Kliens + +Close +== Bezárás + +Compatible version +== Kompatibilis Verzió + +Connect +== Csatlakozás + +Connecting to +== Csatlakozás.. + +Connection Problems... +== Csatlakozási problémák... + +Console +== Konzol + +Controls +== Irányítások + +Count players only +== Számontartott játékosok + +Current +== Aktuális + +Custom colors +== Egyéni színek + +Delete +== Törlés + +Delete demo +== Demó törlése + +Demo details +== Információk a demóról + +Demos +== Demók + +Disconnect +== Kilépés + +Disconnected +== Lekapcsolódott + +Downloading map +== Pálya letöltése.. + +Draw! +== Döntetlen! + +Dynamic Camera +== Dinamikus kamera + +Emoticon +== Hangulatjel + +Enter +== Belépés + +Error +== Hiba + +Error loading demo +== Hiba történt a demó betöltése közben + +Favorite +== Kedvenc + +Favorites +== Kedvencek + +Feet +== Láb + +Filter +== Szűrő + +Fire +== Tűz + +Folder +== Mappa + +Force vote +== Szavazás kényszerítése + +Free-View +== Szabad-nézet + +Friends +== Barátok + +Fullscreen +== Teljesképernyő + +Game +== Játék + +Game info +== Játék infó + +Game over +== Játék vége + +Game type +== Játék fajtája + +Game types: +== Játék fajtái: + +General +== Általános + +Graphics +== Grafika + +Grenade +== Gránát + +Hammer +== Kalapács + +Has people playing +== Játékos játszik + +High Detail +== Jó részletek + +Hook +== Horog + +Invalid Demo +== Érvénytelen demó + +Join blue +== Kékhez lépés + +Join red +== Piroshoz lépés + +Jump +== Ugrás + +Kick player +== Játékos kirúgása + +Language +== Nyelv + +MOTD +== Napi üzenet + +Map +== Pálya + +Maximum ping: +== Maximum Ping: + +Mouse sens. +== Egér érzékenység + +Move left +== Balra lépés + +Move player to spectators +== Megfigyelőbe mozgatás + +Move right +== Jobbra lépés + +Movement +== Mozgás + +Mute when not active +== Letiltás ha nem aktív + +Name +== Név + +Next weapon +== Következő fegyver + +Nickname +== Becenév + +No +== Nem + +No password +== Jelszó nélküli + +No servers found +== Nem talált szervereket + +No servers match your filter criteria +== Nincs szerver a szűrőfeltételeidhez + +Ok +== Oké + +Open +== Megnyit + +Parent Folder +== Főmappa + +Password +== Jelszó + +Password incorrect +== Helytelen jelszó + +Ping +== Ping + +Pistol +== Pisztoly + +[Demo browser] +Play +== Játék + +Player +== Játékos + +Player options +== Játékos beállításai + +Players +== Játékos + +Please balance teams! +== Kérlek egyenlítsd ki a csapatokat! + +Prev. weapon +== Előző fegyver + +Quit +== Kilépés + +Reason: +== Indok: + +Red team +== Piros csapat + +Red team wins! +== A piros csapat nyert! + +Refresh +== Újratöltés + +Refreshing master servers +== Mester szerverek frissítése + +Remote console +== Távoli konzol + +Remove +== Eltávolítás + +Remove friend +== Barát eltávolítása + +Rename +== Átnevezés + +Rename demo +== Demó átnevezése + +Reset filter +== Szűrő visszaállítása + +Sample rate +== Mintavételi frekvencia + +Score +== Pontszám + +Score limit +== Ponthatár + +Scoreboard +== Pontszámtábla + +Screenshot +== Pillanatkép + +Server address: +== Szerver címe: + +Server details +== Szerver részletei + +Server filter +== Szerver szűrő + +Server info +== Szerver infó + +Server not full +== Szerver nincs tele + +Shotgun +== Sörétes puska + +Show chat +== Chat mutatása + +Show friends only +== Barátok mutatása + +Show ingame HUD +== Játék közbeni HUD mutatása + +Show name plates +== Név táblák mutatása + +Show only supported +== Csak támogatott mutatása + +Skins +== Skinek + +Sound +== Hang + +Sound error +== Hang hiba + +Spectate +== Megfigyelés + +Spectator mode +== Néző mód + +Spectators +== Megfigyelők + +Stop record +== Demó megállítása + +Sudden Death +== Gyors halál + +Switch weapon on pickup +== Fegyverváltás felvételnél + +Team +== Csapat + +Team chat +== Csapat chat + +The audio device couldn't be initialised. +== A hangeszköz nem érzékelhető. + +The server is running a non-standard tuning on a pure game type. +== A szerver egy nem szabványos hangolást futtat a tiszta játék típuson. + +There's an unsaved map in the editor, you might want to save it before you quit the game. +== Van egy mentett térkép a szerkesztőben, talán elakartad menteni, mielőtt kilépsz a játékból. + +Time limit +== Időhatár + +Time limit: %d min +== Időhatár: %d perc + +Try again +== Próbáld újra + +Type +== Típus + +Unable to delete the demo +== Nem sikerült törölni a demót + +Unable to rename the demo +== Nem sikerült átnevezni a demót + +Use sounds +== Hangok használata + +Use team colors for name plates +== Csapat szín használata név tábláknál + +V-Sync +== V-Sync + +Version +== Verzió + +Vote command: +== Szavazás parancsa: + +Vote description: +== Szavazás leírása: + +Vote no +== Nem + +Vote yes +== Igen + +Voting +== Szavazás + +Warmup +== Felkészülés + +Weapon +== Fegyver + +Yes +== Igen + +You must restart the game for all settings to take effect. +== Újra kell indítani a játékot, a beállítások érvénybe lépéséhez. + +New name: +== Új Név: + +Sat. +== telítettség + + + +Internet +== Internet + + + +Max demos +== Maximum Demók + +News +== Hírek + +Join game +== Csatlakozás a játékhoz + +FSAA samples +== FSAA minták + +Sound volume +== Hangerő + +Created: +== Készült: + +Max Screenshots +== Maximum Fotó + +Length: +== Hossza: + +Laser +== Lézer + +Netversion: +== Netes verzió: + +Map: +== Pálya: + +Info +== Infó + +Miscellaneous +== Vegyes + +Record demo +== Demó felvétele + +Your skin +== Te skined + +Size: +== Méret: + +Reset to defaults +== Visszaállítás alapértelmezettre + +Quit anyway? +== Mindenképpen kilép? + +Display Modes +== Kijelző módok + +Version: +== Verzió: + +Round +== Menet + +Lht. +== Fényerősség + +UI Color +== UI Szín + +Hue +== Színárnyalat + +Crc: +== Crc: + +Alpha +== Alpha + +LAN +== Helyi + +Name plates size +== Névtáblák mérete + +Type: +== Típus: + +Dummy settings +== Dummy beállításai + +AntiPing +== Antiping + +Show quads +== Képek mutatása + +Map sound volume +== Pálya hangereje + +Show only chat messages from friends +== Csak barátoktól jön üzenet + +Countries +== Országok + +Reconnect in %d sec +== Újracsatlakozás %d másodperc múlva + +Grabs +== Megfog + +Background (entities) +== Háttér entitással + +Show kill messages +== Halálüzenetek mutatása + +Show ghost +== Szellem mutatása + +DDNet +== DDNet + +No updates available +== Nincs elérhető frissítés + +Enable server message sound +== Szerver chat hang engedélyezése + +second +== másodperc + +Show votes window after voting +== Szavazási ablak mutatása szavazás után + +HUD +== HUD + +Spectate previous +== Előző nézése + +Look out! +== Vigyázz! + +Spectate next +== Következő nézése + +Show names in chat in team colors +== Csapatszínben jelennek meg a játékosok a chatben + +Select a name +== Válassz nevet + +Enable team chat sound +== Csapat chat hang engedélyezése + +Show other players' hook collision lines +== Játékosok horogvonalaik mutatása + +We will win +== Nyerni fogunk + +Hi o/ +== Szia o/ + +Deaths +== Halálok + +Enable game sounds +== Játék hangok engedélyezése + +DDNet Client needs to be restarted to complete update! +== Újra kell indítani a DDNet Klienst a frissítés befejezéséhez! + +Spectator +== Néző + +Please use a different name +== Kérlek, válassz másik nevet + +Wait before try for +== Várj, mielőtt kipróbálod a: + +Show console window +== Konzol ablak mutatása + +Show others +== Játékosok mutatása + +Gameplay +== Játékmód + +Restart +== Újraindítás + +Game paused +== Játék megállítva + +Old mouse mode +== Régi egér mód + +Browser +== Böngésző + +Play background music +== Háttérzene lejátszása + +Follow +== Követni + +Reset +== Alap + +Enable gun sound +== Fegyverhang lejátszása + +Show health + ammo +== Élet + lőszer mutatása + +Team message +== Csapat üzenet + +Automatically create statboard csv +== Magától készítsen csv pontszámtáblát + +Save the best demo of each race +== Mentse el a legjobb demót minden versenynél + +Show tiles layers from BG map +== Block-ok mutatása a háttérben + +Are you sure that you want to disconnect? +== Biztos, hogy le akarsz csatlakozni? + +Types +== Típusok + +Ghost +== Szellem + +Remove chat +== Chat eltüntetése + +Check now +== Nézd meg + +Background (regular) +== Háttér (pálya) + +Reset wanted weapon on death +== Újraéledéskor váltson az akart fegyverre + +Frags +== Zászlók + +AntiPing: predict other players +== Antiping: más játékosokra + +Show other players' key presses +== Mutassa a játékosok mozgását nyilakkal + +Automatically take statboard screenshot +== Automatikusan készítsen pontszám fényképet + +System message +== Rendszer üzenet + +Enable long pain sound (used when shooting in freeze) +== Hosszú fájdalom hang lejátszása (mikor a játékos lő,ha lefagyott) + +DDNet %s is available: +== DDnet %s verzió elérhető + +Updating... +== Frissítés... + +Overlay entities +== Entitás jelenése + +Messages +== Üzenetek + +%.2f MiB +== %.2f MiB + +Refresh Rate +== Frissítési érték + +New random timeout code +== Új random időtúllépési kód + +Suicides +== Öngyilkosságok + +Player country: +== Játékos országa + +Net +== Net + +Loading DDNet Client +== DDNet Kliens betöltése + +FPM +== FPM + +Default zoom +== Alap nagyítás + +Show score +== Pontok mutatása + +Spree +== Szorzó + +Show client IDs in Scoreboard +== Mutassa a játékosok ID-ét a pontszámtáblán + +Demofile: %s +== Demófájl: %s + +Max CSVs +== Maximum CSV-k + +seconds +== másodpercek + +Borderless window +== Ablak mód + +%.2f KiB +== %.2f KiB + +Strict gametype filter +== Szigorú játékmód szűrő + +Try fast HTTP map download first +== Próbálja meg a gyors HTTP letöltést először + +Use DDRace Scoreboard +== DDRace pontszámtábla használata + +Best +== Legjobb + +Enable regular chat sound +== Alap chat hang lejátszása + +Normal message +== Normál üzenet + +Screen +== Képernyő + +Search +== Keresés + +Connecting dummy +== Másolat válasza... + +Clan plates size +== Klán felirat mérete + +Update now +== frissíts most + +Show clan above name plates +== Klán mutatása a nevek fölött + +Save ghost +== Szellem mentése + +Exclude +== Kizárás + +Enable highlighted chat sound +== kiemelt chat hang lejátszása + +Hello and welcome +== Hali és üdv + +AntiPing: predict weapons +== Antiping: fegyvereknél + +DDNet Client updated! +== DDNet Kliens frissítve van! + +Outline color +== Körvonal szín + +Highlighted message +== Kiemelt üzenet + +Friend +== Barát + +Switch weapon when out of ammo +== Fegyver váltása, ha elfogy a lőszer + +AntiPing: predict grenade paths +== Antiping: gránátoknál + +Demo +== Demó + +Inner color +== belső szín + +##### generated by copy_fix.py, please translate this ##### +##### update for 11.6 version by Cellegen ##### + +Ratio +== Érték + +Friend message +== Baráti üzenet + +Fat skins (DDFat) +== Nagy skinek (DDFat) + +may cause delay +== Késleltetést okozhat + +Unfinished map +== befejezetlen pálya + +Deactivate +== Deaktiválás + +Welcome to DDNet +== Üdvözlet a DDNet-en + +Preinit VBO (iGPUs only) +== VBO használata (csak iGPU) + +Threaded sound loading +== Csavarmenetes hang betöltése + +Activate +== Aktiválás + +Multiple texture units (disable for MacOS) +== Több textúra egységek (kapcsolja ki MacOS esetén) + +Use OpenGL 3.3 (experimental) +== OpenGL 3.3 használata (Haladó) + +UI mouse s. +== UI egér sebesség + +File already exists, do you want to overwrite it? +== A fájl már létezik, szeretné felülírni? + +Indicate map finish +== Befejezett pályák + +Save +== Mentés + +Vanilla skins only +== Csak alap skinek + +Date +== Idő + +Show DDNet map finishes in server browser +== Mutassa a befejezett pályákat a keresőben + +transmits your player name to info2.ddnet.tw +== Keress rá a játékosnevedre az info2.ddnet.tw oldalon + +Reload +== újratöltés + +Hammerfly dummy +== Dummy Kalapács + +Downloading %s: +== Letöltés %s: + +Time +== Idő + +Kill +== Halál + +Personal best: +== Egyéni record: + +Show entities +== Entitások mutatása + +Video name: +== Videó neve: + +Connect Dummy +== Dummy Csatlakoztatása + +Disconnect Dummy +== Dummy Lecsatlakoztatása + +Filter connecting players +== Csatlakozók szűrése + +Pause +== Nézetváltás + +Toggle dummy +== Dummy irányítása + +Fetch Info +== Minden infó + +Dummy copy +== Másolat tükrözése + +Enable replays +== Visszajátszások + +Render demo +== Demó renderelése + +Zoom in +== Nagyítás + +Show text entities +== Textúrázott entitások + +Render +== Render + +Show all +== Mutasson mindent + +Learn +== Wikipédia + +Successfully saved the replay! +== Sikeresen elmentette a visszajátszást! + +Zoom out +== Kicsinyítés + +DDNet %s is out! +== DDNet %s elérhető! + +Statboard +== Státusztábla + +Converse +== Fordítás + +Use high DPI +== Magas DPI használata + +Update failed! Check log... +== Frissítés sikertelen! nézd meg a logot... + +Toggle dyncam +== Dinamikus kamera + +%d new mentions +== %d új értesítés + +Default length: %d +== Átlagos hossz: %d + +Show HUD +== HUD mutatása + +Size +== Méret + +Destination file already exist +== A kiválasztott helynél ez létezik + +Server best: +== Legjobb szerver: + +Markers: +== Jelölések + +1 new mention +== 1 új értesíté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. +== A DDraceNetwork együttműködésen alapuló online játékként tekinthető, ahol a cél az, hogy te és egy csapat Tee elérje a célvonalat. Ha újonc vagy, a kezdő (Novice) szervereket ajánljuk, ahol a legegyszerűbb versenyeket tároljuk. A lehető legkisebb ping választása alapján válassz egy szervert. + +The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. +== A pályákon fagyasztó részeket találtok, melyek ideiglenesen blokkolják a játékos mozgását. Együtt kell dolgoznod a pályarészekkel az átjutáshoz. + +The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. +== A görgő megváltoztatja a fegyvereket. A kalapács (bal egérgomb) segítségével más Tee-ket megüthetsz és ütésekkel kiolvadhatnak a fagyásból. + +Hook (right mouse) can be used to swing through the map and to hook other tees to you. +== A horoggal (jobb egérgomb) megkapaszkodhatsz néhány platformon és más Tee-ket is megragadhatsz vele. + +Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. +== A legfontosabb kulcs a sikerhez: Nincs oktatóprogram, így mindenki magától tanulja meg más játékosok által. (T gombbal tudsz Chattelni) + +It's recommended that you check the settings to adjust them to your liking before joining a server. +== Ajánlott, hogy ellenőrizd a beállításokat, hogy a kedvedhez igazítsd őket, mielőtt csatlakoznál egy szerverhez. (Tipp: szűrők) + +Please enter your nickname below. +== Írja be lent a becenevét. + +9+ new mentions +== 9+ új értesítés + +Replay feature is disabled! +== Visszajátszás mód kikapcsolva! + +Lock team +== Csapat lezárása + +Hook collisions +== Horog pontossága + +Toggle ghost +== Szellem mutatása + +Markers +== Jelölések + +Replace video +== Videó lecserélése + +Length +== Hossz + +Are you sure that you want to disconnect your dummy? +== Biztos, hogy kiakarod léptetni a dummy-d? + +Saving ddnet-settings.cfg failed +== nem sikerült elmenteni ddnet-settings.cfg fájlt + +The width or height of texture %s is not divisible by 16, which might cause visual bugs. +== A mérete a texturának %s nem látható, ami látható bugokhoz vezethet. + +Warning +== Figyelmeztetés + +Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. +== Debug mód bekapcsolva. nyomd meg a Ctrl+Shift+D billentyű kombinációt a kikapcsolásához + +Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. +== Használd a k gombot az újraéledéshez, q betű a megfigyeléshez. nézd meg a beállításokat a többi bindért. + +Existing Player +== Létező Játékos + +Your nickname '%s' is already used (%d points). Do you still want to use it? +== A Neved '%s' már használva volt (%d ponttal). Biztosan szeretnéd használni? + +Checking for existing player with your name +== Keresés már létező játékos után a neveddel + +Country / Region +== Ország / Régió + +Speed +== Sebesség + +Theme +== Téma + +%d of %d servers +== %d a %d szerverből + +%d of %d server +== %d ből %d szerver + +%d players +== %d játékos + +%d player +== %d játékos + +Demos directory +== Demók Helye + +Smooth Dynamic Camera +== Egyenletesen dinamikus kamera + +Skip the main menu +== főmenű kihagyása + +Themes directory +== Témák Helye + +Download skins +== Skinek letöltése + +Skin prefix +== Karakter prefix + +Skin Database +== Több skin + +Skins directory +== Skinek Helye + +Game sound volume +== Játék Hangerő + +Chat sound volume +== Chat Hangerő + +Background music volume +== Háttér Zene hangerő + +Assets +== Kinézet + +Use old chat style +== régi chat stílus használata + +Highlight +== kijelöl + +Client message +== Kliens Üzenet + +Show others (own team only) +== Mások mutatása (csak csapatok) + +Use current map as background +== Jelenlegi map használta háttérként + +Entities +== Entitások + +Emoticons +== Hangulatjelek + +Particles +== effektek + +Assets directory +== Kinézet Helye + +Website +== Weboldal + +Settings +== Beállítások + +Stop server +== Szerver leállítása + +Run server +== Szerver indítása + +Server executable not found, can't run server +== nem sikerült elindítani a szervert + +Editor +== Szerkesztő + +[Start menu] +Play +== Játszás + +Manual +== Manuális + +Race +== Verseny + +Auto +== Autómatikus + +Replay +== Visszajátszás + +https://wiki.ddnet.tw/ +== diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index 520bb00af..1850f19d9 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -1154,6 +1154,18 @@ Grabs 9+ new mentions == nevnt 9+ ganger +Manual +== Manuell + +Race +== Løp + +Auto +== Auto + +Replay +== Opptak + Saving ddnet-settings.cfg failed == @@ -1280,15 +1292,3 @@ Editor [Start menu] Play == - -Manual -== Manuell - -Race -== Løp - -Auto -== Auto - -Replay -== Opptak diff --git a/data/languages/polish.txt b/data/languages/polish.txt index 0a366f936..8639b310f 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -1158,6 +1158,18 @@ Indicate map finish Show others (own team only) == Pokazuj innych (tylko drużynę) +Manual +== Instrukcja + +Race +== Wyścig + +Auto +== Auto + +Replay +== Powtórka + Saving ddnet-settings.cfg failed == @@ -1284,15 +1296,3 @@ Editor [Start menu] Play == - -Manual -== Instrukcja - -Race -== Wyścig - -Auto -== Auto - -Replay -== Powtórka diff --git a/data/languages/russian.txt b/data/languages/russian.txt index af99caa69..7320fcfb6 100644 --- a/data/languages/russian.txt +++ b/data/languages/russian.txt @@ -1274,9 +1274,6 @@ Highlight Use current map as background == Использовать данную карту как фон -Entities -== - Emoticons == Эмоции @@ -1297,3 +1294,6 @@ Auto Replay == Запись + +Entities +== diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt index 81a723734..42afa7c9b 100644 --- a/data/languages/serbian_cyrillic.txt +++ b/data/languages/serbian_cyrillic.txt @@ -1244,6 +1244,18 @@ Grabs 9+ new mentions == 9+ нових помињања +Manual +== Упутство + +Race +== Трка + +Auto +== Ауто + +Replay +== Помнови + Saving ddnet-settings.cfg failed == @@ -1279,15 +1291,3 @@ Highlight Use current map as background == - -Manual -== Упутство - -Race -== Трка - -Auto -== Ауто - -Replay -== Помнови diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index 52e940698..203cfb6f2 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -1210,6 +1210,18 @@ Server executable not found, can't run server Editor == 编辑器 +Manual +== 手动 + +Race +== 竞速赛 + +Auto +== 自动 + +Replay +== 回放 + Saving ddnet-settings.cfg failed == @@ -1290,15 +1302,3 @@ Particles Assets directory == - -Manual -== 手动 - -Race -== 竞速赛 - -Auto -== 自动 - -Replay -== 回放 diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt index 5e67a3413..38ed775de 100644 --- a/data/languages/swedish.txt +++ b/data/languages/swedish.txt @@ -1217,6 +1217,18 @@ Editor Play == Spela +Manual +== Manual + +Race +== Race + +Auto +== Auto + +Replay +== Repris + Saving ddnet-settings.cfg failed == @@ -1282,15 +1294,3 @@ Particles Assets directory == - -Manual -== Manual - -Race -== Race - -Auto -== Auto - -Replay -== Repris diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index 7f11f073c..372a5e3ad 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -1170,6 +1170,18 @@ Country / Region https://wiki.ddnet.tw/ == https://docs.qq.com/doc/DWGFrV0xPRmVWVkla +Manual +== 手動 + +Race +== 競速賽 + +Auto +== 自動 + +Replay +== 回放 + Saving ddnet-settings.cfg failed == @@ -1284,15 +1296,3 @@ Editor [Start menu] Play == - -Manual -== 手動 - -Race -== 競速賽 - -Auto -== 自動 - -Replay -== 回放 diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index 805b78dbb..580a3d207 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -1164,6 +1164,18 @@ Grabs 9+ new mentions == 9+ yeni bildirim +Manual +== Manual + +Race +== Yarış + +Auto +== Otomatik + +Replay +== Yeniden oynatma + Saving ddnet-settings.cfg failed == @@ -1284,15 +1296,3 @@ Editor [Start menu] Play == - -Manual -== Manual - -Race -== Yarış - -Auto -== Otomatik - -Replay -== Yeniden oynatma diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt index bc0a7fdd0..52604b135 100644 --- a/data/languages/ukrainian.txt +++ b/data/languages/ukrainian.txt @@ -1153,6 +1153,18 @@ Grabs 9+ new mentions == 9+ нових згадок +Manual +== Ручна + +Race +== Гонка + +Auto +== Авто + +Replay +== Повтор + Saving ddnet-settings.cfg failed == @@ -1279,15 +1291,3 @@ Editor [Start menu] Play == - -Manual -== Ручна - -Race -== Гонка - -Auto -== Авто - -Replay -== Повтор From df4c7a08c8f73e6a27efc75395aa155fec5633a0 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 8 Nov 2020 06:39:16 +0100 Subject: [PATCH 067/144] Add skin metrics --- src/game/client/components/chat.cpp | 11 +- src/game/client/components/chat.h | 1 + src/game/client/components/ghost.cpp | 3 + src/game/client/components/killmessages.cpp | 34 +++++- src/game/client/components/killmessages.h | 2 + src/game/client/components/menus_settings.cpp | 2 + src/game/client/components/players.cpp | 2 + src/game/client/components/skins.cpp | 72 +++++++++++- src/game/client/gameclient.cpp | 5 + src/game/client/render.cpp | 103 +++++++++++++++++- src/game/client/render.h | 12 ++ src/game/client/skin.h | 67 ++++++++++++ 12 files changed, 304 insertions(+), 10 deletions(-) diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index 2fe23b9d8..4ebad8dfb 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -810,6 +810,8 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine) str_copy(pCurrentLine->m_aSkinName, m_pClient->m_aClients[pCurrentLine->m_ClientID].m_aSkinName, sizeof(pCurrentLine->m_aSkinName)); pCurrentLine->m_ColorBody = m_pClient->m_aClients[pCurrentLine->m_ClientID].m_RenderInfo.m_ColorBody; pCurrentLine->m_ColorFeet = m_pClient->m_aClients[pCurrentLine->m_ClientID].m_RenderInfo.m_ColorFeet; + + pCurrentLine->m_RenderSkinMetrics = m_pClient->m_aClients[pCurrentLine->m_ClientID].m_RenderInfo.m_SkinMetrics; pCurrentLine->m_HasRenderTee = true; } } @@ -883,6 +885,8 @@ void CChat::RefindSkins() m_aLines[r].m_RenderSkin = pSkin->m_ColorableSkin; else m_aLines[r].m_RenderSkin = pSkin->m_OriginalSkin; + + m_aLines[r].m_RenderSkinMetrics = pSkin->m_Metrics; } } } @@ -1281,6 +1285,7 @@ void CChat::OnRender() RenderInfo.m_ColorableRenderSkin = m_aLines[r].m_RenderSkin; else RenderInfo.m_OriginalRenderSkin = m_aLines[r].m_RenderSkin; + RenderInfo.m_SkinMetrics = m_aLines[r].m_RenderSkinMetrics; RenderInfo.m_ColorBody = m_aLines[r].m_ColorBody; RenderInfo.m_ColorFeet = m_aLines[r].m_ColorFeet; @@ -1289,10 +1294,12 @@ void CChat::OnRender() float RowHeight = FONT_SIZE + RealMsgPaddingY; float OffsetTeeY = MESSAGE_TEE_SIZE / 2.0f; float FullHeightMinusTee = RowHeight - MESSAGE_TEE_SIZE; - float TWSkinUnreliableOffset = 1.0f; // teeworlds skins were always a bit in the ground CAnimState *pIdleState = CAnimState::GetIdle(); - RenderTools()->RenderTee(pIdleState, &RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), vec2(x + (RealMsgPaddingX + MESSAGE_TEE_SIZE) / 2.0f, y + OffsetTeeY + FullHeightMinusTee / 2.0f + TWSkinUnreliableOffset), Blend); + vec2 OffsetToMid; + RenderTools()->GetRenderTeeOffsetToRenderedTee(pIdleState, &RenderInfo, OffsetToMid); + vec2 TeeRenderPos(x + (RealMsgPaddingX + MESSAGE_TEE_SIZE) / 2.0f, y + OffsetTeeY + FullHeightMinusTee / 2.0f + OffsetToMid.y); + RenderTools()->RenderTee(pIdleState, &RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), TeeRenderPos, Blend); } STextRenderColor TextOutline(0.f, 0.f, 0.f, 0.3f * Blend); diff --git a/src/game/client/components/chat.h b/src/game/client/components/chat.h index 1d1342756..9eac76efd 100644 --- a/src/game/client/components/chat.h +++ b/src/game/client/components/chat.h @@ -41,6 +41,7 @@ class CChat : public CComponent char m_aSkinName[sizeof(g_Config.m_ClPlayerSkin) / sizeof(g_Config.m_ClPlayerSkin[0])]; CSkin::SSkinTextures m_RenderSkin; + CSkin::SSkinMetrics m_RenderSkinMetrics; bool m_CustomColoredSkin; ColorRGBA m_ColorBody; ColorRGBA m_ColorFeet; diff --git a/src/game/client/components/ghost.cpp b/src/game/client/components/ghost.cpp index 20065117d..5b64317f6 100644 --- a/src/game/client/components/ghost.cpp +++ b/src/game/client/components/ghost.cpp @@ -357,6 +357,7 @@ void CGhost::InitRenderInfos(CGhostItem *pGhost) pRenderInfo->m_OriginalRenderSkin = pSkin->m_OriginalSkin; pRenderInfo->m_ColorableRenderSkin = pSkin->m_ColorableSkin; pRenderInfo->m_BloodColor = pSkin->m_BloodColor; + pRenderInfo->m_SkinMetrics = pSkin->m_Metrics; pRenderInfo->m_CustomColoredSkin = pGhost->m_Skin.m_UseCustomColor; if(pGhost->m_Skin.m_UseCustomColor) { @@ -642,6 +643,7 @@ void CGhost::RefindSkin() const CSkin *pSkin = m_pClient->m_pSkins->Get(SkinId); pRenderInfo->m_OriginalRenderSkin = pSkin->m_OriginalSkin; pRenderInfo->m_ColorableRenderSkin = pSkin->m_ColorableSkin; + pRenderInfo->m_SkinMetrics = pSkin->m_Metrics; } } IntsToStr(&m_CurGhost.m_Skin.m_Skin0, 6, aSkinName); @@ -653,5 +655,6 @@ void CGhost::RefindSkin() const CSkin *pSkin = m_pClient->m_pSkins->Get(SkinId); pRenderInfo->m_OriginalRenderSkin = pSkin->m_OriginalSkin; pRenderInfo->m_ColorableRenderSkin = pSkin->m_ColorableSkin; + pRenderInfo->m_SkinMetrics = pSkin->m_Metrics; } } diff --git a/src/game/client/components/killmessages.cpp b/src/game/client/components/killmessages.cpp index 4768e325f..8ac49134c 100644 --- a/src/game/client/components/killmessages.cpp +++ b/src/game/client/components/killmessages.cpp @@ -196,7 +196,8 @@ void CKillMessages::OnRender() } } - RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_VictimRenderInfo, EMOTE_PAIN, vec2(-1, 0), vec2(x, y + 28)); + if(m_aKillmsgs[r].m_VictimID >= 0) + RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_VictimRenderInfo, EMOTE_PAIN, vec2(-1, 0), vec2(x, y + 28)); x -= 32.0f; // render weapon @@ -229,7 +230,8 @@ void CKillMessages::OnRender() // render killer tee x -= 24.0f; - RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_KillerRenderInfo, EMOTE_ANGRY, vec2(1, 0), vec2(x, y + 28)); + if(m_aKillmsgs[r].m_KillerID >= 0) + RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_KillerRenderInfo, EMOTE_ANGRY, vec2(1, 0), vec2(x, y + 28)); x -= 32.0f; // render killer name @@ -242,3 +244,31 @@ void CKillMessages::OnRender() y += 46.0f; } } + +void CKillMessages::RefindSkins() +{ + for(int i = 0; i < MAX_KILLMSGS; i++) + { + int r = i % MAX_KILLMSGS; + if(Client()->GameTick(g_Config.m_ClDummy) > m_aKillmsgs[r].m_Tick + 50 * 10) + continue; + + if(m_aKillmsgs[r].m_KillerID >= 0) + { + CGameClient::CClientData &Client = GameClient()->m_aClients[m_aKillmsgs[r].m_KillerID]; + if(Client.m_aSkinName[0] != '\0') + m_aKillmsgs[r].m_KillerRenderInfo = Client.m_RenderInfo; + else + m_aKillmsgs[r].m_KillerID = -1; + } + + if(m_aKillmsgs[r].m_VictimID >= 0) + { + CGameClient::CClientData &Client = GameClient()->m_aClients[m_aKillmsgs[r].m_VictimID]; + if(Client.m_aSkinName[0] != '\0') + m_aKillmsgs[r].m_VictimRenderInfo = Client.m_RenderInfo; + else + m_aKillmsgs[r].m_VictimID = -1; + } + } +} diff --git a/src/game/client/components/killmessages.h b/src/game/client/components/killmessages.h index 3cfbf5c20..5a29b8422 100644 --- a/src/game/client/components/killmessages.h +++ b/src/game/client/components/killmessages.h @@ -52,6 +52,8 @@ public: virtual void OnRender(); virtual void OnMessage(int MsgType, void *pRawMsg); virtual void OnInit(); + + void RefindSkins(); }; #endif diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index f830b52cb..81c387601 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -469,6 +469,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView) const CSkin *pSkin = m_pClient->m_pSkins->Get(m_pClient->m_pSkins->Find(Skin)); OwnSkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin; OwnSkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin; + OwnSkinInfo.m_SkinMetrics = pSkin->m_Metrics; OwnSkinInfo.m_CustomColoredSkin = *UseCustomColor; if(*UseCustomColor) { @@ -649,6 +650,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView) Info.m_OriginalRenderSkin = s->m_OriginalSkin; Info.m_ColorableRenderSkin = s->m_ColorableSkin; + Info.m_SkinMetrics = s->m_Metrics; Item.m_Rect.HSplitTop(5.0f, 0, &Item.m_Rect); // some margin from the top RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, 0, vec2(1.0f, 0.0f), vec2(Item.m_Rect.x + 30, Item.m_Rect.y + Item.m_Rect.h / 2)); diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp index f3d81b6ee..cc2501bf3 100644 --- a/src/game/client/components/players.cpp +++ b/src/game/client/components/players.cpp @@ -654,6 +654,7 @@ void CPlayers::OnRender() m_aRenderInfo[i].m_OriginalRenderSkin = pSkin->m_OriginalSkin; m_aRenderInfo[i].m_ColorableRenderSkin = pSkin->m_ColorableSkin; m_aRenderInfo[i].m_BloodColor = pSkin->m_BloodColor; + m_aRenderInfo[i].m_SkinMetrics = pSkin->m_Metrics; m_aRenderInfo[i].m_CustomColoredSkin = IsTeamplay; if(!IsTeamplay) { @@ -668,6 +669,7 @@ void CPlayers::OnRender() m_RenderInfoSpec.m_OriginalRenderSkin = pSkin->m_OriginalSkin; m_RenderInfoSpec.m_ColorableRenderSkin = pSkin->m_ColorableSkin; m_RenderInfoSpec.m_BloodColor = pSkin->m_BloodColor; + m_RenderInfoSpec.m_SkinMetrics = pSkin->m_Metrics; m_RenderInfoSpec.m_CustomColoredSkin = false; m_RenderInfoSpec.m_Size = 64.0f; diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp index 461f32204..9c2cd4f58 100644 --- a/src/game/client/components/skins.cpp +++ b/src/game/client/components/skins.cpp @@ -78,24 +78,49 @@ int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) for(int i = 0; i < 6; ++i) Skin.m_OriginalSkin.m_Eyes[i] = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_EYE_NORMAL + i]); - int BodySize = 96; // body size + int FeetGridPixelsWidth = (Info.m_Width / g_pData->m_aSprites[SPRITE_TEE_FOOT].m_pSet->m_Gridx); + int FeetGridPixelsHeight = (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_FOOT].m_pSet->m_Gridy); + int FeetWidth = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_W * FeetGridPixelsWidth; + int FeetHeight = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_H * FeetGridPixelsHeight; + + int FeetOffsetX = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_X * FeetGridPixelsWidth; + int FeetOffsetY = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_Y * FeetGridPixelsHeight; + + int BodySize = g_pData->m_aSprites[SPRITE_TEE_BODY].m_H * (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridy); // body size if(BodySize > Info.m_Height) return 0; unsigned char *d = (unsigned char *)Info.m_pData; int Pitch = Info.m_Width * 4; + int MaxBodyY = -1; + int MinBodyY = BodySize + 1; + int MaxBodyX = -1; + int MinBodyX = BodySize + 1; + // dig out blood color { int aColors[3] = {0}; for(int y = 0; y < BodySize; y++) for(int x = 0; x < BodySize; x++) { - if(d[y * Pitch + x * 4 + 3] > 128) + uint8_t AlphaValue = d[y * Pitch + x * 4 + 3]; + if(AlphaValue > 128) { aColors[0] += d[y * Pitch + x * 4 + 0]; aColors[1] += d[y * Pitch + x * 4 + 1]; aColors[2] += d[y * Pitch + x * 4 + 2]; } + if(AlphaValue > 0) + { + if(MaxBodyY < y) + MaxBodyY = y; + if(MinBodyY > y) + MinBodyY = y; + if(MaxBodyX < x) + MaxBodyX = x; + if(MinBodyX > x) + MinBodyX = x; + } } if(aColors[0] != 0 && aColors[1] != 0 && aColors[2] != 0) Skin.m_BloodColor = ColorRGBA(normalize(vec3(aColors[0], aColors[1], aColors[2]))); @@ -103,6 +128,49 @@ int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) Skin.m_BloodColor = ColorRGBA(0, 0, 0, 1); } + Skin.m_Metrics.m_BodyHeight = clamp((MaxBodyY - MinBodyY) + 1, 1, BodySize); + Skin.m_Metrics.m_BodyWidth = clamp((MaxBodyX - MinBodyX) + 1, 1, BodySize); + Skin.m_Metrics.m_BodyOffsetX = clamp(MinBodyX, 0, BodySize - 1); + Skin.m_Metrics.m_BodyOffsetY = clamp(MinBodyY, 0, BodySize - 1); + + Skin.m_Metrics.m_BodyMaxWidth = BodySize; + Skin.m_Metrics.m_BodyMaxHeight = BodySize; + + // get feet size + { + int MaxFeetY = -1; + int MinFeetY = FeetHeight + 1; + int MaxFeetX = -1; + int MinFeetX = FeetWidth + 1; + + for(int y = 0; y < FeetHeight; y++) + { + for(int x = 0; x < FeetWidth; x++) + { + int OffsetAlpha = (y + FeetOffsetY) * Pitch + (x + FeetOffsetX) * 4 + 3; + uint8_t AlphaValue = d[OffsetAlpha]; + if(AlphaValue > 0) + { + if(MaxFeetY < y) + MaxFeetY = y; + if(MinFeetY > y) + MinFeetY = y; + if(MaxFeetX < x) + MaxFeetX = x; + if(MinFeetX > x) + MinFeetX = x; + } + } + } + + Skin.m_Metrics.m_FeetWidth = clamp((MaxFeetX - MinFeetX) + 1, 1, FeetWidth); + Skin.m_Metrics.m_FeetHeight = clamp((MaxFeetY - MinFeetY) + 1, 1, FeetHeight); + Skin.m_Metrics.m_FeetOffsetX = clamp(MinFeetX, 0, FeetWidth - 1); + Skin.m_Metrics.m_FeetOffsetY = clamp(MinFeetY, 0, FeetHeight - 1); + Skin.m_Metrics.m_FeetMaxWidth = FeetWidth; + Skin.m_Metrics.m_FeetMaxHeight = FeetHeight; + } + // create colorless version int Step = Info.m_Format == CImageInfo::FORMAT_RGBA ? 4 : 3; diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 7f05d7eda..03d3bd26f 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -1252,6 +1252,7 @@ void CGameClient::OnNewSnapshot() const CSkin *pSkin = m_pSkins->Get(m_pSkins->Find(pClient->m_aSkinName)); pClient->m_SkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin; pClient->m_SkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin; + pClient->m_SkinInfo.m_SkinMetrics = pSkin->m_Metrics; pClient->m_SkinInfo.m_BloodColor = pSkin->m_BloodColor; pClient->m_SkinInfo.m_CustomColoredSkin = pClient->m_UseCustomColor; @@ -1974,6 +1975,7 @@ void CGameClient::CClientData::Reset() m_SkinInfo.m_CustomColoredSkin = false; m_SkinInfo.m_ColorBody = ColorRGBA(1, 1, 1); m_SkinInfo.m_ColorFeet = ColorRGBA(1, 1, 1); + m_SkinInfo.m_SkinMetrics.Reset(); m_Solo = false; m_Jetpack = false; @@ -2888,6 +2890,8 @@ void CGameClient::RefindSkins() { for(auto &Client : m_aClients) { + Client.m_SkinInfo.m_OriginalRenderSkin.Reset(); + Client.m_SkinInfo.m_ColorableRenderSkin.Reset(); if(Client.m_aSkinName[0] != '\0') { const CSkin *pSkin = m_pSkins->Get(m_pSkins->Find(Client.m_aSkinName)); @@ -2898,6 +2902,7 @@ void CGameClient::RefindSkins() } m_pGhost->RefindSkin(); m_pChat->RefindSkins(); + gs_KillMessages.RefindSkins(); } void CGameClient::LoadMapSettings() diff --git a/src/game/client/render.cpp b/src/game/client/render.cpp index 00ad48678..3ac70ca9e 100644 --- a/src/game/client/render.cpp +++ b/src/game/client/render.cpp @@ -540,6 +540,100 @@ void CRenderTools::DrawCircle(float x, float y, float r, int Segments) Graphics()->QuadsDrawFreeform(Array, NumItems); } +void CRenderTools::GetRenderTeeAnimScaleAndBaseSize(CAnimState *pAnim, CTeeRenderInfo *pInfo, float &AnimScale, float &BaseSize) +{ + AnimScale = pInfo->m_Size * 1.0f / 64.0f; + BaseSize = pInfo->m_Size; +} + +void CRenderTools::GetRenderTeeBodyScale(float BaseSize, float &BodyScale) +{ + BodyScale = g_Config.m_ClFatSkins ? BaseSize * 1.3f : BaseSize; + BodyScale /= 64.0f; +} + +void CRenderTools::GetRenderTeeFeetScale(float BaseSize, float &FeetScaleWidth, float &FeetScaleHeight) +{ + FeetScaleWidth = BaseSize / 64.0f; + FeetScaleHeight = (BaseSize / 2) / 32.0f; +} + +void CRenderTools::GetRenderTeeBodySize(CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &BodyOffset, float &Width, float &Height) +{ + float AnimScale, BaseSize; + GetRenderTeeAnimScaleAndBaseSize(pAnim, pInfo, AnimScale, BaseSize); + + float BodyScale; + GetRenderTeeBodyScale(BaseSize, BodyScale); + + Width = pInfo->m_SkinMetrics.BodyWidthNormalized() * 64.0f * BodyScale; + Height = pInfo->m_SkinMetrics.BodyHeightNormalized() * 64.0f * BodyScale; + BodyOffset.x = pInfo->m_SkinMetrics.BodyOffsetXNormalized() * 64.0f * BodyScale; + BodyOffset.y = pInfo->m_SkinMetrics.BodyOffsetYNormalized() * 64.0f * BodyScale; +} + +void CRenderTools::GetRenderTeeFeetSize(CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &FeetOffset, float &Width, float &Height) +{ + float AnimScale, BaseSize; + GetRenderTeeAnimScaleAndBaseSize(pAnim, pInfo, AnimScale, BaseSize); + + float FeetScaleWidth, FeetScaleHeight; + GetRenderTeeFeetScale(BaseSize, FeetScaleWidth, FeetScaleHeight); + + Width = pInfo->m_SkinMetrics.FeetWidthNormalized() * 64.0f * FeetScaleWidth; + Height = pInfo->m_SkinMetrics.FeetHeightNormalized() * 32.0f * FeetScaleHeight; + FeetOffset.x = pInfo->m_SkinMetrics.FeetOffsetXNormalized() * 64.0f * FeetScaleWidth; + FeetOffset.y = pInfo->m_SkinMetrics.FeetOffsetYNormalized() * 32.0f * FeetScaleHeight; +} + +void CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &TeeOffsetToMid) +{ + float AnimScale, BaseSize; + GetRenderTeeAnimScaleAndBaseSize(pAnim, pInfo, AnimScale, BaseSize); + vec2 BodyPos = vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y) * AnimScale; + + float AssumedScale = BaseSize / 64.0f; + + // just use the lowest feet + vec2 FeetPos; + CAnimKeyframe *pFoot = pAnim->GetFrontFoot(); + FeetPos = vec2(pFoot->m_X * AnimScale, pFoot->m_Y * AnimScale); + pFoot = pAnim->GetBackFoot(); + FeetPos = vec2(FeetPos.x, maximum(FeetPos.y, pFoot->m_Y * AnimScale)); + + vec2 BodyOffset; + float BodyWidth, BodyHeight; + GetRenderTeeBodySize(pAnim, pInfo, BodyOffset, BodyWidth, BodyHeight); + + // -32 is the assumed min relative position for the quad + float MinY = -32.0f * AssumedScale; + // the body pos shifts the body away from center + MinY += BodyPos.y; + // the actual body is smaller tho, bcs it doesnt use the full skin image in most cases + MinY += BodyOffset.y; + + vec2 FeetOffset; + float FeetWidth, FeetHeight; + GetRenderTeeFeetSize(pAnim, pInfo, FeetOffset, FeetWidth, FeetHeight); + + // MaxY builds up from the MinY + float MaxY = MinY + BodyHeight; + // if the body is smaller than the total feet offset, use feet + // since feets are smaller in height, respect the assumed relative position + MaxY = maximum(MaxY, (-16.0f * AssumedScale + FeetPos.y) + FeetOffset.y + FeetHeight); + + // now we got the full rendered size + float FullHeight = (MaxY - MinY); + + // next step is to calculate the offset that was created compared to the assumed relative positon + float MidOfRendered = MinY + FullHeight / 2.0f; + + // TODO: x coordinate is ignored for now, bcs it's not really used yet anyway + TeeOffsetToMid.x = 0; + // negative value, because the calculation that uses this offset should work with addition. + TeeOffsetToMid.y = -MidOfRendered; +} + void CRenderTools::RenderTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha) { vec2 Direction = Dir; @@ -555,8 +649,8 @@ void CRenderTools::RenderTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote for(int f = 0; f < 2; f++) { - float AnimScale = pInfo->m_Size * 1.0f / 64.0f; - float BaseSize = pInfo->m_Size; + float AnimScale, BaseSize; + GetRenderTeeAnimScaleAndBaseSize(pAnim, pInfo, AnimScale, BaseSize); if(f == 1) { Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); @@ -564,9 +658,10 @@ void CRenderTools::RenderTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote // draw body Graphics()->SetColor(pInfo->m_ColorBody.r, pInfo->m_ColorBody.g, pInfo->m_ColorBody.b, Alpha); vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y) * AnimScale; - float BodySize = g_Config.m_ClFatSkins ? BaseSize * 1.3f : BaseSize; + float BodyScale; + GetRenderTeeBodyScale(BaseSize, BodyScale); Graphics()->TextureSet(OutLine == 1 ? pSkinTextures->m_BodyOutline : pSkinTextures->m_Body); - Graphics()->RenderQuadContainerAsSprite(m_TeeQuadContainerIndex, OutLine, BodyPos.x, BodyPos.y, BodySize / 64.f, BodySize / 64.f); + Graphics()->RenderQuadContainerAsSprite(m_TeeQuadContainerIndex, OutLine, BodyPos.x, BodyPos.y, BodyScale, BodyScale); // draw eyes if(p == 1) diff --git a/src/game/client/render.h b/src/game/client/render.h index d88ee34b6..867785551 100644 --- a/src/game/client/render.h +++ b/src/game/client/render.h @@ -23,6 +23,9 @@ public: CSkin::SSkinTextures m_OriginalRenderSkin; CSkin::SSkinTextures m_ColorableRenderSkin; + + CSkin::SSkinMetrics m_SkinMetrics; + bool m_CustomColoredSkin; ColorRGBA m_BloodColor; @@ -50,6 +53,10 @@ class CRenderTools { int m_TeeQuadContainerIndex; + void GetRenderTeeAnimScaleAndBaseSize(class CAnimState *pAnim, CTeeRenderInfo *pInfo, float &AnimScale, float &BaseSize); + void GetRenderTeeBodyScale(float BaseSize, float &BodyScale); + void GetRenderTeeFeetScale(float BaseSize, float &FeetScaleWidth, float &FeetScaleHeight); + public: class IGraphics *m_pGraphics; class CUI *m_pUI; @@ -95,6 +102,11 @@ public: // larger rendering methods void RenderTilemapGenerateSkip(class CLayers *pLayers); + void GetRenderTeeBodySize(class CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &BodyOffset, float &Width, float &Height); + void GetRenderTeeFeetSize(class CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &FeetOffset, float &Width, float &Height); + + // returns the offset to use, to render the tee with @see RenderTee exactly in the mid + void GetRenderTeeOffsetToRenderedTee(class CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &TeeOffsetToMid); // object render methods (gc_render_obj.cpp) void RenderTee(class CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha = 1.0f); diff --git a/src/game/client/skin.h b/src/game/client/skin.h index 978430806..d5d7cf31d 100644 --- a/src/game/client/skin.h +++ b/src/game/client/skin.h @@ -42,6 +42,73 @@ struct CSkin char m_aName[24]; ColorRGBA m_BloodColor; + struct SSkinMetrics + { + int m_BodyWidth; + int m_BodyHeight; + int m_BodyOffsetX; + int m_BodyOffsetY; + + // these can be used to normalize the metrics + int m_BodyMaxWidth; + int m_BodyMaxHeight; + + int m_FeetWidth; + int m_FeetHeight; + int m_FeetOffsetX; + int m_FeetOffsetY; + + // these can be used to normalize the metrics + int m_FeetMaxWidth; + int m_FeetMaxHeight; + + void Reset() + { + m_BodyWidth = m_BodyHeight = m_BodyOffsetX = m_BodyOffsetY = m_FeetWidth = m_FeetHeight = m_FeetOffsetX = m_FeetOffsetY = -1; + } + + float BodyWidthNormalized() + { + return (float)m_BodyWidth / (float)m_BodyMaxWidth; + } + + float BodyHeightNormalized() + { + return (float)m_BodyHeight / (float)m_BodyMaxHeight; + } + + float BodyOffsetXNormalized() + { + return (float)m_BodyOffsetX / (float)m_BodyMaxWidth; + } + + float BodyOffsetYNormalized() + { + return (float)m_BodyOffsetY / (float)m_BodyMaxHeight; + } + + float FeetWidthNormalized() + { + return (float)m_FeetWidth / (float)m_FeetMaxWidth; + } + + float FeetHeightNormalized() + { + return (float)m_FeetHeight / (float)m_FeetMaxHeight; + } + + float FeetOffsetXNormalized() + { + return (float)m_FeetOffsetX / (float)m_FeetMaxWidth; + } + + float FeetOffsetYNormalized() + { + return (float)m_FeetOffsetY / (float)m_FeetMaxHeight; + } + }; + SSkinMetrics m_Metrics; + bool operator<(const CSkin &Other) const { return str_comp_nocase(m_aName, Other.m_aName) < 0; } bool operator<(const char *pOther) const { return str_comp_nocase(m_aName, pOther) < 0; } From 984352dd00af1b4f9087bb60062515a03fea642a Mon Sep 17 00:00:00 2001 From: trml Date: Sun, 8 Nov 2020 14:05:44 +0100 Subject: [PATCH 068/144] Only use individual character flags for collision when ddnetchar is available --- src/game/client/gameclient.cpp | 7 +++++++ src/game/gamecore.cpp | 3 +++ 2 files changed, 10 insertions(+) diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 7f05d7eda..9917b2c18 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2217,6 +2217,13 @@ void CGameClient::UpdatePrediction() else m_GameWorld.TuningList()[TuneZone] = m_GameWorld.m_Core.m_Tuning[g_Config.m_ClDummy] = m_Tuning[g_Config.m_ClDummy]; + // if ddnetcharacter is available, ignore server-wide tunings for hook and collision + if(m_Snap.m_aCharacters[m_Snap.m_LocalClientID].m_HasExtendedData) + { + m_GameWorld.m_Tuning[g_Config.m_ClDummy].m_PlayerCollision = 1; + m_GameWorld.m_Tuning[g_Config.m_ClDummy].m_PlayerHooking = 1; + } + // restore characters from previously saved ones if they temporarily left the snapshot for(int i = 0; i < MAX_CLIENTS; i++) if(m_aLastWorldCharacters[i].IsAlive() && m_Snap.m_aCharacters[i].m_Active && !m_GameWorld.GetCharacterByID(i)) diff --git a/src/game/gamecore.cpp b/src/game/gamecore.cpp index 2472c18f1..aa7b4a2f2 100644 --- a/src/game/gamecore.cpp +++ b/src/game/gamecore.cpp @@ -559,6 +559,9 @@ void CCharacterCore::ReadDDNet(const CNetObj_DDNetCharacter *pObjDDNet) m_NoHookHit = pObjDDNet->m_Flags & CHARACTERFLAG_NO_HOOK; m_Super = pObjDDNet->m_Flags & CHARACTERFLAG_SUPER; + m_Hook = !m_NoHookHit; + m_Collision = !m_NoCollision; + // Endless m_EndlessHook = pObjDDNet->m_Flags & CHARACTERFLAG_ENDLESS_HOOK; m_EndlessJump = pObjDDNet->m_Flags & CHARACTERFLAG_ENDLESS_JUMP; From 091db3df321b68f6f0f680df68834f7c5f547c9a Mon Sep 17 00:00:00 2001 From: heinrich5991 Date: Wed, 14 Oct 2020 17:21:23 +0200 Subject: [PATCH 069/144] Add scripts to detect variable name style violations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently very user-unfriendly, call like this: ``` env CXXFLAGS="-I/src -I -I …" python scripts/extract_identifiers.py src/game/**.cpp src/engine/client/**.cpp src/engine/server/**.cpp src/engine/shared/**.cpp > identifiers python scripts/check_identifiers.py < identifiers ``` --- scripts/check_identifiers.py | 73 ++++++++++++++ scripts/extract_identifiers.py | 170 +++++++++++++++++++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100644 scripts/check_identifiers.py create mode 100644 scripts/extract_identifiers.py diff --git a/scripts/check_identifiers.py b/scripts/check_identifiers.py new file mode 100644 index 000000000..fb3a5178b --- /dev/null +++ b/scripts/check_identifiers.py @@ -0,0 +1,73 @@ +import csv +import sys +import re + +def check_name(kind, qualifiers, type, name): + if kind == "variable": + return check_variable_name(qualifiers, type, name) + elif kind in "class struct".split(): + if name[0] not in "CI": + return "should start with 'C' (or 'I' for interfaces)" + if len(name) < 2: + return "must be at least two characters long" + if not name[1].isupper(): + return "must start with an uppercase letter" + elif kind == "enum_constant": + if not name.isupper(): + return "must only contain uppercase letters, digits and underscores" + return None + +ALLOW = set(""" + dx dy + fx fy + mx my + ix iy + px py + sx sy + wx wy + x0 x1 + y0 y1 +""".split()) +def check_variable_name(qualifiers, type, name): + if qualifiers == "" and type == "" and name == "argc": + return None + if qualifiers == "" and type == "pp" and name == "argv": + return None + if qualifiers == "cs": + # Allow all uppercase names for constant statics. + if name.isupper(): + return None + qualifiers = "s" + # Allow single lowercase letters as member and variable names. + if qualifiers in ["m", ""] and len(name) == 1 and name.islower(): + return None + prefix = "".join([qualifiers, "_" if qualifiers else "", type]) + if not name.startswith(prefix): + return "should start with {!r}".format(prefix) + if name in ALLOW: + return None + name = name[len(prefix):] + if not name[0].isupper(): + if prefix: + return "should start with an uppercase letter after the prefix {!r}".format(prefix) + else: + return "should start with an uppercase letter" + return None + +def main(): + import argparse + p = argparse.ArgumentParser(description="Check identifiers (input via stdin in CSV format from extract_identifiers.py) for naming style in DDNet code") + args = p.parse_args() + + identifiers = list(csv.DictReader(sys.stdin)) + + unclean = False + for i in identifiers: + error = check_name(i["kind"], i["qualifiers"], i["type"], i["name"]) + if error: + unclean = True + print("{}:{}:{}: {}: {}".format(i["file"], i["line"], i["column"], i["name"], error)) + return unclean + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/extract_identifiers.py b/scripts/extract_identifiers.py new file mode 100644 index 000000000..99f2ed77c --- /dev/null +++ b/scripts/extract_identifiers.py @@ -0,0 +1,170 @@ +import clang.cindex +import csv +import enum +import os +import sys + +from clang.cindex import CursorKind, LinkageKind, StorageClass, TypeKind +from collections import Counter + +try: + from tqdm import tqdm +except ImportError: + def tqdm(it, *args, **kwargs): + return it + +def traverse_namespaced(root, filter_files=None, skip_namespaces=1, namespace=()): + if root.location.file is not None and root.location.file.name not in filter_files: + return + yield namespace, root + if root.displayname != "": + if skip_namespaces > 0: + skip_namespaces -= 1 + else: + namespace += (root.spelling,) + for node in root.get_children(): + yield from traverse_namespaced(node, filter_files, skip_namespaces, namespace) + +INTERESTING_NODE_KINDS = { + CursorKind.CLASS_DECL: "class", + CursorKind.CLASS_TEMPLATE: "class", + CursorKind.ENUM_DECL: "enum", + CursorKind.ENUM_CONSTANT_DECL: "enum_constant", + CursorKind.FIELD_DECL: "variable", + CursorKind.PARM_DECL: "variable", + CursorKind.STRUCT_DECL: "struct", + CursorKind.UNION_DECL: "union", + CursorKind.VAR_DECL: "variable", + CursorKind.FUNCTION_DECL: "function", +} + +def is_array_type(type): + return type.kind in (TypeKind.CONSTANTARRAY, TypeKind.DEPENDENTSIZEDARRAY, TypeKind.INCOMPLETEARRAY) + +def get_complex_type(type): + if type.spelling in ("IOHANDLE", "LOCK"): + return "" + if type.kind == TypeKind.AUTO: + return get_complex_type(type.get_canonical()) + if type.kind == TypeKind.LVALUEREFERENCE: + return get_complex_type(type.get_pointee()) + if type.kind == TypeKind.POINTER: + return "p" + get_complex_type(type.get_pointee()) + if is_array_type(type): + return "a" + get_complex_type(type.element_type) + if type.kind == TypeKind.FUNCTIONPROTO: + return "fn" + if type.kind == TypeKind.TYPEDEF: + return get_complex_type(type.get_declaration().underlying_typedef_type) + if type.kind == TypeKind.ELABORATED: + return get_complex_type(type.get_named_type()) + if type.kind in (TypeKind.UNEXPOSED, TypeKind.RECORD): + if type.get_declaration().spelling in "shared_ptr unique_ptr".split(): + return "p" + get_complex_type(type.get_template_argument_type(0)) + if type.get_declaration().spelling in "array sorted_array".split(): + return "a" + get_complex_type(type.get_template_argument_type(0)) + return "" + +def is_static_member_definition_hack(node): + last_colons = False + for t in node.get_tokens(): + t = t.spelling + if t == "::": + last_colons = True + elif last_colons: + if t.startswith("ms_"): + return True + last_colons = False + if t == "=": + return False + return False + +def is_const(type): + if type.is_const_qualified(): + return True + if is_array_type(type): + return is_const(type.element_type) + return False + +class ParseError(RuntimeError): + pass + +def process_source_file(out, file, extra_args, break_on): + args = extra_args + ["-Isrc"] + if file.endswith(".c"): + header = "{}.h".format(file[:-2]) + elif file.endswith(".cpp"): + header = "{}.h".format(file[:-4]) + else: + raise ValueError("unrecognized source file: {}".format(file)) + + index = clang.cindex.Index.create() + unit = index.parse(file, args=args) + errors = list(unit.diagnostics) + if errors: + for error in errors: + print("{}: {}".format(file, error.format()), file=sys.stderr) + print(args, file=sys.stderr) + raise ParseError("failed parsing {}".format(file)) + + filter_files = frozenset([file, header]) + + for namespace, node in traverse_namespaced(unit.cursor, filter_files=filter_files): + cur_file = None + if node.location.file is not None: + cur_file = node.location.file.name + if cur_file is None or (cur_file != file and cur_file != header): + continue + if node.kind in INTERESTING_NODE_KINDS and node.spelling: + type = get_complex_type(node.type) + qualifiers = "" + if INTERESTING_NODE_KINDS[node.kind] in {"variable", "function"}: + is_member = node.semantic_parent.kind in {CursorKind.CLASS_DECL, CursorKind.CLASS_TEMPLATE, CursorKind.STRUCT_DECL, CursorKind.UNION_DECL} + is_static = node.storage_class == StorageClass.STATIC or is_static_member_definition_hack(node) + if is_static: + qualifiers = "s" + qualifiers + if is_member: + qualifiers = "m" + qualifiers + if is_static and not is_member and is_const(node.type): + qualifiers = "c" + qualifiers + if node.linkage == LinkageKind.EXTERNAL and not is_member: + qualifiers = "g" + qualifiers + out.writerow({ + "file": cur_file, + "line": node.location.line, + "column": node.location.column, + "kind": INTERESTING_NODE_KINDS[node.kind], + "path": "::".join(namespace), + "qualifiers": qualifiers, + "type": type, + "name": node.spelling, + }) + if node.spelling == break_on: + breakpoint() + +def main(): + import argparse + p = argparse.ArgumentParser(description="Extracts identifier data from a Teeworlds source file and its header, outputting the data as CSV to stdout") + p.add_argument("file", metavar="FILE", nargs="+", help="Source file to analyze") + p.add_argument("--break-on", help="Break on a specific variable name, useful to debug issues with the script") + args = p.parse_args() + + extra_args = [] + if "CXXFLAGS" in os.environ: + extra_args = os.environ["CXXFLAGS"].split() + + out = csv.DictWriter(sys.stdout, "file line column kind path qualifiers type name".split()) + out.writeheader() + files = args.file + if len(files) > 1: + files = tqdm(files, leave=False) + error = False + for file in files: + try: + process_source_file(out, file, extra_args, args.break_on) + except ParseError: + error = True + return int(error) + +if __name__ == "__main__": + sys.exit(main()) From 7663641ed2aaf00fc1243dccef9a6488f24cd0af Mon Sep 17 00:00:00 2001 From: heinrich5991 Date: Tue, 27 Oct 2020 18:57:14 +0100 Subject: [PATCH 070/144] Fix some variable name's style --- src/engine/server/register.cpp | 2 +- src/engine/server/server.cpp | 98 ++++++++++++------------ src/engine/server/server.h | 12 +-- src/engine/server/sql_string_helpers.cpp | 18 ++--- src/engine/server/sql_string_helpers.h | 4 +- src/engine/shared/console.cpp | 70 ++++++++--------- src/engine/shared/console.h | 2 +- src/engine/shared/csv.h | 2 +- src/engine/shared/datafile.h | 2 +- src/engine/shared/demo.cpp | 68 ++++++++-------- src/engine/shared/demo.h | 2 +- src/engine/shared/dilate.cpp | 34 ++++---- src/engine/shared/fifo.cpp | 10 +-- src/engine/shared/kernel.cpp | 4 +- src/engine/shared/linereader.cpp | 6 +- src/engine/shared/linereader.h | 4 +- src/engine/shared/netban.cpp | 20 ++--- src/engine/shared/netban.h | 6 +- src/engine/shared/network.cpp | 26 +++---- src/engine/shared/network.h | 38 +++++---- src/engine/shared/network_conn.cpp | 40 +++++----- src/engine/shared/network_console.cpp | 6 +- src/engine/shared/network_server.cpp | 58 +++++++------- src/engine/shared/ringbuffer.h | 6 +- src/engine/shared/snapshot.cpp | 30 ++++---- src/engine/shared/snapshot.h | 8 +- src/engine/shared/storage.cpp | 70 ++++++++--------- src/engine/shared/uuid_manager.cpp | 6 +- src/engine/shared/websockets.cpp | 4 +- src/game/client/components/chat.h | 2 +- src/game/client/components/console.h | 4 +- 31 files changed, 329 insertions(+), 333 deletions(-) diff --git a/src/engine/server/register.cpp b/src/engine/server/register.cpp index 5a633d270..90fdde17b 100644 --- a/src/engine/server/register.cpp +++ b/src/engine/server/register.cpp @@ -66,7 +66,7 @@ void CRegister::RegisterSendFwcheckresponse(NETADDR *pAddr, SECURITY_TOKEN Respo void CRegister::RegisterSendHeartbeat(NETADDR Addr, SECURITY_TOKEN ResponseToken) { - static unsigned char aData[sizeof(SERVERBROWSE_HEARTBEAT) + 2]; + unsigned char aData[sizeof(SERVERBROWSE_HEARTBEAT) + 2]; unsigned short Port = m_pNetServer->Address().port; CNetChunk Packet; diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 27bfd4464..e75a8ffce 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -763,9 +763,9 @@ int CServer::SendMsg(CMsgPacker *pMsg, int Flags, int ClientID) { if(m_aClients[i].m_State == CClient::STATE_INGAME) { - CPacker *Pack = m_aClients[i].m_Sixup ? &Pack7 : &Pack6; - Packet.m_pData = Pack->Data(); - Packet.m_DataSize = Pack->Size(); + CPacker *pPack = m_aClients[i].m_Sixup ? &Pack7 : &Pack6; + Packet.m_pData = pPack->Data(); + Packet.m_DataSize = pPack->Size(); Packet.m_ClientID = i; m_NetServer.Send(&Packet); } @@ -859,8 +859,8 @@ void CServer::DoSnapshot() char aCompData[CSnapshot::MAX_SIZE]; int SnapshotSize; int Crc; - static CSnapshot EmptySnap; - CSnapshot *pDeltashot = &EmptySnap; + static CSnapshot s_EmptySnap; + CSnapshot *pDeltashot = &s_EmptySnap; int DeltashotSize; int DeltaTick = -1; int DeltaSize; @@ -892,7 +892,7 @@ void CServer::DoSnapshot() m_aClients[i].m_Snapshots.Add(m_CurrentGameTick, time_get(), SnapshotSize, pData, 0); // find snapshot that we can perform delta against - EmptySnap.Clear(); + s_EmptySnap.Clear(); { DeltashotSize = m_aClients[i].m_Snapshots.Get(m_aClients[i].m_LastAckedSnapshot, 0, &pDeltashot, 0); @@ -1219,12 +1219,12 @@ void CServer::SendRconLine(int ClientID, const char *pLine) void CServer::SendRconLineAuthed(const char *pLine, void *pUser, bool Highlighted) { CServer *pThis = (CServer *)pUser; - static volatile int ReentryGuard = 0; + static volatile int s_ReentryGuard = 0; int i; - if(ReentryGuard) + if(s_ReentryGuard) return; - ReentryGuard++; + s_ReentryGuard++; const char *pStart = str_find(pLine, "<{"); const char *pEnd = pStart == NULL ? NULL : str_find(pStart + 2, "}>"); @@ -1258,7 +1258,7 @@ void CServer::SendRconLineAuthed(const char *pLine, void *pUser, bool Highlighte pThis->SendRconLine(i, pThis->m_aClients[i].m_ShowIps ? pLine : pLineWithoutIps); } - ReentryGuard--; + s_ReentryGuard--; } void CServer::SendRconCmdAdd(const IConsole::CCommandInfo *pCommandInfo, int ClientID) @@ -1758,7 +1758,7 @@ static inline int GetCacheIndex(int Type, bool SendClient) CServer::CCache::CCache() { - m_lCache.clear(); + m_Cache.clear(); } CServer::CCache::~CCache() @@ -1774,12 +1774,12 @@ CServer::CCache::CCacheChunk::CCacheChunk(const void *pData, int Size) void CServer::CCache::AddChunk(const void *pData, int Size) { - m_lCache.emplace_back(pData, Size); + m_Cache.emplace_back(pData, Size); } void CServer::CCache::Clear() { - m_lCache.clear(); + m_Cache.clear(); } void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) @@ -1871,32 +1871,32 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) const void *pPrefix = p.Data(); int PrefixSize = p.Size(); - CPacker pp; + CPacker q; int ChunksStored = 0; int PlayersStored = 0; #define SAVE(size) \ do \ { \ - pCache->AddChunk(pp.Data(), size); \ + pCache->AddChunk(q.Data(), size); \ ChunksStored++; \ } while(0) #define RESET() \ do \ { \ - pp.Reset(); \ - pp.AddRaw(pPrefix, PrefixSize); \ + q.Reset(); \ + q.AddRaw(pPrefix, PrefixSize); \ } while(0) RESET(); if(Type == SERVERINFO_64_LEGACY) - pp.AddInt(PlayersStored); // offset + q.AddInt(PlayersStored); // offset if(!SendClients) { - SAVE(pp.Size()); + SAVE(q.Size()); return; } @@ -1931,9 +1931,9 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) break; // Otherwise we're SERVERINFO_64_LEGACY. - SAVE(pp.Size()); + SAVE(q.Size()); RESET(); - pp.AddInt(PlayersStored); // offset + q.AddInt(PlayersStored); // offset Remaining = 24; } if(Remaining > 0) @@ -1941,27 +1941,27 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) Remaining--; } - int PreviousSize = pp.Size(); + int PreviousSize = q.Size(); - pp.AddString(ClientName(i), MAX_NAME_LENGTH); // client name - pp.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan + q.AddString(ClientName(i), MAX_NAME_LENGTH); // client name + q.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan - ADD_INT(pp, m_aClients[i].m_Country); // client country - ADD_INT(pp, m_aClients[i].m_Score); // client score - ADD_INT(pp, GameServer()->IsClientPlayer(i) ? 1 : 0); // is player? + ADD_INT(q, m_aClients[i].m_Country); // client country + ADD_INT(q, m_aClients[i].m_Score); // client score + ADD_INT(q, GameServer()->IsClientPlayer(i) ? 1 : 0); // is player? if(Type == SERVERINFO_EXTENDED) - pp.AddString("", 0); // extra info, reserved + q.AddString("", 0); // extra info, reserved if(Type == SERVERINFO_EXTENDED) { - if(pp.Size() >= NET_MAX_PAYLOAD - 18) // 8 bytes for type, 10 bytes for the largest token + if(q.Size() >= NET_MAX_PAYLOAD - 18) // 8 bytes for type, 10 bytes for the largest token { // Retry current player. i--; SAVE(PreviousSize); RESET(); - ADD_INT(pp, ChunksStored); - pp.AddString("", 0); // extra info, reserved + ADD_INT(q, ChunksStored); + q.AddString("", 0); // extra info, reserved continue; } } @@ -1969,7 +1969,7 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) } } - SAVE(pp.Size()); + SAVE(q.Size()); #undef SAVE #undef RESET #undef ADD_RAW @@ -2044,7 +2044,7 @@ void CServer::SendServerInfo(const NETADDR *pAddr, int Token, int Type, bool Sen char aBuf[128]; p.Reset(); - CCache *pCache = &m_ServerInfoCache[GetCacheIndex(Type, SendClients)]; + CCache *pCache = &m_aServerInfoCache[GetCacheIndex(Type, SendClients)]; #define ADD_RAW(p, x) (p).AddRaw(x, sizeof(x)) #define ADD_INT(p, x) \ @@ -2059,12 +2059,12 @@ void CServer::SendServerInfo(const NETADDR *pAddr, int Token, int Type, bool Sen Packet.m_Address = *pAddr; Packet.m_Flags = NETSENDFLAG_CONNLESS; - for(const auto &Chunk : pCache->m_lCache) + for(const auto &Chunk : pCache->m_Cache) { p.Reset(); if(Type == SERVERINFO_EXTENDED) { - if(&Chunk == &pCache->m_lCache.front()) + if(&Chunk == &pCache->m_Cache.front()) p.AddRaw(SERVERBROWSE_INFO_EXTENDED, sizeof(SERVERBROWSE_INFO_EXTENDED)); else p.AddRaw(SERVERBROWSE_INFO_EXTENDED_MORE, sizeof(SERVERBROWSE_INFO_EXTENDED_MORE)); @@ -2103,7 +2103,7 @@ void CServer::GetServerInfoSixup(CPacker *pPacker, int Token, bool SendClients) SendClients = SendClients && Token != -1; - CCache::CCacheChunk &FirstChunk = m_SixupServerInfoCache[SendClients].m_lCache.front(); + CCache::CCacheChunk &FirstChunk = m_aSixupServerInfoCache[SendClients].m_Cache.front(); pPacker->AddRaw(FirstChunk.m_aData, FirstChunk.m_DataSize); } @@ -2119,10 +2119,10 @@ void CServer::UpdateServerInfo(bool Resend) for(int i = 0; i < 3; i++) for(int j = 0; j < 2; j++) - CacheServerInfo(&m_ServerInfoCache[i * 2 + j], i, j); + CacheServerInfo(&m_aServerInfoCache[i * 2 + j], i, j); for(int i = 0; i < 2; i++) - CacheServerInfoSixup(&m_SixupServerInfoCache[i], i); + CacheServerInfoSixup(&m_aSixupServerInfoCache[i], i); if(Resend) { @@ -3572,28 +3572,28 @@ const char *CServer::GetAnnouncementLine(char const *pFileName) if(!File) return 0; - std::vector v; + std::vector Lines; char *pLine; - CLineReader lr; - lr.Init(File); - while((pLine = lr.Get())) + CLineReader Reader; + Reader.Init(File); + while((pLine = Reader.Get())) if(str_length(pLine)) if(pLine[0] != '#') - v.push_back(pLine); - if(v.size() == 1) + Lines.push_back(pLine); + if(Lines.size() == 1) { m_AnnouncementLastLine = 0; } else if(!g_Config.m_SvAnnouncementRandom) { - if(++m_AnnouncementLastLine >= v.size()) - m_AnnouncementLastLine %= v.size(); + if(++m_AnnouncementLastLine >= Lines.size()) + m_AnnouncementLastLine %= Lines.size(); } else { unsigned Rand; do - Rand = rand() % v.size(); + Rand = rand() % Lines.size(); while(Rand == m_AnnouncementLastLine); m_AnnouncementLastLine = Rand; @@ -3601,12 +3601,12 @@ const char *CServer::GetAnnouncementLine(char const *pFileName) io_close(File); - return v[m_AnnouncementLastLine]; + return Lines[m_AnnouncementLastLine]; } int *CServer::GetIdMap(int ClientID) { - return IdMap + VANILLA_MAX_CLIENTS * ClientID; + return m_aIdMap + VANILLA_MAX_CLIENTS * ClientID; } bool CServer::SetTimedOut(int ClientID, int OrigID) diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 56913e109..0e23bf6c9 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -195,7 +195,7 @@ public: }; CClient m_aClients[MAX_CLIENTS]; - int IdMap[MAX_CLIENTS * VANILLA_MAX_CLIENTS]; + int m_aIdMap[MAX_CLIENTS * VANILLA_MAX_CLIENTS]; CSnapshotDelta m_SnapshotDelta; CSnapshotBuilder m_SnapshotBuilder; @@ -334,7 +334,7 @@ public: unsigned char m_aData[NET_MAX_PAYLOAD]; }; - std::list m_lCache; + std::list m_Cache; CCache(); ~CCache(); @@ -342,8 +342,8 @@ public: void AddChunk(const void *pData, int Size); void Clear(); }; - CCache m_ServerInfoCache[3 * 2]; - CCache m_SixupServerInfoCache[2]; + CCache m_aServerInfoCache[3 * 2]; + CCache m_aSixupServerInfoCache[2]; bool m_ServerInfoNeedsUpdate; void ExpireServerInfo(); @@ -422,7 +422,7 @@ public: void GetClientAddr(int ClientID, NETADDR *pAddr); int m_aPrevStates[MAX_CLIENTS]; - const char *GetAnnouncementLine(char const *FileName); + const char *GetAnnouncementLine(char const *pFileName); unsigned m_AnnouncementLastLine; void RestrictRconOutput(int ClientID) { m_RconRestrict = ClientID; } @@ -464,7 +464,7 @@ public: CLOSE_SESSION = 2, }; - void SendConnLoggingCommand(CONN_LOGGING_CMD cmd, const NETADDR *pAddr); + void SendConnLoggingCommand(CONN_LOGGING_CMD Cmd, const NETADDR *pAddr); #endif }; diff --git a/src/engine/server/sql_string_helpers.cpp b/src/engine/server/sql_string_helpers.cpp index 46c44bd88..55adf8b4e 100644 --- a/src/engine/server/sql_string_helpers.cpp +++ b/src/engine/server/sql_string_helpers.cpp @@ -4,24 +4,24 @@ #include #include -void sqlstr::FuzzyString(char *pString, int size) +void sqlstr::FuzzyString(char *pString, int Size) { - char *newString = new char[size * 4 - 1]; - int pos = 0; + char *pNewString = new char[Size * 4 - 1]; + int OutPos = 0; - for(int i = 0; i < size; i++) + for(int i = 0; i < Size; i++) { if(!pString[i]) break; - newString[pos++] = pString[i]; + pNewString[OutPos++] = pString[i]; if(pString[i] != '\\' && str_utf8_isstart(pString[i + 1])) - newString[pos++] = '%'; + pNewString[OutPos++] = '%'; } - newString[pos] = '\0'; - str_copy(pString, newString, size); - delete[] newString; + pNewString[OutPos] = '\0'; + str_copy(pString, pNewString, Size); + delete[] pNewString; } int sqlstr::EscapeLike(char *pDst, const char *pSrc, int DstSize) diff --git a/src/engine/server/sql_string_helpers.h b/src/engine/server/sql_string_helpers.h index 1ec640593..c55a2f2e2 100644 --- a/src/engine/server/sql_string_helpers.h +++ b/src/engine/server/sql_string_helpers.h @@ -3,12 +3,12 @@ namespace sqlstr { -void FuzzyString(char *pString, int size); +void FuzzyString(char *pString, int Size); // written number of added bytes int EscapeLike(char *pDst, const char *pSrc, int DstSize); -void AgoTimeToString(int agoTime, char *pAgoString, int Size); +void AgoTimeToString(int AgoTime, char *pAgoString, int Size); } // namespace sqlstr diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index 679a5fee6..57abb3072 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -39,62 +39,62 @@ float CConsole::CResult::GetFloat(unsigned Index) ColorHSLA CConsole::CResult::GetColor(unsigned Index, bool Light) { - ColorHSLA hsl = ColorHSLA(0, 0, 0); + ColorHSLA Hsla = ColorHSLA(0, 0, 0); if(Index >= m_NumArgs) - return hsl; + return Hsla; const char *pStr = m_apArgs[Index]; if(str_isallnum(pStr) || ((pStr[0] == '-' || pStr[0] == '+') && str_isallnum(pStr + 1))) // Teeworlds Color (Packed HSL) { - hsl = ColorHSLA(str_toulong_base(pStr, 10), true); + Hsla = ColorHSLA(str_toulong_base(pStr, 10), true); if(Light) - hsl = hsl.UnclampLighting(); + Hsla = Hsla.UnclampLighting(); } else if(*pStr == '$') // Hex RGB { - ColorRGBA rgb = ColorRGBA(0, 0, 0, 1); + ColorRGBA Rgba = ColorRGBA(0, 0, 0, 1); int Len = str_length(pStr); if(Len == 4) { unsigned Num = str_toulong_base(pStr + 1, 16); - rgb.r = (((Num >> 8) & 0x0F) + ((Num >> 4) & 0xF0)) / 255.0f; - rgb.g = (((Num >> 4) & 0x0F) + ((Num >> 0) & 0xF0)) / 255.0f; - rgb.b = (((Num >> 0) & 0x0F) + ((Num << 4) & 0xF0)) / 255.0f; + Rgba.r = (((Num >> 8) & 0x0F) + ((Num >> 4) & 0xF0)) / 255.0f; + Rgba.g = (((Num >> 4) & 0x0F) + ((Num >> 0) & 0xF0)) / 255.0f; + Rgba.b = (((Num >> 0) & 0x0F) + ((Num << 4) & 0xF0)) / 255.0f; } else if(Len == 7) { unsigned Num = str_toulong_base(pStr + 1, 16); - rgb.r = ((Num >> 16) & 0xFF) / 255.0f; - rgb.g = ((Num >> 8) & 0xFF) / 255.0f; - rgb.b = ((Num >> 0) & 0xFF) / 255.0f; + Rgba.r = ((Num >> 16) & 0xFF) / 255.0f; + Rgba.g = ((Num >> 8) & 0xFF) / 255.0f; + Rgba.b = ((Num >> 0) & 0xFF) / 255.0f; } else { - return hsl; + return Hsla; } - hsl = color_cast(rgb); + Hsla = color_cast(Rgba); } else if(!str_comp_nocase(pStr, "red")) - hsl = ColorHSLA(0.0f / 6.0f, 1, .5f); + Hsla = ColorHSLA(0.0f / 6.0f, 1, .5f); else if(!str_comp_nocase(pStr, "yellow")) - hsl = ColorHSLA(1.0f / 6.0f, 1, .5f); + Hsla = ColorHSLA(1.0f / 6.0f, 1, .5f); else if(!str_comp_nocase(pStr, "green")) - hsl = ColorHSLA(2.0f / 6.0f, 1, .5f); + Hsla = ColorHSLA(2.0f / 6.0f, 1, .5f); else if(!str_comp_nocase(pStr, "cyan")) - hsl = ColorHSLA(3.0f / 6.0f, 1, .5f); + Hsla = ColorHSLA(3.0f / 6.0f, 1, .5f); else if(!str_comp_nocase(pStr, "blue")) - hsl = ColorHSLA(4.0f / 6.0f, 1, .5f); + Hsla = ColorHSLA(4.0f / 6.0f, 1, .5f); else if(!str_comp_nocase(pStr, "magenta")) - hsl = ColorHSLA(5.0f / 6.0f, 1, .5f); + Hsla = ColorHSLA(5.0f / 6.0f, 1, .5f); else if(!str_comp_nocase(pStr, "white")) - hsl = ColorHSLA(0, 0, 1); + Hsla = ColorHSLA(0, 0, 1); else if(!str_comp_nocase(pStr, "gray")) - hsl = ColorHSLA(0, 0, .5f); + Hsla = ColorHSLA(0, 0, .5f); else if(!str_comp_nocase(pStr, "black")) - hsl = ColorHSLA(0, 0, 0); + Hsla = ColorHSLA(0, 0, 0); - return hsl; + return Hsla; } const IConsole::CCommandInfo *CConsole::CCommand::NextCommandInfo(int AccessLevel, int FlagMask) const @@ -456,7 +456,7 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr, int ClientID, bo if(Result.m_pCommand[0] == '+') { // insert the stroke direction token - Result.AddArgument(m_paStrokeStr[Stroke]); + Result.AddArgument(m_apStrokeStr[Stroke]); IsStrokeCommand = 1; } @@ -590,13 +590,13 @@ void CConsole::ExecuteFile(const char *pFilename, int ClientID, bool LogFailure, if(File) { char *pLine; - CLineReader lr; + CLineReader Reader; str_format(aBuf, sizeof(aBuf), "executing '%s'", pFilename); Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); - lr.Init(File); + Reader.Init(File); - while((pLine = lr.Get())) + while((pLine = Reader.Get())) ExecuteLine(pLine, ClientID); io_close(File); @@ -772,19 +772,19 @@ static void ColVariableCommand(IConsole::IResult *pResult, void *pUserData) str_format(aBuf, sizeof(aBuf), "Value: %u", *(pData->m_pVariable)); pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); - ColorHSLA hsl(*(pData->m_pVariable), true); + ColorHSLA Hsla(*(pData->m_pVariable), true); if(pData->m_Light) - hsl = hsl.UnclampLighting(); - str_format(aBuf, sizeof(aBuf), "H: %d°, S: %d%%, L: %d%%", round_truncate(hsl.h * 360), round_truncate(hsl.s * 100), round_truncate(hsl.l * 100)); + Hsla = Hsla.UnclampLighting(); + str_format(aBuf, sizeof(aBuf), "H: %d°, S: %d%%, L: %d%%", round_truncate(Hsla.h * 360), round_truncate(Hsla.s * 100), round_truncate(Hsla.l * 100)); pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); - ColorRGBA rgb = color_cast(hsl); - str_format(aBuf, sizeof(aBuf), "R: %d, G: %d, B: %d, #%06X", round_truncate(rgb.r * 255), round_truncate(rgb.g * 255), round_truncate(rgb.b * 255), rgb.Pack(false)); + ColorRGBA Rgba = color_cast(Hsla); + str_format(aBuf, sizeof(aBuf), "R: %d, G: %d, B: %d, #%06X", round_truncate(Rgba.r * 255), round_truncate(Rgba.g * 255), round_truncate(Rgba.b * 255), Rgba.Pack(false)); pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); if(pData->m_Alpha) { - str_format(aBuf, sizeof(aBuf), "A: %d%%", round_truncate(hsl.a * 100)); + str_format(aBuf, sizeof(aBuf), "A: %d%%", round_truncate(Hsla.a * 100)); pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); } } @@ -928,8 +928,8 @@ CConsole::CConsole(int FlagMask) m_pRecycleList = 0; m_TempCommands.Reset(); m_StoreCommands = true; - m_paStrokeStr[0] = "0"; - m_paStrokeStr[1] = "1"; + m_apStrokeStr[0] = "0"; + m_apStrokeStr[1] = "1"; m_ExecutionQueue.Reset(); m_pFirstCommand = 0; m_pFirstExec = 0; diff --git a/src/engine/shared/console.h b/src/engine/shared/console.h index 94fd0f292..2e714a117 100644 --- a/src/engine/shared/console.h +++ b/src/engine/shared/console.h @@ -35,7 +35,7 @@ class CConsole : public IConsole int m_FlagMask; bool m_StoreCommands; - const char *m_paStrokeStr[2]; + const char *m_apStrokeStr[2]; CCommand *m_pFirstCommand; class CExecFile diff --git a/src/engine/shared/csv.h b/src/engine/shared/csv.h index aa5273382..9d3de0e04 100644 --- a/src/engine/shared/csv.h +++ b/src/engine/shared/csv.h @@ -3,6 +3,6 @@ #include -void CsvWrite(IOHANDLE File, int NumColumns, const char *const *pColumns); +void CsvWrite(IOHANDLE File, int NumColumns, const char *const *ppColumns); #endif // ENGINE_SHARED_CSV_H diff --git a/src/engine/shared/datafile.h b/src/engine/shared/datafile.h index 54a389366..0f3950946 100644 --- a/src/engine/shared/datafile.h +++ b/src/engine/shared/datafile.h @@ -99,7 +99,7 @@ public: ~CDataFileWriter(); void Init(); bool OpenFile(class IStorage *pStorage, const char *pFilename, int StorageType = IStorage::TYPE_SAVE); - bool Open(class IStorage *pStorage, const char *Filename, int StorageType = IStorage::TYPE_SAVE); + bool Open(class IStorage *pStorage, const char *pFilename, int StorageType = IStorage::TYPE_SAVE); int AddData(int Size, void *pData); int AddDataSwapped(int Size, void *pData); int AddItem(int Type, int ID, int Size, void *pData); diff --git a/src/engine/shared/demo.cpp b/src/engine/shared/demo.cpp index b87f52e9f..d5ac29cdf 100644 --- a/src/engine/shared/demo.cpp +++ b/src/engine/shared/demo.cpp @@ -20,13 +20,13 @@ #include "network.h" #include "snapshot.h" -static const unsigned char gs_aHeaderMarker[7] = {'T', 'W', 'D', 'E', 'M', 'O', 0}; -static const unsigned char gs_ActVersion = 6; -static const unsigned char gs_OldVersion = 3; -static const unsigned char gs_Sha256Version = 6; -static const unsigned char gs_VersionTickCompression = 5; // demo files with this version or higher will use `CHUNKTICKFLAG_TICK_COMPRESSED` -static const int gs_LengthOffset = 152; -static const int gs_NumMarkersOffset = 176; +static const unsigned char s_aHeaderMarker[7] = {'T', 'W', 'D', 'E', 'M', 'O', 0}; +static const unsigned char s_CurVersion = 6; +static const unsigned char s_OldVersion = 3; +static const unsigned char s_Sha256Version = 6; +static const unsigned char s_VersionTickCompression = 5; // demo files with this version or higher will use `CHUNKTICKFLAG_TICK_COMPRESSED` +static const int s_LengthOffset = 152; +static const int s_NumMarkersOffset = 176; CDemoRecorder::CDemoRecorder(class CSnapshotDelta *pSnapshotDelta, bool NoMapData) { @@ -124,8 +124,8 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con // write header mem_zero(&Header, sizeof(Header)); - mem_copy(Header.m_aMarker, gs_aHeaderMarker, sizeof(Header.m_aMarker)); - Header.m_Version = gs_ActVersion; + mem_copy(Header.m_aMarker, s_aHeaderMarker, sizeof(Header.m_aMarker)); + Header.m_Version = s_CurVersion; str_copy(Header.m_aNetversion, pNetVersion, sizeof(Header.m_aNetversion)); str_copy(Header.m_aMapName, pMap, sizeof(Header.m_aMapName)); Header.m_aMapSize[0] = (MapSize >> 24) & 0xff; @@ -346,7 +346,7 @@ int CDemoRecorder::Stop() return -1; // add the demo length to the header - io_seek(m_File, gs_LengthOffset, IOSEEK_START); + io_seek(m_File, s_LengthOffset, IOSEEK_START); int DemoLength = Length(); char aLength[4]; aLength[0] = (DemoLength >> 24) & 0xff; @@ -356,7 +356,7 @@ int CDemoRecorder::Stop() io_write(m_File, aLength, sizeof(aLength)); // add the timeline markers to the header - io_seek(m_File, gs_NumMarkersOffset, IOSEEK_START); + io_seek(m_File, s_NumMarkersOffset, IOSEEK_START); char aNumMarkers[4]; aNumMarkers[0] = (m_NumTimelineMarkers >> 24) & 0xff; aNumMarkers[1] = (m_NumTimelineMarkers >> 16) & 0xff; @@ -438,7 +438,7 @@ int CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick) int Tickdelta_legacy = Chunk & (CHUNKMASK_TICK_LEGACY); // compatibility *pType = Chunk & (CHUNKTYPEFLAG_TICKMARKER | CHUNKTICKFLAG_KEYFRAME); - if(m_Info.m_Header.m_Version < gs_VersionTickCompression && Tickdelta_legacy != 0) + if(m_Info.m_Header.m_Version < s_VersionTickCompression && Tickdelta_legacy != 0) { *pTick += Tickdelta_legacy; } @@ -542,9 +542,9 @@ void CDemoPlayer::ScanFile() void CDemoPlayer::DoTick() { - static char aCompresseddata[CSnapshot::MAX_SIZE]; - static char aDecompressed[CSnapshot::MAX_SIZE]; - static char aData[CSnapshot::MAX_SIZE]; + static char s_aCompresseddata[CSnapshot::MAX_SIZE]; + static char s_aDecompressed[CSnapshot::MAX_SIZE]; + static char s_aData[CSnapshot::MAX_SIZE]; int ChunkType, ChunkTick, ChunkSize; int DataSize = 0; int GotSnapshot = 0; @@ -579,7 +579,7 @@ void CDemoPlayer::DoTick() // read the chunk if(ChunkSize) { - if(io_read(m_File, aCompresseddata, ChunkSize) != (unsigned)ChunkSize) + if(io_read(m_File, s_aCompresseddata, ChunkSize) != (unsigned)ChunkSize) { // stop on error or eof if(m_pConsole) @@ -588,7 +588,7 @@ void CDemoPlayer::DoTick() break; } - DataSize = CNetBase::Decompress(aCompresseddata, ChunkSize, aDecompressed, sizeof(aDecompressed)); + DataSize = CNetBase::Decompress(s_aCompresseddata, ChunkSize, s_aDecompressed, sizeof(s_aDecompressed)); if(DataSize < 0) { // stop on error or eof @@ -598,7 +598,7 @@ void CDemoPlayer::DoTick() break; } - DataSize = CVariableInt::Decompress(aDecompressed, DataSize, aData, sizeof(aData)); + DataSize = CVariableInt::Decompress(s_aDecompressed, DataSize, s_aData, sizeof(s_aData)); if(DataSize < 0) { @@ -612,19 +612,19 @@ void CDemoPlayer::DoTick() if(ChunkType == CHUNKTYPE_DELTA) { // process delta snapshot - static char aNewsnap[CSnapshot::MAX_SIZE]; + static char s_aNewsnap[CSnapshot::MAX_SIZE]; GotSnapshot = 1; - DataSize = m_pSnapshotDelta->UnpackDelta((CSnapshot *)m_aLastSnapshotData, (CSnapshot *)aNewsnap, aData, DataSize); + DataSize = m_pSnapshotDelta->UnpackDelta((CSnapshot *)m_aLastSnapshotData, (CSnapshot *)s_aNewsnap, s_aData, DataSize); if(DataSize >= 0) { if(m_pListener) - m_pListener->OnDemoPlayerSnapshot(aNewsnap, DataSize); + m_pListener->OnDemoPlayerSnapshot(s_aNewsnap, DataSize); m_LastSnapshotDataSize = DataSize; - mem_copy(m_aLastSnapshotData, aNewsnap, DataSize); + mem_copy(m_aLastSnapshotData, s_aNewsnap, DataSize); } else { @@ -642,9 +642,9 @@ void CDemoPlayer::DoTick() GotSnapshot = 1; m_LastSnapshotDataSize = DataSize; - mem_copy(m_aLastSnapshotData, aData, DataSize); + mem_copy(m_aLastSnapshotData, s_aData, DataSize); if(m_pListener) - m_pListener->OnDemoPlayerSnapshot(aData, DataSize); + m_pListener->OnDemoPlayerSnapshot(s_aData, DataSize); } else { @@ -664,7 +664,7 @@ void CDemoPlayer::DoTick() else if(ChunkType == CHUNKTYPE_MESSAGE) { if(m_pListener) - m_pListener->OnDemoPlayerMessage(aData, DataSize); + m_pListener->OnDemoPlayerMessage(s_aData, DataSize); } } } @@ -725,7 +725,7 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const // read the header io_read(m_File, &m_Info.m_Header, sizeof(m_Info.m_Header)); - if(mem_comp(m_Info.m_Header.m_aMarker, gs_aHeaderMarker, sizeof(gs_aHeaderMarker)) != 0) + if(mem_comp(m_Info.m_Header.m_aMarker, s_aHeaderMarker, sizeof(s_aHeaderMarker)) != 0) { if(m_pConsole) { @@ -738,7 +738,7 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const return -1; } - if(m_Info.m_Header.m_Version < gs_OldVersion) + if(m_Info.m_Header.m_Version < s_OldVersion) { if(m_pConsole) { @@ -750,11 +750,11 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const m_File = 0; return -1; } - else if(m_Info.m_Header.m_Version > gs_OldVersion) + else if(m_Info.m_Header.m_Version > s_OldVersion) io_read(m_File, &m_Info.m_TimelineMarkers, sizeof(m_Info.m_TimelineMarkers)); SHA256_DIGEST Sha256 = SHA256_ZEROED; - if(m_Info.m_Header.m_Version >= gs_Sha256Version) + if(m_Info.m_Header.m_Version >= s_Sha256Version) { CUuid ExtensionUuid = {}; io_read(m_File, &ExtensionUuid.m_aData, sizeof(ExtensionUuid.m_aData)); @@ -796,7 +796,7 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const m_MapInfo.m_Size = MapSize; str_copy(m_MapInfo.m_aName, m_Info.m_Header.m_aMapName, sizeof(m_MapInfo.m_aName)); - if(m_Info.m_Header.m_Version > gs_OldVersion) + if(m_Info.m_Header.m_Version > s_OldVersion) { // get timeline markers int Num = ((m_Info.m_TimelineMarkers.m_aNumTimelineMarkers[0] << 24) & 0xFF000000) | ((m_Info.m_TimelineMarkers.m_aNumTimelineMarkers[1] << 16) & 0xFF0000) | @@ -836,7 +836,7 @@ bool CDemoPlayer::ExtractMap(class IStorage *pStorage) // handle sha256 SHA256_DIGEST Sha256 = SHA256_ZEROED; - if(m_Info.m_Header.m_Version >= gs_Sha256Version) + if(m_Info.m_Header.m_Version >= s_Sha256Version) Sha256 = m_MapInfo.m_Sha256; else { @@ -1086,7 +1086,7 @@ bool CDemoPlayer::GetDemoInfo(class IStorage *pStorage, const char *pFilename, i pMapInfo->m_Crc = (pDemoHeader->m_aMapCrc[0] << 24) | (pDemoHeader->m_aMapCrc[1] << 16) | (pDemoHeader->m_aMapCrc[2] << 8) | (pDemoHeader->m_aMapCrc[3]); SHA256_DIGEST Sha256 = SHA256_ZEROED; - if(pDemoHeader->m_Version >= gs_Sha256Version) + if(pDemoHeader->m_Version >= s_Sha256Version) { CUuid ExtensionUuid = {}; io_read(File, &ExtensionUuid.m_aData, sizeof(ExtensionUuid.m_aData)); @@ -1107,7 +1107,7 @@ bool CDemoPlayer::GetDemoInfo(class IStorage *pStorage, const char *pFilename, i pMapInfo->m_Size = (pDemoHeader->m_aMapSize[0] << 24) | (pDemoHeader->m_aMapSize[1] << 16) | (pDemoHeader->m_aMapSize[2] << 8) | (pDemoHeader->m_aMapSize[3]); io_close(File); - return !(mem_comp(pDemoHeader->m_aMarker, gs_aHeaderMarker, sizeof(gs_aHeaderMarker)) || pDemoHeader->m_Version < gs_OldVersion); + return !(mem_comp(pDemoHeader->m_aMarker, s_aHeaderMarker, sizeof(s_aHeaderMarker)) || pDemoHeader->m_Version < s_OldVersion); } int CDemoPlayer::GetDemoType() const @@ -1146,7 +1146,7 @@ void CDemoEditor::Slice(const char *pDemo, const char *pDst, int StartTick, int const CDemoPlayer::CPlaybackInfo *pInfo = m_pDemoPlayer->Info(); SHA256_DIGEST Sha256 = pMapInfo->m_Sha256; - if(pInfo->m_Header.m_Version < gs_Sha256Version) + if(pInfo->m_Header.m_Version < s_Sha256Version) { if(m_pDemoPlayer->ExtractMap(m_pStorage)) Sha256 = pMapInfo->m_Sha256; diff --git a/src/engine/shared/demo.h b/src/engine/shared/demo.h index 149c0ada3..7ce509b0b 100644 --- a/src/engine/shared/demo.h +++ b/src/engine/shared/demo.h @@ -119,7 +119,7 @@ private: int64 m_Time; public: - CDemoPlayer(class CSnapshotDelta *m_pSnapshotDelta); + CDemoPlayer(class CSnapshotDelta *pSnapshotDelta); void SetListener(IListener *pListener); diff --git a/src/engine/shared/dilate.cpp b/src/engine/shared/dilate.cpp index c97d71472..62b3a536a 100644 --- a/src/engine/shared/dilate.cpp +++ b/src/engine/shared/dilate.cpp @@ -4,8 +4,8 @@ static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pDest, unsigned char AlphaThreshold = 30) { int ix, iy; - const int xo[] = {0, -1, 1, 0}; - const int yo[] = {-1, 0, 0, 1}; + const int aDirX[] = {0, -1, 1, 0}; + const int aDirY[] = {-1, 0, 0, 1}; int AlphaCompIndex = BPP - 1; @@ -19,12 +19,12 @@ static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pD if(pSrc[m + AlphaCompIndex] > AlphaThreshold) continue; - int SumOfOpaque[] = {0, 0, 0}; + int aSumOfOpaque[] = {0, 0, 0}; int Counter = 0; for(int c = 0; c < 4; c++) { - ix = clamp(x + xo[c], 0, w - 1); - iy = clamp(y + yo[c], 0, h - 1); + ix = clamp(x + aDirX[c], 0, w - 1); + iy = clamp(y + aDirY[c], 0, h - 1); int k = iy * w * BPP + ix * BPP; if(pSrc[k + AlphaCompIndex] > AlphaThreshold) { @@ -32,7 +32,7 @@ static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pD // Seems safe for BPP = 3, 4 which we use. clang-analyzer seems to // asssume being called with larger value. TODO: Can make this // safer anyway. - SumOfOpaque[p] += pSrc[k + p]; // NOLINT(clang-analyzer-core.uninitialized.Assign) + aSumOfOpaque[p] += pSrc[k + p]; // NOLINT(clang-analyzer-core.uninitialized.Assign) ++Counter; break; } @@ -42,8 +42,8 @@ static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pD { for(int i = 0; i < BPP - 1; ++i) { - SumOfOpaque[i] /= Counter; - pDest[m + i] = (unsigned char)SumOfOpaque[i]; + aSumOfOpaque[i] /= Counter; + pDest[m + i] = (unsigned char)aSumOfOpaque[i]; } pDest[m + AlphaCompIndex] = 255; @@ -67,23 +67,23 @@ static void CopyColorValues(int w, int h, int BPP, unsigned char *pSrc, unsigned void DilateImage(unsigned char *pImageBuff, int w, int h, int BPP) { - unsigned char *pBuffer[2] = {NULL, NULL}; + unsigned char *apBuffer[2] = {NULL, NULL}; - pBuffer[0] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); - pBuffer[1] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); + apBuffer[0] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); + apBuffer[1] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); unsigned char *pPixelBuff = (unsigned char *)pImageBuff; - Dilate(w, h, BPP, pPixelBuff, pBuffer[0]); + Dilate(w, h, BPP, pPixelBuff, apBuffer[0]); for(int i = 0; i < 5; i++) { - Dilate(w, h, BPP, pBuffer[0], pBuffer[1]); - Dilate(w, h, BPP, pBuffer[1], pBuffer[0]); + Dilate(w, h, BPP, apBuffer[0], apBuffer[1]); + Dilate(w, h, BPP, apBuffer[1], apBuffer[0]); } - CopyColorValues(w, h, BPP, pBuffer[0], pPixelBuff); + CopyColorValues(w, h, BPP, apBuffer[0], pPixelBuff); - free(pBuffer[0]); - free(pBuffer[1]); + free(apBuffer[0]); + free(apBuffer[1]); } diff --git a/src/engine/shared/fifo.cpp b/src/engine/shared/fifo.cpp index edaa18fa7..b56c7498f 100644 --- a/src/engine/shared/fifo.cpp +++ b/src/engine/shared/fifo.cpp @@ -23,17 +23,17 @@ void CFifo::Init(IConsole *pConsole, char *pFifoFile, int Flag) mkfifo(pFifoFile, 0600); - struct stat attribute; - stat(pFifoFile, &attribute); + struct stat Attribute; + stat(pFifoFile, &Attribute); - if(!S_ISFIFO(attribute.st_mode)) + if(!S_ISFIFO(Attribute.st_mode)) { dbg_msg("fifo", "'%s' is not a fifo, removing", pFifoFile); fs_remove(pFifoFile); mkfifo(pFifoFile, 0600); - stat(pFifoFile, &attribute); + stat(pFifoFile, &Attribute); - if(!S_ISFIFO(attribute.st_mode)) + if(!S_ISFIFO(Attribute.st_mode)) { dbg_msg("fifo", "can't remove file '%s', quitting", pFifoFile); exit(2); diff --git a/src/engine/shared/kernel.cpp b/src/engine/shared/kernel.cpp index c159574a1..742711f06 100644 --- a/src/engine/shared/kernel.cpp +++ b/src/engine/shared/kernel.cpp @@ -57,7 +57,7 @@ public: } } - virtual bool RegisterInterfaceImpl(const char *pName, IInterface *pInterface, bool destroy) + virtual bool RegisterInterfaceImpl(const char *pName, IInterface *pInterface, bool Destroy) { // TODO: More error checks here if(!pInterface) @@ -81,7 +81,7 @@ public: pInterface->m_pKernel = this; m_aInterfaces[m_NumInterfaces].m_pInterface = pInterface; str_copy(m_aInterfaces[m_NumInterfaces].m_aName, pName, sizeof(m_aInterfaces[m_NumInterfaces].m_aName)); - m_aInterfaces[m_NumInterfaces].m_AutoDestroy = destroy; + m_aInterfaces[m_NumInterfaces].m_AutoDestroy = Destroy; m_NumInterfaces++; return true; diff --git a/src/engine/shared/linereader.cpp b/src/engine/shared/linereader.cpp index de48abb1d..18868e151 100644 --- a/src/engine/shared/linereader.cpp +++ b/src/engine/shared/linereader.cpp @@ -2,12 +2,12 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "linereader.h" -void CLineReader::Init(IOHANDLE io) +void CLineReader::Init(IOHANDLE File) { m_BufferMaxSize = sizeof(m_aBuffer); m_BufferSize = 0; m_BufferPos = 0; - m_IO = io; + m_File = File; } char *CLineReader::Get() @@ -32,7 +32,7 @@ char *CLineReader::Get() m_BufferPos = Left; // fill the buffer - Read = io_read(m_IO, &m_aBuffer[m_BufferPos], m_BufferMaxSize - m_BufferPos); + Read = io_read(m_File, &m_aBuffer[m_BufferPos], m_BufferMaxSize - m_BufferPos); m_BufferSize = Left + Read; LineStart = 0; diff --git a/src/engine/shared/linereader.h b/src/engine/shared/linereader.h index 9c7e6a837..b66bcf82b 100644 --- a/src/engine/shared/linereader.h +++ b/src/engine/shared/linereader.h @@ -11,10 +11,10 @@ class CLineReader unsigned m_BufferPos; unsigned m_BufferSize; unsigned m_BufferMaxSize; - IOHANDLE m_IO; + IOHANDLE m_File; public: - void Init(IOHANDLE IoHandle); + void Init(IOHANDLE File); char *Get(); }; #endif diff --git a/src/engine/shared/netban.cpp b/src/engine/shared/netban.cpp index 30add2266..f0446037f 100644 --- a/src/engine/shared/netban.cpp +++ b/src/engine/shared/netban.cpp @@ -62,11 +62,11 @@ typename CNetBan::CBan *CNetBan::CBanPool::Add(const T *pData, m_pFirstFree = pBan->m_pNext; // add it to the hash list - if(m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]) - m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]->m_pHashPrev = pBan; + if(m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]) + m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]->m_pHashPrev = pBan; pBan->m_pHashPrev = 0; - pBan->m_pHashNext = m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; - m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash] = pBan; + pBan->m_pHashNext = m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; + m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash] = pBan; // insert it into the used list if(m_pFirstUsed) @@ -120,7 +120,7 @@ int CNetBan::CBanPool::Remove(CBan *pBan) if(pBan->m_pHashPrev) pBan->m_pHashPrev->m_pHashNext = pBan->m_pHashNext; else - m_paaHashList[pBan->m_NetHash.m_HashIndex][pBan->m_NetHash.m_Hash] = pBan->m_pHashNext; + m_aapHashList[pBan->m_NetHash.m_HashIndex][pBan->m_NetHash.m_Hash] = pBan->m_pHashNext; pBan->m_pHashNext = pBan->m_pHashPrev = 0; // remove from used list @@ -201,7 +201,7 @@ void CNetBan::UnbanAll() template void CNetBan::CBanPool::Reset() { - mem_zero(m_paaHashList, sizeof(m_paaHashList)); + mem_zero(m_aapHashList, sizeof(m_aapHashList)); mem_zero(m_aBans, sizeof(m_aBans)); m_pFirstUsed = 0; m_CountUsed = 0; @@ -394,13 +394,13 @@ int CNetBan::UnbanByIndex(int Index) bool CNetBan::IsBanned(const NETADDR *pOrigAddr, char *pBuf, unsigned BufferSize) const { - NETADDR addr; + NETADDR Addr; const NETADDR *pAddr = pOrigAddr; if(pOrigAddr->type == NETTYPE_WEBSOCKET_IPV4) { - mem_copy(&addr, pOrigAddr, sizeof(NETADDR)); - pAddr = &addr; - addr.type = NETTYPE_IPV4; + mem_copy(&Addr, pOrigAddr, sizeof(NETADDR)); + pAddr = &Addr; + Addr.type = NETTYPE_IPV4; } CNetHash aHash[17]; int Length = CNetHash::MakeHashArray(pAddr, aHash); diff --git a/src/engine/shared/netban.h b/src/engine/shared/netban.h index 4c87b0069..576ccd456 100644 --- a/src/engine/shared/netban.h +++ b/src/engine/shared/netban.h @@ -115,10 +115,10 @@ protected: bool IsFull() const { return m_CountUsed == MAX_BANS; } CBan *First() const { return m_pFirstUsed; } - CBan *First(const CNetHash *pNetHash) const { return m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; } + CBan *First(const CNetHash *pNetHash) const { return m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; } CBan *Find(const CDataType *pData, const CNetHash *pNetHash) const { - for(CBan *pBan = m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; pBan; pBan = pBan->m_pHashNext) + for(CBan *pBan = m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; pBan; pBan = pBan->m_pHashNext) { if(NetComp(&pBan->m_Data, pData) == 0) return pBan; @@ -134,7 +134,7 @@ protected: MAX_BANS = 1024, }; - CBan *m_paaHashList[HashCount][256]; + CBan *m_aapHashList[HashCount][256]; CBan m_aBans[MAX_BANS]; CBan *m_pFirstFree; CBan *m_pFirstUsed; diff --git a/src/engine/shared/network.cpp b/src/engine/shared/network.cpp index 5d03adbf6..1da8b6e91 100644 --- a/src/engine/shared/network.cpp +++ b/src/engine/shared/network.cpp @@ -191,7 +191,7 @@ void CNetBase::SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct } // TODO: rename this function -int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket, bool &Sixup, SECURITY_TOKEN *SecurityToken, SECURITY_TOKEN *ResponseToken) +int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket, bool &Sixup, SECURITY_TOKEN *pSecurityToken, SECURITY_TOKEN *pResponseToken) { // check the size if(Size < NET_PACKETHEADERSIZE || Size > NET_MAX_PACKETSIZE) @@ -225,8 +225,8 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct if(Sixup) { - mem_copy(SecurityToken, &pBuffer[1], 4); - mem_copy(ResponseToken, &pBuffer[5], 4); + mem_copy(pSecurityToken, &pBuffer[1], 4); + mem_copy(pResponseToken, &pBuffer[5], 4); } pPacket->m_Flags = NET_PACKETFLAG_CONNLESS; @@ -264,7 +264,7 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct Flags |= NET_PACKETFLAG_COMPRESSION; pPacket->m_Flags = Flags; - mem_copy(SecurityToken, &pBuffer[3], 4); + mem_copy(pSecurityToken, &pBuffer[3], 4); } if(pPacket->m_Flags & NET_PACKETFLAG_COMPRESSION) @@ -317,27 +317,27 @@ void CNetBase::SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int Con CNetBase::SendPacket(Socket, pAddr, &Construct, SecurityToken, Sixup, true); } -unsigned char *CNetChunkHeader::Pack(unsigned char *pData, int split) +unsigned char *CNetChunkHeader::Pack(unsigned char *pData, int Split) { - pData[0] = ((m_Flags & 3) << 6) | ((m_Size >> split) & 0x3f); - pData[1] = (m_Size & ((1 << split) - 1)); + pData[0] = ((m_Flags & 3) << 6) | ((m_Size >> Split) & 0x3f); + pData[1] = (m_Size & ((1 << Split) - 1)); if(m_Flags & NET_CHUNKFLAG_VITAL) { - pData[1] |= (m_Sequence >> 2) & (~((1 << split) - 1)); + pData[1] |= (m_Sequence >> 2) & (~((1 << Split) - 1)); pData[2] = m_Sequence & 0xff; return pData + 3; } return pData + 2; } -unsigned char *CNetChunkHeader::Unpack(unsigned char *pData, int split) +unsigned char *CNetChunkHeader::Unpack(unsigned char *pData, int Split) { m_Flags = (pData[0] >> 6) & 3; - m_Size = ((pData[0] & 0x3f) << split) | (pData[1] & ((1 << split) - 1)); + m_Size = ((pData[0] & 0x3f) << Split) | (pData[1] & ((1 << Split) - 1)); m_Sequence = -1; if(m_Flags & NET_CHUNKFLAG_VITAL) { - m_Sequence = ((pData[1] & (~((1 << split) - 1))) << 2) | pData[2]; + m_Sequence = ((pData[1] & (~((1 << Split) - 1))) << 2) | pData[2]; return pData + 3; } return pData + 2; @@ -412,7 +412,7 @@ int CNetBase::Decompress(const void *pData, int DataSize, void *pOutput, int Out return ms_Huffman.Decompress(pData, DataSize, pOutput, OutputSize); } -static const unsigned gs_aFreqTable[256 + 1] = { +static const unsigned s_aFreqTable[256 + 1] = { 1 << 30, 4545, 2657, 431, 1950, 919, 444, 482, 2244, 617, 838, 542, 715, 1814, 304, 240, 754, 212, 647, 186, 283, 131, 146, 166, 543, 164, 167, 136, 179, 859, 363, 113, 157, 154, 204, 108, 137, 180, 202, 176, 872, 404, 168, 134, 151, 111, 113, 109, 120, 126, 129, 100, 41, 20, 16, 22, 18, 18, 17, 19, @@ -429,5 +429,5 @@ static const unsigned gs_aFreqTable[256 + 1] = { void CNetBase::Init() { - ms_Huffman.Init(gs_aFreqTable); + ms_Huffman.Init(s_aFreqTable); } diff --git a/src/engine/shared/network.h b/src/engine/shared/network.h index 95657059f..08c46c648 100644 --- a/src/engine/shared/network.h +++ b/src/engine/shared/network.h @@ -130,8 +130,8 @@ public: int m_Size; int m_Sequence; - unsigned char *Pack(unsigned char *pData, int split = 4); - unsigned char *Unpack(unsigned char *pData, int split = 4); + unsigned char *Pack(unsigned char *pData, int Split = 4); + unsigned char *Unpack(unsigned char *pData, int Split = 4); }; class CNetChunkResend @@ -175,13 +175,13 @@ private: bool m_BlockCloseMsg; bool m_UnknownSeq; - TStaticRingBuffer m_Buffer; + CStaticRingBuffer m_Buffer; int64 m_LastUpdateTime; int64 m_LastRecvTime; int64 m_LastSendTime; - char m_ErrorString[256]; + char m_aErrorString[256]; CNetPacketConstruct m_Construct; @@ -199,8 +199,6 @@ private: void ResendChunk(CNetChunkResend *pResend); void Resend(); - bool HasSecurityToken; - public: bool m_TimeoutProtected; bool m_TimeoutSituation; @@ -221,8 +219,8 @@ public: int State() const { return m_State; } const NETADDR *PeerAddress() const { return &m_PeerAddr; } - void ResetErrorString() { m_ErrorString[0] = 0; } - const char *ErrorString() const { return m_ErrorString; } + void ResetErrorString() { m_aErrorString[0] = 0; } + const char *ErrorString() const { return m_aErrorString; } // Needed for GotProblems in NetClient int64 LastRecvTime() const { return m_LastRecvTime; } @@ -231,9 +229,9 @@ public: int AckSequence() const { return m_Ack; } int SeqSequence() const { return m_Sequence; } int SecurityToken() const { return m_SecurityToken; } - TStaticRingBuffer *ResendBuffer() { return &m_Buffer; }; + CStaticRingBuffer *ResendBuffer() { return &m_Buffer; }; - void SetTimedOut(const NETADDR *pAddr, int Sequence, int Ack, SECURITY_TOKEN SecurityToken, TStaticRingBuffer *pResendBuffer, bool Sixup); + void SetTimedOut(const NETADDR *pAddr, int Sequence, int Ack, SECURITY_TOKEN SecurityToken, CStaticRingBuffer *pResendBuffer, bool Sixup); // anti spoof void DirectInit(NETADDR &Addr, SECURITY_TOKEN SecurityToken, SECURITY_TOKEN Token, bool Sixup); @@ -320,11 +318,11 @@ class CNetServer NETFUNC_NEWCLIENT_NOAUTH m_pfnNewClientNoAuth; NETFUNC_DELCLIENT m_pfnDelClient; NETFUNC_CLIENTREJOIN m_pfnClientRejoin; - void *m_UserPtr; + void *m_pUser; int m_NumConAttempts; // log flooding attacks int64 m_TimeNumConAttempts; - unsigned char m_SecurityTokenSeed[16]; + unsigned char m_aSecurityTokenSeed[16]; // vanilla connect flood detection int64 m_VConnFirst; @@ -345,7 +343,7 @@ class CNetServer int TryAcceptClient(NETADDR &Addr, SECURITY_TOKEN SecurityToken, bool VanillaAuth = false, bool Sixup = false, SECURITY_TOKEN Token = 0); int NumClientsWithAddr(NETADDR Addr); bool Connlimit(NETADDR Addr); - void SendMsgs(NETADDR &Addr, const CMsgPacker *Msgs[], int num); + void SendMsgs(NETADDR &Addr, const CMsgPacker *apMsgs[], int Num); public: int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser); @@ -356,7 +354,7 @@ public: int Close(); // - int Recv(CNetChunk *pChunk, SECURITY_TOKEN *ResponseToken); + int Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken); int Send(CNetChunk *pChunk); int Update(); @@ -402,7 +400,7 @@ class CNetConsole NETFUNC_NEWCLIENT_CON m_pfnNewClient; NETFUNC_DELCLIENT m_pfnDelClient; - void *m_UserPtr; + void *m_pUser; CNetRecvUnpacker m_RecvUnpacker; @@ -441,12 +439,12 @@ public: int Close(); // connection state - int Disconnect(const char *Reason); - int Connect(NETADDR *Addr); + int Disconnect(const char *pReason); + int Connect(NETADDR *pAddr); // communication - int Recv(CNetChunk *Chunk); - int Send(CNetChunk *Chunk); + int Recv(CNetChunk *pChunk); + int Send(CNetChunk *pChunk); // pumping int Update(); @@ -481,7 +479,7 @@ public: static void SendPacketConnless(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize, bool Extended, unsigned char aExtra[4]); static void SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket, SECURITY_TOKEN SecurityToken, bool Sixup = false, bool NoCompress = false); - static int UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket, bool &Sixup, SECURITY_TOKEN *SecurityToken = 0, SECURITY_TOKEN *ResponseToken = 0); + static int UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket, bool &Sixup, SECURITY_TOKEN *pSecurityToken = 0, SECURITY_TOKEN *pResponseToken = 0); // The backroom is ack-NET_MAX_SEQUENCE/2. Used for knowing if we acked a packet or not static int IsSeqInBackroom(int Seq, int Ack); diff --git a/src/engine/shared/network_conn.cpp b/src/engine/shared/network_conn.cpp index 20f7312e7..dd39c6c3b 100644 --- a/src/engine/shared/network_conn.cpp +++ b/src/engine/shared/network_conn.cpp @@ -48,12 +48,12 @@ void CNetConnection::Reset(bool Rejoin) const char *CNetConnection::ErrorString() { - return m_ErrorString; + return m_aErrorString; } void CNetConnection::SetError(const char *pString) { - str_copy(m_ErrorString, pString, sizeof(m_ErrorString)); + str_copy(m_aErrorString, pString, sizeof(m_aErrorString)); } void CNetConnection::Init(NETSOCKET Socket, bool BlockCloseMsg) @@ -63,7 +63,7 @@ void CNetConnection::Init(NETSOCKET Socket, bool BlockCloseMsg) m_Socket = Socket; m_BlockCloseMsg = BlockCloseMsg; - mem_zero(m_ErrorString, sizeof(m_ErrorString)); + mem_zero(m_aErrorString, sizeof(m_aErrorString)); } void CNetConnection::AckChunks(int Ack) @@ -189,7 +189,7 @@ int CNetConnection::Connect(NETADDR *pAddr) // init connection Reset(); m_PeerAddr = *pAddr; - mem_zero(m_ErrorString, sizeof(m_ErrorString)); + mem_zero(m_aErrorString, sizeof(m_aErrorString)); m_State = NET_CONNSTATE_CONNECT; SendControl(NET_CTRLMSG_CONNECT, SECURITY_TOKEN_MAGIC, sizeof(SECURITY_TOKEN_MAGIC)); return 0; @@ -210,11 +210,11 @@ void CNetConnection::Disconnect(const char *pReason) SendControl(NET_CTRLMSG_CLOSE, 0, 0); } - if(pReason != m_ErrorString) + if(pReason != m_aErrorString) { - m_ErrorString[0] = 0; + m_aErrorString[0] = 0; if(pReason) - str_copy(m_ErrorString, pReason, sizeof(m_ErrorString)); + str_copy(m_aErrorString, pReason, sizeof(m_aErrorString)); } } @@ -228,7 +228,7 @@ void CNetConnection::DirectInit(NETADDR &Addr, SECURITY_TOKEN SecurityToken, SEC m_State = NET_CONNSTATE_ONLINE; m_PeerAddr = Addr; - mem_zero(m_ErrorString, sizeof(m_ErrorString)); + mem_zero(m_aErrorString, sizeof(m_aErrorString)); int64 Now = time_get(); m_LastSendTime = Now; @@ -290,25 +290,25 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr, SECURITY_ m_State = NET_CONNSTATE_ERROR; m_RemoteClosed = 1; - char Str[128] = {0}; + char aStr[128] = {0}; if(pPacket->m_DataSize > 1) { // make sure to sanitize the error string form the other party if(pPacket->m_DataSize < 128) - str_copy(Str, (char *)&pPacket->m_aChunkData[1], pPacket->m_DataSize); + str_copy(aStr, (char *)&pPacket->m_aChunkData[1], pPacket->m_DataSize); else - str_copy(Str, (char *)&pPacket->m_aChunkData[1], sizeof(Str)); - str_sanitize_strong(Str); + str_copy(aStr, (char *)&pPacket->m_aChunkData[1], sizeof(aStr)); + str_sanitize_strong(aStr); } if(!m_BlockCloseMsg) { // set the error string - SetError(Str); + SetError(aStr); } if(g_Config.m_Debug) - dbg_msg("conn", "closed reason='%s'", Str); + dbg_msg("conn", "closed reason='%s'", aStr); } return 0; } @@ -325,7 +325,7 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr, SECURITY_ Reset(); m_State = NET_CONNSTATE_PENDING; m_PeerAddr = *pAddr; - mem_zero(m_ErrorString, sizeof(m_ErrorString)); + mem_zero(m_aErrorString, sizeof(m_aErrorString)); m_LastSendTime = Now; m_LastRecvTime = Now; m_LastUpdateTime = Now; @@ -466,7 +466,7 @@ int CNetConnection::Update() return 0; } -void CNetConnection::SetTimedOut(const NETADDR *pAddr, int Sequence, int Ack, SECURITY_TOKEN SecurityToken, TStaticRingBuffer *pResendBuffer, bool Sixup) +void CNetConnection::SetTimedOut(const NETADDR *pAddr, int Sequence, int Ack, SECURITY_TOKEN SecurityToken, CStaticRingBuffer *pResendBuffer, bool Sixup) { int64 Now = time_get(); @@ -476,7 +476,7 @@ void CNetConnection::SetTimedOut(const NETADDR *pAddr, int Sequence, int Ack, SE m_State = NET_CONNSTATE_ONLINE; m_PeerAddr = *pAddr; - mem_zero(m_ErrorString, sizeof(m_ErrorString)); + mem_zero(m_aErrorString, sizeof(m_aErrorString)); m_LastSendTime = Now; m_LastRecvTime = Now; m_LastUpdateTime = Now; @@ -487,10 +487,10 @@ void CNetConnection::SetTimedOut(const NETADDR *pAddr, int Sequence, int Ack, SE m_Buffer.Init(); while(pResendBuffer->First()) { - CNetChunkResend *First = pResendBuffer->First(); + CNetChunkResend *pFirst = pResendBuffer->First(); - CNetChunkResend *pResend = m_Buffer.Allocate(sizeof(CNetChunkResend) + First->m_DataSize); - mem_copy(pResend, First, sizeof(CNetChunkResend) + First->m_DataSize); + CNetChunkResend *pResend = m_Buffer.Allocate(sizeof(CNetChunkResend) + pFirst->m_DataSize); + mem_copy(pResend, pFirst, sizeof(CNetChunkResend) + pFirst->m_DataSize); pResendBuffer->PopFirst(); } diff --git a/src/engine/shared/network_console.cpp b/src/engine/shared/network_console.cpp index b49e4d586..04712237f 100644 --- a/src/engine/shared/network_console.cpp +++ b/src/engine/shared/network_console.cpp @@ -34,7 +34,7 @@ void CNetConsole::SetCallbacks(NETFUNC_NEWCLIENT_CON pfnNewClient, NETFUNC_DELCL { m_pfnNewClient = pfnNewClient; m_pfnDelClient = pfnDelClient; - m_UserPtr = pUser; + m_pUser = pUser; } int CNetConsole::Close() @@ -50,7 +50,7 @@ int CNetConsole::Close() int CNetConsole::Drop(int ClientID, const char *pReason) { if(m_pfnDelClient) - m_pfnDelClient(ClientID, pReason, m_UserPtr); + m_pfnDelClient(ClientID, pReason, m_pUser); m_aSlots[ClientID].m_Connection.Disconnect(pReason); @@ -82,7 +82,7 @@ int CNetConsole::AcceptClient(NETSOCKET Socket, const NETADDR *pAddr) { m_aSlots[FreeSlot].m_Connection.Init(Socket, pAddr); if(m_pfnNewClient) - m_pfnNewClient(FreeSlot, m_UserPtr); + m_pfnNewClient(FreeSlot, m_pUser); return 0; } diff --git a/src/engine/shared/network_server.cpp b/src/engine/shared/network_server.cpp index 7689efa4e..f35d1294f 100644 --- a/src/engine/shared/network_server.cpp +++ b/src/engine/shared/network_server.cpp @@ -74,7 +74,7 @@ bool CNetServer::Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int Ma m_VConnNum = 0; m_VConnFirst = 0; - secure_random_fill(m_SecurityTokenSeed, sizeof(m_SecurityTokenSeed)); + secure_random_fill(m_aSecurityTokenSeed, sizeof(m_aSecurityTokenSeed)); for(auto &Slot : m_aSlots) Slot.m_Connection.Init(m_Socket, true); @@ -88,7 +88,7 @@ int CNetServer::SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT p { m_pfnNewClient = pfnNewClient; m_pfnDelClient = pfnDelClient; - m_UserPtr = pUser; + m_pUser = pUser; return 0; } @@ -98,7 +98,7 @@ int CNetServer::SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_NEWCLIENT_N m_pfnNewClientNoAuth = pfnNewClientNoAuth; m_pfnClientRejoin = pfnClientRejoin; m_pfnDelClient = pfnDelClient; - m_UserPtr = pUser; + m_pUser = pUser; return 0; } @@ -119,7 +119,7 @@ int CNetServer::Drop(int ClientID, const char *pReason) pReason );*/ if(m_pfnDelClient) - m_pfnDelClient(ClientID, pReason, m_UserPtr); + m_pfnDelClient(ClientID, pReason, m_pUser); m_aSlots[ClientID].m_Connection.Disconnect(pReason); @@ -146,7 +146,7 @@ SECURITY_TOKEN CNetServer::GetToken(const NETADDR &Addr) { SHA256_CTX Sha256; sha256_init(&Sha256); - sha256_update(&Sha256, (unsigned char *)m_SecurityTokenSeed, sizeof(m_SecurityTokenSeed)); + sha256_update(&Sha256, (unsigned char *)m_aSecurityTokenSeed, sizeof(m_aSecurityTokenSeed)); sha256_update(&Sha256, (unsigned char *)&Addr, 20); // omit port, bad idea! SECURITY_TOKEN SecurityToken = ToSecurityToken(sha256_finish(&Sha256).data); @@ -218,15 +218,15 @@ int CNetServer::TryAcceptClient(NETADDR &Addr, SECURITY_TOKEN SecurityToken, boo { if(Sixup && !g_Config.m_SvSixup) { - const char Msg[] = "0.7 connections are not accepted at this time"; - CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, Msg, sizeof(Msg), SecurityToken, Sixup); + const char aMsg[] = "0.7 connections are not accepted at this time"; + CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aMsg, sizeof(aMsg), SecurityToken, Sixup); return -1; // failed to add client? } if(Connlimit(Addr)) { - const char Msg[] = "Too many connections in a short time"; - CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, Msg, sizeof(Msg), SecurityToken, Sixup); + const char aMsg[] = "Too many connections in a short time"; + CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aMsg, sizeof(aMsg), SecurityToken, Sixup); return -1; // failed to add client } @@ -251,8 +251,8 @@ int CNetServer::TryAcceptClient(NETADDR &Addr, SECURITY_TOKEN SecurityToken, boo if(Slot == -1) { - const char FullMsg[] = "This server is full"; - CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, FullMsg, sizeof(FullMsg), SecurityToken, Sixup); + const char aFullMsg[] = "This server is full"; + CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aFullMsg, sizeof(aFullMsg), SecurityToken, Sixup); return -1; // failed to add client } @@ -277,22 +277,22 @@ int CNetServer::TryAcceptClient(NETADDR &Addr, SECURITY_TOKEN SecurityToken, boo } if(VanillaAuth) - m_pfnNewClientNoAuth(Slot, m_UserPtr); + m_pfnNewClientNoAuth(Slot, m_pUser); else - m_pfnNewClient(Slot, m_UserPtr, Sixup); + m_pfnNewClient(Slot, m_pUser, Sixup); return Slot; // done } -void CNetServer::SendMsgs(NETADDR &Addr, const CMsgPacker *Msgs[], int num) +void CNetServer::SendMsgs(NETADDR &Addr, const CMsgPacker *apMsgs[], int Num) { - CNetPacketConstruct m_Construct; - mem_zero(&m_Construct, sizeof(m_Construct)); - unsigned char *pChunkData = &m_Construct.m_aChunkData[m_Construct.m_DataSize]; + CNetPacketConstruct Construct; + mem_zero(&Construct, sizeof(Construct)); + unsigned char *pChunkData = &Construct.m_aChunkData[Construct.m_DataSize]; - for(int i = 0; i < num; i++) + for(int i = 0; i < Num; i++) { - const CMsgPacker *pMsg = Msgs[i]; + const CMsgPacker *pMsg = apMsgs[i]; CNetChunkHeader Header; Header.m_Flags = NET_CHUNKFLAG_VITAL; Header.m_Size = pMsg->Size(); @@ -302,12 +302,12 @@ void CNetServer::SendMsgs(NETADDR &Addr, const CMsgPacker *Msgs[], int num) *pChunkData <<= 1; *pChunkData |= 1; pChunkData += pMsg->Size(); - m_Construct.m_NumChunks++; + Construct.m_NumChunks++; } // - m_Construct.m_DataSize = (int)(pChunkData - m_Construct.m_aChunkData); - CNetBase::SendPacket(m_Socket, &Addr, &m_Construct, NET_SECURITY_TOKEN_UNSUPPORTED); + Construct.m_DataSize = (int)(pChunkData - Construct.m_aChunkData); + CNetBase::SendPacket(m_Socket, &Addr, &Construct, NET_SECURITY_TOKEN_UNSUPPORTED); } // connection-less msg packet without token-support @@ -429,9 +429,9 @@ void CNetServer::OnPreConnMsg(NETADDR &Addr, CNetPacketConstruct &Packet) SnapEmptyMsg.AddInt(SecurityToken + 1); // send all chunks/msgs in one packet - const CMsgPacker *Msgs[] = {&MapChangeMsg, &MapDataMsg, &ConReadyMsg, + const CMsgPacker *apMsgs[] = {&MapChangeMsg, &MapDataMsg, &ConReadyMsg, &SnapEmptyMsg, &SnapEmptyMsg, &SnapEmptyMsg}; - SendMsgs(Addr, Msgs, 6); + SendMsgs(Addr, apMsgs, 6); } else { @@ -506,7 +506,7 @@ void CNetServer::OnConnCtrlMsg(NETADDR &Addr, int ClientID, int ControlMsg, cons // reset netconn and process rejoin m_aSlots[ClientID].m_Connection.Reset(true); - m_pfnClientRejoin(ClientID, m_UserPtr); + m_pfnClientRejoin(ClientID, m_pUser); } } } @@ -625,7 +625,7 @@ static bool IsDDNetControlMsg(const CNetPacketConstruct *pPacket) /* TODO: chopp up this function into smaller working parts */ -int CNetServer::Recv(CNetChunk *pChunk, SECURITY_TOKEN *ResponseToken) +int CNetServer::Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken) { while(1) { @@ -654,8 +654,8 @@ int CNetServer::Recv(CNetChunk *pChunk, SECURITY_TOKEN *ResponseToken) SECURITY_TOKEN Token; bool Sixup = false; - *ResponseToken = NET_SECURITY_TOKEN_UNKNOWN; - if(CNetBase::UnpackPacket(pData, Bytes, &m_RecvUnpacker.m_Data, Sixup, &Token, ResponseToken) == 0) + *pResponseToken = NET_SECURITY_TOKEN_UNKNOWN; + if(CNetBase::UnpackPacket(pData, Bytes, &m_RecvUnpacker.m_Data, Sixup, &Token, pResponseToken) == 0) { if(m_RecvUnpacker.m_Data.m_Flags & NET_PACKETFLAG_CONNLESS) { @@ -712,7 +712,7 @@ int CNetServer::Recv(CNetChunk *pChunk, SECURITY_TOKEN *ResponseToken) if(Sixup) { // got 0.7 control msg - if(OnSixupCtrlMsg(Addr, pChunk, m_RecvUnpacker.m_Data.m_aChunkData[0], m_RecvUnpacker.m_Data, *ResponseToken, Token) == 1) + if(OnSixupCtrlMsg(Addr, pChunk, m_RecvUnpacker.m_Data.m_aChunkData[0], m_RecvUnpacker.m_Data, *pResponseToken, Token) == 1) return 1; } else if(IsDDNetControlMsg(&m_RecvUnpacker.m_Data)) diff --git a/src/engine/shared/ringbuffer.h b/src/engine/shared/ringbuffer.h index 57cf670bd..842e0520c 100644 --- a/src/engine/shared/ringbuffer.h +++ b/src/engine/shared/ringbuffer.h @@ -3,8 +3,6 @@ #ifndef ENGINE_SHARED_RINGBUFFER_H #define ENGINE_SHARED_RINGBUFFER_H -typedef struct RINGBUFFER RINGBUFFER; - class CRingBufferBase { class CItem @@ -49,12 +47,12 @@ public: }; template -class TStaticRingBuffer : public CRingBufferBase +class CStaticRingBuffer : public CRingBufferBase { unsigned char m_aBuffer[TSIZE]; public: - TStaticRingBuffer() { Init(); } + CStaticRingBuffer() { Init(); } void Init() { CRingBufferBase::Init(m_aBuffer, TSIZE, TFLAGS); } diff --git a/src/engine/shared/snapshot.cpp b/src/engine/shared/snapshot.cpp index 9b846f1cb..f06021022 100644 --- a/src/engine/shared/snapshot.cpp +++ b/src/engine/shared/snapshot.cpp @@ -178,13 +178,13 @@ CSnapshotDelta::CSnapshotDelta() mem_zero(&m_Empty, sizeof(m_Empty)); } -CSnapshotDelta::CSnapshotDelta(const CSnapshotDelta &old) +CSnapshotDelta::CSnapshotDelta(const CSnapshotDelta &Old) { - mem_copy(m_aItemSizes, old.m_aItemSizes, sizeof(m_aItemSizes)); - mem_copy(m_aSnapshotDataRate, old.m_aSnapshotDataRate, sizeof(m_aSnapshotDataRate)); - mem_copy(m_aSnapshotDataUpdates, old.m_aSnapshotDataUpdates, sizeof(m_aSnapshotDataUpdates)); - mem_copy(&m_SnapshotCurrent, &old.m_SnapshotCurrent, sizeof(m_SnapshotCurrent)); - mem_copy(&m_Empty, &old.m_Empty, sizeof(m_Empty)); + mem_copy(m_aItemSizes, Old.m_aItemSizes, sizeof(m_aItemSizes)); + mem_copy(m_aSnapshotDataRate, Old.m_aSnapshotDataRate, sizeof(m_aSnapshotDataRate)); + mem_copy(m_aSnapshotDataUpdates, Old.m_aSnapshotDataUpdates, sizeof(m_aSnapshotDataUpdates)); + mem_copy(&m_SnapshotCurrent, &Old.m_SnapshotCurrent, sizeof(m_SnapshotCurrent)); + mem_copy(&m_Empty, &Old.m_Empty, sizeof(m_Empty)); } void CSnapshotDelta::SetStaticsize(int ItemType, int Size) @@ -203,7 +203,7 @@ CSnapshotDelta::CData *CSnapshotDelta::EmptyDelta() int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData) { CData *pDelta = (CData *)pDstData; - int *pData = (int *)pDelta->m_pData; + int *pData = (int *)pDelta->m_aData; int i, ItemSize, PastIndex; CSnapshotItem *pFromItem; CSnapshotItem *pCurItem; @@ -215,14 +215,14 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData pDelta->m_NumUpdateItems = 0; pDelta->m_NumTempItems = 0; - CItemList Hashlist[HASHLIST_SIZE]; - GenerateHash(Hashlist, pTo); + CItemList aHashlist[HASHLIST_SIZE]; + GenerateHash(aHashlist, pTo); // pack deleted stuff for(i = 0; i < pFrom->NumItems(); i++) { pFromItem = pFrom->GetItem(i); - if(GetItemIndexHashed(pFromItem->Key(), Hashlist) == -1) + if(GetItemIndexHashed(pFromItem->Key(), aHashlist) == -1) { // deleted pDelta->m_NumDeletedItems++; @@ -231,7 +231,7 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData } } - GenerateHash(Hashlist, pFrom); + GenerateHash(aHashlist, pFrom); int aPastIndices[1024]; // fetch previous indices @@ -240,7 +240,7 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData for(i = 0; i < NumItems; i++) { pCurItem = pTo->GetItem(i); // O(1) .. O(n) - aPastIndices[i] = GetItemIndexHashed(pCurItem->Key(), Hashlist); // O(n) .. O(n^n) + aPastIndices[i] = GetItemIndexHashed(pCurItem->Key(), aHashlist); // O(n) .. O(n^n) } for(i = 0; i < NumItems; i++) @@ -322,7 +322,7 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData { CSnapshotBuilder Builder; CData *pDelta = (CData *)pSrcData; - int *pData = (int *)pDelta->m_pData; + int *pData = (int *)pDelta->m_aData; int *pEnd = (int *)(((char *)pSrcData + DataSize)); CSnapshotItem *pFromItem; @@ -564,11 +564,11 @@ int *CSnapshotBuilder::GetItemData(int Key) return 0; } -int CSnapshotBuilder::Finish(void *SpnapData) +int CSnapshotBuilder::Finish(void *pSnapData) { //dbg_msg("snap", "---------------------------"); // flattern and make the snapshot - CSnapshot *pSnap = (CSnapshot *)SpnapData; + CSnapshot *pSnap = (CSnapshot *)pSnapData; int OffsetSize = sizeof(int) * m_NumItems; pSnap->m_DataSize = m_DataSize; pSnap->m_NumItems = m_NumItems; diff --git a/src/engine/shared/snapshot.h b/src/engine/shared/snapshot.h index 7aae3feac..1b795dd3d 100644 --- a/src/engine/shared/snapshot.h +++ b/src/engine/shared/snapshot.h @@ -63,7 +63,7 @@ public: int m_NumDeletedItems; int m_NumUpdateItems; int m_NumTempItems; // needed? - int m_pData[1]; + int m_aData[1]; }; private: @@ -82,7 +82,7 @@ private: public: static int DiffItem(int *pPast, int *pCurrent, int *pOut, int Size); CSnapshotDelta(); - CSnapshotDelta(const CSnapshotDelta &old); + CSnapshotDelta(const CSnapshotDelta &Old); int GetDataRate(int Index) { return m_aSnapshotDataRate[Index]; } int GetDataUpdates(int Index) { return m_aSnapshotDataUpdates[Index]; } void SetStaticsize(int ItemType, int Size); @@ -119,7 +119,7 @@ public: void PurgeAll(); void PurgeUntil(int Tick); void Add(int Tick, int64 Tagtime, int DataSize, void *pData, int CreateAlt); - int Get(int Tick, int64 *Tagtime, CSnapshot **pData, CSnapshot **ppAltData); + int Get(int Tick, int64 *pTagtime, CSnapshot **ppData, CSnapshot **ppAltData); }; class CSnapshotBuilder @@ -154,7 +154,7 @@ public: CSnapshotItem *GetItem(int Index); int *GetItemData(int Key); - int Finish(void *Snapdata); + int Finish(void *pSnapdata); }; #endif // ENGINE_SNAPSHOT_H diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index 4b553d48c..27ddba4fe 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -215,7 +215,7 @@ public: #if defined(CONF_FAMILY_UNIX) // 4) check for all default locations { - const char *aDirs[] = { + const char *apDirs[] = { "/usr/share/ddnet", "/usr/share/games/ddnet", "/usr/local/share/ddnet", @@ -223,16 +223,16 @@ public: "/usr/pkg/share/ddnet", "/usr/pkg/share/games/ddnet", "/opt/ddnet"}; - const int DirsCount = sizeof(aDirs) / sizeof(aDirs[0]); + const int DirsCount = sizeof(apDirs) / sizeof(apDirs[0]); int i; for(i = 0; i < DirsCount; i++) { char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "%s/data/mapres", aDirs[i]); + str_format(aBuf, sizeof(aBuf), "%s/data/mapres", apDirs[i]); if(fs_is_dir(aBuf)) { - str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", aDirs[i]); + str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", apDirs[i]); return; } } @@ -393,11 +393,11 @@ public: struct CFindCBData { - CStorage *pStorage; - const char *pFilename; - const char *pPath; - char *pBuffer; - int BufferSize; + CStorage *m_pStorage; + const char *m_pFilename; + const char *m_pPath; + char *m_pBuffer; + int m_BufferSize; }; static int FindFileCallback(const char *pName, int IsDir, int Type, void *pUser) @@ -411,16 +411,16 @@ public: // search within the folder char aBuf[MAX_PATH_LENGTH]; char aPath[MAX_PATH_LENGTH]; - str_format(aPath, sizeof(aPath), "%s/%s", Data.pPath, pName); - Data.pPath = aPath; - fs_listdir(Data.pStorage->GetPath(Type, aPath, aBuf, sizeof(aBuf)), FindFileCallback, Type, &Data); - if(Data.pBuffer[0]) + str_format(aPath, sizeof(aPath), "%s/%s", Data.m_pPath, pName); + Data.m_pPath = aPath; + fs_listdir(Data.m_pStorage->GetPath(Type, aPath, aBuf, sizeof(aBuf)), FindFileCallback, Type, &Data); + if(Data.m_pBuffer[0]) return 1; } - else if(!str_comp(pName, Data.pFilename)) + else if(!str_comp(pName, Data.m_pFilename)) { // found the file = end - str_format(Data.pBuffer, Data.BufferSize, "%s/%s", Data.pPath, Data.pFilename); + str_format(Data.m_pBuffer, Data.m_BufferSize, "%s/%s", Data.m_pPath, Data.m_pFilename); return 1; } @@ -435,11 +435,11 @@ public: pBuffer[0] = 0; char aBuf[MAX_PATH_LENGTH]; CFindCBData Data; - Data.pStorage = this; - Data.pFilename = pFilename; - Data.pPath = pPath; - Data.pBuffer = pBuffer; - Data.BufferSize = BufferSize; + Data.m_pStorage = this; + Data.m_pFilename = pFilename; + Data.m_pPath = pPath; + Data.m_pBuffer = pBuffer; + Data.m_BufferSize = BufferSize; if(Type == TYPE_ALL) { @@ -468,10 +468,10 @@ public: char aBuffer[MAX_PATH_LENGTH]; GetPath(Type, pFilename, aBuffer, sizeof(aBuffer)); - bool success = !fs_remove(aBuffer); - if(!success) + bool Success = !fs_remove(aBuffer); + if(!Success) dbg_msg("storage", "failed to remove: %s", aBuffer); - return success; + return Success; } virtual bool RemoveBinaryFile(const char *pFilename) @@ -479,10 +479,10 @@ public: char aBuffer[MAX_PATH_LENGTH]; GetBinaryPath(pFilename, aBuffer, sizeof(aBuffer)); - bool success = !fs_remove(aBuffer); - if(!success) + bool Success = !fs_remove(aBuffer); + if(!Success) dbg_msg("storage", "failed to remove: %s", aBuffer); - return success; + return Success; } virtual bool RenameFile(const char *pOldFilename, const char *pNewFilename, int Type) @@ -495,10 +495,10 @@ public: GetPath(Type, pOldFilename, aOldBuffer, sizeof(aOldBuffer)); GetPath(Type, pNewFilename, aNewBuffer, sizeof(aNewBuffer)); - bool success = !fs_rename(aOldBuffer, aNewBuffer); - if(!success) + bool Success = !fs_rename(aOldBuffer, aNewBuffer); + if(!Success) dbg_msg("storage", "failed to rename: %s -> %s", aOldBuffer, aNewBuffer); - return success; + return Success; } virtual bool RenameBinaryFile(const char *pOldFilename, const char *pNewFilename) @@ -511,10 +511,10 @@ public: if(fs_makedir_rec_for(aNewBuffer) < 0) dbg_msg("storage", "cannot create folder for: %s", aNewBuffer); - bool success = !fs_rename(aOldBuffer, aNewBuffer); - if(!success) + bool Success = !fs_rename(aOldBuffer, aNewBuffer); + if(!Success) dbg_msg("storage", "failed to rename: %s -> %s", aOldBuffer, aNewBuffer); - return success; + return Success; } virtual bool CreateFolder(const char *pFoldername, int Type) @@ -525,10 +525,10 @@ public: char aBuffer[MAX_PATH_LENGTH]; GetPath(Type, pFoldername, aBuffer, sizeof(aBuffer)); - bool success = !fs_makedir(aBuffer); - if(!success) + bool Success = !fs_makedir(aBuffer); + if(!Success) dbg_msg("storage", "failed to create folder: %s", aBuffer); - return success; + return Success; } virtual void GetCompletePath(int Type, const char *pDir, char *pBuffer, unsigned BufferSize) diff --git a/src/engine/shared/uuid_manager.cpp b/src/engine/shared/uuid_manager.cpp index 4ff714ee7..31d466fac 100644 --- a/src/engine/shared/uuid_manager.cpp +++ b/src/engine/shared/uuid_manager.cpp @@ -109,10 +109,10 @@ const char *CUuidManager::GetName(int ID) const int CUuidManager::LookupUuid(CUuid Uuid) const { - sorted_array::range it = ::find_binary(m_aNamesSorted.all(), Uuid); - if(!it.empty()) + sorted_array::range Pos = ::find_binary(m_aNamesSorted.all(), Uuid); + if(!Pos.empty()) { - return GetID(it.front().m_ID); + return GetID(Pos.front().m_ID); } return UUID_UNKNOWN; } diff --git a/src/engine/shared/websockets.cpp b/src/engine/shared/websockets.cpp index 38d0d8d60..ff6e2cb2b 100644 --- a/src/engine/shared/websockets.cpp +++ b/src/engine/shared/websockets.cpp @@ -23,10 +23,10 @@ extern "C" { // ddnet client opens two connections for whatever reason #define WS_CLIENTS (MAX_CLIENTS * 2) -typedef TStaticRingBuffer TRecvBuffer; -typedef TStaticRingBuffer TSendBuffer; diff --git a/src/game/client/components/chat.h b/src/game/client/components/chat.h index 1d1342756..6e743ea3e 100644 --- a/src/game/client/components/chat.h +++ b/src/game/client/components/chat.h @@ -99,7 +99,7 @@ class CChat : public CComponent char m_aText[1]; }; CHistoryEntry *m_pHistoryEntry; - TStaticRingBuffer m_History; + CStaticRingBuffer m_History; int m_PendingChatCounter; int64 m_LastChatSend; int64 m_aLastSoundPlayed[CHAT_NUM]; diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h index e088181c6..a13d5887e 100644 --- a/src/game/client/components/console.h +++ b/src/game/client/components/console.h @@ -25,8 +25,8 @@ class CGameConsole : public CComponent bool m_Highlighted; char m_aText[1]; }; - TStaticRingBuffer m_Backlog; - TStaticRingBuffer m_History; + CStaticRingBuffer m_Backlog; + CStaticRingBuffer m_History; char *m_pHistoryEntry; CLineInput m_Input; From a9631bf9cd71bb4e7b6a67e71976a7c9eace8bd5 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 8 Nov 2020 19:41:16 +0100 Subject: [PATCH 071/144] Fix text color change --- src/engine/client/text.cpp | 3 +++ src/engine/textrender.h | 8 ++++++++ src/game/client/ui.cpp | 5 ++++- src/game/client/ui.h | 3 +++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index dc1517ae7..c1a0e9ddc 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -840,6 +840,9 @@ public: } virtual void TextOutlineColor(ColorRGBA rgb) { m_OutlineColor = rgb; }; + virtual ColorRGBA GetTextColor() { return m_Color; } + virtual ColorRGBA GetTextOutlineColor() { return m_OutlineColor; } + virtual void TextEx(CTextCursor *pCursor, const char *pText, int Length) { dbg_assert(pText != NULL, "null text pointer"); diff --git a/src/engine/textrender.h b/src/engine/textrender.h index da7760ebb..f2f01aa68 100644 --- a/src/engine/textrender.h +++ b/src/engine/textrender.h @@ -77,6 +77,11 @@ struct STextRenderColor m_A = a; } + bool operator!=(const STextRenderColor &Other) + { + return m_R != Other.m_R || m_G != Other.m_G || m_B != Other.m_B || m_A != Other.m_A; + } + float m_R, m_G, m_B, m_A; }; @@ -129,6 +134,9 @@ public: virtual float TextWidth(void *pFontSetV, float Size, const char *pText, int StrLength, float LineWidth, float *pAlignedHeight = NULL, float *pMaxCharacterHeightInLine = NULL) = 0; virtual int TextLineCount(void *pFontSetV, float Size, const char *pText, float LineWidth) = 0; + virtual ColorRGBA GetTextColor() = 0; + virtual ColorRGBA GetTextOutlineColor() = 0; + virtual void OnWindowResize() = 0; virtual float GetGlyphOffsetX(int FontSize, char TextCharacter) = 0; diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index 316b4de88..e2d0bb754 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -511,12 +511,15 @@ void CUI::DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, cons RectEl.m_UITextContainer = TextRender()->CreateTextContainer(&Cursor, pText, StrLen); RectEl.m_Cursor = Cursor; + RectEl.m_TextColor = TextRender()->GetTextColor(); + RectEl.m_TextOutlineColor = TextRender()->GetTextOutlineColor(); } void CUI::DoLabelStreamed(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth, int AlignVertically, bool StopAtEnd, int StrLen, CTextCursor *pReadCursor) { bool NeedsRecreate = false; - if(RectEl.m_UITextContainer == -1 || RectEl.m_X != pRect->x || RectEl.m_Y != pRect->y || RectEl.m_Width != pRect->w || RectEl.m_Height != pRect->h) + bool ColorChanged = RectEl.m_TextColor != TextRender()->GetTextColor() || RectEl.m_TextOutlineColor != TextRender()->GetTextOutlineColor(); + if(RectEl.m_UITextContainer == -1 || RectEl.m_X != pRect->x || RectEl.m_Y != pRect->y || RectEl.m_Width != pRect->w || RectEl.m_Height != pRect->h || ColorChanged) { NeedsRecreate = true; } diff --git a/src/game/client/ui.h b/src/game/client/ui.h index f98843d78..6ab98544f 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -126,6 +126,9 @@ public: CTextCursor m_Cursor; + STextRenderColor m_TextColor; + STextRenderColor m_TextOutlineColor; + SUIElementRect() : m_UIRectQuadContainer(-1), m_UITextContainer(-1), m_X(-1), m_Y(-1), m_Width(-1), m_Height(-1) { From e0f7a0d64fb46e80dd5591e20817cd39db86018e Mon Sep 17 00:00:00 2001 From: def Date: Mon, 9 Nov 2020 09:10:25 +0100 Subject: [PATCH 072/144] play command: Only quit when demo exists (fixes #3283) --- src/engine/client/client.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 3f8c154c6..d11acdf86 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -3706,6 +3706,13 @@ const char *CClient::DemoPlayer_Play(const char *pFilename, int StorageType) { int Crc; const char *pError; + + IOHANDLE File = Storage()->OpenFile(pFilename, IOFLAG_READ, StorageType); + if(!File) + return "error opening demo file"; + + io_close(File); + Disconnect(); m_NetClient[CLIENT_MAIN].ResetErrorString(); @@ -3780,7 +3787,9 @@ const char *CClient::DemoPlayer_Render(const char *pFilename, int StorageType, c void CClient::Con_Play(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; - pSelf->DemoPlayer_Play(pResult->GetString(0), IStorage::TYPE_ALL); + const char *pError = pSelf->DemoPlayer_Play(pResult->GetString(0), IStorage::TYPE_ALL); + if(pError) + pSelf->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", pError); } void CClient::Con_DemoPlay(IConsole::IResult *pResult, void *pUserData) From 225787ea39e7363fb0f5668cb81a70ee0c4f90f9 Mon Sep 17 00:00:00 2001 From: def Date: Mon, 9 Nov 2020 15:38:55 +0100 Subject: [PATCH 073/144] Fix invalid server-assigned utf8 names with (1) prefix (fixes #3269) --- src/engine/server/server.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 27bfd4464..4e916c9a2 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -394,7 +394,9 @@ bool CServer::SetClientNameImpl(int ClientID, const char *pNameRequest, bool Set // auto rename for(int i = 1;; i++) { - str_format(aNameTry, sizeof(aNameTry), "(%d)%s", i, aTrimmedName); + char aNameTryBrokenEnd[MAX_NAME_LENGTH]; + str_format(aNameTryBrokenEnd, sizeof(aNameTryBrokenEnd), "(%d)%s", i, aTrimmedName); + str_utf8_copy(aNameTry, aNameTryBrokenEnd, sizeof(aNameTry)); if(IsClientNameAvailable(ClientID, aNameTry)) break; } From 06c2e0af506b159f4ffc9cf48797a02c8a379551 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Mon, 9 Nov 2020 21:24:06 +0100 Subject: [PATCH 074/144] Fix server browser columns --- src/game/client/components/menus_browser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 492195a04..4ad59de6b 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -461,7 +461,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_PLAYER)) TextRender()->TextColor(0.4f, 0.4f, 1.0f, 1); float FontSize = 12.0f * UI()->Scale(); - UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPlayers), &Button, aTemp, FontSize, 1, Button.w, 1, true); + UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPlayers), &Button, aTemp, FontSize, 1, -1, 1, false); TextRender()->TextColor(1, 1, 1, 1); } else if(ID == COL_PING) @@ -474,14 +474,14 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) } float FontSize = 12.0f * UI()->Scale(); - UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPing), &Button, aTemp, FontSize, 1, Button.w, 1, true); + UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColPing), &Button, aTemp, FontSize, 1, -1, 1, false); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); } else if(ID == COL_VERSION) { const char *pVersion = pItem->m_aVersion; float FontSize = 12.0f * UI()->Scale(); - UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColVersion), &Button, pVersion, FontSize, 1, Button.w, 1, true); + UI()->DoLabelStreamed(*pItem->m_pUIElement->Get(g_OffsetColVersion), &Button, pVersion, FontSize, 1, -1, 1, false); } else if(ID == COL_GAMETYPE) { From a77e3ca84229b72da9b5f7b92cf2b596f191c6a3 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Tue, 10 Nov 2020 04:38:15 +0100 Subject: [PATCH 075/144] Remove some "if" checks from shader(check at compile time) & cleanup --- data/shader/prim.frag | 15 +- data/shader/prim.vert | 4 +- data/shader/primex.vert | 17 +- data/shader/spritemulti.frag | 8 +- data/shader/spritemulti.vert | 26 ++-- data/shader/text.frag | 16 +- data/shader/text.vert | 8 +- src/engine/client/backend_sdl.cpp | 215 ++++++++++++++------------ src/engine/client/backend_sdl.h | 6 + src/engine/client/opengl_sl_program.h | 3 +- 10 files changed, 164 insertions(+), 154 deletions(-) diff --git a/data/shader/prim.frag b/data/shader/prim.frag index aeb40cecd..b96745d21 100644 --- a/data/shader/prim.frag +++ b/data/shader/prim.frag @@ -1,5 +1,4 @@ -uniform int isTextured; -uniform sampler2D textureSampler; +uniform sampler2D gTextureSampler; noperspective in vec2 texCoord; noperspective in vec4 vertColor; @@ -7,10 +6,10 @@ noperspective in vec4 vertColor; out vec4 FragClr; void main() { - if(isTextured == 1) - { - vec4 tex = texture(textureSampler, texCoord); - FragClr = tex * vertColor; - } - else FragClr = vertColor; +#ifdef TW_TEXTURED + vec4 tex = texture(gTextureSampler, texCoord); + FragClr = tex * vertColor; +#else + FragClr = vertColor; +#endif } diff --git a/data/shader/prim.vert b/data/shader/prim.vert index 113cf0f7d..ed95ae49f 100644 --- a/data/shader/prim.vert +++ b/data/shader/prim.vert @@ -2,14 +2,14 @@ layout (location = 0) in vec2 inVertex; layout (location = 1) in vec2 inVertexTexCoord; layout (location = 2) in vec4 inVertexColor; -uniform mat4x2 Pos; +uniform mat4x2 gPos; noperspective out vec2 texCoord; noperspective out vec4 vertColor; void main() { - gl_Position = vec4(Pos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); + gl_Position = vec4(gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); texCoord = inVertexTexCoord; vertColor = inVertexColor; } diff --git a/data/shader/primex.vert b/data/shader/primex.vert index 1aa7fc875..58877a5ec 100644 --- a/data/shader/primex.vert +++ b/data/shader/primex.vert @@ -4,7 +4,9 @@ layout (location = 2) in vec4 inVertexColor; uniform mat4x2 gPos; +#ifndef TW_ROTATIONLESS uniform float gRotation; +#endif uniform vec2 gCenter; noperspective out vec2 texCoord; @@ -13,14 +15,13 @@ noperspective out vec4 vertColor; void main() { vec2 FinalPos = vec2(inVertex.xy); - if(gRotation != 0.0) - { - float X = FinalPos.x - gCenter.x; - float Y = FinalPos.y - gCenter.y; - - FinalPos.x = X * cos(gRotation) - Y * sin(gRotation) + gCenter.x; - FinalPos.y = X * sin(gRotation) + Y * cos(gRotation) + gCenter.y; - } +#ifndef TW_ROTATIONLESS + float X = FinalPos.x - gCenter.x; + float Y = FinalPos.y - gCenter.y; + + FinalPos.x = X * cos(gRotation) - Y * sin(gRotation) + gCenter.x; + FinalPos.y = X * sin(gRotation) + Y * cos(gRotation) + gCenter.y; +#endif gl_Position = vec4(gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); texCoord = inVertexTexCoord; diff --git a/data/shader/spritemulti.frag b/data/shader/spritemulti.frag index 37a5a6433..787cc7d68 100644 --- a/data/shader/spritemulti.frag +++ b/data/shader/spritemulti.frag @@ -1,6 +1,6 @@ -uniform sampler2D textureSampler; +uniform sampler2D gTextureSampler; -uniform vec4 VerticesColor; +uniform vec4 gVerticesColor; noperspective in vec2 texCoord; noperspective in vec4 vertColor; @@ -8,6 +8,6 @@ noperspective in vec4 vertColor; out vec4 FragClr; void main() { - vec4 tex = texture(textureSampler, texCoord); - FragClr = tex * vertColor * VerticesColor; + vec4 tex = texture(gTextureSampler, texCoord); + FragClr = tex * vertColor * gVerticesColor; } diff --git a/data/shader/spritemulti.vert b/data/shader/spritemulti.vert index 36bd10893..9e1d06ad1 100644 --- a/data/shader/spritemulti.vert +++ b/data/shader/spritemulti.vert @@ -2,10 +2,10 @@ layout (location = 0) in vec2 inVertex; layout (location = 1) in vec2 inVertexTexCoord; layout (location = 2) in vec4 inVertexColor; -uniform mat4x2 Pos; +uniform mat4x2 gPos; -uniform vec4 RSP[228]; -uniform vec2 Center; +uniform vec4 gRSP[228]; +uniform vec2 gCenter; noperspective out vec2 texCoord; noperspective out vec4 vertColor; @@ -13,22 +13,22 @@ noperspective out vec4 vertColor; void main() { vec2 FinalPos = vec2(inVertex.xy); - if(RSP[gl_InstanceID].w != 0.0) + if(gRSP[gl_InstanceID].w != 0.0) { - float X = FinalPos.x - Center.x; - float Y = FinalPos.y - Center.y; + float X = FinalPos.x - gCenter.x; + float Y = FinalPos.y - gCenter.y; - FinalPos.x = X * cos(RSP[gl_InstanceID].w) - Y * sin(RSP[gl_InstanceID].w) + Center.x; - FinalPos.y = X * sin(RSP[gl_InstanceID].w) + Y * cos(RSP[gl_InstanceID].w) + Center.y; + FinalPos.x = X * cos(gRSP[gl_InstanceID].w) - Y * sin(gRSP[gl_InstanceID].w) + gCenter.x; + FinalPos.y = X * sin(gRSP[gl_InstanceID].w) + Y * cos(gRSP[gl_InstanceID].w) + gCenter.y; } - FinalPos.x *= RSP[gl_InstanceID].z; - FinalPos.y *= RSP[gl_InstanceID].z; + FinalPos.x *= gRSP[gl_InstanceID].z; + FinalPos.y *= gRSP[gl_InstanceID].z; - FinalPos.x += RSP[gl_InstanceID].x; - FinalPos.y += RSP[gl_InstanceID].y; + FinalPos.x += gRSP[gl_InstanceID].x; + FinalPos.y += gRSP[gl_InstanceID].y; - gl_Position = vec4(Pos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); + gl_Position = vec4(gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); texCoord = inVertexTexCoord; vertColor = inVertexColor; } diff --git a/data/shader/text.frag b/data/shader/text.frag index dc8ba3ca3..8254a3f8a 100644 --- a/data/shader/text.frag +++ b/data/shader/text.frag @@ -1,8 +1,8 @@ -uniform sampler2D textSampler; -uniform sampler2D textOutlineSampler; +uniform sampler2D gTextSampler; +uniform sampler2D gTextOutlineSampler; -uniform vec4 vertColor; -uniform vec4 vertOutlineColor; +uniform vec4 gVertColor; +uniform vec4 gVertOutlineColor; noperspective in vec2 texCoord; noperspective in vec4 outVertColor; @@ -10,8 +10,8 @@ noperspective in vec4 outVertColor; out vec4 FragClr; void main() { - vec4 textColor = vertColor * outVertColor * texture(textSampler, texCoord); - vec4 textOutlineTex = vertOutlineColor * texture(textOutlineSampler, texCoord); + vec4 textColor = gVertColor * outVertColor * texture(gTextSampler, texCoord); + vec4 textOutlineTex = gVertOutlineColor * texture(gTextOutlineSampler, texCoord); // ratio between the two textures float OutlineBlend = (1.0 - textColor.a); @@ -29,10 +29,6 @@ void main() float RealAlpha = (textOutlineFrag.a + textColor.a); - // discard transparent fragments - if(RealAlpha == 0.0) - discard; - // simply add the color we will loose through blending FragClr = vec4(finalFragColor / RealAlpha, RealAlpha); } diff --git a/data/shader/text.vert b/data/shader/text.vert index 9e1d2b0a4..b27e76882 100644 --- a/data/shader/text.vert +++ b/data/shader/text.vert @@ -2,16 +2,16 @@ layout (location = 0) in vec2 inVertex; layout (location = 1) in vec2 inVertexTexCoord; layout (location = 2) in vec4 inVertexColor; -uniform mat4x2 Pos; -uniform float textureSize; +uniform mat4x2 gPos; +uniform float gTextureSize; noperspective out vec2 texCoord; noperspective out vec4 outVertColor; void main() { - gl_Position = vec4(Pos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); + gl_Position = vec4(gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); - texCoord = vec2(inVertexTexCoord.x / textureSize, inVertexTexCoord.y / textureSize); + texCoord = vec2(inVertexTexCoord.x / gTextureSize, inVertexTexCoord.y / gTextureSize); outVertColor = inVertexColor; } diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index d4dde4447..911a74219 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -335,6 +335,11 @@ void *CCommandProcessorFragment_OpenGL::Resize(int Width, int Height, int NewWid return pTmpData; } +bool CCommandProcessorFragment_OpenGL::IsTexturedState(const CCommandBuffer::SState &State) +{ + return State.m_Texture >= 0 && State.m_Texture < CCommandBuffer::MAX_TEXTURES; +} + void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &State, bool Use2DArrayTextures) { // blend @@ -387,7 +392,7 @@ void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &St } // texture - if(State.m_Texture >= 0 && State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(State)) { if(!Use2DArrayTextures) { @@ -1009,7 +1014,7 @@ void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &S } // texture - if(State.m_Texture >= 0 && State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(State)) { int Slot = 0; if(m_UseMultipleTextureUnits) @@ -1063,14 +1068,6 @@ void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &S } } } - if(pProgram->m_LocIsTextured != -1) - { - if(pProgram->m_LastIsTextured != 1) - { - pProgram->SetUniform(pProgram->m_LocIsTextured, 1); - pProgram->m_LastIsTextured = 1; - } - } if(pProgram->m_LastTextureSampler != Slot) { @@ -1102,17 +1099,6 @@ void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &S m_aTextures[State.m_Texture].m_LastWrapMode = State.m_WrapMode; } } - else - { - if(pProgram->m_LocIsTextured != -1) - { - if(pProgram->m_LastIsTextured != 0) - { - pProgram->SetUniform(pProgram->m_LocIsTextured, 0); - pProgram->m_LastIsTextured = 0; - } - } - } if(pProgram->m_LastScreen[0] != State.m_ScreenTL.x || pProgram->m_LastScreen[1] != State.m_ScreenTL.y || pProgram->m_LastScreen[2] != State.m_ScreenBR.x || pProgram->m_LastScreen[3] != State.m_ScreenBR.y) { @@ -1616,7 +1602,7 @@ void CCommandProcessorFragment_OpenGL2::Cmd_RenderTex3D(const CCommandBuffer::SC if(m_HasShaders) { CGLSLPrimitiveProgram *pProgram = NULL; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(pCommand->m_State)) { pProgram = m_pPrimitive3DProgramTextured; } @@ -1861,7 +1847,7 @@ void CCommandProcessorFragment_OpenGL2::RenderBorderTileEmulation(SBufferContain if(m_HasShaders) { CGLSLPrimitiveProgram *pProgram = NULL; - if(State.m_Texture >= 0 && State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(State)) { pProgram = m_pPrimitive3DProgramTextured; } @@ -1946,7 +1932,7 @@ void CCommandProcessorFragment_OpenGL2::RenderBorderTileLineEmulation(SBufferCon if(m_HasShaders) { CGLSLPrimitiveProgram *pProgram = NULL; - if(State.m_Texture >= 0 && State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(State)) { pProgram = m_pPrimitive3DProgramTextured; } @@ -2065,7 +2051,7 @@ void CCommandProcessorFragment_OpenGL2::Cmd_RenderTileLayer(const CCommandBuffer if(m_HasShaders) { CGLSLTileProgram *pProgram = NULL; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(pCommand->m_State)) { pProgram = m_pTileProgramTextured; } @@ -2192,6 +2178,37 @@ void CCommandProcessorFragment_OpenGL3_3::UseProgram(CGLSLTWProgram *pProgram) } } +void CCommandProcessorFragment_OpenGL3_3::InitPrimExProgram(CGLSLPrimitiveExProgram *pProgram, CGLSLCompiler *pCompiler, IStorage *pStorage, bool Textured, bool Rotationless) +{ + CGLSL PrimitiveVertexShader; + CGLSL PrimitiveFragmentShader; + if(Textured) + pCompiler->AddDefine("TW_TEXTURED", ""); + if(Rotationless) + pCompiler->AddDefine("TW_ROTATIONLESS", ""); + PrimitiveVertexShader.LoadShader(pCompiler, pStorage, "shader/primex.vert", GL_VERTEX_SHADER); + PrimitiveFragmentShader.LoadShader(pCompiler, pStorage, "shader/primex.frag", GL_FRAGMENT_SHADER); + if(Textured || Rotationless) + pCompiler->ClearDefines(); + + pProgram->CreateProgram(); + pProgram->AddShader(&PrimitiveVertexShader); + pProgram->AddShader(&PrimitiveFragmentShader); + pProgram->LinkProgram(); + + UseProgram(pProgram); + + pProgram->m_LocPos = pProgram->GetUniformLoc("gPos"); + pProgram->m_LocTextureSampler = pProgram->GetUniformLoc("gTextureSampler"); + pProgram->m_LocRotation = pProgram->GetUniformLoc("gRotation"); + pProgram->m_LocCenter = pProgram->GetUniformLoc("gCenter"); + pProgram->m_LocVertciesColor = pProgram->GetUniformLoc("gVerticesColor"); + + pProgram->SetUniform(pProgram->m_LocRotation, 0.0f); + float Center[2] = {0.f, 0.f}; + pProgram->SetUniformVec2(pProgram->m_LocCenter, 1, Center); +} + void CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand) { m_OpenGLTextureLodBIAS = g_Config.m_GfxOpenGLTextureLODBIAS; @@ -2215,6 +2232,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand m_LastBlendMode = CCommandBuffer::BLEND_ALPHA; m_LastClipEnable = false; m_pPrimitiveProgram = new CGLSLPrimitiveProgram; + m_pPrimitiveProgramTextured = new CGLSLPrimitiveProgram; m_pTileProgram = new CGLSLTileProgram; m_pTileProgramTextured = new CGLSLTileProgram; m_pPrimitive3DProgram = new CGLSLPrimitiveProgram; @@ -2228,6 +2246,8 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand m_pTextProgram = new CGLSLTextProgram; m_pPrimitiveExProgram = new CGLSLPrimitiveExProgram; m_pPrimitiveExProgramTextured = new CGLSLPrimitiveExProgram; + m_pPrimitiveExProgramRotationless = new CGLSLPrimitiveExProgram; + m_pPrimitiveExProgramTexturedRotationless = new CGLSLPrimitiveExProgram; m_pSpriteProgramMultiple = new CGLSLSpriteMultipleProgram; m_LastProgramID = 0; @@ -2251,9 +2271,26 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand UseProgram(m_pPrimitiveProgram); - m_pPrimitiveProgram->m_LocPos = m_pPrimitiveProgram->GetUniformLoc("Pos"); - m_pPrimitiveProgram->m_LocIsTextured = m_pPrimitiveProgram->GetUniformLoc("isTextured"); - m_pPrimitiveProgram->m_LocTextureSampler = m_pPrimitiveProgram->GetUniformLoc("textureSampler"); + m_pPrimitiveProgram->m_LocPos = m_pPrimitiveProgram->GetUniformLoc("gPos"); + m_pPrimitiveProgram->m_LocTextureSampler = m_pPrimitiveProgram->GetUniformLoc("gTextureSampler"); + } + { + CGLSL PrimitiveVertexShader; + CGLSL PrimitiveFragmentShader; + ShaderCompiler.AddDefine("TW_TEXTURED", ""); + PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/prim.vert", GL_VERTEX_SHADER); + PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/prim.frag", GL_FRAGMENT_SHADER); + ShaderCompiler.ClearDefines(); + + m_pPrimitiveProgramTextured->CreateProgram(); + m_pPrimitiveProgramTextured->AddShader(&PrimitiveVertexShader); + m_pPrimitiveProgramTextured->AddShader(&PrimitiveFragmentShader); + m_pPrimitiveProgramTextured->LinkProgram(); + + UseProgram(m_pPrimitiveProgramTextured); + + m_pPrimitiveProgramTextured->m_LocPos = m_pPrimitiveProgramTextured->GetUniformLoc("gPos"); + m_pPrimitiveProgramTextured->m_LocTextureSampler = m_pPrimitiveProgramTextured->GetUniformLoc("gTextureSampler"); } { @@ -2471,65 +2508,18 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand UseProgram(m_pTextProgram); - m_pTextProgram->m_LocPos = m_pTextProgram->GetUniformLoc("Pos"); - m_pTextProgram->m_LocIsTextured = -1; + m_pTextProgram->m_LocPos = m_pTextProgram->GetUniformLoc("gPos"); m_pTextProgram->m_LocTextureSampler = -1; - m_pTextProgram->m_LocTextSampler = m_pTextProgram->GetUniformLoc("textSampler"); - m_pTextProgram->m_LocTextOutlineSampler = m_pTextProgram->GetUniformLoc("textOutlineSampler"); - m_pTextProgram->m_LocColor = m_pTextProgram->GetUniformLoc("vertColor"); - m_pTextProgram->m_LocOutlineColor = m_pTextProgram->GetUniformLoc("vertOutlineColor"); - m_pTextProgram->m_LocTextureSize = m_pTextProgram->GetUniformLoc("textureSize"); - } - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/primex.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/primex.frag", GL_FRAGMENT_SHADER); - - m_pPrimitiveExProgram->CreateProgram(); - m_pPrimitiveExProgram->AddShader(&PrimitiveVertexShader); - m_pPrimitiveExProgram->AddShader(&PrimitiveFragmentShader); - m_pPrimitiveExProgram->LinkProgram(); - - UseProgram(m_pPrimitiveExProgram); - - m_pPrimitiveExProgram->m_LocPos = m_pPrimitiveExProgram->GetUniformLoc("gPos"); - m_pPrimitiveExProgram->m_LocIsTextured = -1; - m_pPrimitiveExProgram->m_LocTextureSampler = -1; - m_pPrimitiveExProgram->m_LocRotation = m_pPrimitiveExProgram->GetUniformLoc("gRotation"); - m_pPrimitiveExProgram->m_LocCenter = m_pPrimitiveExProgram->GetUniformLoc("gCenter"); - m_pPrimitiveExProgram->m_LocVertciesColor = m_pPrimitiveExProgram->GetUniformLoc("gVerticesColor"); - - m_pPrimitiveExProgram->SetUniform(m_pPrimitiveExProgram->m_LocRotation, 0.0f); - float Center[2] = {0.f, 0.f}; - m_pPrimitiveExProgram->SetUniformVec2(m_pPrimitiveExProgram->m_LocCenter, 1, Center); - } - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - ShaderCompiler.AddDefine("TW_TEXTURED", ""); - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/primex.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/primex.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pPrimitiveExProgramTextured->CreateProgram(); - m_pPrimitiveExProgramTextured->AddShader(&PrimitiveVertexShader); - m_pPrimitiveExProgramTextured->AddShader(&PrimitiveFragmentShader); - m_pPrimitiveExProgramTextured->LinkProgram(); - - UseProgram(m_pPrimitiveExProgramTextured); - - m_pPrimitiveExProgramTextured->m_LocPos = m_pPrimitiveExProgramTextured->GetUniformLoc("gPos"); - m_pPrimitiveExProgramTextured->m_LocIsTextured = -1; - m_pPrimitiveExProgramTextured->m_LocTextureSampler = m_pPrimitiveExProgramTextured->GetUniformLoc("gTextureSampler"); - m_pPrimitiveExProgramTextured->m_LocRotation = m_pPrimitiveExProgramTextured->GetUniformLoc("gRotation"); - m_pPrimitiveExProgramTextured->m_LocCenter = m_pPrimitiveExProgramTextured->GetUniformLoc("gCenter"); - m_pPrimitiveExProgramTextured->m_LocVertciesColor = m_pPrimitiveExProgramTextured->GetUniformLoc("gVerticesColor"); - - m_pPrimitiveExProgramTextured->SetUniform(m_pPrimitiveExProgramTextured->m_LocRotation, 0.0f); - float Center[2] = {0.f, 0.f}; - m_pPrimitiveExProgramTextured->SetUniformVec2(m_pPrimitiveExProgramTextured->m_LocCenter, 1, Center); + m_pTextProgram->m_LocTextSampler = m_pTextProgram->GetUniformLoc("gTextSampler"); + m_pTextProgram->m_LocTextOutlineSampler = m_pTextProgram->GetUniformLoc("gTextOutlineSampler"); + m_pTextProgram->m_LocColor = m_pTextProgram->GetUniformLoc("gVertColor"); + m_pTextProgram->m_LocOutlineColor = m_pTextProgram->GetUniformLoc("gVertOutlineColor"); + m_pTextProgram->m_LocTextureSize = m_pTextProgram->GetUniformLoc("gTextureSize"); } + InitPrimExProgram(m_pPrimitiveExProgram, &ShaderCompiler, pCommand->m_pStorage, false, false); + InitPrimExProgram(m_pPrimitiveExProgramTextured, &ShaderCompiler, pCommand->m_pStorage, true, false); + InitPrimExProgram(m_pPrimitiveExProgramRotationless, &ShaderCompiler, pCommand->m_pStorage, false, true); + InitPrimExProgram(m_pPrimitiveExProgramTexturedRotationless, &ShaderCompiler, pCommand->m_pStorage, true, true); { CGLSL PrimitiveVertexShader; CGLSL PrimitiveFragmentShader; @@ -2543,12 +2533,11 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand UseProgram(m_pSpriteProgramMultiple); - m_pSpriteProgramMultiple->m_LocPos = m_pSpriteProgramMultiple->GetUniformLoc("Pos"); - m_pSpriteProgramMultiple->m_LocIsTextured = -1; - m_pSpriteProgramMultiple->m_LocTextureSampler = m_pSpriteProgramMultiple->GetUniformLoc("textureSampler"); - m_pSpriteProgramMultiple->m_LocRSP = m_pSpriteProgramMultiple->GetUniformLoc("RSP[0]"); - m_pSpriteProgramMultiple->m_LocCenter = m_pSpriteProgramMultiple->GetUniformLoc("Center"); - m_pSpriteProgramMultiple->m_LocVertciesColor = m_pSpriteProgramMultiple->GetUniformLoc("VerticesColor"); + m_pSpriteProgramMultiple->m_LocPos = m_pSpriteProgramMultiple->GetUniformLoc("gPos"); + m_pSpriteProgramMultiple->m_LocTextureSampler = m_pSpriteProgramMultiple->GetUniformLoc("gTextureSampler"); + m_pSpriteProgramMultiple->m_LocRSP = m_pSpriteProgramMultiple->GetUniformLoc("gRSP[0]"); + m_pSpriteProgramMultiple->m_LocCenter = m_pSpriteProgramMultiple->GetUniformLoc("gCenter"); + m_pSpriteProgramMultiple->m_LocVertciesColor = m_pSpriteProgramMultiple->GetUniformLoc("gVerticesColor"); float Center[2] = {0.f, 0.f}; m_pSpriteProgramMultiple->SetUniformVec2(m_pSpriteProgramMultiple->m_LocCenter, 1, Center); @@ -2639,6 +2628,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Shutdown(const SCommand_Shutdown * glUseProgram(0); m_pPrimitiveProgram->DeleteProgram(); + m_pPrimitiveProgramTextured->DeleteProgram(); m_pBorderTileProgram->DeleteProgram(); m_pBorderTileProgramTextured->DeleteProgram(); m_pBorderTileLineProgram->DeleteProgram(); @@ -2652,10 +2642,13 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Shutdown(const SCommand_Shutdown * m_pTextProgram->DeleteProgram(); m_pPrimitiveExProgram->DeleteProgram(); m_pPrimitiveExProgramTextured->DeleteProgram(); + m_pPrimitiveExProgramRotationless->DeleteProgram(); + m_pPrimitiveExProgramTexturedRotationless->DeleteProgram(); m_pSpriteProgramMultiple->DeleteProgram(); //clean up everything delete m_pPrimitiveProgram; + delete m_pPrimitiveProgramTextured; delete m_pBorderTileProgram; delete m_pBorderTileProgramTextured; delete m_pBorderTileLineProgram; @@ -2669,6 +2662,8 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Shutdown(const SCommand_Shutdown * delete m_pTextProgram; delete m_pPrimitiveExProgram; delete m_pPrimitiveExProgramTextured; + delete m_pPrimitiveExProgramRotationless; + delete m_pPrimitiveExProgramTexturedRotationless; delete m_pSpriteProgramMultiple; glBindVertexArray(0); @@ -2989,8 +2984,11 @@ void CCommandProcessorFragment_OpenGL3_3::UploadStreamBufferData(unsigned int Pr void CCommandProcessorFragment_OpenGL3_3::Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand) { - UseProgram(m_pPrimitiveProgram); - SetState(pCommand->m_State, m_pPrimitiveProgram); + CGLSLTWProgram *pProgram = m_pPrimitiveProgram; + if(IsTexturedState(pCommand->m_State)) + pProgram = m_pPrimitiveProgramTextured; + UseProgram(pProgram); + SetState(pCommand->m_State, pProgram); UploadStreamBufferData(pCommand->m_PrimType, pCommand->m_pVertices, sizeof(CCommandBuffer::SVertex), pCommand->m_PrimCount); @@ -3023,7 +3021,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Render(const CCommandBuffer::SComm void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderTex3D(const CCommandBuffer::SCommand_RenderTex3D *pCommand) { CGLSLPrimitiveProgram *pProg = m_pPrimitive3DProgram; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(pCommand->m_State)) pProg = m_pPrimitive3DProgramTextured; UseProgram(pProg); SetState(pCommand->m_State, pProg, true); @@ -3315,7 +3313,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderBorderTile(const CCommandBuf return; CGLSLTileProgram *pProgram = NULL; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(pCommand->m_State)) { pProgram = m_pBorderTileProgramTextured; } @@ -3351,7 +3349,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderBorderTileLine(const CComman return; CGLSLTileProgram *pProgram = NULL; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(pCommand->m_State)) { pProgram = m_pBorderTileLineProgramTextured; } @@ -3390,7 +3388,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderTileLayer(const CCommandBuff } CGLSLTileProgram *pProgram = NULL; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(pCommand->m_State)) { pProgram = m_pTileProgramTextured; } @@ -3431,7 +3429,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadLayer(const CCommandBuff } CGLSLQuadProgram *pProgram = NULL; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + if(IsTexturedState(pCommand->m_State)) { pProgram = m_pQuadProgramTextured; } @@ -3628,8 +3626,11 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadContainer(const CCommand BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferID; } - UseProgram(m_pPrimitiveProgram); - SetState(pCommand->m_State, m_pPrimitiveProgram); + CGLSLTWProgram *pProgram = m_pPrimitiveProgram; + if(IsTexturedState(pCommand->m_State)) + pProgram = m_pPrimitiveProgramTextured; + UseProgram(pProgram); + SetState(pCommand->m_State, pProgram); glDrawElements(GL_TRIANGLES, pCommand->m_DrawNum, GL_UNSIGNED_INT, pCommand->m_pOffset); } @@ -3657,10 +3658,18 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadContainerEx(const CComma BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferID; } - CGLSLPrimitiveExProgram *pProgram = m_pPrimitiveExProgram; - if(pCommand->m_State.m_Texture >= 0 && pCommand->m_State.m_Texture < CCommandBuffer::MAX_TEXTURES) + CGLSLPrimitiveExProgram *pProgram = m_pPrimitiveExProgramRotationless; + if(IsTexturedState(pCommand->m_State)) { - pProgram = m_pPrimitiveExProgramTextured; + if(pCommand->m_Rotation != 0.0f) + pProgram = m_pPrimitiveExProgramTextured; + else + pProgram = m_pPrimitiveExProgramTexturedRotationless; + } + else + { + if(pCommand->m_Rotation != 0.0f) + pProgram = m_pPrimitiveExProgram; } UseProgram(pProgram); diff --git a/src/engine/client/backend_sdl.h b/src/engine/client/backend_sdl.h index a686c53a7..2eec8a9e7 100644 --- a/src/engine/client/backend_sdl.h +++ b/src/engine/client/backend_sdl.h @@ -170,6 +170,7 @@ public: }; protected: + bool IsTexturedState(const CCommandBuffer::SState &State); void SetState(const CCommandBuffer::SState &State, bool Use2DArrayTexture = false); virtual bool IsNewApi() { return false; } void DestroyTexture(int Slot); @@ -310,6 +311,7 @@ class CCommandProcessorFragment_OpenGL3_3 : public CCommandProcessorFragment_Ope static const int m_MaxQuadsPossible = 256; CGLSLPrimitiveProgram *m_pPrimitiveProgram; + CGLSLPrimitiveProgram *m_pPrimitiveProgramTextured; CGLSLTileProgram *m_pBorderTileProgram; CGLSLTileProgram *m_pBorderTileProgramTextured; CGLSLTileProgram *m_pBorderTileLineProgram; @@ -319,6 +321,8 @@ class CCommandProcessorFragment_OpenGL3_3 : public CCommandProcessorFragment_Ope CGLSLTextProgram *m_pTextProgram; CGLSLPrimitiveExProgram *m_pPrimitiveExProgram; CGLSLPrimitiveExProgram *m_pPrimitiveExProgramTextured; + CGLSLPrimitiveExProgram *m_pPrimitiveExProgramRotationless; + CGLSLPrimitiveExProgram *m_pPrimitiveExProgramTexturedRotationless; CGLSLSpriteMultipleProgram *m_pSpriteProgramMultiple; GLuint m_LastProgramID; @@ -353,6 +357,8 @@ class CCommandProcessorFragment_OpenGL3_3 : public CCommandProcessorFragment_Ope CCommandBuffer::SColorf m_ClearColor; + void InitPrimExProgram(CGLSLPrimitiveExProgram *pProgram, class CGLSLCompiler *pCompiler, class IStorage *pStorage, bool Textured, bool Rotationless); + protected: static int TexFormatToNewOpenGLFormat(int TexFormat); bool IsNewApi() override { return true; } diff --git a/src/engine/client/opengl_sl_program.h b/src/engine/client/opengl_sl_program.h index c09542f35..ab7821682 100644 --- a/src/engine/client/opengl_sl_program.h +++ b/src/engine/client/opengl_sl_program.h @@ -45,13 +45,12 @@ class CGLSLTWProgram : public CGLSLProgram { public: CGLSLTWProgram() : - m_LocPos(-1), m_LocIsTextured(-1), m_LocTextureSampler(-1), m_LastTextureSampler(-1), m_LastIsTextured(-1) + m_LocPos(-1), m_LocTextureSampler(-1), m_LastTextureSampler(-1), m_LastIsTextured(-1) { m_LastScreen[0] = m_LastScreen[1] = m_LastScreen[2] = m_LastScreen[3] = -1.f; } int m_LocPos; - int m_LocIsTextured; int m_LocTextureSampler; int m_LastTextureSampler; From 83674ec335e2e2a5efa6dddec4f1e6175290866c Mon Sep 17 00:00:00 2001 From: def Date: Mon, 9 Nov 2020 23:24:00 +0100 Subject: [PATCH 076/144] Update 0.7 mapres (by saltyElefant, fixes #3288) --- data/mapres/generic_unhookable_0.7.png | Bin 138807 -> 173074 bytes data/mapres/grass_doodads_0.7.png | Bin 103895 -> 138860 bytes data/mapres/grass_main_0.7.png | Bin 156043 -> 190542 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/mapres/generic_unhookable_0.7.png b/data/mapres/generic_unhookable_0.7.png index 1b1024f7f7efec19662fca96eb03486043ac413b..62e5dd79bcc9f971d64c049507f5d543f79766fa 100644 GIT binary patch literal 173074 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�{34<10#L0l}LrUG+>%S=+=+p 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 literal 138807 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

T-rDER%>3x`Ynp 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

R|c{R^MrbHqLS6e<$@Paz1GxC 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±1_?D%|iRXT*I6f~Q4EH~S@`^T}29 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 diff --git a/data/mapres/grass_doodads_0.7.png b/data/mapres/grass_doodads_0.7.png index 8aad832dde482da460afe2990f9a398f89e43873..5ace3bb2356abc6c4b0e3b7d0a8650004fdcead3 100644 GIT binary patch literal 138860 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%0D!--j#NZQTL6edM6AaA>R_?D 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

vU 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 Kso<_z!2bgbTo!=< literal 103895 zcmYJacOaGT|37}6;~b8Ch-^+nSs4u@>lh&tCD|(_lAVxojx7ll8f2uXD3ra1hyHB%zVpshtuuH0_2Yxn z5JBzC0=2)rZs6zlzUdkq;n)|M7g(!@I`6y(0@(n-^L=Hs3Ge7b@5TfClG5&2C?L$( z4}B76xPb7^?iKXar~mtk`M(=WO7MTruIl6%GigFF=pO_qBp4rAOolE29O(4;x!r%H zq?)obnLi?}nsUWGkPrF-3tZ>9ncshQg=$UQm3nr3$wzC?bo(upXcY9N@<|rZ!8}+I ztR+A){?pC!pv+& zd-1u1k7)syB6r6FFd~h#q}0s3a}@5IbUQ(H_k9>3%na|~#ho*XHg-Sy-?Wq&i5<;L zRvG7JRAH`K&{GI7iJP_6Sx;G+T&O+9I$2bEvj2|6rMI4y<)IOKUMLFb)|%C=QgVI8 z55ZG*WeHsAN}@vT4Ni@(nCg z^V7Ne=YK*fO=bT1SzpaqoHp6rHY^anGl@%0o!DAQ2FgRw9XNhT*QQbM#Q_Cbc#7cv zR)&@``XemF4%S$J`rn}@(W?`Ukq!g70i)}8zvSAN#BLM4LVQT-LH@?D{DDqp#8N=U zTWSih)CELZ85~vI%&5Y10!DeM-Pt3i|)rlyBg)O*gQEYv%rYvjoYh_`qQ+5K%Hnhd{8&{ zxI_H|$C)Edhie@U*F{&{y(iXDefHhmmR9qHrj3b%4t=xtxeF3f-z+X3(_bkc2;Df| zU~_YEb!T$tKDFwpw)U@;?~m{5O83YB19wF$9gzL8{( z`@QY%nxqEN8Iy~7k6)FP>^XAeh=g8qMcuIvAq+zr?`0T9d+n>$?UQUN0kujz?NM6s zNbpE%d$qi)Gu-0>O-%+6&1p6TY1UW!l2yo#5 z${f%u@x2^ORwSrpXC@E8h9m!p(-~kNQd|T9x{K;(4}cKxIuGaw8On&<3~V~2n4g^2 zRF+vF|CWsO3Kws_OLC#_9E&BA6k<;bffSWd|1@fuXWF(kP=5$`dmHU`CHCBj9glgd z-#iV+wuIOH#u0;U0N#yOqXdX5^f@FzDAF5b0fw6cC;}r`#d8g$JEi2YGaPe6S|L>L zheTr9Ko#N}_wg24*CWtu9y z;UGp3lHHk+c-$l$tWp{hc- z+&)3ZT@KKMNFozD_ZcE(>4yn`T81F1)bT=!^VSqZjl@n43H@EN;QUg!f5K2?VZEARBN)fPJ zg#$PrBNNqnjVq6M|F$6JQqOH0{Wii;g(p6vQRRa6s64;PWTORMj8o6-w7EWUHj;ImkQad5HPA<{2_mH ze&X=Wh3`tZWeo~-u^K2ho!sQaAf7kq&4}mmQUjmM(B07$(r*DC8;2v-2D;a=x??u? z#61vRWInu*2~Z8|=nif=Hg!*DI?FS88iOtijvGy~ZLeg`b*wGZiJ1S*$zL~p(N;S` z^QkF7lxDCh-Q7|kq_&Zkwx#rUL~*WZg_@RnPdOnizMM{aznDLQn@Lg+eeNi(bL))w zo0kHDoh7HP1iyLt_KnctSuxF4f-^9w3N3y2+pu#b?Si;aV(Nt?r*PiOjJiqcVm+|r zFb%8^w7QD5(?+`(nsiG zao-3I44x?7{d;5KWdKuze6mdPVfu#ryxxWmYVSKP zVTTTBys=VSNUS5ACe>IAl-UdCk{Pb;BwYQ#2Qr+jFES*EVD<L;`4Z16GHf6&RoaU zZ*{UV>;r6WGQ?d22#Rh@w_)(nd`@}9srQC&C^$-ffI?xn8Fh<~ORwt*yC%9mH*0E9 z*-D31SO3v1F_b}+RN~@fO(7f3Pa5Eu%^AQEI3~c!*R*ou;pDu~K0^V}v$P`Ih!Rj% zYVnL?hUgn1aVQg5{*A;)7Ik{tslfWMUO1*YK<+uFvL8_p;JER|z&0&raNnw?AXq%- zUDyPvrvuGq|9XO5f1lVr&oYbX@^_C_{5zJNQdr&O9)H<6@X24ny^0X4SMinsMSzYs z*|F2jqL069M`DhjMH1stYxkb-1*WG*?&56wdu~mzV2*L%rLoRrQ-V88+4cMYO<%bL ze+L`-%a}GCGkh0yaWwi2y`a;&jIOc$`V;EHbj(Z)sgtrz^Ld%SSdCB)<;F4Dm0-0% z-QsMGF-&=HnhpGgbg!JJuTRtCr2dc3sZ!-|;97HEF&^CMo%z*aj0U_$`|kzmsq3ZR zxpbg%`a9>0!pL)8dL4NDr zv+E@TWDO;lEGiqv;wJOho8BNNW#o-x8PJRi8Ql#@;rz-Be;m4=a;oWuROd=a&lOn= z*9V+VZ!Fy-|14WAnE7o6%72q8fUvr(JOkY;38!SbP^2b?!>lvMut~Gj&Rm-&>h$0@ z7X)AIztsk#W0fj6v`dk3eM{bGQ-;IEJg4Vzt(Y^?@^txo_sbug+p3scPcXag%Qup~5#)#7*#hcSy9?Zk>1e}2*$gu_yNWzA} z3@IkBIQppViH>b+$Z_*Ajun7(|K8?2i@i4f+s;?JJX0z-!%MN1ryF8)B|m)EufMb= z>ZEskIs}tpa?WH^RkDnAw(`JDnhg@WYzD;dh#gjL+P1)yR(k#B%MSYD@%^yg)6s07 z0k?qu5bPtH26@x(*Miv+VRO7@D%^@@V!ql8BT6zF1+!xINf$4i8n=qP9-#qh(F{)$=fPDL;PS zd@VlxxxVG`Vm6dm#amThP5I|p2};22Tl;Un`aTR%G-+$5hjsq#^8?hmsJlek`sIfJ z_0xAgBYW-7d&Nq9vc>xJq2p|Em&c`@i#?1UnYz*ze>DmaFGjbKh$31y51`tYC7PTT zl9klxEU;O>S-rXNE`mAQ^srb4})Qp}_HHSAuc09d*Rl2{zwc)ww% zhnqR|1gG&=>W$6MHr<}J5(~RPV-+Jd3LEp)q zO+XSgWI!|XcmKA}086mnVWAl1Um>)CN+{I`WP>I6&vg79dNquh7ajoRE@xeFWw)l` z`PxU1(b>xvd~vK@Kaa1&XlRstWF5#IR&G2+8Sf(P1Zw6Lkwhr)y#OLuqt%v&GNUe%M(DFK@n%EO|Cagzj?Dzk z{V3O^`QuUcz8t95)V8_dKW?X3kE1WDimi!)f}J|E2*{@Qz|KffeqiCd+A;8p60pV9?diJcbVTujW*fK>W*TWAB*TIC8yCC6xD17UiW3frozb&{ha~CqTzRUI?~`Ey6f%}L$)%~M(ylzlo%9x1}1IJ3o)W0ixqJOj&X4E*|_n( zL7uPU`(~PJecOJ&ZoO@FmPf>XQ0FH70|mqN;v{|h9B@pYc1guD4$$e>lQ}?pCqJHI z`cjP7Ha6kQ+b!~q6XBVE1!ta7)AVd-^0wbA#*o~?6javPYgytl`&j+_ZaAwj_o1wE z`@>Fm-F5jPAZpQgVs4*9{mI{(vL9vJ2Ldsg%R@IYTz0zoM>|? z#Y*GA;x+uw=Uoc{b+QM$$PGd!iP%V~q*qpp8dA*hQe8zeWwg_69NnnKh@P$xKW{3f z2#ywmS_zrKkx4I0U>OtpaR2rHe3hQEg)D>7@b?IeG&J)0rY79)fMv+Vb9QS}pMRCe z6`y%Jp>=6$#)g$Ub&#kRCXvA1ut*3C3!DC@=o_|BvV{}F!}Gb2L>>X~O9qIdXY%x6 zR2KnIRsht$41Nt9+VsBeD=h$u&w<8+d1>%`*2Shh6z2M6K|pT%%OV2Di}ge+tjCs5 zqEoWG%0e8^<|Ch$d=1hLbxJsbPL7fus#lAC;^EhA1yk0Z?+BmwI6*X1Hc8m%AN_LA zX7+Wh?1@yj_PQlnX|Ph#c2NQe+1kpGq+bh53@PSJeosiw#eXAG)8c zc<>V4wDd7+n|Q}yE2J9&;34r2R-xQE?v7q)I}&?H5G*A^rA;mHyzUd^ZW_Y1ed6$J z9;rDf#OKc*&exqnXK%^f*IlmU*sgDEbSv&W`#3O|+(y`jlh4QPXvM8+%K%2uv*tf% z-t~uUF1=QbWBR}20AAsiR}oMZfx7&wk}Lnt+I;=G$>{|ltc)$eXYKSrblJfO$A;zC z>l~H~?+7J$k^QE(*zuD;Sf=ugCOVXIElWN22*2wEU3WXxs@694=-G}40*R1QVA(|Q zto%t%fxz+$zRjN7BfU9!u`~MnJIY3UbY5ktYauTeMswnOoF@*j#qHZ&DNP_HHn3LQFy?aC#sHGoT_rXa%H`&5@b~tXlkK$g#K_oCGI5>N zvcAoFR*gqO<45DQzWVO(LBEI2K3er3eYxG)tbW{YL_}oXyvq(uc3Lz_AhG3bgfJM@ zO#n=$NtRqEZaiInAxRrEieoZQUxY9i>@sEcnb_hxZmVk{!Q3~$*6gt^o4e+-mSksl zQ7ZKS^$1(RNNL;KPepj42EyUy@N1jV+oO%rxnme~T!G;@jO@3S8B%8hLveQ6$wZwK z3GvnbA7Zf zayxb0;pY5z0=r(|WVC^?n(Gr#tsGRB+o2hYWo^G5_|B_ZXxHZlv1@ zMJ&PG=4^AKPk0a9kc>~>D$1Hf%~;!pSbiBCvoAibT64VdMb)1^{by?jqZn+kWf3|< zE2c!V~<(>iGD*t@yP?_Y&lNDB-4L%W1lHY_f8;-+;04)PP zE7HA@#BCl)Mbhh{g>80{{KsD~6jRs45C&cY%TPNkKgD^|H)51>ZB`#G`miRzN?#XN zkfOjLzqlbj@=W6aR>nSQ>t0_<^ewbUW8z^U?}cw)Hx5VN*ZbSz+BNr=EBH>oPF4;f zw%nhqKkDB05&VpPYX|R5WZPjXT_{>y;Wr%f9*Qfjx@fb;7T&8R)H2KGGE?i3LoqXO zAtG4-grI+M|MN2!1&oaq5-Vv>;80$im8G$pS?WjSa*>3FElaS9UK|InV zT*q@T|9JF|ZOWA&9(z;~|3U`D$$`(Zba@%C=lU5c#Z?%|r2S<7%?ggVwK+jQB=DU4 zeFgS0Hh-Z*o5yXEP`$C7NcT)#SWqmUb0C?GD)(`YEizp&0!JMCs+G8JMRLTw63778 znnLdD`_L>fXM!_~@0n=zw@>S^JlEi8ZIz|pclmlg^AQwMqLD=}9zwY+U3s>;td9Hk zaGMAw%a-NPx>gAgK6+yG?{;M%EZ-ld%xrPU8LTCcusd7MB@@}K6M@>=D(i>r;FWD8 z%AP^CLv3!JY=MKUleM6$7Y@b*0Nia$X^Qi;|yEM68!ihfY#2)y4HXGu&%nhDX8oJ1WiqR@M^Lx|8pMLlc?X8b{e5`ce zTnKHaRL9gnp?Zz(?iDLr#q~2d|KOwf^<0eMw4H%o1}jRw31O*8+ja{*O)JFY zNJr3bxiY0TwH}OK68#Cs^kbxi9_j_a(PpKTV?q6Lz^JcpZP|IT8toeZBjaG?VcIt7 zhJ^M>xnb3*vRhMkst|$y2X!L_90H?$C|bwa=Sw(*bYIz!-_~={aK5GxPw;>b5hp zZ0CqMi(C9r6SYAIy&gZeKjA~F?yc-^r$WyjvAkZ;j5!0XMSG^W9@Glh<86PYIE^JH zWXA0R5|6mkPqkhBHK^{lxF!+5>pdD%2r{1^WSKWV@JQ<|VBeT9X-d!eE!LgS5u5P9KH&o$JXC_zp#TinLiE!+Q0BBCcA#Bx}pABsnYleC2 zDY%EC<7A8BAk+wZjT3L{Jy?RB+5difRxQ22PdJ_vzi@YV z0kwb($IPH-oyc$yS3nkk4AZtvM+i&=K#&{c4R_%#=wcH3#s8ir;&$)hN7+tN{{NfM z`^bqnsbu_hOcugy>os}N+U1{sLg|ixW(Us)_)}gmBp&N;@d%TEyYlS^w=dlQIddkU z^xc*hVkb}f8H563UP$9Lpep5WIHcEeDl>EM`<$nB=*6W7;?kz6M9`Qtw&H+bgu5VU zzAFVI$g@ijE&^eRLeehox>yUSdxU^EJ`5TX5iW&C?1g6Ux`R{R#cnT*Ov8y{|E(8V zic6cW5LlXo6ZigGBKW-&1cRRb;33Ya1JoK&zOXd_RapN|2vyQ$&cwYB?5u4akv!6ydJORhw0aClq@NY>V2%ua_ zNeHa(PL_xHQ4zktb}2fruoVf|TqU9DL}fuU5RPM#g+NKo;#gr!P{*q`-l6UTjM%o8 zpxrP@uLYLpB^jB}zEpJfAfeVp9n@>cdves31I?KtB{NhqvbvnDR8xhsK zk_>sx^PuvGU9&y%cZzjDwXE`Ca-nQ`KebmBM06T zF1uS_IA>?xS>pYwzB={VoY>3e3X!xL)@nq0ji#1AZN@&1W;Q7czRszCZRkYe{U|Q% zmN2q!V~Y}`jhJT{(2B$t<8_odb7A+5csF&lYs()pVUHs1{v;r=gK4pyi=#AXlL`=I zIPubaZEGqVpY-_^s1-K(Q58byIkA4^f^}pJkEHD3(z4Kptr)lsPu#4pB6+s~7TpYy-=~7hxy;XHXKdx@SA(y^N~A)L zV{jgcS2HrKLw-N>doGq19p0;umG?zZt1M-&qVrk#i)Dq}*)@Fns;Vm``Q5YjVMv$L zCVZArrSI4maZSUJdu%y{ACSgwK`Ir&#t;OzCH#tn!0*Y8vR(21q%QVJQ(0<-ez!cp zcK8yKJI?H6>cSqqVW9}}z3_pd>67H8s|%2bEic3H=@1-G_k)5Enga+jzPtrA<@9&q zq?YFk-7W|2L>CH56hyTZy{WwZOH{)O8`&&>$C6*BWaxUnxkGhGuUz_~i?!8NM-SH_ zy=^E#dWiYzB4DxGbqjX{GZYe&AJYeQ$!x%(XT-h#&5$~|nAL_GR*d&1OFrT;CUaS8 zb?7X6u+aV^FfQAopY5fz-uZ55{AprZ$l@h7EmO2N)gW$fJAnZ0$b zXzB~4uyg8YTxtm;unznEb7r6_{-kP+rGmnXZ{BL3`?a^HoRKn!OKF_j!i~vr$^aQM zrv1bwL|j+C05q2+UAkr#_#?~^RDz8xZxIE-D^Z*l67X$4(~M^ZQTSH9GiespRNlWDp)@Ll_S@XSA>u)y|WQk8A z!DXQu@{z;_ z!#HClXd2R`Kv~M7975{h&%J3jjtJL=VYVV*vPNqX0ESc9XSkU0<-DnS2ei1$0J1$2 z$Eeq(JZ$0-f?NsgQ77cy(2(dbgYSh>Cw4ixJM{`| zn^*Eh(>5X`w1Ji|LJ0 z+k5ce*PyWU&yN%NQ#kQnH^2Pyo)fJ_01Zu7X2F3w=&gYjTj0+}M!Ki$CM#5Chy~uQ zFsj2%tG(mMpZC)2|NJshD++352?3Vq8{R{H?+|V`8(;s{xGqCuL6e(z8@V-z@% zNiItfX5Q)L9XH$J9~wjt)ek<3kBrbvW&6ER)F`sATZx04g>vqP5C|EYNpe6=w}%i!Xm^ z;$5E^uwJ6|~dO~~TpXSc+Pw9yyt%QA6@0oXSx`$b={%`eU-43Ytk>mHG z#&F`X!d9nRWRhjev9Zo7F8S=9;LUa_374|2pQ(F3}KCb}sGL=fOYw zX4M#P1|AT2aSA!V3~0ReFw7YBkNW2T`u`*;1rK}|*teCz#;i~9kkh^Rt-_2jmTswN zZ2K-ExN`zwTI!yarX=Ga=f^p+RKIJQ9Y-`#Zcll{Pntqqsh8Cg+mdXvXJOks;<-Gz z|4HjiCldRao3LprniC$+v7y4v1S`LLiaQSgtcpe37mcdNkWga{wQSnG+|#%t>M ziMW;Az`-gUvD8GCW2TkhPo7yJQkF{*CKgr($*JCC_ zGd^!#kwCU2^o?HmjtSX$_@2j6f~`C50czXk))8=loha-MDd_X=#c*kER5p?cE0E7U zMI{I#@xq@uB|qxWa54UFya=**+~}&)VjAXc$DW#~&j#9F#5e^}b#`!!?LwEDs_Ug8 zGiGjZ=P8ULeVm-mmA%%uchh_Q*E@W2_qCIbQC!{|X`gc= z+1M%B)z?Q)&#Czoew$PM)ctMFt9>@O^3peZ`{rvBZ|vVkSNoF8+0rt^lyEP-J+B!@ zTcZA_rMvSkTO7DZ(Wz#9e@ICF4%?IgCu0Z-V7cgunb===30Hlgq(w;+%)hb8lRTwx zA|W3eHn?);;FA>}sa9M*Cti5pVA*6>+|mjZU|b!6A^wtG^(Av5n@+pUita-Qrcy1G z1|VEhRG_5ElXk?VaNncfIKM1AYUj!iKDt@Ldi_s0UEnq7x|5KhQqej`mbD8!8G-kE zHC*Gqrw#Vtt3A{8kITsW$f^0U?0*{>>jFmNu%y(s?dfG28&rPvNj^3>buX8(o54ZG z5`wRP=QAzIv*k2!QvLl^X2Cu3KT3j1M=eM)YcaR^Oca0b#mEX~n4=gj_gbWMzl-5Le|#Q2q>8?tnbz z&3!KC-CRUos;&jGmzC&^Fe|yXjgY`~dTY8V&aqA;ckBdi%Du^RHRj-$jntQIWB1MI zF*jX5dzmhq?X{gf&OP$%J8&ePY7gb0u270h)MC&Z2nL)|_0~>nBt#zgBrD_`dE3ll33`v*_Ox=uF?hvxQ@4Lp zlw0k2y3O`Vc849`2S~&T5NkaXA_x5CPik`h-2|C!0Tm+nrCofl1La`-0} z8Mdjv%Tu>@Dz4Nf6Ux&RxTYrH5@OtPo9%AMnkj=3oJms%_0=|g+ML%X-1Y2?69h_J zg#5==9Z=Tgfk-0^#`a0aU%J~nhsMGWyvbeH6q#~KWcVwh`gkcCm^;VHV03TPA41~yLZd_3@$k}UT%i3Db^O9nEkk$4)}HQ$6^B*YjE-Ed zRIE4lgTKZFeUUMCDMSkrxXa4JM5E96{CL-P3gy9V{-$z~NO_eHk1~1)Qcjt+T^i{f zTTr_RrGqhzV%gR+!y$hy2CbRHd|S+CF%W$Q__sHGkEC9yB{0QMJ9mtxH4ywqZL!bF_m$~+Kp zXeLS;Dp!H`%y{UbPX#V|ugcj97}|2H*#f|}Ov+4>?bgZ*9)n_!;k_ACbct}m9C-s> z$SR5;tHAtM@8(CK7vhe-jCH|VLIqXU@^TERb5(`9ep9NEKxcgFf=^ea8k(|LiO%BW&%eRzgo;^kMEG@Gd0 zvKM;oOS6Xq&PcJj$rZ+4I(@cVHw2=$>_2);b7}JS?=E5w#YG-qv^$Tk**wFDnlh$) zTS)GwRoUpi_CPCphD_4kUbYDkBWPNJmxF$efbQ;AW~)flp0l_bf$uz@SdeykQS`X< zwn&{7;m-DEo}`v^!x29t&-L=3RO5311%Xl!BBKQ8+z{hv2GU0**m?P8f`K9swLiPB zy!s<`u@1ZpUp~EgtnjH;82_Y>Y#Si}hN-Hod>#a&DuyDv?rz@6I&W=$bb%}1gY#?8 z=&YLuQ4d)VRjltltEJCJYip^cegC zU_Uz&&sFAqvC)7ci=(Zjz-;_?-UBNhad-F@Y<@0D7!)TCQ8tiarwT+i zKMfM;p8YnK|0KXvgg*U{So&_J_@7RbPb1b1g}~?AR*%)>v8<7C%vuicN^rp93%{#k zy2EmJxS;-fKdU)wJO5|SibCl&+nR6bJ$B&E!?MKrMri4v0pO!b4!-L8vZQueBwlLU*PNwF4g+n0J%xXx@^lLtTJAgg87ZAX* zzO#9m5j%Qpds%I;;IuRPZLF3h@3tgD8xCR6Fo>5(nR)M5ml(tM8K?*90{vTlTLD1964m|f} zx3sY-?ze^*JjlgNh`kZ!FK1;2R^(UAC3-}=<>e~;u*kp0Zuorj+IW}FD7Zs~qwC7h zQ;Be{((!Vn>X)Iv4Oc1#&!N7mRo6BffbKXLrqOgR-}Zi?*)3WPWOEBtUUu%r&E<&R zh0(Q@XKosY@(5NC2lKupLvWEoY6ifD;&Pi0BEF^1@PlcMl*ztQ{$x(TtW9 zj(c{Fqu;VptnCwUiEzL#!hjIHBzd|)D_m(;D@w1o>Anouq(6Nk1k&fJWseee*@k0r zxKsaVhd%tQ z872Ln)??m63^#lj&Eg6SK+uvSr$E{%32AIo54sm>IF!LD*3>pa12iRJMjs~_WZ-_5 z6L||EL9sWY81^t%-WEug9W#Nj!~Ir*9SjJ&+akv=$Kl$Q>Dfa6IIX@A<4PQo8Mz1{ zqtJNHLqrk8TmY^%%!h)AZ7G?f#7-!InOt*(8yXzgy3%@N8`vc?X8 zRFq=&YL{1o9pSnT5k_vjzvU9qyp?0L`CT^mP}<<411#N08hdI?nt1=$NXCFUJJF;6 z$qF1*79+(N7XoM;EyNDU$YDz0-~w&K5#URxyhe}(E{VkBq?ah9NEn8@bMZ8ane0YW zQvz6C=4~Z#98y?_s0!`6AkdTD9o@Ff$d+*CUW@aREw~XzSL6U9_~IAg?097YK;lh; zp%D4l@*mEMUlwqLAhA3M8G&OXCE=ClVBi&s*$izU50VJ-X=ZrAgdW()+wpK&B|n-7 z+WCde?#RUX_xt(yWc#DjIa($-!70d71fXWO60a#QW$AW1N62Bzu2t@!& zn6GFea}9Ie7Q76~QQ3uuwHO5<5fAoS)H-DWC1RSMdad|13J_??qcl*@hDbwCpdLGd zS`H=y66Y$MJUPfCP!`7da1g>~)TcVjuWX+ceWI4a%F|tV`+<}WZ=8*n5VY;C{TlRQ zHyE&|SzL#K-HChB5;>KJl){fdJ`k$XsCj%)cZWhM1wb3}`*_m7p*9{|!CPE_k*|pV zMuIZ~&iA4=wt4?TVK@_V4OcGj0@-Oe>Km8h_({J^X<|t_Qh&uDl&8x`^FoW`45ZR} zGXsNgK+%Hs7DD)*n&N}8w`0avH0Hgp&56!@>NNGDrbmb{mfq(#jqb9CL!Y@jo;y-@z!P~oGKgvUAY zbKoUsUx%b~084ijMcDjM-DK_fqa2r%u>J=g#xaEPC9 zFklf2$9IyLMRT70kxduU2|^5>zZNM?x1r8k)8sTmW$xNmNS@yym9%5RU%ybx24XJn zhZ>dWE^j`9oO?k8aDz1*%(o}HkoORNT0;AQ;)`MtH&{Uiy)dlt#!AxudOjx z5X6cI^B0vQZabAi%zS(J7%ao&nhV~*Sg!u#H-^WLaxZ!F>~lYb>6xG0JIas{+KkkP z=_hjPVl59MD#X!;&o8oji{RkCX^3f|d!u~? z^*8Tgi%u#W^J+5iU-}m~9v(nQyj8s|LI0(KX%s5h?VHDWLBe26LOn64*^%aU%b8a$ zdG!o)NepF5OT0sB{6SjRvgB_(NRnz{?tD}P$A42ujev$Qy`n+IN2 zJVsrD`NJyV(rsBj4VSU~T~#|h7vHudL|J|N9c3gbuKR}R`)0+}3tyvG@`CVOU zOW)1()CYU=ZE=TnA57x^BV1ec`@#x>(_CvX!aUs>~Bt#d+^m5|yyS#pQxVTmnvor4%5)|F< zoSa0B7@rpiJxl4{9Kc8;@rT}0d4(vp39V+>+X?&00V#7VUe54UHq$KRl^)N5=Geen z5kFWN*A%>L2?3maxyK%Mq{=_ni(R>EK!|xpK2tOX1C;)|gpxrn0^27+HOTav2KHgp zrHdD02Q>u23zXxN8cO6kOOy0*5T|W}B)&n>ABqY9wXR6+`%a)%29^pmj=ab2X1iSS z{eQc!F4b8~E|R0rH#x3!^t`#Rh+zC~HnHJnc)ZR0^;mpAaoxLDlJ>IZ{6gM;H z=r=cr^qzYN9cr+L`HRqnWFD8RVeJ(-)z6VkvTOe4cbW+e#+~N<0#OW0&{7Z2ZKS>G zjid6)c|NWu@#l^w+#UYC0+fF1}joQ}+g=5Hu1wQZp4Q!2Hhve;O~;?PE0U zBK^4fwB0z%fBVDa*pEGH4Rn<8h`L`%P9%VzzXD$4M+~!-w{jCPXrJKK`vR2Ax6QT?L?AcI7BPS)Nv=)3m{;dzUaMYvyJb!+jkO}pGS~D$3=~; zEZlnH3W)130JZ2&k<(bndxL}T0X6cvBqu&~_#^d5>=ynRsgZ>lrN#(vPk;4Y&_J?Z zM`eamn$=?UE>~1tW3Ddx!8_;H#lxBVzUXTTHu|0{(j9lU6ktHj@3<{BgT_wi6b}K~ z_WxSVpJoz59alfZw3msOz5f2w3V+LVeDA<{u*=mFPBX{C%AFJZ!W#4h0F;Y#Wi>2x zIsmfvxGj6eC8a{lCO67JPY&qt_<>8OcCuZ!Wa zXUDuEC<1kyy4-iUYznllu=0NF{2aZs2-|i2tnjB|g;ms*Mk`yG1rpyU0rMTw*%Phe zSdX!)d0n%Njh#jI; z0BXETzXPZrBmC#U4SECJ?;kJ%Rnh46cH&3n(+sGn!<}k=JIRYi;*-jt?))O|f9*En z{P&*8fLGFne@pzXY2J}^sr``M0B z`jdUIVwHXpbPnq|zpJXH+$&Ai(zdOw@o-+58&s3J&ngaNV!?sR;7&#RhNwM9oGPCD zR&qR(rmd5fd{xIZ?TmcUZ7azFwg4ov`O~D#{j!@sc~kicB|UpGsJy5HZfZu~JTB82MX9rR();040L+!>4NK>7HzPqRj`Qc(1&$#+ z{dcb&f7*uEzSog+5J|7Xh@esBR$Rr%=aiIA^_krQ{BQOGVkPjOWF*^kV7IcIr_kIb#VnN&w!R^h$8 zTL4rcZ2h#OinRr<>oeTX>hVs0$BumT*-A-$&vAR^`&83<)$q4d&%V3B3tk2YWn7+f z53_7i9O{TwZCQ(RZpG^~XOtfet+-pkOmZx+9-6IOKhj!&w2y%~Gznaj8!tupDhf1JB z_#C(Vo3|EQy|0beN_%SiaCcn`32Q97k=7U9h$rKk_m@q`FYiR>sHI!E`#(B?=8o61 z{Zr$0qmBzJ$lqx9Skh(~JbGVjY%NL(%^9M=Y(DmK^vzII@qt59#FqxWodO?;i^=^y1~M zn5lfZc~uB(6R@~XWl?e=?$2|Uik(BN|6@9R7-+t&sLC7t^OD7Ix%m3&H zU=&?awB+sF!WCUYgn)o+>>mraywi_Fq4X1jO6BJw`n)1^zhkgFZ)BUkZvTilyZ2?o zi4ommnGI2NervNFIOvlHb0~YYG02Ihe0l%eVt=pHg>b2t4vgUDMTKlaVY7X}zCMa# z2W7_mr0U0_Cosd0W7oQsf+>Q6RBHGEOYt9kwq>c%k-tB}0_Sdg&=D#K*tT;PA(V>~%ylHzo6eQ8g((UKH)zYBh&4#` zFB9|P{;^DtRR9OqY61;X7S}FxGFYG!4V}~EHO#@_Di`O+i}Y>lX?K_bn{go9B)VBjd>t8ddiU*$YSaFd;ia3J&&XqSKI;d)CSsG zruUH4c+(=egnI?{^+sf zQ|S;Ji|ekwKJrL6VkJmNe%z<)VbXi#sf)J9yum=16Y1AxvQeQ>wExFNcs{SCW$$B6 zU7t4H1$BSX4JrWz30DCmxB5o3W3YL8G-mdFDeg2I$2e-!wZF|{^!}+6vq4KMSMt^0 zWN9vRhDJ0sr|4N-Ip?l-vW`az(FGk+YjTWyt#$lql?}Es@!OTzx|?RO>#ED)eToNT z2i5}7Co|?*chG|1AaL1|R{-&TI-|%3ro0u+HhfusW|-3bUQFoqcG2PN zoaJ$iKE^>y*6_f~=V&_^PQ01sRgOxQ?>>s2CrZ_aXWtLqU0lc(jS@n&Q=&HO_o7e6 zS!hm|mY@MI@Uz%cUC5g+9bNNnQ;SbBlmQ4A7W9}g9EL@oN}4Tvw$D+R&k#7T>c z_Cg!2f@@iwmM8u{roKE7$}jr+nPF_B>|4m7WT#Y?$k-w(Bt>>YWltj8jC~E2HL|pj zvdg}Wz3in(*0Cnr*au_gz52fI@Av*!cE*TFo;m#O8(L7qh19T#=c zK$b6s0S8PMVr4S6PPslGg15Ad?b+utkWvM0l2TMj$5b^i8K-esLBZDZ%bnlPf$9co z26-lsKGaMz(eO03Ha?&%|H8(@WBylKlNS3hkM04ewk3RE!`Z*57$Zt<}Jun_iedA{O zKjfD+N>r(4XMK#fU&f?J7V|xwOy!!a)l~{qq+^p#)|n-$tnk@6!)-+GgGM$3+S#f< zlG|0UEU%2K=8C*jZ#u5l@@x(*Ss_$jewn64H+`NWf7n&JJ+VbstlPw$@^jwhf?Qr_=>h}4; zCF9=IwYn1L_OAeQ<>Gw*VSb_w=4b7;@wXQvUi`e%TH#rxe*GRZXUNAwqxLoz()Zo{ z@4Oa>zXaL#*rTqo7!K$Htnpc@sc$t8Orcnb3?DW+xy3sWO8J$M+ROLf4W&q<<2g2l zv7-PoNsN*%vX-H-`P4Q+jCo?-5{+-`n~?kykl~TJ8LS!j(2Ag3xho@L5bS;F`r=o$)Cij*(S3Djb(bk zN@_37SPza@HP18FZl7FCC6h%AE;26{;uW5R+_Oy*(J*{H*AGgborZTXu2v(8SFkuwuaK4k$^}zIU zWmBCb^kPURTT_3;qFg6iW8)+FOr8{zuU;R-KP_{z^!}gd>xd)<&Nq5OD&d!TJlX#z3NF(V-w>&tq7y)%l?Z0+Q0t`j_XU^T{VGxD5hb;d0lG|K%nHSTsgEc{Ei*}s z#b+UK8(D#frUl&)1daf=0t{HgtTBgxq5oxp&KbIr+J8&uh<-W>EeG_P7@$G-|F}Vs z%ApeN|CmQ@2qXhJFb^Q3K=YG73weR*+7JBXM+hQOhzUm`(rnX{gdWM<#7|oP6AIeB znu#I_MVi1%pf48*0&uqwZyY{Mn%V^N;UZshjaejQfntx~MEb)}LV-9qs!E89 zeC$7oQ-|0S9bwEYfGNH*#@Ptmh%E0Au8^QdWLide_^>`{Z7AurdDY4zE3%}HMPSe1 zRoBPADv=i6L8*R@&I2tLY(l1>#%N@Xgjm)&IH4N0W`Y~B3CIB~p>qr72Y^c3!V)}) z7>+h;DP@`$cKWy{M3MSSZ-u~cTzFMC1TNU@BWlq*&@<`pFXNnjk4YN|Nb}VDYz|0h z`iNcOH~2|H0R&cE$kq@_&?3fLgKY0}NvMpD!qr?z5Yh=+4(oM)_33CtTKr@k9KBRs zbJJ_8>27!LODZ!^lr0Iq35YB%g}zuOwl*~b<-$g?e+JIXjtIv}wqWi7G@sdpe3aU9IC8ZM&Ith4(nlCd8?9uxx&}yNn11ShlP?LceCjnzG=qCX?tfG?8 zxemhGRQx}R?jyti05`M2YYY$z{V7g}$A+kX6R>qN6eC;=e)H~S3LH1Rm+}TeeIoROO6vxH zeZ9i*l)=OJu(crSw%w`m>@jv23-Qp8nY;=;>m@i&^f6GGn#4_bcK!zS z&#k?eKgPbE$ydx$HH^C1dbwy^)%+9LM_-`82vhA?xZgVN^mA?1GA}TmLM9hoCh<~K zbh281-?|yN>Ww|{pPM8G5{t>1#EF5t`1TOiqeXxWf{>6d8~Is1JH*)^l5w=g68R8n z=|4(2{!xmjP!lid;FRYaT%gF7waJ$RH&ci&dJ0n%G&SjfBJH-06ZsE0GO0X#Xr8oM zl+Yv4atzphK~ntJTnHO{ByJ`}35c0�mXgt=s=8a80zyk%D2V4!8s166}6-#@h88 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 diff --git a/data/mapres/grass_main_0.7.png b/data/mapres/grass_main_0.7.png index 03532e7795ea9ac2a2c909e972ced29b1361d8a6..ec07ff9bfa7b04307a54d0286e00ec1531c74949 100644 GIT binary patch literal 190542 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�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⋙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 z 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

$gX6xDCL8`6RvqVucXCy;C_!o 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­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

K+B5}NDi+y@Yk7h=s z1?4EYEbnz|(!%jMiRu=AE_yw%AOn^WC&gGyLkw7ssM*0w)_o&0 zPLf6~edGs9=^5J?@fv5c$Y$#U@)+KOAb}h50`h!_V9pu zqbdSm*z*#Dy(F|NsVjtTKk2oUwRxW zrUHUwR60`S&WEmlBiHU`S@*ZYx z>?)TV3D8`BeDM9ChXexDw~7KuAdQ(pp@jH4CWj*V)HkMk0Hm>JS}*0 z(KU3|<2h6@+O9Kr-*^+T;B<&qT`4$nO(=}bz^8H;Pkt7N^Pe0NZIL)XaK`W1Pjo<# zgBD=K{m3X#wg_@cgGJmGJ4kC^EV+okUpfcp}EZ5Z>+^bn9DVZKi*3OI`EH3Ga zwV-IHHzWFV`JVmc&GxIyUaZ)+gII%q6wg*_JP5c-Hwo0*s~}bH$)q`&7L7O$41V_Y zRy408|Hr`M{J78p3_!?_^2$`ea1T|<<$nrGkOkTsF%8Z5v%)d&Q!ga)XrX$#w+_ey zyDb>uO_?5ZUV(MTpNOP2robmAgus~*eNLd=ozX`7UxVOH-13)dPfQNP4Sp8_(hr(Y zH@KuI`$8(h&w}eey(}>NDq4~vXiINuG`Uc?^m&JXZ31pI-mK&lNmb5i+ZKyUlT2Z+ zc!2mp{qPf_pR`4%GqhQlQJ&#=Sx|uTonK1{J?!JTU|f*-2Pxm@omHa1j$eC+e4}C0 z;?8fxn`YgdzMvP!gay~$zb=`YlUtDQK8LA$GXnPXgvb2%$OMoE3^*74KTm`MI9y?p z0Q}zB>2?9`^@riL#DTQJ&D<;Bo+-VHEaR0O2s<1Rl*zoOH@sU$z>eE14(tSEaPhQ- zZ&NyE{FP`E)(k!q%>~4FB^eRI5B4cqwj~KAQZTN?d^#5l7l~tmYVdx^L~>*UfzFIk zNqtal0ed!PhypSlL2)+ZR>E=$p&%3o{8Q;dGg2wH5tP=906O;Eb|xhICBvPIjIgk< z%OnL~5jS{ z+f+vRIR8LoNFR`cin#S6unSgu^rJ=juHsc(CjD{={QCBlcPeQT!ol&CAh^!li18ij z(+hk=I&9uWU5Q29-GdQ8XA^S;L7j5)@bJ-<5ZB~lHtZtHF!uFLx#tSK&o4&RhC^Vf zIaeDy{a?G2#eTp0LTkQ3{Fo_XPIK#=yaN= zj<54$9la0FL}$x)a1UCmFx!(lXFInc`zQxH>pj{E1jGatyW0VM7YSq+c;IRrU=$Ru zv_g&qPG{`)%xaq4PBoJ;u(9MHDPU04a1E$*MisA#gCj^uk~JL)yKS&pay1#^C-N;P z`&@*E_62C(uRRWt7;u$@YDGN%1^vGb=u^^ID#aMAKRo>O z9hYm&!=5hhjG-ufuoNp;3Rgm;s-04Wy=Yj!oE?BK_>b4eCDpg*w($wBh+o%z_36s& zBWQ<|8>6-?1yyZ8u#{=y)6xX0v5v9g7grsvF2sLYGRA_c zbMiDEPE*auC+YL66f>=|IiliNZnXsTRhpHAAm8dh=mx}GQYl)BYyPPT<1tRUol1Y9 zj2Q6t<|UM4ALDq{G*ZEa8EZmzDQ+>3eNFvoih z0>trP_~bsAoxOyBSiU?-Ouq8!a20I!!V(;G80@&>6$R@%{Wi@`)F0~5Sr=UmI2fNu zrvtA9iUq!A%)=EPHslZkA{SGi&u4nuZ$u&b2k*ejcWwfZ|CnVKq)bz*?ibs)*nUb) zY|kvA(P6k-($%ZwxnZ+-!?!re@XDU6;>jNjcWr%uU8pWx;YvOU_)s+7zJ3c<6-~gh zAW!6-DKHd;%6(l&nHDq`r;TU}9s4yuQ*(}(mc01(HT@GXMt>8EehZS~208~xfyL6T zeF(J#3|9i_qgUoyaEw|}0;a(MFs8od7e%}jm4N4mW^kXpfp&`husjgsyM6l}h|ZN^ z#EmoTPiWF&sRfmA6`OC6T?&D!+sh&VU4qQD{}>$k%aq^tTG;$Hx#wkg>jlDTQnJ)C z?3`cvh+FnwCy@hGNl!Z*yM`-9{l2;0JtC%T8A;%Ka;xS~Uv&n9+3i{B|EAt5#JEC0 zaCOxV&0HJ}Cf0DDk*cSD{na z?gRuEwh7bF>-=rI#U$6?6`Hknax%DPb`d#^?`{{-K#1sS}S61)RB z0@@D}`T0oVHpmvwgJH?Wo5`oBPvJ)uFhH(mo5|V_6=sOP0`ue+OQ{=5GaXXS% zr?5>k{dX&JhUBiWi~&17t;dXVSEnzjY>kAgUky%rDG1FZL4Q+(A}JMZfj1`*r}P|` z&<|9>M2E|6Ngl7gM=2L6ZJR{I8;H*FHb%G(o5=V04#ez*Q8|TAi(hPR6#b)#u`rYT znrT?yDeRk52kgiTi0rsd`DE4+R{;J;3A+K#uOuVyrv3GwBfb!`P?f34v@xbL zmWHJS%_P!=S3Cvq1aGC!4l*}9x74gurrZ_$rs;ZMrxKLg$CL1qSl-ymcsFQukat5ub2V>=esnmzv~t)3kWM z19z@l)+nh1-5(u(3+u_-?q*GX_wRb*{}ek+v9OIchbpR{cC-imYBn8#Q1%IDxd(jq zZ+>w+t5F#P(GN8vj#Kc);_|~>4&qt)*Y|RLGO0y4K%S^Ly~fC@0bs)Lx}-$}C~D}VTvu}cS|XR8 zo}RHrj;n^x2US*^g$DViO_xGTg#aN@$nIA?Ua#)Y@F%Eum!W;+`9aVFyIHYZ*Zax|I`-V^*mqc(QMcGE}_sJx*&e`fORahJg1r^JhbgS z5`sM0D?gnqGA7tf&LenJ2l8`=cHO;wTpx9WtE`RBO9ZNEVJiPA45&kx0R3&LE4$kx zOzxT=8Pgk=ggxl0#-P(0TlI2!qkddOKkiwO1DcrLMvT!J%o&PqCd-^6c8YY4sc*$c zKSn~OX*l-|&oDijt5gU~S|J~82>a)1r&|MYSAWZwpG5p9b&}}Y*8D#Fg>CPM&Tn(! zY=2Y7{{YrSQRdtF`8^%j5#}@d-8mWSx->QNT9f%_jyE`YYBI-MeP*7J6-W=iUF|o( zd+>T5@#}wq5P70`=McK{z}$e(96v2{w4Z4wEu(vhVC0AesDo==kz_=PkB^o1|> z5M$|x0}z+4ew1#)y)ZTRglFHFB7e~guxmKE9|FKF+XK9FK`N2i&D$RF!(pOEFH5pvR;pk>* z?7p>+LK5wH-PX&Gq0Yd`q|n3s1l%RwMIpihUMfk(Vx9_#wy>TO>1c02 zcHEE-JAWF$*8NegrSYa_iKF@)vgd1ySDnA)w>RXaANF}(fydeaq!E&ML-h+k+6-k4-I?;{tz?^{FFKP_ z;#PiMqg^{I*w79EQ~+gJm0gY_5PnRm-$;>4;6HL?M}QK(dUOVFW;pF|k2P_0bd%u< ztrZYvpn#%{Oqr<~P2S)R8P2xA9pfK0_;~rbZBG%#=MPiaO*2m@2+48dG5#i&=ASts zX#Z7)krwKzyAy1Il<~Q9%N6QM1?~a4x`J}&S+Kt7=W3B z;A@C^3`Gy>>fr1!e!up~@Dp!kQ*HO@aMfI;{1sp8j2gxexE+C$cDWp{bTJAmrH2u$ z|IDGXkf2)ciGA7(PV7 zDsNinAA$Cxu+g@!+PFiMqkh2rQWbFLN~U_;H}1sw4{6}D+pm||Awx!6nSgUWO_H~Q zBc@8k;nad-_xo$|7@jLjNu50P@p2oDmg&;bM-buT+(oFkE&uE%{3JTcmZtUfPpXe7 zy9v?nUqpH);mHb=C}dU=H1eRKj}~$T8cGnk0;FRh+K3rq1aGL^-V>>*7qp88q`Rfw zp(lC*A98!mrpvm3X0zuJoOGA_Mvy|$mS#z8o243?D0Z*XFC>jK5ON>@cceY=kLh|| zBZ+N7as(?dr#>pZVxgf01?DA32qDU>__A%XDks9fQ1i<%MP~8tVJJHj`8GNA5L0p5 zGcoyht{KbFv%{~ZeZF1`UM!t}r|H`OG_fnksjG>I+_ncL@ptF5H1nJ& zo(wmyqTNJU6tV3EE(Pf;-{okNRE8xm-#DwKiu2okt!j0ZJ;(yjJQ*G2n*sPLq2{zf z2THJHr!N`wUE)&5Ogw_8! zKZn2O)HV;riwdImS9=!i03;1^yl_lVikpUD@46{xi zmAHmemBjn{ppTNDRi7RHZx^-;u6+U9&q!(J%;^o9*%X$anR=KRLYdKB6RR72ww@g8 z8-6EjO9TN>cG+VDV0**v+5^TL`?&s%Kgg)4%MxRoBe0>x&F40h%vi_OqL7+wHP30? zft!zR%il0wcDuX`OHZcVx3Np&T}m}uK~Srea$#yxXCk1^Y}vhawhAU>zvvng zG#`Q&uo$z)>Dt`aWkN)rV2DEgr$Us7&GgvTWhyTkX%_nZ4QU5255uO!|&9f_d^wEg_i5O{-@%1Fm$vS4^ zwJl9qU^MPW#`>S#-3Vu?m(Y9 zo@m1Vr7ll8(*X24AjKYtzp-kl_wG|b>rw69j*f+}#gGM}@+^x9oNozIISu6$-Y0o~ z{nO6zR}L~94jBKQRR7miy^g;24Lf`dyr(ib_7Gnz zuMIb7tcSEvuJO6W;S@h#~0fV4udzbCrhuHWdc1J*7?JPuwgYxL8eiLr0>Zh z@1d4@rAxSVceXP%f%X0Fqg%%3*+Jk`58abm1JKQU;zBD%4dS-R|ElAj1Ms3t5tF}x zrEmfClOVpgEJ^m<6f4DQ|GmB%ZhcJ!HqtjSc*``+iTHfVe-!m%EUoKpES6%H^SWab zBz+*DS>S~nZJ}qp*{dK;1U&;SS_2N*SQT&Z{Gfw6R@~?RAbt{5xqLYE?V?6hP*7)y@jCWq@U^ILV8A9DB-Oku50Too(%$JAF&zp=km2D zHA0YSOYPp8lP<=le^a7%**9RmLo$;t>iK?Lc) z;1GbqQ46MO1Z6ajfz*}oH)}BE)ugk9Q~UTDEEjPmaF`Df3MWTqe}6Va2<*kQ;`)ej z{Xl;`*n6_eo*%MwFs%zauqi*fdXSd3eUP5U+y(%jC4nl|C$EZu33aHsIx~=SEu)$c zu05Y|*<5nTfJt@pVrtfAf4IF`)y)Yy=a_1h)LXF`rs7u*&V{aY2R!5K z9_siLB?72#yf1`&!n^+zh`PeA4dLcPDig#P0E%WS_!)E3CjvnsGn^EQ_n>9U7MMZ& z`+)j?;}OFyE^69B;WMPx0MO0-V^>>Lau8Zd>jHz^HhU_ z4nUg|u)6Yw5rFR#E_*K$0+!L29beR3xG48OBnenj%=Z)D(-V`3u?CC@gs-?4S{}lb zt~{r$*9)*`Sul1cc4o=k93WaHJ$N8Y22h4U%;$?fkt6RhI&3C$rkQ1MKv(s(Q6Yu3bH76pPHp*(A%e`(Zx^}D;mo^c4emNr9FJWa5A@33kP3dP8TZt#nblVl;|QZ9d^ zz9j`Ykbxw%1u)sst)@lt$C~3qhpX8cUCj$m?nY-s*>~@tY+yJ6LdLgNp;!>a+gbaniQ3~m`EpQzyBnRb-?v9{e#5m`hlJ3 zs?2X&0Xq28c{vghM7<{aCfmgFc`#2e`HM`7fy8M>yj918yJu{|lp}zUA2}c+Nm8!= zlMp_Wb2v8C-K5vsli1XeALEajPqDpuzpwo6uk$;0kociCd2)dC|4^Pvd>D?8=7zOb zBEj9*11rAMX{&cPKdN0j;6EFa76pWn`f&A=dG2fXty%zv7gY*p8a-XT1xYmPF-f{j zKBXFU5^8vau>3pMAH?EfI8LMfN!SL$P<_A&O&U{BuOvUq`VSrTn4J4;T$!ZiBjE))rAdwD!2(00W#4|(U712ps4acd$#)}bXbBQ*X^dS!`_ z65~zX2O|HG<3I3?kCy#MkglYi|A6{w_zy>U?Gb`)$Q*g@wEMct{E;zUH4z0k^@=&XI?eon!e(> zzvBdovx~om!ToGkK7V_o5g|Ev;jHRNtU#7*1Bv8s({JNJa>s=i`MJcmJR<*femFip z(C2V-wbY?R|9r&hy$RvhtJ6|c)Ml7LTrfblDPNYy_joqi*?T=4f%OcNT~RmHrV++2j*vFyJXWFbNqapPbMfNeu1(y+^LMGjlrNVF3CNAJ3Q1vD$bfnyzH!-}-cV z$TuET#-}+>Y)Mv*yLhzmAq8SS(rtC%IXc1g`Qnv`gRzc)tADOaHSB&6m>FYaTKwUQ zUSiHh0d(!#1#lnpZ)!WQWAh^{zK$0Mf>9}Auh*E_>&c})pdRP%C?$1}CQzE6qTiM3 z{;Y=T42**D5h39RNkF8yXFa~95F#e87jPSub9IVuCifOOp1AV)yi3Gjd?n@HF(OaV zu=%kK?=RFlnlCcidFS#*9L&=OJYNWZe%hK4Ne*jXWo6622p%)y2&3%W5R)SA|PQh+<;2IZ+x0EYQ>o%cFlzMw@T^}lz zQgsT{6u<*Z!IuH@OVMH>`TYG7_FRjwOp^ry;fOIMGETbvHV0fGEcj6gU^pUnH79fL zyk;ro?%OH5`SB~yG2i)~E1n;hC-RjyDzgQt9Ow1-u_tX^Sl>O*m=Q8Rd4pBL95M4S8ISD6v? zV}}Q=d%d^3&WwDxfaY0st0^xLLVJn_|&+`7^_+U)}F zlE5?W$Y#D!J*`%|mFFAu#c&Jsx)%&GP*<@|lnqziLhnQ6MA_RJgz};6Jo{~qe1Dyl z0;_ljv3*TRNHd~SnV3DfJX2klVtMP!y3tSTp43;YG_`~!AI?SJJGb+fK-|Fjs9!lY zsyLaOv64h_{9E(GSdNc7mOp}ivDf!wWMJL**Mp0ME>u)}f*!$8Z?(PZ&pma<+%puX zul|krg|&ZyRSph{G5>RpP z>lXGiid-y|)PPg3OIDkAKhJkSOM)HeQcQ&jcf}F8=i`Txx(|3&z^@yW?n%9`rLtVa zfcr20Z76l`{rkE}TETK(IxTN&qv@6NcDuUQ%p^>?(xC~*6DG^D#vzW4Qzn*Vlr>j7 zYa1^A&OMmFjLZ9M-u?cF;L43f58vWLqtUgGZ!aQrz`%_RiMCo${@2Lr&F&k^2Z>9E zD}~v|h*}Z^0bRIB|DJty$8AV`r^r*Ff0|F`mzp;*%(H*@2K`3{?cb%epK&1 zI+#02UQ+3G0gFDA_c78qJH|)y0x$M^Xn@#-J8GueW*x>eyzO87)9No$Pw9gi_@s78 zMc$zp21ikqoKkz_E*L$=E#c#ofZirv!UTN%nmNFp>QVM1F@MrcI#s;cvSuD$#fICq zXP6&b_8#V{2X0-utX4C6y&J2Z+ssC{vg0H>?>L;w91N^|Pp`k*KIKugtlOQG-YN_A zXZtv54aTm{@06@YCrPk^W}070QVs1K&g9?rgMKDn3Swc^x_Jmqzz+{CIU@s^y%SqG zGy)>ptlf!5%+)4o{idpN@cND-jzR|lFHdP?3tJMkVVx? zX?#%CMDg+Kn^hiEw2rRYI-8hC65=@hx6LJzR+!7DEnc5`aCnF;MLE^}fNp|6_5lzq z(ErWb0g`6JQdRZI>^(l(z=1$^03}-3Npc+rqSm<(Z6{v9gd^ z5@6=VK0b2cPVZw|Ecjx?#IEu1S#qspP@bhy&q&+@#9HoNL37x6Ph}!=)0<|*==-7J zPvL*k6%2SbA0J5(mEP}ij7#`xQ?BBC+sPg76t!FUhsZfwyDBAbZvH;7Q&0a*2uZR@ z7?{qDp6y*#O1`#9Q(SSTr1?l}xPd=~`pH3W^Tb_~7ezH?!$E%xEoM~XrhlhAoMKtv zzbnx3F*dHNj^&-F6qoF^Uh+-LA1}SY{6hrAC}l|pPP3FRayXa?J%jubR}n;pN}k!R zhGGS0+ntwUv+ke)nxEsL-B~&!fbRZp{->qe-BYz`Crv+B$G3YsPHI>a>CVSLj4H7n z#}T$Z@*NzZs7wX}h`x5y^oi=~pzIo-1$xTpe%LD9`?<30OJ7>Kt@zwaH6r1{gOMn} z)fg-AfcPNYB*&Dp^7rJ6HO`SX8CTYsuY8D+7W`R63%XkVknUvmM|kGdc4q{_ zN=cax&jYz#7&m1*0&QOe_4g>9i*`f=-c&MJo0VQ0@?T_Np|JfViMQgW(i`FV4P(ag zd2j^02v}`Fi=XTvdPS;STg?>(0UoG~Dm8FHk&V#0Xr2Fm&B~@C#!wgQAzlxncpXP! zC*j61*LjS3>Z>Z`Jql#j(hW>ylh&lAL*^J0UGfh1rt6bzg~5RN3r5&fkYfFp>eZEj z*upxxFLSY4E6@e6ZOu~84BW#-U$#cadGZW?rjOM)Pcv+2HgcR##J~JF$L1kem(LOx z@KLF$?c-SKPa)t^@|NlVH!rkNq=Y|<{u3`?J4p@6KlhCXDARNu=l>8SM}bY0mC_5L z1B0cv+31fRBxGG(%hr&Ki*m6$>ps~QS`f6V@_mH@-D&D<;{UmUr=F|ixRajV;WRO-aQcJ5=f=HphUlI_ zFEW!_Sd39I(}b9Id{L#R$N|%;Yw3_jQ`YxH;W2Uv!T>Q8$!x9OZ_%x^wDW1VkH6>d zZ4AIo{c$%ut`+Aw)Q(XDJ0BvvZi|^@74xEPgcXyVAK~j$n+JFqR~gPQ9CV$N46sb) zY)8^)ZPsjkZ*iU26C~mNsg)pgn+jg>Cy8a@0DWYRQ5`z*)X?L3dAjm(3M2iT8`A&w zdP~24KVp?isFLg=01v(Uk4MeDpUjX~WM1SU>evyKFCumF`fl}8%}Hx(qwFWY6l3oO zeIoZvTcvfYEh9)h?1IJw*v|M{DE_pndKZ2{F1+C@`71@)1SfGxFyHc>-1X9?%?Z9? z-qOAJhmOU~R~j`QHpy;&=q$e&>QF{VbcypfRJi_LVyd(|ygz=tXb98brjpVqDIg*k zwV~)o%PyLFXx7!d=xFNYcd-Zf7jtjnOk+^YSeXPVM0Zw}%xlw?u(p}n5B*u5`JNCn&Mg4o{Zf~>m(DO1!1u2*-MyB;)6 z7gNOAj?v0l)jH;!TfWHCV3O+jtGF*+KA>TQv#!H$K0X$lohw4tQz-FaaF$vku<^} z^8Wi)}@epl;2ZM*82(TU5sn*Fv7t^tih^|G+zz>0`(y zsVcV&%(@)wGgxKpMS^^p&~F}EWK?w>V*L_ssCbWN5SmSLz!xd;v11aMR3wnA`|h0~~u z2{#1_!HS|2XzOyTq$cqGM(n}~A3$!vFpQ5jxn(*7{-{}U#Li7~h*$Ud=ybHxE`&Hp z(!kWKeOfd-x}|OUlE+DGWz+qlXKGaQ+pfJ6x}SphxhH*|rk3R0%_yqBpXqO--ce>s zCD6H2r3~;FmmUuBtmm*D)s&Ak^6-WZMi>XXmuYrPnHzYN?K+Es7LQwLn!c(`9IBbb zuiCJ0^S}8fo5!~GeA*p1N>MKfAO3eplSADd8sJDSnb;mpZ1K{boBAOXV#+RSUXNP9Ejc*V!s;w0HM(fbTxTwe)Vet+BGsEKvgIT-2FQ6@s& zL=2AI{oI~FclxKctHS4rE)+3MM%Bi@{GgY6w(>)RP@yeRPH|pSuWhD8CEKGe=%SXL z_;N-cH~F3PN6~pU3fI5Ro->Mey! zr=2}6#!qj7mx*H#(hsJtB_m)c_LA*sfbEcA7KIv_P=J4=_rr~MDzJjq+Shu6!tJkg z^$o2zjenm=I~F2v6JPjAkP`0<3B+Qs@1jQVepbv=kfl=K(4$uLo!Eu4=8`7@) z%PoyNa_M&s$zy|Wiri?Gd!O~eq(|dhQ3plRkVSD}ywfh~TH>$=8d~TfyWFn8+!6g| zrA7P=apXHPi3Tact%q5EvKtxX*YUb`Z#eRs+Rc-cPsf|$A5Xp@NJ0o>Mt-`weMAe$ z+WJK<%N}1(HlH<}q>lJPrzf^wvUY{vKoNMo%bKDTU@zo-pCskcpa&H%fTvn4E`|$7 zH2!ejVA(?c$bgRp?Y@kiCpjEP7G^&oObPz*8ED596YO20-p(FWrOE@K%ID5qZg}EP zvA~og=iwOTY+Chg6$4#Nu*LpdDlfp&;VuIy1Bg)Wj?1}Iem(Cx(m%Ky_2D3N6SwFa zlqs8d6PMaSAUZ%CRM(QoDc-5lb$oTI|J#zyleRr%TtcY6{lkf`sC1?6*ox^wgj)R! zk?4ojc~}h1`F9nwyVfSTG&J=$pDljf8Y}v~a=kmv^$z`7mby@&XXrG*O{%Dt$n?UW zw+yevojDsW7?uTeh!lia(M?MRH83Q6T=;L6L`gGEb9rgaV^l%cIcqp(8J5l2;blYf zDY!|`3ct-0FVgNxULZtP`)U*HAY)g z)*dF&PWEcP1AH__mW(=3vhJpe2)o{hfCq~6m`ERv6&#`TuSm;{ zD0(u7#mHT8j|BW7+h}^`GyM~iR~}-!1({+vs>#-``_!vg(c-l+g-!G3_+0l1d&)xn zG~)4rYYN5t|G#Hg=%}$HWsbIX_>^{{C?mOjHj3m2^+&z=Q7TYk5~(AyV- zvN-%Cds0!F_DX~Lj^tvCF4^pGyVqbPJK7yD;N3BwvEYNaIyOQw(f&_($Blxq5M1N# z<<-W^>zE_BS&ZV3T2n-yq|*M4u4s87 zC%J#JrC3e8S|PiU-`#<)HOy;NyB8yxz82ZAmG)6cqiu`hdQch(s$Ey}h7I{S7_v^9 z-0zT}uEUt7AB7`hubTCwAC zD|eVRK#Qb@{oWil2D?PzJrOu?eB&O@tbUrF+`?jV*TWk1z2gN ztK&yryUqNssV-|?dNsoRb1i)_G07OOZ`fB1E^9(>O|nTJJw4L>Qng=+4?k-@8gDm? zXjAsMeY>62PcT$`l6>vH>@BJP`O-I}%K3^uF|I>S?iegUEj3ZOMLp3G4LaZIXkrymLg$9U_`m&G! zjvaKU4LQ{K#30fhHRl&kL=>-Mei`vQql#>&^gp{_=`b-c=`lry zPz}$7+312$!s&-i7i~XBHgFGh1b4mKmc|Y*4NU7Qj8w?qocd`uue(gzTK=a4`HM+b zm%eYptaJf8jEUIo`*OnGX^l);^A^!$N%g$3N^ZVF)85R~)zI4%woeAg@;fCf#vfbQ z1AnigF;I8in}5yIPsn6Y-Tcq{1$3KqYj;a=sW~@@9fh2q3%*(JgJ}YHa9fApE*2?Dk7tTQW&3$zT(LH0M3P{lVCG^{!7G2^P9q&#;zajIXZpS{I!X z$qv7;t2_$nDMJf+&3V7;Ju@FG7Q$(hiXOV6>dfl`*tEr49&Y!j1a3AP@SW`6Z}@>~ zz2_3)JuDqvHwWmXbBtxYX%2|sapKguy$R`d_%&kPzzyiKk|_xdgqbKX{QLoW_P+&Y zi(*86Sph;ThZr{BJg9V*Ug2=s`AIS2ky_+w0)3Un&5W z7kiX6+|Lr)*DWXF9bQGyn0`f2Wg+_3R0bJ!#-$g$lidnb?1_4Nh^k^=}@sR26a`%lo?YqN2KAVXusDWnx8)L1RI5$bE;Y zEah!4q{M`RpyZL38Ix+~480%jfxnbCE3TU?O9$h|jI~T2CT+*wr~1f@Ath!~JH?Y; zQ(Q&sFTK;9ub3#Hs28h{-A5MAfN#wD^FJGO97KXV+uU&R*DHunEYa&`G%Fc9?(hx& zq@pWvj$`TF<+5+~;O!M!#vl~4hNkIwQ-~8F>tNapCPe3-oB`C@Fv>PXs$-w7MO(N~ znTPY==a{QIQz;o2Vs=u!T8?2m^{$Jp+*_$AelEm*mM^Ft?hAA66SaF8F;Va~q1t&s z)9iH;L1+WkRCRvePW!Pu^xWN*&wiut?+@k_AN4*RTgSPp?Qs;6(!qt*YV(pnB-A*c zfBPk#kK5TscTtBqo2_0`%pvT81B>`O(R|G^<44o4_^-w}a7RBr1AP3sjf20mK%W6p zF%5s%e#`|y*nZYdGrAS*(#QPeS#Wc`tLG)0k>Dtj568vzZ6}JmpSg+g6zh|2lL<+5s1rnI^{rpVA=wSYro435VSbr9@L)yF zD2Lk}rC$Sq^Ls(dh?*pU&b5H)Hw0#X`4S|(4v6{AFt+wK*}-s{!66}jz@TR-@OGli z{aRiIsD#~$MAGx6iO+!_-7iH!MPj9YwFyh2s>5o%cuh9Wq$X)IE%IFX2%PkHbepCP zOUI{b+etk>e<+bSuAp}0M{-hI+qsT!I->$qQp6nQK|E8R72q^Kk@(sAs7ZuEi9Nh5 zJy~D8SV(|NI>2hCpr z8DG43_v;15&L!aHp9McU{Q1;l2d1U;cebpqY5NkXkBQ+aoz9=Rfe!IiG>wcxJFJ49 z`LBdk3OW1~uIFs@kq$(0i&&!c_T>Z|mv^YMqc*Qb%r&icUm(BaBRcn7^D=I`gz}J+ zf6k}28QLl(!6YqDTZB(|sI+zu-s}_D*Wnm_%v52KPVbK{od5Y3*v~< z@jf=X@2%e+J{zhruoaZbqNeWf-HhCQBo*j>JGZKi5#bSmbgeFdEZhcJ3__tl{9*CN zftClUi_^%W^aoqu`mzu&gU=l^*SYFoAJZB?+y2ay3jNksZZ_odz^$xLS-f$+f+ykM z29&q_58L!^cRxu~e`LaL^Zt3!2KAGqrNC^rPtcS`&EJQ?D^Np}Z))!-?=X6-K+>D<9-{#Nh@ zl5Irz+fAEA8%Iqv0h)x=oCJsHgF-qe8YCKw4B7;6t2ZC`-Q+b!BSeAtk@UK zmXP%^DHnUFqcMKe?0)1=61Ns`{p*GrdF&u`R(R1FRgKzY5_V*~tas{ZSCX~&Ehcf1 zgGQSn?@ocM5J$i1(WqN6FA&|Qqi0#qKm`0_8!eaW>V%JBu^W3;NK7p2!U(l(m!RJ4 zm3g$T%6FwW_zk!Mc3491zKkJ?`RH)`u$froI7!@Uuhub}bE|_aO8Po1$wyhVgk>{l zcRrsw*phKRxy_^FJH5fwAp8oPb}iz!x89u(o*yKm&sd0AOtWrqI<2;SS#z@7iq@ZY zxa%)NS;5+F3nhCtmKwrIV*rwT+z-*L2s$aML+GgLzZ6iAx`mENn0(QRYjs^2F~GUXrzRLnY5d^O6OepJ{&fR z%kM)#05Xj$8+wTkXlMX=YXD3~2}q^AvY1CZJtVgf2HD10*bPVaTqdlapez%xN<+u! z0PKLZHCWghD0s!DnS$r52yh8$QfQntSpv)PEC2UmFIU?GeY#-2Bx$-X1{(p>N`Qd@ zBmr*g;G^&X`pniKHIU~2?vLqX90(X1#s70mXLBgu+-32Mvg>@O&%k0zjVm=x({+5b zu3~#^BCE?eAa*RjbG9^D-SZudss!9Fg#MI`0!ZJXr0!VobbWxG9b|?b;J3!x0x#hB z3?T+U>UVGP0kRFVEr2j>Ruk^Ct84ug@K&jYF>iO^sPo5{gYqdM!QtX#{%vmcTklSt zaPnDM6pyeHBOGbZQq-ItD$}SZbYe=V_(h|3<@OVG)Ip_AuvJM=Y7Zo+^AEnD)M{i> zfGkj^E=ToDt5^-KyQZ_ywv;AM(5;L{W9%~AT`FFpoh!uPm2+=rRRU0|o}(I5*?c_OYLwx;BKRpd$;dOwhi1zloI`;HaNvFUMmnsd?{LzC z(WHIq1gL&A$asU&6S}b@ATQRe0B(w_oa4|ma-}~y?|s?_WudaQ%Hh7$exAZAk26YB zKAVN3@>@1bK8@3(W}y9xgrE+PM$TVy$WBWy zN!_TSA3-y;eMf*R+C;3)L^Z^Q+_-} zD5O-UoX<=RQ%*;KEQ0b!kXo7BA6iy-fA_-G+PUHz9)w9VBo}&Ah|#SwWu{_yWTA$< zY!WyoVBO3ow@~RL>Qgf(>!(A=q7kmsdgcjdZgCj(0Ddx0A^UH`=g7F~&i}%p9Umab z8O2IGg~-yo*1qzqbhN@_<^k4F)$OFa>`Xnx_<5xFT8C|`) z3t7*DCc!a1!D+vp&z@axEY$>TV`FFw#piEwl-a9pV>^gn^m7Df-9I)82+D6POUNZI zJWd)`K2$2m=kQT0=dxL*qYjDr1SQ#1WgdC`9h4(4x4?VOc?V|F4O$Q8IvkCkQKgL& zKsNv$%?2kqzl{pTdH7=#aa&!lL zBcD%_aydt(AAPw*JG9Kt)ftOY#70pQXvMwFN9WK=14&olN`~fnCG6nIgZV+M2zj8R*&LgI;VK!C>ucF{6vhu^}0y6D4MNK2#Zh>dil?5VPTA+|fb(yo_|(kw?Q9v!DYGlH@UsKx(DJPy*aGBe=URI~%_Nt!z}?=@nQc$GYir7j`CG zLCw+qct)oaCm1H=D*Lr=Sgx~0liSzJo~f7 zS>Mbd^Jqwy`B&frOI~*-_37l1{m$QL<>zLg&qMGTf6E)r7Gv*D@hNtjb!WSY`Xgq1 z{JmE%$_(7?6m*x9d!zi;v6z~YCD5tP%kT124CCfe9@c-3l58{l;Gz=(x!_nn*vJX? z;*+oJBrcQ?CDLD{kjifN(n%@{Qmjw|d2xj%qeU6qK=G5V=narftU!+{bnH(aQm}^| zQDR^&HuhY+u5+`d6AixI?pkWE5%};S1PMpMw&13=RNnAlD)TF%Nui?- z=B<;I`QOa}@tPiaER^~)8EWQb?@?bpo{TPb`^4n8j+d_)sccpa`XF8X74PSj<4CEc zMMPKZG%ziA!J&#Kb<-xE&e3UZg`sXbg@t^Z_-hZ&R#aL)rzj$f#Q-V|*^Logpu%Pbwla%nWsmM}cRA{QgZ;I*f>3UPs#dd?tIsj;!>7_iP{-rKsIp0+XY!;S3%|&p?I} zfKwpbnef?TB>Sihq#5n@FAb0HJ8Cxx2_4}0D>>T!f(C#dg!&TnyML+(qX&CyZjx`-i%Y8#Y zPs%3rz}pv0sB|wabemevW|2xuI7oyaSEn-2T}kL4SAxJif(YX;`HW8HI&DEd&FO_= zAcWV>=g$Ol7lbb5*TqZ}I$aek+&qAm>6dvICReSo`7$RXo1m`lC}3S@g6y`J3#aOM zlKe;b&GammT;-ajmVe#4skDt$8a=i|WKs*D2vvnsBMh`Chkn3o*%miYp$!j^w32<3e|JWvp#J%QUzmv$?__%; zcEqH_K%2FfdhJ3^<(&1f0OZ!m0w%vzkGNbd%9k1b#V#%dQ!E5tn#a)XSw^Gqwkn_l z^wwp-B-&Az68v*c$Ei9l8fA0Kwus4+nI_R+G&#B=Rs_$xPV28B?I4Tlsnmm{@`ap4 zo)mX#>uhJ(v{8HR<~b)IvkN*4E?ALvA~&FE-@t|4b=vAW32LN7V>q(@+roKvExh0W zed@6`v=*Ny8>l_=-cl+}mw)BSLbj=aZ!}_n(ZM?>w9<5odSxOX+4(8VD5pU6;aO5; zj+Ip|5#t;(vk<`)tbxQFtv}%N2`O16_myO}B3~bQx#Vnil1xM>9KB=YN{Q=%pXfmi zRByiNlhhd`tZa}1>!=1n=G9wK_?u?l&QUBQxwZsWd~;$TqLMfCBLj;+RtK9c9lBF9tGd&z9=*Bv(ymgYb^}*5 zZ4&*-=GM)6qEYQF@MRUTcQmmn{Fb}H%^nn(vujYqUxt)Cri!BAMMESNZB9(QQ^7%y zPk~z+@KiXaFDF)mgc7BNU_B+&sJyo)X}?O&(yXG+rqNdaBp`bj7}5cHQWo0O|KlF5 zVjuK~b>MokpInks^9W2pAO+~w9T@mtC_hwbRAbnkTN2zIL&4O~T5rys5&EdP>3%lC zsy7h4h2>OLo?;xfhO0u8nbzH21S*#6@v5}RWts_St`phXoOZP#f{bUs<|h#<<1uh` z(&&&}m!zRVUg3G!Q_drEgv?%WXD8f}#9T{ForYEMMh3Uxq)NT0O$(r7kOqVqf6ti_ zHg3u;<+IZ+LnSD32IN`~%d=%h6q8|%z6^t4HAA_x?r>k`&=cF+sa{a!qBOih+k9_P zfBdUixzW4kD`|d0?FYD#>!`Gq*`IJ~0YC2Zk$u;s`wh`h!R<0E{6ZZyU%G@^f1Ng| zf?q(WlX#snVGbPd33R!K@||H_--A&RgxCb^3d(!=M=ym|9pZ}G~`nh6^ z$DC=YPiS6$f%vEjUti|~Zi`Qn4Q=WC(dM!B^H!Uug}A{BMF`MSjiI<^_SGD zgCyRAq=c&+1hHe7A#gAKyL+z6g?oR@A|*4RD@5dm_jw&9L~rgdt@i)MOd-fjpLJld zh=eMOB|f_N8QjXFjZN;0{gdSJo;DJ8hLSm z(0RMtma+APLuv-`m!?NVs$30-Q)Nj5hD}_j9++{DoFVdh$APmhsPaECunv2{ii46{ zviXi}EsxxjvM;(h5LBBNyPfymNVQ7wsUx6Z1!9y)n4D<`pw9t)@x@WwhIP4ytgXIH zhgkT)t2TC_K0ct;zwxfvxH~DqIsV46{R!E4drx+fQRoyqg7-EbaGXGI8C22l`5s+G zt(-N?)plN^a!n^F3;xWMyvB##^UlOaj1gbok^{R|F2jRC(2kuQv4Sbgm=Hzg z9R7zN_Zzd%cA_D|R$|~ue~-xwj33~C66D0Y0GYexdDFTZ@PQae*tS#Q9&=;#V|>@& zHw4Csbm$fnB5_Ubtt{lc)TEHG8pZZ^8bim|;M3dL^on2FVHe^fs1?bDsPb3NJE6k( z862=5XIL1n0DOb0eIvEdqXPh_)d>L5`C@h^wc=^X>G|)4R6AqLWlv`gwACh9DIAO) zv0?wcO2!d(#LsqE+tgTp-lb%HPbW9D?rwQmK%+?j0J*yNU$`3glMIFIuO&wLXXOkY z?hub%B3TDkbi&2dall z-L_xLSAY{yd{R$4j1(%|{;sMg#8`S>X0{Ur@wi0R0lq`kX8#foafGQMGzRy5;WVHS z#GMe&rkU&#P<*nRoTW+6a$3%*=J0hRaoT|4FxPJ}|4|im>Q}=jXo>|#GtN|eX}?pf z{9=Z+dGin+%Y(80v2EBZ_&pRJyEp9bJqLnC+c8Z&9!p+JDIxGP>lW`4>mO6i-Vd4U zJO?+9KLlTBha&(2X#Rg$MCH-=_}oWBZ#VNb!AsSyAL9ohr7oC^p=W;dhOsUOu+FtV zoeILRfAE>^U!Y%Xl$Pnc(<`DM8?f#x!W99|H01hXLNG&5%bSN^fiK?wSB|dMP8MSx zt~tcDW4D)a0ex|3b$^z!3Y!mUcKH0ShR)8>#O9;?^e+2{Aps1+zxs!`Sdv}WEPR)Q zxV$qrnJ=4_R>Uf+qn)(n;*T$zgQuf_tYw3&fuJy*xffJC?I?~1WU6OK?y7V4GY$#_ z97mfM05*0aGmAd$AH(&T?#qhu3jq(cUodq+XR6{I+5xj}6n`tT;*kAGFxkG)s7gJ$Um zoR)wBIAsQFVhIpjSYSP5n5ri~2nASA_*4Ci&vj!L;pj(&}0{#Xp9|hhC z(UofrsCDd?>MMtM-~@q9w~tt>Q5#$6prZl2qR9?7;<~YN$%$=cxx9JnnB-G1z~ilU zQ@&(2$`%rGa11nXHLCiCnwbON@^8;G-Uz-WeQQ{&Q1@ZyjiSVC0 zT>nrXgdNdZC*H_U2di$bR> zSO2GIeC1Fda`{t@Ox9>ozI#R9-NJKb>dwsz^JarD8w<<(Q6NO?LHY6M;eijFhM{@Q z1Q&2f?lMaE>DO67uh_7+WzoaFINOyOBQKgRk2h7O!k zD>-}Sht7v;eVus4pEPGo1!^sB*WQC@cLBBQyU~l_2An$b&{WiF*^v`Wnu4bfq--g} zWGbQiVKe;k3i5*-yiqpEaOYT?g6xpOcjaZ-{hUQG#l$tz8vzuQC9fUqHTCcOT<(8q zzEU&h^AE0B^R}R^h6Pydh6njt>XU|x{t-v>jeZcw4 z-ABi14O>FLfogqlFfsg$X?z&Q+ZK`t(WIzBz1a z3H9aCc_E!ylcL)ToiR?g8_chs#iPu zE=(rjtbFrD+E$>;TCP$E z0%C3$*Nz|tMOt(?MF+L{p}S2cQaX|l7`x4+S{l+`K86>wXXU`C%Oz$T2kX#EcOB+7 zwFyA{c10kjPfl#=k@Cso??j9(r?e~ubkwxh)wiyMl+V|$`svDY?%+G zvi}_wdy=AkA8&uTJfT9@s8_L$@sC;4ab7jh4*mA2@n(+;$9#3B zCgj&OJeNVh`-3U(%BAc95N7;1i?vwLK|eIsfQuM<=G9@OUK{*1NOq}#?wK8-5uP>m zxmzR!I&9QEZKABnt)AvnjQ-B#?lsU>Q`2W%#AfHVV%X+mo&H@Ujmhz4w%jcCDCkX! z1Smh=*cdO1+?ef*1m~TVHyF~TbN->qzpzW2v4^H+8oFi1i`gb517*z&hNb>0RO9BR zdvO%J>n@7oO-+F{`^|AFElKm1+JJz~+ED*{n5SchcLuC#$Xo+{*w8uu(l*@rDQH9E z$7x$!L9{w@_#B!(j!ykGdkGo7TOND@k$e@tv@p0N4;{G=g2!evR3>E=oOKhM-Qxhor$lf5T2Z|xNomvw9N&^3+CbNJ*OLVVmZFyBf}*waCxJ-2EX?KB&%t9&q+Dim08S=t=;(vIThGHy{R ztJt4Tdxm%JxL@M5)J1y3Fm*yP_F-1y8)XoZjT8bpI8gH!5U|z~FkC)bfr5))f z6JcJairGxVVq*aAH@aLa-{n?Q&Nj{e!(Jl4u}z`V!ciZ*pOizs8|UV!o>q}K0x>V7 zhRosi&!InZ;$blag>$|=!s0!Ka|{5+%8cPBujhYpp}%Ji_D6jrzv`76RSFviU+MZ6!BMWem9#m?3W*71R#+skur~Si!(`?I%|2$e<+31ZcqWNEuWx}Mo z)A^-cWch|{S`^3T`1pspp!M4X0c+41ss%+qdsoHITT!E-J6BD>IrT__7t`yXktBjXj`Lpj5$Vjpk$3n zfSk9p)i{ge$*@T~<`Bz?2&=)~dwreus~8L2KS%Q`fa^Ouxi;_DMTcyGVQidcDIEYp z%%d<`N}tdq*x+7zw!TV95c|FQ4X%_kH7N9q09`l=`r-D%)i{OE)#J(EzxNI=KExf~ zdEx%pcT2;UAKSTu9B`=duJqd4_+B+HhXz+?7QLJWy_}tviWoR5awH?wODva1Z48#v zy}k+o;%}F%T4jo}V901Zm(PH=!pxf|A%(f+gi@QqJL(jY<;vEsWxj)zR3{Ekj6&!1 zrYmlL*z6f&SrzcVu*)Ow??K$*td;zbV-;L( z5vwb#z~XqEcc>ilUf>GAW|>(m^qLQD1LKSUA77jYR|f346q0PZ(4yHUF_nonsXiql zD0qxJqT;m~+{-C&UFl~owTE;l)JD-vouXm|YA*{9!_MJa@g`IdH@1r8KcxL{*piwl zmYp@kJdAbGCYAxXQ*>rl~M|T`wy76B_LWo*;Nc zxt@*;cl`@8%u$#xr&(UKQXuvl19xNMM*fGoxPJ!JwAt(@W_NY zJGLjp@ZiO=4-t^CP^wvugx3Vo z>GgZN!CUh829dMi1dqY`$6ZHop{Lp=G%F?15})I!hnj!+DCA5VlBqE4;Sag^II8gV z_Gye&%bKy=`xxV$XSgE^NzeF=Es>;ey;OW3i0i_%y8*b)3dSCPr~Mrqn;LSgGOVB5 zB+y((`gx5XPh2uCw|A*~8T&#P-mytu$eN@}!2HOpv!wZJBtfhqZ-I7Qi(-C)qO`5O zNG-aCcDh>rKKa&C0bUi8I+pM%7d(r6QfQmX#kL;APZVccUwS^#yTnIydb@AtCNtplHen9>rVmXhqCRR$ z0k=wY%?U*lwhk>Ib!TA~bs?Cq9|LcG2)mJX>pj+_(RrK$!9PixBfJ7L$G@xkCsO&X zC)qvx&BR0Z){mi8Y+{#GSHC71B?2H!tiKBr&t*Fp_zH}FVs$G|2sA4+SIAyhXqoqc zzkR@wuWK;6cD1idm9T!J9c8tl3|j_aSJiw)B}(eA+n{X`%D;lpHn^^&#hm|iTA_8c zvvn4E?CdP^HI@5iNOLxy_8k1)A(HRweiW`Sq-BV>p6>aDoAig(m zbjGmtzgjwd!t;6>rX2G5?o{HD`RAx{i48nLM=48jw7i%O8TVUuXVlnqHb<`_`0olb zmXD6I?!;1;`;@udiY4dFjIcbhN~-Y8K_&0~p87eZ@fv^DOD*NvOL|wr9G6S{W_lIS zy%fP}4HM~RUll!h^c*rc?KbT(p37SVU&)IX(wl{Pn4mLGr%*$iNiDiA5y>>FYvl3# z5X@tzUvK3mR*t{p*A85zao76@?N^lf?LhecKql6}NJ?;w@6n2bsAD*nIEG=o=N+$r zN(J`i=s#HU+HWlR?hvaA9ZP<&F>f}Yt&*aXlNWibyZ7N153z_LtDC;_ND_Z%sld|9 zGZ^2c5xDtn7fQwyF{zLB`H|!TkK-?%Y;ADDj2LN4UBc zK6%X32q}66iA^=fIOLD_x6i+yR;V7l)0euVY<0%Ah*66I)0)M`r07%BjkJ>=;TX8c#!Z!V zK0rBNX8h~5NppIl6NVf>d2dP!Vx@Rmh0Bim!QeGz@mEOKGT{#QDQtsyF)T(F5ZMLS zK7I!0S8Cu^!at}b%+vH~cl6J5>$Ui6IF_jGnY}Hw`szU%AC5@07r=v6175#b-FWt4 z4up(XUR{?(L-?^@bgg*|SSe3&mxH9X>-%FEv+&9tK8NOD+nSrppRv(XkrUhTRfkmV zs(HdLOrrhv+Xavr?|<4SBXh}){?WLsWxBkn@KO`&9i&oI-*N=CrQCDIA#lsD;LFSm z;W^wQgOqQwq2P0i3?PW%Dpblz03pr<&P4VDPe#w?X0>~294UOY^jv70=#^`wxZ{Om zkACyut!no=S-|Q59I6twtyhy5d&|?Y2+~TbtBc9EA6HZFDh|o14skT1B<~nA0t$zP z0c)zt>I&=>BVY{@h5(QThF4~H6g)o>eD5)jr5dNgYNCx#GDI6pt&tDA#6ZJn-hocR zl!}>rEW#UDrC&`vEp&iJv8A#C4Z@%i?LidJoGveRGD9v2;M5Ezab5F1%h5$MR5!J> z*8Byz0x|DpYDM?nc@vJLg#1)2Z&|_!j)b8jO_AM4O)>5b?S<2ymVFZm$;JDCV-ZKe zdqAy0mh}Ikqii@iys+gR6fhH}h>nsW;)g$Y9Ded5bc7 z)Vatx*4g_|gTTYH5Vc7n^M)RP*aPYZP&?u{$qC_%Q#dUciRopo-&1Uq|57q}z^L@% z&+D|U?%ZynvKVo77O{>5ol;Gb9!@DfrFDL$t-XADgjQ$8Celtzd1#tWRNw$c#uiA+ zUS%^zEj}~*=eGM+q-l)6SrK{BPB@_Xqvlmb&(~)hi(d!Fr*ZK2g?dd7bK2279E+F3|U+@(r_8nzD?zh?%nbGXP@g9vXNMOw zXJ%ocVIOeE=&Bg_qY9DZ4JGUEG7HPxzOJ^p8=K4?4BW~k|I)Ht?)5-_vu>@LcnjAU zU76UiREs?mBaf}xW4l#fwXj(k z(ZzV5EB5M)8O@0YbNG`xaXuD@xBzzav!|CqMcvQ5dw9=LN#7q$>xq{{JHN55f2H~gB zuAkI8!B@sQRH-uMIG7^jI2XAXuxK&!tHV+bBzy4hWYeDmYA4NDq%2g+iLXZ$XiFG} zg_>1rZ)wcCnSpQs+!+Kv*K|7KRQY>Mx9#%HyC_D&F!JOEE*AoXHVOl?j6nJUImU~| zWASB2+=M6_mK#E!zKk7?H@*UFjW~0LRl{i|uXt1dQvp-t=U1?ZQLDN6*e;I?w6*cyDzjvbTgBxw!em2>v82 zju;yb-bqQfU__v8oMwJ<@ya)bSMhs}eQ5JPn9^)=!p228$94!lmGuN*5JPbqx!Umxbo zbu16kJ;)G`swz7&bfVBTnJ+Dh67(h`By>UsG%a?fP#_&V7ZWH`mD+xqd3x=o#kq|v zlx_w&|1oweik&0aO_~AGzEp~ zU<#XCvNI(+C@jS6wo`WV4eQ|jF(&tGVKd|V{F~n|H$2cyP`+>pM~ffqkA{;0;Slb7 zIP#m1A<6J7z#ahP1OUO4q4O-;@#LEwajlc$L{zOf`qjyNx4^6i6VP`ZSnhgBv8l8? zku4`;$tm#)%O0g;FT0H@7vA8?&$55|IDb*|2WoQZM{2E6QpUzP&&@)Q2_YzWvOHt6 zJN1Vdn&MCQn{=7!Efu6xyKCQWG41^dbtyY4{vERJUuD=6*?I5A&l*Di-G%`T&x8BN z%MTh3i1hp#X}tp{d)k9hg6~f^4#@iXPPuQN_MC8+oY`2tR%P7(Bzakl?`M|c$bADL z2*4o>0sf{d;q%4&Y9lN-97fbm)z2%ko&*;mPJt2ipA@e;0NPgYCo?a=+swf)V(grJ%G28^YVB;Zm_kOWfC8KdBZa8>eh|1k7 zI|>bP)dbH3O~4v4Ed&7Rpv)|Q10oj|O%r=-E_@rJhT4{D7?k9@9{1%zJ9^^qdy5R< zr`cWr_Bx&!62&8bUa8O?Nj1>je@g~^eI{cg&vn~bM}Gp2HhCe80CtIj|AE{N93v>~ zV+h)iL@xN6>+4>clYv7iq#hhil~{Y~t$XH3Fi8(%TNM`gp1#_Ah1oc?NNMPO(m3S@T7;-NHxd} zUog`lpCq`UXUpO$w13U{6dkYR1VReJXikDFxHq=-890<7uo}#Ja~lxu+73LBd}j}k z38(}oW@XHC|d7o1$T|{^%L)apI|y^p9NlteT+62 z)}l(tj3sOf@BpdP0yG2*hxlLYsl68YP(TonrDYYtzh^Fct;|idn!yKh&romVF(5ic zfms6sRa~%vSR>}5*Wh_v^j?gzNWo6`@oYR6_( zQ|w|FQ;C`flFk1i=V(rBZ`OdibI1<^w2H4wntJzw-h85@ql)$!U*9fr2EZZlmmm#e zGGB9A`<`=@L(ZB|Hb)d^Eg~)8w_BzT6ami+phH#PPXp;hW_pTsk@kGWY44_L98-D_ zVYs(yHg%slSTg6`&Qc;Y`zmPe!qU`7pk;y__jmBQ^#iXXc_ z1-QQK_dwzw_6ue2eA=0|x@$FKT1JXfDryaQ?(L+n{D5j}{+_@AhP|12pH68Ag5Hp@ zXrGTScg=c%KCDh>G+jsEae+&ghG}Up?WtAP9L*4u4agQ=p!&E!}Vg{_&59e#wcM= zV32(eYA5%p_=q1JhHMB`-0fc-sX0`T+@E4=67kkcuMQh)zU^^Ca#sP7u|Pu+YtQ`b z=5Ws~G(B_r+72g^1YGhri!$%banHvj(&RV}^Nn1{8C>FOu_sBO^L5(c6NOw1gc)4* zOYsSiD>Xp>n}}(CMx}?c(md9-#`Z}HZJS`u2ykgT6`xcqAhlmXG*^GVJ6!t?-hQ`r zZ(DV>Acco9<$Q;#YCz`m83T-%*#v>zdy0ik@F zqdR9vP?;uR7wz!<4af2Y_*MiukZP>6pxp`e45DIjwbFSiWmcC7_y3}_Dlz~k@k0nT zwhKoi@4zntpRV<2^miU@TtI7?^>xA}(T-+u>6bTz-U{rYw+#m1`};Y8B6q(z^cR@R zK_~ncm)%Es+7e&%h~?`dcPlmEQwQ#kpjyDSUS4OHTLF_7NqJ9)Q6`KkGJ z56iJ>7#P*)8U@LwN;*EP7;_Hi@0#2U|7RVa8_CVfPbVHnoeuM5Q)B<uA0tBU^Y`(Z7kOWFW~s#F(QCA}TgQa_mVRB100pHBD-7Hle!_eu@8Rex zN)74=atq}bphhl<+FF@-PA?%0sO6m4bFU?=^9p~vzl^W8iNwemTENsvMo%d<@HqfM zG=emut~gzZ0kBb^P;{zYylI$cz?r9gnWfa{fc7|M$tp1L{QkXhA0Vdg)MLc9<<0cF0V!+9&yp9( z59ey@f+%~zQu_gGfT1D(xZL>X!NBbyHlP8q2W*uQk#i+)VI-+0%iQFs?4p@l1a3Oy z50g@B5bM%aD{c^z_x|QR@@Wy_wfuZ^gjWqDhj_#ejM^vQK9bYd6A)KsVz-v9LWw&E zfsgG?JI65(x>M26Js$1vDLqNOK1UvUHU!UiOp)n~IEVliH4eDto`+*?qd#JSr|rlD zq~FT2+?Vo1G!!B{d?Cmbx@R#-BBc`h0Zsd{mzxKY3Ks!u3Ii4;)+=y{b5oj#&(oc) zolw;AqVHrK2?XYVb^hvu>#o%{A#d|zQ_*w=0gr{q(B9LY;UO&_7g_Wh$ZuNp4r32v z9jK~|2$zLbEwFek>_7vN4J^$95ILuK+lFi>PiO5G#?T87)ERHY!XX7mAQc?Qr+wMm zAJhs_X&by?g>)G_G#$l1zEP$i4wYKguXk>Kb=!{d?0xFmdFUMr=dI-MdW|-Da;yS8 z2QvJ$Q{AaI%X5o=>thJDV6=Cz*H_102X{K{5Hb!bV^~|ifqHQpH23%3dGUx(tv=@u z`ul%49Hmh&<9pyn64c6bMBCz-a|iZT2{{Gb`$F(@)A;w*n|`XbJXUP(VZNVt#xquJ zuh)ILxBT`^)OwXs)W=;W_XA-PkkOVn9YGr0D?CVZ+2*w@t=vE2NY1CtWp-N$+Vsjz z#L3SJ#|giFDW23sq}1SYQC8Hn-}=)xujlsFx{(6KJ*txiOTMW4jID!S@rXSTPqR#e zzaj0~EJAyICXUVE7n!KL7%c_2-{Z=w%AU*1+c9=>wAzUX&6%3Q{iWiLVd9#3v*-h= zA1X+5lhlSwvQBwo5?$S_(lm{YcE49D)u-0s>E4 zuJB*)fPsb7fM?3CGcB%%@+XNCbz&=BR*mF*USQ}s;2i$uI0w&+Bv?ooNL4I<(Lymg z8%+Ha7L>DTm52@px@;J?;h*F(AC3QM&ac+EI|^=0CLb@#!Ya1m)By*@J>)YMJh$U^ z?FdLy>SRT-L(&n%4bP6iyHtLNuqGltmH+n6A3KxMI-%B1jDk_yVJCqyA;{q;FtH+9 z<*L5vu@FxxeK=wm5nB9^AIa#aQ#dkVkJ`=w>rjuI7ga~NRawyCTupO#^Ska$h3vB3 z1=7Dc5A45D@3Vnr0YK58?-dB^VBz%GCB*{lQ46M1NUzuY&EFmbpdSn9t1<2e7{Ru{ z?}z|K#NiNnNf0d%2Ko-uq^V(ogBd{lVg(aKVtxV? z98C;>+8iU8gOc}3z|~P0qTVa81OR&UV!(`=N;{0W7|KC6VS5mwB`CI*eeZI@;E-3^+|NMVH|IO+yDdF9s|2ZpayXF5QR{kSa|JPdE zmFl0O{!J9bE^GfP^?$_bu2lcN{{PU_{}Zhxp4=7V-_rh9+5Ug!4dK)hLysW<6VY7H znnh3xZ0$c%-v66^{ Date: Wed, 11 Nov 2020 05:41:42 +0100 Subject: [PATCH 077/144] Fix dragger logic --- src/game/server/entities/dragger.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/game/server/entities/dragger.cpp b/src/game/server/entities/dragger.cpp index 349ce099a..f5770b077 100644 --- a/src/game/server/entities/dragger.cpp +++ b/src/game/server/entities/dragger.cpp @@ -80,10 +80,9 @@ void CDragger::Move() } if(!m_Target) - { m_Target = Id != -1 ? TempEnts[Id] : 0; - } - else + + if(m_Target) { for(auto &SoloEnt : m_SoloEnts) { From 71674b13da59dc4a378ce6e036dfea59c5f7f2d6 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 11 Nov 2020 17:21:02 +0100 Subject: [PATCH 078/144] Fix memleak in CServer on instant shutdown Direct leak of 566869 byte(s) in 1 object(s) allocated from: #0 0x4f28e3 in __interceptor_malloc (/home/teeworlds/servers/DDNet-Server-asan+0x4f28e3) #1 0x55b3c9 in CServer::LoadMap(char const*) /home/teeworlds/src/master/src/engine/server/server.cpp:2312:49 #2 0x55bfdd in CServer::Run() /home/teeworlds/src/master/src/engine/server/server.cpp:2351:6 #3 0x56add2 in main /home/teeworlds/src/master/src/engine/server/server.cpp:3553:21 #4 0x7f54401cd09a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a) --- src/engine/server/server.cpp | 15 +++++++++++---- src/engine/server/server.h | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 4e916c9a2..1a24a0573 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -329,6 +329,17 @@ CServer::CServer() : Init(); } +CServer::~CServer() +{ + for(auto &pCurrentMapData : m_apCurrentMapData) + { + if(pCurrentMapData) + free(pCurrentMapData); + } + + delete m_pConnectionPool; +} + bool CServer::IsClientNameAvailable(int ClientID, const char *pNameRequest) { // check for empty names @@ -2649,11 +2660,7 @@ int CServer::Run() GameServer()->OnShutdown(); m_pMap->Unload(); - for(auto &pCurrentMapData : m_apCurrentMapData) - free(pCurrentMapData); - DbPool()->OnShutdown(); - delete m_pConnectionPool; #if defined(CONF_UPNP) m_UPnP.Shutdown(); diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 56913e109..1a4ccf116 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -257,6 +257,7 @@ public: array m_aNameBans; CServer(); + ~CServer(); bool IsClientNameAvailable(int ClientID, const char *pNameRequest); bool SetClientNameImpl(int ClientID, const char *pNameRequest, bool Set); From 03179af14d2bebc95d926e06778eca83fce83d41 Mon Sep 17 00:00:00 2001 From: Zwelf Date: Wed, 11 Nov 2020 20:25:13 +0100 Subject: [PATCH 079/144] Fix updating points on SQLite3 backend --- src/engine/server/databases/sqlite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/server/databases/sqlite.cpp b/src/engine/server/databases/sqlite.cpp index c4ee46cd0..a4f2d9df9 100644 --- a/src/engine/server/databases/sqlite.cpp +++ b/src/engine/server/databases/sqlite.cpp @@ -240,7 +240,7 @@ void CSqliteConnection::AddPoints(const char *pPlayer, int Points) str_format(aBuf, sizeof(aBuf), "INSERT INTO %s_points(Name, Points) " "VALUES (?, ?) " - "ON CONFLICT(Name) UPDATE SET Points=Points+?;", + "ON CONFLICT(Name) DO UPDATE SET Points=Points+?;", GetPrefix()); PrepareStatement(aBuf); BindString(1, pPlayer); From 4aeed557cc3f63becdff2599cd009fc31d9e23f8 Mon Sep 17 00:00:00 2001 From: b3z Date: Wed, 11 Nov 2020 21:07:54 +0100 Subject: [PATCH 080/144] Translate to Danish (#3298) * Translate to danish * Fix indent Dude i hate this indent stuff. * Fix .2f typo --- data/languages/danish.txt | 447 +++++++++++++++++++------------------- 1 file changed, 224 insertions(+), 223 deletions(-) diff --git a/data/languages/danish.txt b/data/languages/danish.txt index c6b808f02..c4471dfb4 100644 --- a/data/languages/danish.txt +++ b/data/languages/danish.txt @@ -3,6 +3,7 @@ # SnOrKilll #modified by: # matiasmunk 2011-08-06 22:49:11 +# Fin (b3z) 2020-11-11 20:05:00 ##### /authors ##### ##### translated strings ##### @@ -623,671 +624,671 @@ Type: == Type: Successfully saved the replay! -== +== Afspilning blev gemt! Saving ddnet-settings.cfg failed -== +== Gemning af ddnet-settings.cfg mislykkedes Replay feature is disabled! -== +== Afspilningsfunktionen er deaktiveret! The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== +== Bredden eller højden af tekstur% s kan ikke deles med 16, hvilket kan forårsage visuelle fejl. Warning -== +== Advarsel Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== Fejlfindingstilstand aktiveret. Tryk på Ctrl+Shift+D for at deaktivere fejlretningstilstand. Game paused -== +== Spillet sat på pause Server best: -== +== Server bedst: Personal best: -== +== Personlig bedst: Browser -== +== Browser Ghost -== +== Spøgelse Loading DDNet Client -== +== Indlæser DDNet Klient Reconnect in %d sec -== +== Tilslut igen om %d sek Render demo -== +== Gengive demo Replace video -== +== Udskift video File already exists, do you want to overwrite it? -== +== Filen findes allerede. Vil du overskrive den? Are you sure that you want to disconnect? -== +== Er du sikker på, at du vil afbryde forbindelsen? Disconnect Dummy -== +== Afbryd dummy Are you sure that you want to disconnect your dummy? -== +== Er du sikker på, at du vil afbryde din dummy? Welcome to DDNet -== +== Velkommen til DDNet 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 er et samarbejdsvilligt onlinespil, hvor målet er, at du og din gruppe tees når målstregen på kortet. Som nybegynder skal du starte på Novice-servere, som er vært for de nemmeste kort. Overvej ping for at vælge en server tæt på dig. The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. -== +== Kortene indeholder frysning, hvilket midlertidigt gør, at en tee ikke kan bevæge sig. Du er nødt til at arbejde sammen for at komme igennem disse dele. The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== +== Mushjulet skifter våben. Hammer (venstre mus) kan bruges til at ramme andre tees og vække dem fra at være frossne. Hook (right mouse) can be used to swing through the map and to hook other tees to you. -== +== Krog (højre mus) kan bruges til at svinge gennem kortet og til at trække andre tees til dig. Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. -== +== Vigtigst er kommunikation nøglen: Der er ingen tutorial, så du bliver nødt til at chatte (t tasten) med andre spillere for at lære de grundlæggende og tricks i spillet. Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== +== Brug k tasten til at dræbe (genstart), q for at sætte pause og se andre spillere. Se indstillinger for andre tastebindinger. It's recommended that you check the settings to adjust them to your liking before joining a server. -== +== Det anbefales, at du kontrollerer indstillingerne for at justere dem efter eget valg, før du opretter forbindelse til en server. Please enter your nickname below. -== +== Indtast dit kaldenavn nedenfor. Existing Player -== +== Eksisterende Spiller Your nickname '%s' is already used (%d points). Do you still want to use it? -== +== Your nickname '%s' is already in use (%d points). Do you still want to use it? Checking for existing player with your name -== +== Kontrollerer for eksisterende spiller med dit navn Country / Region -== +== Land / Region Destination file already exist -== +== Destinationsfil findes allerede Speed -== +== Hastighed Video name: -== +== Video navn: Show DDNet map finishes in server browser -== +== Vis DDNet kort færdig i serverbrowseren transmits your player name to info2.ddnet.tw -== +== sender dit spillernavn til info2.ddnet.tw Theme -== +== Tema Search -== +== Søg Exclude -== +== Udelukke %d of %d servers -== +== %d ud af %d servere %d of %d server -== +== %d af %d server %d players -== +== %d spillere %d player -== +== %d spiller Filter connecting players -== +== Filtrer forbindende spillere Indicate map finish -== +== Angiv, om kortet er færdigt Unfinished map -== +== Ufærdigt kort Countries -== +== Lande Types -== +== Typer Select a name -== +== Vælg et navn Please use a different name -== +== Brug et andet navn Remove chat -== +== Fjern chat Markers: -== +== Markører: %.2f MiB -== +== %.2f MiB %.2f KiB -== +== %.2f KiB Demo -== +== Demo Markers -== +== Markører Length -== +== Længde Date -== +== Dato Fetch Info -== +== Hent info Demos directory -== +== Demoer vejviser Render -== +== Gør Connecting dummy -== +== Forbinder dummy Connect Dummy -== +== Forbind dummy Kill -== +== Dræbe Pause -== +== Pause Reload -== +== Genindlæs Deactivate -== +== Deaktiver Activate -== +== Aktivér Save -== +== Gemme Smooth Dynamic Camera -== +== Glat Dynamisk Kamera Switch weapon when out of ammo -== +== Skift våben, når du er ude af ammunition Reset wanted weapon on death -== +== Nulstil ønsket våben ved døden Show only chat messages from friends -== +== Vis kun chatbeskeder fra venner Show clan above name plates -== +== Vis klan over navneskilt Clan plates size -== +== Klanetiketstørrelse Skip the main menu -== +== Spring hovedmenuen over Refresh Rate -== +== Opdateringshastighed Show console window -== +== Vis konsolvindue Themes directory -== +== Tema vejviser Automatically take statboard screenshot -== +== Tag automatisk skærmbillede på statboard Automatically create statboard csv -== +== Opret automatisk statboard csv Max CSVs -== +== Maks CSVs Dummy settings -== +== Dummy indstillinger Download skins -== +== Download skind Vanilla skins only -== +== Kun vaniljeskind Fat skins (DDFat) -== +== Fed skind (DDFat) Skin prefix -== +== Hudpræfiks Skin Database -== +== Huddatabase Skins directory -== +== Skind vejviser Hook collisions -== +== Krogkollisioner Zoom in -== +== Zoome ind Zoom out -== +== Zoome ud Default zoom -== +== Standard zoom Show others -== +== Vis andre Show all -== +== Vis alt Toggle dyncam -== +== Skift dyncam Toggle dummy -== +== Skift dummy Toggle ghost -== +== Skift spøgelse Dummy copy -== +== Skift kopi Hammerfly dummy -== +== Hammerflyve dummy Converse -== +== Snak Statboard -== +== Statboard Lock team -== +== Lås team Show entities -== +== Vis entities Show HUD -== +== Vis HUD UI mouse s. -== +== UI mus s. Borderless window -== +== Kantløs vindue may cause delay -== +== kan forårsage forsinkelse Screen -== +== Skærm Use OpenGL 3.3 (experimental) -== +== Brug OpenGL 3.3 (eksperimentel) Preinit VBO (iGPUs only) -== +== Præinit VBO (iGPUs alene) Multiple texture units (disable for MacOS) -== +== Flere teksturenheder (deaktiver for MacOS) Use high DPI -== +== Brug højt DPI Enable game sounds -== +== Aktivér spillyde Enable gun sound -== +== Aktivér pistollyd Enable long pain sound (used when shooting in freeze) -== +== Aktivér lyd med lang smerte (bruges når du falder i frysepunkt) Enable server message sound -== +== Aktivér serverbeskedlyd Enable regular chat sound -== +== Aktivér regelmæssig chatlyd Enable team chat sound -== +== Aktivér teamchat-lyd Enable highlighted chat sound -== +== Aktivér fremhævet chatlyd Threaded sound loading -== +== Trådet lydindlæsning Game sound volume -== +== Spillydstyrke Chat sound volume -== +== Chatlydstyrke Map sound volume -== +== Kortlydstyrke Background music volume -== +== Baggrundsmusikvolumen HUD -== +== HUD DDNet -== +== DDNet Assets -== +== 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 client IDs in Scoreboard -== +== Vis klient-id'er på resultattavlen Show score -== +== Vis score Show health + ammo -== +== Vis sundhed + ammo Use old chat style -== +== Brug gammel chat-stil Show names in chat in team colors -== +== Vis navne i chat i teamfarver Show kill messages -== +== Vis dræb beskeder Show votes window after voting -== +== Vis vinduet med stemmer efter afstemning Messages -== +== Beskeder System message -== +== Systemmeddelelse Reset -== +== Nulstil Highlighted message -== +== Fremhævet besked Spectator -== +== Tilskuer Look out! -== +== Pas på! Team message -== +== Team besked We will win -== +== Vi vil vinde Friend message -== +== Ven besked Highlight -== +== Fremhæve Friend -== +== Ven Hi o/ -== +== Hej o/ Normal message -== +== Normal besked Hello and welcome -== +== Hej og velkommen Client message -== +== Klient besked Inner color -== +== Indre farve Outline color -== +== Ydre farve Wait before try for -== +== Vent inden du prøver second -== +== sekund seconds -== +== sekunder Save the best demo of each race -== +== Gem den bedste demo af hvert løb Default length: %d -== +== Standardlængde: %d Enable replays -== +== Aktivér gentagelser Show ghost -== +== Vis spøgelse Save ghost -== +== Gem spøgelse Gameplay -== +== Gameplay Overlay entities -== +== Dække entities Size -== +== Størrelse Show text entities -== +== Vis tekst entities Show others (own team only) -== +== Vis andre (kun eget hold) Show quads -== +== Vis quads AntiPing -== +== AntiPing AntiPing: predict other players -== +== AntiPing: forudsige andre spillere AntiPing: predict weapons -== +== AntiPing: forudsige våben AntiPing: predict grenade paths -== +== AbtiPing: forudsige granatstier Show other players' hook collision lines -== +== Vis andre spillers kroge kollisionslinjer Show other players' key presses -== +== Vis andre spillers tastetryk Old mouse mode -== +== Gammel musetilstand Background (regular) -== +== Baggrund (almindelig) Background (entities) -== +== Baggrund (entities) Use current map as background -== +== Brug det aktuelle kort som baggrund Show tiles layers from BG map -== +== Vis fliselag fra baggrundskortet Try fast HTTP map download first -== +== Prøv hurtig download af HTTP kort først DDNet %s is available: -== +== DDNet %s er tilgængelig: Update now -== +== Opdatere nu Updating... -== +== Opdaterer... DDNet Client updated! -== +== DDNet Klient opdateret! No updates available -== +== Ingen opdateringer tilgængelige Check now -== +== Tjek nu New random timeout code -== +== Ny tilfældig timeout kode Entities -== +== Entities Emoticons -== +== Humørikoner Particles -== +== Partikler Assets directory -== +== Assets vejviser Learn -== +== Lære https://wiki.ddnet.tw/ -== +== https://wiki.ddnet.tw/ Website -== +== Internet side Settings -== +== Indstillinger Stop server -== +== Stop server Run server -== +== Kør server Server executable not found, can't run server -== +== Server eksekverbar blev ikke fundet, kan ikke køre server Editor -== +== Redaktør [Start menu] Play -== +== Spil DDNet %s is out! -== +== DDNet %s er ude! Downloading %s: -== +== Downloader %s: Update failed! Check log... -== +== Opdatering fejlede! Tjek log... Restart -== +== Genstart Time -== +== Tid Manual -== +== Manual Race -== +== Race Auto -== +== Auto Replay -== +== Afspil igen Follow -== +== Følge med Frags -== +== Frags Deaths -== +== Dødsfalder Suicides -== +== Selvmord Ratio -== +== Forhold Net -== +== Net FPM -== +== FPM Spree -== +== Spree Best -== +== Bedst Grabs -== +== Tager fat 1 new mention -== +== 1 ny nævne %d new mentions -== +== %d ny nævner 9+ new mentions -== +== 9+ ny nævner From a278810ef17720d1b649acf9610f9a59391c0da2 Mon Sep 17 00:00:00 2001 From: trml Date: Thu, 12 Nov 2020 00:58:11 +0100 Subject: [PATCH 081/144] Updated norwegian translation --- data/languages/norwegian.txt | 85 ++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt index 1850f19d9..8ad52b92b 100644 --- a/data/languages/norwegian.txt +++ b/data/languages/norwegian.txt @@ -4,6 +4,7 @@ #modified by: # MertenNor 2011-07-02 08:46:16 # nuborn 2020-08-31 23:00:00 +# nuborn 2020-11-12 00:00:00 ##### /authors ##### ##### translated strings ##### @@ -1167,128 +1168,128 @@ Replay == Opptak Saving ddnet-settings.cfg failed -== +== Lagring av ddnet-settings.cfg mislyktes The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== +== Bredden eller høyden til tekstur %s er ikke delelig med 16, noe som kan gi visuelle feil. Warning -== +== Advarsel Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== Feilsøkemodus aktivert. Trykk Ctrl+Shift+D for å deaktivere feilsøkemodus. Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== +== Bruk k-tasten for å drepe (restarte), q for å pause og se på andre spillere. Se innstillinger for andre tasteoppsett. Existing Player -== +== Eksisterende Spiller Your nickname '%s' is already used (%d points). Do you still want to use it? -== +== Ditt kallenavn '%s' er allerede i bruk (%d poeng). Vil du fortsatt bruke det? Checking for existing player with your name -== +== Sjekker etter eksisterende spiller med ditt navn Country / Region -== +== Land / Region Speed -== +== Hastighet Theme -== +== Tema %d of %d servers -== +== %d av %d servere %d of %d server -== +== %d av %d server %d players -== +== %d spillere %d player -== +== %d spiller Demos directory -== +== Demomappe Smooth Dynamic Camera -== +== Mykt dynamisk kamera Skip the main menu -== +== Hopp over hovedmeny Themes directory -== +== Temamappe Download skins -== +== Last ned skins Skin Database -== +== Skin-database Skins directory -== +== Skinmappe Game sound volume -== +== Lydvolum spill Chat sound volume -== +== Lydvolum chat Background music volume -== +== Bakgrunnsmusikkvolum Assets -== +== Ressurser Use old chat style -== +== Bruk gammel chattestil Highlight -== +== Uthev Client message -== +== Klientmelding Use current map as background -== +== Bruk nåværende bane som bakgrunn Entities -== +== Entities Emoticons -== +== Emotikoner Particles -== +== Partikler Assets directory -== +== Ressursmappe https://wiki.ddnet.tw/ -== +== https://wiki.ddnet.tw/ Website -== +== Webside Settings -== +== Innstillinger Stop server -== +== Stopp server Run server -== +== Start server Server executable not found, can't run server -== +== Server-programfil ikke funnet, kan ikke starte server Editor -== +== Baneredigerer [Start menu] Play -== +== Spill From 15a06df71a157a292a404940d6d4a1aec1b9725f Mon Sep 17 00:00:00 2001 From: TsFreddie Date: Thu, 12 Nov 2020 10:04:06 +0800 Subject: [PATCH 082/144] chinese translation update --- data/languages/simplified_chinese.txt | 73 +++++++------- data/languages/traditional_chinese.txt | 133 +++++++++++++------------ 2 files changed, 104 insertions(+), 102 deletions(-) diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index 203cfb6f2..5a8a2a1f4 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -10,6 +10,7 @@ # 2020.8.14 Night_L # 2020.8.19 TsFreddie # 2020.8.20 Dan_cao +# 2020.11.12 TsFreddie ##### /authors ##### ##### translated strings ##### @@ -255,7 +256,7 @@ MOTD == 公告 Map -== 地图 +== 实体层背景地图 Maximum ping: == 最高延迟: @@ -793,13 +794,13 @@ Show other players' key presses == 显示其他玩家的按键 Background (regular) -== 背景(常规) +== 背景(常规模式) Background (entities) -== 背景(实体) +== 背景(实体层模式) Show tiles layers from BG map -== 在背景地图显示图块层 +== 显示实体层背景地图的图块层 Try fast HTTP map download first == 优先尝试用HTTP快速下载地图 @@ -918,7 +919,7 @@ Refresh Rate == 刷新率 New random timeout code -== 新随机超时代码 +== 随机生成新的超时代码(Timeout代码) Suicides == 自杀数 @@ -1138,7 +1139,7 @@ Server best: == 服务器最佳 Learn -== 学习 +== 教程 Use high DPI == 使用高 DPI @@ -1177,7 +1178,7 @@ https://wiki.ddnet.tw/ == https://docs.qq.com/doc/DWGFrV0xPRmVWVkla The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== 宽和高无法被16整除,这可能会导致画面异常 +== 材质 %s 的宽和高无法被16整除,这可能会导致画面异常。 Warning == 警告 @@ -1189,7 +1190,7 @@ Skip the main menu == 跳过主菜单 Website -== 网站 +== 官网 Settings == 设置 @@ -1214,7 +1215,7 @@ Manual == 手动 Race -== 竞速赛 +== 竞速 Auto == 自动 @@ -1223,82 +1224,82 @@ Replay == 回放 Saving ddnet-settings.cfg failed -== +== 配置文件 ddnet-settings.cfg 保存失败 Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== 调试模式已启用。按 Ctrl+Shift+D 禁用调试模式。 Existing Player -== +== 玩家已存在 Your nickname '%s' is already used (%d points). Do you still want to use it? -== +== 你使用的昵称在DDNet中有%d分的记录,这可能代表改昵称已经被其他人使用过。确认要使用这个名字吗? Checking for existing player with your name -== +== 正在查找该昵称的DDNet记录 Theme -== +== 主题 %d of %d servers -== +== 符合条件 %d / 总共 %d 个服务器 %d of %d server -== +== 符合条件 %d / 总共 %d 个服务器 %d players -== +== %d 在线玩家 %d player -== +== %d 在线玩家 Demos directory -== +== 回放目录 Smooth Dynamic Camera -== +== 平滑动态镜头 Themes directory -== +== 主题目录 Download skins -== +== 在线获取皮肤 Skin Database -== +== 皮肤数据库 Skins directory -== +== 皮肤目录 Game sound volume -== +== 游戏音效音量 Chat sound volume -== +== 聊天提示音量 Background music volume -== +== 背景音樂音量 Assets -== +== 材质 Use old chat style -== +== 旧版聊天框 Highlight -== +== 高亮 Use current map as background -== +== 使用当前地图作为实体层背景地图 Entities -== +== 实体层 Emoticons -== +== 表情 Particles -== +== 粒子 Assets directory -== +== 材质目录 diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index 372a5e3ad..eae839b0d 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -4,6 +4,7 @@ #modified by: # 2020.8.19 TsFreddie # 2020.8.20 Dan_cao +# 2020.11.12 TsFreddie ##### /authors ##### ##### translated strings ##### @@ -207,7 +208,7 @@ General == 常規 Graphics -== 影象 +== 顯示 Grenade == 榴彈槍 @@ -249,7 +250,7 @@ MOTD == 公告 Map -== 地圖 +== 實體層背景地圖 Maximum ping: == 最高延遲: @@ -793,7 +794,7 @@ Background (entities) == 背景(實體) Show tiles layers from BG map -== 在背景地圖顯示圖塊層 +== 顯示實體層背景地圖的圖塊層 Try fast HTTP map download first == 優先嚐試用HTTP高速下載地圖 @@ -1132,7 +1133,7 @@ Server best: == 伺服器最佳 Learn -== 學習 +== 教程 Use high DPI == 使用高 DPI @@ -1170,11 +1171,45 @@ Country / Region https://wiki.ddnet.tw/ == https://docs.qq.com/doc/DWGFrV0xPRmVWVkla +The width or height of texture %s is not divisible by 16, which might cause visual bugs. +== 材質 %s 的寬和高無法被16整除,這可能會導致畫面異常。 + +Warning +== 警告 + +Speed +== 速度 + +Skip the main menu +== 跳過主選單 + +Website +== 網站 + +Settings +== 設定 + +[Start menu] +Play +== 開始遊戲 + +Stop server +== 停止伺服器 + +Run server +== 開啟伺服器 + +Server executable not found, can't run server +== 找不到伺服器的可執行檔案,無法開啟 + +Editor +== 編輯器 + Manual == 手動 Race -== 競速賽 +== 競速 Auto == 自動 @@ -1183,116 +1218,82 @@ Replay == 回放 Saving ddnet-settings.cfg failed -== - -The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== - -Warning -== +== 配置檔案 ddnet-settings.cfg 儲存失敗 Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== +== 偵錯模式已啟用。按 Ctrl+Shift+D 禁用偵錯模式。 Existing Player -== +== 玩家已存在 Your nickname '%s' is already used (%d points). Do you still want to use it? -== +== 你使用的暱稱在DDNet中有%d分的記錄,這可能代表改暱稱已經被其他人使用過。確認要使用這個名字嗎? Checking for existing player with your name -== - -Speed -== +== 正在查詢該暱稱的DDNet記錄 Theme -== +== 主題 %d of %d servers -== +== 符合條件 %d / 總共 %d 個伺服器 %d of %d server -== +== 符合條件 %d / 總共 %d 個伺服器 %d players -== +== %d 在線玩家 %d player -== +== %d 在線玩家 Demos directory -== +== 回放目錄 Smooth Dynamic Camera -== - -Skip the main menu -== +== 動態視距平滑化 Themes directory -== +== 主題目錄 Download skins -== +== 在線獲取外觀 Skin Database -== +== 外觀數據庫 Skins directory -== +== 外觀目錄 Game sound volume -== +== 遊戲音效音量 Chat sound volume -== +== 聊天提示音量 Background music volume -== +== 背景音樂音量 Assets -== +== 材質 Use old chat style -== +== 舊版聊天框 Highlight -== +== 高亮 Use current map as background -== +== 使用當前地圖作爲實體層背景地圖 Entities -== +== 實體層 Emoticons -== +== 表情 Particles -== +== 粒子 Assets directory -== - -Website -== - -Settings -== - -Stop server -== - -Run server -== - -Server executable not found, can't run server -== - -Editor -== - -[Start menu] -Play -== +== 材質目錄 From 0c231c36680cf59be130dd039156d46dfa964679 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Thu, 12 Nov 2020 08:35:07 +0100 Subject: [PATCH 083/144] Respect outline in skin metrics --- src/game/client/components/skins.cpp | 110 ++++++++++++------------ src/game/client/render.cpp | 16 ++-- src/game/client/skin.h | 121 +++++++++++++++++---------- 3 files changed, 140 insertions(+), 107 deletions(-) diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp index 9c2cd4f58..73cae21f3 100644 --- a/src/game/client/components/skins.cpp +++ b/src/game/client/components/skins.cpp @@ -55,6 +55,41 @@ int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser) return pSelf->LoadSkin(aNameWithoutPng, aBuf, DirType); } +static void CheckMetrics(CSkin::SSkinMetricVariable &Metrics, uint8_t *pImg, int ImgWidth, int ImgX, int ImgY, int CheckWidth, int CheckHeight) +{ + int MaxY = -1; + int MinY = CheckHeight + 1; + int MaxX = -1; + int MinX = CheckWidth + 1; + + for(int y = 0; y < CheckHeight; y++) + { + for(int x = 0; x < CheckWidth; x++) + { + int OffsetAlpha = (y + ImgY) * ImgWidth + (x + ImgX) * 4 + 3; + uint8_t AlphaValue = pImg[OffsetAlpha]; + if(AlphaValue > 0) + { + if(MaxY < y) + MaxY = y; + if(MinY > y) + MinY = y; + if(MaxX < x) + MaxX = x; + if(MinX > x) + MinX = x; + } + } + } + + Metrics.m_Width = clamp((MaxX - MinX) + 1, 1, CheckWidth); + Metrics.m_Height = clamp((MaxY - MinY) + 1, 1, CheckHeight); + Metrics.m_OffsetX = clamp(MinX, 0, CheckWidth - 1); + Metrics.m_OffsetY = clamp(MinY, 0, CheckHeight - 1); + Metrics.m_MaxWidth = CheckWidth; + Metrics.m_MaxHeight = CheckHeight; +} + int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) { char aBuf[512]; @@ -86,17 +121,27 @@ int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) int FeetOffsetX = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_X * FeetGridPixelsWidth; int FeetOffsetY = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_Y * FeetGridPixelsHeight; + int FeetOutlineGridPixelsWidth = (Info.m_Width / g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_pSet->m_Gridx); + int FeetOutlineGridPixelsHeight = (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_pSet->m_Gridy); + int FeetOutlineWidth = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_W * FeetOutlineGridPixelsWidth; + int FeetOutlineHeight = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_H * FeetOutlineGridPixelsHeight; + + int FeetOutlineOffsetX = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_X * FeetOutlineGridPixelsWidth; + int FeetOutlineOffsetY = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_Y * FeetOutlineGridPixelsHeight; + + int BodyOutlineGridPixelsWidth = (Info.m_Width / g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_pSet->m_Gridx); + int BodyOutlineGridPixelsHeight = (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_pSet->m_Gridy); + int BodyOutlineSize = g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_H * BodyOutlineGridPixelsHeight; + + int BodyOutlineOffsetX = g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_X * BodyOutlineGridPixelsWidth; + int BodyOutlineOffsetY = g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_Y * BodyOutlineGridPixelsHeight; + int BodySize = g_pData->m_aSprites[SPRITE_TEE_BODY].m_H * (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridy); // body size if(BodySize > Info.m_Height) return 0; unsigned char *d = (unsigned char *)Info.m_pData; int Pitch = Info.m_Width * 4; - int MaxBodyY = -1; - int MinBodyY = BodySize + 1; - int MaxBodyX = -1; - int MinBodyX = BodySize + 1; - // dig out blood color { int aColors[3] = {0}; @@ -110,17 +155,6 @@ int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) aColors[1] += d[y * Pitch + x * 4 + 1]; aColors[2] += d[y * Pitch + x * 4 + 2]; } - if(AlphaValue > 0) - { - if(MaxBodyY < y) - MaxBodyY = y; - if(MinBodyY > y) - MinBodyY = y; - if(MaxBodyX < x) - MaxBodyX = x; - if(MinBodyX > x) - MinBodyX = x; - } } if(aColors[0] != 0 && aColors[1] != 0 && aColors[2] != 0) Skin.m_BloodColor = ColorRGBA(normalize(vec3(aColors[0], aColors[1], aColors[2]))); @@ -128,48 +162,16 @@ int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) Skin.m_BloodColor = ColorRGBA(0, 0, 0, 1); } - Skin.m_Metrics.m_BodyHeight = clamp((MaxBodyY - MinBodyY) + 1, 1, BodySize); - Skin.m_Metrics.m_BodyWidth = clamp((MaxBodyX - MinBodyX) + 1, 1, BodySize); - Skin.m_Metrics.m_BodyOffsetX = clamp(MinBodyX, 0, BodySize - 1); - Skin.m_Metrics.m_BodyOffsetY = clamp(MinBodyY, 0, BodySize - 1); + CheckMetrics(Skin.m_Metrics.m_Body, d, Pitch, 0, 0, BodySize, BodySize); - Skin.m_Metrics.m_BodyMaxWidth = BodySize; - Skin.m_Metrics.m_BodyMaxHeight = BodySize; + // body outline metrics + CheckMetrics(Skin.m_Metrics.m_Body, d, Pitch, BodyOutlineOffsetX, BodyOutlineOffsetY, BodyOutlineSize, BodyOutlineSize); // get feet size - { - int MaxFeetY = -1; - int MinFeetY = FeetHeight + 1; - int MaxFeetX = -1; - int MinFeetX = FeetWidth + 1; + CheckMetrics(Skin.m_Metrics.m_Feet, d, Pitch, FeetOffsetX, FeetOffsetY, FeetWidth, FeetHeight); - for(int y = 0; y < FeetHeight; y++) - { - for(int x = 0; x < FeetWidth; x++) - { - int OffsetAlpha = (y + FeetOffsetY) * Pitch + (x + FeetOffsetX) * 4 + 3; - uint8_t AlphaValue = d[OffsetAlpha]; - if(AlphaValue > 0) - { - if(MaxFeetY < y) - MaxFeetY = y; - if(MinFeetY > y) - MinFeetY = y; - if(MaxFeetX < x) - MaxFeetX = x; - if(MinFeetX > x) - MinFeetX = x; - } - } - } - - Skin.m_Metrics.m_FeetWidth = clamp((MaxFeetX - MinFeetX) + 1, 1, FeetWidth); - Skin.m_Metrics.m_FeetHeight = clamp((MaxFeetY - MinFeetY) + 1, 1, FeetHeight); - Skin.m_Metrics.m_FeetOffsetX = clamp(MinFeetX, 0, FeetWidth - 1); - Skin.m_Metrics.m_FeetOffsetY = clamp(MinFeetY, 0, FeetHeight - 1); - Skin.m_Metrics.m_FeetMaxWidth = FeetWidth; - Skin.m_Metrics.m_FeetMaxHeight = FeetHeight; - } + // get feet outline size + CheckMetrics(Skin.m_Metrics.m_Feet, d, Pitch, FeetOutlineOffsetX, FeetOutlineOffsetY, FeetOutlineWidth, FeetOutlineHeight); // create colorless version int Step = Info.m_Format == CImageInfo::FORMAT_RGBA ? 4 : 3; diff --git a/src/game/client/render.cpp b/src/game/client/render.cpp index 3ac70ca9e..b18d2d85e 100644 --- a/src/game/client/render.cpp +++ b/src/game/client/render.cpp @@ -566,10 +566,10 @@ void CRenderTools::GetRenderTeeBodySize(CAnimState *pAnim, CTeeRenderInfo *pInfo float BodyScale; GetRenderTeeBodyScale(BaseSize, BodyScale); - Width = pInfo->m_SkinMetrics.BodyWidthNormalized() * 64.0f * BodyScale; - Height = pInfo->m_SkinMetrics.BodyHeightNormalized() * 64.0f * BodyScale; - BodyOffset.x = pInfo->m_SkinMetrics.BodyOffsetXNormalized() * 64.0f * BodyScale; - BodyOffset.y = pInfo->m_SkinMetrics.BodyOffsetYNormalized() * 64.0f * BodyScale; + Width = pInfo->m_SkinMetrics.m_Body.WidthNormalized() * 64.0f * BodyScale; + Height = pInfo->m_SkinMetrics.m_Body.HeightNormalized() * 64.0f * BodyScale; + BodyOffset.x = pInfo->m_SkinMetrics.m_Body.OffsetXNormalized() * 64.0f * BodyScale; + BodyOffset.y = pInfo->m_SkinMetrics.m_Body.OffsetYNormalized() * 64.0f * BodyScale; } void CRenderTools::GetRenderTeeFeetSize(CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &FeetOffset, float &Width, float &Height) @@ -580,10 +580,10 @@ void CRenderTools::GetRenderTeeFeetSize(CAnimState *pAnim, CTeeRenderInfo *pInfo float FeetScaleWidth, FeetScaleHeight; GetRenderTeeFeetScale(BaseSize, FeetScaleWidth, FeetScaleHeight); - Width = pInfo->m_SkinMetrics.FeetWidthNormalized() * 64.0f * FeetScaleWidth; - Height = pInfo->m_SkinMetrics.FeetHeightNormalized() * 32.0f * FeetScaleHeight; - FeetOffset.x = pInfo->m_SkinMetrics.FeetOffsetXNormalized() * 64.0f * FeetScaleWidth; - FeetOffset.y = pInfo->m_SkinMetrics.FeetOffsetYNormalized() * 32.0f * FeetScaleHeight; + Width = pInfo->m_SkinMetrics.m_Feet.WidthNormalized() * 64.0f * FeetScaleWidth; + Height = pInfo->m_SkinMetrics.m_Feet.HeightNormalized() * 32.0f * FeetScaleHeight; + FeetOffset.x = pInfo->m_SkinMetrics.m_Feet.OffsetXNormalized() * 64.0f * FeetScaleWidth; + FeetOffset.y = pInfo->m_SkinMetrics.m_Feet.OffsetYNormalized() * 32.0f * FeetScaleHeight; } void CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, vec2 &TeeOffsetToMid) diff --git a/src/game/client/skin.h b/src/game/client/skin.h index d5d7cf31d..03b61809d 100644 --- a/src/game/client/skin.h +++ b/src/game/client/skin.h @@ -5,6 +5,7 @@ #include #include #include +#include // do this better and nicer struct CSkin @@ -42,16 +43,80 @@ struct CSkin char m_aName[24]; ColorRGBA m_BloodColor; - struct SSkinMetrics + template + struct SSkinMetricVariableInt { - int m_BodyWidth; - int m_BodyHeight; - int m_BodyOffsetX; - int m_BodyOffsetY; + int m_Value; + operator int() { return m_Value; } + SSkinMetricVariableInt &operator=(int NewVal) + { + if(IsSizeType) + m_Value = maximum(m_Value, NewVal); + else + m_Value = minimum(m_Value, NewVal); + return *this; + } + + SSkinMetricVariableInt() + { + Reset(); + } + + void Reset() + { + if(IsSizeType) + m_Value = std::numeric_limits::lowest(); + else + m_Value = std::numeric_limits::max(); + } + }; + + struct SSkinMetricVariable + { + SSkinMetricVariableInt m_Width; + SSkinMetricVariableInt m_Height; + SSkinMetricVariableInt m_OffsetX; + SSkinMetricVariableInt m_OffsetY; // these can be used to normalize the metrics - int m_BodyMaxWidth; - int m_BodyMaxHeight; + SSkinMetricVariableInt m_MaxWidth; + SSkinMetricVariableInt m_MaxHeight; + + float WidthNormalized() + { + return (float)m_Width / (float)m_MaxWidth; + } + + float HeightNormalized() + { + return (float)m_Height / (float)m_MaxHeight; + } + + float OffsetXNormalized() + { + return (float)m_OffsetX / (float)m_MaxWidth; + } + + float OffsetYNormalized() + { + return (float)m_OffsetY / (float)m_MaxHeight; + } + + void Reset() + { + m_Width.Reset(); + m_Height.Reset(); + m_OffsetX.Reset(); + m_OffsetY.Reset(); + m_MaxWidth.Reset(); + m_MaxHeight.Reset(); + } + }; + + struct SSkinMetrics + { + SSkinMetricVariable m_Body; + SSkinMetricVariable m_Feet; int m_FeetWidth; int m_FeetHeight; @@ -64,47 +129,13 @@ struct CSkin void Reset() { - m_BodyWidth = m_BodyHeight = m_BodyOffsetX = m_BodyOffsetY = m_FeetWidth = m_FeetHeight = m_FeetOffsetX = m_FeetOffsetY = -1; + m_Body.Reset(); + m_Feet.Reset(); } - float BodyWidthNormalized() + SSkinMetrics() { - return (float)m_BodyWidth / (float)m_BodyMaxWidth; - } - - float BodyHeightNormalized() - { - return (float)m_BodyHeight / (float)m_BodyMaxHeight; - } - - float BodyOffsetXNormalized() - { - return (float)m_BodyOffsetX / (float)m_BodyMaxWidth; - } - - float BodyOffsetYNormalized() - { - return (float)m_BodyOffsetY / (float)m_BodyMaxHeight; - } - - float FeetWidthNormalized() - { - return (float)m_FeetWidth / (float)m_FeetMaxWidth; - } - - float FeetHeightNormalized() - { - return (float)m_FeetHeight / (float)m_FeetMaxHeight; - } - - float FeetOffsetXNormalized() - { - return (float)m_FeetOffsetX / (float)m_FeetMaxWidth; - } - - float FeetOffsetYNormalized() - { - return (float)m_FeetOffsetY / (float)m_FeetMaxHeight; + Reset(); } }; SSkinMetrics m_Metrics; From 5b24e95b29b998b66d62595aedacd4e778c2d379 Mon Sep 17 00:00:00 2001 From: def Date: Wed, 11 Nov 2020 22:48:23 +0100 Subject: [PATCH 084/144] Check translations in github, check formatting strings, fix --- .github/workflows/style.yml | 1 + data/languages/danish.txt | 2 +- data/languages/dutch.txt | 2 +- data/languages/persian.txt | 2 +- data/languages/polish.txt | 2 +- data/languages/simplified_chinese.txt | 2 +- data/languages/traditional_chinese.txt | 2 +- data/languages/turkish.txt | 2 +- scripts/languages/copy_fix.py | 105 +++++++++++++------------ scripts/languages/readme.txt | 2 +- scripts/languages/twlang.py | 23 +++++- scripts/languages/update_all.py | 10 +++ 12 files changed, 95 insertions(+), 60 deletions(-) create mode 100755 scripts/languages/update_all.py diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index fe3a38102..abdd2020a 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -23,3 +23,4 @@ jobs: clang-format -version scripts/fix_style.py --dry-run scripts/check_header_guards.py + scripts/languages/update_all.py diff --git a/data/languages/danish.txt b/data/languages/danish.txt index c4471dfb4..a46eb7569 100644 --- a/data/languages/danish.txt +++ b/data/languages/danish.txt @@ -633,7 +633,7 @@ Replay feature is disabled! == Afspilningsfunktionen er deaktiveret! The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== Bredden eller højden af tekstur% s kan ikke deles med 16, hvilket kan forårsage visuelle fejl. +== Bredden eller højden af tekstur%s kan ikke deles med 16, hvilket kan forårsage visuelle fejl. Warning == Advarsel diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt index 188166ccd..7d4c64fa1 100644 --- a/data/languages/dutch.txt +++ b/data/languages/dutch.txt @@ -1045,7 +1045,7 @@ Save the best demo of each race == Sla de beste demo op van elke race Default length: %d -== Standaart lengte +== Standaart lengte: %d Enable replays == Replays aan zetten diff --git a/data/languages/persian.txt b/data/languages/persian.txt index 31fb657bf..754a85cec 100644 --- a/data/languages/persian.txt +++ b/data/languages/persian.txt @@ -79,7 +79,7 @@ Delete demo Demo details == ﻮﻣﺩ ﺕﺎﯿﺋﺰﺟ Demofile: %s -== s% :ﻮﻣﺩ ﻞﯾﺎﻓ +== %s :ﻮﻣﺩ ﻞﯾﺎﻓ Demos == ﺎﻫ ﻮﻣﺩ Disconnect diff --git a/data/languages/polish.txt b/data/languages/polish.txt index 8639b310f..c7f75573c 100644 --- a/data/languages/polish.txt +++ b/data/languages/polish.txt @@ -28,7 +28,7 @@ == Pozostało sekund: %i %s wins! -== Wygrał %d! +== Wygrał %s! -Page %d- == -Strona %d- diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index 5a8a2a1f4..5f09e1140 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -1233,7 +1233,7 @@ Existing Player == 玩家已存在 Your nickname '%s' is already used (%d points). Do you still want to use it? -== 你使用的昵称在DDNet中有%d分的记录,这可能代表改昵称已经被其他人使用过。确认要使用这个名字吗? +== 你使用的昵称"%s"在DDNet中有%d分的记录,这可能代表该昵称已经被其他人使用过。确认要使用这个名字吗? Checking for existing player with your name == 正在查找该昵称的DDNet记录 diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index eae839b0d..281a94e1b 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -1227,7 +1227,7 @@ Existing Player == 玩家已存在 Your nickname '%s' is already used (%d points). Do you still want to use it? -== 你使用的暱稱在DDNet中有%d分的記錄,這可能代表改暱稱已經被其他人使用過。確認要使用這個名字嗎? +== 你使用的暱稱"%s"在DDNet中有%d分的記錄,這可能代表這個暱稱已經被其他人使用過。確認要使用這個名字嗎? Checking for existing player with your name == 正在查詢該暱稱的DDNet記錄 diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt index 580a3d207..786d55dac 100644 --- a/data/languages/turkish.txt +++ b/data/languages/turkish.txt @@ -127,7 +127,7 @@ Demo details == Demo ayrıntıları Demofile: %s -== Demo dosyası +== Demo dosyası: %s Demos == Demolar diff --git a/scripts/languages/copy_fix.py b/scripts/languages/copy_fix.py index 856b5718c..ebd7b7902 100755 --- a/scripts/languages/copy_fix.py +++ b/scripts/languages/copy_fix.py @@ -3,55 +3,60 @@ import twlang import os import sys -os.chdir(os.path.dirname(__file__) + "/../..") - -if len(sys.argv) < 3: - print("usage: python copy_fix.py [--delete-unused] [--append-missing] [--delete-empty]") - sys.exit() -infile = sys.argv[1] -outfile = sys.argv[2] -args = sys.argv[3:] -delete_unused = False -append_missing = False -delete_empty = False -for arg in args: - if arg == "--delete-unused": - delete_unused = True - elif arg == "--append-missing": - append_missing = True - elif arg == "--delete-empty": - delete_empty = True - else: - print("No such argument '"+arg+"'.") - sys.exit() - -content = open(infile).readlines() -trans = twlang.translations(infile) -if delete_unused or append_missing: - local = twlang.localizes() -if append_missing: - supported = [] -for tran, (start, expr, end) in trans.items(): - if delete_unused and tran not in local: - content[start:end] = [None]*(end-start) - if append_missing and tran in local: - if expr or (not expr and delete_empty): - supported.append(local.index(tran)) - else: +def copy_fix(infile, delete_unused, append_missing, delete_empty): + content = open(infile).readlines() + trans = twlang.translations(infile) + if delete_unused or append_missing: + local = twlang.localizes() + if append_missing: + supported = [] + for tran, (start, expr, end) in trans.items(): + if delete_unused and tran not in local: content[start:end] = [None]*(end-start) - if delete_empty and not expr: - content[start:end] = [None]*(end-start) -content = [line for line in content if line != None] -if append_missing: - missing = [index for index in range(len(local)) if index not in supported] - if missing: - if content[-1] != "\n": - content.append("\n") - for i, miss in enumerate(missing): - if local[miss][1] != "": - content.append("["+local[miss][1]+"]\n") - content.append(local[miss][0]+"\n== \n\n") - content[-1] = content[-1][:-1] + if append_missing and tran in local: + if expr or (not expr and delete_empty): + supported.append(local.index(tran)) + else: + content[start:end] = [None]*(end-start) + if delete_empty and not expr: + content[start:end] = [None]*(end-start) + content = [line for line in content if line != None] + if append_missing: + missing = [index for index in range(len(local)) if index not in supported] + if missing: + if content[-1] != "\n": + content.append("\n") + for i, miss in enumerate(missing): + if local[miss][1] != "": + content.append("["+local[miss][1]+"]\n") + content.append(local[miss][0]+"\n== \n\n") + content[-1] = content[-1][:-1] + return "".join(content) -open(outfile, "w").write("".join(content)) -print("Successfully created '"+outfile+"'.") +if __name__ == '__main__': + os.chdir(os.path.dirname(__file__) + "/../..") + + if len(sys.argv) < 3: + print("usage: python copy_fix.py [--delete-unused] [--append-missing] [--delete-empty]") + sys.exit() + infile = sys.argv[1] + outfile = sys.argv[2] + args = sys.argv[3:] + delete_unused = False + append_missing = False + delete_empty = False + for arg in args: + if arg == "--delete-unused": + delete_unused = True + elif arg == "--append-missing": + append_missing = True + elif arg == "--delete-empty": + delete_empty = True + else: + print("No such argument '"+arg+"'.") + sys.exit() + + content = copy_fix(infile, delete_unused, append_missing, delete_empty) + + open(outfile, "w").write("".join(content)) + print("Successfully created '" + outfile + "'.") diff --git a/scripts/languages/readme.txt b/scripts/languages/readme.txt index a60d3fcce..e0d52a010 100644 --- a/scripts/languages/readme.txt +++ b/scripts/languages/readme.txt @@ -38,7 +38,7 @@ $ ./find_unchanged.py ../spanish.txt To update all languages: -$ for i in data/languages/*.txt; do [ "${i:t}" != "license.txt" ] && [ "${i:t}" != "index.txt" ] && scripts/languages/copy_fix.py $i $i.$$.tmp --delete-unused --append-missing && mv $i.$$.tmp $i; done +$ ./update_all.py To get a statistic of how complete the translation is: diff --git a/scripts/languages/twlang.py b/scripts/languages/twlang.py index cad2b9831..41a6de0d1 100644 --- a/scripts/languages/twlang.py +++ b/scripts/languages/twlang.py @@ -8,6 +8,21 @@ class LanguageDecodeError(Exception): super(LanguageDecodeError, self).__init__(error) +# Taken from https://stackoverflow.com/questions/30011379/how-can-i-parse-a-c-format-string-in-python +cfmt = '''\ +( # start of capture group 1 +% # literal "%" +(?: # first option +(?:[-+0 #]{0,5}) # optional flags +(?:\d+|\*)? # width +(?:\.(?:\d+|\*))? # precision +(?:h|l|ll|w|I|I32|I64)? # size +[cCdiouxXeEfgGaAnpsSZ] # type +) | # OR +%%) # literal "%%" +''' + + def decode(fileobj, elements_per_key): data = {} current_context = "" @@ -30,7 +45,11 @@ def decode(fileobj, elements_per_key): if len(data[current_key]) >= 1+elements_per_key: raise LanguageDecodeError("Wrong number of elements per key", fileobj.name, index) if current_key: - data[current_key].extend([line[3:]]) + original = current_key[0] + translation = line[3:] + if translation and [m.group(1) for m in re.finditer(cfmt, original, flags=re.X)] != [m.group(1) for m in re.finditer(cfmt, translation, flags=re.X)]: + raise LanguageDecodeError("Non-matching formatting string", fileobj.name, index) + data[current_key].extend([translation]) else: raise LanguageDecodeError("Element before key given", fileobj.name, index) else: @@ -68,7 +87,7 @@ def check_folder(path): def languages(): index = decode(open("data/languages/index.txt"), 2) - langs = {"data/languages/"+key+".txt" : [key]+elements for key, elements in index.items()} + langs = {"data/languages/"+key[0]+".txt" : [key[0]]+elements for key, elements in index.items()} return langs diff --git a/scripts/languages/update_all.py b/scripts/languages/update_all.py new file mode 100755 index 000000000..8642410d5 --- /dev/null +++ b/scripts/languages/update_all.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 +import os +from copy_fix import copy_fix +import twlang + +os.chdir(os.path.dirname(__file__) + "/../..") + +for lang in twlang.languages(): + content = copy_fix(lang, delete_unused=True, append_missing=True, delete_empty=False) + open(lang, "w").write(content) From 8c4beb987c07e30db87db0fac6580268b0729fba Mon Sep 17 00:00:00 2001 From: def Date: Thu, 12 Nov 2020 14:53:38 +0100 Subject: [PATCH 085/144] DemoRecorder: Only remove existing filenames As noticed by Jupstar --- src/engine/client/client.cpp | 3 ++- src/engine/shared/storage.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index d11acdf86..b3dd8be5d 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -3873,7 +3873,8 @@ void CClient::DemoRecorder_Stop(int Recorder, bool RemoveFile) if(RemoveFile) { const char *pFilename = (&m_DemoRecorder[Recorder])->GetCurrentFilename(); - Storage()->RemoveFile(pFilename, IStorage::TYPE_SAVE); + if(pFilename[0] != '\0') + Storage()->RemoveFile(pFilename, IStorage::TYPE_SAVE); } } diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index 27ddba4fe..3f2ca2486 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -481,7 +481,7 @@ public: bool Success = !fs_remove(aBuffer); if(!Success) - dbg_msg("storage", "failed to remove: %s", aBuffer); + dbg_msg("storage", "failed to remove binary: %s", aBuffer); return Success; } From 7aa6be9e1233d84252764fcb786f4364b64ec049 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 12 Nov 2020 22:55:22 +0100 Subject: [PATCH 086/144] Don't crash with debug mode in demo Since character doesn't exist then. Reported by murpi Originally introduced in https://github.com/ddnet/ddnet/pull/2578 --- src/game/client/components/debughud.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/game/client/components/debughud.cpp b/src/game/client/components/debughud.cpp index 54cc28879..221fe2ddd 100644 --- a/src/game/client/components/debughud.cpp +++ b/src/game/client/components/debughud.cpp @@ -54,7 +54,11 @@ void CDebugHud::RenderNetCorrections() w = TextRender()->TextWidth(0, Fontsize, aBuf, -1, -1.0f); TextRender()->Text(0, x - w, y, Fontsize, aBuf, -1.0f); y += LineHeight; - str_format(aBuf, sizeof(aBuf), "%d", m_pClient->m_GameWorld.GetCharacterByID(m_pClient->m_Snap.m_LocalClientID)->m_TeleCheckpoint); + const CCharacter *pCharacter = m_pClient->m_GameWorld.GetCharacterByID(m_pClient->m_Snap.m_LocalClientID); + if(pCharacter) + str_format(aBuf, sizeof(aBuf), "%d", pCharacter->m_TeleCheckpoint); + else + str_copy(aBuf, "-1", sizeof(aBuf)); w = TextRender()->TextWidth(0, Fontsize, aBuf, -1, -1.0f); TextRender()->Text(0, x - w, y, Fontsize, aBuf, -1.0f); y += 2 * LineHeight; From 0c416df9356cd700bd051b84622bfa408fc4de23 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 12 Nov 2020 19:17:21 +0100 Subject: [PATCH 087/144] =?UTF-8?q?Respect=20friend=20color=20in=20spectat?= =?UTF-8?q?e=20mode=20=E2=99=A5=20too?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As suggested by Cøke --- src/game/client/components/spectator.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/game/client/components/spectator.cpp b/src/game/client/components/spectator.cpp index 0c2e13148..acadddd97 100644 --- a/src/game/client/components/spectator.cpp +++ b/src/game/client/components/spectator.cpp @@ -417,8 +417,9 @@ void CSpectator::OnRender() if(m_pClient->m_aClients[m_pClient->m_Snap.m_paInfoByDDTeamName[i]->m_ClientID].m_Friend) { - TextRender()->TextColor(1.0f, 0.3f, 0.3f, 1.0f); - TextRender()->Text(0, Width / 2.0f + x - TeeInfo.m_Size / 2.0f, Height / 2.0f + y + BoxMove + (LineHeight - FontSize) / 2.f, FontSize, "♥ ", 220.0f); + ColorRGBA rgb = color_cast(ColorHSLA(g_Config.m_ClMessageFriendColor)); + TextRender()->TextColor(rgb.WithAlpha(1.f)); + TextRender()->Text(0, Width / 2.0f + x - TeeInfo.m_Size / 2.0f, Height / 2.0f + y + BoxMove + (LineHeight - FontSize) / 2.f, FontSize, "♥", 220.0f); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); } From 81bb7e661c460eba6f64b14c25b79b52423c2104 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 12 Nov 2020 14:20:38 +0100 Subject: [PATCH 088/144] Improve list box behaviour, make it more consistent Make keys work after searching in vote menu Unify some duplicated code --- src/game/client/components/menus.cpp | 73 +++++++++++++ src/game/client/components/menus.h | 1 + src/game/client/components/menus_browser.cpp | 70 +----------- src/game/client/components/menus_demo.cpp | 107 ++++--------------- src/game/client/components/menus_ingame.cpp | 59 ++-------- 5 files changed, 106 insertions(+), 204 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index dee7a467d..86d94c1a1 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -2642,3 +2642,76 @@ void CMenus::SetMenuPage(int NewPage) if(NewPage >= PAGE_INTERNET && NewPage <= PAGE_KOG) g_Config.m_UiPage = NewPage; } + +bool CMenus::HandleListInputs(const CUIRect &View, float &ScrollValue, const float ScrollAmount, int *pScrollOffset, const float ElemHeight, int &SelectedIndex, const int NumElems) +{ + int NewIndex = -1; + int Num = (int)(View.h / ElemHeight) + 1; + int ScrollNum = NumElems - Num + 1; + if(ScrollNum > 0) + { + if(pScrollOffset && *pScrollOffset >= 0) + { + ScrollValue = (float)(*pScrollOffset) / ScrollNum; + *pScrollOffset = -1; + } + if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP) && UI()->MouseInside(&View)) + ScrollValue -= 3.0f / ScrollNum; + if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&View)) + ScrollValue += 3.0f / ScrollNum; + } + else + ScrollNum = 0; + + if(ScrollValue < 0) + ScrollValue = 0; + if(ScrollValue > 1) + ScrollValue = 1; + + if(SelectedIndex < 0) + SelectedIndex = 0; + if(SelectedIndex >= NumElems) + SelectedIndex = NumElems; + + for(int i = 0; i < m_NumInputEvents; i++) + { + if(m_aInputEvents[i].m_Flags & IInput::FLAG_PRESS) + { + if(m_aInputEvents[i].m_Key == KEY_DOWN) + NewIndex = minimum(SelectedIndex + 1, NumElems - 1); + else if(m_aInputEvents[i].m_Key == KEY_UP) + NewIndex = maximum(SelectedIndex - 1, 0); + else if(m_aInputEvents[i].m_Key == KEY_PAGEUP) + NewIndex = maximum(SelectedIndex - 25, 0); + else if(m_aInputEvents[i].m_Key == KEY_PAGEDOWN) + NewIndex = minimum(SelectedIndex + 25, NumElems - 1); + else if(m_aInputEvents[i].m_Key == KEY_HOME) + NewIndex = 0; + else if(m_aInputEvents[i].m_Key == KEY_END) + NewIndex = NumElems - 1; + } + if(NewIndex > -1 && NewIndex < NumElems) + { + //scroll + float IndexY = View.y - ScrollValue * ScrollNum * ElemHeight + NewIndex * ElemHeight; + int Scroll = View.y > IndexY ? -1 : View.y + View.h < IndexY + ElemHeight ? 1 : 0; + if(Scroll) + { + if(Scroll < 0) + { + int NumScrolls = (View.y - IndexY + ElemHeight - 1.0f) / ElemHeight; + ScrollValue -= (1.0f / ScrollNum) * NumScrolls; + } + else + { + int NumScrolls = (IndexY + ElemHeight - (View.y + View.h) + ElemHeight - 1.0f) / ElemHeight; + ScrollValue += (1.0f / ScrollNum) * NumScrolls; + } + } + + SelectedIndex = NewIndex; + } + } + + return NewIndex != -1; +} diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index bfd36d297..bcca3a3b0 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -627,6 +627,7 @@ public: private: static int GhostlistFetchCallback(const char *pName, int IsDir, int StorageType, void *pUser); void SetMenuPage(int NewPage); + bool HandleListInputs(const CUIRect &View, float &ScrollValue, float ScrollAmount, int *pScrollOffset, float ElemHeight, int &SelectedIndex, int NumElems); // found in menus_ingame.cpp void RenderInGameNetwork(CUIRect MainView); diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 4ad59de6b..f62919660 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -165,29 +165,12 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) UI()->DoLabelScaled(&MsgBox, Localize("No servers match your filter criteria"), 16.0f, 0); } - int Num = (int)(View.h / s_aCols[0].m_Rect.h) + 1; static int s_ScrollBar = 0; static float s_ScrollValue = 0; Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = DoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); - int ScrollNum = NumServers - Num + 1; - if(ScrollNum > 0) - { - if(m_ScrollOffset >= 0) - { - s_ScrollValue = (float)(m_ScrollOffset) / ScrollNum; - m_ScrollOffset = -1; - } - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP) && UI()->MouseInside(&View)) - s_ScrollValue -= 3.0f / ScrollNum; - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&View)) - s_ScrollValue += 3.0f / ScrollNum; - } - else - ScrollNum = 0; - if(Input()->KeyPress(KEY_TAB) && m_pClient->m_pGameConsole->IsClosed()) { if(Input()->KeyIsPressed(KEY_LSHIFT) || Input()->KeyIsPressed(KEY_RSHIFT)) @@ -195,62 +178,19 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) else g_Config.m_UiToolboxPage = (g_Config.m_UiToolboxPage + 3 + 1) % 3; } - if(m_SelectedIndex < 0) - m_SelectedIndex = 0; - for(int i = 0; i < m_NumInputEvents; i++) + if(HandleListInputs(View, s_ScrollValue, 3.0f, &m_ScrollOffset, s_aCols[0].m_Rect.h, m_SelectedIndex, NumServers)) { - int NewIndex = -1; - if(m_aInputEvents[i].m_Flags & IInput::FLAG_PRESS) - { - if(m_aInputEvents[i].m_Key == KEY_DOWN) - NewIndex = minimum(m_SelectedIndex + 1, NumServers - 1); - else if(m_aInputEvents[i].m_Key == KEY_UP) - NewIndex = maximum(m_SelectedIndex - 1, 0); - else if(m_aInputEvents[i].m_Key == KEY_PAGEUP) - NewIndex = maximum(m_SelectedIndex - 25, 0); - else if(m_aInputEvents[i].m_Key == KEY_PAGEDOWN) - NewIndex = minimum(m_SelectedIndex + 25, NumServers - 1); - else if(m_aInputEvents[i].m_Key == KEY_HOME) - NewIndex = 0; - else if(m_aInputEvents[i].m_Key == KEY_END) - NewIndex = NumServers - 1; - } - if(NewIndex > -1 && NewIndex < NumServers) - { - //scroll - float IndexY = View.y - s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h + NewIndex * s_aCols[0].m_Rect.h; - int Scroll = View.y > IndexY ? -1 : View.y + View.h < IndexY + s_aCols[0].m_Rect.h ? 1 : 0; - if(Scroll) - { - if(Scroll < 0) - { - int NumScrolls = (View.y - IndexY + s_aCols[0].m_Rect.h - 1.0f) / s_aCols[0].m_Rect.h; - s_ScrollValue -= (1.0f / ScrollNum) * NumScrolls; - } - else - { - int NumScrolls = (IndexY + s_aCols[0].m_Rect.h - (View.y + View.h) + s_aCols[0].m_Rect.h - 1.0f) / s_aCols[0].m_Rect.h; - s_ScrollValue += (1.0f / ScrollNum) * NumScrolls; - } - } - - m_SelectedIndex = NewIndex; - - const CServerInfo *pItem = ServerBrowser()->SortedGet(m_SelectedIndex); - str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress, sizeof(g_Config.m_UiServerAddress)); - } + const CServerInfo *pItem = ServerBrowser()->SortedGet(m_SelectedIndex); + str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress, sizeof(g_Config.m_UiServerAddress)); } - if(s_ScrollValue < 0) - s_ScrollValue = 0; - if(s_ScrollValue > 1) - s_ScrollValue = 1; - // set clipping UI()->ClipEnable(&View); CUIRect OriginalView = View; + int Num = (int)(View.h / s_aCols[0].m_Rect.h) + 1; + int ScrollNum = NumServers - Num + 1; View.y -= s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h; int NewSelected = -1; diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index e5cafd789..66f45c3a9 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -561,29 +561,29 @@ void CMenus::UiDoListboxStart(const void *pID, const CUIRect *pRect, float RowHe { Num = 0; } - else if(Num == 1) - { - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP) && UI()->MouseInside(&View)) - gs_ListBoxScrollValue -= 0.1f; - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&View)) - gs_ListBoxScrollValue += 0.1f; - - if(gs_ListBoxScrollValue < 0.0f) - gs_ListBoxScrollValue = 0.0f; - if(gs_ListBoxScrollValue > 1.0f) - gs_ListBoxScrollValue = 1.0f; - } else { if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP) && UI()->MouseInside(&View)) - gs_ListBoxScrollValue -= 3.0f / Num; + gs_ListBoxScrollValue -= Num == 1 ? 0.1f : 3.0f / Num; if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&View)) - gs_ListBoxScrollValue += 3.0f / Num; + gs_ListBoxScrollValue += Num == 1 ? 0.1f : 3.0f / Num; + } - if(gs_ListBoxScrollValue < 0.0f) - gs_ListBoxScrollValue = 0.0f; - if(gs_ListBoxScrollValue > 1.0f) - gs_ListBoxScrollValue = 1.0f; + // TODO: Still have to press twice after updating search, why? + if(gs_ListBoxScrollValue < 0.0f) + gs_ListBoxScrollValue = 0.0f; + if(gs_ListBoxScrollValue > 1.0f) + gs_ListBoxScrollValue = 1.0f; + + if(gs_ListBoxSelectedIndex < 0) + { + gs_ListBoxSelectedIndex = 0; + gs_ListBoxNewSelected = 0; + } + if(gs_ListBoxSelectedIndex >= NumItems) + { + gs_ListBoxSelectedIndex = NumItems - 1; + gs_ListBoxNewSelected = NumItems - 1; } Scroll.HMargin(5.0f, &Scroll); @@ -1077,85 +1077,20 @@ void CMenus::RenderDemoList(CUIRect MainView) CUIRect Scroll; ListBox.VSplitRight(15, &ListBox, &Scroll); - int Num = (int)(ListBox.h / s_aCols[0].m_Rect.h) + 1; static int s_ScrollBar = 0; static float s_ScrollValue = 0; Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = DoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); - int ScrollNum = m_lDemos.size() - Num + 1; - if(ScrollNum > 0) - { - if(m_ScrollOffset) - { - s_ScrollValue = (float)(m_ScrollOffset) / ScrollNum; - m_ScrollOffset = 0; - } - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP) && UI()->MouseInside(&ListBox)) - s_ScrollValue -= 3.0f / ScrollNum; - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&ListBox)) - s_ScrollValue += 3.0f / ScrollNum; - } - else - ScrollNum = 0; - - if(m_DemolistSelectedIndex > -1) - { - for(int i = 0; i < m_NumInputEvents; i++) - { - int NewIndex = -1; - if(m_aInputEvents[i].m_Flags & IInput::FLAG_PRESS) - { - if(m_aInputEvents[i].m_Key == KEY_DOWN) - NewIndex = m_DemolistSelectedIndex + 1; - else if(m_aInputEvents[i].m_Key == KEY_UP) - NewIndex = m_DemolistSelectedIndex - 1; - else if(m_aInputEvents[i].m_Key == KEY_PAGEUP) - NewIndex = maximum(m_DemolistSelectedIndex - 20, 0); - else if(m_aInputEvents[i].m_Key == KEY_PAGEDOWN) - NewIndex = minimum(m_DemolistSelectedIndex + 20, m_lDemos.size() - 1); - else if(m_aInputEvents[i].m_Key == KEY_HOME) - NewIndex = 0; - else if(m_aInputEvents[i].m_Key == KEY_END) - NewIndex = m_lDemos.size() - 1; - } - if(NewIndex > -1 && NewIndex < m_lDemos.size()) - { - //scroll - float IndexY = ListBox.y - s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h + NewIndex * s_aCols[0].m_Rect.h; - int Scroll = ListBox.y > IndexY ? -1 : ListBox.y + ListBox.h < IndexY + s_aCols[0].m_Rect.h ? 1 : 0; - if(Scroll) - { - if(Scroll < 0) - { - int NumScrolls = (ListBox.y - IndexY + s_aCols[0].m_Rect.h - 1.0f) / s_aCols[0].m_Rect.h; - s_ScrollValue -= (1.0f / ScrollNum) * NumScrolls; - } - else - { - int NumScrolls = (IndexY + s_aCols[0].m_Rect.h - (ListBox.y + ListBox.h) + s_aCols[0].m_Rect.h - 1.0f) / s_aCols[0].m_Rect.h; - s_ScrollValue += (1.0f / ScrollNum) * NumScrolls; - } - } - - m_DemolistSelectedIndex = NewIndex; - - str_copy(g_Config.m_UiDemoSelected, m_lDemos[NewIndex].m_aName, sizeof(g_Config.m_UiDemoSelected)); - DemolistOnUpdate(false); - } - } - } - - if(s_ScrollValue < 0) - s_ScrollValue = 0; - if(s_ScrollValue > 1) - s_ScrollValue = 1; + HandleListInputs(ListBox, s_ScrollValue, 3.0f, &m_ScrollOffset, s_aCols[0].m_Rect.h, m_DemolistSelectedIndex, m_lDemos.size()); // set clipping UI()->ClipEnable(&ListBox); CUIRect OriginalView = ListBox; + int Num = (int)(ListBox.h / s_aCols[0].m_Rect.h) + 1; + int ScrollNum = m_lDemos.size() - Num + 1; ListBox.y -= s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h; int NewSelected = -1; diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 9171860a7..2bdc78a3c 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -559,7 +559,7 @@ bool CMenus::RenderServerControlServer(CUIRect MainView) bool CMenus::RenderServerControlKick(CUIRect MainView, bool FilterSpectators) { int NumOptions = 0; - int Selected = -1; + int Selected = 0; static int aPlayerIDs[MAX_CLIENTS]; for(auto &pInfoByName : m_pClient->m_Snap.m_paInfoByName) { @@ -1015,68 +1015,21 @@ void CMenus::RenderGhost(CUIRect MainView) View.VSplitRight(15, &View, &Scroll); int NumGhosts = m_lGhosts.size(); - - int Num = (int)(View.h / s_aCols[0].m_Rect.h) + 1; static int s_ScrollBar = 0; static float s_ScrollValue = 0; + static int s_SelectedIndex = 0; Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = DoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); - int ScrollNum = NumGhosts - Num + 1; - if(ScrollNum > 0) - { - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP)) - s_ScrollValue -= 1.0f / ScrollNum; - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN)) - s_ScrollValue += 1.0f / ScrollNum; - } - else - ScrollNum = 0; - - static int s_SelectedIndex = 0; - for(int i = 0; i < m_NumInputEvents; i++) - { - int NewIndex = -1; - if(m_aInputEvents[i].m_Flags & IInput::FLAG_PRESS) - { - if(m_aInputEvents[i].m_Key == KEY_DOWN) - NewIndex = s_SelectedIndex + 1; - if(m_aInputEvents[i].m_Key == KEY_UP) - NewIndex = s_SelectedIndex - 1; - } - if(NewIndex > -1 && NewIndex < NumGhosts) - { - //scroll - float IndexY = View.y - s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h + NewIndex * s_aCols[0].m_Rect.h; - int Scroll = View.y > IndexY ? -1 : View.y + View.h < IndexY + s_aCols[0].m_Rect.h ? 1 : 0; - if(Scroll) - { - if(Scroll < 0) - { - int NumScrolls = (View.y - IndexY + s_aCols[0].m_Rect.h - 1.0f) / s_aCols[0].m_Rect.h; - s_ScrollValue -= (1.0f / ScrollNum) * NumScrolls; - } - else - { - int NumScrolls = (IndexY + s_aCols[0].m_Rect.h - (View.y + View.h) + s_aCols[0].m_Rect.h - 1.0f) / s_aCols[0].m_Rect.h; - s_ScrollValue += (1.0f / ScrollNum) * NumScrolls; - } - } - - s_SelectedIndex = NewIndex; - } - } - - if(s_ScrollValue < 0) - s_ScrollValue = 0; - if(s_ScrollValue > 1) - s_ScrollValue = 1; + HandleListInputs(View, s_ScrollValue, 1.0f, nullptr, s_aCols[0].m_Rect.h, s_SelectedIndex, NumGhosts); // set clipping UI()->ClipEnable(&View); CUIRect OriginalView = View; + int Num = (int)(View.h / s_aCols[0].m_Rect.h) + 1; + int ScrollNum = NumGhosts - Num + 1; View.y -= s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h; int NewSelected = -1; @@ -1180,7 +1133,7 @@ void CMenus::RenderGhost(CUIRect MainView) Status.VSplitLeft(120.0f, &Button, &Status); static int s_ReloadButton = 0; - if(DoButton_Menu(&s_ReloadButton, Localize("Reload"), 0, &Button)) + if(DoButton_Menu(&s_ReloadButton, Localize("Reload"), 0, &Button) || Input()->KeyPress(KEY_F5)) { m_pClient->m_pGhost->UnloadAll(); GhostlistPopulate(); From c1826f6307d1483cb0ce7f515efcec0906f4911d Mon Sep 17 00:00:00 2001 From: Vlad <51330274+gerdoe-jr@users.noreply.github.com> Date: Fri, 13 Nov 2020 20:20:07 +0300 Subject: [PATCH 089/144] Update .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 262c6618e..e7fa66091 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,10 @@ unicode_confusables uuid versionsrv +# But we still should allow to download mastersrv/twping sources +!src/mastersrv +!src/twping + generated # IDE project files From cfd3f841066d2d1b97ab5f55400c51397a29be79 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 14 Nov 2020 00:22:21 +0100 Subject: [PATCH 090/144] Found some more times with mins, use hours for consistency --- src/game/server/ddracechat.cpp | 52 +++++++++++--------------- src/game/server/entities/character.cpp | 8 ++-- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/src/game/server/ddracechat.cpp b/src/game/server/ddracechat.cpp index 89322d151..9e186d700 100644 --- a/src/game/server/ddracechat.cpp +++ b/src/game/server/ddracechat.cpp @@ -1206,7 +1206,7 @@ void CGameContext::ConSayTime(IConsole::IResult *pResult, void *pUserData) return; int ClientID; - char aBufname[MAX_NAME_LENGTH]; + char aBufName[MAX_NAME_LENGTH]; if(pResult->NumArguments() > 0) { @@ -1217,11 +1217,11 @@ void CGameContext::ConSayTime(IConsole::IResult *pResult, void *pUserData) if(ClientID == MAX_CLIENTS) return; - str_format(aBufname, sizeof(aBufname), "%s's", pSelf->Server()->ClientName(ClientID)); + str_format(aBufName, sizeof(aBufName), "%s's", pSelf->Server()->ClientName(ClientID)); } else { - str_copy(aBufname, "Your", sizeof(aBufname)); + str_copy(aBufName, "Your", sizeof(aBufName)); ClientID = pResult->m_ClientID; } @@ -1234,13 +1234,12 @@ void CGameContext::ConSayTime(IConsole::IResult *pResult, void *pUserData) if(pChr->m_DDRaceState != DDRACE_STARTED) return; - char aBuftime[64]; - int IntTime = (int)((float)(pSelf->Server()->Tick() - pChr->m_StartTime) / ((float)pSelf->Server()->TickSpeed())); - str_format(aBuftime, sizeof(aBuftime), "%s time is %s%d:%s%d", - aBufname, - ((IntTime / 60) > 9) ? "" : "0", IntTime / 60, - ((IntTime % 60) > 9) ? "" : "0", IntTime % 60); - pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "time", aBuftime); + char aBufTime[32]; + char aBuf[64]; + int64 Time = (int64)100 * (float)(pSelf->Server()->Tick() - pChr->m_StartTime) / ((float)pSelf->Server()->TickSpeed()); + str_time(Time, TIME_HOURS, aBufTime, sizeof(aBufTime)); + str_format(aBuf, sizeof(aBuf), "%s current race time is %s", aBufName, aBufTime); + pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "time", aBuf); } void CGameContext::ConSayTimeAll(IConsole::IResult *pResult, void *pUserData) @@ -1258,14 +1257,13 @@ void CGameContext::ConSayTimeAll(IConsole::IResult *pResult, void *pUserData) if(pChr->m_DDRaceState != DDRACE_STARTED) return; - char aBuftime[64]; - int IntTime = (int)((float)(pSelf->Server()->Tick() - pChr->m_StartTime) / ((float)pSelf->Server()->TickSpeed())); - str_format(aBuftime, sizeof(aBuftime), - "%s\'s current race time is %s%d:%s%d", - pSelf->Server()->ClientName(pResult->m_ClientID), - ((IntTime / 60) > 9) ? "" : "0", IntTime / 60, - ((IntTime % 60) > 9) ? "" : "0", IntTime % 60); - pSelf->SendChat(-1, CGameContext::CHAT_ALL, aBuftime, pResult->m_ClientID); + char aBufTime[32]; + char aBuf[64]; + int64 Time = (int64)100 * (float)(pSelf->Server()->Tick() - pChr->m_StartTime) / ((float)pSelf->Server()->TickSpeed()); + const char *pName = pSelf->Server()->ClientName(pResult->m_ClientID); + str_time(Time, TIME_HOURS, aBufTime, sizeof(aBufTime)); + str_format(aBuf, sizeof(aBuf), "%s\'s current race time is %s", pName, aBufTime); + pSelf->SendChat(-1, CGameContext::CHAT_ALL, aBuf, pResult->m_ClientID); } void CGameContext::ConTime(IConsole::IResult *pResult, void *pUserData) @@ -1281,12 +1279,12 @@ void CGameContext::ConTime(IConsole::IResult *pResult, void *pUserData) if(!pChr) return; - char aBuftime[64]; - int IntTime = (int)((float)(pSelf->Server()->Tick() - pChr->m_StartTime) / ((float)pSelf->Server()->TickSpeed())); - str_format(aBuftime, sizeof(aBuftime), "Your time is %s%d:%s%d", - ((IntTime / 60) > 9) ? "" : "0", IntTime / 60, - ((IntTime % 60) > 9) ? "" : "0", IntTime % 60); - pSelf->SendBroadcast(aBuftime, pResult->m_ClientID); + char aBufTime[32]; + char aBuf[64]; + int64 Time = (int64)100 * (float)(pSelf->Server()->Tick() - pChr->m_StartTime) / ((float)pSelf->Server()->TickSpeed()); + str_time(Time, TIME_HOURS, aBufTime, sizeof(aBufTime)); + str_format(aBuf, sizeof(aBuf), "Your time is %s", aBufTime); + pSelf->SendBroadcast(aBuf, pResult->m_ClientID); } static const char s_aaMsg[4][128] = {"game/round timer.", "broadcast.", "both game/round timer and broadcast.", "racetime."}; @@ -1382,12 +1380,6 @@ void CGameContext::ConProtectedKill(IConsole::IResult *pResult, void *pUserData) if(g_Config.m_SvKillProtection != 0 && CurrTime >= (60 * g_Config.m_SvKillProtection) && pChr->m_DDRaceState == DDRACE_STARTED) { pPlayer->KillCharacter(WEAPON_SELF); - - //char aBuf[64]; - //str_format(aBuf, sizeof(aBuf), "You killed yourself in: %s%d:%s%d", - // ((CurrTime / 60) > 9) ? "" : "0", CurrTime / 60, - // ((CurrTime % 60) > 9) ? "" : "0", CurrTime % 60); - //pSelf->SendChatTarget(pResult->m_ClientID, aBuf); } } diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 4d1a18841..db8a7283f 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -1367,10 +1367,10 @@ void CCharacter::HandleBroadcast() } else if((m_pPlayer->m_TimerType == CPlayer::TIMERTYPE_BROADCAST || m_pPlayer->m_TimerType == CPlayer::TIMERTYPE_GAMETIMER_AND_BROADCAST) && m_DDRaceState == DDRACE_STARTED && m_LastBroadcast + Server()->TickSpeed() * g_Config.m_SvTimeInBroadcastInterval <= Server()->Tick()) { - char aBuftime[64]; - int IntTime = (int)((float)(Server()->Tick() - m_StartTime) / ((float)Server()->TickSpeed())); - str_format(aBuftime, sizeof(aBuftime), "%s%d:%s%d", ((IntTime / 60) > 9) ? "" : "0", IntTime / 60, ((IntTime % 60) > 9) ? "" : "0", IntTime % 60); - GameServer()->SendBroadcast(aBuftime, m_pPlayer->GetCID(), false); + char aBuf[32]; + int Time = (int64)100 * ((float)(Server()->Tick() - m_StartTime) / ((float)Server()->TickSpeed())); + str_time(Time, TIME_HOURS, aBuf, sizeof(aBuf)); + GameServer()->SendBroadcast(aBuf, m_pPlayer->GetCID(), false); m_CpLastBroadcast = m_CpActive; m_LastBroadcast = Server()->Tick(); } From d31397ade4ec65cf5a1a538f76e1474d4810985c Mon Sep 17 00:00:00 2001 From: Freddie Wang Date: Sun, 15 Nov 2020 13:24:18 +0800 Subject: [PATCH 091/144] doeditbox --- src/game/client/components/menus.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index dee7a467d..2b77e9dc8 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -459,6 +459,7 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS aDispEditingText[s_AtIndex + i] = aEditingText[i]; DispCursorPos = s_AtIndex + EditingTextCursor + 1; pDisplayStr = aDispEditingText; + UpdateOffset = true; } if(pDisplayStr[0] == '\0') @@ -467,14 +468,16 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS TextRender()->TextColor(1, 1, 1, 0.75f); } + DispCursorPos = minimum(DispCursorPos, str_length(pDisplayStr)); + // check if the text has to be moved if(UI()->LastActiveItem() == pID && !JustGotActive && (UpdateOffset || m_NumInputEvents)) { - float w = TextRender()->TextWidth(0, FontSize, pStr, s_AtIndex, -1.0f); + float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, DispCursorPos, -1.0f); if(w - *Offset > Textbox.w) { // move to the left - float wt = TextRender()->TextWidth(0, FontSize, pStr, -1, -1.0f); + float wt = TextRender()->TextWidth(0, FontSize, pDisplayStr, -1, -1.0f); do { *Offset += minimum(wt - *Offset - Textbox.w, Textbox.w / 3); @@ -492,7 +495,7 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS UI()->ClipEnable(pRect); Textbox.x -= *Offset; - UI()->DoLabel(&Textbox, pDisplayStr, FontSize, -1, Textbox.w * 2.0f); + UI()->DoLabel(&Textbox, pDisplayStr, FontSize, -1); TextRender()->TextColor(1, 1, 1, 1); @@ -505,7 +508,7 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS { float OffsetGlyph = TextRender()->GetGlyphOffsetX(FontSize, '|'); - float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, DispCursorPos, Textbox.w * 2.0f); + float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, DispCursorPos, -1); Textbox.x += w + OffsetGlyph; if((2 * time_get() / time_freq()) % 2) From 51a31774f822808ee5d711e489aed34450061097 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 15 Nov 2020 07:01:53 +0100 Subject: [PATCH 092/144] Don't trigger text alignment for editboxes --- src/game/client/components/menus.cpp | 14 +++++++------- src/game/client/ui.cpp | 8 ++++---- src/game/client/ui.h | 8 ++++---- src/game/editor/editor.cpp | 16 +++++++++------- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 2b77e9dc8..1dfb8dd2c 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -42,6 +42,8 @@ #include "menus.h" #include "skins.h" +#include + ColorRGBA CMenus::ms_GuiColor; ColorRGBA CMenus::ms_ColorTabbarInactiveOutgame; ColorRGBA CMenus::ms_ColorTabbarActiveOutgame; @@ -351,7 +353,7 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS for(int i = 1; i <= Len; i++) { - if(TextRender()->TextWidth(0, FontSize, pStr, i, -1.0f) - *Offset > MxRel) + if(TextRender()->TextWidth(0, FontSize, pStr, i, std::numeric_limits::max()) - *Offset > MxRel) { s_AtIndex = i - 1; break; @@ -473,11 +475,11 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS // check if the text has to be moved if(UI()->LastActiveItem() == pID && !JustGotActive && (UpdateOffset || m_NumInputEvents)) { - float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, DispCursorPos, -1.0f); + float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, DispCursorPos, std::numeric_limits::max()); if(w - *Offset > Textbox.w) { // move to the left - float wt = TextRender()->TextWidth(0, FontSize, pDisplayStr, -1, -1.0f); + float wt = TextRender()->TextWidth(0, FontSize, pDisplayStr, -1, std::numeric_limits::max()); do { *Offset += minimum(wt - *Offset - Textbox.w, Textbox.w / 3); @@ -506,10 +508,8 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS // render the cursor if(UI()->LastActiveItem() == pID && !JustGotActive) { - float OffsetGlyph = TextRender()->GetGlyphOffsetX(FontSize, '|'); - - float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, DispCursorPos, -1); - Textbox.x += w + OffsetGlyph; + float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, DispCursorPos, std::numeric_limits::max()); + Textbox.x += w; if((2 * time_get() / time_freq()) % 2) { diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp index e2d0bb754..0f445db9c 100644 --- a/src/game/client/ui.cpp +++ b/src/game/client/ui.cpp @@ -441,7 +441,7 @@ int CUI::DoButton(const void *id, const char *text, int checked, const CUIRect * return ret; }*/ -void CUI::DoLabel(const CUIRect *r, const char *pText, float Size, int Align, int MaxWidth, int AlignVertically) +void CUI::DoLabel(const CUIRect *r, const char *pText, float Size, int Align, float MaxWidth, int AlignVertically) { float AlignedSize = 0; float MaxCharacterHeightInLine = 0; @@ -465,12 +465,12 @@ void CUI::DoLabel(const CUIRect *r, const char *pText, float Size, int Align, in } } -void CUI::DoLabelScaled(const CUIRect *r, const char *pText, float Size, int Align, int MaxWidth, int AlignVertically) +void CUI::DoLabelScaled(const CUIRect *r, const char *pText, float Size, int Align, float MaxWidth, int AlignVertically) { DoLabel(r, pText, Size * Scale(), Align, MaxWidth, AlignVertically); } -void CUI::DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth, int AlignVertically, bool StopAtEnd, int StrLen, CTextCursor *pReadCursor) +void CUI::DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, float MaxWidth, int AlignVertically, bool StopAtEnd, int StrLen, CTextCursor *pReadCursor) { float AlignedSize = 0; float MaxCharacterHeightInLine = 0; @@ -515,7 +515,7 @@ void CUI::DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, cons RectEl.m_TextOutlineColor = TextRender()->GetTextOutlineColor(); } -void CUI::DoLabelStreamed(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth, int AlignVertically, bool StopAtEnd, int StrLen, CTextCursor *pReadCursor) +void CUI::DoLabelStreamed(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, float MaxWidth, int AlignVertically, bool StopAtEnd, int StrLen, CTextCursor *pReadCursor) { bool NeedsRecreate = false; bool ColorChanged = RectEl.m_TextColor != TextRender()->GetTextColor() || RectEl.m_TextOutlineColor != TextRender()->GetTextOutlineColor(); diff --git a/src/game/client/ui.h b/src/game/client/ui.h index 6ab98544f..604ea72b6 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -258,11 +258,11 @@ public: int DoPickerLogic(const void *pID, const CUIRect *pRect, float *pX, float *pY); // TODO: Refactor: Remove this? - void DoLabel(const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1, int AlignVertically = 1); - void DoLabelScaled(const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1, int AlignVertically = 1); + void DoLabel(const CUIRect *pRect, const char *pText, float Size, int Align, float MaxWidth = -1, int AlignVertically = 1); + void DoLabelScaled(const CUIRect *pRect, const char *pText, float Size, int Align, float MaxWidth = -1, int AlignVertically = 1); - void DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1, int AlignVertically = 1, bool StopAtEnd = false, int StrLen = -1, class CTextCursor *pReadCursor = NULL); - void DoLabelStreamed(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1, int AlignVertically = 1, bool StopAtEnd = false, int StrLen = -1, class CTextCursor *pReadCursor = NULL); + void DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, float MaxWidth = -1, int AlignVertically = 1, bool StopAtEnd = false, int StrLen = -1, class CTextCursor *pReadCursor = NULL); + void DoLabelStreamed(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, float MaxWidth = -1, int AlignVertically = 1, bool StopAtEnd = false, int StrLen = -1, class CTextCursor *pReadCursor = NULL); }; #endif diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 6e3f51730..0377626ed 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -35,6 +35,8 @@ #include "auto_map.h" #include "editor.h" +#include + static const char *VANILLA_IMAGES[] = { "bg_cloud1", "bg_cloud2", @@ -352,7 +354,7 @@ int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned Str for(int i = 1; i <= Len; i++) { - if(TextRender()->TextWidth(0, FontSize, pStr, i, -1.0f) - *Offset > MxRel) + if(TextRender()->TextWidth(0, FontSize, pStr, i, std::numeric_limits::max()) - *Offset > MxRel) { s_AtIndex = i - 1; break; @@ -451,11 +453,11 @@ int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned Str // check if the text has to be moved if(UI()->LastActiveItem() == pID && !JustGotActive && (UpdateOffset || Input()->NumEvents())) { - float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex, -1.0f); + float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex, std::numeric_limits::max()); if(w - *Offset > Textbox.w) { // move to the left - float wt = TextRender()->TextWidth(0, FontSize, pDisplayStr, -1, -1.0f); + float wt = TextRender()->TextWidth(0, FontSize, pDisplayStr, -1, std::numeric_limits::max()); do { *Offset += minimum(wt - *Offset - Textbox.w, Textbox.w / 3); @@ -473,18 +475,18 @@ int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned Str UI()->ClipEnable(pRect); Textbox.x -= *Offset; - UI()->DoLabel(&Textbox, pDisplayStr, FontSize, -1, Textbox.w * 2.0f); + UI()->DoLabel(&Textbox, pDisplayStr, FontSize, -1, std::numeric_limits::max()); // render the cursor if(UI()->LastActiveItem() == pID && !JustGotActive) { - float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex, Textbox.w * 2.0f); + float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex, std::numeric_limits::max()); Textbox = *pRect; Textbox.VSplitLeft(2.0f, 0, &Textbox); - Textbox.x += (w - *Offset - TextRender()->TextWidth(0, FontSize, "|", -1, Textbox.w * 2.0f) / 2); + Textbox.x += (w - *Offset - TextRender()->TextWidth(0, FontSize, "|", -1, std::numeric_limits::max()) / 2); if((2 * time_get() / time_freq()) % 2) // make it blink - UI()->DoLabel(&Textbox, "|", FontSize, -1, Textbox.w * 2.0f); + UI()->DoLabel(&Textbox, "|", FontSize, -1, std::numeric_limits::max()); } UI()->ClipDisable(); From e2be2878272501ef3f32ef1b26cb3fa757f4334a Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 15 Nov 2020 07:38:49 +0100 Subject: [PATCH 093/144] numeric robustness --- src/game/client/components/menus.cpp | 4 ++-- src/game/editor/editor.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 1dfb8dd2c..28741ffd7 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -483,7 +483,7 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS do { *Offset += minimum(wt - *Offset - Textbox.w, Textbox.w / 3); - } while(w - *Offset > Textbox.w); + } while(w - *Offset > Textbox.w + 0.0001f); } else if(w - *Offset < 0.0f) { @@ -491,7 +491,7 @@ int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrS do { *Offset = maximum(0.0f, *Offset - Textbox.w / 3); - } while(w - *Offset < 0.0f); + } while(w - *Offset < -0.0001f); } } UI()->ClipEnable(pRect); diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 0377626ed..250a7d313 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -461,7 +461,7 @@ int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned Str do { *Offset += minimum(wt - *Offset - Textbox.w, Textbox.w / 3); - } while(w - *Offset > Textbox.w); + } while(w - *Offset > Textbox.w + 0.0001f); } else if(w - *Offset < 0.0f) { @@ -469,7 +469,7 @@ int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned Str do { *Offset = maximum(0.0f, *Offset - Textbox.w / 3); - } while(w - *Offset < 0.0f); + } while(w - *Offset < -0.0001f); } } UI()->ClipEnable(pRect); From fbf0aedfb229da756550741d787b1b2ac236f6f6 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Sun, 15 Nov 2020 09:06:03 +0100 Subject: [PATCH 094/144] Fix statboard rendering --- src/game/client/components/statboard.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/client/components/statboard.cpp b/src/game/client/components/statboard.cpp index efba8c753..139e7936f 100644 --- a/src/game/client/components/statboard.cpp +++ b/src/game/client/components/statboard.cpp @@ -290,6 +290,7 @@ void CStatboard::RenderGlobalStats() str_format(aBuf, sizeof(aBuf), "%d", pStats->m_Frags); tw = TextRender()->TextWidth(0, FontSize, aBuf, -1, -1.0f); TextRender()->Text(0, x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); + px += 85; } // DEATHS { From 383327ea969eb217f6d781f74b00501d05c8e17e Mon Sep 17 00:00:00 2001 From: Freddie Wang Date: Sun, 15 Nov 2020 21:07:27 +0800 Subject: [PATCH 095/144] quick chinese fix --- data/languages/simplified_chinese.txt | 2 +- data/languages/traditional_chinese.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt index 5a8a2a1f4..63b154551 100644 --- a/data/languages/simplified_chinese.txt +++ b/data/languages/simplified_chinese.txt @@ -256,7 +256,7 @@ MOTD == 公告 Map -== 实体层背景地图 +== 地图 Maximum ping: == 最高延迟: diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt index eae839b0d..598de375a 100644 --- a/data/languages/traditional_chinese.txt +++ b/data/languages/traditional_chinese.txt @@ -250,7 +250,7 @@ MOTD == 公告 Map -== 實體層背景地圖 +== 地圖 Maximum ping: == 最高延遲: From c3f6d89cac8967adb3c19c2ecae8cd405d7fee5c Mon Sep 17 00:00:00 2001 From: def Date: Mon, 16 Nov 2020 17:32:46 +0100 Subject: [PATCH 096/144] Fix random map vote reason to set stars Caused by the hotfix for solo cheat As reported by maggi323 --- 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 3ebb43fef..9101eef68 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -1812,7 +1812,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) SendChatTarget(ClientID, "Invalid option"); return; } - if((str_startswith(pOption->m_aCommand, "sv_map ") || str_startswith(pOption->m_aCommand, "change_map ") || str_startswith(pOption->m_aCommand, "random_map") || str_startswith(pOption->m_aCommand, "random_unfinished_map")) && RateLimitPlayerMapVote(ClientID)) + if((str_find(pOption->m_aCommand, "sv_map ") != 0 || str_find(pOption->m_aCommand, "change_map ") != 0 || str_find(pOption->m_aCommand, "random_map") != 0 || str_find(pOption->m_aCommand, "random_unfinished_map") != 0) && RateLimitPlayerMapVote(ClientID)) { return; } @@ -1821,7 +1821,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) pOption->m_aDescription, aReason); str_format(aDesc, sizeof(aDesc), "%s", pOption->m_aDescription); - if((str_startswith(pOption->m_aCommand, "random_map") || str_startswith(pOption->m_aCommand, "random_unfinished_map")) && str_length(aReason) == 1 && aReason[0] >= '0' && aReason[0] <= '5') + if((str_endswith(pOption->m_aCommand, "random_map") || str_endswith(pOption->m_aCommand, "random_unfinished_map")) && str_length(aReason) == 1 && aReason[0] >= '0' && aReason[0] <= '5') { int Stars = aReason[0] - '0'; str_format(aCmd, sizeof(aCmd), "%s %d", pOption->m_aCommand, Stars); From c0b48ad89f67d3691aa5261fd4a279fab93b5c3b Mon Sep 17 00:00:00 2001 From: def Date: Mon, 16 Nov 2020 15:09:03 +0100 Subject: [PATCH 097/144] Disable ninja jetpack when player has telegun MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Required for map Taceht because of weapon tele interaction with jetpack As requested by Cøke --- src/game/server/entities/character.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 4d1a18841..2e2727ad1 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -470,7 +470,7 @@ void CCharacter::FireWeapon() case WEAPON_GUN: { - if(!m_Jetpack || !m_pPlayer->m_NinjaJetpack) + if(!m_Jetpack || !m_pPlayer->m_NinjaJetpack || m_Core.m_HasTelegunGun) { int Lifetime; if(!m_TuneZone) @@ -1119,7 +1119,7 @@ void CCharacter::SnapCharacter(int SnappingClient, int ID) } // change eyes, use ninja graphic and set ammo count if player has ninjajetpack - if(m_pPlayer->m_NinjaJetpack && m_Jetpack && m_Core.m_ActiveWeapon == WEAPON_GUN && !m_DeepFreeze && !(m_FreezeTime > 0 || m_FreezeTime == -1)) + if(m_pPlayer->m_NinjaJetpack && m_Jetpack && m_Core.m_ActiveWeapon == WEAPON_GUN && !m_DeepFreeze && !(m_FreezeTime > 0 || m_FreezeTime == -1) && !m_Core.m_HasTelegunGun) { if(Emote == EMOTE_NORMAL) Emote = EMOTE_HAPPY; @@ -1257,7 +1257,7 @@ void CCharacter::Snap(int SnappingClient) pDDNetCharacter->m_Flags |= CHARACTERFLAG_NO_HOOK; if(m_SuperJump) pDDNetCharacter->m_Flags |= CHARACTERFLAG_ENDLESS_JUMP; - if(m_Jetpack || m_NinjaJetpack) + if(m_Jetpack || (m_NinjaJetpack && !m_Core.m_HasTelegunGun)) pDDNetCharacter->m_Flags |= CHARACTERFLAG_JETPACK; if(m_Hit & DISABLE_HIT_GRENADE) pDDNetCharacter->m_Flags |= CHARACTERFLAG_NO_GRENADE_HIT; From d65af8029192adb779d115cc42857c86c9acdeb6 Mon Sep 17 00:00:00 2001 From: def Date: Sun, 8 Nov 2020 00:18:33 +0100 Subject: [PATCH 098/144] Version 15.2 --- 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 994139ac8..93c696249 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 "15.1.3" +#define GAME_RELEASE_VERSION "15.2" #endif #define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION #define GAME_NETVERSION "0.6 626fce9a778df4d4" #define GAME_NAME "DDNet" -#define CLIENT_VERSIONNR 15013 +#define CLIENT_VERSIONNR 15020 extern const char *GIT_SHORTREV_HASH; #endif From ed9a902bab4f10a2c4d61ce44cd7020b7cb7deb2 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 17 Nov 2020 13:26:12 +0100 Subject: [PATCH 099/144] Tag 15.2 version in ddnet.appdata.xml --- other/ddnet.appdata.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/other/ddnet.appdata.xml b/other/ddnet.appdata.xml index a0ae021ce..80a9d16c6 100644 --- a/other/ddnet.appdata.xml +++ b/other/ddnet.appdata.xml @@ -37,6 +37,7 @@ intense + From f9be02c411c16f83d0f3766254d622194424c044 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 17 Nov 2020 17:04:21 +0100 Subject: [PATCH 100/144] Version 15.2.1: Quick autoupdate fix --- src/engine/client/updater.cpp | 2 +- src/game/version.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/client/updater.cpp b/src/engine/client/updater.cpp index 541e79aca..c3b6642e6 100644 --- a/src/engine/client/updater.cpp +++ b/src/engine/client/updater.cpp @@ -246,7 +246,7 @@ bool CUpdater::ReplaceServer() void CUpdater::ParseUpdate() { char aPath[512]; - IOHANDLE File = m_pStorage->OpenFile(m_pStorage->GetBinaryPath("update/update.json", aPath, sizeof aPath), IOFLAG_READ, IStorage::TYPE_ALL); + IOHANDLE File = m_pStorage->OpenFile(m_pStorage->GetBinaryPath("update/update.json", aPath, sizeof aPath), IOFLAG_READ, IStorage::TYPE_ABSOLUTE); if(!File) return; diff --git a/src/game/version.h b/src/game/version.h index 93c696249..a764b076a 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 "15.2" +#define GAME_RELEASE_VERSION "15.2.1" #endif #define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION #define GAME_NETVERSION "0.6 626fce9a778df4d4" #define GAME_NAME "DDNet" -#define CLIENT_VERSIONNR 15020 +#define CLIENT_VERSIONNR 15021 extern const char *GIT_SHORTREV_HASH; #endif From 6cefbcbbf934b742bbafc3d05ae206ba0ff68da0 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Tue, 17 Nov 2020 18:01:23 +0100 Subject: [PATCH 101/144] Mod by zero --- src/game/client/render_map.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/client/render_map.cpp b/src/game/client/render_map.cpp index 14ccf23ee..e95292923 100644 --- a/src/game/client/render_map.cpp +++ b/src/game/client/render_map.cpp @@ -32,7 +32,10 @@ void CRenderTools::RenderEvalEnvelope(CEnvPoint *pPoints, int NumPoints, int Cha } int64 MaxPointTime = (int64)pPoints[NumPoints - 1].m_Time * 1000ll; - TimeMicros = TimeMicros % MaxPointTime; + if(MaxPointTime > 0) // TODO: remove this check when implementing a IO check for maps(in this case broken envelopes) + TimeMicros = TimeMicros % MaxPointTime; + else + TimeMicros = 0; int TimeMillis = (int)(TimeMicros / 1000ll); for(int i = 0; i < NumPoints - 1; i++) From f8b07f705ef5b8f35d05511163ee54bec44cbae5 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 17 Nov 2020 18:08:38 +0100 Subject: [PATCH 102/144] Version 15.2.2 --- other/ddnet.appdata.xml | 2 ++ src/game/version.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/other/ddnet.appdata.xml b/other/ddnet.appdata.xml index 80a9d16c6..73aeba03e 100644 --- a/other/ddnet.appdata.xml +++ b/other/ddnet.appdata.xml @@ -37,6 +37,8 @@ intense + + diff --git a/src/game/version.h b/src/game/version.h index a764b076a..9aadd96bf 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 "15.2.1" +#define GAME_RELEASE_VERSION "15.2.2" #endif #define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION #define GAME_NETVERSION "0.6 626fce9a778df4d4" #define GAME_NAME "DDNet" -#define CLIENT_VERSIONNR 15021 +#define CLIENT_VERSIONNR 15022 extern const char *GIT_SHORTREV_HASH; #endif From c989cd67f9aed0a180db3edb841768791d3b3d97 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Wed, 18 Nov 2020 07:36:19 +0100 Subject: [PATCH 103/144] Check skin/sprite images for correctness --- CMakeLists.txt | 4 +- src/engine/client/backend_sdl.cpp | 133 +------------- src/engine/client/graphics_threaded.cpp | 52 ++++++ src/engine/client/graphics_threaded.h | 2 + src/engine/graphics.h | 2 + src/engine/shared/dilate.cpp | 89 --------- src/engine/shared/dilate.h | 6 - src/engine/shared/image_manipulation.cpp | 222 +++++++++++++++++++++++ src/engine/shared/image_manipulation.h | 14 ++ src/game/client/components/skins.cpp | 2 +- src/game/client/gameclient.cpp | 6 +- src/game/editor/editor.cpp | 2 +- src/tools/dilate.cpp | 2 +- 13 files changed, 303 insertions(+), 233 deletions(-) delete mode 100644 src/engine/shared/dilate.cpp delete mode 100644 src/engine/shared/dilate.h create mode 100644 src/engine/shared/image_manipulation.cpp create mode 100644 src/engine/shared/image_manipulation.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 10efdedee..2f61f7a8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1490,8 +1490,6 @@ set_src(ENGINE_SHARED GLOB src/engine/shared datafile.h demo.cpp demo.h - dilate.cpp - dilate.h econ.cpp econ.h engine.cpp @@ -1502,6 +1500,8 @@ set_src(ENGINE_SHARED GLOB src/engine/shared global_uuid_manager.cpp huffman.cpp huffman.h + image_manipulation.cpp + image_manipulation.h jobs.cpp jobs.h json.cpp diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 05851a5c1..e7aabde64 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -36,6 +36,8 @@ #include "opengl_sl.h" #include "opengl_sl_program.h" +#include + #ifdef __MINGW32__ extern "C" { int putenv(const char *); @@ -177,19 +179,6 @@ bool CCommandProcessorFragment_General::RunCommand(const CCommandBuffer::SComman // ------------ CCommandProcessorFragment_OpenGL -static int HighestBit(int OfVar) -{ - if(!OfVar) - return 0; - - int RetV = 1; - - while(OfVar >>= 1) - RetV <<= 1; - - return RetV; -} - int CCommandProcessorFragment_OpenGL::TexFormatToOpenGLFormat(int TexFormat) { if(TexFormat == CCommandBuffer::TEXFORMAT_RGB) @@ -212,127 +201,11 @@ int CCommandProcessorFragment_OpenGL::TexFormatToImageColorChannelCount(int TexF return 4; } -static float CubicHermite(float A, float B, float C, float D, float t) -{ - float a = -A / 2.0f + (3.0f * B) / 2.0f - (3.0f * C) / 2.0f + D / 2.0f; - float b = A - (5.0f * B) / 2.0f + 2.0f * C - D / 2.0f; - float c = -A / 2.0f + C / 2.0f; - float d = B; - - return (a * t * t * t) + (b * t * t) + (c * t) + d; -} - -static void GetPixelClamped(uint8_t *pSourceImage, int x, int y, uint32_t W, uint32_t H, size_t BPP, uint8_t aTmp[]) -{ - x = clamp(x, 0, (int)W - 1); - y = clamp(y, 0, (int)H - 1); - - for(size_t i = 0; i < BPP; i++) - { - aTmp[i] = pSourceImage[x * BPP + (W * BPP * y) + i]; - } -} - -static void SampleBicubic(uint8_t *pSourceImage, float u, float v, uint32_t W, uint32_t H, size_t BPP, uint8_t aSample[]) -{ - float X = (u * W) - 0.5f; - int xInt = (int)X; - float xFract = X - floorf(X); - - float Y = (v * H) - 0.5f; - int yInt = (int)Y; - float yFract = Y - floorf(Y); - - uint8_t PX00[4]; - uint8_t PX10[4]; - uint8_t PX20[4]; - uint8_t PX30[4]; - - uint8_t PX01[4]; - uint8_t PX11[4]; - uint8_t PX21[4]; - uint8_t PX31[4]; - - uint8_t PX02[4]; - uint8_t PX12[4]; - uint8_t PX22[4]; - uint8_t PX32[4]; - - uint8_t PX03[4]; - uint8_t PX13[4]; - uint8_t PX23[4]; - uint8_t PX33[4]; - - GetPixelClamped(pSourceImage, xInt - 1, yInt - 1, W, H, BPP, PX00); - GetPixelClamped(pSourceImage, xInt + 0, yInt - 1, W, H, BPP, PX10); - GetPixelClamped(pSourceImage, xInt + 1, yInt - 1, W, H, BPP, PX20); - GetPixelClamped(pSourceImage, xInt + 2, yInt - 1, W, H, BPP, PX30); - - GetPixelClamped(pSourceImage, xInt - 1, yInt + 0, W, H, BPP, PX01); - GetPixelClamped(pSourceImage, xInt + 0, yInt + 0, W, H, BPP, PX11); - GetPixelClamped(pSourceImage, xInt + 1, yInt + 0, W, H, BPP, PX21); - GetPixelClamped(pSourceImage, xInt + 2, yInt + 0, W, H, BPP, PX31); - - GetPixelClamped(pSourceImage, xInt - 1, yInt + 1, W, H, BPP, PX02); - GetPixelClamped(pSourceImage, xInt + 0, yInt + 1, W, H, BPP, PX12); - GetPixelClamped(pSourceImage, xInt + 1, yInt + 1, W, H, BPP, PX22); - GetPixelClamped(pSourceImage, xInt + 2, yInt + 1, W, H, BPP, PX32); - - GetPixelClamped(pSourceImage, xInt - 1, yInt + 2, W, H, BPP, PX03); - GetPixelClamped(pSourceImage, xInt + 0, yInt + 2, W, H, BPP, PX13); - GetPixelClamped(pSourceImage, xInt + 1, yInt + 2, W, H, BPP, PX23); - GetPixelClamped(pSourceImage, xInt + 2, yInt + 2, W, H, BPP, PX33); - - for(size_t i = 0; i < BPP; i++) - { - float Clmn0 = CubicHermite(PX00[i], PX10[i], PX20[i], PX30[i], xFract); - float Clmn1 = CubicHermite(PX01[i], PX11[i], PX21[i], PX31[i], xFract); - float Clmn2 = CubicHermite(PX02[i], PX12[i], PX22[i], PX32[i], xFract); - float Clmn3 = CubicHermite(PX03[i], PX13[i], PX23[i], PX33[i], xFract); - - float Valuef = CubicHermite(Clmn0, Clmn1, Clmn2, Clmn3, yFract); - - Valuef = clamp(Valuef, 0.0f, 255.0f); - - aSample[i] = (uint8_t)Valuef; - } -} - -static void ResizeImage(uint8_t *pSourceImage, uint32_t SW, uint32_t SH, uint8_t *pDestinationImage, uint32_t W, uint32_t H, size_t BPP) -{ - uint8_t aSample[4]; - int y, x; - - for(y = 0; y < (int)H; ++y) - { - float v = (float)y / (float)(H - 1); - - for(x = 0; x < (int)W; ++x) - { - float u = (float)x / (float)(W - 1); - SampleBicubic(pSourceImage, u, v, SW, SH, BPP, aSample); - - for(size_t i = 0; i < BPP; ++i) - { - pDestinationImage[x * BPP + ((W * BPP) * y) + i] = aSample[i]; - } - } - } -} - void *CCommandProcessorFragment_OpenGL::Resize(int Width, int Height, int NewWidth, int NewHeight, int Format, const unsigned char *pData) { - unsigned char *pTmpData; - int Bpp = TexFormatToImageColorChannelCount(Format); - // All calls to Resize() ensure width & height are > 0, Bpp is always > 0, - // thus no allocation size 0 possible. - pTmpData = (unsigned char *)malloc((size_t)NewWidth * NewHeight * Bpp); // NOLINT(clang-analyzer-optin.portability.UnixAPI) - - ResizeImage((uint8_t *)pData, Width, Height, (uint8_t *)pTmpData, NewWidth, NewHeight, Bpp); - - return pTmpData; + return ResizeImage((const uint8_t *)pData, Width, Height, NewWidth, NewHeight, Bpp); } bool CCommandProcessorFragment_OpenGL::IsTexturedState(const CCommandBuffer::SState &State) diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index f0f3cc695..742f83ce0 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -22,6 +22,8 @@ #include #include +#include + #include // cosf, sinf, log2f #if defined(CONF_VIDEORECORDER) @@ -560,6 +562,56 @@ int CGraphics_Threaded::LoadPNG(CImageInfo *pImg, const char *pFilename, int Sto return 1; } +bool CGraphics_Threaded::CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) +{ + dbg_assert(DivX != 0 && DivY != 0, "Passing 0 to this function is not allowed."); + bool ImageIsValid = true; + bool WidthBroken = Img.m_Width == 0 || (Img.m_Width % DivX) != 0; + bool HeightBroken = Img.m_Height == 0 || (Img.m_Height % DivY) != 0; + if(WidthBroken || HeightBroken) + { + SWarning NewWarning; + str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg), Localize("The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs."), pFileName, DivX, DivY); + + m_Warnings.emplace_back(NewWarning); + + ImageIsValid = false; + } + + if(AllowResize && !ImageIsValid && Img.m_Width > 0 && Img.m_Height > 0) + { + int NewWidth = DivX; + int NewHeight = DivY; + if(WidthBroken) + { + NewWidth = maximum(HighestBit(Img.m_Width), DivX); + NewHeight = (NewWidth / DivX) * DivY; + } + else + { + NewHeight = maximum(HighestBit(Img.m_Height), DivY); + NewWidth = (NewHeight / DivY) * DivX; + } + + int ColorChannelCount = 4; + if(Img.m_Format == CImageInfo::FORMAT_ALPHA) + ColorChannelCount = 1; + else if(Img.m_Format == CImageInfo::FORMAT_RGB) + ColorChannelCount = 3; + else if(Img.m_Format == CImageInfo::FORMAT_RGBA) + ColorChannelCount = 4; + + uint8_t *pNewImg = ResizeImage((uint8_t *)Img.m_pData, Img.m_Width, Img.m_Height, NewWidth, NewHeight, ColorChannelCount); + free(Img.m_pData); + Img.m_pData = pNewImg; + Img.m_Width = NewWidth; + Img.m_Height = NewHeight; + ImageIsValid = true; + } + + return ImageIsValid; +} + void CGraphics_Threaded::CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, int FullWidth, int FullHeight, int ColorChannelCount, int SubOffsetX, int SubOffsetY, int SubCopyWidth, int SubCopyHeight) { for(int Y = 0; Y < SubCopyHeight; ++Y) diff --git a/src/engine/client/graphics_threaded.h b/src/engine/client/graphics_threaded.h index 13e0c4188..63f9f40fc 100644 --- a/src/engine/client/graphics_threaded.h +++ b/src/engine/client/graphics_threaded.h @@ -845,6 +845,8 @@ public: IGraphics::CTextureHandle LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) override; int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) override; + bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) override; + void CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, int FullWidth, int FullHeight, int ColorChannelCount, int SubOffsetX, int SubOffsetY, int SubCopyWidth, int SubCopyHeight) override; void CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, int DestWidth, int DestHeight, uint8_t *pSourceBuffer, int SrcWidth, int SrcHeight, int ColorChannelCount, int SrcSubOffsetX, int SrcSubOffsetY, int SrcSubCopyWidth, int SrcSubCopyHeight) override; diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 5c45f2d11..ad0b2261e 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -222,6 +222,8 @@ public: virtual int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) = 0; + virtual bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) = 0; + // destination and source buffer require to have the same width and height virtual void CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, int FullWidth, int FullHeight, int ColorChannelCount, int SubOffsetX, int SubOffsetY, int SubCopyWidth, int SubCopyHeight) = 0; diff --git a/src/engine/shared/dilate.cpp b/src/engine/shared/dilate.cpp deleted file mode 100644 index 62b3a536a..000000000 --- a/src/engine/shared/dilate.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include -#include - -static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pDest, unsigned char AlphaThreshold = 30) -{ - int ix, iy; - const int aDirX[] = {0, -1, 1, 0}; - const int aDirY[] = {-1, 0, 0, 1}; - - int AlphaCompIndex = BPP - 1; - - int m = 0; - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++, m += BPP) - { - for(int i = 0; i < BPP; ++i) - pDest[m + i] = pSrc[m + i]; - if(pSrc[m + AlphaCompIndex] > AlphaThreshold) - continue; - - int aSumOfOpaque[] = {0, 0, 0}; - int Counter = 0; - for(int c = 0; c < 4; c++) - { - ix = clamp(x + aDirX[c], 0, w - 1); - iy = clamp(y + aDirY[c], 0, h - 1); - int k = iy * w * BPP + ix * BPP; - if(pSrc[k + AlphaCompIndex] > AlphaThreshold) - { - for(int p = 0; p < BPP - 1; ++p) - // Seems safe for BPP = 3, 4 which we use. clang-analyzer seems to - // asssume being called with larger value. TODO: Can make this - // safer anyway. - aSumOfOpaque[p] += pSrc[k + p]; // NOLINT(clang-analyzer-core.uninitialized.Assign) - ++Counter; - break; - } - } - - if(Counter > 0) - { - for(int i = 0; i < BPP - 1; ++i) - { - aSumOfOpaque[i] /= Counter; - pDest[m + i] = (unsigned char)aSumOfOpaque[i]; - } - - pDest[m + AlphaCompIndex] = 255; - } - } - } -} - -static void CopyColorValues(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pDest) -{ - int m = 0; - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++, m += BPP) - { - for(int i = 0; i < BPP - 1; ++i) - pDest[m + i] = pSrc[m + i]; - } - } -} - -void DilateImage(unsigned char *pImageBuff, int w, int h, int BPP) -{ - unsigned char *apBuffer[2] = {NULL, NULL}; - - apBuffer[0] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); - apBuffer[1] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); - - unsigned char *pPixelBuff = (unsigned char *)pImageBuff; - - Dilate(w, h, BPP, pPixelBuff, apBuffer[0]); - - for(int i = 0; i < 5; i++) - { - Dilate(w, h, BPP, apBuffer[0], apBuffer[1]); - Dilate(w, h, BPP, apBuffer[1], apBuffer[0]); - } - - CopyColorValues(w, h, BPP, apBuffer[0], pPixelBuff); - - free(apBuffer[0]); - free(apBuffer[1]); -} diff --git a/src/engine/shared/dilate.h b/src/engine/shared/dilate.h deleted file mode 100644 index 368a6b35d..000000000 --- a/src/engine/shared/dilate.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ENGINE_SHARED_DILATE_H -#define ENGINE_SHARED_DILATE_H - -void DilateImage(unsigned char *pImageBuff, int w, int h, int BPP); - -#endif diff --git a/src/engine/shared/image_manipulation.cpp b/src/engine/shared/image_manipulation.cpp new file mode 100644 index 000000000..40cd7b456 --- /dev/null +++ b/src/engine/shared/image_manipulation.cpp @@ -0,0 +1,222 @@ +#include "image_manipulation.h" +#include +#include + +static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pDest, unsigned char AlphaThreshold = 30) +{ + int ix, iy; + const int aDirX[] = {0, -1, 1, 0}; + const int aDirY[] = {-1, 0, 0, 1}; + + int AlphaCompIndex = BPP - 1; + + int m = 0; + for(int y = 0; y < h; y++) + { + for(int x = 0; x < w; x++, m += BPP) + { + for(int i = 0; i < BPP; ++i) + pDest[m + i] = pSrc[m + i]; + if(pSrc[m + AlphaCompIndex] > AlphaThreshold) + continue; + + int aSumOfOpaque[] = {0, 0, 0}; + int Counter = 0; + for(int c = 0; c < 4; c++) + { + ix = clamp(x + aDirX[c], 0, w - 1); + iy = clamp(y + aDirY[c], 0, h - 1); + int k = iy * w * BPP + ix * BPP; + if(pSrc[k + AlphaCompIndex] > AlphaThreshold) + { + for(int p = 0; p < BPP - 1; ++p) + // Seems safe for BPP = 3, 4 which we use. clang-analyzer seems to + // asssume being called with larger value. TODO: Can make this + // safer anyway. + aSumOfOpaque[p] += pSrc[k + p]; // NOLINT(clang-analyzer-core.uninitialized.Assign) + ++Counter; + break; + } + } + + if(Counter > 0) + { + for(int i = 0; i < BPP - 1; ++i) + { + aSumOfOpaque[i] /= Counter; + pDest[m + i] = (unsigned char)aSumOfOpaque[i]; + } + + pDest[m + AlphaCompIndex] = 255; + } + } + } +} + +static void CopyColorValues(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pDest) +{ + int m = 0; + for(int y = 0; y < h; y++) + { + for(int x = 0; x < w; x++, m += BPP) + { + for(int i = 0; i < BPP - 1; ++i) + pDest[m + i] = pSrc[m + i]; + } + } +} + +void DilateImage(unsigned char *pImageBuff, int w, int h, int BPP) +{ + unsigned char *apBuffer[2] = {NULL, NULL}; + + apBuffer[0] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); + apBuffer[1] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); + + unsigned char *pPixelBuff = (unsigned char *)pImageBuff; + + Dilate(w, h, BPP, pPixelBuff, apBuffer[0]); + + for(int i = 0; i < 5; i++) + { + Dilate(w, h, BPP, apBuffer[0], apBuffer[1]); + Dilate(w, h, BPP, apBuffer[1], apBuffer[0]); + } + + CopyColorValues(w, h, BPP, apBuffer[0], pPixelBuff); + + free(apBuffer[0]); + free(apBuffer[1]); +} + +static float CubicHermite(float A, float B, float C, float D, float t) +{ + float a = -A / 2.0f + (3.0f * B) / 2.0f - (3.0f * C) / 2.0f + D / 2.0f; + float b = A - (5.0f * B) / 2.0f + 2.0f * C - D / 2.0f; + float c = -A / 2.0f + C / 2.0f; + float d = B; + + return (a * t * t * t) + (b * t * t) + (c * t) + d; +} + +static void GetPixelClamped(const uint8_t *pSourceImage, int x, int y, uint32_t W, uint32_t H, size_t BPP, uint8_t aTmp[]) +{ + x = clamp(x, 0, (int)W - 1); + y = clamp(y, 0, (int)H - 1); + + for(size_t i = 0; i < BPP; i++) + { + aTmp[i] = pSourceImage[x * BPP + (W * BPP * y) + i]; + } +} + +static void SampleBicubic(const uint8_t *pSourceImage, float u, float v, uint32_t W, uint32_t H, size_t BPP, uint8_t aSample[]) +{ + float X = (u * W) - 0.5f; + int xInt = (int)X; + float xFract = X - floorf(X); + + float Y = (v * H) - 0.5f; + int yInt = (int)Y; + float yFract = Y - floorf(Y); + + uint8_t PX00[4]; + uint8_t PX10[4]; + uint8_t PX20[4]; + uint8_t PX30[4]; + + uint8_t PX01[4]; + uint8_t PX11[4]; + uint8_t PX21[4]; + uint8_t PX31[4]; + + uint8_t PX02[4]; + uint8_t PX12[4]; + uint8_t PX22[4]; + uint8_t PX32[4]; + + uint8_t PX03[4]; + uint8_t PX13[4]; + uint8_t PX23[4]; + uint8_t PX33[4]; + + GetPixelClamped(pSourceImage, xInt - 1, yInt - 1, W, H, BPP, PX00); + GetPixelClamped(pSourceImage, xInt + 0, yInt - 1, W, H, BPP, PX10); + GetPixelClamped(pSourceImage, xInt + 1, yInt - 1, W, H, BPP, PX20); + GetPixelClamped(pSourceImage, xInt + 2, yInt - 1, W, H, BPP, PX30); + + GetPixelClamped(pSourceImage, xInt - 1, yInt + 0, W, H, BPP, PX01); + GetPixelClamped(pSourceImage, xInt + 0, yInt + 0, W, H, BPP, PX11); + GetPixelClamped(pSourceImage, xInt + 1, yInt + 0, W, H, BPP, PX21); + GetPixelClamped(pSourceImage, xInt + 2, yInt + 0, W, H, BPP, PX31); + + GetPixelClamped(pSourceImage, xInt - 1, yInt + 1, W, H, BPP, PX02); + GetPixelClamped(pSourceImage, xInt + 0, yInt + 1, W, H, BPP, PX12); + GetPixelClamped(pSourceImage, xInt + 1, yInt + 1, W, H, BPP, PX22); + GetPixelClamped(pSourceImage, xInt + 2, yInt + 1, W, H, BPP, PX32); + + GetPixelClamped(pSourceImage, xInt - 1, yInt + 2, W, H, BPP, PX03); + GetPixelClamped(pSourceImage, xInt + 0, yInt + 2, W, H, BPP, PX13); + GetPixelClamped(pSourceImage, xInt + 1, yInt + 2, W, H, BPP, PX23); + GetPixelClamped(pSourceImage, xInt + 2, yInt + 2, W, H, BPP, PX33); + + for(size_t i = 0; i < BPP; i++) + { + float Clmn0 = CubicHermite(PX00[i], PX10[i], PX20[i], PX30[i], xFract); + float Clmn1 = CubicHermite(PX01[i], PX11[i], PX21[i], PX31[i], xFract); + float Clmn2 = CubicHermite(PX02[i], PX12[i], PX22[i], PX32[i], xFract); + float Clmn3 = CubicHermite(PX03[i], PX13[i], PX23[i], PX33[i], xFract); + + float Valuef = CubicHermite(Clmn0, Clmn1, Clmn2, Clmn3, yFract); + + Valuef = clamp(Valuef, 0.0f, 255.0f); + + aSample[i] = (uint8_t)Valuef; + } +} + +static void ResizeImage(const uint8_t *pSourceImage, uint32_t SW, uint32_t SH, uint8_t *pDestinationImage, uint32_t W, uint32_t H, size_t BPP) +{ + uint8_t aSample[4]; + int y, x; + + for(y = 0; y < (int)H; ++y) + { + float v = (float)y / (float)(H - 1); + + for(x = 0; x < (int)W; ++x) + { + float u = (float)x / (float)(W - 1); + SampleBicubic(pSourceImage, u, v, SW, SH, BPP, aSample); + + for(size_t i = 0; i < BPP; ++i) + { + pDestinationImage[x * BPP + ((W * BPP) * y) + i] = aSample[i]; + } + } + } +} + +uint8_t *ResizeImage(const uint8_t *pImageData, int Width, int Height, int NewWidth, int NewHeight, int BPP) +{ + // All calls to Resize() ensure width & height are > 0, BPP is always > 0, + // thus no allocation size 0 possible. + uint8_t *pTmpData = (uint8_t *)malloc((size_t)NewWidth * NewHeight * BPP); // NOLINT(clang-analyzer-optin.portability.UnixAPI) + + ResizeImage(pImageData, Width, Height, pTmpData, NewWidth, NewHeight, BPP); + + return pTmpData; +} + +int HighestBit(int OfVar) +{ + if(!OfVar) + return 0; + + int RetV = 1; + + while(OfVar >>= 1) + RetV <<= 1; + + return RetV; +} diff --git a/src/engine/shared/image_manipulation.h b/src/engine/shared/image_manipulation.h new file mode 100644 index 000000000..b6464518a --- /dev/null +++ b/src/engine/shared/image_manipulation.h @@ -0,0 +1,14 @@ +#ifndef ENGINE_SHARED_IMAGE_MANIPULATION_H +#define ENGINE_SHARED_IMAGE_MANIPULATION_H + +#include +#include + +void DilateImage(unsigned char *pImageBuff, int w, int h, int BPP); + +// returned pointer is allocated with malloc +uint8_t *ResizeImage(const uint8_t *pImgData, int Width, int Height, int NewWidth, int NewHeight, int BPP); + +int HighestBit(int OfVar); + +#endif diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp index 73cae21f3..128cf43fb 100644 --- a/src/game/client/components/skins.cpp +++ b/src/game/client/components/skins.cpp @@ -94,7 +94,7 @@ int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) { char aBuf[512]; CImageInfo Info; - if(!Graphics()->LoadPNG(&Info, pPath, DirType)) + if(!Graphics()->LoadPNG(&Info, pPath, DirType) || !Graphics()->CheckImageDivisibility(pPath, Info, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridy, true)) { str_format(aBuf, sizeof(aBuf), "failed to load skin from %s", pName); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf); diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 9cb75354e..556d1f8a7 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -2659,7 +2659,7 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) else LoadGameSkin(pPath, true); } - else if(PngLoaded) + else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridy, true)) { m_GameSkin.m_SpriteHealthFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_FULL]); m_GameSkin.m_SpriteHealthEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_EMPTY]); @@ -2812,7 +2812,7 @@ void CGameClient::LoadEmoticonsSkin(const char *pPath, bool AsDir) else LoadEmoticonsSkin(pPath, true); } - else if(PngLoaded) + else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridy, true)) { for(int i = 0; i < 16; ++i) m_EmoticonsSkin.m_SpriteEmoticons[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_OOP + i]); @@ -2866,7 +2866,7 @@ void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir) else LoadParticlesSkin(pPath, true); } - else if(PngLoaded) + else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridy, true)) { m_ParticlesSkin.m_SpriteParticleSlice = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SLICE]); m_ParticlesSkin.m_SpriteParticleBall = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_BALL]); diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 250a7d313..cfd54cfee 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -30,7 +30,7 @@ #include #include -#include +#include #include "auto_map.h" #include "editor.h" diff --git a/src/tools/dilate.cpp b/src/tools/dilate.cpp index cc568c9ba..f509a661a 100644 --- a/src/tools/dilate.cpp +++ b/src/tools/dilate.cpp @@ -2,7 +2,7 @@ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include -#include +#include #include int DilateFile(const char *pFileName) From f38e4e133e4ef86eab4f034ff3af62e7b1a772b6 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Wed, 18 Nov 2020 12:41:20 +0100 Subject: [PATCH 104/144] Unlimited texture names --- src/engine/client/backend_sdl.cpp | 216 ++++++++++++------------ src/engine/client/backend_sdl.h | 7 +- src/engine/client/graphics_threaded.cpp | 25 ++- src/engine/client/graphics_threaded.h | 4 +- 4 files changed, 137 insertions(+), 115 deletions(-) diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp index 05851a5c1..58d565161 100644 --- a/src/engine/client/backend_sdl.cpp +++ b/src/engine/client/backend_sdl.cpp @@ -337,7 +337,7 @@ void *CCommandProcessorFragment_OpenGL::Resize(int Width, int Height, int NewWid bool CCommandProcessorFragment_OpenGL::IsTexturedState(const CCommandBuffer::SState &State) { - return State.m_Texture >= 0 && State.m_Texture < CCommandBuffer::MAX_TEXTURES; + return State.m_Texture >= 0 && State.m_Texture < (int)m_Textures.size(); } void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &State, bool Use2DArrayTextures) @@ -397,9 +397,9 @@ void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &St if(!Use2DArrayTextures) { glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, m_aTextures[State.m_Texture].m_Tex); + glBindTexture(GL_TEXTURE_2D, m_Textures[State.m_Texture].m_Tex); - if(m_aTextures[State.m_Texture].m_LastWrapMode != State.m_WrapMode) + if(m_Textures[State.m_Texture].m_LastWrapMode != State.m_WrapMode) { switch(State.m_WrapMode) { @@ -414,7 +414,7 @@ void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &St default: dbg_msg("render", "unknown wrapmode %d\n", State.m_WrapMode); }; - m_aTextures[State.m_Texture].m_LastWrapMode = State.m_WrapMode; + m_Textures[State.m_Texture].m_LastWrapMode = State.m_WrapMode; } } else @@ -423,13 +423,13 @@ void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &St { if(!m_HasShaders) glEnable(m_2DArrayTarget); - glBindTexture(m_2DArrayTarget, m_aTextures[State.m_Texture].m_Tex2DArray); + glBindTexture(m_2DArrayTarget, m_Textures[State.m_Texture].m_Tex2DArray); } else if(m_Has3DTextures) { if(!m_HasShaders) glEnable(GL_TEXTURE_3D); - glBindTexture(GL_TEXTURE_3D, m_aTextures[State.m_Texture].m_Tex2DArray); + glBindTexture(GL_TEXTURE_3D, m_Textures[State.m_Texture].m_Tex2DArray); } else { @@ -474,7 +474,7 @@ void CCommandProcessorFragment_OpenGL::Cmd_Init(const SCommand_Init *pCommand) void CCommandProcessorFragment_OpenGL::Cmd_Texture_Update(const CCommandBuffer::SCommand_Texture_Update *pCommand) { - glBindTexture(GL_TEXTURE_2D, m_aTextures[pCommand->m_Slot].m_Tex); + glBindTexture(GL_TEXTURE_2D, m_Textures[pCommand->m_Slot].m_Tex); void *pTexData = pCommand->m_pData; int Width = pCommand->m_Width; @@ -484,8 +484,8 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Update(const CCommandBuffer:: if(!m_HasNPOTTextures) { - float ResizeW = m_aTextures[pCommand->m_Slot].m_ResizeWidth; - float ResizeH = m_aTextures[pCommand->m_Slot].m_ResizeHeight; + float ResizeW = m_Textures[pCommand->m_Slot].m_ResizeWidth; + float ResizeH = m_Textures[pCommand->m_Slot].m_ResizeHeight; if(ResizeW > 0 && ResizeH > 0) { int ResizedW = (int)(Width * ResizeW); @@ -500,11 +500,11 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Update(const CCommandBuffer:: } } - if(m_aTextures[pCommand->m_Slot].m_RescaleCount > 0) + if(m_Textures[pCommand->m_Slot].m_RescaleCount > 0) { int OldWidth = Width; int OldHeight = Height; - for(int i = 0; i < m_aTextures[pCommand->m_Slot].m_RescaleCount; ++i) + for(int i = 0; i < m_Textures[pCommand->m_Slot].m_RescaleCount; ++i) { Width >>= 1; Height >>= 1; @@ -525,35 +525,35 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Update(const CCommandBuffer:: void CCommandProcessorFragment_OpenGL::DestroyTexture(int Slot) { - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) - m_aTextures[Slot].m_MemSize, std::memory_order_relaxed); + m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) - m_Textures[Slot].m_MemSize, std::memory_order_relaxed); - if(m_aTextures[Slot].m_Tex != 0) + if(m_Textures[Slot].m_Tex != 0) { - glDeleteTextures(1, &m_aTextures[Slot].m_Tex); + glDeleteTextures(1, &m_Textures[Slot].m_Tex); } - if(m_aTextures[Slot].m_Tex2DArray != 0) + if(m_Textures[Slot].m_Tex2DArray != 0) { - glDeleteTextures(1, &m_aTextures[Slot].m_Tex2DArray); + glDeleteTextures(1, &m_Textures[Slot].m_Tex2DArray); } if(IsNewApi()) { - if(m_aTextures[Slot].m_Sampler != 0) + if(m_Textures[Slot].m_Sampler != 0) { - glDeleteSamplers(1, &m_aTextures[Slot].m_Sampler); + glDeleteSamplers(1, &m_Textures[Slot].m_Sampler); } - if(m_aTextures[Slot].m_Sampler2DArray != 0) + if(m_Textures[Slot].m_Sampler2DArray != 0) { - glDeleteSamplers(1, &m_aTextures[Slot].m_Sampler2DArray); + glDeleteSamplers(1, &m_Textures[Slot].m_Sampler2DArray); } } - m_aTextures[Slot].m_Tex = 0; - m_aTextures[Slot].m_Sampler = 0; - m_aTextures[Slot].m_Tex2DArray = 0; - m_aTextures[Slot].m_Sampler2DArray = 0; - m_aTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; + m_Textures[Slot].m_Tex = 0; + m_Textures[Slot].m_Sampler = 0; + m_Textures[Slot].m_Tex2DArray = 0; + m_Textures[Slot].m_Sampler2DArray = 0; + m_Textures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; } void CCommandProcessorFragment_OpenGL::Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand) @@ -574,8 +574,11 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_MaxTexSize); } - m_aTextures[pCommand->m_Slot].m_ResizeWidth = -1.f; - m_aTextures[pCommand->m_Slot].m_ResizeHeight = -1.f; + if(pCommand->m_Slot >= (int)m_Textures.size()) + m_Textures.resize(m_Textures.size() * 2); + + m_Textures[pCommand->m_Slot].m_ResizeWidth = -1.f; + m_Textures[pCommand->m_Slot].m_ResizeHeight = -1.f; if(!m_HasNPOTTextures) { @@ -587,8 +590,8 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: free(pTexData); pTexData = pTmpData; - m_aTextures[pCommand->m_Slot].m_ResizeWidth = (float)PowerOfTwoWidth / (float)Width; - m_aTextures[pCommand->m_Slot].m_ResizeHeight = (float)PowerOfTwoHeight / (float)Height; + m_Textures[pCommand->m_Slot].m_ResizeWidth = (float)PowerOfTwoWidth / (float)Width; + m_Textures[pCommand->m_Slot].m_ResizeHeight = (float)PowerOfTwoHeight / (float)Height; Width = PowerOfTwoWidth; Height = PowerOfTwoHeight; @@ -627,9 +630,9 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: pTexData = pTmpData; } } - m_aTextures[pCommand->m_Slot].m_Width = Width; - m_aTextures[pCommand->m_Slot].m_Height = Height; - m_aTextures[pCommand->m_Slot].m_RescaleCount = RescaleCount; + m_Textures[pCommand->m_Slot].m_Width = Width; + m_Textures[pCommand->m_Slot].m_Height = Height; + m_Textures[pCommand->m_Slot].m_RescaleCount = RescaleCount; int Oglformat = TexFormatToOpenGLFormat(pCommand->m_Format); int StoreOglformat = TexFormatToOpenGLFormat(pCommand->m_StoreFormat); @@ -647,8 +650,8 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: if((pCommand->m_Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) { - glGenTextures(1, &m_aTextures[pCommand->m_Slot].m_Tex); - glBindTexture(GL_TEXTURE_2D, m_aTextures[pCommand->m_Slot].m_Tex); + glGenTextures(1, &m_Textures[pCommand->m_Slot].m_Tex); + glBindTexture(GL_TEXTURE_2D, m_Textures[pCommand->m_Slot].m_Tex); } if(pCommand->m_Flags & CCommandBuffer::TEXFLAG_NOMIPMAPS || !m_HasMipMaps) @@ -678,7 +681,7 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: { bool Is3DTexture = (pCommand->m_Flags & Flag3DTexture) != 0; - glGenTextures(1, &m_aTextures[pCommand->m_Slot].m_Tex2DArray); + glGenTextures(1, &m_Textures[pCommand->m_Slot].m_Tex2DArray); GLenum Target = GL_TEXTURE_3D; @@ -691,12 +694,12 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: Target = m_2DArrayTarget; } - glBindTexture(Target, m_aTextures[pCommand->m_Slot].m_Tex2DArray); + glBindTexture(Target, m_Textures[pCommand->m_Slot].m_Tex2DArray); if(IsNewApi()) { - glGenSamplers(1, &m_aTextures[pCommand->m_Slot].m_Sampler2DArray); - glBindSampler(0, m_aTextures[pCommand->m_Slot].m_Sampler2DArray); + glGenSamplers(1, &m_Textures[pCommand->m_Slot].m_Sampler2DArray); + glBindSampler(0, m_Textures[pCommand->m_Slot].m_Sampler2DArray); } glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -704,14 +707,14 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: { glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); if(IsNewApi()) - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } else { glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(Target, GL_GENERATE_MIPMAP, GL_TRUE); if(IsNewApi()) - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } glTexParameteri(Target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -722,11 +725,11 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: if(IsNewApi()) { - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); if(m_OpenGLTextureLodBIAS != 0) - glSamplerParameterf(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); + glSamplerParameterf(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); glBindSampler(0, 0); } @@ -786,17 +789,17 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer:: } // This is the initial value for the wrap modes - m_aTextures[pCommand->m_Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; + m_Textures[pCommand->m_Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; // calculate memory usage - m_aTextures[pCommand->m_Slot].m_MemSize = Width * Height * pCommand->m_PixelSize; + m_Textures[pCommand->m_Slot].m_MemSize = Width * Height * pCommand->m_PixelSize; while(Width > 2 && Height > 2) { Width >>= 1; Height >>= 1; - m_aTextures[pCommand->m_Slot].m_MemSize += Width * Height * pCommand->m_PixelSize; + m_Textures[pCommand->m_Slot].m_MemSize += Width * Height * pCommand->m_PixelSize; } - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_aTextures[pCommand->m_Slot].m_MemSize, std::memory_order_relaxed); + m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_Textures[pCommand->m_Slot].m_MemSize, std::memory_order_relaxed); free(pTexData); } @@ -871,7 +874,7 @@ void CCommandProcessorFragment_OpenGL::Cmd_Screenshot(const CCommandBuffer::SCom CCommandProcessorFragment_OpenGL::CCommandProcessorFragment_OpenGL() { - mem_zero(m_aTextures, sizeof(m_aTextures)); + m_Textures.resize(CCommandBuffer::MAX_TEXTURES); m_HasShaders = false; } @@ -1025,15 +1028,15 @@ void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &S glActiveTexture(GL_TEXTURE0 + Slot); if(!Use2DArrayTextures) { - glBindTexture(GL_TEXTURE_2D, m_aTextures[State.m_Texture].m_Tex); + glBindTexture(GL_TEXTURE_2D, m_Textures[State.m_Texture].m_Tex); if(IsNewApi()) - glBindSampler(Slot, m_aTextures[State.m_Texture].m_Sampler); + glBindSampler(Slot, m_Textures[State.m_Texture].m_Sampler); } else { - glBindTexture(GL_TEXTURE_2D_ARRAY, m_aTextures[State.m_Texture].m_Tex2DArray); + glBindTexture(GL_TEXTURE_2D_ARRAY, m_Textures[State.m_Texture].m_Tex2DArray); if(IsNewApi()) - glBindSampler(Slot, m_aTextures[State.m_Texture].m_Sampler2DArray); + glBindSampler(Slot, m_Textures[State.m_Texture].m_Sampler2DArray); } } } @@ -1044,9 +1047,9 @@ void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &S { if(!IsNewApi() && !m_HasShaders) glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, m_aTextures[State.m_Texture].m_Tex); + glBindTexture(GL_TEXTURE_2D, m_Textures[State.m_Texture].m_Tex); if(IsNewApi()) - glBindSampler(Slot, m_aTextures[State.m_Texture].m_Sampler); + glBindSampler(Slot, m_Textures[State.m_Texture].m_Sampler); } else { @@ -1054,17 +1057,17 @@ void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &S { if(!IsNewApi() && !m_HasShaders) glEnable(GL_TEXTURE_3D); - glBindTexture(GL_TEXTURE_3D, m_aTextures[State.m_Texture].m_Tex2DArray); + glBindTexture(GL_TEXTURE_3D, m_Textures[State.m_Texture].m_Tex2DArray); if(IsNewApi()) - glBindSampler(Slot, m_aTextures[State.m_Texture].m_Sampler2DArray); + glBindSampler(Slot, m_Textures[State.m_Texture].m_Sampler2DArray); } else { if(!IsNewApi() && !m_HasShaders) glEnable(m_2DArrayTarget); - glBindTexture(m_2DArrayTarget, m_aTextures[State.m_Texture].m_Tex2DArray); + glBindTexture(m_2DArrayTarget, m_Textures[State.m_Texture].m_Tex2DArray); if(IsNewApi()) - glBindSampler(Slot, m_aTextures[State.m_Texture].m_Sampler2DArray); + glBindSampler(Slot, m_Textures[State.m_Texture].m_Sampler2DArray); } } } @@ -1075,28 +1078,28 @@ void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &S pProgram->m_LastTextureSampler = Slot; } - if(m_aTextures[State.m_Texture].m_LastWrapMode != State.m_WrapMode && !Use2DArrayTextures) + if(m_Textures[State.m_Texture].m_LastWrapMode != State.m_WrapMode && !Use2DArrayTextures) { switch(State.m_WrapMode) { case CCommandBuffer::WRAP_REPEAT: if(IsNewApi()) { - glSamplerParameteri(m_aTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_S, GL_REPEAT); - glSamplerParameteri(m_aTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_T, GL_REPEAT); + glSamplerParameteri(m_Textures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_S, GL_REPEAT); + glSamplerParameteri(m_Textures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_T, GL_REPEAT); } break; case CCommandBuffer::WRAP_CLAMP: if(IsNewApi()) { - glSamplerParameteri(m_aTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_aTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glSamplerParameteri(m_Textures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glSamplerParameteri(m_Textures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } break; default: dbg_msg("render", "unknown wrapmode %d\n", State.m_WrapMode); }; - m_aTextures[State.m_Texture].m_LastWrapMode = State.m_WrapMode; + m_Textures[State.m_Texture].m_LastWrapMode = State.m_WrapMode; } } @@ -2615,7 +2618,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand m_CurrentIndicesInBuffer = CCommandBuffer::MAX_VERTICES / 4 * 6; - mem_zero(m_aTextures, sizeof(m_aTextures)); + m_Textures.resize(CCommandBuffer::MAX_TEXTURES); m_ClearColor.r = m_ClearColor.g = m_ClearColor.b = -1.f; @@ -2673,7 +2676,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Shutdown(const SCommand_Shutdown * glDeleteBuffers(1, &m_PrimitiveDrawBufferIDTex3D); glDeleteVertexArrays(1, &m_PrimitiveDrawVertexIDTex3D); - for(int i = 0; i < CCommandBuffer::MAX_TEXTURES; ++i) + for(int i = 0; i < (int)m_Textures.size(); ++i) { DestroyTexture(i); } @@ -2694,19 +2697,19 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Update(const CCommandBuffe //just tell, that we using this texture now IsAndUpdateTextureSlotBound(Slot, pCommand->m_Slot); glActiveTexture(GL_TEXTURE0 + Slot); - glBindSampler(Slot, m_aTextures[pCommand->m_Slot].m_Sampler); + glBindSampler(Slot, m_Textures[pCommand->m_Slot].m_Sampler); } - glBindTexture(GL_TEXTURE_2D, m_aTextures[pCommand->m_Slot].m_Tex); + glBindTexture(GL_TEXTURE_2D, m_Textures[pCommand->m_Slot].m_Tex); void *pTexData = pCommand->m_pData; int Width = pCommand->m_Width; int Height = pCommand->m_Height; int X = pCommand->m_X; int Y = pCommand->m_Y; - if(m_aTextures[pCommand->m_Slot].m_RescaleCount > 0) + if(m_Textures[pCommand->m_Slot].m_RescaleCount > 0) { - for(int i = 0; i < m_aTextures[pCommand->m_Slot].m_RescaleCount; ++i) + for(int i = 0; i < m_Textures[pCommand->m_Slot].m_RescaleCount; ++i) { Width >>= 1; Height >>= 1; @@ -2747,6 +2750,9 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffe int Height = pCommand->m_Height; void *pTexData = pCommand->m_pData; + if(pCommand->m_Slot >= (int)m_Textures.size()) + m_Textures.resize(m_Textures.size() * 2); + // resample if needed int RescaleCount = 0; if(pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGBA || pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGB || pCommand->m_Format == CCommandBuffer::TEXFORMAT_ALPHA) @@ -2775,9 +2781,9 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffe pTexData = pTmpData; } } - m_aTextures[pCommand->m_Slot].m_Width = Width; - m_aTextures[pCommand->m_Slot].m_Height = Height; - m_aTextures[pCommand->m_Slot].m_RescaleCount = RescaleCount; + m_Textures[pCommand->m_Slot].m_Width = Width; + m_Textures[pCommand->m_Slot].m_Height = Height; + m_Textures[pCommand->m_Slot].m_RescaleCount = RescaleCount; int Oglformat = TexFormatToNewOpenGLFormat(pCommand->m_Format); int StoreOglformat = TexFormatToNewOpenGLFormat(pCommand->m_StoreFormat); @@ -2806,11 +2812,11 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffe if((pCommand->m_Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) { - glGenTextures(1, &m_aTextures[pCommand->m_Slot].m_Tex); - glBindTexture(GL_TEXTURE_2D, m_aTextures[pCommand->m_Slot].m_Tex); + glGenTextures(1, &m_Textures[pCommand->m_Slot].m_Tex); + glBindTexture(GL_TEXTURE_2D, m_Textures[pCommand->m_Slot].m_Tex); - glGenSamplers(1, &m_aTextures[pCommand->m_Slot].m_Sampler); - glBindSampler(Slot, m_aTextures[pCommand->m_Slot].m_Sampler); + glGenSamplers(1, &m_Textures[pCommand->m_Slot].m_Sampler); + glBindSampler(Slot, m_Textures[pCommand->m_Slot].m_Sampler); } if(Oglformat == GL_RED) @@ -2827,8 +2833,8 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffe { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, StoreOglformat, Width, Height, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); } } @@ -2836,10 +2842,10 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffe { if((pCommand->m_Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) { - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); if(m_OpenGLTextureLodBIAS != 0) - glSamplerParameterf(m_aTextures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); + glSamplerParameterf(m_Textures[pCommand->m_Slot].m_Sampler, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); //prevent mipmap display bugs, when zooming out far if(Width >= 1024 && Height >= 1024) { @@ -2852,18 +2858,18 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffe if((pCommand->m_Flags & (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE | CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER)) != 0) { - glGenTextures(1, &m_aTextures[pCommand->m_Slot].m_Tex2DArray); - glBindTexture(GL_TEXTURE_2D_ARRAY, m_aTextures[pCommand->m_Slot].m_Tex2DArray); + glGenTextures(1, &m_Textures[pCommand->m_Slot].m_Tex2DArray); + glBindTexture(GL_TEXTURE_2D_ARRAY, m_Textures[pCommand->m_Slot].m_Tex2DArray); - glGenSamplers(1, &m_aTextures[pCommand->m_Slot].m_Sampler2DArray); - glBindSampler(Slot, m_aTextures[pCommand->m_Slot].m_Sampler2DArray); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); + glGenSamplers(1, &m_Textures[pCommand->m_Slot].m_Sampler2DArray); + glBindSampler(Slot, m_Textures[pCommand->m_Slot].m_Sampler2DArray); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glSamplerParameteri(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); if(m_OpenGLTextureLodBIAS != 0) - glSamplerParameterf(m_aTextures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); + glSamplerParameterf(m_Textures[pCommand->m_Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); int ImageColorChannels = TexFormatToImageColorChannelCount(pCommand->m_Format); @@ -2921,17 +2927,17 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffe } // This is the initial value for the wrap modes - m_aTextures[pCommand->m_Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; + m_Textures[pCommand->m_Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; // calculate memory usage - m_aTextures[pCommand->m_Slot].m_MemSize = Width * Height * pCommand->m_PixelSize; + m_Textures[pCommand->m_Slot].m_MemSize = Width * Height * pCommand->m_PixelSize; while(Width > 2 && Height > 2) { Width >>= 1; Height >>= 1; - m_aTextures[pCommand->m_Slot].m_MemSize += Width * Height * pCommand->m_PixelSize; + m_Textures[pCommand->m_Slot].m_MemSize += Width * Height * pCommand->m_PixelSize; } - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_aTextures[pCommand->m_Slot].m_MemSize, std::memory_order_relaxed); + m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_Textures[pCommand->m_Slot].m_MemSize, std::memory_order_relaxed); free(pTexData); } @@ -3496,25 +3502,25 @@ void CCommandProcessorFragment_OpenGL3_3::RenderText(const CCommandBuffer::SStat if(!IsAndUpdateTextureSlotBound(SlotText, TextTextureIndex)) { glActiveTexture(GL_TEXTURE0 + SlotText); - glBindTexture(GL_TEXTURE_2D, m_aTextures[TextTextureIndex].m_Tex); - glBindSampler(SlotText, m_aTextures[TextTextureIndex].m_Sampler); + glBindTexture(GL_TEXTURE_2D, m_Textures[TextTextureIndex].m_Tex); + glBindSampler(SlotText, m_Textures[TextTextureIndex].m_Sampler); } if(!IsAndUpdateTextureSlotBound(SlotTextOutline, TextOutlineTextureIndex)) { glActiveTexture(GL_TEXTURE0 + SlotTextOutline); - glBindTexture(GL_TEXTURE_2D, m_aTextures[TextOutlineTextureIndex].m_Tex); - glBindSampler(SlotTextOutline, m_aTextures[TextOutlineTextureIndex].m_Sampler); + glBindTexture(GL_TEXTURE_2D, m_Textures[TextOutlineTextureIndex].m_Tex); + glBindSampler(SlotTextOutline, m_Textures[TextOutlineTextureIndex].m_Sampler); } } else { SlotText = 0; SlotTextOutline = 1; - glBindTexture(GL_TEXTURE_2D, m_aTextures[TextTextureIndex].m_Tex); - glBindSampler(SlotText, m_aTextures[TextTextureIndex].m_Sampler); + glBindTexture(GL_TEXTURE_2D, m_Textures[TextTextureIndex].m_Tex); + glBindSampler(SlotText, m_Textures[TextTextureIndex].m_Sampler); glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, m_aTextures[TextOutlineTextureIndex].m_Tex); - glBindSampler(SlotTextOutline, m_aTextures[TextOutlineTextureIndex].m_Sampler); + glBindTexture(GL_TEXTURE_2D, m_Textures[TextOutlineTextureIndex].m_Tex); + glBindSampler(SlotTextOutline, m_Textures[TextOutlineTextureIndex].m_Sampler); glActiveTexture(GL_TEXTURE0); } diff --git a/src/engine/client/backend_sdl.h b/src/engine/client/backend_sdl.h index 332c5c4e7..876d934e2 100644 --- a/src/engine/client/backend_sdl.h +++ b/src/engine/client/backend_sdl.h @@ -114,7 +114,10 @@ protected: struct CTexture { CTexture() : - m_Tex(0), m_Tex2DArray(0), m_Sampler(0), m_Sampler2DArray(0) {} + m_Tex(0), m_Tex2DArray(0), m_Sampler(0), m_Sampler2DArray(0), m_LastWrapMode(CCommandBuffer::WRAP_REPEAT), m_MemSize(0), m_Width(0), m_Height(0), m_RescaleCount(0), m_ResizeWidth(0), m_ResizeHeight(0) + { + } + GLuint m_Tex; GLuint m_Tex2DArray; //or 3D texture as fallback GLuint m_Sampler; @@ -129,7 +132,7 @@ protected: float m_ResizeWidth; float m_ResizeHeight; }; - CTexture m_aTextures[CCommandBuffer::MAX_TEXTURES]; + std::vector m_Textures; std::atomic *m_pTextureMemoryUsage; GLint m_MaxTexSize; diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index f0f3cc695..59e78632d 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -270,7 +270,7 @@ int CGraphics_Threaded::UnloadTexture(CTextureHandle Index) Cmd.m_Slot = Index; m_pCommandBuffer->AddCommand(Cmd); - m_aTextureIndices[Index] = m_FirstFreeTexture; + m_TextureIndices[Index] = m_FirstFreeTexture; m_FirstFreeTexture = Index; return 0; } @@ -429,8 +429,20 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(int Width, int Heig // grab texture int Tex = m_FirstFreeTexture; - m_FirstFreeTexture = m_aTextureIndices[Tex]; - m_aTextureIndices[Tex] = -1; + if(Tex == -1) + { + size_t CurSize = m_TextureIndices.size(); + m_TextureIndices.resize(CurSize * 2); + for(size_t i = 0; i < CurSize - 1; ++i) + { + m_TextureIndices[CurSize + i] = CurSize + i + 1; + } + m_TextureIndices.back() = -1; + + Tex = CurSize; + } + m_FirstFreeTexture = m_TextureIndices[Tex]; + m_TextureIndices[Tex] = -1; CCommandBuffer::SCommand_Texture_Create Cmd; Cmd.m_Slot = Tex; @@ -2291,9 +2303,10 @@ int CGraphics_Threaded::Init() // init textures m_FirstFreeTexture = 0; - for(int i = 0; i < CCommandBuffer::MAX_TEXTURES - 1; i++) - m_aTextureIndices[i] = i + 1; - m_aTextureIndices[CCommandBuffer::MAX_TEXTURES - 1] = -1; + m_TextureIndices.resize(CCommandBuffer::MAX_TEXTURES); + for(int i = 0; i < (int)m_TextureIndices.size() - 1; i++) + m_TextureIndices[i] = i + 1; + m_TextureIndices.back() = -1; m_FirstFreeVertexArrayInfo = -1; m_FirstFreeBufferObjectIndex = -1; diff --git a/src/engine/client/graphics_threaded.h b/src/engine/client/graphics_threaded.h index 13e0c4188..b8b2e9b31 100644 --- a/src/engine/client/graphics_threaded.h +++ b/src/engine/client/graphics_threaded.h @@ -64,7 +64,7 @@ public: enum { - MAX_TEXTURES = 1024 * 32, + MAX_TEXTURES = 1024 * 8, MAX_VERTICES = 32 * 1024, }; @@ -720,7 +720,7 @@ class CGraphics_Threaded : public IEngineGraphics CTextureHandle m_InvalidTexture; - int m_aTextureIndices[CCommandBuffer::MAX_TEXTURES]; + std::vector m_TextureIndices; int m_FirstFreeTexture; int m_TextureMemoryUsage; From d99f1b934022f4483c1dec1ab74dfb1e4f4621ad Mon Sep 17 00:00:00 2001 From: def Date: Wed, 18 Nov 2020 14:31:05 +0100 Subject: [PATCH 105/144] Allow utf8 ban reasons (fixes #3329) --- src/base/system.c | 13 ------------- src/base/system.h | 12 ------------ src/engine/shared/network_conn.cpp | 7 ++----- 3 files changed, 2 insertions(+), 30 deletions(-) diff --git a/src/base/system.c b/src/base/system.c index c8f29fbee..6cc508c08 100644 --- a/src/base/system.c +++ b/src/base/system.c @@ -2417,19 +2417,6 @@ char *str_trim_words(char *str, int words) return str; } -/* makes sure that the string only contains the characters between 32 and 127 */ -void str_sanitize_strong(char *str_in) -{ - unsigned char *str = (unsigned char *)str_in; - while(*str) - { - *str &= 0x7f; - if(*str < 32) - *str = 32; - str++; - } -} - /* makes sure that the string only contains the characters between 32 and 255 */ void str_sanitize_cc(char *str_in) { diff --git a/src/base/system.h b/src/base/system.h index a1967c5ef..7cbe0c94b 100644 --- a/src/base/system.h +++ b/src/base/system.h @@ -1101,18 +1101,6 @@ int str_format(char *buffer, int buffer_size, const char *format, ...) */ char *str_trim_words(char *str, int words); -/* - Function: str_sanitize_strong - Replaces all characters below 32 and above 127 with whitespace. - - Parameters: - str - String to sanitize. - - Remarks: - - The strings are treated as zero-terminated strings. -*/ -void str_sanitize_strong(char *str); - /* Function: str_sanitize_cc Replaces all characters below 32 with whitespace. diff --git a/src/engine/shared/network_conn.cpp b/src/engine/shared/network_conn.cpp index dd39c6c3b..757e53563 100644 --- a/src/engine/shared/network_conn.cpp +++ b/src/engine/shared/network_conn.cpp @@ -294,11 +294,8 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr, SECURITY_ if(pPacket->m_DataSize > 1) { // make sure to sanitize the error string form the other party - if(pPacket->m_DataSize < 128) - str_copy(aStr, (char *)&pPacket->m_aChunkData[1], pPacket->m_DataSize); - else - str_copy(aStr, (char *)&pPacket->m_aChunkData[1], sizeof(aStr)); - str_sanitize_strong(aStr); + str_utf8_copy(aStr, (char *)&pPacket->m_aChunkData[1], minimum(pPacket->m_DataSize, (int)sizeof(aStr))); + str_sanitize_cc(aStr); } if(!m_BlockCloseMsg) From 2a7ba8fe30f0d6ee3ee5bdbd74396d412de122c1 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Tue, 17 Nov 2020 20:58:49 +0100 Subject: [PATCH 106/144] Add ball particles, even for invalid projectiles --- src/game/client/components/items.cpp | 78 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index 79726bb51..ed6a61b1b 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -24,20 +24,22 @@ void CItems::OnReset() void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID) { + int CurWeapon = clamp(pCurrent->m_Type, 0, NUM_WEAPONS - 1); + // get positions float Curvature = 0; float Speed = 0; - if(pCurrent->m_Type == WEAPON_GRENADE) + if(CurWeapon == WEAPON_GRENADE) { Curvature = m_pClient->m_Tuning[g_Config.m_ClDummy].m_GrenadeCurvature; Speed = m_pClient->m_Tuning[g_Config.m_ClDummy].m_GrenadeSpeed; } - else if(pCurrent->m_Type == WEAPON_SHOTGUN) + else if(CurWeapon == WEAPON_SHOTGUN) { Curvature = m_pClient->m_Tuning[g_Config.m_ClDummy].m_ShotgunCurvature; Speed = m_pClient->m_Tuning[g_Config.m_ClDummy].m_ShotgunSpeed; } - else if(pCurrent->m_Type == WEAPON_GUN) + else if(CurWeapon == WEAPON_GUN) { Curvature = m_pClient->m_Tuning[g_Config.m_ClDummy].m_GunCurvature; Speed = m_pClient->m_Tuning[g_Config.m_ClDummy].m_GunSpeed; @@ -77,7 +79,40 @@ void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID) Alpha = g_Config.m_ClShowOthersAlpha / 100.0f; } - int CurWeapon = clamp(pCurrent->m_Type, 0, NUM_WEAPONS - 1); + vec2 Vel = Pos - PrevPos; + + // add particle for this projectile + // don't check for validity of the projectile for the current weapon here, so particle effects are rendered for mod compability + if(CurWeapon == WEAPON_GRENADE) + { + m_pClient->m_pEffects->SmokeTrail(Pos, Vel * -1, Alpha); + static float s_Time = 0.0f; + static float s_LastLocalTime = LocalTime(); + + if(Client()->State() == IClient::STATE_DEMOPLAYBACK) + { + const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); + if(!pInfo->m_Paused) + s_Time += (LocalTime() - s_LastLocalTime) * pInfo->m_Speed; + } + else + { + if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) + s_Time += LocalTime() - s_LastLocalTime; + } + + Graphics()->QuadsSetRotation(s_Time * pi * 2 * 2 + ItemID); + s_LastLocalTime = LocalTime(); + } + else + { + m_pClient->m_pEffects->BulletTrail(Pos, Alpha); + + if(length(Vel) > 0.00001f) + Graphics()->QuadsSetRotation(GetAngle(Vel)); + else + Graphics()->QuadsSetRotation(0); + } if(GameClient()->m_GameSkin.m_SpriteWeaponProjectiles[CurWeapon] != -1) { @@ -86,41 +121,6 @@ void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID) int QuadOffset = 2 + 8 + NUM_WEAPONS + CurWeapon; - vec2 Vel = Pos - PrevPos; - //vec2 pos = mix(vec2(prev->x, prev->y), vec2(current->x, current->y), Client()->IntraGameTick(g_Config.m_ClDummy)); - - // add particle for this projectile - if(pCurrent->m_Type == WEAPON_GRENADE) - { - m_pClient->m_pEffects->SmokeTrail(Pos, Vel * -1, Alpha); - static float s_Time = 0.0f; - static float s_LastLocalTime = LocalTime(); - - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(!pInfo->m_Paused) - s_Time += (LocalTime() - s_LastLocalTime) * pInfo->m_Speed; - } - else - { - if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - s_Time += LocalTime() - s_LastLocalTime; - } - - Graphics()->QuadsSetRotation(s_Time * pi * 2 * 2 + ItemID); - s_LastLocalTime = LocalTime(); - } - else - { - m_pClient->m_pEffects->BulletTrail(Pos, Alpha); - - if(length(Vel) > 0.00001f) - Graphics()->QuadsSetRotation(GetAngle(Vel)); - else - Graphics()->QuadsSetRotation(0); - } - Graphics()->RenderQuadContainerAsSprite(m_ItemsQuadContainerIndex, QuadOffset, Pos.x, Pos.y); } } From 227405b645159028fde22043e135d30a97578e25 Mon Sep 17 00:00:00 2001 From: Dennis Felsing Date: Thu, 19 Nov 2020 10:20:13 +0100 Subject: [PATCH 107/144] Update src/game/server/entities/character.cpp Co-authored-by: heinrich5991 --- src/game/server/entities/character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 2e2727ad1..5b1e4fae6 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -1257,7 +1257,7 @@ void CCharacter::Snap(int SnappingClient) pDDNetCharacter->m_Flags |= CHARACTERFLAG_NO_HOOK; if(m_SuperJump) pDDNetCharacter->m_Flags |= CHARACTERFLAG_ENDLESS_JUMP; - if(m_Jetpack || (m_NinjaJetpack && !m_Core.m_HasTelegunGun)) + if(m_Jetpack) pDDNetCharacter->m_Flags |= CHARACTERFLAG_JETPACK; if(m_Hit & DISABLE_HIT_GRENADE) pDDNetCharacter->m_Flags |= CHARACTERFLAG_NO_GRENADE_HIT; From 0278200da8d32679ca356c7a7be0e519ce95d830 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 19 Nov 2020 16:16:33 +0100 Subject: [PATCH 108/144] Version 15.2.3 --- other/ddnet.appdata.xml | 1 + src/game/version.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/other/ddnet.appdata.xml b/other/ddnet.appdata.xml index 73aeba03e..7c465abeb 100644 --- a/other/ddnet.appdata.xml +++ b/other/ddnet.appdata.xml @@ -37,6 +37,7 @@ intense + diff --git a/src/game/version.h b/src/game/version.h index 9aadd96bf..d29b55d7f 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 "15.2.2" +#define GAME_RELEASE_VERSION "15.2.3" #endif #define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION #define GAME_NETVERSION "0.6 626fce9a778df4d4" #define GAME_NAME "DDNet" -#define CLIENT_VERSIONNR 15022 +#define CLIENT_VERSIONNR 15023 extern const char *GIT_SHORTREV_HASH; #endif From b70a59d112ad2c58e6a54bca0d4740e9680a98f1 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 19 Nov 2020 16:15:07 +0100 Subject: [PATCH 109/144] Add benchmark command for pts --- src/engine/client/client.cpp | 45 ++++++++++++++++++++++++++++++------ src/engine/client/client.h | 5 ++++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index b3dd8be5d..3717bb00b 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -359,6 +359,8 @@ CClient::CClient() : m_GenerateTimeoutSeed = true; m_FrameTimeAvg = 0.0001f; + m_BenchmarkFile = 0; + m_BenchmarkStopTime = 0; } // ----- send functions ----- @@ -3258,6 +3260,19 @@ void CClient::Run() m_RenderFrameTimeHigh = m_RenderFrameTime; m_FpsGraph.Add(1.0f / m_RenderFrameTime, 1, 1, 1); + if(m_BenchmarkFile) + { + char aBuf[64]; + str_format(aBuf, sizeof(aBuf), "Frametime %d us\n", (int)(m_RenderFrameTime * 1000000)); + io_write(m_BenchmarkFile, aBuf, strlen(aBuf)); + if(time_get() > m_BenchmarkStopTime) + { + io_close(m_BenchmarkFile); + m_BenchmarkFile = 0; + Quit(); + } + } + m_FrameTimeAvg = m_FrameTimeAvg * 0.9f + m_RenderFrameTime * 0.1f; // keep the overflow time - it's used to make sure the gfx refreshrate is reached @@ -3912,6 +3927,21 @@ void CClient::Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData) pSelf->DemoRecorder_AddDemoMarker(RECORDER_REPLAYS); } +void CClient::Con_BenchmarkQuit(IConsole::IResult *pResult, void *pUserData) +{ + CClient *pSelf = (CClient *)pUserData; + int Seconds = pResult->GetInteger(0); + const char *pFilename = pResult->GetString(1); + pSelf->BenchmarkQuit(Seconds, pFilename); +} + +void CClient::BenchmarkQuit(int Seconds, const char *pFilename) +{ + char aBuf[MAX_PATH_LENGTH]; + m_BenchmarkFile = Storage()->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_ABSOLUTE, aBuf, sizeof(aBuf)); + m_BenchmarkStopTime = time_get() + time_freq() * Seconds; +} + void CClient::ServerBrowserUpdate() { m_ResortServerBrowser = true; @@ -4097,11 +4127,11 @@ void CClient::RegisterCommands() // register server dummy commands for tab completion m_pConsole->Register("kick", "i[id] ?r[reason]", CFGFLAG_SERVER, 0, 0, "Kick player with specified id for any reason"); m_pConsole->Register("ban", "s[ip|id] ?i[minutes] r[reason]", CFGFLAG_SERVER, 0, 0, "Ban player with ip/id for x minutes for any reason"); - m_pConsole->Register("unban", "s[ip]", CFGFLAG_SERVER, 0, 0, "Unban ip"); + m_pConsole->Register("unban", "r[ip]", CFGFLAG_SERVER, 0, 0, "Unban ip"); m_pConsole->Register("bans", "", CFGFLAG_SERVER, 0, 0, "Show banlist"); m_pConsole->Register("status", "?r[name]", CFGFLAG_SERVER, 0, 0, "List players containing name or all players"); m_pConsole->Register("shutdown", "", CFGFLAG_SERVER, 0, 0, "Shut down"); - m_pConsole->Register("record", "s[file]", CFGFLAG_SERVER, 0, 0, "Record to a file"); + m_pConsole->Register("record", "r[file]", CFGFLAG_SERVER, 0, 0, "Record to a file"); m_pConsole->Register("stoprecord", "", CFGFLAG_SERVER, 0, 0, "Stop recording"); m_pConsole->Register("reload", "", CFGFLAG_SERVER, 0, 0, "Reload the map"); @@ -4111,7 +4141,7 @@ void CClient::RegisterCommands() m_pConsole->Register("quit", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Quit, this, "Quit Teeworlds"); m_pConsole->Register("exit", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Quit, this, "Quit Teeworlds"); m_pConsole->Register("minimize", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Minimize, this, "Minimize Teeworlds"); - m_pConsole->Register("connect", "s[host|ip]", CFGFLAG_CLIENT, Con_Connect, this, "Connect to the specified host/ip"); + m_pConsole->Register("connect", "r[host|ip]", CFGFLAG_CLIENT, Con_Connect, this, "Connect to the specified host/ip"); m_pConsole->Register("disconnect", "", CFGFLAG_CLIENT, Con_Disconnect, this, "Disconnect from the server"); m_pConsole->Register("ping", "", CFGFLAG_CLIENT, Con_Ping, this, "Ping the current server"); m_pConsole->Register("screenshot", "", CFGFLAG_CLIENT, Con_Screenshot, this, "Take a screenshot"); @@ -4122,20 +4152,21 @@ void CClient::RegisterCommands() #endif m_pConsole->Register("rcon", "r[rcon-command]", CFGFLAG_CLIENT, Con_Rcon, this, "Send specified command to rcon"); - m_pConsole->Register("rcon_auth", "s[password]", CFGFLAG_CLIENT, Con_RconAuth, this, "Authenticate to rcon"); + m_pConsole->Register("rcon_auth", "r[password]", CFGFLAG_CLIENT, Con_RconAuth, this, "Authenticate to rcon"); m_pConsole->Register("rcon_login", "s[username] r[password]", CFGFLAG_CLIENT, Con_RconLogin, this, "Authenticate to rcon with a username"); m_pConsole->Register("play", "r[file]", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Play, this, "Play the file specified"); - m_pConsole->Register("record", "?s[file]", CFGFLAG_CLIENT, Con_Record, this, "Record to the file"); + m_pConsole->Register("record", "?r[file]", CFGFLAG_CLIENT, Con_Record, this, "Record to the file"); m_pConsole->Register("stoprecord", "", CFGFLAG_CLIENT, Con_StopRecord, this, "Stop recording"); m_pConsole->Register("add_demomarker", "", CFGFLAG_CLIENT, Con_AddDemoMarker, this, "Add demo timeline marker"); - m_pConsole->Register("add_favorite", "s[host|ip]", CFGFLAG_CLIENT, Con_AddFavorite, this, "Add a server as a favorite"); - m_pConsole->Register("remove_favorite", "s[host|ip]", CFGFLAG_CLIENT, Con_RemoveFavorite, this, "Remove a server from favorites"); + m_pConsole->Register("add_favorite", "r[host|ip]", CFGFLAG_CLIENT, Con_AddFavorite, this, "Add a server as a favorite"); + m_pConsole->Register("remove_favorite", "r[host|ip]", CFGFLAG_CLIENT, Con_RemoveFavorite, this, "Remove a server from favorites"); m_pConsole->Register("demo_slice_start", "", CFGFLAG_CLIENT, Con_DemoSliceBegin, this, ""); m_pConsole->Register("demo_slice_end", "", CFGFLAG_CLIENT, Con_DemoSliceEnd, this, ""); m_pConsole->Register("demo_play", "", CFGFLAG_CLIENT, Con_DemoPlay, this, "Play demo"); m_pConsole->Register("demo_speed", "i[speed]", CFGFLAG_CLIENT, Con_DemoSpeed, this, "Set demo speed"); m_pConsole->Register("save_replay", "?i[length]", CFGFLAG_CLIENT, Con_SaveReplay, this, "Save a replay of the last defined amount of seconds"); + m_pConsole->Register("benchmark_quit", "i[seconds] r[file]", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_BenchmarkQuit, this, "Benchmark frame times for number of seconds to file, then quit"); m_pConsole->Chain("cl_timeout_seed", ConchainTimeoutSeed, this); m_pConsole->Chain("cl_replays", ConchainReplays, this); diff --git a/src/engine/client/client.h b/src/engine/client/client.h index e24a09300..53ef17668 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -264,6 +264,9 @@ class CClient : public IClient, public CDemoPlayer::IListener CFifo m_Fifo; #endif + IOHANDLE m_BenchmarkFile; + int64 m_BenchmarkStopTime; + public: IEngine *Engine() { return m_pEngine; } IEngineGraphics *Graphics() { return m_pGraphics; } @@ -415,6 +418,7 @@ public: static void Con_Record(IConsole::IResult *pResult, void *pUserData); static void Con_StopRecord(IConsole::IResult *pResult, void *pUserData); static void Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData); + static void Con_BenchmarkQuit(IConsole::IResult *pResult, void *pUserData); static void ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainFullscreen(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainWindowBordered(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); @@ -461,6 +465,7 @@ public: void ToggleWindowVSync(); void LoadFont(); void Notify(const char *pTitle, const char *pMessage); + void BenchmarkQuit(int Seconds, const char *pFilename); // DDRace From d618c8e1e1ddb0b64262cbe5e589442fe46477f2 Mon Sep 17 00:00:00 2001 From: def Date: Thu, 19 Nov 2020 18:10:58 +0100 Subject: [PATCH 110/144] Fix assets menu Multiple assets would be highlighted Bug introduced in https://github.com/ddnet/ddnet/pull/3304 --- src/game/client/components/menus_demo.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 66f45c3a9..e0df0c4cb 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -569,23 +569,11 @@ void CMenus::UiDoListboxStart(const void *pID, const CUIRect *pRect, float RowHe gs_ListBoxScrollValue += Num == 1 ? 0.1f : 3.0f / Num; } - // TODO: Still have to press twice after updating search, why? if(gs_ListBoxScrollValue < 0.0f) gs_ListBoxScrollValue = 0.0f; if(gs_ListBoxScrollValue > 1.0f) gs_ListBoxScrollValue = 1.0f; - if(gs_ListBoxSelectedIndex < 0) - { - gs_ListBoxSelectedIndex = 0; - gs_ListBoxNewSelected = 0; - } - if(gs_ListBoxSelectedIndex >= NumItems) - { - gs_ListBoxSelectedIndex = NumItems - 1; - gs_ListBoxNewSelected = NumItems - 1; - } - Scroll.HMargin(5.0f, &Scroll); gs_ListBoxScrollValue = DoScrollbarV(pID, &Scroll, gs_ListBoxScrollValue); From f83d528f5d7b1ef9fe2709fa04ca44c16f589cc9 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Fri, 20 Nov 2020 12:14:04 +0100 Subject: [PATCH 111/144] Fix vector constructor impl & remove useless operator --- src/base/vmath.h | 12 +++--------- src/game/client/components/items.cpp | 2 +- src/game/client/components/menus_settings.cpp | 2 +- src/game/client/components/players.cpp | 1 - src/game/client/prediction/entities/character.cpp | 2 +- src/game/server/entities/character.cpp | 2 +- src/game/server/entities/laser.cpp | 6 +++--- src/game/server/entities/projectile.cpp | 4 ++-- 8 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/base/vmath.h b/src/base/vmath.h index af282d48d..5fee881d8 100644 --- a/src/base/vmath.h +++ b/src/base/vmath.h @@ -22,7 +22,7 @@ public: T y, v; }; - vector2_base() {} + vector2_base() = default; vector2_base(T nx, T ny) { x = nx; @@ -77,8 +77,6 @@ public: bool operator==(const vector2_base &v) const { return x == v.x && y == v.y; } //TODO: do this with an eps instead bool operator!=(const vector2_base &v) const { return x != v.x || y != v.y; } - operator const T *() { return &x; } - T &operator[](const int index) { return index ? y : x; } }; @@ -152,7 +150,7 @@ public: T z, b, v, l; }; - vector3_base() {} + vector3_base() = default; vector3_base(T nx, T ny, T nz) { x = nx; @@ -212,8 +210,6 @@ public: } bool operator==(const vector3_base &v) const { return x == v.x && y == v.y && z == v.z; } //TODO: do this with an eps instead - - operator const T *() { return &x; } }; template @@ -286,7 +282,7 @@ public: T w, a; }; - vector4_base() {} + vector4_base() = default; vector4_base(T nx, T ny, T nz, T nw) { x = nx; @@ -353,8 +349,6 @@ public: } bool operator==(const vector4_base &v) const { return x == v.x && y == v.y && z == v.z && w == v.w; } //TODO: do this with an eps instead - - operator const T *() { return &x; } }; typedef vector4_base vec4; diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp index ed6a61b1b..d1811cdc4 100644 --- a/src/game/client/components/items.cpp +++ b/src/game/client/components/items.cpp @@ -256,7 +256,7 @@ void CItems::RenderLaser(const struct CNetObj_Laser *pCurrent, bool IsPredicted) a = clamp(a, 0.0f, 1.0f); float Ia = 1 - a; - vec2 Out, Border; + vec2 Out; Graphics()->TextureClear(); Graphics()->QuadsBegin(); diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 81c387601..40460acd2 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -1936,7 +1936,7 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) vec2 From = vec2(Weapon.x, Weapon.y + Weapon.h / 2.0f); vec2 Pos = vec2(Weapon.x + Weapon.w - 10.0f, Weapon.y + Weapon.h / 2.0f); - vec2 Out, Border; + vec2 Out; Graphics()->BlendNormal(); Graphics()->TextureClear(); diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp index cc2501bf3..3db5dc949 100644 --- a/src/game/client/components/players.cpp +++ b/src/game/client/components/players.cpp @@ -429,7 +429,6 @@ void CPlayers::RenderPlayer( } if(g_pData->m_Weapons.m_aId[iw].m_aSpriteMuzzles[IteX]) { - vec2 Pos1, Pos0; vec2 Dir; if(PredictLocalWeapons) Dir = vec2(pPlayerChar->m_X, pPlayerChar->m_Y) - vec2(pPrevChar->m_X, pPrevChar->m_Y); diff --git a/src/game/client/prediction/entities/character.cpp b/src/game/client/prediction/entities/character.cpp index acfce1b9d..47c328f80 100644 --- a/src/game/client/prediction/entities/character.cpp +++ b/src/game/client/prediction/entities/character.cpp @@ -613,7 +613,7 @@ void CCharacter::HandleSkippableTiles(int Index) // handle speedup tiles if(Collision()->IsSpeedup(Index)) { - vec2 Direction, MaxVel, TempVel = m_Core.m_Vel; + vec2 Direction, TempVel = m_Core.m_Vel; int Force, MaxSpeed = 0; float TeeAngle, SpeederAngle, DiffAngle, SpeedLeft, TeeSpeed; Collision()->GetSpeedup(Index, &Direction, &Force, &MaxSpeed); diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 6db743f07..8f970c5d8 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -1404,7 +1404,7 @@ void CCharacter::HandleSkippableTiles(int Index) // handle speedup tiles if(GameServer()->Collision()->IsSpeedup(Index)) { - vec2 Direction, MaxVel, TempVel = m_Core.m_Vel; + vec2 Direction, TempVel = m_Core.m_Vel; int Force, MaxSpeed = 0; float TeeAngle, SpeederAngle, DiffAngle, SpeedLeft, TeeSpeed; GameServer()->Collision()->GetSpeedup(Index, &Direction, &Force, &MaxSpeed); diff --git a/src/game/server/entities/laser.cpp b/src/game/server/entities/laser.cpp index c1beaea39..c3a70b6e7 100644 --- a/src/game/server/entities/laser.cpp +++ b/src/game/server/entities/laser.cpp @@ -160,7 +160,7 @@ void CLaser::DoBounce() } CCharacter *pOwnerChar = GameServer()->GetPlayerChar(m_Owner); - if(m_Owner >= 0 && m_Energy <= 0 && m_Pos && !m_TeleportCancelled && pOwnerChar && + if(m_Owner >= 0 && m_Energy <= 0 && !m_TeleportCancelled && pOwnerChar && pOwnerChar->IsAlive() && pOwnerChar->HasTelegunLaser() && m_Type == WEAPON_LASER) { vec2 PossiblePos; @@ -180,14 +180,14 @@ void CLaser::DoBounce() else Found = GetNearestAirPos(m_Pos, m_From, &PossiblePos); - if(Found && PossiblePos) + if(Found) { pOwnerChar->m_TeleGunPos = PossiblePos; pOwnerChar->m_TeleGunTeleport = true; pOwnerChar->m_IsBlueTeleGunTeleport = m_IsBlueTeleport; } } - else if(m_Owner >= 0 && m_Pos) + else if(m_Owner >= 0) { int MapIndex = GameServer()->Collision()->GetPureMapIndex(Coltile); int TileFIndex = GameServer()->Collision()->GetFTileIndex(MapIndex); diff --git a/src/game/server/entities/projectile.cpp b/src/game/server/entities/projectile.cpp index ddad5171f..10a5e728b 100644 --- a/src/game/server/entities/projectile.cpp +++ b/src/game/server/entities/projectile.cpp @@ -170,7 +170,7 @@ void CProjectile::Tick() apEnts[i]->Freeze(); } - if(pOwnerChar && ColPos && !GameLayerClipped(ColPos) && + if(pOwnerChar && !GameLayerClipped(ColPos) && ((m_Type == WEAPON_GRENADE && pOwnerChar->HasTelegunGrenade()) || (m_Type == WEAPON_GUN && pOwnerChar->HasTelegunGun()))) { int MapIndex = GameServer()->Collision()->GetPureMapIndex(pTargetChr ? pTargetChr->m_Pos : ColPos); @@ -202,7 +202,7 @@ void CProjectile::Tick() else Found = GetNearestAirPos(NewPos, CurPos, &PossiblePos); - if(Found && PossiblePos) + if(Found) { pOwnerChar->m_TeleGunPos = PossiblePos; pOwnerChar->m_TeleGunTeleport = true; From 259629db9f16050f2546d748485b88df2c082e98 Mon Sep 17 00:00:00 2001 From: jupeyy Date: Mon, 26 Oct 2020 17:05:57 +0100 Subject: [PATCH 112/144] Map optimizer --- CMakeLists.txt | 3 +- src/engine/shared/datafile.cpp | 6 +- src/engine/shared/datafile.h | 4 +- src/engine/shared/image_manipulation.cpp | 38 ++- src/engine/shared/image_manipulation.h | 3 + src/tools/map_optimize.cpp | 322 +++++++++++++++++++++++ 6 files changed, 363 insertions(+), 13 deletions(-) create mode 100644 src/tools/map_optimize.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f61f7a8a..bd187258d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2066,6 +2066,7 @@ set_src(TOOLS GLOB src/tools map_convert_07.cpp map_diff.cpp map_extract.cpp + map_optimize.cpp map_replace_image.cpp map_resave.cpp packetgen.cpp @@ -2078,7 +2079,7 @@ foreach(ABS_T ${TOOLS}) string(REGEX REPLACE "\\.cpp$" "" TOOL "${T}") set(TOOL_DEPS ${DEPS}) set(TOOL_LIBS ${LIBS}) - if(TOOL MATCHES "^(tileset_.*|dilate|map_convert_07|map_extract|map_replace_image)$") + if(TOOL MATCHES "^(tileset_.*|dilate|map_convert_07|map_optimize|map_extract|map_replace_image)$") list(APPEND TOOL_DEPS ${PNGLITE_DEP}) list(APPEND TOOL_LIBS ${PNGLITE_LIBRARIES}) list(APPEND TOOL_INCLUDE_DIRS ${PNGLITE_INCLUDE_DIRS}) diff --git a/src/engine/shared/datafile.cpp b/src/engine/shared/datafile.cpp index 1a284a93e..6cddbb871 100644 --- a/src/engine/shared/datafile.cpp +++ b/src/engine/shared/datafile.cpp @@ -10,8 +10,6 @@ #include "uuid_manager.h" -#include - static const int DEBUG = 0; enum @@ -692,7 +690,7 @@ int CDataFileWriter::AddItem(int Type, int ID, int Size, void *pData) return m_NumItems - 1; } -int CDataFileWriter::AddData(int Size, void *pData) +int CDataFileWriter::AddData(int Size, void *pData, int CompressionLevel) { dbg_assert(m_NumDatas < 1024, "too much data"); @@ -700,7 +698,7 @@ int CDataFileWriter::AddData(int Size, void *pData) unsigned long s = compressBound(Size); void *pCompData = malloc(s); // temporary buffer that we use during compression - int Result = compress((Bytef *)pCompData, &s, (Bytef *)pData, Size); // ignore_convention + int Result = compress2((Bytef *)pCompData, &s, (Bytef *)pData, Size, CompressionLevel); // ignore_convention if(Result != Z_OK) { dbg_msg("datafile", "compression error %d", Result); diff --git a/src/engine/shared/datafile.h b/src/engine/shared/datafile.h index 0f3950946..347b7a817 100644 --- a/src/engine/shared/datafile.h +++ b/src/engine/shared/datafile.h @@ -8,6 +8,8 @@ #include #include +#include + // raw datafile access class CDataFileReader { @@ -100,7 +102,7 @@ public: void Init(); bool OpenFile(class IStorage *pStorage, const char *pFilename, int StorageType = IStorage::TYPE_SAVE); bool Open(class IStorage *pStorage, const char *pFilename, int StorageType = IStorage::TYPE_SAVE); - int AddData(int Size, void *pData); + int AddData(int Size, void *pData, int CompressionLevel = Z_DEFAULT_COMPRESSION); int AddDataSwapped(int Size, void *pData); int AddItem(int Type, int ID, int Size, void *pData); int Finish(); diff --git a/src/engine/shared/image_manipulation.cpp b/src/engine/shared/image_manipulation.cpp index 40cd7b456..14c923fba 100644 --- a/src/engine/shared/image_manipulation.cpp +++ b/src/engine/shared/image_manipulation.cpp @@ -2,7 +2,7 @@ #include #include -static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pDest, unsigned char AlphaThreshold = 30) +static void Dilate(int w, int h, int BPP, unsigned char *pSrc, unsigned char *pDest, unsigned char AlphaThreshold = TW_DILATE_ALPHA_THRESHOLD) { int ix, iy; const int aDirX[] = {0, -1, 1, 0}; @@ -67,26 +67,50 @@ static void CopyColorValues(int w, int h, int BPP, unsigned char *pSrc, unsigned } void DilateImage(unsigned char *pImageBuff, int w, int h, int BPP) +{ + DilateImageSub(pImageBuff, w, h, BPP, 0, 0, w, h); +} + +void DilateImageSub(unsigned char *pImageBuff, int w, int h, int BPP, int x, int y, int sw, int sh) { unsigned char *apBuffer[2] = {NULL, NULL}; - apBuffer[0] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); - apBuffer[1] = (unsigned char *)malloc((size_t)w * h * sizeof(unsigned char) * BPP); + apBuffer[0] = (unsigned char *)malloc((size_t)sw * sh * sizeof(unsigned char) * BPP); + apBuffer[1] = (unsigned char *)malloc((size_t)sw * sh * sizeof(unsigned char) * BPP); + unsigned char *pBufferOriginal = (unsigned char *)malloc((size_t)sw * sh * sizeof(unsigned char) * BPP); unsigned char *pPixelBuff = (unsigned char *)pImageBuff; - Dilate(w, h, BPP, pPixelBuff, apBuffer[0]); + for(int Y = 0; Y < sh; ++Y) + { + int SrcImgOffset = ((y + Y) * w * BPP) + (x * BPP); + int DstImgOffset = (Y * sw * BPP); + int CopySize = sw * BPP; + mem_copy(&pBufferOriginal[DstImgOffset], &pPixelBuff[SrcImgOffset], CopySize); + } + + Dilate(sw, sh, BPP, pBufferOriginal, apBuffer[0]); for(int i = 0; i < 5; i++) { - Dilate(w, h, BPP, apBuffer[0], apBuffer[1]); - Dilate(w, h, BPP, apBuffer[1], apBuffer[0]); + Dilate(sw, sh, BPP, apBuffer[0], apBuffer[1]); + Dilate(sw, sh, BPP, apBuffer[1], apBuffer[0]); } - CopyColorValues(w, h, BPP, apBuffer[0], pPixelBuff); + CopyColorValues(sw, sh, BPP, apBuffer[0], pBufferOriginal); free(apBuffer[0]); free(apBuffer[1]); + + for(int Y = 0; Y < sh; ++Y) + { + int SrcImgOffset = ((y + Y) * w * BPP) + (x * BPP); + int DstImgOffset = (Y * sw * BPP); + int CopySize = sw * BPP; + mem_copy(&pPixelBuff[SrcImgOffset], &pBufferOriginal[DstImgOffset], CopySize); + } + + free(pBufferOriginal); } static float CubicHermite(float A, float B, float C, float D, float t) diff --git a/src/engine/shared/image_manipulation.h b/src/engine/shared/image_manipulation.h index b6464518a..734d03497 100644 --- a/src/engine/shared/image_manipulation.h +++ b/src/engine/shared/image_manipulation.h @@ -4,7 +4,10 @@ #include #include +#define TW_DILATE_ALPHA_THRESHOLD 30 + void DilateImage(unsigned char *pImageBuff, int w, int h, int BPP); +void DilateImageSub(unsigned char *pImageBuff, int w, int h, int BPP, int x, int y, int sw, int sh); // returned pointer is allocated with malloc uint8_t *ResizeImage(const uint8_t *pImgData, int Width, int Height, int NewWidth, int NewHeight, int BPP); diff --git a/src/tools/map_optimize.cpp b/src/tools/map_optimize.cpp new file mode 100644 index 000000000..ecc7e38fb --- /dev/null +++ b/src/tools/map_optimize.cpp @@ -0,0 +1,322 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void ClearTransparentPixels(uint8_t *pImg, int Width, int Height) +{ + for(int y = 0; y < Height; ++y) + { + for(int x = 0; x < Width; ++x) + { + int Index = y * Width * 4 + x * 4; + if(pImg[Index + 3] == 0) + { + pImg[Index + 0] = 0; + pImg[Index + 1] = 0; + pImg[Index + 2] = 0; + } + } + } +} + +void CopyOpaquePixels(uint8_t *pDestImg, uint8_t *pSrcImg, int Width, int Height) +{ + for(int y = 0; y < Height; ++y) + { + for(int x = 0; x < Width; ++x) + { + int Index = y * Width * 4 + x * 4; + if(pSrcImg[Index + 3] > TW_DILATE_ALPHA_THRESHOLD) + mem_copy(&pDestImg[Index], &pSrcImg[Index], sizeof(uint8_t) * 4); + else + mem_zero(&pDestImg[Index], sizeof(uint8_t) * 4); + } + } +} + +void ClearPixelsTile(uint8_t *pImg, int Width, int Height, int TileIndex) +{ + int WTile = Width / 16; + int HTile = Height / 16; + int xi = (TileIndex % 16) * WTile; + int yi = (TileIndex / 16) * HTile; + + for(int y = yi; y < yi + HTile; ++y) + { + for(int x = xi; x < xi + WTile; ++x) + { + int Index = y * Width * 4 + x * 4; + pImg[Index + 0] = 0; + pImg[Index + 1] = 0; + pImg[Index + 2] = 0; + pImg[Index + 3] = 0; + } + } +} + +void GetImageSHA256(uint8_t *pImgBuff, int ImgSize, int Width, int Height, char *pSHA256Str) +{ + uint8_t *pNewImgBuff = (uint8_t *)malloc(ImgSize); + + // Get all image pixels, that have a alpha threshold over the default threshold, + // all other pixels are cleared to zero. + // This is required since dilate modifies pixels under the alpha threshold, which would alter the SHA. + CopyOpaquePixels(pNewImgBuff, pImgBuff, Width, Height); + SHA256_DIGEST SHAStr = sha256(pNewImgBuff, (size_t)ImgSize); + + sha256_str(SHAStr, pSHA256Str, SHA256_MAXSTRSIZE * sizeof(char)); + + free(pNewImgBuff); +} + +int main(int argc, const char **argv) +{ + dbg_logger_stdout(); + + IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); + int Index, ID = 0, Type = 0, Size; + void *pPtr; + char aFileName[1024]; + CDataFileReader DataFile; + CDataFileWriter df; + + if(!pStorage || argc <= 1 || argc > 3) + { + dbg_msg("map_optimize", "Invalid parameters or other unknown error."); + dbg_msg("map_optimize", "Usage: map_optimize []"); + return -1; + } + + if(argc == 3) + { + str_format(aFileName, sizeof(aFileName), "out/%s", argv[2]); + + fs_makedir_rec_for(aFileName); + } + else + { + fs_makedir("out"); + char aBuff[MAX_PATH_LENGTH]; + pStorage->StripPathAndExtension(argv[1], aBuff, sizeof(aBuff)); + str_format(aFileName, sizeof(aFileName), "out/%s.map", aBuff); + } + + if(!DataFile.Open(pStorage, argv[1], IStorage::TYPE_ABSOLUTE)) + { + dbg_msg("map_optimize", "Failed to open source file."); + return -1; + } + + if(!df.Open(pStorage, aFileName, IStorage::TYPE_ABSOLUTE)) + { + dbg_msg("map_optimize", "Failed to open target file."); + return -1; + } + + int aImageFlags[64] = { + 0, + }; + + bool aImageTiles[64][256]{ + { + false, + }, + }; + + struct SMapOptimizeItem + { + CMapItemImage *m_pImage; + int m_Index; + int m_Data; + int m_Text; + }; + + std::vector DataFindHelper; + + // add all items + int i = 0; + for(int Index = 0; Index < DataFile.NumItems(); Index++) + { + pPtr = DataFile.GetItem(Index, &Type, &ID); + Size = DataFile.GetItemSize(Index); + // for all layers, check if it uses a image and set the corresponding flag + if(Type == MAPITEMTYPE_LAYER) + { + CMapItemLayer *pLayer = (CMapItemLayer *)pPtr; + if(pLayer->m_Type == LAYERTYPE_TILES) + { + CMapItemLayerTilemap *pTLayer = (CMapItemLayerTilemap *)pLayer; + if(pTLayer->m_Image >= 0 && pTLayer->m_Image < 64 && pTLayer->m_Flags == 0) + { + aImageFlags[pTLayer->m_Image] |= 1; + // check tiles that are used in this image + int DataIndex = pTLayer->m_Data; + unsigned int Size = DataFile.GetDataSize(DataIndex); + void *pTiles = DataFile.GetData(DataIndex); + unsigned int TileSize = sizeof(CTile); + + if(Size >= pTLayer->m_Width * pTLayer->m_Height * TileSize) + { + int x = 0; + int y = 0; + for(y = 0; y < pTLayer->m_Height; ++y) + { + for(x = 0; x < pTLayer->m_Width; ++x) + { + int TileIndex = ((CTile *)pTiles)[y * pTLayer->m_Width + x].m_Index; + if(TileIndex > 0) + { + aImageTiles[pTLayer->m_Image][TileIndex] = true; + } + } + } + } + } + } + else if(pLayer->m_Type == LAYERTYPE_QUADS) + { + CMapItemLayerQuads *pQLayer = (CMapItemLayerQuads *)pLayer; + if(pQLayer->m_Image >= 0 && pQLayer->m_Image < 64) + { + aImageFlags[pQLayer->m_Image] |= 2; + } + } + } + else if(Type == MAPITEMTYPE_IMAGE) + { + CMapItemImage *pImg = (CMapItemImage *)pPtr; + if(!pImg->m_External) + { + SMapOptimizeItem Item; + Item.m_pImage = pImg; + Item.m_Index = i; + Item.m_Data = pImg->m_ImageData; + Item.m_Text = pImg->m_ImageName; + DataFindHelper.push_back(Item); + } + + // found an image + ++i; + } + + df.AddItem(Type, ID, Size, pPtr); + } + + // add all data + for(Index = 0; Index < DataFile.NumData(); Index++) + { + bool DeletePtr = false; + pPtr = DataFile.GetData(Index); + Size = DataFile.GetDataSize(Index); + std::vector::iterator it = std::find_if(DataFindHelper.begin(), DataFindHelper.end(), [Index](const SMapOptimizeItem &Other) -> bool { return Other.m_Data == Index || Other.m_Text == Index; }); + if(it != DataFindHelper.end()) + { + int Width = it->m_pImage->m_Width; + int Height = it->m_pImage->m_Height; + + int ImageIndex = it->m_Index; + if(it->m_Data == Index) + { + DeletePtr = true; + // optimize embedded images + // use a new pointer, to be safe, when using the original image data + void *pNewPtr = malloc(Size); + mem_copy(pNewPtr, pPtr, Size); + pPtr = pNewPtr; + uint8_t *pImgBuff = (uint8_t *)pPtr; + + bool DoClearTransparentPixels = false; + bool DilateAs2DArray = false; + bool DoDilate = false; + + // all tiles that aren't used are cleared(if image was only used by tilemap) + if(aImageFlags[ImageIndex] == 1) + { + for(int i = 0; i < 256; ++i) + { + if(!aImageTiles[ImageIndex][i]) + { + ClearPixelsTile(pImgBuff, Width, Height, i); + } + } + + DoClearTransparentPixels = true; + DilateAs2DArray = true; + DoDilate = true; + } + else if(aImageFlags[ImageIndex] == 0) + { + mem_zero(pImgBuff, Width * Height * 4); + } + else + { + DoClearTransparentPixels = true; + DoDilate = true; + } + + if(DoClearTransparentPixels) + { + // clear unused pixels and make a clean dilate for the compressor + ClearTransparentPixels(pImgBuff, Width, Height); + } + + if(DoDilate) + { + if(DilateAs2DArray) + { + for(int i = 0; i < 256; ++i) + { + int ImgTileW = Width / 16; + int ImgTileH = Height / 16; + int x = (i % 16) * ImgTileW; + int y = (i / 16) * ImgTileH; + DilateImageSub(pImgBuff, Width, Height, 4, x, y, ImgTileW, ImgTileH); + } + } + else + { + DilateImage(pImgBuff, Width, Height, 4); + } + } + } + else if(it->m_Text == Index) + { + char *pImgName = (char *)pPtr; + uint8_t *pImgBuff = (uint8_t *)DataFile.GetData(it->m_Data); + int ImgSize = DataFile.GetDataSize(it->m_Data); + + char aSHA256Str[SHA256_MAXSTRSIZE]; + // This is the important function, that calculates the SHA256 in a special way + // Please read the comments inside the functions to understand it + GetImageSHA256(pImgBuff, ImgSize, Width, Height, aSHA256Str); + + char aNewName[MAX_PATH_LENGTH]; + int StrLen = str_format(aNewName, sizeof(aNewName) / sizeof(aNewName[0]), "%s_cut_%s", pImgName, aSHA256Str); + + DeletePtr = true; + // make the new name ready + char *pNewPtr = (char *)malloc(StrLen + 1); + str_copy(pNewPtr, aNewName, StrLen + 1); + pPtr = pNewPtr; + Size = StrLen + 1; + } + } + + df.AddData(Size, pPtr, Z_BEST_COMPRESSION); + + if(DeletePtr) + free(pPtr); + } + + DataFile.Close(); + df.Finish(); + + return 0; +} From bb43660cd43abbc40ea27823adcee645b5ed21f8 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 21 Nov 2020 18:30:24 +0100 Subject: [PATCH 113/144] Fix scroll bar (fixes #3347) --- src/game/client/components/menus.cpp | 15 +++------------ src/game/client/components/menus_browser.cpp | 2 +- src/game/client/components/menus_demo.cpp | 9 ++------- src/game/client/components/menus_ingame.cpp | 2 +- 4 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index a73942bfc..4e80c3628 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -2650,7 +2650,7 @@ bool CMenus::HandleListInputs(const CUIRect &View, float &ScrollValue, const flo { int NewIndex = -1; int Num = (int)(View.h / ElemHeight) + 1; - int ScrollNum = NumElems - Num + 1; + int ScrollNum = maximum(NumElems - Num + 1, 0); if(ScrollNum > 0) { if(pScrollOffset && *pScrollOffset >= 0) @@ -2663,18 +2663,9 @@ bool CMenus::HandleListInputs(const CUIRect &View, float &ScrollValue, const flo if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&View)) ScrollValue += 3.0f / ScrollNum; } - else - ScrollNum = 0; - if(ScrollValue < 0) - ScrollValue = 0; - if(ScrollValue > 1) - ScrollValue = 1; - - if(SelectedIndex < 0) - SelectedIndex = 0; - if(SelectedIndex >= NumElems) - SelectedIndex = NumElems; + ScrollValue = clamp(ScrollValue, 0.0f, 1.0f); + SelectedIndex = clamp(SelectedIndex, 0, NumElems); for(int i = 0; i < m_NumInputEvents; i++) { diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index f62919660..97168d024 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -190,7 +190,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) CUIRect OriginalView = View; int Num = (int)(View.h / s_aCols[0].m_Rect.h) + 1; - int ScrollNum = NumServers - Num + 1; + int ScrollNum = maximum(NumServers - Num + 1, 0); View.y -= s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h; int NewSelected = -1; diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index e0df0c4cb..c363cb4d9 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -569,13 +569,8 @@ void CMenus::UiDoListboxStart(const void *pID, const CUIRect *pRect, float RowHe gs_ListBoxScrollValue += Num == 1 ? 0.1f : 3.0f / Num; } - if(gs_ListBoxScrollValue < 0.0f) - gs_ListBoxScrollValue = 0.0f; - if(gs_ListBoxScrollValue > 1.0f) - gs_ListBoxScrollValue = 1.0f; - Scroll.HMargin(5.0f, &Scroll); - gs_ListBoxScrollValue = DoScrollbarV(pID, &Scroll, gs_ListBoxScrollValue); + gs_ListBoxScrollValue = clamp(DoScrollbarV(pID, &Scroll, gs_ListBoxScrollValue), 0.0f, 1.0f); // the list gs_ListBoxView = gs_ListBoxOriginalView; @@ -1078,7 +1073,7 @@ void CMenus::RenderDemoList(CUIRect MainView) CUIRect OriginalView = ListBox; int Num = (int)(ListBox.h / s_aCols[0].m_Rect.h) + 1; - int ScrollNum = m_lDemos.size() - Num + 1; + int ScrollNum = maximum(m_lDemos.size() - Num + 1, 0); ListBox.y -= s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h; int NewSelected = -1; diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 2bdc78a3c..450e17ab6 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -1029,7 +1029,7 @@ void CMenus::RenderGhost(CUIRect MainView) CUIRect OriginalView = View; int Num = (int)(View.h / s_aCols[0].m_Rect.h) + 1; - int ScrollNum = NumGhosts - Num + 1; + int ScrollNum = maximum(NumGhosts - Num + 1, 0); View.y -= s_ScrollValue * ScrollNum * s_aCols[0].m_Rect.h; int NewSelected = -1; From 751cade38b984e6f8cec82a1a1fa034dc5253376 Mon Sep 17 00:00:00 2001 From: hhh26459 <74860643+hhh26459@users.noreply.github.com> Date: Sun, 22 Nov 2020 13:18:42 +0100 Subject: [PATCH 114/144] Update italian.txt --- data/languages/italian.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/languages/italian.txt b/data/languages/italian.txt index 9264dd562..4678d30f3 100644 --- a/data/languages/italian.txt +++ b/data/languages/italian.txt @@ -690,7 +690,7 @@ Replay feature is disabled! == Il replay è disabilitato! The width or height of texture %s is not divisible by 16, which might cause visual bugs. -== La largezza o altezza della texture %s non è divisibile per 16, quindi potrebbe causare dei bug visivi. +== La larghezza o altezza della texture %s non è divisibile per 16, quindi potrebbe causare dei bug visivi. Warning == Attenzione @@ -741,7 +741,7 @@ The maps contain freeze, which temporarily make a tee unable to move. You have t == Le mappe contengono freeze, che rendono temporaneamente impossibile il movimento per un tee. Devi fare gioco di squadra per superare queste parti. The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. -== La rotellina del mouse cambia le armi.Il Martello (tasto sinistro mouse) può essere usato per colpire altri tee e svegliarli quando sono stati gelati nel freeze. +== La rotellina del mouse cambia le armi. Il Martello (tasto sinistro mouse) può essere usato per colpire altri tee e svegliarli quando sono stati gelati nel freeze. Hook (right mouse) can be used to swing through the map and to hook other tees to you. == Il Rampino (tasto destro mouse) può essere usato per aggrapparsi ad alcune superfici e per agganciare altri tee. @@ -784,7 +784,7 @@ Show DDNet map finishes in server browser transmits your player name to info2.ddnet.tw -== Transmette il tuo nome da giocatore a info2.ddnet.tw +== Trasmette il tuo nome da giocatore a info2.ddnet.tw Theme @@ -890,7 +890,7 @@ Refresh Rate == Frequenza di aggiornamento Show console window -== Monstra la console +== Mostra la console Themes directory == Cartella dei temi @@ -1043,7 +1043,7 @@ Assets == Asset DDNet Client needs to be restarted to complete update! -== Il Client DDNet deve essere riavviato per completare l'update! +== Il Client DDNet deve essere riavviato per completare l'aggiornamento! Use DDRace Scoreboard == Usa il tabellone segnapunti DDRace @@ -1258,7 +1258,7 @@ Play == Gioca DDNet %s is out! -== E' uscito DDNet %s! +== È uscito DDNet %s! Restart == Ricomincia From f523a229b22db5484291b59ff7608b29dc467a04 Mon Sep 17 00:00:00 2001 From: def Date: Mon, 23 Nov 2020 13:37:33 +0100 Subject: [PATCH 115/144] Add benchmarking section to README --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 83d6169c7..c963690fb 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ $ ./DDNet-Server -f mine.cfg Installation from Repository ------------------ +---------------------------- Debian/Ubuntu @@ -219,4 +219,11 @@ Arch Linux $ yay -S ddnet ``` +Benchmarking +------------ +DDNet is available in the [Phoronix Test Suite](https://openbenchmarking.org/test/pts/ddnet). If you have PTS installed you can easily benchmark DDNet on your own system like this: + +```bash +$ phoronix-test-suite benchmark ddnet +``` From 0822f9cecdb60e214939611fdcba11d2e4cfe7c0 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 11 Sep 2020 00:00:33 +0200 Subject: [PATCH 116/144] Add check_dilate --- .github/workflows/style.yml | 19 +++++++++++++++++-- scripts/check_dilate.sh | 28 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100755 scripts/check_dilate.sh diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index abdd2020a..35b411491 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -14,13 +14,28 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - - name: Install clang-format + with: + submodules: true + - name: Prepare run: | sudo apt-get update -y - sudo apt-get install clang-format -y + sudo apt-get install clang-format imagemagick ddnet-tools -y - name: Check style run: | clang-format -version scripts/fix_style.py --dry-run scripts/check_header_guards.py scripts/languages/update_all.py + - name: Prepare build dilate + run: | + sudo apt-get update -y + sudo apt-get install pkg-config cmake libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev -y + - name: Build dilate + run: | + mkdir release + cd release + cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DDOWNLOAD_GTEST=OFF -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=. .. + cmake --build . --config Release --target dilate --parallel + - name: Check if images are dilated + run: | + scripts/check_dilate.sh release data diff --git a/scripts/check_dilate.sh b/scripts/check_dilate.sh new file mode 100755 index 000000000..74425518d --- /dev/null +++ b/scripts/check_dilate.sh @@ -0,0 +1,28 @@ +#!/bin/bash +#set -x +result= + +dil_path=$1 + +result=$(find $2 -iname '*.png' -print0 | while IFS= read -r -d $'\0' file; do + new_file=$(mktemp --tmpdir "$(basename "$file" .png).XXX.png") + cp "$file" "$new_file" + convert "$new_file" "${new_file}_old.bmp" >> /dev/null + ${dil_path}/dilate "$new_file" >> /dev/null + convert "$new_file" "${new_file}_new.bmp" >> /dev/null + orig_hash=$(identify -quiet -format "%#" "${new_file}_old.bmp") + new_hash=$(identify -quiet -format "%#" "${new_file}_new.bmp") + rm "$new_file" + rm "${new_file}_old.bmp" + rm "${new_file}_new.bmp" + if [ "$orig_hash" != "$new_hash" ]; then + printf "$file is not dilated\n" + fi +done) + +if [[ "$result" != "" ]]; then + printf "$result" + exit 1 +fi + +exit 0 From b722dcc7b71d983590f9a1559de246389133de19 Mon Sep 17 00:00:00 2001 From: Jupeyy Date: Tue, 24 Nov 2020 11:01:16 +0100 Subject: [PATCH 117/144] Dilate & optimize non-dilated images --- data/browse_icons.png | Bin 3538 -> 2617 bytes data/countryflags/LY.png | Bin 1572 -> 1135 bytes data/countryflags/default.png | Bin 1518 -> 1524 bytes data/demo_buttons.png | Bin 424 -> 536 bytes data/demo_buttons2.png | Bin 1476 -> 1162 bytes data/editor/audio_source.png | Bin 5703 -> 5660 bytes data/editor/entities/DDNet.png | Bin 281111 -> 277846 bytes data/editor/entities/FNG.png | Bin 67780 -> 67424 bytes data/editor/entities/Race.png | Bin 75426 -> 75263 bytes data/editor/entities/Vanilla.png | Bin 51677 -> 51136 bytes data/editor/entities/blockworlds.png | Bin 92517 -> 92849 bytes data/editor/entities_clear/blockworlds.png | Bin 92517 -> 92849 bytes data/editor/entities_clear/ddnet.png | Bin 292369 -> 290424 bytes data/editor/entities_clear/ddrace.png | Bin 199147 -> 194907 bytes data/editor/entities_clear/fng.png | Bin 64628 -> 64272 bytes data/editor/entities_clear/race.png | Bin 72316 -> 72135 bytes data/editor/entities_clear/vanilla.png | Bin 48563 -> 47996 bytes data/editor/front.png | Bin 300927 -> 281283 bytes data/editor/speedup.png | Bin 16815 -> 17091 bytes data/editor/switch.png | Bin 141338 -> 137852 bytes data/editor/tele.png | Bin 19529 -> 19903 bytes data/editor/tune.png | Bin 17162 -> 17439 bytes data/emoticons.png | Bin 40747 -> 40832 bytes data/gui_icons.png | Bin 8438 -> 8504 bytes data/gui_logo.png | Bin 88721 -> 78248 bytes data/mapres/basic_freeze.png | Bin 23312 -> 23314 bytes data/mapres/bg_cloud1.png | Bin 62936 -> 58265 bytes data/mapres/bg_cloud2.png | Bin 56566 -> 52255 bytes data/mapres/bg_cloud3.png | Bin 19496 -> 16270 bytes data/mapres/ddnet_start.png | Bin 14151 -> 14181 bytes data/mapres/ddnet_tiles.png | Bin 46325 -> 46526 bytes data/mapres/desert_background.png | Bin 28731 -> 28102 bytes data/mapres/desert_doodads.png | Bin 176016 -> 159951 bytes data/mapres/desert_main.png | Bin 94081 -> 81858 bytes data/mapres/desert_mountains.png | Bin 15834 -> 15858 bytes .../desert_mountains_new_background.png | Bin 12389 -> 12392 bytes .../desert_mountains_new_foreground.png | Bin 33472 -> 33687 bytes data/mapres/desert_sun.png | Bin 244892 -> 169913 bytes data/mapres/entities.png | Bin 254546 -> 256991 bytes data/mapres/fadeout.png | Bin 6369 -> 6503 bytes data/mapres/font_teeworlds.png | Bin 75079 -> 77140 bytes data/mapres/font_teeworlds_alt.png | Bin 28224 -> 28308 bytes data/mapres/generic_clear.png | Bin 22254 -> 22745 bytes data/mapres/generic_deathtiles.png | Bin 84234 -> 80588 bytes data/mapres/generic_lamps.png | Bin 19786 -> 17052 bytes data/mapres/generic_unhookable.png | Bin 130139 -> 118882 bytes data/mapres/grass_doodads.png | Bin 127661 -> 114984 bytes data/mapres/grass_main.png | Bin 106351 -> 94733 bytes data/mapres/jungle_deathtiles.png | Bin 272346 -> 254322 bytes data/mapres/jungle_doodads.png | Bin 252233 -> 229331 bytes data/mapres/jungle_main.png | Bin 185227 -> 162475 bytes data/mapres/jungle_unhookables.png | Bin 277825 -> 269297 bytes data/mapres/moon.png | Bin 142522 -> 116118 bytes data/mapres/mountains.png | Bin 58477 -> 58522 bytes data/mapres/snow_mountain.png | Bin 50294 -> 51565 bytes data/mapres/stars.png | Bin 8946 -> 6040 bytes data/mapres/sun.png | Bin 16613 -> 14954 bytes data/mapres/water.png | Bin 34836 -> 35055 bytes data/mapres/winter_doodads.png | Bin 205503 -> 190663 bytes data/mapres/winter_main.png | Bin 206644 -> 188500 bytes data/mapres/winter_mountains.png | Bin 49776 -> 50274 bytes data/mapres/winter_mountains2.png | Bin 41515 -> 41571 bytes data/menuimages/demos.png | Bin 29977 -> 24653 bytes data/menuimages/editor.png | Bin 37420 -> 32725 bytes data/menuimages/local_server.png | Bin 42234 -> 31973 bytes data/menuimages/play_game.png | Bin 39024 -> 35145 bytes data/menuimages/settings.png | Bin 42326 -> 36377 bytes data/particles.png | Bin 43518 -> 43838 bytes data/skins/Aoe4leg.png | Bin 18961 -> 19650 bytes data/skins/PaladiN.png | Bin 8099 -> 4880 bytes data/skins/antiantey.png | Bin 6877 -> 6844 bytes data/skins/beast.png | Bin 6375 -> 6417 bytes data/skins/blacktee.png | Bin 1844 -> 2025 bytes data/skins/bluekitty.png | Bin 4714 -> 4715 bytes data/skins/chinese_by_whis.png | Bin 11723 -> 11893 bytes data/skins/coala_bluekitty.png | Bin 6602 -> 5584 bytes data/skins/coala_limekitty.png | Bin 7138 -> 5938 bytes data/skins/coala_x_ninja.png | Bin 6477 -> 5334 bytes data/skins/demonlimekitty.png | Bin 14468 -> 14438 bytes data/skins/dino.png | Bin 8718 -> 8691 bytes data/skins/dragon.png | Bin 4856 -> 4863 bytes data/skins/evil.png | Bin 6508 -> 6757 bytes data/skins/evilwolfe.png | Bin 8399 -> 8393 bytes data/skins/ghost.png | Bin 6868 -> 6820 bytes data/skins/ghostjtj.png | Bin 8747 -> 9383 bytes data/skins/giraffe.png | Bin 8447 -> 8406 bytes data/skins/greensward.png | Bin 7461 -> 7448 bytes data/skins/greyfox.png | Bin 7979 -> 7973 bytes data/skins/greyfox_2.png | Bin 5558 -> 5928 bytes data/skins/hammie-chew.png | Bin 8165 -> 8442 bytes data/skins/hammie-whis.png | Bin 8916 -> 9230 bytes data/skins/jeet.png | Bin 9056 -> 9282 bytes data/skins/kintaro_2.png | Bin 8233 -> 8206 bytes data/skins/kitty_brownbear.png | Bin 10995 -> 11263 bytes data/skins/kitty_x_ninja.png | Bin 5979 -> 6043 bytes data/skins/limekitty.png | Bin 4711 -> 4713 bytes data/skins/mermydon-coala.png | Bin 7811 -> 7770 bytes data/skins/mermydon.png | Bin 7944 -> 7914 bytes data/skins/mouse.png | Bin 9268 -> 9712 bytes data/skins/musmann.png | Bin 9087 -> 9053 bytes data/skins/nanami.png | Bin 8312 -> 9243 bytes data/skins/nanas.png | Bin 13161 -> 12846 bytes data/skins/nersif.png | Bin 13386 -> 13465 bytes data/skins/oldman.png | Bin 9939 -> 10089 bytes data/skins/oldschool.png | Bin 6277 -> 6236 bytes data/skins/penguin.png | Bin 9006 -> 9011 bytes data/skins/random.png | Bin 7736 -> 7913 bytes data/skins/redbopp.png | Bin 4307 -> 4309 bytes data/skins/santa_bluekitty.png | Bin 11289 -> 9647 bytes data/skins/santa_bluestripe.png | Bin 9679 -> 7888 bytes data/skins/santa_brownbear.png | Bin 13421 -> 12326 bytes data/skins/santa_cammo.png | Bin 9831 -> 8002 bytes data/skins/santa_cammostripes.png | Bin 9690 -> 7589 bytes data/skins/santa_coala.png | Bin 10385 -> 7741 bytes data/skins/santa_default.png | Bin 9227 -> 7244 bytes data/skins/santa_limekitty.png | Bin 11325 -> 9659 bytes data/skins/santa_pinky.png | Bin 9835 -> 7784 bytes data/skins/santa_redbopp.png | Bin 9523 -> 7569 bytes data/skins/santa_redstripe.png | Bin 9553 -> 7450 bytes data/skins/santa_saddo.png | Bin 10223 -> 8006 bytes data/skins/santa_toptri.png | Bin 9404 -> 7347 bytes data/skins/santa_twinbop.png | Bin 10779 -> 8417 bytes data/skins/santa_twintri.png | Bin 9670 -> 7668 bytes data/skins/santa_warpaint.png | Bin 9542 -> 7640 bytes data/skins/teerasta.png | Bin 8977 -> 9006 bytes data/skins/veteran.png | Bin 14269 -> 14598 bytes data/skins/voodoo_tee.png | Bin 8191 -> 8211 bytes data/skins/wartee.png | Bin 9261 -> 9446 bytes data/skins/whis.png | Bin 8408 -> 8416 bytes data/skins/x_ninja.png | Bin 3678 -> 3686 bytes data/themes/auto.png | Bin 10354 -> 4345 bytes data/themes/autumn.png | Bin 7733 -> 3449 bytes data/themes/heavens.png | Bin 3360 -> 2674 bytes data/themes/jungle.png | Bin 3070 -> 2121 bytes data/themes/none.png | Bin 989 -> 726 bytes data/themes/rand.png | Bin 8235 -> 3021 bytes data/themes/winter.png | Bin 5561 -> 4902 bytes 137 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/browse_icons.png b/data/browse_icons.png index ae2ec2c1e0f8845b1bfe4b5343a5d37f5e426899..220eeb3c3971150365d7f7b0694a2a4903761461 100644 GIT binary patch delta 2609 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 LNkvXXu0mjf0SdlF diff --git a/data/countryflags/LY.png b/data/countryflags/LY.png index f0661c150b38ba5855a38d5c43569b821a205d5f..f07e94dc89aba496011a31eed7ad4ce2ad3d5bcf 100644 GIT binary patch delta 1115 zcmV-h1f=_<4DSe#BYy-oNkl*&g_vo-4O@`8Uw-usi~>4PFo4LXwzd{!Wn~u1 zE-?}SsjI6K`K6_$7RoNo9>C`+znLK)={%H|my3J@10c_-9DfmSU;yL|or_1cu>o-E ze^TX`8UT4&$>=vR0P?QR6Y<6dz=dBf1K{Xq0LE_n3=M#Mpk(x$8UT4w!)-eCj6`ezN-3ux`ivM50Od0P z%4YzSZ%_b4Gk*ZW0NkZluU@FAsKDUCgOQY!WWo%<0165UFlWvjeDTE>`1jv`@xccl z;J|?c*tv5jCQX_Izu(UQVl{xFLx!!N)5frD5{q$s%vho;@fjDLKQ}$`mh)z?*Km3H$c#!{?uWj^mHV zAAh{*+eOU)Tn}K%lqn)`*REYCE-pS>0P@_x?Af#N;DZn1+i$-;PQR=lWY^$=dO>N71=+XIrN!Dk{Q^88h(fufO8&zkmP6@4x>J0P-;x#4`XV88c>#Jcj@C z&p!wTgSJn1!37t{B5>~9xw4SF`s%B(b?a6PA3nU<7I+N6$^Eqwke!{4`STaxqmMq4 z=K%8Z^3E>rFqd9-DK>4|1fSn`_#q#pV-~#&GGJ5yzjXUnT18=?k7A8!b zfPciK#B<-#<)!G}v%3pY8GtJ*>mkF2;GX;LkqEZ$+%8cZ|9Ks+(Z%*1X0zU8G9Y-#}h)#YeAa|8vO z7=V9G1w3;`Qm&~1c;=6ySW^S=E*e9rrUu|$$Q8e_0eBWrzL5dQf{%~+Mg|~TJyg$J zuJ(-#z`JA&+RiXwpU(g|>KTBMqn-f>_4W0ruC6}rUz<7%iO2v%d{tFdEQn_Sb#--( h0hN`NQ7WDR{15b=`zWOZt|0&b002ovPDHLkV1htyBWC~r delta 1556 zcmV+v2J89n2&4>XBfwSvy~-aT%xNUvrj$bX`XX=f!u8gnZu6`P)62;S`HtXo7FP_*9DcpejJY@vpG4ZChGAsTDxsE=kR1 zMsiG50SW{|6MrNnmHqiB0~82JAut^+_!dVU0t$ePCYZvV(=Dn36aa3N{v4_T_?(O; zm~mpH zzmZ4rK^eebx=qoU~O$Jn>TMJl}a%%Fd*eN>lNcs1t>ZL zY}~k!3l}bM`t)fwZQ8`x*cgL@gXp@>)2C1A>gr--WW?(<^F~n_;J|?cbar+UjYjG3 z@29D$iGRCy?;?ai2thCyq_VP-a5&7XSFiGym`Af8ipT(a_Uz%>wQEG9QM$UiXlZF7 zolY;8c<&r(}kOK)#4t*x!^h`$&+ zckZOMwUw%>DgXk30HIKbva&MgNojc2_|2y%41Z8pS4U%GBLLU0UuS%Ld|BgCsT3zq zp5)A#Gt|`7aN@)Xu3Wi7eSN*NgmU7m3XmVFtE;J~sNmtlhs0vBWsO<4ZXJer3uV24ja@#;4z>Xa|IC}Ib z2Y(M9WdHvCtX;bnfM77lg9i_2X=!nmkWYlqQ4|$G)8_WNZQJktQe}C0Ia{`DAsh}9 z3vH*VY@ zlgVJ3CbP4%96EG}%a<>IcoG`E6d#Jf0Dl1Sc%13!Y4+{g$F5zwmNjN#VuDyKMp;=I zSFc{>@ZrNWH#ZZBL}+MeSbCr~@72e`=lIBJfZe-yx8>eHd-lv}I61tv<0mI4356<% zL_Vgpw3NQSK4xYX`JU}tV(tBGFUe$*jvqT18XTg(e}KNeKNue$N7wbGKhtH=w|{Tn z{^tGY=xDo>SgWG~EVaY`7bQ8B~?z?l81WOjq(nV(O$mj?iKXouV zItm)t!eZj(1j(u7;$sVt)nNd5uNZ@W4$|JNwrMcJt!J3u3VthG7u@Cr(dK z4^zo00BkEC_vLy^VHrTe8MK!ZFKKIQc6ovtm_^#o911Rxb#oq={;(xo2)Kx(E z>uM=+gb>&n6V>@GfyC9SR0C9eStTWoIXR0kSN}k#uo+bUPEo*BTL%3{wd@x3PR1`xKGJLaph?+fy3fVrh! z7TZt_pI^wE0j!LHoi@qO^Dh<4#dQOyS?_OLHGrD+{zs|-YI;f$LSULEhG8It29(JB z2!&*%89)euVHlXEDeY%X74GBM0Jd#o7zUPQDd7u{{{R+D7kY)gISs7<0000)!bkJ diff --git a/data/countryflags/default.png b/data/countryflags/default.png index 56d68358aa5bf365bbab365daeca24ade5018f26..b26f2a3fac158c83bd022d3ab83c718ac16d5bab 100644 GIT binary patch delta 1506 zcmV<81s(eC3-k++B!9a}L_t(|0qvdDVjIa4hR+Ly(ag*sGDzXX%oJv3CZU;`*%nhc zd7L_1fmxV|K|Lc&yLIv1Rn&I>-zbfq|3yYd^2o@@*bK0R5F5`)Fl%uHAV`3e)KrL# zPavcR`#SIhz#nY;-u==;U|*8}|4m2$f&?H)07ec*Mng(gCV!|jYADcXASE*kLZYHc zfPbR^dqTpX_~;RM^!zc*F3o`VgA+b|dnbtJqYLJjXW;3pXK?uBao8Ig9;^b804lW_ z-WuM3^PLUD^$C>4&~8K-NPu7wAR{*q+Pm8@KvC%*?u9(1k^~4;0V4ls|K-~k@bRk` z1CtD`Ne8jX$$un3APJBylfjC02?O#AR_7`xii${pKoHA3o&?xR z0nT5!$Q~vmcOTv(0k%Sbvg%3?jG~k6%72 zArV&X%h>S&h0|-p)kP9OYPdOm05Uo?3_JE6AOWNT*MIG?qXU_es!9?-3h>Dqn;r>x z0T#{kxc@)`hz&kjEWvd5b-=xcw_$pI;~ScDET6Dj63nQe9iY zpUaBw|njO4H7^s zy8F9)4&uV4vw{Mc+VxybPk*OiO=EMN&+SglO_Bg&urDkESK53IqNc7=Fx;mv9&t5q z^{)hLPLv#D8hDDZZA=0rXJ#^maH{NtV7PZ5+<)R~PzIrzB258P+lt~M5`Yz@x|k`1 zy2cv8a9_NB%GKyiZv<;f%1^S%S5Za+uu@W4!4$%!tLFv7ZSOL2HT^?9f;BB?8kyQ| zW?v5=0dP@;Ap{JX7pz>F4>sp2SL1o_fPx|=uTE=t&D8d-d$&mdRxVw?!W06ATc}p8 z`+sC#y>aPpHOfLc*j;9(wjVuvL;|o<+uXnq0)LvPIa~~8`x39l>9NA`lSjF_)($;$ zyO(cVB>`B$Gx@ARAoEMpU~JQ_`Bb~SHe4Uz_6u04ZmcH(SjkZ+urq^_!zYfB0Ib9$ zCI_tm*>X7vz{<}32f^%E4!ZF1o*}Mcl79dq@c6}(pcBBw{_|D?23*m8bB!CoT$?`G$zdm_* zlGnHUdy|9s8Itho?K4oRi%0;md4KZ!0k5<1>)Z3ev8nKFu2uZEl5_UrSzN*<0mL97 zHTAb0-O+8tk^6=Pn4B5$ivUPTMJWj&1}Do))*Y3bZHpTcptHy1Hvx3US8yPlHiMX{ zZ>ir1v*$XjKQo|6OdsVNX16AODn!yqI&8WPjeAzOwu8wcxCGc)n$ z`2MnqT?ay>{=G>6f&?H)0D=S{0qE7S^y*l8c{D)+utEa-ABZcg>WXeq!vFvP07*qo IM6N<$f(YBv`2YX_ delta 1500 zcmV<21ta?O3+@Y$B!9I@L_t(|0qvdDdK*a)M)!rnXl7;**@AFlW(qSilhDk}Y>O$J zJWlP_!YqtYJ(_6ttBZ42N!$IO88=G5L`O$6k(HGNKM#U6KN3I~NPx8Tbcjz(5&;7H zI^+bvA8hCTgM@chjSIC}ad><^EWssJQ_N~?wUrgz}} z;J|PL0%b9^n^6X-2tWd4I*Q5F~Kj9y>auDSxS|Bmsf}K3QYaBOx!qqIDkk zA4mY9!6%C)nC`v~c<}fxOwUiOTeGk-3lE>%gN|+s(~4rt#d9Qpz%V`i?+mX&rYHbJ zRjh!Sg-Kq`ifsWjx?-;G*~`ZPx3}t85^yX)0^r(vz+pJOR#2#97%E3~Z3TZWf3X?3 z8bnzDD}VNdfZNSiC`bUIXgJp#a1aLbTMU%PvUPq#NsyOso(0_Qjk~u<0HNsa?+Q4G zOIOaXDS)Nj$kp`pcdl8}*jyKIyHj(MB!Cbch={_Kwt$1EsjFNw+~=>Ja5e9ZZ`Q0i zRdRx5;3>qmF$s{Goy`=&nX*%BhI{|f9j*ptSbwWVtt(<`TcJ^t0IVpr8m18H8f(@J z_to3yT#eE4Zq1sK^3!bcRg{qctdvw%FokgC`o%TFZSOL3HT^?9Yu2=!Yh-G>nSDKg z1i(cVh7d4lUa)dyAvoNtT#fIe3yRcAUY*|bmZ|MK5AKoxtX#QyjVS~Sw^*y%^vS+{ z>wn6>YLvxtaC)pvZ9jSOgalxvwz+{J1pYKncT@vb=Mt~R?X$zl)5p2G)(#_cyH{^r zCjnT&Gx@ARAoEMpU~bcI_*8rR4qPAL_6u04ZmcH(Sjkf;urnpe(NiZ#09N9XQza`v zu3Sz6u(JE$VX(TEB^N&4GsIO)57O!&BY6&0UI0tm@#{cFhx(AD2bN5X_AIU@t_<4HmQytqOF1c3)n9|rZc?e^PY z)xH38OH(krFoD3_;v^mo1DDqdAHH}t{eRw@^>i#eSVY7puzcbN4?Ow1xH=16y??D> zw7lICmUcZ140pq_Z62lJ-5AC<6$ua|(sOd4tG`{4@bSrR>oj7h0b_1^4(6;qoYA`=owfMAd#E5z{s_2l76-hl4! zO%4hjKF6E)FF>VLlK?{V?Byd~XMf}C+xN+}t?(V5Rs6R>=ltdKxP(mt2tiVM`nnz6 z(QU?&`<4ZmoEZ^C0Hma%lmrlh)8!?bj>@f$#VrZY*<%q+0E77r9EzmPAZF@Y>bKJ2 zII7=F0317DtytjLg#=)wqPB9&9p2sF4z~5Tj=5={SQP8DBmgT%PaWTO$A9+^b*(u| z=;?14RRA2nkO0i9fAQQDaJzK(wZZiKIJkW_6abfaMGOD=>nDs?#7O{-lO?BcP{kAo z&KPhFK#V^FPhLF453{0KfRH4nrNhN*7vQb_1$J`Cfp4ix*DiwQ=n?+tp9B#8#&BFp zDr6VrL%u?`W%A@Q$jr-w#8vb(h>VMeec=%h78?u68JUnP!i)aB4!GCouq%eM0rW0)V_uA*${UY!da337+1&>}pz=^fs-)f&~cNP%pF1X!F zq)Pz-C)R{N)Ltzh)N61n-3f?0feQ$H$YcAm{Rj?zLmvX-PJjXm#Iu07h)Mx*CvX7; z;#ojk#9;#g2Z9rzfCBL>ATA;>)4p%q366jQ@hl)NB6m6i?;Dum3MdfI0^%a#GvK~~ z8Jd7h@%(kHbw$Ky@O@LAkbVQ$b$tgy*yJ44cS3wA$#+5`D*1dZ)3@UEucGk9^fV&= z8G(3yHAeywp=<=#FDFVMVrvBA`SondKME!1FW&G+8JZx;B>(^b07*qoM6N<$g3z+@ A_W%F@ delta 398 zcmV;90dfAA1gHa$B!6#7L_t(|0qxoaPBc*vMd9}gE^ENnhHC_mO_bPds27GG+^MP7 zddU5fiC(l0P7)Cj5fKp)5fKpq`oMI`1VihNq(Bu2nW&h+qP}n3~D>5?Xb3OBdXo; zyzxA9&h6?y)0O6Ql(RGE%sqK`f5|U{WY0R8Z(U#0D9=Ff8T!0Ti zy{T9m}X!upU;&Q#cJ{ z^z1npg(Jk*iGEKI=f zdR`;hQ0Es49-r>L|Gwtu^Am&45BiOtKfA%i)NazA4{R4eGYe_o8=pZ1Lnvw4M2aZD zL(TWbPu2Sr*p_Tq^C`Pb`3?P=?@2C~?KaZb=3&&yuy?>#ef5c(|tmad8M&_UY&t{FwEjLxZ_~IPf`9Z(&^JiO_ znA#S;Sbam7g+EWgU%(o^0ya@ete|t>#4%W33%EefKisK+zUM#v^zO3CDzlpvF0x2k zl7Gn$y3e;?fJ@LVTf)TDmgtsCEEixBenSnjkwG0Eii$`cC3vVI15eNYg^ALhTwnA3 zpZ2-sam99i?*)i1rd@32=g=v$P)0>>i>Rsss;Y>J@A(QEknRQ8&)4!jU-@;L`SuIo z7T{Ivjh(SuKs#eEywsxr`}uFbeYlJom49j0#;x$U-}yQmP8OYVH^yQVMh7$sV{ivL zC2u|dfCE-;{&I)Pnzx4@x(W->_k0}=Cy7qU;tjlrR|0wwulFc5Wi>yUd|#GXW^%Kx zWtW{IiNxDs&DY^@?uUn{GlU1b&A0o*PXF_DIGkm1E%Jyed0dC(gUq)t-+sO;K5xGM z_s<+Gz!EG#*fV0e08WShm{pD_`RlK&dtHA(nuN zegOttLbtdDXgAOWAj4MvfakjfP#rV)@&`WOEr1%SaSNdS0baD_3r5MQQ~&?~07*qo IM6N<$f<+BF5dZ)H delta 1459 zcmV;k1x)&i3B(JKBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1zAZ%K~#8N?V4YRR8<_u�}%u75I9vsrCXYb-Dg_d#-GeDS4+ z1o5FDdy}Z%!dRjn3g03K3b&}oNL!RJ3QAE zcX#H_-I+V%j9t3-10T-0=boA0nS0N_xibk9Q5?syxo9)XrZEvE?f?-d?f?-d?f?;| z?he4_>28}19bs*2T}~9VeCIU3pujI-aI1exN6TR7{h6TRbw)CVvu%{Wc#eXs4#QPm4!p3+?>Q z<}1*L_b`l|#jH7pKj33{FaC%tQB&$qI1g9bym%bX;0;`l8hIMY-FOXu!Hw93B8SOh zc8cc29~pVVq|+Vd?Af_y&6-Km-+#^|ld4xMzCT>3Id~aecG^>+Lv1TIv4Gk<$DXQy zb6(G*n194~u^nH+k8mNrfPMG~ZoscFY5fA%q0Sw^-8dih+Ly5d-$A{%xPZ-%-`o47 zlT2POjQm-%PC0{vpHN;kevm!D9$Zw+78ti_7%6R=+N`z*<(5q~D=x){@gaNwwTaS* zQT|cXh`S#(s-*TD8&F@fR7ay#qgQ#2I*nG1UVnGSbz_xsd+`SbGNz~JGn38EH%pgZ zHU|&B!VIvGb3x-*LJwJ@?&9GodpdNeZN(;*;kzNE+^ahR#Wnm5Z{S~e&X#HY%;F!Y z(WJ%oqRlHEvH2@Fgg5aj4x(P~Qf&qh^~KNUCmp8ysWm^BQ{6!EYs~-$Y+A~MO~Z&^ z+kgB%LoF7dM%)$DtfKs%sP$Z%*8CW<6_iaKxJ!C?-`Wf@kd73 z?QC((>C>|r@wd#;qgk_j`8}Mwo%n?jvRPflhpo0s=uq2=O{`$Etuh5=UQ0)y*pFI= zU&GIFEowde2D@=1YGig{8o$QpaJ|j%L4UpeWAsvM1`xI5XS2gjTicn!$X~Hy%sF{d z=j)2^I|Fb+o2SFYqY5T%8b)Sn+hO~es^PsB-meLz$9{RGuELwvqQ3ZjefOD6W|0ZYq#GMGOfYaQLojDwC20BiS``sqjAkXvr+X_t~%O<`^`Ll-@}8& z*P5TnEV669W1Xg>Vy;HEud$<7gFlAmqRaXy!^gzcC zEgSX4-@biS;o**&u5{28zF&NH2zV{G_Nny#*DKgu-{KU%mWpu}F(=Bd@(!VfW6{OUjK zG(uVY$l_jr54iHXW#4O|3(wi^hJwU{XXMl(kcYuf!cYsJ^%)jKyeUf45x48fS N002ovPDHLkV1gEkdYYP^3r;MOu)Kf)r^AHoEi@x=0ZLL8V1Nu~DQ;4Io7j zsnUCw8U#t`UwqGh{&V*3-h1XbcjnIQGc&vKCPupSG#65bNvHu2?ihOTV zbL;^Cwncqy4T}KK<|~R6XKU8joe3SsN0aV84=1Z1{daA>>KKy^Jy5s&TW!`zobgY~ zbV*&${^;@i=aAB@G6$13s{lnBKkrqal^@lRR@E2?LB`b7G%+3+@jvxeM+YBGrfpu7t{Q#e--KTA}Or#>J$N#V2j7?!}zk*kM3#yf2S($c0&-7gY^JdLp@hkFUl z=Vw_`JY{oghi|5t=9o+vFM$i^k!}>Z%Zu3staDQREDwR3z*oXxgB-V$NOTzbX)*USPz+In+4eX^9x*5t={?Z6R>?IRHXV_c=sRk4n(LN_lO+1Ic zgmm%yw|JmmF4$t{#KWXLc~hR2m7$LI`qW`*c4rEwXd zXGaMs{>rce&?4-ST=v2Q9le>Dj~a z@~?lG_2Lr~Pi6zZ_OprIC~S*kOk-2=g@n&qE4S!q%m;Csk@BD%|y4X|r}(adD_fplx^v5n2l^#*I@rM*v1p3=7F2K1zUsultCnq8;IsNOByl~dm?~O~86=~H z-F2&v8(0|vj1Md{pWETuJc(vTMm_1GveaZZnPHFqZWOJ0p_n|H%1I|9gfZo?lK@SU zHZZD$Zi}VA4HB%iQi;Y9CcY!jRgH61$i@l{wl@Y71M<82@>Lj1Sg4{!HAK)?6Y?lz zQ(PW-A8ySpbGPz>L*i~vA9Ra6x=%X3(Ap*Gw>hRE|0&CI&XN2U2!m|5LSf=ovUFikb)93V#bkSe?|g`1Q(5 z)Py{J_G~prRg+|k{o>py^ET}C@69ch=;b-*FU$@~FS5+JmHiO)Yvfqn*L2%`W)1>> zA?-vp)-CvW?-o!$8ZVE5pTY4HVEcDR^bv80T-48h-CqI3TdcUpmNsg{Z2yB#qDmZr!6o{ve}h=SzrY8$3NvLMNrQF zkf;4tb(*Za?YU7}zg=fiR=~MNmQD+C;Ww0ihURy`%>SO|@PoQIBwb9n*N)?gv zuZuJ7gG4RaIOI2>o4RIa@bnbT6sq1<57=q#FHBrLB?E_5WRho{OxZ(u&wN8E|m zs%cUFT=!E3@5OQqZmotA-V>4$ph}A3g{szGLp%0k$Fn7IHPD*v&lB%6&*|?>R_ofH zBi62*S3(s$skqA>@Ja^!U2SufQ0$BSPR%m7d(+{{Wwp{P0g)VBhAtv%8IUIh%|BnM zvx*$EvKdr?Vkb|A(&?yy@JKAYR{|Z3}^~nPF*nSn5k}=Ed!h! zO2>|Y*ZQlI=AyP`$_TBrvZ=1Y3N)x9oCmH~6ug;9nwHRz>`+uY@4#x8xD)2$KOR1Rool*F)@ZIpk z_o=!+#l&E5p2h-qAP!MF_MkrJxT@ErP#v%C4+yTTF5<^iDdJwXX4icMmv1T6nedNp zP!m1u7{^UpuWK#7wtlbqUcIFyqhl&EAt{cTQ2RtozpYOb7 zzFy0&DIaWEg*vBqZ~S|suUGs&q}cphPU}WYe{w9a3~|tYb569ae#vjxYrAuS|X(j z%2aAEJ7S)*e)rjJ=LolfZjlW(!XmZ(j;o?0_&!TQAiSuevAkD)62Yxj zWSnOo!djSX__r!iGsKTHA15Uc?I#C83ZXT^9XQIOTUf9E5h=pezHz^&Dv+rH79SM^ z%l-4Rrf#1~*bnJWLbioH?*Xi&0IB(DM2k}{ge-n?7^)b=_9xX021Q6V#Rm?s12*$9OOGLAnefi2a2HA%zS@vfN3~eH4Er3p3F|O9p#*5M9>I;@bn@1ECFeRok4LQh#Gii9J>X26$ zcTJN1=1Sv!8MIePjp1K>Xrf#0u$o?o3DtLZ9ukcf|h7 z@aI9b5IKnA(OSXus(9o6;C_~MCcNIPLh^4H>#a7nq`LR-&Jq6wLIj;S>ce85+Ceoc z)#Ta>JcKvy6E+XVT`zdS+IiXmvuyvFKy`9xFM?U&xUSM?-(DaS)^rn8Ms0nPvW}^* z$a=qrJ~u3I_k=zbFhX`Hi?BKzDg9?X2t>1anCPjX_^pB;iB?E;m0w8FQs zw|t;KQXYpO)cg`aYhnLrCr=q>41(a@TbFqCRY2dxC!;` zBfD%p+TXFb?Y?fO&4&6CQcX<}R z7ArPmONubR0n&9YntwE=gg69Iejc!&52`~#1*qCQM&A;lZPw_|mAn+W&oX;k)IF~yv-X9| z&f?h#ZD|=86UOM&i)Iw(J*$7DsApyu#1A3T1}^6(Naov#{;?C%Xf96&N>fJHHFm|X ziuZff8hvTw{^Bxlk`q3(3;o_$$CEPFBC1VWVQ3YKw(vNR(HFT%kkr&`K>%>j%v;`o zV-yUZs--Ktpa`bV1N_S4F2$Sn2gD=^Da1%8ka9cSr&&QO-Y`D?;JIX+O{`&Lfa)a} zr_N~;AlqE_XE(64&8W{~Umyj;rpwg#fu6VcI)IC7xUJ{{(ZjE#x%B$bfnE;kPiKf} zpOmK$>xt?ngLl{mWa}Gc-ktXBL0#!K&Ts)>eslIZ5|apEF4Mw0o<>&}74V^wjbe^6 zf>85u)r3-PKNVowVF?rdEWF9LIp#c-U5|L}%*0-!!Ga}rvcP3iEA-#x1nl_A9R=P< z!U#iE_qORntVxDaP?TGURc(G$R;zxIyqhYJi?->0D&L$czWoL|yJ59jJkZC)Uc^}B z8EvS;xX2var?Gux<@)Yw(c&j(-9%t+y7iC;w&p^IAooGPaZtF&?k%wFWo!AjVRq@` zxY!};8(Qx?^zJmp0gMJ6q{V5@TBlA3AgBWnjI6S4T=^-yNKs8Hx1RD5q|`8lcYCK9 zoZM&N$jEEbOKij4uf&$r?X&@u69n*JF(T^0B{E++QtM&e6pzc_ZM|mBTs%#1y!=>|Ua_2XL?VA10s#r0PO%VQVbKBV>)6qCw;-GKu(!(@HVi^W zS8^VBudga0Uj6)h>PFS59Mw|#fCWgr0K#uXw|OfC^MP|@ppPJ_4%Qz%$TP z7`6zBB3Rdb9xy(!zwzLS_4xSdZHb0DF|gZH&MRQ-D3p4|>0q2A#o-|@YMjng|Rj2Ygqq#TTK)TzbrWycg=l&H6;C}Jbm(c)d~!; zE2w7E^wYz_<6F15K-hFsrrVjz+sS5ZG7pqMykEIG#xFc|$vxN&o9ABC#^NpD=7}eF==zVo)gO1c*lEM*pztMo)yyVYS)WDfPN{6kvK|)I1bTHE^*f8|x1j7F zAt?pAY{BK6hJjZd&qdleG7U71)Z$Pl%F?H|CBY3}%;#AMvPO`(;B!`cc=`4;6dNwM zlxQXz6y}PRprh z0)UGx3_u$DkIz4&;q9sVL;-HV)E4(tUlMC@`V0eTpg@?oib+LV9&^}0TXp!?1gnHJ zgCx~k2ErmBGzf$*deuRzeBv~}5$bjv9CJ!LA=B9~&|eC9kXEP-uz<2$z3Z zTi2SpDb;FO-JA_~=7kv^p9@?PoqAO180kk7Ofy?57=Y)~;kPsdO4wIPK(G$CFz6&X zFlRkf%SwC9PSIfOrqwM{$=R7Oe|kv;E;a?9Wl5ZD&2Q~)J&%@J+Z%z1;EuElOlKo-UOQB)`NnkY~+1622g0Q z%cKk%OlXP)m_h~7fpNqHz{utz7~8~*YmjIZ!OmvH0yrtiTByxB3qIUc3+Oio?>9-r zK#(37@`3`qU-fSh@=rn!I-1D*0MNMuyT2^mob zWn~>nvX7OMb-vz@-{<#u+~cq3eO>qUyzcRMCYhTVurZ%y1^|G~@T#uG=}h>qLm5uT zE)Ayv0N{cd>S|dAgVvtXrHiQZ#P3Y$&o_JH*VU(*y#Lq!e%bHXyBRe4{Z{72n#ujW znXguR(>3R_z8(gu^h3`X^~PS!8uDHxHe5<6FXXja2QkY zAO>~jOxJoI6wn4kI3fTrp*a4&IH3wzRz;yh01%lY3Rz+;0DBdf3Hn8{5&~6{7T;vw3;JsQI?pPmbPRTEMV7K36P>4 zwL;`sO%`eY@F)KQD!r^wtqz1{E&e`+2u8WQJuTTA&dw!$IWm04SP{&|^t(?Tw3C6< zP|n?NyBE`1ErrPc5dI%Y|T#8}la*nxia`pMH})4v8X&USWn-3AXrT*1G- zJj-=V`5KDY5S9=5B8JsK(_JDI+5e%j6z6JbK8UeKo4j$2OE3aD>0iA5Uia8q-g+}qRhoAKP^U&D>5s*ex1 zNSZWw&x~2L{qXQGiEf@_lLafN@vSu^fL9bz>jPZz^$NPTHu2`I|DsWzT8QFfi5u~B z=KU70EGs22;^Z2xAC?M^T+-dxEhG~8(qr`1_hKzNN$WcF03eZF@6w-HE(SN-Y6pJL zE5$Id85x@HKEt*t9%<5!vd&)g&>es6C`Nl9umrp4{lijHOIH`NIQVo2dh(kWEm8-J z*V<=o8C94({c51EU*VM-BWv3vy*}4bRQ*0==X~nfix1~+oC7)X{U|9n&UFQMO3ZSd zdZPljIeYTmpye}VD*)DE`s`9{mO|#}V<{_f{NFV-YUXWXbI8tbRMb_bPPgBKPrI z)Vjpt%X6nEMFOg8WWnsaw{p|9FI@<1*@HKpTAgeVlXxgvV^PkmSxea;8ONQP=pr1Z zz(pLGSCX-L3okxIMIJq8MST-z=W>PmTL`EGrn9Lu50@IGNn)rmo zhye~iX3Gq-u38zS35w?b+RB#uAnWUSe6Z&TnuiO6)C4qw`I9R^V>9K@qAq^5VEHRG zf7hp^=!pWhOwdRXu*i7z?SKmve~zF04kvKqnVq192ZPhb>!99IP2h&DyW`kuEl{7)CjKenR%}R=hD=MxB4i2?jU6dGupooObQIz zoK<%a|2&2uh8D@A`G4Aj6kP}Z#ByV|Iauo-`1;`}e_@L`zzNGo6s2;?tiQyRu{p_r zXL2-0#YBoeITp~*v+?Wtk=q`ZsC=Cw?|WFjb;oszF1+o7{ZwxPED z{_@P=!D#(m<9dX2fH^${OT8bxNU*fV^_S=+Ll-LmH8XPmNV&1x$e@0TeUSowD2|2u zs+E{oKABFqKYGZSGq~Hut%9w)ICNd;%RrldO{7O&yMBJp_ek~<^fyom+BP~B`2i#Af$tahx%$;># zdzbWI{7qU_`i5Fl-Uvm?s&?>OQ>2VtOS+qcAwlhiVGoLlk@GV z*3~2PT?tH&E5N&(bB=`1)Tb+nIe~FI;7L5CwAy{R2LRZZe{y-0y7?veRDQ9yJ24fp+c8CU)d%5QpR4(kM<-2dlhUo8WS zUmTyaBTe`uS_HiMytK0ws?`Y43s1wzs^$!=bgD!@-*Z=sW#R*|L~7?E$;yhp?$+vl zwRgcv3d+KKgtk^dm+tkByJx4_d+HL4=hTNZ&%>vl|9j6=UsvoO-n{wh{dQ(nzrgOy z^0Qa>6}~Ow#g>v`+zu^!zp}37kuu&uQ86zW;iQ&>m8vf%ZiOKgjcl#xu)D=jiqt&+ zrt_!-`p9pgr_p8HXE^>5uvkp{)t}WsQdus`f;(pe^+8XmGO`&Q9dR^~D6VFnC|amqOuGIu`p=A_^ch11lW|IYaj$kgD}C5-{~iO%=}E;YKS zPidNOU%cqevHJogxMtciYd7V+O@gZ#9nis)iEH?Oi@9RQJd+jy!=^sJ`Z6Sr93f9e zo#yeJmCyMr# z#}Qz{e}TfN5RBh=_d=!y1_wUY-9PL?E6voKoGTu8z{~8Lv`d8wr*o%G;u^kOS_r=Z zndlTDOz?KCutpeBj^-2U=~sh>Tmnvt0opto#a1rhEh>ok8cjDR1`)e`#;|u=5TA z8Z$+b3-KFFTd$ue3DXf69*w0!uzSLR10G)Vc85=-6|~5+$7>CwyeXnbRn4U-li!o# z#OnC=D4ZFb{PGm;!)802M&^KlQh0}gAXt+F|2)l=m!+9ap{{=TzGNtO+5{(2L2#x5})xI0FizE>EdKvx(@eWL7FGAeMasid(YBSKnm z(S$w87)@x0FBBM{!gqV4S%%<5G-lhZNJ)1d%(cue(Q?W5Ytb~J1QH!4Rv28eXWd8N zZy~u%PtRQ}M9?C9FVNt2k2X+@zPgO4H>--RRGMu{nw-_p-tG&zd*dU$xF|*kfVuzT zlvjH&QI$03#`PlKsQyh-m@I$fyCOGE?Tr2S6rK^-89Ran_yUA-$8SKUIa{WezL}}y zDH`K-s5O`F(L5U}FsyAB~0J6`<&z~S$5{g9~n^> zW(Lol)rw3Gwv_tzf`0sw|LLk&{pYmH_D$A8&UsffYsJHnY?=mv4AA;tM}!1~;7Gc3 z*!f^%n?V$FtpFQH^3>Ubr=N|QUR30?%9lIejqDi>H!WV7JL@^&=w*tL_QoA) zxQ~sc`2gGLA-b||g``08k)s&%j+GtJYkfD6U_(C-* zr~i!c#gVDlO~9`wg}3X~H+V4&Li9-ZcX`yOWuC#+I~y2~>u4=!6H(5_$sf_F8WQ4x z*>4r)B7^;#9}7N6g0em3jR*)~eeB_DI#3=bU|PiaJZ!yjT+!z`7!EtnIQ>(GSR|lw z?KFuEP94H~SeL0Nr)*1hE*qA?Rpgd3XL1@mxv__%gdB42ok*;$W77ivr z|LKTi_$1ycZ`7MP-E;i~Tru^w_gwhCDFVo?PyPQ=r_PDJtx@|sXD-}OAkNe{nPzPi z1FT+vyfh>He4_p;O}9Ov=x&zwt2MSFmcy+bJC)lSxj(?SJemj~5#sWTBA*CS=xR-G z%cldRvz5nKIqIo)RZGb*_vo&3w5P!p&{;4wSY1j%^q!aR@y~!aoCLa($AX35G?r4L zTVmfDC=fWT?1M%l>Br;G{l}QHD(olv`CN~Jexd3{OV{9WOdju*SZ$GSFFE<6OA`5v zemzxZmOp+>{$Y+eRYmV_m}?7y-}wieqjzw{3Am6VOe|8aA|~^{z7fq(8C>;mumJ# zjKsOOHDqx1sr`TfDQsHP*~R5n^tp`puKu2^x^JfF=5UmcjBWu8XH^J@XwO|>5h8BU zjU@{;@)sx zLt9^>_c4oeC!-lCPN=;K=o(+vle%+gXTMd~C&4!w&*+ znIf?t)|--@a1+^*L){XbrH~%DniT^Nj|`B+rD8_7ni)TVM?f->?Q;pXBdt$KqALlT ziOT{GA&Z<+LiDqSmEdoiSBEsskQkd6JY1Ne99jNo*7GO-NRbv7WA46rQ0criP`c7= zHauve-JNON;n;bxa?mYP1C|+UD;Hbbo<3UpVMAqBO0RuNxD*GQP{G zF|7rzTa+IfRIbGY8FO#O6^be_pRMw%E3@FKN?Z@|`fG~7#*!`Spk!UZ1EN0Ugrsi! zinzSQw-MYUoE8@v1QQAhJBA-(WN-3^w3g$jPLWW|?Tq^@V&9`6{2GR1M@~Y3u}bBX zVrrseQ>Kx`V&8SFC8CW(Xg?PaER8i*vDECF!}Mjx$+rK6U=7bxg#)s*aBvyP^*cZ{ z8XmzN3ZtK}_T@5ylDA}>WSvUt(&{#Wg%i6B_gX#c>G(WAZElWWol&i$xVhYhQ*0>O zd}ZkpJ)~6XLq6=3V~7D_Qa4$ecgro5m%qnbvlGOIYU@iABxGca{B`L`^ff|V306CjrR44hp?WP7*0q5+S@a0E7;3dq`X_^ z;^TKz({GfOCUlY16S!= zZxpLrnAqkM5ta?->2>1;HgL62OT-z>tMT^;Ak0Kr-T=&y_4ESADbkqwSBFgR;QK;I zlcoExil0kY<_EfR0Kv0$ZM+a;Mv@^v-!T?hT=RWn{4Gusye0W6Ws52yd9jF?lIf>A zhPnk-etdn3O~_URlc+lnJ7th<5t*~Nkzv89h`$0ty<=YBXVp_QKBT^-JoY(9xRG-F zXsv_Em`BsVUHty38Hx)4Gf}$^sTV_8A!3l##@Kh_ch*2}?O@o2S@uh^94B>XLRO=< zO7xqnr& zWa4hF{edn}>nQ>L6T-(*D}VqiBZ&Pm2YmH=q{=e3-WMwj>C8PI)6Bk1qry6nC&?O`HooifPz;hGOq$#9Wl94K<-&H^=pUWQE(-C! z5D-zfDTs=Pj3x1L%Wz0CvD=2hto`paB{(o0$VIcHix7}{gre1gS>u-}S)q~PVnuIG z3Y$5*wx+b_**(F^<+mMgbZl~(AhFd#-*CaCS+9mKPo7p*qtiSMPg2O*u@Gp_?wxJV zR@(($b;jz3uPV<;!o0fT2JFig@$$DCy!8l*^SD!SrmGD8C^aZ@YPLko2S(W!{<-Z% zb)ZV{(UzefvH{E^RDwT`Nr;LQO{|MsPgF=uGeQ1H_07?o^ka$}{kT=&84z{4zEf5E zYa1Vkaz8ddz?e^{g#%64I;8hMYcd-pBdt78HrN&^fza?H%;*Dk#gsANpQytVrFv@! z&?Hj|U5M3SLD6VFqCj!mED02OojMG(9*)N*9Q>1Y<0?EzK%LgUKtx)cnpyED|r7tvjKOjL0a9@x#;*bk1fZka3 zAOjEx2-grj(zCW#wpKP(wy?fNeL=ZGn~Vxr7Ns zSO`n!&fI1*KxQxnCMFfZm=@AHsQ4Bzk`o4uaDg#0K(_5RsLvJ(+yp~?GWNTLkbopG z#Ha|%0L;%3K1-uHdKe~h0av(GvE?6dY-Yll8pQy{)UcLM+bVkN~V8UTQU`6CWMfQR`Fdgp!s zfFpTF>4}V%2WZ;}-$QG3te%_s9W$${%tn3iocC@TJ3G67^fL+y4aFk%_rJV%6?a+h zao6L>-uoi5ulJl;MY(vla=hD+p|hKhFyP+Yq3>2oinsdY8Z;PPU*69{L0DE9ROkD*qE#p?eE*5DJ`Qlto=j|C~ehx{U3~wtbzCK7J_2pl+=~CHw z#L*~xn10nTFSutC^z%m*%wa(h(OJ8+bU?Hd|Ka-cjF9k<(zjAa?Mc}(l*5)Pes5MK zFZr*(F|nAO3ky(m%2rDgKHeO)JBERyZOgp!vp|^1$=Y1V9+@=NG`5 zr}}a&QDw{F$$QDje7hptK;6eo7v>STE_iF5#@olJ<}kM~;5m}8^rPqn=7Uy{RGO1V zrRnu!;%!6czo;!9BngUwPt1$Biz>HiV!u8A#0ntqH;K%6HiO6(WdiUXx;Q!}iMwr2 z(DDivD{SBL?wErMHf!U+b{n>yhEq?+!QrHlG~`N>-fG|6c2-|}*H+F^ic1*DpLF&! zW}iFWOi-z)i21r(`pWI7Ph>W|)|a;%bqgddBP-i7A?16)?&1P%?5D9SN%Vi*I=Y)%iO!y?S?*NZ-ba1;>6Ro%4upY01WsdN zC6tHvv8)#jYCf@T)yP*g+@?H|ck@%PzlyS-k7W`sQAjwQcDwMzZ1W>|;7kVwsXTmF zUv&$gpAqcm4A{eRTxbcL^Y`~RejwHFFf*~LiH3#Zvu2o+sC=UG`|P?U z3@FVt46p@saR7dNHILvq)PeU5h{Lzo&UVN4Y8C5&4eBcc_%On8QZT>x57>!*K z9?nXzF6LNM>dSS~?yQ?_7_MJF0x^T#%zLloUTz<`+{1#A=i>4A>+g`q^YX%6m-^Uhqj|pppD`<+*FCK>6){|L5+`}ba1|@^zn6Sh`J)8b zbyI6i();9QzhHNB!Ev$KVAZIwoc*DCQ1H#rW;)*3wtAdP9UK@ntgB10vU1LA%XU)W z)%vVE;v1<{jv`B3%RMf!Ky!1-9JRC>tr{&GZi9*k3HM$sUL^5byh|5eTkT5;c0$Jq zY%u*)w5*~f02MV{Y(|}(=3|y__utZ)1A5mKaJnQ$`vcdC1p|XQ4I;a1(ik9w0_qiv zanlmTF>B7N$L5FJ&m}|+`{o>ru9KV>kiknHNTin5VxvxP?WcNV=Gq}KM@tDIe6(=f zu`En#Kk|Ou_4>a(czzaNns}N^06f#g0Wenz2f(hXsZnbKhd)c;zC%Dla#GsGW_r9C zGm@cjBV-eSHIr}AN3FVT{O;;LR?{Iqiul%j?QP>CV_)lSU7f{WY z0ICNQ110cc%$Ss@Jk?Ykcd=Xt`OdS>mxTL+*E_jecYZVFZ6>*jv#@NrEiN;ts6Bd* zWc0;c;G1hrsa_K{g=ctXs>(a9#*7SwTwRT0&6Ex=!?88&dYcrOLD-x8Ladtf=3X)t_BDquAhX&=66MfRfp?_vwc})pNzOX z;IWSd?9D6oy{Ms&S-4FG4Vb>nd>_pDsTx)%$iTF0dK4g+kP6I}e@@CbaMCPwXy-`5 zYWNa0!(_pazZ#3{kNIe=4d~#oe+gsDL>TVmld*|vy4vwoLF}0+p`-sJ(R>Cg*ty^*RuZH5cAF_03 z!655wr=7ZE~Gzn7_*L93NS1MWL zf=X)-yxR(Uw0^wqyTi!Hh>BtY|7O3qdp9zMa!#X91pcwjDMW>9-kUjeJuUadtn={2~`j8CCn5I~hTs z#-UecJ;-}EBLy9IQv^xpiKS)nnYV=u#f1eMq5_$AMURwx*MTPZ?9E>Z!Tl~;4>pD& zPhEHYW;Wm~n9RUzy|oekY+sV%VH@-r79~`AX5Nk`l4y+5!%DJ4LR8E1LF>ynehv+H zL1#K0;v|O~XF*cy;rujqe55!ag}%E{rul(FB^6>UKm}NIstM$Mo=phk`k)#Y525e@ zG^q~?a&QjrUqi!L0bmn$gG8m5t&bADj>Cb1RW%Rj+cV{J?)G~{m_@v*+Pr-;s&{T4 z90^&@Ci2M%MnQb!n2tuHXf60iSKs#PZ_-4R7jujWbK*3)9k+#%WSwBP{=X`~23r<9 z7rmPEUg>Ua4UZe2W_3s=e70{gUG7kCoe|k*8$AG}N=*w;`o4plAvDs~wxW~tishnj zuo>|fi2W+x81|9fi?L}&w{_^cP=t5Zd!N=g+oOftNqKJ&M`dYFxLjw2Dn-Ue zW>(r&!Y+Uz!XWncE@2IRYKdJRb%$u?USz)OTny*CNOBUeYrH<3AI; zb+&#lC=HhEZxix`&R*GB?iZlY6T?AI#UJ-zH3>zCd^l(NIbp{78%o?7FY2g){#}1M zC!R+Dj5%Olw)zW+Q|A>1$~n($#J2Ow(@vd&$9>;r0-_Wa4C=k6?|j!%I^fdmaC=r_ zt|~&sgKQogHz{(wQCza&?6=x0kJz3*ZLc2ygI&FsIxOH*Qw}7FYXvXu+9yb*lBjfR zj^=H?JtI!tM_p3NZH}X@<1w!XM8)qAi<}9)r_1)^$@#)Q$A=mN!oiM8R8X5q)d?aZ zIj@#B;cJ5_bqCH|Txgw0>)Jw0p5INhLhc*3x8ocSMvRWJZ*LS{+?c1`-6Ot!sQ7NX znDX4lnt4RqPp*rNNgzD}z7srH0R#8EB~PdSYU$|{yXbXKAJm<5zJGc@ebFtiqZvpW|cWiuP}F`id_ zIGj2=Igsf4$ww}iAibUnLxJ%ks`s>oot$b%Gxk4F<(S!Z5gk-97^;jGVia{S!W zOY1dioQtb*OEYtLlbi{i`@&}QgI<1o`_8((H1nNw{uHUX;y|~ZNh@-xxhnYxrBfm@ z%$E0Z4ZzV?jrXt$2>|1{B`(+!+HNFACgHvgipC7|W~z*GQGX!4K1XX~sFLh;s}tH1 zvfG3OtM>;?AFnbsx<|}hiPMAtnF>KDNX1erE1>&>3rqUjGk(e&)P--)Ms>n{Oo~lo zf{PlokBq;_?q((28+6hOyy5qyJ-kw1r`U8Oyr^D#Irv@R4XaxZw4!g+8!LXcuP%M$ z_)GeesMF$ZgC7d)x;=4ama9>&miS=O&S7JyRU?clx4u%^pQ7>x)dOev{%2|bN{7UI zgMPSexZhVuF<|NH&G~Xp?+A}YZwTN2cW!C=+-mj`0Am_y8-ZkH++Bop%i-O94Tj5 ztc?ODU#2U)jpwMCOq!7gEcc6cdf$t$Mj4<(+P2@AL0M5PY0$KR-uzJq!BMGiGK>Dw zPYKwxb_|5W?2tvj9+ny98i+c7b7&5E38e3nAb#Qd9$R3&;)k`8BY%v04K&f|D&NL3 z#kP;B2bpGYd`%~^7cQqJz@AKb*K*{Y_@Et{g(;u^fV@;Omn_mXtk2E97ehfG($*al z3*Q!NTHOXs4K-*NzzIO%VN~Z{>Kj8gc^AiED)ut@@Vg9M5;1D<--o^Io7;MsYNX~Y zrn&8`(uq8Rjs}pv6liZ~^+R%?Q1tO&=-CsF0|S|LIH9-5n~XRgWuH;AN8N{OP&98W z>^>F@DosXl2@0;~Gaj zkz5!MkU8-e$Mj(gDXai&zVTvnD;ZL6^ltM}j$DCwSyo3Mon~Ozt@R!ExvUllRn}L? z?Qa^dlwW+Kdzs^wQ8V({M$UGolwZhpFv(tD=!d?{Z7>4&CNbtp}1s zr#H;to_RaE95dUX&yB|liw!A*nl6hMt*=`G;oWG7Ss^s;=8<2h%5tkfly;P5nA8(`{M?{d{)#5J2VL#K+8y>$GVtIsm7VUr_3S@R*paNJ5>y~8dFX> zKA_z8kU_N-xy;WYNE2ZY4(F8zNhSLLDymRZU4{~@ovI1 zwhM63ZjAh!X$lAtJd0x&96QY#4l{>*|7&a&L|lw3+$^kG7Wv)qVUsS-udKK3R=oZ+ z+dBUX=)V4y<1kA+mzru%ZN-ny_r+(yV%QinA^=@Z(wk;S68G_HY7>BZ=6nuMdTmEf zEK3|sT?JehWO+{r6nm9LVK1GrOh5Qt#Xisze75_u(Y@ybCyw9r2gx(v*W0soX-|8w zq@_;Ki-c7aSo5uBkA(8pJb?M>0DRIK9+QTdlh}q>xi}70ZE2wRj!m#F&{gZSvlInp zyw`bE#Ls*oelrC194|TKJTcH8`=Zfv)_08T4@fV!D{|%1-An6%Bs`FLBVNgg2=$8> z5DcWq=7{}~LR7x}D{PZ*A=gS1Zm%z5He|u3sNT97sUo8uV*jM^LY00#jad=Kta7s# zn-!O0r2g`~>sU7vhRf;rWw@VmHt*=_ZE?Vxc-SK`I~kzlt})g(VHse6)~nf)ad92T zS|v(E-Jk0zOYGq3kyFw^U`#DdEl6VNPQw>c z3>oBSFX4^bw#nno)BHDcCh38SrYwc*TCbm@SQtiWa>ZnB36nE+=g7uGtN}F6-;Ck5 z^Ba3M9?FdnIO$k6;aSTLwOMS=q%T2rLuW3c;0fhZ7CcdDyoMLlQTkaa;+DxjFL!Vl zdQE%BIx44fR5vO##ml#Nc1C#qi6^Q766R-LH&vck+0>C-BLA`)XStNDtD0~+C{U9 z-^c99CfLKV)SExPskPp@=u__~(5vLK+8#=v;vfRfXE1G*F4OoADaPu{hVfJ(#EE## zGIXag`SMkq$!mm-;tz-M?BvQ#{>@c-;j1|Tr2}Y_I2$`%AXZiKJ=}>ORs)uHe|w8I zB&I5TU)27A{sk&C-N%}$h4Ajo)dpt`q{~QNoZ{HD*YKP=D}NnOkcPAcoup$lM1D#?Z{W# z{->n$WC+$HP3i3)QGq5_5PELsl^=omvv&hfJ1O*lG60;tmNb;i&5Gkcw~BZzYPa<1 z@_^Xq2BK}iw9?0Ei`V=z@iEVJL^bDf@DpzvxO1aO1r+YadTUltM&t${{jjAry-!ut%qj2u!1B? z7YpL+PF>jkdD_k$td!+a|KeN1--qx$ogHAhT6o1-z%L{Qg1ciFlf&~$TLKt=g~C%o zE_Xp@^as3GR~?>lEeLPX9YF`;3cSGA5 z?HUmo@rI$NF>3Zm-TEtC+Q<_j3EY3W2_5ijTpcdmmN}3CKj&%(oi34``J0K)$uo~} zglXf6-xrW<>&6)MfE9#6GeBOsRc%wc$!^Z?p9KL+mUBASPRx|x1PTYhP3+W~VEG@-0+ z{aH9Mz29q{oafa?r7Jx*WQPisz3Fy$RALJ-V30w10 zrF$OpRUVqFX|=t*_7UefIk5Z~?X(%5!O55FW+~c@sY7D}!J+OqDfin`>mXtd>+%oK z?Jo=h4bbObE*)!&p1mniaINci=YkTQcH&>zcH!x)d$si za9;V0LV7rQ3)xw6AC1GY&pe_gaBk(n=To--&>|^>_w^}qrRs~qgGM*6qJowJaPF1V z%x@Q^CdnCh5ex8=Ajgq{7&$`zgs&(wq5q z1wo1>dDGgR#QeJ_EGj6t79OVe`1S`bFY5ta@tJ3`u}732dctnqzb7ad=fT~AkZ0!- zSB^D*m~0ir-p6!T34in1&~a>Re76fKLToR*ai0+}IG}-rj%2?(r8soA7rUIL)m|#nu!3cCV#gb+;fD)Pya4)on(lC0}HY&>A5| z*W!5wH(JTV3O;;N<#$z1Nlbq`@)%Ay5#GKCh!~E!jDj|RBWMsadg+)JB{v}ntvQL^n!*&0+B;K3t*52p;M&tu@rV>( zj?>&cO4q0ywaL^M@XE%F2D*>A)k2q?eThBL;TfY#@qf>lfAvZIz#}W~)F#7!%h~9L z@9QSK39J-TgVoTixf(l}k{l9Xn)oNSzC57Yw}w83Hk}vstRd)L0jeO8Rp)AO{A7yNwA1F^${c^zs+N z!p%No(4W}Q_eg27|3VA4dst1H#V=!TFXlY59SK>^8s5k;Zx4Ha3RfQ5p6Nh!gv4b= zGARy;tlM$@Vp`%$@0I32-y0tqI@`h>4;XHWd6O?VtZ@w~?0u z%Yn%(JOwIq5g8LLDo+4fh#90}B$u}^>}X*FT)RRkKN;of6wTpRawcxA3W0u14FP_C5+BtxMgCp26hPht?#&)5%5w*zf8#ihr`7yN3Z*dITM7`Y)HFT-Cq;(pG`kf_yvLlar}sp50k_4$yjN}4?80&Ro{H-Qj6Mn5#Z0X?QmFXjh5f)SU3%dzRv`H9`_01OtaXQ{ z*~{?+kM5C%Nb1P|j;P>Nw15w)^6)%y=cl@jv`Zx#lX)Xk3f1-b<#VB*l!SaSk+FsG z>ru{n(8iuEWTh*eQ>WhBtK#^I!i2?yxKJLI4OYl27;J0I{4|rU6=xgsvxvbdRvOb9 zq+uxdue&)auJL`uz5dmFe_qjWw6TA=S-=CVz0>DBa!IlETzt5~t!~v4%qJLS@-InV ztP8-x!4Bt6S{+eL>du$P<0kN#Dnv{syQT#=CbRnG-3^`#P!-`?tZ|vu0Ar2kA%{)5 zzHBQms>9ny0ql9R!-7%s5FVFlQ?!0LTkoCtYiMYw4S_4B?oVe7oRb4y$Ipc2S)+7v z9LbCU`ZH~?hb++5pr@kt?6#~l4iV^!S&R?4WPBh@jSPzs1DB9v^UVQE=@ih$#oXUJ zm#3t%NXgi}h=914E#yIICFeV&CP zLtMazGF`R0KzcuVE-it-IsvK)6`K^LnXsrftsX?;B!T8qL%FNnnO(je=UHy+ z%e-G8RpJeH0@HdOm{2tRSP(h7^_L>Xa786}L|Ecg2-&MCLJ6rbN$e~Ze&#&vChduv z(ZQ5IC?Jm9p_A{(2dZ2_B6cT6#y zh;->x1&1`q%Stn#WeErf30H`=WJa=74Y;-QCo)9lJeF#^<2cb`FJ?O;TdRMgon794 zY%Ka5NVG%TadXN2HKe&jWa(=46&k>>iCG=alNA=w{Z;F?oC6+>zn#K7#^GOk&Tq6p zLhj0k`@LGh=tVHx2~ULUM#OY^@)>$zh?E)%FL>GI`mL&uy7KJg2lp^A&izQDK_F6J zE0iHon{^;Eq1*FT92&;GEK+t`OjIZ1i{SmiV#1eQR=TR26HAiZIt>I$URdfJWai7O z@K>x0@NMGfM+LHaa46~=m?-#1U%+s*%D2AjylyccogT>U(8!R`zmM`>-;)`ELu3*6 zG~S0%LrT;t?lUvD@-ii01nZ`^+u+vu6O;H$qLk1B@2;jIF_Dm-qfwl5ct`RDwZvm% zy96m?FlPh0^z`&ot({^TKM9VB`gZbiw(#A)joT4pnPS5q2TA^6){AJ^I$l>%U^3C% z!FXwK|FJfFc<`jK}7jrKZtaCDtE9v|f;6U5^(O2a#+KI%_=s+)XrD@It$P&x~cMMB6pY3@f# z1o#K~H1ADG=BKGEQs>>5@2cvUb2;mjQ>kGi{Kx8G5d-mzQvr6o_iu{HD@yyG8Us(OubKb94vy*tBc+;PHUTKgM_`nU0=DbQ zzOmXF`)Hua&XigLd#|s#+28Mch5Dy@t7t@`Br#u6UB^=;eZv>A4IPzDP0|AP6%`fc zH(RiyiI~-~n&z8JRuz{y-%LHYr(4WiT~iZNgpoeF8=Z8e4Uv}QxB2F*u#R`ZupTj? z&luU^m2<(-5A!QZ&WqBoC1iHV^14Z#Cid=bB>dv9C-@Fa_HJ*(pGJ{%zuCSZ6{!+| z%=ys1haqnOka4hr|85|`0VxdydiI+#{3`3klBD+Bb>)KH5(%NidN+^hrb7i~PHebXW868v<$@83y=0dGsmEO^bq}bUUbgt}p)Kd-ejLesB z#Aj!ZW)3eXFky$B*rJ`-9C z=HDoaI`Hc{Xbg-y*;%T(viNkLk}1RhT~_F|h>(utF5F#eyO z_mAA^V*ZEF%z9jY{8WvkiZ~QxMmb$UCETJtVZV+Gla%}p@Wl>5o2?|!_g1JW_(M;i zHSiA4$ev>)WU?WU1U1dwun+O9B|GJCmN7V%N7}8F^;1Y z^e?cDAiu8V6mvk*^kIPorXhAlM5b;)=_#;VvhweKP&Q+;59|vv1}5S#8#eL>8c~4& zha*we(_KWi_v!Dez%G+IkC;5I+}Jp4T@Uye~A|(2MW3F3@*RC}%*-!@IL&jmn5RgkM{m_lNLz}1f>rymK8#lFbn!ZDy%}{^kyrR7+ zLMd{!9)N0}L}9jG{17)Hwa+`4{(rkKCF!e*Zjw`>MYY z07l+uz-vx7o@Ow-vH3NRN;Rwy<;1oxmLmk6WxPtaO`)!`=JCek6Z>%f{jzak2O~yR zjb|J&+U{pCFbN#EBsb3H#i>^CvmkofkU1Bn2+6(z+K`QL#JtFB0YsRRFFwcFtYXhC z-}1FfLA==CEo2?f|LdIDI?PEh)renYY85q?)XD3-^1npldPgu3g|^)Na*AvRGxr8$Y$2k~ zzrj3W8+W+CU59RkFE;2V{k?uDMsGbQ2ALl0v?L#4Coyy)N3Xz(QPXHwDZvHfs3Gs1 z_9$l`)@i8u^sH^8`-=()?^2HK*k|v&QK`%W@6*uxjZ=*hxdGoP#?Ls_))hV_Wnq|J z8ABG>Al-k$YDkImI&e(`1O)nLY`<}&5d&S9{U(kHJbJVH_8;qk;zUj}z@Rl_(x53y z9^Wd+k_#pGug?1XkV%1^iz^h<(mbW5rEQ^ybq-^sqI7obx2~>2YKxqTwL8x$XhI8XlIT=5a}xqF1exoRNJ&Gt*fJ-73Bk8D>j zaSU#Onx-)OFb4%QFDK}jT-NKSZLTiDAM%9bY2d(S<}2kYKP-z6MrpiO%joV7U0&W) zc_?1ivcn0JdIz}v9t?dtLHvr`lwD}m;McgZ_u;hd=xZ--CBWq$yK7Sbn~*|of8^fC zY)Hge>lL_p{R9E^{~dNJ5I-+>+b@2FauPM{eFwuIihpSkUA^yg2%nNwpGb*bRiStK z&g*bKK-$G}Nv#me)0+M^k%8FX{jd4Q{K4v<7Cc;t$8%Or4Zu93e`TWy0t56mE?Htu z{i5K;3w_?x%iz3;p3DAlfUIc^{qlYqI_u4+(3GnPW!kp_$5ho-QJw-0t*gW;sNG*X z;+0&i!Wu_HHv?=C-|j>f-{F2z%%Ms@oZ^GBIyfItr;z3t!%AI%#yh-b8rY8XCojDO zTMdqPqP8Gtod~1oa*vVgb*cVcR|Y+k=4GS1Y{JaW{h1-QFL35``CXLW|6WI zeU(YlW}%cal=gPm3;0i}a_G#PnZ=g#*mqbk*+B8ZEd;h5BtU0Yp=k; zL7pqUbF5~}PeNU{#zM(p82je0^TRdV^Uh0`wf^pI09v67tPgW`+xK2=4EruOe4D(3 z@fd9`Z!8eYLSm6iADKcT;Saj}93Ag@dPY)bB8G=k43p2;;!U?FoT#4H@;v0$SWZFE ziS(z{xotig7ClerH_b>k@F81&(uz8tZ7j!y%@HSRzQr{;#DX24LRc_nvE#8<8JDVg z7sJKf3EgJ2oV$kw&n%vfeO_RBnNtLP^=a`rT-#eDW3-_U9*tg^Q>E>*UQN1q7b9zdd&9k&K z?OQlqW@UF=cjiLnx{T2UTDdaAW>#}w2!N->Jt{lvdDY9bv99-p$tRCiCZJb4=w~~3 z6G_XdcPiQF!9NdKH!c#q+ z+5a@So7W}#Za8564}T7OSWNgA)mHl~P>ohM%V4OkJKpH$@|~CX_dm2S9&!Wr%ZG@r zur-qt9D*A}S%=j9!;>yn?Jl}+MUA?uFxt8a#Q<4DL=WgI)%;#efY{B~?+JoE(+1GY zQs~#)BAftCs~Y8-rBCH=-zuJbjD8ZMYSM>5a{odM_kIa)zZbj?PLW3 zZ4~Sx)Qce+F3u**JUsmg^?*m38OBFyF+>C`L+hfLyz|9ftgpyQ@7O4)sqrkgLB++R z%y8Yx-SJX^|6tej!?9IFD zCIYivLKw)Ql~2R?{Bx5*CBhdi869i&VFl9nt@r5x@oQ_#dk+muL&hNb>P)^!@;eef z(b@$D@+=E1%k=Zg-GUk(=~3rbEK?OO^aX~sv8%l)s&SM{UE>4cc%*lvzxBjtvC7-} z&J-_Lxef4KTQ?OCusM1RPoeqTzK$U$d62M>?~RM~TF}czJ#Vu%hrVim_?Lb##UYC( zIQDpB7Ug7D#EJHGakvuPR&<|CRzit#Ak*Vr-$=AZl@_T3dlCPqylax+H|gtA+O=NO ztMA{?_J0>uS}0TCObK@GmfghIJ-~oFjby-9YEq-w%{{*>c~kV%em)2^+jV#Z%=BDng4f7BWS|K zFmgnED+uH6YMc67vpbe_N??4Eas;x~MIsgqt(ZZKYe5O>kMZ0Rld^O9_kbR#2zKQS zOoBK`7tb!n**A0;*w{N-A{>QEImtiL-c43QDH|McsEPKYb$@ZRz>{TC?+4Gqd$LjBvuA0L#&U9MW7&nbaV z>(EG4p~f1S{KrGV`@j>v^h=B@yUD!w(B9W4%=b>8mQ_lRlbUO3HeYv?RU2P7{sw$g zO99y-uy_-;E8X+yZrkL9nbrWfC#Mc>3H$Pt5G!zAXKxgdT_s$fYHwnIonm>3AqDg? zCE2p_foCHrZ#Z{#8T_%gW%{kogk#|@OW$O=xK?h#M@OY5 zF2k>6-);ox0(;Gj#njteMOd(H?cJ`mMjxqx#_S^M$oZrz8I>t~5+=*{{;~`cRi13l zSl5_fzpo0+7rW-nxOA_pF|Cy#=4LTF9DU0NRd5fphzPSPm%93*$7OC*h~9w}`V-fw z4arLW=8q8c@bfh$C3JK({F3$WBB*f~3$GZAVJUtx2YQO1^I!G1@tn7{VEy01{D;dm zfA}72Z_3>ad)hhVa{D>{OQRM@HJrKR8^uw-12lznY zu%;>mg+doU&9GOJf|1dbrKD^H+RD~v?FbLv%8(EO{{E`w+Rx4_Kb?>L>78@Ig(5V9 z`ms`6Y)Yr$iW;}MDf45x8}DMl;P4``p%5I;j%716>I&OT0nu>PHEdV+g&O8TLL9Z6 zg8m|#FYSiJfN^vqN`Sh`QkM$>}kYW17>2OmWhpA z%6{>e&EQEnPP00L5!&yoX27n+u`G;*f?-qQnPW~t`(aZ>0)$WlvU~wP;$nrRvOiZl z)A^r24#1CTWxL7g{2@FyT?_}PIu(y{`H~sW zRpvQ;dukw)vE&yukMZZUT6c}15%wEVp`Y7(sDDU1#_|~d#8BGaXHQ*sF3KMT9O9@D z?A^kWPV*|?D96I}D>M`v!;AvtGXo5H>rL+`H=4ivv|wT=T-@JNdLwr5ZyxG zJWf`#6WX{sVMC=u=6S6P73`j*K^HC%RNa?kjil6mGmBf@jrb1dxZTw6(b}SHVWkkF z|LelVK+|?Q^8%s_#r(9X2QOW}q8JNr6o0r+@t{jWpAEO7<@Lk|NmJel%9D@OAZfLH zk*ERmnNK>@1IYZAO{jxDa@hzX+vR<2h_f$(GZzZ!xEe6~aJW(CJnBpUu#!q=^W4b+ z;AmYbv^E96K%*8>a+5TOiS0dk>)ngjj@wuIh3$=S$ZFIfF%ox_!iw1TpTg6G4Dt99dT@U) zxNp%A(Qp;Ng#3W}ky;#kJO5Q`n~Nqm?0$R$XQjK!%8-QKgGG@CvdhGTBWw&hF1DxT|cevivJ>R`rvHbBu_!POiqr z)6i3_19|(YN_gUy-}X-Hvfues<1HN6S7M$x_49ktK0ns;;A_>p7>oZwWME8yj{T>N zTc^j7M}F=_nI|SxBUY^{MHLFLYCofs8WNkvxvUrUs;>~9m(NOAi|i0w=O^DV9b6>4 zuP1mY13Tl>U@dm_UF3aKknQ1WUu*iP+n+fnmuTg!ow<5m%JbK+dy_+_l`JYP#j+4( z)1?hjEcT)&jTTXAiywz$AcC{?vw_nt)>@*TXI{UUr&&ha6~QqqcS;5q7)W=h*E_q1 zI$~3@?|YtCg&REgR>PSned*$r(M7*aIG==Zw8duD-b$o?VpF6-pp{m6*e@|UxYE2} zOM-_5yN~$njbY0MBs3nzhq_9PU%{K%y$Qz`5Sdb=%PzOEd2D_cF4B9_kNj3Rm$KYb zpa8e+w$KOW8A;?5?C-}RayK)h&1V&tL7Ix9$mhv!!j{| z)%5f)fe^Ga5irrS-%*%~^Gn%x(B|FAW*c)M9@+7ucMlTBrmav&?CKj>ip!PGJ9!NG zdNw!r8SkPic4kQCCoK`TzSAOW9a%bWok>Z$k@;h)n&JZTJitmi9 z7oqf`PEhB<#|AYeEVS=gy%$)d6{Jx5N0HH*E$R+cHR1b zvBQecP%@J-vG2J9eyfbIbSp8GWKUa-XARa^ds4_$h5Rx)%9z?)#l-e`=fEz zn-1vdj0mQglbBx8eWc?CMhSPgOy2GsT;ipq)uic$p)h`wU!Br8G*Q<8v~9+mc#;VC z3!6>pE&4O!A~m(F9&_dn5UY+DJ1Z~8!n*Y;7poae7cI5KqEGE|f#TM8hmcmQAO3{R zL}H+)wU5J})8OAOh*)S#=L4}&%D;puMT8=I=lIDw`0(Z%(`-`LL<=Jpo-A>C#K9Y* z6yMv}fm88rZgTcRp;BniTfmbIu-tY?SdX!YRIJ6m+#|vQ&OA=-HsXsXPes{c_)|*W zl|=5-B3cj&y2w;|PlQ0uLX?1?;OsS zkFx*H$L>+bf6T-eeWp`n{B36HvrIq^W;l_de=Y(;{dLrx=m^-K(d!*gzBI-p_ajY4 zVA~5Ghie$isILk%J#=??KR7vQZ_a;Ws2e2;B|}9knUMicR?$uu574iE#!KS8u( z=9|5#pj#>Jy9rh;CP5l=K5^#8p7O}W*#i*-QX_w|VEV0^b|NGeJH=&Iz4L?1ir@J( z6om`0V>4L(i2nLrup2F{esW)6&;4abt=R6&ociZ?#E@u-e>2>$fUUK-9~y*mL&N;( zq4;>9v)5!;WGz(|d&VZT0HM@nH)g822{9T^2K)7kz}56QGbJr&+aWp`D0ko>@O9@{ zl?x`Npphs86En;tUXX6eUEv*ll~VcSMf=r+G)}s)VTNh455EMzDcTI%qrpE3zXfY- zS*pJ4LntXh^aDWJlINxEd<4cTMg?LPV`Qf-KXesg%l;CdeiC*n(H9tVIASwPouejX zabpuSf>Oztjqbdqxh1gz*g-wgbOtd zSENm?5*VklWzY`{rl2Kn&O;UCs#l>=bF*YptuF55YsR;M3)1cT{b*^7o0S`YF$Az@ zxJe;?s#C6@KZ^D)3HTn0cKCrf7Y%;?KCw%(-nC@Vcu13w`)S5F+DVNrMAY|150l6V zLVZI9gQq#W%<-#EmfTF#Q330q&Rv87{gcUQ){T9)jtT;=Iw2~=lWXg~u>m_?d_BN- zy=2|E@gRb|5VTbD907jSgLy_Z!>UM^TloX}mX&|TjwY~A-bw1c{GX{?s*jmWPVw_K za09ty=_Alb9wXaQ(zzbrUrc>kBruG;9WM2!Xk$k2o$p43M2X0;>YlCZix+Nl>7urNo3}QnAF-AxoCz1f)hX#Xls}BJTZ`-6qW##1A+KrjW zws7nD7=A$K0?$tJtC0UwsMP`MY1=sFORQ0vl|6gdLBq0%R7BW#|~G0UTCqN^Kc8-yV()Os;G^Rvs^I6yn+`HJ!JC!rkq;E#@{A}d&tDbG2; zlF?rnEW7CDtMOzAOj$=iZVKh{h72{aTuoxnlY%}Q1y^V__;{*uZ&i1F+=9C=T&xKj zq7BJ`ba@~|^(nFM?D4!<&38W{m!D`c$S>ov*>2ZU@Mxy1 zc@!c|=|Z~3-BvX1GN}aN@4$F0?bGPE-}w+tnz*#lLLIlh*vwaxMyCw+6AI_o?jO-utYsKo=HvDK5P-_y#P+ouh5&yJ-;KH9dmq!79#q;`mPIR@0^YZ2*ttH*bFJCoE_&AUr+NO+3gdwi{>AlltCT^7uJ4}Z%YPN^Fu+uLsJDVn$d=3;8gn$D)rxWS zG|tdneC}_o%NoT2T<-2+Vb`ZWWq<6t`KZ=<@T)99a3lRm%nSZh%I1XYDY(EJx1y^Y z(FyaW>O9BUQ(DYy*eLlWPxl(DhhQ?tw2ji41!tVg@y6 zGPLyab}KvfK~yvr2LDcl-@`tevTJYfyG*OhebLiVoxr&S5w5Dnm}cXsWh@Vrk;j(S z(N$OW1C=?t8H@-&VY^`ltN<2}IYuOjq~U+}@!{qAUN#(6>~nFH@?y4@$sMD!V1)BH zO7sKZ?EkU#=J8Oy|NsA)LCC&jN!dvyYeHctveUlVNmO>SGh@jTWi30Er6MBxIzsj> z6tawc-?6>Sd(o-K(R4ej-%GFlX&DDyN#wpey-D{#`exoG_qp2u^HvB9N)Q z2dKcX64{dvjgK&Bmk6i9lis9FaY$7V5LiBb`trvo2HZQ|l{IHS?3<*=ENIHelTZt? z$D%hpuqiipQ2vT4a%Lu1tuI|<|M9x>J3iex^vXOjbJA&IU-o(TYl=w<0ye+)?pW|k zQTpW<D75RCMgnl+^IGiVAq#^qx!PCijw@Sg#ive*Q?%s&QnWLFT77dS@)@oX*b zG$g_el@)izP(pi2Pf+`7^_%MublUqW(y+{7obqIR-xcz;oiq_Um=8HHa6VIuf<|dC z+is*I^h-59z70Wz7&HCQ=~AYB_hL`+5DU{=Uq65B)+!FYA; zWW6I(J6D3^oq-iiUYPH|zl)XBLX~@wnAbaB7~L1s@8muhlJlFTqn0IHwIm5D(#L-! zq*=1Ac3mF(0u&hIK6_i5mj}WXKmk}}S&a&Me)RPvgSG9;ecf~T-gxqFYMhb>MxHJ+ zNv%p{E#y((#7*&8JkUC49a@0)twldQzdq<}?r(dL^hPdH^^k1{ctPQui=rDdz-YHQ zk!w&FAjW_OKe6aloQz2>(a0y836UthteQny)u+pF z=8?n?N)g=NZ>ClJ$Ymk%58}uIhS0)rxJHGuupb3RzK#VlhQLx=Ggvw;fuYto@{t`1 zGN&teQzd5e-_}E}5EOejS3q;@nKy}NjezQ!g%c<+40Ple3V}O*x6*(4zJj{fVm)uX zY|CC=$I|ex7)5J(2t|E@i67Zq#4^sMge~dKPTYeuj_Z}ql!ZJ*GyIyj2aik{x;Lj@ zdY7UQVmzgQ7^A=>Lvvw<5I?PHffDCf5%-<~M3?{O-^ws>n}F{PArx905BpcH|8@#e zX7gqm!WBKf*{~<@1}9g-v${TFLyx)Sw$feWL!??XGdddtiF)5*-%SPh8K38q1Y6tX zmZqkNsw(g1p`l}ShCzkpCI@?Ta~-l_ zKC3e`7uGqiK;G?Twc?U15eKL*jF<^q@o4mNJ}L(Nwv|T`RvubNQbm7~sSoKrGF;OQAq7Y->}KsYwt`J2K(ZS zqB>aKJ$i3k5i+#eS1oXvtie{;PMxXWp4OYIHt&FpX|dhMU_-9Gx7K>aFM!xmnubg- zJBq0eIQRYgci5Y-vGc*C>Ja_|U+RIyk+rYuYZ^3n=Z2hrpn<_MCFI>wWg+|nsjRC6 zQ^4P5QK?<<&L3n&?cMPXm>)7skW6&(&ViS;uvjYSZXCt6U!4PS2LJ9hZcvy4Ww3A# zWHXSDSY1C!y{U>0m$n%k9IQJ)llBR}K-IIs;f{v?-Ou+5h8U$DtiSY);7+d1a^rc> zAVeyWwNXu4{KXPViayGoB}e~kptp$Ar>Ej2Bcf#BQphlZW&hMsrm>f@FBGKM5Rrua z%`Oy=sTp(CnBh(UvxgJv>?-aaBr>pY`1Nb#qs`N=BGzRC>ym&_^&Y&SHm9VxP{ z{B_!E48SV&UUm5 zl``=AJ_io~2Mm~ThYx@ca;s0g?&&audJY*Tu4p7a^WExj5kguUu>*rKPR8wh)`wP^GsXKe(5d z%m}@S{Ze}$4hwBSGa@eFm%bl$MKV(+vLf7ZBNeX87t=vA?vhrVSW4q2&)NH5r@n)J zbZYC*H!1;6;sL?Y=s!>F8sz?5^6QEXqfep3V~OX+i_dN{`ugSV7VALGtB0?Nr}c2z z`V)(dwC@fv79`z=n`!ofjqbv!Wiagu1gWOTSHR9hq7-pJH|krZ0PqBm|ql%R`%Li&K&XD>E0TYRxOt)N43J^_}=b=`!&?L_dfB@COkeU2&jL| zAVkeej+v_Bz3O(BPYd|9FMBD9-ts!fd&_z7l4{I2bGDK_SDqdZYo^vB=a-8klJ}ow z|2*-tB}@DEDK6VIE7kMEslHCk%4|^MS7=Nvaq+q+q?!*g z3VI=^4CRk&{vPTT)j`TNt1{OnMBM&xJnf<6*v;((`b$6Ot7WalXiajf&p#S06h_1{ zwaj80P`mr3Gn?qdE_7-PwDRJmS-RTX_V{fv3+H6cW4wz1jU&?wgnPi(xzP6Gf9LwFepvhe8924A~$?A3E z3#Yz`xWxpj$w&_=qJR(+-w^8fMb#D!HJ0vcGb@*j7XTlE<}>Bz`aj>vxIHmXvg;Oh zGtLDD&Ov8gKsNgTMAM}zhy|u@Y z_{(_}=(F@v7Lq@F^{o$9Z#hWqB|V3_Uo#nfS0L2QzmpEIq{DBWY#c@}wE-XgM;umzRb3CiwiR^j!hRdY!~+%CSq?u9^L|8TkXrQRW@b(NM(V7cwq;(hmOsGHgDEByfatsv+jRErom8{9`Mxu^@g*WAB*qwT zz%pvrC9j2R1tQ@)=L~ww99O31WsIjdI4;=8wbFdmSZj0xPF&a6{;Sj~pRGJ}u-iL0 z#wnhUv6l!8pEy-5D^d|ZN?$;cY2XN}O!AxZZtk;R>R||!5M+7C;~=fYD6+Ge#Hj4J z9&?)Sbb`0fsj>D=`JMIKe?M8ucqGu{c6V(jozKXtuDn6{%GPc)@3~BKq#upTQ6WKn z;iiK0=QJ+WS=-mSM%Eg8c}atBj-UVBMUZ-dzF&!7ki5eVYA>cIXrNJsh+8S~9vPl; zF$=1~{e?UybBZT^tp6U0cR^<<*`w8+&+!L`e~^;beyYFoN_u{%W7it;LWF~!lI*K8 z>30m7JW|3xo_F~q>{3b~DeO|I0)|imOj9O2M4l%OMAWMh_@vVW+_l{Za1ftQ|Ed{t zXaA2V2~@}r>kel21L;+`sz^(BL=}GFDeCU0+jO!UL9;v0Q{f43(%nr0njTpz7bI)J zFOVG79N%&8+d$*4&g^IVSPMx2Tz+70O=vH$_80vFg9n2Y? z3(j0|@vXS|ib}%kMEy%Uv5lZ1lpSds$TjBLQmOWaU_?Xa!PYuV_viHRqL}5<@bhz? zNq6RKbpks)hpM-|9Dl8LjGAKq0TqJgC0Hn9gdW!qMQ>?%GM5^t_brq@B7*J>1);0C zSy?Clp88b_%?c;O=toyIdftHEyllPwwBS6Yo?fI)6qNrkH06E|2a9y4`HceK1FFLN z+lbf^gOc`F&fK)0TK#K#RWWX(r-gjgX-kDJRbEdfxF$0qlamcUdTg>WB5Gc%K?6@* zm({|qwv;G+IZ$s#Dtq)!p}tn|++KF462!G4G1G^%JkVYc8TBPD)3$sJPdn{~Hm&(l zdgW`bve7?%YH>Pc(%3g5Ony_J_I;bsE!cvI^4PQ&d_B1grPv zI@Y|j?e`^u+0Gg0oUC}}eFlMi_hh7i?%B$q8XKGHzKeG1p>Q9~hjL91>gCNt8-I3} z^tVDT6(%0uD|($bDcmQrms+O=!!(P~Gf_|8>10nzNBm4)pHr=#&c4~<`cc1B>9bNV zA$n%z%#F0KW|v2=mCc|oj=b(%U3oG_VXAHNp(3DL+H7_g?vh6gTh)k??@9{i-&K|~ zCvDroK~p&KQv{r))xk1~P9!tLf(zD*t*4IdTeOoIg1~Q&q2dcxK`=xQHY-QRM6S_u<f%USY01kO$u z-z*xR!gd--xNez87UqTLl8QCb_VsHHB5bcF=KsD&_B2$cpyXoJsEn?A_09cdi)YuS zi@g_7+V)RBj=G8;7$-N3{#E$%0`z1%f;`cv{3b9z1zRRun+!Tg71UJ%z4S$mXptQX zAlGr3W6QSbHrMS}S6~0hu-xgZY^`{B+IqWJI=}-;V(o-$ zisLd0*{C4~9#@LT=oz_PpiN5Z_$V&GUuVR5Ax)aMlC$2v;^uN=qh;t**pb1qVHZ$MS43T7~4da~%hNK`IwsxTLa{76F+Oz@CgZ zO%h(pgKG!A!;}G5rgT@NY7x?*2ueE6Go6?0V1aaVs_FA*op#$daS`Ag1LiS@oP?vX zj?U7TOKz(fiahY(?fX~ZcVyNhLEA1Dmy2pkQZ891$8l-IsIC7fKHitrDwBO}BVjQ9+drqYFC+DBkUVb{KB^uCtR6H^`0R^4mB{bn_BTg;XV#!FVts3 zAAQR%TA@yK4w!u`{yWcdY2x0#zRY}e#M7ROCf$Y+KeENcrPh#h$|fh5wB{=-!O=1f zby6icQlHV2k!at!`-4E1N^5`pq_Uedb3+;veJPr3WA$4eY@rcnrv95IKn;&>KZhe( z=>CPMFqc@$InqOw-xs!OLT$Vl@tA53D##VM(V$tUPRB1b8w>ikpWMl8%%!b@jJpZw zfG*e&bhlZdC0cS!!3nF?Z?Y@jK!>4L(3>07j?Xe9^z1fISN`Pb5Byc}_QAw^OMOhT z1f89R&(l z>XER=6%E-!21f~jMps=d)_uj@71TbzJKDqVTdCJRGN$J@5Q zJqDP$Kzuy|O4%lI*_>Y?@zA7F0mOJQH~iFuPPYN=-CV!;51ZxP-VelhAr{^@DVMsU zo9?CF#z`@~bzQFDmp2DI)Sp5)-=qgloZnOef+9bBkkywD+S}n#US$*WUd>6ADV?df z(0^OjaK~fWBodZA6JK?(+Up|UeBjIkjgc4(&K(Nwro_j27|mnX(I0>4qPh`2mK1N!x%xZU$kd9L zi`PGW&HS{+^_<%Bp$83Gg_9&J^|(iHZz4?GdUj>R<;-@hyK#k!)j|l<2cuj8@RHO9 z)c;hs%yM;_B*&0`w~a8Key*Dv6OCB|m zH-qXcGMHQ6c|?lJXu@z=Un_zZ{Ly6eA{fr@7eIdsnh zG20ingH?gQ*7?VFT>}5ofWUUKl^QDU7Z!dhRuQPAwK%^$<{;AqfQn6oebm(Em&r|7 zG3^ko7QDMZIYc@_Tt3T|=l;1lNo_1uJZ6vGmE;CsiygB#u%ow6xSkjPPnKMy3#jfl? zR>9O0%PstjS(Uq#;4rUl2=^B*&;6n`@GNo(=RIh~M;M_0(v6~a8S>yCFTelCd;e#4 z13v>W+lbnjEJuA#LW#!CuHPWUI)P^FUjx3vZHR+U(_}2f;fUu&x0MqnE8OErvvz@Q z&=cZ^41(*nShV z;$5byLcAwEYF^T+&%Y_hR6=9*96MDrE*ruYx;UilpH?wfI5dB2wgj2!8)bI zG3j$EL|Uxgvi%;F5h~BHya$NjV)1TAAtt6cvV>h8;&?ERIOjx?{nxG&ik|j45nWUD z0_wjH!pV#MzNrA&zvyMC!Xf%AgRBqL`&leHbBdISBhqT1{d_6(KRI(g;%}hWuPLvG-rmn|$d>Np<%~?cigma(VxV3=;#;uzxJ5q;a(zMV6 z3-{Yo!pL0$;ie)z!hJEfH19or@6u|OKJ!z@gg2|JkrGF|ow@)fI|-*WVF(sS2kX>~AgyQ!+pVtiX3Pd^s{M zv^$jL(_oyKkF(=+Yvs+v3o=H?eA^)bdNZ@QQ+C6<+wFaQ?dRN9AElUTyqUn=JR%_^ z9zvAPYPdwq z7v9?N2&3#i4ydc6x=>W`NhKnbYMDH_8BypuR*Se^&@wujnpk3^x1z)?zQ6xrg8&D0 z9dZvTlM=-c?txt}c)v_G|3$#Y)=4+y4Y*T5B5`rmGA>6?&1jDg>?eSY@a+4n8oPJP zT6rz-9}~jw4E$I2TFz%h9p`?Q+`B<>w~cR3Df4=ci8%6n5DjW#H>zDr_djh}%_TaoTdmL;uo(g+t!BCoK}|t|mZm1( z#vYR)dsz(#IdN5=vLO%8A($J$j zfl-GHArG=vofkInBfGuTF(a`AxR90^SzgUB@+sS8E}Dfrf+*Py^n6c;7w>W2lL-k4fp{!@pg*j$GTvRPkGiC6)tUOP*GlhZ zHn;l)VI_CU_eB;vViT%~tjCX^@$HaF*ykt(a^4i~H7~tbYG!f+U#!FU9)tR;(Tg0M zuet54+!}31tA+|rH0JMbSa$fb$#z<=KY)sRAf6GWMDDqcczDoJDGF z4grbYg*7^>6#1H7W>a>rDp9qvYfXKhI`lq@zdA^xqR_B4<3$!R#|>#JI+W;EnzGFOVD+M4CkeHHxr9}*GW z6>9f=qjn1g*_amtvV!xHdkWsWjF4K_+n`qEN2CuAS4}jzWa-g8 zY4%s6?ya1*c(WOAHWQ)&vK;OS@1u5BMuL;CR#GtpwZ1+Rlgv`vg?`U_2t7_V`4%un zLfzB1=0l#J!p=G-4_7?-`J5`h+AJOW0vbqK|9xi|tF!-s?VQ$TTda?NxnBB*eZ^9GdU};Zc8NTJRASvc=&$+;7GfSXRm?n-_{A^SubaKkeivDW z)qW3?tqC5{_p34i2_a3OCnN#kkyI(4D%s@pS1EXBkprz$USXi0(2+g)44-||AoYhK zU2ETPqRPH#Fd48Wv=Ae|@mTI(YfF=i3?%`Rud+g6JjVV#z&6r0w%Wn*H`{$Y>UIv< zM&`O=2c=Qk@VUt)IINhHKF91&*OarQZ3P~PDS#Y;yI>0?82mQgO%qp={Tcy`j12$e zDkMQg77t)9omP*2ohkJIVjy|;+B>?c0q4%FMkghNuTC%RTix2c`Y8JjQQ|uKEE?>P2Dc4~s84=2RMn)s#6)r8* z_K_6OfYg_VE#VLGN8`ciDp=;}ff{+)?<&HL-lqok@K{NOpmmzSBs#62Ign z9H@SE_6$_ZR`R&yev;R=R_7%IDC;RDpZ{^|6ZV~x2MR2?jmAin#N{n?oD~3fz{)YD zu-s04P=u-DVv0Bc&Ea|*Ox^RD)6;i`hI6suZE^N!%CG+2vNxy5#aeUg*%(!|)WD!FG@p?@}sOKwnW%rX4-3Z4vhX2Y#@3<11lH(1eKQ&UkHo1Q| zntRk-95;VX;zIlN<_|miv-N+AhcPRl7krp(a*Z7G!7N?yT;uh}JsH&R#v4yQtOR7o zz@19L$2CHm-lCeDCj{qvJ)>Px&Qd>Yzz_9o+$nzxO|nn^xoK#}iPZV((|phy zY6yS?-mxnW=qy`)d7Ryczn-9;9i0A)ls>s_<%Fy`_j~gS-dU9N?i7Emlds;y2*u_VxSSellwc+61QQLGRD#*u5mRR%pnr-eeGZRPU<@Jc6Iqhi zBh2egial8-#wN5(@03`x3@!IJ$e;wnpoN43wDO^~T(!}6C24cfAgGUJl;WGZAu64j z_YWw$$$|D?8@hSY$%#ZbsjLgxcz)o0>FH~L10R@kR1oZy2LhHzU~}~sfYlrWIT%Gp zJKlAG_wmsUi4ca#eSaypzz8D?uUmcCG3_ zmd;YzuNG$hI!6bxvWD>pvLm$2LO&e1e&-o^HB_Y+y$AbjKgX2vhEd`w7N(e`l#_e< z>+_FzqIm@OP5b_j1)GynmU<>*zw_R^4!y+U z9unBj`J;Oz-lcK*zMR-=8M}k)7#m^Ob4zaD;8rESMOQ0Lj_B-?jHSSwJs>h< zgnZp9A2L&#d}QaV9l|v6RdQ$4C+$-^4VM%!6xwiLmM9zqykDI0 zQD$VZSp_h&y>*wInyX$cf4MI19VrV%c5U(d`ke|76pjdTO<8@VuS)5euu5hdgo7V!1P$tU+65+9xnPoc;*A)GF>pkv|Ki3j)7h40iHl z6UNmcwW%0px{w+s%n}?%xSM0fnW3g60guBQVI#`m26_ zGiIyl88~VF^y%5w)s9p}q9#2iN0hM&sN&GkvGP0l*^Tey+63E zrhYB6{_({MyZx(6TDwa3v>HxuKLrRVBbb7*Sx;ns*S&*$#VpiLDAG^{zw9rXIh=Vh zc`HSarY}AyeiTr{Mv>N3jGadweHGTcbodK;B}~v9{rXJ^Q^$4p7QeLyrtg*j4EB}t{=8uH4w@q ziW@h3Wq6g@rKOyNL^i}RIy3w52Q{ana|We7>nu$aoEMu4ez1!rTSYmuC&V*!v9;Tm zpw7(BZ9;~yaS43dj2?6ylxTTXVk9r@j{mp_+;-VZdt(lkZo&hTw?AA`bNE{QT%G_m z=Jkd_mz>X#(e461F0pLJrc^pRW;-IM$J6+SVc0ETSK{v|rV_@#%1|1*BDh7iPWjge zE$@?lizCb(z5OXG_%CAb5LDYi;B)2ysQ0=l91nm1m@U53>SWL_ap^Up36*exOI4vr zwBHtboPh0|#c4Fx7E&NFjvUIWmw)+3ee;$^y$LNoTc0ACYCkS8z-9WbnNq@S?IIsC z!)5678M21b{mU%9Q)NId%qfg-y8Z51-bc2VcRrO|O?Tn>BwVU~1Rd3_KfLzuNg8bZ z-9;x3e)_I*{}+5(+;Va@yGlFI0fhzzs_l}Cg-sX(e8oD`|Cxl){arONNPspvqkfmf zUvM@0jo!pj^0R`E2kkvh+P^v>DD<+0onYT@XY8waDp(>pw=oYWwf03ke$zTR?@T>_ zJ03EPwN1Ch4e`&MEd8B^C9bRw+G7ufvMz30+i$XMIfk*F53W9+g(X#7e6u(&Hm!yH zaV034p$oW;wB4EKHXbtIfi8HgD1|K7q^eFZ)TGdk#dfeH%yostk->un-ll0K{bSJ7 zfx*ML!F?L=w3FAm21alkr#SBmM-zn-MX2YNmleMaj7CN>b~&ARKQS}I7lT&5RXX=O z^Xx2@2%7xhu-zwqksPXZz8chw=`39!s@6&RToK~>#fN4NoNfD3^Im*)^jM2E0vKic zyvw)_2KGqSRJK*SQ`*>k=sH^OHp+kNzB+FDzgBWEi+Zo93l?eF3NZvMs4FE1Qg zKZs83XFiMEYtL!nCE3v!W~6BW#Q355xWxQ;D4W<0!)=#`Qp*hvX26}M2c~Ex_vbFk zu}V30atEWcU)M~EhTc_6c#CI~fz~Y{o@Lvoft-W^tX&T=c6Z&F@x7E8&!Vf&UU>aP z@w@w3geN1b5DI?rk5M03-sMKoIl{R^+=pDsKfZUBm~pA)@gKi^8NeqI^GCdk2NV`L zhY>Un9vLDzI@@bLweG!X;!YA@Cj=j41=6*VW6H{wWVmDEl`AEp04P{;ZK;)W=SpF} z`^*&Cy^Ed&jEEV!`#DM9Un8=f;ohb6ID!E?h{8?7ut3cqs@9P>`*Zx+mrozI_w|Yg zG}9j}!ZA;rr|b`Pr)2y4Xa9*{0cT@Vn`s4v*IzTmAzHvUH4A_G45i zUVGrfy&CfB@H+vt#%ZAM{RVj(5xE6&9S?43MRUJ;o#Er}04J@V_a7T$e8bM%uH(h& zv-M+apP4zY;1Z)GER)^O=mCvUW0HPk={l=oD(tJ)N0u93_M7Iu1|lY7Jc*Kj9QREx zMQx+{AooF7J8_-jXrwHfOTnFr?xd8?)Kk+{|F*`(`_7=rY!=&!rFd~KC(W4Jf_TYi%zm9 z?u#LlSSwW;8MRa@Lq>~(!dekQ{tJyym+D+^ml8|HQD^?g?@p^+(L`D&KyNFVj*;eE z-1>=>sCoiK-oX}N-Z6=2WYsV2E{%hS0*1)^HA7uvCq9ma5s7nM4 z)LOPzMEzC}y%H7*a|E&2{L!Lptd+e?$3Jk;Fphzq5cXI1*;CMh=gtdR-%BKy@Va?T z&T5)6w8UaS`YJWQVogS&-M6*;rI(0aIiA|^&oZgbfmHeJj~##US5CiI7+WH774>@A zTCyLU^e)7{Xv)1yd21j&v_!tMg>+-^?3iffMjE>Z(m%&|YV{PN*gm26A4oOuUj`IJ zU!i)FKLkJe7k5(kX4)dUj|I0gQDgCNgJEdfD}QqP#2^>1>fiIOKA3RuV}+Nz*2O7N zDx>CzxB6+Sc<04!(G2qK13u)f{xB%iP|7yBnv76jr3_M=VsGTX-Aj5s;j;Vb@ z42C2U3w&FS=ET6ywC`T$Nxk&KEc9G5D?fD!XpT-VI!AZiX2u%U^Fm$1cDseNdmM;^ zZl2j?ce@MypYJ=XFaEMs?LbGug9QAV?QSqw16q~kyhfm33vC?1pL>bC$UtwGE0nV zsrP2298DTjec8Rpz0X`G>)clSthwqOZb8tO7(_Le5_xEnZHjpQ*Hfs6mo<7;F=F$d zXT@fA)7pHd<<1H(>`h#ShTs88{H-5)uaz3eK-lNY7PK87B95@na}b;c*L#z6gJC#ZS0|c(=M?IS(CXl`8S#4kP38Q z*juhu`=9aVs|{?uGvSY8bOFQ)$^pB41_QiEey`r*xL@^|f71_u>-90F&7(h0T9gfu zC}W^y(R9SA+hEn|7{W&G6T!shh+_Lajs(kw~ z-lJP7%Fh=1u1s8wWeKFLt?5XTWsqirK9{5A$;Z+!*v|LXYC3V$N{`p8wav#wI_!lM z)`tvYE70eq#ns zIuO)h*T~9e4M-6LSNMuDfFWG{Pa+h+968N==FTiPy+rfWO!xD-81#Uk4e+(E&FQ%5 z*AJm5eH7&$bg6h*UXGN1Z{zKi3UJ}VY5g%>4y4izg8uZT=j*PV#4gm#&;ji%PlieA z>X9_GG(O4ui`!1bbdN8|@E60w!CzFa3z6BK$=6Xg@{X?EWvcbMu&@H)2$!$(J6siy zgxwoii(xNk@CmbH(L}~v@@WVq-w7r6<=weXr$R!J@4BJ|{<}Wb8t%!b?~aImKFn0q zA(^q*cvT4rs&L_Yde`tccN0U$TE8Yr5IDTvBlEY94oU@TWzHWe4S7%ummvjYw1`yC zOCYv=y8d8}>zK?+QfG=)r$rn*D1;j~IJo0dWZ?GuJ9XciwOn*-lKqQ4(i+HPLe)X| z&D@1i5}CD@%jdP@%6GN_(<2>O8|Ucgn3vUGI7*6RJ-7E-r^inuh$a1WI{B5ajB`VQ zl3J+X@#K4xpQhlw?Nkq3IzI#wpTl2osix`(Zs$B=Jc==CA>U;~SuFH@>YTBeF-Z0m z(yBUe=o3-DzRb@rm3aJujn2p8nAJno9J?Si*3a(^A4J6U_ShR8;0;o~E2Et^Id@7Q z`nD~@t5neM96t{gi6+7&Kh~tnkDh!e0LgZe&2J-AJ%v>O>Tn)%tQIKz77NA3#jz)*O zr?$1N;Zf{=yUA-kp+JoV)-blo%GC6s+X)e{_~xg;8}&1<&x*~hI8 z+L2zLfkXyRaS9=Z`B=OK`r&s+Rvo=?0Ek3*^ZVtEHzO6>j8o{kKq!!Qe`0=KUghvx zqpyv$4vG5+YjYuM8!m|FchF@Ql8qFu2sZKZ@d}Xi`D<8cqmAY)1Qz#5DGuGRDwO~NPKTzD-^f=Tf39%{QSY2&0OCXw99Ig>vaG0nE>(c zllZ1A=|_T{%KsRfVxN+7#9t*qrD$z(NV^JQTtX^mvcSX~lsnJta|n{Na&FN9bqEt9 zBD$>I*a@Fi8@ohDT00Wol0cZ;&fFEw_R-S)JB$io%Hp##xkVc2#(00<5jz`4O6CnFE^+x(t-Hn|z4WLE& z<~+7S;{g8&iP#kfrz|EY9IE?VGdI;XjwlG1<8@==^;5&h;g5tQv?7%^>MfpCUk^5k zJ*qGyd-0U!Tij*A#VhWZkP-HbQH#ur)v!&?V8joBL}{XU<39<0?eDZ!*$>I6t^1OO z#c{&|AgV?}g@iDxoOyw307sbLNxv7-Z}yXzAm#XHo52JpcV$rl`sUl@18j}_wSw+s zI+h6D1ZN8Obb6G90*<5}M()#Q#KwQ0r;d!VQk>lHdC6G<(Po7`UHv?6_rKTuW(-{i zc@k}wB$qICH2^d)eX-vr1AFYN(o5!pU!0l129fId|77eb*FdtfcXHXVB1~fU{Oq7x#t{$TGc^4 z=kK!J67p|3nJ`fz!Q_IUI_YSXkN8G9i#5%5+U?zxyNYI$+7eJu7F?>F!9wdqUOb4X z(*($hcP$Qyet(i%{(+JJ2fy-5IQ>~uJ`t^8gE^PgjHO-P){K#h8aHt|v41xdJB*8G zl)heKQFp>R{zP{;RpgqxSH=nENYL#RP)_s1y;dW4qo<6oliVv*4I=$qagNH5z@1ax zR|-+2fex?v%@`s5e}NI(PvxBLFp?3nN4^87oH@A5&Bm*;nu_Dq*ALqO7Kky_IV4!m zfOwEAPHg-Aczrs_jtMFzmCD$tR-R0;w%a&AzJanCpn6g-54FBIr)~I1x6t(4driX+ z{TqR3*#CelK=!2W-Mo8}qkzPN0oFp{Hc6P1(22L_KFnWku#%}p!+yN*352w;1`}j_ z3-lym5dwJ1lMU|uSFTw0*yxdiXwz;ZhLG?5Pbcoy9hoNnJ?}9eLMGLu1cR6l&)>V>?R4qQUlt2$V>>hw(`N*8Er)V z#|-3t;j^(KbLIv~jENTybUiX>?nhsA{sr?H^1ZdkBKALV-p+j>lLLZB)JH}}$heif zt$o}U*s<2_``aHn0bID}CPB0_&|Todh2I(xCJ` zFj-Y}TL5hMpsnA88Ub;qTF(QF5c^~B%B~-AcgYH-Y+aE&!6Q+0x2k@Nlc4ss_A|&- zv{Zo#z(fU^SAGt&{q?#&qZep#59=Z%|ML7AhIi<+_7NaZ=G#mNmQU`Tnaj*4S24CJ zNPkmhSO{ze?L2Fc%5R^U}d2(Ea!R4lsJbht&myC{2J zS(td3%N-^^Md0Rsx@2>0lp){Cp(u|mr26{>Tq^UXNNxldp8kDu+|X8BE>;5{*X?-% zHxX8`>p`L6hCklL7(3K!5qmK|T6%Z`(J&*R3OVjku|%qY3-vZ$P}9MN(Hd!$LJ3Rh z;*Fq`6FGa6@{Vic@gs|apUBS0VFnCrHap`vY;SnU0t1@93<$tWykPqzyc%$8A1sfJ zNx1FruD9?ui%aLLFCFu09M!x*4&_V^myb5DMT8T&RD&c-?tVEP-xixgluce&;^j5n zKTHQ%3)@}x9w2@hhBpB}99k3hOG5i0DO{XN&`)14R(ftf>Ec&=u^;ihnH*e~5?oh8 zGh=<9c?&&H0sSmz^6)zq;~upnj@EePby3CIiur>$f!>ND&qRGH9t{e~` zOwKQMrPQ)T@jX%&o!zTF5p)K8k zsZEozn&Yn*ri#_N`>h`zy~{%1<6Z#6dE>`1>AG)u1Rqju-ZfAOSd~`(-vm#}PQLF; z%e56``Tfao!CvXq7XxztwtHf!pr5V{Jk-Y|x94d3pTv%Mb>dGS8dumu?M5ne4a%J| zbNQkD-lQ8x7|~er0~1dKhT6`UaYwZKVR({hvMOWgdQdr%*7*pB|8p|-;fc0pfYE)j zJL0YYx_zLED4p=b1RRn~jhDN$breaygL?tAC>l8nn0!*uzwD)K`!Uma=~_k*YU8+R zFMfq(q~YgU<+?k#iMN$9bslYXJ(y;Tk5K$~gZdVXN{W6$_(UK_>4d{ebb_Cv`IiA{ zyk0cudtN&%zg!1v0EMn5QUvWaxHpTUe#;Nd+3CLWbjX-VYc5+@;&sz*I?S5?=CB0R zq3Q-w^iSVnCFNL6Zy8@kK-w{LEjZ(^q%L8|CL;U>@imc!vp>tlxzwe~(_D?Rz5q}Y zuKxG`u#z9LB@zKxUkrJI+<}Y!MtIq79Or-l{)Hl_y&R4SED@li1yOxt|H1PnzGntQZ` zKQBC*Tn4J&Ulkuyxk#>ZoK=Wb@RqVN6JrDU$^Ks>xBHEs zxxJLZe;9?mP_B$8;>{ec4f~`yuOuX_9xQZHI(KdkGglOIT)PGw*3Aj`xumt(ZXhts zkQOw*`JpRK34I2-cK$Z`TO?#pG*+R2z&{aVCaR>d;|GrB z8!b63N!pNuh|}7xI17fKl9IvOHv430@pienDI=Uyv4^<4rj363e!O7n1aaN)*o6y9 z@B`$%{jR6ipGLs%p{+F@#2o!G%tuI>0y@eUa1_#Ifk;B&mmY&YLTlAAhnIVJ*NAg5 z)%nb*z^aQO;bmog(iKQ~L;TE{quKShH$~0Qm5}-Yix0hpF3Wym{Q3F!JHx;3UFo^1 zFHZSUf^d%NirV#ywR%f?L{kb@ZU2(k*9sHVuFoN}0cyUV*_{Ggi<_@GhA;iy*1f6pX1q~Y}FHh{_E8fe>{%YN5KZvz-29G9Z zLNber`a4wfeBbgBv^A-3E~bxs8sxo7&e(!2E0df1q>V|5V%1n^#z{Z0Nq&-K zH@l|lb)DU`kWK5zU-``G^(6u`x}5W>%29)xRKdX`=E39$+J18OKVZl z4Rv+tCN@fyU!6*)Q%q+I(dJ*myDnb8)?Hf@9L5sC7AJJ)R1~b%7Rh5xD70xkt?ic&%(cn=C{~1 zIhl*>&EjtutGw^Pokhg{eC;LD6^&ssVl{hcbzIytXs=^ll%oQd1q}iHfQG_9pHNa~7of_YK4NABCzYFlhNdlk*I; zCIRN+mS6)efP;_3z&Qc;>SHBTk5iL8@DZUO^zI6CpFX48e#u495%#NUn2OzcRQ$GV zswlI7^EL5|*w>q{OdfV^z7(;y#>Mu9H*EP(#(Q1)|EPNFxG1|WYWSLA=$7sVl}>38 zP(VOLkWT3aX^9z>?vfTzk&u>>9J-{X8$lZBhMD)e-}`x==ljmzz;8Hn_Bng6z1G?+ zzyU=yB*_2R%E=N2G)Xt{CM6}2FfkD`$pwY@94xi3c7|I_l^W!I{tTtn77=n9cMd?8 z!I($l>e1RFB0}TNP67P1G*8@jejvYEV6-#E#)nMD9gc?wf^TZT z-16Jy^OCYT3Nrrc^wg(7C@+x64@B*yd@7Bl&GsHgz(nmMv{K&Yb|v|}dHlTf_=f7= zsEkVGhJvTw5>4^{Is1P(R$iN$-ls}&HG5r`A^BZJTMTBCP`2ONHkf~< zGu$pk{0{`hqzYEp{o^#(wM={2_f#xG5PNri_n`tAz_jba!srYqLK5FANq`Uq67~`D zthb=(q&*k|+k8A?GtAfR2Tke|p}D(##Pj?fKa!9~m?F0X((?i4nE1 z8&xBzKh$FUw^6XlgTJj+3?5Qq65Ju(NtphYeupgUa&F}^F}t6Lr1a`SIoLETlzdu{ zLrxR9c1=6`&XF(@%sjfrM%%w7Mf9#a!Y7nzi2EF>_qo=QpUbfF=_*$OYe-{JeJ$K3o68=? z=sua@C67I6OAG9uGbeXnPOcc}7^;QcN0!ui@Z}-z`%PC^fWtxP3b2d}xVi^Qcg$H? zI*yNz^ZtCUojymDT_7WY^;yvsbk?IoPBF^z=ji}VUEPY>`Ge%d22ah$pGpNoh^1PR z3tVPZrYd%~IZP*~HRaiq-cZe^zExIaqr)}P#^n%;=^Q>Xiw2&b=ID!A52bKxNa(6Q zxpKX|z|XP8MtSU+Ps#J9OT36D#h{EA3wgCRWd4ghD_$t`P5fCJ&7R8xSY=8Ck6f~C z=<)@P$B9&LX<4qw9|KGkRe0MLI?{W`Z9$8HD1D$KNZaozL0|pL5H_)a7Y>D3^IaUK zACo?`jNZd!j+9iLLj##TD~Ij_YUYT6@JQ!4n#xE_l`j zp9(B$v*Ku-1R}I|3U%0>IRl>2!57sYOM#x;z<>82#T5wyx_x1aPo*z(=(WPObwmKm8}@-GafGPrr`0 zM;H4GAu|AhUb*84c#qb(slsh?R7v{uO6k4xB*a#B4}IcAKCMnBzBLILOX|g| zSHy`mZU+^Q0WN<{*;Y|={Frkl6Xrhmxy4%UBQt(C7tyO+DRnB{xJOuWR7U!;Q`8HE z1|0>(sg==I7``Jl7`(jQ^JDn)KCbhuy<|b-zjv)7zH!zGE5DC!v=IBR>aT)rmm* zMi&Lbtba=Kv+^Ai<#J`B4DVpWl1bhR=M5~8kK%=hwYExM#N}qa_T|Z0Gr|M3Kq|sV zip;<7!$P_i3mBuPyLYuAEBNw9xl{mZ?NSpT%sIg4wSMIXl{dF(4Pp zt3do6nD+hUK|FF5U(fxyRBB4-#QKgsE3+e2w`?UOW-!!0Dyp0P8}cS3HkK)8S1l&H z^P(W`xzIL`84m&{A>69A0e2;3Nc&+$wk)iQG?*#uDpq_V-7-cmo!xQ~y@R_!vSO%# z($f^-P(bhwGL>V~6&fNAoaheOatnz^!zOBQi&KOy+!PQuZA)6A6BLiUqEl!s;E}%?c;{c8m#l)t;JgiH~=RFyg>@3P+_;@F< zfnfLd8YL?*%TRODu_YazQ1`m_?eKTYkB`oU<5u?G&jM4$Q>X$Xjn31c(fMK_oj(aN zp@Y^E$_>@E{iU^$lIk>bw9S-f?@gB0nE4&B$Pe5ecV7G;oOWZfS)S`n^7trtE*f{6 z2}STfXmCqOmeRhFElo)=|K1?s>%9d?U7rTOR}5=QBxM^-|L51R=%^7%`Rq79;myR& zOkjXP$p2kBz{x7DL_V|vKSPHh%T zGbXSEj=F$^0t?vvLQjVh#dpg_=k3kx4z618fNWFXeT3XdXGg-`NsS)2UPl8do4I9{ zSf2W=*{8z#>d~boZT;d#3MHI2oC@YY06WJ*bpwuh)^9OJwMD8WB>XFR&fOd6OCOhT z)m^UK-GpDC+H-&cZVlWk3e2?jF!fV7BMWl(<50V0CWrb#MYj^F3Ii9O`&98mBEo=Krc4y8LXm$wxG;QKp`4TW1-5C4+tzZE>^-6c&N7stxlO0uiPTX%5 z8ydft3GO}rLm+_V{=W+>5mwAm)A6_1N`J~@Mr6~}ao~80s9ik3)E|G=@x7%mCIt}G z?3)2Xr*im+3X;REF}8@PsCSGqZxQL~)YPTI5ol9PU=T{p%SW^sM!d-lwADEu9!>G` zp{Hr6yYLkOaZ7ueh_06jZ-AF2t%VIRgo}Su_>-`k7WB#a1K(>8OlhPCZQP%OU@t~) zH2uElhTY~MpV4jt`c**_T2qOD^I|G|#qXTpYEd2MfOt*aT#}`U@mE>fbaxoZYhmyq z!f&=Qw4?<5TyZ?GXxje1a<-Tcz#bLRd26$7L3>jR1IV=moO4Sskc~at1Hpl^ttLCr z3aSxkK#PnuPkt=TmEP##>eq~qO-^NjIj;)LHqbd=%U0c7Wg=1%-v*jKZ{2akm$#W8 zQs|!SVtP%8%v-KXtk+6$qMOYuLZ6bxy=b;1N}A;tlE%)7_AqV6GA#i;@mm%T&Z2GU_<+IOH4~#VAlMfmB|U1bKO-uy=9ARxO(!ZV*Z1NZ0#w1 z_^k&n!03-Ry9@0UhTQ{HI29)w@WI31?hiR6hyGn^!T(`c2Y@~GQX-z_7^EIf^S zaHq=2NxkZtep^@oZ4R8zLl4u^W|&F35bgG6jXMzq+7Us_Q>M2*CpD8_CX=9-T^N=>EJ&O2b1z{#H=AWc&2ac3!Fb)HC)PMXEhMm>M|jgjuGGs^E)h)_0}&9GlWf z+v*F3__V8F=!?H((q2m>NOsn(bdQo4q%G2j6UJCJ5VL}>T|BLGARfFO{L&f*AXuLT zF7FyxCY!lvFb; z9|o!?B>VYknWFZl?;$G7bMtS|-TBu)>#nsE3UVb~Bp=Yfn`?TH8&bv)w*IP!veiZW zlx1_n7`x(uI;2fwGnu%>)04TzsQxJ_Tmt13ac6*VuW2D23MfxhXxh06i`3+_Ujj3Y5%m}u>yW8l3uf_L-N*w z;~;;Hbdd_*Z`KR(*wLb4xq@`SPiRn!4#9R)hy2S-%)t4gw%=n|D`E=7Uls|DycoXW zn^u>$TZVC5#jr2K-fheY4*_X0Vj&qJm&43qRy5jcX|bZAsxqRVs^4ErwIsfMQde9D z8R7*dFFq!j0u;SX-l&_&&l!hQktpO$BTbGmpS>75kSj}3%b)OmrEVC3qJfHzWy?tN zhr2&@?-ZVR;LFccYATgB_UDGAcA5M%NezzWMCS|M4^N5PwvD!`m54R&EC_?G)rPVF zJfm0Zopxl&Ps!jlh~bZ`Mpy9{8sIL=|96+^vo1to0J8FjO!eJswaPjsT-m}6Bn!mc z@|dO0UuCehCr6GqP>$9NlD7@s?rXEvwxgdEvE^BhWN?9cQBh%W_HXSxh*BP_tJq_v zULO#k{PDH8f%srmjUbS;01ycJb*cRa(?4-*iW6xTY(S9*Om3O^|3_ESsfLnfwak%z}Tr?-lSot4a7qNYUI zslk5(2JnB;lvNiHCX2YWoI}^2GacmO0kIgE|1Ju^%{!-y-Pe`C7>X}()Rl1+Qw`407}jf(WsqqKNYR(8EKRd+LymrMoc)8?O7qMy>VrL@vkrZ@k- z?nuN^4+(&}{@GV&Cye)wn_&cqM`|{m zC--x0F63H2;?eu)*!ICceYj_dt-fxKjAT`cQbTDy;2Lpx4(a3U>``w05`byj3b%}% zSkpU>2zd0Rp`(wnCp!oDV8#k0WL^&xD51tGH_%34&})LDQQrM$;Q_q^4>L7@!|oy^ z+^Iio(Qng-sZ8m3B>8gsFJz^@B0?P!u_1-Y>}jO)IlR#I7kHHYAb8~lx)K)oQBdH*W`~{}4W!W#$P|+=Smz`!2 zaxG#{6v42pg|kx2e|`ED+Sca$e!L#b#V;OqF+0LV%Z{{{QUsb7FFaqo-dQvW+iFXt znNsiaH-u}%YzW&Q4hM=PkSFVT72u=h`fUUnDkKLPO9{DqX*zds3)nGD@l#`k-u1VL zu3)nQF$bTp*re<`3i>I{%ek$B zw;1C_!}?R(OH!d&eYf-kbRd>crJf$;vppSVV^gSDO_Fb*`m5SYM_hTk*!}Z(uWglQ z$U2H%3B{2*NdnxB#hL_oJ$k9J5t z^07Da+GG0WWCXw&=Cj}@jF9cym0X>-B$KJX#Mc5=axoF>(_>?#r>CcF3k&pEMD#dM zo;(4a1s=I#b>~EVU49S9M~sUR*?)V4Z{CG->AM-%hPq(iwBxy|5P7sb;QAMB`Fc}B zqtlV$eSU2SG48??IdtaS&8VV^ac#h|4!h%hNw2{5GV_&LwG$r;W10DDSB9{y-^Tu> z*1Zw+yCjR5T0VU5OR|=EsXq~W^!Zm9hzWen#Y)D?{V`6O8Y}qDD}-cZtAwx`+wT3m zKw#3d3cQlu48;5kj4ktG;BNlGyOfaoeGh-O_5=Y#9Dt0@%ZF0V4&H@t+~j;CEzx4U zY@+Dyp&dBr-y`l&NN^MTCp`k5(*Vui{@F(A$gvTa{f&KZ^aC`|U28PyL!gJE!BtTu zj9JmAlRA|!+PR@qs0fz9`*$7%%LtJ&y|iH?;AW)wWog3oIc3{Z z$eeN_f<_GBBImy;$2@7@sHgtpx_fH31bhKXWd&Q}!NMjBzFpGPx=I`9=C?FD&1E>)Q3=?>L#O#zUCb^#nhbka%38EblgMapMDLpdAY@4 zRRX({bth-ConS~BbG24x?M0l(d&qtT2n$fTe`2m39d_W+N4f9^|A43eFA)bb>oxv+ zKxGLWh&)gByPG|MzK*7RQt%OX_~GMwBWyb(%P-YNs@Xi^t2eKD={J;7q5Qz%F!YDt z2`4ojon=jys=snG9Gx@E&&7qE|MhG8-@K1{YLq~w!JH){`%cd1*Hy<n!(yaG zIs>occk4@UWw>M@e~o#1+~HmhC_P^H;F3a*V3QoeUi_DB3#D%fW+V8%RXUZjD0&Ju z#y&VuZ}gWVEozc zw87Kwl^VJPxB2#H!f}pGexrPO4Eu*A zmQw(#-sfQp2`p_5OmY0TFvR^6OHi9l#FwZ)xj$xT3`X0dVg! zSJL;+j4Xv)>bmy{=NNP8X)_W+D4S(iB$%c7ywvQB=dixFj&e!EpPMUezgD<@#QEoA zrw%$LiJuKcuf{9U8#g4^pR>lK_tI=gF8mhX?EhYqUI!l~yhTrwJ_ zSp&?1^RbW*U@oBGBdRYuheJuiB5$I4FXfdE!q2f(m-S z-*RP}-qxlSJ#P&rKfYoosL7~?!}Z?JHYaclQsCu&O2RGMY(?=^FAt!8L!9D(iBeKg zfE4LRKwmgp&VC>M!q4M46?)yuA6kxQZN;;){1WTsqoFTD^-~7BAmY?J%&`1;D@5!v zyuH#v*XRDy>UdG@c*yn(5;1ZcqLT97UVq0JVASB#9JU@^)?3ve^UdMP?;3RCFXP2W z)s(RfzoECNC;(dEzo{BnotY^E5$s|k{J%#h@=P{$xvcc~BA-cB3rPQg(Xw0@ruFPe z-6#g={<$`hc-4LrU$us>xhgJKU?W$XB0P8SlMpk+BtO8s03IL_e#zE;L5%Z<1Z6`G z_}W66Su~DV+1OS=i*5DwCb1kjI1xDQ7L$~ebcN*6JdY7mvV8KszH3Zv5AS1udHtUwYBDtdTp4wa_KwkOM|bRtEpjRm(T|aJJa&#f?<5qxaQvpNSr^oLsqYDu zK7P48lz#0K^X8_}{8_VT^`d1XM-b;cVIs3-AzUH-%;HMilKR&x3LC;vn?9rmKcNCD z)?&;}aa21E6W=k~=gVCW{a<7?T%kV3 zPj3@1r)P4T>O`|Z-)8iK{mBeTc*7>Y~50FJy7y0eXlZ$lLz0%}z`!f>UmWB&slN zdHr%Jk>E>9&|TvaXE10zfdTp!z1aDpQ@UE3_<)-mKQ%RVw9eURbYh~Eh2Cu5p>SDl z<8iitHRU1q3O*ty;#;#c+M8MRiDEJ5e&GtxFb z8WROwXT$T&mY*Ebj(20{g-Y^hQ?yib3v!49VxM@0y1hOW)fcqVt>P z1x^kMlSLPZ>l=v1%HyIm>)-ixM&Jl^B&eSCN}@CFaNQa0aqw}k^z>f0_b@H2jGevd zo2|!4$eZz;*y=At=REb`WxPXk?-&SDr}2w z75r;=N-(hhVpWIvEKoFHyXvbS8=g)i#hUb^Fd0#p86km^tk&gd#C8S$r zfjq4id0{nG*&IB5vTXjs1ZDm;zv~GKKa3cgmnK7UdTzAbWGM4n3VDqudQ9#iFoA*h z?|KN_-k$8g^#?+f*x82&X0(DyQ4XKYLY0tX?2H$kmZOI!E+WI{PqVQx!&81gJMY-{ zFVXdb?X4!Xn;y z2P|TI6p_p`6&m)k-d)7RvJl5uOeE&dAN=dN7kIwtKFEWkM5C%zrh6tisX5emWW7Y; zn4Lp7tD>QkWEz5mjK3}ghZwZy9XFQOocz@zFMKRyg<;gwcl~b@N*H)ptl)-BywsBh zG{#svc_eKU=#r8?g`$JEm+u!wR_~fDW;dQ(gohK4cs_JHb|HdneJ}qTFTTm-h;qaS z_}__v0p9;bo#uP4GyBhcG?U1Ok~pw7M%KWxcYYC?R+!*$^lPm&c#hp2u67FJXJDWYA%wak=U5SiiCQB4SSmDM=akU! z8^XTlz~8@a*0;V9FSOrR^Gx}bU!AN=`VRHbE^+6I95OWHtaQaDKh&h$XNyH&Mgy2M zM|t0P@Yy6ClkMsuik?*`Eo!{SyJ8BtEJ!08L*d-ONM0ICl|dZs)eIdp>BkfcPSv~I zM@sQHkW7J3;aK+vR3979P;wsUl28zcM~znXja4^b=HcN-WBU}wmasu@b3Tsppp-QP zY#VP5#y;45Mm5+R$BlQ#|65D=?ZM`6+eF<-Ylvy|HSPysgl;)FdY#tpK}X_`S?Os9vK7MWIU&b! zn{ho~T;QKRpPSqW5yKA{FiwWpHN1ZFhWf6;z;PS(1rBzQ{#`}bI>3*hJI;{@fbiYx zC`+P`;AwsO2DR>F3+gjjc;_O;xe+>mLiLAz;VMNEt2m+XCbUN(bT zM38jVTTFnJ2$oOr{p0i%RX`vFQO|5{W`1CwY_aA@>PQ-+1d&?yfBW`L;>uhX^899E zLPtPU6f=e|$QiPdT3{m?e|n=3lwXpr4~Z@HH@9KqcL2!A<|c1MTWIsL{4|D)pIPUv z^Y%9zNsdK@t8cPLlT5K191m zSBdZdLcU9-+vxQ5N6ru`3b{oNb z1HRDXRsa6vZ_7nJu9Ze&%66D(Px!MZGcm=NEL~QfY)W11$#0`yn8>#xIUJ?bmIR8D z_uGZu42IYJ2v&HEE<^ugjfRbESU^@ ztV@S|)=xJFYfeP7L=Qu@)CAYzxh(incfx0Any@!7oJt5(4TS^@46qv0jc)HbTQe9g z3_?llflDIzz1X|h-TgB2WS6z*K1(&$dY2*EtZWKJ!ippuT~H@K*2kB2K~H;q6W7!b_Ds{$m986Oe-ZTK-k z3K>qU`7NphJKPZ2zqjB!9KzMQaY6=ME1zjT(~JtELgs8_LEO;K9_-Eh#fY1_t_=Dt zaXDDSGUi6MWzK=`5;A(Dn{0OM@KdQ%PeUO1m8FKcFBgX!TRz-@i5ILu>*1o9s#~B6 zY?m|habJKG^}Gq4h^LjALydNm9jOfssuq@4A}LA57f*|KklN4|y`rIT1|RYzQ*kZC z^7s5oJs!`7KBS;SVXD-n@BvgWcP6u>1seubRB~pFLZImps~Ma^D!FNq^+Zn1(|_MTI>#H)pS1+=#(P*e6?9#~tEb6nQ?U5NN9 zapE140g~1}cz8r}$LGY)vEVM0E7f~6F@R(cffv9#wtBiR^A8K^$8O`nHjC@2E!yugvPT1QwaL4np zhmS7mBd%$oqb9E=$qH{y1LA1_cn>DtBs!&hj$nI4Ua{zcxi|2Ov5AKl!u1gjd=MPmH;Pb1O5y~eu{L8-K)P^G^|>S{=9{61%{aQl z`I2_6N`Cs3iF<#4feDNdEm$>uY?Pcf#6JeH{|?xH3(8bXB_@JFo}Q|Jv!`euQjd|& z8g%12e5hSm<&e($XJqK+n=~kU0#@)U_OscwDa;RbRuK8X&u`C9w|@!VwLG7L?`K|; zaXn`q>vp*|W|jB!6tT0n7mV!%uVmkanb~dVjMCZ2E%HsM>J1!ep-4E3l=2sY{p^1n zm0?hev+^fY7-RP`{tgCf5nB?De}32v0v}?^^S(S6`T+-wkuGv~4WG3@jp7ZCI<*Wr zR^4=P7sYdu4I4Az<6-LvF|kg|m*`Eh4!N55_kIwLh1&<#X5a#b1NT7c+CcW^Sgeq~ zkS*n@V+m1Kf#KszR&45d4g6Ad@?{549XVGDTZZuk=&0puis$>L&H4fuIR}v>nP@3& zT7eL`SIT(DgXGNfKi)2wC3tclrlne36E+(+k?3mX4*WrW4E{YIx3jakR$8W*sR-Qr za4)bs1-Nui1Bzm`r4ZYwe;7tXUj`N3%pL?5=N`$hF-Al-JI0Y;VytQhbFgWJuQ$dy zj`-}WtW$qV1*`~ZVLa|flGB-%mfF>v@8%6t(KRsn^#5cLV4yUXRb_yE+nF;B43%P+ z>)t1*F?h!NY;~WXzk=-_wF3e~cg%;}J@5dPD3GA1K2`JweRo69fcBc=`LVr6 zP@z}$dIw$2K%b{#c)bHsR+xVc6Maic-aV6>oSQRCa5NJXh;Z#=$|hS*=R2$x8)`iM z)zEpkmqr!~!iYW%umY+0;9;>$l9nHYA;Z<-OezC6rR{@*{x&`6!?&x0J} zz!yiwK>{}YLKzqDwau~Nnn)X&1DU)C`>p6S>t~atN()iPXX{tB0%&_Od5ix6UG)^B)|C~6M4F#S) z2{nNtwr{r34dXA>cPk>V(b8TI*OO~jRlL0Vl9L)~%0EL3RmrO!iqt$t7uwlb;grCD zFN?9HfK3w_WTn|03e3HC?9KDJ;4}YJ0hJYYGXJAbrto?{qX53001>wGa=J zGr|5KInbT^`A#a`QgD7{wN^-fziRJMudy~AX)BhV&WU3N{B};i*8F@2SKCop5}S9S9GHz`I}ee< zif^K9HRIBr*_X;WFm%rrzGr3;3t8X69M#h#z9&b9+vw=1h<}nB2O;PDFG^n7#`Sl! z?)}$28A5gFp?DVukT6n6r-72thUnU)RIxP-0HY6Qs;pkN!Qvy5>0|XjgfWJzg< ziTmc&vtCMwg#}}`H*cVn(U?a^M}uNrYrXNS10T3W?N6v>as@51iZov=FAr(}C!vcl z66d6EJMBeNWvgS&eqIh}*950cP1ZZI97MPE8gu$uG6Xn@Ul z93CKV5p3oEr2HZ8Zxl#9{+LQk!l+~6@mqmDRYFcrz4z8^u`1U{K1KB@-dsHo`sWNk z0v-|Lsn z*;@P1?)x>L+O!znsQ+OxFbX4uq*uXvjw>@R;b3;*aE#>o-UGj||24c82o4K5+|F0K zJ$NyVcB%Vz;QUI*)i*t}8`liDw~%uEkYcquTe6feY1GxO+|Boz~?KXa9Y5gGAEXV1jB4!$$O7#Q#bsJJupVz~AGI>cT3Xw?lse)-HNFfD_aKz@rrZ zV(ws6wwOYILP)k%#cW1YqQJthy5zbNuZ-94P+Rp3Le|*{_E3sW&8B4*07fuqMJs@4Ufno6z{c zn2BwmRKrKv3g|4&tzO7&XuPMwZPz%5Z`SdWIDN)$60urQpmG*>_yW6$wf;2vj8s}h zBQQVnVY8tKS&p*r^wF~8@2<6M|M~d>jnO{71(Z*vPM~f1w^M<>1=i2{IM9SnQf%TD zrc>{S=Q=!Ipn8I2-CsoCmLy)TP^^F!Y(S)SX_hGljqwnY2Mf0&(tyh0yg6(~YwKW4 zL?5F}-q#x>q%aC39RGW}DY${k5j%h5f#$=M>f*0wkAMXYCl48D8}Td`CMBRt5^X0B zL~soOU*4$Au1zcJI2|9(Pby#naX1N5HiOjV4QMbAaoZYY;henlSZS=Uf5Z~?84=RO z+Rmy1uMK(!Qu7x##x{&X9{?*(r(rn16s`Ys6eOTQ(sYx=CNparp~88?2FmQC91~u3 z_0_f6`pQb8xdmxW=7cx@_}DCivrFrT>Dr?lx?^nHB{2EUCX%@Fy)3;usn3n;OwLW` zL}=8J2=_{h2O3&{+ z2lv-q$DVGQ5@S=~WIN&;ZO$joy%n}|E8_xAHPQtEoLB(%1ky7Twmx_=j1Q<{jE+jHO%3sV2a zlv?&P(Ur#e9)9*shyOYUKrRt*Y_Z%H3{s7{*_0Lj1&;sIPk2HmkBJBk(rSQYC|9A7 z?W71(edu8*6gUU;HJ$;VPsH<)C?15DRQ0T|*d@IaIAD#o_+o@k%G>Et>$mV<-o}!FGq?P z#*E}-(PyVriSU~6>7Ocw{zRqvN-uvi?6=7q5z(t#WejhdNJ_MCf3A^)w#_E-@PSvu zy_#6}1(&7gCx2InXe<31DMEhCc9uTI8tsou!AR#`7F~9zGSP>Qj$~%qju0~du4xTz zCAHC+>le9A3MEa~{Moq32K9Fx=W!&3Ux`@W+#~tQ-ky&Rr{3wDU05_m!TA7s=U+W+ zQ)BM_Tx>4rrkSGFM|xVVbWRpkcWRi-sl2<=D4y@722`*+J_X%US^ISP`e|aE*O|+Lk&T zgf3G8HNR0E0jTTfjKTe9KIrOXiC#iRMr83(3=T5^`1}{!Q}d4p^p6S@RIMWi7Nqk( z6+>rE`8%g5b9hY&4u5Hy?Z8`DfhBH!vr)YuXd4bP@k-f4yOK@rp7tjL7ef((two9+ zf&)z_=4r`ux*vY!B*tJiczq=!L0Px-yQcNbbWLooKFsq4NWAnWz%>;dCU2Z6LFzry z32${6ktcGz6zEPLgge!^t#W+Rw=Udt1yl8s58$F(C6d~ z6i>r1W=@)Z4}GuWV;@F`jX zDj%Rl;cvqC0HcTl;2DwT17}qRB-8_ly6P3!ypN`=|7|0plh*{0*JjK&j#xW-0W0F# zXP{elf6~z}R(_WNGcq#5NW}~&2HXahmXZ_Bllb>BV#Zf9YZLQHU7)@`4<5~Ou71@x5jvm7cF&*E0nJ2DjDjfM4 z_5*!C|3W?f1)H{Akb-)5u^006=3);t9Dl`2Kj8=;%);ZR8Va#h{zZGb?6XfiLR9bk zQ@U`@JKxJu^O66}LfppLjcb1XVW0A=vQsq}bM`^JT();nH zzB#DgC$PYo#cJD@Sf*bL^H}_D4rUXx--FPbsw%C#A3n5<>-=Bo#M2&yjie`~Pb$wC z9p$py9zTNyk!zFtvzGG(A`aJ*U-} zmL}FDRAk*AkL-kAz8;-5CF?mAE1wM`RKf&V_OWtTdEKvrf80NC{NB}-SCUG}TOw)`UHSS{_VI@DGT|h_(s$l#Yvnjl1nuu{R*=VUx+oRR0T`ci6>GyEURnX=Di^sv&jm#f z#2+yg5*o{R;F$H#x&L_KPEznzz1U%^p?1iQYD-{hReiVa8vcV|3Io)~aB?gyPg2?t zia`k}D5-gbpWV{|IyT_eAP~_40ud-v+3*JtbEgLG<{zFZg=kGas!p|wKLP#dT=(GE z<7La8ly70EC84=GeEQuLw}R?dCTK-l{q`V_CpamT;mP0MP+j85--b56n}bzUvT+WB+F%3YJZDvQn4hHO?+T)?@=M* zIkj$AQNyay$(Mg(3bp#${R5|}C}hj=4{AW!t>dvJ3}GxK#ZQlY{~_yf>qcf5IXk<& znJ%TLKF^D^R4fiv)dVss>|))r9j-OrE;z2%*z}$1({WNKK;^%I8r6dffNB7t&Csto zi+<|_Qne{uSDORS2)3_4*75LbMR`!-q=xd#N1gCt;`H;pj-RJ~S=ZkAsQ4>BU^g?y z)U=R1X34Q0nDmF}C$olzhK;0r;1B-`zJGX1pe6TC!b(U8Y;*hYj)O%5cq3Xw|!{9}?MsYHbyJXYHeeZW6G!=KnUHrP@ zw~C}v$W`EFyT`Voo=@8Duf@VDlSd84W~&XC7V1iE;a-kGh@1y9Y;Z!~ZHNGpRuV|>z@#F%R-gEhES(K2=gg&LEKw^u`}-<(L@4Sm{f z&QB`27{ZEkxv#b(ePK$70A=M0(hc20fAN50Ip+w{Y`YSohK*+=U@wGEGwdvx8A=kT z&7O!ZtKGeRVy$F0;FDA_YLJ)g#Awg>(g+yMF3yOv#NhDafRmEmDP_K*U{9Z}x^vD_ zNBBzyM!lBGTR%D4oYM>d5Yl&A6md6SGI zUnMj=mP2sKRzSbLvw{}3XV0FQU!QKzkXI1l#zjYCI6FHF96N~rNn?WiC@aor=MO}m zSn?%b&4I_~9MjG&Nq+yx_?Jl5UwHfPZW10YY`LV&k6fL)M+e(N*X<;P2U!&dSyrF=rcW%Ua4M^V zcm8_MR2$^iLICzbD$R`!%7e3tUcVUb1JwdTaY~7|K}$zS+m{tZkvU}CPqE{N*F@Kr z1*`VOT2?uG=M29Ec``V_ma3gVVG9;3r9|6tl}+AfWMD**H9(e98 zS+^)Q(YCHHg+CdOk4>Y1%YyzB=ipY*f<O9uxJfrpjfh!WYdz6|C7*~% z#Rcg=VeNldcDccL01fs@GF2!$qd{7_his_Q-9>6u#uoe;t|7&9fJ6n>HeD7n<2vxr z7M-BQ@W%`lU&fyMC}AIhJ&=(IKe~;ST@C{Ns!HtP?n0yL>g^zi`IPJX3?|^bZ@0sX zWq9Y=?)2_N7dTVzJv~b!NXFP;Z66yOL#!RYfZ0U>Zo`94bWB2KFC&F79Yy2)2g7eI zbsuvS;y+^A{W1Y|5l&-wD0Xtm=PDWs3aZk_WF zbc7=JVw!Bfs%D#xw|e}hDk`2{1)5e{?dqkuKUS0&=xYYPaw5AQ#o8ShM26?HN>Hv> z;@TjGvRA3IlS&e?OTtzur~{O-NOp_$*9EJfcKlH)9X{s=$hD;4$EKE;c{MJJbyxA! z?)NRmL*&Zi>4^BLhF8=HSA_QP4}W)%_MmI|s$IW&A5^sn!ijy&x&zK57hsydBCVsEpOlGwl~7^uj$GgOq<(-bRVX=n4#lm`*O;cuI2LCJSL ziY2F||Mw)%#w4Pgh}a2|IM zdYAhj3ZGlCe6Gq@DqeYCY^}!Zsh|`mnq5lzg4*BF`+*c|TEa<(wi6F#n;@b%pJs*e zb?i27f;z#M>#D9p>G=q15(SY%tGM~4Zfvd^ZZ=8JK6PE@&DY{mAoO|4WAfGtw| zJWiOB*bFrI$GW<@8dPcS=up^t(&$#tswJtctZXA~YG6QgKx|vA6;uw}`Akj_ z9kT`#>*(MKd_dQHwPsGmJd8$}t@->2AsZoB6h>EAL9H8r*c+KBTt$OPS@yqT29E%)Fa?*ER{o&fPyBC7S~U zETPRtPn8gJvw#x0uir8A8hWl+o1bCT^MdL#gRn3@adOJrS|c^eD5qC>**L%-=ZO_7 zDKAjK{Z2)q|6=V!N;!G0%VHkDT+DTak76H?=>Pbwg@Mi~>RD84Ppz&{ndywp>~(SvSYt{c4Nzo6Rad4o0{@;`Z`Vde`)6tku z$uw&e@;2N4J!)tnSmhKnT%2XY)`(GsfazY0x&#HB3KYON` zLx^UC0WspXv!qKt|t$|rI;d%xJ2DVO1|7eaK zQ?r->W?TYibzwPH*!r4(J1zEcofj7L8oo=J&H1h!LvNZEoM>RhJ3B%CP`{MPabu1w zH&YE*(N6<4lD4HE-Ff{rd2WMttu$1DR;0HW)56pc^1!n%k|ln~qGwm#=es94Baur5 zCd8uz6F4xq51r{;V0qe>^Z_HhlPCw2CM;@cOBvWW-kk2FTO8W-?`0+-Hm_7;(7THp z%W@#=pUvqw{^A`x`oo*!%}#c9vx2QYg(ve4kh~aDh=_Sw%fmIa1vd6bSdJV^54tnA z>-xJbjs+2!9wnS-S*!K;i6{+s2Gfyv+9#~Ddz$Lu2fuX7!f-Sh?ZSk2+;vP^rb<2% zx#en#PxU{Ilz4;}TbqmgK(K}}b&Lc}G}5&TNO#vR`y2f}&-1=J|Lx4&x#!$_XU;w6b3TVX zQuBWREJ~2tW?@g{(xNHQ$wvip#;E*L`-N2sQDbe?p7z2IFRhu;y!AO*75QHid~6B~ zPjBOnnXth+ngvIKcuuv~mx+3lWFGt?*S^J*g4sUm`}F%ey_3PWEQTM&qr9)ym?lvj zRY$5mPlX9}%Q|-YxXzxG#ZNz7dH>wixic|*yYs*pue%({JTVHoY^q0I6KEwc<2gz- zk`oOM4B+we^RG`=@hgDXI~m{Ob*ecob;dIl^vR@!s3ih~4}ax;z~Bp}F5}jke9nOj zMmYa`&W+Iu@o-0t|9ZdQoyvO$ia>5nsHDacWhJN7BOYHNHlGuREf_5%mAVW_O@$Hlu^_c@7 z$I~kbG&r&nuVn_yTlOYEa*0~AocRwk({kb;#2HL_t1oGiX2oYy`7dsan-%LvUoxrP z=Cswd5QdhNbCNU-O?qZZDJMykqEvU*%6a%sBfzZ8RVWGY>(QhA<_njB7iM7Q{_X$3 z>W0|>+4{&>&ioXadr4m|&hh#2qcwLfTa~yxye(DheP*n-=@6gM{A{w}%NH5yXxWtO zeGKpR_`%0DvoN15w^PDf9_H*IA$mCW8jmGN;)CPieUpvdD!Y@H$ajxBo-|zT8rSst z>@6jcWP^-tIee|2LSL|}o+Z9}%TcKw!@ z0GdZ61j;?O-Zx1L3~Tx&2Kaik? zq@9Xv5=-nYDtP-Db^Y2L&)Kke z+DXgR)B3AIM=moAUVSdT5`Hoq3@UhUKdbZHc*II=YGl+A-y3kY%Nj`T_(9rbK>=Zn z=K$?-de(@lGN+?yj6$!V?+jrqDdSk+pfr1>Uxx%`l0)Z9edXr<#ETx~31Cl*k5L*he~k{GRq+kODjWkZ``oVDZSlaQxo;^ z$rHVH_(n$&Rpx7})+U$odO>aimq(cCtme514+8YK9PE08LaeBo7r*CTgj`7}zY`IlObm?c%aG>O0F9thIFtUDkYd8(3Kv1ZiU2zh_Z?%fJAUh4 z%pI&b&yG@6{+80^+DS%Oo4pDyhaRSz?MBv+cIx}9TkInlrPWVE-d~fOmfvmo?VnW5 zo{`^ZMcRw+8>{r?l6h3rC4$p;s1nNl^j6@Cy}9s{{%cJ3*k3n@2QzoUn` zky1lHVH(!)h{0zqt64YI9+QKnqhV<&hOVwZ;5Q>fLzA4A z4BP9(=HI*-9U+7FpU_#@U$YH_)3BY)o4`Kjh#Yh~Lgt3-3=~1?v_C|X35v$1Yv?49 zbwYRkB7j&9G*@<{xH0ye&p+20|j-#Ou9_=lR z#F?4~5ABZfK4T0ad2Ex#BgN_1-;72_LMh+8s^%X3i-(YLSbez4Sv@(dUbyuES6jCR z$^_ASqZX(%t!0&CV5E9n`it^?82Gi`h-c^Hetz4=Rj=Ujtz^fD#o#F`i?7!t7lG6T z1uoIaaMt7Z#K6gaH9-uhv@YJ~TX2xR;xm|{b`$5Ty}@#RP;$~8Bsw3mbcraq^GC)i z1$*248jBBs{dO&J{q;`JlnYn_8N1@g@e}*is9-*P%FB%ayeb#InF5E!- zZXZ33vvwWm^rJ`8Rogp@(*+u)5!mIT`>%3qG&I{VxgjsnduqFd=Pcl8;CPcxO_x<< z`}ENQ85Y2dm?dJc&3mWmAjoj1uC$b*cU`+xEFz&P$+787gbI+fdtFrJXzWOIJJzC; zwlgQW%TH;7ABc&GYod8ijp^%Y7hq<=c~cy#L`zjHO!DfD)f+|GYnNtQ|5yuuMIOwb z>%E(vPXuZ~j*u@!O0HVfS;EWEvFaB#|}E$b31yPVMWi3 zFFqw10bl>WH>Wnzhr`W5TfJb79?M6w&*Xq{pYvI>WWf6ODkbj3Dfq_U<>t69=>t<4 zeB(t2lsF{C`1r)cB#ux%B7mzpU}tAn=e|N52oei$VkXPXaC}t#F&IqcwFN>CfDoo< zXG=#D5?k^{#IV*mzG4g*otY`GoNNm^U>vnqES6gAOG&*H1hGIlLeCzkUFHg#67t^l zM;x>S6$e1o)qy7e&Xo``3h4P>Ey$SM)*seoj#aFG+GKaV=CbfI{_pl>!hRw+;Z7zg zi^XDY`Nj}D{h1t<$7m1M+WL0*HgdQ!AXX!VG*Mfk%Kvso$$_H9@7>6xhY;X@EDJDn z7*~`60j@K*%}lwyF|gax`y0JHX!#D_;*YJsbUNDYt^X#`=?=Df8xnv036|2p|Mp;| zfBO5LIiTErIS;a3w*JM~bavu7Iyo_g-MW37EGH*N06LaQ1gq``qeppGPebDOrK-i| zxNTRsWfaMK7w_C{&VJg{A0io;G`st?*v<+gQ||F6MGwY$d6|sN$GPF@836)rru44k zn>#uzvFT#_V7Uc<%$`BneLUFSQ-C@G{njy5(~f0$4Vx?dKO+>hLH~TKiv42nRP2vz zV1VNb*Zos$uSLWWzow{_SS`CT1zMPrp-3R&(!d9VjWI_cL# z=k85Q$8fMPXM2>*=MT~rP9-xc))vd!@#ITAaL~m!TkF!^lftdir{S>2Kn>^-ot^X3 zH6EKx8`EzE3R6Le3k%CF-o3pFIUR&ZweY@aPpGt-kD|C^ojEkOKCOA~xa?w5y>sg9 zH0$lS7ozX9uwxczap*89|2B58)?-L=Pw$-}7bS3-xY-xKGG=z^Cq*zy?~AIN zFDI*iSzzVa`O8Nn?1s!zvPpCgRl9^eC?TLz_iAwgia4ms#7%w~3dfwzZWaO!v;b?8 zqQBosx(qkBMq#{0m*=fl*o(A>fZR`D=F_4@mPW!(@{tvW3LyO3A7w!M`E&W;SFfEP zo2;4a(x*M!eYr-%*{(atiCMu0XSh71$h?Upq zl(h)AlECNw{Xs47n9Vn{fA50`>re%a*`z)0#-l^8VDA{ngDVB8*~*8+{$K&FAd3>o|IE4#r8-Y7asIXv3`wkH#iT*(tz3Kk~k<(I)zUP40& zA+Z0*#3%r4Mt{k@;8JNk(NLYn(;ezLI%I^RY`8Q+eErYa`OScy1DDac`^44DJ%C@i zXG+>ost1ZfK2iMr@wi0{Xr)>JoM3PNjSpar2P<^hzF-jH$<=Y$mF^3gqy}h#(f4M= zY8%IjOKWLgg9QhTvKQjUs%LqRZrOG9?J!X!1)iAJI0~js)+k<|`)$a%Y#mfy>vO^4 zEkY*PA%FD%1J={iL&S><_iO`%uBpH#OO&87Cq5e-|Fi@_-OC4DcPg&SSSOH?VgLS9 z254{78prFwWD&zcv~*0&9?G!%*ogv+ne6kQ4$&w41hJsW!x=%T8e`bOiT5|b-9iJ@ zyC*ST9ti=&axMRyA3RB@0;p?fbp9O=xlW72nRYGNekatk&|L%PtoR<6TirzoRM<0~qMofh)loC*lJsLVE0Kh-~99>L; z`Dm}Jzx@9iH~L@Wz6vei3(L$WAFBLm#Mkj2@X9;0#ee9^bu`fc7}md`1jQvM^B~BJ z%BNcdC|&!zu?i7Et`gS}01zSpFu_=JA^O=>_j>7%daKRMT|3@a`GOGTW@HfiCN_f& zXc)lYXwSHz4e^1M^Y*=TF~nClTTeg+abQ9RgR1+XaR5-onx95WeHE@v5?URluF9U5 z<`h2qCepsRpGX7>yua5SvIOL1`2!hrz%j+Ga477H5f4a}2Ox;Lhja^o>$_#?T^0^zb*uk-Ud^o2t&e)ajf`0KAmrY< z|7|D$L8YEsfsKKKk=G9H>YoVFTkM)&Sd>1&8hrV^b##IL-YX3u^;KWtgWwm^U*ofCJ$_)D4xxD%Qm*l$Ni9ZIc3cS_OxBqv*hF08@TyWQ$ zmt2$q#(Q?7b{qAcCO384sGoi&7&Y1G)<3_vdB1Rx{j>#F=KIYpxJ}%41hIf1sbLBq@Wa8P!AyFF#Lc zU!`}Atx^VA+b~VYyLb2Qv$_<%^{{Bj^jYvN)~9N)fS(OEgO%2T;Q{o~TNbwKAJrSI zbr>h>d5^4&P9+woYU^Zro(#)Qh#Pi|2M z2`s64zbPQmif5uNv7U1Bt~*CHKUUS0)IZ1DeK#Q-Sm76Hf%lF0rGB+QC=!crvos`p zL8hU-R$LgC{8;SQt{QsQt6rD*Od#>>m?$d6R^uW@Wjz*Tw@RuyTo{DsCTHACo|FZitlIx3uP(%D1YNN;95x-9 zJCXgwqOv?vT?ZC1mzYRF$b(kU{u=UY^6@90Hnd#fgFnV(UiBA`c$B|s zIE}oa<8HO6gmgGYB9E`F?vZcJ`ZfghT0Fh>=B%+QQR>d?Q(37UD5Y#4Hdvmf0Z@l7 zH^)J?;K`XcJ0MoI>$a;Sm3jCQn-Ac2;X3uE@AcHo3iD z|0K#i3J<|S1-D;eR`jTW_jGhxE_I9el}@u#Bc&$NRHs*Gi+jlVCOg15t@JG(PO>rIzs*GWQ*uIkNM=2< zi|P0nmRAj&g|nZuGOt>*J&a#rT+h|CYdRfozwGtRk|OQC+e8o(NEws%Kc z+C#YZ__~a%Bw^r{e%(X(c|wc5<6`!M7ww88wFk#nso7=ZKS{Lm>RE8+O#)pCbHA7m zt4!k_S~rh-J@mtemJq>ek--6~V5T(-$l~05(`j2NwNN+hlGGs7+M5Hoc@s_s!&qSz z(U?^q>AfaS*Y?G>7eT;Wz1G?gFO#e9{#dKLnB|_*(kxJC_i*TwEH6NL4!^$K>I7Mu zZs#>0kLrF?^wmxUavi4+e;o@NDkfXsLI=Z>mxVl8(D=b5YmB2`h6vshqT8$UTB{e? zV7Qj5z&nm2k*T&b+efci2`_IZFANmz;vVGTVQHQK3wdqAi%Ts;2Qti>t#PTs@%wD6DpRwP70V7o3F*~+ih}^KELmF`{ul$ zmMEZXXG_@9JeWa*0Wx5vH9EE={;^sYWbNtBtn>of^b1JbWWAhDz~+lc)8^sJv4`dr z{ICVKLwevYef%coAI0x_0ChvjitO)FB{;7tNx;A*{W%+(+Z&<+|g>Z=S~mB;{Q2VsubN@CiN1j zl^LpBcqsoCcxBq|bc4a@Zu)+}$kNO+K3@BFKdbSss)e+EPp=p=M%9kUI2nU2SNP&V z4M*_jfO;n)n1K@J_`9HC5xPt7kU-r1PY?h0qaXzHc`ZADPtC!AiwN>qYx%U9$dXKx znn(3oKIrnN@9DH%C;H;3voOt^*zbnAxj7plnk=`lCEObIth!ZpajtGrv2M3vtAiJF z1-G__BI4-d#ku-o8J@1OT>b1+Y^6mLNPsoFvAS#FnZ5cIm;KT&mjVe1AAd*6veI(4 zpAq2?1=LJzKmS8LM20T5VteA{Vp$Ln6txf#oS6zxNtVg6>Gi!kgCSLhBD`3J{4EZD zzlWQ}++`2s5vTBTD+oTa(LVE^r3Szw0RyW3NgC*bULa z`uw;L7@_y0b1@e~A@pN>L>z8Ich3-0aj`V~Z$RrS&Q~Gl5^aIKOnU|o4!XAnqPyN` z#L>rsFE~WyzRxD(>wwK~UpngN8}3Y}1KO{|gPqZjEH_X6l7II6E~H{o%|aw9wF7xG zl}DjiebEoEM7_CK;sRhaCyOl~BT4s#i7^O{-#_8VUW`M?%UT-w;fAsB)q&$c| z@g}~ALpreqL6a)ThdXV#8xh|V?3zU`HZnY6X3v~L*PWgm-l%gDJCnfs+*%p}qB2Qr zORtp_j`}6oj*dVA?sBE8?W#=S#_b>7%*@OnzmG%Sy}xKFmmb`(TZ6ce{q{HgP)o{l z7RB&A6k{<^H(NiS0cr$&JqZu4GW??dV!11!ptQ#K;Kj%n1NL+2Qt6J|>tp_d!#)vf zsv#w8;7xQZ+R21$7jJh%D>Bk$>K*X)M+FU|P0sl@VUk9xU`=y?6O(qMcjqCaac5k5 z17!IE^$H5uhKTg-qmc;LyI(5_@vRxr5`7oR36}$kd=4mPl4Uc^ISofk)xh%~C`@IS zrZr2ID>g;Q(ed0VnZ2{&uMUc*Hhv+6g)}a*ejWExG;!MC%zsn9D2NlD;gC3yHuYVM z%;d~rSCj{HlsfCzavHT7ib8k{P7`E5=Ko~p!v|{`2HO_J;B!!;m~jZm=iK-RVHVg0 zIiRQpetlBD&*B7_o_}hSc2B{vG!s4NOQwCzjzZ(5l2T8a2i)cpdxZ;7?~|s>dELw+ z8JzyUyMlw?WWRg^FnBga_hwlm=Ogaexj?}?D*DHeHUMxL5rw*am~>@9a1M&H1P0;z zK&|z>m5aq4*Bgu`4K%4o-54~et)D~P5;{+k{7V3ZA^t)rRG1QtzhOej#RF==mO4iHXR>B=X z*ob(n1$BsU>!i*RKI%#(9N!7Y0OnY~ZIG*od2;mJ?k0hz&5AM9yAw%9aU5@+EQW_nr=R;ApOWJY%Gm;z=aqFDe8M5@VA>mJD_d zTqGw{lEhm^=wB-|vMxa$lvWmRJi5&LsDhTTox_aH%k!`m6dwub;{rKVugur|v12oH z!WGWT#(RCL&J90mNJ?n{oz5#x&Gqv1t{F=+AJ&S%z2>tge$5L3`*zfM!VN1QOjdi& zj|J;vrqg)OiZZgHll^xgFdf(_#BxI?B~^+!tN1Yx-x^Xz2rDWzvG`|xficp^>Cd%V zn~Ks-GdvHfz@1C1I@dQ3{uIQYj>6c9>WDTL=puyJU_aY`> z4zu4y{7k`8nzd?#K-19{-^(lSuqzM2msf&vRDU8W*?d1XTu&YnU?+5uR6He_IIy5~ z5-7HgP0AXYr@dV7vwVr1>apA3ZD$h>_MaBtmb*XXuFn%yFx}gn62xLqD{^o&r1La- zDl&bz?ERx6m0-)EubS3nAF3ZgY1y~reuFd9v_<5MON~4+tWDx&f8B~66=0G%Ljm*I znR!orFWjRD2Lb%?xDWJ~l>`p09TCkT46VS5wflA;kS^I$G`#`e*_DD}bq#Ju0fn)# z{F)f}$hJi{j)ZX55q>hG>8QRyJC_U-G} z7-eciMh5fHM=s!|9r%%pR?UC+VD|gt;^(-C3x-vAnl2R8<1ys4H(D4c4wD9Ko#?_)6Yh@v#V{Kd(gTts&o(XTV8UPkP#^X!c%r#;8 z^yxNr>}9cD`>PyhyCs}vj&|lom`ZdV_9=HzR@&G@B&%G>$6-R2I{o)I@4NHFPyC|N zn+W+u?)&yRb-Wun%(mlVSH;>m;w~SfAAH0#e}p-@*Rmkz&VGm{E=+^P04_3O=jiE` zZk9gAqXfNOf*p4qdXt7!i4=0PH)3SW@PeW~B`Lc1r5_C~hEX>?*)SqXhF|eZ!E6;n zYu((H>N7EPJS>imjyJ3)#bF#nti7bb^+8fd7IilM*h)7S!kB@a;A( z&)l8){v+nIAmX1|=>s2`Cp z!^NY&K391{1W*c45l%|7%<1kmHNDKF0s0t)52rnY3|{fYcyPi*bC}jCs!^wOwGYUP zKBzdy++ntU(;C7ZKBe_0{)^p~CL0-Y=bHb0HRqoP<%HZD;D4|`43J1wdVwvNL$n>JCkQ+&25>Q0g-|c2P$I3s!?*$!(|Dj@T_u$}{wJL$V zbX|^)`|$3a!u*WegEQocyOW&f`tY+~ejx{O7IS=WXIP^>`clKotG%}eq>&0w{Yf0N z?gpIRujd2aMAxtb@clND)x0m)6ZWpR>43G9L5D#+NJYTOX0tf1diqYE2ppFJSHL4( z0tz$%s0>%9s@A&+ERwIv6Nq4BGC1FNxrThZXI+|vY8ZnkCFv0$v#CrnV|zyoUCeZ6 ze{Cb{%3cPcFd}OS$}-%Sq_WK|dtmkM1*0tO@duMB3|`) z5Fg7@(nztvi0P4y74+A#4z{2A6$kFBTQ$|m0%I1WgaC?2a zUvv&Vm)8#qSvPuUYHFIP3$;Ai?FUf2x*yPX)Iw$rM(dJwPjms_;X0Los{4RYj;se( zB;-QZO6u#llG~E{xr7}q(337^{b*8(W$yPGG4bhaI)D)I=ieh9b>RK2+vfY=MTL8m zbBkEhEgP%+a@%Ca(umE8_^KwFzL!?q$(@7JR!x{X(i^Gaug>C%BPv2|R08i^v@;Ww z2AweHP$|AYwyryUc+A7pP{+;~4fs;ZQY&vUj}OSU@m{l(&t~Y57ZWv>p59A-HUDpI z$nu*_&qiL_QaaEbwr957eD|U5{iYzd`#nH8J0u24K$)|fZYe5bXpUlGn#2y6`OJG+ z7nz-{4dud>bJ$;_a$#?9>$!lJ!h@th6eZN-M?12Ctn3>U6}CsWJtPGY^*dfqVh=&P zS=IO*trF=>{K*0UikNzjHDYjDkZq4FTL(}BGA{+L;uL5Y>|2p1hRFNzLSK1E#e;7# z^0dS`yz_akDU?aKx(rP?sU-J5h|A9BiQyqEG{`uZl1QWUb{g-AV0*EdQ;bn)uyP}aJvmRa#+>jso;AK zo+g?XOx09B=uAY~adPf>V=aCh27DED?Pm4qPeq+id}vVu&BVw#JSF@|MECj|Var{y z3N1cB^p64Ms`9-g;{4gX85l84%YY42DV(2Al797Pg%w$89W9!vw?J4(>Y)#mm^D6m zmzG9S)f-6tVk()l`}QA6fzS6&Tl10VeYw5GfNdwdN6`5AC zX-;a4ul@FG=e0w`gp5{hZiaU|CT;yOs(5+jR{uP>hzFm?f9xi_=%fx^s#_`4qqI+-?6}Z8q@GD@$lS!@}1ob||Q(%7>?rvYQ^T*IY~d zome|{@$W}1yWu51;IlO`aHD7Jzmpn*XJL~GtdHim+Z*iwD_nWCO6Wxj)l@a?2zI+_ zXo3%@ahk=Sy!Q5rV7se7n*`*g`L*hpx8PtCzY>{q6^5!pDPfl3X05>Bi>#e3Q2=kn zXn%S5I|J4H4EE~{+O=VUhG^3H6ZkKPLvx>8kEIS2cb!O7XQ_(rK*uMvOa3w)$m2iw z6kz1Lf5%+}9NV21^<0UuzdKtsspGfoqn<@+eWks!5TNi1e68<420d&GkwVz%LyqLK z#mRJ>`&hG6A{e<@36AC5;nC56PCQJZxfKKl&3!UR`t8jRP{*ooN>AN!oT{+W=LeQ9 zpxIYp*!#DtG|$T5nSU+V9^>N=(sR zEG~K#(0+FR^?VCPoohuOE{Leds-6c|JJOL5b{YX_yHNHJg_5ohf$c6$ zi$52-hznFMPw51l*O&0!^c*EyIr~BnRy$M}TBmDu>30E+biD>RRKh`%5pa1=l1(Gy3|sRRzp zUzdY+IiNhJB5Q56{Dfh9)+hg3huTP{{v#H`wI73w*g z)aLxwvJ(xUF`g3^f9lgNugKBG%CavQ<+UCt1mY|fQdjwD?o*Z_Gf9@isQ^8WR6DYG ziF==U&S}^_Og6|R$W1{b#01D4A_8%5=zIDmmvICW_;R^8de69olQI>} zOcAw%@`uNdIxZ-QorIhvuhpta1+P(Bum@z%U)=W0!a;n?tNTE^(57@2PQd@84eqwy zIN}h$K_toWt4IAy>UpXTROWphEk_2f@*OH3O(zuRi}9}CyShC6f49(&dS6TOhu?!g zRt;HSo6fV~2Z=3s=E6x5Z^$0%ydi;m?p@>Cj1*`{Z%&*~UXa0pKWgtv)Ya;WG#`tR z+XCZVg`}v8urQ2bu0i_Fv|TRU=#lEr3B_|1&Iss*!osi*KWWB($qk+nKPO<4_b%~W z{b(04jmn{a`go_74x()5cfd7-95)L|NfMk6RDHPdLYJkEYsRQCgkQAse#@CitLL`YHUy#JK)fdF!b@&M>p4 zst3#2RX#@jUFvJ%WIr18!x634+nqWROg#6hUoYFA@lxwI$n^@-axilWayrr!1b@RZ zBaBtwh?M}p0?L}$TV-`G@VwG6V8U<6Lu$Zct8TR~d&z$E4w{jYz`Xp7ZF8?Hf#nRg zn7wcCk;C~lm?<1)Fru}o@I2(s8FcRV?s)OpOfrBF5(!bu{cujoBKKM7%>HxKtTX$l5_y&;rj^ zhUc-GZ89G0K6j3}KaVK2C3CGVxGD~GMBg0gEyT?u){}Y#=76X#2|1FuI)b*ut}f-v zhQnHtlVk+fMTCs=l;u&pHvi1#tc8GDAB`_xx^4rmbt#+rKOj^aSd26Rmdg18S>R) zcQA4jLGV8Q+zK~KwSO}(`gfD$TPL0XH!8Em9MtONn-{aFg|x-z2Xo@rG}P99qwAx3 z28U`%2g|iI@urBBhuX)C0!#2K7qJl*tXua{y*>`@71NnP!fF|RuoN`Do5}9@%gdvu zlaV}k?4roLBTHv|XM%{@{(XAquOLIq5zOS@He)8#G_;*DGLDY^6NIov(Dkc1)f@de zaEBA;udj{Qh&-G^AcvLF0_M)zY=7 zdzr{q0$h9L(qy2*TC0r!Q-z;(Oh6DhAwY;DBWm46YE=Wet&KniDJ|3{p}3XJ%`WV( zTjjKArtYy*b#B~bC>n3<;&a#gRjti)64qUiOwbH<5U@|N;{>bHpNQRpXvC6v+!Edw zOPIMxh%kGQbI^u<`y!FcU-Eop3XGZsa^bpjCtmj52X2)7KrC0VsY0uSV2rabyAuUF zk}Ry}NkmB^i@R~tUIy(E9^GXB-mNJ(qQ>)GB}U6hjnbs{;OA9pepzBA$w3!hB$~sY zao@>e9G}?$*wm;{w?$8Y0*ENGiZlSNXBwM`!$% zyzQSRJ%!gkT;V4}eT;Sy-Kg3UOcz_<58vP=(-^C?C##P%JU7n5DJOdby1ghuv6>_( zc$8TpMc8dvlVZV`1C_V&&LXSrzjdSk-(^!4*yRY_>ZtRA0^aMkFPhdnhq z2FE@#kdcvH5$yvesf27yRW2(n&aGv6=&NE)f0{x^chGcSpCsEuEqlf{Ag(pD)syD4 zTtM({kH@Ts1^_cn&&9G0MgmTt+xx}%_s4?!F3{7<%ggxCkacS?*y2i2rI2$5^h@vp zbsuEgRPV29Fa!q~7O-z=Qp25P1wJfLqpMn;4j;)TFSD11L#}PoGaoZ1x8$$q@7jow z2E^ET&Z}`Gy_KeP+r2W{9|CuB%QY&uLv@LwEjI+M{%tji{))M=CAUz=80i#7>O$Hn zDwg90wQLQ;JF*pTrt$p}{MX&E@7z+Ng5+3kd@5r6!$vOfC4Xoj0B*Vi8Foz;z@%bb zm_9JfgKawoWK75g=c$3y{=+5$OT{!?AVzOYz+*a%G6@6zq{t2%$eleh ztXC@-;r^W#@8y+h1|||cBoe@ao+&&x895ED-xf#YqqGR7Bu{3>?PQ!Y~KFf zYMHk-L3p8kXmKWbF<#JWQKYcPS>zy1zLK{pLClf*bJ};WF*bH_``(B3S>KGHUel*v zrXn?BP$f>bW(Gei#b_sapr-er9ei}?wV%X@j5`ixjp)O^r=*OcmbIi5GGx-c9(Y;G zyQfSHM6g>2Sl$g+?T@4YVeLm`xE=JG{3b3!R$K=-X31d#lt7m}mm%5UdvajNSZJKwmK_=cx-MZ1 z_eqJZWoW*J&o$!Q+IM2I1Mnf5rd)1;TQ#ZA?xIfg{GjO(^hGjRm9Xlyx zxBMwDme^L++rPEN+**7KhKzhQ7(H;UywttcKeMVF5bEdTw1bU)0IRg_j*=j|%ohi; zp01K=|H|Gir;hDVKax-Dt0r$9==4^#N0D98lmV0pnl7+Sya!&&{*pY6V5M5Z z&yZ{&PiL=n10ve7Rm(5Nfu{{wDxBCe|F;N1(BPE&#L(eu@Ujm6~qsq@ZmLJtH z3OlP9?FD@ezbqhr-%g{hQ-M7B65fuRKOyq;fEnK*Rc1khoYijl7Op?_TJZaDPm6F^ z#do{>_QEU~tXpoxjn5%@2`8ly)y^A82lIw(&`IM(+T$9;lC%KAPrMS%p3RIl@ls1^ z_?mJ2iY*zyI&M!O-MU$;-o(Y#W-0jnX#2Hy28Ot=fAk3lj0uqtLUZuJNOemu`D4In zR`_|x@EFtN`jH`afUY)wTNLr zsPpp3RVut}u!`iMVRfA6Aa1x(bevsVYIw+=8>;-_OXIyK6zBZ{2WMIDJsjs7yuKUr z=9$zwYiTC2VfO!q4pv%7In4aYU$X!PSuzhxo>i)9n_2p>BNYAyy<2@;^)i9;@42S7 zVIi}W00+bIF2>5utx}tZTGc6Ut!hZ|*6Khezh(k6@8#JZMGzDk(r&lUdc)e^Ft8ZI z9^eBo+cI^#H94`NoVaB(dTWfGpGZ>T7#LC=n1(C-U|A-%x5kYk!xs=B4a;Jp`SnAs z&&I)+i=^sB{(6knG*^KN8I)Gqnzpifl)ftB!`0cfy-WP^`08%Zo}bIv-E)**K z>f3OTw;#?N*ZKUdq6TUfsyuJJ8w4ausqZ9VuF8N1eQ|GuS65f>85+KgPfWb`og!Op zZB+J5O3Hj}c=s*zFAfb50LH-J%0kA>jeY5>#w+PhR!SlwdkxKTAwTp40izN3J*eyQ zLRTE~48|1rT4%cvhNlKv1V601$pf%qv;OOhti>LV37t_faiNnRZkzCdfaWxieN;On1a4aIz5*{-UiS#PA5zr4Ua9*gu6(DYn5AiMe0dRkgC{s*+<#~O+FI6gggf(C>X2*kJ9s~2)*r`fulhhFJ^Zmt3G#bqr5Do{|M6*>0 z9>;I6D;oDTT)v7+G78jT0Mn+==g;Q{8(Pcy%$mKQ4Sj`j^mhID(emrTE6azXGS4Xq z;|bh7_}$&z`PNoe?$hIk)2#6FE~mKqdOi)pAU>)Wh{%35{MVUx+jr7a?>pr5@lxW! zAp8b7fvP?ixk@3|+Pb=ZQdeHwc*@N0oP@SW9!KGa#f5ze4MX@kqmV$Bw1|uNGsY|d zK@lbjt+r1mjhh72cGN+=D)Z`)WPE$VbK1Y{Z;4EzXv!0(KvZvx%S=p#@uRso>M2tV-F7xaAyABSzwV}G#(0;N*v6N zyN?%gr~c(Y26rG71|HzOuziYiTs)YGrluxaWqSw@wd~jOhhR_s^@Z{p!VaQu zvR7|Ek(}uwH@)qzjznU8y~>Iw3t!u2dal(b}@(VqeeC+yn9mMF4`Rf`^8q$7Yd!_ z+9F$DfV_VPs9*s2oDU!lr3($)U;QB4>rs(btr*M?o!PiS!J4vMlKW4epicKG03c5R zq_RM&!LiAK+q4gg7v4`kB7-x3&Rz{hd0nh`BMUQ53;{+Fpv3-$pV%5Lk`|DtBOI~} z-0Wunq%HbNyFOEQ5Me=G&;opcXI1KHZ0~;St9bo(^RurxdJXf=FvO{KU;%yv6T_wt zQ7`_?M-G0BZbce@Up5nlHW6P-+{T$BUW~xngH1Gn?B*v1htK>}2j%c42C{$bd9VFO zZA+%%JCV(mAg7!FL7=IQgJ}jbeuZ+0Im1(az1KN*!b!>;H^;W}sABcq*o%1-iCTtzU$L!kd10|Vdh#=H!Q>z81OnQ%CjG5deio4593 zZ0>C`TQqPrV94Hcgq1cA|6zDOZdnR3i8yJDfm)t|m398fDifshT9=~di$3T1hOm9h zvqWd+6VCHM z_w?I8pu07OKW_Q4k#*@WJ`Mkg|N8Fgrq{RU(|oM{!gs&iVp*&VCI)f?hN)|fuFz+C z&swrlD;)1xm5qNme@EXJYCrR3aKy>4^~aO$eyh`f{1AE^Ai0y?Wa+oi;L-_;sXQK{ zP-)Ov_M}f~J1Ew~NNeIu>0nTC86f_NpH^3G6Omu{tez2NhzL_os zQIUR{qnb=0iBA0;^^-mNsZ^fUMhiS_Qv3c-CL(jnaOF|WNRAGq1V7w>E2T^Fl}Ege zxiiKLf*^t_w*+x)xlYPE7=`=;3EB04YUE-F;+gu2xXJlHo zOBrx7sYRyK^Q#&LtM44GL%-}J7#fd0@aMg@BBjqrvEUih&U^cZp|{MKxzEdWYmXS9 z7aQTow+xelz%??P`FIFJ9Nc<7*JbNz2jUk%?~Vrb7#uuOa&Slb6JDs9ScN60Xnj+b zsPEbXptyW84nH5~6qO#0Hm~bgNh3F)$?7kE5$cHZiGLXW^?+Z#3y##LAYOk^yS3i3 zm!=`ibYn;XU)^X+r8@%3{AZ0D4~MAYBjZ6_F{!}ht1JCbLb#d!*SChmBtu=6Z>}i$ zfiUN$m$1lOsSDOTjKWyRP#4wa+1Q2C&>rItVIa_dG54tyw(1<@`_#gIIrSBO@JRU6 zsZ1OCs(}W|-)VP%-Q2zL?BXSP2{i(F5U?!$d+Xa2%og#(@?(V~&V87cbHv@3DqF#g ztP^}Xt{4wdjF#1TBNLHkI_0cgip+BLD;%O~W42FHt-}9RmS~jTa0c&-8C^Eb+t6vb zh_I<+?VQn<1oz)?M|}3z3#LfEa%J245GL7yd+(}#fK$)>W(^Go*8|)N^U*$~0+~g~ z==HI*NTu$T@**z>fH%-XS}&D&!mDZ^Sjm4zk~CJ!Jhj;kdTp+rq|%qiWsFTb9G9{M zAB4mAbTLicbzKglgN1@Qe$(U!m)_bZge2$dM-@q8Vnr0AbAor-ab86?5!@3K@pISf zeBv!i$&K&!-ebG=WBlx+Z|n?=%LTez+cXzDKf)7NobT!PRw=Xf9adGU94H>=4JfV> zzLHl&3~36IE;ows=-xWB@Y5Qo%_*UO@D{(Xj! zSaIrAo(l~wrw_ulY;1D#BzPNheMNG0t;qL53vK zdxCur8$(t>&=+2e+n@wf%BUXMC#zuCigF|VELjFvLY!>E_^_)~gt{VYV$c65dC8S4 z2-bw+(xsw(3e?`Ajf6T1bM$=I!PDyp~zhXdnD>D4NFPS5V$?FO*Ux zKAESy6HO9hhF?x`b)Ktzsb8M5@F`g&d%s%OJA2`5C76wG!|O7j_P!1Od)T63Q(_`f zy+O|&OjzTg5g%mjA}#8OhI?!2Cd(hU;!E=OA3hINvXH{^&jl|G1B?2Gx}HctwRhEE z=pu=h=S-cs-jA-oE_s*)v*DlghWrXt5R8C{rCH7%$wmng0s+WO&#%HN*Hy97?6G%S zv8!!w(yA6esD)cCY(JeCm=cO33r5%m7{;>TrLL^vS z*)uN|$tZcPSv!AkEO-4KvK#@qf;_ z_jkX|m%aC_wchpi`#g!se&R|G%w*}L*_>>qPbk5t_}kb-Bt3i!X0!;mj_Ki~=eXfY ztyzAju&!#z_%@Wf*mBVNg5kK>c0oZN{AuG})aX&+huB{*a`>4;5r5Rzp_=updcWpU1ykPNhq;$D|yzHVp_*0k$^uTKPIpRT;C zJ(<~_xy(8HUG4J%OAf@4c(wzX+em}UM#5=Tzzk@Fum-=M_#Gr8f z?SLwEkGqtP!?^eFiNT+V_Y3^{Q02Ca>$&50ITR@d-UnPjGK=6#y|$jYL(+~8<(70) z@&FpXg-l?4c}kpAH`T?(P+$G!QuYGBr7Yle_jpn1p#Fqh9=eejV3^&#W=iqRNwnj> z&%)%wl-lB($QZ?N4YenY6pq{vR7w^??oXfn!(c{s3uY`3dhtYv_w z(YJ`OplYNN&*eRS0STcMPaDo*&oUD3=4w4ee^H4-6VB*48aBr7ZhRBE=# zcNvva)({vlBOQkxbzZc9*I~jY+3%0-z@vZqmcJC=wrkBIn$#Z?CETnKm8}mSm8$=4 zTsQmZP$LhfehS4jx1)eBV!gXk-n6ISWkRV;jtIT?a?nyfR5rI%Gi-d4d@F?FZSB0U zO)|i8fUem+xJk{f@TKFhJ@?o6n$@dM{*#^V^+jX{3fC~v?JMxW_Hko+D zURSe&g<~x&M`;1m$l!`HmA7No`AQK_?iKI7B#D*aROA578*bg!^JxFt z=I&vxQ)wYtZZ%OCmLmZb&u#UR?J9(cM&I?urOBTuRlZopqZgy(24;dq&KO`g9^gF? zwcRKK8ybjEHO%A%@Y#5QSqHx@CKL73P>F9h-)0wxV5&-$PbSwyDLMjlR-{K-my=`x zIWoR)rQiB5fAYbXpp&b{aG6w?e-4QR=6bPT?gxJ)Apa~!DgNy*mAvB@1)lW$b&ORm zfBDC1{3Av_W7T8tsN}EEKNwn4p#@JV`$_)Uc9NHY;$9S6>r`iYv0RP`s+gQQ|+t%5g z!yX}jl+P-p`;SYjUI#_nZ5_sIvea6039{Y#zB}G7-sdaH)^98K?0;MJkiR19u%`Tc zTpE+-+w@R2D5(Xr3doJ93-GG#`*ug%Q0%-h^Gb$(0!Qd9V@K*5J54!M$k<#8%`9Yr zSWLuArrGu{8ga2@sL$iou=F8ZN*zTRWS*Z*K~!SdzV?7zmBVFv3mn&{XL^#rU!BGk>UO8HEln| zWcv2v#PrkAp(`7PfA*bF6I-9bkqyi2hv zu%8etfghF@m^x}>p#*}8Jv-tluk#ttl#ep-UApr>68Ueov!+w{U`&d_jlIrKX9d6Z zhKc8!+L#8ltVW3t*$SHZK3)+=bnt2X@qMu7!b{%Is57Ikt3pWfNy2*fCM{$m z?bek()L`pMIeHXnDeYJr(cYijN(W10yL697%b2{rxyZRE!{sr^kuYjIjJpY7m%4S| z%FR?<{C&n)v@V4?K@QAtm{+D-_T;w>%!lPebPi2yp+O1#|2zr?Q3(>@_#O=@sC zxONq~w;=)#O*%;h)g*|hA4G7jnV|GY!}ovVj21qIQ-K&&Z@S{n?0vw!0UDxgz;BD$ z;`Lc{)pGGtUE*~rUBz=!7QBrz{}Qo7z)g%)NrOX15P-lRp0+^e0weQ z{TV_GUn3)74TB$>b^1NF98A*n0?L}W7|0_^UoHAc@<^0rO7tWctH6!>*%Y_B?&EC- zX41K<$r9<7(A3`$zETq!48RjlMzyD0750ZEoRZU!!G=Zp@2%f2A@;p(nyqK*CkD$h z172DWF%hGTUo%1UA4r74X*5nuhFZ6BWC7-cK62uw7nnf*9TrzH`+afX#2p8$!@pZ) zB}rv0t{JqgM8F2nxC06sCEU0P{O?Vdn)m|D$y|E0YC_WozGAZKw2F@6d$eX_ITlnu z&r$v{zbf@+J~I9481Np`CgZ~cBvht56TMdQpHG!a@rIY2Xg?+OMxMbX@(dWzyqvcF zzLfKPX!`aIKg{4!yvBM_)2l~X$L~hwag^mpmmlk=OkeMyt!h#bOM=O}L_9+5cX8O` zZTQTE{bn&e@6II?{pF49=p)hJT;!k|M@wr32nAL`B0 zIZ2ZVM#SPRTcP#y-;^NLADb`#G>(4~e?0U&gwS7JFKV-__a^l-xiD+22}BL4%*$oi z(q8ubyD}Nt=w~zivVwAw_dP$s0ZP)g83C6jqMa^Fmv~b8=YJbbDkOzZqz$i?{`o}0 z`x7@HRsXw~QN6HZ-rkv$iWQ~zWy%lcTqB74PH+R9 z8{37Te^t^z0gM_W61m6gxygZ8Mvae9GV7KxB=M3fD@b7+BgT(4gH1=Y+gpMjD%Nt& zE^i)de%aw{mkk)R_v4GHF3GrF%cb<)?algOHYDEMoMZi}|4y|ZRsNt!?3$NeE~umH z87g*^XfqTdw2Id_>nmTuE@!NBD83-tHtc^^TNT7q%O-@;Rv$SYZC$Fa_0vX`xBmi^ zv6KzrM~-S-4X;1^hTZ*6G~4|!PXG98L%(0jp;G;Pttv}YGp!F_Hgbw`H~ z1W?lmIY}cF8N7!ib(#n_d~f~`Vfq3lEN(mUTjcW9f+ub!B<%iRnB$Ki936Z`28n`!v(?h7a$jSw3q{y+fQr`f zBU?7QxQUeO9dyJdMob0St*cUu4BZ0lymK~p7cQSmwMk6eja7KhGJF_2&neFo+%|lF zU!ZZCA#%`{Xg(f#cBI8Yk+KEPFpm4@K_=W8U;}ZGlj@%WS8nj}7$olfpBN2Z*yZmX z5Cwzb?adxyhJGC5?OUrEdZkp5iKpC}<%T?l84K2jt~9iA^k^1}7|5UMVoTZ)uvM>s z*}{|&L=+jXT2+UBML@)%jk_jkmornKN=aeN%y%H9k--^BCgY4umlb{z@&dR*3m$rH zkam~w#$PoU#?qm#57)>wK*&j$HN2iMjShc0=jE)hC!DUtdaeYuAqSKF`u@O5sntUc zB$~mn+>%dzZ<%}-d)avU;)dKOlgY@#sTt7Z^sdVPC3#Ez*pT+^u_J6KYVX}5rs4@f zFtBE6UhtyICEESK`LoDkD-`TZ_>&4vc6VojOj+UTG0vxNoY|!U zJ~Q4jOtK_to>-kty{$;qngeUa@@17jQ#vbl74^@H#^#$@`qi}SiH`!tsYn`7yIq-S zk$%^B$1rHzc9SKV)BgF=QTH@T=kdZ$-hb`(>&@Jl!N;!6`KgWxgK86o63NT{?>XI{ zc4|kB{Wh-Ge^iNDGr%6ISVkMaA5t3Kf0=rM%rYSLN8|o#2FatT>yu3a&}0lCUKccn_eoZ)lo!c{_A)ZWs+-HNW_RPP@hGF!;OKJK%fYX_^K zx>ut<30zmV+)()er=KQ`#h9Vqj?g`5KArr#)yc6+w3}uBv5SwGSO7 z?whoCKh*pk@Yx1^PznD#EHY0Sq9J}za){6%qv%OmSc#|?@8K@BmRm5KqF|X_b_yG z;*%oW4717V5+yNFlo#?Vq`V`M9XvKvh_XRWa;hXr!eVUm*AOK#&Q~v*h~nBM#OYgX z(2}_=w;FRc=cLkF*{t?~}Y*xgm`q79(mc({;VAdb?$sWSg1VG28rp%hP-LcQ@dN zm-7C!bh3o~$yBueV*r}4fh0nip=g+m{2I=yrN?THbsyL#cGR^-btc64?dMWG&jXi( zdv&iu-Olf5Ke`Fuc-5cUQ?lN!_wwn+e;9Z*@R_w962BzgF0fW)Ma}1L!LD;k35tS5 zeX#1Oa7^QCpA<9K%59NC`^>Jy!+!k3@ekT%-+$WwI>Z9$t$u#|ez1)T{DJ0Jr2F3P z(Z8c{pM8*0&92YskG$qh;i#bDWFwUe^FM<@dm>!8n@gX(62cYOOwct%jXxMhHTy2r z%h$U36e0WEg|iyag6OWC>~(1zR8UovhpOX>kG0vzl(TE)%br|mcrm^B@<|*6oI~Y) z7+EgTSIW%mHyKdCnHyv62^4Ol!ncVD-5jq zT)+19Q40FQL@dGehYPOM4p!14$1yOqfnaW(KG8B=5Dc@PQFAMBzy7O?7AqS2qbCJd z>NmWA^Vrn)wBjty9 zW%viXxl(9^I4( zOqNXXoXeSQiJ40BDe`uYZ>?T`Bns-As=MSzhWNNaIB?9Vf{BqDSO&_Lp6;U~t(2n^ zeQWg};)!DxMR`+m#+QcYOsMJQ9?T;1+re<$R3av4+@-Q_*-=9CtkU;$w>~W9kxOPJ zLk1kxd0P;YpOAld*%uvrc+>YzP%ei&@U@agzp#rB>gr-5SQNec(CTVm8Q`~;8fzLmXj*gR0$hwF5a==u*i}1 z-UXIi`$()0Y79@71|WwjN_`J$EV&J0SQL>CP02AKvw~r-3-1htxkb(J9P|DO<69E5 z|B?YAR{a9z`YR9Zs6alDD|J7MzlD{qr0jnFd<7Q?v!OBeJyup5Cw8c2Aikw~Cw+>hg5!iX)grdx8XL8bslZ9WFFniD4Ol9w?Kn8=b@ z9c~(>pE}CR?0YNc$|UDsbxCv{FVMXf83694dGxFlxA@}?cd3=BD;YrjLe_J6YA-Rs zjpGkAU%Vwq#zHIgHSOXxm-~&G;I}Ku7+t@)uyLm%3p{*h_2#9V@a0Do*|3k=7Fd1| zcN_3Mp(!7f%fBO-KGNf(_xQt*bLZ&r({^6OQ|MDpoZYYWYaCOF|C2q{lbpf-3L1Kf zT;&F!LZ4PtU=zLz-hdaOZf?_w60x5>^Xf@|M(h@UtFfAqrok?Zn@~+1{8axdoHdh+ z)`oFoOW{-#g;V$=XW9&rWS#iIFFyEfF=G_}=$klQ5*RE+6Eb*ZLk^85L~`am*?Q@} z-^{g0Vq5)%G3f13p9n!QNq+q!S!!li8wzouLCXA*1PF@9*4%LXQK)n1N}q^XE^*U_j~7)cov0CY?lLU=3Fn{9x!Csar}U)P8Mi!;h0G$_Ima9N&Ya$^vVUg&SL>Z zHq4IhRYZ>6fVZlHHJalR8xTUM12K`kDNJ!3WINe7MN8AH<3}rF-|Y*dW--0Y9QmO| zq{rH%hS|EJ#T{OCZbYJn*BP`&1LEztyFEzjH|@{VsuARqH9S?Dm&sLY=nQzkMqXdl zElK}N(f|CenrOWb&G6sut{6bkW_7w+$E#)fgFdrk(n8KUGv=U>Xi6hPGeXmE zW~D510(bQL_!c?8Lf9*4#A5t*RZ)hXhNh2n`nF;ahMhBf8_Ii6T#{xsOXvw1pCk4W zdZUrCIn?a~*412|raL99)g9`O7%0gEg$8qPqC*5A2e=2h;CWra`7b=NZc-sF>6WShwZv4XGS7g(&6wk7m0_?|FZ^_v}!vXHQPaxkxjR(`iIy>}y=866YsVjyhXa2=ibq-U6kM*Ccm zXnyJoWIZ!|%eR`qZNBxv*7JaPJ9S7Tkr9Df+zz!XGP~`s7tP7y#>5w_S*jVBbmU*Wf|vAZhmLF<*QN|M4vy0I300 ziuxVSJ_=@ZQ+O{hp)S+5UdK*kb#b$?1+RYqJ*h|&A)`MdB+rr51YIhZ@G{`g?iyz^ zwjK^Zlr2-fZS|oA%`o@X^8_pJf6-&9(eaD3q}0+)|H>-1#E*lSOmwf)q>a zHS2-uZ|7#GOwiIJ4jFr12I=!iPwG6Ga3WRHYF-eT+db8gFu8`bIW7jff9U9z-M#hKPJDe>64espi=gF70v%+{5pGawu|{Zx$)r^b z4CVC*5n&4?xbd`SI<8nJ0I^!NPMD!mJ5~||X66zPVztC{xw~#ZkU4t@{{R!<=Zz9@ z8-+PaO+rTQjbUn-^&*{KiywoF@4Wfg)#3ym1@F*?QNBM642QjrC&}IbSUN8FXhJkm`9q zFZ$s-zT{V{jWXWPBe}KIWzUOlS4{+V`ufsz5jpAl-X@Fh5$!fH9emwKi{tih6-{~s z*y7^2>@hv@zz5Ror<7T+GNtgHoNx8nh{`W8vgFF49?j6ga`jj^0rq>|7G|wttxP-| ztvVwBX`mOw>3$aa!$^&gmwGbBS!Qk9uLCh@+}j=SWI%j zO(S>DEEQHy!g7d8iYOywzaUJZx<9pKMUaL5x)l5zogx;r#jqibXF|bSdF%X0O3&q# zge%^Cd{6iKDXPr#aRjnTnSz{Lto&kQvXv7Fq$WoKwl8Mi0x!|Qx9aXjE0=vqq8qz6 z29frsyyvV#`xj~b5EChffd$sILOlup`9VU}5$IFt@oe4m$=SePp4Ow~@EVs`gyDAP zv)!`a9R5C#1}(~DGGCq$n>dNu7S>zHmCt`-IRFU)qyyT!DMluy@1;e})5H!Um-x3* z@uiL6!{z!>5MT18h`)$z>eWlnKd_%EcBPeI?*W16KOYTdWfTv+Ln7jd} z!d#@>oBwhLFMt|sz;dGqzE(I=I8{rM`;99~ZUU=<6g&RNKQf*YOW~^w-_MYesGPeC z%pjIyxs=iJL~9=k2@pQOgEG{1EB))O+x=iSi5ZI};U3kd2}b|wE#3p86kVij?cJu# znOCRfMK$#4cMNc@-|2k{0$ENiM@@RI>mS0JIQDt&hg_U)An=4OHc*!4n7HZe$%gU$ zIy6~|Ue)y#7`0zL6Z|>J#r}VlLoEp5ot7H6jNJ}F;KSopwf%@r?s-Ws5SQ3bWrrXZ zA3NB+B^Tu~TqOR`f|_YFPTEVIK?U~b(y^Ux$1k0vJXdy>s#YmWAGW8%A9_v+kE^qq z8~g@q3%!3d8+S`-`tE#vAq`p((%je}ttKRN@8pNB&3V$vIT8^Y<$ff)5Kq0HEFppWsUK_qsWXep3SoPwWps(&}*!LKC<=vVkrac?4pj*tw`bIMCJjCC_b# zd(UUa7d+De%Sq_zX6)xtNw{!uC)4kJDsA2<3uqU7Ve+B3U++zvLiL>Yrm+J0#dT96 z5ej%fQ?MreihBV9#SRs9s-ag&fKPrU}D4^`!Uk|bK?=*WlWnX0JV567tHVRF(-L$ zIi@==aSYR*8%+kN+El`keMi#S6lT^4LN(1OyPJP0Vxb5!4y6!iRrw3xi&ytMwLcE% zGANQX10-5&e5mM{VTlp-)MoevVuwv>p58AI{I*wC1#ZT|X-6+kh_5)a>z&H~Z5O1U z`>G}uG<8yT%~~K<#Yy8P)^S?yHPb0Ue1-L8AN1pAL^XcH`x0jcl?a)#Ro=U}P%9=y zeAJ|@zBuZStw#cJ!8B2hj*6;}ZnW`7jmgR26zWIjJRY%0n|Q~KxM+_gn-mC9i!6#U zhU^~=U2U<3V~)jjstqE**pIM^h9T6kh3qAW_S4bh2J?NlGXqzVWpq5EU!xOkj%|9~ z1~$gUy{KG-EJS}DI$W5{FnhUk>~@j!1jVu^m&kV=Ghb4SYvH717%_nU zBhfp*RyVO%BppwCX^C+614*911A3kV1W3du!lj9^r<*1=3+7)jpM5TR99j2=97s*^ zz1HN#xTuyq=Z+scydl;!*DRqL&586Ydt@G4=1q-A=;|3jU)dg`pSocxJ?<}{Yd!jV zmIT^v;$gGmVcX_rd#taI+f~lx?G4Um?rV`$_Z%T)mOnUV>3O)iV*0y<(?E3!c9nlx z&a(MK*MGnLKkHV&1AJL)>#UiHjq8wK~);R`GmfI1J0ctPEuF#|S|dBY9~}J0q~yZ~=VciQ%o3Z9m7h z+sO!Y<$!Y!TeZB|TL6oW9!E-@%-e?n)qke)>#_+U$n=#5N=fy02K{%B9pjDP67boS z=eHBH(n8#zZw@zIyuR<-zvB=wg@{~*61^@sDG?HpAX5*2qaL=2`W9QvH-`~GlqfA_(YlSoaLPT10 zu=H`zduvvFmf=lj7k@h8uXcZ`6f!!t=E!BfWc(b8sTr)m4{bMPQ{%w0F4%85K!oV= z#}fy3rxvEwU^Mx`$zfI1Lb{(qM^nSL4v~vqtxioSinag=OB#>YkSzGU8=!K z{gE{^5>Vm-@cJ`P?)af7``(M?ErfaO&>#pRRnlJ{kaGKsHC{rc&Rwz!QB(T!vs|%( zi}M&^JJt~T04F|a{wa!7WJOm~NN~xqRURFvet0YDUQ$iJdAN&TPI>sr4cEEp(c5D% zo&Xg*?`q_r*u|Ilik_p`W$S5?aD8Bt_fYih2HIVUO_V=(fF8TCi1tS& z=ugU4X?2(;n?mRqCAeWQZXEMeWcQANb)u5tI1R-63Iv%mmXsxKN`SH8mKJ9Oq93Is zryEcz-7Cm?m=|#Kojajm^Tjh@wtpJj_^X*W#`sZ>%A(>$*dkY~%HiefYi&=Tv`o2W zM`_boCcu;&_~P9-??A`TVnp?ZJ}zlm+$UBsr?}_U-n-8MXV{F*uTb7oEk6mKTeoS) zh=0-4TciWswUb!4iz~8E2`odnp7sgLaeDpXiqWk=ziSe@&#Nj>N1BM8Z9VW>sv&8$ zPH+rsNlXXXTj3i}KK7U7jvZtZ7dN9RXqdYjA;5C z&`LT`Xg? zK!w0NAyhtvly5~#W+4;2Y9BiyeRcMwY~Nzzk+FMeeRwy(2s~5e#3f@%MS_{apu?8M zx+kKzzD&ON!_p3r@st5xlSmvR!cvawwFMqjP9hPfNR|#FMkZ#Z%#>`L!pI;~UbOq> z7%F|D)D{JBNuStt0;8>#c%8T`ZH5utv+HeiBI@*J%qSZ4zL1p7C;ISJdY>0zKU9n2 z2+BiBFs3}dRcw`iD*CwVID}bDL z?@BVM~=}Kcn-9A!#HR-iPPRLyAY#=<{ktt<4zW)x+(rR7;t8sVCU7?>Vvl zz6`o%x4F|z;0o3|Iz0)#dkZ$q0SgRYo+EZ|es%#~JY?)AC{u)P)j2W` zlV%qr?}^^?=%aAvBr3l}eToJ@*MN?iMabl>be!5kipNDOJY&oT_Z{h&=u5Gg?hQ%L zf-DitoYNfSW2{I|h?K(~dEVhf&PZ~rkeuk?{sIjOK5Sm5O>Zg=u}{;N{K~)Ua;~;< z(6|&8K4p?#G)e|rU;}y>;DmSbURS@&3%rUruhr@%Ojks@fp`Dw<3s;nAKzLAov0aJ z1*{=)2`G6CTabN%Fw~@fKhN+0-pImDuZBfrM>_rq)}Y0F%g}#~>*2IKx`Q2+OWWi! z?Eg8QqyHSwfwb%Ybv#L;=j!kn|7%tMpO+#*phKfhr3^1L&;d$()S(!tDL-392#h}9 zfUbon?TPfJr?uTAW;w9&FR46*N{LA6bOkr&h1@cnB&sm?WF(lQh!;Xi6oPP~&1a{4J6@s@)6KJHay>B8ePeU}UDo z0c@K!!!ja|oHnh311KL`Hm?wF4AZp|9QVXPDIq0WuL2G+ak-Zj*6GA)mIw&bN+57 z(@!Nt|Go1`hC;6bF)?v5t9WzJx2Fl_@6q+1WspQ{AW?X7vc}y|hPwEmDJ&?fkSaqg z2A3s?uQi{2Uw=ji8%PBt?u_mZ>uEbbS_DTo^a_xZFu-mOuIp2UDc#7D%|dwNaK!n5I5iU-b7nB4K! z69biduZ(6$V(4}~4re_@R0mFHCSw2{P|i`>vE<>RyoYgC{eaE1hN`_~pNcWFbc4B> z#^L{19#9z-1UMllzokh4P6QJGm}&ts%Sv5{94?jU?PgRqz1>KtvKVr=umKsMK=o$( z<>Z4h0Q{B)z-%Z0BqpBa{%6Ahnf}$<_lCC)1X(J(e@v9-*rk!U^2kT<=6N9W6{n)W zH{{d|IvAr&Jt5R2Wy)UL3ce{iC2;KSrk?e(+ZMSlFu;e3`~)hXi5!t30`^^Cv2G=T zM%Ir)?`}j=*|f7ezb7~SooaQDS^fyMS50bd6Z!Y2z+%YnC=I6_WjVW3QKnKCAJldj)By!{pu|JR1kk46EBOZe&2FEx2GTt=BMr~br9=zAI9 zjCCj%rji?<1KT1L>&8Z9lmXv%{#!L8;Kgjo2&DT@f3i`wwZ2Hoftl@6$|CDAoCs`W zmU;W_5|XFo`edQrrW!dB)+~#Bf(XD@^gw02h3*pZQ8NB}gz4WmEU~v4P-O0Td3d@C zQ%r^*@5A0A|1NT`dQ2@j01us|$z}lyPMI*+7UT+1gtAoj>2Unmq?HkLgK9cg#e3wB zVfcRGRuXe1?&L&~Kb}ICsD>8r=))0@j_Sb4SZ%w*(dWT|>{>-SI@%jV#pY?JG&X1D z*zG52=;c|L?`i997Idwu@zxkBquOXctGKkd_<0IBm03_$=943dCOtJV(PH=MlV6K! zngCuKa(?-KrQNeP2)NT|1rR|1(PtZ*=7?ZW247C)qspZ6$pS~$ z%TaR-JMEGlgju^{PKH7HeSTma!|`!k@Qv>gwab**$=wSIG;4^!=T2C5Kqo<*TbUz5 z<)zy#smP8+<(fa}O`k`-bl9s~T$7>oJZ*GOs>^gCT0or0-Cm1(l}XT#kh z#Alb)2*;cBGSa5Qs({WM^T+Pps4R-OUdhC-_i;&Mh%RFz5ya4OT;uCobNH8K#Joq` zD56QLoIF)Jwzn3+hMH?J7`vjXrgr-V&Ezh?&dx3&@COq$HFZ)|70JXSN>RZ?^?BY=*=s5(FX2G|=u zl)Q-dGF;qia+Y@v76l&3+P}RC=EfS2o{U*AFS5SrdHeHVM|0$dU~{_@!;K(H&-Bf7 zq7!xFM|d%-AEk_XKqg%~Y3_dX%GQ?ur<0#3z`6MEkr8cGReX0O$ZADJg_vgAXK8=t zaHI%s`8;y$SU<*z# z?aa}ZVR110ht2%$Rg=~TIf(oS4hbD6+Uo!2D~#~Y+zjgbLK_t zRv1wxBHGc~+8T=786;0QfDOG@MN+&VkPs~#yu7?FDJ>?(`*ki?Vqcx7BUv`$<^q$^ zY!)2mP3GRs_}G;?+|SI-r33{BzcF|NE$obZ{EiWe_lx=CBXR;BB`&L!aj^sVxXHB*nnI9H2D&;YF6+s(wG$nIu-WCiNF`Ah8? zGjrna^zWT%mRUmAhxgJ`5sM$@ZxJk6dr0=;1*+E|HdIDdR#xiqrn{4t)^^tk21-a| zo7=H^C-kNmB^Yx$m#N?OY+_yL%bDiE9Eg$a>PYQa!mR+4fHnyv!?=I2Pdv81wpMe3 zbPW=aH*VVy3_@<26O#7I^9h_>=MB#~@h~ETvHj5^N1+$ zk?${*kZ|)qkiZWl<=Si=7ck^b?sFja-KCLAQKc}fhvoQOU zhYBt?`VeP+J=9>@iyGt)yGuY~h$uKaI~P<}Ys3)HRQLKIb?4?oTrW(pg=|)nxc%fSNvrgN+y{^Pve{#u(a5i^#t34CHaN9^%5K$bqAanYKKTB@^5E7CT; zb&#}rRzXHjuRdF@i-pqDsb6m`grstudN=#foMG3D5t?-p=XQnpK=4<;%wSdcdumsS zZu{yWlKCJCX)hFz{BRt9Wy6A}XoT%G-Q0xu&A44WzQ9Y$3!uv?qlcDtjxM-k+TVb) zlFQ$dxAVfNnPkQF{BsQM#>qNlfMz-dc>HpIx|p@`_7pN*q?S>FgaGR>ZY?#No@F$E zr{I8Dc*+&cxG(C%mfkx$scJq`Q}V~(Q`Yxi+tMuHvxTATAtLD*MLguLf_aZw}`w6uAQv}2TPmYjGTF0W`HV=*5rele-Xz-5n`Apq=+JpI0 zyz8SC-KNucGnNw1oPe1Qg;(ESm>4UfB4zrH7Y&Yq!uU!+KmciI+*uM2Z`ogc2 zmr|45L_|i?u>Ge@P;>9pkb-}ub8XBy^r8UmO824?o$0w;n|~-Sd5O#RZ)L*WHRzu- z!K;gH737tmD1BZUaAdw{rDcZF*jVMD^w%oLjNP6+j%t2wt_H~kA`t)+W4PQJP7<=6 zU^FD;V9`_2SJw;)4b{@rBzpGk!`)W(KB$Hh2ORYwVmd8#i5^H~Sf_%bMs-nO00X<# zMMb~rfvzS(2B|O1xkx1Rg8cl~=Zfbql3(&NJa#JrhBfr!k4;)b38YQrrv)^3yEuT8 zPW@XtX5B;&F_pcVW~s{h5BXUJ<9&^ymQ~~ zuWMK6z=oZvDG}C>;Up>?B;DG=l9=C&_6)QgwvN-;h>Uo8%LNjOQOJlqUdF z?lN0Qm%rQDnk*95jO_7pTv`YT?)F?i&+?-gif}l-{jh^1;Ta(#l3zS~2hw1t{jt+W z_;|iHSZ_%$9%Tq!W`U~Gq&pi4`t{~$J%g0|`Neam!@b#snh}e+i9Rf_?^i>?!!ADQ zT#T~Q5}Pm@m{IcEald2#P6^stg46BYOi{fE^s3StlrO$XH!5eXNQ{HbIzdbH3WMfY zQof2T>PF$u?N__(sJNiVQ!4bQkkd`*O?bxXrgS43A=3Qb+CwuVlU^tYuDIFxmWXp- zCr(Ic;2fV%6dF~LEFKrVws}D_N#RSEUdih1tdzg;!zt@hBD`777@^lcFKp~%to!QK ztD*12Ur+)AJESD7ehZZuG)w)g#}9>&#hi{MQ+1)C)Fcz5L^Y}z2k?>tmtV6{$PlMA z164mg!S0yzLvEzFZiv@jXEsa#7dN-3oR}b2$8-Bf@w>0Ld$Sql86qr@w*es}w52@^ zi$EO$@=jCJi)j|Grm=q42j%#s$A$z7BZ>^Y4A;ciD*Yf6sSVf*PRxE(%npP=@9xe% za*CsgCemJs+n@rc`|Tt*R@X(Y|7X@;1d!4I4u*5l4YPHfn+FGPV`xQ-)U)(v%03$% zO#DDYGM0o#_4k4hkDl}~gRjfKXU}TOKPgNDUZ!!*e;!|XeW`s5S?ahobYMBuop=gh zW0X{XY<%uGUlSOtE}we}=^h`<=C{BcR|J>>kDonzwsmlnzEiamfO&8oiUUlh;~(sJ zqi_OH-BI81*A9Z%h1+f?!6!>$IdwVW>(8|fK)JfU+Qz?>g(D3j9A2mb9b@iB%xE01 z@YW1&ZjKE;wz{yr#S|k3Ho*JX(XdluKz~m9Jp?gu|NA|>Q@>jA!5JEP3!i%O>a6nG zK1Cq1w)u?iF^j{D4)X0rSGHY| zH&G)8R&gMQMS8w5}hFw6@r1w4N zo-%L`BLAv8*(^uvu<4knS7|E;56W~vXc~8`-;ID6ApQN|??R#0uL6b>*{;*Ne#3YN zz%-#cPYRokU-FTdVk-mj*qKzCA3i9y9=$n-v8c}TDg(<%z`M*s?ibQ@McL5S~C-mKfyCIGhhDKX7)uwLa-T?ftQZ$?cqJa=zFu} zlz=q2DH@Pr2M$gX@=mw*k>nT%>B9syoAGS6n>AI{r+BC5T!FY&&tXv{ zsNpCSG=Sxt$4JX)-Etv^?y7Hp!Dga`y2=H2@>d$0%uQ#W5&X}BB*2_rD$o-A<|`Yc zv2ll&ETmqy+IaF}dqmtUzp6^zNUfa*J>m?)1k}JC1uGH4n{RD+2jv6c%lQO_A|>Ag z<|{X*Up~MGk+Lyd2ahtMjBC_s>LmZD7?=35_1)ZJ@=SGtkXe`Dlc1bW-`TG4f=!Qw0f}U*x(wh6F;53V&QFI9_VrguU8ku)?~dK0b&? z#+rRrBgtALEy+0}cF8YeZvv4TAi+M%;+skR)M@*7$Lg_^Iq&6;ZwD_{5+hIV(fryc%eBp&%OFJM%59!(LYs)!2OjNQxlF!9AiP*zD(R_58LuLk9e1}lb$|#gEZOYg=&jbm&TX44x?WX`SOg2 zThKWXP$7B1?6->+98{{E@;MyFf(E1kB`Yb`O=Dxn_w%RqVF+Ck759T#r6n0Rg0(F4 zygUnRD@+j)5rdzX8d7ShH4M0sj(y5w5<0jZqVTyM#J6YK>1W=_TnaA7JX_g-t!Fkv zutl+22E~j2@zG@T&NCQ+g2uI4Ve=d$R409c$IN0rKBG2H57INU+ne~&A%Z|=O&UB; zjqT@am|ELfik2J}AP3fe9oOerk-?%6)Q)trn?V=>&{Y*x#l2%MEMTgOvy~oUOiBPs z9+e`c2autq>8lUMVaJ?UYtS{C&gBj%oxfEb#e67?iyc;2Vm#$3;VOsd3;IAB**Z_A1C5UnF>rNBIgZ=v!d7i|KdL3)fqte@tSna{Ptbwo z4|Te-4DCT0{4LRjLXpX$4s>9xTi2iVK(jy73Po(vHkpo(?{Bt`Xw8qNN$YPUc5k4P zZg!!iiVyY_{-Ba=gjyvEySi9q?&Y8-x#fGc{*MN7uluA`KhMPmxVpT__)+jUZuWi` z@8x$#xSp-`y&Xss+mTy0o88Vqn;ETaC9gc`d!sOcQh67wQmgkA6m9ee9eDB5KJv8b z`*&esyT6$agj?=V!y(?fk7UCmBfBb{IabmHecqEOfDu(ef!wq;_t5fk&>6h|;lO1a zpIJ9D(I%6DLxy&g%&CuW+I+V%GvmgPQ||c+?7zDFBKAu~TG~RFTqln#BQ`1%1H9Y5 z4;=;EbrustTkSwKdxiwzwD1-RxZD|a+Ze#n7wJi0QQA9O?{~Y}(`s|uCz15N2=O>w zRjaM7wX|?dLNYY^JC;NLs_x%uQrmFDPxQ<6OyXu@me$$1b6&dtP5s=cPTFJlr$0d5m$)H$baY#cr+4&s zf$TjN$?Dlk?pK}4lDu31z6+-Cph^l)A&hE(c5>`omko#&Fni5;0(unBX})^gw0@+y zD)n{nk?i1*lxz>qUKW$raH21oyVdy8{j=$P9B#3I$Kp(WwlEr8WTrWR?xzx!c5~YY zp^i{e_fjj_EGlBYhBVR`+jV>wKpzDkmNC8Mxjel1 zD=e2mQ}38bV_`fs6$0%R!vQ|9Hx}uXzS9wAPArF`!CrS%+g(!B%^;9qd;{Cf{!Q|E zuL)>{cLq@FfQgvic2)gMN@T?ZnThHT!GW6P&cCRl>ivA~yVT@JdiUzTw1w6x4l->a zMv;T3liiMox~3Gviw#Ctk+Ne0cW+a^=hIS)E`mjT_b`bV7&K@_KclZHt#qoA0@5rm z*A8aOGtuYkZ3yG0+U;76GR;NV^wX1b%u@v3=qlWXc6Uq15n-XDPb{~(5(|%^!g&o_ zz&apxAa@Le#JTNYXhkyK54*jVYYuwkQxXya|_eLL5I;Lc~(b z#PObD-KE@b9)8`6BQ+>dkFnp{WHi(Ar+mA=Cu_0TqE&9sK2sS>PGGka{{JxbR&i1O z&mZWsbhmVhgo4r_xggRV(xrfONh!4p2nLNH&C*?x(in7imvkdtyL%r0-}5`KbGH|J zx3iy_dDq}U*#X{SK1}2R-L_lrl3J0IhVYc}nUt3qcH|uU4bu?XfZv1k6E{~?fz8cNBQ>=*DZJpUDO#0@kCZL}7_ap~J6l?0~ z6;$DQ!5qPe%Oa?IWZewY6x2zLE(opVjfK3Qt=cFJ60p`pR88dL!i zAi$kG6&X~%g;W-G)Q;Yq#UR5!8~-bbL1C3}UQ}G*SOBX|HO44%9?QeWy^LX&{^NlD zcP0KRsg+sMhv>+fcPWJI0Dp0DQJfqo2dG~vKIX0etNVU^-R9BJ3se*z<$bkURbKEk z^aPqN#j#AJk0}uY{kQ3Bf_@uha_<}Eii{RBnPgZbBTxTFxQFOk0qZ1lKH;{-%D}|r z2LX>d;{lq!JyfH`=>7%yy{%JHVWiE@@-n4T^Y1e%f(Rhi5h9Cwzf#oi%wAVt|ACG5 zoe7rg#m<(mH!_C#iQdjejX~5-pf1$!je{2FF=_i7XCZ9dtGLhxp(l*Vp|mgSVG3HtD_0-@dd~?eg72QYXu$TF?^k z2i;+yCG#h>)yck=hQ9yl5xo-I$J?BR%LQngXp1K}*#=8x@Z!M(lKEdkai~b2C{~%? z4KeS=Ur9|yselIs?kEAIMU5vd`B3NcB1L?Rtf$@oD+%=Z%?qLu##;UcWqGGI@OEad z5a6fd`L`8JJ!iki66XuZ01BGGLX$TkX}eSi3l(j`X7SFuDdoZKPnns_*tod4p#T@2 zQ8&##Ulgi;7fp^-@`GMLW=M&NH)LVpjfy)oF}*NwwY358>MC+_a#B%{owT(mUbAaw zfiU)~$Nk|lW1ki>$@P`l(O)7N9V%dijuU|lKwz6x)2+|gH{>&nqOZEhZv9c=d#+tA zb`A%H8Q}2OBIJOJTP~TA*fgAc2e{VVRlpDcE;MW@1SJ zJPEl3nkFsv?bgJeBzL%C-p@;*TBll89qpzrJiErj;i*C+%ca4OV^Eh)Hfoskb7PK{ z>~mJRnrY4=Z_ikuZuR3fmGreCaRlc2s&Pq8ouO%S;+I2qmxm+^zrwuHp;$8&uRN{4 zg^6%ME}kpuL`a3+NT(zAn&emyx|$$rCLn2p z;qF)KeZSa(IG$b}r@!qUFVvkaIlmUCHZAA>Su-_w!go0Hy{%)<*7F065>dH@^Mvpp ztd1hx)L|wnjl-$Y(wfzOJdhhCpGV#38>n|Cdt@Y(U}9reRw+I?R$BMXrZ@h*F1gnS zIGfP#o}Q1J)iTHJ6cG2>HzQ?{I%rDKd%9YNB!QPL-jo$r=*y)S#vSOpV)n+TX_Yna z6+4?{S7OKkYGMAVUjU=_U=BThAiNVs6gq=wXRIGAne+3W_l^CoFZSbC*F7oUVlZW=R5#LMtO28a0Sgr zaLD?QSMAx^tD_;&KLpcnR?R+M`5ujap#-xm@`3>aauME76 z=-6$h3IbJQ%EP$$@pfbYa-~Gf3!Y1jE2!Q~GYXxV48sI2N#yogi5$`0`Nindg_5zN zIrbCcJ9f!(_J%$t<>`el4+@y|$9a;wu5NUz+o4S5+8aC43=K5m*N;sv+i&MzeCHaZ z{%Au!H-1Ar9fZm2Vog4o{Vo$cL3rjco z!4J(BT|x8FTTU?U{%D6{OGw!2Wh3B z(XMfquWzRujCi@SteQAwQaoyatC0z*`lS*<3HdTXWgk+#?#(jZl@`ww&(%%az0d3f zb)9>h`~9AHIrQ-5LjQFmnq}v?-Mk;EEqAH$CPY|HBH7nSblT(adm=9b#{jD{6qIXR zzT7$Ljl{BFEMPh^baOkB&CIl*vf%h*4R>2kkO{_uP}j0r>uLdTtF6| zcJDBY^@^_pNY(utfO#ym_b*(uBQMX)^R0Y`DsfP=p=MZmgh9Wz=4@~`^`9~~XSiz` zgkF)gJA+)L{u)@1|CsZDc1tMLzDuNw#Z-kkLn}HT3m%DORs0Ru?R0VJ?j?j797 z;$^wA==e{Z%1e=TFvkVi;M<(3ufY1hJ{Hsk)aV=-}ZqSzoKCoQlvi z3Bc1|@2>?h@EuCqAHHU;70%)i8L-=h*=%_OsD)qs;iDr(1;P!k{;AYDA2w_Dpl-Ie zY<3tO$j(n$CYP5=b;=o=rqXoWUwQJdFT<3k|B}R4)(hMfbiJn(a=!eYE}HI2 z>;9*DF#L>H-e+nvuZUGkF4IJPeK`5@3{<%5L8%JC&`nI6ewa43RmrdF4&XS)k3Jh%qxemoM%pVL^IE zfZ`FYf5_prmtw#n%qy);@s_OHmhtqPfqV1{%TdN)LEZ{~zxof6jV%;k&ek(c0)DwM z$1sm4WCUHDoc4Tp!E#G4v%Keh)(;PVAR>|;n;IN(Jpj27N-RJPR@R5I+GM8ccKs5v zh+FnV@Xqi)K-=H`X?VQ;(WdTqS4zdFVqIidvO1CABmxdkAwW-tlJb2YBYLB@GK*G; zF_aDlD?5gS&pw{)$2X#R*ZmUMtmQ1K=qsoR*0VvxI$ z?O?+3drgdObpS)wR84Zxd=jaS!iSgXbo!?z1|=z?lMEyCv(LLXC2#nm?xu^#R6OZx z3pt`BJus|PygVhG9aOpp20!Ja+6SV6r+W<7cq^8>X}{Gpy;Y=mxyMM}WF#=NnbqlpYLNW% zA~b$7(V@6_viSwdC3>J(!fv%mb*~F1UCE#>D_D5mZoBaMUFH!i*Faox(kW-IqS#sc(`@jzVR8Hd7)F;EbuK07#i4}Xxu~B(J=n>#yLAX(^2$> zBDSdiEk&KUpMRYKKBYF;&CtfeygcEJQ(oiG>vQJZUKqgE??!>HT8Hsh;1ad=zxhYj z6203rDJDd*g8ln$1jgd9!V1ZI=01Y+@#9BX>8FCg$S_MPsEitULUzke2z*8@KLBEh z;YFuCaqOcaK-}x6L&V3!{RHY7>f;9q2Nlm;+E}pw-EiYuft2qvuD0`~0GjgL#lF#! z(D5X{8&h3_AyEvX@FtSJ`g26j0OvH3tM+++Pa;*a& zUTQ$%){cWt>VGeVvyGmcHjGp$&)!Pkt*{Dk`%ry8={#Ow%p)RN_>3K(wP(rC&X#LO zUN8i@fTyH4;Ap4NA(N=JBh{Jjshi^U?!GXtjdG7(@xh z&5n7}+Yt71OI1KhvN4eoP(~uY#4B&KFc#Ohv(*)cPXsCLT6BLl(HF@X65)Lt1%u(B zy6Zd&Nkj&URqkQZk4?mN)%xW6j25Kh(f(Mn+{sZe-4_wRTDB?t@dNFLgDTv$AL~r! zzi~RjOO^8Q@|*td8pEZeaec7&j>$UkvYid*yEF*6QZIMU>1}>D=)vGmGLn(^iB2lC zYpRS{mV`;8a~T#zqw%WoWK7$^ptaf_2ANk66qH_QU5*_~wDvn(+vn}V2=A7KU7Pn! z_dYxQtlMx$AHDXx*}#K;AZ0OF{kakzPIN3*5QM}XL-a%tIPYS?+nrUz-4UDO-fZq`F^Cx+;6ti-RBQG6${31W-x5#?P#~ zBC{X8C}BMzmBs%it_c9{+a1#r)4qks)D&wrA7CDTv zJBttFr8Cis$KXZNx-8cvnU*D(t}HNEIT=avl{i~yNXDygDT)%<;&qXEjfI|G2tXXh zIA&ts{qp@Fs;uF2yk-m_)tsai(thsClBJDb{k#vX{G)8Ve0&O+rTwflV#6bSVq4OF zoo)?-G6}7-x@>l=DI#N*ve&6eZ)7haIng5|M(efq1H-aFx_dhGYhkqMix!Vu*YmTO zMblnE07W+|_GOzz8J_RSsawbDwo7X*FTFd*f9$4So~tg7KhhlhILhfZ{}5XLnGF{` z0-;^{nKEZ6R_IY~=HM-knYr0M_w3#uSjz>hJW*m$U@VuxJ9lSwgjv|-D!I_wDQ32< z@#kh<`X-L;T{>_kP{?6@;*YjF^S?Qtf>lcOXbz*|N=qfh9VE=lb1m)G1h;JOQd`ek z`KF7_`IvO}byTd2`AY5hthfGNx@xp9+rElW@9-?F9t3p^95LNV`hJpT6*lz#A33in z@}Z93z9vUMicVsEz%6a3Xg6KYR=C%d9wdSRM{1hgcj5b(3M1p3Q-lh(Bj1W4{9$ z;5NxwY})_6uwLX`wVbE&a*LXypFzAhn}!ntXjN;be*P$6;?qaKdQiM!f;O*Bu9JwE$%;R2AX~$hf`-at%=a`#6)8E%kZHm)mLSihkX`*)JfoywM{WdZt5?EShNdZ3IadnC7rP)*NvN&l)Jfa&V z5VHM<%3fs2LAMZDMd~_8&@n&vZK^NOak*KxAgi*!x!m-bY`JVn2lzKZ7ZxX*5S!uLI>z$2Y0$>zG(1hvXK zN0q0J7KM3_MTPwQH&q8Vsy+BbD!+U(_*6ZNJ$;ek3bYeJI#eD0@GCKxnmW$4V5{A- z42+|jInMH`j!WKaGDN~nU%&-G9e}#gXy~gKz;pn7@k1x6&*=^h4i49~S!npW6awX@ z;=0m(H0V5Rs3jN)kjn|_tCdmVQt7a}i$$TsC^;FT%>8K!`M z01ytGl3`+9;c{a=1mfXe08CsGtmC9$*jW-T+rK+)L9S2Xuzc0Tw`a>;UEz`7bo#`` z`!_Z&+;|T`sg`hq#UC;S^I)1@{{(1%N$v$ALaI46NFw6MfzlZ>tyysud|=a79O4eL z8~{r1pf!_)#OW=mEL5p-DxDJ8YyGL)|B!Z3DNVMh7Df!`FZ{^~JC;v~d$la&MI^hYj7Rj${#c0uD0>~0a^@-NX7Tq?^*g{4t3X6C7zD zHDGc#;Z;b6AUUKhwe3Uo>nH1nDD2MX zwdn4TC6hu+Qy+*Md3~+5{ZuwvcVt(3{NGe+Ugd9FRnrN_#Sngas7Q)!XOlj zcAF9h1}?86)|;R`$d)*TkxRt>GMMHTW&3^@n>=gupK?f6r}6&=-`1mx8EO6Eys`G} z>u9RLSb!V1hnwgl1tbBBmC_14sl#}Mko1jih?4Z#r!_J8`v%Ah!@Og!W2A$8yfZA* z78o>|zS5AD1#$*j4wn}PGl(XM5nz(^!w0}yt@fY-{Xf}n-t43U$4;7cen*48II>xF zl!K9Fo%nDC+rEHL7xUtncm0g>E563f?Q3k_hg{ds3rx7vJXpHmsOX-8Vx|m?w|(t3 zP2Rg99dqdbd|J%CRVY8Vuj;=zBozpex@zY4!Ss>q$^gobIIz-$Fxg zU_DF7eMwa7UQw~Br|0B|BMU{-xhjK{y*>RdlKg;0;E@Ur%Fb&~Q!;>O)LBoD?s$2{ zM!mthWyf_;(5ukLSVG{NKnJY8&DTQhbL9d1t?Ro|e?+>yq$@!M`E=?j5;W8UASuHT zBL42}TiyOC7yFUemr}@fke#NYrMly|{n1~VRrgPv$yxSMP5^KMx0RsEd@CBqzTBWL zO9P5e>-P~(=Z(gdEUaz)kK^~eqSkR*h7Vf4@kK)%VgsjS2N-`QJMRPc80;)fy|HxvU^Y=>zbIC5-*$Mg0+o+<2cQ_gIQZ(fXMNS-6TwY{58cEO@AYJsnVp%wf6z({eh87x(sRa*^*03P4eB<=7&r6yGg;JiEEC?pL? zTF~=Xhu?FlvfCh`ek66$o`@tOhU4${2~Yq2xXDm7wqPP!X4Vn*Dj=#yar)|=e?&Bo z==VUV(0wj})(=er^Wd=3Ka@?`Dk6sPP%CIUa@e`%k5{N{_R+`^SmV?k`;M=CyM@(} zCxf(4gTaZe_(Z>q^a8j5ECr!bhM9#nM~LK6E9h6p1$Jxponcikp~EzQDx$m{@c8u1 z(Ae#=(1)K;zVgwjuT_RFx-ax{b@SWoLsc$2ML>Zuf>Yh-Z^)m3w*&isAkEju|D?cc zr^4>T>GjZUN>y6m&uS0QbKBxU1Vu^oo(Dyb!HKre16^LfwnA=(-~Inf!u-+OGP!+6 z7Cr)2BoPo+hN{Wo% zbrJ>r)?eA9@*3YQ%pDDq#vSeh$B6ik8P_0`H6(~RwY4dvh_9q|nt3XJCLiQm<>P0X ztN6IW4C;KPoXYR@^q_)Tqei3cIm*yzXSCeDQhf#e>c|oFoY2)k{ydxmce_C&j&Xf6 zC(%oE=FbPf%u$1@?wFjZDT9f5=dR=KuHgL@F1G*B6`+`k3bSaF<<1V$to$zhwgwLC znp3LMZ&eDY(C~@h_q%OjZ5$G_Sz&>CKFhiex;Py)dyZa?Gg~%%%6a;(so?b!0sCtC z3&L3Grv~@_30Q*|@mc>(w9n{zBJn=H4La_S%bbhCYX`Yy6;mvX0X1-7!Fp^`n>8|` zZSvinE#s+2h%fGUp96a7x5sc$mD;NUSX-}oS=+9C(9ReJaO5y}tM%$`F`s#b5d-a- zxtV;Gr?ghKaKm#cN?@|dd3_h{NTHW%S^1cWk4AmVtYs&moIS(mI5q@kOam{Ejuz&7 zdT03%qTM;7fpfvL{j?zZvEgG%$Vf*^WF%m;X3SBC%MQF2s5{%2)%KtS*vk~vl?res z(D_{^X|{bh9TKKSMy%{u4?yS6LwxwH!dHClbgYhPhjp5PfXan3J>==UiaZ^}omLi| z7IeF>={QxzsbI*TJ8Ry`{ctI4PBBgA$Zx7PI~`JatF#V_N__Caqr)F*_4mCyEMQlP9sv*WZtu_5utHY2ab+W(;^7vg?WLj@2dZWt z!9Pc?4SFOCwQ&P0(;X0(Ucg8q?Hw?&HS0Yn-H1M<(WF`E`vF=dM-a1@;{Mv75iCf9 z{7s>U5Hjms4$Rx^NTTEoOTrYO+QmiC2I!CjWbuyo#NiX%t{AMN5+3w;tg#Zh&F-rh zf}npS_zZGvM@PY-Y-x$0prF|P(;3l21YX5m$&`~2KI8Zt0~Dn{#0VN)xIBrH5NHI) z-v_cr%B`JS`6cTVez#1+PU#;;@c_E3cE4)Q@4uJnuD)EY$nrHXZnc; zdMgd+QO2@5@Jl&QhN@5A9TK^;l8#NFDJ}Dn%O44|wRu~eNt1#VXmR5C3ToE>Pw$2Y+*$vB zkXv5^jnh`xMF8*ycuRI8UjjAxJz1>xL7S9>0x*X>(k}w;1KumFz)HF>oO>ma$M7vD z@EjwpOH`vqq$=?9+@F+aA+90sOv!9+22! z?HrUijJ8K<4>17_KnR>D(DW^A<^TG|LZjIjFv+$Hf@ zW>P;k`Hj!Az-Q!N98C4BSm__V>p>2{s;9z@@!)g3m{$96GfLoClEz1`;le}z$FF!r zzn$?QUnUc`@*hG#y`64Fz2M=|G=YJimaY5c8KNugOe{umB z7?{Os4On;#)TIp$)0qnk3oxAjIF~#SRPEe30etd{4;$yjFlRDET}<|4z~=I6AxOrs zl3ICim|(<|kyX5uEU0{;b?sF1?c2^k@%mbd-WS_HKZdIrcguAJ+j+LJG#3P70O;?3 zLF0;gG8yDK%cbD1t)_mtNn)Wd=ENWZis(ytD8Eet{|G9o?^qt8GBY!!D6Nn;=hgM_ zB0^j`_yCX>lPf9foI4||CqGVVLL|HWXd5Ly^m<`Ez|68uVdU#WTB&VbE~V(8!BchM z{j5QrKx(+xM6aajF|4mn>M>D8*AH|~Y!6JZ{@TKInZ=&JL`?`2vnc1RW% zPj-M+*qZtBsMWCi4J4N>gLwrj03L^T0h=`CiXfqr_rtBbXBV}j$)pI+7ly?0!5cQQ zI`U1PJYZUjR_v5l;K1PiCqc%7#NMOwZy3nv3v6f}qklIsxP?!p_Twq$LEIFoP%5_+{Z|XP!uO9$DhE884 z;0hO%W}#QZGvT~&l4w-%FTv;NRe6`bQ&IRfMrYTswG=O4oU_C?5Y$TVb~(J9ufKR2cO$+C)Q z0nh=WouJ|2pOVq|#@8Wgt4!k_HV)1k3ah)Tzc#kE3PVFfQY8@v!Q7Z|c|srqBI>rp z%MR8>N1Os&nO_y-aG_EDXsLDW;rdgkGW;hFyur9wjuYFv9FF-<%+8q@3v;{Ar4&xW zreD7I^@tMCC>-Uswxc&t4Gyo?1Wtv8cfKczFf}AJ-9v8fD15;Pd3uGQWW4Zk(?692 zu9r_UP<6nK&^uh|ZvP@QH1Chss?)Jgf6?R#ivrN$pL(8tw7&kl)S&!NhlL~ewQNBT zc(HcJNuCpqK(GYMCclJQV|cNS&}GT63u(LR>SJ|ifCeesIBS)aBd!39%=TA0H<#w7 zV>R-7Z-`Ndj0IIUzq&%0WTyx2C-w@y42Oo-x^F8`o6Sy97LeVI6jFD8x0hkyq;^}2J#Wp>HS^|tdeg%y<##*}YL zmO*aL$Jli%#-F3`)GBfzXi6y~i38cIO4>#}zF<0~ih~*^Ey^s#Yj5}>0PE7z=hpE4 zwP^p4omib%_*&H57RU?`N zde8m8z%a6woqR~xi!XlQw7fAKd(arW>U;-nGn1e9{LYDD?xF^+x6ICG@Z z8K)I|P#RC@TTP%KOO}D=?WUEJ6SD*n-W`!tfb)o(RX*Uoan2kJd`D>To%K^=+M$&( z01}0_pjpqP=CwwF4;*yWuse+ z={<4CrP^0{yUk0~@V4RL?a<)h)}5pi{*89S&DZ@ohs@Ibfgk9^CodZ{|B8)HuPism z?_WL_7ZXz5wMa}zT)!5*cd@(YpxNE@0#s|I0BS#1LCa{ONJj6HN?R&^Wp7Nz8P;A>qU)@7N~1 zOIo+}n75P9sNV9t5t{}YnKC#$IP@+!A0}!;8ii~793CguD>8SsVe%*@;m}tH^w3DQ z{c~A@F$7`pof?R0nVlXC*;ZfBw+d4z1SU}I$oY|xSUce9tVFB#*qf$;?1I1eDZoFe z^>LCdM%Du$1YR~y!iWF%?;mWo@&&WSJGqyb9bZU1yKS+aeBw|Iq%U+)9WU?KgM9#I zmnA=W^NT-^&KDePusNw76xEZI#-(SgRM#7jvJcl#ps#e2V^0*>7L)gsSX)uWmF^#3 z*v1j&Dqy>u6(F`(e6FF2PmoO)oCtO9mBnz5u}^KfpBJ>Nzr0(_zVJ*}Y4*Ax+P5e{ zA|(;R>rSX?-rWK77dn~`d)|y<0WE}-p`PB}8!60<0#kpIx}ur-Yh?4l zKCDQ|sm}WN@nh9*YAO0Nd$0wE(HXv<9>KVpPYwN!4b9|lX3FoizFa|0_Q;$i2YX+A zNl#b!i>8w#vw|w2?YyAI;y-FkKkOXMEA1RjVoENmlHX95+(L@~U)FgSdt}uv0~{6gV14r7zwfKsHg7^b&oQjt6`s3OW*6I{Nk@ zQAgM)2HB2ch9ob4JjvTD57{0GnF5!p$g>GsET9?^?t{m{5jGaUV9_tZFy5)ioDN*E z4}9exa&L@xpgTnWg@PM?16tN`td_2`&Kdi~zkC473(!TijL{7I1x}3t8QIe8ZuDeN z=@+vOfDFU#b)OS4}0qfze z^+}tINMM^nB00RjbnGn?A>*&W&yD{y{HFV6_HuPi0LnPPK;Jx-k?|2FrkPN^X#(p3NxOYE2F1tj>Z~-On!zfja-KEUT%`;4X*HQgbpnx(` z?Rsb9hckoe^`y4w_aBTQfwzPYw#K7_r}zf)3ko*9Ti#6jax~sJ)i7hW!k31#SzUipqn>$^w&#{B*5szn>kK68 z;IgWiYvHV~9`sFc4j&)dSecWwQ`uBF(I|?vq>br!bJH7`eBw-N3S=WL>l?)~SHnSx zI8=S+oUHQ6H?H1>86c>s6~-~1$!M0)4*H`c1*%wn;=y;-&)YNewH#ee1&c+DenaPe z3yCN%b4-S{E{Aw4CbL%}*Aq%^Q@TxpEhk|O7MV%cG#?rSTx*Cfv4tUdedui*?NWos zOZPCG?&{=jA@lhgm@F~@S*yQ3c*^yLMH6;YZ{8qk9NSjy#nFbOsZ;s?gqd{`0$z=Z zb!Tdm?Bg-#2dVYGr(Y{2pWo)gxrsSMMQ!Fq z!k`7y$GGhC#La@$=T&OCO~lPYVzzhfpX6~020tg)J#7}>KbsRNt5KSc3evo&r2mjQ zX0M1*R{UC}-G6WVnIgtO+;pHHXgYb@b%VZJMjIo;RSKOe38VFI)1&2a0QtdMJF{O> zrFS0^8sdVHQ{H`}sq061|gjxi`?>JHPG?L4Es%?wkdd1Xc;e&KXAY{G%g-2A_p6E;6pD*>g z1dQ{FFxA+lIa{B^L0G$JU_ivbv=7;mpCoMceRGMIL{+r>l7)d8FEaS5DB!|iaLscR z_*yGNiqJwB8433iq5i5;e9y?pLfk-^U0!j{_0+Flp+A590vl`*U6Lb)EFq8&T-0A6 zn97)zB=(*z3y%r=&5o3JyTNZ)yr{D)q{Pi4oL{nK-ag{${O^d2E}-LQqguxva!jjTR~8e zv^5p2=k+Y8=;Q?Efbg)emj~G_&pi}9cTTV#}4=Q|;hMk^4o%!A2 z`LEydxqd{=P`5WH&6NJr1?@At$hB;g|F{R(x2E<+^;9+5Ve^~PtoPx-v+vo5#V|5C1H zMGyLI-_-JdbIrtu3*eLI6_%^YR208QYs87hoEXkfes{8 z{2B~gP}dl&<^WcHuqA@<&pwx!9AHE0gBv7kc~jQGv~%*r8(b#rL%o_nTeJBaDTKaF zrQ@56`@!3StQzGF#KTyhBSNu2Q@llc5FZCeelagc`(oHa@J(A~?Blr7Ko3oDGgeO% zeSER^7ji>>-CYWFybAb>t8KKJ$_j{ncU5+FobjqlOPx37VK1GwZS4!8c&kLnGX&X|~+K*z2BJHNPsa86@m6E=Dx z9mD7E$(g=7U}P~fa$plPh_2se4Rp*c+{jnC9{+ggqZhBkW3G(>Jp475xy!DaaFd>w zJ-VKF2fqNqGzpZA%Xn6Lbb1LI-kb4udUDFn$!k1UC3R=1%nEIw*D|4gcK`b&ch*$tVY&(aQVf36%6}`;}5$Kt# za~iL)8|Ib_C41mMl?8r`pIB;#4R=Dw6>PU?jkPhXnujlb=l@VESe%ZU%cM+hb(wGs zQ_o(8^-ipBGk3>?g|`OIw8*sXQD_~d*x{f(&V2gsQ=eOE$j_0qe0yNkJFyTTv)q)_ z@Yb15XYu=H^pl%ZM1v$4=pv>JV4|9Snq_R3*tbh%z4*(m+zh^w%LwS*_qC93FbBig z(91U`1*%`gj_*XPT$I7WJAbHAq%bHr(VBvAo-bpoE3){`P+qbtJNxQ~8qG+wnyI*k8K8 ztq*KbYBR^=1oG7550)F<%y$p#SitOF8>nGkU;Xo!O@A;_r_PFKRfPxR;72C>!WwTKT+KY@P8O~ zM$WM@u9y^y28F{vn{_x;VT|TY!o&jnIX4&4JH*L`HPxC8<5Mbp#?|_M_?s{NaD>Nx zJPa%grQ~sPM^^n_y!^yadR}R3vDv%=oh=>k$1kR)VfrrvU)#BG|IvwIH=odbL$#tv_ z65BMVvD@|{JOB!6kjLu$D}p5jGv3?>o;~`oxy$&AQc0&&^q^<96O47k7I^uS0L!P< z#AbP}vJ(jb8R`BF1at9JBq1G; zrPx1iMQ&HK3X>aByA507!wi+BIk#d%AI5->&2o(WNvADS6oSL-C4;hs%9yS!# zDDQiIshhxieQ}Qy}$p;rgXE~)OT9Syzm+ry=| z4tE{Dxp)E%IcTP~ypwGuWmgUhKpP|>)j7-XxM6;%MH85nqprYivh{>bEpYKtDE&1j z%{mH=y4!QUqrPf)8hK0n9y@N8Es%3bgsZJ%1>Ldk=T#oA2hy_#YDnlMg9)3zJDLW} z;{0aa?V79<_PGs=W19wPq$ql^Uh2EtN!ueC9tv~Vpd*Wdrq|V3f`r=3our$GrM~Iu2tLl;oAR=<`qOVKb5kSaJp}1%Ga@~u z$AQ3a7#73|Om&O5v>u5~|KX2r(5+sdUpoD!uPxwDNxNNSU4lL2^2XfJrOQYs2Js|qGJxVJ7YGOVWyEw|Ww zY9SnavFfdAH%Wjo9!?YUoHYVFo2R7+%DJG~4v*sej#R!(v5 zyfqXK)Ku5jMppHiMUlMS9VM}I`8;NrjZ+XM>UKFJQ^tA;3)0&SCe=UGaZ3wO;5_7$Vhbra@6DW7XiV_6Rm@zPQC_>yBa1p*=Qj)0hU_YC9S z_>s}bj;9Idtxp<8o(cGacrb(LS8@bjgklsmU=+!R0tk2l!0v2tS^n#9$Kn2Z`cjr0 zCP@=eZEbCB3-ZRV0)b0l3%Cq_6dn^d6xHNfK%%$ESx7|$95IC~Z2>~>ylPqIy(iv@^JP>S)~OTQ9^AZ2j)zg{ z9aX;m6W9AIYC-Rx)TBvZ70Pgr5Im-fcO3V01*zWsLd-`iqr~>ct1cBqSX}wCO;_Wn zQ%a$n=AR7xvc|{d`-SBv03K6ACzetdmd7ONqpdg(W;$ehTRq0{Gi`9y&}{}2iVo)L zA_%cmqw07!9|WH*J=(rm95E1K*u70`a^y-~9@PGjGX$X_b4eT0iq;}L zIM_EnxUXuNN;;A+3u?9A;S$lue*&tiYJXpt`L{zti+nPgSV>~d1N5cPRH6TzUj9|e z@t@A>B)fk+ng+P1gV$AiDg8-R>%~&|N2`9~%#Dz)SpP~CR(WFclmQ*XH$8HZUM9i< zyz`&{{)rpg3wAwg$ggj4tz>vQ+-g6q6G?w$Da_J*1HqKVvstXX#f)dT64-lZy?Jas zJ41s7P_IQm;XetM!Qhpi7D*?b4<>S+JBobcb4mcww+lT|U8ws>7M7H>Yu#PY@a3t4YE~4_ z&-X=DI_dzv-=(JCx6-~QvKibUHD=JY0uyun5s7K#)yr|K}}fnqlIqE7OfP^TdFMew>tKXrLm~6*b2_@e?{U$zvkuUc-YQbbzo^{F?c(7 zVM3Y`8wEfDATNqpi=pd$AAFg&RrzMSa{4Run^)e09j>&9Q~Z^*NB}tg5ribg3CYaL z5<&WkH;T#6w(JTA!9aZrCKsEBOqI2BndbRLXFO5K4ubxtoamZ3$=tn$3M4&F*XDbp zU(7z2?YiR(T~ni)WOP2q88^C~`}q?cpZft{w~C^@2d;t%@XbMdT;6R! zvof%Mf$YHBC+j^iDIn({L{TyEFL$-U5Y1jf+66kslL_Q&?YEVd7kR2VZuCvFKe?e)~&|i^|CuFJ}v@vWyI)k zmo5Z)E$(wp5AK4MBH48-_0e)#I)N?Q52Q$;+f7hUp6p7`0LQB2w+F^s+7=mN84Xg# zndV>7$;JLIi!m}GdF>?1^iVMcs%F?=3PFY(v^v9UVmTJ{k5(eAko32YKUmI}AiKJ{ zuB#h2{=!B||Ms^yI~HBnQ`ZT6UHqU;`CIeusc5Um-Q{8swqpf)NhAxFz4X*~;P;)i z-1=O_dHZXo)~`4Aeiap`q!}Fyf6|K8<3F$1C;F99lH z%4aYoe^}LluS;51vk}E5sxU7*o2#BkWk=-B<@gJ!Ec@lt45#;7e3Syq;`P9@mLfmk zk999bgeir@6AFNgQU_4DOYuhm_}e9X!`~kS4!vXqS`5YvByHM;-!H}&Z%6BXGqlaJ zAqO$mr1H`vCykFIJTB1SN|q=US_n8SD^7l}J(}gXJMj{Ph&es1i=qipE6iOKK}l3= zo2ivZx$~Nkz1D8q!C(Fv*k+_3_K$e_gL)Tlomnd`S`EOhHqRrNgJ`9e)ag&gl0<%1 z%8vm`4aWf974X`KVm$wuwfy(rYa{`?8%8B!^95RCUBX#Mw@VC8Tr5kGzd1XE#U;;B zIcy^!A0MLtM9+&u_naN=*D}BQ2H^B_N0gEf5B7f?xjM=pc;O`TAr7f+$=%cfJ2K67|jJpPwPk10>AzN-iyrV z05DCOqIC)_DL7>QaH~~i4ngt?2G$VdclYnN@k>2p?|Z?m3Oy)m>+;V>2Oz6e|1+Ft zm+=XSKPwq2;i-^)>2Y`^9|!7+OIqx5AGqKPp+%#`s2#Fi?DavSJr`>od^TPW5s@Ho zZNHtT^LW$RhHr6?G!W+??)sYux_;PL~FNOISmhK(8zcAj=s4Pl~NzO?2 zMxTP}F31P)($dsCM2SF8KN>CM&Af9ZJnQd=kC1PV-;!>sUot( zLW4RFm3TQg1l~C9&yctriMtJ_3JI3Q)EbTLF@@oHNk%hpN1M2Imb>J#lB8!TB*+aM9}T;9*$@2r;(RR@Ufy zXjm6#6s#(LScAZSK0I&=EWO8vJ$drPuzEj`M39v_TJ5;*c&awi1 z@eD}80zf1%oeNk*Qh(w7;E(DxI>ZtynsXL~=b=}6**oWIlzyT}lxiG_jD;1I@gut8NN_b~ zkxC<8h6)2E(Q|bZkhLQk6C|Xig+yR_sof*Y?7cicz=P=?(yHy|h9M1V!Jx^j`GoCN zpK`1W3qM50#Kh#(3qg~_v6Sv^PJYHpl)NJqTm_9dS8HgAo0V}XzaHhm752}Q? zyVw&?5%}_q(mLtRAKwck`EZ1S1Y+SDT!b&zwo`^~vr0``(1H%}zhu^~HQy(nC2Cyx zkM$nGB0(dM*p}gC6LJ9@bKumlImq994z{&^n}Z$OO%xTBy>*119!y*M?NqD!R@%pk z^Pb1Jt^(?+Kjb*|J>Sgv;7wO$zn^5?v5P@HC^41@mid^mlGaBg{Ud!+bvN(shxfx7 zB<~@R(tde#CM*tTK!zp6W?jaFs;W2M0`d=wA_x)j5fy3sn<;?X>XyqHL{bo}SQOwo z@Dz4NaJFyWz8iv)dzblOFs|L#;FzPm3=ql z=wBZ8+ie?JD23-K1duc&z4)APPno`^fig1;7)Zh(-GNsoJ4kmBA@FOrinto_O09$n zfKp4CjKU@kDo?p8KGrrRfeidAnpbHw%Ns2gevM&wD#l3qEHTJzw2bs9={|#5_vY9b zk?*E>euyJtV`IiULp$&v(*vM_-);8pF|-3=XkdzRlHlmrOjHb`|P_+^cOt;j8D>jEB~<9Q-V0eo}xP|hj&2{CM?7-s^D(SIb%sW1}D?9y}u!8B9`qR^sM zH0Z4a;00^S^iK*48Y-kV71}&Ho#C!xYtzei-!KV5j^xdD<{Z^2dGGZN*64JQ2eKe) zM*}Nue_t4cjWzlP!jLH%*^GydNmJI5S2B>k=0Hm(Mh<@_eA8zEkV(0K^h3#%)lxbU6U6F_`fZe02p z8Wb3w$Cs9-ta-OH0}{P<$HgJ|lPsJL@z&1z=Mt1$PGL}Ro z^xKExw{s7F6xP$+yAUlh=dW8-tR^1Tsl~_-#Kb=NgISjP-z>|o5}GZ^5!vFj#dp0) z0sIk&(0=LK;jX}7@+jUwlvbclBn~${Thjh%=j=7?Ykfe?R(3~-LWUe6ity-vr@_$c zt|reP7JvOh$-n7ET3OM{WO7~X%N~Cgf#Qz|*M9zLx}fKy{Mpr6?)A0H#PwMT@~yxv z&7@Rea}ayzY|?fFpOx=jz^^sbHh0&gHmF8}t0Ho%xWHshW!xvu?3c?3D-?jLc#&+I zCN@%gZnxzNpM)0}OzpkfLIOe{O@SUkE)UKm54Yk554i~Kz3`jx`1ZrWqa_3{_ivin ztWWMHSy4B|xKgJ40!z#JpU!$vzm!Jv9mW^**Z-xYjjM2j+Z3fRexPo>WSUcPs{9mg zeIPsc+TZ+TNpT(MM#fH0aIj1e=_>?5wzG+DS3Bq@EpJSa_4SMi9FInWDSCJ^D&D^J zJ2U-s_u@aN`csE(A_6;Z(39|Mt|E>#@1v>Wrdl8l`g$Dbw1u29l|H*XR9Qb@Y25 zRu-c+=90UsiN#4#AZ`ClwbKF|5x{7}s8+(<<(KS5sdkv+wT*o8of&$Ydth>TQgX=B z15B#J`A=ha(i8Xjyvd-ysy3}OC*THE3<^lsv6T*6?+%@4g~7(g#xi3We}KS6YbC)H z%+NqvjeQuV1VV=)Sjkz8TY8U&{VGidE%*Pbp&&R6T~VMpZn&0HZ^GuB_dn<~Uahbq zyI&mkKk;gno<5wY(Ltv^!4LnoVF;rww!_PDFV}Xn0n>oSzXNf0j?fja`Qk@o2bC5F zYWG7ZUOasjkcm*qA)z=#hz*7)v;|lJz31P|O-UB`uq2H37~ z$=aH$2YaAP={@+XPsBOtY%zS^JmaKSdWZ&48$Vi!FS1?)$Ii9hVXa_VGZGUMTade* zAkO#ntb5ela}#*k*;ec^Na%-S`a^h zMU-|oXMR%?l7^-xJ4ZUzZ{#|4edB7zLzRw>J}7O(8=>ajk=}1+_$y=#UmJ+5(So;c z|8C#M16TF7-i)a8c64-EokcYzUEwXS?tP4{(ZVH5rH%h7$Rc3iv-i@QMFmLC0_jk{ zz9cgLAm*hGV@J?{3-~G3bO)9O2Ib7_oJ`tS=bQpWbzcXb!TTdbX@zvbxpz-2(3bzC zRMTk(a{$HK$Ue@%Pg%j9Ubappy(TEdi>?#F(To#ZZ|TBU{^RjDh+73F!PH9)xzC0Pupy zf#e9nKun#$UTG`*01huh@ge{u-T?%_-(M8Zr}Yq@U`Srzpc}x}rhJ77JcTqF6+2#; z!yYbL0}rPB!N07qx9vB(Eqko%NqF4?b4kE)AUE6}Fb9y@{=NsSBeIZy7w%>d5|b%7 z>}O+Rz#&hh(xXSnjqb$QjYeP8x(?+&v6mwgycAJHA*M(93`C0US05qxhXu}PG)(oA zf28f(!%Fttal_6ATy4^R>@6N$B|D@oBL$=#&YIm~uYP$_De07M+SoN$48|pJlOe77Sn52{XsFL;j<3~ejm5+u}6BC(1 zlM~N+mvvkU3f+A?c_upy$8pgES8iKcVOkG8TCPQ0Np%GUdc$pnxXqVVa&p0x_h;hV z?F7Ie)CU4!O=94%g@td@{CxxFfeK(=UiNdU7d4}5YHmq??_<7`9JT6mPR?46H8-nm zf)6TmmbUh%*JJ9`rh03%JY4ZsHSnsd+gN1e#I5BO+%D*eUFt;C&FJ-EVdW!Yw`d-g zaoQ5~F}%P}0095nVG4aJ8t{|TZ%SK14geBEd%4(xg6?B(r)Tl)Z=R%#JBHlyisDwn zB^;9WIMo8aQj^>NSr>cVI*3~g=c%Y59>)#UZ_OvCV&m~n5fHGG5X;&49yK-yyE{uu zFNIBrt8h02H@Lav6(1BJ6o4s|_W)>8G=T9jguG889{>%yd)u^+}Wq^shg=1#s1R+(ITr_)?W9hQcv)rb%CSe!C&f1meI5IwG>35#lQ+vkv!6s z?WXrSe2>h%==Ni26PiGIHN*?S`|J_k~fA zVel(&zB9L4p8nZd2B%f7jD9QNhAA|`O_(bs5%VM_hDG-U!{y;HgRFjd3uJ#}%DZ!u z#IB>8#A$cC1CMwzoE_vaK-6rt);atrJUpbt`Q2Mp+Nz?E;m4fgVnZg6rIWaBq|63(h8-`z;@>n@j*ZDj z|M_!7T$uOk^WNA*gX^!sql1U?@zs-T{s<0JrsNuH#rwitd@de5%B-w2?rL}WUJ5=k zEOGRXGj^klZ{J$p(!pL)3*s@oko6&re(`?R53?-I1V@m&x+OIx?o~R18u#I5n2qP{ z_TKy>kb)Xr27}Frgb1luTGC_Wqmt+HR3q#CXeIA{WtpGv@87S_Vq*y5T@dx??#D>! zH{t}K!yp4zu0hw49hnGQMFz%Vzgo0laHdv`^IKRt#U)nv1O%XSgoeD!tH8y5s z@Hacc@2h_Qls@|NT0J68z*J@`)@Jeail1NQldAGvS)GM49~1q>eM{!pqJmj?(0r?G zK#`=wH`C7INTSuupG0?v0(c9Hs*8hcO4VlKoJHq3PN`ph{<6kXhRdCZ{Fe(mbD@5K zFRkr{tpb}RSJu~4PWN9Dj1+=#n1HTa3RXS@Ql|2rXsW>KD~^gn-TX)z^kLZ0!GZJm z(gwZKbl4v^sitjU)}d{&cu?&ccInu-gcWDQa7&!TKsizd-QtHKOvir!qM#zo1W~cFAp| zzL94j!4!FZf6^c=@>x;b53g!0CA-B++~>|0bf@0#LV_K>x}FjI>G+sPNEvKw1Wb~E zLW2|QN58<%Q;o{@*;(RG=jT$Ukw%9UyJttjHDBuLt08HZZ}lxKP~X0NqJNp}T4p&Y zK(^5MTIMk+jOfLSEA!f-{eFV?$b4J-9ex0)C|tNLN+J3J@zV-d%q^A8Z69el|Ir*wHS$pwZI>pri{LeZ|gr#6@8)=f171&!bwWB4wI2T zIvB@$f~Ci*eVx8`zC$@Nf(YptULI(PY7ZcKG1Q6kf^_CLhyQj-^HZl@zHi(d@}+O# zLL8NHzUa50K#_QI@|4s!Zg1>qtmoz{8lRj;h9e{wQa@8F>SzyQv+EKXHrG!b8+RdyP~ zaP`x-Fi!sZ9=cwvfLY_s<=zpDiO0lH7dN-gx{OYP!W1E@h!~a(EiS{>K;RBHv}H6F z5FcQr{h$k{e`thhfF>$=M}Q*o_q73~1|m$lq_>Mqbjhb<(HdZYYljrZ#V@6LQv!Tw@N;BBpwX&$V_ArjL>pgennvii!tFL3G z2YOihrzbiy))x4Y4PwwDApHTAr?<~T&d#xj?}NZ;uqJ{{@JvG4!IjVBCoz@aI@Z;u zdfU1|Km_*ykQ$c#)Jy1bSh>l^H$#z4n(w=eVJ_^G*zW?*y(m{Bj~O2xaU()f-?$=y z%_9H0IzIEICgK?l%@%xGh6f6rilw$xm^6J?_FIp;&b6QYZS(ziNd++=PcA>d%r~1iF-^ACu>rKW zM`4&8l#boehtA8AGI>ea#*tJO_Ai#Ic1YQu-B!M0mmK`AK_Ttq%^Vg66=L@2nRCO{ z(V!jp#Mtbd(L4yz&+ZcKe`Xlm4wl+x6x71;W0PbkFw(2~-Z=sD4Py%$~dK~a7Tw61| zJ{#`Rx7q@xZqfdXX(mP(r#W9=Zi`In{DG{L|e zz*=CbrzS1&RhyOWESB2UC0|rJKCk$}2H*Pkl`Uo)8zB7eBZUL-i7%dTl2z@Hr?}>r zn$t#dDMkzQDr@k+`t{qgxNPfS{9)Wt+d$MR&jV+5FL!Hh91Zr8RWqhJf$L?~{aP2F zVhHTzXjftRelY%-m-A*CQ?w2ey|n7Pu6@)9!OsEEr2%S7ms^stWj?Yn+g4d-=!;j4Uftb;k-X$6##B^p+C`)rs^0iXPbqKDpHX-wzEr!@!K zAd4^er5hbyz9(3bZOMJr{UWu9!X+o)^~8)aYqav#g4L(zQHf{R%`mOb!%h^U;@B>7 z0QT9~cwzRKa`+hs_S3>s@v}6=bHdcpWi*q@O;D0GI^9BHtWf@QLfSH?TSeQv7bu5N zKbMWszt!&I~*7r}@Ca3aM3f|}sj!!)z;Le@4=Q;rk(;Fr=cHC1$@7|^85BYf8 zoldxZ3knMOl_VLFnmV+PC~YC8efbh|uJ#C!3mejFv^4h%6cl)6VLl8?Ek9|YMhk%H zd~xtSp0X(e)1UcQFY}q)1UgB+;BGc+rQAQw3>9Q4uYtHbIG9fr@k@LUhCOyF0^=SS z@&0`e$$*WW?c@?0hVA_q+`?36G{%2W;n73F!}aA~lzzP2Y9F&^<3+JkQjpLvG^|jL z5HZ->PA0tg#-)k9%P4yb0?L5zl;eGaU3yN`O2;ogzgUC7cJk!7sQA=x{CdJG^G~({0I-o+ zX0zy4R_lzSMN;_e+x}-;^Wn4rG|8Z#J}s4xE!q~dSS2-dAB2OTs?a2glh~Mot8M zl!a}7QX3udeCC5fz5+)G`KTOWv>D3lj zAyKvGoSA-M&f{MXMa%OFVraN7Nnl4r{nibIJRt!V2z=l|!Fawo+t-KsiHm!--!eWwC-fWz zI(_R3Z-NlueyzzX@XP{*fKFSr)bLfobEe7q0=;#9wllf@%%C%emCd@F<=E-!dZRca zvM%+L)i=V-_SM(e|IfSihOGP3n8JyPkL(5z3_4abdz_DM2Sc(=b)S<9T&x5DiBVC* zlC@uW#No!UJEzYlOrAlsn_Oxd{Fgkll(K@U%5;pqD5Hs%1=X)E92|YP7O*)v++<~( z@n+9xUWcr{ZgAs1T$rnV8I6w9Ykjn-3LfRt(fVq^Yt(bUzB7_{+mmE2>bC(_@U&lx zrZTV#z)Q#i?eXQIT6a96#Uo9Xir+qZ3A_2lt!_!J^C%j7IWMB{*5bNCOoVW%SGq%q zU6PMA_junY%6?8?sI&J`KoMt)n;52!fOFu=3h~OHNs?~)coa%r+d!iiohxpRIOF(U z0l?=IOad6)qo|{tw)LW(fgmsUt3wfRtBCH(smn~WUyJpzp~W*P#BnFI;JYO zLhG~34S?15znrBA7=FbJl)sz_n=SKiBI0`_Fp}+}C|n}{%$ZP2^yPCxyprp#_eySW z_g%xn_KgOUNR5-?n|e7p3p0PS^OU&h>njlF=4*V>6!FFcY93Y7y}&uATO8W)Sgx*G zP?%5HsjAt%nEL4{*8`h#DGlOUC|qbosOp3w*2~H$mA~ywD=FVer%=5x8>n#GopC>( z$E3t>i}E!y=ZFAzT9^TSPYQH!X(&y2*JlfvIprA-x8E@(2wZULB zd*xE|8L?lI@0yE$liIARy5|((o)rr5*C19nf`I3USn#-L;3V89je*5Pu1A+zT zpS|77w)dayjxmvN>C6n5Ubep;GlwZ{D{` z&GhI*%?-4Q{oC)UONxqDK5C_DS&M{(#QE9lQ0rSYwX;^!-!YEFsQ%${6m$6p0{D`< zHT%L{M`}u|zp@DVe&}H4a{TrjxwLx8X1q{{=#%?&$IT{CPJK9MC}5!lS+7aE znyLEMrF3)9T|y1=De4CzMy^Kjn-UZn30oi8olgE@r+%n!4c_>G(Dd9~bP%~^v-r(5 zQ)9%dT~8<%iok!`wixqq4%=%KT&>VQjmaOWl8i2`x>;e>npeqQU96rPutf{5&b{^c zc6pDAE}TrD9~?5!XoD9o@pwUJ$fub)RMSC*r(TUc zW}rO6$n@B4|3|f}*vKHM{G^846cQ<^T68O`z(F34xt=5HU7`PX3DO5Uq+De_q(&(r zne8CnxzEUuOpAApqBs4qbQ z=dqa*oms)f#aWM#kh*y^RWgdh_38Swpu_?c_q#t$+}H(a&X=$sLBG)}Hd1vw54DS> z5otQj6w8&qw&h^Y$v3Lxh+^97}U>+0%! zii@9I-#G{9Hs7+%KcB0%M#ySO-b`XCj~`6-AfTAS|2KpEmOs;PMaH*vZ_94ywN6d9 z5)RoDO}a_5^Ra@v*Bs&mqRWDh*BNPldxEl~xM(Hvdmp;UCUm|%BRLVK8_LGB8306T zY9d{|H;W?IT1rHn93Hii>{jLf7GAgv=Gfspo;xnH(dupKss=;k3cZP|Uw34m}4m&y6WRLgj=mNS`< z8_qxi`(D75?yNwbZpif7|7Sc?TkmBGXUT0t^%La(TUxdn!dK;K-BZ_ z#Gb(6u9L`K@vn4dI?vDJfpjQ4zmE)6ab&Hj=Y>OzNZgohMD$(qxN}=@ry5bKPQ%rP z^31_Gz8N7+Qx2B26k<=teyRsMpFgc6ySx=;P!H$e4%c`5*S=n_E5wXOt-}J+ot8x@ z_`V(tNDkODC0W=vBFeBCB!volp*L=-m>JVi1=pwmajyJw-F&9#OY5Z<_79VB$wa6d}ID0-KApsQ>bpI%WalF?1 z2*Y-f0#90s z$Dcxk5EWVR&uV0NCqGC-b}%!Ro$5D#(3 z#i0#NZq@Vn+Q5?fD!jD+I=SQ;X|FU8F#egp0}`&Jl-k%>w@psQvLoy{D)gMAgdVaS zzl7Ib9N$|lT+^!8*mJYo8?n1Yrnl+p!k0`=ZHF7bw!)D?=#zr`-yszZ$j+EC)y=X? zcAUwDv^hn`$pCCdzicv)0qb$q1t2{?o-c1#yA1cm`Q6r#5%ZC1L^%(Hh1zQA*FCL?5jFObnKKhVgv=-aK@2 z%2e=7{Q8f$7(LbZhO=GW6XxCm7y03XEvA&-d{=1<%^HpL9cZ)$n!$%Enzrxf9CeQ) zamb0x-ZQWxe#|@jtY3yH2pApWZ>FVUM5H82_UI#dalV|@seJ%`N#in<)Qqu;OE7D8UxHr1Q=^~Z_{;^GNdM~=+=8=hbTdO5fj zhOHjg1O>NdgItQ}FbV*p`94ibb~!8&R^nFg)+vXe);?=3{9;vSZ6ZGi&3epi#sEkd zl(!s%^%XVsaDE?YwmB4f8EZN?V}yez!TWsosI@>+=3TKK$O_b9>NF8G|1pbVGRpt0h#=VJrm zyI;5bnRn~{LOr@_QcSS>>+f8EewBkWhF?lEFr9_KgAfku`7MC(zWKho3;!3U4G`WO zMn*PB%3=5v9p~vGqnp9^L9Qi;>U*tn{O6r!tOEZjJsJpx(B`m|S}hB0I=YL6(|n5lztc*wvi-_7l@lli{gU;*xd2I<$l?B#Z_+1 zUoKzo-4QU@%ofoH+~!_LTR;hNJ*2IM$C`F(;_;#8498|#q%0=`P}gbbu^x{I1YxA) ziwl#x-R&|Rm5(!8iwk6(u$28f8Vj2tCnZ(WVJEwE45irr!a>qlNMar?JN&l!Ks#>J8ra@HF=BufUDNO6DZ@>x&ng zu>J?7_}Gs~Mnpjd6QPD=FjmqqSq&^wu_3Rs52Uap$ZD49yMc&uV|p*>er=V>?Q0xf z!}hXrA_I4Gvgcc|?^OS|*Tw2VNK3l^UO0&M9 zg_nm10&SIJb3gowq1zHQnj;EpL#^d0)0M=`{IfB}FUwolpOA-16WJa7`KhX^mH$5v zt?IuI?Xjh$?glrebYK1c#8)Z@N+imL2e>lCt40#LM6p~&IS|=Hy#4T%hkkS*`Ug!- zxX`?9pAJM=blK>`AS^CgnVkD>{NSKo2QIj~TTyy_H%s#h6ICvB;f{5rt~+M+=A zdg0_m{5eICv+_ab{G#4;Sz9j5V`M%_XtX=vj(YMLDX9&>Hvh}-3FAu*H%T#uTn6M1 zmd(HOlk^^%GI8e$U@Zp|-1{SeU3LP^kEfDD^GEN;o8kS3arU8z_@lYN%B{zqCh3#+(5ru&uY zQAC7`BK`$7Yh1`cG>F}HdcPM>AfSzkU%L}>Z(kSjeG1!He%dy^N|&xb!N`b%W2}lC zgNlwUD2RTTYtnW?XJs&MsBFhG{gmug@Rq0nWBz1E-~@2HUpdj+SI-z={OtGr zYQ-7dX;$zbsILQqo9{X%Rf{dg-7Pm~ZXYN7P#ys;v2N4mLX; zo;W%7+5vYb}LPR8dpSOAI?GVmB8jT2E=o0cV} zmo6uJOT-Xh))^E-cq=s7n#8Ybci3f2Hj%Nc(LkEKk14Md8^NfoqIA1G-S9>7`1&NF zRxI4JNl|8BR%qgNm0ZNodBN$aE$M3wv>%(SUK58x-`&`LlfQX9<4D}*Tpk$ix9~lh zcKyj2; z>H5ty9z+(T?WNM0E2$c2>hw}9N$NQ5b@^D%F(SfCbfql4!WwYVI&I2yf!2$My6A7& z4C*ZW%OmN7!rl=lR!Dr#+dP)ruy^d~nbwdBDb2FtE5^DJYm99EDnIv{A<)WZ>mA&P zWCkx@4Hmw&%}Z|zm?s!(5|IFDX&b;U>Kw8yEr&G2`c$z!m&ncW%epGlui2fC?;CKT zq*MuFgD#4Wz5;$mXlpVvzajq{INBN%MeSP z$5hpfDOai6y2sv{nr8bOe~!>2<|OgGdM=b(k2TFdHRaZ(Jn#yfr4f$!VnPm`aJ?EA zk!anI3A*pMaLBP-jk@1mgUKYRGjiAyZ2yP|f_NTliaLT$7FJedt>R+dX_Gf@!}q%x z7t>}yMLZV{Rd%7fs=Vl*pFbLVat(~Xbl#(48(17;@o_xG=+J8XJcz(lX6@Z;kM}G| z#k2QKY7|p)cpc+bQ@a)bm~n9rW8?h|&j0J@6_kH%kqJLS0^A47?QydB{Hd=nqIlRaK5mpJUL{#n2l-{I$Ieg1~ zRgDG&hjlxY-h^tmYPT_Y+3d+REpBZ#*Dw$zwi_OpSQ50r-7tYDNxpI|rHbbhV_26I zWF2owf@kkq#B?D}JGOUaajU*|~-hF!JrccxHN~PZPtxN~{>L#5%rPk$r{=FreYt^>jU;pTSxa zZ*sA$4!e^H?52iGV|W2FGm|dv+r#YkW&f}zvwND=w@)9>9B!Py2iQRM4`DNR{x4w4 zN!JjP`YJcKe|P89joZG7TF1sV(4(w4bF2>NLLXGyR2N+<8f4JxDJ( z2r-FUe^UKIhx@XYnW=dxujuru0w$!=yLWgS4$zvIKrJ_6nu>zAB6pj&D`MU0xmXzg zoVcQYXBIOk$4sS?>Ehd;<6gerty#%M2IBl*$f$Ap8PA)xaU(8S5eD!qO=sf)sEXrs ziE9(2t^D#})@FD26Sm>G@AvlHBmd}V;I>Ttlk(}3?dB%c+3+F~TjBuE**uc4V79~V zrW#bdDw5hduV-FAoM(ZO-~N-oI65>!O##JfI&Os5oWy!WobrMlErr5)v#xapiI2nm zOYtVGr-C5tWXqCk^jA`s-L)dQ-$^`d&d%;&R-Nyp45ewyhPi$uQ`GLlEp>a3)4ff! zQ16_<>tv(IZA|}&@PS&SL0nZWueZN7x4TvCs0Hc=ST6{r*EifgbZ)4Nc&}qBB1$oY zZTkA5EBA6L%V+WzD_4il5?}@K&F>8sCwNwFJd$5XN%5kh|BWsJ|BWu@X2-i?-VU#B zWX^b?PXHMn3rOK(?x)=Yc!wH-B21$?%r8t^VL{c{*)v?e*PGS`fqJjI?`aN3R_RN@ z^ZWGH*YO7b`Q82N+ndkJx#AE!PHvMUtJx?kIKM1l7G(t7a6_`6Ec1T>fx}ATH9mf& z(pz@-7q4?-vg4Y(#OX^{d;c(EBsP0dkM>YaZmk_)FDd^JKJsNRGdl?bePg@p-p;7k zBr;$_~J3x9vvFat1m4y zY;ZKtvtCLz`s)NsNJvXJoN;J{&Qg?X({J;i_37>+vrIATo~2QKKG-bR!iSowGzFfY zIzzW@bYFhL$MsFk^3{)kV8`|S?lk43TCON9yY#@NjJIOg6&J5STpUP%7rLfRr1iuR{-VR>mxo`Id;O{9%b z0=K(4-?&618LADjJAe%$tOP?}2~o=~qEh=OK%e|?fNsn=D$Ia@xob3oUf%aIo+~fv z%F^lCd;DWEJZX9pva{9?+JsI_1;Q2elgk`g6@JgLtuRhLp(i!Zvv0zJe@suWx3s+G z(*kxgCFJG7yI9Z~Aog|RuP8f}yxNU3nN7z)+IFLGMx4=zhZBdLv)uoskFj_WGxsezJ96 zWqj|$8>;rXTw5-wDS{5P8*~wKSfy@S5uQ0#Qoq3)_Z?$(iy+NLCwBP8uq|=|bavcR zcRM@W%a)ql#;3_X%K%i~VF$+YCJMgFl|DobmEJ?N;tBH!abH?8Kj_090;{}#31#ha zH9~W2rEPw|)Cf`hjwmp-Hqq^tl@(*Wef#e~+(=bk3u9Cj5HNj%>0j`VzcBo-zxdlU z+T_OM{j)*MVllQckL9YOo}Z34_$`vnZXa*atY^X!?*1hOKR7W6((DwRLB#Sy#n7>T z0ZplRpZupff16~QO&PB~?f&5$zSEaOR4otqA#z!+^?Yl|^&PZy@Lv4p8oYmL&+ZV& zExbT>WeGRAfF|?bire7>@VUTJ-D|0Iy-J`qOdDjwAe(WtQr8JjrbY}FTi&+8Oe^Atj7{8Yy*qq5N)EBtw*zSPc_M_Ioc7njCTj3TGdmjEzJ@UZ zs?*#y?6PEMr~a=>PLrA8@~!(yo3>@iu-Nmr!NaV71n<&fbufOyP~M*m+(bMq-sj3E zV>ZeT=rEe9si8LHpB9SpS3Y}z?nZJ&8rCMr(qG{d`E2W~+9@ExRl45laY|?dR8)yP{Zts_YSp&>Vscz}eYFvFOx}2WS_2aJJ+7lXxCJ z{^R;1eg9LNMSxlQA2L)+DscD6PWH{DL}OUG!S*k1N`bJ4wsORy?t5MuPfQY5xj>yE z-}Kw+B*$U{|70v8fMwFOJ=F^`v5h?u=k$a&Tc^<(7Ny~#B`UgEgt(lW+oui)*!N~& z2)QMvtaPU&FK>+2fY}TQ^v#)*j zUVE)|96J|wJ`V4Q;Vac0>GJ);w}XX{)+q6Mn|leHf6QL z33y(QF}e(Euxfl%-sGC{SR0(y^ZoBNQoxu`{w;o+(QHxDjQ#f2owz;X!2ohfz7bmM*$cWn+b3rK|D0fw`pHSe;5qa~usUM>;oI4_>7;^ho_R%opIr!BMGY z>fRn3hU!D0eb7EOubsEEFt=r(q6u+QQ>ci#0pvYa?6Z0D687Da39dYN5f_%GH_pyo z=?px9*PO(>Vo`;`JTZu3X^@H==)U*71DC==VBAE2GQAoUlz(Z>3$MF`H#~l?x*8L- z++0OMji<)5VyN5~03}1qL72N7AwM!c85C?2Pc-pHXn`Fj-#w&fR4~*&d_|Os)^UQh zqd`ft;{qkVg!8Bg;;HwuhAc?%UbvV#mCIr?;D0);s7jT|8K%o%!R9~f{PD8da#R8k7CY# z;!81#tw~dtR!f}W<~@a0135bR2S_EVrOd|9XhKm!%%hP%;gHV0~Om?cP@ya?UT6? zv^BQ0J$7p#kz`dlsH=P{{jCS2bA^htttwhn-%Odq_G|8%`6lS4pmxKDW?5?02B)mG z?ckPAfCMQ-_Rx$E;X)<82bL#czm8VDT0ve$DuN**dW;>gnaL9vO@Ru%dJdP;yhc-% z;7v$P4qEMNFjPYoaUof~!XR5(A*pH6R=qUnCJC_qe+S3M!wP>ug5s}}Gg5j# z_R?y};-(BRb7H0_Bg-+^C1{SDY~_8!kc*rzl7fC7CFmYcq5zG7CrtnzEX?8w=_uG$ z4WTz|g!rim=3DutxSO$m4C{Z06sYqxR80(G&S>jE-tFvZS&OAWZ_TO?OkuN&3nV?N zm!kz`*4FAR(&+f?OsUGhD-VTpA6$5O9CB*yls!vks~q;lxMiq}mAFiBlSc2UoF{6U zm;hT#GQlxbru;04oh2#$z!ntNzM3)_K7i?m511Kd6A#ZjWF0Nv zIdhxGlYn4}ZAsEpU+-_ZbXI5lor9$sm+f=oZ(fTlRt6!4X}yG0NuNuE7#NZjZAzoh zTM>o|XWA}BNl122D^fU=NUs7_>8#Z7%T*@>>gee6Jb&vlW9s8PA7xpW(V$Lxtqa<& zM+PWv*mDPpF^+dn@H_6w^2FrU;tRPRqOglB2BlVlugEx&&0*Ep3X%+Cqf_&Ds%9j= z0={h9tk>1Dh6wS8$K+|Bc}`G9P;!!Ym1h!@Bqjquhr5?g_a)MLB3T^U?RIu;VYOTO z345PC!7g$Bt!0}vUl>r$h`oG40Wb6Iyp_BZNLOOj!fxM1oy};UfBYVI(ROg#Q3BUQ zp=~23QrWjomkC}}nuLL8k8zOJ2X5QoYP?iP(l*`y7h|s2K8VjbGwc=XYQKg`vm_2w zLbBI1Zew~X|4VW*p#VgIURG1BRYC&E+x^|{0v!Q?nV(j9mv&s-s9?ta+L>>28`Q-> zZ+Z8ViV7vMyPD?fv=QU&@dBuVfDl(U3@tP5$?%3$K(KoEt&nqlz+PRT7-DWStqIUo z)vR1#Wl(q1{=mo-I;BR6L^kDiR-LolCoFg}S9p{qQI>x>Q!&bs!8^KGUVOor|9$bX z4=KEDfKuq7@@;gApRa)53hB+(b0u-{z^HjFYi!U(7l-=W#@zM^ln4xbmKE;7QeVXu z828|dQ}C)Az#hSf#CNgzeaD?4jOJW89Q>1Rb1lgva{?W$C_Bie682={up<=|P79yMSiV_t9pu@7&x_wdr_33_W=f+UsofRkeLq3pLAEt8}$+C*EZ=KUg~#ARVE| z3qi1u*x>N`dqwQ$IPs4zw=fst{2v|2fOBW(c!B>n7s0=ey@>cx;4-KzM%Sw#6A7gd z{O!OoKLif96cTKNMEzhda54>R501lK6#dlv0i!v^IyX>EhUm@1EH6)KexxxkZ<%of zM_I8NRYFQdJ}ZGeez%6^rAJNj;~>@_9d;AVGB|>Ye1f7nsks%=*2*v9z14m&UY6G? zmAiZN3yFmrHQpEQxwPfbn?<|Uat~>^<>Wnm5lQZEePsnW%e&)U8mtVkNe^AE_$C5% zrsLhc{NeWY*V5j?<)I1&hQLzI@$RJ_s&Dg{-P-ODFc@rbEO<0@?ceUF2eu}ei~p3= zGT+t~z;Jeb`Lyp5nV(frILlJu@&Hi70&!ihUEA_{TICNH{%&t*gCmwNlC}@qIpaEe zQTPgC4zrTzym~_o=Y;Q54gb_}ib_h}yhBAmR{w+VAqtf`ZL;*`m%g^i+}(r2PDwN3pVyL*|%=qH?5kh6IXQf zaBm?i)LMc(ODJDIv-iDfVJ`P#u4D|nEngEqM;Tz$I0?>*YEt#06MhGNC(O8cl3e_F ze@VLa&C5H5JvHIZU0du8lbjs?{^tf*_M=dkhpKC=%IO}(YI|o*D|oRTo=(@+r~hf` z*HF%Z+sy4HDKEft&B!fJSPhQkK_QB)4D+~b*TGqdR}b-^A_BLKsr&a=I?e9(g zVEZ?uf&XuC66-ZT5&jN$_l;lU)swQd)wpGn`d0s95lOdSBXD6V#+KnsMI(+%0egy% z%S9WyFcTH^s?+pC&WT-xjFF0p*PEBFc{=zZa}bUy7$p~s+-ml;G`#gnzGuDghF+5fP%^foWvK%)ciadUo@lhEX&zkb z(DXh^CZrIB+kedLFwSTAnAt^8U09W5+15&QG^xBc0<-wM3Je?tAp!oUQbxdk1-c?_ zCS7E?DqNf12sMx0^{JrZh$UF`M&5xTOh18-@R*ir)5_9upp)+BLp@VW%#8@GTt;pG zJ&ZT=`c${czn%Hw6D2Q{Qavo>Wg9gQ z^X`}Q`JvvPwdJHlpN>;)bY(~z7^0j6o)T!vPfLTddY|P-^R>EYhTR57p5wj9xY7$I zT2BsD5o^jAj6JyKPeR1`16W8@?PhL-x3bp$QrF7_s`uXCcLeHHdj2aN58sY(q z%C+JaUBC-ag-BqCG9Db#kk~9-*>JNGJJzbAkb|x)9Z=5EZ18|He-5w-HjG6pmj!!3 zDnie@Bpmd9H80CzdR1+D4VFyp64d|e7|Kon43OSWWd4MA7=5}=I5LDPB?#iKg?sY$v-q}4?k4i z*Xb`d8-N$oG`cpy8@ZqHW4h2+EN}6`{_+Yv>n+EFeGOKFHXj}w_RGO~PD=1={;b_x zn^Mvn`LeNpz+DXmQDC~5zSOnb1^FKDa`Wr%SEolx#y zd1}g!fCK?7`}nanVsS$lqXT7?V3&dC+lHfi3S z-SV85?H+=MC#&Cmt`q<6w?V8|4==PxfkEwucB0A~gsfMuW;FMPJnuLBZ%H}vP}$xo z0(W*x?rA(GUj5~vg1mD2dRD3FdgjylpSK>p4t01Pk0mbwY2UCzyRo?m5CyWeG%zA5 zZO(xHErr-#zIhA@cKucuV5P#l%Dm?9q~HNh^2Y(P-uIsMx@6hxKM=0xyFI?7CtB@z zwa9|co%V_g-Eoir9O(Zfy8r#_FA-UF#1Up|Qb%Acx_53hMQQe&{AARy`bK3uci-n8 zG56hr?dL-Mz1z;X+pjgjI(pnr5bjaM@Z&5)r^&*q@ecf(M~~pzN%PJhRCEc>S3DsO zi??(pPL3nBC92$957$24i_2}yOI`U<8U71v@zf^LinPpDW7o6rOUQAa+SQEgzT5S! zjDTYz$0KC7{OO4Pr)I=iLj=Q#E}%y?p#mJSfLDvgn;1acDNHRyCVuk%8RtYe&OGM z0IVRyfv)uRFQ$wQu+}DMyL;4snnQiLaK_G)vXohMJ>>y4YGBVO+ZRbA{3Yw76Grd6K^8HRW&EVFP|5Y8D_MivI6uffTTi^kL+7moo8&Rnj7PzwODE z>RJy{_u0(+Y3%%OEAW@8-MT_4h#{_1=kvLs#O<(M83HX6SG{*{DwS=`d)Tjmi_;X8 zPaHqIX6?FKyXPs$GUZ=n$Dsqv(=y(eXJ;Y57c3SlZNVj;EI-v4Y9~I-#|^*Qvb=?n zGwdy7vh%FVlhV)Oo8o0MzU^qRimUQy;6BRQN9KOW3~c%(+>aoBLc8ZYN&mf{h@(xD z`F|f=TIjOY%~b)$a;f2A@O;PK%Ji>x<;~H(o8kfdgSkR3#g8KE?V9jP z2<-1^tY~B5R^=HbCLkab30TeY~B>o8}K`Jj{Z&40}N zh4qc5Y@}F~r>ge|m>;=#e_?u1WlT~Emko!QOq;Bqn~T9HsG=EL`pc;j5osm4oJPdj zD*)(k2qF0RbO^E%;&_q#D{Aw+k(zDU<2q_dNjW@R-HOtOgf*-jbL%}oytvG$Unc$l zNa?uwCYKfZ*FKwq%jLqU_**_Ig5)cc;T7<6Bb_07#F~2Le{)T=JvDS7C52RL>pr>J zEg-mwQ8xj3e`si4F)x+)A0uN#%5uLd*b|Uwv;O@&2!p z6QNI1Py8>?4@%XrqCa{qEELHdc3yoRIe6pxJ2j^Id^TNg{cv<!WEwO!F_)4XGx z&)=bz$2E~$3UOQ7eP5FRyU{KGFYU3!WcSe_ZwCoGZM7j~cwjcjno_tik-s$WH&s#Js_+GI_fB@<}7&-vNX$3i1D+#QWju zj(cG_dt@rg7IZRS*l3#Z0l)tZz z$`^r2OUeuwAReDNN(yt^EbM=!yXzILo;%EtD6VExp~_bZTdiKGNR+p~5r%kE8mh29 zx|QVcwUEpFhalvm0muM(f0uN<0{|f2Sg~Iw$PHM|_s7HhOPc<-`mYdI&T6v^Za1iC^}=dp)tl5VN=B5juXmxB3}s@VI9& zAlP`gSN~tjf_T&;4zKd5%=*$nN4K@~f1lHm(wIFnbIk4Vx#97C zd;8br%wE(Xc5C)2m8s!r%tu z0_uI7w_cs31qHOs%-FbGUE^VyJ=E93+g)9eS^E0-9BY0YH_w^>A<@J``rmK8a~Ql5 zofQej)4dnIT1$>k>4Wm|*F7dqerBz&^#IV&7+5Zjpk?Xm{wfhFdsnq!Q-87wbEpK1 z!HY}dt?Rr=uN@ba7S;b-)(%C424-@VrD2+YrO}iB!w-i#{Xy1|$E?wFR8Z^ceHkdg z)aKAlvH!v^ZlE&yewP=DA|ymwjCp+}(5&@w81akSuY}xeB5d@sU8>Ow>8E za#CykcAD(5_GSo{3?%`@DttD0<%n>&2{`%B;im8h$>RDK3C_O}WeA}Cc3!lTZSo`- zwz?T6#hI*`uUX|0bjzhbep|e^+SoK6Mu9nYD2W4luXmt$dyQrH0xULFeu^}Yw@6QbazJ~ zq^O-0>UL9rEyDglQ(c=5PELRgd<|n2c0Od_cj&)kDe(OLVR<%{I%{MnKM|Vqf8|&g zf^n|!QJD8~YOYbvwsDxL)55DSlS(rt=3>Fqy~xRPhJ1VYNj>VQ&aKo6?Itt#m~htr z$LYt_?W@`=@)gs+qhU`KE&T#-#d)+eYg#pWIHn70z+%rL-3CVEV*n(+zVU+tFshSJPO1od zyG~BLf7iBb($N_Q1Teq&niMEo93dl}%FMnt_PrR77(Y!A?t@?szKAIH&4occD(h#l zJ>KP}H?a)W--=k|K0IEUn)(vd*V&FCTN)xi-Jk*xIy)2;UV!C3968*{U32BpJSkXn zfpu)In*Ff-fg`)cqhx1$J5;~Tr#sDQ)9CaU)UmsdhR<#R8x5B-q(4GBB0fGmDhiYN z)vLfCI*rvhKn(UsUv(Yz%+>8t-z)zD(K6MBD!V=o!%V=ZPkE)Km?pntLX#mCFXA^v zWffU8`zoExkaz*i%*@5Wv7bx1J{zk_cLjSi6oNNgfd=fj@lc6BQSKAq;_0*3{I{GBBWE z<46TG;m`kV{)4TuUhJ1t?(%8JGr$ z`9^hky!o435;=f~h$vPRC*XGxOzU^N8Pqc)-q>GuD#?UZf@vWo&5f<1p0Nvjf)`N7 zcz1_a%)9wRriMf=<2mp3T}VGhiY0PhWWZ_U>9RLrp4$ezx}xHh%+0N+6P$f30xm2w zK=C{(>f{wUIW9(<_xx{cO3xSGJ?KLSqjh!@M#XnIJa)tBrLk19+K*l~oxw-f!e1G_ zY9pP{edtijX)ax-!irK;2Sq0(&wl`9pl8hluz7h^p1t#v*D(SqAq4~>K8PIvzhT!u zc>PMz2xr|CC&mx$+EYbZaam700>E5kl zm|9qf+1qmnynTyM9q=*Rl>8zzp!MI>gd^resKmr(4NlcAv(!}$)xlIP?%jEG!Rg`? z;!Ps1?{n~;b0KS#Yhg?ljRL*{WwAfv{V|yWS%aR6_?@o`IWYKVBrVHo~QaSaS8dBW~vSsMq?D!iW zIy$F&onFYVpFb7Dva)Q-3k%iv0)UM1Xt+FnwuXiz?~FsddVV^Qj3+W`{~pe8dttQB zws^2iHKesmaSTpB1AfI?|Lje;#`y+lemEiS%B$7{K!PW7w>h6h* zGBl*c$u~Y06VE3+T5KmA5z->025L4EuANxny!)jY@eChp{7p4NGdNHIV&>oo3r54M zz65;Z`7UefG1v?%g@iAE@bKZZ95W>2btXcH1-pxt3yerhkgJ6K3I5u5JuTlE$W$b> zPDuQa8d>WMHoU(88+ zlG@!L(9%0agFB_^_pCSxa0NU&*E`-P)M)QPCFdVjF?Yv2I}jP4OZZCh>>LV&;h}ZKwjj~c zdZLFg#RQ`neZYS-DbwmLqH>_(42>{f+Fdt8(zC;gY#2mEo}jl`I_yj=&YxqfkCmNlkC!PTwYTw z==mm-DB3Zu;+rQ$twjA0Gn!F}q6`Hl>L z5gT#DyrlWEqROdBaOcA^-LFrc3n6>4P^2`{yMr`HW0~2>w%LnA+_ULv!Sm@(J!8<( zZdtu2=k-R=9f}6GiFrQ8nIwbgkUC&><`VwH44%%#Wv}e*Ev4jIaEEt1d+NBCC&rkS z2qA*MnJl7-&*mRxaq7j)Z2erAGn z;xnmcCa`?V&CB5Qn^FQ51OEV`E*DK-F-bkbhmSdE1dmL<8o)6(&soD~uRaf|Ln>uY zi)Y`gOWl5}mfz0#B8&EugcH!}``Ga(T%rTsX?W(tiBB!e$SB$+91)j`qkLXVOXu|L zeecKM7&e`LV@iNYq8&cv1=$zG&5utmWdQwFPaqu~-5A2bMrm5Pj41tuvkv?hY~A4a zwAKZ#pe!(WR#hU1&CO$q;Y!F%N<_@IU%13h(+l1eN>*iQ$VPLGJE|CK>v8-^XR|#x zZD`7a8$ujfdj-0ZF9Dtn1qTJ?vp>QF10h*85aD~N^L8$y@5duO*SjouSZ(1g22lnn zukoV20@~x8#?N}&kcSLML8Fc2MgFStL)Tto(bWel58>N=^5AQwJ9*G6-h*e*C&(ax2_;`OA!1nK7fjskhdA483cg zi_^ASDPUolfAb(VkMyL-%bfRe?W+T##$ZL!v@dwJcHT30TK|1dZtfoKC$fA~;NOBK zuQT8Sl0PFk9(yCmcd{7VUin5!eB;x%!a@eACwht$Som}D45^ssCeL`yFk28`3z^vY zV_|SYLDD6Bz71O!f6F-eQ%b!l-o$l27>&;C_5>vv8CjSO?9J0^+!<8lVE#we^R3lY zVsm8nO6O1T+K)hU-!=@##t2hTRWQ)Z)ZT~~pg`5}EHLZzy5Rp5(>%*O@#_QJsD<@m zdSUJu${rfv^Ok5xBm=<;*;)9yAM+9`XTd2Y5yKmy9fQRnb4zc$~6nQ{V zfi!5ud(}0kDI(8|R!W7p)jTpR0VE{!GSFjD9;=JymOj4?&UU!ISUH4?gy1-|>%+SNC7^_op@L>tmeGR`|i} zw+HK@dZQCpM$#|0{v^qq*Aoh9s>Sasf8sL~Rf_xtLvm*fsJXE40^FN|#I#0pq>6!O z1&Dw6Z!tFeOfQ%`${S-lFpuAx9$UwioYD3wu;lG2{ro5n>0)rsIAem+b7Y*;ed{^i zI}cJg;|XIVSmJ4wy@_;#5-I?<{{;M&>e2(5L=`o(e&=Z+?75M%Mje=lLas?|c|FOJ zs{i`Z z_B>mArhwA%EMN`}mt+-HQzMF@6ePd8^5K$Xj6{Y-`CVfA5a}lIB!LmeIaCe!^rD)I zjTN=d7O3eX_=qd1fI1EKXosrqRoP_7-C@szGD=yl_9sd2kni42U;{8QqgFw7ZV&NH zXPyM3`;P{c?Q`D8we>|FMJMi8cxgV3GcoYXwU#q*fR|D+2g9z$U~QCz%q!woulm15 zef!qa7#Zp0u(2_Q{?ou6OjZUIz7&RL=ja$TDu^6~hJnbj$XFs0Q3SjIcT{5$mcKCb zypYzK%8x=3`+bdWXNT3=Ffa-43_icgUA(1f_pH9It+!DuI$1f^G8Vq&7}^?wb_2gQ zNA)$Tu;hrybsf{MqM#LN94}|;G}-BlgyT@utRiM2`qi#h7nw~igsbv7Wbg$`(+pPt1VzwqOrx@goKrY-T#0n9 z_C#hv=WZQOPK#IH=#Rf2U-ux8*LpGXx&uDh({3;l%v@A_HX)TR$$Tcb(XNfCn;7s~ zb5|YsYz&vWoV=F%+}m#p9@V%sg%+y`!B2i_gdF$R!DWpPwXuLzAEfmMDqqSTfB)z@ zj63iiUZ<0v(Vq-SL!Sq>ySwF}@c1A)HerICcOQddVs@FInixeD6mYYItq@p|H*FC+ zJjz7tDJmI&$r44wZ@+|{$?t&Drti&5l`LfLaWuXTEgt`HL;|FI7Gd5|^|d=sZnh%N zw8T^q=YO`@3$e}To-g8=F2BjIy6X(`p>1ND%!1x-3(v%&Zt#ajz)i%5H_&`AxmV1- zSwQ+njMcbmKHmvn`kAAat}{903VZGIHD77Z1zNn5eCM%zvE+M9=AQb8d-(N<{JfXF z+lIA0E1-djM+apr2#8k`Tv?yT91RvJKIfH+Pf?>0Qd6mSFff`P$!>DHO>!8Lxhlg`o>D!S$tl+MtuIR zRW(=P%~t(eXP@mX*bw0+ZZlO*IiG$uY?A?g8!VE8^1Z1~xGZLnHT;UC2ZEsMv6ck> z$-p}tp8f9Bb>N?r#+~y84zbWnS(ZV!%m`prb`tdVco7fzEru^X@iP>O?)564(RU3PRmrX9oWpq^ zdX!%3_R98>NQtZbZM`?(Nx-qYE1K^6l%Cgu^>kLj(7-Dsg}xje&nYVW;=nmnP+AB~ zeX&^6ynSeJ_{Z>{SH*1ouPazM-jiq$@9b*s>~g*1teIH-Ui8bILUm+mGLD!6@*=Jd zX~}8C>6cNm-L@C=aRQb(mSHBafx?g&5QgVm1NdYDFqM(<^7{jjR?}#(aaFu5f^%C? z#~ajasZE68-0Y*_3YdNR?MDy)Ti;mr39H2$%lXR z!3&zrrj=&#o6QH}Cuw8n4B%z{p{i=OBJNuaZojiQPEUJXVoX3KDqoI-eufp?gT9a6 z#DMvWi+dYnmO8MS!1VhzP z??Ws(4*3DOEurD)3e?bTkmM4?Nf_|TnwI>#_or(jUVy(9qH}o~zJOO|!yFV>{6~1Y zuYw?F%|7+!pry07Y{3@km~XIDUlS9l5pShvq>{8fDJk9X9j;_XxwbcMJJcGaXe5&q zygJ+Hjy}q&8+y(8bXuU@81I2)FWiLzw9wCLvi@we9(IgkLol25n+1SPwWS8+Sw%hj zeiuJECNMrx++NrNzOX5R4=gt34sr6fDLLCNi=+(fKB5siKhU^G+P2d+HrLe^7jjmX z&+ME%HX|Lf+OQ9=OjEzTY1rxiJlliJTsB{`!4L+oF2tPuCFuSVl?l03z-7leEHqSS ze6HF<*8A366G-H*kFpl84siPPiRsKo1!+y^FF1(E918P)d(RVabQ{wN3UHm;7AZh6 ztz~V-fj0Fg(=6TaUk9&wNXmWNPo_{foA!_v6$QJ?>lej7w&O_; z4R$vK7ve+nziA__okw#y`jAiAqICUf&HQT01w6Efottbau_&z57|`*L^UZ^aKp9zI zzekP!eKgmE#lyoh4@pgA{0P$VLHl{K*+&ewM5d)d39X6^*d5KSEd%)a`u3N2LueCwZ9!r}W1QuuwNZ}919sdQpuqd9?_xT+ip%e>yAld?+NN) zPGb{K1udFc%F@H=$Qb`ll5$y7su0i0-0UyHIoi98ssS{$TRqX>G6e8r0s26E<)Hqg zM3iMQJhNqw)bi?~sQh8tD3x_C6%o3)``L5nNCj@Yg?`SDuGIFXz(<=C3?pdv0Z8^uLk zYO+CGQf;lYSZyMOpGZ>nMeWN|QJL=S1a+`?kL$^-;3wa&cWzC3&K&RQ zYGfL@^S`K0XOjOBv~j4RMa`ZaPH^(10~@I$G5>|#$iiB}@v0n?%L~o?{nfh{mA!<& zr^7e13C#Umb1$mvYQCkBp$IzIvw5NHdT9?Mfrj&3Q~R_~3`eWlgR}u!RskkJK|&xW zHa;uCuU-H;0xhL~vDzqzM60g9@~qOPC}=!@+*K@;~%@!zK?E zkTT~Ydxf*310^~K8{c~o!EEDBM96Vt43OhgQ#(t(O3b&`SQ=ADJvn^cucO26e&?)9 zFA7U|YHARIYEEc)KmOMpE)-K zD3IE^3kdcmNqImH6t$}@WD0^4pqY%H2q)Jymbh%cxo^YqNtIzs{rS*N^u<|j%a=(p z2juQvwEis_N7wZhM4{tz*6K=3EsVWE4!DyRqQa>CISH&H&eOTI&$GTg93Ab0`G>X> zQ+{6Jr68s_hi#0;#QgThL=`r}TJ$&qAq9UOE7Noso0teg;DCQktLE$ox}{=F-AGO^ z;=hDWJpYGpK8>J?)^5Wujd!(;I9DsS^y0MgPZKuRpyS^pc;C-ptrfiooDv!mtCtl&$G#;8kz}RCC9ac#820)B)eP8U+sXULW=H4{&S%L^pYTa{Ce7U3P$`Aju|Y z#CRzFR%5zkT~czk0%c1;P_GX&IOcfqb<)*gxE(#Eu-_W8qd`^R$KCnEwc(!#>2inF#a<)xiB5MUl;|g;sE!(_PLpJ0 z&htq0B>5^_(NAAEqA48$evxL z(1C4NPQjXk{vCh!{GmrsRz4TAa03Kt&OQK&WyTuU`mCpf_nu-=rq$VUS*vAA5 z`d|I{UcY|bKRDQ#K!<8*=0aZKY0x(Tf1nKD^h`-YeywlnQUoF*A?b>x;LmH5estCY z>s_wevAt~2!8hqpK+G}qLr5%T{&g_9^YC~?(r8e2bs2;Uu0xn=6g_o^g*W>ax`%?2yn()tc*V|p zn(8X*Dm`^7rAP+U0q8Z<@^^VTVj=6-@!=ubuZJdOFX02jX2-i0UlV?_1S|@sQtJ=5 z?D?=fCXq5>R~bw8@}EhmM$6dyqg`q8v-}W z6ae_d9}^6Hf_RYFqXFsZh|oa!)wt|#TKK#|d~VHCj@h)XjC9FO6y#H2D`l>V8!sKSV03ag zLuVkS`T7yJyI)Xljr`doEWNUmserPgUi^-}h|K^^sO_O+vo34&6F>zcad0JA_5D;P zB0LuD8kjb>Lg4jjJu!ge=mn+_Aq@4%sL1ZQ>dnsadyo%HK;J*u2)l9U~WrImJURK)wwJ=~Yohx|3-iPzp$S3CCv6HcSwl#Jf%h5vkY98;a zQgmPtg^25$@%4+wfmDOqICn!awYD+5m#ylfZ$skIm5+ol#mv@jZpqNKTvXQS$x-BW zzBW$<@V=Tub$saEXEh)F!?E_WGZ}-`Zuj?yh#;MF(Dtk|KtNnT&0uxQW*d<$@GEVq z;kk)0u+2%sk18{-bl45+EwlP zdkzdsx{4QBlLQ?#Bq2iZ<5MSDz~sdwY&}UyFLX15$enC$e^N6iGhMG=zj>Y`3Ew9BzcWXb;hMzS{ zlYEQWeOCph84yYD<2`+h4~&n;8(E6BQNA+RtQvo~3uQH$+pES;)tRwH*tQol(VP&i zV%d!V9MRn)>}Q+w?ja;;jXIs`a#G>@J6;%BddnRH+b=Q$Jx)!C0hwgDWK>jGrU!2t ziSvq!(GgdSAUy)HhJ#u2xe-J~<##MB6ILts4?hsr=OV@A!mpYGqLD?%1<$N@b2dR5iGb6ia zfYhOtp#F(W<7wROO6unz(ixe=IXV=*@|ic`1OCc=BTInUOmO5T5UfjfOnwKkDtp4;U~Fn5m|eE@0g8#%#?)Io5FqiANaarLk`hr3G9mvE`LJ_Gj0quh)GFj zvL8L*^-{^JBzkS$Z~Ml_-%d_Uu)FP!Tr&7QEZMN2<%#Mpy$1fl{%`)Lgp`NjezGb^ z5ZZE5jI(M7$n)xW1Mu{`&&v!EI^yIM|2+DAatcKkY3-<|>4>)vqksj0wd&@){o-U< zjM_*nIw^5EH;OO)Wc(D`=Rg^6aeG7h4*e|+_2p>d2BeCHMscf2o^FcC>gMo|T|3Kz z!?)y4H}PSlpI^l9PKBCgQ42>6ut)nJA$CM-^&z`%zhcnF|2zi-_6Bx>f29LJKR>Qy! zr+_q>fYsPUq_HGm!nbd(4fErWni|sJU!8ys7`#fk;O8cs{03ei0I_Ko$}zh=g&D;I zqOYz}O(wuc6|e7C-`|n0vvehg*q|%ITOgdz%+-rRTFcwSZ%%(}=F*SFX>T37y{>$R zM(eiv>(YzAP$MG7-4T92zX^$`5$utfmW*$B@qluuD`SWdh9^~SpHs*nCS@? zG|~yg z6qos+gl0|QK8FQ*xX3gy#L^Sj^E_wGdA8{68ZwF!!tqcAt@6v>)51J z{eYZT|4p`*0Ap=mZN$FFt-2B&_nR|SD>yXEy7^5?)?j7oF|=%qI<&~R`7C~HUR*p; zS%yFROj3fM{OkvQDj|gF)$9AOMTPR)fhE~mZ&r@;QX-(_ti2htqo=LLRLA{65f77a zn-KdDg^*p0*ZBGj*tEVehvMZP@$#(tl8Z@iM$x(FlaaU7L^w>PvTSn7@O&r@55z2n zsXMSi!!Op5f&PC09n|n0YydV|>(??Hx|OCOigAQT7SZ9&HIpF!hakH#ELq!RbM4bDEHe z_6q&G*YvuwcOC`MTqZjtU?DN@t=*tj5%`!U4rBV4+rqQd-GhVRO@JyMwX3;&ws+He zsa^fgrPhXm$_7yq?)f2S#`FO4^;THuh)*j#gfmSP6{JCHNb2H@xdu*C_V<|Vp~ z!-^pjabqB>Db;)aTNTxh;Ax1FixEe~NcxqBQ8`)3&u_udf3!yzUp8hBO10dx!9IK97>@T=tKa;ZoT&Pvu5Hi0LD zN2vMYFt?KNP={V_O=*o#%fcS3n{gCD&`|%#u2o}>ly%;WTP^rK0Wn1S+*H}Y!1r?3 z2DM{MMj~2}u^%G&k^hegmvc=yH|}m{?{xMus^iK%0{?2epSSElu!N-LJ_ain#7gh` z(u_?{276uZ1b-g4RMON$!??Z)jgs4bg18}x-lkM&OWnr_A^@2{3_`}PfIuW|#L*VI zg5<4<@Pe-Cg;j_=b{zF9^Nl0VRXK6@_xA_&7-Kjn?3vq02a!rlWlt;qgIMzaU<2$N zjticip7QeZLDmNcNARqLdK)yvskb-RAdQ3bG2z8Y1HvGWdC)C{iuR{@r^Wk}(!{rt8NWKw~skbP#YLS6iwta>-`)$>Z*2fQY9yb|uEVy_Y>s zFksXWe{DD|y{}I)#)JZpraWdzAleNOtu%jxPfwM%)dYvF(}YSa$bY^m(55d#~#~fAAN3&YU?j_srbCxF1Kk`X;2aS|)#VZWMR+ zO40Jm$PhWrA7e`i-KUj&_N{J9f~VPZ254VaA-qLZV8kR=^va;LoR3pCO}- zo2!nP)R2wXfNY-*psHFn@(iAx>00UYn^fG*zUznFP>i8~KM z%x+v-(=0};6PG(MNR9Yh7w|?%Gnu7LoY9S#Tb@9(+qM>Tn(Mf`DiYr6^MMC;poWG& zrWmmp13hOvlRpc6HWu(FeTw@VfX=c4(P*(O4^|e^(MWU399PQVXP0sFD4`EB%OE5^B3)xE6$0XIGEDxpTy2ry62_C53^ORm;EAR2~@nBs|bAq|U zep;RDcjfR*6BLEtm6ffv=r5P^w@x-Tc(?u9C`i!I_}=_x8CEi#a>K)=P~4{lJA;P8 zz|EerTTh^_k9lvne(2}MF5yP|{vVdUr~@w*oN~rqhW)Z(T*pGK?^e8vt0;wMECz-t z!ilJwT9PiW^;uc^Ojh~92$Gco=+cK^ngr_LvL7P&L2FLi#f3T?(5}#;oGR!?((r{4IAz+QFIxep^B7KxZ5TN*EYs{j9o9$1 zXA15P+$gF;6%m+*k2V&{O~vb%4t(uW$}VTQxzw#dXGU(K_kE_rv7ao1dG}9aMw5O4 zb)Skyz(=~}T*o)d_+6Hn50Cm+2UO!`we&+zs5HC(M>VkuH6-ZA!2#IYi@ z%8+wG$LZSZub3`Iw-lZgx+q>MLS=q=5EW2<$`UP!YB$%-*2wNG6`1VLlA_pXRo zA);e{2`)t9SvYWZehxCX_mk-A?iTUr!tUE71f$5Pd;fMoc3h*>K<>mL^Jp7^6yUPd zKd@Zo!qPBeN@Cmhntc^S`xYl9x)ahv4P@N7gNU!x==)Rn)vs%QNMP?8VYD|aGHm}T z(R47xleuP*Lcz+_?P9qtGnt?{4(rM|7KGs|VIuBT<>P=hZ)XO+hAkWJmubIFI!s*l zX`H9ZjPy@K#M zsm7P#U9_5>L5=ct)vv>eqL#q&Bl-Vu8j0+1nFVp1B1#ls!xm<8XKKR0w0p*n^bD+J zg-La&*gf>=&uEnuco=4vW+LTiF8Q)J*{vF|^Ez_hF&*WAUxzYJ1s1KA4@-H zP;6w$n|>sJL5$W`8=uZUA~b4k2VdM1`_jg4>EhaoyJgJV{+(-)l%BeS3PSefH@L>^ z&8@3<2rkIoKLGChgvJ8+~}4_<<35RzcIe>+{5otE{oxOfwQSzy%WY= z4Ye*biB+Z$n40Bwk2b$`%ES8m|LDw)wt&O*vrg4ZfA(YJ1?gq#_wG-b!g8nke(-I( zEYjtVr1ubyrcUcd>mQ!p=K)6USplSzUs!Lm`|)WtR{FRTNfP_MDu#C|iARB$e}GsMj)NzQ z__o*e;b<=AhrX2XtdsNYa8#<-adLVr6uW)s!LCtG#cOm#I!(0seunU}kmm9+%DzDW zP`|a5kV%@b^a)5lG?uk!41i_2j%?9oec%fBQKbjMER+MMfp(bJv&70^%nA{6fPq*A zb6~B+3Ca6GZ%TK{NI^I5fshWn%G)1f9&{`-xYs_XUJ3Oj-uSNwHi(26i0`WQa%vXT zgxj?Dzj@AF&V@i%n>djP6x*F2mH4((^fo*fW>sqyu}(!fjUM1F$A;@^9MTCdIPI8` z;IFO_7Nh+aq2v|-S|KL}+9<0WzIGMH1TF^^;*hoBys! zZ|z|}Rr?Peg&*c5V$Uj{0;rtctT1LJ6--WTD7yWZVZ$o&cii`7;coCp0Kaqc^?m)u z8rWo|P8?hc1Vad5R!R=Fezv|iLg-sjT3qiCk%-=;nI|At$t)W~9zTqYC2gm>dv_4@S?@CV()VaM7)Drfs!~n!7f@16s zt;oUVrasR(9wInMG@h(1vGV}5d0|1mL>QO+F3y*sA}Fu%m=NOoQbEs;5d41d*M!?$ z*|L<|D5Bsrp!cfb!8h9Z_`zjgjFXt4U=IHeD@q!8=aLqt-~1}F=mMvfQXj=hxgV&9 zcY=C{X0lR&;4oVGm^K-5kp+<$_^@BX%)_x}9dp`C(AkX7usg?OVie?1kzrSn(Q za-vBDxN@QLD*iQSX39#-V)2UwCati_qrJ)R6zTJj+SOlPQE2JL7m}Cz%9}gbRDh?# zk1s)7-`czg&2$DW0f;@a-t*9c0ErVx9Xyp%WyZ}%QZn}=nCKvc*={JiSdsywL9dm|Wn1Fgz0DPwsD8ojfqUnw6?=Wcm>(R3R*h;!5 zPli6V+yW1tvn>ld;-!DB{DA=I9h;4g;8g$Q3nb*7~0?$b6zoC=MpdS$hfh{+_FJDZ>O` zWC!pn-1^=O5YX@h-BtOx#fltQBdjCKE-cnsuylxlNlv+Q2Ts9P!le(6kkw3`*YP`%Hq!AUQE+TvkP0oz-3x%BHdeH8IPzBYBsImJ*{cL zZl~**-Tq2oSz28tO_I;(z8G8E5%~VrVsA%aJSHZbwo4Si4j~p?p#>TWLb2tWN=ud9 zu;t_8#^{_6CXXO;J_l-y#6D(h*FHoLAVuj%nE2BNItRU}R6jh~k?mh}_L0(!eC@U0 zdTp=l8;())rvS@-Dcy)R-qCs^)%Q62EV4+GFL`@=o=Zd9(GEZ{jE{{>7O}2W{)b*E zO26MoXQdyiclrTkYW*1%a5FOX8nAi9mD^si#n0;)785%DJiejA*hKgNQxClUbayPA z@aiPs4YYoMR{rV`V?{)6*g|hjP0B8&jJ!i_ioFTb#q9@Bo{JA zAf=9QslyU;#i*EH-;T(yyiNI3Ib+H92q&94R_L3ffEvv1Ca;e~1lUz>z$no0P9W3} zE8EX->YpkLm6_eX-b;<#4$r?BJ$R$`Mfk*o{Nt*F(s|O$YYbHL~SIB5dRcw9A4C%7{+%HvAzO`rZLRKdup1J0BB`EoOVn|5o(@t*OA`)3B%HKx9!Y6t4yYq zKQQMap^&rh^TW^4w9=x`Vl??@h#A!Gnvjl83?w7tCPVgHc!5!7mosis+316M`maTD z@|^%ywsF|YSJvn8UwmZMGz7OAKE0g56R1k&U}GCBv$k3kFD^=cK^O-=9w9fOwtp+7 zvoM^B)Y{^YST^IjbbdHg{2I?kfA1Vc_S5tB@;b2J>_f?ZyFS zkZC2xd4kTznzj7E)oIR;@hd|quUvfp=v9g^bkHID+*9A3r;Vc@^PHy(P%0vA845Xn ziURANgN?Vx4G@get&NEdE>xf|$9t0cV1_OBjY){YEkQoH>?3cIz{aC?9$A9AIq{Cd z8Gd8;ZnGa!7l&ie= zwVIrr%U6Z2BI-n3hg27GS)BLo?gLuUq4IR|~!!er2-I;R3|D6f_>!CiTLMT9=Au(ty*y`)+@(QMif7g?!)^;#u%y zJ90J3Xqa^}*_SSP^*f&XMM#vzJrpVUq*>G&=q@VCxWih>D4K)ff#as$ZjGB|*#Kf3 z5?ZrU?_;y^V=|VZctXPc$l6+T0sT&6QV? zr!8+xKOt)_;K-M)QoihR46B>Dmb}c5)M@k>`l*pN-z<1!IKI#2;UI)dPqNqc0Ivin41bdA#XR( zwRBSJpHZ?oqpSRB+V+o77(c4&0sm+IxMMPN{uMgTM^&-KJU50-lCZp?lG+JDMMN`I z*O0>>Y0!6>_xbM}jKrbMM1U}fxP__SCnlpIn~v(DR#dtqV=xSrE+MM%n6}UG^@_;( zmsO$zysM*SE@|t+a{N--VjlR@_J-y7i_VB9&!b4fM{OUHx5=RR@UuPRh(LCItLBoRn)$>O&B#luvRBM~ z+*tVDsJr|bnkud^%V>hU+p0Y_Kn7(O$3M2008E7d1=xkut@pD0_;e6P89vIA(c(xZ z^f-}-mQ+jDAG(GrO!RGOI5XqeY2em9WvH(+9xgez$W)Av?`m&R(H6?GR0+a)PjX~LI+aYA_N?@;!??E4XrYlYPZ(dJ!)wG^xie;fu-2a^^$5F;)<@Y1_qBIoU)mY z8nbMO{jt+(HNDDILKB$eZI1$68=qD_6~?#Unm)cA-5;}2LrQ$ReYJzrp!g9Ym*eHj zd46Al+T8{o-r1&21r$&y&tQYc*C?0Q)-Woho|yVG1}3{ar%R8)`?W>;m-OMHu?*r^ z-3b`*FG|yW@@&4KzFno0u(S3iizjb+!-$i4bt!j>FDXp^Io;;!(Z~*5vuzF-eM5#+ z*=L#)Wz3Hry>W0HNH9UckbgWeF4Mpb^8b+!bp!IQguwofzD&RU);>o6{T{j4!1kSI zmv|&w3|sf6BFk~wYIKSLHP?3_ty1;^!7asC+ONpY@-*&4kAY`@vOMJqZAs0=S6CFr z9v@drm({K}I+KmJ$cO=HpMttLUqxIZ9s{Rg~Kq@D?mBeA-NL$u%6e#*d+so^IF+H(bt z^)s3KC#?KEa^b&Qpw3!Yq#97hd2-t9$r_UFU#4@9Paq#YA&rTi1JM}}hG6WkaOvCE zfoi6eEgFn$3p}m&xF2$A6j|h2oS~rD%&>&RRs&PeZr1M)Xzk2|9MU{kA#QnG0bY+o zZ;N58RGR@|5UD`VNKhJ@S)(I^%DwAGv`V`;*$Cu_E8vagBlnLLT5u0|8I1;(xzu|X zBXgza8^Z?Gi-=*nrlzBIB93_;Cen1L3hHWgLNiQ!q=#$swu}1G@B!4q;;qz)P~R7Oy2O9~{@JDq_)dLJ=jy6k`G?W(uTa!dFk! z+oiwccP`7KN(Q~5jXBx*;rvhGq$q&mvevRy*(c6eUp?0Js&oTBwNPJJ`1tYT!V7~l zdfvb`5cLcw>3gbf@8toF670ec3`Z*FAtCPpv$%)|nSZE88p;)cU;VY?r~>7&(K|wY z{D;*yMpX}T#Bk0xef`Y=;Wpi(EB9^gZ|$N0p_bnV7JN9hotTBN_~-j4<}wl!G}^n} znHLo$EW@;8hDqjs)V};8gHzIm2CUNt4-`SD$&lXnBS3_4@p=zeR1E+X5Q-GIF1JPL z*PHKem31tJkF+nxXJ!_q%cD%lo;r1Wv}>q+1Cec^P0vaU@^U5nYzXC0$!G@R1{cMU zKG2N*J(}E1og+y%e$|&IkM_K{k&r4w0qBMaC$-@;1R4PyVUbp7(86bQOp3|c&-J_2 zU8GTy%A~)|XgoUKLP64S52Pa+DY*mA7Rd;>N7FaJ25``y&awwE)6<}DGqy;m|KY8@ zfE_!I+3Wdq3NCWpX$RF=-%0VVX)4=u%X{)DMqAhr#s`m~uG`WN4MIK=Os=$S6Ko-g z9X3bpwK9>$r;KW}x}Y0Jo}uECG#z6DeT{U})U30UkGC(pyJg@uk?Zd$R+PArOPMY3 z`QmPEPq($rOot-WyP%Pl=UQI=5Cv=b_!Q(50vZ}1Xk&UhPSW(+E2*S;%bkF#(C21v z1MamCu5@)pOqMl&-P+tVTy@)cuuoHJNq1KB_$Xrl78~DH$jixD+B|oQNOc-7e)U~m zfD<`l&Ior!4qLIekJc>!uh*d9;me-($%uKpK+y8MmI4zKnmc@@FgaBN?P=3UY z;u9Cqt%|$*mjjY&j7e~BcYHVLF(#vl?DBjh3#QaXEQW}_$7sR?IC{a#tki%{T<$Gz zdX`|tjtV%uX2uaP#JRY6k&=E`@-BjZ^NR)&^4T{qF*4M?<^|TfKVg8y(#424){$(p z?Mn#R^C4TdBjzYBgyAL}N;!HYMtW|;8%#$NY&Ibl0a8KKt8rs#ikZ?%2hwvJHBx6L zYSlu0b~X}84Ug#)JUr~#bozae=Xq9FbYA9#%;uhTbT2p*#!`?s}{ONs$f2_VbVZdM*t$hZTE(%D0>5KPK+4lPR zzG>5V`M$dQdn>g48w?X;Q}wiK-ZKfZ%f|28-+PX}-G8jdZmeHwnW4vBGR!UhCsUiQ zvbDOlxZ&eE*7^o@=w{{RSq*at7kDP%)LKV_4QHH0GX4}Pq=$&1!_-5J>>!cU7(nVP zawJ3t>kgCp4P_M68KLXCIR1DaB^PRRp2k)mD;UZBP^9T>sQ`+OAOC^wd;~7m%(^sP zYsx-1w%K%hxbIe?q#SAg^#0>z7hURDc-O0HWblE$N8lV+iE@PUOA~n$>xVPQHohxU zM{e!79|6sVJ76@Ddr3&KedI`Nyj$Nm=pEosbeAd-#*i<3>ZN`t6r6DE%xpwr5LzPd zwv8`3fjxvnCh=ONJ$Ze8PSt?GiZ#K^q@siWsTY9j^@TM7{2M>bWwsr6I694RtM``~ z4q7IMJFVEkxEA<9@NNQC6SWcwPUpUt6NwJd?#2&t!oN>@|3Z@8&S(^RIBuRgPEZjg zZKe6Wu(+2DS!TH-HEsKr2vr~&oEa(FX>_Eg7tVs9Ckv62J^cI_?QE`!-=jxz`@v&u zj$u=WiLH!gcMM@{`VTDwhyvd$SQ;W4yS-C+wgCO=@w3(z<{qo7D>-K?VBP;Q9JIsT z^HcKS+3s)ZYi}+$?Yfl{q#FUaV8ci~?tu9IEJ1sa2+Oqn6@zYjA=*#oN2A0xbUW?F za|6h6>N}YZY7L#k26LROKg*OMYQK}B-0wQ9_RDNuf^YG5lm;B6F!6ND=4<7#-YM6* z<>iMky!G|#5T zgUoHcBt{k%Du(9RXfNw51yy@wb@K99QO)?*jzUgO?vhtc$o$LjrMcZs8ouAO?V>>> zD5mUG!!W4F6%{I|!hG4OJ~J_?k2POC)j)viE5lEb;yh(*e*h@`U78q`*?Yb%afWxM zeSCTntp0**dsMqRQzPn8xJ8!CE=k44%F0F>02MNoLfhuxBsvqWoo3*ycsYqVvp-RW zQ>v{VYH1+pVDRo;#~TliQ={C=^dOVBx*8}Pwn7^J=IEgghWo>#2URau=?{xU{+tVl z=Qvb}z56khD|z&X{4`*$WBi+#0|oQN1kOvxkVk#?xz(@qk%%s4UKX4<$$*@r(=s!w zUEFxb^3J?9C;pRcqR&Q6jFdkvP(>bzJ!zSOwrSYP$dM=474pwb$cQr_gkguQ;LkI| zcJLRi#K>s&_Vs&Beefu%E)x?L3%TZ0Q7~brQKy~)4kxa39;vmz!GdGIae$D2401^U zc*<8EWXu)XG5_AzWiXJ_>;974Ph3?OX<@Vwxxe{cJ4=l05K&-Q7$96VB!{e1;$fhq zMGaD$;wCKmK)qW_fpyog9J9=XjL3!YJEh6y(xLgE^9+xi&K~WV)dCjzluy~xxi|mkdqzxfBsSEhR%GJ(T;rFfBH=;&I{*yM~ zJvLl~-cA9Pc65YvV-f7fi8@rOEkKsSQ7zaKmo(vOaNY3y4ljU1nvY)BWu=|+a&grN ziizR$$VT5hT}_cMC5E<}S+y!hsM+2}@h7;I5oxE^*yhvkz<;0o{sy#mEcd@PM50)# zC~IG`#XdH>)J!zu6E!DitQz{6Msv(jpzeUi0OJu`K}@1$;zr4qebIY~CyF@+sJE!8R)&CuQ-WN-jn$WO56F+j=H%hcMBoW4*6bDovFCr8d~!<) ztw3B*koRgSw0he>}aekeTU&4A-z`~t* zV_wVD$GDS+vbeb%BVYuoTq%F<3BTjw!|9WH32!-EOVjuA(=j+EQwGKQ|!lQC$ zBKzl2*!ndYZy@$;?Uho#o2iq6))lU40>C%i13YI66Sy!IvtxnENoEZ_uQ&2Y4!crh zv;A>{y%<%99LgR3&e(|-;L%1iqi!$S*EA{jDVLSK)1rpH6*YpyVw+r_cdL>g;WiBFBJKH z4Ea?IFfhgfpQ}D(2Yk-oIsn2bF_5MfN|kN%*<*gbk%L0FtXg%Z?$?8^>1h$zAI=JC zUEQp2_PXeMDtSxV8DHa(?7X}|4stuj&+i(bB}jYMfV}`48|;}tr5`X;EVHW(gt?Hj z@l5QKoM~800g|W-DZYcOnw{l9*=z9JY1UDk4h>jZUC6Ayi2Yp(TZvl9Htl=k7~RI& z&w}5=qbK76Tk~AZY_VcZ1^yky=Dr~e2nnrvmuvNm&bG9;5OfQ42I_O|gD>@YG5*BS zmr^oHF&U?F`H)rHZ-GQ)7bX4nQQ;OyKC57R0kP~bixtwHRB8IWc|Y{+quZI5)C=rG{>Sa>hnng_a_M;igYBnYLIC#C zgjkdjOY#Q}ct78BAe6K`@x#84V8!eEnyqzXs(a_zemD7$SzP(NbIG?PlxyOH5FSEs z7_r-%b5L)GFS!GTyzBRM>%UW`_B-0B0~NqQVD?{`du@Mh!>2NU7MC{V{o(Ic1xW1Z z>F9Bam_U`J{+fcddh(W>Fy5v0fhm+Wx3 zDF+p)rc`Uk`{49NkTksSSdJ3;5kZHKPosXTiIM%_--0ok#3}pH1ehC zGu6k)S9(hdPkBUb<0t|HjPVE$?Bh(Ez0g+tAD*6&VF1a5Q|6{M=~mb(4246C_dc=Q zYP~L=4%oYzXp~tmbXo?^GGlxL7%|1`V6E>7`ZgB0T50?Xwinmtd`P;St+0EVWQcyc zM@4g9srh!OJhHfl#vp*y{PaOC7a@~Htt)SJ$kmW+(%zJK`)zpZtxcJif^SrK_dbB)*&hoc;a31t>ga}_w5m}>!a5sRYW z_T#=}Y2n72Lg@JZK?b!ARJ4%%6--Rhn$GpeY2V^V@E{a!{g~il4C+^P<^TAds1Pz+ zjt_+Vbw1NeirKinGq(sX1CmmcoGuArTr_9AHzs^dfgC8ul9jINupILZbFwea4|8*u zp7lLs8Dz2SH?RsRn>C!YUL5gV`trjT`i`mbiaB zm5HE z(K6zhd@&Z!irPpiG!N-%()JP=5_U6A zwg)asao+bjQFAJEDtO3jKEf81+Fp*@^lZib>A0 z{6yc(Onn9p>u^|XrqOyUb&a)WmkWPEnubIx#cLU=UTo?hQob7r znbEjdVs%Mu?y71S$T+>@;d{~SnFQSSolFXd5c$m;@a7=R8 zFHirL_ND0L(vuIR-Y;lpmE-(w)DQ~>e-)MA^f9t|N&xjwmb6UxZj{@1D#9E*m)#YH z3h{!>_tZuCPLukRCaBDlt^iHD(8zceCgx)2o1lJ`3W1S573dx_TFB9sRnr-Nyn}T- zbuV9SuPBCt*zyp(Z^X&}X2}3`a#VVL`=b}L{R_Aw;D&+tzxH7FE2k2@(XzkR@YtreDBf_(FpitW+GUbkEx^apS9J{pQT&R z+abO1cs@aq@nPB`)rM$f$Saq1=1^kSO@!qRs5p)s)-242_#Y}($F_;SEG|1SUR=xx_jDOm3?w;|!#>IFM2$H? z?;}8)7!)DXx;@XfaY%>RjSP{}QT%5Vrg2%$h%#Ey-K5N(iYAiZ`riUs&rezK&&c43 z%+nqdVv)!N5WT_`??H|w%#**m9(Ra|jmW-$v$D}OPMVvJgW#+`Ey&4>^oSjWgGi%G zPfRy`fDj-F{)%K#XiOb?HeUMxhCIdcdd7Q3?l>@V_S>NH6^sDREyz88hlp1_1bzWo zg$rJ$83~*vHR}~2P`(~HRs@;{j<-Dt7JcJ#9vaHksNfu8eu|8t1#)g~!rq@RiO~bH zzh`HY9yQ!c1E%r8>;MM|pbFlH$R0p!K*`BIIMg@RdU_4khWb7hia;8gqG{NQCKM@PKYRSa312*9 z>{;Hk$5rXgEB5b*-|6TPG3P!!8~)REK5$)Fxq6(Q9E%`A#T|lW5A)B04Wy~Z!(0dE z609aYmx*S62*UI`;aCo~ z?Qov`K3M7a4-*$Lf)Cy}(pv0j%)kRbnF!=;Cj$jAUP}8fKAVwyAHE-{Ylq%VN*zE? z0G-#!cmEpP%a`oYjxzetd!j(gP`B50;xRi<4(IHmTtTGj?=wS4r>HJM+uyOu+Ex_x zd*TeYJ~}q+g5*Dzzj}QuFAKpevHVNt`Q3sx+RF|U+y}aDL}eNL@@?dnUf?1ym=lhv zbL1W%(v?ys37HUR+F`Q+dbEO*^h6;j*Nni!5kVj}#>0K6Z3a_5A`%ui19QTorx%UE zA>`jk0p>lyuj0A0hVS`>HWsA93rMlannXwu42MvRlrLSjCu4*J-H|S__(@yqp z9{`Dl(mA9|3yn9(e=PLM0PTV(e z6KIGN%D?rqKE^X>jjzf+Ss_v$d5ruacNQMl)F(JRkkDfA5Gy@fP8iL`Z%^-gSsW+t z97j(#13-xH?_-MJ8MP750o_GtSd#c)d6y)q#jfF>!6PRc*umz`oZ@Y7N%OD72BHtH zgWQg;j@!vaNU2wY4=tOP{(3Sfe!T}oodNV|0PR@VE4a7o(R#UC*&(SjQFl%Q61z8c z3>n-aB5ER;%x^?Wgylan8Hq%ZW=bBTNgGH}F{^2e;V7SKPW&0>*xj4!C1$Xr5_6b7 znMT>(x>4^L*&aNAz4(p%G#WD+G8#8pipOY{jF?K?3x83Afm~mAG9QsE*hdY>uQbU2 zFqZA_M&X>-cGconk~StGFV5qWlP4pA7|Rt0e(ke87)~!(+jG|)T<~Hl&Xt08Zymmb7ZVErjqerXGS&2S+UMZiJ3sFu-tekMM&9amC z2?XouH*PlYdXwAwMPS(qJ#TPODxd_dT>vdM<)_+5$y4^s>0Iv@WJo9ZWUWc7Ov&k( zhY+9Dz0z0G9#jF%Y$DPZwm68QLh<+^wD_c+|7=-i=}~>A#Xm=}NBRrAS7dE=NQFXp z4nsTE^1&ZJ;MY=6+aNl+x>yTf9<==ZOBs+-6c6}wd8l!4`1V!%ahKZBQ=iRG5hESr zyEI?@;Li6v>i=X^hg6gY{>1E;<~(yPXbnB95TuVyK1VvIPLiErW6L4ce=~ZYc zQKpb~_7vFz@4%tY+qGXb&i#OSztfxY)=$ zJBZ!%wYzDwJZcwj)BiekPCL((qz>N_>Ab?7%JYiDDDR zF-l^m3pHF}5CIIZ@9fBDr!nPSAES%gv~S*%v~}bDShII|`X@lT$Iy7K-|*~rT76n$ zOhM9nEphwYm|?o;<37Kyk{4T_kaeO!>UQw5V@%NcH%d5%;#i4plTDONkwqUnKl;xqaI$n4y{c&nnw;9` zqdT)y=RR?(%N={=CoQ#$ZoesDcyD;r|G@7ek`CvU4Y-C9lTqUnJ$<3`r74K7alv)i zztf-UgLsK)sZ3$NJE}an$V@cRt4Yb~p1`T-TV~dFf;?C7-;)&i)E6a#aCA}&-{0IruADB7>l2Cu1WY*R>#8@g{s`$g|Ji1o@+ z9X1g5o}QlLr6}08Bnpg8g~lKR=(BPJUX^(!Z`aF6$@KI+ln9qM+A>P!;o74rDGR9f zS^4Yph97|>zneR)g1t_4@t_Oi=UC}cfoPI1)VAJwlZgMW%TjLaSDxF93m=1%Tkgc< z7yOY93^~d>%nOYB979N+Ks7{7O7qC>OC0)j3fk{G@x4-#(&dt0MSg+JnGMC=b_V5{ zXqo~LMS(*@<=q^-?=Q~j-6C~SZ5HUp?Pnc8isM)6Q)JVzWam5>r95L}3lLggpSMKS zjCJ`4VmU!Z(*D;*HCyY7(OPC4RnxI={Nc9cThnj8Z_kU6zic&$8!DX1kLwk>*LY4x zJTu2#ZrDCNsCa9L+V1{85?$@wpO{*c|DJh~jcB7SbffP?{VPm60XuO){#UOCWY09U z!D^8<@sRIpEh4Cxkm;L6 z9ziff(9%^BomaJhAu>BCJ==eJ0F?4XW-h72%H1qIZT6J~Zn|o6qQ^j7-09CRu?O#8$Ctjwp%_Xi+z53qY~bG>^A00; z_3AIGhC)kFi_O2s{lU!6%gb}1;{5yJvO+KsNIT#o^S#@7=H;VgVE_Qfp{~;@4k}(b z6(uDl0QK*;$XL+rI|WGM?FJE8T}I~2j)!N?TU&dJ2^NG4MotKwa$M?fSrgBQK72;s;cn z;@|7bnXqPN*&jF`)ikfKgt_6uRqOSGgX@oIa3^WxPWxSbqc4BISPP7dN4^07AR7|^ z1q*AqX-x!Mx2+hQVeT7-eG& zdzPM~Ezw+!nv#>p?UA&RR)&6b5Q}(rHX%4OG~Hz zv0F!XP|*uIGXlIT5XmH zpx)y4d1HM@>%D!t^0;(U5Nq{zf&~xaPF8nQ976~GkFgMOboiM}x>wCYQ z#&u<*;WENK4Hx%x8NxlI!AcHD>%P`-9PHppP$2p942ON$EkFjw+`Yc!$v^dzMRylAqZ!hCLVxnAXn4pXzL_bdUtKz*S1vn)wWZxvr(;0Hd#U*00# zr1-YesHUOjT&cnryYMFEWO3CBlclCGWamJw?QNxq{nD_X}B`_dpg$qQprdbUVD-&a>R1_Jj!@OjZ#K{>zKS9f-cWRU7%ig z#c^wh`N6{=mD^;d6(*L(C=*DHAjnsFHHZA8Swq|^;yu+Uyu^icZ&rSSg=0%)%W{QW zJX^Zb`nloos}dHi<-YUnJQuTn%q{Ca*1xs^w})6@*tT4VEB+Sc*xQY)PUO!abE*4p zlN*e_F9!36EK{6_r5Dc&S8IItHRKcX&--K3M@zy@%HW#kGBRj0y;h~0c{_UhhdhuR zJWQD#jJ2~1Fm9n?8Uc2BV|u)|1*Y84ad-JA-q45ETf?R$&7N?Bg_Q$PjNEv*=;c-7Q8JGTuP^u*gs8LUJVSg+8~`d+ee;i~BA=o#qi(d57PyKKgu zq(XJ%59CLI%u2843-qo-!#TyPZyP;60*V4cxxapMx@)5$q=6Am07L*#^^ucT55yd2 znI|a4?-<(1Hn2;5o$d0@VEpQ&UUJ^^MAq%3vhl zFqa=P<9mS|WV4~9Um2>l)d_Od^DB|8s2nik7u&hWXD^!^%~rSD6%^EZVe0oQP@Fw~ zeYD%oaG_yzHkXBU2{~GkRafoj<w4D(ei&>O8;xT6C%(cUCUx(U{iI>!(8N zy}j}G&~cn(EXV9O@N}7}`@^I;6<~65eJXa~%%qSyD=0L^A&mN zT+uoi-5|E8o`|UNL(&ZYYpToJAHhxsORKMz)OdW(eszD-H3{cR5nz!-UT@`U>7w}- zp_|DNmanBf0+>IND&Ri&NQw_2lA4iey`cSbQ_UNQq~DJi!%MFm4VoPE(*TV?ct0tuLyi5YU)k7p%Kd`^6vsv42+jQhn`Op(Up?7R}AsZxAw#P zudbJv3=(UUJgC6h_bNk!XSD%;@smFQFu18Ey>X7TU|6y?b-Nis2UOSOJa3jzd_&(K zY8^>DL5_3S6P#`bT5Mcj-V*rR zKI($Nc0#9;bop#VNO>_p?ECgFu{Bp39?A5x4xF$vN5|Z=zL=P?a`aJzob6{iw_83E z;O@QeUS1u@ri1mpMrs=)$2Skn*=~q^h!JnLWE=8v56utZfyBkt=#Q1>l$48EwKud6 zv=b-dc9kx@to^L@Um3o7-_eCq0h|uj=eB9&?(Z z(6g3-q$-fuCPeI;7`}ZQo>yGl(pp@spDRoLF2Vbn$Cf`+c8qTlvhTvJ3! zQ*~Xnh7OU-lCu)QJ(B6F8qijcRM77rsvx+%6kdPcgr6dGt5TudrW(Mg-QW^n4x;q9W6lv)$>F%0%=NtFl z-#dS>m|1J)IcM*)KReEjQg%9=-1is;Yq+%?k`K@e_Ly z528RL`RxFrmFjAUu<)UpI6|$50CeflcnT>WMiuXlqk{I&VLvB@>MX)kX4eD59w%Vh zY;TdUy1NV2)MT>V9ImVyjw-WZ!Uq18e_2qcu{Lr< zb#Zn_Ts*|8=wx{_V6R;WvbP%VCZCBw&Fny^ap`>J753(AZ4W75E~Os)1}QuM3S6&6 zcrlliDWHSxIW=D-3M(ioG2OiG?V68l_=<)rFC_Go01}ZBvDNPYyWc<{;fx*_GtCXAuZu1f_e{OaD-R@7=mcb;|`mh}hZuAX9R7(Kh} zbFY<)-tx%K&YVaIiP#MY3c)07!|1-$)-KB1;e~@1%61&+G$k78|AoSMa1;jAVFOim z!>~6vqPj7=<9A*eWx5g8I?@SaxKSA}QuGfx?|j~TN-d=(hrf-(D}#v6Do}lu#w5j~EGAvMGR`$HG%bjoHZj z>;Y8ujd9=auedYC65?6BXJVvJ=b7G0-S;YRVVt)b=dl0qA^zozGR2c)y#zqtb8Qpl z`)Q6XSf(>b#k5J}hsG?td+P2=gtrAp1U$|2muoH?&=pyH}bKDueMp74!`(^-O4OCBvIG2{Etk+?ZcoJq`)Y6v7N< zaeH7SOD1u7M3pocc&bA@C%1g?&7s+-pL$28<5t!Gg6+9Q(_`c5bgyFXO&%hTB+OpvGWa^&mK1<)d5zf9i3e`6l)Ig4 zQV7PTN>JvZ?Sut~)cW%Z`G)UO>MR0#8teigp9A`;^5XFNR!8F#-NX}l zZ(z~Gc~10qSG;g5J=&j!FMqX6)udk{%*5ZeW4Juub|O=ZOU2DuHf}>LeF-avMTz7(gTS}@>w*sY2{R>_c{rp9qame`E=KNAFx z$}`6A;)l?2iiy#+h>2;q`UQN+AuEV@{r3KCTIUF20+x?|-AcOSw1RF)oiXTJV|f2t z>C-FYxT##oi8iw@+GyFYQP*M}`{dkFeYXAa?pKuGWVaOYE=Ge9&l2q4#TD@CR*4)O zG+v$g0}~)1-)M->=UkBhX!+N=K$}*fj&uPEYV7f_(tO-x(`VKc8J_E395Eam4oN8} z7KZXD*=jv~dIFZL#QbH9*@MYTpF=6!9%RYC-=^Zd_cE6%=~v)FjuGZ_@5YVmJCbC6 zR2B=VubF?FRq>W$5k?WCut)p_Xypg!at1Gc8LRdV^(mdmWwYu%Y=(wP!ii!}F7gY< z1hu{!df>T9_(}gj<@ehQnwFbC$$If2IahT{A9_BLkOu;n?FFR{ms{aeCp0KXUb1zv z7-@Xy_BYPQ6jn3!pu4bysQC{ug-YHE*2EL%C<)gapFGg0eAzX(D3DifRA#t9BfKnjUf6 z4em8nFzigdt=tqr4aC#wGkqi`F@h@Z2H=(P=bevcWF-_-`80!bfXGk8VaQf0u*N?`WFQ&*?P$W^55V{ye%(Hov0mA`rpn+iH@TTpeB_8s#Q}(JAF7*K6Ia|Ky2g~St`2U-Q5)7| zw@O$C#6G~2=THSVy07@s4Yt8;`Rt|o9Z}_!8?KD5Q*V;6y>d8Q+_i)-%*pX)SUwJN zXv(5>5sT{QsxS=b)BiE;CTufx5KC5fN{4|O*#|(Ke~;s~OVLW0&>+@-QXZ_{pm%YN zgZpcb)(vYoL3k_6dY_u>bKFSg#h)-`%;6@=W(Mb>G7$snye`23 zZ2#@qp#M++;W=bm2D-Z6<&Pj(zIPdja*%Z3&$mKMj4oWTn~N9XpSVt6$&Y!v85tp$ zR-Y+Oz4iMNxQIBKBV|}wc|A8}ycoF<>(JKBztV^W^soQ8`ykvWlakWRMHFK){imPQ z#Il$eI7g)exuD6D3`h)*ssD4SAYPO)_s6MTgmkkJ0NsOu>o|A>`G>xXzQ}7-+Xx^z&JTKXI#sV z?3!uvIe-SPT;0;F@SA`8khpY>iyl>NsL5tfJIfgUto9?8p>M;iG&>(1@U<^ReFzt@ z`wpG1-33;@7=hKF;{%z`p$K-WEE%0^pfd-UYnEvy0letXM zR!w97$umWeG(kn$|92d71b9Oxu$ek}4QCiV+n2L@wy5b-icP3YVopBt%iV1)&@*b3bL*XTP-xo#Za z(ykJq)BPIn8jr^D(F&&hv!z zZenIr0}Gt&(1HoU@D3lMfS8Vw8dQcOIvtZwXRzFau@$2#<_NSBb}1lv4uo$=yIc#| znB7d?%5wt4u1;q&Wd^V<0%?MjZd>6#ah2DcQ@Z*k7*M02FsTcIPP%(yH8rlQK8CW> zK5D_iQuhJF#wybcB>h1jz-V5AXO8OzU_6KVTZ^1-%Ei~B4nT~HUkK^k-6u6DpEVa^ zNT&_T%wK+qal?lGyZ)a!1i(Ejs=g}`KIo2F8IzLTZ+m9Lu*iEnOf%+;FN`BrMY`IS z9|5#Ng6P&(5<{MFaCDou%y!Zg1$2N`K^4Mk!!0qM`zY!M`^nin)3{?T8+6aH;;Iqt z6sdr&%T)k1U46^4&I<3uwENCObD+-pCw9p3Y66pT-FvC9 zLv(j#+GxLcN`e*4I6R7|-`I>-RGg_36K@qg&$T{G5vI|)J=a?@Qvn<+jE{0Gtcubx z;%}4Kp#2kA>NNiY>0kayjS7qaxSF4WMpqV}Q;-&zg(EJlT`x8zX$P+ID-6*?#iRut zl8na>2+x+*tPrT+*u3sGv+aA4vWm3qeD|y)W|!vTA5471`%M5GpNWTM^LlW&-N=~% zwV_0<(PuYb_su&NW-vI_)0iqARR>^;43@W)JW$07tGc+L1`I7SARXthCq>b(SB=Px ztlK+t&Kb6*eego^oTQG!HFYEuFfBcmI0v{a#Ao%rMQPm}p4o7?Io}wW0qagf6u|$^ zSKKH~fll=+^W$J52?pQ=>I5(;oxwYIcRs6VKBEs*MQihQIE-2Sp3=JXVRu*i{MMoH zlfw@hw9^DYg_HW4t>&)bHmzxn?NKYc{}?hZ5q#;zwOXEqHbAHC?L9v@#!9|^t+aSY zBTWr^qgLhhM+&A5kj~ixq)})&y+giZN!RTh{q>DkD#mrzkkcOwzUHvw?{RAADr|crcEAhkzf3Zz z|Gg_;t)6=>z<1z|3HfCX1c&5=hDW8g+>BTmORX-UOlH`HvHZV~st!)SNv`WAIwuqh zQ#~6#8Cg>g1q#q{ikO4?`m5pcrpoY9G?TJELbn{nA3Vn{AAWaG%jdt^5tksPfek!! z9CSP608CuuW1}bRVk>p^jEtEca>YJM`z8xDkCKtZ0YJFzRl7`u8J!4R#@@E8MAUOl zumE23v6fxtFGV z!omT;9QxtQi4Mpae@GIP1_G92)_r_GaB(Zgvo70p+g#@ndPsGi@pb*H+^B5=CFx>} z_~tY&u@bIQRG2IcXnv|54edEdz_k@%baMu|0V2ho8JK#;B{q?tsjZ8?^T40mw?tAcv@l2Yq9f#W;v6`?>G1;`X5N{EN-g8ie09DlKfVG9J$V#=XQY) zWBGG1+!EWe8+kk7l9o|r`)sgk{A5P6_WsmHg&7ghsse2D01BDUokiwpuUM!nvAhg) z3;Y}$=uhwnqry#SG9*O`)jVS}ga%lBcPB3fyLyX<$buxhO7;+v@k(803$8sDq*4KUBq+u*Y=@{e1(qU4L&^#BbKW(zAt2YYld zRdMUk`QVrNkk2Fxmcr9L;4)pl_W}59X6qZ91B{vhq;a+gumo_O^LL=%ssraZP*AaQ zzGhmM?7cPh{;Rcm-&rch*W`wpJVWKzS>B~)BjN(K?Kah#im`@VVkryVB|;LwC`R;J#n3|r_qRI=~~>b zn@0W@^-Pgqslqp?fMqK;`yuS|y4&TXjiqmrq7=d2>D`Z?N;un}8Y>}dtP=e+N5gT^ zMYGU*gQDbSy30zkDBlTL0m4|9m&qIK{8t zw08sDOPX+3#E#uQz*BMEz7jXA!ubgoe`G>Bj=n+0B+mui2UL!Yd#ZKI>Tvs}fJ@=e z@bP_8=iRzoRec0ZE7SGmx>?yc%y^D?>?B0Rx!)LBBi~`88SmE{DQWS{vLMse~0UrJ>_nwV$&LMcUxcDu2WgZfI3oL zd?^E3;a&5yfJsU|N9Lfkp-3b|4jcGnpi9gD7NGc?mi4Ft`04C~$0;PDR=8qhY3o~U zx;a=^f=wt;n))>Pox8_yC1jnb_W}}-4PHT-qgE*7u(*K7s4Ju@0Y^rac+=;HG zD)W8+Q0xaph5aH{A#L4ix^i6V2tZI9AYi{~&eW2tjz_b}oKxI{ z5t|9tYEl}mwK>yp>&)(g6)#!^HU!g{?y`{MKWS$byg%#rY5k zE3reDD0)j(Y$}~&@N<#-EHWJC|3E#WMllovKkrBRv$N318epFjLhXEgb2K!^z2+R% zx>^_JZe>G)y1)JsbrmR~+T+T+G1OsXwq(OXa^MLie9MyFzvzs7IfL@FK#|}4iykxxk!JA5*53%kcX;rKtkNB0W@h;G1! zU_~twd~j2?Un{pXxm0vHeMkZ}@D%%E(Wu3hg*n8iulk55=!6mIpwLzRp#*@2i5CHs<-zGHN)?pL z;-d*zTwZcu?@b?R!gthse@Wf#tD~*i;yJ`!H@Z2^5Z%Csom*T9dM(dQMT$iw3yudM zkS|%kuY!ATfDk9u$=z(zF+t-{ird5G8RR7 zT#EY7E)U5mfNoXLu@wkjvaKV&9RbX9hBjc(R!Gv4Id6ZC-MtEn*ajlQQ@>{}f3MhoQ~p?o2^gt_$eFJc|K zLWWd@L0D&3uQ>|JafSt~7`jVQp@cw!i2rTi*h2tL0ri_ILx^%|+ri+wr5)amFgk@N z=UmIaj*zcW1J&uBo$+%)xXf>h)K~?xB;%KoGX08Kg_0K?EIl$_JhmSgPWf$X`zo|R zNJuCjF<}*wE-kjAuI}|GqG^eQ%{^IEEW3yYH&h#S#?5mz{(pAIx2Xx#QLB}n);%!E z_cI$kiVA?;$!&z;!lS@q{;w}(?#&aEdgLKr4C+nJ_H2i4yW*?hQzoP*Xe6dTx};vF zfXIBRDtmSe2z9864GkcbWptA1}s<#Pf8R1H5+17j(Gx3I8$?L%&- zk#{vcnk_D0Jr7&l15RUTf+7P@cZ}qIyVhj|iPx^Tg4udFA0+<545{5LB^#@dJmG*6#O(JSwCV6=^fRHsgUa zB1i$ClS}`4VRv5fV|O}Y=Z^XLa012{EZKFi7r1LS9uZ9~xs;VJ-_51BohcnZ@=@yS zNMBs--+{DEP)Rg@BF3kn|0wUKL{@Z3xzlF0m6hibsDy(UgP`5mF$y49br?2%1`zOY z51S8V?qo@MRv1jRc^}S3QTqPjHa=uEs_hHo1y#V^H}r@yv`1-4o!jRF7Q7a1ZCzBH z{(hW}?^WpJ(MinV%;DRzOF#8|Wy%HHFJzv3Gu?*M46mE^lmmR~Grz-3&U1_ryzi&E zpIsbmyb;xzPQ)lC|O!=n6b}S)sot1o=niZWRji^S7K>0ejr- z+ife0IcpE&V!2-VW#Pn(w>S&8YqQ$*Vb$6+Vs770xc6S(|`sB8e z#nhM$R&mQrvQTKYOFwrJHbJnRZcds(`A8sp4iIL zNAQmPS&~A&tHxqFaqFlef0@%ngDBnpc*!nVOnEdG)GOnBu|dyoiviG606n* z3f(mxCVb;dUFz=bd03Q$0V6BwxCT7M&zTN4W50}|gha?IT%+)d^x^C2WZ%INiF30z zahutHC-459x=R4%&%(;BQuV#q>6G$$!Ki}yf=*cF&E2D&;G!kMF^@n4`aT3Y1x0OK z5Y#@h-HqBtBPHuYUrMx<6WxHNE>NeFL%h#bThpTMV3w%SYONozg+p$CB`h;TxqVAX zh{{lD3S}Lc9cqjmhVUno?1W-dGfw_lOTobzkPp@!& z>zKH=2Rd%PfvIn%X&*Yr&?i!Z!|TNrU_Wv$9iPLOVdzlv+$GaW{ zG$a_WKUbOBgnKzoJL-+1WJ%#hpJCOTSAD2>R;ckWI%3=7cnFbX6}5rZuu)e z9QcTNb(|V@z@Os%|iGOtt za-wV8ov^iAQdVR+Izp&}cwlMyNyCHaQLW`7!sq`k=7b#-JPy2o-OH^GSehfOMQq#p zZBHAYP?p^ien-tb1X!|EFn^YnT~^Cu_eEP$L$^~wf>Ub0cvLjG>MY98a#aJs*073xDi{*7|yd?))T>)QWL#yzb>};Cl zog2^4*{h_lu@;D6YsNj=aM$uO533qy)Db=W|E|-S8{=9)I-KNA_WTS@3kPhdbVGT$ zTK3lsvdfvypRFk%44)^rXJ5cd4i@ggONp}J=D5{=@dcd%k5&oG0-b!_Um%8rK;Ua} zakZW3N3GvT+4)3B-c)HoA7DBwX^y|>z{`!>Aq#NJmi`j*GCUJumtB7`Y=?^*$B&2j z#~ecE=A$vVCvlT6K;Te;#`b@osspcq|L-09f8I6Y69567tA-F5DtHEiapoxQ9}rOo z7Qn!95W#K!RS++LPLGjzYJe{A$&o^+e<|MK2uah^J*l(dciUzlhse|Vm(MInl#MRH z-v)l&_%a|YEFK&N-2dl%JAnzH#hOK`qyQr~&?k9KNRJT7M2WK$VoH9n$QbJ-- z)c!dEs+IRhAA*)`K~53aC`07|N!D{e2mu^}85^<@|Ke-NOVi?J@B435bC5zv+jIY0 zQG`J5&p~b_wueVUw}-6gT!Ft{Xu6;!e!m;WcYXF{S#j-8GmCG;7TSTYgs}}S`EJ*} z{F9ciNq!ZqA8N1QFB;#Wy1YdQdQZm44eDzF;^$_r$FlVUzQ=0p2vJ#VCu}6{O>_vdpZXD4>`?_k9-BP zS935V7~mWWmA~}r5i4nr$YS2H#iRpdMUq{aWX|c#k5vyW3V1FcCGhU1*)Z)tWizT^ zHP{bI&~iD}_2D|wg)oYl;#B?-@@550bvw|z_Gb<|k#H_EXMfkn^ZqmfcXK4MsbZPm zF>O0tM{-_QXn?zPVNNWK7xVftlozy(_zRPib4169{#F*9O|oc7We0*+bBr&FlKrHv zVV~*+&|O9JzFHQAk8gxOuQ1Gw_D5uf?=3qN#EN}LuX)wd7xr((0%;O()egkZ%sCYK zBlGc5@DgzO9}*nzhwy=e-YtFPmZ;WO~%<< ztYdNzTo7%ZbG#he z&o-FHIbP5vV?DYnG>7@zXe}rIPF^~fdW$i77h8cvWpUkDeZrM3CgfAMYRqr;$~-Wr zI|7bPc)7`A@Q}s0QS5p%?BgBJ1LrwIW>tSAsN!f}&hV&0K2!-%6DF#%xIf*rZ>96g z&VHo!bR{!E35yfN&3_{0oX*PhA!4Q_m61i*o{6V?|zlgAH$Ii~doNSli#z0Lhv zDbIGuSCs4ITrEZLQA})z#Sk$WrT+rw#>K)k!kQY2E*>!ULA5&KQu%}8%`6`DWKS~q zR<6P(2Dx83n7O_X^KF3j^!Gor>Ww@Qu(HZoxY$FqF2Ne_CjU^8q<|y?%CKf6A~f3t zzLqU?F@+R@lHfN$8P@1BvGlZ;9yhTp$OP{%5g>r}CqBXK>^YWv0DP20eLqH7A~TR< zOqW}NzK8d(&(h4vid0N0ZR+%gDaJeiv-;^~izme|R+NDNaRA|cRSLxG8{k$s(aAHR z9IyeJ-nb$1C=zo~F&}dt-IWRkL910;P8CgS0KKIzgG1(Z-K5|Fk~es;2OepR1O^xn5Nsk@T*dL!oY;59NLGN zZ_ha@6B8&c`EzZ!F==F3?@v#1F}@0IIeT2ub=Tilemc~(T#wbX_X`#i!&_dmtbA=% zbedx_vVEnLBRLb}bi zH5xSHepFMhqM9<6MivK${nQ>#k)}|U5X6A>AOf3C2dh7W9(0hs{6QBr+3`w0rZSw6 zBqOIyv4bOA2@unS5`Co{mY5_w><0<+yB4w7G2J zM9?V>itqX>s@ZICT_gu$_3-F8=MIp9k8eXR6IiorCQI90jUkI_9p0`^H#s7-n!ePw zO=O3Sj;-Flwz6K@%1TONiBo^MhNLtZc?2YCCG#+FwL^F4!d~T2r8VRrZONAFK&j;6 z)7PbLZf&{_j%uu(BEx@IEm%9yCj|bjev#c@fYE3idD2LLjTm`!SIq%n<)iA*%=Rm{ zE9VVyBiQo}E8Cb0f8V#l8_{$K?U$?xO)|6zd&_2@xVc%k@sq{=zKy=E{#0{{s|~*j z|CY^TDB7yUn!*ZgdfP(lt9G-5Tz-h~nEpGAFpj=#25^c1bmR)Ha}gBBMCoEe0#T9= z#ub%1)j{=XJ>b%Wk?fo^(qAJYiF|q4AC|f8e1tOQoiBL?dT%v4 zIX7P&x}=tkWT<7|tl!NpraiOT9Aw?_Jfz_6{gL3ujrh@l+Ch$c^5W}T=QzGA%@vG) z5*lKr3cNk$9WK$+NzHpn^=$Q{@e(LxU+bVQDT_eZ<#ufcxLqpM|? zuXEKHHhx3)@2+yB{5`+*%lh7kop?RSAX2Vfj0^tlglY3xMsUHz5B;Bjzn@^EH&~fk~;*< z!i=9<$Qo=B7V>iQ)vFg?b_DXfgV4x=)yA4KlW}eH)I% z8Zhl57S>L!W^!U(KW?(4ZNGXDG3{G)W5VjdlKX($EPSoF9{!1d8DE2-2HgK7%Rb$b?ypBG0r#)t;7Xp0K6T%8m z{llRpHf|6A^4|H)dY_tFDIqaY(Z;4&-z1;2u(_eSy85G!iK(e9EgfBdmbj;S(TAYR zZ(CU0R^2yinD3wNj?B-~AUSuZ%MEZLhOeb37;d#)8#)i z^q>Vzpi?I3zBVX4>lRkdd2+PaP>yL;*#c+qMV(wS6d^|rXHJw#Ly3$@?3b60HjLL! z9@>9k8zCa`O`#+|Yg_3(Ym#jo+Hpx;c8wyA8y>1Q$oy0@Cc$cfxb68fS-SpAUL@6O zMCkEOzSLmM-FjT-3>mZEcgm*{bS+-hblQ)wQ1CM{l~SM+bAh1q{(t1n5kCc3iIC^O z2g1!%E;6s>(}u4dZ-Tbv{pM~pnCFC8Nf}#M%k@|8KbwQH1n$;Ck11(*`+h2`u83T5 zvx3MB%>wX<%gDd3I^hbfp@er?-&aXQ*vj`_J15!1e6fiZzNEhUFy?xHmkBx93mZRT9J$d|>;!;{k zv<0#^Y#X7`6yp5~fht9Lsr^gNxh7C6+!uE9AK0eb@6)!apguDuCQ^ zj0rPAs5{&oG4|?H!+R~CU!g=1#jZG(mLvQcDNkZhoJ(HqzA<7^NnFo+W&Lkmr}Fsp)f?p|h{qFmm+$@GU7%&rkowS?dB8UycNzJaU|Ss_1K(QF4+{$veei9OeX(k#B!40_jAu=jXD+ z`9#1}cBZD3eD1qXQGu8Tvdvn6{hZ;dBPKwy{UwAO)cG&*?*j~e$APMPb=G7YPoJg? zR-648CC<~RquSK-mKqb&Ld z&!rFg8?P@ulTRS*IsH1yH&9-C$elJdHK7j^;jc41YYQMT&+Sn%=dXnd|GZM%X8OXDob9J-j?ul1#pq|4Wmx_L` zCo{l#S{eCI>K8Ut+E@>LSUlx;5^6))fI;?6L43aDaP#28sx8P$cWb3{AHO1YhC)_t1|Dq1A(Pu{wLf zcUE9x3Kv%gPts35t%CF-H97gKEyU1IKTw!92$v*9;;BPN&sYHc*I}YmpsJ?ketBbK zW2KAXQ2_tvZA6-)x$Pe<4Ks&$UGefU<6CN}W239^IK8@xRX*{j^fUOownJX<5tYC2 zL}YuEu}nUWp0xWxQ)?^X3+LFZ=z^R1ua-Rv3cL-WqeT*hUg{2S98w`y1=o9Iy$>-H zj&Hm6UXaxGBrtpBt72cUbtky0dA@6mXb|nV+|jq96@K33DBJrUs-R%41bC@CmFI+F z0hgnWK|HvS8%P)qnwY*bUw_Fh^%(f5#r@G!KY{)J7Oj=!PH{HJVrxg2(DB~Fax?wp z5o_45H7#AL-&%lprTqL1Eu_Vx{24LLc?RG6Fk=+b*NKX;0Tj*(U>Gz?t#|zwmc>F@ zfn!v=OS2*Kn>TNQ-+6sCpKq}DYAv67D4cmTIQTlLU5g$ZP-Y7uJ=U6K5_V91Yu0Dr zI+!|vY-*qmRB<;&7tpoMwV*|v(;pUqNH-3v;rwyFR3sU(ny0|&5ykSx%z<(G;qn`8 z`*eR8X^tZ{3l*P~y61v-y}!^Ae_)h+T?g_fGYXCcq|BoS9Sp4UEM|x}%A`Cs`h{=G z9TCP@!4e6x`6_Qp{xR{)2*Uea0J5gitn8d`$g}mz`+jH9ehlQYcc=LTKW;s;afj@* z&dx%5d*}W8CbG`Q-`7ZqG5<7xR%kJh_P}4yxU{{GQrljF%tWvPPPgC`6p14T|5Az% z3qsGS2Cksj_Em896Re)CUr!Yq_1i@|=?Q3x=93-yuLMwtH`4Q6Nnb|2tFCTY)?zU_ zAxZA}J<@rg4T4(a{N}pl3ZDnwnsv#9p$f5pf2>R#W#DIhAYk+a*e;(c`1UQF=s@WcRhG97qefh|KXb}h66WoFYRhw_P zq*gpiF=%zZNlGnYDQ#42aD`v1^=JK^I;43Jv3 z#MsQ{@oIO~_>4!_N9?={cChay_iUqM&goru7|F|nYyXOO?fT`5F*G84Y}egIa{*ci zCK)D&CyQYd-d&lDmXkGgb%N0}5kwsfitAY4f{6T%_eL3Zn*wf3q}JEh>jN%xkw;Ho zG;kVA$IPlJELK}_CGYU4G1ot7dGiGxR#T2#OU<(vo$teJWItFs5L77Vxh37ppvh4H zf5Xi~7X0AcFI7C!+Vw|{lLI-9Hw%H}s2WFAvRO~J{_d^rh=?82a8r0-WYk)mIm=dd zbi8=dK$2#X*+yoe;gd81f#&!A(s9d-dI~rZu@KtFR^F0qG9yVAG1#H*@>wWfDkN8Y*J&A$) zzzj|9lOx&7|BBUK-ExAkrdAKLKH z{@{Wu0!5gcz%J#sO?vrBnhLD}MlJ;sy4!ESvd)FHxwKz1^P4o=ex-C;NzEiBdk1{5 z?6=VCt-0>3?GCaxwKE+0K9os`&HG&xSa65t;euRbKfgQjl!>|i(Qz|gMWzhsjwWON z%>afLI+MvCuUL|O&%mhyi2|kj;=d@K;ygI{_i(go{V%5@exGU-* z#|Y?{R?N*-A&i)Ef(}c;OtP}{zk(3N3NT)to}Oaq>gy+<%>lWa2yR%Pb3OkK!~K z`j;2ef4ueV%e=LE0?g^wRg;sWO7do!5RPtf@Y6`iQ_>&TxWqbECUJ0i2LBhEB*|nh zHHPpbt}S4LVnb}>&1^E%d#iA>2)vM>?NaxeG}Y&)LZ1EI3m@W6MMGR`YP%N4)5L!9 zFkh18!b3*saFe#h>GR8F)VLZ+BrCu@S65wXqu%aylqI1^&;9Q8!{1@6Gl`K1?2R?Z zherw+6!y=`C@SH9Cg6EA$?HS&3sRr5F`YEL>2iyAI-VpxIXb78@-vW5efndP4h!#a z>@$i7ANV%{kpi&)#=&q)1D<;wGxqoQe+sUwSJH7G`%tpA8=SZ?#K zH7R@l{(Zte+6~6`Ku?DypUDz)SIVO6P_|rZ^QH>3ro+0O_j!eGQ_3PNtX+Sv+Dx@~ z^Mwm{df#vBPRqvzX+!dc$ArBSb}zlH>U_Ee8z)5~$S&S5*h@S(l1lz{p2DgXeo?qQ z{4&kF=Z><^mX9~dIL`a`dyHJX?Wds8xx5Q0vJ+lKilD@|r0YY^4@Vqr3_JFhvulEC z64#_fRhuqyi+Q`m&Y@!tL42z#Nm|zXvfq~YPPSr7Xp-ckL>90@_bDO;N zYe2$bc}brg-g`CZs$1vKURfw}vF2V~&+7SFCF1B;vbphchq+AcsRe4Bot&LKMxpDJ z`lHu|s(%y#!`s-#pJf3uWkKCLKZi1saY46gX*C1BJ>m8N#{TZoniwnmlIQA_|0Oe8 z1sk^eJh*CC{{G{K{H*2SLbKM~chxdld#yX;W|yzu7I|Ut?+m5i=#2MeouXzVSP4i; zmWTWLaQtm!)mREYf2JA}yOxuL#)nzU!vNS<7QE3{zn;s=$u)bE$7#)-O@?>$yK*|! zVhK{2=2Oh%E;-^VloxvzQ(fU)6LsCA8EfzvxG%&;dVPs=CVOr10YU9aQsX(YWo6S`YG<# zB3Fz`0!HKhoS2qbV=};7sGmu4`3WN|V|9HecJ5`NQ4dKJeUFf6FF+wWKuYbr1EyQg zxOw@rkw)pYib^s>fkxO)-I6U7#mMZkkMjJoU-(&5Si^205rdM0-eL=&I6PF34g#X= z-(pqgM=!LAUu9bqY^-iD4bT;^0NeN|-x38tw=@!^k24u{wK#&4*bYM!QlKiBMj?K$8ech{o?l zI&q6kI`IXgO6US>{hi?x_q%1rP_U6UZ#Ya;rpm8F^g$OGajuzmee|*yOnlR-o()ue z(N!0YU;*d{6h7JiKgzy3E~@U^`wSr>5(?5O3I-wF455G`AR-|xC?PR~Gz zbW1l#Dlv3-cf$+}GxHuEe?Ir#_n-T@TRzOloY`mZwbovHpB3Ll^T@$h`}uyDh%YUA zQHnSGBvl)7j}kb#*EF5(srZuARkG>10bWxu&;BTgkhasK?RIFC=z82>e;Zmq7}Cur z%(2;sN_%?llDU9G{Mf`r0G){nZ8%-2^8I_xF6vYYmlstgr6&Rn3A3L9eR+TjI*k6! z@?_qqElAlS1auY&dkp-snp{veRhS~>{wqG?Cg5{Y5)XjYAE^?FZD4o$oA8rjj=>Ej%|5wExuhp=#cHu|3p+S6X;m z)}tJe4c6`!-|zAsk*qS$kF3Gj-~6$hBc8Ex%Z1cS&N!ZAi*$uR=_LFlffqw~&DXuY zjrVcrdid88A*`jCifD-XHjC4_aPgohr;`HnpgmqnaY*BRtksZJ+s9Xs<4aRRcd+0w zm30MwGwKLc6Zq34$Uf&>y?U(vp%|zk#uZA^w$d3h^fRZTBL|51pRXPHNs3|N4*Rw@ zWIa_CeD%@(Yy6PCY}1Z{1XPi2-Snm)y8y#58)vOBm%-t<`Ry!s!TUY>%Ko@}zpwxH zWPe_#X=GY=1q)5E3%=trDhFMyr(aD`$vxx*;SWIw0u zt94oMFJxxMyt{-%)GrapWLYJ4ZzA(?I*pm|SKA}y?4SnNET_8BGNotl$HH^XkA?Rd zW|#NVCtQ~3I9vns`ROAw_kL`0a1?UV@BY_CD#cGKVyaZyzlRUx_ov?6!j0{v4Xxe( z)rOwAY?APe1->_FK4A^nqZ-HC1MP|TsYB_dlAqUBEaZthrCHIxfX*Pg+Ps&Zvws$= zd1V<;U}HFP#QWrjw#GcUMYU(8Y}Ed5g8-Ue_#gJoUc%8KHjw|Ak@_xu16+~QE>1tg zm?V^*Jo$8w;^W)xTIcO6#@gIwJ#m`9X4m@DZ;wMlls_>QZY)lUiHjd>+YMJ%C03DJ zduT~;qC8Q1sVSuADd*sYd))N+O_EC93JWE{A!^O3^{@nTXtc*NlT_)pj%Px|mlQDOKcuhHNN{Pt~h-lkr; zH&*m}>vw^&CxFa3Lpk3ki_*_?|%3(hluc&yM;mh+; zZb}?QF_>p@OFlAE>m59xj>-gi4Lq3%E>pCnGSd8}`^2zpKOVnZ$Ix{+AQzTNwX1!t zRpj-p-#H#sWDx!9KU(2$n_et)198^@!y_5V1{AK;u>K*}Xvba5Y=!m9ZC7aibV#?w zGY+gHS0s=v&+oF^+oL;HDa!E1DhE|5@|CJ+;ozW7PVH6QczliGJVjH)ZRIWeOjXSp zyg6J8IeO-V&F8OI=o=vFuyh&p=;VG#PG+emw7OeTS=pgETeZoo-E()-tT%yJRIgxt zw(-Xph;`|lW*TKe#K&V6$aiRSEjlPsmu0dNMifI+)+U+CIIBrXzXw5;;C&755!o1e zkA2wTXP?{4jtmjq(;L1t=axIR*Up=mX`m3vVbnwLLIz1Wl&)VPsD8azb5t$yTHyV0 z;kD8v!87}uroj0jbhgH1Ahzy7nZ_jaGxZt?+&I|btG&Gi$#o(a6p~_i9%wr56BQM8 z;1gO3R{s%Z^1c~Llt6i-Rprtwn~;aWZTFin?B-BG!R41Z4nc_-A+ML}Rqwmj<)sj4 zfC)p?$UY3Tp9&(Qxqm5F*L>nWq~BZ;x|$>H=DT?eH{6oVCf&WR>mH@R}1NLe|t zs{^k)#`hPaw2uuY%ky;ih56npaEuliUEfdU-zWdkP9GVPIO$lbr4nI|5V%Q*wo(ey z#-e1j`VC&yRWnGmJ=D>$a3Tev`kC_o=b5+Vh! zayQXFpicaWaWr~^m$F`*sm+SrSM>kFMb0Gt&~~aywl_gce&XGR3O#upE5|1YS-ZwH zoJvr?M0s$9!L&o8u_+TFF}E79^)>Qnv|(NBm#kRZNLhFCf^4;dn6lW*-s*!N9$z{6 z)5ffoo|mS77MP+o|C*o)3jLc~zvsK|99};3%WTd>bDXJ6iFI3zjljdtY@SC0u6u1X z)Cmt}Cci&^&sdMAvoOS8OkCZO%qzn~8#mdp?;4(v6 zbpMZIokf3|zp5+tT&ytk%hPBc1Mp!mIAyB0mkfs}DA}&}K%y||Pd_Ju9#JZZ5cx7# z15;};y+obp@LSafEV&KQTrYk1@2y^GR1BpjWauvcPU|{n>kXGc4WPE{lA#Flr0@^e zjKRIYw(sy{r&iSB57Br}vCl)y^KwVjk0{4Kk48O6SdiTyExY~|A5+b?$F|pl9IRS> zH`GisOSGjPh~3xYY%(w4%PO}C+<(O-{>T9@MRigM7q!|1A=e>(mT{+j07VZ? zQg1jddfAa}cY3-!s@fp!cKcVM-jnsj1Np6lH@5^jZ?h{$Mx~C8SA0JzVP*^O(uU}# z>Zj;`*Uy;Bbba3Mp{;ObyHWiX4F~6ICZ+@pcjZSE8nu0XQZ3yVkM;ySV-hp4^RUz; z`6yx^*siw~&o=;g&*JR~`H3nzJ2rx?P0=kh`g-JPS>AxDu$vxuOxHLdAoy~Is&2?(Ju-4lj|+N zTu{f^gG0RM>14^M0?G%5wp_YCC0N{TKw9v0FQTM`kIZ}SI)Dnq^R0TTF4-A6*WlSQ zQGO+pDcRW!c{p9DxEOBe?rw87_&I%<*k|xXQw=W4-x0X7^OE{rm)Bin*P{|WF%;Hk zfs=g9mot@hUK3mB?4JR@m$je)+1@=cnA_MJRt0_CV`2MrrI^uhPB;NT!@~I?88n7nT|m7KrVck3u~Hx-Wjf=46kA-Yc3l4S-PLNqm1q>6wbtx1 zd)k3LiC3Fy{V4nEi??cLl3o&^^ZFsbc1UM*M@QCuTjg+VxVMq2tlZE0)lRi?KZ8Z4 z&ug3ZhVv4ASGr4%L9a%w3l1wG2Ssn?@cUzJE?s%D|EpKBR`? z21WD!{=V*eXOm@i#juA=h2$?Lop)#I&-s)pY8_Wq%eSAkSIX--IVX_kG-(U1P*sR~ zD;OFYQlOtNv_%DG=TV1xsHU4BGj17omAAlb_+sWiR?vH8k1(hkvPv5I@v zQG+LI+lu7vOp>e2)wA-iET293`CGLT^jdR^XePxaBp&iBH_&WNlpg#EGI{jC_Bk|;s|@w_L*rVbz*@kDHyYx-JH*NSC8RbgNGP5#p6vR z>k1UN@6HE5|1vs=b^RulshYzNDgGTqwL|xrQ%yxh>w8`IbL$*&Lx0V@>tJ1p@4hts z_70A(>T($12V{CBc-p`ODumgF>1ewW4K8M3n+Sk{3x`Y{W&T0X)JXIHJ}Kie7?XkeN++~ebW=KY0%4dwON*NP}bL~!zORgS&*izHb$CfW%83;CYEKW6V-y-12;yfUa;u<*$S z(oiGEpg^7T84q1O;k9=jP0_g@iQb1cA9dt#DDp+bS07E_RGN&iO?V7hsC{BKmB;9b9A$4Caldtc>$R52tA)G|GOHg< zJTA|R%=y$=(GX4Z5eqj%e0&*zq1ynn^OgmneLfHIo*m}w-r}}lsaB*%t#kOz2F!`` zi`^My5;@%horGBkuFG;zZlE0=7iD$ zQ|5(zjyTd9N^6tn_JFa)D(Gfl09vmD;o{Cy?SHi%w(=D*FtvB=B4#%S6y^+GE-a{Z z+WhwXLD9?7fTxM#nnMAHmL?`?BQz7aC*fr4LxFmb+lif2}+~N4%sqvZrM(n!3HZ}E)-Kfat zFey2_H&33_XVcEyW_NSxIar&)wW54cH0$Q=nbG=%TtTl)ycr_ErB++KXK{5c@= z3a`oU`cc24`Tg6FIAKi=NCFY*a}J0;az~Q^RvRZoGNo79fGcxcWw<8gG4ttsUokxU zJw8i4Enk{7L(`CvA$1(xi`IA+2NBt%&!4|{c0c89ct*{8?W6X***8TbmXo@*qw$Wz zwQ%HVTuzqXDq?m~ifysA( zG-ryH;v2!_XO_ns!}M(u?X9pbq#uZ)X5N}i)SYUU?7Iqipf#i!tjlijvHO-5cfgk^ zwy@!fB1|%-crd8BEb#lfc|D=c=G7lL#r^R(D${F}Q+EQ%L;PmLtb*;+60Tq#(W8C2 z8xBq78gr$O&C%&bV;BJteCK)!=m30uda#UQFC>`xBu`aoJ^o1$^+Q%BnaE3c9%!(K zFIJdBr7Ivhin=ULVUE%sJHsz4xi-Iv=`0v7fKfk{TA3zl&h(S^?#B4tYR>c3<~2PqNxPCS&BXZnMQKH=(!?yb|PoJTokKGjmI7o(U^8f ze-sfoy!XSE64vY=l`}RNUH~ZJ-Pzgwt*z7WQM+V&`g$9C2jeZ`D~9#%u{4yF8O2oX zd1J=U7%Mzu*}vh?1IxJg)3wP9C%E9-fJF$Iiw@qL(Z3e)&Oz|>&vp+qnk(rW7)1T7 z0ONK(Ps}}{--*^He3L7@x4yHZ%EiqsL~K@uuX#)kEzTQA4h;?c4p$ExdxcOVOW_7R zbKiZOW5}hkSnTWmv`5ALaan4~S_gj8C%dz}<1C-?gZ%LK*@Wjkl{@SPRPMQ&609Lk z{9?W>;6Db+r8iDy^D7KO?P;<*r48ReDdv69p~4m^#Mq;7^*UrThA+H?!X z5pf%M_nDw+hL$TFx8K3?n0rx|m||wk8~WSj>+n0=dTsOvt`Z#dq?bRpr*3i~WYno( zKc`E^azp&N3te8Jy$iBtPM3FJ$j3c+DDnz5*OhBZ@0*q!-!taPhaIQq=!26)@j~cK65iOb^r~U4$2%`sFInlQK+yT8_D=(!0)8Ci zrVZsjkym)*X6klV9QX8mGZuxo-zoXM#ayNBL92a^UNS!;ZdCnzHV)F%+m7^6+UX>? zJY9W=8}{%M^I{;t+Zjxf%44k?PFFDa#Vo?3E8w(It|wsLzRGRL^&7-Xb;ay2uHFyF zK8N|uuAQCv`g+Cy6sMs#Ze)ZmzgZ5g&e05Yql*e%Ud~uM7uYW{Uw{_v)GWJiiX7c- z+4l~@DN}P#bii>x+|F6{%5N3Z{{mPq`(FIu1HlbAJk|s@1-DdEHp>I?{e@uOgPRPM zuIEMhrL$`^)jNk%I_91HzRm!5{?yxEdKViC(eFtTyeqsKYi?^1 z%^Tizd?21ldF5sGD$ghy^BiU{a9694hlL4lYHxpy0O}W|*Zo_Fs$|TYt<_t_xniPf z(xF~+GvMxI1+K_oGg%1k`C4(`dq0AWEqlL+ANWJT%lyDdDSHJW9^@mxFKUw%K&t?Q zZ9ZdZ#QU?}hB%$ewyisSmwafYEA~z4Sf2wtVmyH*B&;u3=;;ciTo=RiiY{@L-Y0qa zjLbgV6*>UK9FC4|lGu}&vR3kF=jHTg4^5PAnC;f;iA9Y|dKTlm@O$n&dWX~gUa0CK#^rHE^qR0vmb>kfk61f9Qbnlcx8*?C{IJ zbGRuz5nzjvDCWT{ywNN*mcrROcnQTs(4@TU;az|W|KXK6_ESZV(VP)N4-0UsdgTh7ePR^#I{NK1G}YA0%-s$SV~v0^4PU*EF)c`PA&idJ4vVgFl4 zJH3Mb?3dNCQ6?p=Yv$E6nFUC}H}Jg`X>fOu9g}Ku!Ev|YZnp$5J+gTX{6h@cbF`g~ zwiP)etNKHVL?SE#0}}?CnpE)p+*LNCP^~U%j7yJ%p8|taKqJW<_qd*f{mmu?74#h- zjPNx_lRv@7ETzx$Y${yJR2iDzGnDV$e(si`Uzn}c`6i10rNX0tTje)}R2VQh6>iC~ zv}R@PVs^T-fd_UAfElhIQ`vA{WQxyf$ZDr?m6_49hakv(DUu+(!3*XOJy04z++^SY zlJV@`)!jzR7oYlz z$Zy{a??x)UtUh?_FW37!O7rz=rF$R_Nv?eUsNOL~-t9m$@1(_A201%%03Gs;>->+h znPbBTR3v>_#fhA0ffM{xo4bTQh39ccLh!LZT+~6H4>*6a)8#XN!gb%?Ig6&fw7tA& z(&(bL>9F8%-e5Ifx`-FwZvEWu`5gZ-=OubD)RtT@7WR{<$AhU#ejf3`bja9p1o%0gjwMTaH+cL$ST8=!uwHaE%tSDl_rzq zig-FXiG&dqGknNW zhz9lG1g@LM^kOG%fT`C?0c28UU+S!+XZv1Kfr$22=hO&Lz)v0gHhmUQ?%<5+* zcs;)5aH=)<`umNY!z@o&E)=dj_kTos9~N-chu&ij_;}NIO>)nB#|?juTm_Os5^gIA zreG3!jS&HqGSm;AzAxR~oZb=P2;hB8+)FO%QMG61s`E;R>I6T5>vHv-k2~0}Yk2s*)XdV1hP2ew{utoQl#Qm#rSO?x zwQkYq8k}5P)I*7y64#&E?|rxfElhlbGw9j8dBL`e4e=_#b;xl!&2cY_7RbB{fVtEC zo(We#B5yvl^4m1n5vt%QBRP%Rp5Cw}6rKJpF0L6%vzDN}I8fiP%)05W%pE*GLQAB& z+kfb-l~K2b?+D@Wvpkx8cQUJr?*qNj#2|1~K@0Gk0k=XJR^g_(poXl3bX7HUM5PbMCQ#7}_!6*MezrfnEK(-Fn9 zsgc7hA*|ce>izBIQSvUfYg|Zg{EYnXl4JcNj&N^EKyE6I*vH-{yO_AY$D?>WiOprs zZpN#NaEgD4qVZd^6{)R@NI~QI76dHxj4n{bZHoXhKho2UR#Ifug~RY3nu&^E;(VI0 zX7Y=mNmQnv=45y>*Vsv6rfb;MdH$ZZi%qrA`mcxJmxmxE{kS`kU%v1bCSLXNhF)w6 zvJ_-ctx0?$C8}!=SKs3taUglm?*NVDz~Siw2YwZFUda3&hYz&1zMvMM0wJfLFfx$`bEuuDB=EJ|-~ieo#gwe3$8TqU z!>}Ip+&M1x?E*-L@&?#V`QgAeAgG4tGvL&Ot5-WP1(=huCUEuLIpMe*2;g9olsEFf#X_Gl7qEP@|D3 zTs^32LhOBH{eIdAL0ErBQLL&-yJ>MyFsj7!-+o}T(#>S4{0;TJ$bF{qEdIn@Y$)%w zFLaxy@a_(Cuj__%q3tfdeyC!!aIV2*8xGg&_JEuOmmlOk6~IYCFjFxs|6kiGfoue1 zkMkCUb%ZZ3+}}&|X0eT!@xXPK{a&IsJ@BVX9eNbFdnf0b)PcyVJh6Lw`#Rq*M{qPD z$9S<9y!^S=zmwkuA7G{gZZerLm7eL0WjQ<4a)OMCUpk8l`POoj_^E`g~Y zyF5KFTAxTu-VdTz#LOR}l5lJ1#nb2F$HAGew$ z0$}+mebn%qF8ib?DteE8ROh@hU4t3g>Zw@>r0dY>Fj{L8s*xzmt#h|*2xnyZfLwGu zukgOVfO8Q6nnL+ZD?SC1(_rZ-fyuM}`oM@luookdH^%Pk3x>;@yaLTQ=|xkHvsu&p zodMmtlyEll^9X`EmgL1sO#CPB{m#grDEq~V33trj{Wk*AS7Zde*mKM-H5t9e1A<&M z*a0T5Adl9w*;;-l7n!xa!PKAcX`KB-MN5R8Yj|h(JJ3BfSglsvE)3WUN=Wotk`DwE z@(6$@Bnp5`KGeLsc(cY*Er=u;{vuLj`Qy9t!#&!D#c*W23nrr_Ad#AwKw6|Dyb^cz z3qV0ncJL}9*{>|3KF;fOF9*mzeM9vvmM$E$-d{A|ju+DH`~pu83k37_hd_6c2@#eP zvotLt0Beur`Q`E08q89o2LKD;dm8Z^PS~fa2e@&{(`Mbji*237O>i64kqf1LWHbyZx^LaI}#2Vmp>0-3&mIPyFJ_u^GG_2qtqZ~3f5&uP? z>U@VLb!E`o3_SEb>4xTFWT#kuVgSDCx%U zfN-@s4k~*B!)HySi{Ntciemu!PgYiu_j`Jo3j&%_8DI(NqgVU%h_wU(Er}kVVRw>7 z(;Luv=ySeR8HM(tgQ=TQ4_^?N>p=9Rbjl0o7Dz*{r0#NSGffH!E@xfNAIj1=fC7J9EHy1Z~j+t(VB z`g}lJ!FIc&3j5(5VNAgvPZ3UgbIrqZi{zD%XMs7zk5qU;5C~8#J)^F&=Wxr|Ep=Wy z+$?H*VprgcSqz7gnIdOAis+zlPuC(omj;J?osyd&r(Y4%rd{8-Kl!7LYTo_oVRGc% z(Fdba!x|Nz!tdU@cd%+<(>mhpX=cfHo+I(%7R_w5a{- z!RHA)0wd3T|I_uXWIQkwL_kgI_=PLfY9!ydH&s6H=U96vLyJ|LgwqDqjQ3tM(MkcB z2E7oMrLXIaJwLSzYrpa3{M?g)rbnA=-V<3@Q{l0ezf*m*Ho$0}*t5Pea*7esyxNTO zNQD5Oyg{k183in+s_d`G@_sk(Ne~lowU;!2jTN)eBD%UrIuJ=xR-li-X4lDPHF!m< zrsMN%%=5(bRkRNQ{PC7LKIQU&hXokOI%Z;*`Kp{Uw=nh0utb8ktY| zjNqqlWOzNZ&@=TOwR}INs9XMad1auM4rO&dwc}XqMn!b7?x}EKXW73m z$+QHJM&eaYJI7bs&HsclO1Te79`(ta^`*%2?b8@}_J=S@2yNV#^KqcTa79d4jaZTCaIs+IB#zxi`m*1REkCL3j$o9yg^?3(9Z%WNl-Cr zxTd%ruB@D&9;Si`z7Ot%mHzl4SV%MA*g-Woxi}tU*k*);lPx*wFP9`>cF7J zx4IS$wONKr;QC}Kb1VyI8kGKRwR@aU*0_=y2kuCDYhNh9d4ThAo%g5d2E%L~jq;h^ zi<5BK$#;GFY9{}sK-;<7?^MNUw8z+~bUbw3(JCB*e~G|jLlTPuIq_6oJ+fVBG-*

6u%Gj*HIwM(3#7X(AJg-SKcK&RhUQnW*=0@#(SYLdSDF0W z^nSk&3Yk3+dAQ7)VK2{JrXG(ZFZN~aVQrVQ1l%)ZNUrT{UrF`X?ZGm`<8BfFtdIcK zeW33qY^oe*O_8pzn;I|h=MpV1U(Vtz`{W7nV}dJ&qr~fnWYH&t+p-bq%9|Xix?|c2 zgS{5l0#Thap|+2UDs&W&ZQOxQadnvEfpdNfkA zm11^s)rkk0ABos97>>2+hWqv<*zz{D;-S=AhC(M)#Bf?iJDuDL#Ge_26`Aji$Rc%x33gqc^J=8&ls( zS<)WOJ?1hLy!8?hDr81FPLmM3exF^$8D@5Jg|EcR;u(?0deRMdU+xxUyC;q5>M|kl z2eAAWj2EC6dixdWX{RA@y17JMA}N$@nZo2L_a$Tk)?OZQAWuJeZWTBr)d<;F*FCa& zr{U3Yg3s;VThoxL9HPgHgqhWpep;v$QkWPyn~pky|PmYPKD> z;G5}m7A710c(Ahe)Nq-z?mtDVzQ2EFhx~_m`oQ@l{@rl3%REOEan~S%mc*ep5 zU^mP0!flB%UXdqxztplalDvC2Je`h@978M!^F&RX4Og01s1Nf=#omCQjZZO>P;#h zGx#51Da%WYx8}ACe^+wz4xuSO&aiAJ!_D~|j4vJ0#VYPH9J~#URrd1=+QdgQMl)d6 zG2vi1CpDnxH-wQoN7%A6WR$(KNvNJMkhqdxMWkPVe80n?6P~ZZFDh zPNK~4T+eJ1pKD2+oR}a2r-D~*xK+H5{&tCPmlt`+%InaiU0OfV;BMa+u16!L!d)OB z<0o0nu7xD*BPpY^H;EL{3f6V!kS`K=^2+67cRJDr8y;*uTl4J_{b*plvm<+SUWZ`~ zcBAK{d;cYJC6T;=r4V*TfYUElfS%|LE1%) zUVVKslY*E!mfbvy>^e@bkcN(Cy5Y7TQixz07W!(k0}*Gnu|+YnQn**w|51BCNqp+k z9o%!aKAR{P8Q$H@(_KQhhp7Cj9KP*b|JLc_u=D1(Z;iu4Z!4|QGnMf4VXG8H(jt~b z@42S0S6L$Eq)in=;%VG&uF4zrJxtxSTIoTauxbSx8gQQpOK;`r324mj)X{ert~#KH zO4hoThRuC3&R%Qdp>0TZ25+66jIO7!`52vqN-OVOuWn)^DIc2ul;qpPV~u*UEJUtZ z{x#0~-DT9y?sh@_Zc}^l%L?yFGG~OaqajJ2H>Q3h38wqTaV&DMTrY)pcf50RIf<`l zuIsWp)gG@AEa=iKBNX0?-fL1e{ zy+V1ktkA#yLvQ)I0O8rwKJ6{KH32ztd-zd`qp2#=gFxcshCsIKm=kV|xZzAjzWQ&; zJgTYV3r-_xzMYaY-I>K;)_j&X#V=JTqboi$4J-aMtG2b%LrF5cE9QouK0{zf0u%9T zN4$UJ@JQM z)vd_59r_t2k#4p~2nRB&SLl#3mO4%+E~3^`S2$K1BfT<-hWJZrVSHSvph^ z2|U1dv@D&}s#Z)m_DWnmQKD|Nt7de!u*%zoX2-Akkz%#A4Q#eiS0}4Jn(Izt$c^v{ zI=luw^q|t4hGyN;h_2unHAy$9h3TpQMqz#<64C9WGd5E1<@f77UFgWPh{e#Oc=#`EEGS);c z-a4bqZt4sr>BdbOhd9?n`Q+$Hfgs7os(Klt?D(9bY|KwXHWwY$);PGSyB~FoSCPp7 z&{BY0Cr;w;cK=}y+!22M)w4>?iQwpcK7YP0*GW!rSX+d|ZT)*zq8VqEX=J5vP(YXI zyI3q<5@q0P^uV^<`cvqO2Dqj8&f4%EW%yf;@Z|m{Gt!NT%bXpRKIFVpdxZKm-syd= z>4+C3)z7T3ce(4`QCFb{E#V0@?Vm~~J9mr5B#gmhS_HoHqN0~R#fOv1@8(t-%A4=J zJ4xQLeE6%#BJ>RaDjJ$Ej1KE;cVCWYWt`hTtW}b3{84^>bd>3gX^W^BD0%cT+FTZ4 zHqyA3u##H7BU;0EUh-73}=ctX2WB* zXn%LyPO&ruQ}3!mi8whtWO&>md^^@8vXRFF0(}?D_Ak9@0Etpr!03}hSBuEE-;Gic zKh9s-K1r(2d9fo^`7qN!YvEKnRzJ_n@o7%a{)PcOjLrPpP|iqiau(iX_x&fnF%2D2 zN?BxWHOYO-$X{%lzFLah1dcopeEf%jyg(;2 zc+l}bFe@oaThZBjWcP= z`;pR3u?Bd}v)|!IjP1hwqMmx*$z$2GBHc}%Qqjg{|IJ}S2ukv-;=8qL>ByzG6*Qeb z!C&6Pj}QF|rw4oDlY$B|4%4)T>j;weYEQYN7Qf86kDJbpuG#BGR&0v82>Z}#5FN(A z`{Z>i}(+u=W9XTU-Q4HoG<+uQvMdpXkaeW zcuTO;)MnV|MpHmmIU7+~CJn03bU2+@gvI@2WVexNIyvkS_5sV=76pgE)9FJNjz6b+ zP!c?144yM~O}W)}cxr50VYM{4mZh+;a^|85gHi`4d*e-L%4MNC_jCnx^(ZX+I32{I z30_#e9R6tM4vTb)R^!}XqJs-#sr{8@&Z#0%*Pyaq=X5$l*U%@9gX!5xJ&AX=Q(bww zHTHex2Aju7-CrTqD)=59y={GSbg`9cxUbeT6I!beN(#v_Iqq*SwJ9>_GB8QEP*0Gb z`6pgzg?|n;pZ!RDUh_Y8Xe}2h`?`yTziSHHU@yQdbj6w2cpWlNA%Z;)TU6Tv5l*>6 z@FzrT+=0x7*C)wEk3$6AAqswmQ!{&X;v!__?|AZ6$cEY{PWHwIi2{24Bx_j49`{;^ z{?~Fd_7J{2r>wqHb)JiP-K9-K$YrF*!I?Pl94?H$GY;;U1xzxl?OtVA>&&Ch#pb<45$c4EZFlS>oofhtu-#50t;GZDZl3lfJm1!Rlh+2`AX}+(atUf!XD! zVc#%G04W2<^73*?92SH2^L92cz$H6DWd5pDASb)($qYQ}r|EIrU4GM*P=}*_qJXw0 zSea9y`_?x=p>J;3;L19H!ZtkSb6dYatZ8eD{ z$Fz)$RWX~|ZQhT=C_6XzicY`G6(xe-`0Adk=+M3+zHy+{JSV$yB&=n>&o zb1)jc+Xyp>6v!1`*l!iD*a7VmsgIJg88jQ&41qr)Aa})fHi;DP`bUCae4uGH^J!5P z=iJ%mS?7#LW$>`eF1#wF&ZYQioU5{y6Gil0s9@!kr{>;J0|bM3WZ;)4tGd+Am3k=a zjq|lMYwtYEN_OVjkPpvV7Xne4_gdb70k6#AP;3=wj{Y@^JrO}PI4u93UI4?}7AzZ1 zSK^CxiuJZYTcjj(MBPa-jB$PZnMhiLHh$wNaP5z|0bX?>t^;6T#_7?Z8a{Rrie)zj z?Ysvgda&{1B5#b9Wa_?&c~4w<{3Xc)5H_S`hRN>U^+)!=s7TI`OVAoV)lHetx0J3^ zU6zxH2nqt!2|wR@7?kqt&ew|1GS><0TyTLBRx{mPBzl_PRp$KIolR|2{A75wWqvQYx(NbY16zMMBXE93MtDA;coaRmtBnEkjip)2 zXLmL4P+ixN=lBvSnNT!prLleN9_5-f*i1hfO3z3WOsHhYMJ+I#Mzle}OC4O3Y-+T0 zlia)L?&!qqkfJm)h3ca3YxaQ55ia+|y$uYUK{e|OeW-#%gKj~HWPa^*VTo$i;B^m4 z=HIJ_kFTEAPWS%cESt3Hz>diy9e3_al{EI+Zy+E|+7B-pBS4{Eprz5Z{M@$GTRNG; zUryG+w>c$0y+2!h^ldps%OPF}t!+zkk6Dl@bZArZ=)rNDVGZZT^BgJ%YxF|g4AQxF z9_G9eZp8?AKDy|!6`cOs5vLtol6kqpoe}@N&zNoH4_iTcg&t4oXj7hOjm7=3ADkz9u9D&iVWQEkGmh)T ztz3IgWa6>kaFO`HMR#X>qJXG(ARc_5oxgK;lQ%ke!dm!Ve9sduMzXw?dE?d+g*x4W zCs!L+U23PR-mq9LEeLrja2rl$EgriwRR^&LSY>xq8*awf%(_YzI`*rrN*q`AC8KAz z#@b%t%ThdQ-X|!pwx%L$`kIp%&?YLvr#$U+Cp`vt=t~R~6J7>nMx9COZ9{N$AbuU##_^iSbN+$z{fIAfoA82Bto8uPcF|7GqI`Pvg6}@yKd{Lh z0S`EME-sJ(P;VFQ9$GlfD_?v-0R*((zIbyPNVZ`lyIfF#*8TJMe{L1T46JNT69(N@ zq-fuNQ!Jss*t`(XHcc9RD8I1t19p4oQ-FZv4$l~yJ+f_nYMQ+Mg;Y&gTI|NC2*EV2 ziI-nvP(q444`vPX7irsGsMFO=-WIvZ@x;_zh`qT=3;Cu?=M?VPb`B9@uW0z$D>!3q z|DE=U>b1)6)l2B7Uspb}D0&qnX7OLl1e_Z{OA|UK&=ha7=FP8pu17oh);(%5@ot0N zVj|s855u#;JW28nZN|YU+b~?_=~c}QCunr4LdZW5wxA?5?LcgmNmn~qyz5|K#C_Zd z8k6L8GLFUZa)sCkt$si5A1kUqnP>o0C629zRu?*sW@~0PsCf;ij9lu*n1{w@Ck^%j ztm4RRB6g0F6A7JEIulB(O>$@7;RaJ~CuS2^ zI28ur?g@V1e!CH^@{a`Z{UyYhSW|KB+rrS&lKb<{gp#wF$LfHwX|f(2&>b&=Xx|=1 zMavNvfEBg08JvD)Cyw@9pz?IMv>cJ#(;K zk=-|^03IGsTKzlRAdA)!GIv>1kFY#3PKzB6dzE7*!1>XP(RA|Yzz5~hq-jD50-#wE z@jDDrh&75Gwy`GW5EQ(O=cA?J3$Px@EW?I_uKgixOdUiv5PIbZwH9K+ z2QV>kb;3G3 zK`I?V6AdErc8JgLhaQaI4IvKQEtT^VN$esxve|hgVy|+<`t7U9gAP(d%bfaOjl500 zkC(N9EuMghB0y)YBu9=t;9t6%5~%}r6?tM3WWaABS$1pf!{gjW;R9;CwKLPU4tpS? zQLwn&%(QUtXY=Oa#GV)Aco(S3KVSlcXJK#Q_y5YB>oY+Uc_Q-GKZC;88e{_=(Bmyl zX0}0O;50sy&|!kZy5CZxFzvkp2ySq=o|h}7_zj2+Q^O;v#v<03VV?%frFYX86b%J| zh>aJ`_}~&i9;A@JIfs=qwGt9|9%@L8)ZPq#jGkSjpV?BuyaM)8MMbTCZ!g0&7J#OT z)7_(0p@KtCK@#%wl7w$7_KBge)t1JDV$UQ8Efz*Skx*Bke|iRW+K4j+Az)q|7rnSL zPN3ol9wk_riJ^qFM8If;b(hsh1uFHnWM8q#M49EdWrSvp< z6Q}mHtgNz7KD)8{s}$pFx|w+m`L8D0Ap6-aoL4&{#Zc7aek2CPZQ;`7fIUNcWX2qi z&mEx8Ylr&uq>jVkaiE*No>$USa6~&{01)#UYr0$b{=QhngRt4ra5fLdSovrjGc&Wy zH)f_LPrAY8{My-MfL}mgzG8m`8pvOdq2wVb?0PD8R%vNOw-$01#NSq+6c_T&5f!1`oU{-7 zrnjhfM=@$+TP&+6U2?W6b5}!fO{(&$EcKrS*)&E9tSCq9Dy-k8i_kik)~lPC{G{8V zZr_lGUHlGbO+ptIwzEWs?XNN~Z=w|U#rbDAk*DUD`IG+=ya7Y(b&X-c%^|VwX5RUk zQNHGlBGXOY{p#y~u7EU25)ZV)bR*nMMgIH+&!_tOYX@||t!2ly-`E{@0; zxQ;QDXrOgeXVge45_JZHc}kr(hH_ej1_g@LB3}O2q+_qYHptWx{G4ua6e?7;+!E&{ z0aZ!5=+MUV3p-QRN=^FVQS{I7nsizXi^@s%++9SSw5-{`WSn?v3GDUBlfPUvTrX}R zbHw*ao1fN5a>fG~l6x(~X~@x1QNlYrlF6P2AER_kcMuwsfCU+{yu+uZbv5C`&B)>L zD?oe~9Ll|V_OCX+O8kREgC1x#8+TF~n1anVctw|JBmyZBsek zwMHz{7RPkH-K>B4H2m@$NNM~@<#x|*&FfC`PrV zCQWc$BO{x3r-4Ic!ab1{LzcgciQ$pedSlsumy&lAD8Bvwi2BZOxS}rHqxYy$qIXdu zI#EVRh#(?GX9$8QArd9T=)ISaC=-#8LbPZhMkm@R5#8t`QN|!K7<2B)_ucQ_=Q)2o z&pv0)cJ^L-t#`faUB^BC!zxn*a3SyBShnc^+Lc(Dj z-bkT;Qkd*-U|`U7L@k9fa@g0~_(P|d`rpaW0x#Sj)-ps~fU5!1p}228yjq%W!?kns z^63J3UoW8i(N)G25t+LY)kb_SGW-?zsw)G|-#av>;{SJl*^Lahm#?Im$4#G=Q0wSCG=n5wDB8ccP3cJuO|2$Vml#WZ23g2{9%5XyMR!YxY;xNk<# zT8NF1A$@9%U-=-}}iUVl^&6qJzA)YC!NEQeg%8^@7t_2_~Qr z`V6>Rsf|ppOLKqB_3<6n4SQ`HM&zoIwT688{~toaIHSb0@;yoFf;$Z0{@7&fG&|3H zjX8I#@KvJYYO&QSCGf}S*bw3W60xHiK{IeGPAL0-`+sT6)M5Og$5B$i>Pi^$3PR1H zrZ>#_sfx;x=0VDqlbKBPSv-cE@l-t`mSKH|e7J4jcjS-o|K2;1ZS9k(yeci(S66#Q ziQ-R1b%P_PPko1sr<`UN7Mfa#ZQd7w-l{+;tSqxD@l$z9B>p#48<4xMp99T}a)Q&i)IUa5GX&62|o?CW=dMn+gkN6i?02-`L^Q!g7H>Mue zorefI(3EL`y%w@1hBL^(Q2x7CMBAG@A0E8?Jo#Ya(SKq|7GTMWqFwR?GSkp_S4zk` zh73n7bR3ZbBJEAS4=I20kU`rJx*`h5geb=T?;pC9+}T3^20<5rUx@nGzo^x5jZ8=h z0ATzb-v^joq)vApZ8PWcLq8m$@S|&pbp7ufOb|Fd(-~L+YB40SzYGA73hZr9vbgyJ zGmj7uTbwe&)+?%qET;*Y^$yp+JNtfF*o$giVir2xX@ori!+`C;mS6s1khS`$deaU| z(GCqnFUSLcmO|eu{?BE`N4w_%%LB4K;zDDw8L!nKML#scd|n=yegvYX5m$=d93j!} zWB@5^aDBh_D0Q#s+o!bj72CPw?nF(0Vc+glmY@{@+Q^tC+xcWJIosF4B@qAL|Dt7~ z36t&b-EV)w8;|}TF9y}NcuNRZ3(s6XUOnD<0Ci6~7}7A_2tmt09L5W`EG< zRe}<{ILMJ^CBUZ;m7-bod~Ck)G0A)b#ZLjT=~x}pJS9uaqBRt)R)&KA%}`=pkc%hL z1?u4Hg-y{8bv!Y`gFB6w*YDm@8UIz=e4)v7NRBp)c+m|ek}c8M%Ds?>k6{NUWqyez zjhsCFV|4vG_v}YjT{E*CY(hdpB^4Fb#JslFC2l+0)^&D{F9ChK3$c&B{jq#FSA>rK72?Sin@;e(^!jgi=|KTjHsFU-7lANBbwcXgs%gfN|bY^9B;0hSyF z8dBovUrQ2^dyix(TUu6W6TueS-e5SIPgJSSk4W(6?C>cDA;n5crplWcuHnqa^Vp1T zkl`EkFwo<>0+Mjxt4zcJFOZa!gyrEa&}D^+S&an#oJa;oL2C9)YL_n)=ElZ;y+G&! zwY3461y&JDODr92x!-n^}DK2(tYeWcNbw0MvAcTuP+{nLVgJ0BFTnl>j8sBqFz>Dn*B zjb%()B-A76U{C>7s3uJ!tTGqE5CRbIT0byQwY9a?$<>vTiHV6CfprN>oAa}4i>vZs zyKJ;^qmak!-y)PGE*SqP8dGfFvNa^v`Kj7l@QgF~>s!giumiL8Q}1g;5CW3*9MBiC zwqZhvq>McUu^K@=wh-=nq7U|o(6)P^06^SYQEe@)`)Uj%h}-xb%=GZ^h)SQC)10?! z4K@~U^f8-m4sf@)cMtqtQ{!Loo19mxDOK?dufqI09VfnpL(<+1FDoxU!ZGoxzJ>}K z`z7$mYyJI0hPQ7ketqH}o0c}xXJcan5%y1hbwpD$6%)pc1SRV&+e(B>k#$~<~748Q5%1HPEP^}4cSb^WA%hbpEHm1Is_d1k_HFM7n@IS-qy-PlQ~RCS z*;xccSm)%xr9cYgB_BaRkFuwyM^ssv(bbjB{%u!h7q~m#L-qUjZ&37TQ{Gm_T~e}K z>6j|^pNZZ(cV-@pT?q2Wjk1Q>+b32r@#E`?`A4!l{E?r}>nlGYZEoxY^vg(joYDw} zWjs0fS^1@*O=5TP+nfZGfOmJ2`SrId^Hhnh(>HFIb|%aFb}ed$ZZ0edKqI0deS_Ol zx`^%BdiKUgsK{f6yjyb|!iTa#LQV&z7XZF@QunsqYxu&wEQ-vF$f{lL8~-p7ENP$EW~T!}ykb^< zIT4|Y;&{O-Arj95odR5+?b;$)+nv3``B-V}$gO%ZCn5naDrI=e$zaJ@mDGuVG`@l% zPejkAa=p)Htu`|vl}hg3yrQH4awt18m5W(v)1TLOaB8pKn}wCfNZ=DpfcPIXTnj=d~F5RrUAI?Hw@#bejeL3JdOgtrcWv zD^1MI@Z@Y}1U|=n==~NN6NKN5>}s;Ij+9R=+zXMkBR*J5aVfgu5&+d;z4ttm|JizQ zO6QON1QGBtb(NoK{>Jz}d7=er5Qs3RTb{e|V-~ZxNa`9IVq9C>h~9?@U6G*H4D{}c zq&U@UT{nzS@v>Y!`SVFVd|&pQfKHrtD6^2TaH4_p;!LfZ$yg~jP?+_RN_S22$m?Y~1lK2utI^8EAdYzIQ(>(FuGkPcDQ@bV z3(<(GdZ~~NC1{CRv^4y8iFNWx-UuG)@p+Yu(4>CfN{`~Jlk&VQVVZwyRruaIl?%G= zojU3rN^!}HVB6Ey^r)@R<)2HkVd`<4lq(=Gom-evH#0L3QMK%4r;SM8&Al%0g<)nD zElu(7ZGwmZ$oo)m3tL2em$;#`==(E8_z*B3Vf z+M|wT7RDO?m=0)(t&phIXFE+C3~J;c-hjr~i>oX=75CqVc@%nMk*g<_6_q+0Dq%ab z_X;%;tnP4a`6Xhk$r`mbN60Z1x8f7^8z!M0gM+*c4GoPLk9ReANNW1v;s@T)E7f~d zWPd4x^ZeW9&yoiJNirl?eb3~BqZQ_ zww@+4q=otU#l*4j8$a^WJ}i!0k)IrvvD0h zjld)(GX0wX42I$gKVHw9Hc|l8C7H-!gKOfCv{{y2j=Hqet6p4wY|7Jt%{A<7^{P&l zGSvBlS6$}s^p9%zz>j?N@09;274dr&U8tRe6>(~RCZ-ht*$K1?VQZR7O8^XmIs@Sm z@dUv~HbghS@5L4UFOiY&&AN_F5>RVCotiP6otQ>+?K7;kD{$u_O=Wlb_yKw8~FEb3d8b4To_aq*Lrh zpJx3TJX#9HYx6SJ03P(DZ}tu$LC7BBYQ*VMn=LFL1k6Rd5zNMo$$s=hy-;ycK`z3jk08@jlN<|U2%GtgC~A7V zPM_G+vCV(0TsVTtH=wsI;ElcjL+Hi+-aJ>A#7`Q=gqon6-GSZn>cFfIKif` z&1b{AXTP)+gRyX5z{wm?rA-mgOryNRGe1A??BcTUum=_$4!^XI30sLU*EzPnM8dpd z0Z6TnS0zR=mRARQE1U8%QUhjRsP~W7cRqb?=j=d9P3`OPX$6C>+A6MD?KQBo!y)A6Z4;fPN!?9S>r@N>dEH;?$U zrRH>0e3q~E^a>vzpRd0_q!AO@W|qAia2xsj6Lr=G+-Rx&&*lBB-QXlA)~r6Crpnt1 z#g9`cby=l9q_^D0BeI+f{LmNrd|v%?X_F{35)j(7{51|lMuK(Mu@xKGB1=jHjaME` zC>|eZ$vjTuYlQzOb0&&+!yj8oGn%v6(jpY#D4ju$Qwyy=6z`4H4sB-<>Y-yt)-cl_ zpM8c=p+Bv!d%p`Hrac+)gce=5sdmSIEuF;8!hZQaS>K#as8(s6SzNW7ZcyUT3BUN> zT1SDx|3~AtPMCRHkO367$plC!OM~1pGFo$$yvav~J-2@={ha;UbI|xWS+6n6-KJGd z;ywCZbzr&=EAd|$Uk7hT|1B=a$x=Kgpp}qw?l&R*E^*K={VECd))$l|y2X)^*1`b6 z(c=SK>dgsb!O)dvd#_~#Yh7CbTTWMC1sS>tBHb+eZ~Fq? zVc*bQgq1!g^7=70Ye7H9UP!|3ZsVL>Gse$+ znEpoV41c(mG?&x;!u^}O?=4C-D0MGW+LtU~lDXhrJtkH6cwzm( z-tU+H5{-d{2|JMnvz$#84m-vMz1d7YYFypziG^FsJ^Y%@=SWkKA$%U@wdN1O#T}$SIm2ztQC1YI6aRge zRXt}>quh%Wn^5oCUx!&0w5v3<;LSiXT7jnGIjL0N(x6g)tj7Ii`5wKfiyhi7%8j0i zmyNhGfsg4Zk^5zQMn=)EG*N+L=b2V9X$M+0d+sb?bT{V9`aahIC(`N#Du!UvTg{!b zB2+?!$Ns78S9AUua;!o696X{ZX8u7zJ^oxr^$hG{)W0BY<`~K@CWkzoV7Cu-Vo_F(aNZ5LqlmW;;@xf#Ukv{c&yS|CIDgw&HuBOP-)xM1g zBi%C-b)BAF9atY6IPi=+R@;0_9U9ad76Mu6lKc1A{Tj|?7) z@rlrirQc*`JR`50?x63V*{7>>E-`f)^=L2oyp_kURaT~^*JfXs$28}72;5;plM4iR zod;cIFBpG5ozngmMzXTMdxN@GiLl#(^WY+~n4M$#1xV?pi!sq&AMA})JutFal^P~CJi)v2_HA2&1>*@h`wvq9giGqd|rz4K* zSDrYL1;4LMLVSFoGzxVA5YZrto@!epqSTYLxI1Ot~cEN^&BJ+A!5|l?~|iXSbDmtJB7Z@0&3De zqeMc@vdfG+_#Cd0zZW3=(V=0l3VtisRHg-<>qh*1jz_uB#QWFVlZGrZgRmK`)EMNy z6WH}d6z#m8hcmIq%b|wZ@hA!V++;&ag<2Em$gO>#c5Sc5=&S0pp-a=T>u+%PZpJArWk5yDz$y=623X7rBGD)b*Uc-UIGn*&C7n z0i!%PNU;uIt97mD_IGyd_`pjYv9hE0$WJ4P4_47`^gGvyFT`h^@w$)1^0$_*&>gqT z8WM6-0E|}w3r7kdve(>rHIZyasM>B22=NtY9W0j>%-wg_+wv@rcQXj9sX(zSS3DL@ zJQc`#@^TckZkv!dN+W-~)z6f1!mhkBA|h866Vyty1TifzdhZu{1kA8<)cYjfvH|1`(#zs0pU;G_H;8{8h4;4f@qX$o&eVzSV>hZ5pp1%%{4i2jKXszw$ z-h4vAAgadU5rkP<8W2&ZyAG{?e%f)&A+iF&^f6!XlC0g$71W&gb#G?TDm2^nVkpaZ zssPVBPBbH#M*U-}<=_2m&p8?;bIM60I4C0QZqx()j(;D>y&ch@L5*uXmZD#-*4t_t zHpo=mV%+XJD7iT$dxr(wqP3;;DIKY%yAcoXxC_N%%2fHH0q5ynpBzix{3J&*GbSEc z2dAQC`rt(b`4)N7RHX~9;l(g4kf?KQx0Tuzo3kM=Ov-YjUwOn|LbY$T=5;N~s)l*$ z%d*OdQEC`Ilc1!w;o;4exGbt8h8tt%hC)*99K_)!f9I*4p&>O?flA-!+f(_FBX~J`$E`p zO1V?^xf0t^FEa-ydx)#vtfGKVG+RAQ$vi)nTFV2+zO}mHcbf?zF!A0(G;^U+iPP$e z{$MG6){vl3;t7ydJ(wViNeb+N4Ws}n(Enego9)e(?h1C3FWdYSj!Y$6VTqJb0IGw?c)47UX7YZdQU#SRovl0>VH)*-PUO56 zx!TCGNpY&TVz~+hsy@#u! z(CjhZoLX?D%CMEI+Q|KnyT3v_`4>J?%F@6)6+)j`@XK_W9{BX1NeS=UEYFka9>!3` z}7LN;Sw~*hsH3S(paau#eE|+~~1!G|U4^HvIr}KX+!YmL# z-ZFFKxsz|4DFE3!CA&Ui!Tx;GhHYxKwX?Q&&SzHb$zkZU-%BPLChqLhIq2JiA ztDl8kd_(bZl_=#RoBqo}m=j3vL9XuG#tVshKgIfm}2cyCUmr@j2i1|pLKNjo>yV#g4LHQAfDy2k9SD zj25L(<8gY8rwrVx&!lmL_YsILCZM%THUN(;B9)y#`@>5yy$PkQ{M2>tY?JEp$S|et z-(SQACL7wi2OJ+P)ijnZJmLfoZ`UQ86!TwsLJK4AQHbk?rVqF*bmn?B`t1)6n-}2=-cTcRNl=NyVKIPJ~so*~b+8A>^565rHfAz@n~@KuAcU`=t`L8p)`|2jX}& zxYIg)8-4b$Z-Mqw`FR3f4D7FP~ zS=~KU;^^pG!#2yo|Gh+{_{8}h6d$q9z&da%AJlw0bYS`GLjGsJZ7ThY8(1hk1!-`s z#t#{f{O*Zm*gwfAEUdC&1hA?{U7gFz`~FZup}6nwb!Zy7>PiC1;BA{u*!fjcL+Xu| zud14en7CS#n#Y&$mHUOiBQ>y zSA__Jfu-+^fc;2%Y;b@9=ec$_8o?30V?UZ*q`#(Ga}O`j6cyp!S}Dx+ueYA!_XUt8 zg!I05(W=n}KILFsyir?wZ_G~-(%Dz)_Jsw07)Y#R*&VHOm#?s30aKFmE+zNChPSR3 zUOAKgobB&AlZ16z?CpV_4Ie-Jp5^{M;W)efn1e@qWFla1@38ytj%Jb_1r6ug-R~=B zpB>ILnoF0~Yn)dNg$F@xHe%3js~HA!K1&dowH9}ysIZd zzK52}!HZckd!~YxN{oY}uh5ebk2YwX`w%7iaiDIeDpe*db+q{Mt!G44L9XS`Uzm53 zPuJQ6xrW9}#3H(hJj-XrZsGM!`v=ubgKquBCJV$r9@`8!cY-@bdxOv8OmmTRLZc*! z;#eJzau{T3|F=`}ZX73f6uyLY&1*V_wcR9jrh)pgj9_Gp554}Q3nkjluMY`6I+r>f zJO!T(!@yrkX+k06j*b*bTagIK-)mLx-t}mnBz1zBknl$w@G;^}IRPv7Jxt4g{;%a_ z5E20#ITnIey|f}dlRsy!{Cjx8tzA`h1R*r`^&I(iB3d@6Pbs(f z{lH=G+V|}0jb?1MhBW7>Lf4Tu5FD`uw&;iGuG&(QU1DzCMP&A7u+v&xatNImh zgqK7g9#Nfz@oy|3JBFH*@#}eTRbeoW7YGh&e#Zke%{#g90{JrWn*9T3D)#yApMKD0 zJbWNBNHzMV3y{k6{M^v+SM7@^y^>O0OIuqT%>N#1#}2sbP%^);?BcHAHUyaN>?9;o z_2y5ZSzY#rF25V1E3IX!ffBEyvH`)GTO=Mfw$`F>cQ)H(0(58y8^o_b5fyt3X$p=Q z&b_9-0Vf=r4TSo=Z1w71fvKqQCng%}7an!?n9Q{jB=t_is~o>c#ec8LVFJwx#qj7B zkjG{wU)ghi^k@4rqztrc^!b}0H5HYps1gmGGGYy{AGa73n^pTLn}EHX$6h|N)IY|a zvyD@KUMz-3c!Q+h?%Jh2=J!kOa6N< z<*Xxa-^Icw)meFy&q$=Nx#|YG& zHo53p$Vw`9Mui;gWwprjl6^EGf5h`r|uJC8FM&K{;&pA2AdzKp2X=-8a z&?##pZnov;=O@hP(3;9VJx_ow%rQ~Wch>lIkTdcqaXrxJ6Z#J7JF?xnbeMf!n!=TB z<+mdFe4O!gaBKBbO-z+10oFzq0kW#J5Kw`u)bS$9iDVI{+5QeZtgo-I!e1o{j<4bk zOev#LGEdJ2bOl4WfdG#Wmq5d~IAj3d6Jt+#MTyuY0)CZ{qxd>tNXeZ53;#|2z??T# zA+{lZvPFsWoL?tVT5=X2)L9q()#+v|MK9-*xKBlk$Ys_{^qt(~X~?p#va?xO*x0y~ zBbfy5w(x^*Om_<>kuIk_D=@iAnrDaol+D4VCR}-& zO(@mhU6z*M z<%BUIJg=s=PwHRNOxLnL_H!bo7FcNRVRTEf;;wq*i`Um^Ws2f5vMxqh={oX1w-@)r zgfX{S8FWCz7Hc5!m`nZ};}k)sK6ox3OHV76pD0*5zKiSD<_9xXt{v3<`*9Ld6_RZ!VbJUO_jel;IhE^Y$vHnvK0cXrkrRa+7E&(3h zfaTdjZM^Hy`zHIM=_dDxAwl82DLnnDNA276@>&yUhPr_Tg)dssD<_Uu8;A77_Ar&4 zr`kGAs5#{4Tl_+KXx2B^63*ze`mM&^o$78s^L*su@2*@%7U6ZO_KAQU+6%oXG2Jz2 zcNy?A?(9tivEeVbhUedwagkzw5rk!FF`8GV;u_V$hfG4gBmv8jS`WsQJZ)arbDPVX z;KansUt8HUv-BR$lq3DMG$r&lm8us@)%2>;ia=3HyD0O=RL@{R42fNq3^iZ?$E>&HUcIw;c5~|J&m{KG zKmSrL1wN@t4MS7^GyPO#x8%VeHFi{Ou?!FS(IfM%#5*_(9QAV^PB>nj#zF5^cIuXdXm!GlfyXmKd z#~x#!wgLr5tT}7 zzS3HT0$$(#?+LJs($r|S=mB$H3u*LSW=J-=5_Cn|;WFU;_b&u1u64BV-XqeunX+<9 z9QiEs{k@JIH$rkU0*l85_c~FR{2X>6wLB4}0b`c-gO9D3KXg;A8d{YgW6v*+srFil z?IFfhdrl9}%s$MaD((ucibhRS=z176>F00!N=>2KP4+vN@wg0tjXXr8d}G_?u! ziIaeKbj|Sy_w7mEhxVl!xz|WovA?irvDl!a84BIIoR@3PQRp((r=GE8?Ui1}DVIy49eYo(NCQmHLp;jEDeocPyc6O0 zPBdh0+F6%bNqvSpjGu=`oObyq`Sa&zEoU^06?ceABk*UHQ0zLjmy`3wb_FFDt`xDJi`YB?Bz8Rie?SdRF`I!;H$ z-{fSOJFcCoTmj>ndIEO94OO6e3zm$y#|;cU{qo9+n5<3qdr&DOuQM)+(+6)q}yfN_nK(=g*H7Fik_-+M5S9f~F>ETP2kK?AKz*+^OqK=OL zcSt~yAM>gke61I~u0Xm!FP_i?%hQy-bn$#QDz*n^Ky-I=lMnFodmE+%uO@J1*=?W=c?U zoDBu$8c;FcCmy`1et(q(oY4rmZnh=N4Um&lI6rtm;#wb@Hbj|xAGiPzL+>&~gnNPS zl(XV48Cl(&m1H~o8k0ZJtTOu`6_dLEF7KA|DT~%uE~v)hsU+>sm|JZ0^QsLPt<9u; za)`iawLf~EiAM&4gzu9b5{NC2$J<^-Ia(dD5{@9;D3QGzW7`dHeBcQ94jw)9B#Jv+ zqr;qI5r{;+{m=6ti|df-wALV(fl5s^ON~LaDwKWrU?U0A@Bp*o2J*I;#dgzQi z(flHJ|3l1-nfg0z2IGynjI|oIcB3OEz<56iNck#5*`3WQw0Dg=WFt%W>yHE?FGNz9 z+TT!y7AUw&5r6Liu&1EptB6NKP}4WXC4SPC18T88Xz9#e_3*4$rvO@hStTP{j_8w< zz$;G(=Wl-e?vMK-`i$9q#G&K&J@gx`8FCjYJmy-$5w-|?x&Al*?!(k1*E>&YR8F)s zG@g>mk>RhVExTcT;K5DQG~l;$V%FO9TvFel%gNmxk$fYhx84m8x3*SB20Uv$5};cT z#SQj=d#s}0>m5?1Yr?XAboPMcNk^c(s*adG^m%tvVQg zAL2QPk%COLoudL!{@s*sz+;&BiX149e;zLcpH~oe<*EoFw~pAw`51LZBbnLwaukpHu`qyyk>-biUoh z!!0c(G<%O8K0SaarW%(beM@K#SHi}04DRHgwhfL9&UOEFjC#WpPiT?;hx$RPyBsi& zMYjrePtQrZBZz+JahIY!A}YgH1U)hiNETPUKPr4f=JXf?==8a))%;}G=!f)v^*l*R z`uZ0jhSM=+H=obbry)nE#egL02&gT&^r~Q%b}7V-Ei~61vY48F5d>~&mwNzyDKDp$ ziMhIv_J%a$&|We`<&kiPU9Vz)+$ne2ZNPf|?ZT|e=S4zP8ffPVG?|ct0(8%H`d|n{ zr{$`A<&0E-Mw#hy=OjfuGyiR0Z|NoU`T)e%AH7KU_0Sn}z|0-^_nO5Q@eTAVefhst zdP?DvVl%i!dFFhR>ylzDS#&lr0%4|i`Gw+UB}tUVqvxKa4y?R7P3=HUUI3s(2JCTR zENXxeNTYsc)_5w&UXnwwI;13&d_qRxw6(gic7-$mgVhPILfXRxME43f-+b_;;Lo{c zBAg|#8U8JpAAKo5Qb&x`hb_2|*L6?(lh=1@F4drq;g|rQ)~FDb<>Xuzr{Il6MTp*E zJMex7oS`af?sP|Ov3tAu;PpT1b8`Upug~BL(tr zWbS-8O{Xsq+5Oh_YG1cVtz8f$HI<%$Ls0;^=`tU?7N;8%pvN;w?lgL0_w>z^T|I*M zpQyHGIT3nfmY_U5jJ(Xg1+MoR%SJvf9dp2Xt<>4cmj=`A_@j?3IL@-fDBY*pf8grT zN=QFHihYF4#_#8!7$ipO@V3%ggUaskbARL@ZOQFTR>ESKBOOFXlV;OR|BlJ=I>K;m zHa9aZ;bhk_TV%w5L{M=>U|?x9>O~j)zVyd~MS%46Ht8Yr68ia#7p(g4ZYdxXIF7SB zs(N=}>z6X|Tm~bUkxPOfJ`{{K;-2QbD0ZWWXh*%dA1sH*ab|WrmwrLB7TUl~V$+Td zv9Sywxh-krrj$P|*c9DUt4qj5Bhpz5me^IUE+OX;8udHhz2c_QI*BqBRhpC&uMPw) z)RR&fTMa`hrMpo4(XxuA1m}R4byt=*EQ`D!9TXA`Re;0ca~0zIDTnp=@vQM@=!gPcUDDD4IUfRqshuhROg5LI5?6S98j_;HDt(e_Nhn{VH`%BfK^KsX|XLK!y6Vn6ExG`uh5@-k^^I5fgsK z#C8H-=Fm=`h{^qAd2nR|Rn=S>Npog)rYWh0>_*UMW!n< zX#_z@QlJRw+EEWg*0aaJBOxywW=QOVNq~XfDE2&7F;YPS>c#K>a5U8+-~0Akp^?9A z9E1S7?+TqR`&^HypNM!%c#FKxLTEdYA|oRo`!AwkM-yqsQxE4J%{0gF%gb)V4TxN( zGo8d{^If|@!8S=u%gpfs-}NuSj&DbWN9_}j4+{5*ygb)_45Ao#qQ%(Xdi7d<9dSKC zSveP-H(n#IZ*8kP7sgC|WFuZ9kLWRVxU8(qL1N{%owO6Dj#x-G`K>K!Lf${EqL%sJ zEuk+9Ksck2T;(-xz||Pw(F}WjuNUS+Ae-a{sCS{2FH0xX)fj9vfwv;BYTc*jGc#pb z^Nc0a=Butosg>n6i>i%Kpf81TZdq2e`)hI$jcf(>^ax3QEop@SE|b-%DDDzRE5OtQyN17V zAL(`V^g5mx8DY^$CZVJwh=0|ZZSro{m*M435Kc4Bool4?y_TJ+Turx#X9GwT!?Pa9 zZ8gmktu*X}nb}Kz{W^oGwQFX!2mBT~xlSUS@_uQNA33SYC*op#=9aNj^~1>^B>awn z=z3b##41b^U5*}d{tZ&zOU_V)wr=QalS~RqNk2f)(=Bo?9^cQw9^TX9yLbO(b0XHS#Q31xD(3c z=zOn!x9IH0jrTPKt0ray)}`6SGN8bSI)L%tie5()T??;gZU1pM5{&x2n({@NiX<`r zBAp%NP5%y0?LiTBAfCvF9Msy^yJ7s2QhRx_w^$y~6U8OQ8^VYR$0k3losu5*eoFec zm?5EeMduMj`AbBR5BmV8P7VqQZ?GqFWfJln2A@C1)Sm8XA1{V|hPHc3$Zq68XTVPu z(h0SLXQfnyQugnsy+mkg0Q#L*Ab4y*P+^VwlEvQR_*POa*%_SH}eJ ziAo48PHP~}D(C-MZu28mry(7tY)4b}au!2#@ z1%*Nl5CSf?m7OEoboEF*%#7dCmXx9B-;{Rqu8c6e$o9rqzpl~}p>J=_5=dX01SJk(l zek8empk0%cq;NJMQuY3=F(WW^@6H{Q%}}?ix(9K9ROI=xjn4d#?V%D4Dpnlv&iI?4 zfx%N^dJh^Z2#M4T!reCAdg?tF5~1%Zao;=hd|B=*NG>8^9+nK^uNB1>A!uZ}&|RG( zR*e!CTWf1!4R7H0c8U-ek4&l@HrV`H58zdVqd$M5%geEg4YDMt2jvV)=L&p}-WiYb z?ULBTn-!@3@iq&SmXYbZMXoEo)8Nqm7ld@oGHd?Am62TjD{DM_73ICCA)p$&9$mPX z&Ip9Q-?2z3xXdFUPz)mw2-|N#d7FPFrKYB)O^1*jJ$>1UF3S$G>Rb&5V%+Z0$@i72 zF1%;&@La#1)BC#)fL$MT-&8~xAhaKZJ)d206cH*t{~P+LFyqIWze7qkJ$Sf;bv&(Ey&cZ!&RcF6Y zn;zj~F8QTpOwYN*c9^e6!3FPNQwN?l|+dZ7k zy21o#{X7xk1a9CTky8Lz4we8$Wu?%~X7-vI5sCedN`z#)&d9(9)siB6YT)!+R%FCK#5tKJ@(IkQ;{P>-0V6&hrK;NhFCW`w(Q z+$JhlO5|;B$UC-5wIS*bP^K+~ZraHiCPd_=BOy|;*n|0uJOQS}LD}nB)4-mMk9mZ> zetP^}>LtI3HQd<6`}{XT|2`mF@FNXFtU^3mgj6%Ct@;^S_RGtxEq@LVW7|x&EA3Lr zURzsLU4hd+SB&3aGvLei_VNnKyU}=t-K=rx9D%u?q72jze!I!$D^al<6VcLJDX|nE zA%?ySNfJ_;aDp(vxeEvZc6L;SN@Dx?cyZmYqnJ*>~_<}OQ;b#x{wEa0xnfbdm6}}Aq-XKx99U=S|zCIPN zJ*{DlSc#Z9AKVo$7@ptVC(sA5TsjZ9sA7VJh^q{lRT=e&^1FM31E7y+zO^P@U*Pq0 zhlf>Zm(9HNh`Bk1A93qQJ#s9wn3$GP+@Q{3Gqpi{IHA3vt{05?)wO7Jtw%hi;E%Y3 z9MtA1?|B?v2G-uBf^*vbs-_UQx^saq-=)bKxYz{)!+(;BG^sk|<-tauf*cel9@Ej6 z0E({&{=7(Y%(ua_kKAFAFuE{g9B|DL5A=@tY8 zmF|=!BoqOamM&2mK^hhjkOn~sX;2aAZkBEVMY@Kg?Hi$x28B$pv zWvi`=y|)W=|Nq_s>mwua*<5g)pi)dg?-2F|KE6<{_2q3clS74(PTY$arej=DG4DK& zP4Ta2mMMH?|9UQ2*6~7f&F8;sYP1?B=#NA?w8ORmd}{Ojfg{)6wg@UN^m?km*_*sV zW#CNc0H4kIl$o>a9vq#!sa-r!A_kfApR+@SoZT?qI$BDJsBPgR?Un|97}>S_edy+S z=~I6PPZ1xJ&Vk2aw`KnQ)z+V-t?8CUm60$*Ho7oCTmWI`zA?nKwr(N)3Rmb}~**~--CGTf~mIhh_Ti5&+A(O}mlv;!EVu;*{D__M(ZQ_KYoB~ z8&uw5y3Wqdi+jcfXOk7Hy)u{wS$o)f>#wKkefb_)KNf!11wwT)_!xecvHT42jT;-Q zpsB5GG5XmW%Tz6Q)z9~lW=(g4|IMj=Ct)-qtq+lk9_i}~hy1?mpg0O#i8JGn@{3u6 zJC#IGmOZ@${p~MLUV-OOZj*Z|;T{$lX~U~Msk@oo4azwAyEFKmZO0nMWqm1s&+tU= zH|dLw4O(6~ic&!rIQr_!l}9JS8g;*LA3e5amC&)sJ_+1NGZO%MTpP@VFsnyTzb-`~ z<8pZDK-{m3c66|b@97;6;efmQ8io8y)%#XVv^NeeF0b|BlK&|)K%W4!6eVu^(OzcN zff*5gHC>Qe9~Cat_V1sLV6bJ5sk0^jZ9he0qHrF=uSD)&n2! zhTIw9FU!5$Ek&Qr^g7_BWtEtV3lyYH=^uGB zmv{cFXwi!HF(+=@>q3~N-#kHZ)_sexB1hGC7dw9bd8@hF<2z2|N?MIQ<{yJB3d$*p zxSJ(eI-m_A$P&GoViV+BM&tC$HHtf!jQ&*gt-Y&VM84zYAAjv+;7JBv!oNLv%Kz=j zi(=Bbi8wq$S_*HE5sJw0d;V`AdRs6GVr+mOVGfT+=*LFw(!Q~AApou^rY3AX{- z+c2j`Sn_tr`tl+9b4>9aK7L-ub#~boXuUzkv6_?6tDhvXZRrH`Xo#OdqnLaFemIm| zW?`e@*PB#TU2M(Jh(4IkLm$jHF|=lBM^ILWbFVvVh|1)H_FFHXk_~LcM(m=t60Ui; zFD#T2Q83agb@g4|Kbv*s5zj*k)Z)JmO}k2lB7YMAIyz;?&!5jg&#QNu7d0<&fzE$! zX{N*=mT}gwp_Huehd3|8X7Q}ORJ)&#hJEJXrudlyU4zNjeQSmzLAM|WeQ%` zgPrPe%cFd~?kj&}J|D1YjP#)g+eVitg@jz!80bkyf`8a$=owC;MYy?b=OH9-RJz+- z2(ZON2PB!-n+vIx$wUX&%gcYY#4~!ZrTDUJiM)+*p_Hq+v+72s81c6k6^x>5E$V(3 zW#8*z7K8)NVCz|UbkWi8SDEDK%S)WT7#_HpxFINxt! zvKw9TjH)Bh-b-tU^A;Fm=X)s;uwWWc#H7%G?$F%t`$#E3fYXzs+VGHoquS9LyPBQM z3`8K_Mxmo`Ndi7e8Y%FinoW_Vw099gKF?oa6>{ln_Sem3fgGsD`F|&P{FXWn-;-yw z#YxP-i$s`ZKqdhoizW4-mzR00wfb@8fX>vsWw_@~aaGuFiHY0|+0~jpXJ6-gBNp61 zy`Z~U&Shz=1;LY#q#U<~m`pb4daDi@KEd>0V2>c~odJByRjT;<0WHe=4DiQpAVUhw=^2(>H7H17!(p2Qhus!P zE%+Kehi5Y6<42M#U>5cFrh-p=DCWF|1{C>n6V~&FnQ-B^B>g3ujnms)sNkc@QH7+q z$S+@LJ!5=eiM##@v;mP6nPS4Ci!{2t3Sq_`^c|8xk~4OTVcdI;8jXmtyXtyO z5M21%9oTY?z`uW>G- z2F>Q?EMotRwFeREHd8IdkhUDTCrwZa5I-igbWkDZ@|Oj#YLMs>cF=1u5(--gVzh@t%x34!Z_ z(b3V&wNDZ;kBG3}O7d|Rrc-=>^>rb1S%AFPm(W^3x7OVMPPoARJGSfDg&b!EVzfb7 zDoc_oDZ31%{Y>>_JUqWrWls^5bU@&xY3?a}BX^G{;V@M|0x0IfZ5v(tdS~|<=bOU0 z!Z&#YgRW%r+q>zmcjGeulZQRaLddPabp_8JeiYdUV* z-Sb<(qj*DOECz#?IXWKV529bjRpata{{sj^3!=`QGvEf7lsEh*B1RPRYLE51xxL4> zvAx*sx$sF_l?zBDFja1adHvYfWU+`QUp=1Qyx8w_Yk;$v>1o(1U!?;hKthw@>-2wX z1O8j;T5PX$a5i5gdTdFAsL1|cQ+KQ($@*HQ(W$f0& z7Se|p`*AgZ{)#x1R+;(Mha0*nR**9CikSPatIgCQRe;Xd3wRuiLr}1^y$R%>W0?j< zxrq;4=ITEThvPGC$|$(}5ZEced!gA$=Tp2(t`uT=Tdt4KpmEPhQ;AL;7oXPb> zm3quR2jOBg4dRdvGPld zc8_06`%_o*EZf_@IO_*=?_+3}LbF3MQ18CV?E5s3$~+pTK2WCu)6%9RqBWP+Vv+ys zf)yqDc&;kqj*VXxU3 zd>m&x`M4R@X(Vk%=URLmF5Dl_xhY9f{9E&aAWIJt7X`gNlEp%f?fZ5R9< zI)w(|I*wxSvQDYGL1T4WNfkpLiBv#M-p0yyS(vC|?8?hM3P0hw{q8xIm^n#rF!nj9 ztclf+LSUEZFmv^k`?^q_@&8-dBKvS&UYaQTSKs%%tXGs8CcRX{iW4piSNffB2M-(_ zNZELt%9;Jev;p%f!^P5)hy+GY&O-_(TfF?jA+d}ggCqM@s z-lmK!6%J;39=X| zJ(&|YC9Co5A*KNFG?Pd;JwdaN%l3X7Fq)Y}92A$)tV};KaO|1`3)b{N`H@mkxJ*nT zn0DD%RSAN>9pfyaFK5$;-$a9JsV`_i(@P!ts}URh@qMt;ZqP3&;v(YccCZ(pQWmsa z2KSrJ-L{8}m6j^e_6$Cfz%DeXy=>_capZE<-Q>_Rk8(;%E}Bx_(HB1!w{&$yoI+jO zC`YXj9Zkc7%~u9$=v!@6i;1u$69L_T0;`zw$4>4`yT)GbhI_#~L0 z`zb8VL1teuJA%09shIHyq%6vi7rRFbRTFLf|GpGP!Qb_A2;%nHe9B}Oc1$`P{*;zR z3`Z728}n>6%%5~EIBg#AIZRk`eH-uY@I43P}bE^#1|1x@6mhjw+3ITSm^D=usmTU~jVh#0}8IzH6|j z`@c>uL|`BS=llDAa$-kpU#xt}$zfhWRMpiDT<}sZ%=526B48%GNH4JESgI%#TwQ6{ z%%UkyF`IW579C+4B)GD25R&@HBWo=axg?;cfF=Xp&b5hK zSeZ1-4K_VJJ$ZV>x>ys#NRnMo!R1)J`%W@c$QWv8xje=VcA9MJCj)lz+Zq7dW-hIm zsaT}y9#;M3t9~)Csuw5Tm~O?w#Nn# zL?=a^qmFgZCRYT=3ellD+kX+S-505nAYJV1`_52sBBkmQ(ye~HAwO@ygS}h99+|`v zf<}5?kVGTQDVq(b*x0JVW@{uy4|*6HFT;f+j7YNQ=u%JS+^eIZN7?U!E!J9QM?-<0 zwL+bDGlBOS4b};Q>zf^5!uGxTUm;i7ZQJWbPC8IF)GKs)w(QSKsZ_7OLju;JmCk2o ziOXAwS|MJfN5_<%?YBwaz1X`kqxvP;62}Y?W2vdJC!xF*eKl8P3EbhaHHg`C43+eH z#?>aRZ0q;;UC$tE``ZCMCFi%OY#*!?Z)!d^da^AYQ7s|6$ik?VT% zIAq8a9AVpu^fyQ~F`)_+E-l6CW;6^wTNK zI;CY_!Yz5@-P$WfJ$-$B`;`$=7kb>b{&D;oFK}>d-siErjLFd+`Xw*Z1mG zj6j^K>iEpHP*vqKnSbb;pVmMGvrqBFKJpVHZ2&Dr06BLXV>z8DUVxzqoApoS@(6_OKe7djs^0O=dnmT+S-u+=2mRM zQDe@XU!*LPC2zwIb_rR471}NYW;201YvpxN{7>YqG?ZP_a*PLqg`>eaxb8T4EG=#0 zm$dIUcn`;RU6$8C4j@Ho-Nl?1| z%aYaWtFs;HzztLK4}%23Dzv0p>%g=k%D>5rEn%_*S9yLGf?I%1(^Z=kFJp1alD-kt z%BEEv@@ja45NT;*^t!~%Mc5{XN|o5~*g+7re|+~w$9NI&Vxxjl1QFjnzh!TsZ2Mf~F~9SN z1%GaKn#%$G8=yDQH@w!m-NtJ3PAey?SQl=N9{!|rUIIu>mIs1RPbwb${s#DD1sQ|h zR0u{8px`=~B<42wc`F*}@gALC%lc2S3uRnF2LWjylhAcsSnBl)-E0!hV~T&Ah}Rio z-?WkdF~~F$OGJ{OD|Y<-?{*zojnBvXTC17AfpwVw2re zroO(*U6`$52Etohfj%B?sz#bbbCNGXhDhWw|JHHgChV{T*azg4ARo2-)32)Vh8zX2Ww(v)cW(2dJu$Y zITN&^QYoEJS(DheOFKAcmkw132Eq>w?MS9q`dY<{*lW#iBAIp%3k%Cc5Vbc7uk`ZiWuNiGqILR0(6hxp6EgJQH$g zR{hewp(%YZw?u3YAtNzJwT{{_s_?vJuHf_dUoQ)>Hbwj-uTPQ>%LLJ=A9DH@v@lTZ zMxM>PKzj3KU^SF+3Sz~Q;gYph|Ji!bK3BOTt7gfbgueSgW7<|8Dq zanC-&ns9)>e?Lo8+|0NcwPNwP2668WzlOAe(=fquqdAvhp4(F1`y(k1-0gbz)wRH< zdGiKR;IVnL-cDm)d-U>x1bHHkIn8+|>0|z4eM!(7b~wr~wX$NZA>DI#4EZn=I~{vn zzL%!Ve=|LtE=jc9MU6soWT1m|Y_-Beo73D^Qp*LnqrJ@;6IR)+a6}5V55zwrgbXKn zs4fdCBOH}+=+z!rGVP(uVk6so`ZSzQ&U&I-Tcx)Sgropk?4XZbmu%c zvqi9VOtk%tfXeRJs5*G|8Lin%hWwj4Kn^Tw!~!&bJkjwb^@|4Gko3#rj=+GbQZdbo z6E79QrpFq;72b1S+GwzDDq3qg7H_FjgX}a4^#^nbC|qtcdn+ihKDGyWODJ~Ny0o;^ z{Mx%bkG<&xo=6ouyL&(2f#5!q7H7>T>K+6baqB@PJ0Z?h$eTfy%B6! z;_O3qR1C^X($!<5Cqgcof`WpS(Z6bTq^8ER$$|5#Yh*LKPAn6l#bPO#FC67hatsE~XQoy(Kt47y;VGcsmGB0chW zhXuEy%mxXp&WD|+ybq<%*yZ^nz=()Gvz470Ya+!*k3_lK{f#j+Umlv_Dm;+8a-OR4 z7NVv}LTGDg`iHmheul)!8h?8qPGvzWWu`tQBmiL{XrQ*J9 zHaNqTeXJ>X%H~Y$kq{pMRjG_5L$rEztPsS0lHrNOe`0fZFmNmNT=f!r%^G)m#T5z? zIrMeWWWBtP1G(|Qqw63hEEbYiLSUc$dlA*wcvJ{tR7yrd)@E&dTlQ5#bMdH9KK@Z% zMa6Qa@8_`~Yt%?WG)UzkCI1>Zl&vyEYX&kwT(}Y!Z1*Kiwe{G45TM&RM&(CA8$#ulg3S`J=vMcx(ec`mXPC|>&0oPh&!_R z$CQfSd-}gBM4le}I^QS}wFONqbTZo7Zlh!Go?pE`JQ#&p*-{NkO1XMr=O3j=Ms4Y^ zorz}Pyw0)T4nAZ1v%S8kq{Tu|YbAU>WB>!d!6u90zDL}g9XM8YrT8z?NQ8!6UoyAP zMot84tJBtvwUyZd=!Z=+M2B2f!Jp|(ly|nP^ihcG)5);V*q%%7ypmTpNm~o)ud-MY zSS@3;GY-1~IoZIQi5Q_D-H85?1kb`Qh>6Rbgm^~=WM!FezWEXqv+Uh1*bP{*f0$Q+a)GKbV-NfFr!Cw6JhG{`1TX9ACOl<++>ORI2x7 zgHHCqT_~c!zNr5U9&tkj6Go}2AF8j^aAiWYvE9cj* zNnGYIDVB`OUEU^jd%+flh=k>}Z*_GelbI#O=;?szES{mDzQ@X@%#KNu~E zOFmX%nC#s9?>eo7i$!l&ZR5HiAU1O(xbj&!aL3^6F%3%U7M5_oj!7)sgFrqQNpb$P zN~cv_b6v=opW49$vJ)v=*W;2n_uPPrlf2Hrh)bt-OvAlrfh&kV&E)Yj?8lp<9LCdd zrl}`$4x1L?1zFR59_CPI7Zws3IvMe36Ee>kWys$+>FAWGz6h&oBs2JaY(os{?(jYR z#Qr!B+q#v%+&1(CH;batt!598P}A9n*|Eb&hb^;Oc7i(8RPDu|?@#&fLG?zM1^|s{ zBgdUyYHY8V=;+88%?#VYu>)_jUQuVQF0awwt+vOSq~XlWqhI|UytYR3&?Zg23dx5f zjDf6K^H;g~jc0+{;`DC>0zE}5!{T!3s!xV;a&3qtw9Kf%&p(#SaGFs)ED+baQ|}Gi z>okcT!{tZ0mnpW5&`-*qixWHzq3;{j?#JfGq}rMH1aB& zBhn8)zj9Bc{ym%W{7J5A$Fmjj8;KpRxBi|oa8DFYHT!zxAG=PG2F24gukxF`V|_0~ zv)0@>q70HnE8S%_Lr2en4fo#i!*cGG`=AmZ(a%Z50Fm?cB#Kp$h?`0G>Ro4RON6<& zJR%#?`VGx8*vfq6SirUIm6Mc&@#~?Yqf~I-|LoT=XvEF)wQX{eGV>$`;k8{Hmk|-? zR<#%0)|O*d@({DRw*GVLM@gJ()9Yp=ZTLpb>rWZCXn#1`Y#l;8z`?7>kgn$X3LPnS zVrt%byd#;2-W!YH7~fqXwki*yht8anMEByy}- z>+$U}W=ppAr~M2TL209(i&#yezCnp*iXdS|W+vq`<#8&?Gx|#SO=@bgcR8;TzVI;u z*2F=07NXk@{_dQU?mwLYjl17(n8&3Y_?9R!Djdrw?PgOEpF!3-Wos8#e*eFmBt<f05u8T?H{aMHEr3bg|SF#?M5*a5Xj%qeD9mj`IBDBg<$k| zy->vchZ<1hv91**_OI`M6hm-4nbZhu%F0Sk0i$N0+v1lslxwHD@jC+oga<|r-Y(&V zqN<~pipwZZDSq}^nCX`J&A}STB>|&`H%L%ki*1?uIaxN^>QIyURMF>wen$`2&C8A9 ztBjzxKor(xU7RT|2X3V>q`PQQJ+}HvRF(Uv+3ABjxQmo zsmFDn14>#P5z#o2>gdW7Ox0bE!xq*?9E}#8;kmKlN4j&Q&|7ET4h`mDTbxLPl1$ zeRkHrzotGp`oHeWh8kp7&R6sCSs?r zZv^9oEcPbg1yDwIGDC*-Ifwll!POlOuyTh3M{>0nBX8ZPx_89To2JVC%BW!XJ8aTf ze1w1cSjsbUv|p!^y;dFAk7F8I~;o zL;Z#Gz2imH`%T@)DfJO6HB1-}L8Z4)l`c7r4DH(9zMC>zlCG)_2_EWUn3vp=W)HpL$8{}t6? zi-@`F6<+u@e3aqfu}8o`iAmkfu7A8>o{=Y?;RhX?GBWNIfD9Pm@1OB=;MpS#C1e@h zjqh&x&A7Z1&9AP0#`uH@u@L4>GPKGHyvClvF8Y`YGSKI7EXDtQ#B#bcP8`;FS7g)^ zqYq$Jn6~yJ2E=)Xws#`!FMX|zlDQiFS=v)4&I)x4KJHbGL#kX%Xd7IzgMsUHrbyjy z8jmZ#1m58LI2p3JNy!8dpmWL=1A8DPP8Lja5ZMCgg%wt9^bLTKg9{SrRKX&%Q(yYK zKoVW!sibXh?6j7Qbep|>XkEK2uGmkJnjr!k5}6MLbUkOpUF$`4Q$I83u;(@_Uka6D z{1>Bw4k?M&%4^|f#j=>pn{yPUlG_M7+jahn%1^sE4D@tb2ad(ji^hjlhlb*S(VJ2$ z03GA@xR*Awx*D6zq;&^x$(TBB9hZPCLt~x#{UNG0A|@v00>Z*FDjeOlwcF&leVhFD z*Or9O6SxlB&xNHVuzoKotB~}DsW!IB-L8d&uLc+VicT5d-udf*ASI2SjKPFoJ7>BR zc`-Fn-C)-2i4!k<(bhA{PPcO*21Re^DiLFEFwv=ZfYH$2ossgS&@J}`m=)nE% zUpCGFjTDmLaUlyo{x55%;T~*RK+JWha)@C2?;e=LNrT2Rh9^YQ${mt%?k8OeB6d+C zy`Iqaw-a`lQwIoZ2ExKJSQG~=V$nj4h@df^l`;XU_tX&V!oFx($esQGkFP6?0TMQb z&Fn|h4!d%`q@kazIG$C$h_@(jHAjuez-)WbEqojtio(pY{%B5a*|h%$Q%(R;FWS|5 zChkMnbXf=w*6XuB{>4$ruu<~tSZ4euLI8FM#oHFqOZPP566-s}{Zbu%4O1xnB1_E9 z#WzD-kS(Si zw8Mz?%c?5HODBCmJwYMUX5QrZM_oDI3BN?=6cyg(h73m`COmCyxUbjF#m|QxV9IIw z82vYLSKzISFRC4d_RE$JBiTuGXG^s@E$}%~9#w{ysha8$g|8oo_mQdQJ~TO%bSP<1`K#$xF)piOf3DuYG0DRA#y zA>?U2x6s4toT>rC#BHky`h<5T#ybhm;$nF)4MO|6$$J*#D~OS-`@Txpg(l7xas+AX%1H8&qtxKDi~5gX01j@Ma@G#WNBPtghn* zIT1-BI0PZ6OX84A6s=E^m$X7>L!Cq4hMt8M=GCMAy;VH@0OBam&l`K;n$awu!`XL( zzw69CiQf7@W`9>-f4@~7H~|Nh@_ev=e>bq-F(a+J@L^k0I7xTGrpdos74Z4(bFN3` zg}hQ(^zg4p9Zi+oG6 z*swb&O&Q*zqG;0pcJy*-5r!%%73dc*p-px>+faK`Gk5WfEF~v??c2Poo_?~!wl7F- z;*en#h6XjEcTi;1q&bqR_N0q;r9XU)Rik+7rsYeptglWbcY>Fwo~3-bHP*+S5BL)a zqnixpgxwLbI5#zQ4-N5+@Pv%Yfe&v>m18mZ*DZKlZ4plD+<3E=e-l*)&Zd8$E$ZEr z?(8wJY^dT4Y6;^E@o=>Ti_3-jJ-3`c9yu0s@WcXn?7gIlA`EQ_RQY&n9->MIs){^Or`*6D84-vwv8i1*k7ek||D=frZL zox5yb+*Sm}Wm|)CAMkQLN9{dY6@%70Az`1Ur)5SSsP;O2IYrrozL)h2t$qI~a^|30 z^|r_J=)e2skoM^iW) z8r4M=J>8J46b&MhP?X$)j`dy$0TqA+HU%gumxaR=y~q)@e*YolxPH(GbxIZzWeAD_ zeWkCKF-^C>ypzw~rUhFF<5w%HL^1}?BFSN=A+tvk0nX`ZU>hMLP&-~Bxc}V+>qrd5 zY0`7uzOCv5D|%d4r0e4$t!UbI&9;@eCTNfrc_iVQ@>*V|`&A9rZDX8JUs;n+UjmeY@(_34?s+bqM{Hr1m(y!g8= z)$zomuvOM-jZt8~?3bnG^2`=SAHVd2j@)1b(Mj8uGDAC&a8o>QxUDRQzz~5hZ@l3* zq(N`?{aezZTq1L6p~);8r(9eb7TzCur*hI=?T0c%S}OjDTZ27d<$%3ZKpKZdjSE-G zx#R0egz*MKTVv{(SM>Gub^Ku}TBh#^M_yY4u;7b6pZxR3y7ivGsk*t$*I&Qpv!V}w zgGKWFv`K!?AI@Xt@&i(%e%pTYY;bs==VGV-pfo3AUIfmNvg6oy(S3T-MB{# z(xNP$jO<PU24Q_1aJtX%s$P|ekS%=z` z^E))uXW5X{(bcEv`7LQ_JT=ds>xNK?PW1TVR6Ep3>DY7x-IB z9N`Uh%ed0h^M`;0eTeri$yPu0ol)iuEC9FDYTzIYLT3j4)^R6lQwxz)if@Bb7GmXZ zZfHP82Mv6TRwP0MWv+-h*GELD0Fo|iHvp*a_y0$AfA-i&af_ry#KCn*Rr0@BRpr!vb>>}{+z$b(1=~I?RF`g)^2(F;N+Yzqy zyB55<0gf+}@)qmEVM}}+A_6qFcr5Mx!z=Gb6t4IyN}>_CDk@*To+_G~-@2q^jS0FY zyv4zxQF{!Q)wU&>_bf{6)rNM#Nx>1w3=wX#s8ck5sY@)9Vl_TZ*3;8dwz;{fBPAy0 zKQ=#qd@xkZ8X6v^g4BJFtoD42tgdyJ9?ZhW_)kC_m+5D)^7W-Kp7zS0S5FmQig(x~ zS~|VB#SJrs$OkD8$#F#b)8=aXd)is6AiTCQ+K~!;1GSke?VN6)HxC&Sfl}QY?*@rV z5)c8;<1F!(gn^*C&#f<=Gxw5R{EUYeCn`uiPfxG8r$ zzX>0V&{T6b^L!42mQQY#1X(eTlcnRzo}M+|nN#h+CoqLFB;g8OGwdIrYR@1cR444SxkUg$bafqPfiDU0{o-%r3!CvwSZhwP;zvCA+8ERMy z9%etp@FhA^?Qgb01-LVNI>M&;LFEnmNl$a{SUbG$>X<4HgS`E~;|=_TFuX%;th7r0 z`zQni-m((}owh7X_4TiLiyScTDcOg~DM+T~eyW3I1LE|c!D|$}G!&Ik@t($M&cVS1?+?ZL}Ztr zl;2zt4Q`gy`}uEcRWG8wX0gb^NuXM0Im^_^HEk_^T<2nCI@jDte2RvY(ATi~nlInHrh?ESXb&xHE{WY` z_|>I#a0U~Tnz#5B$?UFdI&lyOn!Q)Pe%2f{G$~|j2_fIs zMkFqv1Cb|1bh!C+lLf2m;m>hhwFy+Rx=^(&)0^{f6N%TJ{YXKIURPMXMK*cwkdEwM zf1g)$?^hJ0oWjGT6Y9A#(eP@AmZg8H76lGMn{14daj9{J%H7((7g&9BpT;3N{kydhCly_DGFA2SHpi~~=ic1)pA6J(1fSRc% zL<{{UI%;~3>&G$s$l9!xeJZ)a{u~p$kY$n@T%^&aO5S0y+UMZi`n!$YygER-RuKT+ z-seeB`W(WeP+c26d0&>E>cf2KoEZ1(_-fVRkAK0CI87nxj|fvpCRkmm&}gv=Up1-b zQb~CKo}tp?C^Qq{K{|-2LNk0Kae7J+Y+49R1)-Iba;vS&Z;-etDq-SpRdWp)*S?(< zmr1oLg@#=s@-7PQW`T)k>ih~~p<(wV7#Cu(ljZIm8{#-;!$)equ#L2I$Vw{;f5@@# zzVYcO1s*&w@F+-TgJJu*wEGI4lXFpbO-Tbif$fZq7uCmc%9I3Ef~#qrWOo za7+%kQ>QMKCa36`X9!*{D#czsYlTzQ2c{%&PF;L?y6C0VhP-H(Th3j`6v^$PgT!K_ z`-iw=dsOU-dA5Iqt?DpG>w{2t5f35h1_{MDBu6PmD9%2xC|!P_;`mX-=8H45lmK&? zwZz7nQOA21+f5(7dGqF}(eJAE1t7red`fy>^C@P~5nD%4o*R-)>W}NjinKNYc+oa} zbJuiL7_pI!A1-d^`}4F5r>u!qx8_j?{FZLX#3Xs*kdy;11O+=-kNV;S(yJD6@iya{ zmdIg+WJMj!9BI2C>G1a6_V$^BSM$1sW;EMjWy_f@_m4RaFANbN0+KBxc-4DM0c|26KQ_Kre}U}v>3m+PJs%^?2wg?hR*kl) z)-eQ3-P=F-+sI%ZcsfqDpZ}E^IC^wNB-ATsA+yN6HSS8}#7&*? zkpyfCeWYytoZi4`?x(XJ&i~}P`W=hm=L{^du}0p8x~iN5Dg%hE zg)LmT296f_bEwtQqXXUui;mOcRtn(bwjDZotVM+(iSVCsDQepi`b^iUrwD5Ij%3NC zPd`^(>`>Lbl$DV&9n{*7+5GM7HayCh{fcRI5z^1;geHZq&U|CcvJO+|rzeV!nH!$0 zwR`a3K`|u}5hm)vzQxRp?BVI@{fP+~u{%5Gtiz@UqnkF2^Z_wmP#}v?$hkZt6U(*g z3WATxeC%Q-*$L=_w&mv4hoy-5WldJ=^)N`SK3?vx_N!qny%)^`ZLG&o*{zR>uR`-; zU1>lJ;wGZsy>Qe&eYEkS2>3S@+%JQflQ#4CI3F@sR96}>A$UfXG9{szz^sn&twr@T zTZYYC&Rs3r0)C?}zP`S>#l>V-=LfETuy;_;0$1%JP|Ls?lMWjG@6xTbsR3sWL}!&9 z)#f)tc-vSh2>Ytl9llHOXfsAb521=%Ia)`XZ+i1unveqTafsA{WdiSqx&?2QW{UX! z#(Od+S*QOQp&Ml;7}@R89SDxK0!^=9{ ztl@Z=SQ=YFZO(UZRfrzo=e$YG{|Hijmy%6=GQE90{_g*dzm3dcxO=O@s=Q2WPpy$y z+2=)rT)6ENS6P$5kIOS#s<{^zRaC*Enp~27#5Dem5M%eEiC8W8k0mMD%_&Mk%A0F% zzR-f-{3^b@cH^?OP9cX?+WJ`6H#9`XqbM3o(H<@^R4Kxd@Yu?HNM~bzoR&Zo_aM?|OY_vNDsyJ&6_XjH*CG zyQWE&r{CE62KaFNqt|FZ9#y=6dGOPc{+AcbaBO%NI=>R_j_)Rk%INe_&_fU6EF3{; zxQcal{~O39;ZSt64m5uT@05h&*INgCVA(i3rhSbQGvM{Ws+#Rm-(U$+^*ATPSpuhM zIPbMl(LhAzC1ORjgqvr55#^nIAGq9?JMh1vrA|qCSa6Kyj`nN$Z{2)PSl(wC<8O}( ziw;^K-t=;kf6{Vj*rFaxCg7W)nJhnRxY)N67uHIU{36ZTn_bgs-!AH6y2qz>lrh~e z-RkuZ1;LnVwO0v(kMhk%YP&C(MUD!o3=F)aG<8d`Qqtqp(ImSfg`*T>gwob`BN5I& zy%-go(9mj%CUcC)C9GzYnG8^cR!rbjgCzNe5jVZ! zzuOoL1>uPx4Qwjvzi;5Aru2;{ss)Is-$f=0l*z|5~A3+Tta`>s4D4L-TJcXni{hO@v=nN`*xrD_DV>gint%n_K|c<-D^S>Nc>?Sbd3DWt+@*XSq=u}7R~If3^qGR! zD8TJ${Qv&H0w_Ls@C(+aiUK;I-%>$%0&exgw51v&AD6Kxd+;vAL^@BUfA>R1RYV3jNV#k5zoUVM}oyIq}p_e}o2_lw?U7<@8~&7%pf{^wP%&cgS}!X6jG z;A@ur@~vA{1V8KG%)#ah1YGRFXp}vrjBDScyYwN^!-IqzLFd>2fa22={(6m)3!p20 z@wF^=4-i(4x&{53vbYf-=*(qqGcVhE1+$DGUka8V(YU|C}PmZtZ@jf(n?&#Nt&WW?O4N8Hy~Ani=_>UB6KG#e*&j(|Z2yGOq= z?HHHd0(MynNPGKMU!?0sUDI?YXeM)RZRcb)d7k13+;9zBUCSMk4BZv~JW?3sLGfep z_Y)J^ZU=*vVtKv6O_7&unQwGHeyiPX>4n2}c(R-Q$8kBJ;p^ zG#{26HmY~L-)8rJarKn}QGMOlcW4+=Qc?s#X{05FkWeH{P>@DCrKE;NBrQ5cL6PpB zp}`=ea|Y=ix+dPMzvutN`-x9;nYnk}wbxpEpL5Cr8cDUZvW*ekHwIH@lsx&3xB+HD z_SOJ#?lq`3Au>QLVD`}ip@$hsm=tB6KmRD?72u13_*UQaGG*E zT)6%#m*l68VgovP5aOm-#Ak@a!)btm@uj&1s$c~XGjHMi{m3dW z$n|Ze@|yu7{HtdQ9gdEEC*$V%1@^&=yzqE_L0GTl{^efXGhu+S8Zz;Gyh5NtH;5G1 zqqyFCbe%2wi?7Pfo+g?_d9@KBY2Wv$dE{%Uh2F=T2FJQ}M{d+1PBjqBfLP+!4gZPB zPrTwgm2(vsj8Rf{u&Jk*!ke%305iNRhg=n=2OP}JU9-tJttl|O0et(xr|r1}G2Gor z!+#(PF;7mTPpCEDTVr}4^nNbYyf*DY%R9v8i{96!FMtPFW;mt4&WT{Ttn&xV6lP^# zjVS#5SpD8@b}I8gQUln2bCmLha_fNX*;u>m0Eo{Ktzic3Cz&Tdcm_y+*9ivNH|6tc zd%kxB%7G_hgM|YjvgaHe1_d%UeSKfRgHL-rPB2DSMOz}Gc}lgOJR#-Ukhlq{*T6<| z7;MVon;{bB(}16_sf7h$&gG~s+a_$iu7gdaSPqjAHN13D{@4=2$Fm}Ikn8d2ZNKA+ z^pAO`2hfOl8wW?JHh2kb;kSK5oIca>Wo^$Qo!8Dml1G0v z#BQr`UR8)VrVCcBi|EHUk>4g2N(_F5PBQ$gM`It)vcIvQQeQKcP^-uZz7rnA$f3K8 zA&eKkQG%MHb`sTTbG?N3d$MTG{Qf{0dVSO!vsDMnuiSGwQo=|40kRGVWZwvaO^2n< z9dLZ$JeD08uBHijK@?6_jXQNyw&f3s$ca3b;6;wh8cLHFeoL;(&H3Kj_9DnWbF?!r zVYJd;C1ot{aQ#Tr2_aDa%D#~S*#U<@3HuF^w~${aOZY5PfaYec7d} z_KEaorlw<-Yrm-c{G59}XrA-0yv;}72El9uF6GW`kOj_m>bL6g-!sj$S8G2#|45ws z;~$y`s73q+X`+EX!N>Gq=g&hx%^aFbYt`wE>Yjejj^^xp|Ibrc;^D$m7E|VcTZ&*? zT)D^y;3zWFs;0QZ|RD0 z^NDRlgmZM&b4~%hy~u{sJE4!Ow%hTzX!qUU9K1``7f*i*Rh;bw%SKMvnrN}ewn!y+pFM%C@T{HT&Ir$QUsKm>GAl)SVB+E z^YN!SY9;+|G7S>Kgh~Ir6K)hCEa^NHjcoP%wR`FJKlE?(e$}TGO%psMFaH<+2Yg2S z76-Tbw0lf3Z@<^ha_4)0jUp;WkZ}gU__>y=4wIo%37Oo#!ZBp%M6QM=xYC*F0et|IKQ z9MB$g6OAMLh7R~puW$gjZY`0JqGivIH{{r)?4I#n-@8@cC}6c|EE7e`6&V^%Jy__* zbFejTWU*Oav1xkC?{}ZzE?Ohe0uQbtuc3*`K{=9;yV*{^mXJ&f%Om5v$TxAsKjWcI zcHzReq&J>y4Gr&&Th923Os|R`bvF^ttVRiCxmcO<)mN zf*5}@kLyXl*SeKdu8r*j*i(*;B;iF5y}95XK=VpAs!^n`FURU&mEOiSi0>jmX)qAL zz;<#;)}`@^nT8x71TyF{%tn8N1PN7ZauxQPGs=pj*Qu*UeRy#X4t)P%ov`?g*n;lZ z2>Sx~k$E*D|0!#jBJtkJw3ld1S>qtv?61~(vtQ=hN{c!hyMJk$`V%Dgl=%QfwL(F? zISuvLz2)aPuuOA_hE1l_F8Of?T%Nr#!<#)v0$6M?6>0;3O2$ zwJ{WD^Bj9-dKIi(e_wJyP>>g>vUn^u*yM`5FfF6kWXj32EamOjq6_naEM7qf;0 z%O+IO!vo=0^*8A(X+jK5i|*L)+sCX(Z{GhI{kTq=UJJcAbeM#6hmq_xg(%=-?KXtTQ| zhjuS`U~;Jh^}&Om%hVq*LEE;W^9Y>Ojo_wBe-YDf9%vrto-pDe_#<4(WVy@=ALp<2 zu1NP}AJBO!ccV7wyzFU0jT1u4W-(R-8)-H4LE~o>%<6F6e13<(R-hlRrqjz;eBUp# zO!L1upkM8d|mP_>Njcg3)pBLBt}uu%LXc{bBPn0KN&UGW@(pRQQw`0CYl6r@QRJZ0iZhDe>&{jY%er&H^e?t)Uw-M(G_?&wzEE{{ ztKZ=#zhi~#eYRLl8}_6UxN+}^Y=HHpZV{_K5UhTg>@W4OF^mCI94}(kSb5nGGAy%t5_7D^^n(caN zE3z=C!lj4{&Nb9NlulgEk(Y>8QMgnbP06iZE|7r_)m}qTJtQCvqgnzI4DZ_z0m$ z>dBn=klf{UampF7@iNE};KM$0|D&Lhed_XO$ETB7M5o^qJ@|1;{Tc~jPS$_b@h6Cc z!9JfoqFKTq*UCh~N=Yy89!`M5Nw-m9o`GZr=t0}Y{zxJ=vbHqzTA>d4{*h)zNelRpX(Rj$%c(nZY zw$(qy(GWN?jHo;8J{8ml2UbTJv1b5@B>J14_%oUi8X`9phFA&M{-aY4T8@`84%za1 zQ=X=u?{sy2v&mFo5{-C4b!c~+hz(!w#ZP7aP_%peVQjUC^Te~B%kD?HJfnA&-N-V} zEf`7!ivwD(hria;1IV0+9+c9vLk@Ska?{%hig(!~&^$kDShV=eq#`FG8n34Nj(81f&7Y{KWL+M;T zq02^7tb9~{Fnj~fyl~rXzkH>D~+( zt>1F5l;|`dt*uvpQ@e^>jON&V>n_~EUiYiScs1vxQ*5_vD<5aq%M*^*=?1`zMNetP zX`O82uuQcg2uBcCadDoaOkp`r?-AkQ#Nh9Yu6s3CKn9SG`9#n0%4Il0?hp4}6~WR8 z2_w{BoL*5nwUMEs5?XD{&}0gk9z_k6ibn$LgU z_T`;(xS-vU*WHTp{VnGve_cBB0!p+uew|T|k$kq&3n?HwMNA7|zU+!-Q6H_(m9#-JK699)!rBuK(xa?a~DZs*n9HKA3~HJB&V zym#B0(PIA@v;X0}Hqj-AqBX-_kK5MZHcH5{E;IENrmO76g|gw zLEOhnbEbZLd+*)bkH2HFG4@q7JLTO$>+*SU40(EqN%bl?WF25R+emmz6H-x;gY3Iz z(i|lZ)E2_pa1Ko?r_UQ>VRRuE@5?|irY9}nV~_2*9k_pG{S$HS%>Vi0>7R(p7Bsg5 z_ej?5+;+I}N`U?-84{x(ie2iFe}ng2`Kx>kcirR&GR%-(;a!FaGg#B~3FB>IifI+im(Us^@n z<+7f)ACoU{JEkL_FKl^@O>cz@P@`ayv9;4+xbn3gB4HgR0NB~Sf6gN6-~15I!oqSj z@C*H#!bSIeAGZPY07A-O8Z?V+*GEF0qFN@Z*Z7<#+?j+Q1-{(e?C_fX30k&q#O?uS z(?$AA>)%JH$`uG=;}3*&w>)a-A`Aq z2YP#56HAV+G~5Y~jc#^dBQ^;1?j$!-Nss)>6M0=-zM62z;ASe8bIbdI_>U$p8?h3N z4NyqjoL3rg&J{rR{bCzo8PL%4h^VEck91_gZ|GiF6Q*g-Q_}}u0e_m1FKy`nC*Goj z8?tezQBDaZRQbZYofawP?$MsFdb6!agKd3nYb3y&9o$$!i9v@8fv2;FrI|2|{>n@U z`D63Y$tTgy=k!OhbsqR&^Lhc;tSrbQD|*24z-oSD5dJqAxD(aw`HAgWSZ%7ybm=95 zWm}eNtF_j_j$hZQcXzugH;j#E)DFF-O}U`%FbdR$zMeAQ?(7bVo+}7&bu}@TlVu$) zENg#r#cfcjmF#a0<#No5VqN^YU~mkbg>lGcp7)#%FWe5+Q(m^TJbsncR16|*SQ>(H z?hGm^7*u9}cHiJ@o6(&p&1lLWbxK0`ZPJu^_4$8+h5V^Le{`53kWR#MEvh3D{9 z63b1|fjD?EOu0W%vFDd{*)EIPG5M_A(cY2smFkHV3Mo&ToH+~rk#?s>t+xiC%0 zdxo)gr;bE%(M8V53lnT1oHY=g5*p=d7wx)6nvmGzXmnGgo;0xRK#afLZ4x(du?Ey_ zTnliv9jV&uERyYnG5MDnFHIC^>(i_gIllkc-O3O33UUeir|Nk#6G=c{FJ*Sc^0>W6 zv`G-3M3W&$hvVnIxQ>IT!M)|0X_=W{ULsRuiCT*$<>Ja;yJ157H^{k%PvnP%oOiT8 zSrP|NQmd6#$u7LyV;R50B$DP3LzaXFU4|jw3@pOVB4q6D9+8 z%CD9lB?jEe?liW(AoIdXFV5le?fW-x=<}#mqyJaa)|wYs;KQZP{){1^BmS((8tlyK0^1`6V*EB8A)OW((ap( zoE({uRy*Y9N|Ah~JNzVR#t*)AB7p9>t~JvWqzd%R+2&MukS8q${KR_f4@*tpKzr&E zR}$hoLKb*Nx&Le+SO7dI;BvF9iC?e`IaQ>Ygvak1t)7@flv$l<%Xq!1^#cF=!8Qid zVLa5-gFhYqId4yn9P_zA&4Z71?-`hwP-c7JJ70rJG=_UJJw2poh4D~lv*v0i^1i`G zRPFnnQ9o&fHT*hycd#hGkqLu_m@CFYBrLKYVQn&gA)9(kxGZZuUOrkdgdI8vi&%Y} z(j`~z_XNFJ-$jRHc;2MD=TZ>eXExQG;jfDZ(?-dP^D~+}`Y-MbX~J26%(rJ$^Y(Kx zpB{b0+K(gatP|^aZIWaDTn#TB^%3T#0N#$pIO*?jzj+JKB^S65+2G27(CP5e`z8HV zMc>eCg38_#1aHWt?`1idX^b;YLTim_WeTwIizVe|38r2rztmv>3$gq94s*5G4u{!^ z|9B}NNx0X0bi?*zx?xM1S}Cvg>zJb8+ci}bT5!FMF&pr!k3xavWhZ>@726ZdeCv|U zv*fYoV71k>Q~w21bYaE53N>wo6$0hNx3t->(J~yrd&)a;wt<+S2HK?tLr8ndbkeV&wl8CqQcLEa-WdA&HPNeAOoos9!c?rcp6reg zC>b3KgO0hl6qwHp&Dq1dKS-LB{2x|_XMZ5@e8BTsopa$q(l0lQMvY^eWA0cC5AsMd zpBti5w#x*G^!2TPOsN%v_{F8H=+>aez&jdd=;yLCzv`Kj6PJ-Fv$dARNZ?J9EsMaYnIm~>)1TzlQ!9ND z{;LVdgpG`!1tblPmwY-OK5~Ag7-aCdtn{=BK)?AY9+6Kv9%du8@d43IKk@zGDH|O5 zbj)}p8y3&IH1L!bq(KEfy*+XHwfMXvjS>X0>%}0GMwrV$LH+P?#M$~s*lr_WaS1Dn zZQzZ&dwsM9FEd!c=Hr|cN`Z5UVdK-PAq{~cpl!qFuo518;U(rGw0ZmkkI!nQm%Cn? z<1Qof1EEjq3e*!8g&qUFKSV4eBAFfMQCK2i7Ty1?jXhKODZBF9+#CmZxoB4cK7@R^7H|)USF;{UmG-IP)efp53TZ?f z9}r_)#rZr1%$L_-b<}5#f?wbQ@#hQ8k98jMwGlWgX=AkKRJ*@0lirzpOB5k#U!1aR z&H?mL?JxHS3EeWC8DIloygLFzb!CFw@h#I66Vf?mGV0^6qN7}q5-(Ellh&F$3F#5*(vSN~Gj{ec`ok&CjzX_r+vBnQ9> z6IYvZ!|`QMz#4Z3MbH??-IO>o@GhfKC1VRImfZB?^?CVzeW&dZ3K$rXw7pH@{{0i* zoYdF*kon;g_lpgoBHGOxnGi#?>c3f1BkCo@Z*$^;*3FxFEcl<|z=XndM`zfr^3$Fj zj+PWancJ=W{lydEAms2g&67F@Vp-V==b)7VSj^-)L@5}{<9C8Vx&Q7|{$XHynEAJ8 z46PzY1~f|%AizB+(@YUSlI8IdYF+#(kXjT*1>{%n?Hs=#uMg;jYBVOgD-(uw6}s!Yu zV}Vk4+eB7V7(I<#VnJJcewr~!ZvheTK?ry`pOg6!3gBis0nW8+6^kxTI|l~Y$;zty%r}bvk&R0-qpT&)eXtFTLa%TI$(MUaROYb8}Qx!*q6c?tp3`xEYtUJ2SDx#O24EUIVYUf_VLCeU%&w zRYZr7nw2d!z@o^X)=VZt30Aj7P(ATcGw{PM{;9g|exbK(t(;_=ylP4<3<{LSkg3Z* z@w#${ML}`KR&hXq=Lc8f)NY~VM{L7)(1KmDyD3bFxiZHVV&V~a%3oaTZ&Rs5;T&D>u^^WP)=b+PvY%C&kB$jfx;sL*UOa{faK&fe8A26Wq%!QF;=hTL-*lo_2NhM&$9}9M-nXM`76`q39@@qeJE?z)>&QC;W zv7?1Jx!vy9&s9}eBzWQq zb5-pRo|UWzP|Se}@PgP9Pjz7DGRX6SV<^8iKF)(Eufn_J4|4sx{6x9OmMw85~lojE#0Y11a z{N{NMlWmz0!1OuwHYreorD?UNJHB0lPK=$zG&?$PUBd~+t*xq%21p*HG_{$pC^7Jy zjK6?&=KLF@_hIV>3-r=r@!}#Yb81HQzS1PyzlI?R-R&j$l*S}FC7^s420rINaxXbT z0pgi1uqEMF%3W$b7G{S}q?fOHH>dmiO~otyQ8)KR_=-O1!D=2ryuv_VaUc?f3d{pf z8z`nBQ{OcM68a)XwCtyAz7hrF8`{!<5!RGLQPHYfV2kyQRQsV|FG|2iELHms?`qHj zKA!Uw6?0(t8FWPm{S2Z-y~uO~5so99QZ>l@Gr}J*t;cu}f5;#2#jm*9rI6(1>8?Jk zr1@!NPNr9A)S$BkV9s`l%HwR`X2{OxNM-k*f4?!DXAYy&(VdQeIMy+9RAqWXMu3w1>OV?kZg6UigC+!1Z$ErU($KtyZ5o%21vCM#+?e zG*RMUJWC547%&6MD=!eco0(BscfM3F!F~ac0()n`+ z`M#o~fgOnEI!=@W7N4n*cQu#vJ{+s2_!sUoZj8r<&WgCl4L-9_z2UXaZ%T!nio3{HOyRd& zTqZY{G#F?pYhPoGLfzKCT}c1C6@$Vs3Zo`=CNKSB#V&dJOSf8+A=NBii%DRky9g)*4J zy+7m|Nzrj{Z#M+8avdA!oTzD?_!jO^Y%sDn8e0dj-`57~`yGi3#1`HM_rx-k7g>QL zVZrb0Z>Ne3sy4@rDqG(DpQY~IGhfQ&7e7ISYs+p~8N=Ql!(P+2CC`g?Ba}Q<ec3uUfTJT5Ye;OS!y)O41cJ8nj{Ha*-izu93<5y1I zKc33wRItP|`63n-n%d=4j1m;saiVBT7VU-yzu;$+_ZeQ@mZ%i}Auk(u*oRsco*Xls zH0h}&Y!InF3yA?ey!-yu?raCV6;SEG7Q*KGl9ensm<>R|b*VkgdWBB42@NBc0!CaZ zbUHUW@*i_!a^=~!#pyz$b>F%B7APulx)HYKo4Qcny$Bxgtdl(TtNLg+h5Y}>9A$Z&QnN_9gpBq65ULzVQRltRZ$3(f` z0nhoVdDG8xDO9XJH#-_i82&L;THICu_hZvi8T}Y&+h94Kh7gQ<*gS@k^-mw{rtWa7 zbM?wEOK@Kwfko6xN>ZInJ)u;)UpJayX;7hZe!5FKur0N4xs45?eUuiO2@TL*CM<%#&J8F5C?`big$QUY<1j_74JCfK$Aw zLD6MG}LB5LQ-cLMgo>;7N!dRdwV8 z;PMC+z%&@1MBH1$`T(epGrf6%fk(ZBo_>Tm`_jQNkJ|5Q*l_$j{;b|#1?(|6Z5@sC zA-lDxk&FWGB*6WZm(HE;0=Z6;*Cxm!$u;`xIj@>NBH55Di{4VK(^zY}XWZf{W3yzd z=IMX^N2(&!XLBlMm<}xuYb&bxYBB$t)KJ3ZI)7mtnK@j1b>@>)YT9Yr$?myBi%h%e z=l~#dOs|r0-nL0e`!7HvTc=!%(;Vp(gHPvoj*Y|tXD)pU83e3}LGGahHCu#RXxlqYH;lcc8Jg?(%hd8W3bB-=hhI1QVY} zPX6r1>UZzrobYQ*!CwbW$ChWsW-SM}8!6G_Y(i(@g)54K<64w=p|lmUJ`B%!?SIua zS`V{HKWYgeVqy_;PkW^I#OSY#GRs6v$q=5tCIfY?TOyuokU%4f9R=C^W%JcP4(vH2 zG5XCFgdE4GdqUVMq7Z+c^wOW#Kl%XmxZb;7qkPqSb#*D;d=id5zV;XKrsEh)vWjy z4ZeBlB_xRyC?$*p<<0EC;XT~tn9W{)T$C1v{pQ=flBUx0=k{mE?WU&<`Y!O_-Vlo< zkY>-1Z^dcsW13KSsGybh9sb7-6B=-djiMTtdQ+xFyE z7G2mT1oLDo!^s5ovqRdKG$o#I-HxW$inTwy;MU_&q;_0TY?^yG^@t)9l?P-CtcEHTp?KIzJ) zjmCJy!T=QzRYauv4yhnQ#XtLRXAV+*B0O<=ZUTi3Qg@@T5@Xu#RA zE4Kx%v*4f0#Qu-!wIdo_0;I*7By-)bAshUBSdd$MdG0OJY+^gR(M3;h*H=riiEW?c z5UG-|0GGj$R4_WbqYUa_#P8xqH~S}rvzOfjDlH(htGbYGSHAU{jUBcqjysTq1Tyq| z1#M%X4f$BxaGSUjqunYV zCI9T^xsWOlu?f+)lyIJU)OUF0kHcQTP`h4N<6GV0Umu#!ad#J97J&Ce-ONQHe7SlRJHJg>Og2t%bM z;N{lW*V6J&SB*N=pMti^{Xn&X$SloJBqLAx%;~^%E$woEh+~;biSBg5|6my|;KRV? zi+}J-5*^DsQec)7AN*L_fKU6wvyEEBQ4(Vix9M?U?4_rZfAp~RfhsR2vynh=0b!6k zU1R&U!KC%wfd9_@-Epj0F_8xGin=#wDNn+tMmFBoye5!*n$-T_HEkZy8>2#38erHO znczYgCk;6Oq;@GV$JdCOo@uF;KQ*UTeYv4*=x5RE5ilaJLSVgmu!1BnnG5M7 ztBz;SBK^u^x-)=#5M=w@g{YpJZ3mB0Xc+Qi4Dpqz&`BS*b9U ziF6aSdDI(v+?A(lb?K2cZVDFtktN4*ucBNPa^i$5L%S%^sK|JWmNaRt*I&4RKhGN+ zz7Q4kORH&%pyEoXsK*^2{dW7lZxid_ijco%k6=3}TSmf5mv|R8lC*~%RBAeoc1IG=7UYAa zx#NXZxI(CC>`c*U^G)k zufCJ3ws1*glit|)PP9t*oN?b>!QsAps= zGkZlr5=sD#LW%!@y`~9?wsSTps9$qa{8iYORg=_znup?hjc;-grhrs|AHqV7UuB@I zW|6(Ursw^8d zm_AbPMKKU_Mk0>2^xX!xy|7lRb7w(&ufxvjMBucGcXG%TdP7y@xOVLnRkQQSDd+7^ zKiM?6E3a^Ke;G9fQ`}qdxqnjJ*IPL)cPZ}E#pHE@72}+-$;qVhwsa&Sy=W z&P+eUzwfQ6_8+{E(55|TSWEsRqSHOgG1KnH(O#jhS&Hc3Ag7aZJJ_m~3TdP9op3P? zD)t^v*}%^*YPxUUZQ20{QlHr;Z3|GW6p(&L#*oiRqwEE7BSl+W9g@)n_= zYtH5DsLsBNj_~4l?bHRETt+qqUr3+<&OBEZcKSW~rAB?5;|D7sH*S$h(^TTLjs zTZDm;X#|U53!f=r>z-Y}9-lFh{YigwrtSu;Yyatu88kClP$)t}wiPhwR6!Pi6Wtxm zng_VsmWe;GhUDJ63PiMbam~A1+DSjy)Z^Fos&PGGQo+yCB77Cu+t-GF8#Ar06@>cCPogE1cxGlCQ>3035Vdk{ z3jNslrRl6YY>;(N_3PLc|9IM;koEQQIk;{8TiI&0D&Push3i#hl9H2%U-i6#)aRDczaj)_dg4;QZ(X3e z@yJaL+|mzRW65G%_v~V^NelH@so10Ff(5MAM7b-C^UMJs+r^BKVC`lWZ0&UFuI$-lMu9IH$cO`=MF;Q~9w zGD~=c#SjB{Fs8vq>FXP%5g*}S>+nMdTZH%PW`JGNw;R)6i6*1?$6derowweY&yjAw z8%T|=cEwfyU3*fu9v* znM=7c5)u|~R9iwU%6;R?pJ&#tOY>E%UhVvWqq!_Vp#CO_3JsXCDu;@Nw7FW(3%_;8 z4#wyD?x+p6G?C&?zFn3%Y_$Odic3~hQLQZ%6qo|~)jC&ZH-S|)8GZR-^o#=4*>66g zX*k9pUE3wXAw}#OvhNmzc=mEy_zlnyuHKOzAUr*Q)8SC?HoVKAIUSC9HR?}G12l!w zIJ=t|qnbR26nepbSXt9Q&+C+H9MYkPn6^!HWS4xTTB7k3426W!u zRx?WEm(hun*WoS6LZ8Y!mG$8{zkQm%qkEvZ{?8@ek`tag%;Ot4)R7JmlH>1pN`?P) z)4tq>f>GR2;$xz%Cv{<(u~5sEZ5*bP2F;eGCU;_>~F4F{*Z z7j@=SQ%htt8({ERf3nO!<^i8fuT5u@>;n}}TcA$PE=imCpE(4L=%UiloV%C*v@6m# z!84Y2Ldy_>e&>zhg^3(~ehncRg;Mn+T^(QUe$G;?JwEUu=7G^+pco?fr#gv#i;Xrf zEl90LXp-gaMn)AVa;NoNEFx0xqxZNDm(hp2ge&(E(MN7ALpE?9DWsPT)0LS2BQ1&`>swSwg42>#KrbZDUgEdm(Hqur-G+M* zi+0^V)4QZ_dViwktEltLXZm({p=*of>bW=IVj35~ zHJdaMQVjjMXw#BM{Y*xW`2f8S6@1sxkH(;CMrJwiRGn@%vH!o%92a zlan~+FtK2#Y5^g~?2!qQnmjOj-UhShzpBF>xAIeQnjZxrHoc@Aq>R#x#yMo@p57`J zKR%ydl)n9^OUHSc3>j;Uc&}O7vixE2Y*5KjkYl|gr#tCjMHFN_<}AttL}0S8RB98` z>{KhA;4qcRN5a6}x4e_>DV(W^vP|_iHbcVAUt=<`4o3(y*?@!N;q8jYkx#HgO z4VLN&Urm)|ly${ld{i7m?0bKtXTdC}k`heXygBg}%LvbG{0IQf-`mvX&? zsv-gw)ZR$WJkC-T^Zv6+Q3$ZezQ+3*7<>R10u1egcu7dkDAXo?^%EV$pHpggx8Rg` z-CX>eMWo9jxL|wQ=p87K#Kc=%%5xPPrb3z)Tc^@7s{Q8+OFz7UQB;K<{A4lRS z@MNus5r1n)AC$+OHnPk>`lee1X-J`6^ZZ`0xxBXA!ZZ)1f$*>}|w(`Thj z8rIuYdCQ$Qsqy=0LcI)~`O4>4z;O92zhl`A=%u@UH_-?&+76-+x~F89=BP3C5G6%h z;sHmh`FRiV6P%yKj3W1_4#eUD3qVy4VB)<%Z=g+$eC(t@YWGmVrmUVqLGxi!)km`K z{#G(ezB+3|9E3%T2?{U@NOOm1XwV^9&EtT8^Db}+l6H{Fv5p@iILLCk)<+#FE_6X$ zluhO~1dO8L;^zAEIrKc&>}_~dH;NfRqv9oyzFl?`{t#lJKBl_|rWgd(Kh*2So1b)8 zgh=5V6|zbyIN6A?czszjwa#-XUaQUR_FK&EMdJOHoM#L6Y&m92mm7$Y8`=pUzH+x6 z@+ddf_iaby`5GW?CRAcr${^p(u0RRF$?VDo zHcWT_R|1Ftp14yH=ntkAg<|M{TLu1yhVC2Dpn26_L{De`@NQxyefv-mbh5JiV5e}X zY4s*q&0CtoyE$VOx{Cki-AVv?xbn6^#BgqjXQSPu2>up9XzfcbN2|U`aQkEV-l^`g zuX32|kxtbHa}+TBpigivMV;^!Ppe`94q048o;?&yo;(^I@#51y;aNDtRg{4|5%$=f zSs{Ytt1^2M#TumU9$8!blH`xre{{s^)u{H#DqWH%HIBnJgoGV$65Cwy-@}XOGU`3e zK;-vvuHsFRNIuk=0GY)Nn@c3<39mCnQZ(A~Hbo+JQR+`Emt$`bIz4T;0rrc~P_kV%y2y+nbs=Zz2NR$quBcWT!*QR&OZTwa}-%*Ge2 znQFz!)0`3WwN1?NT$j3ruFA(>%?*)5eMC%pQ8QEJxoF+JR#K$}7O|l;`*eiV*;gvy z?OU@-cotZ+Ul6~zkIm3C&`w_m$8Fw5zCZ;BwA>90n$&L<$;?`?XbT%2F`^xb{$FIu zNqa4ydy3Pos^xSEujC{dc22!E-kGWUYxa+G#QdzYp}K)-r-u>zFMyKo?_j$*mroZ9?&G#Y;f2RmEWJy~MZ zu}&*;;(pR6 zBlU&Xu3=$iJgtSpXcx}nH5JIg2(Y^bDZsV)e3pqcqe5&_oUC^GoycUJ>`Q=#~9*w;O@N0lHZyr#o@^wHR{|%ai zD5h!-TTwGLCCiQiw?Zl~fKm1JZBhgAC#N`~tQ(W<^&SNAx-HDSt%W@UH0C*+)KvNE zRSQd=6wUHu;}Am%mp999pAMJ6iMdz(5l8stRj?0!hbI)jNga~12nJ<0Ea71k0kDgC zvU-Q(j1V_BNubp1>G0LAE@lgxj}O_jR_=(5aDK!qeO7Myrs+=}GW<`A;w?nK zE%V54Y>cFJ>w-Un65MLBck;%{08wsDA{)>H?^#mqwu;ZbC5s=?7yiuipSGBnmOP%* zN8o3u>y`>S+EQwqWyd_Zij(uq-g{Omh;CKt*V5JiQHVii4Op)g<+8v3{zV->hrcEJ z=Q=rO)pNMU+qEfse~bTnQeX>r@wtyc8~N;%2ZFq`BVN6vC+X4@;MRcBOpnaYzrMwO@&d1_~2 z^!ZLzSUSz)#d~z%77d3u9y>cprv4oB%jjkOotk6###S9#7gr`x%uX@?zSN}7yBcEW zD|jPa@0cuiV~PW>qzad0td7Q(;rwN>{u@W8u?@r-VkZqs%vqYNm@LV8~;7#~wZwD4P?(3{t ziSD0{pPa)-zA*pjlL^&rGW`r7`vLhnJAS3sRN~|QW%aI5$znkD0T&k?eDsII@IFQu&Iyp)OZpOWIYd!W7cH#b5JU1=+j?((jpW0} zvQ`Za7?-Q^{)o+LOdd00`8%sRb&3cFT@ga`tWKNY`w+i_u=!J+M;%2}?dM`K$Gf*K zESEff{_u_McQLfD>PCjSO-+Nf2U`3NOChP$YRyN9q%bvf49+ug1nrEXbR6lp@Www?e`BpPt@ITLBuSsQCs zqT%NQ@$-IjuZ-GrlzO9Aeh^evvk`8YCG-hn*%_U-Q;GR9XU~|U?<Uh)8z?ZIgrc_ybSA(3^-j?DoonKBtOT{+YJ+dwJ0Fw5b#}BRmy)8M-=1Lp z>GY>&=ROTBtHVghckx!lURTHt+TkM~P*@`{f-;RrSRg*JK zfmQyXm zD*Gwsjk~XIhL@^9Z;r}&Mb}Z9R1Q3vmHf@{RC_z6qQj=_X}g+4*X2G3q}=0axP|?j zYqGmCZ+kFwx4u1VI~P;AdCM?Yh1yoaF`0XycCf?zc`*%wV==fWT)ql1U z%>BPC3{$zdPlio9U%--DN{TzL@UEHBB$0nybvFM~LV3|P)QfZK!z$gqJ*sIXBRC3obJ)yAEg+<+WD2n;lg6bN0?FzoVrC!d~FC zuy%W$D!CLBF~`cbIv z^=&$5wx=aJ09Olc3mG5K^H~7+a~XkCXTJ1Kxx$q_Oy=N4=H7%3PN@ZVo5$Wd9}!6* z`6?8BJN*;%wIaCtYjStC1pehq?Y-s62N`8(i%h5c{ukdV=}5=GMlsLxi~&lfD9mY*e30X-Ep9 zYBbIMCn&0RGM6sJUhnyV3WE?0vZO`?yg?y92>Lt?xO@4E^!3=B;Mj8_m92jDrRyJ8 zZf-ov`Y>rndIHv)F-RKxH$1C$l7Wz=mVUj{g2tr$ff3KKrJR!>k8YYBe!fs8Ia}K- z1XBR;%{c6DMBfLs(J=oy)(QIbe0m(*Yx-8Vw2wY%V9Vq`{b*~?u?wg>Y`2QqQU$BO zFlet=)QaH3(>qbZFpR+dab$4K&Xm@T+?+8Qbu*$=KsAASpmJ|3%#02`BWrpfzdj}8 zdn{_CA<$F(4kIorJs|GiM=^@47lpI-XNy#g*9wO|&tC$qYNb*quPv$`QO>7LQ=gHSKvYCvx+{FgLRH z2_IOK1z9mp+cF`%Mxi0_rLAdr!vJ^`d~~U!`w*_0FP%!zUq(0Z5k`XbK8E3jVNFH{ zv0tR~u#gtB73Y0a6*+(S=kVWZtt*^^zF;85ckp7+ckx15VZ|jU^Lm1wp)?&2Wpq0( zKr0g_4jQTFDx@-9!xHggPgaB3Td%j<=fON7XZtkbvbC-auHy36)=pF{{Tetmav$6L z&)({8591LgUIwe2<0n>Kz=dSX>?r-S%0dO$Cxbrb#_Xdo!+Es2R+%d!#^PXQcV9*s zTp>hB+Cy{Tn|<@M4_8U3Mh1`}$GLIOZyJH^Gwh5-ANKV#p~8r^hNCRIz=JnEI0G75$!Adk)zO{U3C zk#^ZSdAphh-jOGxdRPO99)PmJqc@{AemsY-a;JKbY4i7g14`B0n5iy-5A+yB+dkB1 zly_M$L+l{-e2$#;_$-2zCp3rL*2cBsg^$GrahEH#CRtUtIxoXoHJXaCQW1R6{c z7|z!|SjXyE>*puZx0#wZ{Soy$p@*Rqvzj7Mr5QLoa-n6=PqK7e5N*uyaPq|`=@eI$M5l#PWL z09iYiL=#I>kY~RB#9aZth3WNhr3ekHy6`E>%F8^Vu`JNt3nV5`godNjWkUlG#LYIM zp}at10SUnUNSF=~`m(34q-=>}PNTd1E=xYDRhp%An>5Jr4vuTi2&pr>YY@abaKF(e z%K+eF1`zDRA%$trTu=2OqlQ4B=E0QEdF3r)wls}5?>`N?I-B99&L!~C;Fhv7<6-Ni zAK%|W*fjE>Vp?;s1t2%ac^_kMv7*oDG_X*y&{AyP%7Q!n(jj``RDs@z-AK>~YNTOg zX5?Z7YYp-L`SCsLy6T7zg$b zoicftr;h>$W-;+4>cR5E%S&Vw-Kx_c%?Uo6o^w4*hPZW=qiVzGV+tS-oCa6K0yCZh z9w(%x#z#eKL~93t8f-Wig{*5(dF2&0JVaM`HvAZCpaNUyI_N1@Ga>Wy7ub-Ixs^6) zM}D&M-?FR166{doeV-V#X!V;M0>|g~U`YQA0km#t>7M71Aq>30O%^9}Y713U)?*>=x$jbv*l#am|xqiRr5X3_UEy z&--nb>%_O~kKad}h2-Q=-oDG(dgh>@Cp$n<#ez?oAP|~O+hHy{5@rl!{w67ADQ=w@ zenU$~=31Zhw=0Gzbnb)Zo%3_w2bUB(ty41Z$291Asu?j}!G5i~K1+#++!86&_F#k) z);+`dnz`*r3k-O$087_lXFUX~u)f^lc8z`yG{pX>1Wtcgeu#ea)GsG%vv$F?+DdX- zl7ZMOI;lm5Gf}a>SG3gOh$&kI@m23U25cY1ZHMK1pJCng7uK;y)Ohw%b@%B_ zcKuD71x>LrThzo76oVHJ7k!n7E{1%EFJd7`Fnw|bs|C3Gse3VwY93>JLZZ6zdU{Te zuq*TgRW4=l^0;47r@xHBt>-cqZ9hL&qfdAB%*9l2o>ToA3A-S%d^vHe$CiPS+uZ6j z^==8Tl(ZOGOYfO}CWLfjJ*G;f4pYp2!7)SY02Xo4uZcu{px@cs6C`YjVipvOSZF^I z+r9Dl*z(Bg-yr8QPrDhI@2xv`4XJqbO8*hq)WZ10$>=RKqosvrw@;{AYcH<|b59+o zEe33)NcnE(KAT+oD4QLo`aimS@?0<~mL8+hfUk9_-)F|$d7)&Fiu4$T-sl8}*rb4C zY5VYa-oL_LrlQYgVyn{D`x&0GmFmaSKm+C4zqMzBMwLqpE&ksfEj)9+8J;lRuKpwikTFw;Zbq zCh5z6DpodzA$kMniNpOdV8z{ZVg8RAGCpwOo=`&rW2TZs1N0Csgw=^UY zFCW!*cgIiJgB#>LcBiErq{m+d7S*?X_^8P3Hcr9A#RHhE0#O;uw&Rv~-i`CQ63=hav9dUKNOr(cOZCM4e*MXGyjy}U6~M6S1sTbFcpbCeC6_=NH- z^Dqv_<0!I$=%_9mcJva^%e&N^c+6h-`!vtRAw=pJ4oiVqdWg^^6mJiHL7|e3qC`QvLz7|H>>w4b$@I;4`lwIQbCIsVo(F0Jd?wXhJe+Of21m+Co`XiFygT+6Q=45k8YZ`(_V5(b z1f7c62)W3|kQp=phXY%?`Z9vcqj+9Z$~LR*cM2ZLllZ z-HucB(FC`uj{vEC(BS0bAe0F6@b!HJy#~Gzqn(7FPKLH93!tb%pWB_Vrn0nn$g7<~O>Q(bPE|)6F~& zDKB7#m-QVlvM$Z+{xB@JC4oufav*9505^Q9ePBUxE=YD~HPT?7hX1U^z7To1%5f-bc?{W;7+j0eKQnBcf{hD6w8pJbs#=8B83E4%R@j}eQwXWd zGS3+5XxBF)!xb0<98_~ldQW4E!TH>oGuD)B)9AdY6qVz2YReXeh>fKI&bGPp%F9_B zOWR-3VR25^?_IxiYt&m@j2;GOP+M})oDLPnEd7~`7-I*-w_2%6pP^_$)30zP+hM%d z>Al_=IrBHo(ui|M5g5j|C>>bqJKZ7Jyh!^4LjktjK<8aU>$6lYHJ2_*-)z+e`GBcQ z8d0>h;KmYihvv$!!n}G zF8+wwge(_IW5dZ~A6UG2K^LEpk;kj=Z0w3bk@N5s=j`u$laM4oAtolKK}ZLERi(Th z0~~M9#d-!->)_9{Ek2Oe@eO>;1X3wj9&u;y+8@O78(|&t*lJAvb=obIJx~&eK<*EB`*F=geD`) z$Z*N6200pR&Q`OzhEBpU<%c<3P5tuZ$L5PtsIGhWMlw}#`SR`#U#A$q$x>xINHDzS z@k{ih0JDlt#Nb1d3B)+VQ?DrPM+n;s)&~tldu9n_olYq4&+McZzo>DVBQqGA|HLeD zg&*eI(qS61OsfRb(Fj9nVzfKfQiviFveb4C&Q04Ri8PL6XWI|5gloV~Zo%;0)NIh~Nn)t9bX=iD)57AMa>=PfYS=#`Dvy-h__#Ot!Y6(u zW2sesvP(Eqya_GN&Cd_G|FP1P+XZh#;j$#?|8TarbI*teF%c29^>ykfarDZ!%&qgH zpghwBsGOXkDI)grk|GY*TmkjG=w)(+>agsH%r)ytg3YPfyvz-kBKDANhu_!<>@}S8 zAfGLLLG9CSR@3e|Sb2k9MpB;~4SgNlv-k4)T8Q>6UH-5Xn(95_d)KPk8?8LQ#d`;i zNy$!>lTP6mg#o-?;dYE`VB zy@giR)`q?20#r)S4W3J3^WX}mJa9j~mZ2e|wXH3$f}~*oqtVgcxX;g?Oo3Bs8J<O84puGuRcx$F0j^+1B=94YONEJi=u>jUK9UJdGHrGMm2$@eLup@PHpUPqP@CQwV<<|BCmlbt5*J?&$ zug&GHjs}!9Y_?tq;?{G$>Ww&iHWYUr-|gkztoCFDN5-sQ87HQFTgdm6C8(xap7G_* z!!1g{_{v5o!mQRcXawGHQB9n`R5CUlWH(3c?w-EEhK5@0U}P!~dpGEX_s6PiGV~s( zKpZYy$eu?F@8F*7OhCp6R2(ms>fEY5p@b8opJ6I$0D#TfHSLD-+Hk&x9ib_XAnkIS zqXlSFf5)#7`VY5uT zVYbi6n&!~G;DwsP0!H4UPl(~fY$3VEnK31mkADR*@J!Xb<)Kc{T=`6(TRRjZK!{Fv zu9LGx(!uRj$#teW_cMlk*AefWitay+dTP4E)S%$5mxg6yTXH)wBtg)=Zn=ee_H68y z-TMKbtug*K1S!41TY3NGKlh|RdTN^>1-SS!54%a~eYWm`bzPLVz$Oj1v?*T2{SG&( zI7${dr9AbtY^hhPZ%a<0cTk0=*cCxo7IPz1P*5Y1+>%?c?5>W&9oGACDt>3_bU}4> zbwSC=rEQ9m>KSasmyYT{F;3xQcv!IBp((&CX|kjRCt#_u9VQqSt^cs5vi2=) zXLTrdTP_>1+Cw$s?<<-nq2A%`x&`gD^*k{n#_kWM0}R_d1oN*U?(B(FvzW!tn72gM zLC|LO)S(Y%KojCt4O>)#JW=(?9May_4-t2rf=+J3D?r`+0Yce77u4lk(=xZW>z59V zyC+1Qr1X{MQZJJnRQNTBhzL;O@9=85deK{~1^Hmn=~b_6*(OJDSIVpDOQ68Z(GU)k zokIwNMCTlv3;yD0Q4F`!YXz8j0<_z%!7~t+(W(uImQK0E6IfPpKG4n<&$&|Sey2EH zyUlH{H%I8=vBg?P_G{VI$!G>EePc{TM!2UPsMv?&QLR5L*jN`a6UKWwHq)i*J9~>F zN})OE&XZ?JjpoH)*H+^MwZ6(`HapCn#txQz-dU4;GCT(x6Ma9+SUP%zgu_r#Plxby z?74IOC+L2nWU=D(9Cn+3GM;hV9vviyBcx-yHhml zm(AA9qmaBr2}DUmsdTMXnfXLrU*?UUE8Bvqy8dgj^GtIt{=DOO*|4EpnDKn9j?T{? z)`Op?(|hL~x8^c1$DD;FCAnpvKH<~Sj`Bblqk!T|$OXk`PGAhz`g-Q+(by zUB3zrQyTks2C}F~#erU(JKA}A7PsD%_DRC4i(dl6b^zzQJKKE<3cqndWhGY#4%SigH_|Fq?u?XlX`ja!OHF&OM@jGVn z)tqM20#1L~=@i0%DBCL*55w9bS>y_<2KCSj&W^a5`eh4~h$Vr=J&_ST5;!xZf%V$0 z9fE6ajZKN;XDb!A@xv|HYZy`Sp2j8 z=&|i9PiTo<#>pa_;D*18X)pWB#D?HmRPWQB)6-3vNMUMEuZuZEQNJctGzEi%(H-Bl zTWb0&F1)49irjoR8BQuXB;za}OF0^s9JvWf6k(p~hufb(RE{kYux)?rSv@gJep?P0 z^Nz6Z$3rOy``R<1vgRrok*ruO=7bo4##jvTtp7@3PfT8yuaEA+OIxFv_x>fu?R{xNFD%wPyolz=Dz7!LE zrZ;-C*uA{iPAqlt^Ko%8Uw40hjxa_2>(|vD$iqAJK1W}{$quY?yfP{3)?YYobMW!* zR6|jPzxDO>dG*@_P3-IyfiW~**KcazjidFLP*Fj%P|!Qu7X?|awA3A~zThkfe4Wt( zVuRj{_A>_Qgf+nuh&huY|6Q+o2bMmI0JbrFO*+CjPTXY~T)7XsBwQ%GqkA>yk!Zh;J$07LC5aQcTq>MX!kDeH4;{CX(_8c2_}ns;*R9;3+eJt3=KI7Ri7o<9`spes8XPQNDEuY_$RY&p@w zCUigR|2Ap%3**f*RsZ&VY^?#m?FUn_QaGS|pB11{%} zf;wOha*q5l(+iB?0Y<|~Nl;Bq^U|GD&^+)e|K?8folT1X9VE9|{2@SD47fd3(6p+6Sb8hac8V8(T@;c}a^3Cfom zDih&i6q0SUhx3D%OAdezN2NO0*L{wjneL3R45y$qw4SPot+La?MIs4w_GY8$@Co?a z?!_rghzDVjwONhNfGR`EXji8^!~@kHeNjKp&_h{sD%$fhV=soT3F$wduZFYVV+9Qgxbi~VcpiP${C zIiIYaV$t3L0_m1lpY$irHTl(!77hJ@1YT@#I@sA=yUD;iMo&k(SXfKc6dzBkYuK^x zIfp?Lwb+$a*XUk4&wS6pH#c56Fp-;7m;D%4Q3U5Od5x`619aCOY8zg#Nc*`AY%vAgwRd|MGf^nXhc-uawf|sLbC|0UH-d?>zG4l6S>A2b#LMJ!-8a zXZTS+wyA=g{{o*3qz?6@bS)e-XeObPiVfKT#pf{?CUwZWeKQ}2>k#ZO2Kr9UPQ!G$ z42P(}Q#F9hD*<=^ltYR#e!`;Yha-@{r-dMN?fJ4n*#P^?Uk6vQ!%Z=G%rHC7fIf?i zf8Bh=d<({jtL$IB`5HDeCk#-4*D+uG*oBMgg?9BChXwrMxg6tH1wEWC#SB;=L36VI zg*^>YQY{ZG&epxMxn|7HB+k6pB}_tdIKcgZsn!)o^Y2SW-KiWo*1yyHPOa>1P(ON{ zCtfspMJw2hSq7ka!>pfb$XGLaZ(Ycp(&g)2gx5w*5zC^AaI|npqW5ZJCo905n6)`h zI>vt#n0b%UO1}uFu26j`g(%Z-}9eY=j6SUbwluz2gz4&QtR>WaGNgKHkbxK+@} z(BBH9icd{cyu)d$v+>KEVqBy^m^YM(G&{fGMyjE5FG0kHi2_mh;eZI z)Mrbc8!-`*e`oGvDZS5d$$Rs99cFbe=JBDXSH^B{GHQ+Y4Yv_`a?~rDY$r-+QmNAE zS^O&ANfqciC322r1HA?L()ReY!Ky zPzH{19Z#y_b%+@Hs^B?_ehvE#NIsx|%dnHKn{62^Rz%SVy%LwjKA1wy`Hz2WLBSllCv}-{+0te^6N1R5V`7y%TV`Q!8&zxnox6K^(DZ;U?== z-L$f)CyWg@-n^%-X`=l#(#&m$tfd|yjH6klplMtl)?N8*fRSS0POwz)P?e!>d}SQd z`!8ZROr$ya1wyF{kKqr}@wrS|7W^r~j~Pc&Wzv~MX7agz8{V&kb%>JG?u(Rqj4t;? z{t!Vgl3?Sf70&rim%vEu{mm@7$yRARJNlg*_T%utL0Fm_V|-e&g6*))K10Yob?Y7m znEl0rLh(*V4IuKEfdeBs8^Cw@@ml2p@1}?=1M(b&`Uit8X96GJ&*GbKslcMM~=rpcj`)xr(xTVxPkQ9fMYFOmm<{89EP$i z<51van^8qUfnKk#rZkj%eOGbnmIOB%6s~_oSVlWECnwL#i|0Xm!q60gdC(aIv9 zRwJ1UnmBrAl{?Jj>ViBWJ*0EejP{oHF(6V&5OQs5b zu^DD5>}|mf$|<-xoYJ?39LmLo)tk(7LfM2qGpZ#-J@=5C`Y5m*`NOv2pGXen$)LLF zSHan%nA1VZ3q{1bS!7OM)u-;EHMev6tc;|t{d3v}Rh&TTGSJ8=b@{Qv$&BZOb@`FH zI)$zww;Jx3uhIh|{c>mJ7oi*`Hz}pV5qOusV}XL6rTw%054iIcmdF?a$f>iUPYGaG z#0G}vFSjtCaRz=VlED3@#@v9-ru~?-#b;4=}7N=DH+b%(SsC-Ie5@B zHQ@X)HE?HxR0&+^_++|3LX{a!r_;I&2>}J=)A9da)?S<5S+W*;uL*G6a%V4 zP6q`3!R73$*jxc`WKLyLME-3jww6CZi?^PKNNtLo;KM8PXy9jGtz_LVC>hlQE~PcK zKH~MJZpbUD)XNn&|MemImOvk(M|IWh+|N6by6aQy5gT`Uy4-OG{Q(jD&kL5*kzo=z znAf;^5%magFVaU`^SvPbj{{| z)>b~P{RTt#O4Job?-%n>>h2`&D6Weok+`PFK{f~ri(Il(B=)ML1A!}*^ch2~eD>ja zND^IPwkSuW!#-KS!Ce~;$PT#;HIAdCKj+&99Hy0baNi~E!bgEsg(Aqk5dg;m!xesXsl%SoyB?ex$iJka@7ZMY+74s>&Wv z6*?Q}C;fU$Jp92|0TtO?@{sK-abCrwTbewSeDX_f!2WUHq=rkANVXcL^@u(veTb0d zP0=o;2aFNSdg>YBt^5e0SbH+Ssas?9vZ$*tAyV6U2hq`grq6%;r7`Yy(as9{)I;lt zru_Y)Q1O@!P@CeLhblF2mlbCf>ASpbLAFyu7kxZi`pdEKB}p3vf`qO>*R?*`z*#gW z7)yp7FCP};~~kl*2YR?P^sYV>dQV>s=~dQOJ&+%&`FQU+n4*zqqq$kk9WB?VsK4a?cvjc?{>su z^a3v)P;Dn&bLh!X5MvAsw&C9Yk9rKgGHX?ZM(Il*z}D%(B;}#ExVis}RBNe^JnX&1 zfW8#Ken0(02~R~|4@7xc*{=7NT`?Jf%Z&$N-g%-mp5uc=SCT|kx(Z6tE>xKUJ^_jG za;S&he={x!|!M+*^#{weEYTPOU{#kf8I(7 zLCewvL`E#b^X%K^-ukk}&8MGrypMT|n5Z5;ZR6N@H2FNYSsJ*KSXN0%5B^C>9HFr( zHDCPA*&7Gq!@AS+z2lP9n)n6#r54qC@joR3avc-5NI@?KyA5MboH=YO>457I6MqvSpV-l3 z!mGgB09r-?Afu$$52^^@!_fqxr>oBAV^FOj*apBKUbB~DhIIg%4mMpk=YA(V_p#?9 zXQ_)%O^qJwi&t}+Jp(?IN5-HejaH3 zb`d-DThUJML2&QCFa~?kj!>Pt3rw#N!#P-cEK;ny+Zxxu_B+P;SW(JBbwU013~2T_ z64x6a!9l&GKhaKHnJ)-6G>ISMi>YyR*wP9MIW#q|Y&`Xj10wa1;KuVKQ-@`sSfGd& z{u&0|+daf@xdos1H`}k3CDt^q`ut>=Uh`Lh56jS+@T>eWnup{M@2QGbzHdh*bcX`@ zzsPeBkL`nfhqdqQgR%6dCocvlK!&x;NYc544Y&tc9i3b-lO@hn#gEH~&J@WL!nyX~&c;y% z13Mk5sNa2nl(19yp75aVYu|g$8}uW~WkND^5r^GQ7(2)gn3IhOEH}4sT97_2qs7n` zsya^all=|Ld3!&_kwjXp#*(otkoaU?^5VEgN_s9To#x={2Tr{KV;Q6DVAvhBW416k zvR{D2B>(K;Po9zwt6f^RiIN$sMs~%)C;5&5|KS&P`T^J6#y#(j)XrOnxoHAkyUCso z&sv;+Jf4{a?5_;`%zKCU@}5SA9Guv7^=@b#`s1)QO8vLOVm}Vgwfk2jCzGUaA#VBZ z-VQ$jIAXXm-Rd9pT}uW}pVbCbrI1RXHPs7xTr+ciRe3}zoFY2ucK`ebcG!*xW(C7) zL#&$iT^V*{ZF&J12qc1co`ubY)WKn^yjqQ(m-1i5+IdX3PeL5xxem_lgWch?OH*HbPPJbiEfUx#_O6D18>Wksb z-+|1JR9zh#{Dg+*<`Ujv!ydw@1NHR&v%qs-w0iH> zL7?~CyhvL=>f}Vfdk^-mf!!V-L|~G_Y+3v)t<%FqK8Ku5ZB42BjvTG^?>3IJUiL`Z1e_r~vBjypN5En`nDPenicg z9EjfjV|QNvy&^}giEuCGQaZOlMGXDD6SqYRyvoHenCbz~xUom)i)yIHpGOVPDXdfa zJRrImdhNk9uEO>$SI$sL(q{5≀Q1iNSBjVFc^0jF^L07%8mta4P|DO(hGO09^e& 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 vWRCMcqt8QFD&JUZ@rS| literal 281111 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